From dcd05f0aa27c990e9f190f5d33c42c62fc2b7050 Mon Sep 17 00:00:00 2001 From: Hugo Costa Date: Fri, 31 Mar 2023 15:52:38 -0300 Subject: [PATCH 001/103] feat(message-parser): custom domains whitelist (#1010) --- README.md | 52 +++---- packages/message-parser/src/grammar.pegjs | 2 +- packages/message-parser/src/index.ts | 1 + packages/message-parser/src/utils.ts | 9 +- packages/message-parser/tests/url.test.ts | 157 +++++++++++++--------- 5 files changed, 124 insertions(+), 97 deletions(-) diff --git a/README.md b/README.md index 9fb5e0f754..dff64ef208 100644 --- a/README.md +++ b/README.md @@ -10,29 +10,29 @@ ![Pull requests](https://img.shields.io/github/issues-pr/RocketChat/fuselage?style=flat-square) ![GitHub commit activity](https://img.shields.io/github/commit-activity/m/RocketChat/fuselage?style=flat-square) -| Package | Description | Version | Dependencies | -|---------|-------------|---------|--------------| -| 📦 [`@rocket.chat/css-in-js`](/packages/css-in-js) | Toolset to transpile and use CSS on runtime | [![npm](https://img.shields.io/npm/v/@rocket.chat/css-in-js?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/css-in-js) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/css-in-js?style=flat-square) | -| 📦 [`@rocket.chat/css-supports`](/packages/css-supports) | Memoized and SSR-compatible facade of CSS.supports API | [![npm](https://img.shields.io/npm/v/@rocket.chat/css-supports?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/css-supports) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/css-supports?style=flat-square) | -| 📦 [`@rocket.chat/emitter`](/packages/emitter) | Event Emitter by Rocket.Chat | [![npm](https://img.shields.io/npm/v/@rocket.chat/emitter?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/emitter) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/emitter?style=flat-square) | -| 📦 [`@rocket.chat/eslint-config-alt`](/packages/eslint-config-alt) | ESLint configuration for Rocket.Chat repositories | [![npm](https://img.shields.io/npm/v/@rocket.chat/eslint-config-alt?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/eslint-config-alt) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/eslint-config-alt?style=flat-square) | -| 📦 [`@rocket.chat/fuselage`](/packages/fuselage) | Rocket.Chat's React Components Library | [![npm](https://img.shields.io/npm/v/@rocket.chat/fuselage?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/fuselage) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/fuselage?style=flat-square) | -| 📦 [`@rocket.chat/fuselage-hooks`](/packages/fuselage-hooks) | React hooks for Fuselage, Rocket.Chat's design system and UI toolkit | [![npm](https://img.shields.io/npm/v/@rocket.chat/fuselage-hooks?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/fuselage-hooks) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/fuselage-hooks?style=flat-square) | -| 📦 [`@rocket.chat/fuselage-polyfills`](/packages/fuselage-polyfills) | A bundle of useful poly/ponyfills used by fuselage | [![npm](https://img.shields.io/npm/v/@rocket.chat/fuselage-polyfills?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/fuselage-polyfills) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/fuselage-polyfills?style=flat-square) | -| 📦 [`@rocket.chat/fuselage-toastbar`](/packages/fuselage-toastbar) | Fuselage ToastBar component | [![npm](https://img.shields.io/npm/v/@rocket.chat/fuselage-toastbar?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/fuselage-toastbar) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/fuselage-toastbar?style=flat-square) | -| 📦 [`@rocket.chat/fuselage-tokens`](/packages/fuselage-tokens) | Design tokens for Fuselage, Rocket.Chat's design system | [![npm](https://img.shields.io/npm/v/@rocket.chat/fuselage-tokens?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/fuselage-tokens) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/fuselage-tokens?style=flat-square) | -| 📦 [`@rocket.chat/fuselage-ui-kit`](/packages/fuselage-ui-kit) | UiKit elements for Rocket.Chat Apps built under Fuselage design system | [![npm](https://img.shields.io/npm/v/@rocket.chat/fuselage-ui-kit?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/fuselage-ui-kit) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/fuselage-ui-kit?style=flat-square) | -| 📦 [`@rocket.chat/icons`](/packages/icons) | Rocket.Chat's Icons | [![npm](https://img.shields.io/npm/v/@rocket.chat/icons?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/icons) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/icons?style=flat-square) | -| 📦 [`@rocket.chat/layout`](/packages/layout) | Shared Application Layout Components | [![npm](https://img.shields.io/npm/v/@rocket.chat/layout?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/layout) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/layout?style=flat-square) | -| 📦 [`@rocket.chat/logo`](/packages/logo) | Rocket.Chat logo package | [![npm](https://img.shields.io/npm/v/@rocket.chat/logo?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/logo) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/logo?style=flat-square) | -| 📦 [`@rocket.chat/memo`](/packages/memo) | Memoization utilities | [![npm](https://img.shields.io/npm/v/@rocket.chat/memo?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/memo) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/memo?style=flat-square) | -| 📦 [`@rocket.chat/message-parser`](/packages/message-parser) | Rocket.Chat parser for messages | [![npm](https://img.shields.io/npm/v/@rocket.chat/message-parser?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/message-parser) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/message-parser?style=flat-square) | -| 📦 [`@rocket.chat/mp3-encoder`](/packages/mp3-encoder) | A LAME encoder to be used in web workers | [![npm](https://img.shields.io/npm/v/@rocket.chat/mp3-encoder?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/mp3-encoder) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/mp3-encoder?style=flat-square) | -| 📦 [`@rocket.chat/onboarding-ui`](/packages/onboarding-ui) | Set of components and functions for the onboarding experience on Rocket.Chat | [![npm](https://img.shields.io/npm/v/@rocket.chat/onboarding-ui?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/onboarding-ui) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/onboarding-ui?style=flat-square) | -| 📦 [`@rocket.chat/peggy-loader`](/packages/peggy-loader) | Peggy loader for webpack | [![npm](https://img.shields.io/npm/v/@rocket.chat/peggy-loader?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/peggy-loader) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/peggy-loader?style=flat-square) | -| 📦 [`@rocket.chat/prettier-config`](/packages/prettier-config) | Prettier configuration for Rocket.Chat repositories | [![npm](https://img.shields.io/npm/v/@rocket.chat/prettier-config?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/prettier-config) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/prettier-config?style=flat-square) | -| 📦 [`@rocket.chat/string-helpers`](/packages/string-helpers) | Helper functions for string manipulation | [![npm](https://img.shields.io/npm/v/@rocket.chat/string-helpers?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/string-helpers) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/string-helpers?style=flat-square) | -| 📦 [`@rocket.chat/styled`](/packages/styled) | A simple styled API for React components | [![npm](https://img.shields.io/npm/v/@rocket.chat/styled?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/styled) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/styled?style=flat-square) | -| 📦 [`@rocket.chat/stylis-logical-props-middleware`](/packages/stylis-logical-props-middleware) | Stylis middleware to handle CSS Logical Properties and their fallbacks | [![npm](https://img.shields.io/npm/v/@rocket.chat/stylis-logical-props-middleware?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/stylis-logical-props-middleware) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/stylis-logical-props-middleware?style=flat-square) | -| 📦 [`@rocket.chat/ui-kit`](/packages/ui-kit) | Interactive UI elements for Rocket.Chat Apps | [![npm](https://img.shields.io/npm/v/@rocket.chat/ui-kit?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/ui-kit) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/ui-kit?style=flat-square) | -| 📦 [`@rocket.chat/uikit-playground`](/packages/uikit-playground) | | [![npm](https://img.shields.io/npm/v/@rocket.chat/uikit-playground?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/uikit-playground) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/uikit-playground?style=flat-square) | +| Package | Description | Version | Dependencies | +| ---------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | +| 📦 [`@rocket.chat/css-in-js`](/packages/css-in-js) | Toolset to transpile and use CSS on runtime | [![npm](https://img.shields.io/npm/v/@rocket.chat/css-in-js?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/css-in-js) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/css-in-js?style=flat-square) | +| 📦 [`@rocket.chat/css-supports`](/packages/css-supports) | Memoized and SSR-compatible facade of CSS.supports API | [![npm](https://img.shields.io/npm/v/@rocket.chat/css-supports?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/css-supports) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/css-supports?style=flat-square) | +| 📦 [`@rocket.chat/emitter`](/packages/emitter) | Event Emitter by Rocket.Chat | [![npm](https://img.shields.io/npm/v/@rocket.chat/emitter?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/emitter) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/emitter?style=flat-square) | +| 📦 [`@rocket.chat/eslint-config-alt`](/packages/eslint-config-alt) | ESLint configuration for Rocket.Chat repositories | [![npm](https://img.shields.io/npm/v/@rocket.chat/eslint-config-alt?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/eslint-config-alt) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/eslint-config-alt?style=flat-square) | +| 📦 [`@rocket.chat/fuselage`](/packages/fuselage) | Rocket.Chat's React Components Library | [![npm](https://img.shields.io/npm/v/@rocket.chat/fuselage?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/fuselage) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/fuselage?style=flat-square) | +| 📦 [`@rocket.chat/fuselage-hooks`](/packages/fuselage-hooks) | React hooks for Fuselage, Rocket.Chat's design system and UI toolkit | [![npm](https://img.shields.io/npm/v/@rocket.chat/fuselage-hooks?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/fuselage-hooks) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/fuselage-hooks?style=flat-square) | +| 📦 [`@rocket.chat/fuselage-polyfills`](/packages/fuselage-polyfills) | A bundle of useful poly/ponyfills used by fuselage | [![npm](https://img.shields.io/npm/v/@rocket.chat/fuselage-polyfills?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/fuselage-polyfills) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/fuselage-polyfills?style=flat-square) | +| 📦 [`@rocket.chat/fuselage-toastbar`](/packages/fuselage-toastbar) | Fuselage ToastBar component | [![npm](https://img.shields.io/npm/v/@rocket.chat/fuselage-toastbar?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/fuselage-toastbar) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/fuselage-toastbar?style=flat-square) | +| 📦 [`@rocket.chat/fuselage-tokens`](/packages/fuselage-tokens) | Design tokens for Fuselage, Rocket.Chat's design system | [![npm](https://img.shields.io/npm/v/@rocket.chat/fuselage-tokens?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/fuselage-tokens) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/fuselage-tokens?style=flat-square) | +| 📦 [`@rocket.chat/fuselage-ui-kit`](/packages/fuselage-ui-kit) | UiKit elements for Rocket.Chat Apps built under Fuselage design system | [![npm](https://img.shields.io/npm/v/@rocket.chat/fuselage-ui-kit?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/fuselage-ui-kit) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/fuselage-ui-kit?style=flat-square) | +| 📦 [`@rocket.chat/icons`](/packages/icons) | Rocket.Chat's Icons | [![npm](https://img.shields.io/npm/v/@rocket.chat/icons?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/icons) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/icons?style=flat-square) | +| 📦 [`@rocket.chat/layout`](/packages/layout) | Shared Application Layout Components | [![npm](https://img.shields.io/npm/v/@rocket.chat/layout?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/layout) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/layout?style=flat-square) | +| 📦 [`@rocket.chat/logo`](/packages/logo) | Rocket.Chat logo package | [![npm](https://img.shields.io/npm/v/@rocket.chat/logo?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/logo) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/logo?style=flat-square) | +| 📦 [`@rocket.chat/memo`](/packages/memo) | Memoization utilities | [![npm](https://img.shields.io/npm/v/@rocket.chat/memo?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/memo) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/memo?style=flat-square) | +| 📦 [`@rocket.chat/message-parser`](/packages/message-parser) | Rocket.Chat parser for messages | [![npm](https://img.shields.io/npm/v/@rocket.chat/message-parser?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/message-parser) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/message-parser?style=flat-square) | +| 📦 [`@rocket.chat/mp3-encoder`](/packages/mp3-encoder) | A LAME encoder to be used in web workers | [![npm](https://img.shields.io/npm/v/@rocket.chat/mp3-encoder?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/mp3-encoder) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/mp3-encoder?style=flat-square) | +| 📦 [`@rocket.chat/onboarding-ui`](/packages/onboarding-ui) | Set of components and functions for the onboarding experience on Rocket.Chat | [![npm](https://img.shields.io/npm/v/@rocket.chat/onboarding-ui?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/onboarding-ui) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/onboarding-ui?style=flat-square) | +| 📦 [`@rocket.chat/peggy-loader`](/packages/peggy-loader) | Peggy loader for webpack | [![npm](https://img.shields.io/npm/v/@rocket.chat/peggy-loader?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/peggy-loader) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/peggy-loader?style=flat-square) | +| 📦 [`@rocket.chat/prettier-config`](/packages/prettier-config) | Prettier configuration for Rocket.Chat repositories | [![npm](https://img.shields.io/npm/v/@rocket.chat/prettier-config?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/prettier-config) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/prettier-config?style=flat-square) | +| 📦 [`@rocket.chat/string-helpers`](/packages/string-helpers) | Helper functions for string manipulation | [![npm](https://img.shields.io/npm/v/@rocket.chat/string-helpers?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/string-helpers) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/string-helpers?style=flat-square) | +| 📦 [`@rocket.chat/styled`](/packages/styled) | A simple styled API for React components | [![npm](https://img.shields.io/npm/v/@rocket.chat/styled?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/styled) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/styled?style=flat-square) | +| 📦 [`@rocket.chat/stylis-logical-props-middleware`](/packages/stylis-logical-props-middleware) | Stylis middleware to handle CSS Logical Properties and their fallbacks | [![npm](https://img.shields.io/npm/v/@rocket.chat/stylis-logical-props-middleware?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/stylis-logical-props-middleware) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/stylis-logical-props-middleware?style=flat-square) | +| 📦 [`@rocket.chat/ui-kit`](/packages/ui-kit) | Interactive UI elements for Rocket.Chat Apps | [![npm](https://img.shields.io/npm/v/@rocket.chat/ui-kit?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/ui-kit) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/ui-kit?style=flat-square) | +| 📦 [`@rocket.chat/uikit-playground`](/packages/uikit-playground) | | [![npm](https://img.shields.io/npm/v/@rocket.chat/uikit-playground?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/uikit-playground) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/uikit-playground?style=flat-square) | diff --git a/packages/message-parser/src/grammar.pegjs b/packages/message-parser/src/grammar.pegjs index 2c56731ec5..25888b982a 100644 --- a/packages/message-parser/src/grammar.pegjs +++ b/packages/message-parser/src/grammar.pegjs @@ -323,7 +323,7 @@ AutolinkedEmail = e:Email { return autoEmail(e); } * with customDomains options as intranet: protocol://internaltool.intranet * */ -AutolinkedURL = u:AutoLinkURL { return autoLink(u); } +AutolinkedURL = u:AutoLinkURL { return autoLink(u, options.customDomains); } AutoLinkURL = $(URLScheme URLAuthority AutoLinkURLBody*) diff --git a/packages/message-parser/src/index.ts b/packages/message-parser/src/index.ts index 852a31473f..cbdae1382c 100644 --- a/packages/message-parser/src/index.ts +++ b/packages/message-parser/src/index.ts @@ -12,6 +12,7 @@ export type Options = { dollarSyntax?: boolean; parenthesisSyntax?: boolean; }; + customDomains?: string[]; }; export const parse = (input: string, options?: Options): Root => diff --git a/packages/message-parser/src/utils.ts b/packages/message-parser/src/utils.ts index 6105a1d1eb..5902d8e33e 100644 --- a/packages/message-parser/src/utils.ts +++ b/packages/message-parser/src/utils.ts @@ -84,14 +84,17 @@ export const link = (src: string, label?: Markup[]): Link => ({ value: { src: plain(src), label: label ?? [plain(src)] }, }); -export const autoLink = (src: string) => { +export const autoLink = (src: string, customDomains?: string[]) => { + const validHosts = ['localhost', ...(customDomains ?? [])]; const { isIcann, isIp, isPrivate, domain } = tldParse(src, { detectIp: false, allowPrivateDomains: true, - validHosts: ['localhost'], + validHosts, }); - if (!(isIcann || isIp || isPrivate || domain === 'localhost')) { + if ( + !(isIcann || isIp || isPrivate || (domain && validHosts.includes(domain))) + ) { return plain(src); } diff --git a/packages/message-parser/tests/url.test.ts b/packages/message-parser/tests/url.test.ts index 6833f62fe9..0c7c03d110 100644 --- a/packages/message-parser/tests/url.test.ts +++ b/packages/message-parser/tests/url.test.ts @@ -1,12 +1,12 @@ import { parse } from '../src'; -import { lineBreak, link, autoLink, paragraph, plain } from '../src/utils'; +import { lineBreak, autoLink, paragraph, plain, link } from '../src/utils'; test.each([ [ 'https://pt.wikipedia.org/wiki/Condi%C3%A7%C3%A3o_de_corrida#:~:text=Uma%20condi%C3%A7%C3%A3o%20de%20corrida%20%C3%A9,sequ%C3%AAncia%20ou%20sincronia%20doutros%20eventos', [ paragraph([ - link( + autoLink( 'https://pt.wikipedia.org/wiki/Condi%C3%A7%C3%A3o_de_corrida#:~:text=Uma%20condi%C3%A7%C3%A3o%20de%20corrida%20%C3%A9,sequ%C3%AAncia%20ou%20sincronia%20doutros%20eventos' ), ]), @@ -14,21 +14,21 @@ test.each([ ], [ 'https://pt.wikipedia.org/', - [paragraph([link('https://pt.wikipedia.org/')])], + [paragraph([autoLink('https://pt.wikipedia.org/')])], ], [ 'https://pt.wikipedia.org/with-hyphen', - [paragraph([link('https://pt.wikipedia.org/with-hyphen')])], + [paragraph([autoLink('https://pt.wikipedia.org/with-hyphen')])], ], [ 'https://pt.wikipedia.org/with_underscore', - [paragraph([link('https://pt.wikipedia.org/with_underscore')])], + [paragraph([autoLink('https://pt.wikipedia.org/with_underscore')])], ], [ 'https://www.npmjs.com/package/@rocket.chat/message-parser', [ paragraph([ - link('https://www.npmjs.com/package/@rocket.chat/message-parser'), + autoLink('https://www.npmjs.com/package/@rocket.chat/message-parser'), ]), ], ], @@ -37,50 +37,59 @@ test.each([ ['https://test', [paragraph([plain('https://test')])]], [ 'httpsss://rocket.chat/test', - [paragraph([link('httpsss://rocket.chat/test')])], + [paragraph([autoLink('httpsss://rocket.chat/test')])], ], [ 'https://rocket.chat:3000/test', - [paragraph([link('https://rocket.chat:3000/test')])], + [paragraph([autoLink('https://rocket.chat:3000/test')])], ], [ 'https://rocket.chat/test?search', - [paragraph([link('https://rocket.chat/test?search')])], + [paragraph([autoLink('https://rocket.chat/test?search')])], ], [ 'https://rocket.chat/test?search=test', - [paragraph([link('https://rocket.chat/test?search=test')])], + [paragraph([autoLink('https://rocket.chat/test?search=test')])], ], - ['https://rocket.chat', [paragraph([link('https://rocket.chat')])]], - ['https://localhost', [paragraph([link('https://localhost')])]], - ['https://localhost:3000', [paragraph([link('https://localhost:3000')])]], + ['https://rocket.chat', [paragraph([autoLink('https://rocket.chat')])]], + ['https://localhost', [paragraph([autoLink('https://localhost')])]], + ['https://localhost:3000', [paragraph([autoLink('https://localhost:3000')])]], [ 'https://localhost:3000#fragment', - [paragraph([link('https://localhost:3000#fragment')])], + [paragraph([autoLink('https://localhost:3000#fragment')])], + ], + [ + 'https://localhost:3000#', + [paragraph([autoLink('https://localhost:3000#')])], + ], + [ + 'https://localhost:3000?', + [paragraph([autoLink('https://localhost:3000?')])], + ], + [ + 'https://localhost:3000/', + [paragraph([autoLink('https://localhost:3000/')])], ], - ['https://localhost:3000#', [paragraph([link('https://localhost:3000#')])]], - ['https://localhost:3000?', [paragraph([link('https://localhost:3000?')])]], - ['https://localhost:3000/', [paragraph([link('https://localhost:3000/')])]], [ 'ftp://user:pass@localhost:21/etc/hosts', - [paragraph([link('ftp://user:pass@localhost:21/etc/hosts')])], + [paragraph([autoLink('ftp://user:pass@localhost:21/etc/hosts')])], ], - ['ssh://test@example.com', [paragraph([link('ssh://test@example.com')])]], + ['ssh://test@example.com', [paragraph([autoLink('ssh://test@example.com')])]], [ 'custom://test@example.com', - [paragraph([link('custom://test@example.com')])], + [paragraph([autoLink('custom://test@example.com')])], ], - ['ftp://example.com', [paragraph([link('ftp://example.com')])]], + ['ftp://example.com', [paragraph([autoLink('ftp://example.com')])]], [ 'https://www.thingiverse.com/thing:5451684', - [paragraph([link('https://www.thingiverse.com/thing:5451684')])], + [paragraph([autoLink('https://www.thingiverse.com/thing:5451684')])], ], - ['http://📙.la/❤️', [paragraph([link('http://📙.la/❤️')])]], + ['http://📙.la/❤️', [paragraph([autoLink('http://📙.la/❤️')])]], [ 'https://developer.rocket.chat/reference/api/rest-api#production-security-concerns look at this', [ paragraph([ - link( + autoLink( 'https://developer.rocket.chat/reference/api/rest-api#production-security-concerns' ), plain(' look at this'), @@ -91,7 +100,7 @@ test.each([ 'https://developer.rocket.chat/reference/api/rest-api look at this', [ paragraph([ - link('https://developer.rocket.chat/reference/api/rest-api'), + autoLink('https://developer.rocket.chat/reference/api/rest-api'), plain(' look at this'), ]), ], @@ -101,7 +110,7 @@ test.each([ 'https://developer.rocket.chat/reference/api/rest-api#fragment?query=query look at this', [ paragraph([ - link( + autoLink( 'https://developer.rocket.chat/reference/api/rest-api#fragment?query=query' ), plain(' look at this'), @@ -112,7 +121,7 @@ test.each([ 'https://developer.rocket.chat look at this', [ paragraph([ - link('https://developer.rocket.chat'), + autoLink('https://developer.rocket.chat'), plain(' look at this'), ]), ], @@ -121,7 +130,7 @@ test.each([ 'https://developer.rocket.chat?query=query look at this', [ paragraph([ - link('https://developer.rocket.chat?query=query'), + autoLink('https://developer.rocket.chat?query=query'), plain(' look at this'), ]), ], @@ -129,14 +138,14 @@ test.each([ [ 'https://developer.rocket.chat?query=query\nline break', [ - paragraph([link('https://developer.rocket.chat?query=query')]), + paragraph([autoLink('https://developer.rocket.chat?query=query')]), paragraph([plain('line break')]), ], ], [ 'https://developer.rocket.chat?query=query\n\nline break', [ - paragraph([link('https://developer.rocket.chat?query=query')]), + paragraph([autoLink('https://developer.rocket.chat?query=query')]), lineBreak(), paragraph([plain('line break')]), ], @@ -145,7 +154,7 @@ test.each([ 'https://developer.rocket.chat?query=query_with_underscore look at this', [ paragraph([ - link('https://developer.rocket.chat?query=query_with_underscore'), + autoLink('https://developer.rocket.chat?query=query_with_underscore'), plain(' look at this'), ]), ], @@ -154,7 +163,7 @@ test.each([ 'https://developer.rocket.chat/path_with_underscore look at this', [ paragraph([ - link('https://developer.rocket.chat/path_with_underscore'), + autoLink('https://developer.rocket.chat/path_with_underscore'), plain(' look at this'), ]), ], @@ -163,7 +172,7 @@ test.each([ 'https://developer.rocket.chat#fragment_with_underscore look at this', [ paragraph([ - link('https://developer.rocket.chat#fragment_with_underscore'), + autoLink('https://developer.rocket.chat#fragment_with_underscore'), plain(' look at this'), ]), ], @@ -172,7 +181,7 @@ test.each([ 'https://developer.rocket.chat followed by text', [ paragraph([ - link('https://developer.rocket.chat'), + autoLink('https://developer.rocket.chat'), plain(' followed by text'), ]), ], @@ -182,59 +191,44 @@ test.each([ [ paragraph([ plain('two urls '), - link('https://developer.rocket.chat'), + autoLink('https://developer.rocket.chat'), plain(' , '), - link('https://rocket.chat'), + autoLink('https://rocket.chat'), ]), ], ], [ 'https://1developer.rocket.chat', - [paragraph([link('https://1developer.rocket.chat')])], + [paragraph([autoLink('https://1developer.rocket.chat')])], ], [ 'https://en.m.wikipedia.org/wiki/Main_Page', - [paragraph([link('https://en.m.wikipedia.org/wiki/Main_Page')])], + [paragraph([autoLink('https://en.m.wikipedia.org/wiki/Main_Page')])], ], ['test.1test.com', [paragraph([autoLink('test.1test.com')])]], - ['http://test.e-xample.com', [paragraph([link('http://test.e-xample.com')])]], - ['www.n-tv.de', [paragraph([link('//www.n-tv.de', [plain('www.n-tv.de')])])]], + [ + 'http://test.e-xample.com', + [paragraph([autoLink('http://test.e-xample.com')])], + ], + ['www.n-tv.de', [paragraph([autoLink('www.n-tv.de')])]], [ 'www.n-tv.de/test, test', - [ - paragraph([ - link('//www.n-tv.de/test', [plain('www.n-tv.de/test')]), - plain(', test'), - ]), - ], + [paragraph([autoLink('www.n-tv.de/test'), plain(', test')])], ], [ 'www.n-tv.de/, test', - [ - paragraph([ - link('//www.n-tv.de/', [plain('www.n-tv.de/')]), - plain(', test'), - ]), - ], + [paragraph([autoLink('www.n-tv.de/'), plain(', test')])], ], [ 'www.n-tv.de, test', - [ - paragraph([ - link('//www.n-tv.de', [plain('www.n-tv.de')]), - plain(', test'), - ]), - ], + [paragraph([autoLink('www.n-tv.de'), plain(', test')])], ], [ 'https://www.n-tv.de, test', - [paragraph([link('https://www.n-tv.de'), plain(', test')])], - ], - ['http://te_st.com', [paragraph([link('http://te_st.com')])]], - [ - 'www.te_st.com', - [paragraph([link('//www.te_st.com', [plain('www.te_st.com')])])], + [paragraph([autoLink('https://www.n-tv.de'), plain(', test')])], ], + ['http://te_st.com', [paragraph([autoLink('http://te_st.com')])]], + ['www.te_st.com', [paragraph([autoLink('www.te_st.com')])]], [ '[google_search](http://google.com)', [paragraph([link('http://google.com', [plain('google_search')])])], @@ -244,7 +238,7 @@ test.each([ [ paragraph([ plain('app...https://rocket.chat '), - link('https://rocket.chat'), + autoLink('https://rocket.chat'), ]), ], ], @@ -253,7 +247,7 @@ test.each([ [ paragraph([ plain('Hey check it out the best communication platform '), - link('https://rocket.chat'), + autoLink('https://rocket.chat'), plain('! There is not discussion about it.'), ]), ], @@ -266,7 +260,7 @@ test.each([ 'https://github.com/RocketChat/Rocket.Chat/releases/tag/6.0.0-rc.3', [ paragraph([ - link( + autoLink( 'https://github.com/RocketChat/Rocket.Chat/releases/tag/6.0.0-rc.3' ), ]), @@ -294,6 +288,35 @@ test.each([ expect(parse(input)).toMatchObject(output); }); +describe('autoLink with custom hosts settings comming from Rocket.Chat', () => { + test.each([ + [ + 'http://gitlab.local', + [paragraph([autoLink('http://gitlab.local', ['local'])])], + ], + ['gitlab.local', [paragraph([autoLink('gitlab.local', ['local'])])]], + [ + 'internaltool.intranet', + [paragraph([autoLink('internaltool.intranet', ['local', 'intranet'])])], + ], + ])('parses %p', (input, output) => { + expect( + parse(input, { customDomains: ['local', 'intranet'] }) + ).toMatchObject(output); + }); +}); + +describe('autoLink WITHOUT custom hosts settings comming from Rocket.Chat', () => { + test.each([ + [ + 'https://internaltool.testt', + [paragraph([plain('https://internaltool.testt')])], + ], + ])('parses %p', (input, output) => { + expect(parse(input, { customDomains: ['local'] })).toMatchObject(output); + }); +}); + describe('autoLink helper function', () => { it('should preserve the original protocol if the protocol is http or https', () => { expect(autoLink('https://rocket.chat/test')).toMatchObject( From 59fee600a84dfb2094697ae00ba466631ff2f7a7 Mon Sep 17 00:00:00 2001 From: Hugo Costa Date: Tue, 4 Apr 2023 14:48:32 -0300 Subject: [PATCH 002/103] fix(fuselage): MessageBody word break (#1018) --- packages/fuselage/src/components/Message/Messages.styles.scss | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/fuselage/src/components/Message/Messages.styles.scss b/packages/fuselage/src/components/Message/Messages.styles.scss index 68831ef837..5061fcb4bc 100644 --- a/packages/fuselage/src/components/Message/Messages.styles.scss +++ b/packages/fuselage/src/components/Message/Messages.styles.scss @@ -185,6 +185,8 @@ $message-background-color-highlight: functions.theme( transition: opacity 0.3s linear; + word-break: break-all; + opacity: 1; color: colors.font(default); From 00fb041e08a18d2ced9c367baa4228ac6277ff6c Mon Sep 17 00:00:00 2001 From: Hugo Costa Date: Tue, 11 Apr 2023 13:06:09 -0300 Subject: [PATCH 003/103] fix(message-parser): Inline Code with mention and/or mail pattern (#1021) --- packages/message-parser/src/grammar.pegjs | 4 +++- packages/message-parser/tests/inlineCode.test.ts | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/message-parser/src/grammar.pegjs b/packages/message-parser/src/grammar.pegjs index 25888b982a..af30b4a81f 100644 --- a/packages/message-parser/src/grammar.pegjs +++ b/packages/message-parser/src/grammar.pegjs @@ -312,7 +312,9 @@ Email = "mailto:"? @$(LocalPart "@" DomainName) LocalPart = $(LocalPartChar+ ("." LocalPartChar+)*) -LocalPartChar = AlphaNumericOrMarkChar / [!#$%&'*+/=?^_\`{|}~-] +LocalPartChar = AlphaNumericOrMarkChar+ LocalPartSpecialChars* + +LocalPartSpecialChars = [!#$%&'*+/=?^_\`{|}~-] AutolinkedEmail = e:Email { return autoEmail(e); } diff --git a/packages/message-parser/tests/inlineCode.test.ts b/packages/message-parser/tests/inlineCode.test.ts index 3b2766e042..72d86adcff 100644 --- a/packages/message-parser/tests/inlineCode.test.ts +++ b/packages/message-parser/tests/inlineCode.test.ts @@ -17,6 +17,11 @@ test.each([ ]), ], ], + ['`@rocket.chat`', [paragraph([inlineCode(plain('@rocket.chat'))])]], + [ + '`@rocket.chat/message-parser`', + [paragraph([inlineCode(plain('@rocket.chat/message-parser'))])], + ], ])('parses %p', (input, output) => { expect(parse(input)).toMatchObject(output); }); From 0b2433c8959542273a007a3b274a07c9d95e3c3b Mon Sep 17 00:00:00 2001 From: Tasso Evangelista Date: Wed, 12 Apr 2023 11:35:45 -0300 Subject: [PATCH 004/103] chore(deps): Upgrading everything (#1023) --- .github/workflows/cd.yml | 4 +- .github/workflows/ci-pr.yml | 2 +- .vscode/settings.json | 15 +- .../library/files/package.json.t | 12 +- package.json | 8 +- packages/css-in-js/package.json | 16 +- packages/css-in-js/src/sheet.ts | 2 +- packages/css-in-js/tsconfig.json | 4 +- packages/css-supports/package.json | 10 +- packages/css-supports/tsconfig.json | 3 +- packages/emitter/jest.config.js | 8 - packages/emitter/package.json | 17 +- packages/emitter/tsconfig.json | 9 +- packages/eslint-config-alt/package.json | 20 +- packages/fuselage-hooks/jest.config.js | 8 - packages/fuselage-hooks/package.json | 24 +- .../src/useOutsideClick.spec.ts | 55 +- packages/fuselage-hooks/tsconfig.json | 9 +- packages/fuselage-polyfills/index.d.ts | 1 + packages/fuselage-polyfills/package.json | 7 +- packages/fuselage-toastbar/.eslintignore | 1 + .../.storybook/{main.ts => main.js} | 11 +- .../fuselage-toastbar/.storybook/preview.tsx | 6 +- packages/fuselage-toastbar/package.json | 42 +- packages/fuselage-toastbar/tsconfig.json | 3 +- packages/fuselage-tokens/.stylelintrc | 13 - packages/fuselage-tokens/package.json | 21 +- packages/fuselage-tokens/tsconfig.json | 19 - packages/fuselage-ui-kit/.storybook/main.js | 14 + packages/fuselage-ui-kit/.storybook/main.ts | 7 - packages/fuselage-ui-kit/package.json | 33 +- packages/fuselage-ui-kit/tsconfig.json | 4 +- packages/fuselage/.eslintrc.js | 14 +- packages/fuselage/.storybook/main.js | 4 + packages/fuselage/.stylelintrc | 13 - packages/fuselage/jest.config.js | 9 - packages/fuselage/package.json | 80 +- .../src/components/Dropdown/Dropdown.spec.tsx | 6 +- .../components/InputBox/InputBox.styles.scss | 5 +- .../src/components/Menu/Menu.spec.tsx | 10 +- .../ProgressBar/ProgressBar.styles.scss | 5 +- packages/fuselage/src/styleTokens.ts | 2 +- packages/fuselage/tsconfig.json | 3 +- packages/icons/.stylelintrc | 13 - packages/icons/package.json | 14 +- packages/layout/.eslintignore | 1 + .../layout/.storybook/{main.ts => main.js} | 11 +- packages/layout/.storybook/preview.tsx | 28 +- packages/layout/jest.config.js | 8 - packages/layout/package.json | 28 +- packages/logo/jest.config.js | 8 - packages/logo/package.json | 23 +- packages/logo/tsconfig.json | 3 +- packages/memo/package.json | 26 +- packages/memo/tsconfig.json | 3 +- .../message-parser/loaders/pegtransform.js | 5 +- packages/message-parser/package.json | 36 +- packages/message-parser/tsconfig.json | 3 +- packages/mp3-encoder/jest.config.js | 8 - packages/mp3-encoder/package.json | 25 +- packages/mp3-encoder/tsconfig.json | 3 +- .../.storybook/{main.ts => main.js} | 11 +- packages/onboarding-ui/jest.config.js | 8 - packages/onboarding-ui/package.json | 35 +- packages/onboarding-ui/tsconfig.json | 3 +- packages/peggy-loader/jest.config.js | 8 - packages/peggy-loader/package.json | 17 +- packages/peggy-loader/tsconfig.json | 3 +- packages/prettier-config/package.json | 8 +- packages/string-helpers/package.json | 29 +- packages/string-helpers/tsconfig.json | 3 +- packages/styled/jest.config.js | 8 - packages/styled/package.json | 19 +- packages/styled/tsconfig.json | 3 +- .../jest.config.js | 8 - .../package.json | 19 +- .../tsconfig.json | 3 +- packages/ui-kit/jest.config.js | 8 - packages/ui-kit/package.json | 30 +- .../ui-kit/src/blocks/BlockElementType.ts | 2 +- packages/ui-kit/src/blocks/LayoutBlockType.ts | 4 +- packages/ui-kit/src/blocks/TextObjectType.ts | 2 +- packages/ui-kit/tsconfig.json | 3 +- packages/uikit-playground/package.json | 30 +- tools/build-design-tokens/package.json | 2 +- tools/build-icons/package.json | 2 +- tools/build-logo/package.json | 2 +- tools/bump/package.json | 6 +- tools/lint-all/package.json | 8 +- tools/scripts/package.json | 10 +- tools/update-readme/package.json | 2 +- yarn.lock | 6250 +++++++++++------ 92 files changed, 4548 insertions(+), 2803 deletions(-) create mode 100644 packages/fuselage-polyfills/index.d.ts rename packages/fuselage-toastbar/.storybook/{main.ts => main.js} (53%) delete mode 100644 packages/fuselage-tokens/tsconfig.json create mode 100644 packages/fuselage-ui-kit/.storybook/main.js delete mode 100644 packages/fuselage-ui-kit/.storybook/main.ts rename packages/layout/.storybook/{main.ts => main.js} (52%) rename packages/onboarding-ui/.storybook/{main.ts => main.js} (53%) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 7a44fe2b22..210371186d 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -18,7 +18,7 @@ jobs: steps: - uses: actions/setup-node@v2 with: - node-version: "14.17.6" + node-version: "14.21.3" - uses: actions/checkout@v2 - name: Turbo Cache id: turbo-cache @@ -71,7 +71,7 @@ jobs: steps: - uses: actions/setup-node@v2 with: - node-version: "14.17.6" + node-version: "14.21.3" registry-url: "https://registry.npmjs.org" scope: "@rocket.chat" - uses: actions/checkout@v2 diff --git a/.github/workflows/ci-pr.yml b/.github/workflows/ci-pr.yml index 44e51812ef..92e72acd20 100644 --- a/.github/workflows/ci-pr.yml +++ b/.github/workflows/ci-pr.yml @@ -17,7 +17,7 @@ jobs: steps: - uses: actions/setup-node@v2 with: - node-version: "14.17.6" + node-version: "14.21.3" - uses: actions/checkout@v2 - uses: actions/cache@v2 id: yarn-cache diff --git a/.vscode/settings.json b/.vscode/settings.json index 19c965cbde..076e091e14 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -10,12 +10,21 @@ } ], "eslint.onIgnoredFiles": "warn", - "editor.codeActionsOnSave": { - "source.fixAll.eslint": true - }, "eslint.options": { "extensions": [".js", ".jsx", ".md", ".mdx", ".ts", ".tsx", ".pegjs"] }, + "eslint.validate": [ + "javascript", + "javascriptreact", + "typescript", + "typescriptreact", + "markdown", + "mdx", + "pegjs" + ], + "editor.codeActionsOnSave": { + "source.fixAll.eslint": true + }, "editor.formatOnSave": true, "[typescript]": { "editor.formatOnSave": false diff --git a/_templates/create-package/library/files/package.json.t b/_templates/create-package/library/files/package.json.t index deeb0a02aa..07acf8c6dd 100644 --- a/_templates/create-package/library/files/package.json.t +++ b/_templates/create-package/library/files/package.json.t @@ -50,7 +50,7 @@ to: packages/<%=package%>/package.json "prettier": "~2.5.1", "rimraf": "~3.0.2", "ts-jest": "~27.1.3", - "typedoc": "~0.22.11", + "typedoc": "~0.24.1", "typescript": "~4.3.5" }, "eslintConfig": { @@ -65,14 +65,6 @@ to: packages/<%=package%>/package.json "errorOnDeprecated": true, "testMatch": [ "/src/**/*.spec.[jt]s?(x)" - ], - "globals": { - "ts-jest": { - "tsconfig": { - "noUnusedLocals": false, - "noUnusedParameters": false - } - } - } + ] } } diff --git a/package.json b/package.json index 4c639eb55b..e6ad5e69a0 100644 --- a/package.json +++ b/package.json @@ -11,10 +11,10 @@ "husky": "~7.0.4", "hygen": "~6.1.5", "lerna": "~4.0.0", - "lint-staged": "~12.3.8", + "lint-staged": "~13.2.1", "turbo": "~1.1.10", "update-readme": "workspace:~", - "webpack": "~5.76.0" + "webpack": "~5.78.0" }, "scripts": { "postinstall": "husky install", @@ -33,10 +33,10 @@ "release-next": "yarn workspaces foreach --no-private -v npm publish --tag next --tolerate-republish" }, "devEngines": { - "node": "~14.17.6" + "node": "~14.21.3" }, "volta": { - "node": "14.21.2", + "node": "14.21.3", "yarn": "1.22.19" }, "packageManager": "yarn@3.5.0" diff --git a/packages/css-in-js/package.json b/packages/css-in-js/package.json index b490d79886..4eb50013db 100644 --- a/packages/css-in-js/package.json +++ b/packages/css-in-js/package.json @@ -48,19 +48,19 @@ "@rollup/plugin-json": "~4.1.0", "@rollup/plugin-node-resolve": "~13.1.3", "@rollup/plugin-typescript": "~8.3.4", - "@types/jest": "~27.4.1", + "@types/jest": "~29.5.0", "@types/stylis": "^4.0.2", "bump": "workspace:~", - "eslint": "~8.26.0", - "jest": "~27.5.1", + "eslint": "~8.38.0", + "jest": "~29.5.0", "lint-all": "workspace:~", - "lint-staged": "~12.3.8", - "prettier": "~2.7.1", + "lint-staged": "~13.2.1", + "prettier": "~2.8.7", "rollup": "~2.67.3", "rollup-plugin-terser": "~7.0.2", - "ts-jest": "~27.1.5", - "typedoc": "~0.22.18", - "typescript": "~4.9.4" + "ts-jest": "~29.1.0", + "typedoc": "~0.24.1", + "typescript": "~5.0.4" }, "dependencies": { "@emotion/hash": "^0.9.0", diff --git a/packages/css-in-js/src/sheet.ts b/packages/css-in-js/src/sheet.ts index 304a656559..e535138380 100644 --- a/packages/css-in-js/src/sheet.ts +++ b/packages/css-in-js/src/sheet.ts @@ -74,7 +74,7 @@ const attachRulesIntoStyleSheet: RuleAttacher = (rules) => { }; const wrapReferenceCounting = (attacher: RuleAttacher): RuleAttacher => { - const refs = {}; + const refs: Record = {}; const queueMicrotask = (fn: () => void): void => { if ( diff --git a/packages/css-in-js/tsconfig.json b/packages/css-in-js/tsconfig.json index 7f9a1bd7c9..f1fdcc3c85 100644 --- a/packages/css-in-js/tsconfig.json +++ b/packages/css-in-js/tsconfig.json @@ -17,12 +17,10 @@ "noImplicitThis": true, "noImplicitAny": true, "strictNullChecks": true, - "suppressImplicitAnyIndexErrors": true, "noUnusedLocals": true, "noUnusedParameters": true, "esModuleInterop": true, - "skipLibCheck": true, - "importsNotUsedAsValues": "error" + "skipLibCheck": true }, "include": ["src"], "exclude": ["dist", "node_modules", "src/*.spec.ts"] diff --git a/packages/css-supports/package.json b/packages/css-supports/package.json index bd03893cdd..d50ff3cb78 100644 --- a/packages/css-supports/package.json +++ b/packages/css-supports/package.json @@ -38,13 +38,13 @@ "@rocket.chat/eslint-config-alt": "workspace:~", "@rocket.chat/prettier-config": "workspace:~", "bump": "workspace:~", - "eslint": "~8.26.0", + "eslint": "~8.38.0", "lint-all": "workspace:~", - "lint-staged": "~12.3.8", - "prettier": "~2.7.1", + "lint-staged": "~13.2.1", + "prettier": "~2.8.7", "rimraf": "~3.0.2", - "typedoc": "~0.22.18", - "typescript": "~4.9.4" + "typedoc": "~0.24.1", + "typescript": "~5.0.4" }, "dependencies": { "@rocket.chat/memo": "workspace:~" diff --git a/packages/css-supports/tsconfig.json b/packages/css-supports/tsconfig.json index add42563e2..1002ee74d1 100644 --- a/packages/css-supports/tsconfig.json +++ b/packages/css-supports/tsconfig.json @@ -12,8 +12,7 @@ "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "moduleResolution": "node", - "resolveJsonModule": true, - "importsNotUsedAsValues": "error" + "resolveJsonModule": true }, "include": ["src/**/*"], "typedocOptions": { diff --git a/packages/emitter/jest.config.js b/packages/emitter/jest.config.js index ad0af26742..639dd2b92d 100644 --- a/packages/emitter/jest.config.js +++ b/packages/emitter/jest.config.js @@ -2,12 +2,4 @@ module.exports = { preset: 'ts-jest', errorOnDeprecated: true, testMatch: ['**/src/**/*.spec.[jt]s?(x)'], - globals: { - 'ts-jest': { - tsconfig: { - noUnusedLocals: false, - noUnusedParameters: false, - }, - }, - }, }; diff --git a/packages/emitter/package.json b/packages/emitter/package.json index 4b5786d3fc..3df42e2129 100644 --- a/packages/emitter/package.json +++ b/packages/emitter/package.json @@ -48,19 +48,18 @@ "@rollup/plugin-json": "~4.1.0", "@rollup/plugin-node-resolve": "~13.1.3", "@rollup/plugin-typescript": "~8.3.4", - "@types/jest": "~27.4.1", + "@types/jest": "~29.5.0", "bump": "workspace:~", - "eslint": "~8.26.0", - "jest": "~27.5.1", + "eslint": "~8.38.0", + "jest": "~29.5.0", "lint-all": "workspace:~", - "lint-staged": "~12.3.8", + "lint-staged": "~13.2.1", "npm-run-all": "^4.1.5", - "prettier": "~2.7.1", + "prettier": "~2.8.7", "rollup": "~2.67.3", "rollup-plugin-terser": "~7.0.2", - "ts-jest": "~27.1.5", - "tslib": "^2.3.1", - "typedoc": "~0.22.18", - "typescript": "~4.9.4" + "ts-jest": "~29.1.0", + "typedoc": "~0.24.1", + "typescript": "~5.0.4" } } diff --git a/packages/emitter/tsconfig.json b/packages/emitter/tsconfig.json index 25e0b577e7..7918aadabd 100644 --- a/packages/emitter/tsconfig.json +++ b/packages/emitter/tsconfig.json @@ -12,18 +12,11 @@ "outDir": "./dist", "moduleResolution": "node", "forceConsistentCasingInFileNames": true, - // "noEmit": true, - // "noImplicitReturns": true, - // "noImplicitThis": true, - // "noImplicitAny": true, - // "strictNullChecks": true, - "suppressImplicitAnyIndexErrors": true, "noUnusedLocals": true, "noUnusedParameters": true, "esModuleInterop": true, "resolveJsonModule": true, - "skipLibCheck": true, - "importsNotUsedAsValues": "error" + "skipLibCheck": true }, "include": ["src"], "exclude": ["dist", "node_modules", "src/*.spec.ts"] diff --git a/packages/eslint-config-alt/package.json b/packages/eslint-config-alt/package.json index 8056e99906..7a96e7f5dc 100644 --- a/packages/eslint-config-alt/package.json +++ b/packages/eslint-config-alt/package.json @@ -34,25 +34,25 @@ }, "peerDependencies": { "@babel/eslint-parser": "^7.13.14", - "eslint": "^7.29.0", + "eslint": "~8.38.0", "prettier": "~2.7.1" }, "devDependencies": { - "@babel/eslint-parser": "~7.19.1", + "@babel/eslint-parser": "~7.21.3", "bump": "workspace:~", - "eslint": "~8.26.0", + "eslint": "~8.38.0", "lint-all": "workspace:~", - "lint-staged": "~12.3.8", - "prettier": "~2.7.1" + "lint-staged": "~13.2.1", + "prettier": "~2.8.7" }, "dependencies": { - "@typescript-eslint/eslint-plugin": "~5.11.0", - "@typescript-eslint/parser": "~5.11.0", - "eslint-config-prettier": "~8.5.0", - "eslint-import-resolver-typescript": "~3.5.3", + "@typescript-eslint/eslint-plugin": "~5.58.0", + "@typescript-eslint/parser": "~5.58.0", + "eslint-config-prettier": "~8.8.0", + "eslint-import-resolver-typescript": "~3.5.5", "eslint-plugin-import": "~2.26.0", "eslint-plugin-prettier": "~4.2.1", - "eslint-plugin-react": "~7.31.11", + "eslint-plugin-react": "~7.32.2", "eslint-plugin-react-hooks": "~4.6.0" } } diff --git a/packages/fuselage-hooks/jest.config.js b/packages/fuselage-hooks/jest.config.js index 4c600f5329..385588fce8 100644 --- a/packages/fuselage-hooks/jest.config.js +++ b/packages/fuselage-hooks/jest.config.js @@ -3,13 +3,5 @@ module.exports = { errorOnDeprecated: true, testMatch: ['/src/**/*.spec.{ts,tsx}'], testEnvironment: 'jsdom', - globals: { - 'ts-jest': { - tsconfig: { - noUnusedLocals: false, - noUnusedParameters: false, - }, - }, - }, setupFilesAfterEnv: ['testing-utils/setup/noErrorsLogged'], }; diff --git a/packages/fuselage-hooks/package.json b/packages/fuselage-hooks/package.json index 58fdd48dc0..4566af639f 100644 --- a/packages/fuselage-hooks/package.json +++ b/packages/fuselage-hooks/package.json @@ -49,27 +49,27 @@ "@rollup/plugin-json": "~4.1.0", "@rollup/plugin-node-resolve": "~13.1.3", "@rollup/plugin-typescript": "~8.3.4", - "@testing-library/react-hooks": "~7.0.2", - "@testing-library/user-event": "^13.5.0", - "@types/jest": "~27.4.1", - "@types/react": "~17.0.53", - "@types/react-dom": "^17.0.18", + "@testing-library/react-hooks": "~8.0.1", + "@testing-library/user-event": "~14.4.3", + "@types/jest": "~29.5.0", + "@types/react": "~17.0.57", + "@types/react-dom": "^17.0.19", "@types/resize-observer-browser": "~0.1.7", "@types/use-sync-external-store": "~0.0.3", "bump": "workspace:~", - "eslint": "~8.26.0", - "jest": "~27.5.1", + "eslint": "~8.38.0", + "jest": "~29.5.0", "lint-all": "workspace:~", - "lint-staged": "~12.3.8", + "lint-staged": "~13.2.1", "npm-run-all": "^4.1.5", - "prettier": "~2.7.1", + "prettier": "~2.8.7", "react": "^17.0.2", "rollup": "~2.67.3", "rollup-plugin-terser": "~7.0.2", "testing-utils": "workspace:~", - "ts-jest": "~27.1.5", - "typedoc": "~0.22.18", - "typescript": "~4.9.4" + "ts-jest": "~29.1.0", + "typedoc": "~0.24.1", + "typescript": "~5.0.4" }, "peerDependencies": { "@rocket.chat/fuselage-tokens": "*", diff --git a/packages/fuselage-hooks/src/useOutsideClick.spec.ts b/packages/fuselage-hooks/src/useOutsideClick.spec.ts index 57d14a5da3..d38ead6503 100644 --- a/packages/fuselage-hooks/src/useOutsideClick.spec.ts +++ b/packages/fuselage-hooks/src/useOutsideClick.spec.ts @@ -1,10 +1,13 @@ import { renderHook } from '@testing-library/react-hooks'; import userEvent from '@testing-library/user-event'; +import type { MutableRefObject } from 'react'; import { useOutsideClick } from './useOutsideClick'; -it('it should call the callback when the user clicked outside the element', () => { - const ref = { current: document.createElement('div') }; +it('it should call the callback when the user clicked outside the element', async () => { + const ref: MutableRefObject = { + current: document.createElement('div'), + }; const cb = jest.fn(); renderHook(() => useOutsideClick([ref], cb)); @@ -14,13 +17,15 @@ it('it should call the callback when the user clicked outside the element', () = document.body.appendChild(sibling); expect(cb).not.toHaveBeenCalled(); - userEvent.click(sibling); + await userEvent.click(sibling); expect(cb).toHaveBeenCalled(); }); -it('it should call the callback when the user clicked outside the elements', () => { - const ref = { current: document.createElement('div') }; - const ref2 = { current: null }; +it('it should call the callback when the user clicked outside the elements', async () => { + const ref: MutableRefObject = { + current: document.createElement('div'), + }; + const ref2: MutableRefObject = { current: null }; const cb = jest.fn(); renderHook(() => useOutsideClick([ref, ref2], cb)); @@ -33,25 +38,29 @@ it('it should call the callback when the user clicked outside the elements', () document.body.appendChild(sibling); expect(cb).not.toHaveBeenCalled(); - userEvent.click(sibling); + await userEvent.click(sibling); expect(cb).toHaveBeenCalled(); }); -it('it should not call the callback when the user clicked inside the element', () => { - const ref = { current: document.createElement('div') }; +it('it should not call the callback when the user clicked inside the element', async () => { + const ref: MutableRefObject = { + current: document.createElement('div'), + }; const cb = jest.fn(); renderHook(() => useOutsideClick([ref], cb)); document.body.appendChild(ref.current); expect(cb).not.toHaveBeenCalled(); - userEvent.click(ref.current); + await userEvent.click(ref.current); expect(cb).not.toHaveBeenCalled(); }); -it('it should not call the callback when the user clicked inside the elements', () => { - const ref = { current: document.createElement('div') }; - const ref2 = { current: null }; +it('it should not call the callback when the user clicked inside the elements', async () => { + const ref: MutableRefObject = { + current: document.createElement('div'), + }; + const ref2: MutableRefObject = { current: null }; const cb = jest.fn(); renderHook(() => useOutsideClick([ref, ref2], cb)); const element2 = document.createElement('div'); @@ -61,12 +70,14 @@ it('it should not call the callback when the user clicked inside the elements', document.body.appendChild(element2); expect(cb).not.toHaveBeenCalled(); - userEvent.click(ref.current); + await userEvent.click(ref.current); expect(cb).not.toHaveBeenCalled(); }); -it('it should not call the callback when the user clicked inside the element and their children', () => { - const ref = { current: document.createElement('div') }; +it('it should not call the callback when the user clicked inside the element and their children', async () => { + const ref: MutableRefObject = { + current: document.createElement('div'), + }; const cb = jest.fn(); renderHook(() => useOutsideClick([ref], cb)); const child = document.createElement('div'); @@ -76,13 +87,15 @@ it('it should not call the callback when the user clicked inside the element and document.body.appendChild(ref.current); expect(cb).not.toHaveBeenCalled(); - userEvent.click(child); + await userEvent.click(child); expect(cb).not.toHaveBeenCalled(); }); -it('it should not call the callback when the user clicked inside of some given element and their children', () => { - const ref = { current: document.createElement('div') }; - const ref2 = { current: null }; +it('it should not call the callback when the user clicked inside of some given element and their children', async () => { + const ref: MutableRefObject = { + current: document.createElement('div'), + }; + const ref2: MutableRefObject = { current: null }; const cb = jest.fn(); renderHook(() => useOutsideClick([ref, ref2], cb)); const element2 = document.createElement('div'); @@ -94,6 +107,6 @@ it('it should not call the callback when the user clicked inside of some given e document.body.appendChild(element2); expect(cb).not.toHaveBeenCalled(); - userEvent.click(child); + await userEvent.click(child); expect(cb).not.toHaveBeenCalled(); }); diff --git a/packages/fuselage-hooks/tsconfig.json b/packages/fuselage-hooks/tsconfig.json index 7b425bd73d..3139976690 100644 --- a/packages/fuselage-hooks/tsconfig.json +++ b/packages/fuselage-hooks/tsconfig.json @@ -12,17 +12,10 @@ "outDir": "./dist", "moduleResolution": "node", "forceConsistentCasingInFileNames": true, - // "noEmit": true, - // "noImplicitReturns": true, - // "noImplicitThis": true, - // "noImplicitAny": true, - // "strictNullChecks": true, - "suppressImplicitAnyIndexErrors": true, "noUnusedLocals": true, "noUnusedParameters": true, "esModuleInterop": true, - "resolveJsonModule": true, - "importsNotUsedAsValues": "error" + "resolveJsonModule": true }, "include": ["src"], "exclude": ["dist", "node_modules", "src/*.spec.ts"] diff --git a/packages/fuselage-polyfills/index.d.ts b/packages/fuselage-polyfills/index.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/packages/fuselage-polyfills/index.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/fuselage-polyfills/package.json b/packages/fuselage-polyfills/package.json index d12c8a7226..d16ca4e74f 100644 --- a/packages/fuselage-polyfills/package.json +++ b/packages/fuselage-polyfills/package.json @@ -15,6 +15,7 @@ "url": "https://github.com/RocketChat/fuselage/issues" }, "main": "index.js", + "types": "index.d.ts", "publishConfig": { "access": "public" }, @@ -36,9 +37,9 @@ "@rocket.chat/eslint-config-alt": "workspace:~", "@rocket.chat/prettier-config": "workspace:~", "bump": "workspace:~", - "eslint": "~8.26.0", + "eslint": "~8.38.0", "lint-all": "workspace:~", - "lint-staged": "~12.3.8", - "prettier": "~2.7.1" + "lint-staged": "~13.2.1", + "prettier": "~2.8.7" } } diff --git a/packages/fuselage-toastbar/.eslintignore b/packages/fuselage-toastbar/.eslintignore index d4b5909e36..968aff0559 100644 --- a/packages/fuselage-toastbar/.eslintignore +++ b/packages/fuselage-toastbar/.eslintignore @@ -1,3 +1,4 @@ /dist /node_modules /storybook-static +!/.storybook diff --git a/packages/fuselage-toastbar/.storybook/main.ts b/packages/fuselage-toastbar/.storybook/main.js similarity index 53% rename from packages/fuselage-toastbar/.storybook/main.ts rename to packages/fuselage-toastbar/.storybook/main.js index 554b7c71c2..ba9899c6b7 100644 --- a/packages/fuselage-toastbar/.storybook/main.ts +++ b/packages/fuselage-toastbar/.storybook/main.js @@ -1,7 +1,14 @@ +/** @type {import('@storybook/react/types').StorybookConfig} */ module.exports = { - addons: ['@storybook/addon-essentials', 'storybook-dark-mode/register'], - stories: ['../src/**/*.stories.tsx', '../src/**/stories.tsx'], + core: { + builder: 'webpack5', + }, features: { postcss: false, }, + typescript: { + reactDocgen: 'react-docgen-typescript-plugin', + }, + addons: ['@storybook/addon-essentials', 'storybook-dark-mode/register'], + stories: ['../src/**/*.stories.tsx', '../src/**/stories.tsx'], }; diff --git a/packages/fuselage-toastbar/.storybook/preview.tsx b/packages/fuselage-toastbar/.storybook/preview.tsx index f07bfdb5dd..3319b18b43 100644 --- a/packages/fuselage-toastbar/.storybook/preview.tsx +++ b/packages/fuselage-toastbar/.storybook/preview.tsx @@ -1,14 +1,14 @@ +import { DarkModeProvider } from '@rocket.chat/layout'; import { DocsPage, DocsContainer } from '@storybook/addon-docs'; import type { DecoratorFunction } from '@storybook/addons'; import { addParameters } from '@storybook/react'; import '@rocket.chat/icons/dist/rocketchat.css'; import '@rocket.chat/fuselage-polyfills'; import type { ElementType, ReactElement } from 'react'; -import { Suspense } from 'react'; +import React, { Suspense } from 'react'; import { useDarkMode } from 'storybook-dark-mode'; + import ToastBarProvider from '../src/ToastBarProvider'; -import { DarkModeProvider } from '@rocket.chat/layout'; -import React from 'react'; addParameters({ backgrounds: { diff --git a/packages/fuselage-toastbar/package.json b/packages/fuselage-toastbar/package.json index 7e2ae7b741..d553b517e3 100644 --- a/packages/fuselage-toastbar/package.json +++ b/packages/fuselage-toastbar/package.json @@ -53,26 +53,28 @@ "@rocket.chat/layout": "workspace:~", "@rocket.chat/prettier-config": "workspace:~", "@rocket.chat/styled": "workspace:~", - "@storybook/addon-essentials": "~6.5.15", - "@storybook/addons": "~6.5.15", - "@storybook/react": "~6.5.15", - "@storybook/source-loader": "~6.5.15", - "@storybook/theming": "~6.5.15", - "@types/jest": "~27.4.1", - "@types/react": "~17.0.53", - "@types/react-dom": "^17.0.18", + "@storybook/addon-essentials": "~6.5.16", + "@storybook/addons": "~6.5.16", + "@storybook/builder-webpack5": "~6.5.16", + "@storybook/manager-webpack5": "~6.5.16", + "@storybook/react": "~6.5.16", + "@storybook/theming": "~6.5.16", + "@types/jest": "~29.5.0", + "@types/react": "~17.0.57", + "@types/react-dom": "^17.0.19", "bump": "workspace:~", - "eslint": "~8.26.0", - "jest": "~27.5.1", + "eslint": "~8.38.0", + "jest": "~29.5.0", "lint-all": "workspace:~", - "lint-staged": "~12.3.8", + "lint-staged": "~13.2.1", "npm-run-all": "^4.1.5", - "prettier": "~2.7.1", + "prettier": "~2.8.7", + "react-docgen-typescript-plugin": "~1.0.5", "rimraf": "~3.0.2", "storybook-dark-mode": "~1.1.2", - "ts-jest": "~27.1.5", - "typedoc": "~0.22.18", - "typescript": "~4.9.4" + "ts-jest": "~29.1.0", + "typedoc": "~0.24.1", + "typescript": "~5.0.4" }, "peerDependencies": { "@rocket.chat/fuselage": "*", @@ -95,15 +97,7 @@ "testMatch": [ "/src/**/*.spec.[jt]s?(x)" ], - "testEnvironment": "jsdom", - "globals": { - "ts-jest": { - "tsconfig": { - "noUnusedLocals": false, - "noUnusedParameters": false - } - } - } + "testEnvironment": "jsdom" }, "volta": { "extends": "../../package.json" diff --git a/packages/fuselage-toastbar/tsconfig.json b/packages/fuselage-toastbar/tsconfig.json index 29fa137f6f..0c9ff42708 100644 --- a/packages/fuselage-toastbar/tsconfig.json +++ b/packages/fuselage-toastbar/tsconfig.json @@ -13,7 +13,6 @@ "forceConsistentCasingInFileNames": true, "moduleResolution": "node", "resolveJsonModule": true, - "jsx": "react-jsx", - "importsNotUsedAsValues": "error" + "jsx": "react-jsx" } } diff --git a/packages/fuselage-tokens/.stylelintrc b/packages/fuselage-tokens/.stylelintrc index 67428e417d..d1c42d5122 100644 --- a/packages/fuselage-tokens/.stylelintrc +++ b/packages/fuselage-tokens/.stylelintrc @@ -25,22 +25,14 @@ "declaration-block-no-redundant-longhand-properties": true, "declaration-block-no-shorthand-property-overrides": true, "declaration-block-single-line-max-declarations": 1, - "declaration-block-trailing-semicolon": "always", "font-family-no-duplicate-names": true, "function-linear-gradient-no-nonstandard-direction": true, - "function-max-empty-lines": 0, "function-name-case": "lower", "keyframe-declaration-no-important": true, "length-zero-no-unit": true, - "max-empty-lines": 1, - "media-feature-name-case": "lower", "media-feature-name-no-unknown": true, "no-duplicate-selectors": true, "no-empty-source": true, - "no-extra-semicolons": true, - "number-leading-zero": "always", - "number-no-trailing-zeros": true, - "property-case": "lower", "property-no-unknown": true, "rule-empty-line-before": [ "always", @@ -56,8 +48,6 @@ "scss/at-mixin-pattern": "^-?([a-z][a-z0-9]+-)*[a-z][a-z0-9]+$", "scss/dollar-variable-pattern": "^-?([a-z][a-z0-9]+-)*[a-z][a-z0-9]+$", "scss/no-duplicate-mixins": true, - "selector-max-empty-lines": 0, - "selector-pseudo-class-case": "lower", "selector-pseudo-class-no-unknown": [ true, { @@ -66,15 +56,12 @@ ] } ], - "selector-pseudo-element-case": "lower", "selector-pseudo-element-colon-notation": "double", "selector-pseudo-element-no-unknown": true, "selector-type-case": "lower", "selector-type-no-unknown": true, "shorthand-property-no-redundant-values": true, - "unit-case": "lower", "unit-no-unknown": true, - "value-list-max-empty-lines": 1, "order/properties-order": [ [ { diff --git a/packages/fuselage-tokens/package.json b/packages/fuselage-tokens/package.json index 2c03e3914b..d1b9c577c7 100644 --- a/packages/fuselage-tokens/package.json +++ b/packages/fuselage-tokens/package.json @@ -7,8 +7,6 @@ "name": "Rocket.Chat", "url": "https://rocket.chat/" }, - "module": "dist/esm/index.js", - "types": "dist/esm/index.d.ts", "license": "MIT", "repository": { "type": "git", @@ -40,8 +38,6 @@ ".:build": "node ./build --config ./config.js", ".:build:legacy": "build-design-tokens", ".:build:clean": "rimraf dist", - ".:build:esm": "tsc -p tsconfig.json", - ".:build:cjs": "tsc -p tsconfig-cjs.json", "bump-next": "bump-next" }, "devDependencies": { @@ -49,21 +45,20 @@ "@rocket.chat/prettier-config": "workspace:~", "build-design-tokens": "workspace:~", "bump": "workspace:~", - "eslint": "~8.26.0", - "eslint-config-prettier": "~8.5.0", + "eslint": "~8.38.0", + "eslint-config-prettier": "~8.8.0", "eslint-plugin-import": "~2.26.0", "eslint-plugin-prettier": "~4.2.1", "lint-all": "workspace:~", - "lint-staged": "~12.3.8", + "lint-staged": "~13.2.1", "npm-run-all": "^4.1.5", "postcss-scss": "~4.0.6", - "prettier": "~2.7.1", + "prettier": "~2.8.7", "rimraf": "^3.0.2", "style-dictionary": "~3.7.2", - "stylelint": "~14.14.1", - "stylelint-order": "~5.0.0", - "stylelint-prettier": "~2.0.0", - "stylelint-scss": "~4.3.0", - "typescript": "~4.9.4" + "stylelint": "~15.4.0", + "stylelint-order": "~6.0.3", + "stylelint-prettier": "~3.0.0", + "stylelint-scss": "~4.6.0" } } diff --git a/packages/fuselage-tokens/tsconfig.json b/packages/fuselage-tokens/tsconfig.json deleted file mode 100644 index 2dab93babd..0000000000 --- a/packages/fuselage-tokens/tsconfig.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "compilerOptions": { - "target": "ES5", - "module": "ES2020", - "lib": ["ES2020"], - "declaration": true, - "declarationMap": true, - "sourceMap": true, - "outDir": "./dist/esm/", - "strict": true, - "esModuleInterop": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "moduleResolution": "node", - "resolveJsonModule": true, - "importsNotUsedAsValues": "error" - }, - "exclude": ["dist/", "src/**/*.spec.ts"] -} diff --git a/packages/fuselage-ui-kit/.storybook/main.js b/packages/fuselage-ui-kit/.storybook/main.js new file mode 100644 index 0000000000..d71e9958fa --- /dev/null +++ b/packages/fuselage-ui-kit/.storybook/main.js @@ -0,0 +1,14 @@ +/** @type {import('@storybook/react/types').StorybookConfig} */ +module.exports = { + core: { + builder: 'webpack5', + }, + features: { + postcss: false, + }, + typescript: { + reactDocgen: 'react-docgen-typescript-plugin', + }, + addons: ['@storybook/addon-essentials'], + stories: ['../src/**/*.stories.tsx', '../src/**/stories.tsx'], +}; diff --git a/packages/fuselage-ui-kit/.storybook/main.ts b/packages/fuselage-ui-kit/.storybook/main.ts deleted file mode 100644 index 28e2f062c5..0000000000 --- a/packages/fuselage-ui-kit/.storybook/main.ts +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - addons: ['@storybook/addon-essentials'], - stories: ['../src/**/*.stories.tsx', '../src/**/stories.tsx'], - features: { - postcss: false, - }, -}; diff --git a/packages/fuselage-ui-kit/package.json b/packages/fuselage-ui-kit/package.json index 2b8bf80d57..56e054b075 100644 --- a/packages/fuselage-ui-kit/package.json +++ b/packages/fuselage-ui-kit/package.json @@ -56,34 +56,33 @@ "@rocket.chat/icons": "workspace:~", "@rocket.chat/prettier-config": "workspace:~", "@rocket.chat/styled": "workspace:~", - "@storybook/addon-essentials": "~6.5.15", - "@storybook/addons": "~6.5.15", - "@storybook/builder-webpack5": "~6.5.15", - "@storybook/manager-webpack5": "~6.5.15", - "@storybook/react": "~6.5.15", - "@storybook/source-loader": "~6.5.15", - "@storybook/theming": "~6.5.15", - "@types/react": "~17.0.53", - "@types/react-dom": "^17.0.18", - "babel-loader": "~8.2.5", + "@storybook/addon-essentials": "~6.5.16", + "@storybook/addons": "~6.5.16", + "@storybook/builder-webpack5": "~6.5.16", + "@storybook/manager-webpack5": "~6.5.16", + "@storybook/react": "~6.5.16", + "@storybook/theming": "~6.5.16", + "@types/react": "~17.0.57", + "@types/react-dom": "^17.0.19", + "babel-loader": "~9.1.2", "bump": "workspace:~", "cross-env": "^7.0.3", - "eslint": "~8.26.0", + "eslint": "~8.38.0", "lint-all": "workspace:~", - "lint-staged": "~12.3.8", + "lint-staged": "~13.2.1", "normalize.css": "^8.0.1", "npm-run-all": "^4.1.5", - "prettier": "~2.7.1", + "prettier": "~2.8.7", "react": "^17.0.2", + "react-docgen-typescript-plugin": "~1.0.5", "react-dom": "^17.0.2", "rimraf": "^3.0.2", - "typescript": "~4.9.4", - "webpack": "~5.76.0", + "typescript": "~5.0.4", + "webpack": "~5.78.0", "write-version-module": "workspace:~" }, "dependencies": { - "@rocket.chat/ui-kit": "workspace:~", - "tslib": "^2.3.1" + "@rocket.chat/ui-kit": "workspace:~" }, "volta": { "extends": "../../package.json" diff --git a/packages/fuselage-ui-kit/tsconfig.json b/packages/fuselage-ui-kit/tsconfig.json index 20234a7be1..96f2f543ff 100644 --- a/packages/fuselage-ui-kit/tsconfig.json +++ b/packages/fuselage-ui-kit/tsconfig.json @@ -16,12 +16,10 @@ "noImplicitAny": true, "strict": true, "strictNullChecks": true, - "suppressImplicitAnyIndexErrors": true, "noUnusedLocals": true, "noUnusedParameters": true, "esModuleInterop": true, - "skipLibCheck": true, - "importsNotUsedAsValues": "error" + "skipLibCheck": true }, "exclude": ["node_modules", "dist"] } diff --git a/packages/fuselage/.eslintrc.js b/packages/fuselage/.eslintrc.js index f63e529f1e..225f17d426 100644 --- a/packages/fuselage/.eslintrc.js +++ b/packages/fuselage/.eslintrc.js @@ -16,19 +16,9 @@ module.exports = { overrides: [ { files: ['*.mdx'], - extends: [ - '@rocket.chat/eslint-config-alt/react', - 'plugin:mdx/recommended', - ], - parserOptions: { - ecmaFeatures: { - jsx: true, - }, - }, + extends: ['plugin:mdx/recommended'], rules: { - 'new-cap': 'off', - 'prefer-arrow-callback': 'off', - 'semi': 'off', + 'react/self-closing-comp': 'off', }, }, ], diff --git a/packages/fuselage/.storybook/main.js b/packages/fuselage/.storybook/main.js index 0985719ebb..2c13f98845 100644 --- a/packages/fuselage/.storybook/main.js +++ b/packages/fuselage/.storybook/main.js @@ -1,5 +1,6 @@ const webpack = require('webpack'); +/** @type {import('@storybook/react/types').StorybookConfig} */ module.exports = { core: { builder: 'webpack5', @@ -7,6 +8,9 @@ module.exports = { features: { postcss: false, }, + typescript: { + reactDocgen: 'react-docgen-typescript-plugin', + }, addons: ['@storybook/addon-essentials', '@storybook/addon-interactions'], stories: ['../src/**/*.stories.{mdx,js,tsx}'], webpackFinal: (config) => { diff --git a/packages/fuselage/.stylelintrc b/packages/fuselage/.stylelintrc index 67428e417d..d1c42d5122 100644 --- a/packages/fuselage/.stylelintrc +++ b/packages/fuselage/.stylelintrc @@ -25,22 +25,14 @@ "declaration-block-no-redundant-longhand-properties": true, "declaration-block-no-shorthand-property-overrides": true, "declaration-block-single-line-max-declarations": 1, - "declaration-block-trailing-semicolon": "always", "font-family-no-duplicate-names": true, "function-linear-gradient-no-nonstandard-direction": true, - "function-max-empty-lines": 0, "function-name-case": "lower", "keyframe-declaration-no-important": true, "length-zero-no-unit": true, - "max-empty-lines": 1, - "media-feature-name-case": "lower", "media-feature-name-no-unknown": true, "no-duplicate-selectors": true, "no-empty-source": true, - "no-extra-semicolons": true, - "number-leading-zero": "always", - "number-no-trailing-zeros": true, - "property-case": "lower", "property-no-unknown": true, "rule-empty-line-before": [ "always", @@ -56,8 +48,6 @@ "scss/at-mixin-pattern": "^-?([a-z][a-z0-9]+-)*[a-z][a-z0-9]+$", "scss/dollar-variable-pattern": "^-?([a-z][a-z0-9]+-)*[a-z][a-z0-9]+$", "scss/no-duplicate-mixins": true, - "selector-max-empty-lines": 0, - "selector-pseudo-class-case": "lower", "selector-pseudo-class-no-unknown": [ true, { @@ -66,15 +56,12 @@ ] } ], - "selector-pseudo-element-case": "lower", "selector-pseudo-element-colon-notation": "double", "selector-pseudo-element-no-unknown": true, "selector-type-case": "lower", "selector-type-no-unknown": true, "shorthand-property-no-redundant-values": true, - "unit-case": "lower", "unit-no-unknown": true, - "value-list-max-empty-lines": 1, "order/properties-order": [ [ { diff --git a/packages/fuselage/jest.config.js b/packages/fuselage/jest.config.js index c4550e8d88..71ef7a11c3 100644 --- a/packages/fuselage/jest.config.js +++ b/packages/fuselage/jest.config.js @@ -7,15 +7,6 @@ module.exports = { errorOnDeprecated: true, testMatch: ['/src/**/*.spec.{ts,tsx}'], testEnvironment: 'jsdom', - globals: { - 'ts-jest': { - tsconfig: { - noUnusedLocals: false, - noUnusedParameters: false, - allowJs: true, - }, - }, - }, moduleNameMapper: { '\\.scss$': 'testing-utils/lazySingletonStyleTagModule', }, diff --git a/packages/fuselage/package.json b/packages/fuselage/package.json index c6c24d58ab..d8b7f8c9f5 100644 --- a/packages/fuselage/package.json +++ b/packages/fuselage/package.json @@ -65,75 +65,77 @@ "react-stately": "~3.17.0" }, "devDependencies": { - "@babel/core": "~7.19.6", - "@babel/eslint-parser": "~7.19.1", - "@babel/plugin-transform-runtime": "~7.19.6", - "@babel/preset-env": "~7.19.4", + "@babel/core": "~7.21.4", + "@babel/eslint-parser": "~7.21.3", + "@babel/plugin-transform-runtime": "~7.21.4", + "@babel/preset-env": "~7.21.4", "@babel/preset-react": "~7.18.6", "@rocket.chat/eslint-config-alt": "workspace:~", "@rocket.chat/fuselage-hooks": "workspace:~", "@rocket.chat/fuselage-polyfills": "workspace:~", "@rocket.chat/icons": "workspace:~", "@rocket.chat/prettier-config": "workspace:~", - "@storybook/addon-essentials": "~6.5.15", - "@storybook/addon-interactions": "~6.5.15", - "@storybook/addon-links": "~6.5.15", - "@storybook/addons": "~6.5.15", - "@storybook/builder-webpack5": "~6.5.15", - "@storybook/client-api": "~6.5.15", + "@storybook/addon-essentials": "~6.5.16", + "@storybook/addon-interactions": "~6.5.16", + "@storybook/addon-links": "~6.5.16", + "@storybook/addons": "~6.5.16", + "@storybook/builder-webpack5": "~6.5.16", + "@storybook/client-api": "~6.5.16", "@storybook/jest": "~0.0.10", - "@storybook/manager-webpack5": "~6.5.15", - "@storybook/react": "~6.5.15", - "@storybook/source-loader": "~6.5.15", + "@storybook/manager-webpack5": "~6.5.16", + "@storybook/react": "~6.5.16", "@storybook/testing-library": "~0.0.13", "@storybook/testing-react": "~1.3.0", - "@storybook/theming": "~6.5.15", + "@storybook/theming": "~6.5.16", "@testing-library/jest-dom": "~5.16.5", - "@testing-library/react": "^12.1.5", + "@testing-library/react": "release-12.x", + "@testing-library/user-event": "~14.4.3", "@types/invariant": "^2.2.35", - "@types/jest": "~27.4.1", - "autoprefixer": "~10.4.13", - "babel-loader": "~8.2.5", + "@types/jest": "~29.5.0", + "autoprefixer": "~10.4.14", + "babel-loader": "~9.1.2", "bump": "workspace:~", - "caniuse-lite": "~1.0.30001446", + "caniuse-lite": "~1.0.30001477", "cross-env": "^7.0.3", - "css-loader": "~6.6.0", + "css-loader": "~6.7.3", "cssnano": "~5.0.17", - "es-check": "~7.0.1", - "eslint": "~8.26.0", - "eslint-plugin-mdx": "~1.17.1", - "jest": "~27.5.1", + "es-check": "~7.1.1", + "eslint": "~8.38.0", + "eslint-mdx": "~2.0.5", + "eslint-plugin-mdx": "~2.0.5", + "jest": "~29.5.0", "lint-all": "workspace:~", - "lint-staged": "~12.3.8", + "lint-staged": "~13.2.1", "normalize.css": "^8.0.1", "npm-run-all": "^4.1.5", "path-browserify": "^1.0.1", "postcss": "~8.4.21", "postcss-custom-properties": "~12.1.11", "postcss-dir-pseudo-class": "~6.0.5", - "postcss-loader": "~6.2.1", + "postcss-loader": "~7.2.4", "postcss-logical": "~5.0.4", "postcss-scss": "~4.0.6", "postcss-svg": "~3.0.0", - "prettier": "~2.7.1", + "prettier": "~2.8.7", "react": "^17.0.2", + "react-docgen-typescript-plugin": "~1.0.5", "react-dom": "^17.0.2", "react-virtuoso": "~3.1.5", "rimraf": "^3.0.2", - "sass": "~1.49.11", - "sass-loader": "~12.4.0", - "style-loader": "~3.3.1", - "stylelint": "~14.14.1", - "stylelint-order": "~5.0.0", - "stylelint-prettier": "~2.0.0", - "stylelint-scss": "~4.3.0", + "sass": "~1.62.0", + "sass-loader": "~13.2.2", + "style-loader": "~3.3.2", + "stylelint": "~15.4.0", + "stylelint-order": "~6.0.3", + "stylelint-prettier": "~3.0.0", + "stylelint-scss": "~4.6.0", "testing-utils": "workspace:~", - "ts-jest": "~27.1.5", + "ts-jest": "~29.1.0", "ts-loader": "~9.4.2", - "typescript": "~4.9.4", - "webpack": "~5.76.0", - "webpack-bundle-analyzer": "~4.7.0", - "webpack-cli": "~4.10.0" + "typescript": "~5.0.4", + "webpack": "~5.78.0", + "webpack-bundle-analyzer": "~4.8.0", + "webpack-cli": "~5.0.1" }, "volta": { "extends": "../../package.json" diff --git a/packages/fuselage/src/components/Dropdown/Dropdown.spec.tsx b/packages/fuselage/src/components/Dropdown/Dropdown.spec.tsx index acd9fb47fe..bf7b52022b 100644 --- a/packages/fuselage/src/components/Dropdown/Dropdown.spec.tsx +++ b/packages/fuselage/src/components/Dropdown/Dropdown.spec.tsx @@ -17,15 +17,15 @@ describe('[Dropdown Component]', () => { it('should show dropdown when anchor is clicked once', async () => { const { getByTestId } = render(); const anchor = getByTestId('dropdown-anchor'); - userEvent.click(anchor); + await userEvent.click(anchor); expect(await screen.findByTestId('dropdown')).toBeInTheDocument(); }); it('should hide dropdown when anchor is clicked twice', async () => { const { getByTestId } = render(); const anchor = getByTestId('dropdown-anchor'); - userEvent.click(anchor); - userEvent.click(anchor); + await userEvent.click(anchor); + await userEvent.click(anchor); expect(dropdownOption).toBeNull(); }); }); diff --git a/packages/fuselage/src/components/InputBox/InputBox.styles.scss b/packages/fuselage/src/components/InputBox/InputBox.styles.scss index 2ccca8daa0..f8a8a9ce32 100644 --- a/packages/fuselage/src/components/InputBox/InputBox.styles.scss +++ b/packages/fuselage/src/components/InputBox/InputBox.styles.scss @@ -154,10 +154,7 @@ &::-webkit-inner-spin-button, &::-webkit-calendar-picker-indicator { position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; + inset: 0; width: auto; height: auto; diff --git a/packages/fuselage/src/components/Menu/Menu.spec.tsx b/packages/fuselage/src/components/Menu/Menu.spec.tsx index 11c67f9156..fbd96e9bdf 100644 --- a/packages/fuselage/src/components/Menu/Menu.spec.tsx +++ b/packages/fuselage/src/components/Menu/Menu.spec.tsx @@ -20,23 +20,23 @@ describe('[Menu Component]', () => { it('should open options when click', async () => { const { getByTestId } = render(); const button = getByTestId('menu'); - userEvent.click(button); + await userEvent.click(button); expect(await screen.findByText('Make Admin')).toBeInTheDocument(); }); it('should have no options when click twice', async () => { const { getByTestId } = render(); const button = getByTestId('menu'); - userEvent.click(button); - userEvent.click(button); + await userEvent.click(button); + await userEvent.click(button); expect(menuOption).toBeNull(); }); it('should have no options when click on menu and then elsewhere', async () => { const { getByTestId } = render(); const button = getByTestId('menu'); - userEvent.click(button); - userEvent.click(document.body); + await userEvent.click(button); + await userEvent.click(document.body); expect(menuOption).toBeNull(); }); }); diff --git a/packages/fuselage/src/components/ProgressBar/ProgressBar.styles.scss b/packages/fuselage/src/components/ProgressBar/ProgressBar.styles.scss index 2c0dec5ca8..87268f42fc 100644 --- a/packages/fuselage/src/components/ProgressBar/ProgressBar.styles.scss +++ b/packages/fuselage/src/components/ProgressBar/ProgressBar.styles.scss @@ -38,10 +38,7 @@ $progress-bar-border-radius: theme( &--animated::before { position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; + inset: 0; width: inherit; diff --git a/packages/fuselage/src/styleTokens.ts b/packages/fuselage/src/styleTokens.ts index 764ba56d18..a9ac4efb7b 100644 --- a/packages/fuselage/src/styleTokens.ts +++ b/packages/fuselage/src/styleTokens.ts @@ -1,5 +1,5 @@ import tokenColors from '@rocket.chat/fuselage-tokens/colors.json'; -import tokenTypography from '@rocket.chat/fuselage-tokens/dist/typography.json'; +import tokenTypography from '@rocket.chat/fuselage-tokens/typography.json'; import { memoize } from '@rocket.chat/memo'; import invariant from 'invariant'; diff --git a/packages/fuselage/tsconfig.json b/packages/fuselage/tsconfig.json index a74f359908..631713ebd9 100644 --- a/packages/fuselage/tsconfig.json +++ b/packages/fuselage/tsconfig.json @@ -16,8 +16,7 @@ "moduleResolution": "node", "resolveJsonModule": true, "allowJs": true, - "jsx": "react", - "importsNotUsedAsValues": "error" + "jsx": "react" }, "include": ["./src/", "./.jest/**/*.d.ts"], "exclude": [ diff --git a/packages/icons/.stylelintrc b/packages/icons/.stylelintrc index a7b7d9057d..14dad838c1 100644 --- a/packages/icons/.stylelintrc +++ b/packages/icons/.stylelintrc @@ -24,22 +24,14 @@ "declaration-block-no-redundant-longhand-properties": true, "declaration-block-no-shorthand-property-overrides": true, "declaration-block-single-line-max-declarations": 1, - "declaration-block-trailing-semicolon": "always", "font-family-no-duplicate-names": true, "function-linear-gradient-no-nonstandard-direction": true, - "function-max-empty-lines": 0, "function-name-case": "lower", "keyframe-declaration-no-important": true, "length-zero-no-unit": true, - "max-empty-lines": 1, - "media-feature-name-case": "lower", "media-feature-name-no-unknown": true, "no-duplicate-selectors": true, "no-empty-source": true, - "no-extra-semicolons": true, - "number-leading-zero": "always", - "number-no-trailing-zeros": true, - "property-case": "lower", "property-no-unknown": true, "rule-empty-line-before": [ "always", @@ -55,8 +47,6 @@ "scss/at-mixin-pattern": "^-?([a-z][a-z0-9]+-)*[a-z][a-z0-9]+$", "scss/dollar-variable-pattern": "^-?([a-z][a-z0-9]+-)*[a-z][a-z0-9]+$", "scss/no-duplicate-mixins": true, - "selector-max-empty-lines": 0, - "selector-pseudo-class-case": "lower", "selector-pseudo-class-no-unknown": [ true, { @@ -65,15 +55,12 @@ ] } ], - "selector-pseudo-element-case": "lower", "selector-pseudo-element-colon-notation": "double", "selector-pseudo-element-no-unknown": true, "selector-type-case": "lower", "selector-type-no-unknown": true, "shorthand-property-no-redundant-values": true, - "unit-case": "lower", "unit-no-unknown": true, - "value-list-max-empty-lines": 1, "order/properties-order": [ [ { diff --git a/packages/icons/package.json b/packages/icons/package.json index c4ea7300d5..d831958369 100644 --- a/packages/icons/package.json +++ b/packages/icons/package.json @@ -36,15 +36,15 @@ "@rocket.chat/prettier-config": "workspace:~", "build-icons": "workspace:~", "bump": "workspace:~", - "eslint": "~8.26.0", + "eslint": "~8.38.0", "lint-all": "workspace:~", - "lint-staged": "~12.3.8", + "lint-staged": "~13.2.1", "npm-run-all": "^4.1.5", - "prettier": "~2.7.1", + "prettier": "~2.8.7", "rimraf": "^3.0.2", - "stylelint": "~14.14.1", - "stylelint-order": "~5.0.0", - "stylelint-prettier": "~2.0.0", - "stylelint-scss": "~4.3.0" + "stylelint": "~15.4.0", + "stylelint-order": "~6.0.3", + "stylelint-prettier": "~3.0.0", + "stylelint-scss": "~4.6.0" } } diff --git a/packages/layout/.eslintignore b/packages/layout/.eslintignore index d4b5909e36..26042f8639 100644 --- a/packages/layout/.eslintignore +++ b/packages/layout/.eslintignore @@ -1,3 +1,4 @@ /dist /node_modules /storybook-static +!.storybook diff --git a/packages/layout/.storybook/main.ts b/packages/layout/.storybook/main.js similarity index 52% rename from packages/layout/.storybook/main.ts rename to packages/layout/.storybook/main.js index aff086b825..0f0f45c139 100644 --- a/packages/layout/.storybook/main.ts +++ b/packages/layout/.storybook/main.js @@ -1,7 +1,14 @@ +/** @type {import('@storybook/react/types').StorybookConfig} */ module.exports = { - addons: ['@storybook/addon-essentials', 'storybook-dark-mode'], - stories: ['../src/**/*.stories.tsx', '../src/**/stories.tsx'], + core: { + builder: 'webpack5', + }, features: { postcss: false, }, + typescript: { + reactDocgen: 'react-docgen-typescript-plugin', + }, + addons: ['@storybook/addon-essentials', 'storybook-dark-mode'], + stories: ['../src/**/*.stories.tsx', '../src/**/stories.tsx'], }; diff --git a/packages/layout/.storybook/preview.tsx b/packages/layout/.storybook/preview.tsx index 51472a6f2d..e9b1212e0e 100644 --- a/packages/layout/.storybook/preview.tsx +++ b/packages/layout/.storybook/preview.tsx @@ -1,16 +1,14 @@ import { DocsPage, DocsContainer } from '@storybook/addon-docs'; import type { DecoratorFunction } from '@storybook/addons'; import { addParameters } from '@storybook/react'; -import '@rocket.chat/icons/dist/rocketchat.css'; -import '@rocket.chat/fuselage-polyfills'; -import i18next from 'i18next'; import type { ElementType, ReactElement } from 'react'; -import { Suspense } from 'react'; -import { I18nextProvider, initReactI18next } from 'react-i18next'; +import React, { Suspense } from 'react'; import { useDarkMode } from 'storybook-dark-mode'; import DarkModeProvider from '../src/DarkModeProvider'; -import React from 'react'; + +import '@rocket.chat/icons/dist/rocketchat.css'; +import '@rocket.chat/fuselage-polyfills'; addParameters({ backgrounds: { @@ -29,24 +27,6 @@ addParameters({ }, }); -const getI18n = () => { - const i18n = i18next.createInstance().use(initReactI18next); - - // import('../.i18n/en.i18n.json').then((translation) => { - // i18n.init({ - // fallbackLng: 'en', - // debug: false, - // resources: { - // en: { - // translation, - // }, - // }, - // }); - // }); - - return i18n; -}; - export const decorators: DecoratorFunction[] = [ (Story: ElementType): ReactElement => { const dark = useDarkMode(); diff --git a/packages/layout/jest.config.js b/packages/layout/jest.config.js index 98a8568669..2857b4d157 100644 --- a/packages/layout/jest.config.js +++ b/packages/layout/jest.config.js @@ -3,12 +3,4 @@ module.exports = { errorOnDeprecated: true, testMatch: ['/src/**/*.spec.ts?(x)'], testEnvironment: 'jsdom', - globals: { - 'ts-jest': { - tsconfig: { - noUnusedLocals: false, - noUnusedParameters: false, - }, - }, - }, }; diff --git a/packages/layout/package.json b/packages/layout/package.json index 3346b482aa..03755cd40f 100644 --- a/packages/layout/package.json +++ b/packages/layout/package.json @@ -49,24 +49,26 @@ "@rocket.chat/eslint-config-alt": "workspace:~", "@rocket.chat/fuselage": "workspace:~", "@rocket.chat/prettier-config": "workspace:~", - "@storybook/addon-essentials": "~6.5.15", - "@storybook/addons": "~6.5.15", - "@storybook/react": "~6.5.15", - "@storybook/source-loader": "~6.5.15", - "@storybook/theming": "~6.5.15", - "@types/jest": "~27.4.1", + "@storybook/addon-essentials": "~6.5.16", + "@storybook/addons": "~6.5.16", + "@storybook/builder-webpack5": "~6.5.16", + "@storybook/manager-webpack5": "~6.5.16", + "@storybook/react": "~6.5.16", + "@storybook/theming": "~6.5.16", + "@types/jest": "~29.5.0", "bump": "workspace:~", - "eslint": "~8.26.0", - "jest": "~27.5.1", + "eslint": "~8.38.0", + "jest": "~29.5.0", "lint-all": "workspace:~", - "lint-staged": "~12.3.8", + "lint-staged": "~13.2.1", "npm-run-all": "^4.1.5", - "prettier": "~2.7.1", + "prettier": "~2.8.7", + "react-docgen-typescript-plugin": "~1.0.5", "rimraf": "~3.0.2", "storybook-dark-mode": "^1.1.2", - "ts-jest": "~27.1.5", - "typedoc": "~0.22.18", - "typescript": "~4.9.4" + "ts-jest": "~29.1.0", + "typedoc": "~0.24.1", + "typescript": "~5.0.4" }, "eslintConfig": { "extends": "@rocket.chat/eslint-config-alt/typescript", diff --git a/packages/logo/jest.config.js b/packages/logo/jest.config.js index 98a8568669..2857b4d157 100644 --- a/packages/logo/jest.config.js +++ b/packages/logo/jest.config.js @@ -3,12 +3,4 @@ module.exports = { errorOnDeprecated: true, testMatch: ['/src/**/*.spec.ts?(x)'], testEnvironment: 'jsdom', - globals: { - 'ts-jest': { - tsconfig: { - noUnusedLocals: false, - noUnusedParameters: false, - }, - }, - }, }; diff --git a/packages/logo/package.json b/packages/logo/package.json index 1c70a6fa91..5c4ea1ee4d 100644 --- a/packages/logo/package.json +++ b/packages/logo/package.json @@ -46,28 +46,27 @@ "@rocket.chat/eslint-config-alt": "workspace:~", "@rocket.chat/fuselage-tokens": "workspace:~", "@rocket.chat/prettier-config": "workspace:~", - "@types/jest": "~27.4.1", - "@types/react": "~17.0.53", - "@types/react-dom": "^17.0.18", + "@types/jest": "~29.5.0", + "@types/react": "~17.0.57", + "@types/react-dom": "^17.0.19", "build-logo": "workspace:~", "bump": "workspace:~", - "eslint": "~8.26.0", - "jest": "~27.5.1", + "eslint": "~8.38.0", + "jest": "~29.5.0", "lint-all": "workspace:~", - "lint-staged": "~12.3.8", + "lint-staged": "~13.2.1", "npm-run-all": "^4.1.5", - "prettier": "~2.7.1", + "prettier": "~2.8.7", "react": "^17.0.2", "react-dom": "^17.0.2", "rimraf": "^3.0.2", - "ts-jest": "~27.1.5", - "typedoc": "~0.22.18", - "typescript": "~4.9.4" + "ts-jest": "~29.1.0", + "typedoc": "~0.24.1", + "typescript": "~5.0.4" }, "dependencies": { "@rocket.chat/fuselage-hooks": "workspace:~", - "@rocket.chat/styled": "workspace:~", - "tslib": "^2.3.1" + "@rocket.chat/styled": "workspace:~" }, "peerDependencies": { "react": "17.0.2", diff --git a/packages/logo/tsconfig.json b/packages/logo/tsconfig.json index 29fa137f6f..0c9ff42708 100644 --- a/packages/logo/tsconfig.json +++ b/packages/logo/tsconfig.json @@ -13,7 +13,6 @@ "forceConsistentCasingInFileNames": true, "moduleResolution": "node", "resolveJsonModule": true, - "jsx": "react-jsx", - "importsNotUsedAsValues": "error" + "jsx": "react-jsx" } } diff --git a/packages/memo/package.json b/packages/memo/package.json index 4be82c88d7..de210cce5b 100644 --- a/packages/memo/package.json +++ b/packages/memo/package.json @@ -43,17 +43,17 @@ "devDependencies": { "@rocket.chat/eslint-config-alt": "workspace:~", "@rocket.chat/prettier-config": "workspace:~", - "@types/jest": "~27.4.1", + "@types/jest": "~29.5.0", "bump": "workspace:~", - "eslint": "~8.26.0", - "jest": "~27.5.1", + "eslint": "~8.38.0", + "jest": "~29.5.0", "lint-all": "workspace:~", - "lint-staged": "~12.3.8", - "prettier": "~2.7.1", + "lint-staged": "~13.2.1", + "prettier": "~2.8.7", "rimraf": "~3.0.2", - "ts-jest": "~27.1.5", - "typedoc": "~0.22.18", - "typescript": "~4.9.4" + "ts-jest": "~29.1.0", + "typedoc": "~0.24.1", + "typescript": "~5.0.4" }, "eslintConfig": { "extends": "@rocket.chat/eslint-config-alt/typescript", @@ -67,14 +67,6 @@ "errorOnDeprecated": true, "testMatch": [ "/src/**/*.spec.ts" - ], - "globals": { - "ts-jest": { - "tsconfig": { - "noUnusedLocals": false, - "noUnusedParameters": false - } - } - } + ] } } diff --git a/packages/memo/tsconfig.json b/packages/memo/tsconfig.json index ee3f8a4b68..9d0094d8a9 100644 --- a/packages/memo/tsconfig.json +++ b/packages/memo/tsconfig.json @@ -11,8 +11,7 @@ "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "moduleResolution": "node", - "resolveJsonModule": true, - "importsNotUsedAsValues": "error" + "resolveJsonModule": true }, "include": ["src/**/*"], "typedocOptions": { diff --git a/packages/message-parser/loaders/pegtransform.js b/packages/message-parser/loaders/pegtransform.js index c2fe75e5c7..9df49c61df 100644 --- a/packages/message-parser/loaders/pegtransform.js +++ b/packages/message-parser/loaders/pegtransform.js @@ -1,9 +1,10 @@ const pegjs = require('peggy'); module.exports = { - process: (content) => - pegjs.generate(content, { + process: (content) => ({ + code: pegjs.generate(content, { output: 'source', format: 'commonjs', }), + }), }; diff --git a/packages/message-parser/package.json b/packages/message-parser/package.json index 01bead84d7..1dfbb06c67 100644 --- a/packages/message-parser/package.json +++ b/packages/message-parser/package.json @@ -51,34 +51,34 @@ "bump-next": "bump-next" }, "devDependencies": { - "@babel/core": "~7.19.6", - "@babel/eslint-parser": "~7.19.1", - "@babel/preset-env": "~7.19.4", + "@babel/core": "~7.21.4", + "@babel/eslint-parser": "~7.21.3", + "@babel/preset-env": "~7.21.4", "@rocket.chat/eslint-config-alt": "workspace:~", "@rocket.chat/peggy-loader": "workspace:~", "@rocket.chat/prettier-config": "workspace:~", - "@types/jest": "~27.4.1", - "@types/node": "~15.14.9", - "@typescript-eslint/parser": "~5.11.0", - "babel-loader": "~8.2.5", + "@types/jest": "~29.5.0", + "@types/node": "~14.18.42", + "@typescript-eslint/parser": "~5.58.0", + "babel-loader": "~9.1.2", "bump": "workspace:~", - "eslint": "~8.26.0", - "jest": "~27.5.1", + "eslint": "~8.38.0", + "jest": "~29.5.0", "lint-all": "workspace:~", - "lint-staged": "~12.3.8", + "lint-staged": "~13.2.1", "npm-run-all": "^4.1.5", "peggy": "3.0.2", - "prettier": "~2.7.1", - "prettier-plugin-pegjs": "~0.5.3", + "prettier": "~2.8.7", + "prettier-plugin-pegjs": "~0.5.4", "rimraf": "^3.0.2", - "ts-jest": "~27.1.5", + "ts-jest": "~29.1.0", "ts-loader": "~9.4.2", - "typedoc": "~0.22.18", - "typescript": "~4.9.4", - "webpack": "~5.76.0", - "webpack-cli": "~4.10.0" + "typedoc": "~0.24.1", + "typescript": "~5.0.4", + "webpack": "~5.78.0", + "webpack-cli": "~5.0.1" }, "dependencies": { - "tldts": "~5.7.104" + "tldts": "~5.7.112" } } diff --git a/packages/message-parser/tsconfig.json b/packages/message-parser/tsconfig.json index eb0340933b..3e59aeae89 100644 --- a/packages/message-parser/tsconfig.json +++ b/packages/message-parser/tsconfig.json @@ -13,7 +13,6 @@ "forceConsistentCasingInFileNames": true, "moduleResolution": "node", "noImplicitThis": true, - "alwaysStrict": true, - "importsNotUsedAsValues": "error" + "alwaysStrict": true } } diff --git a/packages/mp3-encoder/jest.config.js b/packages/mp3-encoder/jest.config.js index 0dbb3c664a..0d581323df 100644 --- a/packages/mp3-encoder/jest.config.js +++ b/packages/mp3-encoder/jest.config.js @@ -3,12 +3,4 @@ module.exports = { errorOnDeprecated: true, testMatch: ['/src/**/*.spec.ts'], testEnvironment: 'jsdom', - globals: { - 'ts-jest': { - tsconfig: { - noUnusedLocals: false, - noUnusedParameters: false, - }, - }, - }, }; diff --git a/packages/mp3-encoder/package.json b/packages/mp3-encoder/package.json index cedfd32ab7..17f58f8b71 100644 --- a/packages/mp3-encoder/package.json +++ b/packages/mp3-encoder/package.json @@ -44,25 +44,26 @@ "lamejs": "git+https://github.com/zhuker/lamejs.git#commit=582bbba6a12f981b984d8fb9e1874499fed85675" }, "devDependencies": { - "@babel/core": "~7.19.6", - "@babel/plugin-transform-runtime": "~7.19.6", - "@babel/preset-env": "~7.19.4", - "@babel/preset-typescript": "^7.18.6", + "@babel/core": "~7.21.4", + "@babel/plugin-transform-runtime": "~7.21.4", + "@babel/preset-env": "~7.21.4", + "@babel/preset-typescript": "~7.21.4", "@rocket.chat/eslint-config-alt": "workspace:~", "@rocket.chat/prettier-config": "workspace:~", "@rollup/plugin-commonjs": "~21.0.3", "@rollup/plugin-node-resolve": "~13.1.3", "@rollup/plugin-typescript": "~8.3.4", - "@types/jest": "~27.4.1", + "@types/jest": "~29.5.0", "bump": "workspace:~", - "eslint": "~8.26.0", - "jest": "~27.5.1", + "eslint": "~8.38.0", + "jest": "~29.5.0", + "jest-environment-jsdom": "~29.5.0", "lint-all": "workspace:~", - "lint-staged": "~12.3.8", - "prettier": "~2.7.1", + "lint-staged": "~13.2.1", + "prettier": "~2.8.7", "rollup": "~2.67.3", - "ts-jest": "~27.1.5", - "typedoc": "~0.22.18", - "typescript": "~4.9.4" + "ts-jest": "~29.1.0", + "typedoc": "~0.24.1", + "typescript": "~5.0.4" } } diff --git a/packages/mp3-encoder/tsconfig.json b/packages/mp3-encoder/tsconfig.json index 553f3b420e..d6f8a9cdf6 100644 --- a/packages/mp3-encoder/tsconfig.json +++ b/packages/mp3-encoder/tsconfig.json @@ -6,7 +6,6 @@ "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "rootDir": "./src", - "skipLibCheck": true, - "importsNotUsedAsValues": "error" + "skipLibCheck": true } } diff --git a/packages/onboarding-ui/.storybook/main.ts b/packages/onboarding-ui/.storybook/main.js similarity index 53% rename from packages/onboarding-ui/.storybook/main.ts rename to packages/onboarding-ui/.storybook/main.js index 554b7c71c2..ba9899c6b7 100644 --- a/packages/onboarding-ui/.storybook/main.ts +++ b/packages/onboarding-ui/.storybook/main.js @@ -1,7 +1,14 @@ +/** @type {import('@storybook/react/types').StorybookConfig} */ module.exports = { - addons: ['@storybook/addon-essentials', 'storybook-dark-mode/register'], - stories: ['../src/**/*.stories.tsx', '../src/**/stories.tsx'], + core: { + builder: 'webpack5', + }, features: { postcss: false, }, + typescript: { + reactDocgen: 'react-docgen-typescript-plugin', + }, + addons: ['@storybook/addon-essentials', 'storybook-dark-mode/register'], + stories: ['../src/**/*.stories.tsx', '../src/**/stories.tsx'], }; diff --git a/packages/onboarding-ui/jest.config.js b/packages/onboarding-ui/jest.config.js index 842bc24304..777ceb6333 100644 --- a/packages/onboarding-ui/jest.config.js +++ b/packages/onboarding-ui/jest.config.js @@ -4,12 +4,4 @@ module.exports = { testMatch: ['/src/**/*.spec.ts?(x)'], testEnvironment: 'jsdom', setupFilesAfterEnv: ['/.jest/setup.ts'], - globals: { - 'ts-jest': { - tsconfig: { - noUnusedLocals: false, - noUnusedParameters: false, - }, - }, - }, }; diff --git a/packages/onboarding-ui/package.json b/packages/onboarding-ui/package.json index 8f0148b629..9b41bb75fc 100644 --- a/packages/onboarding-ui/package.json +++ b/packages/onboarding-ui/package.json @@ -53,35 +53,36 @@ "@rocket.chat/logo": "workspace:~", "@rocket.chat/prettier-config": "workspace:~", "@rocket.chat/styled": "workspace:~", - "@storybook/addon-essentials": "~6.5.15", - "@storybook/addons": "~6.5.15", - "@storybook/react": "~6.5.15", - "@storybook/source-loader": "~6.5.15", - "@storybook/theming": "~6.5.15", - "@types/jest": "~27.4.1", - "@types/react": "~17.0.53", - "@types/react-dom": "^17.0.18", + "@storybook/addon-essentials": "~6.5.16", + "@storybook/addons": "~6.5.16", + "@storybook/builder-webpack5": "~6.5.16", + "@storybook/manager-webpack5": "~6.5.16", + "@storybook/react": "~6.5.16", + "@storybook/theming": "~6.5.16", + "@types/jest": "~29.5.0", + "@types/react": "~17.0.57", + "@types/react-dom": "^17.0.19", "bump": "workspace:~", "countries-list": "^2.6.1", - "eslint": "~8.26.0", - "jest": "~27.5.1", + "eslint": "~8.38.0", + "jest": "~29.5.0", "lint-all": "workspace:~", - "lint-staged": "~12.3.8", + "lint-staged": "~13.2.1", "npm-run-all": "^4.1.5", - "prettier": "~2.7.1", + "prettier": "~2.8.7", "react": "^17.0.2", + "react-docgen-typescript-plugin": "~1.0.5", "react-dom": "^17.0.2", "react-i18next": "~11.15.7", "rimraf": "^3.0.2", "storybook-dark-mode": "^1.1.2", - "ts-jest": "~27.1.5", - "typedoc": "~0.22.18", - "typescript": "~4.9.4" + "ts-jest": "~29.1.0", + "typedoc": "~0.24.1", + "typescript": "~5.0.4" }, "dependencies": { "i18next": "~21.6.16", - "react-hook-form": "~7.27.1", - "tslib": "~2.3.1" + "react-hook-form": "~7.27.1" }, "peerDependencies": { "@rocket.chat/fuselage": "*", diff --git a/packages/onboarding-ui/tsconfig.json b/packages/onboarding-ui/tsconfig.json index 29fa137f6f..0c9ff42708 100644 --- a/packages/onboarding-ui/tsconfig.json +++ b/packages/onboarding-ui/tsconfig.json @@ -13,7 +13,6 @@ "forceConsistentCasingInFileNames": true, "moduleResolution": "node", "resolveJsonModule": true, - "jsx": "react-jsx", - "importsNotUsedAsValues": "error" + "jsx": "react-jsx" } } diff --git a/packages/peggy-loader/jest.config.js b/packages/peggy-loader/jest.config.js index aba24c1c97..21526c604f 100644 --- a/packages/peggy-loader/jest.config.js +++ b/packages/peggy-loader/jest.config.js @@ -2,12 +2,4 @@ module.exports = { preset: 'ts-jest', errorOnDeprecated: true, testMatch: ['/src/**/*.spec.[jt]s?(x)'], - globals: { - 'ts-jest': { - tsconfig: { - noUnusedLocals: false, - noUnusedParameters: false, - }, - }, - }, }; diff --git a/packages/peggy-loader/package.json b/packages/peggy-loader/package.json index 78c920730a..58d288d8f2 100644 --- a/packages/peggy-loader/package.json +++ b/packages/peggy-loader/package.json @@ -47,20 +47,17 @@ "devDependencies": { "@rocket.chat/eslint-config-alt": "workspace:~", "@rocket.chat/prettier-config": "workspace:~", - "@types/node": "~15.14.9", + "@types/node": "~14.18.42", "bump": "workspace:~", - "eslint": "~8.26.0", + "eslint": "~8.38.0", "lint-all": "workspace:~", - "lint-staged": "~12.3.8", + "lint-staged": "~13.2.1", "npm-run-all": "^4.1.5", "peggy": "3.0.2", - "prettier": "~2.7.1", + "prettier": "~2.8.7", "rimraf": "^3.0.2", - "ts-jest": "~27.1.5", - "typescript": "~4.9.4", - "webpack": "~5.76.0" - }, - "dependencies": { - "tslib": "^2.3.1" + "ts-jest": "~29.1.0", + "typescript": "~5.0.4", + "webpack": "~5.78.0" } } diff --git a/packages/peggy-loader/tsconfig.json b/packages/peggy-loader/tsconfig.json index 4b343b2ef3..9d2804b026 100644 --- a/packages/peggy-loader/tsconfig.json +++ b/packages/peggy-loader/tsconfig.json @@ -11,7 +11,6 @@ "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "moduleResolution": "node", - "resolveJsonModule": true, - "importsNotUsedAsValues": "error" + "resolveJsonModule": true } } diff --git a/packages/prettier-config/package.json b/packages/prettier-config/package.json index d8cf43533e..0162c88ddb 100644 --- a/packages/prettier-config/package.json +++ b/packages/prettier-config/package.json @@ -39,12 +39,12 @@ }, "devDependencies": { "bump": "workspace:~", - "eslint": "~8.26.0", - "eslint-config-prettier": "~8.5.0", + "eslint": "~8.38.0", + "eslint-config-prettier": "~8.8.0", "eslint-plugin-import": "~2.26.0", "eslint-plugin-prettier": "~4.2.1", "lint-all": "workspace:~", - "lint-staged": "~12.3.8", - "prettier": "~2.7.1" + "lint-staged": "~13.2.1", + "prettier": "~2.8.7" } } diff --git a/packages/string-helpers/package.json b/packages/string-helpers/package.json index b01b3dd9af..32635aeff0 100644 --- a/packages/string-helpers/package.json +++ b/packages/string-helpers/package.json @@ -44,21 +44,18 @@ "devDependencies": { "@rocket.chat/eslint-config-alt": "workspace:~", "@rocket.chat/prettier-config": "workspace:~", - "@types/jest": "~27.4.1", + "@types/jest": "~29.5.0", "bump": "workspace:~", - "eslint": "~8.26.0", - "jest": "~27.5.1", + "eslint": "~8.38.0", + "jest": "~29.5.0", "lint-all": "workspace:~", - "lint-staged": "~12.3.8", + "lint-staged": "~13.2.1", "npm-run-all": "^4.1.5", - "prettier": "~2.7.1", + "prettier": "~2.8.7", "rimraf": "^3.0.2", - "ts-jest": "~27.1.5", - "typedoc": "~0.22.18", - "typescript": "~4.9.4" - }, - "dependencies": { - "tslib": "^2.3.1" + "ts-jest": "~29.1.0", + "typedoc": "~0.24.1", + "typescript": "~5.0.4" }, "eslintConfig": { "extends": "@rocket.chat/eslint-config-alt/typescript", @@ -72,14 +69,6 @@ "errorOnDeprecated": true, "testMatch": [ "/src/**/*.spec.[jt]s?(x)" - ], - "globals": { - "ts-jest": { - "tsconfig": { - "noUnusedLocals": false, - "noUnusedParameters": false - } - } - } + ] } } diff --git a/packages/string-helpers/tsconfig.json b/packages/string-helpers/tsconfig.json index de9332fa5a..2db09fcceb 100644 --- a/packages/string-helpers/tsconfig.json +++ b/packages/string-helpers/tsconfig.json @@ -11,8 +11,7 @@ "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "moduleResolution": "node", - "resolveJsonModule": true, - "importsNotUsedAsValues": "error" + "resolveJsonModule": true }, "typedocOptions": { "entryPoints": ["src/index.ts"], diff --git a/packages/styled/jest.config.js b/packages/styled/jest.config.js index 0dbb3c664a..0d581323df 100644 --- a/packages/styled/jest.config.js +++ b/packages/styled/jest.config.js @@ -3,12 +3,4 @@ module.exports = { errorOnDeprecated: true, testMatch: ['/src/**/*.spec.ts'], testEnvironment: 'jsdom', - globals: { - 'ts-jest': { - tsconfig: { - noUnusedLocals: false, - noUnusedParameters: false, - }, - }, - }, }; diff --git a/packages/styled/package.json b/packages/styled/package.json index e2df01ecd3..85a7c05f9d 100644 --- a/packages/styled/package.json +++ b/packages/styled/package.json @@ -40,21 +40,20 @@ "devDependencies": { "@rocket.chat/eslint-config-alt": "workspace:~", "@rocket.chat/prettier-config": "workspace:~", - "@types/jest": "~27.4.1", + "@types/jest": "~29.5.0", "bump": "workspace:~", - "eslint": "~8.26.0", - "jest": "~27.5.1", + "eslint": "~8.38.0", + "jest": "~29.5.0", "lint-all": "workspace:~", - "lint-staged": "~12.3.8", + "lint-staged": "~13.2.1", "npm-run-all": "^4.1.5", - "prettier": "~2.7.1", + "prettier": "~2.8.7", "rimraf": "^3.0.2", - "ts-jest": "~27.1.5", - "typedoc": "~0.22.18", - "typescript": "~4.9.4" + "ts-jest": "~29.1.0", + "typedoc": "~0.24.1", + "typescript": "~5.0.4" }, "dependencies": { - "@rocket.chat/css-in-js": "workspace:~", - "tslib": "^2.3.1" + "@rocket.chat/css-in-js": "workspace:~" } } diff --git a/packages/styled/tsconfig.json b/packages/styled/tsconfig.json index 4b343b2ef3..9d2804b026 100644 --- a/packages/styled/tsconfig.json +++ b/packages/styled/tsconfig.json @@ -11,7 +11,6 @@ "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "moduleResolution": "node", - "resolveJsonModule": true, - "importsNotUsedAsValues": "error" + "resolveJsonModule": true } } diff --git a/packages/stylis-logical-props-middleware/jest.config.js b/packages/stylis-logical-props-middleware/jest.config.js index 3cf182aa74..565c7abe54 100644 --- a/packages/stylis-logical-props-middleware/jest.config.js +++ b/packages/stylis-logical-props-middleware/jest.config.js @@ -2,12 +2,4 @@ module.exports = { preset: 'ts-jest', errorOnDeprecated: true, testMatch: ['/src/**/*.spec.ts'], - globals: { - 'ts-jest': { - tsconfig: { - noUnusedLocals: false, - noUnusedParameters: false, - }, - }, - }, }; diff --git a/packages/stylis-logical-props-middleware/package.json b/packages/stylis-logical-props-middleware/package.json index 0acb71dbb3..88e3f5a1f5 100644 --- a/packages/stylis-logical-props-middleware/package.json +++ b/packages/stylis-logical-props-middleware/package.json @@ -40,23 +40,22 @@ "devDependencies": { "@rocket.chat/eslint-config-alt": "workspace:~", "@rocket.chat/prettier-config": "workspace:~", - "@types/jest": "~27.4.1", + "@types/jest": "~29.5.0", "bump": "workspace:~", - "eslint": "~8.26.0", - "jest": "~27.5.1", + "eslint": "~8.38.0", + "jest": "~29.5.0", "lint-all": "workspace:~", - "lint-staged": "~12.3.8", + "lint-staged": "~13.2.1", "npm-run-all": "^4.1.5", - "prettier": "~2.7.1", + "prettier": "~2.8.7", "rimraf": "^3.0.2", "stylis": "4.1.3", - "ts-jest": "~27.1.5", - "typedoc": "~0.22.18", - "typescript": "~4.9.4" + "ts-jest": "~29.1.0", + "typedoc": "~0.24.1", + "typescript": "~5.0.4" }, "dependencies": { - "@rocket.chat/css-supports": "workspace:~", - "tslib": "^2.3.1" + "@rocket.chat/css-supports": "workspace:~" }, "peerDependencies": { "stylis": "4.0.10" diff --git a/packages/stylis-logical-props-middleware/tsconfig.json b/packages/stylis-logical-props-middleware/tsconfig.json index 4b343b2ef3..9d2804b026 100644 --- a/packages/stylis-logical-props-middleware/tsconfig.json +++ b/packages/stylis-logical-props-middleware/tsconfig.json @@ -11,7 +11,6 @@ "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "moduleResolution": "node", - "resolveJsonModule": true, - "importsNotUsedAsValues": "error" + "resolveJsonModule": true } } diff --git a/packages/ui-kit/jest.config.js b/packages/ui-kit/jest.config.js index 011ba307d6..8583028a5a 100644 --- a/packages/ui-kit/jest.config.js +++ b/packages/ui-kit/jest.config.js @@ -3,12 +3,4 @@ module.exports = { testEnvironment: 'node', errorOnDeprecated: true, testMatch: ['/src/**/*.spec.[jt]s?(x)'], - globals: { - 'ts-jest': { - tsconfig: { - noUnusedLocals: false, - noUnusedParameters: false, - }, - }, - }, }; diff --git a/packages/ui-kit/package.json b/packages/ui-kit/package.json index c88408fb20..1d49bb68c1 100644 --- a/packages/ui-kit/package.json +++ b/packages/ui-kit/package.json @@ -37,27 +37,27 @@ "bump-next": "bump-next" }, "devDependencies": { - "@babel/core": "~7.19.6", - "@babel/eslint-parser": "~7.19.1", - "@babel/plugin-transform-runtime": "~7.19.6", - "@babel/preset-env": "~7.19.4", + "@babel/core": "~7.21.4", + "@babel/eslint-parser": "~7.21.3", + "@babel/plugin-transform-runtime": "~7.21.4", + "@babel/preset-env": "~7.21.4", "@rocket.chat/eslint-config-alt": "workspace:~", "@rocket.chat/prettier-config": "workspace:~", - "@types/jest": "~27.4.1", - "babel-loader": "~8.2.5", + "@types/jest": "~29.5.0", + "babel-loader": "~9.1.2", "bump": "workspace:~", - "eslint": "~8.26.0", - "jest": "~27.5.1", + "eslint": "~8.38.0", + "jest": "~29.5.0", "lint-all": "workspace:~", - "lint-staged": "~12.3.8", + "lint-staged": "~13.2.1", "npm-run-all": "^4.1.5", - "prettier": "~2.7.1", + "prettier": "~2.8.7", "rimraf": "^3.0.2", - "ts-jest": "~27.1.5", + "ts-jest": "~29.1.0", "ts-loader": "~9.4.2", - "typedoc": "~0.22.18", - "typescript": "~4.9.4", - "webpack": "~5.76.0", - "webpack-cli": "~4.10.0" + "typedoc": "~0.24.1", + "typescript": "~5.0.4", + "webpack": "~5.78.0", + "webpack-cli": "~5.0.1" } } diff --git a/packages/ui-kit/src/blocks/BlockElementType.ts b/packages/ui-kit/src/blocks/BlockElementType.ts index 981d7bcd42..2787ac0d32 100644 --- a/packages/ui-kit/src/blocks/BlockElementType.ts +++ b/packages/ui-kit/src/blocks/BlockElementType.ts @@ -29,5 +29,5 @@ export enum BlockElementType { type AssertEnumKeysFromBlockUnionTypes = { [B in BlockElement as Uppercase< B['type'] - >]: typeof BlockElementType[Uppercase]; + >]: (typeof BlockElementType)[Uppercase]; }; diff --git a/packages/ui-kit/src/blocks/LayoutBlockType.ts b/packages/ui-kit/src/blocks/LayoutBlockType.ts index 0986621ff7..edcf6f1039 100644 --- a/packages/ui-kit/src/blocks/LayoutBlockType.ts +++ b/packages/ui-kit/src/blocks/LayoutBlockType.ts @@ -14,7 +14,7 @@ export enum LayoutBlockType { // eslint-disable-next-line @typescript-eslint/no-unused-vars type AssertEnumKeysFromBlockUnionTypes = { - [B in LayoutBlock as Uppercase]: typeof LayoutBlockType[Uppercase< + [B in LayoutBlock as Uppercase< B['type'] - >]; + >]: (typeof LayoutBlockType)[Uppercase]; }; diff --git a/packages/ui-kit/src/blocks/TextObjectType.ts b/packages/ui-kit/src/blocks/TextObjectType.ts index 8155cf65e2..5ff491846c 100644 --- a/packages/ui-kit/src/blocks/TextObjectType.ts +++ b/packages/ui-kit/src/blocks/TextObjectType.ts @@ -11,7 +11,7 @@ export enum TextObjectType { // eslint-disable-next-line @typescript-eslint/no-unused-vars type AssertEnumKeysFromBlockUnionTypes = { - [B in TextObject as Uppercase]: typeof TextObjectType[Uppercase< + [B in TextObject as Uppercase]: (typeof TextObjectType)[Uppercase< B['type'] >]; }; diff --git a/packages/ui-kit/tsconfig.json b/packages/ui-kit/tsconfig.json index 2dab93babd..f173167a09 100644 --- a/packages/ui-kit/tsconfig.json +++ b/packages/ui-kit/tsconfig.json @@ -12,8 +12,7 @@ "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "moduleResolution": "node", - "resolveJsonModule": true, - "importsNotUsedAsValues": "error" + "resolveJsonModule": true }, "exclude": ["dist/", "src/**/*.spec.ts"] } diff --git a/packages/uikit-playground/package.json b/packages/uikit-playground/package.json index 15ca3f7391..b9840deff6 100644 --- a/packages/uikit-playground/package.json +++ b/packages/uikit-playground/package.json @@ -4,10 +4,10 @@ "homepage": "./", "private": true, "dependencies": { - "@codemirror/lang-javascript": "^6.1.2", + "@codemirror/lang-javascript": "^6.1.5", "@codemirror/lang-json": "^6.0.1", "@codemirror/tooltip": "^0.19.16", - "@lezer/highlight": "^1.1.3", + "@lezer/highlight": "^1.1.4", "@rocket.chat/css-in-js": "^0.31.12", "@rocket.chat/fuselage": "workspace:~", "@rocket.chat/fuselage-hooks": "workspace:~", @@ -17,10 +17,10 @@ "@rocket.chat/icons": "workspace:~", "@rocket.chat/logo": "workspace:~", "@rocket.chat/styled": "workspace:~", - "@types/jest": "^27.5.2", - "@types/node": "^16.11.36", - "@types/react": "^17.0.53", - "@types/react-dom": "^17.0.18", + "@types/jest": "^29.5.0", + "@types/node": "~14.18.42", + "@types/react": "^17.0.57", + "@types/react-dom": "^17.0.19", "codemirror": "^6.0.1", "eslint4b-prebuilt": "^6.7.2", "json5": "^2.2.3", @@ -28,13 +28,13 @@ "react-beautiful-dnd": "^13.1.1", "react-dom": "^17.0.2", "react-router-dom": "^6.3.0", - "react-scripts": "5.0.1", + "react-scripts": "^5.0.1", "react-split-pane": "^0.1.92", "react-virtuoso": "~3.1.5", - "typescript": "~4.9.4", + "typescript": "~5.0.4", "use-subscription": "^1.7.0", "web-vitals": "^2.1.4", - "webpack": "^5.74.0" + "webpack": "~5.78.0" }, "scripts": { "lint": "lint", @@ -65,15 +65,15 @@ ] }, "devDependencies": { - "@babel/eslint-parser": "^7.19.1", + "@babel/eslint-parser": "~7.21.3", "@rocket.chat/eslint-config-alt": "workspace:~", - "@types/react-beautiful-dnd": "^13.1.2", - "eslint": "~8.26.0", - "eslint-plugin-import": "^2.26.0", + "@types/react-beautiful-dnd": "^13.1.4", + "eslint": "~8.38.0", + "eslint-plugin-import": "~2.26.0", "gh-pages": "^4.0.0", "lint-all": "workspace:~", - "lint-staged": "~12.3.8", - "prettier": "~2.7.1" + "lint-staged": "~13.2.1", + "prettier": "~2.8.7" }, "postcss": { "plugins": { diff --git a/tools/build-design-tokens/package.json b/tools/build-design-tokens/package.json index 789b9756cb..59ab8efd19 100644 --- a/tools/build-design-tokens/package.json +++ b/tools/build-design-tokens/package.json @@ -7,7 +7,7 @@ "prettier": "*" }, "dependencies": { - "stylelint": "~14.14.1", + "stylelint": "~15.4.0", "tools-utils": "workspace:~" }, "version": "0.31.22" diff --git a/tools/build-icons/package.json b/tools/build-icons/package.json index c69d84f86f..aa46d269ee 100644 --- a/tools/build-icons/package.json +++ b/tools/build-icons/package.json @@ -10,7 +10,7 @@ "ttf2woff": "~3.0.0", "ttf2woff2": "~4.0.5", "unicode": "~14.0.0", - "xml2js": "~0.4.23" + "xml2js": "~0.5.0" }, "version": "0.31.22" } diff --git a/tools/build-logo/package.json b/tools/build-logo/package.json index 35037471d8..de138a4692 100644 --- a/tools/build-logo/package.json +++ b/tools/build-logo/package.json @@ -4,7 +4,7 @@ "bin": "./index.mjs", "version": "0.31.22", "dependencies": { - "prettier": "~2.7.1", + "prettier": "~2.8.7", "react": "^17.0.2", "react-dom": "^17.0.2", "sharp": "~0.30.7" diff --git a/tools/bump/package.json b/tools/bump/package.json index 5831759356..cc8472b9be 100644 --- a/tools/bump/package.json +++ b/tools/bump/package.json @@ -10,9 +10,9 @@ "conventional-recommended-bump": "~6.1.0", "latest-version": "~6.0.0", "pkg-versions": "~2.1.0", - "prettier": "~2.7.1", + "prettier": "~2.8.7", "semver": "~7.3.8", - "standard-version": "^9.3.2", - "zx": "~4.3.0" + "standard-version": "^9.5.0", + "zx": "~7.2.1" } } diff --git a/tools/lint-all/package.json b/tools/lint-all/package.json index 5f49854ca8..14d0243c9c 100644 --- a/tools/lint-all/package.json +++ b/tools/lint-all/package.json @@ -8,9 +8,9 @@ "version": "0.31.22", "dependencies": { "@prettier/plugin-xml": "~2.2.0", - "eslint": "~8.26.0", - "prettier": "~2.7.1", - "stylelint": "~14.14.1", - "zx": "~4.3.0" + "eslint": "~8.38.0", + "prettier": "~2.8.7", + "stylelint": "~15.4.0", + "zx": "~7.2.1" } } diff --git a/tools/scripts/package.json b/tools/scripts/package.json index 04816ff50f..8c91339d88 100644 --- a/tools/scripts/package.json +++ b/tools/scripts/package.json @@ -12,16 +12,16 @@ "devDependencies": { "@rocket.chat/eslint-config-alt": "workspace:~", "@rocket.chat/prettier-config": "workspace:~", - "@types/node": "~15.14.9", - "@typescript-eslint/parser": "~5.11.0", + "@types/node": "~14.18.42", + "@typescript-eslint/parser": "~5.58.0", "cross-env": "^7.0.3", "endent": "^2.1.0", - "eslint": "~8.26.0", + "eslint": "~8.38.0", "fast-glob": "~3.2.12", "npm-run-all": "^4.1.5", - "prettier": "~2.7.1", + "prettier": "~2.8.7", "ts-node": "~10.9.1", - "typescript": "~4.9.4" + "typescript": "~5.0.4" }, "version": "0.31.22" } diff --git a/tools/update-readme/package.json b/tools/update-readme/package.json index a599533b5f..9950d0737c 100644 --- a/tools/update-readme/package.json +++ b/tools/update-readme/package.json @@ -5,6 +5,6 @@ "version": "0.31.22", "dependencies": { "outdent": "^0.8.0", - "zx": "~4.3.0" + "zx": "~7.2.1" } } diff --git a/yarn.lock b/yarn.lock index 6fae56b082..8d3c7f776b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,13 +12,13 @@ __metadata: languageName: node linkType: hard -"@ampproject/remapping@npm:^2.1.0": - version: 2.2.0 - resolution: "@ampproject/remapping@npm:2.2.0" +"@ampproject/remapping@npm:^2.2.0": + version: 2.2.1 + resolution: "@ampproject/remapping@npm:2.2.1" dependencies: - "@jridgewell/gen-mapping": ^0.1.0 + "@jridgewell/gen-mapping": ^0.3.0 "@jridgewell/trace-mapping": ^0.3.9 - checksum: d74d170d06468913921d72430259424b7e4c826b5a7d39ff839a29d547efb97dc577caa8ba3fb5cf023624e9af9d09651afc3d4112a45e2050328abc9b3a2292 + checksum: 03c04fd526acc64a1f4df22651186f3e5ef0a9d6d6530ce4482ec9841269cf7a11dbb8af79237c282d721c5312024ff17529cd72cc4768c11e999b58e2302079 languageName: node linkType: hard @@ -35,19 +35,19 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.18.6, @babel/code-frame@npm:^7.5.5, @babel/code-frame@npm:^7.8.3": - version: 7.18.6 - resolution: "@babel/code-frame@npm:7.18.6" +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.18.6, @babel/code-frame@npm:^7.21.4, @babel/code-frame@npm:^7.5.5, @babel/code-frame@npm:^7.8.3": + version: 7.21.4 + resolution: "@babel/code-frame@npm:7.21.4" dependencies: "@babel/highlight": ^7.18.6 - checksum: 195e2be3172d7684bf95cff69ae3b7a15a9841ea9d27d3c843662d50cdd7d6470fd9c8e64be84d031117e4a4083486effba39f9aef6bbb2c89f7f21bcfba33ba + checksum: e5390e6ec1ac58dcef01d4f18eaf1fd2f1325528661ff6d4a5de8979588b9f5a8e852a54a91b923846f7a5c681b217f0a45c2524eb9560553160cd963b7d592c languageName: node linkType: hard -"@babel/compat-data@npm:^7.17.7, @babel/compat-data@npm:^7.19.4, @babel/compat-data@npm:^7.20.0": - version: 7.20.0 - resolution: "@babel/compat-data@npm:7.20.0" - checksum: 325148e2961edcfc17d53ec4b27f85ebdd6be1aa33d1d297acf84fb5879f58c0a18bfb6418f9f108b4c84a98606adb1668250a15fd4fab2cc84c537b454b9a42 +"@babel/compat-data@npm:^7.17.7, @babel/compat-data@npm:^7.20.5, @babel/compat-data@npm:^7.21.4": + version: 7.21.4 + resolution: "@babel/compat-data@npm:7.21.4" + checksum: 5f8b98c66f2ffba9f3c3a82c0cf354c52a0ec5ad4797b370dc32bdcd6e136ac4febe5e93d76ce76e175632e2dbf6ce9f46319aa689fcfafa41b6e49834fa4b66 languageName: node linkType: hard @@ -75,32 +75,32 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.1.0, @babel/core@npm:^7.11.1, @babel/core@npm:^7.12.10, @babel/core@npm:^7.12.3, @babel/core@npm:^7.16.0, @babel/core@npm:^7.7.2, @babel/core@npm:^7.7.5, @babel/core@npm:^7.8.0, @babel/core@npm:~7.19.6": - version: 7.19.6 - resolution: "@babel/core@npm:7.19.6" +"@babel/core@npm:^7.1.0, @babel/core@npm:^7.11.1, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.10, @babel/core@npm:^7.12.3, @babel/core@npm:^7.16.0, @babel/core@npm:^7.7.2, @babel/core@npm:^7.7.5, @babel/core@npm:^7.8.0, @babel/core@npm:~7.21.4": + version: 7.21.4 + resolution: "@babel/core@npm:7.21.4" dependencies: - "@ampproject/remapping": ^2.1.0 - "@babel/code-frame": ^7.18.6 - "@babel/generator": ^7.19.6 - "@babel/helper-compilation-targets": ^7.19.3 - "@babel/helper-module-transforms": ^7.19.6 - "@babel/helpers": ^7.19.4 - "@babel/parser": ^7.19.6 - "@babel/template": ^7.18.10 - "@babel/traverse": ^7.19.6 - "@babel/types": ^7.19.4 + "@ampproject/remapping": ^2.2.0 + "@babel/code-frame": ^7.21.4 + "@babel/generator": ^7.21.4 + "@babel/helper-compilation-targets": ^7.21.4 + "@babel/helper-module-transforms": ^7.21.2 + "@babel/helpers": ^7.21.0 + "@babel/parser": ^7.21.4 + "@babel/template": ^7.20.7 + "@babel/traverse": ^7.21.4 + "@babel/types": ^7.21.4 convert-source-map: ^1.7.0 debug: ^4.1.0 gensync: ^1.0.0-beta.2 - json5: ^2.2.1 + json5: ^2.2.2 semver: ^6.3.0 - checksum: 85c0bd38d0ef180aa2d23c3db6840a0baec88d2e05c30e7ffc3dfeb6b2b89d6e4864922f04997a1f4ce55f9dd469bf2e76518d5c7ae744b98516709d32769b73 + checksum: a3beebb2cc79908a02f27a07dc381bcb34e8ecc58fa99f568ad0934c49e12111fc977ee9c5b51eb7ea2da66f63155d37c4dd96b6472eaeecfc35843ccb56bf3d languageName: node linkType: hard -"@babel/eslint-parser@npm:^7.16.3, @babel/eslint-parser@npm:^7.19.1, @babel/eslint-parser@npm:~7.19.1": - version: 7.19.1 - resolution: "@babel/eslint-parser@npm:7.19.1" +"@babel/eslint-parser@npm:^7.16.3, @babel/eslint-parser@npm:~7.21.3": + version: 7.21.3 + resolution: "@babel/eslint-parser@npm:7.21.3" dependencies: "@nicolo-ribaudo/eslint-scope-5-internals": 5.1.1-v1 eslint-visitor-keys: ^2.1.0 @@ -108,18 +108,19 @@ __metadata: peerDependencies: "@babel/core": ">=7.11.0" eslint: ^7.5.0 || ^8.0.0 - checksum: 6d5360f62f25ed097250657deb1bc4c4f51a5f5f2fe456e98cda13727753fdf7a11a109b4cfa03ef0dd6ced3beaeb703b76193c1141e29434d1f91f1bac0517d + checksum: cc44a26a518c62ca93cdbee4ec4fa195c5a69b4f85d696c9df572b1ada99446ebdf3caef58a124f401a798279a765f858c88292bc7a8fc0485c34e178b1a9e82 languageName: node linkType: hard -"@babel/generator@npm:^7.12.11, @babel/generator@npm:^7.12.5, @babel/generator@npm:^7.19.6, @babel/generator@npm:^7.20.0, @babel/generator@npm:^7.7.2": - version: 7.20.0 - resolution: "@babel/generator@npm:7.20.0" +"@babel/generator@npm:^7.12.11, @babel/generator@npm:^7.12.5, @babel/generator@npm:^7.21.4, @babel/generator@npm:^7.7.2": + version: 7.21.4 + resolution: "@babel/generator@npm:7.21.4" dependencies: - "@babel/types": ^7.20.0 + "@babel/types": ^7.21.4 "@jridgewell/gen-mapping": ^0.3.2 + "@jridgewell/trace-mapping": ^0.3.17 jsesc: ^2.5.1 - checksum: df2fef0ac305cf031013e311d4582b15b5c297fd538bec71e6cae3b689189ac4be6055482487b06da1be2f007b8985d5162a84e14e43a20435b8c89551910509 + checksum: 9ffbb526a53bb8469b5402f7b5feac93809b09b2a9f82fcbfcdc5916268a65dae746a1f2479e03ba4fb0776facd7c892191f63baa61ab69b2cfdb24f7b92424d languageName: node linkType: hard @@ -142,46 +143,48 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.13.0, @babel/helper-compilation-targets@npm:^7.17.7, @babel/helper-compilation-targets@npm:^7.18.9, @babel/helper-compilation-targets@npm:^7.19.0, @babel/helper-compilation-targets@npm:^7.19.3": - version: 7.20.0 - resolution: "@babel/helper-compilation-targets@npm:7.20.0" +"@babel/helper-compilation-targets@npm:^7.13.0, @babel/helper-compilation-targets@npm:^7.17.7, @babel/helper-compilation-targets@npm:^7.18.9, @babel/helper-compilation-targets@npm:^7.20.7, @babel/helper-compilation-targets@npm:^7.21.4": + version: 7.21.4 + resolution: "@babel/helper-compilation-targets@npm:7.21.4" dependencies: - "@babel/compat-data": ^7.20.0 - "@babel/helper-validator-option": ^7.18.6 + "@babel/compat-data": ^7.21.4 + "@babel/helper-validator-option": ^7.21.0 browserslist: ^4.21.3 + lru-cache: ^5.1.1 semver: ^6.3.0 peerDependencies: "@babel/core": ^7.0.0 - checksum: bc183f2109648849c8fde0b3c5cf08adf2f7ad6dc617b546fd20f34c8ef574ee5ee293c8d1bd0ed0221212e8f5907cdc2c42097870f1dcc769a654107d82c95b + checksum: bf9c7d3e7e6adff9222c05d898724cd4ee91d7eb9d52222c7ad2a22955620c2872cc2d9bdf0e047df8efdb79f4e3af2a06b53f509286145feccc4d10ddc318be languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/helper-create-class-features-plugin@npm:7.18.9" +"@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.18.9, @babel/helper-create-class-features-plugin@npm:^7.21.0": + version: 7.21.4 + resolution: "@babel/helper-create-class-features-plugin@npm:7.21.4" dependencies: "@babel/helper-annotate-as-pure": ^7.18.6 "@babel/helper-environment-visitor": ^7.18.9 - "@babel/helper-function-name": ^7.18.9 - "@babel/helper-member-expression-to-functions": ^7.18.9 + "@babel/helper-function-name": ^7.21.0 + "@babel/helper-member-expression-to-functions": ^7.21.0 "@babel/helper-optimise-call-expression": ^7.18.6 - "@babel/helper-replace-supers": ^7.18.9 + "@babel/helper-replace-supers": ^7.20.7 + "@babel/helper-skip-transparent-expression-wrappers": ^7.20.0 "@babel/helper-split-export-declaration": ^7.18.6 peerDependencies: "@babel/core": ^7.0.0 - checksum: 020dba79b92ee9a98520dad81dddb47d75b34b7b4392672cbefc59db6f5e89a96c5eb95bb1cc46b2fddf913ef63dfe6d17168f56b059af5c6965bb37b6ce1d82 + checksum: 9123ca80a4894aafdb1f0bc08e44f6be7b12ed1fbbe99c501b484f9b1a17ff296b6c90c18c222047d53c276f07f17b4de857946fa9d0aa207023b03e4cc716f2 languageName: node linkType: hard -"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.19.0": - version: 7.19.0 - resolution: "@babel/helper-create-regexp-features-plugin@npm:7.19.0" +"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.20.5": + version: 7.21.4 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.21.4" dependencies: "@babel/helper-annotate-as-pure": ^7.18.6 - regexpu-core: ^5.1.0 + regexpu-core: ^5.3.1 peerDependencies: "@babel/core": ^7.0.0 - checksum: 811cc90afe9fc25a74ed37fc0c1361a4a91b0b940235dd3958e3f03b366d40a903b40fc93b51bcb93be774aba573219f8f215664bea1d1301f58797ca6854f3f + checksum: 78334865db2cd1d64d103bd0d96dee2818b0387d10aa973c084e245e829df32652bca530803e397b7158af4c02b9b21d5a9601c29bdfbb8d54a3d4ad894e067b languageName: node linkType: hard @@ -235,13 +238,13 @@ __metadata: languageName: node linkType: hard -"@babel/helper-function-name@npm:^7.18.9, @babel/helper-function-name@npm:^7.19.0": - version: 7.19.0 - resolution: "@babel/helper-function-name@npm:7.19.0" +"@babel/helper-function-name@npm:^7.18.9, @babel/helper-function-name@npm:^7.21.0": + version: 7.21.0 + resolution: "@babel/helper-function-name@npm:7.21.0" dependencies: - "@babel/template": ^7.18.10 - "@babel/types": ^7.19.0 - checksum: eac1f5db428ba546270c2b8d750c24eb528b8fcfe50c81de2e0bdebf0e20f24bec688d4331533b782e4a907fad435244621ca2193cfcf80a86731299840e0f6e + "@babel/template": ^7.20.7 + "@babel/types": ^7.21.0 + checksum: d63e63c3e0e3e8b3138fa47b0cd321148a300ef12b8ee951196994dcd2a492cc708aeda94c2c53759a5c9177fffaac0fd8778791286746f72a000976968daf4e languageName: node linkType: hard @@ -254,37 +257,37 @@ __metadata: languageName: node linkType: hard -"@babel/helper-member-expression-to-functions@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/helper-member-expression-to-functions@npm:7.18.9" +"@babel/helper-member-expression-to-functions@npm:^7.20.7, @babel/helper-member-expression-to-functions@npm:^7.21.0": + version: 7.21.0 + resolution: "@babel/helper-member-expression-to-functions@npm:7.21.0" dependencies: - "@babel/types": ^7.18.9 - checksum: fcf8184e3b55051c4286b2cbedf0eccc781d0f3c9b5cbaba582eca19bf0e8d87806cdb7efc8554fcb969ceaf2b187d5ea748d40022d06ec7739fbb18c1b19a7a + "@babel/types": ^7.21.0 + checksum: 49cbb865098195fe82ba22da3a8fe630cde30dcd8ebf8ad5f9a24a2b685150c6711419879cf9d99b94dad24cff9244d8c2a890d3d7ec75502cd01fe58cff5b5d languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.10.4, @babel/helper-module-imports@npm:^7.12.13, @babel/helper-module-imports@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-module-imports@npm:7.18.6" +"@babel/helper-module-imports@npm:^7.10.4, @babel/helper-module-imports@npm:^7.12.13, @babel/helper-module-imports@npm:^7.18.6, @babel/helper-module-imports@npm:^7.21.4": + version: 7.21.4 + resolution: "@babel/helper-module-imports@npm:7.21.4" dependencies: - "@babel/types": ^7.18.6 - checksum: f393f8a3b3304b1b7a288a38c10989de754f01d29caf62ce7c4e5835daf0a27b81f3ac687d9d2780d39685aae7b55267324b512150e7b2be967b0c493b6a1def + "@babel/types": ^7.21.4 + checksum: bd330a2edaafeb281fbcd9357652f8d2666502567c0aad71db926e8499c773c9ea9c10dfaae30122452940326d90c8caff5c649ed8e1bf15b23f858758d3abc6 languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.12.1, @babel/helper-module-transforms@npm:^7.18.6, @babel/helper-module-transforms@npm:^7.19.6": - version: 7.19.6 - resolution: "@babel/helper-module-transforms@npm:7.19.6" +"@babel/helper-module-transforms@npm:^7.12.1, @babel/helper-module-transforms@npm:^7.18.6, @babel/helper-module-transforms@npm:^7.20.11, @babel/helper-module-transforms@npm:^7.21.2": + version: 7.21.2 + resolution: "@babel/helper-module-transforms@npm:7.21.2" dependencies: "@babel/helper-environment-visitor": ^7.18.9 "@babel/helper-module-imports": ^7.18.6 - "@babel/helper-simple-access": ^7.19.4 + "@babel/helper-simple-access": ^7.20.2 "@babel/helper-split-export-declaration": ^7.18.6 "@babel/helper-validator-identifier": ^7.19.1 - "@babel/template": ^7.18.10 - "@babel/traverse": ^7.19.6 - "@babel/types": ^7.19.4 - checksum: c28692b37d4b5abacc775bcab52a74f44a493f38c58cb72b56a6c6d67a97485dd8aff6f26905abd1a924d3261a171d0214a9fb76f48d8598f1e35b8b29284792 + "@babel/template": ^7.20.7 + "@babel/traverse": ^7.21.2 + "@babel/types": ^7.21.2 + checksum: 8a1c129a4f90bdf97d8b6e7861732c9580f48f877aaaafbc376ce2482febebcb8daaa1de8bc91676d12886487603f8c62a44f9e90ee76d6cac7f9225b26a49e1 languageName: node linkType: hard @@ -304,14 +307,14 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.13.0, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.16.7, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.18.9, @babel/helper-plugin-utils@npm:^7.19.0, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": - version: 7.19.0 - resolution: "@babel/helper-plugin-utils@npm:7.19.0" - checksum: eedc996c633c8c207921c26ec2989eae0976336ecd9b9f1ac526498f52b5d136f7cd03c32b6fdf8d46a426f907c142de28592f383c42e5fba1e904cbffa05345 +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.13.0, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.16.7, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.18.9, @babel/helper-plugin-utils@npm:^7.19.0, @babel/helper-plugin-utils@npm:^7.20.2, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": + version: 7.20.2 + resolution: "@babel/helper-plugin-utils@npm:7.20.2" + checksum: f6cae53b7fdb1bf3abd50fa61b10b4470985b400cc794d92635da1e7077bb19729f626adc0741b69403d9b6e411cddddb9c0157a709cc7c4eeb41e663be5d74b languageName: node linkType: hard -"@babel/helper-remap-async-to-generator@npm:^7.18.6, @babel/helper-remap-async-to-generator@npm:^7.18.9": +"@babel/helper-remap-async-to-generator@npm:^7.18.9": version: 7.18.9 resolution: "@babel/helper-remap-async-to-generator@npm:7.18.9" dependencies: @@ -325,34 +328,35 @@ __metadata: languageName: node linkType: hard -"@babel/helper-replace-supers@npm:^7.18.6, @babel/helper-replace-supers@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/helper-replace-supers@npm:7.18.9" +"@babel/helper-replace-supers@npm:^7.18.6, @babel/helper-replace-supers@npm:^7.18.9, @babel/helper-replace-supers@npm:^7.20.7": + version: 7.20.7 + resolution: "@babel/helper-replace-supers@npm:7.20.7" dependencies: "@babel/helper-environment-visitor": ^7.18.9 - "@babel/helper-member-expression-to-functions": ^7.18.9 + "@babel/helper-member-expression-to-functions": ^7.20.7 "@babel/helper-optimise-call-expression": ^7.18.6 - "@babel/traverse": ^7.18.9 - "@babel/types": ^7.18.9 - checksum: 2de8b29cc4bfa4e241da2de16abd5571709f6eb394206dc16e3a7816976d1691635dd4bc930881e9d798f44b48a5f1849dc7f51a62946f3e8270452be1ec5352 + "@babel/template": ^7.20.7 + "@babel/traverse": ^7.20.7 + "@babel/types": ^7.20.7 + checksum: b8e0087c9b0c1446e3c6f3f72b73b7e03559c6b570e2cfbe62c738676d9ebd8c369a708cf1a564ef88113b4330750a50232ee1131d303d478b7a5e65e46fbc7c languageName: node linkType: hard -"@babel/helper-simple-access@npm:^7.18.6, @babel/helper-simple-access@npm:^7.19.4": - version: 7.19.4 - resolution: "@babel/helper-simple-access@npm:7.19.4" +"@babel/helper-simple-access@npm:^7.20.2": + version: 7.20.2 + resolution: "@babel/helper-simple-access@npm:7.20.2" dependencies: - "@babel/types": ^7.19.4 - checksum: 964cb1ec36b69aabbb02f8d5ee1d680ebbb628611a6740958d9b05107ab16c0492044e430618ae42b1f8ea73e4e1bafe3750e8ebc959d6f3277d9cfbe1a94880 + "@babel/types": ^7.20.2 + checksum: ad1e96ee2e5f654ffee2369a586e5e8d2722bf2d8b028a121b4c33ebae47253f64d420157b9f0a8927aea3a9e0f18c0103e74fdd531815cf3650a0a4adca11a1 languageName: node linkType: hard -"@babel/helper-skip-transparent-expression-wrappers@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.18.9" +"@babel/helper-skip-transparent-expression-wrappers@npm:^7.20.0": + version: 7.20.0 + resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.20.0" dependencies: - "@babel/types": ^7.18.9 - checksum: 6e93ccd10248293082606a4b3e30eed32c6f796d378f6b662796c88f462f348aa368aadeb48eb410cfcc8250db93b2d6627c2e55662530f08fc25397e588d68a + "@babel/types": ^7.20.0 + checksum: 34da8c832d1c8a546e45d5c1d59755459ffe43629436707079989599b91e8c19e50e73af7a4bd09c95402d389266731b0d9c5f69e372d8ebd3a709c05c80d7dd languageName: node linkType: hard @@ -379,10 +383,10 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/helper-validator-option@npm:7.18.6" - checksum: f9cc6eb7cc5d759c5abf006402180f8d5e4251e9198197428a97e05d65eb2f8ae5a0ce73b1dfd2d35af41d0eb780627a64edf98a4e71f064eeeacef8de58f2cf +"@babel/helper-validator-option@npm:^7.18.6, @babel/helper-validator-option@npm:^7.21.0": + version: 7.21.0 + resolution: "@babel/helper-validator-option@npm:7.21.0" + checksum: 8ece4c78ffa5461fd8ab6b6e57cc51afad59df08192ed5d84b475af4a7193fc1cb794b59e3e7be64f3cdc4df7ac78bf3dbb20c129d7757ae078e6279ff8c2f07 languageName: node linkType: hard @@ -398,14 +402,14 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.12.5, @babel/helpers@npm:^7.19.4": - version: 7.20.0 - resolution: "@babel/helpers@npm:7.20.0" +"@babel/helpers@npm:^7.12.5, @babel/helpers@npm:^7.21.0": + version: 7.21.0 + resolution: "@babel/helpers@npm:7.21.0" dependencies: - "@babel/template": ^7.18.10 - "@babel/traverse": ^7.20.0 - "@babel/types": ^7.20.0 - checksum: a68f271474eabc06d64db3d22f435068c3451ba55828f22b72db0e392dff911a6813de3c7bb783e6e4756fd97f8910904d6d647de92a3dc3bfae14688a1a907a + "@babel/template": ^7.20.7 + "@babel/traverse": ^7.21.0 + "@babel/types": ^7.21.0 + checksum: 9370dad2bb665c551869a08ac87c8bdafad53dbcdce1f5c5d498f51811456a3c005d9857562715151a0f00b2e912ac8d89f56574f837b5689f5f5072221cdf54 languageName: node linkType: hard @@ -420,12 +424,12 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.12.11, @babel/parser@npm:^7.12.7, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.18.10, @babel/parser@npm:^7.19.6, @babel/parser@npm:^7.20.0": - version: 7.20.0 - resolution: "@babel/parser@npm:7.20.0" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.12.11, @babel/parser@npm:^7.12.7, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.21.4": + version: 7.21.4 + resolution: "@babel/parser@npm:7.21.4" bin: parser: ./bin/babel-parser.js - checksum: d54d68e45ff1b9a0c50a3f79d9031f482eb58f18928525949dc20da5b1658ee79167e756129371fd75d3e8fc7e218ab707727145a68958636be9672c7b71768e + checksum: de610ecd1bff331766d0c058023ca11a4f242bfafefc42caf926becccfb6756637d167c001987ca830dd4b34b93c629a4cef63f8c8c864a8564cdfde1989ac77 languageName: node linkType: hard @@ -440,30 +444,30 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.18.9" +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.20.7": + version: 7.20.7 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.20.7" dependencies: - "@babel/helper-plugin-utils": ^7.18.9 - "@babel/helper-skip-transparent-expression-wrappers": ^7.18.9 - "@babel/plugin-proposal-optional-chaining": ^7.18.9 + "@babel/helper-plugin-utils": ^7.20.2 + "@babel/helper-skip-transparent-expression-wrappers": ^7.20.0 + "@babel/plugin-proposal-optional-chaining": ^7.20.7 peerDependencies: "@babel/core": ^7.13.0 - checksum: 93abb5cb179a13db171bfc2cdf79489598f43c50cc174f97a2b7bb1d44d24ade7109665a20cf4e317ad6c1c730f036f06478f7c7e789b4240be1abdb60d6452f + checksum: d610f532210bee5342f5b44a12395ccc6d904e675a297189bc1e401cc185beec09873da523466d7fec34ae1574f7a384235cba1ccc9fe7b89ba094167897c845 languageName: node linkType: hard -"@babel/plugin-proposal-async-generator-functions@npm:^7.19.1": - version: 7.19.1 - resolution: "@babel/plugin-proposal-async-generator-functions@npm:7.19.1" +"@babel/plugin-proposal-async-generator-functions@npm:^7.20.7": + version: 7.20.7 + resolution: "@babel/plugin-proposal-async-generator-functions@npm:7.20.7" dependencies: "@babel/helper-environment-visitor": ^7.18.9 - "@babel/helper-plugin-utils": ^7.19.0 + "@babel/helper-plugin-utils": ^7.20.2 "@babel/helper-remap-async-to-generator": ^7.18.9 "@babel/plugin-syntax-async-generators": ^7.8.4 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: f101555b00aee6ee0107c9e40d872ad646bbd3094abdbeda56d17b107df69a0cb49e5d02dcf5f9d8753e25564e798d08429f12d811aaa1b307b6a725c0b8159c + checksum: 111109ee118c9e69982f08d5e119eab04190b36a0f40e22e873802d941956eee66d2aa5a15f5321e51e3f9aa70a91136451b987fe15185ef8cc547ac88937723 languageName: node linkType: hard @@ -479,16 +483,16 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-class-static-block@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-class-static-block@npm:7.18.6" +"@babel/plugin-proposal-class-static-block@npm:^7.21.0": + version: 7.21.0 + resolution: "@babel/plugin-proposal-class-static-block@npm:7.21.0" dependencies: - "@babel/helper-create-class-features-plugin": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-create-class-features-plugin": ^7.21.0 + "@babel/helper-plugin-utils": ^7.20.2 "@babel/plugin-syntax-class-static-block": ^7.14.5 peerDependencies: "@babel/core": ^7.12.0 - checksum: b8d7ae99ed5ad784f39e7820e3ac03841f91d6ed60ab4a98c61d6112253da36013e12807bae4ffed0ef3cb318e47debac112ed614e03b403fb8b075b09a828ee + checksum: 236c0ad089e7a7acab776cc1d355330193314bfcd62e94e78f2df35817c6144d7e0e0368976778afd6b7c13e70b5068fa84d7abbf967d4f182e60d03f9ef802b languageName: node linkType: hard @@ -555,15 +559,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-logical-assignment-operators@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-proposal-logical-assignment-operators@npm:7.18.9" +"@babel/plugin-proposal-logical-assignment-operators@npm:^7.20.7": + version: 7.20.7 + resolution: "@babel/plugin-proposal-logical-assignment-operators@npm:7.20.7" dependencies: - "@babel/helper-plugin-utils": ^7.18.9 + "@babel/helper-plugin-utils": ^7.20.2 "@babel/plugin-syntax-logical-assignment-operators": ^7.10.4 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: dd87fa4a48c6408c5e85dbd6405a65cc8fe909e3090030df46df90df64cdf3e74007381a58ed87608778ee597eff7395d215274009bb3f5d8964b2db5557754f + checksum: cdd7b8136cc4db3f47714d5266f9e7b592a2ac5a94a5878787ce08890e97c8ab1ca8e94b27bfeba7b0f2b1549a026d9fc414ca2196de603df36fb32633bbdc19 languageName: node linkType: hard @@ -604,18 +608,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-object-rest-spread@npm:^7.12.1, @babel/plugin-proposal-object-rest-spread@npm:^7.19.4": - version: 7.19.4 - resolution: "@babel/plugin-proposal-object-rest-spread@npm:7.19.4" +"@babel/plugin-proposal-object-rest-spread@npm:^7.12.1, @babel/plugin-proposal-object-rest-spread@npm:^7.20.7": + version: 7.20.7 + resolution: "@babel/plugin-proposal-object-rest-spread@npm:7.20.7" dependencies: - "@babel/compat-data": ^7.19.4 - "@babel/helper-compilation-targets": ^7.19.3 - "@babel/helper-plugin-utils": ^7.19.0 + "@babel/compat-data": ^7.20.5 + "@babel/helper-compilation-targets": ^7.20.7 + "@babel/helper-plugin-utils": ^7.20.2 "@babel/plugin-syntax-object-rest-spread": ^7.8.3 - "@babel/plugin-transform-parameters": ^7.18.8 + "@babel/plugin-transform-parameters": ^7.20.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 90a2a59da305e6c8c83831e16079193df33d727a77a90972e286af2c8c0295fddb91b0978b88f16f63080d08a82b08ce3ee82a88b0488b3c51decc73c1d35786 + checksum: 1329db17009964bc644484c660eab717cb3ca63ac0ab0f67c651a028d1bc2ead51dc4064caea283e46994f1b7221670a35cbc0b4beb6273f55e915494b5aa0b2 languageName: node linkType: hard @@ -631,16 +635,16 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-optional-chaining@npm:^7.12.7, @babel/plugin-proposal-optional-chaining@npm:^7.16.0, @babel/plugin-proposal-optional-chaining@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-proposal-optional-chaining@npm:7.18.9" +"@babel/plugin-proposal-optional-chaining@npm:^7.12.7, @babel/plugin-proposal-optional-chaining@npm:^7.16.0, @babel/plugin-proposal-optional-chaining@npm:^7.20.7, @babel/plugin-proposal-optional-chaining@npm:^7.21.0": + version: 7.21.0 + resolution: "@babel/plugin-proposal-optional-chaining@npm:7.21.0" dependencies: - "@babel/helper-plugin-utils": ^7.18.9 - "@babel/helper-skip-transparent-expression-wrappers": ^7.18.9 + "@babel/helper-plugin-utils": ^7.20.2 + "@babel/helper-skip-transparent-expression-wrappers": ^7.20.0 "@babel/plugin-syntax-optional-chaining": ^7.8.3 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: f2db40e26172f07c50b635cb61e1f36165de3ba868fcf608d967642f0d044b7c6beb0e7ecf17cbd421144b99e1eae7ad6031ded92925343bb0ed1d08707b514f + checksum: 11c5449e01b18bb8881e8e005a577fa7be2fe5688e2382c8822d51f8f7005342a301a46af7b273b1f5645f9a7b894c428eee8526342038a275ef6ba4c8d8d746 languageName: node linkType: hard @@ -656,17 +660,17 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-private-property-in-object@npm:^7.12.1, @babel/plugin-proposal-private-property-in-object@npm:^7.16.0, @babel/plugin-proposal-private-property-in-object@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.18.6" +"@babel/plugin-proposal-private-property-in-object@npm:^7.12.1, @babel/plugin-proposal-private-property-in-object@npm:^7.16.0, @babel/plugin-proposal-private-property-in-object@npm:^7.21.0": + version: 7.21.0 + resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.21.0" dependencies: "@babel/helper-annotate-as-pure": ^7.18.6 - "@babel/helper-create-class-features-plugin": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-create-class-features-plugin": ^7.21.0 + "@babel/helper-plugin-utils": ^7.20.2 "@babel/plugin-syntax-private-property-in-object": ^7.14.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: c8e56a972930730345f39f2384916fd8e711b3f4b4eae2ca9740e99958980118120d5cc9b6ac150f0965a5a35f825910e2c3013d90be3e9993ab6111df444569 + checksum: add881a6a836635c41d2710551fdf777e2c07c0b691bf2baacc5d658dd64107479df1038680d6e67c468bfc6f36fb8920025d6bac2a1df0a81b867537d40ae78 languageName: node linkType: hard @@ -781,14 +785,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-import-assertions@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-syntax-import-assertions@npm:7.18.6" +"@babel/plugin-syntax-import-assertions@npm:^7.20.0": + version: 7.20.0 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.20.0" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.19.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 54918a05375325ba0c60bc81abfb261e6f118bed2de94e4c17dca9a2006fc25e13b1a8b5504b9a881238ea394fd2f098f60b2eb3a392585d6348874565445e7b + checksum: 6a86220e0aae40164cd3ffaf80e7c076a1be02a8f3480455dddbae05fda8140f429290027604df7a11b3f3f124866e8a6d69dbfa1dda61ee7377b920ad144d5b languageName: node linkType: hard @@ -825,14 +829,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-jsx@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-syntax-jsx@npm:7.18.6" +"@babel/plugin-syntax-jsx@npm:^7.18.6, @babel/plugin-syntax-jsx@npm:^7.21.4, @babel/plugin-syntax-jsx@npm:^7.7.2": + version: 7.21.4 + resolution: "@babel/plugin-syntax-jsx@npm:7.21.4" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.20.2 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 6d37ea972970195f1ffe1a54745ce2ae456e0ac6145fae9aa1480f297248b262ea6ebb93010eddb86ebfacb94f57c05a1fc5d232b9a67325b09060299d515c67 + checksum: bb7309402a1d4e155f32aa0cf216e1fa8324d6c4cfd248b03280028a015a10e46b6efd6565f515f8913918a3602b39255999c06046f7d4b8a5106be2165d724a languageName: node linkType: hard @@ -924,38 +928,38 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-syntax-typescript@npm:^7.18.6, @babel/plugin-syntax-typescript@npm:^7.7.2": - version: 7.18.6 - resolution: "@babel/plugin-syntax-typescript@npm:7.18.6" +"@babel/plugin-syntax-typescript@npm:^7.20.0, @babel/plugin-syntax-typescript@npm:^7.7.2": + version: 7.21.4 + resolution: "@babel/plugin-syntax-typescript@npm:7.21.4" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.20.2 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 2cde73725ec51118ebf410bf02d78781c03fa4d3185993fcc9d253b97443381b621c44810084c5dd68b92eb8bdfae0e5b163e91b32bebbb33852383d1815c05d + checksum: a59ce2477b7ae8c8945dc37dda292fef9ce46a6507b3d76b03ce7f3a6c9451a6567438b20a78ebcb3955d04095fd1ccd767075a863f79fcc30aa34dcfa441fe0 languageName: node linkType: hard -"@babel/plugin-transform-arrow-functions@npm:^7.12.1, @babel/plugin-transform-arrow-functions@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-arrow-functions@npm:7.18.6" +"@babel/plugin-transform-arrow-functions@npm:^7.12.1, @babel/plugin-transform-arrow-functions@npm:^7.20.7": + version: 7.20.7 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.20.7" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.20.2 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 900f5c695755062b91eec74da6f9092f40b8fada099058b92576f1e23c55e9813ec437051893a9b3c05cefe39e8ac06303d4a91b384e1c03dd8dc1581ea11602 + checksum: b43cabe3790c2de7710abe32df9a30005eddb2050dadd5d122c6872f679e5710e410f1b90c8f99a2aff7b614cccfecf30e7fd310236686f60d3ed43fd80b9847 languageName: node linkType: hard -"@babel/plugin-transform-async-to-generator@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-async-to-generator@npm:7.18.6" +"@babel/plugin-transform-async-to-generator@npm:^7.20.7": + version: 7.20.7 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.20.7" dependencies: "@babel/helper-module-imports": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/helper-remap-async-to-generator": ^7.18.6 + "@babel/helper-plugin-utils": ^7.20.2 + "@babel/helper-remap-async-to-generator": ^7.18.9 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: c2cca47468cf1aeefdc7ec35d670e195c86cee4de28a1970648c46a88ce6bd1806ef0bab27251b9e7fb791bb28a64dcd543770efd899f28ee5f7854e64e873d3 + checksum: fe9ee8a5471b4317c1b9ea92410ace8126b52a600d7cfbfe1920dcac6fb0fad647d2e08beb4fd03c630eb54430e6c72db11e283e3eddc49615c68abd39430904 languageName: node linkType: hard @@ -970,55 +974,56 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.12.12, @babel/plugin-transform-block-scoping@npm:^7.19.4": - version: 7.20.0 - resolution: "@babel/plugin-transform-block-scoping@npm:7.20.0" +"@babel/plugin-transform-block-scoping@npm:^7.12.12, @babel/plugin-transform-block-scoping@npm:^7.21.0": + version: 7.21.0 + resolution: "@babel/plugin-transform-block-scoping@npm:7.21.0" dependencies: - "@babel/helper-plugin-utils": ^7.19.0 + "@babel/helper-plugin-utils": ^7.20.2 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: ff5ba1a2c481047e3a1fd880e78a4942ad05c0ead1424e2db150fa4009b86707d66e945173abb14451ed5ca605a19620a2b9414d16407d296326ab26219ef511 + checksum: 15aacaadbecf96b53a750db1be4990b0d89c7f5bc3e1794b63b49fb219638c1fd25d452d15566d7e5ddf5b5f4e1a0a0055c35c1c7aee323c7b114bf49f66f4b0 languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.12.1, @babel/plugin-transform-classes@npm:^7.19.0": - version: 7.19.0 - resolution: "@babel/plugin-transform-classes@npm:7.19.0" +"@babel/plugin-transform-classes@npm:^7.12.1, @babel/plugin-transform-classes@npm:^7.21.0": + version: 7.21.0 + resolution: "@babel/plugin-transform-classes@npm:7.21.0" dependencies: "@babel/helper-annotate-as-pure": ^7.18.6 - "@babel/helper-compilation-targets": ^7.19.0 + "@babel/helper-compilation-targets": ^7.20.7 "@babel/helper-environment-visitor": ^7.18.9 - "@babel/helper-function-name": ^7.19.0 + "@babel/helper-function-name": ^7.21.0 "@babel/helper-optimise-call-expression": ^7.18.6 - "@babel/helper-plugin-utils": ^7.19.0 - "@babel/helper-replace-supers": ^7.18.9 + "@babel/helper-plugin-utils": ^7.20.2 + "@babel/helper-replace-supers": ^7.20.7 "@babel/helper-split-export-declaration": ^7.18.6 globals: ^11.1.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 5500953031fc3eae73f717c7b59ef406158a4a710d566a0f78a4944240bcf98f817f07cf1d6af0e749e21f0dfee29c36412b75d57b0a753c3ad823b70c596b79 + checksum: 088ae152074bd0e90f64659169255bfe50393e637ec8765cb2a518848b11b0299e66b91003728fd0a41563a6fdc6b8d548ece698a314fd5447f5489c22e466b7 languageName: node linkType: hard -"@babel/plugin-transform-computed-properties@npm:^7.18.9": - version: 7.18.9 - resolution: "@babel/plugin-transform-computed-properties@npm:7.18.9" +"@babel/plugin-transform-computed-properties@npm:^7.20.7": + version: 7.20.7 + resolution: "@babel/plugin-transform-computed-properties@npm:7.20.7" dependencies: - "@babel/helper-plugin-utils": ^7.18.9 + "@babel/helper-plugin-utils": ^7.20.2 + "@babel/template": ^7.20.7 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: a6bfbea207827d77592628973c0e8cc3319db636506bdc6e81e21582de2e767890e6975b382d0511e9ec3773b9f43691185df90832883bbf9251f688d27fbc1d + checksum: be70e54bda8b469146459f429e5f2bd415023b87b2d5af8b10e48f465ffb02847a3ed162ca60378c004b82db848e4d62e90010d41ded7e7176b6d8d1c2911139 languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.12.1, @babel/plugin-transform-destructuring@npm:^7.19.4": - version: 7.20.0 - resolution: "@babel/plugin-transform-destructuring@npm:7.20.0" +"@babel/plugin-transform-destructuring@npm:^7.12.1, @babel/plugin-transform-destructuring@npm:^7.21.3": + version: 7.21.3 + resolution: "@babel/plugin-transform-destructuring@npm:7.21.3" dependencies: - "@babel/helper-plugin-utils": ^7.19.0 + "@babel/helper-plugin-utils": ^7.20.2 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: ce43dfcc36254ac2aef386465942f46f9901cec5d14e8aef68ebced71d46fed7d9ec88046fe2e47a57a769a26cc20ec61c4c4f13efb733ad3a82edea52aa7bdf + checksum: 43ebbe0bfa20287e34427be7c2200ce096c20913775ea75268fb47fe0e55f9510800587e6052c42fe6dffa0daaad95dd465c3e312fd1ef9785648384c45417ac languageName: node linkType: hard @@ -1069,14 +1074,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-for-of@npm:^7.12.1, @babel/plugin-transform-for-of@npm:^7.18.8": - version: 7.18.8 - resolution: "@babel/plugin-transform-for-of@npm:7.18.8" +"@babel/plugin-transform-for-of@npm:^7.12.1, @babel/plugin-transform-for-of@npm:^7.21.0": + version: 7.21.0 + resolution: "@babel/plugin-transform-for-of@npm:7.21.0" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.20.2 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: ca64c623cf0c7a80ab6f07ebd3e6e4ade95e2ae806696f70b43eafe6394fa8ce21f2b1ffdd15df2067f7363d2ecfe26472a97c6c774403d2163fa05f50c98f17 + checksum: 2f3f86ca1fab2929fcda6a87e4303d5c635b5f96dc9a45fd4ca083308a3020c79ac33b9543eb4640ef2b79f3586a00ab2d002a7081adb9e9d7440dce30781034 languageName: node linkType: hard @@ -1115,44 +1120,42 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-amd@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-modules-amd@npm:7.18.6" +"@babel/plugin-transform-modules-amd@npm:^7.20.11": + version: 7.20.11 + resolution: "@babel/plugin-transform-modules-amd@npm:7.20.11" dependencies: - "@babel/helper-module-transforms": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - babel-plugin-dynamic-import-node: ^2.3.3 + "@babel/helper-module-transforms": ^7.20.11 + "@babel/helper-plugin-utils": ^7.20.2 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: f60c4c4e0eaec41e42c003cbab44305da7a8e05b2c9bdfc2b3fe0f9e1d7441c959ff5248aa03e350abe530e354028cbf3aa20bf07067b11510997dad8dd39be0 + checksum: 23665c1c20c8f11c89382b588fb9651c0756d130737a7625baeaadbd3b973bc5bfba1303bedffa8fb99db1e6d848afb01016e1df2b69b18303e946890c790001 languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.18.6" +"@babel/plugin-transform-modules-commonjs@npm:^7.21.2": + version: 7.21.2 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.21.2" dependencies: - "@babel/helper-module-transforms": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/helper-simple-access": ^7.18.6 - babel-plugin-dynamic-import-node: ^2.3.3 + "@babel/helper-module-transforms": ^7.21.2 + "@babel/helper-plugin-utils": ^7.20.2 + "@babel/helper-simple-access": ^7.20.2 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 7e356e3df8a6a8542cced7491ec5b1cc1093a88d216a59e63a5d2b9fe9d193cbea864f680a41429e41a4f9ecec930aa5b0b8f57e2b17b3b4d27923bb12ba5d14 + checksum: 65aa06e3e3792f39b99eb5f807034693ff0ecf80438580f7ae504f4c4448ef04147b1889ea5e6f60f3ad4a12ebbb57c6f1f979a249dadbd8d11fe22f4441918b languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.19.0": - version: 7.19.6 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.19.6" +"@babel/plugin-transform-modules-systemjs@npm:^7.20.11": + version: 7.20.11 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.20.11" dependencies: "@babel/helper-hoist-variables": ^7.18.6 - "@babel/helper-module-transforms": ^7.19.6 - "@babel/helper-plugin-utils": ^7.19.0 + "@babel/helper-module-transforms": ^7.20.11 + "@babel/helper-plugin-utils": ^7.20.2 "@babel/helper-validator-identifier": ^7.19.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 8526431cc81ea3eb232ad50862d0ed1cbb422b5251d14a8d6610d0ca0617f6e75f35179e98eb1235d0cccb980120350b9f112594e5646dd45378d41eaaf87342 + checksum: 4546c47587f88156d66c7eb7808e903cf4bb3f6ba6ac9bc8e3af2e29e92eb9f0b3f44d52043bfd24eb25fa7827fd7b6c8bfeac0cac7584e019b87e1ecbd0e673 languageName: node linkType: hard @@ -1168,15 +1171,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.19.1": - version: 7.19.1 - resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.19.1" +"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.20.5": + version: 7.20.5 + resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.20.5" dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.19.0 - "@babel/helper-plugin-utils": ^7.19.0 + "@babel/helper-create-regexp-features-plugin": ^7.20.5 + "@babel/helper-plugin-utils": ^7.20.2 peerDependencies: "@babel/core": ^7.0.0 - checksum: 8a40f5d04f2140c44fe890a5a3fd72abc2a88445443ac2bd92e1e85d9366d3eb8f1ebb7e2c89d2daeaf213d9b28cb65605502ac9b155936d48045eeda6053494 + checksum: 528c95fb1087e212f17e1c6456df041b28a83c772b9c93d2e407c9d03b72182b0d9d126770c1d6e0b23aab052599ceaf25ed6a2c0627f4249be34a83f6fae853 languageName: node linkType: hard @@ -1203,14 +1206,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.12.1, @babel/plugin-transform-parameters@npm:^7.18.8": - version: 7.18.8 - resolution: "@babel/plugin-transform-parameters@npm:7.18.8" +"@babel/plugin-transform-parameters@npm:^7.12.1, @babel/plugin-transform-parameters@npm:^7.20.7, @babel/plugin-transform-parameters@npm:^7.21.3": + version: 7.21.3 + resolution: "@babel/plugin-transform-parameters@npm:7.21.3" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 + "@babel/helper-plugin-utils": ^7.20.2 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 2b5863300da60face8a250d91da16294333bd5626e9721b13a3ba2078bd2a5a190e32c6e7a1323d5f547f579aeb2804ff49a62a55fcad2b1d099e55a55b788ea + checksum: c92128d7b1fcf54e2cab186c196bbbf55a9a6de11a83328dc2602649c9dc6d16ef73712beecd776cd49bfdc624b5f56740f4a53568d3deb9505ec666bc869da3 languageName: node linkType: hard @@ -1285,15 +1288,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-regenerator@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-transform-regenerator@npm:7.18.6" +"@babel/plugin-transform-regenerator@npm:^7.20.5": + version: 7.20.5 + resolution: "@babel/plugin-transform-regenerator@npm:7.20.5" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - regenerator-transform: ^0.15.0 + "@babel/helper-plugin-utils": ^7.20.2 + regenerator-transform: ^0.15.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 60bd482cb0343c714f85c3e19a13b3b5fa05ee336c079974091c0b35e263307f4e661f4555dff90707a87d5efe19b1d51835db44455405444ac1813e268ad750 + checksum: 13164861e71fb23d84c6270ef5330b03c54d5d661c2c7468f28e21c4f8598558ca0c8c3cb1d996219352946e849d270a61372bc93c8fbe9676e78e3ffd0dea07 languageName: node linkType: hard @@ -1308,19 +1311,19 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-runtime@npm:^7.16.4, @babel/plugin-transform-runtime@npm:~7.19.6": - version: 7.19.6 - resolution: "@babel/plugin-transform-runtime@npm:7.19.6" +"@babel/plugin-transform-runtime@npm:^7.16.4, @babel/plugin-transform-runtime@npm:~7.21.4": + version: 7.21.4 + resolution: "@babel/plugin-transform-runtime@npm:7.21.4" dependencies: - "@babel/helper-module-imports": ^7.18.6 - "@babel/helper-plugin-utils": ^7.19.0 + "@babel/helper-module-imports": ^7.21.4 + "@babel/helper-plugin-utils": ^7.20.2 babel-plugin-polyfill-corejs2: ^0.3.3 babel-plugin-polyfill-corejs3: ^0.6.0 babel-plugin-polyfill-regenerator: ^0.4.1 semver: ^6.3.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: ef93efbcbb00dcf4da6dcc55bda698a2a57fca3fb05a6a13e932ecfdb7c1c5d2f0b5b245c1c4faca0318853937caba0d82442f58b7653249f64275d08052fbd8 + checksum: 7e2e6b0d6f9762fde58738829e4d3b5e13dc88ccc1463e4eee83c8d8f50238eeb8e3699923f5ad4d7edf597515f74d67fbb14eb330225075fc7733b547e22145 languageName: node linkType: hard @@ -1335,15 +1338,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-spread@npm:^7.12.1, @babel/plugin-transform-spread@npm:^7.19.0": - version: 7.19.0 - resolution: "@babel/plugin-transform-spread@npm:7.19.0" +"@babel/plugin-transform-spread@npm:^7.12.1, @babel/plugin-transform-spread@npm:^7.20.7": + version: 7.20.7 + resolution: "@babel/plugin-transform-spread@npm:7.20.7" dependencies: - "@babel/helper-plugin-utils": ^7.19.0 - "@babel/helper-skip-transparent-expression-wrappers": ^7.18.9 + "@babel/helper-plugin-utils": ^7.20.2 + "@babel/helper-skip-transparent-expression-wrappers": ^7.20.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: e73a4deb095999185e70b524d0ff4e35df50fcda58299e700a6149a15bbc1a9b369ef1cef384e15a54b3c3ce316cc0f054dbf249dcd0d1ca59f4281dd4df9718 + checksum: 8ea698a12da15718aac7489d4cde10beb8a3eea1f66167d11ab1e625033641e8b328157fd1a0b55dd6531933a160c01fc2e2e61132a385cece05f26429fd0cc2 languageName: node linkType: hard @@ -1380,16 +1383,17 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-typescript@npm:^7.18.6": - version: 7.18.8 - resolution: "@babel/plugin-transform-typescript@npm:7.18.8" +"@babel/plugin-transform-typescript@npm:^7.21.3": + version: 7.21.3 + resolution: "@babel/plugin-transform-typescript@npm:7.21.3" dependencies: - "@babel/helper-create-class-features-plugin": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/plugin-syntax-typescript": ^7.18.6 + "@babel/helper-annotate-as-pure": ^7.18.6 + "@babel/helper-create-class-features-plugin": ^7.21.0 + "@babel/helper-plugin-utils": ^7.20.2 + "@babel/plugin-syntax-typescript": ^7.20.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 627211f1658870274fcabf38a71bb08ae219e3ac672423083574fabe2c857f28d39243cb7279adada8468c912a7beebc0622770ed66885a1e33b84ccc8bfd7df + checksum: c16fd577bf43f633deb76fca2a8527d8ae25968c8efdf327c1955472c3e0257e62992473d1ad7f9ee95379ce2404699af405ea03346055adadd3478ad0ecd117 languageName: node linkType: hard @@ -1416,37 +1420,37 @@ __metadata: languageName: node linkType: hard -"@babel/preset-env@npm:^7.11.0, @babel/preset-env@npm:^7.12.1, @babel/preset-env@npm:^7.12.11, @babel/preset-env@npm:^7.16.4, @babel/preset-env@npm:~7.19.4": - version: 7.19.4 - resolution: "@babel/preset-env@npm:7.19.4" +"@babel/preset-env@npm:^7.11.0, @babel/preset-env@npm:^7.12.1, @babel/preset-env@npm:^7.12.11, @babel/preset-env@npm:^7.16.4, @babel/preset-env@npm:~7.21.4": + version: 7.21.4 + resolution: "@babel/preset-env@npm:7.21.4" dependencies: - "@babel/compat-data": ^7.19.4 - "@babel/helper-compilation-targets": ^7.19.3 - "@babel/helper-plugin-utils": ^7.19.0 - "@babel/helper-validator-option": ^7.18.6 + "@babel/compat-data": ^7.21.4 + "@babel/helper-compilation-targets": ^7.21.4 + "@babel/helper-plugin-utils": ^7.20.2 + "@babel/helper-validator-option": ^7.21.0 "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ^7.18.6 - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ^7.18.9 - "@babel/plugin-proposal-async-generator-functions": ^7.19.1 + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ^7.20.7 + "@babel/plugin-proposal-async-generator-functions": ^7.20.7 "@babel/plugin-proposal-class-properties": ^7.18.6 - "@babel/plugin-proposal-class-static-block": ^7.18.6 + "@babel/plugin-proposal-class-static-block": ^7.21.0 "@babel/plugin-proposal-dynamic-import": ^7.18.6 "@babel/plugin-proposal-export-namespace-from": ^7.18.9 "@babel/plugin-proposal-json-strings": ^7.18.6 - "@babel/plugin-proposal-logical-assignment-operators": ^7.18.9 + "@babel/plugin-proposal-logical-assignment-operators": ^7.20.7 "@babel/plugin-proposal-nullish-coalescing-operator": ^7.18.6 "@babel/plugin-proposal-numeric-separator": ^7.18.6 - "@babel/plugin-proposal-object-rest-spread": ^7.19.4 + "@babel/plugin-proposal-object-rest-spread": ^7.20.7 "@babel/plugin-proposal-optional-catch-binding": ^7.18.6 - "@babel/plugin-proposal-optional-chaining": ^7.18.9 + "@babel/plugin-proposal-optional-chaining": ^7.21.0 "@babel/plugin-proposal-private-methods": ^7.18.6 - "@babel/plugin-proposal-private-property-in-object": ^7.18.6 + "@babel/plugin-proposal-private-property-in-object": ^7.21.0 "@babel/plugin-proposal-unicode-property-regex": ^7.18.6 "@babel/plugin-syntax-async-generators": ^7.8.4 "@babel/plugin-syntax-class-properties": ^7.12.13 "@babel/plugin-syntax-class-static-block": ^7.14.5 "@babel/plugin-syntax-dynamic-import": ^7.8.3 "@babel/plugin-syntax-export-namespace-from": ^7.8.3 - "@babel/plugin-syntax-import-assertions": ^7.18.6 + "@babel/plugin-syntax-import-assertions": ^7.20.0 "@babel/plugin-syntax-json-strings": ^7.8.3 "@babel/plugin-syntax-logical-assignment-operators": ^7.10.4 "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3 @@ -1456,40 +1460,40 @@ __metadata: "@babel/plugin-syntax-optional-chaining": ^7.8.3 "@babel/plugin-syntax-private-property-in-object": ^7.14.5 "@babel/plugin-syntax-top-level-await": ^7.14.5 - "@babel/plugin-transform-arrow-functions": ^7.18.6 - "@babel/plugin-transform-async-to-generator": ^7.18.6 + "@babel/plugin-transform-arrow-functions": ^7.20.7 + "@babel/plugin-transform-async-to-generator": ^7.20.7 "@babel/plugin-transform-block-scoped-functions": ^7.18.6 - "@babel/plugin-transform-block-scoping": ^7.19.4 - "@babel/plugin-transform-classes": ^7.19.0 - "@babel/plugin-transform-computed-properties": ^7.18.9 - "@babel/plugin-transform-destructuring": ^7.19.4 + "@babel/plugin-transform-block-scoping": ^7.21.0 + "@babel/plugin-transform-classes": ^7.21.0 + "@babel/plugin-transform-computed-properties": ^7.20.7 + "@babel/plugin-transform-destructuring": ^7.21.3 "@babel/plugin-transform-dotall-regex": ^7.18.6 "@babel/plugin-transform-duplicate-keys": ^7.18.9 "@babel/plugin-transform-exponentiation-operator": ^7.18.6 - "@babel/plugin-transform-for-of": ^7.18.8 + "@babel/plugin-transform-for-of": ^7.21.0 "@babel/plugin-transform-function-name": ^7.18.9 "@babel/plugin-transform-literals": ^7.18.9 "@babel/plugin-transform-member-expression-literals": ^7.18.6 - "@babel/plugin-transform-modules-amd": ^7.18.6 - "@babel/plugin-transform-modules-commonjs": ^7.18.6 - "@babel/plugin-transform-modules-systemjs": ^7.19.0 + "@babel/plugin-transform-modules-amd": ^7.20.11 + "@babel/plugin-transform-modules-commonjs": ^7.21.2 + "@babel/plugin-transform-modules-systemjs": ^7.20.11 "@babel/plugin-transform-modules-umd": ^7.18.6 - "@babel/plugin-transform-named-capturing-groups-regex": ^7.19.1 + "@babel/plugin-transform-named-capturing-groups-regex": ^7.20.5 "@babel/plugin-transform-new-target": ^7.18.6 "@babel/plugin-transform-object-super": ^7.18.6 - "@babel/plugin-transform-parameters": ^7.18.8 + "@babel/plugin-transform-parameters": ^7.21.3 "@babel/plugin-transform-property-literals": ^7.18.6 - "@babel/plugin-transform-regenerator": ^7.18.6 + "@babel/plugin-transform-regenerator": ^7.20.5 "@babel/plugin-transform-reserved-words": ^7.18.6 "@babel/plugin-transform-shorthand-properties": ^7.18.6 - "@babel/plugin-transform-spread": ^7.19.0 + "@babel/plugin-transform-spread": ^7.20.7 "@babel/plugin-transform-sticky-regex": ^7.18.6 "@babel/plugin-transform-template-literals": ^7.18.9 "@babel/plugin-transform-typeof-symbol": ^7.18.9 "@babel/plugin-transform-unicode-escapes": ^7.18.10 "@babel/plugin-transform-unicode-regex": ^7.18.6 "@babel/preset-modules": ^0.1.5 - "@babel/types": ^7.19.4 + "@babel/types": ^7.21.4 babel-plugin-polyfill-corejs2: ^0.3.3 babel-plugin-polyfill-corejs3: ^0.6.0 babel-plugin-polyfill-regenerator: ^0.4.1 @@ -1497,7 +1501,7 @@ __metadata: semver: ^6.3.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: f12af25281f3c5e7df60fa1e79ad481ddd7f6a111d4c0fabcffdabf0eaed3a01b4f8c647ae5445ed1f58df70f52083ffd283e8919ade7afa73801a49c733d22c + checksum: 1e328674c4b39e985fa81e5a8eee9aaab353dea4ff1f28f454c5e27a6498c762e25d42e827f5bfc9d7acf6c9b8bc317b5283aa7c83d9fd03c1a89e5c08f334f9 languageName: node linkType: hard @@ -1544,16 +1548,18 @@ __metadata: languageName: node linkType: hard -"@babel/preset-typescript@npm:^7.12.7, @babel/preset-typescript@npm:^7.16.0, @babel/preset-typescript@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/preset-typescript@npm:7.18.6" +"@babel/preset-typescript@npm:^7.12.7, @babel/preset-typescript@npm:^7.16.0, @babel/preset-typescript@npm:~7.21.4": + version: 7.21.4 + resolution: "@babel/preset-typescript@npm:7.21.4" dependencies: - "@babel/helper-plugin-utils": ^7.18.6 - "@babel/helper-validator-option": ^7.18.6 - "@babel/plugin-transform-typescript": ^7.18.6 + "@babel/helper-plugin-utils": ^7.20.2 + "@babel/helper-validator-option": ^7.21.0 + "@babel/plugin-syntax-jsx": ^7.21.4 + "@babel/plugin-transform-modules-commonjs": ^7.21.2 + "@babel/plugin-transform-typescript": ^7.21.3 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 7fe0da5103eb72d3cf39cf3e138a794c8cdd19c0b38e3e101507eef519c46a87a0d6d0e8bc9e28a13ea2364001ebe7430b9d75758aab4c3c3a8db9a487b9dc7c + checksum: 83b2f2bf7be3a970acd212177525f58bbb1f2e042b675a47d021a675ae27cf00b6b6babfaf3ae5c980592c9ed1b0712e5197796b691905d25c99f9006478ea06 languageName: node linkType: hard @@ -1572,6 +1578,13 @@ __metadata: languageName: node linkType: hard +"@babel/regjsgen@npm:^0.8.0": + version: 0.8.0 + resolution: "@babel/regjsgen@npm:0.8.0" + checksum: 89c338fee774770e5a487382170711014d49a68eb281e74f2b5eac88f38300a4ad545516a7786a8dd5702e9cf009c94c2f582d200f077ac5decd74c56b973730 + languageName: node + linkType: hard + "@babel/runtime-corejs3@npm:^7.10.2": version: 7.18.9 resolution: "@babel/runtime-corejs3@npm:7.18.9" @@ -1609,43 +1622,43 @@ __metadata: languageName: node linkType: hard -"@babel/template@npm:^7.12.7, @babel/template@npm:^7.18.10, @babel/template@npm:^7.18.6, @babel/template@npm:^7.3.3": - version: 7.18.10 - resolution: "@babel/template@npm:7.18.10" +"@babel/template@npm:^7.12.7, @babel/template@npm:^7.18.6, @babel/template@npm:^7.20.7, @babel/template@npm:^7.3.3": + version: 7.20.7 + resolution: "@babel/template@npm:7.20.7" dependencies: "@babel/code-frame": ^7.18.6 - "@babel/parser": ^7.18.10 - "@babel/types": ^7.18.10 - checksum: 93a6aa094af5f355a72bd55f67fa1828a046c70e46f01b1606e6118fa1802b6df535ca06be83cc5a5e834022be95c7b714f0a268b5f20af984465a71e28f1473 + "@babel/parser": ^7.20.7 + "@babel/types": ^7.20.7 + checksum: 2eb1a0ab8d415078776bceb3473d07ab746e6bb4c2f6ca46ee70efb284d75c4a32bb0cd6f4f4946dec9711f9c0780e8e5d64b743208deac6f8e9858afadc349e languageName: node linkType: hard -"@babel/traverse@npm:^7.12.11, @babel/traverse@npm:^7.12.9, @babel/traverse@npm:^7.13.0, @babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.19.6, @babel/traverse@npm:^7.20.0, @babel/traverse@npm:^7.7.2": - version: 7.20.0 - resolution: "@babel/traverse@npm:7.20.0" +"@babel/traverse@npm:^7.12.11, @babel/traverse@npm:^7.12.9, @babel/traverse@npm:^7.13.0, @babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.20.7, @babel/traverse@npm:^7.21.0, @babel/traverse@npm:^7.21.2, @babel/traverse@npm:^7.21.4, @babel/traverse@npm:^7.7.2": + version: 7.21.4 + resolution: "@babel/traverse@npm:7.21.4" dependencies: - "@babel/code-frame": ^7.18.6 - "@babel/generator": ^7.20.0 + "@babel/code-frame": ^7.21.4 + "@babel/generator": ^7.21.4 "@babel/helper-environment-visitor": ^7.18.9 - "@babel/helper-function-name": ^7.19.0 + "@babel/helper-function-name": ^7.21.0 "@babel/helper-hoist-variables": ^7.18.6 "@babel/helper-split-export-declaration": ^7.18.6 - "@babel/parser": ^7.20.0 - "@babel/types": ^7.20.0 + "@babel/parser": ^7.21.4 + "@babel/types": ^7.21.4 debug: ^4.1.0 globals: ^11.1.0 - checksum: 19615ec2c3467f929dfa2ae98494961a2c7b333b6628e1c7643188d936abc167c41f5af541b692b1ca776a4d066291a7eb8b22f98aba3d496f362bae4c2082cd + checksum: f22f067c2d9b6497abf3d4e53ea71f3aa82a21f2ed434dd69b8c5767f11f2a4c24c8d2f517d2312c9e5248e5c69395fdca1c95a2b3286122c75f5783ddb6f53c languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.12.11, @babel/types@npm:^7.12.6, @babel/types@npm:^7.12.7, @babel/types@npm:^7.18.10, @babel/types@npm:^7.18.6, @babel/types@npm:^7.18.9, @babel/types@npm:^7.19.0, @babel/types@npm:^7.19.4, @babel/types@npm:^7.20.0, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": - version: 7.20.0 - resolution: "@babel/types@npm:7.20.0" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.12.11, @babel/types@npm:^7.12.6, @babel/types@npm:^7.12.7, @babel/types@npm:^7.18.6, @babel/types@npm:^7.18.9, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.2, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.0, @babel/types@npm:^7.21.2, @babel/types@npm:^7.21.4, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": + version: 7.21.4 + resolution: "@babel/types@npm:7.21.4" dependencies: "@babel/helper-string-parser": ^7.19.4 "@babel/helper-validator-identifier": ^7.19.1 to-fast-properties: ^2.0.0 - checksum: 8729b1114c707a03625cd79e3ae3a28d69b36ddcf804cb0a4599af226e5e9fad71665bdc0e56c43527ecfcabc545d9c797231f5ce718ae1ab52d31a57b6c2024 + checksum: 587bc55a91ce003b0f8aa10d70070f8006560d7dc0360dc0406d306a2cb2a10154e2f9080b9c37abec76907a90b330a536406cb75e6bdc905484f37b75c73219 languageName: node linkType: hard @@ -1704,18 +1717,18 @@ __metadata: languageName: node linkType: hard -"@codemirror/lang-javascript@npm:^6.1.2": - version: 6.1.2 - resolution: "@codemirror/lang-javascript@npm:6.1.2" +"@codemirror/lang-javascript@npm:^6.1.5": + version: 6.1.5 + resolution: "@codemirror/lang-javascript@npm:6.1.5" dependencies: "@codemirror/autocomplete": ^6.0.0 - "@codemirror/language": ^6.0.0 + "@codemirror/language": ^6.6.0 "@codemirror/lint": ^6.0.0 "@codemirror/state": ^6.0.0 "@codemirror/view": ^6.0.0 "@lezer/common": ^1.0.0 "@lezer/javascript": ^1.0.0 - checksum: f4336b7efd44e4158b9979f0c23918184c897d0fe3e40b5414bd9243a9899ecdba4dfe13970fe5024a1894579af80cb4c5dd574c6c2b7bd7ff06d8c8cb88616b + checksum: f0355f9577fac03437137356b5c8826ec073480d9b0efc62289eac483172d47dafe569f31bf788e4228e8b789197e50a0768cf10b0cde5f600e89b6b469f52cc languageName: node linkType: hard @@ -1729,9 +1742,9 @@ __metadata: languageName: node linkType: hard -"@codemirror/language@npm:^6.0.0": - version: 6.2.1 - resolution: "@codemirror/language@npm:6.2.1" +"@codemirror/language@npm:^6.0.0, @codemirror/language@npm:^6.6.0": + version: 6.6.0 + resolution: "@codemirror/language@npm:6.6.0" dependencies: "@codemirror/state": ^6.0.0 "@codemirror/view": ^6.0.0 @@ -1739,7 +1752,7 @@ __metadata: "@lezer/highlight": ^1.0.0 "@lezer/lr": ^1.0.0 style-mod: ^4.0.0 - checksum: e483eacf3346ef3d8db5c4c730e059790e6bf717b8148d79fa000082841f889f3a7867cc5df36f31503fcd7b2ca935b60c3e710c5637985f7ef0613728678fa3 + checksum: bb9411620e2f231653a3f0c4429e0d19a3843bff5dbc117df4649d7bf783ec4ad809c0add8bc0887a4ec3f48b4f8f941621168e47d76101d5383f0d670af1722 languageName: node linkType: hard @@ -1847,6 +1860,32 @@ __metadata: languageName: node linkType: hard +"@csstools/css-parser-algorithms@npm:^2.1.0": + version: 2.1.1 + resolution: "@csstools/css-parser-algorithms@npm:2.1.1" + peerDependencies: + "@csstools/css-tokenizer": ^2.1.1 + checksum: 0ba3f3d38b99c933d12c6cb7fc348a9c0056a1e23b8a4b7e66b79295b5071bc443c4c3ed87ad7f155ce7e76e49c20c582dc27d804c9a45c82e5bd37585870d60 + languageName: node + linkType: hard + +"@csstools/css-tokenizer@npm:^2.1.0": + version: 2.1.1 + resolution: "@csstools/css-tokenizer@npm:2.1.1" + checksum: d6ac4b08d7fdfc146755542f00b208af7248efd6cf2eb0f0f7d2ba3583a81f08ed9be6047d78b046925708b5bd0886f487edeeee2f90f0f34030dcbef4122d0e + languageName: node + linkType: hard + +"@csstools/media-query-list-parser@npm:^2.0.1": + version: 2.0.4 + resolution: "@csstools/media-query-list-parser@npm:2.0.4" + peerDependencies: + "@csstools/css-parser-algorithms": ^2.1.1 + "@csstools/css-tokenizer": ^2.1.1 + checksum: 059b1e9bb78fc55888d5c51b55ae6a3aa89b7fde14d846a659bc2bc7f01b5a85d4baf02d36b59a44e5157a5a8eb283b24918d567eda34667e5776befbf122983 + languageName: node + linkType: hard + "@csstools/normalize.css@npm:*": version: 12.0.0 resolution: "@csstools/normalize.css@npm:12.0.0" @@ -1989,13 +2028,12 @@ __metadata: languageName: node linkType: hard -"@csstools/selector-specificity@npm:^2.0.0, @csstools/selector-specificity@npm:^2.0.2": - version: 2.0.2 - resolution: "@csstools/selector-specificity@npm:2.0.2" +"@csstools/selector-specificity@npm:^2.0.0, @csstools/selector-specificity@npm:^2.0.2, @csstools/selector-specificity@npm:^2.2.0": + version: 2.2.0 + resolution: "@csstools/selector-specificity@npm:2.2.0" peerDependencies: - postcss: ^8.2 postcss-selector-parser: ^6.0.10 - checksum: a2045a27276a6cfe645b6e212afc217d9a43174ea7a1fa1ab8918d5a0ace72380fbd9837fe1920c547985c11a9070dc48c5c80d483d3f581ddf7aa688204d44f + checksum: 97c89f23b3b527d7bd51ed299969ed2b9fbb219a367948b44aefec228b8eda6ae0ad74fe8a82f9aac8ff32cfd00bb6d0c98d1daeab2e8fc6d5c4af25e5be5673 languageName: node linkType: hard @@ -2076,10 +2114,10 @@ __metadata: languageName: node linkType: hard -"@discoveryjs/json-ext@npm:^0.5.0, @discoveryjs/json-ext@npm:^0.5.3": - version: 0.5.6 - resolution: "@discoveryjs/json-ext@npm:0.5.6" - checksum: e97df618511fb202dffa2eb0d23e17dfb02943a70e5bc38f6b9603ad1cb1d6b525aa2b07ff9fb00b041abe425b341146ddd9e487f1e35ddadc8c6b8c56358ae0 +"@discoveryjs/json-ext@npm:0.5.7, @discoveryjs/json-ext@npm:^0.5.0, @discoveryjs/json-ext@npm:^0.5.3": + version: 0.5.7 + resolution: "@discoveryjs/json-ext@npm:0.5.7" + checksum: 2176d301cc258ea5c2324402997cf8134ebb212469c0d397591636cea8d3c02f2b3cf9fd58dcb748c7a0dade77ebdc1b10284fa63e608c033a1db52fddc69918 languageName: node linkType: hard @@ -2090,20 +2128,45 @@ __metadata: languageName: node linkType: hard -"@eslint/eslintrc@npm:^1.3.3": - version: 1.3.3 - resolution: "@eslint/eslintrc@npm:1.3.3" +"@eslint-community/eslint-utils@npm:^4.2.0": + version: 4.4.0 + resolution: "@eslint-community/eslint-utils@npm:4.4.0" + dependencies: + eslint-visitor-keys: ^3.3.0 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: cdfe3ae42b4f572cbfb46d20edafe6f36fc5fb52bf2d90875c58aefe226892b9677fef60820e2832caf864a326fe4fc225714c46e8389ccca04d5f9288aabd22 + languageName: node + linkType: hard + +"@eslint-community/regexpp@npm:^4.4.0": + version: 4.5.0 + resolution: "@eslint-community/regexpp@npm:4.5.0" + checksum: 99c01335947dbd7f2129e954413067e217ccaa4e219fe0917b7d2bd96135789384b8fedbfb8eb09584d5130b27a7b876a7150ab7376f51b3a0c377d5ce026a10 + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^2.0.2": + version: 2.0.2 + resolution: "@eslint/eslintrc@npm:2.0.2" dependencies: ajv: ^6.12.4 debug: ^4.3.2 - espree: ^9.4.0 - globals: ^13.15.0 + espree: ^9.5.1 + globals: ^13.19.0 ignore: ^5.2.0 import-fresh: ^3.2.1 js-yaml: ^4.1.0 minimatch: ^3.1.2 strip-json-comments: ^3.1.1 - checksum: f03e9d6727efd3e0719da2051ea80c0c73d20e28c171121527dbb868cd34232ca9c1d0525a66e517a404afea26624b1e47895b6a92474678418c2f50c9566694 + checksum: cfcf5e12c7b2c4476482e7f12434e76eae16fcd163ee627309adb10b761e5caa4a4e52ed7be464423320ff3d11eca5b50de5bf8be3e25834222470835dd5c801 + languageName: node + linkType: hard + +"@eslint/js@npm:8.38.0": + version: 8.38.0 + resolution: "@eslint/js@npm:8.38.0" + checksum: 1f28987aa8c9cd93e23384e16c7220863b39b5dc4b66e46d7cdbccce868040f455a98d24cd8b567a884f26545a0555b761f7328d4a00c051e7ef689cbea5fce1 languageName: node linkType: hard @@ -2163,14 +2226,14 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.6": - version: 0.11.6 - resolution: "@humanwhocodes/config-array@npm:0.11.6" +"@humanwhocodes/config-array@npm:^0.11.8": + version: 0.11.8 + resolution: "@humanwhocodes/config-array@npm:0.11.8" dependencies: "@humanwhocodes/object-schema": ^1.2.1 debug: ^4.1.1 - minimatch: ^3.0.4 - checksum: 2fb7288638968dfeec27f06aef52f043726edd126ac47f24b54256902fdb35b3bf9863d4a4caf0423dccca5dd1354ca5899f3ac047b56774641ca0c4cbedb104 + minimatch: ^3.0.5 + checksum: 0fd6b3c54f1674ce0a224df09b9c2f9846d20b9e54fabae1281ecfc04f2e6ad69bf19e1d6af6a28f88e8aa3990168b6cb9e1ef755868c3256a630605ec2cb1d3 languageName: node linkType: hard @@ -2280,6 +2343,20 @@ __metadata: languageName: node linkType: hard +"@jest/console@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/console@npm:29.5.0" + dependencies: + "@jest/types": ^29.5.0 + "@types/node": "*" + chalk: ^4.0.0 + jest-message-util: ^29.5.0 + jest-util: ^29.5.0 + slash: ^3.0.0 + checksum: 9f4f4b8fabd1221361b7f2e92d4a90f5f8c2e2b29077249996ab3c8b7f765175ffee795368f8d6b5b2bb3adb32dc09319f7270c7c787b0d259e624e00e0f64a5 + languageName: node + linkType: hard + "@jest/core@npm:^27.5.1": version: 27.5.1 resolution: "@jest/core@npm:27.5.1" @@ -2321,6 +2398,47 @@ __metadata: languageName: node linkType: hard +"@jest/core@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/core@npm:29.5.0" + dependencies: + "@jest/console": ^29.5.0 + "@jest/reporters": ^29.5.0 + "@jest/test-result": ^29.5.0 + "@jest/transform": ^29.5.0 + "@jest/types": ^29.5.0 + "@types/node": "*" + ansi-escapes: ^4.2.1 + chalk: ^4.0.0 + ci-info: ^3.2.0 + exit: ^0.1.2 + graceful-fs: ^4.2.9 + jest-changed-files: ^29.5.0 + jest-config: ^29.5.0 + jest-haste-map: ^29.5.0 + jest-message-util: ^29.5.0 + jest-regex-util: ^29.4.3 + jest-resolve: ^29.5.0 + jest-resolve-dependencies: ^29.5.0 + jest-runner: ^29.5.0 + jest-runtime: ^29.5.0 + jest-snapshot: ^29.5.0 + jest-util: ^29.5.0 + jest-validate: ^29.5.0 + jest-watcher: ^29.5.0 + micromatch: ^4.0.4 + pretty-format: ^29.5.0 + slash: ^3.0.0 + strip-ansi: ^6.0.0 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: 9e8f5243fe82d5a57f3971e1b96f320058df7c315328a3a827263f3b17f64be10c80f4a9c1b1773628b64d2de6d607c70b5b2d5bf13e7f5ad04223e9ef6aac06 + languageName: node + linkType: hard + "@jest/environment@npm:^27.5.1": version: 27.5.1 resolution: "@jest/environment@npm:27.5.1" @@ -2333,12 +2451,34 @@ __metadata: languageName: node linkType: hard -"@jest/expect-utils@npm:^29.0.2": - version: 29.0.2 - resolution: "@jest/expect-utils@npm:29.0.2" +"@jest/environment@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/environment@npm:29.5.0" + dependencies: + "@jest/fake-timers": ^29.5.0 + "@jest/types": ^29.5.0 + "@types/node": "*" + jest-mock: ^29.5.0 + checksum: 921de6325cd4817dec6685e5ff299b499b6379f3f9cf489b4b13588ee1f3820a0c77b49e6a087996b6de8f629f6f5251e636cba08d1bdb97d8071cc7d033c88a + languageName: node + linkType: hard + +"@jest/expect-utils@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/expect-utils@npm:29.5.0" + dependencies: + jest-get-type: ^29.4.3 + checksum: c46fb677c88535cf83cf29f0a5b1f376c6a1109ddda266ad7da1a9cbc53cb441fa402dd61fc7b111ffc99603c11a9b3357ee41a1c0e035a58830bcb360871476 + languageName: node + linkType: hard + +"@jest/expect@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/expect@npm:29.5.0" dependencies: - jest-get-type: ^29.0.0 - checksum: 12bb317b1dc0afe7cd0a0c4e1281dee6a7f1a5d74f85154e54bef79ad983da0c2adba9998b65d95bc8655bc0a535f566b0a83ea068bbdca33c33c1dd6fdae195 + expect: ^29.5.0 + jest-snapshot: ^29.5.0 + checksum: bd10e295111547e6339137107d83986ab48d46561525393834d7d2d8b2ae9d5626653f3f5e48e5c3fa742ac982e97bdf1f541b53b9e1d117a247b08e938527f6 languageName: node linkType: hard @@ -2356,6 +2496,20 @@ __metadata: languageName: node linkType: hard +"@jest/fake-timers@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/fake-timers@npm:29.5.0" + dependencies: + "@jest/types": ^29.5.0 + "@sinonjs/fake-timers": ^10.0.2 + "@types/node": "*" + jest-message-util: ^29.5.0 + jest-mock: ^29.5.0 + jest-util: ^29.5.0 + checksum: 69930c6922341f244151ec0d27640852ec96237f730fc024da1f53143d31b43cde75d92f9d8e5937981cdce3b31416abc3a7090a0d22c2377512c4a6613244ee + languageName: node + linkType: hard + "@jest/globals@npm:^27.5.1": version: 27.5.1 resolution: "@jest/globals@npm:27.5.1" @@ -2367,6 +2521,18 @@ __metadata: languageName: node linkType: hard +"@jest/globals@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/globals@npm:29.5.0" + dependencies: + "@jest/environment": ^29.5.0 + "@jest/expect": ^29.5.0 + "@jest/types": ^29.5.0 + jest-mock: ^29.5.0 + checksum: b309ab8f21b571a7c672608682e84bbdd3d2b554ddf81e4e32617fec0a69094a290ab42e3c8b2c66ba891882bfb1b8b2736720ea1285b3ad646d55c2abefedd9 + languageName: node + linkType: hard + "@jest/reporters@npm:^27.5.1": version: 27.5.1 resolution: "@jest/reporters@npm:27.5.1" @@ -2405,6 +2571,43 @@ __metadata: languageName: node linkType: hard +"@jest/reporters@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/reporters@npm:29.5.0" + dependencies: + "@bcoe/v8-coverage": ^0.2.3 + "@jest/console": ^29.5.0 + "@jest/test-result": ^29.5.0 + "@jest/transform": ^29.5.0 + "@jest/types": ^29.5.0 + "@jridgewell/trace-mapping": ^0.3.15 + "@types/node": "*" + chalk: ^4.0.0 + collect-v8-coverage: ^1.0.0 + exit: ^0.1.2 + glob: ^7.1.3 + graceful-fs: ^4.2.9 + istanbul-lib-coverage: ^3.0.0 + istanbul-lib-instrument: ^5.1.0 + istanbul-lib-report: ^3.0.0 + istanbul-lib-source-maps: ^4.0.0 + istanbul-reports: ^3.1.3 + jest-message-util: ^29.5.0 + jest-util: ^29.5.0 + jest-worker: ^29.5.0 + slash: ^3.0.0 + string-length: ^4.0.1 + strip-ansi: ^6.0.0 + v8-to-istanbul: ^9.0.1 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + checksum: 481268aac9a4a75cc49c4df1273d6b111808dec815e9d009dad717c32383ebb0cebac76e820ad1ab44e207540e1c2fe1e640d44c4f262de92ab1933e057fdeeb + languageName: node + linkType: hard + "@jest/schemas@npm:^28.1.3": version: 28.1.3 resolution: "@jest/schemas@npm:28.1.3" @@ -2414,12 +2617,12 @@ __metadata: languageName: node linkType: hard -"@jest/schemas@npm:^29.0.0": - version: 29.0.0 - resolution: "@jest/schemas@npm:29.0.0" +"@jest/schemas@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/schemas@npm:29.4.3" dependencies: - "@sinclair/typebox": ^0.24.1 - checksum: 41355c78f09eb1097e57a3c5d0ca11c9099e235e01ea5fa4e3953562a79a6a9296c1d300f1ba50ca75236048829e056b00685cd2f1ff8285e56fd2ce01249acb + "@sinclair/typebox": ^0.25.16 + checksum: ac754e245c19dc39e10ebd41dce09040214c96a4cd8efa143b82148e383e45128f24599195ab4f01433adae4ccfbe2db6574c90db2862ccd8551a86704b5bebd languageName: node linkType: hard @@ -2434,6 +2637,17 @@ __metadata: languageName: node linkType: hard +"@jest/source-map@npm:^29.4.3": + version: 29.4.3 + resolution: "@jest/source-map@npm:29.4.3" + dependencies: + "@jridgewell/trace-mapping": ^0.3.15 + callsites: ^3.0.0 + graceful-fs: ^4.2.9 + checksum: 2301d225145f8123540c0be073f35a80fd26a2f5e59550fd68525d8cea580fb896d12bf65106591ffb7366a8a19790076dbebc70e0f5e6ceb51f81827ed1f89c + languageName: node + linkType: hard + "@jest/test-result@npm:^27.5.1": version: 27.5.1 resolution: "@jest/test-result@npm:27.5.1" @@ -2458,6 +2672,18 @@ __metadata: languageName: node linkType: hard +"@jest/test-result@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/test-result@npm:29.5.0" + dependencies: + "@jest/console": ^29.5.0 + "@jest/types": ^29.5.0 + "@types/istanbul-lib-coverage": ^2.0.0 + collect-v8-coverage: ^1.0.0 + checksum: 2e8ff5242227ab960c520c3ea0f6544c595cc1c42fa3873c158e9f4f685f4ec9670ec08a4af94ae3885c0005a43550a9595191ffbc27a0965df27d9d98bbf901 + languageName: node + linkType: hard + "@jest/test-sequencer@npm:^27.5.1": version: 27.5.1 resolution: "@jest/test-sequencer@npm:27.5.1" @@ -2470,6 +2696,18 @@ __metadata: languageName: node linkType: hard +"@jest/test-sequencer@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/test-sequencer@npm:29.5.0" + dependencies: + "@jest/test-result": ^29.5.0 + graceful-fs: ^4.2.9 + jest-haste-map: ^29.5.0 + slash: ^3.0.0 + checksum: eca34b4aeb2fda6dfb7f9f4b064c858a7adf64ec5c6091b6f4ed9d3c19549177cbadcf1c615c4c182688fa1cf085c8c55c3ca6eea40719a34554b0bf071d842e + languageName: node + linkType: hard + "@jest/transform@npm:^26.6.2": version: 26.6.2 resolution: "@jest/transform@npm:26.6.2" @@ -2516,6 +2754,29 @@ __metadata: languageName: node linkType: hard +"@jest/transform@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/transform@npm:29.5.0" + dependencies: + "@babel/core": ^7.11.6 + "@jest/types": ^29.5.0 + "@jridgewell/trace-mapping": ^0.3.15 + babel-plugin-istanbul: ^6.1.1 + chalk: ^4.0.0 + convert-source-map: ^2.0.0 + fast-json-stable-stringify: ^2.1.0 + graceful-fs: ^4.2.9 + jest-haste-map: ^29.5.0 + jest-regex-util: ^29.4.3 + jest-util: ^29.5.0 + micromatch: ^4.0.4 + pirates: ^4.0.4 + slash: ^3.0.0 + write-file-atomic: ^4.0.2 + checksum: d55d604085c157cf5112e165ff5ac1fa788873b3b31265fb4734ca59892ee24e44119964cc47eb6d178dd9512bbb6c576d1e20e51a201ff4e24d31e818a1c92d + languageName: node + linkType: hard + "@jest/types@npm:^26.6.2": version: 26.6.2 resolution: "@jest/types@npm:26.6.2" @@ -2556,27 +2817,17 @@ __metadata: languageName: node linkType: hard -"@jest/types@npm:^29.0.2": - version: 29.0.2 - resolution: "@jest/types@npm:29.0.2" +"@jest/types@npm:^29.5.0": + version: 29.5.0 + resolution: "@jest/types@npm:29.5.0" dependencies: - "@jest/schemas": ^29.0.0 + "@jest/schemas": ^29.4.3 "@types/istanbul-lib-coverage": ^2.0.0 "@types/istanbul-reports": ^3.0.0 "@types/node": "*" "@types/yargs": ^17.0.8 chalk: ^4.0.0 - checksum: f093f4548f8022f5ac9d1edf712edbb5c8edb101017f4afd95b9f9eb978328d099dcb77e2f1893a6dfeb9a7dfdd6cc589b2d83829490cee7e9afa9166c2945bd - languageName: node - linkType: hard - -"@jridgewell/gen-mapping@npm:^0.1.0": - version: 0.1.1 - resolution: "@jridgewell/gen-mapping@npm:0.1.1" - dependencies: - "@jridgewell/set-array": ^1.0.0 - "@jridgewell/sourcemap-codec": ^1.4.10 - checksum: 3bcc21fe786de6ffbf35c399a174faab05eb23ce6a03e8769569de28abbf4facc2db36a9ddb0150545ae23a8d35a7cf7237b2aa9e9356a7c626fb4698287d5cc + checksum: 1811f94b19cf8a9460a289c4f056796cfc373480e0492692a6125a553cd1a63824bd846d7bb78820b7b6f758f6dd3c2d4558293bb676d541b2fa59c70fdf9d39 languageName: node linkType: hard @@ -2591,14 +2842,14 @@ __metadata: languageName: node linkType: hard -"@jridgewell/resolve-uri@npm:^3.0.3": - version: 3.0.5 - resolution: "@jridgewell/resolve-uri@npm:3.0.5" - checksum: 1ee652b693da7979ac4007926cc3f0a32b657ffeb913e111f44e5b67153d94a2f28a1d560101cc0cf8087625468293a69a00f634a2914e1a6d0817ba2039a913 +"@jridgewell/resolve-uri@npm:3.1.0, @jridgewell/resolve-uri@npm:^3.0.3": + version: 3.1.0 + resolution: "@jridgewell/resolve-uri@npm:3.1.0" + checksum: b5ceaaf9a110fcb2780d1d8f8d4a0bfd216702f31c988d8042e5f8fbe353c55d9b0f55a1733afdc64806f8e79c485d2464680ac48a0d9fcadb9548ee6b81d267 languageName: node linkType: hard -"@jridgewell/set-array@npm:^1.0.0, @jridgewell/set-array@npm:^1.0.1": +"@jridgewell/set-array@npm:^1.0.1": version: 1.1.2 resolution: "@jridgewell/set-array@npm:1.1.2" checksum: 69a84d5980385f396ff60a175f7177af0b8da4ddb81824cb7016a9ef914eee9806c72b6b65942003c63f7983d4f39a5c6c27185bbca88eb4690b62075602e28e @@ -2615,10 +2866,10 @@ __metadata: languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.10": - version: 1.4.11 - resolution: "@jridgewell/sourcemap-codec@npm:1.4.11" - checksum: 3b2afaf8400fb07a36db60e901fcce6a746cdec587310ee9035939d89878e57b2dec8173b0b8f63176f647efa352294049a53c49739098eb907ff81fec2547c8 +"@jridgewell/sourcemap-codec@npm:1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.10": + version: 1.4.14 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.14" + checksum: 61100637b6d173d3ba786a5dff019e1a74b1f394f323c1fee337ff390239f053b87266c7a948777f4b1ee68c01a8ad0ab61e5ff4abb5a012a0b091bec391ab97 languageName: node linkType: hard @@ -2632,13 +2883,13 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.7, @jridgewell/trace-mapping@npm:^0.3.9": - version: 0.3.14 - resolution: "@jridgewell/trace-mapping@npm:0.3.14" +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.15, @jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.9": + version: 0.3.18 + resolution: "@jridgewell/trace-mapping@npm:0.3.18" dependencies: - "@jridgewell/resolve-uri": ^3.0.3 - "@jridgewell/sourcemap-codec": ^1.4.10 - checksum: b9537b9630ffb631aef9651a085fe361881cde1772cd482c257fe3c78c8fd5388d681f504a9c9fe1081b1c05e8f75edf55ee10fdb58d92bbaa8dbf6a7bd6b18c + "@jridgewell/resolve-uri": 3.1.0 + "@jridgewell/sourcemap-codec": 1.4.14 + checksum: 0572669f855260808c16fe8f78f5f1b4356463b11d3f2c7c0b5580c8ba1cbf4ae53efe9f627595830856e57dbac2325ac17eb0c3dd0ec42102e6f227cc289c02 languageName: node linkType: hard @@ -3452,12 +3703,12 @@ __metadata: languageName: node linkType: hard -"@lezer/highlight@npm:^1.0.0, @lezer/highlight@npm:^1.1.3": - version: 1.1.3 - resolution: "@lezer/highlight@npm:1.1.3" +"@lezer/highlight@npm:^1.0.0, @lezer/highlight@npm:^1.1.4": + version: 1.1.4 + resolution: "@lezer/highlight@npm:1.1.4" dependencies: "@lezer/common": ^1.0.0 - checksum: 90ec143ce46b32f6779c3b245f1b5a540d66686939816d3daed8318821acc4bc719466dc222336cfd483bf04a8de4fdc6f279e904cf114d4d9f786f9feccbbd8 + checksum: 30e848c02839bfcd9472fcd6e74d71cba12379cef38f27d0c6cab0e6831f92150cfc629d267a40cc31f84cf46ac0a935400163fdf931b2672c516bec29417485 languageName: node linkType: hard @@ -5304,20 +5555,20 @@ __metadata: "@rollup/plugin-json": ~4.1.0 "@rollup/plugin-node-resolve": ~13.1.3 "@rollup/plugin-typescript": ~8.3.4 - "@types/jest": ~27.4.1 + "@types/jest": ~29.5.0 "@types/stylis": ^4.0.2 bump: "workspace:~" - eslint: ~8.26.0 - jest: ~27.5.1 + eslint: ~8.38.0 + jest: ~29.5.0 lint-all: "workspace:~" - lint-staged: ~12.3.8 - prettier: ~2.7.1 + lint-staged: ~13.2.1 + prettier: ~2.8.7 rollup: ~2.67.3 rollup-plugin-terser: ~7.0.2 stylis: ~4.1.3 - ts-jest: ~27.1.5 - typedoc: ~0.22.18 - typescript: ~4.9.4 + ts-jest: ~29.1.0 + typedoc: ~0.24.1 + typescript: ~5.0.4 languageName: unknown linkType: soft @@ -5329,13 +5580,13 @@ __metadata: "@rocket.chat/memo": "workspace:~" "@rocket.chat/prettier-config": "workspace:~" bump: "workspace:~" - eslint: ~8.26.0 + eslint: ~8.38.0 lint-all: "workspace:~" - lint-staged: ~12.3.8 - prettier: ~2.7.1 + lint-staged: ~13.2.1 + prettier: ~2.8.7 rimraf: ~3.0.2 - typedoc: ~0.22.18 - typescript: ~4.9.4 + typedoc: ~0.24.1 + typescript: ~5.0.4 languageName: unknown linkType: soft @@ -5349,20 +5600,19 @@ __metadata: "@rollup/plugin-json": ~4.1.0 "@rollup/plugin-node-resolve": ~13.1.3 "@rollup/plugin-typescript": ~8.3.4 - "@types/jest": ~27.4.1 + "@types/jest": ~29.5.0 bump: "workspace:~" - eslint: ~8.26.0 - jest: ~27.5.1 + eslint: ~8.38.0 + jest: ~29.5.0 lint-all: "workspace:~" - lint-staged: ~12.3.8 + lint-staged: ~13.2.1 npm-run-all: ^4.1.5 - prettier: ~2.7.1 + prettier: ~2.8.7 rollup: ~2.67.3 rollup-plugin-terser: ~7.0.2 - ts-jest: ~27.1.5 - tslib: ^2.3.1 - typedoc: ~0.22.18 - typescript: ~4.9.4 + ts-jest: ~29.1.0 + typedoc: ~0.24.1 + typescript: ~5.0.4 languageName: unknown linkType: soft @@ -5370,23 +5620,23 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/eslint-config-alt@workspace:packages/eslint-config-alt" dependencies: - "@babel/eslint-parser": ~7.19.1 - "@typescript-eslint/eslint-plugin": ~5.11.0 - "@typescript-eslint/parser": ~5.11.0 + "@babel/eslint-parser": ~7.21.3 + "@typescript-eslint/eslint-plugin": ~5.58.0 + "@typescript-eslint/parser": ~5.58.0 bump: "workspace:~" - eslint: ~8.26.0 - eslint-config-prettier: ~8.5.0 - eslint-import-resolver-typescript: ~3.5.3 + eslint: ~8.38.0 + eslint-config-prettier: ~8.8.0 + eslint-import-resolver-typescript: ~3.5.5 eslint-plugin-import: ~2.26.0 eslint-plugin-prettier: ~4.2.1 - eslint-plugin-react: ~7.31.11 + eslint-plugin-react: ~7.32.2 eslint-plugin-react-hooks: ~4.6.0 lint-all: "workspace:~" - lint-staged: ~12.3.8 - prettier: ~2.7.1 + lint-staged: ~13.2.1 + prettier: ~2.8.7 peerDependencies: "@babel/eslint-parser": ^7.13.14 - eslint: ^7.29.0 + eslint: ~8.38.0 prettier: ~2.7.1 languageName: unknown linkType: soft @@ -5402,27 +5652,27 @@ __metadata: "@rollup/plugin-json": ~4.1.0 "@rollup/plugin-node-resolve": ~13.1.3 "@rollup/plugin-typescript": ~8.3.4 - "@testing-library/react-hooks": ~7.0.2 - "@testing-library/user-event": ^13.5.0 - "@types/jest": ~27.4.1 - "@types/react": ~17.0.53 - "@types/react-dom": ^17.0.18 + "@testing-library/react-hooks": ~8.0.1 + "@testing-library/user-event": ~14.4.3 + "@types/jest": ~29.5.0 + "@types/react": ~17.0.57 + "@types/react-dom": ^17.0.19 "@types/resize-observer-browser": ~0.1.7 "@types/use-sync-external-store": ~0.0.3 bump: "workspace:~" - eslint: ~8.26.0 - jest: ~27.5.1 + eslint: ~8.38.0 + jest: ~29.5.0 lint-all: "workspace:~" - lint-staged: ~12.3.8 + lint-staged: ~13.2.1 npm-run-all: ^4.1.5 - prettier: ~2.7.1 + prettier: ~2.8.7 react: ^17.0.2 rollup: ~2.67.3 rollup-plugin-terser: ~7.0.2 testing-utils: "workspace:~" - ts-jest: ~27.1.5 - typedoc: ~0.22.18 - typescript: ~4.9.4 + ts-jest: ~29.1.0 + typedoc: ~0.24.1 + typescript: ~5.0.4 use-sync-external-store: ~1.2.0 peerDependencies: "@rocket.chat/fuselage-tokens": "*" @@ -5440,13 +5690,13 @@ __metadata: bump: "workspace:~" clipboard-polyfill: ^3.0.3 element-closest-polyfill: ^1.0.6 - eslint: ~8.26.0 + eslint: ~8.38.0 focus-visible: ^5.2.0 focus-within-polyfill: ^5.2.1 lint-all: "workspace:~" - lint-staged: ~12.3.8 + lint-staged: ~13.2.1 new-event-polyfill: ^1.0.1 - prettier: ~2.7.1 + prettier: ~2.8.7 languageName: unknown linkType: soft @@ -5458,10 +5708,10 @@ __metadata: husky: ~7.0.4 hygen: ~6.1.5 lerna: ~4.0.0 - lint-staged: ~12.3.8 + lint-staged: ~13.2.1 turbo: ~1.1.10 update-readme: "workspace:~" - webpack: ~5.76.0 + webpack: ~5.78.0 languageName: unknown linkType: soft @@ -5475,26 +5725,28 @@ __metadata: "@rocket.chat/layout": "workspace:~" "@rocket.chat/prettier-config": "workspace:~" "@rocket.chat/styled": "workspace:~" - "@storybook/addon-essentials": ~6.5.15 - "@storybook/addons": ~6.5.15 - "@storybook/react": ~6.5.15 - "@storybook/source-loader": ~6.5.15 - "@storybook/theming": ~6.5.15 - "@types/jest": ~27.4.1 - "@types/react": ~17.0.53 - "@types/react-dom": ^17.0.18 + "@storybook/addon-essentials": ~6.5.16 + "@storybook/addons": ~6.5.16 + "@storybook/builder-webpack5": ~6.5.16 + "@storybook/manager-webpack5": ~6.5.16 + "@storybook/react": ~6.5.16 + "@storybook/theming": ~6.5.16 + "@types/jest": ~29.5.0 + "@types/react": ~17.0.57 + "@types/react-dom": ^17.0.19 bump: "workspace:~" - eslint: ~8.26.0 - jest: ~27.5.1 + eslint: ~8.38.0 + jest: ~29.5.0 lint-all: "workspace:~" - lint-staged: ~12.3.8 + lint-staged: ~13.2.1 npm-run-all: ^4.1.5 - prettier: ~2.7.1 + prettier: ~2.8.7 + react-docgen-typescript-plugin: ~1.0.5 rimraf: ~3.0.2 storybook-dark-mode: ~1.1.2 - ts-jest: ~27.1.5 - typedoc: ~0.22.18 - typescript: ~4.9.4 + ts-jest: ~29.1.0 + typedoc: ~0.24.1 + typescript: ~5.0.4 peerDependencies: "@rocket.chat/fuselage": "*" "@rocket.chat/fuselage-hooks": "*" @@ -5513,22 +5765,21 @@ __metadata: "@rocket.chat/prettier-config": "workspace:~" build-design-tokens: "workspace:~" bump: "workspace:~" - eslint: ~8.26.0 - eslint-config-prettier: ~8.5.0 + eslint: ~8.38.0 + eslint-config-prettier: ~8.8.0 eslint-plugin-import: ~2.26.0 eslint-plugin-prettier: ~4.2.1 lint-all: "workspace:~" - lint-staged: ~12.3.8 + lint-staged: ~13.2.1 npm-run-all: ^4.1.5 postcss-scss: ~4.0.6 - prettier: ~2.7.1 + prettier: ~2.8.7 rimraf: ^3.0.2 style-dictionary: ~3.7.2 - stylelint: ~14.14.1 - stylelint-order: ~5.0.0 - stylelint-prettier: ~2.0.0 - stylelint-scss: ~4.3.0 - typescript: ~4.9.4 + stylelint: ~15.4.0 + stylelint-order: ~6.0.3 + stylelint-prettier: ~3.0.0 + stylelint-scss: ~4.6.0 languageName: unknown linkType: soft @@ -5545,30 +5796,29 @@ __metadata: "@rocket.chat/prettier-config": "workspace:~" "@rocket.chat/styled": "workspace:~" "@rocket.chat/ui-kit": "workspace:~" - "@storybook/addon-essentials": ~6.5.15 - "@storybook/addons": ~6.5.15 - "@storybook/builder-webpack5": ~6.5.15 - "@storybook/manager-webpack5": ~6.5.15 - "@storybook/react": ~6.5.15 - "@storybook/source-loader": ~6.5.15 - "@storybook/theming": ~6.5.15 - "@types/react": ~17.0.53 - "@types/react-dom": ^17.0.18 - babel-loader: ~8.2.5 + "@storybook/addon-essentials": ~6.5.16 + "@storybook/addons": ~6.5.16 + "@storybook/builder-webpack5": ~6.5.16 + "@storybook/manager-webpack5": ~6.5.16 + "@storybook/react": ~6.5.16 + "@storybook/theming": ~6.5.16 + "@types/react": ~17.0.57 + "@types/react-dom": ^17.0.19 + babel-loader: ~9.1.2 bump: "workspace:~" cross-env: ^7.0.3 - eslint: ~8.26.0 + eslint: ~8.38.0 lint-all: "workspace:~" - lint-staged: ~12.3.8 + lint-staged: ~13.2.1 normalize.css: ^8.0.1 npm-run-all: ^4.1.5 - prettier: ~2.7.1 + prettier: ~2.8.7 react: ^17.0.2 + react-docgen-typescript-plugin: ~1.0.5 react-dom: ^17.0.2 rimraf: ^3.0.2 - tslib: ^2.3.1 - typescript: ~4.9.4 - webpack: ~5.76.0 + typescript: ~5.0.4 + webpack: ~5.78.0 write-version-module: "workspace:~" peerDependencies: "@rocket.chat/fuselage": "*" @@ -5585,10 +5835,10 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/fuselage@workspace:packages/fuselage" dependencies: - "@babel/core": ~7.19.6 - "@babel/eslint-parser": ~7.19.1 - "@babel/plugin-transform-runtime": ~7.19.6 - "@babel/preset-env": ~7.19.4 + "@babel/core": ~7.21.4 + "@babel/eslint-parser": ~7.21.3 + "@babel/plugin-transform-runtime": ~7.21.4 + "@babel/preset-env": ~7.21.4 "@babel/preset-react": ~7.18.6 "@rocket.chat/css-in-js": "workspace:~" "@rocket.chat/css-supports": "workspace:~" @@ -5600,69 +5850,71 @@ __metadata: "@rocket.chat/memo": "workspace:~" "@rocket.chat/prettier-config": "workspace:~" "@rocket.chat/styled": "workspace:~" - "@storybook/addon-essentials": ~6.5.15 - "@storybook/addon-interactions": ~6.5.15 - "@storybook/addon-links": ~6.5.15 - "@storybook/addons": ~6.5.15 - "@storybook/builder-webpack5": ~6.5.15 - "@storybook/client-api": ~6.5.15 + "@storybook/addon-essentials": ~6.5.16 + "@storybook/addon-interactions": ~6.5.16 + "@storybook/addon-links": ~6.5.16 + "@storybook/addons": ~6.5.16 + "@storybook/builder-webpack5": ~6.5.16 + "@storybook/client-api": ~6.5.16 "@storybook/jest": ~0.0.10 - "@storybook/manager-webpack5": ~6.5.15 - "@storybook/react": ~6.5.15 - "@storybook/source-loader": ~6.5.15 + "@storybook/manager-webpack5": ~6.5.16 + "@storybook/react": ~6.5.16 "@storybook/testing-library": ~0.0.13 "@storybook/testing-react": ~1.3.0 - "@storybook/theming": ~6.5.15 + "@storybook/theming": ~6.5.16 "@testing-library/jest-dom": ~5.16.5 - "@testing-library/react": ^12.1.5 + "@testing-library/react": release-12.x + "@testing-library/user-event": ~14.4.3 "@types/invariant": ^2.2.35 - "@types/jest": ~27.4.1 - autoprefixer: ~10.4.13 - babel-loader: ~8.2.5 + "@types/jest": ~29.5.0 + autoprefixer: ~10.4.14 + babel-loader: ~9.1.2 bump: "workspace:~" - caniuse-lite: ~1.0.30001446 + caniuse-lite: ~1.0.30001477 cross-env: ^7.0.3 - css-loader: ~6.6.0 + css-loader: ~6.7.3 cssnano: ~5.0.17 - es-check: ~7.0.1 - eslint: ~8.26.0 - eslint-plugin-mdx: ~1.17.1 + es-check: ~7.1.1 + eslint: ~8.38.0 + eslint-mdx: ~2.0.5 + eslint-plugin-mdx: ~2.0.5 invariant: ^2.2.4 - jest: ~27.5.1 + jest: ~29.5.0 lint-all: "workspace:~" - lint-staged: ~12.3.8 + lint-staged: ~13.2.1 normalize.css: ^8.0.1 npm-run-all: ^4.1.5 path-browserify: ^1.0.1 postcss: ~8.4.21 postcss-custom-properties: ~12.1.11 postcss-dir-pseudo-class: ~6.0.5 - postcss-loader: ~6.2.1 + postcss-loader: ~7.2.4 postcss-logical: ~5.0.4 postcss-scss: ~4.0.6 postcss-svg: ~3.0.0 - prettier: ~2.7.1 + prettier: ~2.8.7 react: ^17.0.2 react-aria: ~3.19.0 + react-docgen-typescript-plugin: ~1.0.5 react-dom: ^17.0.2 react-keyed-flatten-children: ^1.3.0 react-stately: ~3.17.0 react-virtuoso: ~3.1.5 rimraf: ^3.0.2 - sass: ~1.49.11 - sass-loader: ~12.4.0 - style-loader: ~3.3.1 - stylelint: ~14.14.1 - stylelint-order: ~5.0.0 - stylelint-prettier: ~2.0.0 - stylelint-scss: ~4.3.0 + sass: ~1.62.0 + sass-loader: ~13.2.2 + style-loader: ~3.3.2 + stylelint: ~15.4.0 + stylelint-order: ~6.0.3 + stylelint-prettier: ~3.0.0 + stylelint-scss: ~4.6.0 testing-utils: "workspace:~" - ts-jest: ~27.1.5 + ts-jest: ~29.1.0 ts-loader: ~9.4.2 - typescript: ~4.9.4 - webpack: ~5.76.0 - webpack-bundle-analyzer: ~4.7.0 - webpack-cli: ~4.10.0 + typescript: ~5.0.4 + webpack: ~5.78.0 + webpack-bundle-analyzer: ~4.8.0 + webpack-cli: ~5.0.1 peerDependencies: "@rocket.chat/fuselage-hooks": "*" "@rocket.chat/fuselage-polyfills": "*" @@ -5682,16 +5934,16 @@ __metadata: "@rocket.chat/prettier-config": "workspace:~" build-icons: "workspace:~" bump: "workspace:~" - eslint: ~8.26.0 + eslint: ~8.38.0 lint-all: "workspace:~" - lint-staged: ~12.3.8 + lint-staged: ~13.2.1 npm-run-all: ^4.1.5 - prettier: ~2.7.1 + prettier: ~2.8.7 rimraf: ^3.0.2 - stylelint: ~14.14.1 - stylelint-order: ~5.0.0 - stylelint-prettier: ~2.0.0 - stylelint-scss: ~4.3.0 + stylelint: ~15.4.0 + stylelint-order: ~6.0.3 + stylelint-prettier: ~3.0.0 + stylelint-scss: ~4.6.0 languageName: unknown linkType: soft @@ -5702,24 +5954,26 @@ __metadata: "@rocket.chat/eslint-config-alt": "workspace:~" "@rocket.chat/fuselage": "workspace:~" "@rocket.chat/prettier-config": "workspace:~" - "@storybook/addon-essentials": ~6.5.15 - "@storybook/addons": ~6.5.15 - "@storybook/react": ~6.5.15 - "@storybook/source-loader": ~6.5.15 - "@storybook/theming": ~6.5.15 - "@types/jest": ~27.4.1 + "@storybook/addon-essentials": ~6.5.16 + "@storybook/addons": ~6.5.16 + "@storybook/builder-webpack5": ~6.5.16 + "@storybook/manager-webpack5": ~6.5.16 + "@storybook/react": ~6.5.16 + "@storybook/theming": ~6.5.16 + "@types/jest": ~29.5.0 bump: "workspace:~" - eslint: ~8.26.0 - jest: ~27.5.1 + eslint: ~8.38.0 + jest: ~29.5.0 lint-all: "workspace:~" - lint-staged: ~12.3.8 + lint-staged: ~13.2.1 npm-run-all: ^4.1.5 - prettier: ~2.7.1 + prettier: ~2.8.7 + react-docgen-typescript-plugin: ~1.0.5 rimraf: ~3.0.2 storybook-dark-mode: ^1.1.2 - ts-jest: ~27.1.5 - typedoc: ~0.22.18 - typescript: ~4.9.4 + ts-jest: ~29.1.0 + typedoc: ~0.24.1 + typescript: ~5.0.4 peerDependencies: "@rocket.chat/fuselage": "*" react: 17.0.2 @@ -5737,24 +5991,23 @@ __metadata: "@rocket.chat/fuselage-tokens": "workspace:~" "@rocket.chat/prettier-config": "workspace:~" "@rocket.chat/styled": "workspace:~" - "@types/jest": ~27.4.1 - "@types/react": ~17.0.53 - "@types/react-dom": ^17.0.18 + "@types/jest": ~29.5.0 + "@types/react": ~17.0.57 + "@types/react-dom": ^17.0.19 build-logo: "workspace:~" bump: "workspace:~" - eslint: ~8.26.0 - jest: ~27.5.1 + eslint: ~8.38.0 + jest: ~29.5.0 lint-all: "workspace:~" - lint-staged: ~12.3.8 + lint-staged: ~13.2.1 npm-run-all: ^4.1.5 - prettier: ~2.7.1 + prettier: ~2.8.7 react: ^17.0.2 react-dom: ^17.0.2 rimraf: ^3.0.2 - ts-jest: ~27.1.5 - tslib: ^2.3.1 - typedoc: ~0.22.18 - typescript: ~4.9.4 + ts-jest: ~29.1.0 + typedoc: ~0.24.1 + typescript: ~5.0.4 peerDependencies: react: 17.0.2 react-dom: 17.0.2 @@ -5767,17 +6020,17 @@ __metadata: dependencies: "@rocket.chat/eslint-config-alt": "workspace:~" "@rocket.chat/prettier-config": "workspace:~" - "@types/jest": ~27.4.1 + "@types/jest": ~29.5.0 bump: "workspace:~" - eslint: ~8.26.0 - jest: ~27.5.1 + eslint: ~8.38.0 + jest: ~29.5.0 lint-all: "workspace:~" - lint-staged: ~12.3.8 - prettier: ~2.7.1 + lint-staged: ~13.2.1 + prettier: ~2.8.7 rimraf: ~3.0.2 - ts-jest: ~27.1.5 - typedoc: ~0.22.18 - typescript: ~4.9.4 + ts-jest: ~29.1.0 + typedoc: ~0.24.1 + typescript: ~5.0.4 languageName: unknown linkType: soft @@ -5785,33 +6038,33 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/message-parser@workspace:packages/message-parser" dependencies: - "@babel/core": ~7.19.6 - "@babel/eslint-parser": ~7.19.1 - "@babel/preset-env": ~7.19.4 + "@babel/core": ~7.21.4 + "@babel/eslint-parser": ~7.21.3 + "@babel/preset-env": ~7.21.4 "@rocket.chat/eslint-config-alt": "workspace:~" "@rocket.chat/peggy-loader": "workspace:~" "@rocket.chat/prettier-config": "workspace:~" - "@types/jest": ~27.4.1 - "@types/node": ~15.14.9 - "@typescript-eslint/parser": ~5.11.0 - babel-loader: ~8.2.5 + "@types/jest": ~29.5.0 + "@types/node": ~14.18.42 + "@typescript-eslint/parser": ~5.58.0 + babel-loader: ~9.1.2 bump: "workspace:~" - eslint: ~8.26.0 - jest: ~27.5.1 + eslint: ~8.38.0 + jest: ~29.5.0 lint-all: "workspace:~" - lint-staged: ~12.3.8 + lint-staged: ~13.2.1 npm-run-all: ^4.1.5 peggy: 3.0.2 - prettier: ~2.7.1 - prettier-plugin-pegjs: ~0.5.3 + prettier: ~2.8.7 + prettier-plugin-pegjs: ~0.5.4 rimraf: ^3.0.2 - tldts: ~5.7.104 - ts-jest: ~27.1.5 + tldts: ~5.7.112 + ts-jest: ~29.1.0 ts-loader: ~9.4.2 - typedoc: ~0.22.18 - typescript: ~4.9.4 - webpack: ~5.76.0 - webpack-cli: ~4.10.0 + typedoc: ~0.24.1 + typescript: ~5.0.4 + webpack: ~5.78.0 + webpack-cli: ~5.0.1 languageName: unknown linkType: soft @@ -5819,27 +6072,28 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/mp3-encoder@workspace:packages/mp3-encoder" dependencies: - "@babel/core": ~7.19.6 - "@babel/plugin-transform-runtime": ~7.19.6 - "@babel/preset-env": ~7.19.4 - "@babel/preset-typescript": ^7.18.6 + "@babel/core": ~7.21.4 + "@babel/plugin-transform-runtime": ~7.21.4 + "@babel/preset-env": ~7.21.4 + "@babel/preset-typescript": ~7.21.4 "@rocket.chat/eslint-config-alt": "workspace:~" "@rocket.chat/prettier-config": "workspace:~" "@rollup/plugin-commonjs": ~21.0.3 "@rollup/plugin-node-resolve": ~13.1.3 "@rollup/plugin-typescript": ~8.3.4 - "@types/jest": ~27.4.1 + "@types/jest": ~29.5.0 bump: "workspace:~" - eslint: ~8.26.0 - jest: ~27.5.1 + eslint: ~8.38.0 + jest: ~29.5.0 + jest-environment-jsdom: ~29.5.0 lamejs: "git+https://github.com/zhuker/lamejs.git#commit=582bbba6a12f981b984d8fb9e1874499fed85675" lint-all: "workspace:~" - lint-staged: ~12.3.8 - prettier: ~2.7.1 + lint-staged: ~13.2.1 + prettier: ~2.8.7 rollup: ~2.67.3 - ts-jest: ~27.1.5 - typedoc: ~0.22.18 - typescript: ~4.9.4 + ts-jest: ~29.1.0 + typedoc: ~0.24.1 + typescript: ~5.0.4 languageName: unknown linkType: soft @@ -5857,33 +6111,34 @@ __metadata: "@rocket.chat/logo": "workspace:~" "@rocket.chat/prettier-config": "workspace:~" "@rocket.chat/styled": "workspace:~" - "@storybook/addon-essentials": ~6.5.15 - "@storybook/addons": ~6.5.15 - "@storybook/react": ~6.5.15 - "@storybook/source-loader": ~6.5.15 - "@storybook/theming": ~6.5.15 - "@types/jest": ~27.4.1 - "@types/react": ~17.0.53 - "@types/react-dom": ^17.0.18 + "@storybook/addon-essentials": ~6.5.16 + "@storybook/addons": ~6.5.16 + "@storybook/builder-webpack5": ~6.5.16 + "@storybook/manager-webpack5": ~6.5.16 + "@storybook/react": ~6.5.16 + "@storybook/theming": ~6.5.16 + "@types/jest": ~29.5.0 + "@types/react": ~17.0.57 + "@types/react-dom": ^17.0.19 bump: "workspace:~" countries-list: ^2.6.1 - eslint: ~8.26.0 + eslint: ~8.38.0 i18next: ~21.6.16 - jest: ~27.5.1 + jest: ~29.5.0 lint-all: "workspace:~" - lint-staged: ~12.3.8 + lint-staged: ~13.2.1 npm-run-all: ^4.1.5 - prettier: ~2.7.1 + prettier: ~2.8.7 react: ^17.0.2 + react-docgen-typescript-plugin: ~1.0.5 react-dom: ^17.0.2 react-hook-form: ~7.27.1 react-i18next: ~11.15.7 rimraf: ^3.0.2 storybook-dark-mode: ^1.1.2 - ts-jest: ~27.1.5 - tslib: ~2.3.1 - typedoc: ~0.22.18 - typescript: ~4.9.4 + ts-jest: ~29.1.0 + typedoc: ~0.24.1 + typescript: ~5.0.4 peerDependencies: "@rocket.chat/fuselage": "*" "@rocket.chat/fuselage-hooks": "*" @@ -5904,19 +6159,18 @@ __metadata: dependencies: "@rocket.chat/eslint-config-alt": "workspace:~" "@rocket.chat/prettier-config": "workspace:~" - "@types/node": ~15.14.9 + "@types/node": ~14.18.42 bump: "workspace:~" - eslint: ~8.26.0 + eslint: ~8.38.0 lint-all: "workspace:~" - lint-staged: ~12.3.8 + lint-staged: ~13.2.1 npm-run-all: ^4.1.5 peggy: 3.0.2 - prettier: ~2.7.1 + prettier: ~2.8.7 rimraf: ^3.0.2 - ts-jest: ~27.1.5 - tslib: ^2.3.1 - typescript: ~4.9.4 - webpack: ~5.76.0 + ts-jest: ~29.1.0 + typescript: ~5.0.4 + webpack: ~5.78.0 peerDependencies: peggy: "*" webpack: "*" @@ -5928,13 +6182,13 @@ __metadata: resolution: "@rocket.chat/prettier-config@workspace:packages/prettier-config" dependencies: bump: "workspace:~" - eslint: ~8.26.0 - eslint-config-prettier: ~8.5.0 + eslint: ~8.38.0 + eslint-config-prettier: ~8.8.0 eslint-plugin-import: ~2.26.0 eslint-plugin-prettier: ~4.2.1 lint-all: "workspace:~" - lint-staged: ~12.3.8 - prettier: ~2.7.1 + lint-staged: ~13.2.1 + prettier: ~2.8.7 peerDependencies: prettier: ~2.7.1 languageName: unknown @@ -5946,19 +6200,18 @@ __metadata: dependencies: "@rocket.chat/eslint-config-alt": "workspace:~" "@rocket.chat/prettier-config": "workspace:~" - "@types/jest": ~27.4.1 + "@types/jest": ~29.5.0 bump: "workspace:~" - eslint: ~8.26.0 - jest: ~27.5.1 + eslint: ~8.38.0 + jest: ~29.5.0 lint-all: "workspace:~" - lint-staged: ~12.3.8 + lint-staged: ~13.2.1 npm-run-all: ^4.1.5 - prettier: ~2.7.1 + prettier: ~2.8.7 rimraf: ^3.0.2 - ts-jest: ~27.1.5 - tslib: ^2.3.1 - typedoc: ~0.22.18 - typescript: ~4.9.4 + ts-jest: ~29.1.0 + typedoc: ~0.24.1 + typescript: ~5.0.4 languageName: unknown linkType: soft @@ -5969,19 +6222,18 @@ __metadata: "@rocket.chat/css-in-js": "workspace:~" "@rocket.chat/eslint-config-alt": "workspace:~" "@rocket.chat/prettier-config": "workspace:~" - "@types/jest": ~27.4.1 + "@types/jest": ~29.5.0 bump: "workspace:~" - eslint: ~8.26.0 - jest: ~27.5.1 + eslint: ~8.38.0 + jest: ~29.5.0 lint-all: "workspace:~" - lint-staged: ~12.3.8 + lint-staged: ~13.2.1 npm-run-all: ^4.1.5 - prettier: ~2.7.1 + prettier: ~2.8.7 rimraf: ^3.0.2 - ts-jest: ~27.1.5 - tslib: ^2.3.1 - typedoc: ~0.22.18 - typescript: ~4.9.4 + ts-jest: ~29.1.0 + typedoc: ~0.24.1 + typescript: ~5.0.4 languageName: unknown linkType: soft @@ -5992,20 +6244,19 @@ __metadata: "@rocket.chat/css-supports": "workspace:~" "@rocket.chat/eslint-config-alt": "workspace:~" "@rocket.chat/prettier-config": "workspace:~" - "@types/jest": ~27.4.1 + "@types/jest": ~29.5.0 bump: "workspace:~" - eslint: ~8.26.0 - jest: ~27.5.1 + eslint: ~8.38.0 + jest: ~29.5.0 lint-all: "workspace:~" - lint-staged: ~12.3.8 + lint-staged: ~13.2.1 npm-run-all: ^4.1.5 - prettier: ~2.7.1 + prettier: ~2.8.7 rimraf: ^3.0.2 stylis: 4.1.3 - ts-jest: ~27.1.5 - tslib: ^2.3.1 - typedoc: ~0.22.18 - typescript: ~4.9.4 + ts-jest: ~29.1.0 + typedoc: ~0.24.1 + typescript: ~5.0.4 peerDependencies: stylis: 4.0.10 languageName: unknown @@ -6015,28 +6266,28 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/ui-kit@workspace:packages/ui-kit" dependencies: - "@babel/core": ~7.19.6 - "@babel/eslint-parser": ~7.19.1 - "@babel/plugin-transform-runtime": ~7.19.6 - "@babel/preset-env": ~7.19.4 + "@babel/core": ~7.21.4 + "@babel/eslint-parser": ~7.21.3 + "@babel/plugin-transform-runtime": ~7.21.4 + "@babel/preset-env": ~7.21.4 "@rocket.chat/eslint-config-alt": "workspace:~" "@rocket.chat/prettier-config": "workspace:~" - "@types/jest": ~27.4.1 - babel-loader: ~8.2.5 + "@types/jest": ~29.5.0 + babel-loader: ~9.1.2 bump: "workspace:~" - eslint: ~8.26.0 - jest: ~27.5.1 + eslint: ~8.38.0 + jest: ~29.5.0 lint-all: "workspace:~" - lint-staged: ~12.3.8 + lint-staged: ~13.2.1 npm-run-all: ^4.1.5 - prettier: ~2.7.1 + prettier: ~2.8.7 rimraf: ^3.0.2 - ts-jest: ~27.1.5 + ts-jest: ~29.1.0 ts-loader: ~9.4.2 - typedoc: ~0.22.18 - typescript: ~4.9.4 - webpack: ~5.76.0 - webpack-cli: ~4.10.0 + typedoc: ~0.24.1 + typescript: ~5.0.4 + webpack: ~5.78.0 + webpack-cli: ~5.0.1 languageName: unknown linkType: soft @@ -6044,11 +6295,11 @@ __metadata: version: 0.0.0-use.local resolution: "@rocket.chat/uikit-playground@workspace:packages/uikit-playground" dependencies: - "@babel/eslint-parser": ^7.19.1 - "@codemirror/lang-javascript": ^6.1.2 + "@babel/eslint-parser": ~7.21.3 + "@codemirror/lang-javascript": ^6.1.5 "@codemirror/lang-json": ^6.0.1 "@codemirror/tooltip": ^0.19.16 - "@lezer/highlight": ^1.1.3 + "@lezer/highlight": ^1.1.4 "@rocket.chat/css-in-js": ^0.31.12 "@rocket.chat/eslint-config-alt": "workspace:~" "@rocket.chat/fuselage": "workspace:~" @@ -6059,31 +6310,31 @@ __metadata: "@rocket.chat/icons": "workspace:~" "@rocket.chat/logo": "workspace:~" "@rocket.chat/styled": "workspace:~" - "@types/jest": ^27.5.2 - "@types/node": ^16.11.36 - "@types/react": ^17.0.53 - "@types/react-beautiful-dnd": ^13.1.2 - "@types/react-dom": ^17.0.18 + "@types/jest": ^29.5.0 + "@types/node": ~14.18.42 + "@types/react": ^17.0.57 + "@types/react-beautiful-dnd": ^13.1.4 + "@types/react-dom": ^17.0.19 codemirror: ^6.0.1 - eslint: ~8.26.0 - eslint-plugin-import: ^2.26.0 + eslint: ~8.38.0 + eslint-plugin-import: ~2.26.0 eslint4b-prebuilt: ^6.7.2 gh-pages: ^4.0.0 json5: ^2.2.3 lint-all: "workspace:~" - lint-staged: ~12.3.8 - prettier: ~2.7.1 + lint-staged: ~13.2.1 + prettier: ~2.8.7 react: ^17.0.2 react-beautiful-dnd: ^13.1.1 react-dom: ^17.0.2 react-router-dom: ^6.3.0 - react-scripts: 5.0.1 + react-scripts: ^5.0.1 react-split-pane: ^0.1.92 react-virtuoso: ~3.1.5 - typescript: ~4.9.4 + typescript: ~5.0.4 use-subscription: ^1.7.0 web-vitals: ^2.1.4 - webpack: ^5.74.0 + webpack: ~5.78.0 languageName: unknown linkType: soft @@ -6220,6 +6471,13 @@ __metadata: languageName: node linkType: hard +"@sinclair/typebox@npm:^0.25.16": + version: 0.25.24 + resolution: "@sinclair/typebox@npm:0.25.24" + checksum: 10219c58f40b8414c50b483b0550445e9710d4fe7b2c4dccb9b66533dd90ba8e024acc776026cebe81e87f06fa24b07fdd7bc30dd277eb9cc386ec50151a3026 + languageName: node + linkType: hard + "@sindresorhus/is@npm:^4.0.0": version: 4.6.0 resolution: "@sindresorhus/is@npm:4.6.0" @@ -6236,6 +6494,24 @@ __metadata: languageName: node linkType: hard +"@sinonjs/commons@npm:^2.0.0": + version: 2.0.0 + resolution: "@sinonjs/commons@npm:2.0.0" + dependencies: + type-detect: 4.0.8 + checksum: 5023ba17edf2b85ed58262313b8e9b59e23c6860681a9af0200f239fe939e2b79736d04a260e8270ddd57196851dde3ba754d7230be5c5234e777ae2ca8af137 + languageName: node + linkType: hard + +"@sinonjs/fake-timers@npm:^10.0.2": + version: 10.0.2 + resolution: "@sinonjs/fake-timers@npm:10.0.2" + dependencies: + "@sinonjs/commons": ^2.0.0 + checksum: c62aa98e7cefda8dedc101ce227abc888dc46b8ff9706c5f0a8dfd9c3ada97d0a5611384738d9ba0b26b59f99c2ba24efece8e779bb08329e9e87358fa309824 + languageName: node + linkType: hard + "@sinonjs/fake-timers@npm:^8.0.1": version: 8.1.0 resolution: "@sinonjs/fake-timers@npm:8.1.0" @@ -6245,17 +6521,17 @@ __metadata: languageName: node linkType: hard -"@storybook/addon-actions@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/addon-actions@npm:6.5.15" +"@storybook/addon-actions@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/addon-actions@npm:6.5.16" dependencies: - "@storybook/addons": 6.5.15 - "@storybook/api": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/components": 6.5.15 - "@storybook/core-events": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/api": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/components": 6.5.16 + "@storybook/core-events": 6.5.16 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/theming": 6.5.15 + "@storybook/theming": 6.5.16 core-js: ^3.8.2 fast-deep-equal: ^3.1.3 global: ^4.4.0 @@ -6276,21 +6552,21 @@ __metadata: optional: true react-dom: optional: true - checksum: ce0ca5fddeb196adec7757dd287085c19d89d26506539d07445df3759eca9817a779f2923cc5fd7dfc9f515788628f6c0f604b10366659ca46562fab980c64f5 + checksum: d506a932f38412fc234cd58b5f2c8a0bfb8f3820b0ce8042234e9bf4bd277a2befc2d8458d061405ee72722206756375f471a22c37ea32f384259fcbb1a2b6a5 languageName: node linkType: hard -"@storybook/addon-backgrounds@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/addon-backgrounds@npm:6.5.15" +"@storybook/addon-backgrounds@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/addon-backgrounds@npm:6.5.16" dependencies: - "@storybook/addons": 6.5.15 - "@storybook/api": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/components": 6.5.15 - "@storybook/core-events": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/api": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/components": 6.5.16 + "@storybook/core-events": 6.5.16 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/theming": 6.5.15 + "@storybook/theming": 6.5.16 core-js: ^3.8.2 global: ^4.4.0 memoizerific: ^1.11.3 @@ -6305,23 +6581,23 @@ __metadata: optional: true react-dom: optional: true - checksum: 0fb44daed597ee8c90b29515e4a817f4968cf4f37a9d8605e547bd591fc0d44383354f7f11ffa3bdecd6ca5b70ddf5ca8e4f0078a68d4778e4e69b767b637cf7 + checksum: d10f0a6b5bf8f9974d3be08f1c30023f3148a0121456bf6296dbf70678f2591440e6fb5fd0643bc937a822c49284d81afeeed66f1b3de775d24c1149f402824b languageName: node linkType: hard -"@storybook/addon-controls@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/addon-controls@npm:6.5.15" +"@storybook/addon-controls@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/addon-controls@npm:6.5.16" dependencies: - "@storybook/addons": 6.5.15 - "@storybook/api": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/components": 6.5.15 - "@storybook/core-common": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/api": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/components": 6.5.16 + "@storybook/core-common": 6.5.16 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/node-logger": 6.5.15 - "@storybook/store": 6.5.15 - "@storybook/theming": 6.5.15 + "@storybook/node-logger": 6.5.16 + "@storybook/store": 6.5.16 + "@storybook/theming": 6.5.16 core-js: ^3.8.2 lodash: ^4.17.21 ts-dedent: ^2.0.0 @@ -6333,32 +6609,32 @@ __metadata: optional: true react-dom: optional: true - checksum: c87b01e035f7e0e6f3a1e864333c03e44f76ccd04a687cbe19cde59cfa1109eb2b124c288e1cf68c3a291dc6c28c056852aa2413c8157b92792ef339a33142ef + checksum: a9f1f577e5d991ae271c9823662adf65952554303094a2e0127bfe9d48e2415796628dadc3cfbc767600e21588336bfd9cb43da59fe76507b2186f6a61da34b8 languageName: node linkType: hard -"@storybook/addon-docs@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/addon-docs@npm:6.5.15" +"@storybook/addon-docs@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/addon-docs@npm:6.5.16" dependencies: "@babel/plugin-transform-react-jsx": ^7.12.12 "@babel/preset-env": ^7.12.11 "@jest/transform": ^26.6.2 "@mdx-js/react": ^1.6.22 - "@storybook/addons": 6.5.15 - "@storybook/api": 6.5.15 - "@storybook/components": 6.5.15 - "@storybook/core-common": 6.5.15 - "@storybook/core-events": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/api": 6.5.16 + "@storybook/components": 6.5.16 + "@storybook/core-common": 6.5.16 + "@storybook/core-events": 6.5.16 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/docs-tools": 6.5.15 + "@storybook/docs-tools": 6.5.16 "@storybook/mdx1-csf": ^0.0.1 - "@storybook/node-logger": 6.5.15 - "@storybook/postinstall": 6.5.15 - "@storybook/preview-web": 6.5.15 - "@storybook/source-loader": 6.5.15 - "@storybook/store": 6.5.15 - "@storybook/theming": 6.5.15 + "@storybook/node-logger": 6.5.16 + "@storybook/postinstall": 6.5.16 + "@storybook/preview-web": 6.5.16 + "@storybook/source-loader": 6.5.16 + "@storybook/store": 6.5.16 + "@storybook/theming": 6.5.16 babel-loader: ^8.0.0 core-js: ^3.8.2 fast-deep-equal: ^3.1.3 @@ -6380,26 +6656,26 @@ __metadata: optional: true react-dom: optional: true - checksum: 1c7bc47bccb6aa13c5619e20e2bf73c63a5ea9e1a37d4de4a4f25ff542955d0d4419a20f68ec5c588ec254576ec7227620cb982b8f57e175dd9aa810bab5b8eb - languageName: node - linkType: hard - -"@storybook/addon-essentials@npm:~6.5.15": - version: 6.5.15 - resolution: "@storybook/addon-essentials@npm:6.5.15" - dependencies: - "@storybook/addon-actions": 6.5.15 - "@storybook/addon-backgrounds": 6.5.15 - "@storybook/addon-controls": 6.5.15 - "@storybook/addon-docs": 6.5.15 - "@storybook/addon-measure": 6.5.15 - "@storybook/addon-outline": 6.5.15 - "@storybook/addon-toolbars": 6.5.15 - "@storybook/addon-viewport": 6.5.15 - "@storybook/addons": 6.5.15 - "@storybook/api": 6.5.15 - "@storybook/core-common": 6.5.15 - "@storybook/node-logger": 6.5.15 + checksum: 3203abc3af20bd8d22bda78c3c98b57f1c46ef29fe1942def0de687ddf08769592ec99d978048ed0aca82c13017b758392f644aaba40a0c0b68d2c61a9e5957d + languageName: node + linkType: hard + +"@storybook/addon-essentials@npm:~6.5.16": + version: 6.5.16 + resolution: "@storybook/addon-essentials@npm:6.5.16" + dependencies: + "@storybook/addon-actions": 6.5.16 + "@storybook/addon-backgrounds": 6.5.16 + "@storybook/addon-controls": 6.5.16 + "@storybook/addon-docs": 6.5.16 + "@storybook/addon-measure": 6.5.16 + "@storybook/addon-outline": 6.5.16 + "@storybook/addon-toolbars": 6.5.16 + "@storybook/addon-viewport": 6.5.16 + "@storybook/addons": 6.5.16 + "@storybook/api": 6.5.16 + "@storybook/core-common": 6.5.16 + "@storybook/node-logger": 6.5.16 core-js: ^3.8.2 regenerator-runtime: ^0.13.7 ts-dedent: ^2.0.0 @@ -6440,24 +6716,24 @@ __metadata: optional: true webpack: optional: true - checksum: 927672d89b74f6748868c7581c57d42d1954185703a5e4fded7db94dc615c35e3b92cde2f499653dc3d4c090630c659826384310e3897cf0baafaf95f0371c2f + checksum: f82a02d00f02c642dae01b2c6c32d48dc4647fe4adbf17d55bb517812d9e483a773084c1c5ceda39d7db5fdaebcaca324a28bb465e35fb524667ef2f5382b1d6 languageName: node linkType: hard -"@storybook/addon-interactions@npm:~6.5.15": - version: 6.5.15 - resolution: "@storybook/addon-interactions@npm:6.5.15" +"@storybook/addon-interactions@npm:~6.5.16": + version: 6.5.16 + resolution: "@storybook/addon-interactions@npm:6.5.16" dependencies: "@devtools-ds/object-inspector": ^1.1.2 - "@storybook/addons": 6.5.15 - "@storybook/api": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/components": 6.5.15 - "@storybook/core-common": 6.5.15 - "@storybook/core-events": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/api": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/components": 6.5.16 + "@storybook/core-common": 6.5.16 + "@storybook/core-events": 6.5.16 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/instrumenter": 6.5.15 - "@storybook/theming": 6.5.15 + "@storybook/instrumenter": 6.5.16 + "@storybook/theming": 6.5.16 core-js: ^3.8.2 global: ^4.4.0 jest-mock: ^27.0.6 @@ -6471,19 +6747,19 @@ __metadata: optional: true react-dom: optional: true - checksum: 50eadc405dafa4796474461321bbc142469815a0046aac6036371f3016892836128c4205732ea932243e086c60ed22126b277baef4b2a6b71d99a30420b6738f + checksum: cba31aa22e684c5551b9a7af95d949aa80286179324f1ef2a42e9f8be78109c140d730244bce1236af7dc157ba241bf567c3767ca99564162307ec377dffec48 languageName: node linkType: hard -"@storybook/addon-links@npm:~6.5.15": - version: 6.5.15 - resolution: "@storybook/addon-links@npm:6.5.15" +"@storybook/addon-links@npm:~6.5.16": + version: 6.5.16 + resolution: "@storybook/addon-links@npm:6.5.16" dependencies: - "@storybook/addons": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/core-events": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/core-events": 6.5.16 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/router": 6.5.15 + "@storybook/router": 6.5.16 "@types/qs": ^6.9.5 core-js: ^3.8.2 global: ^4.4.0 @@ -6499,19 +6775,19 @@ __metadata: optional: true react-dom: optional: true - checksum: ef40b02a3f48de2f591486fb04910e996bcb8d5fd406e2d6b81752659551b366ffc64f6cfdb461585e52c0ae98fa102be8595678e63a27171f9e2a0e20869bd6 + checksum: 40fa5fcd98df3be50b3587efda79ddf0156eb0078dd0afec43e81e961475bc8583feec1314baabe59fe2dc8e5b9b4bb4a738435172c208f828d1538cd59882fe languageName: node linkType: hard -"@storybook/addon-measure@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/addon-measure@npm:6.5.15" +"@storybook/addon-measure@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/addon-measure@npm:6.5.16" dependencies: - "@storybook/addons": 6.5.15 - "@storybook/api": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/components": 6.5.15 - "@storybook/core-events": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/api": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/components": 6.5.16 + "@storybook/core-events": 6.5.16 "@storybook/csf": 0.0.2--canary.4566f4d.1 core-js: ^3.8.2 global: ^4.4.0 @@ -6523,19 +6799,19 @@ __metadata: optional: true react-dom: optional: true - checksum: b72171498a77bd3a33beeac48db76cbc9b0ef8099c17c1cc20add122061f988c20206fb7b1c3e9e3b06a47d77c250eb8c8d6e3e5d16df2c2daa5d92f637ac09b + checksum: 52fc33249679bb19fdd4e7285436b925832f3d18c223c495cea2b90aa68f08bc626199064eead88ea339ce7e7fa73940daf220e4408ccd4dfd3841288dc645e4 languageName: node linkType: hard -"@storybook/addon-outline@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/addon-outline@npm:6.5.15" +"@storybook/addon-outline@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/addon-outline@npm:6.5.16" dependencies: - "@storybook/addons": 6.5.15 - "@storybook/api": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/components": 6.5.15 - "@storybook/core-events": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/api": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/components": 6.5.16 + "@storybook/core-events": 6.5.16 "@storybook/csf": 0.0.2--canary.4566f4d.1 core-js: ^3.8.2 global: ^4.4.0 @@ -6549,19 +6825,19 @@ __metadata: optional: true react-dom: optional: true - checksum: 2af230ca0ac5ead7d10f273b210f56de45e808ac856313b674d0bd8c1646daae9207fe798cf591b25e7d85b3889106d99eccb21b62166da46243a8c056b49183 + checksum: cb838ecbbdb446552aab891e5fadef6663acf4b16b2bdc18b9a86c01866ccefff0129d9fb7d801604c43946fff5afdcb2c11a1a7813319948a08351c9f35bf46 languageName: node linkType: hard -"@storybook/addon-toolbars@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/addon-toolbars@npm:6.5.15" +"@storybook/addon-toolbars@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/addon-toolbars@npm:6.5.16" dependencies: - "@storybook/addons": 6.5.15 - "@storybook/api": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/components": 6.5.15 - "@storybook/theming": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/api": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/components": 6.5.16 + "@storybook/theming": 6.5.16 core-js: ^3.8.2 regenerator-runtime: ^0.13.7 peerDependencies: @@ -6572,20 +6848,20 @@ __metadata: optional: true react-dom: optional: true - checksum: e9fbcd453b17cf9822fff18db9cfca8cc09a4e03ea2c9f8d864c7666c4026925e414eb8b0c11fe197f427fb0afc1761c2f452371bf13d67880f2aa684641897c + checksum: 7a30259bef831769db3e8d76ad439cc5deec919abf47b27a9d0143a581434748d2c8868fbbf8b9cce2910fd61f2200415b6ab5bc0dfab02436fbea2c312da770 languageName: node linkType: hard -"@storybook/addon-viewport@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/addon-viewport@npm:6.5.15" +"@storybook/addon-viewport@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/addon-viewport@npm:6.5.16" dependencies: - "@storybook/addons": 6.5.15 - "@storybook/api": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/components": 6.5.15 - "@storybook/core-events": 6.5.15 - "@storybook/theming": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/api": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/components": 6.5.16 + "@storybook/core-events": 6.5.16 + "@storybook/theming": 6.5.16 core-js: ^3.8.2 global: ^4.4.0 memoizerific: ^1.11.3 @@ -6599,21 +6875,21 @@ __metadata: optional: true react-dom: optional: true - checksum: b4b4bc26c36724a0afbb304d5b90ca44f16cdcd05f1460ac189a45526f5c2e171d903a1791c5e414d5d638195cbed3b006a85284b83e9e51b7574b2d3f24ee77 + checksum: 4b1de32b85b305c22b976bae040c360063d6152c5077930953cc9cb565735a516c1d239b0670f9a8218264aabff9e8d6c4336fdb70698765009791f24c0fc867 languageName: node linkType: hard -"@storybook/addons@npm:6.5.15, @storybook/addons@npm:^6.0.0, @storybook/addons@npm:~6.5.15": - version: 6.5.15 - resolution: "@storybook/addons@npm:6.5.15" +"@storybook/addons@npm:6.5.16, @storybook/addons@npm:^6.0.0, @storybook/addons@npm:~6.5.16": + version: 6.5.16 + resolution: "@storybook/addons@npm:6.5.16" dependencies: - "@storybook/api": 6.5.15 - "@storybook/channels": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/core-events": 6.5.15 + "@storybook/api": 6.5.16 + "@storybook/channels": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/core-events": 6.5.16 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/router": 6.5.15 - "@storybook/theming": 6.5.15 + "@storybook/router": 6.5.16 + "@storybook/theming": 6.5.16 "@types/webpack-env": ^1.16.0 core-js: ^3.8.2 global: ^4.4.0 @@ -6621,21 +6897,21 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 9de4cb9ff51cde37c456a0315f47c751daf4412a8d90321b5249a9b05f48a44dc48f01bbf83c9f369f63232da423d58ed47e4c03d50d16a8835d372022095b70 + checksum: 0463150e4cf7bd2b2aaafdbaadfb4420e4e0a31eb651cfc1a2d7f4b4974caf67878712602474585dfa18f583000608598045594909959d2e9e2ec32ba004392d languageName: node linkType: hard -"@storybook/api@npm:6.5.15, @storybook/api@npm:^6.0.0": - version: 6.5.15 - resolution: "@storybook/api@npm:6.5.15" +"@storybook/api@npm:6.5.16, @storybook/api@npm:^6.0.0": + version: 6.5.16 + resolution: "@storybook/api@npm:6.5.16" dependencies: - "@storybook/channels": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/core-events": 6.5.15 + "@storybook/channels": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/core-events": 6.5.16 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/router": 6.5.15 + "@storybook/router": 6.5.16 "@storybook/semver": ^7.3.2 - "@storybook/theming": 6.5.15 + "@storybook/theming": 6.5.16 core-js: ^3.8.2 fast-deep-equal: ^3.1.3 global: ^4.4.0 @@ -6649,31 +6925,31 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: cebf1b70309c9c4a135c4ad8d3ebd85d01cfa4942e43231831e67514604199d3ed26395bbe0f89954718498a800085bd7d6eaef61c5d702e3a669532a227bd93 + checksum: c873189ac1e501825d647903baa125899c492cee962cb86ebb7455110bd09194eeb6943f5c58a1f808ce4ee2e20e305f5604a4e60b07003c82a6fc6ceaee5ea9 languageName: node linkType: hard -"@storybook/builder-webpack4@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/builder-webpack4@npm:6.5.15" +"@storybook/builder-webpack4@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/builder-webpack4@npm:6.5.16" dependencies: "@babel/core": ^7.12.10 - "@storybook/addons": 6.5.15 - "@storybook/api": 6.5.15 - "@storybook/channel-postmessage": 6.5.15 - "@storybook/channels": 6.5.15 - "@storybook/client-api": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/components": 6.5.15 - "@storybook/core-common": 6.5.15 - "@storybook/core-events": 6.5.15 - "@storybook/node-logger": 6.5.15 - "@storybook/preview-web": 6.5.15 - "@storybook/router": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/api": 6.5.16 + "@storybook/channel-postmessage": 6.5.16 + "@storybook/channels": 6.5.16 + "@storybook/client-api": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/components": 6.5.16 + "@storybook/core-common": 6.5.16 + "@storybook/core-events": 6.5.16 + "@storybook/node-logger": 6.5.16 + "@storybook/preview-web": 6.5.16 + "@storybook/router": 6.5.16 "@storybook/semver": ^7.3.2 - "@storybook/store": 6.5.15 - "@storybook/theming": 6.5.15 - "@storybook/ui": 6.5.15 + "@storybook/store": 6.5.16 + "@storybook/theming": 6.5.16 + "@storybook/ui": 6.5.16 "@types/node": ^14.0.10 || ^16.0.0 "@types/webpack": ^4.41.26 autoprefixer: ^9.8.6 @@ -6710,30 +6986,30 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: bd676e9302d34445884376582c5d4cfe854ed8e64a9df6bbdcc76ef433534e65a23b1bf20c7225e85d21a27e1f1d905d0accd821fdef08afcd76569a8c8977c2 + checksum: 5e9137c390db00b4e166df3ca730eb1748f6bac92c841f3f75c37ad5277d6f5565f899de3bb0357fc51ce6821c8a8a8adba724e3dd7a3d1cc80816e09e5b7128 languageName: node linkType: hard -"@storybook/builder-webpack5@npm:~6.5.15": - version: 6.5.15 - resolution: "@storybook/builder-webpack5@npm:6.5.15" +"@storybook/builder-webpack5@npm:~6.5.16": + version: 6.5.16 + resolution: "@storybook/builder-webpack5@npm:6.5.16" dependencies: "@babel/core": ^7.12.10 - "@storybook/addons": 6.5.15 - "@storybook/api": 6.5.15 - "@storybook/channel-postmessage": 6.5.15 - "@storybook/channels": 6.5.15 - "@storybook/client-api": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/components": 6.5.15 - "@storybook/core-common": 6.5.15 - "@storybook/core-events": 6.5.15 - "@storybook/node-logger": 6.5.15 - "@storybook/preview-web": 6.5.15 - "@storybook/router": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/api": 6.5.16 + "@storybook/channel-postmessage": 6.5.16 + "@storybook/channels": 6.5.16 + "@storybook/client-api": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/components": 6.5.16 + "@storybook/core-common": 6.5.16 + "@storybook/core-events": 6.5.16 + "@storybook/node-logger": 6.5.16 + "@storybook/preview-web": 6.5.16 + "@storybook/router": 6.5.16 "@storybook/semver": ^7.3.2 - "@storybook/store": 6.5.15 - "@storybook/theming": 6.5.15 + "@storybook/store": 6.5.16 + "@storybook/theming": 6.5.16 "@types/node": ^14.0.10 || ^16.0.0 babel-loader: ^8.0.0 babel-plugin-named-exports-order: ^0.0.2 @@ -6762,60 +7038,60 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 9bde333540c41c55e7687b1230fdd92926074df1a3be900b969d6d9eea240fb962b6fafb59e5c3fe83eeb42e0f0c835d2e226fc332f460f8aba0f4f49d833ffd + checksum: 0a6631f307c5ac56423860216d42ed95757906b004e949ed3dc2cce4f81d83d38de5cddbae65a0e65083eece6e4e8af05f6aabf5d78a80a7a7f62cf157a4e577 languageName: node linkType: hard -"@storybook/channel-postmessage@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/channel-postmessage@npm:6.5.15" +"@storybook/channel-postmessage@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/channel-postmessage@npm:6.5.16" dependencies: - "@storybook/channels": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/core-events": 6.5.15 + "@storybook/channels": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/core-events": 6.5.16 core-js: ^3.8.2 global: ^4.4.0 qs: ^6.10.0 telejson: ^6.0.8 - checksum: 7a09ba5bf163f8f5fef0bfd99eaab6c6391fa854e86bb44fcd0586bb73dd4ab5827cc23b7b38f993b81cbdb2ff8d58f81371be9301ddb3ea6f963ba560a42f09 + checksum: d3560d81dbf4710cc23b227c12be328d87e627581afcb5fec959f1e795fb2b5824db2a7f03a4ddcd185ec9a37a7025415d8bb43b7a245f2466395908eb3e9bc3 languageName: node linkType: hard -"@storybook/channel-websocket@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/channel-websocket@npm:6.5.15" +"@storybook/channel-websocket@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/channel-websocket@npm:6.5.16" dependencies: - "@storybook/channels": 6.5.15 - "@storybook/client-logger": 6.5.15 + "@storybook/channels": 6.5.16 + "@storybook/client-logger": 6.5.16 core-js: ^3.8.2 global: ^4.4.0 telejson: ^6.0.8 - checksum: c482b18b28f06644f684ed2b88ab53d6c5853925343e60a50a9bcfb2888123c4accfe30b51743905693e4d73c32c77e30d6dbaba377b486bee6e51faae39cf85 + checksum: 355c85f22d7cc65764871852debe347c43c3fe92d6a0caa64aecbe2dce78d4bf73b98e997099f9e4e7c204ad5821b979939b0700e446fa26478c1e1ba48e7380 languageName: node linkType: hard -"@storybook/channels@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/channels@npm:6.5.15" +"@storybook/channels@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/channels@npm:6.5.16" dependencies: core-js: ^3.8.2 ts-dedent: ^2.0.0 util-deprecate: ^1.0.2 - checksum: 7963c34246b3cc84bb6fb0965834110d9b839a5c32cced0756948e4e88fb8bf23a0d584723abbab6d30a6282fa1023017bb82eba68c23389652c77d8d33cb4f9 + checksum: 3d7f7bc19ed7b250976e00e02ab544408806b439106bed18a5db9815612f6c5df9bdf7c1a97b5a40ba3194184ebe7e4c75e2bca5496025d6b26afefa95cfccbd languageName: node linkType: hard -"@storybook/client-api@npm:6.5.15, @storybook/client-api@npm:~6.5.15": - version: 6.5.15 - resolution: "@storybook/client-api@npm:6.5.15" +"@storybook/client-api@npm:6.5.16, @storybook/client-api@npm:~6.5.16": + version: 6.5.16 + resolution: "@storybook/client-api@npm:6.5.16" dependencies: - "@storybook/addons": 6.5.15 - "@storybook/channel-postmessage": 6.5.15 - "@storybook/channels": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/core-events": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/channel-postmessage": 6.5.16 + "@storybook/channels": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/core-events": 6.5.16 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/store": 6.5.15 + "@storybook/store": 6.5.16 "@types/qs": ^6.9.5 "@types/webpack-env": ^1.16.0 core-js: ^3.8.2 @@ -6832,27 +7108,27 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 0c3b3f7febe16b00beb4aeafe79fd97cc4a6b4db868e37002856fc34878bc955336929362b3015ba1688b47131ca0b729c94ee70f69855da0e819dad6d48ee1b + checksum: a62276fa67d2c3cc766ea9145d3798c0c8ef3f9de9fb18e7c43d67e39226f47a2546c4319ccc6075545df65dc4fc65bdb97e904062daf426be6534767eacada6 languageName: node linkType: hard -"@storybook/client-logger@npm:6.5.15, @storybook/client-logger@npm:^6.4.0": - version: 6.5.15 - resolution: "@storybook/client-logger@npm:6.5.15" +"@storybook/client-logger@npm:6.5.16, @storybook/client-logger@npm:^6.4.0": + version: 6.5.16 + resolution: "@storybook/client-logger@npm:6.5.16" dependencies: core-js: ^3.8.2 global: ^4.4.0 - checksum: cee16aea089b60b33ad643bde5e0d62274230d38e2033f0bfd0780fc092bc24b5acff63a6c569c9db989e59b89518ec964d0665a51548450716c4c50d3a3e66e + checksum: 0a86959b1bacb1b893e282173b48afe9c857b8cdc67a47ad87a7f11ba7dbc15ebc4f0d05c07dffb988e0cd3e1de0f09f300ee06c66afe4c50e9be83aaed75971 languageName: node linkType: hard -"@storybook/components@npm:6.5.15, @storybook/components@npm:^6.0.0": - version: 6.5.15 - resolution: "@storybook/components@npm:6.5.15" +"@storybook/components@npm:6.5.16, @storybook/components@npm:^6.0.0": + version: 6.5.16 + resolution: "@storybook/components@npm:6.5.16" dependencies: - "@storybook/client-logger": 6.5.15 + "@storybook/client-logger": 6.5.16 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/theming": 6.5.15 + "@storybook/theming": 6.5.16 core-js: ^3.8.2 memoizerific: ^1.11.3 qs: ^6.10.0 @@ -6861,24 +7137,24 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: c405643a002b7770567aba3f0e43cad975fbb0f728148f82c46c35b13958d3f6900eed619a60f22c0ee923c20828026d5f1c77cd950d21ebfd6cf57f8e64f791 + checksum: 1caf822bf1293ca043822f1c77f05c0f01631e8a61adad6bc4651ba9be78c8f4822ba0905e39c8feaa3fb44ae10422e9ccd3004348b18531fb82c54cfcea4fa9 languageName: node linkType: hard -"@storybook/core-client@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/core-client@npm:6.5.15" +"@storybook/core-client@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/core-client@npm:6.5.16" dependencies: - "@storybook/addons": 6.5.15 - "@storybook/channel-postmessage": 6.5.15 - "@storybook/channel-websocket": 6.5.15 - "@storybook/client-api": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/core-events": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/channel-postmessage": 6.5.16 + "@storybook/channel-websocket": 6.5.16 + "@storybook/client-api": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/core-events": 6.5.16 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/preview-web": 6.5.15 - "@storybook/store": 6.5.15 - "@storybook/ui": 6.5.15 + "@storybook/preview-web": 6.5.16 + "@storybook/store": 6.5.16 + "@storybook/ui": 6.5.16 airbnb-js-shims: ^2.2.1 ansi-to-html: ^0.6.11 core-js: ^3.8.2 @@ -6896,13 +7172,13 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 60f03d031fa87a1a116b0ccbffd2270b8d28757d89c17af6eb368224603dfd0d219fd5ac086bf859cb8bda0f80b444195c7df94c4486107b9c5a6fbab29c65ac + checksum: 467710777ddd740c431cf65035ecc489daae2fc5f4844a40b7339b806535e239140f40442a0e1d89356e107169c39d9e84d726c01982ed4609c043b6861e0778 languageName: node linkType: hard -"@storybook/core-common@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/core-common@npm:6.5.15" +"@storybook/core-common@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/core-common@npm:6.5.16" dependencies: "@babel/core": ^7.12.10 "@babel/plugin-proposal-class-properties": ^7.12.1 @@ -6926,7 +7202,7 @@ __metadata: "@babel/preset-react": ^7.12.10 "@babel/preset-typescript": ^7.12.7 "@babel/register": ^7.12.1 - "@storybook/node-logger": 6.5.15 + "@storybook/node-logger": 6.5.16 "@storybook/semver": ^7.3.2 "@types/node": ^14.0.10 || ^16.0.0 "@types/pretty-hrtime": ^1.0.0 @@ -6943,7 +7219,7 @@ __metadata: glob: ^7.1.6 handlebars: ^4.7.7 interpret: ^2.2.0 - json5: ^2.1.3 + json5: ^2.2.3 lazy-universal-dotenv: ^3.0.1 picomatch: ^2.3.0 pkg-dir: ^5.0.0 @@ -6960,35 +7236,35 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 9c19c348137bea23295ff330d3a62d3551b6a8a2933f254f3f1cace4ef05e46b6c97e0cbca67cc5be45164e223d5ff52eced54b76564891c8a2dd085e3be4cc4 + checksum: 886a701876599939950c3c98e306b373cd026c7b995ca08d88475b3f35624a53763459d6b202728ec703e99126813a254b956c2d0fe7e85f99dcb5765a999b19 languageName: node linkType: hard -"@storybook/core-events@npm:6.5.15, @storybook/core-events@npm:^6.0.0": - version: 6.5.15 - resolution: "@storybook/core-events@npm:6.5.15" +"@storybook/core-events@npm:6.5.16, @storybook/core-events@npm:^6.0.0": + version: 6.5.16 + resolution: "@storybook/core-events@npm:6.5.16" dependencies: core-js: ^3.8.2 - checksum: 89916720933bc4de0b1f25c7cb1b8580d3cdd213b21a360f18ebd0b790cce2c641696282fee29bbc482ab2cc656271b2f0569f79559d90fb01fb16473421e79e + checksum: 1844bdabfb7828af7ddd54129fbb321bf65d8b65459eaac99c8f3f94c7c2f0ee000468362758076444083f863a3bc835ecd1e4f2128524eb5c00c8a576473bc9 languageName: node linkType: hard -"@storybook/core-server@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/core-server@npm:6.5.15" +"@storybook/core-server@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/core-server@npm:6.5.16" dependencies: "@discoveryjs/json-ext": ^0.5.3 - "@storybook/builder-webpack4": 6.5.15 - "@storybook/core-client": 6.5.15 - "@storybook/core-common": 6.5.15 - "@storybook/core-events": 6.5.15 + "@storybook/builder-webpack4": 6.5.16 + "@storybook/core-client": 6.5.16 + "@storybook/core-common": 6.5.16 + "@storybook/core-events": 6.5.16 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/csf-tools": 6.5.15 - "@storybook/manager-webpack4": 6.5.15 - "@storybook/node-logger": 6.5.15 + "@storybook/csf-tools": 6.5.16 + "@storybook/manager-webpack4": 6.5.16 + "@storybook/node-logger": 6.5.16 "@storybook/semver": ^7.3.2 - "@storybook/store": 6.5.15 - "@storybook/telemetry": 6.5.15 + "@storybook/store": 6.5.16 + "@storybook/telemetry": 6.5.16 "@types/node": ^14.0.10 || ^16.0.0 "@types/node-fetch": ^2.5.7 "@types/pretty-hrtime": ^1.0.0 @@ -7032,16 +7308,16 @@ __metadata: optional: true typescript: optional: true - checksum: 927085bd6e2c9cf756795760c5647ed5b40151e94a192e64313091fda8a06993541ecabb9c730cb01eb8baef0613b73ff63824812cfd7b8bbed3fd2ead8d1f18 + checksum: 2027adba39b2e0a5c3664241f48ec256a92866755aace96f3b8e2064b50237bbcd4e814bc58a1084006baae41c48d7d0eccefc9867d84e17d68d7f969e65f149 languageName: node linkType: hard -"@storybook/core@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/core@npm:6.5.15" +"@storybook/core@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/core@npm:6.5.16" dependencies: - "@storybook/core-client": 6.5.15 - "@storybook/core-server": 6.5.15 + "@storybook/core-client": 6.5.16 + "@storybook/core-server": 6.5.16 peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -7053,13 +7329,13 @@ __metadata: optional: true typescript: optional: true - checksum: a7eca427b14a9c1f557d598e7ac599dc120d382d3d762437b3b6ebb4638b19a74e48f9e8e526365951ec623d10b82d67279226d7e6ff54ac095afee02992e666 + checksum: f1732338741692007230a351419ef3aa4e387810d7d0c0e6ffb1159e1de4d757199f2b543cf4f6413fc40acda514b908d2fd9b3e0d56e3f6cec1e3a82c2fcc10 languageName: node linkType: hard -"@storybook/csf-tools@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/csf-tools@npm:6.5.15" +"@storybook/csf-tools@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/csf-tools@npm:6.5.16" dependencies: "@babel/core": ^7.12.10 "@babel/generator": ^7.12.11 @@ -7080,7 +7356,7 @@ __metadata: peerDependenciesMeta: "@storybook/mdx2-csf": optional: true - checksum: d7faafd175b232bb8fa6008ae6db5a40619a158ed7556686649dee665ac0cbbdb3cc404d2b9c0314ba7783c3f5baf1d87788f324d24136bd0f8cc671d573208b + checksum: ee71a47d90186c35fc1dbcb6ece2888ff4d730bde823bb1bd242d802b74045b482d2c469f3a91687b691b6f828ce449b182896d1912033846b9746457ee960ba languageName: node linkType: hard @@ -7102,18 +7378,18 @@ __metadata: languageName: node linkType: hard -"@storybook/docs-tools@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/docs-tools@npm:6.5.15" +"@storybook/docs-tools@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/docs-tools@npm:6.5.16" dependencies: "@babel/core": ^7.12.10 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/store": 6.5.15 + "@storybook/store": 6.5.16 core-js: ^3.8.2 doctrine: ^3.0.0 lodash: ^4.17.21 regenerator-runtime: ^0.13.7 - checksum: 051239a82cff47dbc52fae112c4c144d6e103cbb169c239b0a99fb0cb3e82fba2e460c9487469fafc19ee81ef2ecc33d59b05457c3c74375685de0f537460071 + checksum: 6351c5b1cbe5820f0f0dfcc3e4e7da8cca3c8d73a06c5803e65cb86e9e81ccbae53cec8e1b579af0ac9a5bbb6d4b6ac03ffe26af2220dc5dfe8f065067f0e2d7 languageName: node linkType: hard @@ -7126,16 +7402,16 @@ __metadata: languageName: node linkType: hard -"@storybook/instrumenter@npm:6.5.15, @storybook/instrumenter@npm:^6.4.0": - version: 6.5.15 - resolution: "@storybook/instrumenter@npm:6.5.15" +"@storybook/instrumenter@npm:6.5.16, @storybook/instrumenter@npm:^6.4.0": + version: 6.5.16 + resolution: "@storybook/instrumenter@npm:6.5.16" dependencies: - "@storybook/addons": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/core-events": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/core-events": 6.5.16 core-js: ^3.8.2 global: ^4.4.0 - checksum: ca9bee2e7ad42302614f27c669e4d247527bb58865e3c72b8fc58d3afb1c1466908cf54434f9a48cbd617389b8392382ef2bb67d614b499c18ece677e0de242a + checksum: f22bb4adfa848121d897a6a21e12bfe32d0e809be3480c99f681f2b6a6630b0cb93a63a4a1abea3a0e35411c4959f36fd9160e7e540cc219d45d35dce7746db6 languageName: node linkType: hard @@ -7151,19 +7427,19 @@ __metadata: languageName: node linkType: hard -"@storybook/manager-webpack4@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/manager-webpack4@npm:6.5.15" +"@storybook/manager-webpack4@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/manager-webpack4@npm:6.5.16" dependencies: "@babel/core": ^7.12.10 "@babel/plugin-transform-template-literals": ^7.12.1 "@babel/preset-react": ^7.12.10 - "@storybook/addons": 6.5.15 - "@storybook/core-client": 6.5.15 - "@storybook/core-common": 6.5.15 - "@storybook/node-logger": 6.5.15 - "@storybook/theming": 6.5.15 - "@storybook/ui": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/core-client": 6.5.16 + "@storybook/core-common": 6.5.16 + "@storybook/node-logger": 6.5.16 + "@storybook/theming": 6.5.16 + "@storybook/ui": 6.5.16 "@types/node": ^14.0.10 || ^16.0.0 "@types/webpack": ^4.41.26 babel-loader: ^8.0.0 @@ -7196,23 +7472,23 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: de7b2624bf44cf4eb59839ac756e9e28715caae1d5efdfbd1e2cefb55a385cf80f3a651a29ed75a905f825d6b299ba46c3cd71068eecb3b985b5a315ed03470b + checksum: 873c871c822ecde30fbd95e9517549a18c5bb2de46d6160d6dcd7c1b5635fda2073b5bc4bd4d87e72de6e8df8bccf39b81f062e07cd7a23ffb4b43293e488fbb languageName: node linkType: hard -"@storybook/manager-webpack5@npm:~6.5.15": - version: 6.5.15 - resolution: "@storybook/manager-webpack5@npm:6.5.15" +"@storybook/manager-webpack5@npm:~6.5.16": + version: 6.5.16 + resolution: "@storybook/manager-webpack5@npm:6.5.16" dependencies: "@babel/core": ^7.12.10 "@babel/plugin-transform-template-literals": ^7.12.1 "@babel/preset-react": ^7.12.10 - "@storybook/addons": 6.5.15 - "@storybook/core-client": 6.5.15 - "@storybook/core-common": 6.5.15 - "@storybook/node-logger": 6.5.15 - "@storybook/theming": 6.5.15 - "@storybook/ui": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/core-client": 6.5.16 + "@storybook/core-common": 6.5.16 + "@storybook/node-logger": 6.5.16 + "@storybook/theming": 6.5.16 + "@storybook/ui": 6.5.16 "@types/node": ^14.0.10 || ^16.0.0 babel-loader: ^8.0.0 case-sensitive-paths-webpack-plugin: ^2.3.0 @@ -7242,7 +7518,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 99f18a752230fa6360b216e3a7f85c70fe92baf01677571653b4f9fd62735d9ab12a0b91e4ae7eabd66b03f37e0b58f01fad8e5880a8e2012a98f6aedc944da1 + checksum: 1349c6b2af9d0cebc3c35c929e2ea0f9ff8d12f7a04c30126160d9c89a45b92412218304abda9126cf96303a2d73fb288a689a191fec12b0189f19e5f2032977 languageName: node linkType: hard @@ -7265,38 +7541,38 @@ __metadata: languageName: node linkType: hard -"@storybook/node-logger@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/node-logger@npm:6.5.15" +"@storybook/node-logger@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/node-logger@npm:6.5.16" dependencies: "@types/npmlog": ^4.1.2 chalk: ^4.1.0 core-js: ^3.8.2 npmlog: ^5.0.1 pretty-hrtime: ^1.0.3 - checksum: 9c01127d3b57db7a85759d2f179afec0e1207c0754e80e22472e73468f831e1dafa2a5bf1047e54f92d47b5103325c157c14655208a6ddcdb8f9e7ee0b256e48 + checksum: 4ae47c03b6cec6b820e0e482e6f6675bf745fca5c124eb919240c0339b9f4a1b110c8fde7c5ddbc1748d3992773c61d37ba1f5c489b42279cf03517d4e1d51c5 languageName: node linkType: hard -"@storybook/postinstall@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/postinstall@npm:6.5.15" +"@storybook/postinstall@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/postinstall@npm:6.5.16" dependencies: core-js: ^3.8.2 - checksum: 868a53854c35d08a504b7900a155399aa6bf26f0d08186b4a6240fb5172bdd98f740cb0a8ad492dd67bfe96159952bd6b7db25bdc09c64e7437217efe196be79 + checksum: 023a19a0681675ce51f4acebf068f372e8657520680c67171c0a1b458f6009d1e444daa5680eeae7efb1088df184fbee61008548a73131d976201961dad65266 languageName: node linkType: hard -"@storybook/preview-web@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/preview-web@npm:6.5.15" +"@storybook/preview-web@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/preview-web@npm:6.5.16" dependencies: - "@storybook/addons": 6.5.15 - "@storybook/channel-postmessage": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/core-events": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/channel-postmessage": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/core-events": 6.5.16 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/store": 6.5.15 + "@storybook/store": 6.5.16 ansi-to-html: ^0.6.11 core-js: ^3.8.2 global: ^4.4.0 @@ -7310,7 +7586,7 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: fc178af772f39fcfe1b9926bf62bd7642984080442e8f7f2a0c6fe421513f9930ff5ccfea302d212199adf418c4bf9fc498ff65c30ad6e1cdd1b485a6d92b190 + checksum: 6161c96e9ee459ef93c3d972374ce339ae57d0c5fa25730007484e4824f79a34814110431db97031107558e5ce41259710f8a54564e8975db0215b78c5572a1b languageName: node linkType: hard @@ -7332,23 +7608,23 @@ __metadata: languageName: node linkType: hard -"@storybook/react@npm:~6.5.15": - version: 6.5.15 - resolution: "@storybook/react@npm:6.5.15" +"@storybook/react@npm:~6.5.16": + version: 6.5.16 + resolution: "@storybook/react@npm:6.5.16" dependencies: "@babel/preset-flow": ^7.12.1 "@babel/preset-react": ^7.12.10 "@pmmmwh/react-refresh-webpack-plugin": ^0.5.3 - "@storybook/addons": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/core": 6.5.15 - "@storybook/core-common": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/core": 6.5.16 + "@storybook/core-common": 6.5.16 "@storybook/csf": 0.0.2--canary.4566f4d.1 - "@storybook/docs-tools": 6.5.15 - "@storybook/node-logger": 6.5.15 + "@storybook/docs-tools": 6.5.16 + "@storybook/node-logger": 6.5.16 "@storybook/react-docgen-typescript-plugin": 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0 "@storybook/semver": ^7.3.2 - "@storybook/store": 6.5.15 + "@storybook/store": 6.5.16 "@types/estree": ^0.0.51 "@types/node": ^14.14.20 || ^16.0.0 "@types/webpack-env": ^1.16.0 @@ -7393,15 +7669,15 @@ __metadata: build-storybook: bin/build.js start-storybook: bin/index.js storybook-server: bin/index.js - checksum: c36f9a2401633b9632e5fce05bb43e8ea0a5338c8f0dc9e0da5eb87c7cfd1a3ef819124499679a3c797fbbe8278f03794d757563f388136a349e3815747036ae + checksum: c5396e748ef13acdb2590dc15ff0b3d95d3599abd0c372786d707164d3f71e46836240195dcd6f4bce6f90d2792602f6d31373fc87e069ef3c73a63d1e9a1289 languageName: node linkType: hard -"@storybook/router@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/router@npm:6.5.15" +"@storybook/router@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/router@npm:6.5.16" dependencies: - "@storybook/client-logger": 6.5.15 + "@storybook/client-logger": 6.5.16 core-js: ^3.8.2 memoizerific: ^1.11.3 qs: ^6.10.0 @@ -7409,7 +7685,7 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: d5ac1ac0d161e53764411dc84febed3819c5cefe669f2933434bcdc25bf011f89d2df2a504af8bf77f454e6598a74c794a17d01aad734c6ebe28cc13c490fff9 + checksum: 2812b93997026b1d85f02072d04f18e98e24de288efb73402f8d15ececd390e13dc620ef011268e09986c629f497ffa03230c2431e89b4e37c01b70761be2c6d languageName: node linkType: hard @@ -7425,12 +7701,12 @@ __metadata: languageName: node linkType: hard -"@storybook/source-loader@npm:6.5.15, @storybook/source-loader@npm:~6.5.15": - version: 6.5.15 - resolution: "@storybook/source-loader@npm:6.5.15" +"@storybook/source-loader@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/source-loader@npm:6.5.16" dependencies: - "@storybook/addons": 6.5.15 - "@storybook/client-logger": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/client-logger": 6.5.16 "@storybook/csf": 0.0.2--canary.4566f4d.1 core-js: ^3.8.2 estraverse: ^5.2.0 @@ -7442,17 +7718,17 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 2330d2b16f097c4be4b0eccc466ae0142c2e04198acc529204d80c1005c1c32b6da8313661b10e641020efdfe4f1dd4f0ac67bc2c3797ae49383815f668ede5d + checksum: a299acdd6f36add3222ef294e1118b7b1f38c2cd2b4648ebf9e1803a3ccf532c147dbe643a527915b570eb3ce36c4a17ca2b3566fa58a2a0a7821f0849ec3e07 languageName: node linkType: hard -"@storybook/store@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/store@npm:6.5.15" +"@storybook/store@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/store@npm:6.5.16" dependencies: - "@storybook/addons": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/core-events": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/core-events": 6.5.16 "@storybook/csf": 0.0.2--canary.4566f4d.1 core-js: ^3.8.2 fast-deep-equal: ^3.1.3 @@ -7468,16 +7744,16 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 918c3ed8c7a55ae4bf8bcb3a108d99a9d077c951b3f386cb0f8939d2eed7c9a9a2000075b341d5c934c0308c24287fc5cd110042a384411c25cec7632dfa5abb + checksum: f438fb020af240e23348742b2936a326bef1f7ffd489fe9f39cfd516310ab592a11609205fdacd11090b0c0b6bc72c75dff986085a6a97acc5efa64829a49309 languageName: node linkType: hard -"@storybook/telemetry@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/telemetry@npm:6.5.15" +"@storybook/telemetry@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/telemetry@npm:6.5.16" dependencies: - "@storybook/client-logger": 6.5.15 - "@storybook/core-common": 6.5.15 + "@storybook/client-logger": 6.5.16 + "@storybook/core-common": 6.5.16 chalk: ^4.1.0 core-js: ^3.8.2 detect-package-manager: ^2.0.1 @@ -7488,7 +7764,7 @@ __metadata: nanoid: ^3.3.1 read-pkg-up: ^7.0.1 regenerator-runtime: ^0.13.7 - checksum: aebb83186ff7308e21185a7152b27aed43f6d3967a7253ac94e3d4c1bce4935c471500c37d195e03f98953944812d2b24518d4147704e7ffb211430b27a2354e + checksum: 21eef590b04db8ee85b0b1d875d8646e26492b3e90538a248314f92d6ab0642ec65db09c5d2bc0d7f547f0fa6b83ca4442bdc115b400861360e02d8cf179497e languageName: node linkType: hard @@ -7520,34 +7796,34 @@ __metadata: languageName: node linkType: hard -"@storybook/theming@npm:6.5.15, @storybook/theming@npm:^6.0.0, @storybook/theming@npm:~6.5.15": - version: 6.5.15 - resolution: "@storybook/theming@npm:6.5.15" +"@storybook/theming@npm:6.5.16, @storybook/theming@npm:^6.0.0, @storybook/theming@npm:~6.5.16": + version: 6.5.16 + resolution: "@storybook/theming@npm:6.5.16" dependencies: - "@storybook/client-logger": 6.5.15 + "@storybook/client-logger": 6.5.16 core-js: ^3.8.2 memoizerific: ^1.11.3 regenerator-runtime: ^0.13.7 peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 84d09b6bdd0a00246b207ef4307fc0ecbb5861792547a070ed45470335c323f18ba607cd1d3f0a5cea7e979dd73315cdb091548fe70e5946c1593d8c691be7ba + checksum: 349affa5c5208240291a5d24c73d852e220bfaf36b8fda70564aec1cac6070248ce7566ccb755c55a6ce0844ab2bbfd55881f6f788240b38cb407714e393c6f3 languageName: node linkType: hard -"@storybook/ui@npm:6.5.15": - version: 6.5.15 - resolution: "@storybook/ui@npm:6.5.15" +"@storybook/ui@npm:6.5.16": + version: 6.5.16 + resolution: "@storybook/ui@npm:6.5.16" dependencies: - "@storybook/addons": 6.5.15 - "@storybook/api": 6.5.15 - "@storybook/channels": 6.5.15 - "@storybook/client-logger": 6.5.15 - "@storybook/components": 6.5.15 - "@storybook/core-events": 6.5.15 - "@storybook/router": 6.5.15 + "@storybook/addons": 6.5.16 + "@storybook/api": 6.5.16 + "@storybook/channels": 6.5.16 + "@storybook/client-logger": 6.5.16 + "@storybook/components": 6.5.16 + "@storybook/core-events": 6.5.16 + "@storybook/router": 6.5.16 "@storybook/semver": ^7.3.2 - "@storybook/theming": 6.5.15 + "@storybook/theming": 6.5.16 core-js: ^3.8.2 memoizerific: ^1.11.3 qs: ^6.10.0 @@ -7556,7 +7832,7 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 8b75290c65a6a2beb3db4157ed95ce74dab06d5499dc3fc7a848fa5c9fc0f506bf6533638bb50c3a1f27acfeaa6ade0acdde8beede2241eba8d577965d85d299 + checksum: bfebcf4d56dc5fd6024eaa08fe50aecc3c348670b7c0ec6b467680d64d525421580b9c98839bcaf1e2a9e69b78478a21c9943a9a392b49a0405b4784038b2eba languageName: node linkType: hard @@ -7713,18 +7989,18 @@ __metadata: linkType: hard "@testing-library/dom@npm:^8.0.0, @testing-library/dom@npm:^8.3.0": - version: 8.17.1 - resolution: "@testing-library/dom@npm:8.17.1" + version: 8.20.0 + resolution: "@testing-library/dom@npm:8.20.0" dependencies: "@babel/code-frame": ^7.10.4 "@babel/runtime": ^7.12.5 - "@types/aria-query": ^4.2.0 + "@types/aria-query": ^5.0.1 aria-query: ^5.0.0 chalk: ^4.1.0 dom-accessibility-api: ^0.5.9 lz-string: ^1.4.4 pretty-format: ^27.0.2 - checksum: e4df091fcf84c9eac4a6ee4c76674c1d562bf98732f0ac8820972d7718ab10397b672b9f082aace3cacd1f610fc77de6e1b6094e67afe1df0443bf22eb9deab2 + checksum: 1e599129a2fe91959ce80900a0a4897232b89e2a8e22c1f5950c36d39c97629ea86b4986b60b173b5525a05de33fde1e35836ea597b03de78cc51b122835c6f0 languageName: node linkType: hard @@ -7745,29 +8021,29 @@ __metadata: languageName: node linkType: hard -"@testing-library/react-hooks@npm:~7.0.2": - version: 7.0.2 - resolution: "@testing-library/react-hooks@npm:7.0.2" +"@testing-library/react-hooks@npm:~8.0.1": + version: 8.0.1 + resolution: "@testing-library/react-hooks@npm:8.0.1" dependencies: "@babel/runtime": ^7.12.5 - "@types/react": ">=16.9.0" - "@types/react-dom": ">=16.9.0" - "@types/react-test-renderer": ">=16.9.0" react-error-boundary: ^3.1.0 peerDependencies: - react: ">=16.9.0" - react-dom: ">=16.9.0" - react-test-renderer: ">=16.9.0" + "@types/react": ^16.9.0 || ^17.0.0 + react: ^16.9.0 || ^17.0.0 + react-dom: ^16.9.0 || ^17.0.0 + react-test-renderer: ^16.9.0 || ^17.0.0 peerDependenciesMeta: + "@types/react": + optional: true react-dom: optional: true react-test-renderer: optional: true - checksum: 27c6169b5c9832bd02dcea232e6a0a3cd8d4504e13ecb49d57eb5ab6bea5e2f1bff65f3102068b7e57eec3cbd671326dc0b277335014b0edfbdedf11a1fe6db5 + checksum: 7fe44352e920deb5cb1876f80d64e48615232072c9d5382f1e0284b3aab46bb1c659a040b774c45cdf084a5257b8fe463f7e08695ad8480d8a15635d4d3d1f6d languageName: node linkType: hard -"@testing-library/react@npm:^12.1.5": +"@testing-library/react@npm:release-12.x": version: 12.1.5 resolution: "@testing-library/react@npm:12.1.5" dependencies: @@ -7781,7 +8057,7 @@ __metadata: languageName: node linkType: hard -"@testing-library/user-event@npm:^13.2.1, @testing-library/user-event@npm:^13.5.0": +"@testing-library/user-event@npm:^13.2.1": version: 13.5.0 resolution: "@testing-library/user-event@npm:13.5.0" dependencies: @@ -7792,6 +8068,15 @@ __metadata: languageName: node linkType: hard +"@testing-library/user-event@npm:~14.4.3": + version: 14.4.3 + resolution: "@testing-library/user-event@npm:14.4.3" + peerDependencies: + "@testing-library/dom": ">=7.21.4" + checksum: 852c48ea6db1c9471b18276617c84fec4320771e466cd58339a732ca3fd73ad35e5a43ae14f51af51a8d0a150dcf60fcaab049ef367871207bea8f92c4b8195e + languageName: node + linkType: hard + "@tootallnate/once@npm:1": version: 1.1.2 resolution: "@tootallnate/once@npm:1.1.2" @@ -7841,6 +8126,15 @@ __metadata: languageName: node linkType: hard +"@types/acorn@npm:^4.0.0": + version: 4.0.6 + resolution: "@types/acorn@npm:4.0.6" + dependencies: + "@types/estree": "*" + checksum: 60e1fd28af18d6cb54a93a7231c7c18774a9a8739c9b179e9e8750dca631e10cbef2d82b02830ea3f557b1d121e6406441e9e1250bd492dc81d4b3456e76e4d4 + languageName: node + linkType: hard + "@types/anymatch@npm:*": version: 1.3.1 resolution: "@types/anymatch@npm:1.3.1" @@ -7848,10 +8142,10 @@ __metadata: languageName: node linkType: hard -"@types/aria-query@npm:^4.2.0": - version: 4.2.2 - resolution: "@types/aria-query@npm:4.2.2" - checksum: 6f2ce11d91e2d665f3873258db19da752d91d85d3679eb5efcdf9c711d14492287e1e4eb52613b28e60375841a9e428594e745b68436c963d8bad4bf72188df3 +"@types/aria-query@npm:^5.0.1": + version: 5.0.1 + resolution: "@types/aria-query@npm:5.0.1" + checksum: 69fd7cceb6113ed370591aef04b3fd0742e9a1b06dd045c43531448847b85de181495e4566f98e776b37c422a12fd71866e0a1dfd904c5ec3f84d271682901de languageName: node linkType: hard @@ -7946,6 +8240,15 @@ __metadata: languageName: node linkType: hard +"@types/debug@npm:^4.0.0": + version: 4.1.7 + resolution: "@types/debug@npm:4.1.7" + dependencies: + "@types/ms": "*" + checksum: 0a7b89d8ed72526858f0b61c6fd81f477853e8c4415bb97f48b1b5545248d2ae389931680b94b393b993a7cfe893537a200647d93defe6d87159b96812305adc + languageName: node + linkType: hard + "@types/eslint-scope@npm:^3.7.3": version: 3.7.4 resolution: "@types/eslint-scope@npm:3.7.4" @@ -7966,10 +8269,19 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:^0.0.51": - version: 0.0.51 - resolution: "@types/estree@npm:0.0.51" - checksum: e56a3bcf759fd9185e992e7fdb3c6a5f81e8ff120e871641607581fb3728d16c811702a7d40fa5f869b7f7b4437ab6a87eb8d98ffafeee51e85bbe955932a189 +"@types/estree-jsx@npm:^1.0.0": + version: 1.0.0 + resolution: "@types/estree-jsx@npm:1.0.0" + dependencies: + "@types/estree": "*" + checksum: 851d7afb63a89fb9ce7822563930660433f29106d72db279ce9c99f791ec996ef21b05adc6f545325cd1745b3041cc86422f0ffa39a06734305b90cfbc871765 + languageName: node + linkType: hard + +"@types/estree@npm:*, @types/estree@npm:^1.0.0": + version: 1.0.0 + resolution: "@types/estree@npm:1.0.0" + checksum: 910d97fb7092c6738d30a7430ae4786a38542023c6302b95d46f49420b797f21619cdde11fa92b338366268795884111c2eb10356e4bd2c8ad5b92941e9e6443 languageName: node linkType: hard @@ -7980,6 +8292,13 @@ __metadata: languageName: node linkType: hard +"@types/estree@npm:^0.0.51": + version: 0.0.51 + resolution: "@types/estree@npm:0.0.51" + checksum: e56a3bcf759fd9185e992e7fdb3c6a5f81e8ff120e871641607581fb3728d16c811702a7d40fa5f869b7f7b4437ab6a87eb8d98ffafeee51e85bbe955932a189 + languageName: node + linkType: hard + "@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.18": version: 4.17.30 resolution: "@types/express-serve-static-core@npm:4.17.30" @@ -8003,12 +8322,13 @@ __metadata: languageName: node linkType: hard -"@types/fs-extra@npm:^9.0.12": - version: 9.0.13 - resolution: "@types/fs-extra@npm:9.0.13" +"@types/fs-extra@npm:^11.0.1": + version: 11.0.1 + resolution: "@types/fs-extra@npm:11.0.1" dependencies: + "@types/jsonfile": "*" "@types/node": "*" - checksum: add79e212acd5ac76b97b9045834e03a7996aef60a814185e0459088fd290519a3c1620865d588fa36c4498bf614210d2a703af5cf80aa1dbc125db78f6edac3 + checksum: 3e930346e5d84f419deb8ced1c582beef8cb20d0bd8a0eb145a37d75bab0572a1895f0e48a0d681d386b3a58b9a992b2d2acecc464bcaec2548f53ea00718651 languageName: node linkType: hard @@ -8022,12 +8342,12 @@ __metadata: languageName: node linkType: hard -"@types/graceful-fs@npm:^4.1.2": - version: 4.1.4 - resolution: "@types/graceful-fs@npm:4.1.4" +"@types/graceful-fs@npm:^4.1.2, @types/graceful-fs@npm:^4.1.3": + version: 4.1.6 + resolution: "@types/graceful-fs@npm:4.1.6" dependencies: "@types/node": "*" - checksum: d13028412fdc7dd16bcb566da730a15e49bdc71d2681adc67b01a9df6c5ab775d1d547298adf0cbe36f227781c1400d0b0f1da3cb1c2d4b3f9bea02e8aac75ec + checksum: c3070ccdc9ca0f40df747bced1c96c71a61992d6f7c767e8fd24bb6a3c2de26e8b84135ede000b7e79db530a23e7e88dcd9db60eee6395d0f4ce1dae91369dd4 languageName: node linkType: hard @@ -8119,33 +8439,24 @@ __metadata: languageName: node linkType: hard -"@types/jest@npm:*, @types/jest@npm:>=26.0.0": - version: 29.0.0 - resolution: "@types/jest@npm:29.0.0" +"@types/jest@npm:*, @types/jest@npm:>=26.0.0, @types/jest@npm:^29.5.0, @types/jest@npm:~29.5.0": + version: 29.5.0 + resolution: "@types/jest@npm:29.5.0" dependencies: expect: ^29.0.0 pretty-format: ^29.0.0 - checksum: b20c4b38c7c963862d82c21c0a1ae2b96015afb1511c835da43e8fd53659ca884f8103a2159be2ce74d2888472a1ac93d20d08ec1ac0970385cbb74c46d47585 - languageName: node - linkType: hard - -"@types/jest@npm:^27.5.2": - version: 27.5.2 - resolution: "@types/jest@npm:27.5.2" - dependencies: - jest-matcher-utils: ^27.0.0 - pretty-format: ^27.0.0 - checksum: 7e11c6826aa429ad990dc262e4e4b54aa36573287fddf15773e4137f07d11d3105f0dd9f1baff73252160a057df23f5529bb83b1bf83cd3f45f9460a5ca5c22e + checksum: cd877e5c56d299cceb8bfdcbb1a77723c706750dd3c3bc47403bc3599b8faff590a3b009c68bb5b11bf7a8c77d1fb01de5e124329b4a08e65f1cdda28b0ecdb8 languageName: node linkType: hard -"@types/jest@npm:~27.4.1": - version: 27.4.1 - resolution: "@types/jest@npm:27.4.1" +"@types/jsdom@npm:^20.0.0": + version: 20.0.1 + resolution: "@types/jsdom@npm:20.0.1" dependencies: - jest-matcher-utils: ^27.0.0 - pretty-format: ^27.0.0 - checksum: 5184f3eef4832d01ee8f59bed15eec45ccc8e29c724a5e6ce37bf74396b37bdf04f557000f45ba4fc38ae6075cf9cfcce3d7a75abc981023c61ceb27230a93e4 + "@types/node": "*" + "@types/tough-cookie": "*" + parse5: ^7.0.0 + checksum: d55402c5256ef451f93a6e3d3881f98339fe73a5ac2030588df056d6835df8367b5a857b48d27528289057e26dcdd3f502edc00cb877c79174cb3a4c7f2198c1 languageName: node linkType: hard @@ -8163,6 +8474,15 @@ __metadata: languageName: node linkType: hard +"@types/jsonfile@npm:*": + version: 6.1.1 + resolution: "@types/jsonfile@npm:6.1.1" + dependencies: + "@types/node": "*" + checksum: 0f8fe0a9221a00e8413cffba723dfe16553868724b830237256fb0052ecd5cac96498189d1235a001cfa815f352008261c9ceb373f0aa58227f891e0c7a12c4d + languageName: node + linkType: hard + "@types/keyv@npm:*": version: 3.1.3 resolution: "@types/keyv@npm:3.1.3" @@ -8209,7 +8529,14 @@ __metadata: languageName: node linkType: hard -"@types/node-fetch@npm:^2.5.12, @types/node-fetch@npm:^2.5.7": +"@types/ms@npm:*": + version: 0.7.31 + resolution: "@types/ms@npm:0.7.31" + checksum: daadd354aedde024cce6f5aa873fefe7b71b22cd0e28632a69e8b677aeb48ae8caa1c60e5919bb781df040d116b01cb4316335167a3fc0ef6a63fa3614c0f6da + languageName: node + linkType: hard + +"@types/node-fetch@npm:^2.5.7": version: 2.5.12 resolution: "@types/node-fetch@npm:2.5.12" dependencies: @@ -8219,24 +8546,31 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:>= 8, @types/node@npm:^17.0.19": - version: 17.0.45 - resolution: "@types/node@npm:17.0.45" - checksum: aa04366b9103b7d6cfd6b2ef64182e0eaa7d4462c3f817618486ea0422984c51fc69fd0d436eae6c9e696ddfdbec9ccaa27a917f7c2e8c75c5d57827fe3d95e8 +"@types/node@npm:*, @types/node@npm:>= 8, @types/node@npm:^18.14.2": + version: 18.15.11 + resolution: "@types/node@npm:18.15.11" + checksum: 977b4ad04708897ff0eb049ecf82246d210939c82461922d20f7d2dcfd81bbc661582ba3af28869210f7e8b1934529dcd46bff7d448551400f9d48b9d3bddec3 languageName: node linkType: hard -"@types/node@npm:^14.0.10 || ^16.0.0, @types/node@npm:^14.14.20 || ^16.0.0, @types/node@npm:^16.11.36, @types/node@npm:^16.6": +"@types/node@npm:^14.0.10 || ^16.0.0, @types/node@npm:^14.14.20 || ^16.0.0": version: 16.11.56 resolution: "@types/node@npm:16.11.56" checksum: b4efade16eb08a39810921c54a1637e69c8f3184a20d87e8fe74d557d9bda73f0829ac318e2a30a32b1903e4b099812defd1dfe438be70b98dbfbea5b0d99a53 languageName: node linkType: hard -"@types/node@npm:~15.14.9": - version: 15.14.9 - resolution: "@types/node@npm:15.14.9" - checksum: 49f7f0522a3af4b8389aee660e88426490cd54b86356672a1fedb49919a8797c00d090ec2dcc4a5df34edc2099d57fc2203d796c4e7fbd382f2022ccd789eee7 +"@types/node@npm:^17.0.19": + version: 17.0.45 + resolution: "@types/node@npm:17.0.45" + checksum: aa04366b9103b7d6cfd6b2ef64182e0eaa7d4462c3f817618486ea0422984c51fc69fd0d436eae6c9e696ddfdbec9ccaa27a917f7c2e8c75c5d57827fe3d95e8 + languageName: node + linkType: hard + +"@types/node@npm:~14.18.42": + version: 14.18.42 + resolution: "@types/node@npm:14.18.42" + checksum: 1c92f04a482ab54a21342b3911fc6f0093f04d3314197bc0e2f20012e9efc929c44e2ea41990b9b3cde420d7859c9ed716733f3e65c0cd6c2910a55799465f6b languageName: node linkType: hard @@ -8289,6 +8623,13 @@ __metadata: languageName: node linkType: hard +"@types/ps-tree@npm:^1.1.2": + version: 1.1.2 + resolution: "@types/ps-tree@npm:1.1.2" + checksum: 575c3b2b83ea8935ab296ac9e17f6a2c1a5bb155f9e30663bb7a7c741a8ca4641f0df9748866230f1d6c3f87ed4ffa3fa91f1df444ef9979a3df31114534bf25 + languageName: node + linkType: hard + "@types/q@npm:^1.5.1": version: 1.5.4 resolution: "@types/q@npm:1.5.4" @@ -8310,21 +8651,21 @@ __metadata: languageName: node linkType: hard -"@types/react-beautiful-dnd@npm:^13.1.2": - version: 13.1.2 - resolution: "@types/react-beautiful-dnd@npm:13.1.2" +"@types/react-beautiful-dnd@npm:^13.1.4": + version: 13.1.4 + resolution: "@types/react-beautiful-dnd@npm:13.1.4" dependencies: "@types/react": "*" - checksum: 28372854fcd4b7546aabe55ee6569da59fad10f117929cff8a9c6f928448e4dd08ed1139facca33232833b9de100edf017aab9a0ee34065f8fc0e2a7a1262b2c + checksum: 76220f1031721e73f712cf0021de6a3cf4049260ec29996cd587876ebd6ed01b9c31d8efb5cf230eb4d2b6259525ffe0f3054667732d30c79df37e49f9398c5e languageName: node linkType: hard -"@types/react-dom@npm:<18.0.0, @types/react-dom@npm:>=16.9.0, @types/react-dom@npm:^17.0.18": - version: 17.0.18 - resolution: "@types/react-dom@npm:17.0.18" +"@types/react-dom@npm:<18.0.0, @types/react-dom@npm:^17.0.19": + version: 17.0.19 + resolution: "@types/react-dom@npm:17.0.19" dependencies: "@types/react": ^17 - checksum: b74525b1a13a0e27fe20859ff7a7e8f7e4581fb9d45ed1b6447ad1534d86f813818353c39d0df2e28f9d2b9be2e3af1908c244b2214a979393d19f217665e614 + checksum: 875a472d868b235435c905ded16cf92297bd2afb20a5a78f5dccd54312f6f038ccf452ea92bb41c0b39150c2f16f3ddff0265a2de756c6f63b0971dd5719578b languageName: node linkType: hard @@ -8340,23 +8681,14 @@ __metadata: languageName: node linkType: hard -"@types/react-test-renderer@npm:>=16.9.0": - version: 17.0.1 - resolution: "@types/react-test-renderer@npm:17.0.1" - dependencies: - "@types/react": "*" - checksum: ecaae8df36cd8cfeb89080d52534856acc3789bad9a6e369ff5119426377c827b4e5b5daa638507f2c1c2fd6c994bf45de288a698143178cd4049c2cd8b77b35 - languageName: node - linkType: hard - -"@types/react@npm:*, @types/react@npm:>=16.9.0, @types/react@npm:^17, @types/react@npm:^17.0.53, @types/react@npm:~17.0.53": - version: 17.0.53 - resolution: "@types/react@npm:17.0.53" +"@types/react@npm:*, @types/react@npm:^17, @types/react@npm:^17.0.57, @types/react@npm:~17.0.57": + version: 17.0.57 + resolution: "@types/react@npm:17.0.57" dependencies: "@types/prop-types": "*" "@types/scheduler": "*" csstype: ^3.0.2 - checksum: dacfde02c260fd98bed2eb775ed0c7ce1397be4c0844f907a50763b081a4008f81f57071889a16eb1350ddcf0927f3cf1a6541702c8ad03de3c70383ef931e3f + checksum: c6cb8d6d261fbdc2650e00260efaf0c0a241ca72f22a43e96f32f7ab0379e5e1522f4936b6d8f97c0d8793a4fd949a90e863daa2449824f7586903cc4d299d92 languageName: node linkType: hard @@ -8399,6 +8731,13 @@ __metadata: languageName: node linkType: hard +"@types/semver@npm:^7.3.12": + version: 7.3.13 + resolution: "@types/semver@npm:7.3.13" + checksum: 00c0724d54757c2f4bc60b5032fe91cda6410e48689633d5f35ece8a0a66445e3e57fa1d6e07eb780f792e82ac542948ec4d0b76eb3484297b79bd18b8cf1cb0 + languageName: node + linkType: hard + "@types/serve-index@npm:^1.9.1": version: 1.9.1 resolution: "@types/serve-index@npm:1.9.1" @@ -8464,6 +8803,13 @@ __metadata: languageName: node linkType: hard +"@types/tough-cookie@npm:*": + version: 4.0.2 + resolution: "@types/tough-cookie@npm:4.0.2" + checksum: e055556ffdaa39ad85ede0af192c93f93f986f4bd9e9426efdc2948e3e2632db3a4a584d4937dbf6d7620527419bc99e6182d3daf2b08685e710f2eda5291905 + languageName: node + linkType: hard + "@types/trusted-types@npm:^2.0.2": version: 2.0.2 resolution: "@types/trusted-types@npm:2.0.2" @@ -8526,6 +8872,13 @@ __metadata: languageName: node linkType: hard +"@types/which@npm:^2.0.2": + version: 2.0.2 + resolution: "@types/which@npm:2.0.2" + checksum: 8626a3c2f6db676c449142e1082e33ea0c9d88b8a2bd796366b944891e6da0088b2aa83d3fa9c79e6696f7381a851fc76d43bd353eb6c4d98a7775b4ae0a96a5 + languageName: node + linkType: hard + "@types/ws@npm:^8.5.1": version: 8.5.3 resolution: "@types/ws@npm:8.5.3" @@ -8569,17 +8922,18 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^5.5.0": - version: 5.31.0 - resolution: "@typescript-eslint/eslint-plugin@npm:5.31.0" +"@typescript-eslint/eslint-plugin@npm:^5.5.0, @typescript-eslint/eslint-plugin@npm:~5.58.0": + version: 5.58.0 + resolution: "@typescript-eslint/eslint-plugin@npm:5.58.0" dependencies: - "@typescript-eslint/scope-manager": 5.31.0 - "@typescript-eslint/type-utils": 5.31.0 - "@typescript-eslint/utils": 5.31.0 + "@eslint-community/regexpp": ^4.4.0 + "@typescript-eslint/scope-manager": 5.58.0 + "@typescript-eslint/type-utils": 5.58.0 + "@typescript-eslint/utils": 5.58.0 debug: ^4.3.4 - functional-red-black-tree: ^1.0.1 + grapheme-splitter: ^1.0.4 ignore: ^5.2.0 - regexpp: ^3.2.0 + natural-compare-lite: ^1.4.0 semver: ^7.3.7 tsutils: ^3.21.0 peerDependencies: @@ -8588,30 +8942,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: a6d007e6cc6c7204b9ce09dd6670a5a29f8b75417a84c8238d1dd7fc3bfa4a7294beb961a0ba76e610b695a0c80edd4186803429e3605a21562c23e47b8efa37 - languageName: node - linkType: hard - -"@typescript-eslint/eslint-plugin@npm:~5.11.0": - version: 5.11.0 - resolution: "@typescript-eslint/eslint-plugin@npm:5.11.0" - dependencies: - "@typescript-eslint/scope-manager": 5.11.0 - "@typescript-eslint/type-utils": 5.11.0 - "@typescript-eslint/utils": 5.11.0 - debug: ^4.3.2 - functional-red-black-tree: ^1.0.1 - ignore: ^5.1.8 - regexpp: ^3.2.0 - semver: ^7.3.5 - tsutils: ^3.21.0 - peerDependencies: - "@typescript-eslint/parser": ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: fa546ba4397f3e693870c39d1e8df6feccb728a7092be6312b78806a64c4ff4648cff0462503d3e510e8b173b9704c19e78d2a7af790ab1c0309782e33a89c32 + checksum: e5d76d43c466ebd4b552e3307eff72ab5ae8a0c09a1d35fa13b62769ac3336df94d9281728ab5aafd2c14a0a644133583edcd708fce60a9a82df1db3ca3b8e14 languageName: node linkType: hard @@ -8626,47 +8957,20 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/parser@npm:^5.5.0": - version: 5.31.0 - resolution: "@typescript-eslint/parser@npm:5.31.0" +"@typescript-eslint/parser@npm:^5.5.0, @typescript-eslint/parser@npm:~5.58.0": + version: 5.58.0 + resolution: "@typescript-eslint/parser@npm:5.58.0" dependencies: - "@typescript-eslint/scope-manager": 5.31.0 - "@typescript-eslint/types": 5.31.0 - "@typescript-eslint/typescript-estree": 5.31.0 + "@typescript-eslint/scope-manager": 5.58.0 + "@typescript-eslint/types": 5.58.0 + "@typescript-eslint/typescript-estree": 5.58.0 debug: ^4.3.4 peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: ae842105ff0e5811d54c9c020ee0568170c13f401de293eb4caa2106f3060558773b496b5647f2b80b2969a2890135c054f50e2443a13c3705d5965aa12896c0 - languageName: node - linkType: hard - -"@typescript-eslint/parser@npm:~5.11.0": - version: 5.11.0 - resolution: "@typescript-eslint/parser@npm:5.11.0" - dependencies: - "@typescript-eslint/scope-manager": 5.11.0 - "@typescript-eslint/types": 5.11.0 - "@typescript-eslint/typescript-estree": 5.11.0 - debug: ^4.3.2 - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 521b6e701d877dc0514c6a3992f4900aa6fea28ba7c0bc03c634dad2b50aa195401e45683dfebd9e8492a857cd84bba3b585d8fe8d0cd1d7e2720372c34c50a3 - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:5.11.0": - version: 5.11.0 - resolution: "@typescript-eslint/scope-manager@npm:5.11.0" - dependencies: - "@typescript-eslint/types": 5.11.0 - "@typescript-eslint/visitor-keys": 5.11.0 - checksum: bf7feaed495ed4cafa1b89a2b73781b30061d019e1c1b3765dc8006e7f36b537f6f451e37c77400067771318b4f0c5915804084dc6299ea7c6ecde2daf0aca1c + checksum: 38681da48a40132c0538579c818ceef9ba2793ab8f79236c3f64980ba1649bb87cb367cd79d37bf2982b8bfbc28f91846b8676f9bd333e8b691c9befffd8874a languageName: node linkType: hard @@ -8680,27 +8984,22 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:5.11.0": - version: 5.11.0 - resolution: "@typescript-eslint/type-utils@npm:5.11.0" +"@typescript-eslint/scope-manager@npm:5.58.0": + version: 5.58.0 + resolution: "@typescript-eslint/scope-manager@npm:5.58.0" dependencies: - "@typescript-eslint/utils": 5.11.0 - debug: ^4.3.2 - tsutils: ^3.21.0 - peerDependencies: - eslint: "*" - peerDependenciesMeta: - typescript: - optional: true - checksum: fd570806d82874289ded6bfd90ff5414d4365b95b4a2e911f7ff2fee6e2c7675d0f2f71580c24cb8be733c3dfe2cd33eedff99ae2aa50f61b1b5af76499074eb + "@typescript-eslint/types": 5.58.0 + "@typescript-eslint/visitor-keys": 5.58.0 + checksum: f0d3df5cc3c461fe63ef89ad886b53c239cc7c1d9061d83d8a9d9c8e087e5501eac84bebff8a954728c17ccea191f235686373d54d2b8b6370af2bcf2b18e062 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:5.31.0": - version: 5.31.0 - resolution: "@typescript-eslint/type-utils@npm:5.31.0" +"@typescript-eslint/type-utils@npm:5.58.0": + version: 5.58.0 + resolution: "@typescript-eslint/type-utils@npm:5.58.0" dependencies: - "@typescript-eslint/utils": 5.31.0 + "@typescript-eslint/typescript-estree": 5.58.0 + "@typescript-eslint/utils": 5.58.0 debug: ^4.3.4 tsutils: ^3.21.0 peerDependencies: @@ -8708,14 +9007,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 1e98a6952207cf7d19cdac375a69bcfed953a29746fa1f2b3c7a8c9376c6984c0bb52506539b76d6a9bebc33966c825f032a27859e545447890562dd3c05ef31 - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:5.11.0": - version: 5.11.0 - resolution: "@typescript-eslint/types@npm:5.11.0" - checksum: b1531481da75a6c89510ad03f3db68e4797b25438bb902ee322bd1c154b83396016271cc00356dcdbc300a8ee421493aae803b8c716f36d7b4808fe045ae3a2a + checksum: 803f24daed185152bf86952d4acebb5ea18ff03db5f28750368edf76fdea46b4b0f8803ae0b61c0282b47181c9977113457b16e33d5d2cb33b13855f55c5e5b2 languageName: node linkType: hard @@ -8726,21 +9018,10 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:5.11.0": - version: 5.11.0 - resolution: "@typescript-eslint/typescript-estree@npm:5.11.0" - dependencies: - "@typescript-eslint/types": 5.11.0 - "@typescript-eslint/visitor-keys": 5.11.0 - debug: ^4.3.2 - globby: ^11.0.4 - is-glob: ^4.0.3 - semver: ^7.3.5 - tsutils: ^3.21.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 7bda55501c586efd7f8065b4158016486d8af92b8419931fbea7cec9bfe074075de8cdebec8baa1ac8a5c3f973599b9dd44a51fced1792176e49cd60cc8e5442 +"@typescript-eslint/types@npm:5.58.0": + version: 5.58.0 + resolution: "@typescript-eslint/types@npm:5.58.0" + checksum: 8622a73d73220c4a7111537825f488c0271272032a1d4e129dc722bc6e8b3ec84f64469b2ca3b8dae7da3a9c18953ce1449af51f5f757dad60835eb579ad1d2c languageName: node linkType: hard @@ -8762,23 +9043,25 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:5.11.0": - version: 5.11.0 - resolution: "@typescript-eslint/utils@npm:5.11.0" +"@typescript-eslint/typescript-estree@npm:5.58.0": + version: 5.58.0 + resolution: "@typescript-eslint/typescript-estree@npm:5.58.0" dependencies: - "@types/json-schema": ^7.0.9 - "@typescript-eslint/scope-manager": 5.11.0 - "@typescript-eslint/types": 5.11.0 - "@typescript-eslint/typescript-estree": 5.11.0 - eslint-scope: ^5.1.1 - eslint-utils: ^3.0.0 - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 5ab1a15db1e0a2fbb857a8a16325459ad3d5239066f2641aa93ad9f7d08252d3a4ca6ae356c51cba1c6c81a65d84883436566b01932fa55b64a69796b950900d + "@typescript-eslint/types": 5.58.0 + "@typescript-eslint/visitor-keys": 5.58.0 + debug: ^4.3.4 + globby: ^11.1.0 + is-glob: ^4.0.3 + semver: ^7.3.7 + tsutils: ^3.21.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 51b668ec858db0c040a71dff526273945cee4ba5a9b240528d503d02526685882d900cf071c6636a4d9061ed3fd4a7274f7f1a23fba55c4b48b143344b4009c7 languageName: node linkType: hard -"@typescript-eslint/utils@npm:5.31.0, @typescript-eslint/utils@npm:^5.13.0": +"@typescript-eslint/utils@npm:5.31.0": version: 5.31.0 resolution: "@typescript-eslint/utils@npm:5.31.0" dependencies: @@ -8794,13 +9077,21 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:5.11.0": - version: 5.11.0 - resolution: "@typescript-eslint/visitor-keys@npm:5.11.0" +"@typescript-eslint/utils@npm:5.58.0, @typescript-eslint/utils@npm:^5.13.0": + version: 5.58.0 + resolution: "@typescript-eslint/utils@npm:5.58.0" dependencies: - "@typescript-eslint/types": 5.11.0 - eslint-visitor-keys: ^3.0.0 - checksum: 8f0b6fe1e86bc93825a137be3220f57e3a4bee410cca5d35963a0cd416750b31291a73c4294676d94ed0f5066b4cfb3a8f512d409881daa550d1645f4381eb21 + "@eslint-community/eslint-utils": ^4.2.0 + "@types/json-schema": ^7.0.9 + "@types/semver": ^7.3.12 + "@typescript-eslint/scope-manager": 5.58.0 + "@typescript-eslint/types": 5.58.0 + "@typescript-eslint/typescript-estree": 5.58.0 + eslint-scope: ^5.1.1 + semver: ^7.3.7 + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: c618ae67963ecf96b1492c09afaeb363f542f0d6780bcac4af3c26034e3b20034666b2d523aa94821df813aafb57a0b150a7d5c2224fe8257452ad1de2237a58 languageName: node linkType: hard @@ -8814,6 +9105,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/visitor-keys@npm:5.58.0": + version: 5.58.0 + resolution: "@typescript-eslint/visitor-keys@npm:5.58.0" + dependencies: + "@typescript-eslint/types": 5.58.0 + eslint-visitor-keys: ^3.3.0 + checksum: ab2d1f37660559954c840429ef78bbf71834063557e3e68e435005b4987970b9356fdf217ead53f7a57f66f5488dc478062c5c44bf17053a8bf041733539b98f + languageName: node + linkType: hard + "@virtuoso.dev/react-urx@npm:^0.2.12": version: 0.2.12 resolution: "@virtuoso.dev/react-urx@npm:0.2.12" @@ -9164,36 +9465,36 @@ __metadata: languageName: node linkType: hard -"@webpack-cli/configtest@npm:^1.2.0": - version: 1.2.0 - resolution: "@webpack-cli/configtest@npm:1.2.0" +"@webpack-cli/configtest@npm:^2.0.1": + version: 2.0.1 + resolution: "@webpack-cli/configtest@npm:2.0.1" peerDependencies: - webpack: 4.x.x || 5.x.x - webpack-cli: 4.x.x - checksum: a2726cd9ec601d2b57e5fc15e0ebf5200a8892065e735911269ac2038e62be4bfc176ea1f88c2c46ff09b4d05d4c10ae045e87b3679372483d47da625a327e28 + webpack: 5.x.x + webpack-cli: 5.x.x + checksum: 15d0ca835f2e16ec99e9f295f07b676435b9e706d7700df0ad088692fea065e34772fc44b96a4f6a86178b9ca8cf1ff941fbce15269587cf0925d70b18928cea languageName: node linkType: hard -"@webpack-cli/info@npm:^1.5.0": - version: 1.5.0 - resolution: "@webpack-cli/info@npm:1.5.0" - dependencies: - envinfo: ^7.7.3 +"@webpack-cli/info@npm:^2.0.1": + version: 2.0.1 + resolution: "@webpack-cli/info@npm:2.0.1" peerDependencies: - webpack-cli: 4.x.x - checksum: 7f56fe037cd7d1fd5c7428588519fbf04a0cad33925ee4202ffbafd00f8ec1f2f67d991245e687d50e0f3e23f7b7814273d56cb9f7da4b05eed47c8d815c6296 + webpack: 5.x.x + webpack-cli: 5.x.x + checksum: b8fba49fee10d297c2affb0b064c9a81e9038d75517c6728fb85f9fb254cae634e5d33e696dac5171e6944ae329d85fddac72f781c7d833f7e9dfe43151ce60d languageName: node linkType: hard -"@webpack-cli/serve@npm:^1.7.0": - version: 1.7.0 - resolution: "@webpack-cli/serve@npm:1.7.0" +"@webpack-cli/serve@npm:^2.0.1": + version: 2.0.1 + resolution: "@webpack-cli/serve@npm:2.0.1" peerDependencies: - webpack-cli: 4.x.x + webpack: 5.x.x + webpack-cli: 5.x.x peerDependenciesMeta: webpack-dev-server: optional: true - checksum: d475e8effa23eb7ff9a48b14d4de425989fd82f906ce71c210921cc3852327c22873be00c35e181a25a6bd03d424ae2b83e7f3b3f410ac7ee31b128ab4ac7713 + checksum: 75c55f8398dd60e4821f81bec6e96287cebb3ab1837ef016779bc2f0c76a1d29c45b99e53daa99ba1fa156b5e2b61c19abf58098de20c2b58391b1f496ecc145 languageName: node linkType: hard @@ -9239,10 +9540,10 @@ __metadata: languageName: node linkType: hard -"abab@npm:^2.0.3, abab@npm:^2.0.5": - version: 2.0.5 - resolution: "abab@npm:2.0.5" - checksum: 0ec951b46d5418c2c2f923021ec193eaebdb4e802ffd5506286781b454be722a13a8430f98085cd3e204918401d9130ec6cc8f5ae19be315b3a0e857d83196e1 +"abab@npm:^2.0.3, abab@npm:^2.0.5, abab@npm:^2.0.6": + version: 2.0.6 + resolution: "abab@npm:2.0.6" + checksum: 6ffc1af4ff315066c62600123990d87551ceb0aafa01e6539da77b0f5987ac7019466780bf480f1787576d4385e3690c81ccc37cfda12819bf510b8ab47e5a3e languageName: node linkType: hard @@ -9273,6 +9574,16 @@ __metadata: languageName: node linkType: hard +"acorn-globals@npm:^7.0.0": + version: 7.0.1 + resolution: "acorn-globals@npm:7.0.1" + dependencies: + acorn: ^8.1.0 + acorn-walk: ^8.0.2 + checksum: 2a2998a547af6d0db5f0cdb90acaa7c3cbca6709010e02121fb8b8617c0fbd8bab0b869579903fde358ac78454356a14fadcc1a672ecb97b04b1c2ccba955ce8 + languageName: node + linkType: hard + "acorn-import-assertions@npm:^1.7.6": version: 1.8.0 resolution: "acorn-import-assertions@npm:1.8.0" @@ -9282,7 +9593,7 @@ __metadata: languageName: node linkType: hard -"acorn-jsx@npm:^5.3.1, acorn-jsx@npm:^5.3.2": +"acorn-jsx@npm:^5.0.0, acorn-jsx@npm:^5.3.1, acorn-jsx@npm:^5.3.2": version: 5.3.2 resolution: "acorn-jsx@npm:5.3.2" peerDependencies: @@ -9309,13 +9620,22 @@ __metadata: languageName: node linkType: hard -"acorn-walk@npm:^8.0.0, acorn-walk@npm:^8.1.1": +"acorn-walk@npm:^8.0.0, acorn-walk@npm:^8.0.2, acorn-walk@npm:^8.1.1": version: 8.2.0 resolution: "acorn-walk@npm:8.2.0" checksum: 1715e76c01dd7b2d4ca472f9c58968516a4899378a63ad5b6c2d668bba8da21a71976c14ec5f5b75f887b6317c4ae0b897ab141c831d741dc76024d8745f1ad1 languageName: node linkType: hard +"acorn@npm:8.8.2, acorn@npm:^8.0.0, acorn@npm:^8.0.4, acorn@npm:^8.1.0, acorn@npm:^8.2.4, acorn@npm:^8.4.1, acorn@npm:^8.5.0, acorn@npm:^8.7.1, acorn@npm:^8.8.0, acorn@npm:^8.8.1": + version: 8.8.2 + resolution: "acorn@npm:8.8.2" + bin: + acorn: bin/acorn + checksum: f790b99a1bf63ef160c967e23c46feea7787e531292bb827126334612c234ed489a0dc2c7ba33156416f0ffa8d25bf2b0fdb7f35c2ba60eb3e960572bece4001 + languageName: node + linkType: hard + "acorn@npm:^6.4.1": version: 6.4.2 resolution: "acorn@npm:6.4.2" @@ -9334,15 +9654,6 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.0.4, acorn@npm:^8.2.4, acorn@npm:^8.4.1, acorn@npm:^8.5.0, acorn@npm:^8.7.0, acorn@npm:^8.7.1, acorn@npm:^8.8.0": - version: 8.8.1 - resolution: "acorn@npm:8.8.1" - bin: - acorn: bin/acorn - checksum: 4079b67283b94935157698831967642f24a075c52ce3feaaaafe095776dfbe15d86a1b33b1e53860fc0d062ed6c83f4284a5c87c85b9ad51853a01173da6097f - languageName: node - linkType: hard - "add-stream@npm:^1.0.0": version: 1.0.0 resolution: "add-stream@npm:1.0.0" @@ -9565,6 +9876,13 @@ __metadata: languageName: node linkType: hard +"ansi-sequence-parser@npm:^1.1.0": + version: 1.1.0 + resolution: "ansi-sequence-parser@npm:1.1.0" + checksum: 75f4d3a4c555655a698aec05b5763cbddcd16ccccdbfd178fb0aa471ab74fdf98e031b875ef26e64be6a95cf970c89238744b26de6e34af97f316d5186b1df53 + languageName: node + linkType: hard + "ansi-styles@npm:^3.2.1": version: 3.2.1 resolution: "ansi-styles@npm:3.2.1" @@ -9811,13 +10129,6 @@ __metadata: languageName: node linkType: hard -"array-union@npm:^3.0.1": - version: 3.0.1 - resolution: "array-union@npm:3.0.1" - checksum: 47b29f88258e8f37ffb93ddaa327d4308edd950b52943c172b73558afdd3fa74cfd68816ba5aa4b894242cf281fa3c6d0362ae057e4a18bddbaedbe46ebe7112 - languageName: node - linkType: hard - "array-uniq@npm:^1.0.1": version: 1.0.3 resolution: "array-uniq@npm:1.0.3" @@ -10016,12 +10327,12 @@ __metadata: languageName: node linkType: hard -"autoprefixer@npm:^10.4.7, autoprefixer@npm:~10.4.13": - version: 10.4.13 - resolution: "autoprefixer@npm:10.4.13" +"autoprefixer@npm:^10.4.7, autoprefixer@npm:~10.4.14": + version: 10.4.14 + resolution: "autoprefixer@npm:10.4.14" dependencies: - browserslist: ^4.21.4 - caniuse-lite: ^1.0.30001426 + browserslist: ^4.21.5 + caniuse-lite: ^1.0.30001464 fraction.js: ^4.2.0 normalize-range: ^0.1.2 picocolors: ^1.0.0 @@ -10030,7 +10341,7 @@ __metadata: postcss: ^8.1.0 bin: autoprefixer: bin/autoprefixer - checksum: dcb1cb7ae96a3363d65d82e52f9a0a7d8c982256f6fd032d7e1ec311f099c23acfebfd517ff8e96bf93f716a66c4ea2b80c60aa19efd2f474ce434bd75ef7b79 + checksum: e9f18e664a4e4a54a8f4ec5f6b49ed228ec45afaa76efcae361c93721795dc5ab644f36d2fdfc0dea446b02a8067b9372f91542ea431994399e972781ed46d95 languageName: node linkType: hard @@ -10104,7 +10415,24 @@ __metadata: languageName: node linkType: hard -"babel-loader@npm:^8.0.0, babel-loader@npm:^8.2.3, babel-loader@npm:~8.2.5": +"babel-jest@npm:^29.5.0": + version: 29.5.0 + resolution: "babel-jest@npm:29.5.0" + dependencies: + "@jest/transform": ^29.5.0 + "@types/babel__core": ^7.1.14 + babel-plugin-istanbul: ^6.1.1 + babel-preset-jest: ^29.5.0 + chalk: ^4.0.0 + graceful-fs: ^4.2.9 + slash: ^3.0.0 + peerDependencies: + "@babel/core": ^7.8.0 + checksum: eafb6d37deb71f0c80bf3c80215aa46732153e5e8bcd73f6ff47d92e5c0c98c8f7f75995d0efec6289c371edad3693cd8fa2367b0661c4deb71a3a7117267ede + languageName: node + linkType: hard + +"babel-loader@npm:^8.0.0, babel-loader@npm:^8.2.3": version: 8.2.5 resolution: "babel-loader@npm:8.2.5" dependencies: @@ -10119,6 +10447,19 @@ __metadata: languageName: node linkType: hard +"babel-loader@npm:~9.1.2": + version: 9.1.2 + resolution: "babel-loader@npm:9.1.2" + dependencies: + find-cache-dir: ^3.3.2 + schema-utils: ^4.0.0 + peerDependencies: + "@babel/core": ^7.12.0 + webpack: ">=5" + checksum: f0edb8e157f9806b810ba3f2c8ca8fa489d377ae5c2b7b00c2ace900a6925641ce4ec520b9c12f70e37b94aa5366e7003e0f6271b26821643e109966ce741cb7 + languageName: node + linkType: hard + "babel-plugin-add-react-displayname@npm:^0.0.5": version: 0.0.5 resolution: "babel-plugin-add-react-displayname@npm:0.0.5" @@ -10138,18 +10479,9 @@ __metadata: languageName: node linkType: hard -"babel-plugin-dynamic-import-node@npm:^2.3.3": - version: 2.3.3 - resolution: "babel-plugin-dynamic-import-node@npm:2.3.3" - dependencies: - object.assign: ^4.1.0 - checksum: c9d24415bcc608d0db7d4c8540d8002ac2f94e2573d2eadced137a29d9eab7e25d2cbb4bc6b9db65cf6ee7430f7dd011d19c911a9a778f0533b4a05ce8292c9b - languageName: node - linkType: hard - -"babel-plugin-extract-import-names@npm:1.6.22": - version: 1.6.22 - resolution: "babel-plugin-extract-import-names@npm:1.6.22" +"babel-plugin-extract-import-names@npm:1.6.22": + version: 1.6.22 + resolution: "babel-plugin-extract-import-names@npm:1.6.22" dependencies: "@babel/helper-plugin-utils": 7.10.4 checksum: 145ccf09c96d36411d340e78086555f8d4d5924ea39fcb0eca461c066cfa98bc4344982bb35eb85d054ef88f8d4dfc0205ba27370c1d8fcc78191b02908d044d @@ -10181,6 +10513,18 @@ __metadata: languageName: node linkType: hard +"babel-plugin-jest-hoist@npm:^29.5.0": + version: 29.5.0 + resolution: "babel-plugin-jest-hoist@npm:29.5.0" + dependencies: + "@babel/template": ^7.3.3 + "@babel/types": ^7.3.3 + "@types/babel__core": ^7.1.14 + "@types/babel__traverse": ^7.0.6 + checksum: 099b5254073b6bc985b6d2d045ad26fb8ed30ff8ae6404c4fe8ee7cd0e98a820f69e3dfb871c7c65aae0f4b65af77046244c07bb92d49ef9005c90eedf681539 + languageName: node + linkType: hard + "babel-plugin-macros@npm:^3.0.1, babel-plugin-macros@npm:^3.1.0": version: 3.1.0 resolution: "babel-plugin-macros@npm:3.1.0" @@ -10308,6 +10652,18 @@ __metadata: languageName: node linkType: hard +"babel-preset-jest@npm:^29.5.0": + version: 29.5.0 + resolution: "babel-preset-jest@npm:29.5.0" + dependencies: + babel-plugin-jest-hoist: ^29.5.0 + babel-preset-current-node-syntax: ^1.0.0 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 5566ca2762766c9319b4973d018d2fa08c0fcf6415c72cc54f4c8e7199e851ea8f5e6c6730f03ed7ed44fc8beefa959dd15911f2647dee47c615ff4faeddb1ad + languageName: node + linkType: hard + "babel-preset-react-app@npm:^10.0.1": version: 10.0.1 resolution: "babel-preset-react-app@npm:10.0.1" @@ -10339,6 +10695,13 @@ __metadata: languageName: node linkType: hard +"bail@npm:^2.0.0": + version: 2.0.2 + resolution: "bail@npm:2.0.2" + checksum: aab4e8ccdc8d762bf3fdfce8e706601695620c0c2eda256dd85088dc0be3cfd7ff126f6e99c2bee1f24f5d418414aacf09d7f9702f16d6963df2fa488cda8824 + languageName: node + linkType: hard + "balanced-match@npm:^1.0.0": version: 1.0.0 resolution: "balanced-match@npm:1.0.0" @@ -10701,17 +11064,17 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.14.5, browserslist@npm:^4.16.5, browserslist@npm:^4.16.6, browserslist@npm:^4.18.1, browserslist@npm:^4.20.3, browserslist@npm:^4.21.0, browserslist@npm:^4.21.3, browserslist@npm:^4.21.4": - version: 4.21.4 - resolution: "browserslist@npm:4.21.4" +"browserslist@npm:^4.14.5, browserslist@npm:^4.16.5, browserslist@npm:^4.16.6, browserslist@npm:^4.18.1, browserslist@npm:^4.20.3, browserslist@npm:^4.21.0, browserslist@npm:^4.21.3, browserslist@npm:^4.21.4, browserslist@npm:^4.21.5": + version: 4.21.5 + resolution: "browserslist@npm:4.21.5" dependencies: - caniuse-lite: ^1.0.30001400 - electron-to-chromium: ^1.4.251 - node-releases: ^2.0.6 - update-browserslist-db: ^1.0.9 + caniuse-lite: ^1.0.30001449 + electron-to-chromium: ^1.4.284 + node-releases: ^2.0.8 + update-browserslist-db: ^1.0.10 bin: browserslist: cli.js - checksum: 4af3793704dbb4615bcd29059ab472344dc7961c8680aa6c4bb84f05340e14038d06a5aead58724eae69455b8fade8b8c69f1638016e87e5578969d74c078b79 + checksum: 9755986b22e73a6a1497fd8797aedd88e04270be33ce66ed5d85a1c8a798292a65e222b0f251bafa1c2522261e237d73b08b58689d4920a607e5a53d56dc4706 languageName: node linkType: hard @@ -10781,7 +11144,7 @@ __metadata: version: 0.0.0-use.local resolution: "build-design-tokens@workspace:tools/build-design-tokens" dependencies: - stylelint: ~14.14.1 + stylelint: ~15.4.0 tools-utils: "workspace:~" peerDependencies: eslint: "*" @@ -10802,7 +11165,7 @@ __metadata: ttf2woff: ~3.0.0 ttf2woff2: ~4.0.5 unicode: ~14.0.0 - xml2js: ~0.4.23 + xml2js: ~0.5.0 bin: build-icons: ./index.mjs languageName: unknown @@ -10812,7 +11175,7 @@ __metadata: version: 0.0.0-use.local resolution: "build-logo@workspace:tools/build-logo" dependencies: - prettier: ~2.7.1 + prettier: ~2.8.7 react: ^17.0.2 react-dom: ^17.0.2 sharp: ~0.30.7 @@ -10850,10 +11213,10 @@ __metadata: conventional-recommended-bump: ~6.1.0 latest-version: ~6.0.0 pkg-versions: ~2.1.0 - prettier: ~2.7.1 + prettier: ~2.8.7 semver: ~7.3.8 - standard-version: ^9.3.2 - zx: ~4.3.0 + standard-version: ^9.5.0 + zx: ~7.2.1 bin: bump: ./bump.mjs bump-next: ./bump-next.mjs @@ -11106,10 +11469,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001109, caniuse-lite@npm:^1.0.30001400, caniuse-lite@npm:^1.0.30001426, caniuse-lite@npm:~1.0.30001446": - version: 1.0.30001446 - resolution: "caniuse-lite@npm:1.0.30001446" - checksum: b31a7e1837783afd7f3d4cb742689996c0a09d67394ddaa0609fd2bce00ceea65c448e25f91c03ba0f2d0e345b7e28fd5bc636c6760c949621a654c0effe74b5 +"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001109, caniuse-lite@npm:^1.0.30001449, caniuse-lite@npm:^1.0.30001464, caniuse-lite@npm:~1.0.30001477": + version: 1.0.30001477 + resolution: "caniuse-lite@npm:1.0.30001477" + checksum: 22db0feccf43b0c16a46bb59b4e26ae05011f41c6947f1dd176d5056e0db58c3415a5ff7ee5a60903a6bda7311b71705d1d29fc4c43a8b8a1bdeef8c1d93f6a8 languageName: node linkType: hard @@ -11154,6 +11517,20 @@ __metadata: languageName: node linkType: hard +"ccount@npm:^2.0.0": + version: 2.0.1 + resolution: "ccount@npm:2.0.1" + checksum: 48193dada54c9e260e0acf57fc16171a225305548f9ad20d5471e0f7a8c026aedd8747091dccb0d900cde7df4e4ddbd235df0d8de4a64c71b12f0d3303eeafd4 + languageName: node + linkType: hard + +"chalk@npm:5.2.0, chalk@npm:^5.2.0": + version: 5.2.0 + resolution: "chalk@npm:5.2.0" + checksum: 03d8060277de6cf2fd567dc25fcf770593eb5bb85f460ce443e49255a30ff1242edd0c90a06a03803b0466ff0687a939b41db1757bec987113e83de89a003caa + languageName: node + linkType: hard + "chalk@npm:^2.0.0, chalk@npm:^2.4.1, chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" @@ -11245,10 +11622,10 @@ __metadata: languageName: node linkType: hard -"character-entities-html4@npm:^1.0.0": - version: 1.1.4 - resolution: "character-entities-html4@npm:1.1.4" - checksum: 22536aba07a378a2326420423ceadd65c0121032c527f80e84dfc648381992ed5aa666d7c2b267cd269864b3682d5b0315fc2f03a9e7c017d1a96d24ec292d5f +"character-entities-html4@npm:^2.0.0": + version: 2.1.0 + resolution: "character-entities-html4@npm:2.1.0" + checksum: 7034aa7c7fa90309667f6dd50499c8a760c3d3a6fb159adb4e0bada0107d194551cdbad0714302f62d06ce4ed68565c8c2e15fdef2e8f8764eb63fa92b34b11d languageName: node linkType: hard @@ -11259,6 +11636,13 @@ __metadata: languageName: node linkType: hard +"character-entities-legacy@npm:^3.0.0": + version: 3.0.0 + resolution: "character-entities-legacy@npm:3.0.0" + checksum: 7582af055cb488b626d364b7d7a4e46b06abd526fb63c0e4eb35bcb9c9799cc4f76b39f34fdccef2d1174ac95e53e9ab355aae83227c1a2505877893fce77731 + languageName: node + linkType: hard + "character-entities@npm:^1.0.0": version: 1.2.4 resolution: "character-entities@npm:1.2.4" @@ -11266,6 +11650,13 @@ __metadata: languageName: node linkType: hard +"character-entities@npm:^2.0.0": + version: 2.0.2 + resolution: "character-entities@npm:2.0.2" + checksum: cf1643814023697f725e47328fcec17923b8f1799102a8a79c1514e894815651794a2bffd84bb1b3a4b124b050154e4529ed6e81f7c8068a734aecf07a6d3def + languageName: node + linkType: hard + "character-reference-invalid@npm:^1.0.0": version: 1.1.4 resolution: "character-reference-invalid@npm:1.1.4" @@ -11273,6 +11664,13 @@ __metadata: languageName: node linkType: hard +"character-reference-invalid@npm:^2.0.0": + version: 2.0.1 + resolution: "character-reference-invalid@npm:2.0.1" + checksum: 98d3b1a52ae510b7329e6ee7f6210df14f1e318c5415975d4c9e7ee0ef4c07875d47c6e74230c64551f12f556b4a8ccc24d9f3691a2aa197019e72a95e9297ee + languageName: node + linkType: hard + "chardet@npm:^0.7.0": version: 0.7.0 resolution: "chardet@npm:0.7.0" @@ -11503,6 +11901,17 @@ __metadata: languageName: node linkType: hard +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" + dependencies: + string-width: ^4.2.0 + strip-ansi: ^6.0.1 + wrap-ansi: ^7.0.0 + checksum: 79648b3b0045f2e285b76fb2e24e207c6db44323581e421c3acbd0e86454cba1b37aea976ab50195a49e7384b871e6dfb2247ad7dec53c02454ac6497394cb56 + languageName: node + linkType: hard + "clone-deep@npm:^4.0.1": version: 4.0.1 resolution: "clone-deep@npm:4.0.1" @@ -11695,14 +12104,14 @@ __metadata: languageName: node linkType: hard -"colorette@npm:^1.2.1": - version: 1.2.2 - resolution: "colorette@npm:1.2.2" - checksum: 69fec14ddaedd0f5b00e4bae40dc4bc61f7050ebdc82983a595d6fd64e650b9dc3c033fff378775683138e992e0ddd8717ac7c7cec4d089679dcfbe3cd921b04 +"colorette@npm:^1.2.1, colorette@npm:^1.2.2": + version: 1.4.0 + resolution: "colorette@npm:1.4.0" + checksum: 01c3c16058b182a4ab4c126a65a75faa4d38a20fa7c845090b25453acec6c371bb2c5dceb0a2338511f17902b9d1a9af0cadd8509c9403894b79311032c256c3 languageName: node linkType: hard -"colorette@npm:^2.0.10, colorette@npm:^2.0.14, colorette@npm:^2.0.16": +"colorette@npm:^2.0.10, colorette@npm:^2.0.14, colorette@npm:^2.0.19": version: 2.0.19 resolution: "colorette@npm:2.0.19" checksum: 888cf5493f781e5fcf54ce4d49e9d7d698f96ea2b2ef67906834bb319a392c667f9ec69f4a10e268d2946d13a9503d2d19b3abaaaf174e3451bfe91fb9d82427 @@ -11752,7 +12161,7 @@ __metadata: languageName: node linkType: hard -"commander@npm:^10.0.0": +"commander@npm:10.0.0, commander@npm:^10.0.0": version: 10.0.0 resolution: "commander@npm:10.0.0" checksum: 9f6495651f878213005ac744dd87a85fa3d9f2b8b90d1c19d0866d666bda7f735adfd7c2f10dfff345782e2f80ea258f98bb4efcef58e4e502f25f883940acfd @@ -11780,7 +12189,7 @@ __metadata: languageName: node linkType: hard -"commander@npm:^7.0.0, commander@npm:^7.2.0": +"commander@npm:^7.2.0": version: 7.2.0 resolution: "commander@npm:7.2.0" checksum: 53501cbeee61d5157546c0bef0fedb6cdfc763a882136284bed9a07225f09a14b82d2a84e7637edfd1a679fb35ed9502fd58ef1d091e6287f60d790147f68ddc @@ -11794,10 +12203,10 @@ __metadata: languageName: node linkType: hard -"commander@npm:^9.4.0": - version: 9.4.1 - resolution: "commander@npm:9.4.1" - checksum: bfb18e325a5bdf772763c2213d5c7d9e77144d944124e988bcd8e5e65fb6d45d5d4e86b09155d0f2556c9a59c31e428720e57968bcd050b2306e910a0bf3cf13 +"commander@npm:^9.4.1": + version: 9.5.0 + resolution: "commander@npm:9.5.0" + checksum: c7a3e27aa59e913b54a1bafd366b88650bc41d6651f0cbe258d4ff09d43d6a7394232a4dadd0bf518b3e696fdf595db1028a0d82c785b88bd61f8a440cecfade languageName: node linkType: hard @@ -12011,25 +12420,14 @@ __metadata: languageName: node linkType: hard -"conventional-changelog-conventionalcommits@npm:4.6.1": - version: 4.6.1 - resolution: "conventional-changelog-conventionalcommits@npm:4.6.1" - dependencies: - compare-func: ^2.0.0 - lodash: ^4.17.21 - q: ^1.5.1 - checksum: f866616c8f6f21cea005b42792451bfbd16bd4d82872867d1218f67a7993a53c5d87e26d6b483d9252e8022f2e4570e6cf9fa2a409aae5a3d73eea92ccf78b13 - languageName: node - linkType: hard - -"conventional-changelog-conventionalcommits@npm:^4.5.0": - version: 4.6.2 - resolution: "conventional-changelog-conventionalcommits@npm:4.6.2" +"conventional-changelog-conventionalcommits@npm:4.6.3, conventional-changelog-conventionalcommits@npm:^4.5.0": + version: 4.6.3 + resolution: "conventional-changelog-conventionalcommits@npm:4.6.3" dependencies: compare-func: ^2.0.0 - lodash: ^4.17.21 + lodash: ^4.17.15 q: ^1.5.1 - checksum: d8e3e1f8cac9dc5d7989f41e91cfe3804e37f4a3775c3ab99028f4113c20c8a9c12e32213a8d69dd537d9b328d7f4d883d73b112933d142da281740701a4dda7 + checksum: 7b8e8a21ebb56f9aaa510e12917b7c609202072c3e71089e0a09630c37c2e8146cdb04364809839b0e3eb55f807fe84d03b2079500b37f6186d505848be5c562 languageName: node linkType: hard @@ -12127,9 +12525,9 @@ __metadata: languageName: node linkType: hard -"conventional-changelog@npm:3.1.24": - version: 3.1.24 - resolution: "conventional-changelog@npm:3.1.24" +"conventional-changelog@npm:3.1.25": + version: 3.1.25 + resolution: "conventional-changelog@npm:3.1.25" dependencies: conventional-changelog-angular: ^5.0.12 conventional-changelog-atom: ^2.0.8 @@ -12142,7 +12540,7 @@ __metadata: conventional-changelog-jquery: ^3.0.11 conventional-changelog-jshint: ^2.0.9 conventional-changelog-preset-loader: ^2.3.4 - checksum: 54253a3e3761369a8c68ec1ea57f3847b323a0104503dfccfd305553f77e83636132406d463dfa60ad3851dba42d84a528e8cb685943e8d6d7ae3eb37aaa19bb + checksum: 1ea18378120cca9fd459f58ed2cf59170773cbfb2fcecad2504c7c44af076c368950013fa16f5e9428f1d723bea4c16e0c48170e152568b73b254a9c1bb93287 languageName: node linkType: hard @@ -12200,6 +12598,13 @@ __metadata: languageName: node linkType: hard +"convert-source-map@npm:^2.0.0": + version: 2.0.0 + resolution: "convert-source-map@npm:2.0.0" + checksum: 63ae9933be5a2b8d4509daca5124e20c14d023c820258e484e32dc324d34c2754e71297c94a05784064ad27615037ef677e3f0c00469fb55f409d2bb21261035 + languageName: node + linkType: hard + "cookie-signature@npm:1.0.6": version: 1.0.6 resolution: "cookie-signature@npm:1.0.6" @@ -12265,6 +12670,18 @@ __metadata: languageName: node linkType: hard +"cosmiconfig-typescript-loader@npm:^4.3.0": + version: 4.3.0 + resolution: "cosmiconfig-typescript-loader@npm:4.3.0" + peerDependencies: + "@types/node": "*" + cosmiconfig: ">=7" + ts-node: ">=10" + typescript: ">=3" + checksum: ea61dfd8e112cf2bb18df0ef89280bd3ae3dd5b997b4a9fc22bbabdc02513aadfbc6d4e15e922b6a9a5d987e9dad42286fa38caf77a9b8dcdbe7d4ce1c9db4fb + languageName: node + linkType: hard + "cosmiconfig@npm:^6.0.0": version: 6.0.0 resolution: "cosmiconfig@npm:6.0.0" @@ -12291,6 +12708,18 @@ __metadata: languageName: node linkType: hard +"cosmiconfig@npm:^8.1.3": + version: 8.1.3 + resolution: "cosmiconfig@npm:8.1.3" + dependencies: + import-fresh: ^3.2.1 + js-yaml: ^4.1.0 + parse-json: ^5.0.0 + path-type: ^4.0.0 + checksum: b3d277bc3a8a9e649bf4c3fc9740f4c52bf07387481302aa79839f595045368903bf26ea24a8f7f7b8b180bf46037b027c5cb63b1391ab099f3f78814a147b2b + languageName: node + linkType: hard + "countries-list@npm:^2.6.1": version: 2.6.1 resolution: "countries-list@npm:2.6.1" @@ -12524,13 +12953,12 @@ __metadata: linkType: hard "css-loader@npm:^5.0.1": - version: 5.2.4 - resolution: "css-loader@npm:5.2.4" + version: 5.2.7 + resolution: "css-loader@npm:5.2.7" dependencies: - camelcase: ^6.2.0 icss-utils: ^5.1.0 - loader-utils: ^2.0.4 - postcss: ^8.2.13 + loader-utils: ^2.0.0 + postcss: ^8.2.15 postcss-modules-extract-imports: ^3.0.0 postcss-modules-local-by-default: ^4.0.0 postcss-modules-scope: ^3.0.0 @@ -12540,43 +12968,25 @@ __metadata: semver: ^7.3.5 peerDependencies: webpack: ^4.27.0 || ^5.0.0 - checksum: b5b158597ccdd8889ba1ea7aa1f5544c8a0725e13cad97af29fd4f954045803985080532f60ef206e7578fac5cff5f912ac6176a84c00a199c1697c2c94d8f95 - languageName: node - linkType: hard - -"css-loader@npm:^6.5.1": - version: 6.7.1 - resolution: "css-loader@npm:6.7.1" - dependencies: - icss-utils: ^5.1.0 - postcss: ^8.4.7 - postcss-modules-extract-imports: ^3.0.0 - postcss-modules-local-by-default: ^4.0.0 - postcss-modules-scope: ^3.0.0 - postcss-modules-values: ^4.0.0 - postcss-value-parser: ^4.2.0 - semver: ^7.3.5 - peerDependencies: - webpack: ^5.0.0 - checksum: 170fdbc630a05a43679ef60fa97694766b568dbde37adccc0faafa964fc675f08b976bc68837bb73b61d60240e8d2cbcbf51540fe94ebc9dafc56e7c46ba5527 + checksum: fb0742b30ac0919f94b99a323bdefe6d48ae46d66c7d966aae59031350532f368f8bba5951fcd268f2e053c5e6e4655551076268e9073ccb58e453f98ae58f8e languageName: node linkType: hard -"css-loader@npm:~6.6.0": - version: 6.6.0 - resolution: "css-loader@npm:6.6.0" +"css-loader@npm:^6.5.1, css-loader@npm:~6.7.3": + version: 6.7.3 + resolution: "css-loader@npm:6.7.3" dependencies: icss-utils: ^5.1.0 - postcss: ^8.4.5 + postcss: ^8.4.19 postcss-modules-extract-imports: ^3.0.0 postcss-modules-local-by-default: ^4.0.0 postcss-modules-scope: ^3.0.0 postcss-modules-values: ^4.0.0 postcss-value-parser: ^4.2.0 - semver: ^7.3.5 + semver: ^7.3.8 peerDependencies: webpack: ^5.0.0 - checksum: cc4117320c2bfbbc3e84cdf811fb29219f1900cf4dcebb7dbf916b7cbdfc193cd9017d19b62be2d57d22baeb791919de52bf2e3086213d184875813817ac290f + checksum: 473cc32b6c837c2848e2051ad1ba331c1457449f47442e75a8c480d9891451434ada241f7e3de2347e57de17fcd84610b3bcfc4a9da41102cdaedd1e17902d31 languageName: node linkType: hard @@ -12687,6 +13097,16 @@ __metadata: languageName: node linkType: hard +"css-tree@npm:^2.3.1": + version: 2.3.1 + resolution: "css-tree@npm:2.3.1" + dependencies: + mdn-data: 2.0.30 + source-map-js: ^1.0.1 + checksum: 493cc24b5c22b05ee5314b8a0d72d8a5869491c1458017ae5ed75aeb6c3596637dbe1b11dac2548974624adec9f7a1f3a6cf40593dc1f9185eb0e8279543fbc0 + languageName: node + linkType: hard + "css-what@npm:2.1": version: 2.1.3 resolution: "css-what@npm:2.1.3" @@ -12821,6 +13241,13 @@ __metadata: languageName: node linkType: hard +"cssom@npm:^0.5.0": + version: 0.5.0 + resolution: "cssom@npm:0.5.0" + checksum: 823471aa30091c59e0a305927c30e7768939b6af70405808f8d2ce1ca778cddcb24722717392438329d1691f9a87cb0183b64b8d779b56a961546d54854fde01 + languageName: node + linkType: hard + "cssom@npm:~0.3.6": version: 0.3.8 resolution: "cssom@npm:0.3.8" @@ -12890,6 +13317,13 @@ __metadata: languageName: node linkType: hard +"data-uri-to-buffer@npm:^4.0.0": + version: 4.0.1 + resolution: "data-uri-to-buffer@npm:4.0.1" + checksum: 0d0790b67ffec5302f204c2ccca4494f70b4e2d940fea3d36b09f0bb2b8539c2e86690429eb1f1dc4bcc9e4df0644193073e63d9ee48ac9fce79ec1506e4aa4c + languageName: node + linkType: hard + "data-urls@npm:^2.0.0": version: 2.0.0 resolution: "data-urls@npm:2.0.0" @@ -12901,6 +13335,17 @@ __metadata: languageName: node linkType: hard +"data-urls@npm:^3.0.2": + version: 3.0.2 + resolution: "data-urls@npm:3.0.2" + dependencies: + abab: ^2.0.6 + whatwg-mimetype: ^3.0.0 + whatwg-url: ^11.0.0 + checksum: 033fc3dd0fba6d24bc9a024ddcf9923691dd24f90a3d26f6545d6a2f71ec6956f93462f2cdf2183cc46f10dc01ed3bcb36731a8208456eb1a08147e571fe2a76 + languageName: node + linkType: hard + "dateformat@npm:^3.0.0": version: 3.0.3 resolution: "dateformat@npm:3.0.3" @@ -12962,10 +13407,19 @@ __metadata: languageName: node linkType: hard -"decimal.js@npm:^10.2.1": - version: 10.3.1 - resolution: "decimal.js@npm:10.3.1" - checksum: 0351ac9f05fe050f23227aa6a4573bee2d58fa7378fcf28d969a8c789525032effb488a90320fd3fe86a66e17b4bc507d811b15eada5b7f0e7ec5d2af4c24a59 +"decimal.js@npm:^10.2.1, decimal.js@npm:^10.4.2": + version: 10.4.3 + resolution: "decimal.js@npm:10.4.3" + checksum: 796404dcfa9d1dbfdc48870229d57f788b48c21c603c3f6554a1c17c10195fc1024de338b0cf9e1efe0c7c167eeb18f04548979bcc5fdfabebb7cc0ae3287bae + languageName: node + linkType: hard + +"decode-named-character-reference@npm:^1.0.0": + version: 1.0.2 + resolution: "decode-named-character-reference@npm:1.0.2" + dependencies: + character-entities: ^2.0.0 + checksum: f4c71d3b93105f20076052f9cb1523a22a9c796b8296cd35eef1ca54239c78d182c136a848b83ff8da2071e3ae2b1d300bf29d00650a6d6e675438cc31b11d78 languageName: node linkType: hard @@ -13138,6 +13592,13 @@ __metadata: languageName: node linkType: hard +"dequal@npm:^2.0.0": + version: 2.0.3 + resolution: "dequal@npm:2.0.3" + checksum: 8679b850e1a3d0ebbc46ee780d5df7b478c23f335887464023a631d1b9af051ad4a6595a44220f9ff8ff95a8ddccf019b5ad778a976fd7bbf77383d36f412f90 + languageName: node + linkType: hard + "des.js@npm:^1.0.0": version: 1.0.1 resolution: "des.js@npm:1.0.1" @@ -13271,10 +13732,10 @@ __metadata: languageName: node linkType: hard -"diff-sequences@npm:^29.0.0": - version: 29.0.0 - resolution: "diff-sequences@npm:29.0.0" - checksum: 2c084a3db03ecde26f649f6f2559974e01e174451debeb301a7e17199e73423a8e8ddeb9a35ae38638c084b4fa51296a4a20fa7f44f3db0c0ba566bdc704ed3d +"diff-sequences@npm:^29.4.3": + version: 29.4.3 + resolution: "diff-sequences@npm:29.4.3" + checksum: 28b265e04fdddcf7f9f814effe102cc95a9dec0564a579b5aed140edb24fc345c611ca52d76d725a3cab55d3888b915b5e8a4702e0f6058968a90fa5f41fcde7 languageName: node linkType: hard @@ -13285,6 +13746,13 @@ __metadata: languageName: node linkType: hard +"diff@npm:^5.0.0": + version: 5.1.0 + resolution: "diff@npm:5.1.0" + checksum: c7bf0df7c9bfbe1cf8a678fd1b2137c4fb11be117a67bc18a0e03ae75105e8533dbfb1cda6b46beb3586ef5aed22143ef9d70713977d5fb1f9114e21455fba90 + languageName: node + linkType: hard + "diffie-hellman@npm:^5.0.0": version: 5.0.3 resolution: "diffie-hellman@npm:5.0.3" @@ -13429,6 +13897,15 @@ __metadata: languageName: node linkType: hard +"domexception@npm:^4.0.0": + version: 4.0.0 + resolution: "domexception@npm:4.0.0" + dependencies: + webidl-conversions: ^7.0.0 + checksum: ddbc1268edf33a8ba02ccc596735ede80375ee0cf124b30d2f05df5b464ba78ef4f49889b6391df4a04954e63d42d5631c7fcf8b1c4f12bc531252977a5f13d5 + languageName: node + linkType: hard + "domhandler@npm:^2.3.0": version: 2.4.2 resolution: "domhandler@npm:2.4.2" @@ -13600,10 +14077,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.4.251": - version: 1.4.284 - resolution: "electron-to-chromium@npm:1.4.284" - checksum: be496e9dca6509dbdbb54dc32146fc99f8eb716d28a7ee8ccd3eba0066561df36fc51418d8bd7cf5a5891810bf56c0def3418e74248f51ea4a843d423603d10a +"electron-to-chromium@npm:^1.4.284": + version: 1.4.359 + resolution: "electron-to-chromium@npm:1.4.359" + checksum: ee8a6eae66a25200b6870dbd6b78d7c0cb2bbb873884d72141871f6e4080955135c16dcf46138158fc5aba5a5fa9177dc0aa37a7f0aaae54bb65305264f72c51 languageName: node linkType: hard @@ -13643,6 +14120,13 @@ __metadata: languageName: node linkType: hard +"emittery@npm:^0.13.1": + version: 0.13.1 + resolution: "emittery@npm:0.13.1" + checksum: 2b089ab6306f38feaabf4f6f02792f9ec85fc054fda79f44f6790e61bbf6bc4e1616afb9b232e0c5ec5289a8a452f79bfa6d905a6fd64e94b49981f0934001c6 + languageName: node + linkType: hard + "emittery@npm:^0.8.1": version: 0.8.1 resolution: "emittery@npm:0.8.1" @@ -13739,13 +14223,13 @@ __metadata: languageName: node linkType: hard -"enhanced-resolve@npm:^5.0.0, enhanced-resolve@npm:^5.10.0": - version: 5.10.0 - resolution: "enhanced-resolve@npm:5.10.0" +"enhanced-resolve@npm:^5.0.0, enhanced-resolve@npm:^5.10.0, enhanced-resolve@npm:^5.12.0": + version: 5.12.0 + resolution: "enhanced-resolve@npm:5.12.0" dependencies: graceful-fs: ^4.2.4 tapable: ^2.2.0 - checksum: 0bb9830704db271610f900e8d79d70a740ea16f251263362b0c91af545576d09fe50103496606c1300a05e588372d6f9780a9bc2e30ce8ef9b827ec8f44687ff + checksum: bf3f787facaf4ce3439bef59d148646344e372bef5557f0d37ea8aa02c51f50a925cd1f07b8d338f18992c29f544ec235a8c64bcdb56030196c48832a5494174 languageName: node linkType: hard @@ -13772,6 +14256,13 @@ __metadata: languageName: node linkType: hard +"entities@npm:^4.4.0": + version: 4.4.0 + resolution: "entities@npm:4.4.0" + checksum: 84d250329f4b56b40fa93ed067b194db21e8815e4eb9b59f43a086f0ecd342814f6bc483de8a77da5d64e0f626033192b1b4f1792232a7ea6b970ebe0f3187c2 + languageName: node + linkType: hard + "env-paths@npm:^2.2.0": version: 2.2.0 resolution: "env-paths@npm:2.2.0" @@ -13872,18 +14363,18 @@ __metadata: languageName: node linkType: hard -"es-check@npm:~7.0.1": - version: 7.0.1 - resolution: "es-check@npm:7.0.1" +"es-check@npm:~7.1.1": + version: 7.1.1 + resolution: "es-check@npm:7.1.1" dependencies: - acorn: ^8.7.0 - commander: ^9.4.0 - fast-glob: ^3.2.11 + acorn: 8.8.2 + commander: 10.0.0 + fast-glob: ^3.2.12 supports-color: ^8.1.1 - winston: ^3.2.1 + winston: ^3.8.2 bin: es-check: index.js - checksum: b56221818d4eca5e490a278984e9b4fcf9a8a8197b80caf5359703a8538bd8c2b1df8b45007bfa8b713aacffd73ed30e7444d988af3455894449a9a52ac6d28c + checksum: 89647ae25a14d941ff510c1c6681ea60952ff769e06159d0ce016e7d72f5478a5f5942525ed335df8254793cdc4b9b86fbbd8b1bc59d8d8ba05a47f22d321c01 languageName: node linkType: hard @@ -14009,14 +14500,14 @@ __metadata: languageName: node linkType: hard -"eslint-config-prettier@npm:~8.5.0": - version: 8.5.0 - resolution: "eslint-config-prettier@npm:8.5.0" +"eslint-config-prettier@npm:~8.8.0": + version: 8.8.0 + resolution: "eslint-config-prettier@npm:8.8.0" peerDependencies: eslint: ">=7.0.0" bin: eslint-config-prettier: bin/cli.js - checksum: 0d0f5c32e7a0ad91249467ce71ca92394ccd343178277d318baf32063b79ea90216f4c81d1065d60f96366fdc60f151d4d68ae7811a58bd37228b84c2083f893 + checksum: 1e94c3882c4d5e41e1dcfa2c368dbccbfe3134f6ac7d40101644d3bfbe3eb2f2ffac757f3145910b5eacf20c0e85e02b91293d3126d770cbf3dc390b3564681c languageName: node linkType: hard @@ -14054,47 +14545,58 @@ __metadata: languageName: node linkType: hard -"eslint-import-resolver-typescript@npm:~3.5.3": - version: 3.5.3 - resolution: "eslint-import-resolver-typescript@npm:3.5.3" +"eslint-import-resolver-typescript@npm:~3.5.5": + version: 3.5.5 + resolution: "eslint-import-resolver-typescript@npm:3.5.5" dependencies: debug: ^4.3.4 - enhanced-resolve: ^5.10.0 - get-tsconfig: ^4.2.0 - globby: ^13.1.2 - is-core-module: ^2.10.0 + 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.4 + synckit: ^0.8.5 peerDependencies: eslint: "*" eslint-plugin-import: "*" - checksum: 63b5f28bec5a29b1d3be33b79795441f7b0da54479e5c99a115877d9b70b2b7464c19a928b4ae7674a937b9ee8e7d4b1d30b7f5e6325c4c3aaa8c607bb175258 + checksum: 27e6276fdff5d377c9036362ff736ac29852106e883ff589ea9092dc57d4bc2a67a82d75134221124f05045f9a7e2114a159b2c827d1f9f64d091f7afeab0f58 languageName: node linkType: hard -"eslint-mdx@npm:^1.17.1": - version: 1.17.1 - resolution: "eslint-mdx@npm:1.17.1" +"eslint-mdx@npm:^2.0.5, eslint-mdx@npm:~2.0.5": + version: 2.0.5 + resolution: "eslint-mdx@npm:2.0.5" dependencies: + acorn: ^8.8.0 + acorn-jsx: ^5.3.2 cosmiconfig: ^7.0.1 - remark-mdx: ^1.6.22 - remark-parse: ^8.0.3 - remark-stringify: ^8.1.1 - tslib: ^2.3.1 - unified: ^9.2.2 + espree: ^9.4.0 + estree-util-visit: ^1.2.0 + remark-mdx: ^2.1.3 + remark-parse: ^10.0.1 + remark-stringify: ^10.0.2 + synckit: ^0.8.4 + tslib: ^2.4.0 + unified: ^10.1.2 + unist-util-visit: ^4.1.1 + uvu: ^0.5.6 + vfile: ^5.3.4 peerDependencies: - eslint: ">=5.0.0" - checksum: 390a1c5141ff18e8edc985e97c1534d0ba0fd3af83c96e8a256fc79c648a3323a048c73c70914e264ffba62ccf051b5daab9dbce804d52a9842083bb13ff10a6 + eslint: ">=8.0.0" + checksum: f03009d2c19440e5687584d895ba9e0ababd501531ad539838a5b3d81b5aec2632321fa2cd748fe1041f1ce1d0955581b4fabe4cd7d0ff9a4b2582b7f5871de6 languageName: node linkType: hard -"eslint-module-utils@npm:^2.7.3": - version: 2.7.3 - resolution: "eslint-module-utils@npm:2.7.3" +"eslint-module-utils@npm:^2.7.3, eslint-module-utils@npm:^2.7.4": + version: 2.7.4 + resolution: "eslint-module-utils@npm:2.7.4" dependencies: debug: ^3.2.7 - find-up: ^2.1.0 - checksum: 77048263f309167a1e6a1e1b896bfb5ddd1d3859b2e2abbd9c32c432aee13d610d46e6820b1ca81b37fba437cf423a404bc6649be64ace9148a3062d1886a678 + peerDependenciesMeta: + eslint: + optional: true + checksum: 5da13645daff145a5c922896b258f8bba560722c3767254e458d894ff5fbb505d6dfd945bffa932a5b0ae06714da2379bd41011c4c20d2d59cc83e23895360f7 languageName: node linkType: hard @@ -14112,7 +14614,7 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-import@npm:^2.25.3, eslint-plugin-import@npm:^2.26.0, eslint-plugin-import@npm:~2.26.0": +"eslint-plugin-import@npm:^2.25.3, eslint-plugin-import@npm:~2.26.0": version: 2.26.0 resolution: "eslint-plugin-import@npm:2.26.0" dependencies: @@ -14175,29 +14677,32 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-markdown@npm:^2.2.1": - version: 2.2.1 - resolution: "eslint-plugin-markdown@npm:2.2.1" +"eslint-plugin-markdown@npm:^3.0.0": + version: 3.0.0 + resolution: "eslint-plugin-markdown@npm:3.0.0" dependencies: mdast-util-from-markdown: ^0.8.5 peerDependencies: - eslint: ">=6.0.0" - checksum: 68be3ac504f0bef6a50b092b4a6d46188e4be713c9fa18dcab2a5dff577714c71b5064219214db8324629f36128f1f13e2d5ba55ef2f053fb48fb65576db9c66 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: ea9e8613cffcf7decbc2de0c900a83553ccdccfb6d90187e5d461a457a403d2634585a8c165cc4adf52c86f3b910161f33b1f24a46f296c4a577d2547780c997 languageName: node linkType: hard -"eslint-plugin-mdx@npm:~1.17.1": - version: 1.17.1 - resolution: "eslint-plugin-mdx@npm:1.17.1" +"eslint-plugin-mdx@npm:~2.0.5": + version: 2.0.5 + resolution: "eslint-plugin-mdx@npm:2.0.5" dependencies: - eslint-mdx: ^1.17.1 - eslint-plugin-markdown: ^2.2.1 - synckit: ^0.4.1 - tslib: ^2.3.1 - vfile: ^4.2.1 + eslint-mdx: ^2.0.5 + eslint-plugin-markdown: ^3.0.0 + remark-mdx: ^2.1.3 + remark-parse: ^10.0.1 + remark-stringify: ^10.0.2 + tslib: ^2.4.0 + unified: ^10.1.2 + vfile: ^5.3.4 peerDependencies: - eslint: ">=5.0.0" - checksum: 43514901591fcbadbb9d2c94beb54847caa33c8cafd74e3eeb5bffa6ee1b12ce9e38bd3e147a078dfe2d03f3cd1ec645ce9cb64959db802df312a828ca01b0fa + eslint: ">=8.0.0" + checksum: dee06fbd3a3b1383b5cabdfeb006c9ce5ecc7c53ee8ef313757d1432db6a2e0599d80bde1125d83ec3c9e7d50b05be98ab620a43332b640149fd51230248971e languageName: node linkType: hard @@ -14225,9 +14730,9 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-react@npm:^7.27.1, eslint-plugin-react@npm:~7.31.11": - version: 7.31.11 - resolution: "eslint-plugin-react@npm:7.31.11" +"eslint-plugin-react@npm:^7.27.1, eslint-plugin-react@npm:~7.32.2": + version: 7.32.2 + resolution: "eslint-plugin-react@npm:7.32.2" dependencies: array-includes: ^3.1.6 array.prototype.flatmap: ^1.3.1 @@ -14241,12 +14746,12 @@ __metadata: object.hasown: ^1.1.2 object.values: ^1.1.6 prop-types: ^15.8.1 - resolve: ^2.0.0-next.3 + resolve: ^2.0.0-next.4 semver: ^6.3.0 string.prototype.matchall: ^4.0.8 peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: a3d612f6647bef33cf2a67c81a6b37b42c075300ed079cffecf5fb475c0d6ab855c1de340d1cbf361a0126429fb906dda597527235d2d12c4404453dbc712fc6 + checksum: 2232b3b8945aa50b7773919c15cd96892acf35d2f82503667a79e2f55def90f728ed4f0e496f0f157acbe1bd4397c5615b676ae7428fe84488a544ca53feb944 languageName: node linkType: hard @@ -14309,10 +14814,10 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.0.0, eslint-visitor-keys@npm:^3.3.0": - version: 3.3.0 - resolution: "eslint-visitor-keys@npm:3.3.0" - checksum: d59e68a7c5a6d0146526b0eec16ce87fbf97fe46b8281e0d41384224375c4e52f5ffb9e16d48f4ea50785cde93f766b0c898e31ab89978d88b0e1720fbfb7808 +"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.0": + version: 3.4.0 + resolution: "eslint-visitor-keys@npm:3.4.0" + checksum: 33159169462d3989321a1ec1e9aaaf6a24cc403d5d347e9886d1b5bfe18ffa1be73bdc6203143a28a606b142b1af49787f33cff0d6d0813eb5f2e8d2e1a6043c languageName: node linkType: hard @@ -14339,12 +14844,15 @@ __metadata: languageName: node linkType: hard -"eslint@npm:^8.3.0, eslint@npm:~8.26.0": - version: 8.26.0 - resolution: "eslint@npm:8.26.0" +"eslint@npm:^8.3.0, eslint@npm:~8.38.0": + version: 8.38.0 + resolution: "eslint@npm:8.38.0" dependencies: - "@eslint/eslintrc": ^1.3.3 - "@humanwhocodes/config-array": ^0.11.6 + "@eslint-community/eslint-utils": ^4.2.0 + "@eslint-community/regexpp": ^4.4.0 + "@eslint/eslintrc": ^2.0.2 + "@eslint/js": 8.38.0 + "@humanwhocodes/config-array": ^0.11.8 "@humanwhocodes/module-importer": ^1.0.1 "@nodelib/fs.walk": ^1.2.8 ajv: ^6.10.0 @@ -14354,16 +14862,15 @@ __metadata: doctrine: ^3.0.0 escape-string-regexp: ^4.0.0 eslint-scope: ^7.1.1 - eslint-utils: ^3.0.0 - eslint-visitor-keys: ^3.3.0 - espree: ^9.4.0 - esquery: ^1.4.0 + eslint-visitor-keys: ^3.4.0 + espree: ^9.5.1 + esquery: ^1.4.2 esutils: ^2.0.2 fast-deep-equal: ^3.1.3 file-entry-cache: ^6.0.1 find-up: ^5.0.0 glob-parent: ^6.0.2 - globals: ^13.15.0 + globals: ^13.19.0 grapheme-splitter: ^1.0.4 ignore: ^5.2.0 import-fresh: ^3.0.0 @@ -14378,24 +14885,23 @@ __metadata: minimatch: ^3.1.2 natural-compare: ^1.4.0 optionator: ^0.9.1 - regexpp: ^3.2.0 strip-ansi: ^6.0.1 strip-json-comments: ^3.1.0 text-table: ^0.2.0 bin: eslint: bin/eslint.js - checksum: a2aced939ea060f77d10dcfced5cfeb940f63f383fd7ab1decadea64170ab552582e1c5909db1db641d4283178c9bc569f19b0f8900e00314a5f783e4b3f759d + checksum: 73b6d9b650d0434aa7c07d0a1802f099b086ee70a8d8ba7be730439a26572a5eb71def12125c82942be2ec8ee5be38a6f1b42a13e40d4b67f11a148ec9e263eb languageName: node linkType: hard -"espree@npm:^9.4.0": - version: 9.4.0 - resolution: "espree@npm:9.4.0" +"espree@npm:^9.4.0, espree@npm:^9.5.1": + version: 9.5.1 + resolution: "espree@npm:9.5.1" dependencies: acorn: ^8.8.0 acorn-jsx: ^5.3.2 - eslint-visitor-keys: ^3.3.0 - checksum: 2e3020dde67892d2ba3632413b44d0dc31d92c29ce72267d7ec24216a562f0a6494d3696e2fa39a3ec8c0e0088d773947ab2925fbb716801a11eb8dd313ac89c + eslint-visitor-keys: ^3.4.0 + checksum: cdf6e43540433d917c4f2ee087c6e987b2063baa85a1d9cdaf51533d78275ebd5910c42154e7baf8e3e89804b386da0a2f7fad2264d8f04420e7506bf87b3b88 languageName: node linkType: hard @@ -14409,12 +14915,12 @@ __metadata: languageName: node linkType: hard -"esquery@npm:^1.4.0": - version: 1.4.0 - resolution: "esquery@npm:1.4.0" +"esquery@npm:^1.4.2": + version: 1.5.0 + resolution: "esquery@npm:1.5.0" dependencies: estraverse: ^5.1.0 - checksum: a0807e17abd7fbe5fbd4fab673038d6d8a50675cdae6b04fbaa520c34581be0c5fa24582990e8acd8854f671dd291c78bb2efb9e0ed5b62f33bac4f9cf820210 + checksum: aefb0d2596c230118656cd4ec7532d447333a410a48834d80ea648b1e7b5c9bc9ed8b5e33a89cb04e487b60d622f44cf5713bf4abed7c97343edefdc84a35900 languageName: node linkType: hard @@ -14441,6 +14947,23 @@ __metadata: languageName: node linkType: hard +"estree-util-is-identifier-name@npm:^2.0.0": + version: 2.1.0 + resolution: "estree-util-is-identifier-name@npm:2.1.0" + checksum: cab317a071fafb99cf83b57df7924bccd2e6ab4e252688739e49f00b16cefd168e279c171442b0557c80a1c80ffaa927d670dadea65bb3c9b151efb8e772e89d + languageName: node + linkType: hard + +"estree-util-visit@npm:^1.0.0, estree-util-visit@npm:^1.2.0": + version: 1.2.1 + resolution: "estree-util-visit@npm:1.2.1" + dependencies: + "@types/estree-jsx": ^1.0.0 + "@types/unist": ^2.0.0 + checksum: 6feea4fdc43b0ba0f79faf1d57cf32373007e146d4810c7c09c13f5a9c1b8600c1ac57a8d949967cedd2a9a91dddd246e19b59bacfc01e417168b4ebf220f691 + languageName: node + linkType: hard + "estree-walker@npm:^1.0.1": version: 1.0.1 resolution: "estree-walker@npm:1.0.1" @@ -14548,6 +15071,23 @@ __metadata: languageName: node linkType: hard +"execa@npm:^7.0.0": + version: 7.1.1 + resolution: "execa@npm:7.1.1" + dependencies: + cross-spawn: ^7.0.3 + get-stream: ^6.0.1 + human-signals: ^4.3.0 + is-stream: ^3.0.0 + merge-stream: ^2.0.0 + npm-run-path: ^5.1.0 + onetime: ^6.0.0 + signal-exit: ^3.0.7 + strip-final-newline: ^3.0.0 + checksum: 21fa46fc69314ace4068cf820142bdde5b643a5d89831c2c9349479c1555bff137a291b8e749e7efca36535e4e0a8c772c11008ca2e84d2cbd6ca141a3c8f937 + languageName: node + linkType: hard + "exit@npm:^0.1.2": version: 0.1.2 resolution: "exit@npm:0.1.2" @@ -14589,16 +15129,16 @@ __metadata: languageName: node linkType: hard -"expect@npm:^29.0.0": - version: 29.0.2 - resolution: "expect@npm:29.0.2" +"expect@npm:^29.0.0, expect@npm:^29.5.0": + version: 29.5.0 + resolution: "expect@npm:29.5.0" dependencies: - "@jest/expect-utils": ^29.0.2 - jest-get-type: ^29.0.0 - jest-matcher-utils: ^29.0.2 - jest-message-util: ^29.0.2 - jest-util: ^29.0.2 - checksum: 1e2a3707cd27c3485cb2ed0f1793cfca9efa67ec1e18ca3dc36c5d09e7219ba05e948d3e91bdaa01cc2f8cf1def5711ca0e484ba665e755f9d0aeba4884eab83 + "@jest/expect-utils": ^29.5.0 + jest-get-type: ^29.4.3 + jest-matcher-utils: ^29.5.0 + jest-message-util: ^29.5.0 + jest-util: ^29.5.0 + checksum: 58f70b38693df6e5c6892db1bcd050f0e518d6f785175dc53917d4fa6a7359a048e5690e19ddcb96b65c4493881dd89a3dabdab1a84dfa55c10cdbdabf37b2d7 languageName: node linkType: hard @@ -14736,7 +15276,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.12, fast-glob@npm:^3.2.7, fast-glob@npm:^3.2.9, fast-glob@npm:~3.2.12": +"fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.12, fast-glob@npm:^3.2.9, fast-glob@npm:~3.2.12": version: 3.2.12 resolution: "fast-glob@npm:3.2.12" dependencies: @@ -14811,6 +15351,16 @@ __metadata: languageName: node linkType: hard +"fetch-blob@npm:^3.1.2, fetch-blob@npm:^3.1.4": + version: 3.2.0 + resolution: "fetch-blob@npm:3.2.0" + dependencies: + node-domexception: ^1.0.0 + web-streams-polyfill: ^3.0.3 + checksum: f19bc28a2a0b9626e69fd7cf3a05798706db7f6c7548da657cbf5026a570945f5eeaedff52007ea35c8bcd3d237c58a20bf1543bc568ab2422411d762dd3d5bf + languageName: node + linkType: hard + "fetch-retry@npm:^5.0.2": version: 5.0.3 resolution: "fetch-retry@npm:5.0.3" @@ -14954,14 +15504,14 @@ __metadata: languageName: node linkType: hard -"find-cache-dir@npm:^3.3.1": - version: 3.3.1 - resolution: "find-cache-dir@npm:3.3.1" +"find-cache-dir@npm:^3.3.1, find-cache-dir@npm:^3.3.2": + version: 3.3.2 + resolution: "find-cache-dir@npm:3.3.2" dependencies: commondir: ^1.0.1 make-dir: ^3.0.2 pkg-dir: ^4.1.0 - checksum: 0f7c22b65e07f9b486b4560227d014fab1e79ffbbfbafb87d113a2e878510bd620ef6fdff090e5248bb2846d28851d19e42bfdc7c50687966acc106328e7abf1 + checksum: 1e61c2e64f5c0b1c535bd85939ae73b0e5773142713273818cc0b393ee3555fb0fd44e1a5b161b8b6c3e03e98c2fcc9c227d784850a13a90a8ab576869576817 languageName: node linkType: hard @@ -14975,7 +15525,7 @@ __metadata: languageName: node linkType: hard -"find-up@npm:^2.0.0, find-up@npm:^2.1.0": +"find-up@npm:^2.0.0": version: 2.1.0 resolution: "find-up@npm:2.1.0" dependencies: @@ -15126,8 +15676,8 @@ __metadata: linkType: hard "fork-ts-checker-webpack-plugin@npm:^6.0.4, fork-ts-checker-webpack-plugin@npm:^6.5.0": - version: 6.5.2 - resolution: "fork-ts-checker-webpack-plugin@npm:6.5.2" + version: 6.5.3 + resolution: "fork-ts-checker-webpack-plugin@npm:6.5.3" dependencies: "@babel/code-frame": ^7.8.3 "@types/json-schema": ^7.0.5 @@ -15138,7 +15688,7 @@ __metadata: fs-extra: ^9.0.0 glob: ^7.1.6 memfs: ^3.1.2 - minimatch: ^3.0.5 + minimatch: ^3.0.4 schema-utils: 2.7.0 semver: ^7.3.2 tapable: ^1.0.0 @@ -15152,7 +15702,7 @@ __metadata: optional: true vue-template-compiler: optional: true - checksum: c823de02ee258a26ea5c0c488b2f1825b941f72292417478689862468a9140b209ad7df52f67bd134228fe9f40e9115b604fc8f88a69338929fe52be869469b6 + checksum: 9732a49bfeed8fc23e6e8a59795fa7c238edeba91040a9b520db54b4d316dda27f9f1893d360e296fd0ad8930627d364417d28a8c7007fba60cc730ebfce4956 languageName: node linkType: hard @@ -15167,6 +15717,17 @@ __metadata: languageName: node linkType: hard +"form-data@npm:^4.0.0": + version: 4.0.0 + resolution: "form-data@npm:4.0.0" + dependencies: + asynckit: ^0.4.0 + combined-stream: ^1.0.8 + mime-types: ^2.1.12 + checksum: 01135bf8675f9d5c61ff18e2e2932f719ca4de964e3be90ef4c36aacfc7b9cb2fceb5eca0b7e0190e3383fe51c5b37f4cb80b62ca06a99aaabfcfd6ac7c9328c + languageName: node + linkType: hard + "form-data@npm:~2.3.2": version: 2.3.3 resolution: "form-data@npm:2.3.3" @@ -15178,6 +15739,15 @@ __metadata: languageName: node linkType: hard +"formdata-polyfill@npm:^4.0.10": + version: 4.0.10 + resolution: "formdata-polyfill@npm:4.0.10" + dependencies: + fetch-blob: ^3.1.2 + checksum: 82a34df292afadd82b43d4a740ce387bc08541e0a534358425193017bf9fb3567875dc5f69564984b1da979979b70703aa73dee715a17b6c229752ae736dd9db + languageName: node + linkType: hard + "forwarded@npm:0.2.0": version: 0.2.0 resolution: "forwarded@npm:0.2.0" @@ -15234,15 +15804,6 @@ __metadata: languageName: node linkType: hard -"fs-access@npm:^1.0.1": - version: 1.0.1 - resolution: "fs-access@npm:1.0.1" - dependencies: - null-check: ^1.0.0 - checksum: 6792b115a5fc5095b3dbc42ea329afff372e0056fde8214a5b0c9c7559806378db9316660bac1682b295cc576bab3c19571f50f8a39ab4605c3d194bee0087c9 - languageName: node - linkType: hard - "fs-constants@npm:^1.0.0": version: 1.0.0 resolution: "fs-constants@npm:1.0.0" @@ -15274,6 +15835,17 @@ __metadata: languageName: node linkType: hard +"fs-extra@npm:^11.1.0": + version: 11.1.1 + resolution: "fs-extra@npm:11.1.1" + dependencies: + graceful-fs: ^4.2.0 + jsonfile: ^6.0.1 + universalify: ^2.0.0 + checksum: fb883c68245b2d777fbc1f2082c9efb084eaa2bbf9fddaa366130d196c03608eebef7fb490541276429ee1ca99f317e2d73e96f5ca0999eefedf5a624ae1edfd + languageName: node + linkType: hard + "fs-extra@npm:^8.1.0": version: 8.1.0 resolution: "fs-extra@npm:8.1.0" @@ -15400,13 +15972,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"functional-red-black-tree@npm:^1.0.1": - version: 1.0.1 - resolution: "functional-red-black-tree@npm:1.0.1" - checksum: ca6c170f37640e2d94297da8bb4bf27a1d12bea3e00e6a3e007fd7aa32e37e000f5772acf941b4e4f3cf1c95c3752033d0c509af157ad8f526e7f00723b9eb9f - languageName: node - linkType: hard - "functions-have-names@npm:^1.2.2": version: 1.2.3 resolution: "functions-have-names@npm:1.2.3" @@ -15555,10 +16120,10 @@ fsevents@^1.2.7: languageName: node linkType: hard -"get-stream@npm:^6.0.0": - version: 6.0.0 - resolution: "get-stream@npm:6.0.0" - checksum: 587e6a93127f9991b494a566f4971cf7a2645dfa78034818143480a80587027bdd8826cdcf80d0eff4a4a19de0d231d157280f24789fc9cc31492e1dcc1290cf +"get-stream@npm:^6.0.0, get-stream@npm:^6.0.1": + version: 6.0.1 + resolution: "get-stream@npm:6.0.1" + checksum: e04ecece32c92eebf5b8c940f51468cd53554dcbb0ea725b2748be583c9523d00128137966afce410b9b051eb2ef16d657cd2b120ca8edafcf5a65e81af63cad languageName: node linkType: hard @@ -15572,10 +16137,10 @@ fsevents@^1.2.7: languageName: node linkType: hard -"get-tsconfig@npm:^4.2.0": - version: 4.2.0 - resolution: "get-tsconfig@npm:4.2.0" - checksum: dfae3520bee20b71a651fdc93fd29901013dfc4df9fb41a423cf3efb4468c79087ef9d3bc3d0625b6486397730991d2a749eed4985d8ab411f481319c3e931e5 +"get-tsconfig@npm:^4.5.0": + version: 4.5.0 + resolution: "get-tsconfig@npm:4.5.0" + checksum: 687ee2bd69a5a07db2e2edeb4d6c41c3debb38f6281a66beb643e3f5b520252e27fcbbb5702bdd9a5f05dcf8c1d2e0150a4d8a960ad75cbdea74e06a51e91b02 languageName: node linkType: hard @@ -15751,7 +16316,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"glob@npm:^8.0.1, glob@npm:^8.0.3": +"glob@npm:^8.0.1": version: 8.0.3 resolution: "glob@npm:8.0.3" dependencies: @@ -15801,12 +16366,12 @@ fsevents@^1.2.7: languageName: node linkType: hard -"globals@npm:^13.15.0": - version: 13.17.0 - resolution: "globals@npm:13.17.0" +"globals@npm:^13.19.0": + version: 13.20.0 + resolution: "globals@npm:13.20.0" dependencies: type-fest: ^0.20.2 - checksum: fbaf4112e59b92c9f5575e85ce65e9e17c0b82711196ec5f58beb08599bbd92fd72703d6dfc9b080381fd35b644e1b11dcf25b38cc2341ec21df942594cbc8ce + checksum: ad1ecf914bd051325faad281d02ea2c0b1df5d01bd94d368dcc5513340eac41d14b3c61af325768e3c7f8d44576e72780ec0b6f2d366121f8eec6e03c3a3b97a languageName: node linkType: hard @@ -15840,30 +16405,16 @@ fsevents@^1.2.7: languageName: node linkType: hard -"globby@npm:^12.0.1": - version: 12.2.0 - resolution: "globby@npm:12.2.0" - dependencies: - array-union: ^3.0.1 - dir-glob: ^3.0.1 - fast-glob: ^3.2.7 - ignore: ^5.1.9 - merge2: ^1.4.1 - slash: ^4.0.0 - checksum: 2539379a7fff3473d3e7c68b4540ba38f36970f43f760e36e301515d5cb98a0c5736554957d90390906bee632327beb2f9518d1acd6911f61e436db11b0da5b5 - languageName: node - linkType: hard - -"globby@npm:^13.1.2": - version: 13.1.2 - resolution: "globby@npm:13.1.2" +"globby@npm:^13.1.3": + version: 13.1.4 + resolution: "globby@npm:13.1.4" dependencies: dir-glob: ^3.0.1 fast-glob: ^3.2.11 ignore: ^5.2.0 merge2: ^1.4.1 slash: ^4.0.0 - checksum: c148fcda0c981f00fb434bb94ca258f0a9d23cedbde6fb3f37098e1abde5b065019e2c63fe2aa2fad4daf2b54bf360b4d0423d85fb3a63d09ed75a2837d4de0f + checksum: e8bc13879972082d590cd1b0e27080d90d2e12fff7eeb2cee9329c29115ace14cc5b9f899e3d6beb136ba826307a727016658919a6f383e1511d698acee81741 languageName: node linkType: hard @@ -16344,8 +16895,17 @@ fsevents@^1.2.7: languageName: node linkType: hard -"html-entities@npm:^2.1.0, html-entities@npm:^2.3.2": - version: 2.3.3 +"html-encoding-sniffer@npm:^3.0.0": + version: 3.0.0 + resolution: "html-encoding-sniffer@npm:3.0.0" + dependencies: + whatwg-encoding: ^2.0.0 + checksum: 8d806aa00487e279e5ccb573366a951a9f68f65c90298eac9c3a2b440a7ffe46615aff2995a2f61c6746c639234e6179a97e18ca5ccbbf93d3725ef2099a4502 + languageName: node + linkType: hard + +"html-entities@npm:^2.1.0, html-entities@npm:^2.3.2": + version: 2.3.3 resolution: "html-entities@npm:2.3.3" checksum: 92521501da8aa5f66fee27f0f022d6e9ceae62667dae93aa6a2f636afa71ad530b7fb24a18d4d6c124c9885970cac5f8a52dbf1731741161002816ae43f98196 languageName: node @@ -16600,13 +17160,13 @@ fsevents@^1.2.7: languageName: node linkType: hard -"https-proxy-agent@npm:^5.0.0": - version: 5.0.0 - resolution: "https-proxy-agent@npm:5.0.0" +"https-proxy-agent@npm:^5.0.0, https-proxy-agent@npm:^5.0.1": + version: 5.0.1 + resolution: "https-proxy-agent@npm:5.0.1" dependencies: agent-base: 6 debug: 4 - checksum: 165bfb090bd26d47693597661298006841ab733d0c7383a8cb2f17373387a94c903a3ac687090aa739de05e379ab6f868bae84ab4eac288ad85c328cd1ec9e53 + checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 languageName: node linkType: hard @@ -16617,6 +17177,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"human-signals@npm:^4.3.0": + version: 4.3.1 + resolution: "human-signals@npm:4.3.1" + checksum: 6f12958df3f21b6fdaf02d90896c271df00636a31e2bbea05bddf817a35c66b38a6fdac5863e2df85bd52f34958997f1f50350ff97249e1dff8452865d5235d1 + languageName: node + linkType: hard + "humanize-ms@npm:^1.2.1": version: 1.2.1 resolution: "humanize-ms@npm:1.2.1" @@ -16676,7 +17243,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"iconv-lite@npm:^0.6.2, iconv-lite@npm:^0.6.3": +"iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2, iconv-lite@npm:^0.6.3": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" dependencies: @@ -16758,10 +17325,10 @@ fsevents@^1.2.7: languageName: node linkType: hard -"ignore@npm:^5.1.8, ignore@npm:^5.1.9, ignore@npm:^5.2.0": - version: 5.2.0 - resolution: "ignore@npm:5.2.0" - checksum: 6b1f926792d614f64c6c83da3a1f9c83f6196c2839aa41e1e32dd7b8d174cef2e329d75caabb62cb61ce9dc432f75e67d07d122a037312db7caa73166a1bdb77 +"ignore@npm:^5.2.0, ignore@npm:^5.2.4": + version: 5.2.4 + resolution: "ignore@npm:5.2.4" + checksum: 3d4c309c6006e2621659311783eaea7ebcd41fe4ca1d78c91c473157ad6666a57a2df790fe0d07a12300d9aac2888204d7be8d59f9aaf665b1c7fcdb432517ef languageName: node linkType: hard @@ -16952,6 +17519,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"interpret@npm:^3.1.1": + version: 3.1.1 + resolution: "interpret@npm:3.1.1" + checksum: 35cebcf48c7351130437596d9ab8c8fe131ce4038da4561e6d665f25640e0034702a031cf7e3a5cea60ac7ac548bf17465e0571ede126f3d3a6933152171ac82 + languageName: node + linkType: hard + "intl-messageformat@npm:^10.1.0": version: 10.1.4 resolution: "intl-messageformat@npm:10.1.4" @@ -17026,10 +17600,10 @@ fsevents@^1.2.7: languageName: node linkType: hard -"is-alphanumeric@npm:^1.0.0": - version: 1.0.0 - resolution: "is-alphanumeric@npm:1.0.0" - checksum: 2f4f4f227fe4cae977529f628021655edc172e1e5debfb3c30efd547f32e8d390c9bb7a71f3e9fea4187fe6598980072323d5a1b1abd3368379e33ba6504558c +"is-alphabetical@npm:^2.0.0": + version: 2.0.1 + resolution: "is-alphabetical@npm:2.0.1" + checksum: 56207db8d9de0850f0cd30f4966bf731eb82cedfe496cbc2e97e7c3bacaf66fc54a972d2d08c0d93bb679cb84976a05d24c5ad63de56fabbfc60aadae312edaa languageName: node linkType: hard @@ -17043,6 +17617,16 @@ fsevents@^1.2.7: languageName: node linkType: hard +"is-alphanumerical@npm:^2.0.0": + version: 2.0.1 + resolution: "is-alphanumerical@npm:2.0.1" + dependencies: + is-alphabetical: ^2.0.0 + is-decimal: ^2.0.0 + checksum: 87acc068008d4c9c4e9f5bd5e251041d42e7a50995c77b1499cf6ed248f971aadeddb11f239cabf09f7975ee58cac7a48ffc170b7890076d8d227b24a68663c9 + languageName: node + linkType: hard + "is-arguments@npm:^1.0.4": version: 1.1.0 resolution: "is-arguments@npm:1.1.0" @@ -17143,12 +17727,12 @@ fsevents@^1.2.7: languageName: node linkType: hard -"is-core-module@npm:^2.10.0, is-core-module@npm:^2.2.0, is-core-module@npm:^2.8.1, is-core-module@npm:^2.9.0": - version: 2.11.0 - resolution: "is-core-module@npm:2.11.0" +"is-core-module@npm:^2.11.0, is-core-module@npm:^2.8.1, is-core-module@npm:^2.9.0": + version: 2.12.0 + resolution: "is-core-module@npm:2.12.0" dependencies: has: ^1.0.3 - checksum: f96fd490c6b48eb4f6d10ba815c6ef13f410b0ba6f7eb8577af51697de523e5f2cd9de1c441b51d27251bf0e4aebc936545e33a5d26d5d51f28d25698d4a8bab + checksum: f7f7eb2ab71fd769ee9fb2385c095d503aa4b5ce0028c04557de03f1e67a87c85e5bac1f215945fc3c955867a139a415a3ec4c4234a0bffdf715232660f440a6 languageName: node linkType: hard @@ -17184,6 +17768,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"is-decimal@npm:^2.0.0": + version: 2.0.1 + resolution: "is-decimal@npm:2.0.1" + checksum: 97132de7acdce77caa7b797632970a2ecd649a88e715db0e4dbc00ab0708b5e7574ba5903962c860cd4894a14fd12b100c0c4ac8aed445cf6f55c6cf747a4158 + languageName: node + linkType: hard + "is-descriptor@npm:^0.1.0": version: 0.1.6 resolution: "is-descriptor@npm:0.1.6" @@ -17324,6 +17915,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"is-hexadecimal@npm:^2.0.0": + version: 2.0.1 + resolution: "is-hexadecimal@npm:2.0.1" + checksum: 66a2ea85994c622858f063f23eda506db29d92b52580709eb6f4c19550552d4dcf3fb81952e52f7cf972097237959e00adc7bb8c9400cd12886e15bf06145321 + languageName: node + linkType: hard + "is-lambda@npm:^1.0.1": version: 1.0.1 resolution: "is-lambda@npm:1.0.1" @@ -17433,6 +18031,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"is-plain-obj@npm:^4.0.0": + version: 4.1.0 + resolution: "is-plain-obj@npm:4.1.0" + checksum: 6dc45da70d04a81f35c9310971e78a6a3c7a63547ef782e3a07ee3674695081b6ca4e977fbb8efc48dae3375e0b34558d2bcd722aec9bddfa2d7db5b041be8ce + languageName: node + linkType: hard + "is-plain-object@npm:5.0.0, is-plain-object@npm:^5.0.0": version: 5.0.0 resolution: "is-plain-object@npm:5.0.0" @@ -17528,6 +18133,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"is-stream@npm:^3.0.0": + version: 3.0.0 + resolution: "is-stream@npm:3.0.0" + checksum: 172093fe99119ffd07611ab6d1bcccfe8bc4aa80d864b15f43e63e54b7abc71e779acd69afdb854c4e2a67fdc16ae710e370eda40088d1cfc956a50ed82d8f16 + languageName: node + linkType: hard + "is-string@npm:^1.0.5, is-string@npm:^1.0.7": version: 1.0.7 resolution: "is-string@npm:1.0.7" @@ -17806,6 +18418,16 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-changed-files@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-changed-files@npm:29.5.0" + dependencies: + execa: ^5.0.0 + p-limit: ^3.1.0 + checksum: a67a7cb3c11f8f92bd1b7c79e84f724cbd11a9ad51f3cdadafe3ce7ee3c79ee50dbea128f920f5fddc807e9e4e83f5462143094391feedd959a77dd20ab96cf3 + languageName: node + linkType: hard + "jest-circus@npm:^27.5.1": version: 27.5.1 resolution: "jest-circus@npm:27.5.1" @@ -17833,6 +18455,34 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-circus@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-circus@npm:29.5.0" + dependencies: + "@jest/environment": ^29.5.0 + "@jest/expect": ^29.5.0 + "@jest/test-result": ^29.5.0 + "@jest/types": ^29.5.0 + "@types/node": "*" + chalk: ^4.0.0 + co: ^4.6.0 + dedent: ^0.7.0 + is-generator-fn: ^2.0.0 + jest-each: ^29.5.0 + jest-matcher-utils: ^29.5.0 + jest-message-util: ^29.5.0 + jest-runtime: ^29.5.0 + jest-snapshot: ^29.5.0 + jest-util: ^29.5.0 + p-limit: ^3.1.0 + pretty-format: ^29.5.0 + pure-rand: ^6.0.0 + slash: ^3.0.0 + stack-utils: ^2.0.3 + checksum: 44ff5d06acedae6de6c866e20e3b61f83e29ab94cf9f960826e7e667de49c12dd9ab9dffd7fa3b7d1f9688a8b5bfb1ebebadbea69d9ed0d3f66af4a0ff8c2b27 + languageName: node + linkType: hard + "jest-cli@npm:^27.5.1": version: 27.5.1 resolution: "jest-cli@npm:27.5.1" @@ -17860,6 +18510,33 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-cli@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-cli@npm:29.5.0" + dependencies: + "@jest/core": ^29.5.0 + "@jest/test-result": ^29.5.0 + "@jest/types": ^29.5.0 + chalk: ^4.0.0 + exit: ^0.1.2 + graceful-fs: ^4.2.9 + import-local: ^3.0.2 + jest-config: ^29.5.0 + jest-util: ^29.5.0 + jest-validate: ^29.5.0 + prompts: ^2.0.1 + yargs: ^17.3.1 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: 39897bbbc0f0d8a6b975ab12fd13887eaa28d92e3dee9e0173a5cb913ae8cc2ae46e090d38c6d723e84d9d6724429cd08685b4e505fa447d31ca615630c7dbba + languageName: node + linkType: hard + "jest-config@npm:^27.5.1": version: 27.5.1 resolution: "jest-config@npm:27.5.1" @@ -17897,6 +18574,44 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-config@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-config@npm:29.5.0" + dependencies: + "@babel/core": ^7.11.6 + "@jest/test-sequencer": ^29.5.0 + "@jest/types": ^29.5.0 + babel-jest: ^29.5.0 + chalk: ^4.0.0 + ci-info: ^3.2.0 + deepmerge: ^4.2.2 + glob: ^7.1.3 + graceful-fs: ^4.2.9 + jest-circus: ^29.5.0 + jest-environment-node: ^29.5.0 + jest-get-type: ^29.4.3 + jest-regex-util: ^29.4.3 + jest-resolve: ^29.5.0 + jest-runner: ^29.5.0 + jest-util: ^29.5.0 + jest-validate: ^29.5.0 + micromatch: ^4.0.4 + parse-json: ^5.2.0 + pretty-format: ^29.5.0 + slash: ^3.0.0 + strip-json-comments: ^3.1.1 + peerDependencies: + "@types/node": "*" + ts-node: ">=9.0.0" + peerDependenciesMeta: + "@types/node": + optional: true + ts-node: + optional: true + checksum: c37c4dab964c54ab293d4e302d40b09687037ac9d00b88348ec42366970747feeaf265e12e3750cd3660b40c518d4031335eda11ac10b70b10e60797ebbd4b9c + languageName: node + linkType: hard + "jest-diff@npm:^27.5.1": version: 27.5.1 resolution: "jest-diff@npm:27.5.1" @@ -17909,15 +18624,15 @@ fsevents@^1.2.7: languageName: node linkType: hard -"jest-diff@npm:^29.0.2": - version: 29.0.2 - resolution: "jest-diff@npm:29.0.2" +"jest-diff@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-diff@npm:29.5.0" dependencies: chalk: ^4.0.0 - diff-sequences: ^29.0.0 - jest-get-type: ^29.0.0 - pretty-format: ^29.0.2 - checksum: fbf4f4a2502b4a5b46233fbcd77cc664de452d1612ebad670c3a4d1920985b16abdef3ebe7ce692efc3c7da8312f1b7253a4bb9027e98db1fb3c92cd53324aa9 + diff-sequences: ^29.4.3 + jest-get-type: ^29.4.3 + pretty-format: ^29.5.0 + checksum: dfd0f4a299b5d127779c76b40106c37854c89c3e0785098c717d52822d6620d227f6234c3a9291df204d619e799e3654159213bf93220f79c8e92a55475a3d39 languageName: node linkType: hard @@ -17930,6 +18645,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-docblock@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-docblock@npm:29.4.3" + dependencies: + detect-newline: ^3.0.0 + checksum: e0e9df1485bb8926e5b33478cdf84b3387d9caf3658e7dc1eaa6dc34cb93dea0d2d74797f6e940f0233a88f3dadd60957f2288eb8f95506361f85b84bf8661df + languageName: node + linkType: hard + "jest-each@npm:^27.5.1": version: 27.5.1 resolution: "jest-each@npm:27.5.1" @@ -17943,6 +18667,19 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-each@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-each@npm:29.5.0" + dependencies: + "@jest/types": ^29.5.0 + chalk: ^4.0.0 + jest-get-type: ^29.4.3 + jest-util: ^29.5.0 + pretty-format: ^29.5.0 + checksum: b8b297534d25834c5d4e31e4c687359787b1e402519e42664eb704cc3a12a7a91a017565a75acb02e8cf9afd3f4eef3350bd785276bec0900184641b765ff7a5 + languageName: node + linkType: hard + "jest-environment-jsdom@npm:^27.5.1": version: 27.5.1 resolution: "jest-environment-jsdom@npm:27.5.1" @@ -17958,6 +18695,27 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-environment-jsdom@npm:~29.5.0": + version: 29.5.0 + resolution: "jest-environment-jsdom@npm:29.5.0" + dependencies: + "@jest/environment": ^29.5.0 + "@jest/fake-timers": ^29.5.0 + "@jest/types": ^29.5.0 + "@types/jsdom": ^20.0.0 + "@types/node": "*" + jest-mock: ^29.5.0 + jest-util: ^29.5.0 + jsdom: ^20.0.0 + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + checksum: 3df7fc85275711f20b483ac8cd8c04500704ed0f69791eb55c574b38f5a39470f03d775cf20c1025bc1884916ac0573aa2fa4db1bb74225bc7fdd95ba97ad0da + languageName: node + linkType: hard + "jest-environment-node@npm:^27.5.1": version: 27.5.1 resolution: "jest-environment-node@npm:27.5.1" @@ -17972,6 +18730,20 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-environment-node@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-environment-node@npm:29.5.0" + dependencies: + "@jest/environment": ^29.5.0 + "@jest/fake-timers": ^29.5.0 + "@jest/types": ^29.5.0 + "@types/node": "*" + jest-mock: ^29.5.0 + jest-util: ^29.5.0 + checksum: 57981911cc20a4219b0da9e22b2e3c9f31b505e43f78e61c899e3227ded455ce1a3a9483842c69cfa4532f02cfb536ae0995bf245f9211608edacfc1e478d411 + languageName: node + linkType: hard + "jest-get-type@npm:^27.5.1": version: 27.5.1 resolution: "jest-get-type@npm:27.5.1" @@ -17979,10 +18751,10 @@ fsevents@^1.2.7: languageName: node linkType: hard -"jest-get-type@npm:^29.0.0": - version: 29.0.0 - resolution: "jest-get-type@npm:29.0.0" - checksum: 9abdd11d69788963a92fb9d813a7b887654ecc8f3a3c8bf83166d33aaf4d57ed380e74ab8ef106f57565dd235446ca6ebc607679f0c516c4633e6d09f0540a2b +"jest-get-type@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-get-type@npm:29.4.3" + checksum: 6ac7f2dde1c65e292e4355b6c63b3a4897d7e92cb4c8afcf6d397f2682f8080e094c8b0b68205a74d269882ec06bf696a9de6cd3e1b7333531e5ed7b112605ce languageName: node linkType: hard @@ -18035,6 +18807,29 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-haste-map@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-haste-map@npm:29.5.0" + dependencies: + "@jest/types": ^29.5.0 + "@types/graceful-fs": ^4.1.3 + "@types/node": "*" + anymatch: ^3.0.3 + fb-watchman: ^2.0.0 + fsevents: ^2.3.2 + graceful-fs: ^4.2.9 + jest-regex-util: ^29.4.3 + jest-util: ^29.5.0 + jest-worker: ^29.5.0 + micromatch: ^4.0.4 + walker: ^1.0.8 + dependenciesMeta: + fsevents: + optional: true + checksum: 3828ff7783f168e34be2c63887f82a01634261f605dcae062d83f979a61c37739e21b9607ecb962256aea3fbe5a530a1acee062d0026fcb47c607c12796cf3b7 + languageName: node + linkType: hard + "jest-jasmine2@npm:^27.5.1": version: 27.5.1 resolution: "jest-jasmine2@npm:27.5.1" @@ -18070,7 +18865,17 @@ fsevents@^1.2.7: languageName: node linkType: hard -"jest-matcher-utils@npm:^27.0.0, jest-matcher-utils@npm:^27.5.1": +"jest-leak-detector@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-leak-detector@npm:29.5.0" + dependencies: + jest-get-type: ^29.4.3 + pretty-format: ^29.5.0 + checksum: 0fb845da7ac9cdfc9b3b2e35f6f623a41c547d7dc0103ceb0349013459d00de5870b5689a625e7e37f9644934b40e8f1dcdd5422d14d57470600350364676313 + languageName: node + linkType: hard + +"jest-matcher-utils@npm:^27.5.1": version: 27.5.1 resolution: "jest-matcher-utils@npm:27.5.1" dependencies: @@ -18082,15 +18887,15 @@ fsevents@^1.2.7: languageName: node linkType: hard -"jest-matcher-utils@npm:^29.0.2": - version: 29.0.2 - resolution: "jest-matcher-utils@npm:29.0.2" +"jest-matcher-utils@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-matcher-utils@npm:29.5.0" dependencies: chalk: ^4.0.0 - jest-diff: ^29.0.2 - jest-get-type: ^29.0.0 - pretty-format: ^29.0.2 - checksum: bc266a28e4d0035ae6e3c8e494056cf8253a128b93447114b7fdb9d311520a999bc83e6f6d445f3b57f67236af99e916dca9acbfb0a93f437b89ec586f711a0d + jest-diff: ^29.5.0 + jest-get-type: ^29.4.3 + pretty-format: ^29.5.0 + checksum: 1d3e8c746e484a58ce194e3aad152eff21fd0896e8b8bf3d4ab1a4e2cbfed95fb143646f4ad9fdf6e42212b9e8fc033268b58e011b044a9929df45485deb5ac9 languageName: node linkType: hard @@ -18128,20 +18933,20 @@ fsevents@^1.2.7: languageName: node linkType: hard -"jest-message-util@npm:^29.0.2": - version: 29.0.2 - resolution: "jest-message-util@npm:29.0.2" +"jest-message-util@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-message-util@npm:29.5.0" dependencies: "@babel/code-frame": ^7.12.13 - "@jest/types": ^29.0.2 + "@jest/types": ^29.5.0 "@types/stack-utils": ^2.0.0 chalk: ^4.0.0 graceful-fs: ^4.2.9 micromatch: ^4.0.4 - pretty-format: ^29.0.2 + pretty-format: ^29.5.0 slash: ^3.0.0 stack-utils: ^2.0.3 - checksum: f75215e1a022b3063bbe5757db5c87d3dc0c0cc43a5afcfbb15f137872d51aa98e4238c0c77302ef1e2296701660e338510e644abde2d0e3ae42f62d4bad7abd + checksum: daddece6bbf846eb6a2ab9be9f2446e54085bef4e5cecd13d2a538fa9c01cb89d38e564c6b74fd8e12d37ed9eface8a362240ae9f21d68b214590631e7a0d8bf languageName: node linkType: hard @@ -18155,6 +18960,17 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-mock@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-mock@npm:29.5.0" + dependencies: + "@jest/types": ^29.5.0 + "@types/node": "*" + jest-util: ^29.5.0 + checksum: 2a9cf07509948fa8608898c445f04fe4dd6e2049ff431e5531eee028c808d3ba3c67f226ac87b0cf383feaa1055776900d197c895e89783016886ac17a4ff10c + languageName: node + linkType: hard + "jest-pnp-resolver@npm:^1.2.2": version: 1.2.2 resolution: "jest-pnp-resolver@npm:1.2.2" @@ -18188,6 +19004,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-regex-util@npm:^29.4.3": + version: 29.4.3 + resolution: "jest-regex-util@npm:29.4.3" + checksum: 96fc7fc28cd4dd73a63c13a526202c4bd8b351d4e5b68b1a2a2c88da3308c2a16e26feaa593083eb0bac38cca1aa9dd05025412e7de013ba963fb8e66af22b8a + languageName: node + linkType: hard + "jest-resolve-dependencies@npm:^27.5.1": version: 27.5.1 resolution: "jest-resolve-dependencies@npm:27.5.1" @@ -18199,6 +19022,16 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-resolve-dependencies@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-resolve-dependencies@npm:29.5.0" + dependencies: + jest-regex-util: ^29.4.3 + jest-snapshot: ^29.5.0 + checksum: 479d2e5365d58fe23f2b87001e2e0adcbffe0147700e85abdec8f14b9703b0a55758c1929a9989e3f5d5e954fb88870ea4bfa04783523b664562fcf5f10b0edf + languageName: node + linkType: hard + "jest-resolve@npm:^27.4.2, jest-resolve@npm:^27.5.1": version: 27.5.1 resolution: "jest-resolve@npm:27.5.1" @@ -18217,6 +19050,23 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-resolve@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-resolve@npm:29.5.0" + dependencies: + chalk: ^4.0.0 + graceful-fs: ^4.2.9 + jest-haste-map: ^29.5.0 + jest-pnp-resolver: ^1.2.2 + jest-util: ^29.5.0 + jest-validate: ^29.5.0 + resolve: ^1.20.0 + resolve.exports: ^2.0.0 + slash: ^3.0.0 + checksum: 9a125f3cf323ceef512089339d35f3ee37f79fe16a831fb6a26773ea6a229b9e490d108fec7af334142e91845b5996de8e7cdd85a4d8d617078737d804e29c8f + languageName: node + linkType: hard + "jest-runner@npm:^27.5.1": version: 27.5.1 resolution: "jest-runner@npm:27.5.1" @@ -18246,6 +19096,35 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-runner@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-runner@npm:29.5.0" + dependencies: + "@jest/console": ^29.5.0 + "@jest/environment": ^29.5.0 + "@jest/test-result": ^29.5.0 + "@jest/transform": ^29.5.0 + "@jest/types": ^29.5.0 + "@types/node": "*" + chalk: ^4.0.0 + emittery: ^0.13.1 + graceful-fs: ^4.2.9 + jest-docblock: ^29.4.3 + jest-environment-node: ^29.5.0 + jest-haste-map: ^29.5.0 + jest-leak-detector: ^29.5.0 + jest-message-util: ^29.5.0 + jest-resolve: ^29.5.0 + jest-runtime: ^29.5.0 + jest-util: ^29.5.0 + jest-watcher: ^29.5.0 + jest-worker: ^29.5.0 + p-limit: ^3.1.0 + source-map-support: 0.5.13 + checksum: 437dea69c5dddca22032259787bac74790d5a171c9d804711415f31e5d1abfb64fa52f54a9015bb17a12b858fd0cf3f75ef6f3c9e94255a8596e179f707229c4 + languageName: node + linkType: hard + "jest-runtime@npm:^27.5.1": version: 27.5.1 resolution: "jest-runtime@npm:27.5.1" @@ -18276,6 +19155,36 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-runtime@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-runtime@npm:29.5.0" + dependencies: + "@jest/environment": ^29.5.0 + "@jest/fake-timers": ^29.5.0 + "@jest/globals": ^29.5.0 + "@jest/source-map": ^29.4.3 + "@jest/test-result": ^29.5.0 + "@jest/transform": ^29.5.0 + "@jest/types": ^29.5.0 + "@types/node": "*" + chalk: ^4.0.0 + cjs-module-lexer: ^1.0.0 + collect-v8-coverage: ^1.0.0 + glob: ^7.1.3 + graceful-fs: ^4.2.9 + jest-haste-map: ^29.5.0 + jest-message-util: ^29.5.0 + jest-mock: ^29.5.0 + jest-regex-util: ^29.4.3 + jest-resolve: ^29.5.0 + jest-snapshot: ^29.5.0 + jest-util: ^29.5.0 + slash: ^3.0.0 + strip-bom: ^4.0.0 + checksum: 7af27bd9d54cf1c5735404cf8d76c6509d5610b1ec0106a21baa815c1aff15d774ce534ac2834bc440dccfe6348bae1885fd9a806f23a94ddafdc0f5bae4b09d + languageName: node + linkType: hard + "jest-serializer@npm:^26.6.2": version: 26.6.2 resolution: "jest-serializer@npm:26.6.2" @@ -18326,6 +19235,37 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-snapshot@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-snapshot@npm:29.5.0" + dependencies: + "@babel/core": ^7.11.6 + "@babel/generator": ^7.7.2 + "@babel/plugin-syntax-jsx": ^7.7.2 + "@babel/plugin-syntax-typescript": ^7.7.2 + "@babel/traverse": ^7.7.2 + "@babel/types": ^7.3.3 + "@jest/expect-utils": ^29.5.0 + "@jest/transform": ^29.5.0 + "@jest/types": ^29.5.0 + "@types/babel__traverse": ^7.0.6 + "@types/prettier": ^2.1.5 + babel-preset-current-node-syntax: ^1.0.0 + chalk: ^4.0.0 + expect: ^29.5.0 + graceful-fs: ^4.2.9 + jest-diff: ^29.5.0 + jest-get-type: ^29.4.3 + jest-matcher-utils: ^29.5.0 + jest-message-util: ^29.5.0 + jest-util: ^29.5.0 + natural-compare: ^1.4.0 + pretty-format: ^29.5.0 + semver: ^7.3.5 + checksum: fe5df54122ed10eed625de6416a45bc4958d5062b018f05b152bf9785ab7f355dcd55e40cf5da63895bf8278f8d7b2bb4059b2cfbfdee18f509d455d37d8aa2b + languageName: node + linkType: hard + "jest-util@npm:^26.6.2": version: 26.6.2 resolution: "jest-util@npm:26.6.2" @@ -18340,7 +19280,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"jest-util@npm:^27.0.0, jest-util@npm:^27.5.1": +"jest-util@npm:^27.5.1": version: 27.5.1 resolution: "jest-util@npm:27.5.1" dependencies: @@ -18368,17 +19308,17 @@ fsevents@^1.2.7: languageName: node linkType: hard -"jest-util@npm:^29.0.2": - version: 29.0.2 - resolution: "jest-util@npm:29.0.2" +"jest-util@npm:^29.0.0, jest-util@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-util@npm:29.5.0" dependencies: - "@jest/types": ^29.0.2 + "@jest/types": ^29.5.0 "@types/node": "*" chalk: ^4.0.0 ci-info: ^3.2.0 graceful-fs: ^4.2.9 picomatch: ^2.2.3 - checksum: ee7a264ac9968f5c2fc6d79b7b76c8df4b22762e3c45c92a35e66e81b9fb45c341b03e5e18d8c4de4cd19ab7faf70a67ec419e6b57b5dfc61b84e96719649838 + checksum: fd9212950d34d2ecad8c990dda0d8ea59a8a554b0c188b53ea5d6c4a0829a64f2e1d49e6e85e812014933d17426d7136da4785f9cf76fff1799de51b88bc85d3 languageName: node linkType: hard @@ -18396,6 +19336,20 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-validate@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-validate@npm:29.5.0" + dependencies: + "@jest/types": ^29.5.0 + camelcase: ^6.2.0 + chalk: ^4.0.0 + jest-get-type: ^29.4.3 + leven: ^3.1.0 + pretty-format: ^29.5.0 + checksum: 43ca5df7cb75572a254ac3e92fbbe7be6b6a1be898cc1e887a45d55ea003f7a112717d814a674d37f9f18f52d8de40873c8f084f17664ae562736c78dd44c6a1 + languageName: node + linkType: hard + "jest-watch-typeahead@npm:^1.0.0": version: 1.1.0 resolution: "jest-watch-typeahead@npm:1.1.0" @@ -18444,6 +19398,22 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest-watcher@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-watcher@npm:29.5.0" + dependencies: + "@jest/test-result": ^29.5.0 + "@jest/types": ^29.5.0 + "@types/node": "*" + ansi-escapes: ^4.2.1 + chalk: ^4.0.0 + emittery: ^0.13.1 + jest-util: ^29.5.0 + string-length: ^4.0.1 + checksum: 62303ac7bdc7e61a8b4239a239d018f7527739da2b2be6a81a7be25b74ca769f1c43ee8558ce8e72bb857245c46d6e03af331227ffb00a57280abb2a928aa776 + languageName: node + linkType: hard + "jest-worker@npm:^26.2.1, jest-worker@npm:^26.5.0, jest-worker@npm:^26.6.2": version: 26.6.2 resolution: "jest-worker@npm:26.6.2" @@ -18477,7 +19447,19 @@ fsevents@^1.2.7: languageName: node linkType: hard -"jest@npm:^27.4.3, jest@npm:~27.5.1": +"jest-worker@npm:^29.5.0": + version: 29.5.0 + resolution: "jest-worker@npm:29.5.0" + dependencies: + "@types/node": "*" + jest-util: ^29.5.0 + merge-stream: ^2.0.0 + supports-color: ^8.0.0 + checksum: 1151a1ae3602b1ea7c42a8f1efe2b5a7bf927039deaa0827bf978880169899b705744e288f80a63603fb3fc2985e0071234986af7dc2c21c7a64333d8777c7c9 + languageName: node + linkType: hard + +"jest@npm:^27.4.3": version: 27.5.1 resolution: "jest@npm:27.5.1" dependencies: @@ -18495,6 +19477,25 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jest@npm:~29.5.0": + version: 29.5.0 + resolution: "jest@npm:29.5.0" + dependencies: + "@jest/core": ^29.5.0 + "@jest/types": ^29.5.0 + import-local: ^3.0.2 + jest-cli: ^29.5.0 + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + bin: + jest: bin/jest.js + checksum: a8ff2eb0f421623412236e23cbe67c638127fffde466cba9606bc0c0553b4c1e5cb116d7e0ef990b5d1712851652c8ee461373b578df50857fe635b94ff455d5 + languageName: node + linkType: hard + "js-sdsl@npm:^4.1.4": version: 4.1.5 resolution: "js-sdsl@npm:4.1.5" @@ -18586,6 +19587,45 @@ fsevents@^1.2.7: languageName: node linkType: hard +"jsdom@npm:^20.0.0": + version: 20.0.3 + resolution: "jsdom@npm:20.0.3" + dependencies: + abab: ^2.0.6 + acorn: ^8.8.1 + acorn-globals: ^7.0.0 + cssom: ^0.5.0 + cssstyle: ^2.3.0 + data-urls: ^3.0.2 + decimal.js: ^10.4.2 + domexception: ^4.0.0 + escodegen: ^2.0.0 + form-data: ^4.0.0 + html-encoding-sniffer: ^3.0.0 + http-proxy-agent: ^5.0.0 + https-proxy-agent: ^5.0.1 + is-potential-custom-element-name: ^1.0.1 + nwsapi: ^2.2.2 + parse5: ^7.1.1 + saxes: ^6.0.0 + symbol-tree: ^3.2.4 + tough-cookie: ^4.1.2 + w3c-xmlserializer: ^4.0.0 + webidl-conversions: ^7.0.0 + whatwg-encoding: ^2.0.0 + whatwg-mimetype: ^3.0.0 + whatwg-url: ^11.0.0 + ws: ^8.11.0 + xml-name-validator: ^4.0.0 + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + checksum: 6e2ae21db397133a061b270c26d2dbc0b9051733ea3b896a7ece78d79f475ff0974f766a413c1198a79c793159119169f2335ddb23150348fbfdcfa6f3105536 + languageName: node + linkType: hard + "jsesc@npm:^2.5.1": version: 2.5.2 resolution: "jsesc@npm:2.5.2" @@ -18660,15 +19700,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"json5@npm:2.x, json5@npm:^2.1.2, json5@npm:^2.1.3, json5@npm:^2.2.0, json5@npm:^2.2.1, json5@npm:^2.2.3": - version: 2.2.3 - resolution: "json5@npm:2.2.3" - bin: - json5: lib/cli.js - checksum: 2a7436a93393830bce797d4626275152e37e877b265e94ca69c99e3d20c2b9dab021279146a39cdb700e71b2dd32a4cebd1514cd57cee102b1af906ce5040349 - languageName: node - linkType: hard - "json5@npm:^1.0.1": version: 1.0.2 resolution: "json5@npm:1.0.2" @@ -18680,14 +19711,23 @@ fsevents@^1.2.7: languageName: node linkType: hard -"jsonc-parser@npm:^3.0.0": - version: 3.0.0 - resolution: "jsonc-parser@npm:3.0.0" - checksum: 1df2326f1f9688de30c70ff19c5b2a83ba3b89a1036160da79821d1361090775e9db502dc57a67c11b56e1186fc1ed70b887f25c5febf9a3ec4f91435836c99d +"json5@npm:^2.1.2, json5@npm:^2.2.0, json5@npm:^2.2.2, json5@npm:^2.2.3": + version: 2.2.3 + resolution: "json5@npm:2.2.3" + bin: + json5: lib/cli.js + checksum: 2a7436a93393830bce797d4626275152e37e877b265e94ca69c99e3d20c2b9dab021279146a39cdb700e71b2dd32a4cebd1514cd57cee102b1af906ce5040349 languageName: node linkType: hard -"jsonfile@npm:^2.1.0": +"jsonc-parser@npm:^3.0.0, jsonc-parser@npm:^3.2.0": + version: 3.2.0 + resolution: "jsonc-parser@npm:3.2.0" + checksum: 946dd9a5f326b745aa326d48a7257e3f4a4b62c5e98ec8e49fa2bdd8d96cef7e6febf1399f5c7016114fd1f68a1c62c6138826d5d90bc650448e3cf0951c53c7 + languageName: node + linkType: hard + +"jsonfile@npm:^2.1.0": version: 2.4.0 resolution: "jsonfile@npm:2.4.0" dependencies: @@ -18827,17 +19867,24 @@ fsevents@^1.2.7: languageName: node linkType: hard -"klona@npm:^2.0.4, klona@npm:^2.0.5": - version: 2.0.5 - resolution: "klona@npm:2.0.5" - checksum: 8c976126ea252b766e648a4866e1bccff9d3b08432474ad80c559f6c7265cf7caede2498d463754d8c88c4759895edd8210c85c0d3155e6aae4968362889466f +"kleur@npm:^4.0.3": + version: 4.1.5 + resolution: "kleur@npm:4.1.5" + checksum: 1dc476e32741acf0b1b5b0627ffd0d722e342c1b0da14de3e8ae97821327ca08f9fb944542fb3c126d90ac5f27f9d804edbe7c585bf7d12ef495d115e0f22c12 + languageName: node + linkType: hard + +"klona@npm:^2.0.4, klona@npm:^2.0.5, klona@npm:^2.0.6": + version: 2.0.6 + resolution: "klona@npm:2.0.6" + checksum: ac9ee3732e42b96feb67faae4d27cf49494e8a3bf3fa7115ce242fe04786788e0aff4741a07a45a2462e2079aa983d73d38519c85d65b70ef11447bbc3c58ce7 languageName: node linkType: hard -"known-css-properties@npm:^0.26.0": - version: 0.26.0 - resolution: "known-css-properties@npm:0.26.0" - checksum: e706f4af9d2683202df9f717e7d713f0f8c3330f155842c40d8f3b2a5837956c34aeb7ba08760977ccde1afce8b5377e29b40eb3e5c0b42bef28ddd108543cfb +"known-css-properties@npm:^0.27.0": + version: 0.27.0 + resolution: "known-css-properties@npm:0.27.0" + checksum: 8584fcf0526f984fe5a358af20200dec3b944373dd005dc23a3ce988895e1acd03e7d69c49533dda07d6d9b6d53990ed1119bd9d3e927f17545f8764c434a5cd languageName: node linkType: hard @@ -18975,17 +20022,10 @@ fsevents@^1.2.7: languageName: node linkType: hard -"lilconfig@npm:2.0.4": - version: 2.0.4 - resolution: "lilconfig@npm:2.0.4" - checksum: 02ae530aa49218d782eb79e92c600ea5220828987f85aa3403fa512cadc7efe38c0ac7d0cd2edf600ad3fae1f6c1752f5b4bb78c0d9950435b044d53d507c9e1 - languageName: node - linkType: hard - -"lilconfig@npm:^2.0.3, lilconfig@npm:^2.0.5": - version: 2.0.6 - resolution: "lilconfig@npm:2.0.6" - checksum: 40a3cd72f103b1be5975f2ac1850810b61d4053e20ab09be8d3aeddfe042187e1ba70b4651a7e70f95efa1642e7dc8b2ae395b317b7d7753b241b43cef7c0f7d +"lilconfig@npm:2.1.0, lilconfig@npm:^2.0.3, lilconfig@npm:^2.0.5": + version: 2.1.0 + resolution: "lilconfig@npm:2.1.0" + checksum: 8549bb352b8192375fed4a74694cd61ad293904eee33f9d4866c2192865c44c4eb35d10782966242634e0cbc1e91fe62b1247f148dc5514918e3a966da7ea117 languageName: node linkType: hard @@ -19001,50 +20041,49 @@ fsevents@^1.2.7: resolution: "lint-all@workspace:tools/lint-all" dependencies: "@prettier/plugin-xml": ~2.2.0 - eslint: ~8.26.0 - prettier: ~2.7.1 - stylelint: ~14.14.1 - zx: ~4.3.0 + eslint: ~8.38.0 + prettier: ~2.8.7 + stylelint: ~15.4.0 + zx: ~7.2.1 bin: lint: ./lint.mjs lint-and-fix: ./lint-and-fix.mjs languageName: unknown linkType: soft -"lint-staged@npm:~12.3.8": - version: 12.3.8 - resolution: "lint-staged@npm:12.3.8" +"lint-staged@npm:~13.2.1": + version: 13.2.1 + resolution: "lint-staged@npm:13.2.1" dependencies: + chalk: 5.2.0 cli-truncate: ^3.1.0 - colorette: ^2.0.16 - commander: ^8.3.0 - debug: ^4.3.3 - execa: ^5.1.1 - lilconfig: 2.0.4 - listr2: ^4.0.1 - micromatch: ^4.0.4 + commander: ^10.0.0 + debug: ^4.3.4 + execa: ^7.0.0 + lilconfig: 2.1.0 + listr2: ^5.0.7 + micromatch: ^4.0.5 normalize-path: ^3.0.0 - object-inspect: ^1.12.0 - pidtree: ^0.5.0 + object-inspect: ^1.12.3 + pidtree: ^0.6.0 string-argv: ^0.3.1 - supports-color: ^9.2.1 - yaml: ^1.10.2 + yaml: ^2.2.1 bin: lint-staged: bin/lint-staged.js - checksum: af6a89ae4244e4eac7180c6e7da452f378fd156ff38eaa666ecbb78f1e2efb7f1a9fc766dcc1cdde2bd76e03da68e602056ca9d2f1c6e46cf10aa83d20bf4d49 + checksum: 5788d3fe38e69b7f7b7f700284d4e10738978a0916bc77d3f6253c43a030fc4f01f89c09da349fb658f929f3393d8b1e3eaabaac5b604416ebc33476640b51ce languageName: node linkType: hard -"listr2@npm:^4.0.1": - version: 4.0.4 - resolution: "listr2@npm:4.0.4" +"listr2@npm:^5.0.7": + version: 5.0.8 + resolution: "listr2@npm:5.0.8" dependencies: cli-truncate: ^2.1.0 - colorette: ^2.0.16 + colorette: ^2.0.19 log-update: ^4.0.0 p-map: ^4.0.0 rfdc: ^1.3.0 - rxjs: ^7.5.4 + rxjs: ^7.8.0 through: ^2.3.8 wrap-ansi: ^7.0.0 peerDependencies: @@ -19052,7 +20091,7 @@ fsevents@^1.2.7: peerDependenciesMeta: enquirer: optional: true - checksum: 1e6e44a3a0337f47d0a1bc90712b0001129d3ca3fae56dc5b834da556b634862a211d8c638528600daf1c1899a3f2366f822ecb03dba5327ff2c017578815e61 + checksum: 8be9f5632627c4df0dc33f452c98d415a49e5f1614650d3cab1b103c33e95f2a7a0e9f3e1e5de00d51bf0b4179acd8ff11b25be77dbe097cf3773c05e728d46c languageName: node linkType: hard @@ -19118,7 +20157,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"loader-utils@npm:^2.0.4": +"loader-utils@npm:^2.0.0, loader-utils@npm:^2.0.4": version: 2.0.4 resolution: "loader-utils@npm:2.0.4" dependencies: @@ -19288,10 +20327,10 @@ fsevents@^1.2.7: languageName: node linkType: hard -"longest-streak@npm:^2.0.1": - version: 2.0.4 - resolution: "longest-streak@npm:2.0.4" - checksum: 28b8234a14963002c5c71035dee13a0a11e9e9d18ffa320fdc8796ed7437399204495702ed69cd2a7087b0af041a2a8b562829b7c1e2042e73a3374d1ecf6580 +"longest-streak@npm:^3.0.0": + version: 3.1.0 + resolution: "longest-streak@npm:3.1.0" + checksum: d7f952ed004cbdb5c8bcfc4f7f5c3d65449e6c5a9e9be4505a656e3df5a57ee125f284286b4bf8ecea0c21a7b3bf2b8f9001ad506c319b9815ad6a63a47d0fd0 languageName: node linkType: hard @@ -19471,12 +20510,12 @@ fsevents@^1.2.7: languageName: node linkType: hard -"makeerror@npm:1.0.x": - version: 1.0.11 - resolution: "makeerror@npm:1.0.11" +"makeerror@npm:1.0.12": + version: 1.0.12 + resolution: "makeerror@npm:1.0.12" dependencies: tmpl: 1.0.5 - checksum: 9a62ec2d9648c5329fdc4bc7d779a7305f32b1e55422a4f14244bc890bb43287fe013eb8d965e92a0cf4c443f3e59265b1fc3125eaedb0c2361e28b1a8de565d + checksum: b38a025a12c8146d6eeea5a7f2bf27d51d8ad6064da8ca9405fcf7bf9b54acd43e3b30ddd7abb9b1bfa4ddb266019133313482570ddb207de568f71ecfcf6060 languageName: node linkType: hard @@ -19540,21 +20579,12 @@ fsevents@^1.2.7: languageName: node linkType: hard -"markdown-table@npm:^2.0.0": - version: 2.0.0 - resolution: "markdown-table@npm:2.0.0" - dependencies: - repeat-string: ^1.0.0 - checksum: 9bb634a9300016cbb41216c1eab44c74b6b7083ac07872e296f900a29449cf0e260ece03fa10c3e9784ab94c61664d1d147da0315f95e1336e2bdcc025615c90 - languageName: node - linkType: hard - -"marked@npm:^4.0.16": - version: 4.1.1 - resolution: "marked@npm:4.1.1" +"marked@npm:^4.2.12": + version: 4.3.0 + resolution: "marked@npm:4.3.0" bin: marked: bin/marked.js - checksum: 717e3357952ee53de831bf0eb110ed075bebca2376c58bcdf7ee523ef540d45308ad6d51b2c933da0968832ea4386f31c142ca65443e77c098e84f6cce73e418 + checksum: 0db6817893952c3ec710eb9ceafb8468bf5ae38cb0f92b7b083baa13d70b19774674be04db5b817681fa7c5c6a088f61300815e4dd75a59696f4716ad69f6260 languageName: node linkType: hard @@ -19585,15 +20615,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"mdast-util-compact@npm:^2.0.0": - version: 2.0.1 - resolution: "mdast-util-compact@npm:2.0.1" - dependencies: - unist-util-visit: ^2.0.0 - checksum: 750cc76e46223d2dadf86835d415d4954566572e6af5a8df5577065e5f863dda46c30767e12e29c4ec53cf2e7040863b0279d44af357e8b36f5983d78a73dceb - languageName: node - linkType: hard - "mdast-util-definitions@npm:^4.0.0": version: 4.0.0 resolution: "mdast-util-definitions@npm:4.0.0" @@ -19616,6 +20637,95 @@ fsevents@^1.2.7: languageName: node linkType: hard +"mdast-util-from-markdown@npm:^1.0.0, mdast-util-from-markdown@npm:^1.1.0": + version: 1.3.0 + resolution: "mdast-util-from-markdown@npm:1.3.0" + dependencies: + "@types/mdast": ^3.0.0 + "@types/unist": ^2.0.0 + decode-named-character-reference: ^1.0.0 + mdast-util-to-string: ^3.1.0 + micromark: ^3.0.0 + micromark-util-decode-numeric-character-reference: ^1.0.0 + micromark-util-decode-string: ^1.0.0 + micromark-util-normalize-identifier: ^1.0.0 + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.0 + unist-util-stringify-position: ^3.0.0 + uvu: ^0.5.0 + checksum: cc971d1ad381150f6504fd753fbcffcc64c0abb527540ce343625c2bba76104505262122ef63d14ab66eb47203f323267017c6d09abfa8535ee6a8e14069595f + languageName: node + linkType: hard + +"mdast-util-mdx-expression@npm:^1.0.0": + version: 1.3.2 + resolution: "mdast-util-mdx-expression@npm:1.3.2" + dependencies: + "@types/estree-jsx": ^1.0.0 + "@types/hast": ^2.0.0 + "@types/mdast": ^3.0.0 + mdast-util-from-markdown: ^1.0.0 + mdast-util-to-markdown: ^1.0.0 + checksum: e4c90f26deaa5eb6217b0a9af559a80de41da02ab3bcd864c56bed3304b056ae703896e9876bc6ded500f4aff59f4de5cbf6a4b109a5ba408f2342805fe6dc05 + languageName: node + linkType: hard + +"mdast-util-mdx-jsx@npm:^2.0.0": + version: 2.1.2 + resolution: "mdast-util-mdx-jsx@npm:2.1.2" + dependencies: + "@types/estree-jsx": ^1.0.0 + "@types/hast": ^2.0.0 + "@types/mdast": ^3.0.0 + "@types/unist": ^2.0.0 + ccount: ^2.0.0 + mdast-util-from-markdown: ^1.1.0 + mdast-util-to-markdown: ^1.3.0 + parse-entities: ^4.0.0 + stringify-entities: ^4.0.0 + unist-util-remove-position: ^4.0.0 + unist-util-stringify-position: ^3.0.0 + vfile-message: ^3.0.0 + checksum: 637e0bbd97c0c783f6b12bb05ccb1edaec076c5aa6d349147d77b8e6e10677f1be8e2870c05b1896f69095c9bc527f34be72b349b30737ab2e499bfc579b3a28 + languageName: node + linkType: hard + +"mdast-util-mdx@npm:^2.0.0": + version: 2.0.1 + resolution: "mdast-util-mdx@npm:2.0.1" + dependencies: + mdast-util-from-markdown: ^1.0.0 + mdast-util-mdx-expression: ^1.0.0 + mdast-util-mdx-jsx: ^2.0.0 + mdast-util-mdxjs-esm: ^1.0.0 + mdast-util-to-markdown: ^1.0.0 + checksum: 7303149230a26e524e319833b782bffca94e49cdab012996618701259bd056e014ca22a35d25ffa8880ba9064ee126a2a002f01e5c90a31ca726339ed775875e + languageName: node + linkType: hard + +"mdast-util-mdxjs-esm@npm:^1.0.0": + version: 1.3.1 + resolution: "mdast-util-mdxjs-esm@npm:1.3.1" + dependencies: + "@types/estree-jsx": ^1.0.0 + "@types/hast": ^2.0.0 + "@types/mdast": ^3.0.0 + mdast-util-from-markdown: ^1.0.0 + mdast-util-to-markdown: ^1.0.0 + checksum: ee78a4f58adfec38723cbc920f05481201ebb001eff3982f2d0e5f5ce5c75685e732e9d361ad4a1be8b936b4e5de0f2599cb96b92ad4bd92698ac0c4a09bbec3 + languageName: node + linkType: hard + +"mdast-util-phrasing@npm:^3.0.0": + version: 3.0.1 + resolution: "mdast-util-phrasing@npm:3.0.1" + dependencies: + "@types/mdast": ^3.0.0 + unist-util-is: ^5.0.0 + checksum: c5b616d9b1eb76a6b351d195d94318494722525a12a89d9c8a3b091af7db3dd1fc55d294f9d29266d8159a8267b0df4a7a133bda8a3909d5331c383e1e1ff328 + languageName: node + linkType: hard + "mdast-util-to-hast@npm:10.0.1": version: 10.0.1 resolution: "mdast-util-to-hast@npm:10.0.1" @@ -19632,6 +20742,22 @@ fsevents@^1.2.7: languageName: node linkType: hard +"mdast-util-to-markdown@npm:^1.0.0, mdast-util-to-markdown@npm:^1.3.0": + version: 1.5.0 + resolution: "mdast-util-to-markdown@npm:1.5.0" + dependencies: + "@types/mdast": ^3.0.0 + "@types/unist": ^2.0.0 + longest-streak: ^3.0.0 + mdast-util-phrasing: ^3.0.0 + mdast-util-to-string: ^3.0.0 + micromark-util-decode-string: ^1.0.0 + unist-util-visit: ^4.0.0 + zwitch: ^2.0.0 + checksum: 64338eb33e49bb0aea417591fd986f72fdd39205052563bb7ce9eb9ecc160824509bfacd740086a05af355c6d5c36353aafe95cab9e6927d674478757cee6259 + languageName: node + linkType: hard + "mdast-util-to-string@npm:^1.0.0": version: 1.1.0 resolution: "mdast-util-to-string@npm:1.1.0" @@ -19646,6 +20772,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"mdast-util-to-string@npm:^3.0.0, mdast-util-to-string@npm:^3.1.0": + version: 3.2.0 + resolution: "mdast-util-to-string@npm:3.2.0" + dependencies: + "@types/mdast": ^3.0.0 + checksum: dc40b544d54339878ae2c9f2b3198c029e1e07291d2126bd00ca28272ee6616d0d2194eb1c9828a7c34d412a79a7e73b26512a734698d891c710a1e73db1e848 + languageName: node + linkType: hard + "mdn-data@npm:2.0.14": version: 2.0.14 resolution: "mdn-data@npm:2.0.14" @@ -19653,6 +20788,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"mdn-data@npm:2.0.30": + version: 2.0.30 + resolution: "mdn-data@npm:2.0.30" + checksum: d6ac5ac7439a1607df44b22738ecf83f48e66a0874e4482d6424a61c52da5cde5750f1d1229b6f5fa1b80a492be89465390da685b11f97d62b8adcc6e88189aa + languageName: node + linkType: hard + "mdn-data@npm:2.0.4": version: 2.0.4 resolution: "mdn-data@npm:2.0.4" @@ -19674,7 +20816,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"mem@npm:^8.0.0": +"mem@npm:^8.1.1": version: 8.1.1 resolution: "mem@npm:8.1.1" dependencies: @@ -19684,12 +20826,12 @@ fsevents@^1.2.7: languageName: node linkType: hard -"memfs@npm:^3.1.2, memfs@npm:^3.2.0, memfs@npm:^3.4.3": - version: 3.4.7 - resolution: "memfs@npm:3.4.7" +"memfs@npm:^3.1.2, memfs@npm:^3.2.2, memfs@npm:^3.4.3": + version: 3.5.0 + resolution: "memfs@npm:3.5.0" dependencies: fs-monkey: ^1.0.3 - checksum: fab88266dc576dc4999e38bdf531d703fb798affac2e0dd3fc17470878486844027b2766008ba80c0103b443f52cf9068a5c00f4e1ecf04106f4b29c11855822 + checksum: 8427db6c3644eeb9119b7a74b232d9a6178d018878acce6f05bd89d95e28b1073c9eeb00127131b0613b07a003e2e7b15b482f9004e548fe06a0aba7aa02515c languageName: node linkType: hard @@ -19754,84 +20896,425 @@ fsevents@^1.2.7: languageName: node linkType: hard -"meow@npm:^8.0.0": - version: 8.0.0 - resolution: "meow@npm:8.0.0" - dependencies: - "@types/minimist": ^1.2.0 - camelcase-keys: ^6.2.2 - decamelize-keys: ^1.1.0 - hard-rejection: ^2.1.0 - minimist-options: 4.1.0 - normalize-package-data: ^3.0.0 - read-pkg-up: ^7.0.1 - redent: ^3.0.0 - trim-newlines: ^3.0.1 - type-fest: ^0.18.0 - yargs-parser: ^20.2.3 - checksum: a6e934cc88d6026fa767666ca40571aedac1c69917484c9b7064336fe0c55cb1471012e43cab6f91626162cd11b2abb77cf634d6f2dd0baa1ea6672bd4882b04 +"meow@npm:^8.0.0": + version: 8.0.0 + resolution: "meow@npm:8.0.0" + dependencies: + "@types/minimist": ^1.2.0 + camelcase-keys: ^6.2.2 + decamelize-keys: ^1.1.0 + hard-rejection: ^2.1.0 + minimist-options: 4.1.0 + normalize-package-data: ^3.0.0 + read-pkg-up: ^7.0.1 + redent: ^3.0.0 + trim-newlines: ^3.0.1 + type-fest: ^0.18.0 + yargs-parser: ^20.2.3 + checksum: a6e934cc88d6026fa767666ca40571aedac1c69917484c9b7064336fe0c55cb1471012e43cab6f91626162cd11b2abb77cf634d6f2dd0baa1ea6672bd4882b04 + languageName: node + linkType: hard + +"meow@npm:^9.0.0": + version: 9.0.0 + resolution: "meow@npm:9.0.0" + dependencies: + "@types/minimist": ^1.2.0 + camelcase-keys: ^6.2.2 + decamelize: ^1.2.0 + decamelize-keys: ^1.1.0 + hard-rejection: ^2.1.0 + minimist-options: 4.1.0 + normalize-package-data: ^3.0.0 + read-pkg-up: ^7.0.1 + redent: ^3.0.0 + trim-newlines: ^3.0.1 + type-fest: ^0.18.0 + yargs-parser: ^20.2.3 + checksum: 99799c47247f4daeee178e3124f6ef6f84bde2ba3f37652865d5d8f8b8adcf9eedfc551dd043e2455cd8206545fd848e269c0c5ab6b594680a0ad4d3617c9639 + languageName: node + linkType: hard + +"merge-descriptors@npm:1.0.1": + version: 1.0.1 + resolution: "merge-descriptors@npm:1.0.1" + checksum: 5abc259d2ae25bb06d19ce2b94a21632583c74e2a9109ee1ba7fd147aa7362b380d971e0251069f8b3eb7d48c21ac839e21fa177b335e82c76ec172e30c31a26 + languageName: node + linkType: hard + +"merge-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-stream@npm:2.0.0" + checksum: 6fa4dcc8d86629705cea944a4b88ef4cb0e07656ebf223fa287443256414283dd25d91c1cd84c77987f2aec5927af1a9db6085757cb43d90eb170ebf4b47f4f4 + languageName: node + linkType: hard + +"merge2@npm:^1.2.3, merge2@npm:^1.3.0, merge2@npm:^1.4.1": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 + languageName: node + linkType: hard + +"methods@npm:~1.1.2": + version: 1.1.2 + resolution: "methods@npm:1.1.2" + checksum: 0917ff4041fa8e2f2fda5425a955fe16ca411591fbd123c0d722fcf02b73971ed6f764d85f0a6f547ce49ee0221ce2c19a5fa692157931cecb422984f1dcd13a + languageName: node + linkType: hard + +"microbuffer@npm:^1.0.0": + version: 1.0.0 + resolution: "microbuffer@npm:1.0.0" + checksum: 1e4e16f48f057581c1e50b1c52c7bdc25cc85532b7de493b749ecdc1464975103d0c0b42d3a4b61ecd6d332773857fbf46c8aa70c6f6d254a05376245f095f9a + languageName: node + linkType: hard + +"microevent.ts@npm:~0.1.1": + version: 0.1.1 + resolution: "microevent.ts@npm:0.1.1" + checksum: 7874fcdb3f0dfa4e996d3ea63b3b9882874ae7d22be28d51ae20da24c712e9e28e5011d988095c27dd2b32e37c0ad7425342a71b89adb8e808ec7194fadf4a7a + languageName: node + linkType: hard + +"micromark-core-commonmark@npm:^1.0.0, micromark-core-commonmark@npm:^1.0.1": + version: 1.0.6 + resolution: "micromark-core-commonmark@npm:1.0.6" + dependencies: + decode-named-character-reference: ^1.0.0 + micromark-factory-destination: ^1.0.0 + micromark-factory-label: ^1.0.0 + micromark-factory-space: ^1.0.0 + micromark-factory-title: ^1.0.0 + micromark-factory-whitespace: ^1.0.0 + micromark-util-character: ^1.0.0 + micromark-util-chunked: ^1.0.0 + micromark-util-classify-character: ^1.0.0 + micromark-util-html-tag-name: ^1.0.0 + micromark-util-normalize-identifier: ^1.0.0 + micromark-util-resolve-all: ^1.0.0 + micromark-util-subtokenize: ^1.0.0 + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.1 + uvu: ^0.5.0 + checksum: 4b483c46077f696ed310f6d709bb9547434c218ceb5c1220fde1707175f6f68b44da15ab8668f9c801e1a123210071e3af883a7d1215122c913fd626f122bfc2 + languageName: node + linkType: hard + +"micromark-extension-mdx-expression@npm:^1.0.0": + version: 1.0.4 + resolution: "micromark-extension-mdx-expression@npm:1.0.4" + dependencies: + micromark-factory-mdx-expression: ^1.0.0 + micromark-factory-space: ^1.0.0 + micromark-util-character: ^1.0.0 + micromark-util-events-to-acorn: ^1.0.0 + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.0 + uvu: ^0.5.0 + checksum: d19a31f9813dd5d4ad96b99e35b7c48067e69d75f92ec670dad5242857fb7688ba8b7c6a15616797b5df25dd89fd3b54916f93cb60ce2cfe97aca84739b45954 + languageName: node + linkType: hard + +"micromark-extension-mdx-jsx@npm:^1.0.0": + version: 1.0.3 + resolution: "micromark-extension-mdx-jsx@npm:1.0.3" + dependencies: + "@types/acorn": ^4.0.0 + estree-util-is-identifier-name: ^2.0.0 + micromark-factory-mdx-expression: ^1.0.0 + micromark-factory-space: ^1.0.0 + micromark-util-character: ^1.0.0 + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.0 + uvu: ^0.5.0 + vfile-message: ^3.0.0 + checksum: 1a5566890aabc52fe96b78e3a3a507dee03a2232e44b9360b00617734e156f934e85bc6a477fbb856c793fe33c9fb7d2207a4f50e680168c0d04ba9c9336d960 + languageName: node + linkType: hard + +"micromark-extension-mdx-md@npm:^1.0.0": + version: 1.0.0 + resolution: "micromark-extension-mdx-md@npm:1.0.0" + dependencies: + micromark-util-types: ^1.0.0 + checksum: b4f205e1d5f0946b4755541ef44ffd0b3be8c7ecfc08d8b139b6a21fbd3ff62d8fdb6b7e6d17bd9a3b610450267f43a41703dc48b341da9addd743a28cdefa64 + languageName: node + linkType: hard + +"micromark-extension-mdxjs-esm@npm:^1.0.0": + version: 1.0.3 + resolution: "micromark-extension-mdxjs-esm@npm:1.0.3" + dependencies: + micromark-core-commonmark: ^1.0.0 + micromark-util-character: ^1.0.0 + micromark-util-events-to-acorn: ^1.0.0 + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.0 + unist-util-position-from-estree: ^1.1.0 + uvu: ^0.5.0 + vfile-message: ^3.0.0 + checksum: 756074656391a5e5bb96bc8a0e9c1df7d9f7be5299847c9719e6a90552e1c76a11876aa89986ad5da89ab485f776a4a43a61ea3acddd4f865a5cee43ac523ffd + languageName: node + linkType: hard + +"micromark-extension-mdxjs@npm:^1.0.0": + version: 1.0.0 + resolution: "micromark-extension-mdxjs@npm:1.0.0" + dependencies: + acorn: ^8.0.0 + acorn-jsx: ^5.0.0 + micromark-extension-mdx-expression: ^1.0.0 + micromark-extension-mdx-jsx: ^1.0.0 + micromark-extension-mdx-md: ^1.0.0 + micromark-extension-mdxjs-esm: ^1.0.0 + micromark-util-combine-extensions: ^1.0.0 + micromark-util-types: ^1.0.0 + checksum: ba836c6d2dfc67597886e88f533ffa02f2029dbe216a0651f1066e70f8529a700bcc7fa2bc4201ee12fd3d1cd7da7093d5a442442daeb84b27df96aaffb7699c + languageName: node + linkType: hard + +"micromark-factory-destination@npm:^1.0.0": + version: 1.0.0 + resolution: "micromark-factory-destination@npm:1.0.0" + dependencies: + micromark-util-character: ^1.0.0 + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.0 + checksum: 8e733ae9c1c2342f14ff290bf09946e20f6f540117d80342377a765cac48df2ea5e748f33c8b07501ad7a43414b1a6597c8510ede2052b6bf1251fab89748e20 + languageName: node + linkType: hard + +"micromark-factory-label@npm:^1.0.0": + version: 1.0.2 + resolution: "micromark-factory-label@npm:1.0.2" + dependencies: + micromark-util-character: ^1.0.0 + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.0 + uvu: ^0.5.0 + checksum: 957e9366bdc8dbc1437c0706ff96972fa985ab4b1274abcae12f6094f527cbf5c69e7f2304c23c7f4b96e311ff7911d226563b8b43dcfcd4091e8c985fb97ce6 + languageName: node + linkType: hard + +"micromark-factory-mdx-expression@npm:^1.0.0": + version: 1.0.7 + resolution: "micromark-factory-mdx-expression@npm:1.0.7" + dependencies: + micromark-factory-space: ^1.0.0 + micromark-util-character: ^1.0.0 + micromark-util-events-to-acorn: ^1.0.0 + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.0 + unist-util-position-from-estree: ^1.0.0 + uvu: ^0.5.0 + vfile-message: ^3.0.0 + checksum: e7893f21576bcb7755d341e45d3ff202ba466fa2278c6f31ae4db4002a28d6d13a4efad331ef46223372ec2010d9bc2ff27e2cd57a4580be6491e59ca21ba59d + languageName: node + linkType: hard + +"micromark-factory-space@npm:^1.0.0": + version: 1.0.0 + resolution: "micromark-factory-space@npm:1.0.0" + dependencies: + micromark-util-character: ^1.0.0 + micromark-util-types: ^1.0.0 + checksum: 70d3aafde4e68ef4e509a3b644e9a29e4aada00801279e346577b008cbca06d78051bcd62aa7ea7425856ed73f09abd2b36607803055f726f52607ee7cb706b0 + languageName: node + linkType: hard + +"micromark-factory-title@npm:^1.0.0": + version: 1.0.2 + resolution: "micromark-factory-title@npm:1.0.2" + dependencies: + micromark-factory-space: ^1.0.0 + micromark-util-character: ^1.0.0 + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.0 + uvu: ^0.5.0 + checksum: 9a9cf66babde0bad1e25d6c1087082bfde6dfc319a36cab67c89651cc1a53d0e21cdec83262b5a4c33bff49f0e3c8dc2a7bd464e991d40dbea166a8f9b37e5b2 + languageName: node + linkType: hard + +"micromark-factory-whitespace@npm:^1.0.0": + version: 1.0.0 + resolution: "micromark-factory-whitespace@npm:1.0.0" + dependencies: + micromark-factory-space: ^1.0.0 + micromark-util-character: ^1.0.0 + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.0 + checksum: 0888386e6ea2dd665a5182c570d9b3d0a172d3f11694ca5a2a84e552149c9f1429f5b975ec26e1f0fa4388c55a656c9f359ce5e0603aff6175ba3e255076f20b + languageName: node + linkType: hard + +"micromark-util-character@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-character@npm:1.1.0" + dependencies: + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.0 + checksum: 504a4e3321f69bddf3fec9f0c1058239fc23336bda5be31d532b150491eda47965a251b37f8a7a9db0c65933b3aaa49cf88044fb1028be3af7c5ee6212bf8d5f + languageName: node + linkType: hard + +"micromark-util-chunked@npm:^1.0.0": + version: 1.0.0 + resolution: "micromark-util-chunked@npm:1.0.0" + dependencies: + micromark-util-symbol: ^1.0.0 + checksum: c1efd56e8c4217bcf1c6f1a9fb9912b4a2a5503b00d031da902be922fb3fee60409ac53f11739991291357b2784fb0647ddfc74c94753a068646c0cb0fd71421 + languageName: node + linkType: hard + +"micromark-util-classify-character@npm:^1.0.0": + version: 1.0.0 + resolution: "micromark-util-classify-character@npm:1.0.0" + dependencies: + micromark-util-character: ^1.0.0 + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.0 + checksum: 180446e6a1dec653f625ded028f244784e1db8d10ad05c5d70f08af9de393b4a03dc6cf6fa5ed8ccc9c24bbece7837abf3bf66681c0b4adf159364b7d5236dfd + languageName: node + linkType: hard + +"micromark-util-combine-extensions@npm:^1.0.0": + version: 1.0.0 + resolution: "micromark-util-combine-extensions@npm:1.0.0" + dependencies: + micromark-util-chunked: ^1.0.0 + micromark-util-types: ^1.0.0 + checksum: 5304a820ef75340e1be69d6ad167055b6ba9a3bafe8171e5945a935752f462415a9dd61eb3490220c055a8a11167209a45bfa73f278338b7d3d61fa1464d3f35 + languageName: node + linkType: hard + +"micromark-util-decode-numeric-character-reference@npm:^1.0.0": + version: 1.0.0 + resolution: "micromark-util-decode-numeric-character-reference@npm:1.0.0" + dependencies: + micromark-util-symbol: ^1.0.0 + checksum: f3ae2bb582a80f1e9d3face026f585c0c472335c064bd850bde152376f0394cb2831746749b6be6e0160f7d73626f67d10716026c04c87f402c0dd45a1a28633 + languageName: node + linkType: hard + +"micromark-util-decode-string@npm:^1.0.0": + version: 1.0.2 + resolution: "micromark-util-decode-string@npm:1.0.2" + dependencies: + decode-named-character-reference: ^1.0.0 + micromark-util-character: ^1.0.0 + micromark-util-decode-numeric-character-reference: ^1.0.0 + micromark-util-symbol: ^1.0.0 + checksum: 2dbb41c9691cc71505d39706405139fb7d6699429d577a524c7c248ac0cfd09d3dd212ad8e91c143a00b2896f26f81136edc67c5bda32d20446f0834d261b17a + languageName: node + linkType: hard + +"micromark-util-encode@npm:^1.0.0": + version: 1.0.1 + resolution: "micromark-util-encode@npm:1.0.1" + checksum: 9290583abfdc79ea3e7eb92c012c47a0e14327888f8aaa6f57ff79b3058d8e7743716b9d91abca3646f15ab3d78fdad9779fdb4ccf13349cd53309dfc845253a + languageName: node + linkType: hard + +"micromark-util-events-to-acorn@npm:^1.0.0": + version: 1.2.1 + resolution: "micromark-util-events-to-acorn@npm:1.2.1" + dependencies: + "@types/acorn": ^4.0.0 + "@types/estree": ^1.0.0 + estree-util-visit: ^1.0.0 + micromark-util-types: ^1.0.0 + uvu: ^0.5.0 + vfile-location: ^4.0.0 + vfile-message: ^3.0.0 + checksum: baf1cad66d860980cf20963f641c48c434e5be5802beabefdda21be136ae037845dd236b5e9ce5cf9409bf1b9ba8b4131a396d3a5bfa12098dae13e4a9724f2b + languageName: node + linkType: hard + +"micromark-util-html-tag-name@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-html-tag-name@npm:1.1.0" + checksum: a9b783cec89ec813648d59799464c1950fe281ae797b2a965f98ad0167d7fa1a247718eff023b4c015f47211a172f9446b8e6b98aad50e3cd44a3337317dad2c languageName: node linkType: hard -"meow@npm:^9.0.0": - version: 9.0.0 - resolution: "meow@npm:9.0.0" +"micromark-util-normalize-identifier@npm:^1.0.0": + version: 1.0.0 + resolution: "micromark-util-normalize-identifier@npm:1.0.0" dependencies: - "@types/minimist": ^1.2.0 - camelcase-keys: ^6.2.2 - decamelize: ^1.2.0 - decamelize-keys: ^1.1.0 - hard-rejection: ^2.1.0 - minimist-options: 4.1.0 - normalize-package-data: ^3.0.0 - read-pkg-up: ^7.0.1 - redent: ^3.0.0 - trim-newlines: ^3.0.1 - type-fest: ^0.18.0 - yargs-parser: ^20.2.3 - checksum: 99799c47247f4daeee178e3124f6ef6f84bde2ba3f37652865d5d8f8b8adcf9eedfc551dd043e2455cd8206545fd848e269c0c5ab6b594680a0ad4d3617c9639 + micromark-util-symbol: ^1.0.0 + checksum: d7c09d5e8318fb72f194af72664bd84a48a2928e3550b2b21c8fbc0ec22524f2a72e0f6663d2b95dc189a6957d3d7759b60716e888909710767cd557be821f8b languageName: node linkType: hard -"merge-descriptors@npm:1.0.1": - version: 1.0.1 - resolution: "merge-descriptors@npm:1.0.1" - checksum: 5abc259d2ae25bb06d19ce2b94a21632583c74e2a9109ee1ba7fd147aa7362b380d971e0251069f8b3eb7d48c21ac839e21fa177b335e82c76ec172e30c31a26 +"micromark-util-resolve-all@npm:^1.0.0": + version: 1.0.0 + resolution: "micromark-util-resolve-all@npm:1.0.0" + dependencies: + micromark-util-types: ^1.0.0 + checksum: 409667f2bd126ef8acce009270d2aecaaa5584c5807672bc657b09e50aa91bd2e552cf41e5be1e6469244a83349cbb71daf6059b746b1c44e3f35446fef63e50 languageName: node linkType: hard -"merge-stream@npm:^2.0.0": - version: 2.0.0 - resolution: "merge-stream@npm:2.0.0" - checksum: 6fa4dcc8d86629705cea944a4b88ef4cb0e07656ebf223fa287443256414283dd25d91c1cd84c77987f2aec5927af1a9db6085757cb43d90eb170ebf4b47f4f4 +"micromark-util-sanitize-uri@npm:^1.0.0": + version: 1.1.0 + resolution: "micromark-util-sanitize-uri@npm:1.1.0" + dependencies: + micromark-util-character: ^1.0.0 + micromark-util-encode: ^1.0.0 + micromark-util-symbol: ^1.0.0 + checksum: fe6093faa0adeb8fad606184d927ce37f207dcc2ec7256438e7f273c8829686245dd6161b597913ef25a3c4fb61863d3612a40cb04cf15f83ba1b4087099996b languageName: node linkType: hard -"merge2@npm:^1.2.3, merge2@npm:^1.3.0, merge2@npm:^1.4.1": - version: 1.4.1 - resolution: "merge2@npm:1.4.1" - checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 +"micromark-util-subtokenize@npm:^1.0.0": + version: 1.0.2 + resolution: "micromark-util-subtokenize@npm:1.0.2" + dependencies: + micromark-util-chunked: ^1.0.0 + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.0 + uvu: ^0.5.0 + checksum: c32ee58a7e1384ab1161a9ee02fbb04ad7b6e96d0b8c93dba9803c329a53d07f22ab394c7a96b2e30d6b8fbe3585b85817dba07277b1317111fc234e166bd2d1 languageName: node linkType: hard -"methods@npm:~1.1.2": - version: 1.1.2 - resolution: "methods@npm:1.1.2" - checksum: 0917ff4041fa8e2f2fda5425a955fe16ca411591fbd123c0d722fcf02b73971ed6f764d85f0a6f547ce49ee0221ce2c19a5fa692157931cecb422984f1dcd13a +"micromark-util-symbol@npm:^1.0.0": + version: 1.0.1 + resolution: "micromark-util-symbol@npm:1.0.1" + checksum: c6a3023b3a7432c15864b5e33a1bcb5042ac7aa097f2f452e587bef45433d42d39e0a5cce12fbea91e0671098ba0c3f62a2b30ce1cde66ecbb5e8336acf4391d languageName: node linkType: hard -"microbuffer@npm:^1.0.0": - version: 1.0.0 - resolution: "microbuffer@npm:1.0.0" - checksum: 1e4e16f48f057581c1e50b1c52c7bdc25cc85532b7de493b749ecdc1464975103d0c0b42d3a4b61ecd6d332773857fbf46c8aa70c6f6d254a05376245f095f9a +"micromark-util-types@npm:^1.0.0, micromark-util-types@npm:^1.0.1": + version: 1.0.2 + resolution: "micromark-util-types@npm:1.0.2" + checksum: 08dc901b7c06ee3dfeb54befca05cbdab9525c1cf1c1080967c3878c9e72cb9856c7e8ff6112816e18ead36ce6f99d55aaa91560768f2f6417b415dcba1244df languageName: node linkType: hard -"microevent.ts@npm:~0.1.1": - version: 0.1.1 - resolution: "microevent.ts@npm:0.1.1" - checksum: 7874fcdb3f0dfa4e996d3ea63b3b9882874ae7d22be28d51ae20da24c712e9e28e5011d988095c27dd2b32e37c0ad7425342a71b89adb8e808ec7194fadf4a7a +"micromark@npm:^3.0.0": + version: 3.1.0 + resolution: "micromark@npm:3.1.0" + dependencies: + "@types/debug": ^4.0.0 + debug: ^4.0.0 + decode-named-character-reference: ^1.0.0 + micromark-core-commonmark: ^1.0.1 + micromark-factory-space: ^1.0.0 + micromark-util-character: ^1.0.0 + micromark-util-chunked: ^1.0.0 + micromark-util-combine-extensions: ^1.0.0 + micromark-util-decode-numeric-character-reference: ^1.0.0 + micromark-util-encode: ^1.0.0 + micromark-util-normalize-identifier: ^1.0.0 + micromark-util-resolve-all: ^1.0.0 + micromark-util-sanitize-uri: ^1.0.0 + micromark-util-subtokenize: ^1.0.0 + micromark-util-symbol: ^1.0.0 + micromark-util-types: ^1.0.1 + uvu: ^0.5.0 + checksum: 5fe5bc3bf92e2ddd37b5f0034080fc3a4d4b3c1130dd5e435bb96ec75e9453091272852e71a4d74906a8fcf992d6f79d794607657c534bda49941e9950a92e28 languageName: node linkType: hard @@ -19895,7 +21378,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"mime-types@npm:^2.1.12, mime-types@npm:^2.1.27, mime-types@npm:^2.1.28, mime-types@npm:^2.1.31, mime-types@npm:~2.1.17, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": +"mime-types@npm:^2.1.12, mime-types@npm:^2.1.27, mime-types@npm:^2.1.30, mime-types@npm:^2.1.31, mime-types@npm:~2.1.17, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -19936,6 +21419,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"mimic-fn@npm:^4.0.0": + version: 4.0.0 + resolution: "mimic-fn@npm:4.0.0" + checksum: 995dcece15ee29aa16e188de6633d43a3db4611bcf93620e7e62109ec41c79c0f34277165b8ce5e361205049766e371851264c21ac64ca35499acb5421c2ba56 + languageName: node + linkType: hard + "mimic-response@npm:^1.0.0": version: 1.0.1 resolution: "mimic-response@npm:1.0.1" @@ -20009,7 +21499,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"minimatch@npm:^5.0.1, minimatch@npm:^5.1.0": +"minimatch@npm:^5.0.1": version: 5.1.0 resolution: "minimatch@npm:5.1.0" dependencies: @@ -20018,6 +21508,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"minimatch@npm:^7.1.3": + version: 7.4.6 + resolution: "minimatch@npm:7.4.6" + dependencies: + brace-expansion: ^2.0.1 + checksum: 1a6c8d22618df9d2a88aabeef1de5622eb7b558e9f8010be791cb6b0fa6e102d39b11c28d75b855a1e377b12edc7db8ff12a99c20353441caa6a05e78deb5da9 + languageName: node + linkType: hard + "minimist-options@npm:4.1.0": version: 4.1.0 resolution: "minimist-options@npm:4.1.0" @@ -20029,10 +21528,10 @@ fsevents@^1.2.7: languageName: node linkType: hard -"minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.6": - version: 1.2.7 - resolution: "minimist@npm:1.2.7" - checksum: 7346574a1038ca23c32e02252f603801f09384dd1d78b69a943a4e8c2c28730b80e96193882d3d3b22a063445f460e48316b29b8a25addca2d7e5e8f75478bec +"minimist@npm:^1.2.0, minimist@npm:^1.2.3, minimist@npm:^1.2.6, minimist@npm:^1.2.8": + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 75a6d645fb122dad29c06a7597bddea977258957ed88d7a6df59b5cd3fe4a527e253e9bbf2e783e4b73657f9098b96a5fe96ab8a113655d4109108577ecf85b0 languageName: node linkType: hard @@ -20237,6 +21736,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"mri@npm:^1.1.0": + version: 1.2.0 + resolution: "mri@npm:1.2.0" + checksum: 83f515abbcff60150873e424894a2f65d68037e5a7fcde8a9e2b285ee9c13ac581b63cfc1e6826c4732de3aeb84902f7c1e16b7aff46cd3f897a0f757a894e85 + languageName: node + linkType: hard + "ms@npm:2.0.0": version: 2.0.0 resolution: "ms@npm:2.0.0" @@ -20341,6 +21847,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"natural-compare-lite@npm:^1.4.0": + version: 1.4.0 + resolution: "natural-compare-lite@npm:1.4.0" + checksum: 5222ac3986a2b78dd6069ac62cbb52a7bf8ffc90d972ab76dfe7b01892485d229530ed20d0c62e79a6b363a663b273db3bde195a1358ce9e5f779d4453887225 + languageName: node + linkType: hard + "natural-compare@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare@npm:1.4.0" @@ -20438,6 +21951,24 @@ fsevents@^1.2.7: languageName: node linkType: hard +"node-domexception@npm:^1.0.0": + version: 1.0.0 + resolution: "node-domexception@npm:1.0.0" + checksum: ee1d37dd2a4eb26a8a92cd6b64dfc29caec72bff5e1ed9aba80c294f57a31ba4895a60fd48347cf17dd6e766da0ae87d75657dfd1f384ebfa60462c2283f5c7f + languageName: node + linkType: hard + +"node-fetch@npm:3.2.10": + version: 3.2.10 + resolution: "node-fetch@npm:3.2.10" + dependencies: + data-uri-to-buffer: ^4.0.0 + fetch-blob: ^3.1.4 + formdata-polyfill: ^4.0.10 + checksum: e65322431f4897ded04197aa5923eaec63a8d53e00432de4e70a4f7006625c8dc32629c5c35f4fe8ee719a4825544d07bf53f6e146a7265914262f493e8deac1 + languageName: node + linkType: hard + "node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.7": version: 2.6.7 resolution: "node-fetch@npm:2.6.7" @@ -20558,10 +22089,10 @@ fsevents@^1.2.7: languageName: node linkType: hard -"node-releases@npm:^2.0.6": - version: 2.0.6 - resolution: "node-releases@npm:2.0.6" - checksum: e86a926dc9fbb3b41b4c4a89d998afdf140e20a4e8dbe6c0a807f7b2948b42ea97d7fd3ad4868041487b6e9ee98409829c6e4d84a734a4215dff060a7fbeb4bf +"node-releases@npm:^2.0.8": + version: 2.0.10 + resolution: "node-releases@npm:2.0.10" + checksum: d784ecde25696a15d449c4433077f5cce620ed30a1656c4abf31282bfc691a70d9618bae6868d247a67914d1be5cc4fde22f65a05f4398cdfb92e0fc83cadfbc languageName: node linkType: hard @@ -20808,6 +22339,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"npm-run-path@npm:^5.1.0": + version: 5.1.0 + resolution: "npm-run-path@npm:5.1.0" + dependencies: + path-key: ^4.0.0 + checksum: dc184eb5ec239d6a2b990b43236845332ef12f4e0beaa9701de724aa797fe40b6bbd0157fb7639d24d3ab13f5d5cf22d223a19c6300846b8126f335f788bee66 + languageName: node + linkType: hard + "npmlog@npm:^4.1.2": version: 4.1.2 resolution: "npmlog@npm:4.1.2" @@ -20853,13 +22393,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"null-check@npm:^1.0.0": - version: 1.0.0 - resolution: "null-check@npm:1.0.0" - checksum: 6569fb2d74399e436eb4b05c7fdd341f22e87f3e0598a97309681073a364d6684997100cd329f2107d149663c506b2bfa47a0afdff23739ac1ba6ca5c4c6aa19 - languageName: node - linkType: hard - "num2fraction@npm:^1.2.2": version: 1.2.2 resolution: "num2fraction@npm:1.2.2" @@ -20874,10 +22407,10 @@ fsevents@^1.2.7: languageName: node linkType: hard -"nwsapi@npm:^2.2.0": - version: 2.2.0 - resolution: "nwsapi@npm:2.2.0" - checksum: 5ef4a9bc0c1a5b7f2e014aa6a4b359a257503b796618ed1ef0eb852098f77e772305bb0e92856e4bbfa3e6c75da48c0113505c76f144555ff38867229c2400a7 +"nwsapi@npm:^2.2.0, nwsapi@npm:^2.2.2": + version: 2.2.3 + resolution: "nwsapi@npm:2.2.3" + checksum: d5fcbb36a3a87770285c1e7b8213e033b4bbbc1050391dc28eed94f86ccab10539afadf8ce85de80c790535737915fb0ab53e2944166caad5b6f5e3a51ad24ff languageName: node linkType: hard @@ -20913,7 +22446,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"object-inspect@npm:^1.12.0, object-inspect@npm:^1.12.2, object-inspect@npm:^1.9.0": +"object-inspect@npm:^1.12.2, object-inspect@npm:^1.12.3, object-inspect@npm:^1.9.0": version: 1.12.3 resolution: "object-inspect@npm:1.12.3" checksum: dabfd824d97a5f407e6d5d24810d888859f6be394d8b733a77442b277e0808860555176719c5905e765e3743a7cada6b8b0a3b85e5331c530fd418cc8ae991db @@ -20936,7 +22469,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"object.assign@npm:^4.1.0, object.assign@npm:^4.1.2, object.assign@npm:^4.1.4": +"object.assign@npm:^4.1.2, object.assign@npm:^4.1.4": version: 4.1.4 resolution: "object.assign@npm:4.1.4" dependencies: @@ -21068,6 +22601,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"onetime@npm:^6.0.0": + version: 6.0.0 + resolution: "onetime@npm:6.0.0" + dependencies: + mimic-fn: ^4.0.0 + checksum: 0846ce78e440841335d4e9182ef69d5762e9f38aa7499b19f42ea1c4cd40f0b4446094c455c713f9adac3f4ae86f613bb5e30c99e52652764d06a89f709b3788 + languageName: node + linkType: hard + "open@npm:^7.0.3": version: 7.3.0 resolution: "open@npm:7.3.0" @@ -21230,7 +22772,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"p-limit@npm:^3.0.2": +"p-limit@npm:^3.0.2, p-limit@npm:^3.1.0": version: 3.1.0 resolution: "p-limit@npm:3.1.0" dependencies: @@ -21499,6 +23041,22 @@ fsevents@^1.2.7: languageName: node linkType: hard +"parse-entities@npm:^4.0.0": + version: 4.0.1 + resolution: "parse-entities@npm:4.0.1" + dependencies: + "@types/unist": ^2.0.0 + character-entities: ^2.0.0 + character-entities-legacy: ^3.0.0 + character-reference-invalid: ^2.0.0 + decode-named-character-reference: ^1.0.0 + is-alphanumerical: ^2.0.0 + is-decimal: ^2.0.0 + is-hexadecimal: ^2.0.0 + checksum: 32a6ff5b9acb9d2c4d71537308521fd265e685b9215691df73feedd9edfe041bb6da9f89bd0c35c4a2bc7d58e3e76e399bb6078c2fd7d2a343ff1dd46edbf1bd + languageName: node + linkType: hard + "parse-json@npm:^2.2.0": version: 2.2.0 resolution: "parse-json@npm:2.2.0" @@ -21555,6 +23113,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"parse5@npm:^7.0.0, parse5@npm:^7.1.1": + version: 7.1.2 + resolution: "parse5@npm:7.1.2" + dependencies: + entities: ^4.4.0 + checksum: 59465dd05eb4c5ec87b76173d1c596e152a10e290b7abcda1aecf0f33be49646ea74840c69af975d7887543ea45564801736356c568d6b5e71792fd0f4055713 + languageName: node + linkType: hard + "parseurl@npm:~1.3.2, parseurl@npm:~1.3.3": version: 1.3.3 resolution: "parseurl@npm:1.3.3" @@ -21666,6 +23233,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"path-key@npm:^4.0.0": + version: 4.0.0 + resolution: "path-key@npm:4.0.0" + checksum: 8e6c314ae6d16b83e93032c61020129f6f4484590a777eed709c4a01b50e498822b00f76ceaf94bc64dbd90b327df56ceadce27da3d83393790f1219e07721d7 + languageName: node + linkType: hard + "path-parse@npm:^1.0.7": version: 1.0.7 resolution: "path-parse@npm:1.0.7" @@ -21778,12 +23352,12 @@ fsevents@^1.2.7: languageName: node linkType: hard -"pidtree@npm:^0.5.0": - version: 0.5.0 - resolution: "pidtree@npm:0.5.0" +"pidtree@npm:^0.6.0": + version: 0.6.0 + resolution: "pidtree@npm:0.6.0" bin: pidtree: bin/pidtree.js - checksum: 371cd14bbc9bdee2a6a44596dd521dd3565e223481e0b1afffdca3f1c29831850bfa7784114dc30d245d37e7d186cec035e036256b39f75d878d19498fe0df6a + checksum: 8fbc073ede9209dd15e80d616e65eb674986c93be49f42d9ddde8dbbd141bb53d628a7ca4e58ab5c370bb00383f67d75df59a9a226dede8fa801267a7030c27a languageName: node linkType: hard @@ -22262,7 +23836,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"postcss-loader@npm:^6.2.1, postcss-loader@npm:~6.2.1": +"postcss-loader@npm:^6.2.1": version: 6.2.1 resolution: "postcss-loader@npm:6.2.1" dependencies: @@ -22276,6 +23850,28 @@ fsevents@^1.2.7: languageName: node linkType: hard +"postcss-loader@npm:~7.2.4": + version: 7.2.4 + resolution: "postcss-loader@npm:7.2.4" + dependencies: + cosmiconfig: ^8.1.3 + cosmiconfig-typescript-loader: ^4.3.0 + klona: ^2.0.6 + semver: ^7.3.8 + peerDependencies: + postcss: ^7.0.0 || ^8.0.1 + ts-node: ">=10" + typescript: ">=4" + webpack: ^5.0.0 + peerDependenciesMeta: + ts-node: + optional: true + typescript: + optional: true + checksum: d75de64f6629a2d76b1c1e9ad5022cae9b589472d8d091e21105d93a0f09a4c80f08fe10323d41ddf2fbda157910a03df3c538ce8fccf974b179d0762b408fa3 + languageName: node + linkType: hard + "postcss-logical@npm:^5.0.4, postcss-logical@npm:~5.0.4": version: 5.0.4 resolution: "postcss-logical@npm:5.0.4" @@ -22782,22 +24378,22 @@ fsevents@^1.2.7: languageName: node linkType: hard -"postcss-selector-parser@npm:^6.0.0, postcss-selector-parser@npm:^6.0.10, postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4, postcss-selector-parser@npm:^6.0.5, postcss-selector-parser@npm:^6.0.6, postcss-selector-parser@npm:^6.0.9": - version: 6.0.10 - resolution: "postcss-selector-parser@npm:6.0.10" +"postcss-selector-parser@npm:^6.0.0, postcss-selector-parser@npm:^6.0.10, postcss-selector-parser@npm:^6.0.11, postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4, postcss-selector-parser@npm:^6.0.5, postcss-selector-parser@npm:^6.0.6, postcss-selector-parser@npm:^6.0.9": + version: 6.0.11 + resolution: "postcss-selector-parser@npm:6.0.11" dependencies: cssesc: ^3.0.0 util-deprecate: ^1.0.2 - checksum: 46afaa60e3d1998bd7adf6caa374baf857cc58d3ff944e29459c9a9e4680a7fe41597bd5b755fc81d7c388357e9bf67c0251d047c640a09f148e13606b8a8608 + checksum: 0b01aa9c2d2c8dbeb51e9b204796b678284be9823abc8d6d40a8b16d4149514e922c264a8ed4deb4d6dbced564b9be390f5942c058582d8656351516d6c49cde languageName: node linkType: hard -"postcss-sorting@npm:^7.0.1": - version: 7.0.1 - resolution: "postcss-sorting@npm:7.0.1" +"postcss-sorting@npm:^8.0.2": + version: 8.0.2 + resolution: "postcss-sorting@npm:8.0.2" peerDependencies: - postcss: ^8.3.9 - checksum: 79cca6703ef7c60ea913c3bfb91f85bd7adce35e60b834a40cadd1c7e18f37961d63f0e641387651ee3bf1df1996e952d8fe443f93a271aa2d23f239ea3145bc + postcss: ^8.4.20 + checksum: ebb5cc6a2982a1f0bb8332669e425793ebc01c30fa83ea981c765d64d212e289bef5fdb1e627904c471cb75f1ad0727ed9e85c0d879e263590c8fc64eecf31c2 languageName: node linkType: hard @@ -22864,7 +24460,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"postcss@npm:^8.2.13, postcss@npm:^8.3.11, postcss@npm:^8.3.5, postcss@npm:^8.4.14, postcss@npm:^8.4.18, postcss@npm:^8.4.4, postcss@npm:^8.4.5, postcss@npm:^8.4.7, postcss@npm:~8.4.21": +"postcss@npm:^8.2.15, postcss@npm:^8.3.5, postcss@npm:^8.4.14, postcss@npm:^8.4.19, postcss@npm:^8.4.21, postcss@npm:^8.4.4, postcss@npm:~8.4.21": version: 8.4.21 resolution: "postcss@npm:8.4.21" dependencies: @@ -22920,12 +24516,12 @@ fsevents@^1.2.7: languageName: node linkType: hard -"prettier-plugin-pegjs@npm:~0.5.3": - version: 0.5.3 - resolution: "prettier-plugin-pegjs@npm:0.5.3" +"prettier-plugin-pegjs@npm:~0.5.4": + version: 0.5.4 + resolution: "prettier-plugin-pegjs@npm:0.5.4" dependencies: - prettier: ^2.8.1 - checksum: 1f45ee761b26d3d04e78c75617ca79184ebe5bf4f53d384ee1b89caaa7d22364288f0c2b40e5b984244440f8ca50351e52d3d5fbcb0d42e442adebe4b3c1ccca + prettier: ^2.8.4 + checksum: 25e89f6718601b232ddc6f6215f7222ede1bb3d756106635a73a24047f518771d36017dd8c2b8160809a49ad561fa155e4bcba9973d72951f6c6d2017787ba6f languageName: node linkType: hard @@ -22938,21 +24534,12 @@ fsevents@^1.2.7: languageName: node linkType: hard -"prettier@npm:>=2.4.0, prettier@npm:^2.8.1": - version: 2.8.3 - resolution: "prettier@npm:2.8.3" - bin: - prettier: bin-prettier.js - checksum: 92f2ceb522d454370e02082aa74ad27388672f7cee8975028b59517c069fe643bdc73e322675c8faf2ff173d7a626d1a6389f26b474000308e793aa25fff46e5 - languageName: node - linkType: hard - -"prettier@npm:~2.7.1": - version: 2.7.1 - resolution: "prettier@npm:2.7.1" +"prettier@npm:>=2.4.0, prettier@npm:^2.8.4, prettier@npm:~2.8.7": + version: 2.8.7 + resolution: "prettier@npm:2.8.7" bin: prettier: bin-prettier.js - checksum: 55a4409182260866ab31284d929b3cb961e5fdb91fe0d2e099dac92eaecec890f36e524b4c19e6ceae839c99c6d7195817579cdffc8e2c80da0cb794463a748b + checksum: fdc8f2616f099f5f0d685907f4449a70595a0fc1d081a88919604375989e0d5e9168d6121d8cc6861f21990b31665828e00472544d785d5940ea08a17660c3a6 languageName: node linkType: hard @@ -22983,7 +24570,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"pretty-format@npm:^27.0.0, pretty-format@npm:^27.0.2, pretty-format@npm:^27.5.1": +"pretty-format@npm:^27.0.2, pretty-format@npm:^27.5.1": version: 27.5.1 resolution: "pretty-format@npm:27.5.1" dependencies: @@ -23006,14 +24593,14 @@ fsevents@^1.2.7: languageName: node linkType: hard -"pretty-format@npm:^29.0.0, pretty-format@npm:^29.0.2": - version: 29.0.2 - resolution: "pretty-format@npm:29.0.2" +"pretty-format@npm:^29.0.0, pretty-format@npm:^29.5.0": + version: 29.5.0 + resolution: "pretty-format@npm:29.5.0" dependencies: - "@jest/schemas": ^29.0.0 + "@jest/schemas": ^29.4.3 ansi-styles: ^5.0.0 react-is: ^18.0.0 - checksum: 02aa8f0e9a91d52d0ca67911b72dc44ae23f41dd50de961f9c86947046f2ced0818c4baccc806f89e78b13e8ee690f5d55a6a8cbdae03f5990c1f5e79ac81048 + checksum: 4065356b558e6db25b4d41a01efb386935a6c06a0c9c104ef5ce59f2f476b8210edb8b3949b386e60ada0a6dc5ebcb2e6ccddc8c64dfd1a9943c3c3a9e7eaf89 languageName: node linkType: hard @@ -23249,6 +24836,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"pure-rand@npm:^6.0.0": + version: 6.0.1 + resolution: "pure-rand@npm:6.0.1" + checksum: 4bb565399993b815658a72e359f574ce4f04827a42a905105d61163ae86f456d91595a0e4241e7bce04328fae0638ae70ac0428d93ecb55971c465bd084f8648 + languageName: node + linkType: hard + "q@npm:^1.1.2, q@npm:^1.5.1": version: 1.5.1 resolution: "q@npm:1.5.1" @@ -23286,6 +24880,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"querystringify@npm:^2.1.1": + version: 2.2.0 + resolution: "querystringify@npm:2.2.0" + checksum: 5641ea231bad7ef6d64d9998faca95611ed4b11c2591a8cae741e178a974f6a8e0ebde008475259abe1621cb15e692404e6b6626e927f7b849d5c09392604b15 + languageName: node + linkType: hard + "quick-lru@npm:^4.0.1": version: 4.0.1 resolution: "quick-lru@npm:4.0.1" @@ -23494,7 +25095,25 @@ fsevents@^1.2.7: languageName: node linkType: hard -"react-docgen-typescript@npm:^2.1.1": +"react-docgen-typescript-plugin@npm:~1.0.5": + version: 1.0.5 + resolution: "react-docgen-typescript-plugin@npm:1.0.5" + dependencies: + debug: ^4.1.1 + endent: ^2.0.1 + find-cache-dir: ^3.3.1 + flat-cache: ^3.0.4 + micromatch: ^4.0.2 + react-docgen-typescript: ^2.2.2 + tslib: ^2.0.0 + peerDependencies: + typescript: ">= 4.x" + webpack: ">= 4" + checksum: 0f83d33c7b6dc82fef34ee820c94485c374d853774c5c26b04754ba3674fe4db2c7fc210b30fa0ca77c5033633553c12742aab6305a7f16cd263c70fedf27589 + languageName: node + linkType: hard + +"react-docgen-typescript@npm:^2.1.1, react-docgen-typescript@npm:^2.2.2": version: 2.2.2 resolution: "react-docgen-typescript@npm:2.2.2" peerDependencies: @@ -23705,7 +25324,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"react-scripts@npm:5.0.1": +"react-scripts@npm:^5.0.1": version: 5.0.1 resolution: "react-scripts@npm:5.0.1" dependencies: @@ -24054,12 +25673,12 @@ fsevents@^1.2.7: languageName: node linkType: hard -"rechoir@npm:^0.7.0": - version: 0.7.0 - resolution: "rechoir@npm:0.7.0" +"rechoir@npm:^0.8.0": + version: 0.8.0 + resolution: "rechoir@npm:0.8.0" dependencies: - resolve: ^1.9.0 - checksum: 15f55f55e06c175d98df85d503b139982378e7ca34e157439125e5a6f25a5cbd9cfe2aa2d1052e2c1edf89d7d22dc020c911fc968702c84f669a16a12a1ec7ac + resolve: ^1.20.0 + checksum: ad3caed8afdefbc33fbc30e6d22b86c35b3d51c2005546f4e79bcc03c074df804b3640ad18945e6bef9ed12caedc035655ec1082f64a5e94c849ff939dc0a788 languageName: node linkType: hard @@ -24101,12 +25720,12 @@ fsevents@^1.2.7: languageName: node linkType: hard -"regenerate-unicode-properties@npm:^10.0.1": - version: 10.0.1 - resolution: "regenerate-unicode-properties@npm:10.0.1" +"regenerate-unicode-properties@npm:^10.1.0": + version: 10.1.0 + resolution: "regenerate-unicode-properties@npm:10.1.0" dependencies: regenerate: ^1.4.2 - checksum: 1b638b7087d8143e5be3e20e2cda197ea0440fa0bc2cc49646b2f50c5a2b1acdc54b21e4215805a5a2dd487c686b2291accd5ad00619534098d2667e76247754 + checksum: b1a8929588433ab8b9dc1a34cf3665b3b472f79f2af6ceae00d905fc496b332b9af09c6718fb28c730918f19a00dc1d7310adbaa9b72a2ec7ad2f435da8ace17 languageName: node linkType: hard @@ -24124,12 +25743,12 @@ fsevents@^1.2.7: languageName: node linkType: hard -"regenerator-transform@npm:^0.15.0": - version: 0.15.0 - resolution: "regenerator-transform@npm:0.15.0" +"regenerator-transform@npm:^0.15.1": + version: 0.15.1 + resolution: "regenerator-transform@npm:0.15.1" dependencies: "@babel/runtime": ^7.8.4 - checksum: 86e54849ab1167618d28bb56d214c52a983daf29b0d115c976d79840511420049b6b42c9ebdf187defa8e7129bdd74b6dd266420d0d3868c9fa7f793b5d15d49 + checksum: 2d15bdeadbbfb1d12c93f5775493d85874dbe1d405bec323da5c61ec6e701bc9eea36167483e1a5e752de9b2df59ab9a2dfff6bf3784f2b28af2279a673d29a4 languageName: node linkType: hard @@ -24168,24 +25787,17 @@ fsevents@^1.2.7: languageName: node linkType: hard -"regexpp@npm:^3.2.0": - version: 3.2.0 - resolution: "regexpp@npm:3.2.0" - checksum: a78dc5c7158ad9ddcfe01aa9144f46e192ddbfa7b263895a70a5c6c73edd9ce85faf7c0430e59ac38839e1734e275b9c3de5c57ee3ab6edc0e0b1bdebefccef8 - languageName: node - linkType: hard - -"regexpu-core@npm:^5.1.0": - version: 5.1.0 - resolution: "regexpu-core@npm:5.1.0" +"regexpu-core@npm:^5.3.1": + version: 5.3.2 + resolution: "regexpu-core@npm:5.3.2" dependencies: + "@babel/regjsgen": ^0.8.0 regenerate: ^1.4.2 - regenerate-unicode-properties: ^10.0.1 - regjsgen: ^0.6.0 - regjsparser: ^0.8.2 + regenerate-unicode-properties: ^10.1.0 + regjsparser: ^0.9.1 unicode-match-property-ecmascript: ^2.0.0 - unicode-match-property-value-ecmascript: ^2.0.0 - checksum: 7b4eb8d182d9d10537a220a93138df5bc7eaf4ed53e36b95e8427d33ed8a2b081468f1a15d3e5fcee66517e1df7f5ca180b999e046d060badd97150f2ffe87b2 + unicode-match-property-value-ecmascript: ^2.1.0 + checksum: 95bb97088419f5396e07769b7de96f995f58137ad75fac5811fb5fe53737766dfff35d66a0ee66babb1eb55386ef981feaef392f9df6d671f3c124812ba24da2 languageName: node linkType: hard @@ -24207,21 +25819,14 @@ fsevents@^1.2.7: languageName: node linkType: hard -"regjsgen@npm:^0.6.0": - version: 0.6.0 - resolution: "regjsgen@npm:0.6.0" - checksum: c5158ebd735e75074e41292ade1ff05d85566d205426cc61501e360c450a63baced8512ee3ae238e5c0a0e42969563c7875b08fa69d6f0402daf36bcb3e4d348 - languageName: node - linkType: hard - -"regjsparser@npm:^0.8.2": - version: 0.8.4 - resolution: "regjsparser@npm:0.8.4" +"regjsparser@npm:^0.9.1": + version: 0.9.1 + resolution: "regjsparser@npm:0.9.1" dependencies: jsesc: ~0.5.0 bin: regjsparser: bin/parser - checksum: d069b932491761cda127ce11f6bd2729c3b1b394a35200ec33f1199e937423db28ceb86cf33f0a97c76ecd7c0f8db996476579eaf0d80a1f74c1934f4ca8b27a + checksum: 5e1b76afe8f1d03c3beaf9e0d935dd467589c3625f6d65fb8ffa14f224d783a0fed4bf49c2c1b8211043ef92b6117313419edf055a098ed8342e340586741afc languageName: node linkType: hard @@ -24252,7 +25857,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"remark-mdx@npm:1.6.22, remark-mdx@npm:^1.6.22": +"remark-mdx@npm:1.6.22": version: 1.6.22 resolution: "remark-mdx@npm:1.6.22" dependencies: @@ -24268,7 +25873,17 @@ fsevents@^1.2.7: languageName: node linkType: hard -"remark-parse@npm:8.0.3, remark-parse@npm:^8.0.3": +"remark-mdx@npm:^2.1.3": + version: 2.3.0 + resolution: "remark-mdx@npm:2.3.0" + dependencies: + mdast-util-mdx: ^2.0.0 + micromark-extension-mdxjs: ^1.0.0 + checksum: 98486986c5b6f6a8321eb2f3b13c70fcd5644821428c77b7bfeb5ee5d4605b9761b322b2f6b531e83883cd2d5bc7bc4623427149aee00e1eba012f538b3d5627 + languageName: node + linkType: hard + +"remark-parse@npm:8.0.3": version: 8.0.3 resolution: "remark-parse@npm:8.0.3" dependencies: @@ -24292,6 +25907,17 @@ fsevents@^1.2.7: languageName: node linkType: hard +"remark-parse@npm:^10.0.1": + version: 10.0.1 + resolution: "remark-parse@npm:10.0.1" + dependencies: + "@types/mdast": ^3.0.0 + mdast-util-from-markdown: ^1.0.0 + unified: ^10.0.0 + checksum: 505088e564ab53ff054433368adbb7b551f69240c7d9768975529837a86f1d0f085e72d6211929c5c42db315273df4afc94f3d3a8662ffdb69468534c6643d29 + languageName: node + linkType: hard + "remark-slug@npm:^6.0.0": version: 6.0.0 resolution: "remark-slug@npm:6.0.0" @@ -24312,25 +25938,14 @@ fsevents@^1.2.7: languageName: node linkType: hard -"remark-stringify@npm:^8.1.1": - version: 8.1.1 - resolution: "remark-stringify@npm:8.1.1" +"remark-stringify@npm:^10.0.2": + version: 10.0.2 + resolution: "remark-stringify@npm:10.0.2" dependencies: - ccount: ^1.0.0 - is-alphanumeric: ^1.0.0 - is-decimal: ^1.0.0 - is-whitespace-character: ^1.0.0 - longest-streak: ^2.0.1 - markdown-escapes: ^1.0.0 - markdown-table: ^2.0.0 - mdast-util-compact: ^2.0.0 - parse-entities: ^2.0.0 - repeat-string: ^1.5.4 - state-toggle: ^1.0.0 - stringify-entities: ^3.0.0 - unherit: ^1.0.4 - xtend: ^4.0.1 - checksum: 9a556e5a0dc26db151694a5d0a1dcd0f21bd7e619b3934d677876a633ad01a03e38f5cf174ff5468ec755d5a9398f4fbccac4788e04f5bcab8bb2583eddbc1b3 + "@types/mdast": ^3.0.0 + mdast-util-to-markdown: ^1.0.0 + unified: ^10.0.0 + checksum: 25424201e698353f6c0afc9ec29a8cac1dac8c06750d92214e3216bd76ac37902a0ba3702ac2a11c1040938a667b3bc22d6949af1d35e8fc81a3572643cdc263 languageName: node linkType: hard @@ -24374,7 +25989,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"repeat-string@npm:^1.0.0, repeat-string@npm:^1.5.4, repeat-string@npm:^1.6.1": +"repeat-string@npm:^1.5.4, repeat-string@npm:^1.6.1": version: 1.6.1 resolution: "repeat-string@npm:1.6.1" checksum: 1b809fc6db97decdc68f5b12c4d1a671c8e3f65ec4a40c238bc5200e44e85bcc52a54f78268ab9c29fcf5fe4f1343e805420056d1f30fa9a9ee4c2d93e3cc6c0 @@ -24504,7 +26119,14 @@ fsevents@^1.2.7: languageName: node linkType: hard -"resolve@^1.10.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.3.2, resolve@^1.9.0, resolve@npm:^1.1.7, resolve@npm:^1.22.0, resolve@npm:^1.22.1": +"resolve.exports@npm:^2.0.0": + version: 2.0.2 + resolution: "resolve.exports@npm:2.0.2" + checksum: 1c7778ca1b86a94f8ab4055d196c7d87d1874b96df4d7c3e67bbf793140f0717fd506dcafd62785b079cd6086b9264424ad634fb904409764c3509c3df1653f2 + languageName: node + linkType: hard + +"resolve@^1.10.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.3.2, resolve@npm:^1.1.7, resolve@npm:^1.22.0, resolve@npm:^1.22.1": version: 1.22.1 resolution: "resolve@npm:1.22.1" dependencies: @@ -24517,17 +26139,20 @@ fsevents@^1.2.7: languageName: node linkType: hard -resolve@^2.0.0-next.3: - version: 2.0.0-next.3 - resolution: "resolve@npm:2.0.0-next.3" +"resolve@npm:^2.0.0-next.4": + version: 2.0.0-next.4 + resolution: "resolve@npm:2.0.0-next.4" dependencies: - is-core-module: ^2.2.0 + is-core-module: ^2.9.0 path-parse: ^1.0.7 - checksum: f34b3b93ada77d64a6d590c06a83e198f3a827624c4ec972260905fa6c4d612164fbf0200d16d2beefea4ad1755b001f4a9a1293d8fc2322a8f7d6bf692c4ff5 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: c438ac9a650f2030fd074219d7f12ceb983b475da2d89ad3d6dd05fbf6b7a0a8cd37d4d10b43cb1f632bc19f22246ab7f36ebda54d84a29bfb2910a0680906d3 languageName: node linkType: hard -"resolve@patch:resolve@^1.1.7#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.17.0#~builtin, resolve@patch:resolve@^1.19.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.0#~builtin, resolve@patch:resolve@^1.22.1#~builtin, resolve@patch:resolve@^1.3.2#~builtin, resolve@patch:resolve@^1.9.0#~builtin": +"resolve@patch:resolve@^1.1.7#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.17.0#~builtin, resolve@patch:resolve@^1.19.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.0#~builtin, resolve@patch:resolve@^1.22.1#~builtin, resolve@patch:resolve@^1.3.2#~builtin": version: 1.22.1 resolution: "resolve@patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=c3c19d" dependencies: @@ -24540,13 +26165,16 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"resolve@patch:resolve@^2.0.0-next.3#~builtin": - version: 2.0.0-next.3 - resolution: "resolve@patch:resolve@npm%3A2.0.0-next.3#~builtin::version=2.0.0-next.3&hash=c3c19d" +"resolve@patch:resolve@^2.0.0-next.4#~builtin": + version: 2.0.0-next.4 + resolution: "resolve@patch:resolve@npm%3A2.0.0-next.4#~builtin::version=2.0.0-next.4&hash=c3c19d" dependencies: - is-core-module: ^2.2.0 + is-core-module: ^2.9.0 path-parse: ^1.0.7 - checksum: 21684b4d99a4877337cdbd5484311c811b3e8910edb5d868eec85c6e6550b0f570d911f9a384f9e176172d6713f2715bd0b0887fa512cb8c6aeece018de6a9f8 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 4bf9f4f8a458607af90518ff73c67a4bc1a38b5a23fef2bb0ccbd45e8be89820a1639b637b0ba377eb2be9eedfb1739a84cde24fe4cd670c8207d8fea922b011 languageName: node linkType: hard @@ -24717,12 +26345,21 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"rxjs@npm:^7.5.4": - version: 7.5.4 - resolution: "rxjs@npm:7.5.4" +"rxjs@npm:^7.8.0": + version: 7.8.0 + resolution: "rxjs@npm:7.8.0" dependencies: tslib: ^2.1.0 - checksum: 6f55f835f2543bc8214900f9e28b6320e6adc95875011fbca63e80a66eb18c9ff7cfdccb23b2180cbb6412762b98ed158c89fd51cb020799d127c66ea38c3c0e + checksum: 61b4d4fd323c1043d8d6ceb91f24183b28bcf5def4f01ca111511d5c6b66755bc5578587fe714ef5d67cf4c9f2e26f4490d4e1d8cabf9bd5967687835e9866a2 + languageName: node + linkType: hard + +"sade@npm:^1.7.3": + version: 1.8.1 + resolution: "sade@npm:1.8.1" + dependencies: + mri: ^1.1.0 + checksum: 0756e5b04c51ccdc8221ebffd1548d0ce5a783a44a0fa9017a026659b97d632913e78f7dca59f2496aa996a0be0b0c322afd87ca72ccd909406f49dbffa0f45d languageName: node linkType: hard @@ -24832,16 +26469,17 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"sass-loader@npm:~12.4.0": - version: 12.4.0 - resolution: "sass-loader@npm:12.4.0" +"sass-loader@npm:~13.2.2": + version: 13.2.2 + resolution: "sass-loader@npm:13.2.2" dependencies: - klona: ^2.0.4 + klona: ^2.0.6 neo-async: ^2.6.2 peerDependencies: fibers: ">= 3.1.0" - node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 sass: ^1.3.0 + sass-embedded: "*" webpack: ^5.0.0 peerDependenciesMeta: fibers: @@ -24850,20 +26488,22 @@ resolve@^2.0.0-next.3: optional: true sass: optional: true - checksum: 0f7ca3633e7f61c412b0628766a9b57cb15f68def45e4303e68eb2f3a0722aec231956fbfd118489d93c997ab605470e89de8e3f7d6776830cc6366d9657d618 + sass-embedded: + optional: true + checksum: 0368e4eaa4e2109bb6c6b6bc7dbfb9d8e412a0ab965f98672d336e84bd103575a1551cfe98395f20335b350f2a94e67f7c816cc8e3f4ab85147a1c1221e22fd8 languageName: node linkType: hard -"sass@npm:~1.49.11": - version: 1.49.11 - resolution: "sass@npm:1.49.11" +"sass@npm:~1.62.0": + version: 1.62.0 + resolution: "sass@npm:1.62.0" dependencies: chokidar: ">=3.0.0 <4.0.0" immutable: ^4.0.0 source-map-js: ">=0.6.2 <2.0.0" bin: sass: sass.js - checksum: f81cabfc43d6baf710979d647e24019f7cfb68242f8421d20dfc8c864cf83512b0b74a89098331696f758756829cb736f7b8aca70a11cff365928393ae351bcc + checksum: d5f606aa25afdf3ed9f316602811a40cf3b29f64cb70ea02f4198ae4288f9687de6fcef9f4fd2d58e06c28282d859aa249bdbf7d7d97a3a6a582eeaa8e5607fa languageName: node linkType: hard @@ -24883,6 +26523,15 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"saxes@npm:^6.0.0": + version: 6.0.0 + resolution: "saxes@npm:6.0.0" + dependencies: + xmlchars: ^2.2.0 + checksum: d3fa3e2aaf6c65ed52ee993aff1891fc47d5e47d515164b5449cbf5da2cbdc396137e55590472e64c5c436c14ae64a8a03c29b9e7389fc6f14035cf4e982ef3b + languageName: node + linkType: hard + "scheduler@npm:^0.20.2": version: 0.20.2 resolution: "scheduler@npm:0.20.2" @@ -24955,16 +26604,16 @@ resolve@^2.0.0-next.3: dependencies: "@rocket.chat/eslint-config-alt": "workspace:~" "@rocket.chat/prettier-config": "workspace:~" - "@types/node": ~15.14.9 - "@typescript-eslint/parser": ~5.11.0 + "@types/node": ~14.18.42 + "@typescript-eslint/parser": ~5.58.0 cross-env: ^7.0.3 endent: ^2.1.0 - eslint: ~8.26.0 + eslint: ~8.38.0 fast-glob: ~3.2.12 npm-run-all: ^4.1.5 - prettier: ~2.7.1 + prettier: ~2.8.7 ts-node: ~10.9.1 - typescript: ~4.9.4 + typescript: ~5.0.4 languageName: unknown linkType: soft @@ -24993,7 +26642,27 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"semver@npm:7.x, semver@npm:^7.1.1, semver@npm:^7.1.3, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:~7.3.8": +"semver@npm:7.x, semver@npm:^7.1.1, semver@npm:^7.1.3, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8": + version: 7.4.0 + resolution: "semver@npm:7.4.0" + dependencies: + lru-cache: ^6.0.0 + bin: + semver: bin/semver.js + checksum: debf7f4d6fa36fdc5ef82bd7fc3603b6412165c8a3963a30be0c45a587be1a49e7681e80aa109da1875765741af24edc6e021cee1ba16ae96f649d06c5df296d + languageName: node + linkType: hard + +"semver@npm:^6.0.0, semver@npm:^6.1.1, semver@npm:^6.1.2, semver@npm:^6.2.0, semver@npm:^6.3.0": + version: 6.3.0 + resolution: "semver@npm:6.3.0" + bin: + semver: ./bin/semver.js + checksum: 1b26ecf6db9e8292dd90df4e781d91875c0dcc1b1909e70f5d12959a23c7eebb8f01ea581c00783bbee72ceeaad9505797c381756326073850dc36ed284b21b9 + languageName: node + linkType: hard + +"semver@npm:~7.3.8": version: 7.3.8 resolution: "semver@npm:7.3.8" dependencies: @@ -25004,15 +26673,6 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"semver@npm:^6.0.0, semver@npm:^6.1.1, semver@npm:^6.1.2, semver@npm:^6.2.0, semver@npm:^6.3.0": - version: 6.3.0 - resolution: "semver@npm:6.3.0" - bin: - semver: ./bin/semver.js - checksum: 1b26ecf6db9e8292dd90df4e781d91875c0dcc1b1909e70f5d12959a23c7eebb8f01ea581c00783bbee72ceeaad9505797c381756326073850dc36ed284b21b9 - languageName: node - linkType: hard - "send@npm:0.18.0": version: 0.18.0 resolution: "send@npm:0.18.0" @@ -25073,12 +26733,12 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"serialize-javascript@npm:^6.0.0": - version: 6.0.0 - resolution: "serialize-javascript@npm:6.0.0" +"serialize-javascript@npm:^6.0.0, serialize-javascript@npm:^6.0.1": + version: 6.0.1 + resolution: "serialize-javascript@npm:6.0.1" dependencies: randombytes: ^2.1.0 - checksum: 56f90b562a1bdc92e55afb3e657c6397c01a902c588c0fe3d4c490efdcc97dcd2a3074ba12df9e94630f33a5ce5b76a74784a7041294628a6f4306e0ec84bf93 + checksum: 3c4f4cb61d0893b988415bdb67243637333f3f574e9e9cc9a006a2ced0b390b0b3b44aef8d51c951272a9002ec50885eefdc0298891bc27eb2fe7510ea87dc4f languageName: node linkType: hard @@ -25239,14 +26899,15 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"shiki@npm:^0.10.1": - version: 0.10.1 - resolution: "shiki@npm:0.10.1" +"shiki@npm:^0.14.1": + version: 0.14.1 + resolution: "shiki@npm:0.14.1" dependencies: - jsonc-parser: ^3.0.0 - vscode-oniguruma: ^1.6.1 - vscode-textmate: 5.2.0 - checksum: fb746f3cb3de7e545e3b10a6cb658d3938f840e4ccc9a3c90ceb7e69a8f89dbb432171faac1e9f02a03f103684dad88ee5e54b5c4964fa6b579fca6e8e26424d + ansi-sequence-parser: ^1.1.0 + jsonc-parser: ^3.2.0 + vscode-oniguruma: ^1.7.0 + vscode-textmate: ^8.0.0 + checksum: b19ea337cc84da69d99ca39d109f82946e0c56c11cc4c67b3b91cc14a9479203365fd0c9e0dd87e908f493ab409dc6f1849175384b6ca593ce7da884ae1edca2 languageName: node linkType: hard @@ -25543,6 +27204,16 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"source-map-support@npm:0.5.13": + version: 0.5.13 + resolution: "source-map-support@npm:0.5.13" + dependencies: + buffer-from: ^1.0.0 + source-map: ^0.6.0 + checksum: 933550047b6c1a2328599a21d8b7666507427c0f5ef5eaadd56b5da0fd9505e239053c66fe181bf1df469a3b7af9d775778eee283cbb7ae16b902ddc09e93a97 + languageName: node + linkType: hard + "source-map-support@npm:^0.5.16, source-map-support@npm:^0.5.6, source-map-support@npm:~0.5.12, source-map-support@npm:~0.5.20": version: 0.5.21 resolution: "source-map-support@npm:0.5.21" @@ -25795,28 +27466,27 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"standard-version@npm:^9.3.2": - version: 9.3.2 - resolution: "standard-version@npm:9.3.2" +"standard-version@npm:^9.5.0": + version: 9.5.0 + resolution: "standard-version@npm:9.5.0" dependencies: chalk: ^2.4.2 - conventional-changelog: 3.1.24 + conventional-changelog: 3.1.25 conventional-changelog-config-spec: 2.1.0 - conventional-changelog-conventionalcommits: 4.6.1 + conventional-changelog-conventionalcommits: 4.6.3 conventional-recommended-bump: 6.1.0 detect-indent: ^6.0.0 detect-newline: ^3.1.0 dotgitignore: ^2.1.0 figures: ^3.1.0 find-up: ^5.0.0 - fs-access: ^1.0.1 git-semver-tags: ^4.0.0 semver: ^7.1.1 stringify-package: ^1.0.1 yargs: ^16.0.0 bin: standard-version: bin/cli.js - checksum: 40e1105b73e77105338a869096708e15aebf0c1104740f8cbbbb24173f55a8e7f221ff2e4cad4765c230d34094caa4e378ceb74a1ea890709c32f5fb67bd49b7 + checksum: 55003206f7eca18ee9962566e5222d3930a1fa3c4692615d64e88f08873b9685837d669dc58361831bd3f211b6687c1681ad6a1749edf346b2db3e4564b4933c languageName: node linkType: hard @@ -26094,14 +27764,13 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"stringify-entities@npm:^3.0.0": - version: 3.1.0 - resolution: "stringify-entities@npm:3.1.0" +"stringify-entities@npm:^4.0.0": + version: 4.0.3 + resolution: "stringify-entities@npm:4.0.3" dependencies: - character-entities-html4: ^1.0.0 - character-entities-legacy: ^1.0.0 - xtend: ^4.0.0 - checksum: 5b6212e2985101ddb8197d999a6c01abb610f2ba6efd6f8f7d7ec763b61cb08b55735b03febdf501c2091f484df16bc82412419ef35ee21135548f6a15881044 + character-entities-html4: ^2.0.0 + character-entities-legacy: ^3.0.0 + checksum: 59e8f523b403bf7d415690e72ae52982decd6ea5426bd8b3f5c66225ddde73e766c0c0d91627df082d0794e30b19dd907ffb5864cef3602e4098d6777d7ca3c2 languageName: node linkType: hard @@ -26203,6 +27872,13 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"strip-final-newline@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-final-newline@npm:3.0.0" + checksum: 23ee263adfa2070cd0f23d1ac14e2ed2f000c9b44229aec9c799f1367ec001478469560abefd00c5c99ee6f0b31c137d53ec6029c53e9f32a93804e18c201050 + languageName: node + linkType: hard + "strip-indent@npm:^1.0.1": version: 1.0.1 resolution: "strip-indent@npm:1.0.1" @@ -26294,7 +27970,7 @@ resolve@^2.0.0-next.3: version: 2.0.0 resolution: "style-loader@npm:2.0.0" dependencies: - loader-utils: ^2.0.4 + loader-utils: ^2.0.0 schema-utils: ^3.0.0 peerDependencies: webpack: ^4.0.0 || ^5.0.0 @@ -26302,12 +27978,12 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"style-loader@npm:^3.3.1, style-loader@npm:~3.3.1": - version: 3.3.1 - resolution: "style-loader@npm:3.3.1" +"style-loader@npm:^3.3.1, style-loader@npm:~3.3.2": + version: 3.3.2 + resolution: "style-loader@npm:3.3.2" peerDependencies: webpack: ^5.0.0 - checksum: 470feef680f59e2fce4d6601b5c55b88c01ad8d1dd693c528ffd591ff5fd7c01a4eff3bdbe62f26f847d6bd2430c9ab594be23307cfe7a3446ab236683f0d066 + checksum: 5ee5ce2dc885369eccb55d429376e83d02570d473ac5edeb69fd65ee894847f1e51429cf078351f617bd04516ece8a1dd967f9f40464bd8fa76d903c6b2a6f08 languageName: node linkType: hard @@ -26346,54 +28022,58 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"stylelint-order@npm:~5.0.0": - version: 5.0.0 - resolution: "stylelint-order@npm:5.0.0" +"stylelint-order@npm:~6.0.3": + version: 6.0.3 + resolution: "stylelint-order@npm:6.0.3" dependencies: - postcss: ^8.3.11 - postcss-sorting: ^7.0.1 + postcss: ^8.4.21 + postcss-sorting: ^8.0.2 peerDependencies: - stylelint: ^14.0.0 - checksum: fa3ace3cc65486b9f94165603bd04983636fda5ac959cd29bf87847a95b32f366b16faf612bd49e3b9f96073f8fe28a22a5c5727cc08c8f9d7327c89084b3f30 + stylelint: ^14.0.0 || ^15.0.0 + checksum: dc2883a8a7918a752928f6cc2c860508e3f21c7189c0675ddba15056c683c234f5548f0c4a410e9a9ac0d2be8b4a4657e5674f01b6ad39f2b89053bf907aa744 languageName: node linkType: hard -"stylelint-prettier@npm:~2.0.0": - version: 2.0.0 - resolution: "stylelint-prettier@npm:2.0.0" +"stylelint-prettier@npm:~3.0.0": + version: 3.0.0 + resolution: "stylelint-prettier@npm:3.0.0" dependencies: prettier-linter-helpers: ^1.0.0 peerDependencies: prettier: ">=2.0.0" stylelint: ">=14.0.0" - checksum: 6ce7628517a492e0c2e6104f654c9bc710f1aaf035c8b5274e187b68e8d510e70bae5ded2cb65df76aa01096460b9dfe02f844fea13bfba7e3dcca13baec2ff4 + checksum: 094f53ef5dbe3806524db7f580b9312ceca444651803fc08c8baa48cd9a270985c709fa4f083681a685310dc347b8e55aa93d462554ba7d4ae6258a3bdf6a278 languageName: node linkType: hard -"stylelint-scss@npm:~4.3.0": - version: 4.3.0 - resolution: "stylelint-scss@npm:4.3.0" +"stylelint-scss@npm:~4.6.0": + version: 4.6.0 + resolution: "stylelint-scss@npm:4.6.0" dependencies: - lodash: ^4.17.21 + dlv: ^1.1.3 postcss-media-query-parser: ^0.2.3 postcss-resolve-nested-selector: ^0.1.1 - postcss-selector-parser: ^6.0.6 - postcss-value-parser: ^4.1.0 + postcss-selector-parser: ^6.0.11 + postcss-value-parser: ^4.2.0 peerDependencies: - stylelint: ^14.5.1 - checksum: fdf6119add2a3ccbf79f3a928acd7f90fc0f77fc45e5cf6f67d97419fe1a39dc6feec56307e1c45e0ec5ae677b0f18f83ce70e644df52aa6600706cf3551d0db + stylelint: ^14.5.1 || ^15.0.0 + checksum: b79b09c8150acfaf14da07cf58f836cf923456276a27e368811e1f39bcab4bf13b458d487fa570ed37c98aba815db44c05f54e63855973104969dfc90f31aa93 languageName: node linkType: hard -"stylelint@npm:~14.14.1": - version: 14.14.1 - resolution: "stylelint@npm:14.14.1" +"stylelint@npm:~15.4.0": + version: 15.4.0 + resolution: "stylelint@npm:15.4.0" dependencies: - "@csstools/selector-specificity": ^2.0.2 + "@csstools/css-parser-algorithms": ^2.1.0 + "@csstools/css-tokenizer": ^2.1.0 + "@csstools/media-query-list-parser": ^2.0.1 + "@csstools/selector-specificity": ^2.2.0 balanced-match: ^2.0.0 colord: ^2.9.3 - cosmiconfig: ^7.0.1 + cosmiconfig: ^8.1.3 css-functions-list: ^3.1.0 + css-tree: ^2.3.1 debug: ^4.3.4 fast-glob: ^3.2.12 fastest-levenshtein: ^1.0.16 @@ -26402,34 +28082,34 @@ resolve@^2.0.0-next.3: globby: ^11.1.0 globjoin: ^0.1.4 html-tags: ^3.2.0 - ignore: ^5.2.0 + ignore: ^5.2.4 import-lazy: ^4.0.0 imurmurhash: ^0.1.4 is-plain-object: ^5.0.0 - known-css-properties: ^0.26.0 + known-css-properties: ^0.27.0 mathml-tag-names: ^2.1.3 meow: ^9.0.0 micromatch: ^4.0.5 normalize-path: ^3.0.0 picocolors: ^1.0.0 - postcss: ^8.4.18 + postcss: ^8.4.21 postcss-media-query-parser: ^0.2.3 postcss-resolve-nested-selector: ^0.1.1 postcss-safe-parser: ^6.0.0 - postcss-selector-parser: ^6.0.10 + postcss-selector-parser: ^6.0.11 postcss-value-parser: ^4.2.0 resolve-from: ^5.0.0 string-width: ^4.2.3 strip-ansi: ^6.0.1 style-search: ^0.1.0 - supports-hyperlinks: ^2.3.0 + supports-hyperlinks: ^3.0.0 svg-tags: ^1.0.0 table: ^6.8.1 v8-compile-cache: ^2.3.0 - write-file-atomic: ^4.0.2 + write-file-atomic: ^5.0.0 bin: stylelint: bin/stylelint.js - checksum: be35a419e181ccf31410091d3a92766ffd17c71e8b6dda481343e2c589cbde96be539472783477f7f2907802bd9d79cc8322c3d22fb62c0fbd42fefd4ba66435 + checksum: f56a75ffb8ee016690b78b2d401626134317526682ce818d686096db5d33472bf5d3b2941f5b5b3f9711061e5ad123a335a6f482316a567c4c75deba6929702a languageName: node linkType: hard @@ -26467,14 +28147,7 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"supports-color@npm:^9.2.1": - version: 9.2.1 - resolution: "supports-color@npm:9.2.1" - checksum: 8a2bfeb64c1512d21a1a998c1f64acdaa85cf1f6a101627286548f19785524b329d7b28d567a28fc2d708fc7aba32f4c82a9b224f76b30a337a39d3e53418ff7 - languageName: node - linkType: hard - -"supports-hyperlinks@npm:^2.0.0, supports-hyperlinks@npm:^2.3.0": +"supports-hyperlinks@npm:^2.0.0": version: 2.3.0 resolution: "supports-hyperlinks@npm:2.3.0" dependencies: @@ -26484,6 +28157,16 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"supports-hyperlinks@npm:^3.0.0": + version: 3.0.0 + resolution: "supports-hyperlinks@npm:3.0.0" + dependencies: + has-flag: ^4.0.0 + supports-color: ^7.0.0 + checksum: 41021305de5255b10d821bf93c7a781f783e1693d0faec293d7fc7ccf17011b90bde84b0295fa92ba75c6c390351fe84fdd18848cad4bf656e464a958243c3e7 + languageName: node + linkType: hard + "supports-preserve-symlinks-flag@npm:^1.0.0": version: 1.0.0 resolution: "supports-preserve-symlinks-flag@npm:1.0.0" @@ -26628,23 +28311,13 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"synckit@npm:^0.4.1": - version: 0.4.1 - resolution: "synckit@npm:0.4.1" - dependencies: - tslib: ^2.3.1 - uuid: ^8.3.2 - checksum: 47fddf16037d11c193a27765573e8a3c608e93a45c58ce9bf92d92ccdb57a7ee54b1b2fd3f771d38c745b76ba1d108baadb89388bded898b6b5f12774ebc892d - languageName: node - linkType: hard - -"synckit@npm:^0.8.4": - version: 0.8.4 - resolution: "synckit@npm:0.8.4" +"synckit@npm:^0.8.4, synckit@npm:^0.8.5": + version: 0.8.5 + resolution: "synckit@npm:0.8.5" dependencies: "@pkgr/utils": ^2.3.1 - tslib: ^2.4.0 - checksum: 83e054fe4494dab42114fc4ed36a11b85e18742d304ade3f40d3afb4ba4145d76183adba1f29e2c36e9a0a453b93a83e2387505f96a0efd901f562927a968c44 + tslib: ^2.5.0 + checksum: 8a9560e5d8f3d94dc3cf5f7b9c83490ffa30d320093560a37b88f59483040771fd1750e76b9939abfbb1b5a23fd6dfbae77f6b338abffe7cae7329cd9b9bb86b languageName: node linkType: hard @@ -26868,14 +28541,14 @@ resolve@^2.0.0-next.3: linkType: hard "terser-webpack-plugin@npm:^5.0.3, terser-webpack-plugin@npm:^5.1.3, terser-webpack-plugin@npm:^5.2.5": - version: 5.3.3 - resolution: "terser-webpack-plugin@npm:5.3.3" + version: 5.3.7 + resolution: "terser-webpack-plugin@npm:5.3.7" dependencies: - "@jridgewell/trace-mapping": ^0.3.7 + "@jridgewell/trace-mapping": ^0.3.17 jest-worker: ^27.4.5 schema-utils: ^3.1.1 - serialize-javascript: ^6.0.0 - terser: ^5.14.2 + serialize-javascript: ^6.0.1 + terser: ^5.16.5 peerDependencies: webpack: ^5.1.0 peerDependenciesMeta: @@ -26885,7 +28558,7 @@ resolve@^2.0.0-next.3: optional: true uglify-js: optional: true - checksum: 4b8d508d8a0f6e604addb286975f1fa670f8c3964a67abc03a7cfcfd4cdeca4b07dda6655e1c4425427fb62e4d2b0ca59d84f1b2cd83262ff73616d5d3ccdeb5 + checksum: 095e699fdeeb553cdf2c6f75f983949271b396d9c201d7ae9fc633c45c1c1ad14c7257ef9d51ccc62213dd3e97f875870ba31550f6d4f1b6674f2615562da7f7 languageName: node linkType: hard @@ -26902,9 +28575,9 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"terser@npm:^5.14.2": - version: 5.15.0 - resolution: "terser@npm:5.15.0" +"terser@npm:^5.14.2, terser@npm:^5.16.5": + version: 5.16.9 + resolution: "terser@npm:5.16.9" dependencies: "@jridgewell/source-map": ^0.3.2 acorn: ^8.5.0 @@ -26912,7 +28585,7 @@ resolve@^2.0.0-next.3: source-map-support: ~0.5.20 bin: terser: bin/terser - checksum: b2358c989fcb76b4a1c265f60e175c950d3f776e5f619a9f58f54e8d2d792cd6b4cca86071834075f3b9943556d695357bafdd4ee2390de2fc9fd96ba3efa8c8 + checksum: b373693ee01ce08cc9b9595d57df889acbbc899d929a7fe53662330ce954d53145582f6715c9cc4839d555f5769a28fbeb203155b54e3a9c6c646db292002edd languageName: node linkType: hard @@ -27039,21 +28712,21 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"tldts-core@npm:^5.7.104": - version: 5.7.104 - resolution: "tldts-core@npm:5.7.104" - checksum: 61681f05f80cddebcbb86b44d246841d73f28f0ecea7e4c8fbd0dbfc736e829a385bdd88640ef805326ac4ef2549f1eabd5a1df59c177f83607c114654ac7f68 +"tldts-core@npm:^5.7.112": + version: 5.7.112 + resolution: "tldts-core@npm:5.7.112" + checksum: e86b1dd29a5fdb18b33b3fb49fc11778c11229adf83cc73d360ef0481d52309b91c8daa9aa6e5cf56540391a49b13c02326eb5311e869bdc66bb952e86b1e2be languageName: node linkType: hard -"tldts@npm:~5.7.104": - version: 5.7.104 - resolution: "tldts@npm:5.7.104" +"tldts@npm:~5.7.112": + version: 5.7.112 + resolution: "tldts@npm:5.7.112" dependencies: - tldts-core: ^5.7.104 + tldts-core: ^5.7.112 bin: tldts: bin/cli.js - checksum: 7328b8552eeab149466e9bb6406bd8304608aa171a3939844d9992068bee211376f3b92828eb4276a7fea1158079f21f45bb8e509e1b536956492d635e624a4c + checksum: 10832dab1cf4c32d1eac589ee7f301fff954b4419c1b8854599a08516b341fe22b16dd9a4d37b14446475a8812223413a76f9b7f61de6ba24df128891d62a136 languageName: node linkType: hard @@ -27155,14 +28828,15 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"tough-cookie@npm:^4.0.0": - version: 4.0.0 - resolution: "tough-cookie@npm:4.0.0" +"tough-cookie@npm:^4.0.0, tough-cookie@npm:^4.1.2": + version: 4.1.2 + resolution: "tough-cookie@npm:4.1.2" dependencies: psl: ^1.1.33 punycode: ^2.1.1 - universalify: ^0.1.2 - checksum: 0891b37eb7d17faa3479d47f0dce2e3007f2583094ad272f2670d120fbcc3df3b0b0a631ba96ecad49f9e2297d93ff8995ce0d3292d08dd7eabe162f5b224d69 + universalify: ^0.2.0 + url-parse: ^1.5.3 + checksum: a7359e9a3e875121a84d6ba40cc184dec5784af84f67f3a56d1d2ae39b87c0e004e6ba7c7331f9622a7d2c88609032473488b28fe9f59a1fec115674589de39a languageName: node linkType: hard @@ -27194,6 +28868,15 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"tr46@npm:^3.0.0": + version: 3.0.0 + resolution: "tr46@npm:3.0.0" + dependencies: + punycode: ^2.1.1 + checksum: 44c3cc6767fb800490e6e9fd64fd49041aa4e49e1f6a012b34a75de739cc9ed3a6405296072c1df8b6389ae139c5e7c6496f659cfe13a04a4bff3a1422981270 + languageName: node + linkType: hard + "tr46@npm:~0.0.3": version: 0.0.3 resolution: "tr46@npm:0.0.3" @@ -27252,6 +28935,13 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"trough@npm:^2.0.0": + version: 2.1.0 + resolution: "trough@npm:2.1.0" + checksum: a577bb561c2b401cc0e1d9e188fcfcdf63b09b151ff56a668da12197fe97cac15e3d77d5b51f426ccfd94255744a9118e9e9935afe81a3644fa1be9783c82886 + languageName: node + linkType: hard + "tryer@npm:^1.0.1": version: 1.0.1 resolution: "tryer@npm:1.0.1" @@ -27266,28 +28956,28 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"ts-jest@npm:~27.1.5": - version: 27.1.5 - resolution: "ts-jest@npm:27.1.5" +"ts-jest@npm:~29.1.0": + version: 29.1.0 + resolution: "ts-jest@npm:29.1.0" dependencies: bs-logger: 0.x fast-json-stable-stringify: 2.x - jest-util: ^27.0.0 - json5: 2.x + jest-util: ^29.0.0 + json5: ^2.2.3 lodash.memoize: 4.x make-error: 1.x semver: 7.x - yargs-parser: 20.x + yargs-parser: ^21.0.1 peerDependencies: "@babel/core": ">=7.0.0-beta.0 <8" - "@types/jest": ^27.0.0 - babel-jest: ">=27.0.0 <28" - jest: ^27.0.0 - typescript: ">=3.8 <5.0" + "@jest/types": ^29.0.0 + babel-jest: ^29.0.0 + jest: ^29.0.0 + typescript: ">=4.3 <6" peerDependenciesMeta: "@babel/core": optional: true - "@types/jest": + "@jest/types": optional: true babel-jest: optional: true @@ -27295,7 +28985,7 @@ resolve@^2.0.0-next.3: optional: true bin: ts-jest: cli.js - checksum: 3ef51c538b82f49b3f529331c1a017871a2f90e7a9a6e69333304755036d121818c6b120e2ce32dd161ff8bb2487efec0c790753ecd39b46a9ed1ce0d241464c + checksum: 535dc42ad523cbe1e387701fb2e448518419b515c082f09b25411f0b3dd0b854cf3e8141c316d6f4b99883aeb4a4f94159cbb1edfb06d7f77ea6229fadb2e1bf languageName: node linkType: hard @@ -27374,7 +29064,7 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"tslib@npm:2.4.0, tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0": +"tslib@npm:2.4.0": version: 2.4.0 resolution: "tslib@npm:2.4.0" checksum: 8c4aa6a3c5a754bf76aefc38026134180c053b7bd2f81338cb5e5ebf96fefa0f417bff221592bf801077f5bf990562f6264fecbc42cd3309b33872cb6fc3b113 @@ -27388,10 +29078,10 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"tslib@npm:~2.3.1": - version: 2.3.1 - resolution: "tslib@npm:2.3.1" - checksum: de17a98d4614481f7fcb5cd53ffc1aaf8654313be0291e1bfaee4b4bb31a20494b7d218ff2e15017883e8ea9626599b3b0e0229c18383ba9dce89da2adf15cb9 +"tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.4.0, tslib@npm:^2.5.0": + version: 2.5.0 + resolution: "tslib@npm:2.5.0" + checksum: ae3ed5f9ce29932d049908ebfdf21b3a003a85653a9a140d614da6b767a93ef94f460e52c3d787f0e4f383546981713f165037dc2274df212ea9f8a4541004e1 languageName: node linkType: hard @@ -27708,40 +29398,39 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"typedoc@npm:~0.22.18": - version: 0.22.18 - resolution: "typedoc@npm:0.22.18" +"typedoc@npm:~0.24.1": + version: 0.24.1 + resolution: "typedoc@npm:0.24.1" dependencies: - glob: ^8.0.3 lunr: ^2.3.9 - marked: ^4.0.16 - minimatch: ^5.1.0 - shiki: ^0.10.1 + marked: ^4.2.12 + minimatch: ^7.1.3 + shiki: ^0.14.1 peerDependencies: - typescript: 4.0.x || 4.1.x || 4.2.x || 4.3.x || 4.4.x || 4.5.x || 4.6.x || 4.7.x + typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x bin: typedoc: bin/typedoc - checksum: b813d8129682f6ed5a4e96bacaf019e4da1d2744ca89fef850d6bb4c034616567ce67e6a7f5cfc5f00aac573f0b45d44b1427aafa262ab88dce6b460cb9e744c + checksum: 49ecc56060a9d37fd3da4fb57f0a848bf618f3b97542ef503dad67e805a611359ad2453a625da0e2dd7a2d9eb7992bcefded58115b5cb3ddc98780b548e6dfd5 languageName: node linkType: hard -"typescript@npm:~4.9.4": - version: 4.9.4 - resolution: "typescript@npm:4.9.4" +"typescript@npm:~5.0.4": + version: 5.0.4 + resolution: "typescript@npm:5.0.4" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: e782fb9e0031cb258a80000f6c13530288c6d63f1177ed43f770533fdc15740d271554cdae86701c1dd2c83b082cea808b07e97fd68b38a172a83dbf9e0d0ef9 + checksum: 82b94da3f4604a8946da585f7d6c3025fff8410779e5bde2855ab130d05e4fd08938b9e593b6ebed165bda6ad9292b230984f10952cf82f0a0ca07bbeaa08172 languageName: node linkType: hard -"typescript@patch:typescript@~4.9.4#~builtin": - version: 4.9.4 - resolution: "typescript@patch:typescript@npm%3A4.9.4#~builtin::version=4.9.4&hash=23ec76" +"typescript@patch:typescript@~5.0.4#~builtin": + version: 5.0.4 + resolution: "typescript@patch:typescript@npm%3A5.0.4#~builtin::version=5.0.4&hash=85af82" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 3e2ab0772908676d9b9cb83398c70003a3b08e1c6b3b122409df9f4b520f2fdaefa20c3d7d57dce283fed760ac94b3ce94d4a7fa875127b67852904425a1f0dc + checksum: bb309d320c59a26565fb3793dba550576ab861018ff3fd1b7fccabbe46ae4a35546bc45f342c0a0b6f265c801ccdf64ffd68f548f117ceb7f0eac4b805cd52a9 languageName: node linkType: hard @@ -27814,10 +29503,10 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"unicode-match-property-value-ecmascript@npm:^2.0.0": - version: 2.0.0 - resolution: "unicode-match-property-value-ecmascript@npm:2.0.0" - checksum: 8fe6a09d9085a625cabcead5d95bdbc1a2d5d481712856092ce0347231e81a60b93a68f1b69e82b3076a07e415a72c708044efa2aa40ae23e2e7b5c99ed4a9ea +"unicode-match-property-value-ecmascript@npm:^2.1.0": + version: 2.1.0 + resolution: "unicode-match-property-value-ecmascript@npm:2.1.0" + checksum: 8d6f5f586b9ce1ed0e84a37df6b42fdba1317a05b5df0c249962bd5da89528771e2d149837cad11aa26bcb84c35355cb9f58a10c3d41fa3b899181ece6c85220 languageName: node linkType: hard @@ -27849,17 +29538,18 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"unified@npm:^9.2.2": - version: 9.2.2 - resolution: "unified@npm:9.2.2" +"unified@npm:^10.0.0, unified@npm:^10.1.2": + version: 10.1.2 + resolution: "unified@npm:10.1.2" dependencies: - bail: ^1.0.0 + "@types/unist": ^2.0.0 + bail: ^2.0.0 extend: ^3.0.0 is-buffer: ^2.0.0 - is-plain-obj: ^2.0.0 - trough: ^1.0.0 - vfile: ^4.0.0 - checksum: 7c24461be7de4145939739ce50d18227c5fbdf9b3bc5a29dabb1ce26dd3e8bd4a1c385865f6f825f3b49230953ee8b591f23beab3bb3643e3e9dc37aa8a089d5 + is-plain-obj: ^4.0.0 + trough: ^2.0.0 + vfile: ^5.0.0 + checksum: 053e7c65ede644607f87bd625a299e4b709869d2f76ec8138569e6e886903b6988b21cd9699e471eda42bee189527be0a9dac05936f1d069a5e65d0125d5d756 languageName: node linkType: hard @@ -27948,6 +29638,24 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"unist-util-is@npm:^5.0.0": + version: 5.2.1 + resolution: "unist-util-is@npm:5.2.1" + dependencies: + "@types/unist": ^2.0.0 + checksum: ae76fdc3d35352cd92f1bedc3a0d407c3b9c42599a52ab9141fe89bdd786b51f0ec5a2ab68b93fb532e239457cae62f7e39eaa80229e1cb94875da2eafcbe5c4 + languageName: node + linkType: hard + +"unist-util-position-from-estree@npm:^1.0.0, unist-util-position-from-estree@npm:^1.1.0": + version: 1.1.2 + resolution: "unist-util-position-from-estree@npm:1.1.2" + dependencies: + "@types/unist": ^2.0.0 + checksum: e3f4060e2a9e894c6ed63489c5a7cb58ff282e5dae9497cbc2073033ca74d6e412af4d4d342c97aea08d997c908b8bce2fe43a2062aafc2bb3f266533016588b + languageName: node + linkType: hard + "unist-util-position@npm:^3.0.0": version: 3.1.0 resolution: "unist-util-position@npm:3.1.0" @@ -27964,6 +29672,16 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"unist-util-remove-position@npm:^4.0.0": + version: 4.0.2 + resolution: "unist-util-remove-position@npm:4.0.2" + dependencies: + "@types/unist": ^2.0.0 + unist-util-visit: ^4.0.0 + checksum: 989831da913d09a82a99ed9b47b78471b6409bde95942cde47e09da54b7736516f17e3c7e026af468684c1efcec5fb52df363381b2f9dc7fd96ce791c5a2fa4a + languageName: node + linkType: hard + "unist-util-remove@npm:^2.0.0": version: 2.0.1 resolution: "unist-util-remove@npm:2.0.1" @@ -27982,6 +29700,15 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"unist-util-stringify-position@npm:^3.0.0": + version: 3.0.3 + resolution: "unist-util-stringify-position@npm:3.0.3" + dependencies: + "@types/unist": ^2.0.0 + checksum: dbd66c15183607ca942a2b1b7a9f6a5996f91c0d30cf8966fb88955a02349d9eefd3974e9010ee67e71175d784c5a9fea915b0aa0b0df99dcb921b95c4c9e124 + languageName: node + linkType: hard + "unist-util-visit-parents@npm:^3.0.0": version: 3.1.1 resolution: "unist-util-visit-parents@npm:3.1.1" @@ -27992,6 +29719,16 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"unist-util-visit-parents@npm:^5.1.1": + version: 5.1.3 + resolution: "unist-util-visit-parents@npm:5.1.3" + dependencies: + "@types/unist": ^2.0.0 + unist-util-is: ^5.0.0 + checksum: 8ecada5978994f846b64658cf13b4092cd78dea39e1ba2f5090a5de842ba4852712c02351a8ae95250c64f864635e7b02aedf3b4a093552bb30cf1bd160efbaa + languageName: node + linkType: hard + "unist-util-visit@npm:2.0.3, unist-util-visit@npm:^2.0.0": version: 2.0.3 resolution: "unist-util-visit@npm:2.0.3" @@ -28003,6 +29740,17 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"unist-util-visit@npm:^4.0.0, unist-util-visit@npm:^4.1.1": + version: 4.1.2 + resolution: "unist-util-visit@npm:4.1.2" + dependencies: + "@types/unist": ^2.0.0 + unist-util-is: ^5.0.0 + unist-util-visit-parents: ^5.1.1 + checksum: 95a34e3f7b5b2d4b68fd722b6229972099eb97b6df18913eda44a5c11df8b1e27efe7206dd7b88c4ed244a48c474a5b2e2629ab79558ff9eb936840295549cee + languageName: node + linkType: hard + "universal-user-agent@npm:^6.0.0": version: 6.0.0 resolution: "universal-user-agent@npm:6.0.0" @@ -28010,13 +29758,20 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"universalify@npm:^0.1.0, universalify@npm:^0.1.2": +"universalify@npm:^0.1.0": version: 0.1.2 resolution: "universalify@npm:0.1.2" checksum: 40cdc60f6e61070fe658ca36016a8f4ec216b29bf04a55dce14e3710cc84c7448538ef4dad3728d0bfe29975ccd7bfb5f414c45e7b78883567fb31b246f02dff languageName: node linkType: hard +"universalify@npm:^0.2.0": + version: 0.2.0 + resolution: "universalify@npm:0.2.0" + checksum: e86134cb12919d177c2353196a4cc09981524ee87abf621f7bc8d249dbbbebaec5e7d1314b96061497981350df786e4c5128dbf442eba104d6e765bc260678b5 + languageName: node + linkType: hard + "universalify@npm:^1.0.0": version: 1.0.0 resolution: "universalify@npm:1.0.0" @@ -28078,7 +29833,7 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"update-browserslist-db@npm:^1.0.9": +"update-browserslist-db@npm:^1.0.10": version: 1.0.10 resolution: "update-browserslist-db@npm:1.0.10" dependencies: @@ -28097,7 +29852,7 @@ resolve@^2.0.0-next.3: resolution: "update-readme@workspace:tools/update-readme" dependencies: outdent: ^0.8.0 - zx: ~4.3.0 + zx: ~7.2.1 bin: update-readme: ./update-readme.mjs languageName: unknown @@ -28170,6 +29925,16 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"url-parse@npm:^1.5.3": + version: 1.5.10 + resolution: "url-parse@npm:1.5.10" + dependencies: + querystringify: ^2.1.1 + requires-port: ^1.0.0 + checksum: fbdba6b1d83336aca2216bbdc38ba658d9cfb8fc7f665eb8b17852de638ff7d1a162c198a8e4ed66001ddbf6c9888d41e4798912c62b4fd777a31657989f7bdf + languageName: node + linkType: hard + "url@npm:^0.11.0": version: 0.11.0 resolution: "url@npm:0.11.0" @@ -28318,6 +30083,20 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"uvu@npm:^0.5.0, uvu@npm:^0.5.6": + version: 0.5.6 + resolution: "uvu@npm:0.5.6" + dependencies: + dequal: ^2.0.0 + diff: ^5.0.0 + kleur: ^4.0.3 + sade: ^1.7.3 + bin: + uvu: bin.js + checksum: 09460a37975627de9fcad396e5078fb844d01aaf64a6399ebfcfd9e55f1c2037539b47611e8631f89be07656962af0cf48c334993db82b9ae9c3d25ce3862168 + languageName: node + linkType: hard + "v8-compile-cache-lib@npm:^3.0.1": version: 3.0.1 resolution: "v8-compile-cache-lib@npm:3.0.1" @@ -28343,6 +30122,17 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"v8-to-istanbul@npm:^9.0.1": + version: 9.1.0 + resolution: "v8-to-istanbul@npm:9.1.0" + dependencies: + "@jridgewell/trace-mapping": ^0.3.12 + "@types/istanbul-lib-coverage": ^2.0.1 + convert-source-map: ^1.6.0 + checksum: 2069d59ee46cf8d83b4adfd8a5c1a90834caffa9f675e4360f1157ffc8578ef0f763c8f32d128334424159bb6b01f3876acd39cd13297b2769405a9da241f8d1 + languageName: node + linkType: hard + "validate-npm-package-license@npm:^3.0.1, validate-npm-package-license@npm:^3.0.4": version: 3.0.4 resolution: "validate-npm-package-license@npm:3.0.4" @@ -28399,6 +30189,16 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"vfile-location@npm:^4.0.0": + version: 4.1.0 + resolution: "vfile-location@npm:4.1.0" + dependencies: + "@types/unist": ^2.0.0 + vfile: ^5.0.0 + checksum: c894e8e5224170d1f85288f4a1d1ebcee0780823ea2b49d881648ab360ebf01b37ecb09b1c4439a75f9a51f31a9f9742cd045e987763e367c352a1ef7c50d446 + languageName: node + linkType: hard + "vfile-message@npm:^2.0.0": version: 2.0.4 resolution: "vfile-message@npm:2.0.4" @@ -28409,7 +30209,17 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"vfile@npm:^4.0.0, vfile@npm:^4.2.1": +"vfile-message@npm:^3.0.0": + version: 3.1.4 + resolution: "vfile-message@npm:3.1.4" + dependencies: + "@types/unist": ^2.0.0 + unist-util-stringify-position: ^3.0.0 + checksum: d0ee7da1973ad76513c274e7912adbed4d08d180eaa34e6bd40bc82459f4b7bc50fcaff41556135e3339995575eac5f6f709aba9332b80f775618ea4880a1367 + languageName: node + linkType: hard + +"vfile@npm:^4.0.0": version: 4.2.1 resolution: "vfile@npm:4.2.1" dependencies: @@ -28421,6 +30231,18 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"vfile@npm:^5.0.0, vfile@npm:^5.3.4": + version: 5.3.7 + resolution: "vfile@npm:5.3.7" + dependencies: + "@types/unist": ^2.0.0 + is-buffer: ^2.0.0 + unist-util-stringify-position: ^3.0.0 + vfile-message: ^3.0.0 + checksum: 642cce703afc186dbe7cabf698dc954c70146e853491086f5da39e1ce850676fc96b169fcf7898aa3ff245e9313aeec40da93acd1e1fcc0c146dc4f6308b4ef9 + languageName: node + linkType: hard + "vm-browserify@npm:^1.0.1": version: 1.1.2 resolution: "vm-browserify@npm:1.1.2" @@ -28435,17 +30257,17 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"vscode-oniguruma@npm:^1.6.1": - version: 1.6.1 - resolution: "vscode-oniguruma@npm:1.6.1" - checksum: b019563a0d48b08c26b66c9f8729ed4ca2620b3b09c6957d5e622f0f104574bec48c7ba575bd157da40fb9a03c03495704894e3ed2d799d80a7180e3051b1f10 +"vscode-oniguruma@npm:^1.7.0": + version: 1.7.0 + resolution: "vscode-oniguruma@npm:1.7.0" + checksum: 53519d91d90593e6fb080260892e87d447e9b200c4964d766772b5053f5699066539d92100f77f1302c91e8fc5d9c772fbe40fe4c90f3d411a96d5a9b1e63f42 languageName: node linkType: hard -"vscode-textmate@npm:5.2.0": - version: 5.2.0 - resolution: "vscode-textmate@npm:5.2.0" - checksum: 5449b42d451080f6f3649b66948f4b5ee4643c4e88cfe3558a3b31c84c78060cfdd288c4958c1690eaa5cd65d09992fa6b7c3bef9d4aa72b3651054a04624d20 +"vscode-textmate@npm:^8.0.0": + version: 8.0.0 + resolution: "vscode-textmate@npm:8.0.0" + checksum: 127780dfea89559d70b8326df6ec344cfd701312dd7f3f591a718693812b7852c30b6715e3cfc8b3200a4e2515b4c96f0843c0eacc0a3020969b5de262c2a4bb languageName: node linkType: hard @@ -28474,12 +30296,21 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"walker@npm:^1.0.7, walker@npm:~1.0.5": - version: 1.0.7 - resolution: "walker@npm:1.0.7" +"w3c-xmlserializer@npm:^4.0.0": + version: 4.0.0 + resolution: "w3c-xmlserializer@npm:4.0.0" + dependencies: + xml-name-validator: ^4.0.0 + checksum: eba070e78deb408ae8defa4d36b429f084b2b47a4741c4a9be3f27a0a3d1845e277e3072b04391a138f7e43776842627d1334e448ff13ff90ad9fb1214ee7091 + languageName: node + linkType: hard + +"walker@npm:^1.0.7, walker@npm:^1.0.8, walker@npm:~1.0.5": + version: 1.0.8 + resolution: "walker@npm:1.0.8" dependencies: - makeerror: 1.0.x - checksum: 4038fcf92f6ab0288267ad05008aec9e089a759f1bd32e1ea45cc2eb498eb12095ec43cf8ca2bf23a465f4580a0d33b25b89f450ba521dd27083cbc695ee6bf5 + makeerror: 1.0.12 + checksum: ad7a257ea1e662e57ef2e018f97b3c02a7240ad5093c392186ce0bcf1f1a60bbadd520d073b9beb921ed99f64f065efb63dfc8eec689a80e569f93c1c5d5e16c languageName: node linkType: hard @@ -28544,6 +30375,13 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"web-streams-polyfill@npm:^3.0.3": + version: 3.2.1 + resolution: "web-streams-polyfill@npm:3.2.1" + checksum: b119c78574b6d65935e35098c2afdcd752b84268e18746606af149e3c424e15621b6f1ff0b42b2676dc012fc4f0d313f964b41a4b5031e525faa03997457da02 + languageName: node + linkType: hard + "web-vitals@npm:^2.1.4": version: 2.1.4 resolution: "web-vitals@npm:2.1.4" @@ -28579,10 +30417,18 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"webpack-bundle-analyzer@npm:~4.7.0": - version: 4.7.0 - resolution: "webpack-bundle-analyzer@npm:4.7.0" +"webidl-conversions@npm:^7.0.0": + version: 7.0.0 + resolution: "webidl-conversions@npm:7.0.0" + checksum: f05588567a2a76428515333eff87200fae6c83c3948a7482ebb109562971e77ef6dc49749afa58abb993391227c5697b3ecca52018793e0cb4620a48f10bd21b + languageName: node + linkType: hard + +"webpack-bundle-analyzer@npm:~4.8.0": + version: 4.8.0 + resolution: "webpack-bundle-analyzer@npm:4.8.0" dependencies: + "@discoveryjs/json-ext": 0.5.7 acorn: ^8.0.4 acorn-walk: ^8.0.0 chalk: ^4.1.0 @@ -28594,40 +30440,39 @@ resolve@^2.0.0-next.3: ws: ^7.3.1 bin: webpack-bundle-analyzer: lib/bin/analyzer.js - checksum: 4ce3b379c61ce16b2219756843407cc99f2b82cd191f653043f1b705a3e32b3af03834af0dfded98ab852313a892a148bed1a8effaacd6440f028c19f41581f3 + checksum: acd86f68abb2bcb1a240043c6e2d8e53079499363afed94b96c0ec1abcc4fca2b7a7cbeeb5e13027d02a993c6ea8153194c69e7697faf47528bdaff1e2ce297e languageName: node linkType: hard -"webpack-cli@npm:~4.10.0": - version: 4.10.0 - resolution: "webpack-cli@npm:4.10.0" +"webpack-cli@npm:~5.0.1": + version: 5.0.1 + resolution: "webpack-cli@npm:5.0.1" dependencies: "@discoveryjs/json-ext": ^0.5.0 - "@webpack-cli/configtest": ^1.2.0 - "@webpack-cli/info": ^1.5.0 - "@webpack-cli/serve": ^1.7.0 + "@webpack-cli/configtest": ^2.0.1 + "@webpack-cli/info": ^2.0.1 + "@webpack-cli/serve": ^2.0.1 colorette: ^2.0.14 - commander: ^7.0.0 + commander: ^9.4.1 cross-spawn: ^7.0.3 + envinfo: ^7.7.3 fastest-levenshtein: ^1.0.12 import-local: ^3.0.2 - interpret: ^2.2.0 - rechoir: ^0.7.0 + interpret: ^3.1.1 + rechoir: ^0.8.0 webpack-merge: ^5.7.3 peerDependencies: - webpack: 4.x.x || 5.x.x + webpack: 5.x.x peerDependenciesMeta: "@webpack-cli/generators": optional: true - "@webpack-cli/migrate": - optional: true webpack-bundle-analyzer: optional: true webpack-dev-server: optional: true bin: webpack-cli: bin/cli.js - checksum: 2ff5355ac348e6b40f2630a203b981728834dca96d6d621be96249764b2d0fc01dd54edfcc37f02214d02935de2cf0eefd6ce689d970d154ef493f01ba922390 + checksum: b1544eea669442e78c3dba9f79c0f8d0136759b8b2fe9cd32c0d410250fd719988ae037778ba88993215d44971169f2c268c0c934068be561711615f1951bd53 languageName: node linkType: hard @@ -28647,18 +30492,18 @@ resolve@^2.0.0-next.3: linkType: hard "webpack-dev-middleware@npm:^4.1.0": - version: 4.1.0 - resolution: "webpack-dev-middleware@npm:4.1.0" + version: 4.3.0 + resolution: "webpack-dev-middleware@npm:4.3.0" dependencies: - colorette: ^1.2.1 - mem: ^8.0.0 - memfs: ^3.2.0 - mime-types: ^2.1.28 + colorette: ^1.2.2 + mem: ^8.1.1 + memfs: ^3.2.2 + mime-types: ^2.1.30 range-parser: ^1.2.1 schema-utils: ^3.0.0 peerDependencies: webpack: ^4.0.0 || ^5.0.0 - checksum: ef4fda265e3e9e073be738d141079086e318c67626358f8962ac50cfccc7cd6515ee60a4166a923f4af717a16f28eef4cb762ea7fefcdcd16255ff47b1c16a47 + checksum: 113389f9aa488312758b329f9fdd34ff646a50822c197d0e1dc7ce171b1d826a607c92702a60439fead24e495d5b2c9959d90948fc272f7472a301d37cec1e8d languageName: node linkType: hard @@ -28811,9 +30656,9 @@ resolve@^2.0.0-next.3: linkType: hard "webpack-virtual-modules@npm:^0.4.1": - version: 0.4.2 - resolution: "webpack-virtual-modules@npm:0.4.2" - checksum: 792e12d46547f5c961a9a8ec90990890e524abae2f5b09b8c1f2f3e5e7019a358bc6731d77dfb6d37bc6f0437337b07d728d5e77a355243e5baa4170d78252df + version: 0.4.6 + resolution: "webpack-virtual-modules@npm:0.4.6" + checksum: cb056ba8c50b35436ae43149554b051b80065b0cf79f2d528ca692ddf344a422ac71c415adb9da83dc3acc6e7e58f518388cc1cd11cb4fa29dc04f2c4494afe3 languageName: node linkType: hard @@ -28855,9 +30700,9 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"webpack@npm:>=4.43.0 <6.0.0, webpack@npm:^5.64.4, webpack@npm:^5.74.0, webpack@npm:^5.9.0, webpack@npm:~5.76.0": - version: 5.76.2 - resolution: "webpack@npm:5.76.2" +"webpack@npm:>=4.43.0 <6.0.0, webpack@npm:^5.64.4, webpack@npm:^5.9.0, webpack@npm:~5.78.0": + version: 5.78.0 + resolution: "webpack@npm:5.78.0" dependencies: "@types/eslint-scope": ^3.7.3 "@types/estree": ^0.0.51 @@ -28888,7 +30733,16 @@ resolve@^2.0.0-next.3: optional: true bin: webpack: bin/webpack.js - checksum: 86db98299a175c371031449c26077e87b33acd8f45de7f7945ed4b9b37c8ca11bc5169af9c44743efccd4d55e08042a3aa3a3bc42aff831309a0821ffbcd395e + checksum: 4213e5bcc23e54c2f2a589e8e96f1fb71a2c05d5033ffda6dd8bae32284abfa0eb6b6d0707806e8dcfa48a8fcda2448d3af6c4539061679251d94c0996bebf99 + languageName: node + linkType: hard + +"webpod@npm:^0": + version: 0.0.2 + resolution: "webpod@npm:0.0.2" + bin: + webpod: dist/index.js + checksum: 3c6f7376cf06804a0b68adec3c33d1aceb9a1d13854beac542b95dcdb6f6cee34cd05fbd2228e01b67c2ce48673650296976dd694bd8d0ff10920a32dbe2e30a languageName: node linkType: hard @@ -28919,6 +30773,15 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"whatwg-encoding@npm:^2.0.0": + version: 2.0.0 + resolution: "whatwg-encoding@npm:2.0.0" + dependencies: + iconv-lite: 0.6.3 + checksum: 7087810c410aa9b689cbd6af8773341a53cdc1f3aae2a882c163bd5522ec8ca4cdfc269aef417a5792f411807d5d77d50df4c24e3abb00bb60192858a40cc675 + languageName: node + linkType: hard + "whatwg-fetch@npm:^3.6.2": version: 3.6.2 resolution: "whatwg-fetch@npm:3.6.2" @@ -28933,6 +30796,23 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"whatwg-mimetype@npm:^3.0.0": + version: 3.0.0 + resolution: "whatwg-mimetype@npm:3.0.0" + checksum: ce08bbb36b6aaf64f3a84da89707e3e6a31e5ab1c1a2379fd68df79ba712a4ab090904f0b50e6693b0dafc8e6343a6157e40bf18fdffd26e513cf95ee2a59824 + languageName: node + linkType: hard + +"whatwg-url@npm:^11.0.0": + version: 11.0.0 + resolution: "whatwg-url@npm:11.0.0" + dependencies: + tr46: ^3.0.0 + webidl-conversions: ^7.0.0 + checksum: ed4826aaa57e66bb3488a4b25c9cd476c46ba96052747388b5801f137dd740b73fde91ad207d96baf9f17fbcc80fc1a477ad65181b5eb5fa718d27c69501d7af + languageName: node + linkType: hard + "whatwg-url@npm:^5.0.0": version: 5.0.0 resolution: "whatwg-url@npm:5.0.0" @@ -29014,6 +30894,17 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"which@npm:^3.0.0": + version: 3.0.0 + resolution: "which@npm:3.0.0" + dependencies: + isexe: ^2.0.0 + bin: + node-which: bin/which.js + checksum: fdcf3cadab414e60b86c6836e7ac9de9273561a8926f57cbc28641b602a771527239ee4d47f2689ed255666f035ba0a0d72390986cc0c4e45344491adc7d0eeb + languageName: node + linkType: hard + "wide-align@npm:^1.1.0, wide-align@npm:^1.1.2, wide-align@npm:^1.1.5": version: 1.1.5 resolution: "wide-align@npm:1.1.5" @@ -29050,7 +30941,7 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"winston@npm:^3.2.1": +"winston@npm:^3.8.2": version: 3.8.2 resolution: "winston@npm:3.8.2" dependencies: @@ -29368,6 +31259,16 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"write-file-atomic@npm:^5.0.0": + version: 5.0.0 + resolution: "write-file-atomic@npm:5.0.0" + dependencies: + imurmurhash: ^0.1.4 + signal-exit: ^3.0.7 + checksum: 6ee16b195572386cb1c905f9d29808f77f4de2fd063d74a6f1ab6b566363832d8906a493b764ee715e57ab497271d5fc91642a913724960e8e845adf504a9837 + languageName: node + linkType: hard + "write-json-file@npm:^3.2.0": version: 3.2.0 resolution: "write-json-file@npm:3.2.0" @@ -29430,18 +31331,18 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"ws@npm:^8.2.3, ws@npm:^8.4.2": - version: 8.8.1 - resolution: "ws@npm:8.8.1" +"ws@npm:^8.11.0, ws@npm:^8.2.3, ws@npm:^8.4.2": + version: 8.13.0 + resolution: "ws@npm:8.13.0" peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 + utf-8-validate: ">=5.0.2" peerDependenciesMeta: bufferutil: optional: true utf-8-validate: optional: true - checksum: 2152cf862cae0693f3775bc688a6afb2e989d19d626d215e70f5fcd8eb55b1c3b0d3a6a4052905ec320e2d7734e20aeedbf9744496d62f15a26ad79cf4cf7dae + checksum: 53e991bbf928faf5dc6efac9b8eb9ab6497c69feeb94f963d648b7a3530a720b19ec2e0ec037344257e05a4f35bd9ad04d9de6f289615ffb133282031b18c61c languageName: node linkType: hard @@ -29466,13 +31367,20 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"xml2js@npm:~0.4.23": - version: 0.4.23 - resolution: "xml2js@npm:0.4.23" +"xml-name-validator@npm:^4.0.0": + version: 4.0.0 + resolution: "xml-name-validator@npm:4.0.0" + checksum: af100b79c29804f05fa35aa3683e29a321db9b9685d5e5febda3fa1e40f13f85abc40f45a6b2bf7bee33f68a1dc5e8eaef4cec100a304a9db565e6061d4cb5ad + languageName: node + linkType: hard + +"xml2js@npm:~0.5.0": + version: 0.5.0 + resolution: "xml2js@npm:0.5.0" dependencies: sax: ">=0.6.0" xmlbuilder: ~11.0.0 - checksum: ca0cf2dfbf6deeaae878a891c8fbc0db6fd04398087084edf143cdc83d0509ad0fe199b890f62f39c4415cf60268a27a6aed0d343f0658f8779bd7add690fa98 + checksum: 1aa71d62e5bc2d89138e3929b9ea46459157727759cbc62ef99484b778641c0cd21fb637696c052d901a22f82d092a3e740a16b4ce218e81ac59b933535124ea languageName: node linkType: hard @@ -29541,6 +31449,13 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"yaml@npm:^2.2.1": + version: 2.2.1 + resolution: "yaml@npm:2.2.1" + checksum: 84f68cbe462d5da4e7ded4a8bded949ffa912bc264472e5a684c3d45b22d8f73a3019963a32164023bdf3d83cfb6f5b58ff7b2b10ef5b717c630f40bd6369a23 + languageName: node + linkType: hard + "yargs-parser@npm:20.2.4": version: 20.2.4 resolution: "yargs-parser@npm:20.2.4" @@ -29548,14 +31463,14 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"yargs-parser@npm:20.x, yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3": +"yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3": version: 20.2.7 resolution: "yargs-parser@npm:20.2.7" checksum: ec0ea9e1b5699977380583f5ab1c0e2c6fc5f1ed374eb3053c458df00c543effba53628ad3297f3ccc769660518d5e376fd1cfb298b8e37077421aca8d75ae89 languageName: node linkType: hard -"yargs-parser@npm:^21.0.0": +"yargs-parser@npm:^21.0.0, yargs-parser@npm:^21.0.1, yargs-parser@npm:^21.1.1": version: 21.1.1 resolution: "yargs-parser@npm:21.1.1" checksum: ed2d96a616a9e3e1cc7d204c62ecc61f7aaab633dcbfab2c6df50f7f87b393993fe6640d017759fe112d0cb1e0119f2b4150a87305cc873fd90831c6a58ccf1c @@ -29577,6 +31492,21 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard +"yargs@npm:^17.3.1": + version: 17.7.1 + resolution: "yargs@npm:17.7.1" + dependencies: + cliui: ^8.0.1 + escalade: ^3.1.1 + get-caller-file: ^2.0.5 + require-directory: ^2.1.1 + string-width: ^4.2.3 + y18n: ^5.0.5 + yargs-parser: ^21.1.1 + checksum: 3d8a43c336a4942bc68080768664aca85c7bd406f018bad362fd255c41c8f4e650277f42fd65d543fce99e084124ddafee7bbfc1a5c6a8fda4cec78609dcf8d4 + languageName: node + linkType: hard + "yn@npm:3.1.1": version: 3.1.1 resolution: "yn@npm:3.1.1" @@ -29598,23 +31528,33 @@ resolve@^2.0.0-next.3: languageName: node linkType: hard -"zx@npm:~4.3.0": - version: 4.3.0 - resolution: "zx@npm:4.3.0" +"zwitch@npm:^2.0.0": + version: 2.0.4 + resolution: "zwitch@npm:2.0.4" + checksum: f22ec5fc2d5f02c423c93d35cdfa83573a3a3bd98c66b927c368ea4d0e7252a500df2a90a6b45522be536a96a73404393c958e945fdba95e6832c200791702b6 + languageName: node + linkType: hard + +"zx@npm:~7.2.1": + version: 7.2.1 + resolution: "zx@npm:7.2.1" dependencies: - "@types/fs-extra": ^9.0.12 + "@types/fs-extra": ^11.0.1 "@types/minimist": ^1.2.2 - "@types/node": ^16.6 - "@types/node-fetch": ^2.5.12 - chalk: ^4.1.2 - fs-extra: ^10.0.0 - globby: ^12.0.1 - minimist: ^1.2.6 - node-fetch: ^2.6.7 + "@types/node": ^18.14.2 + "@types/ps-tree": ^1.1.2 + "@types/which": ^2.0.2 + chalk: ^5.2.0 + fs-extra: ^11.1.0 + globby: ^13.1.3 + minimist: ^1.2.8 + node-fetch: 3.2.10 ps-tree: ^1.2.0 - which: ^2.0.2 + webpod: ^0 + which: ^3.0.0 + yaml: ^2.2.1 bin: - zx: zx.mjs - checksum: 5989695664721e165109d3b7a7e2379b97ca12a284d7df52eb0394164893bafdf512d66b3668792ce9f0aed20fb88602b603db5f91458f5bf68d35f3d9c5751c + zx: build/cli.js + checksum: fbd9d2534ff87594d6d35632b14c2585ce67b347cab7beb9f898d64255675aa2597bbce8d4f4762f4933d1e399bb5cd7a5e5835131afdb7850e177588ec2ba2f languageName: node linkType: hard From 0c70a1def7da671b1326969536b06351f90692a6 Mon Sep 17 00:00:00 2001 From: Hugo Costa Date: Thu, 13 Apr 2023 09:33:06 -0300 Subject: [PATCH 005/103] fix(fuselage): word break in rcx-message-body (#1028) --- packages/fuselage/src/components/Message/Messages.styles.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fuselage/src/components/Message/Messages.styles.scss b/packages/fuselage/src/components/Message/Messages.styles.scss index 5061fcb4bc..db3e488015 100644 --- a/packages/fuselage/src/components/Message/Messages.styles.scss +++ b/packages/fuselage/src/components/Message/Messages.styles.scss @@ -185,7 +185,7 @@ $message-background-color-highlight: functions.theme( transition: opacity 0.3s linear; - word-break: break-all; + word-break: break-word; opacity: 1; From e83ac0805150a4bea46ab47074ad9b19e4722030 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlia=20Jaeger=20Foresti?= <60678893+juliajforesti@users.noreply.github.com> Date: Thu, 13 Apr 2023 17:18:59 -0300 Subject: [PATCH 006/103] chore(fuselage): change admin-sidebar color (#1024) --- .../components/Sidebar/Sidebar.styles.scss | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/packages/fuselage/src/components/Sidebar/Sidebar.styles.scss b/packages/fuselage/src/components/Sidebar/Sidebar.styles.scss index 7eec865a05..2370e91a02 100644 --- a/packages/fuselage/src/components/Sidebar/Sidebar.styles.scss +++ b/packages/fuselage/src/components/Sidebar/Sidebar.styles.scss @@ -23,14 +23,9 @@ $sidebar-color-font-default: theme( colors.font(default) ); -$sidebar-color-font-primary: theme( - 'sidebar-color-font-primary', - colors.font(annotation) -); - -$sidebar-color-font-secondary: theme( - 'sidebar-color-font-secondary', - colors.font(secondary-info) +$sidebar-color-font-title: theme( + 'sidebar-color-font-title', + colors.font(titles-labels) ); $sidebar-color-stroke-default: theme( @@ -163,7 +158,7 @@ $sidebar-banner-color-danger: theme( } .rcx-sidebar { - color: $sidebar-color-font-secondary; + color: $sidebar-color-font-default; background: $sidebar-color-surface-default; &--divider { @@ -204,7 +199,7 @@ $sidebar-banner-color-danger: theme( &__title { @include typography.use-font-scale(p2m); - color: $sidebar-color-font-default; + color: $sidebar-color-font-title; } } @@ -215,7 +210,7 @@ $sidebar-banner-color-danger: theme( padding-block: lengths.padding(4); padding-inline: lengths.padding(16); - color: $sidebar-color-font-secondary; + color: $sidebar-color-font-default; &__wrapper { @extend %sidebar-base; @@ -351,7 +346,7 @@ $sidebar-banner-color-danger: theme( @include typography.use-font-scale(c2); @include typography.use-with-truncated-text(); - color: $sidebar-color-font-secondary; + color: $sidebar-color-font-default; } &-section { From cde9a421316de2b4a32671ff5fa3915cd5e69ef0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlia=20Jaeger=20Foresti?= <60678893+juliajforesti@users.noreply.github.com> Date: Mon, 17 Apr 2023 19:23:53 -0300 Subject: [PATCH 007/103] fix(fuselage): button min-width (#1029) Co-authored-by: Douglas Fabris --- packages/fuselage/src/components/Button/Button.styles.scss | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/fuselage/src/components/Button/Button.styles.scss b/packages/fuselage/src/components/Button/Button.styles.scss index 59e3f9c40f..a90ec7c2f0 100644 --- a/packages/fuselage/src/components/Button/Button.styles.scss +++ b/packages/fuselage/src/components/Button/Button.styles.scss @@ -5,6 +5,7 @@ .rcx-button { @mixin with-rectangular-size($height, $padding-x, $line-height) { + min-width: calc(#{$height} * 2); padding: calc((#{$height} - #{$line-height}) / 2 - 2px) calc(#{$padding-x} - 2px); padding-block: calc((#{$height} - #{$line-height}) / 2 - 2px); @@ -13,6 +14,7 @@ @mixin with-squared-size($size) { width: $size; + min-width: $size; height: $size; padding: 0; From 5b17daceeb5d13d154e5eb1e8328539b47c7f147 Mon Sep 17 00:00:00 2001 From: Tasso Evangelista Date: Tue, 18 Apr 2023 11:19:30 -0300 Subject: [PATCH 008/103] fix(fuselage-hooks): `usePosition` internals (#1027) Co-authored-by: Douglas Fabris --- packages/fuselage-hooks/package.json | 5 +- packages/fuselage-hooks/rollup.config.js | 4 +- .../fuselage-hooks/src/usePosition.spec.ts | 270 -------------- packages/fuselage-hooks/src/usePosition.ts | 334 ----------------- .../src/usePosition/Placement.ts | 4 + .../src/usePosition/PlacementVariant.ts | 1 + .../src/usePosition/Position.ts | 1 + .../src/usePosition/getPositionStyle.ts | 0 .../usePosition/getTargetBoundaries.spec.ts | 44 +++ .../src/usePosition/getTargetBoundaries.ts | 23 ++ .../src/usePosition/getVariantBoundaries.ts | 25 ++ .../src/usePosition/index.spec.ts | 335 ++++++++++++++++++ .../fuselage-hooks/src/usePosition/index.ts | 246 +++++++++++++ .../useBoundingClientRectChanges.ts | 55 +++ packages/fuselage-hooks/tsconfig.build.json | 4 + packages/fuselage-hooks/tsconfig.json | 7 +- .../src/components/Dropdown/Dropdown.tsx | 4 +- .../components/Dropdown/DropdownDesktop.tsx | 3 +- .../fuselage/src/components/Menu/Menu.tsx | 4 +- .../src/components/Position/Position.tsx | 4 +- yarn.lock | 57 +++ 21 files changed, 813 insertions(+), 617 deletions(-) delete mode 100644 packages/fuselage-hooks/src/usePosition.spec.ts delete mode 100644 packages/fuselage-hooks/src/usePosition.ts create mode 100644 packages/fuselage-hooks/src/usePosition/Placement.ts create mode 100644 packages/fuselage-hooks/src/usePosition/PlacementVariant.ts create mode 100644 packages/fuselage-hooks/src/usePosition/Position.ts create mode 100644 packages/fuselage-hooks/src/usePosition/getPositionStyle.ts create mode 100644 packages/fuselage-hooks/src/usePosition/getTargetBoundaries.spec.ts create mode 100644 packages/fuselage-hooks/src/usePosition/getTargetBoundaries.ts create mode 100644 packages/fuselage-hooks/src/usePosition/getVariantBoundaries.ts create mode 100644 packages/fuselage-hooks/src/usePosition/index.spec.ts create mode 100644 packages/fuselage-hooks/src/usePosition/index.ts create mode 100644 packages/fuselage-hooks/src/usePosition/useBoundingClientRectChanges.ts create mode 100644 packages/fuselage-hooks/tsconfig.build.json diff --git a/packages/fuselage-hooks/package.json b/packages/fuselage-hooks/package.json index 4566af639f..e1e1bcd3d7 100644 --- a/packages/fuselage-hooks/package.json +++ b/packages/fuselage-hooks/package.json @@ -34,7 +34,9 @@ "access": "public" }, "scripts": { - "build": "rollup -c", + "build": "run-s .:build:clean .:build:rollup", + ".:build:clean": "rimraf dist", + ".:build:rollup": "rollup -c", "lint": "lint", "lint-and-fix": "lint-and-fix", "lint-staged": "lint-staged", @@ -64,6 +66,7 @@ "npm-run-all": "^4.1.5", "prettier": "~2.8.7", "react": "^17.0.2", + "rimraf": "~5.0.0", "rollup": "~2.67.3", "rollup-plugin-terser": "~7.0.2", "testing-utils": "workspace:~", diff --git a/packages/fuselage-hooks/rollup.config.js b/packages/fuselage-hooks/rollup.config.js index 06c9d65b93..5be78c35b3 100644 --- a/packages/fuselage-hooks/rollup.config.js +++ b/packages/fuselage-hooks/rollup.config.js @@ -47,6 +47,8 @@ export default { json(), nodeResolve(), commonjs(), - typescript(), + typescript({ + tsconfig: 'tsconfig.build.json', + }), ], }; diff --git a/packages/fuselage-hooks/src/usePosition.spec.ts b/packages/fuselage-hooks/src/usePosition.spec.ts deleted file mode 100644 index 6898a81bac..0000000000 --- a/packages/fuselage-hooks/src/usePosition.spec.ts +++ /dev/null @@ -1,270 +0,0 @@ -import { withResizeObserverMock } from 'testing-utils/mocks/withResizeObserverMock'; - -import { - getPositionStyle, - getTargetBoundaries, - getVariantBoundaries, -} from './usePosition'; -// TODO: add tests targeting the hook itself - -withResizeObserverMock(); - -const container = { - bottom: 1000, - height: 1000, - left: 0, - right: 1024, - top: 0, - width: 1024, - x: 0, - y: 0, -} as DOMRect; - -const referenceBox = { - bottom: 300, - height: 100, - left: 0, - right: 100, - top: 200, - width: 100, - x: 0, - y: 200, -} as DOMRect; - -const target = { - bottom: 50, - height: 50, - left: 0, - right: 50, - top: 0, - width: 50, - x: 0, - y: 0, -} as DOMRect; - -describe('usePosition hook', () => { - describe('getTargetBoundaries', () => { - it('...', () => { - const targetBoundaries = getTargetBoundaries({ referenceBox, target }); - expect(targetBoundaries.t).toEqual(150); - expect(targetBoundaries.b).toEqual(300); - expect(targetBoundaries.r).toEqual(100); - expect(targetBoundaries.l).toEqual(-50); - }); - }); - describe('getPositionStyle function', () => { - it('returns a style for placement bottom-start', () => { - const targetBoundaries = getTargetBoundaries({ referenceBox, target }); - const variantStore = getVariantBoundaries({ referenceBox, target }); - const result = getPositionStyle({ - placement: 'bottom-start', - container, - targetBoundaries, - variantStore, - target, - }); - expect(result.style.left).toEqual('0px'); - expect(result.style.top).toEqual('300px'); - }); - it('returns a style for placement bottom-start if the element height does not fit', () => { - const targetBoundaries = getTargetBoundaries({ referenceBox, target }); - const variantStore = getVariantBoundaries({ referenceBox, target }); - const result = getPositionStyle({ - placement: 'bottom-start', - container: { - ...container, - bottom: 300, - height: 300, - }, - targetBoundaries, - variantStore, - target, - }); - expect(result.style.left).toEqual('0px'); - expect(result.style.top).toEqual('150px'); - }); - - it('returns a style for placement bottom-middle', () => { - const targetBoundaries = getTargetBoundaries({ referenceBox, target }); - - const variantStore = getVariantBoundaries({ referenceBox, target }); - - const result = getPositionStyle({ - placement: 'bottom-middle', - container, - targetBoundaries, - variantStore, - target, - }); - - expect(result.style.left).toEqual('25px'); - expect(result.style.top).toEqual('300px'); - }); - it('returns a style for placement bottom-middle if the element height does not fit', () => { - const targetBoundaries = getTargetBoundaries({ referenceBox, target }); - const variantStore = getVariantBoundaries({ referenceBox, target }); - const result = getPositionStyle({ - placement: 'bottom-middle', - container: { - ...container, - bottom: 300, - height: 300, - }, - targetBoundaries, - variantStore, - target, - }); - expect(result.style.left).toEqual('25px'); - expect(result.style.top).toEqual('150px'); - }); - - it('returns a style for placement bottom-end', () => { - const targetBoundaries = getTargetBoundaries({ referenceBox, target }); - - const variantStore = getVariantBoundaries({ referenceBox, target }); - - const result = getPositionStyle({ - placement: 'bottom-end', - container, - targetBoundaries, - variantStore, - target, - }); - - expect(result.style.left).toEqual('50px'); - expect(result.style.top).toEqual('300px'); - }); - it('returns a style for placement bottom-end if the element height does not fit', () => { - const targetBoundaries = getTargetBoundaries({ referenceBox, target }); - const variantStore = getVariantBoundaries({ referenceBox, target }); - const result = getPositionStyle({ - placement: 'bottom-end', - container: { - ...container, - bottom: 300, - height: 300, - }, - targetBoundaries, - variantStore, - target, - }); - expect(result.style.left).toEqual('50px'); - expect(result.style.top).toEqual('150px'); - }); - - it('returns a style for placement top-start', () => { - const targetBoundaries = getTargetBoundaries({ referenceBox, target }); - const variantStore = getVariantBoundaries({ referenceBox, target }); - const result = getPositionStyle({ - placement: 'top-start', - container, - targetBoundaries, - variantStore, - target, - }); - expect(result.style.left).toEqual('0px'); - expect(result.style.top).toEqual('150px'); - }); - it('returns a style for placement top-start if the element height does not fit', () => { - const box = { ...referenceBox, top: 10, y: 10, bottom: 110 }; - const targetBoundaries = getTargetBoundaries({ - referenceBox: box, - target, - }); - const variantStore = getVariantBoundaries({ referenceBox: box, target }); - const result = getPositionStyle({ - placement: 'top-start', - container, - targetBoundaries, - variantStore, - target, - }); - expect(result.style.left).toEqual('0px'); - expect(result.style.top).toEqual('110px'); - }); - it('returns a style for placement top-middle', () => { - const targetBoundaries = getTargetBoundaries({ referenceBox, target }); - - const variantStore = getVariantBoundaries({ referenceBox, target }); - - const result = getPositionStyle({ - placement: 'top-middle', - container, - targetBoundaries, - variantStore, - target, - }); - - expect(result.style.left).toEqual('25px'); - expect(result.style.top).toEqual('150px'); - }); - it('returns a style for placement top-middle if the element height does not fit', () => { - const box = { ...referenceBox, top: 10, y: 10, bottom: 110 }; - const targetBoundaries = getTargetBoundaries({ - referenceBox: box, - target, - }); - const variantStore = getVariantBoundaries({ referenceBox: box, target }); - const result = getPositionStyle({ - placement: 'top-middle', - container, - targetBoundaries, - variantStore, - target, - }); - expect(result.style.left).toEqual('25px'); - expect(result.style.top).toEqual('110px'); - }); - it('returns a style for placement top-end', () => { - const targetBoundaries = getTargetBoundaries({ referenceBox, target }); - - const variantStore = getVariantBoundaries({ referenceBox, target }); - - const result = getPositionStyle({ - placement: 'top-end', - container, - targetBoundaries, - variantStore, - target, - }); - - expect(result.style.left).toEqual('50px'); - expect(result.style.top).toEqual('150px'); - }); - it('returns a style for placement top-end if the element height does not fit', () => { - const box = { ...referenceBox, top: 10, y: 10, bottom: 110 }; - const targetBoundaries = getTargetBoundaries({ - referenceBox: box, - target, - }); - const variantStore = getVariantBoundaries({ referenceBox: box, target }); - const result = getPositionStyle({ - placement: 'top-end', - container, - targetBoundaries, - variantStore, - target, - }); - expect(result.style.left).toEqual('50px'); - expect(result.style.top).toEqual('110px'); - }); - it('returns a style for placement bottom-end if the element height does not fit container height', () => { - const targetBoundaries = getTargetBoundaries({ referenceBox, target }); - const variantStore = getVariantBoundaries({ referenceBox, target }); - const result = getPositionStyle({ - placement: 'bottom-end', - container: { - ...container, - bottom: 50, - height: 50, - }, - targetBoundaries, - variantStore, - target, - }); - expect(result.style.overflowY).toEqual('auto'); - expect(result.style.left).toEqual('50px'); - expect(result.style.top).toEqual('300px'); - }); - }); -}); diff --git a/packages/fuselage-hooks/src/usePosition.ts b/packages/fuselage-hooks/src/usePosition.ts deleted file mode 100644 index 226b066227..0000000000 --- a/packages/fuselage-hooks/src/usePosition.ts +++ /dev/null @@ -1,334 +0,0 @@ -import type { AllHTMLAttributes, RefObject } from 'react'; -import { useState, useEffect, useRef } from 'react'; - -import { useDebouncedCallback } from './useDebouncedCallback'; -import { useMutableCallback } from './useMutableCallback'; - -export type Positions = 'top' | 'left' | 'bottom' | 'right'; - -export type Placements = - | 'top-start' - | 'top-middle' - | 'top-end' - | 'bottom-start' - | 'bottom-middle' - | 'bottom-end' - | 'left-start' - | 'left-middle' - | 'left-end' - | 'right-start' - | 'right-middle' - | 'right-end' - | Positions; - -export type PositionOptions = { - margin?: number; - container?: Element; - placement?: Placements; - watch?: boolean; -}; - -export type PositionFlipOrder = { - top: string; - right: string; - bottom: string; - left: string; -}; - -type Boundaries = { - t: number; - b: number; - r: number; - l: number; -}; - -type VariantBoundaries = { - vm: number; - vs: number; - ve: number; - hs: number; - he: number; - hm: number; -}; - -type PositionResult = { - style: AllHTMLAttributes['style']; - placement?: Placements; -}; - -enum PlacementMap { - t = 'top', - b = 'bottom', - l = 'left', - r = 'right', - s = 'start', - e = 'end', - m = 'middle', -} - -const fallbackOrderVariant = { - start: 'sem', - middle: 'mse', - end: 'esm', -}; - -const fallbackOrder = { - top: 'tbrl', - bottom: 'btrl', - right: 'rltb', - left: 'lrbt', -} as const; - -const emptyStyle: PositionResult = { - style: { - position: 'fixed', - visibility: 'hidden', - }, -}; - -const getParents = function (element: Element): Array { - // Set up a parent array - const parents = []; - for (let el = element.parentNode; el && el !== document; el = el.parentNode) { - parents.push(el); - } - return parents.filter((element) => element.nodeType !== Node.TEXT_NODE); -}; - -function getScrollParents(element: Element): Array { - const parents = getParents(element); - - return parents; -} - -const useBoundingClientRect = ( - element: RefObject, - watch = false, - callback: () => void -): void => - useEffect(() => { - if (!element.current) { - return; - } - - callback(); - - if (!watch) { - return; - } - - const parents = getScrollParents(element.current); - const passive = { passive: true }; - - const observer = new ResizeObserver(() => { - if (!element.current) { - return; - } - callback(); - }); - observer.observe(element.current); - window.addEventListener('resize', callback); - parents.forEach((el) => el.addEventListener('scroll', callback, passive)); - - return () => { - observer.disconnect(); - window.removeEventListener('resize', callback); - parents.forEach((el) => el.removeEventListener('scroll', callback)); - }; - }, [watch, callback, element]); - -export const getPositionStyle = ({ - placement = 'bottom-start', - container, - targetBoundaries, - variantStore, - target, - margin = 0, -}: { - placement: Placements; - target: DOMRect; - container: DOMRect; - targetBoundaries: Boundaries; - variantStore?: VariantBoundaries; - margin?: number; -}): PositionResult => { - if (!targetBoundaries) { - return emptyStyle; - } - - const { top, left, bottom, right } = container; - - const [placementKey, variantKey = 'middle'] = placement.split('-'); - - const placementAttempts = fallbackOrder[placementKey]; - const variantsAttempts = fallbackOrderVariant[variantKey]; - - for (const placementAttempt of placementAttempts) { - const directionVertical = ['t', 'b'].includes(placementAttempt); - - const [positionKey, variantKey] = directionVertical - ? ['top', 'left'] - : ['left', 'top']; - - const point = targetBoundaries[placementAttempt]; - - const [positionBox, variantBox] = directionVertical - ? [target.height, target.width] - : [target.width, target.height]; - const [positionMaximum, variantMaximum] = directionVertical - ? [bottom, right] - : [right, bottom]; - const [positionMinimum, variantMinimum] = directionVertical - ? [top, left] - : [left, top]; - - // if the point extrapolate the container boundaries - if (point < positionMinimum || point + positionBox > positionMaximum) { - continue; - } - - for (const v of variantsAttempts) { - // The position-value, the related size value of the popper and the limit - const variantPoint = variantStore[`${directionVertical ? 'v' : 'h'}${v}`]; - - if ( - variantPoint < variantMinimum || - variantPoint + variantBox > variantMaximum - ) { - continue; - } - return { - style: { - [positionKey]: `${point}px`, - [variantKey]: `${variantPoint}px`, - position: 'fixed', - zIndex: '9999', - opacity: 1, - }, - placement: `${PlacementMap[placementAttempt]}-${PlacementMap[v]}`, - } as unknown as PositionResult; - } - } - - const placementAttempt = placementAttempts[0]; - - const directionVertical = ['t', 'b'].includes(placementAttempt); - - const point = targetBoundaries[placementAttempt]; - const variantPoint = - variantStore[`${directionVertical ? 'v' : 'h'}${variantsAttempts[0]}`]; - - return { - style: { - top: `${point}px`, - left: `${variantPoint}px`, - position: 'fixed', - ...(bottom < target.height + point && { - bottom: `${margin}px`, - overflowY: 'auto', - }), - ...({ zIndex: '9999' } as any), - }, - placement: `${PlacementMap[placementAttempt]}-${ - PlacementMap[variantsAttempts[0]] - }`, - } as PositionResult; -}; - -export const getTargetBoundaries = ({ - referenceBox, - target, - margin = 0, -}: { - referenceBox?: DOMRect; - target?: DOMRect; - margin?: number; -}): Boundaries | null => - referenceBox && - target && { - t: referenceBox.top - target.height - margin, - b: referenceBox.bottom + margin, - r: referenceBox.right + margin, - l: referenceBox.left - target.width - margin, - }; - -export const getVariantBoundaries = ({ - referenceBox, - target, -}: { - referenceBox?: DOMRect; - target?: DOMRect; -}): VariantBoundaries | null => - referenceBox && - target && { - vm: -target.width / 2 + (referenceBox.left + referenceBox.width / 2), - vs: referenceBox.left, - ve: referenceBox.left + referenceBox.width - target.width, - hs: referenceBox.bottom - referenceBox.height, - he: referenceBox.bottom - target.height, - hm: referenceBox.bottom - referenceBox.height / 2 - target.height / 2, - }; - -/** - * Hook to deal and position an element using an anchor - * @param reference - the anchor - * @param targetEl - the element to be positioned - * @param options - options to position - * @returns The style containing top and left position - * @public - */ - -export const usePosition = ( - reference: RefObject, - target: RefObject, - options: PositionOptions -): PositionResult => { - const { - margin = 8, - placement = 'bottom-start', - container: containerElement = document.body, - watch = true, - } = options; - const container = useRef(containerElement); - - const [style, setStyle] = useState(emptyStyle); - - const callback = useDebouncedCallback( - useMutableCallback(() => { - const clone = target.current.cloneNode(true) as HTMLElement; - - clone.style.bottom = ''; - clone.id = 'clone'; - target.current.parentElement.appendChild(clone); - const boundaries = clone.getBoundingClientRect(); - target.current.parentElement.removeChild(clone); - - const targetBoundaries = getTargetBoundaries({ - referenceBox: reference.current.getBoundingClientRect(), - target: boundaries, - margin, - }); - const variantStore = getVariantBoundaries({ - referenceBox: reference.current.getBoundingClientRect(), - target: boundaries, - }); - - setStyle( - getPositionStyle({ - placement, - container: container.current.getBoundingClientRect(), - targetBoundaries, - variantStore, - target: boundaries, - margin, - }) - ); - }), - 10 - ); - - useBoundingClientRect(target, watch, callback); - useBoundingClientRect(reference, watch, callback); - useBoundingClientRect(container, watch, callback); - return style; -}; diff --git a/packages/fuselage-hooks/src/usePosition/Placement.ts b/packages/fuselage-hooks/src/usePosition/Placement.ts new file mode 100644 index 0000000000..0fffbd519c --- /dev/null +++ b/packages/fuselage-hooks/src/usePosition/Placement.ts @@ -0,0 +1,4 @@ +import type { PlacementVariant } from './PlacementVariant'; +import type { Position } from './Position'; + +export type Placement = `${Position}-${PlacementVariant}` | Position; diff --git a/packages/fuselage-hooks/src/usePosition/PlacementVariant.ts b/packages/fuselage-hooks/src/usePosition/PlacementVariant.ts new file mode 100644 index 0000000000..1d6a29e800 --- /dev/null +++ b/packages/fuselage-hooks/src/usePosition/PlacementVariant.ts @@ -0,0 +1 @@ +export type PlacementVariant = 'start' | 'middle' | 'end'; diff --git a/packages/fuselage-hooks/src/usePosition/Position.ts b/packages/fuselage-hooks/src/usePosition/Position.ts new file mode 100644 index 0000000000..9d240ee20e --- /dev/null +++ b/packages/fuselage-hooks/src/usePosition/Position.ts @@ -0,0 +1 @@ +export type Position = 'top' | 'left' | 'bottom' | 'right'; diff --git a/packages/fuselage-hooks/src/usePosition/getPositionStyle.ts b/packages/fuselage-hooks/src/usePosition/getPositionStyle.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/fuselage-hooks/src/usePosition/getTargetBoundaries.spec.ts b/packages/fuselage-hooks/src/usePosition/getTargetBoundaries.spec.ts new file mode 100644 index 0000000000..81bbb5fc49 --- /dev/null +++ b/packages/fuselage-hooks/src/usePosition/getTargetBoundaries.spec.ts @@ -0,0 +1,44 @@ +import { withResizeObserverMock } from 'testing-utils/mocks/withResizeObserverMock'; + +import { getTargetBoundaries } from './getTargetBoundaries'; + +withResizeObserverMock(); + +const anchorRect: DOMRect = { + bottom: 300, + height: 100, + left: 0, + right: 100, + top: 200, + width: 100, + x: 0, + y: 200, + toJSON() { + return this; + }, +}; + +const targetRect: DOMRect = { + bottom: 50, + height: 50, + left: 0, + right: 50, + top: 0, + width: 50, + x: 0, + y: 0, + toJSON() { + return this; + }, +}; + +it('should work', () => { + const targetBoundaries = getTargetBoundaries({ + anchorRect, + targetRect, + }); + expect(targetBoundaries.t).toEqual(150); + expect(targetBoundaries.b).toEqual(300); + expect(targetBoundaries.r).toEqual(100); + expect(targetBoundaries.l).toEqual(-50); +}); diff --git a/packages/fuselage-hooks/src/usePosition/getTargetBoundaries.ts b/packages/fuselage-hooks/src/usePosition/getTargetBoundaries.ts new file mode 100644 index 0000000000..8f5ebc0d2d --- /dev/null +++ b/packages/fuselage-hooks/src/usePosition/getTargetBoundaries.ts @@ -0,0 +1,23 @@ +export type TargetBoundaries = { + t: number; + b: number; + r: number; + l: number; +}; + +export function getTargetBoundaries({ + anchorRect, + targetRect, + margin = 0, +}: { + anchorRect: DOMRect; + targetRect: DOMRect; + margin?: number; +}): TargetBoundaries { + return { + t: anchorRect.top - targetRect.height - margin, + b: anchorRect.bottom + margin, + r: anchorRect.right + margin, + l: anchorRect.left - targetRect.width - margin, + }; +} diff --git a/packages/fuselage-hooks/src/usePosition/getVariantBoundaries.ts b/packages/fuselage-hooks/src/usePosition/getVariantBoundaries.ts new file mode 100644 index 0000000000..df3809081f --- /dev/null +++ b/packages/fuselage-hooks/src/usePosition/getVariantBoundaries.ts @@ -0,0 +1,25 @@ +export type VariantBoundaries = { + vm: number; + vs: number; + ve: number; + hs: number; + he: number; + hm: number; +}; + +export function getVariantBoundaries({ + anchorRect, + targetRect, +}: { + anchorRect: DOMRect; + targetRect: DOMRect; +}): VariantBoundaries { + return { + vm: -targetRect.width / 2 + (anchorRect.left + anchorRect.width / 2), + vs: anchorRect.left, + ve: anchorRect.left + anchorRect.width - targetRect.width, + hs: anchorRect.bottom - anchorRect.height, + he: anchorRect.bottom - targetRect.height, + hm: anchorRect.bottom - anchorRect.height / 2 - targetRect.height / 2, + }; +} diff --git a/packages/fuselage-hooks/src/usePosition/index.spec.ts b/packages/fuselage-hooks/src/usePosition/index.spec.ts new file mode 100644 index 0000000000..24e0dfd5f9 --- /dev/null +++ b/packages/fuselage-hooks/src/usePosition/index.spec.ts @@ -0,0 +1,335 @@ +import { withResizeObserverMock } from 'testing-utils/mocks/withResizeObserverMock'; + +import { getPositionStyle } from '.'; +import { getTargetBoundaries } from './getTargetBoundaries'; +import { getVariantBoundaries } from './getVariantBoundaries'; +// TODO: add tests targeting the hook itself + +withResizeObserverMock(); + +const container = { + bottom: 1000, + height: 1000, + left: 0, + right: 1024, + top: 0, + width: 1024, + x: 0, + y: 0, +} as DOMRect; + +const referenceBox = { + bottom: 300, + height: 100, + left: 0, + right: 100, + top: 200, + width: 100, + x: 0, + y: 200, +} as DOMRect; + +const target = { + bottom: 50, + height: 50, + left: 0, + right: 50, + top: 0, + width: 50, + x: 0, + y: 0, +} as DOMRect; + +describe('getPositionStyle function', () => { + it('returns a style for placement bottom-start', () => { + const targetBoundaries = getTargetBoundaries({ + anchorRect: referenceBox, + targetRect: target, + }); + const variantStore = getVariantBoundaries({ + anchorRect: referenceBox, + targetRect: target, + }); + const result = getPositionStyle({ + placement: 'bottom-start', + containerRect: container, + targetBoundaries, + variantBoundaries: variantStore, + targetRect: target, + }); + expect(result.style.left).toEqual('0px'); + expect(result.style.top).toEqual('300px'); + }); + + it('returns a style for placement bottom-start if the element height does not fit', () => { + const targetBoundaries = getTargetBoundaries({ + anchorRect: referenceBox, + targetRect: target, + }); + const variantStore = getVariantBoundaries({ + anchorRect: referenceBox, + targetRect: target, + }); + const result = getPositionStyle({ + placement: 'bottom-start', + containerRect: { + ...container, + bottom: 300, + height: 300, + }, + targetBoundaries, + variantBoundaries: variantStore, + targetRect: target, + }); + expect(result.style.left).toEqual('0px'); + expect(result.style.top).toEqual('150px'); + }); + + it('returns a style for placement bottom-middle', () => { + const targetBoundaries = getTargetBoundaries({ + anchorRect: referenceBox, + targetRect: target, + }); + + const variantStore = getVariantBoundaries({ + anchorRect: referenceBox, + targetRect: target, + }); + + const result = getPositionStyle({ + placement: 'bottom-middle', + containerRect: container, + targetBoundaries, + variantBoundaries: variantStore, + targetRect: target, + }); + + expect(result.style.left).toEqual('25px'); + expect(result.style.top).toEqual('300px'); + }); + + it('returns a style for placement bottom-middle if the element height does not fit', () => { + const targetBoundaries = getTargetBoundaries({ + anchorRect: referenceBox, + targetRect: target, + }); + const variantStore = getVariantBoundaries({ + anchorRect: referenceBox, + targetRect: target, + }); + const result = getPositionStyle({ + placement: 'bottom-middle', + containerRect: { + ...container, + bottom: 300, + height: 300, + }, + targetBoundaries, + variantBoundaries: variantStore, + targetRect: target, + }); + expect(result.style.left).toEqual('25px'); + expect(result.style.top).toEqual('150px'); + }); + + it('returns a style for placement bottom-end', () => { + const targetBoundaries = getTargetBoundaries({ + anchorRect: referenceBox, + targetRect: target, + }); + + const variantStore = getVariantBoundaries({ + anchorRect: referenceBox, + targetRect: target, + }); + + const result = getPositionStyle({ + placement: 'bottom-end', + containerRect: container, + targetBoundaries, + variantBoundaries: variantStore, + targetRect: target, + }); + + expect(result.style.left).toEqual('50px'); + expect(result.style.top).toEqual('300px'); + }); + + it('returns a style for placement bottom-end if the element height does not fit', () => { + const targetBoundaries = getTargetBoundaries({ + anchorRect: referenceBox, + targetRect: target, + }); + const variantStore = getVariantBoundaries({ + anchorRect: referenceBox, + targetRect: target, + }); + const result = getPositionStyle({ + placement: 'bottom-end', + containerRect: { + ...container, + bottom: 300, + height: 300, + }, + targetBoundaries, + variantBoundaries: variantStore, + targetRect: target, + }); + expect(result.style.left).toEqual('50px'); + expect(result.style.top).toEqual('150px'); + }); + + it('returns a style for placement top-start', () => { + const targetBoundaries = getTargetBoundaries({ + anchorRect: referenceBox, + targetRect: target, + }); + const variantStore = getVariantBoundaries({ + anchorRect: referenceBox, + targetRect: target, + }); + const result = getPositionStyle({ + placement: 'top-start', + containerRect: container, + targetBoundaries, + variantBoundaries: variantStore, + targetRect: target, + }); + expect(result.style.left).toEqual('0px'); + expect(result.style.top).toEqual('150px'); + }); + + it('returns a style for placement top-start if the element height does not fit', () => { + const box = { ...referenceBox, top: 10, y: 10, bottom: 110 }; + const targetBoundaries = getTargetBoundaries({ + anchorRect: box, + targetRect: target, + }); + const variantStore = getVariantBoundaries({ + anchorRect: box, + targetRect: target, + }); + const result = getPositionStyle({ + placement: 'top-start', + containerRect: container, + targetBoundaries, + variantBoundaries: variantStore, + targetRect: target, + }); + expect(result.style.left).toEqual('0px'); + expect(result.style.top).toEqual('110px'); + }); + + it('returns a style for placement top-middle', () => { + const targetBoundaries = getTargetBoundaries({ + anchorRect: referenceBox, + targetRect: target, + }); + + const variantStore = getVariantBoundaries({ + anchorRect: referenceBox, + targetRect: target, + }); + + const result = getPositionStyle({ + placement: 'top-middle', + containerRect: container, + targetBoundaries, + variantBoundaries: variantStore, + targetRect: target, + }); + + expect(result.style.left).toEqual('25px'); + expect(result.style.top).toEqual('150px'); + }); + + it('returns a style for placement top-middle if the element height does not fit', () => { + const box = { ...referenceBox, top: 10, y: 10, bottom: 110 }; + const targetBoundaries = getTargetBoundaries({ + anchorRect: box, + targetRect: target, + }); + const variantStore = getVariantBoundaries({ + anchorRect: box, + targetRect: target, + }); + const result = getPositionStyle({ + placement: 'top-middle', + containerRect: container, + targetBoundaries, + variantBoundaries: variantStore, + targetRect: target, + }); + expect(result.style.left).toEqual('25px'); + expect(result.style.top).toEqual('110px'); + }); + + it('returns a style for placement top-end', () => { + const targetBoundaries = getTargetBoundaries({ + anchorRect: referenceBox, + targetRect: target, + }); + + const variantStore = getVariantBoundaries({ + anchorRect: referenceBox, + targetRect: target, + }); + + const result = getPositionStyle({ + placement: 'top-end', + containerRect: container, + targetBoundaries, + variantBoundaries: variantStore, + targetRect: target, + }); + + expect(result.style.left).toEqual('50px'); + expect(result.style.top).toEqual('150px'); + }); + + it('returns a style for placement top-end if the element height does not fit', () => { + const box = { ...referenceBox, top: 10, y: 10, bottom: 110 }; + const targetBoundaries = getTargetBoundaries({ + anchorRect: box, + targetRect: target, + }); + const variantStore = getVariantBoundaries({ + anchorRect: box, + targetRect: target, + }); + const result = getPositionStyle({ + placement: 'top-end', + containerRect: container, + targetBoundaries, + variantBoundaries: variantStore, + targetRect: target, + }); + expect(result.style.left).toEqual('50px'); + expect(result.style.top).toEqual('110px'); + }); + + it('returns a style for placement bottom-end if the element height does not fit container height', () => { + const targetBoundaries = getTargetBoundaries({ + anchorRect: referenceBox, + targetRect: target, + }); + const variantStore = getVariantBoundaries({ + anchorRect: referenceBox, + targetRect: target, + }); + const result = getPositionStyle({ + placement: 'bottom-end', + containerRect: { + ...container, + bottom: 50, + height: 50, + }, + targetBoundaries, + variantBoundaries: variantStore, + targetRect: target, + }); + expect(result.style.overflowY).toEqual('auto'); + expect(result.style.left).toEqual('50px'); + expect(result.style.top).toEqual('300px'); + }); +}); diff --git a/packages/fuselage-hooks/src/usePosition/index.ts b/packages/fuselage-hooks/src/usePosition/index.ts new file mode 100644 index 0000000000..4ee969f389 --- /dev/null +++ b/packages/fuselage-hooks/src/usePosition/index.ts @@ -0,0 +1,246 @@ +import { useState } from 'react'; +import type { RefObject, CSSProperties } from 'react'; + +import { useDebouncedCallback } from '../useDebouncedCallback'; +import { useMutableCallback } from '../useMutableCallback'; +import { useSafely } from '../useSafely'; +import type { Placement } from './Placement'; +import type { PlacementVariant } from './PlacementVariant'; +import type { Position } from './Position'; +import type { TargetBoundaries } from './getTargetBoundaries'; +import { getTargetBoundaries } from './getTargetBoundaries'; +import type { VariantBoundaries } from './getVariantBoundaries'; +import { getVariantBoundaries } from './getVariantBoundaries'; +import { useBoundingClientRectChanges } from './useBoundingClientRectChanges'; + +export type UsePositionOptions = { + margin?: number; + container?: Element; + placement?: Placement; +}; + +export type UsePositionResult = { + style: CSSProperties; + placement?: Placement; +}; + +type TargetBoundariesKey = keyof TargetBoundaries; +type VariantBoundariesKey = keyof VariantBoundaries; +type VariantBoundariesKeyWithoutDirection = VariantBoundariesKey extends `${ + | 'h' + | 'v'}${infer U}` + ? U + : never; + +const fallbackOrder: Record = { + top: ['t', 'b', 'r', 'l'], + bottom: ['b', 't', 'r', 'l'], + right: ['r', 'l', 't', 'b'], + left: ['l', 'r', 'b', 't'], +}; + +const fallbackOrderVariant: Record< + PlacementVariant, + VariantBoundariesKeyWithoutDirection[] +> = { + start: ['s', 'e', 'm'], + middle: ['m', 's', 'e'], + end: ['e', 's', 'm'], +}; + +const keysToPlacementMap: Record & + Record = { + t: 'top', + b: 'bottom', + l: 'left', + r: 'right', + s: 'start', + e: 'end', + m: 'middle', +}; + +const emptyStyle: UsePositionResult = { + style: { + position: 'fixed', + visibility: 'hidden', + }, +}; + +const splitPlacement = (placement: Placement) => { + const [placementKey, variantKey = 'middle'] = placement.split('-'); + + return [placementKey as Position, variantKey as PlacementVariant] as const; +}; + +export function getPositionStyle({ + placement, + targetRect, + containerRect, + targetBoundaries, + variantBoundaries, + margin = 0, +}: { + placement: Placement; + targetRect: DOMRect; + containerRect: DOMRect; + targetBoundaries: TargetBoundaries; + variantBoundaries: VariantBoundaries; + margin?: number; +}): UsePositionResult { + if (!targetBoundaries) { + return emptyStyle; + } + + const { top, left, bottom, right } = containerRect; + + const [position, placementVariant] = splitPlacement(placement); + + const placementAttempts = fallbackOrder[position]; + const variantsAttempts = fallbackOrderVariant[placementVariant]; + + for (const placementAttempt of placementAttempts) { + const directionVertical = ['t', 'b'].includes(placementAttempt); + + const [positionKey, variantKey] = directionVertical + ? ['top', 'left'] + : ['left', 'top']; + + const point = targetBoundaries[placementAttempt]; + + const [positionBox, variantBox] = directionVertical + ? [targetRect.height, targetRect.width] + : [targetRect.width, targetRect.height]; + const [positionMaximum, variantMaximum] = directionVertical + ? [bottom, right] + : [right, bottom]; + const [positionMinimum, variantMinimum] = directionVertical + ? [top, left] + : [left, top]; + + // if the point extrapolate the container boundaries + if (point < positionMinimum || point + positionBox > positionMaximum) { + continue; + } + + for (const v of variantsAttempts) { + // The position-value, the related size value of the popper and the limit + const variantPoint = + variantBoundaries[`${directionVertical ? 'v' : 'h'}${v}`]; + + if ( + variantPoint < variantMinimum || + variantPoint + variantBox > variantMaximum + ) { + continue; + } + return { + style: { + [positionKey]: `${point}px`, + [variantKey]: `${variantPoint}px`, + position: 'fixed', + zIndex: 9999, + opacity: 1, + }, + placement: `${keysToPlacementMap[placementAttempt]}-${keysToPlacementMap[v]}`, + }; + } + } + + const placementAttempt = placementAttempts[0]; + + const directionVertical = ['t', 'b'].includes(placementAttempt); + + const point = targetBoundaries[placementAttempt]; + const variantPoint = + variantBoundaries[`${directionVertical ? 'v' : 'h'}${variantsAttempts[0]}`]; + + return { + style: { + top: `${point}px`, + left: `${variantPoint}px`, + position: 'fixed', + ...(bottom < targetRect.height + point && { + bottom: `${margin}px`, + overflowY: 'auto', + }), + ...({ zIndex: '9999' } as any), + }, + placement: `${keysToPlacementMap[placementAttempt]}-${ + keysToPlacementMap[variantsAttempts[0]] + }`, + } as UsePositionResult; +} + +const UPDATE_DEBOUNCE_DELAY = 10; + +/** + * Hook to deal and position an element using an anchor + * @param anchorRef - the anchor + * @param targetRef - the element to be positioned + * @param options - options to position + * @returns The style containing top and left position + * @public + */ +export function usePosition( + anchorRef: RefObject, + targetRef: RefObject, + { + margin = 8, + placement = 'bottom-start', + container = document.body, + }: UsePositionOptions = {} +): UsePositionResult { + const [style, setStyle] = useSafely(useState(emptyStyle)); + + const handleBoundingClientRectChange = useDebouncedCallback( + useMutableCallback(() => { + const target = targetRef.current; + const anchor = anchorRef.current; + const targetParent = target?.parentElement; + + if (!target || !anchor || !targetParent) { + return; + } + + const clone = target.cloneNode(true) as HTMLElement; + clone.style.bottom = ''; + clone.id = 'clone'; + targetParent.appendChild(clone); + const targetRect = clone.getBoundingClientRect(); + targetParent.removeChild(clone); + + const anchorRect = anchor.getBoundingClientRect(); + + const targetBoundaries = getTargetBoundaries({ + anchorRect, + targetRect, + margin, + }); + + const variantBoundaries = getVariantBoundaries({ + anchorRect, + targetRect, + }); + + setStyle( + getPositionStyle({ + placement, + containerRect: container.getBoundingClientRect(), + targetBoundaries, + variantBoundaries, + targetRect, + margin, + }) + ); + }), + UPDATE_DEBOUNCE_DELAY + ); + + useBoundingClientRectChanges(targetRef, handleBoundingClientRectChange); + useBoundingClientRectChanges(anchorRef, handleBoundingClientRectChange); + useBoundingClientRectChanges( + { current: container }, + handleBoundingClientRectChange + ); + return style; +} diff --git a/packages/fuselage-hooks/src/usePosition/useBoundingClientRectChanges.ts b/packages/fuselage-hooks/src/usePosition/useBoundingClientRectChanges.ts new file mode 100644 index 0000000000..4eac04a161 --- /dev/null +++ b/packages/fuselage-hooks/src/usePosition/useBoundingClientRectChanges.ts @@ -0,0 +1,55 @@ +import { useEffect } from 'react'; +import type { RefObject } from 'react'; + +function getAncestors(element: Element): Element[] { + const ancestors: Element[] = []; + for ( + let el = element.parentElement; + !!el && el !== document.documentElement; + el = el.parentElement + ) { + ancestors.push(el); + } + return ancestors; +} + +export function useBoundingClientRectChanges( + ref: RefObject, + callback: () => void +): void { + useEffect(() => { + const element = ref.current; + + if (!element) { + return; + } + + const safeCallback = () => { + if (!ref.current) { + return; + } + + callback(); + }; + + safeCallback(); + + const observer = new ResizeObserver(safeCallback); + observer.observe(element); + + window.addEventListener('resize', safeCallback); + + const ancestors = getAncestors(element); + ancestors.forEach((ancestor) => + ancestor.addEventListener('scroll', safeCallback, { passive: true }) + ); + + return () => { + observer.disconnect(); + window.removeEventListener('resize', safeCallback); + ancestors.forEach((ancestor) => + ancestor.removeEventListener('scroll', safeCallback) + ); + }; + }, [callback, ref]); +} diff --git a/packages/fuselage-hooks/tsconfig.build.json b/packages/fuselage-hooks/tsconfig.build.json new file mode 100644 index 0000000000..020a8b2d1d --- /dev/null +++ b/packages/fuselage-hooks/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["src/*.spec.ts"] +} diff --git a/packages/fuselage-hooks/tsconfig.json b/packages/fuselage-hooks/tsconfig.json index 3139976690..7714636ced 100644 --- a/packages/fuselage-hooks/tsconfig.json +++ b/packages/fuselage-hooks/tsconfig.json @@ -15,8 +15,7 @@ "noUnusedLocals": true, "noUnusedParameters": true, "esModuleInterop": true, - "resolveJsonModule": true - }, - "include": ["src"], - "exclude": ["dist", "node_modules", "src/*.spec.ts"] + "resolveJsonModule": true, + "strict": false + } } diff --git a/packages/fuselage/src/components/Dropdown/Dropdown.tsx b/packages/fuselage/src/components/Dropdown/Dropdown.tsx index 61c1fd9d0c..59a729f140 100644 --- a/packages/fuselage/src/components/Dropdown/Dropdown.tsx +++ b/packages/fuselage/src/components/Dropdown/Dropdown.tsx @@ -1,4 +1,4 @@ -import type { usePosition } from '@rocket.chat/fuselage-hooks'; +import type { UsePositionOptions } from '@rocket.chat/fuselage-hooks'; import { useMediaQuery } from '@rocket.chat/fuselage-hooks'; import type { ReactNode, Ref, RefObject } from 'react'; import React, { forwardRef } from 'react'; @@ -16,7 +16,7 @@ export const Dropdown = forwardRef(function Dropdown< placement = 'bottom-start', }: { reference: RefObject; - placement?: Parameters[2]['placement']; + placement?: UsePositionOptions['placement']; children: ReactNode; }, ref: Ref diff --git a/packages/fuselage/src/components/Dropdown/DropdownDesktop.tsx b/packages/fuselage/src/components/Dropdown/DropdownDesktop.tsx index 004db72fdd..f00e3fdd35 100644 --- a/packages/fuselage/src/components/Dropdown/DropdownDesktop.tsx +++ b/packages/fuselage/src/components/Dropdown/DropdownDesktop.tsx @@ -1,3 +1,4 @@ +import type { UsePositionOptions } from '@rocket.chat/fuselage-hooks'; import { usePosition } from '@rocket.chat/fuselage-hooks'; import type { ReactNode, Ref, RefObject } from 'react'; import React, { forwardRef } from 'react'; @@ -14,7 +15,7 @@ export const DropdownDesktop = forwardRef(function DropdownDesktop< placement = 'bottom-start', }: { reference: RefObject; - placement?: Parameters[2]['placement']; + placement?: UsePositionOptions['placement']; children: ReactNode; }, ref: Ref diff --git a/packages/fuselage/src/components/Menu/Menu.tsx b/packages/fuselage/src/components/Menu/Menu.tsx index cc14657f3b..4d8977dcd7 100644 --- a/packages/fuselage/src/components/Menu/Menu.tsx +++ b/packages/fuselage/src/components/Menu/Menu.tsx @@ -1,4 +1,4 @@ -import type { Placements } from '@rocket.chat/fuselage-hooks'; +import type { UsePositionOptions } from '@rocket.chat/fuselage-hooks'; import type { ComponentProps, ElementType, ReactNode } from 'react'; import React, { useRef, useCallback, useEffect } from 'react'; @@ -17,7 +17,7 @@ type MenuProps = Omit, 'icon'> & { }; }; optionWidth?: ComponentProps['width']; - placement?: Placements; + placement?: UsePositionOptions['placement']; renderItem?: ElementType; icon?: ComponentProps['icon']; maxHeight?: string | number; diff --git a/packages/fuselage/src/components/Position/Position.tsx b/packages/fuselage/src/components/Position/Position.tsx index 676eba78e4..69d91a82fd 100644 --- a/packages/fuselage/src/components/Position/Position.tsx +++ b/packages/fuselage/src/components/Position/Position.tsx @@ -1,4 +1,4 @@ -import type { Placements } from '@rocket.chat/fuselage-hooks'; +import type { UsePositionOptions } from '@rocket.chat/fuselage-hooks'; import { usePosition } from '@rocket.chat/fuselage-hooks'; import type { RefObject, @@ -15,7 +15,7 @@ type PositionProps = { anchor: RefObject; children: ReactElement; margin?: number; - placement?: Placements; + placement?: UsePositionOptions['placement']; } & Omit, 'children' | 'margin'>; const Position = ({ diff --git a/yarn.lock b/yarn.lock index 8d3c7f776b..28d3a6f4a8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5667,6 +5667,7 @@ __metadata: npm-run-all: ^4.1.5 prettier: ~2.8.7 react: ^17.0.2 + rimraf: ~5.0.0 rollup: ~2.67.3 rollup-plugin-terser: ~7.0.2 testing-utils: "workspace:~" @@ -16302,6 +16303,18 @@ fsevents@^1.2.7: languageName: node linkType: hard +"glob@npm:^10.0.0": + version: 10.0.0 + resolution: "glob@npm:10.0.0" + dependencies: + fs.realpath: ^1.0.0 + minimatch: ^9.0.0 + minipass: ^5.0.0 + path-scurry: ^1.6.4 + checksum: 3852a6b847106c431d87fb3e8cccb6cfc4449de3ab5d0216c44d4e2da2616df220058050d16811c42f0c2148ad8981da828227ae5c5ab798091ef27c903429f6 + languageName: node + linkType: hard + "glob@npm:^7.0.3, glob@npm:^7.1.1, glob@npm:^7.1.2, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6, glob@npm:^7.2.0": version: 7.2.3 resolution: "glob@npm:7.2.3" @@ -20412,6 +20425,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"lru-cache@npm:^9.0.0": + version: 9.0.1 + resolution: "lru-cache@npm:9.0.1" + checksum: 48e31a2a059730174d4b9c77c679ff922ee90ed8762376fd7a3ff5a1fae992bca26b9010dd985aff763d8444c3822c0d9ebeaba7d0552c764c200c40dedeaebd + languageName: node + linkType: hard + "lunr@npm:^2.3.9": version: 2.3.9 resolution: "lunr@npm:2.3.9" @@ -21517,6 +21537,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"minimatch@npm:^9.0.0": + version: 9.0.0 + resolution: "minimatch@npm:9.0.0" + dependencies: + brace-expansion: ^2.0.1 + checksum: 7bd57899edd1d1b0560f50b5b2d1ea4ad2a366c5a2c8e0a943372cf2f200b64c256bae45a87a80915adbce27fa36526264296ace0da57b600481fe5ea3e372e5 + languageName: node + linkType: hard + "minimist-options@npm:4.1.0": version: 4.1.0 resolution: "minimist-options@npm:4.1.0" @@ -21630,6 +21659,13 @@ fsevents@^1.2.7: languageName: node linkType: hard +"minipass@npm:^5.0.0": + version: 5.0.0 + resolution: "minipass@npm:5.0.0" + checksum: 425dab288738853fded43da3314a0b5c035844d6f3097a8e3b5b29b328da8f3c1af6fc70618b32c29ff906284cf6406b6841376f21caaadd0793c1d5a6a620ea + languageName: node + linkType: hard + "minizlib@npm:^1.3.3": version: 1.3.3 resolution: "minizlib@npm:1.3.3" @@ -23247,6 +23283,16 @@ fsevents@^1.2.7: languageName: node linkType: hard +"path-scurry@npm:^1.6.4": + version: 1.6.4 + resolution: "path-scurry@npm:1.6.4" + dependencies: + lru-cache: ^9.0.0 + minipass: ^5.0.0 + checksum: bd5262b51dc35b0d6f0b1d4fa4445789839982bd649904f18fe43717ecc3021d2313a80768b56cd0428f5ca50d740a6c609e747cd6a053efaa802e07eb5b7b18 + languageName: node + linkType: hard + "path-to-regexp@npm:0.1.7": version: 0.1.7 resolution: "path-to-regexp@npm:0.1.7" @@ -26254,6 +26300,17 @@ fsevents@^1.2.7: languageName: node linkType: hard +"rimraf@npm:~5.0.0": + version: 5.0.0 + resolution: "rimraf@npm:5.0.0" + dependencies: + glob: ^10.0.0 + bin: + rimraf: dist/cjs/src/bin.js + checksum: 60c5a7f152014d4f6bbf23f48e6badd145960a9be1115b719a07ba688c760b1bb8270abd6650bbd184ae2011843d8e9c775409652c89ff97550418aa5d581b27 + languageName: node + linkType: hard + "ripemd160@npm:^2.0.0, ripemd160@npm:^2.0.1": version: 2.0.2 resolution: "ripemd160@npm:2.0.2" From c8dd4c4f8ce5b0a2ee1541ce763503df62164349 Mon Sep 17 00:00:00 2001 From: Tasso Evangelista Date: Tue, 18 Apr 2023 16:24:33 -0300 Subject: [PATCH 009/103] refactor(monorepo): TypeScript compiler strict mode (1/N) (#1030) --- .../library/files/package.json.t | 4 +- ...sconfig-cjs.json.t => tsconfig.cjs.json.t} | 2 +- ...sconfig-esm.json.t => tsconfig.esm.json.t} | 2 +- .../library/files/tsconfig.json.t | 7 +- packages/css-in-js/rollup.config.js | 4 +- packages/css-in-js/tsconfig.build.json | 4 + packages/css-in-js/tsconfig.json | 13 +--- packages/css-supports/package.json | 2 +- .../{tsconfig-cjs.json => tsconfig.cjs.json} | 0 .../{tsconfig-esm.json => tsconfig.esm.json} | 0 packages/css-supports/tsconfig.json | 7 +- packages/emitter/rollup.config.js | 4 +- packages/emitter/src/index.ts | 37 ++++----- packages/emitter/tsconfig.build.json | 4 + packages/emitter/tsconfig.json | 10 +-- packages/eslint-config-alt/.eslintrc.js | 1 + packages/eslint-config-alt/minimal/index.js | 1 + packages/eslint-config-alt/original/index.js | 1 + packages/eslint-config-alt/react/index.js | 1 + .../eslint-config-alt/typescript/index.js | 10 +++ packages/fuselage-hooks/src/useAutoFocus.ts | 2 +- .../src/useBorderBoxSize.server.spec.ts | 2 +- .../src/useBorderBoxSize.spec.ts | 6 +- .../fuselage-hooks/src/useBorderBoxSize.ts | 9 +-- .../fuselage-hooks/src/useBreakpoints.spec.ts | 8 +- .../fuselage-hooks/src/useClipboard.spec.ts | 6 +- packages/fuselage-hooks/src/useClipboard.ts | 9 ++- .../src/useContentBoxSize.server.spec.ts | 2 +- .../src/useContentBoxSize.spec.ts | 6 +- .../fuselage-hooks/src/useContentBoxSize.ts | 9 +-- .../src/useDebouncedCallback.ts | 4 +- .../fuselage-hooks/src/useDebouncedReducer.ts | 75 +++++++++++++++---- .../fuselage-hooks/src/useDebouncedUpdates.ts | 22 ++++-- .../src/usePrefersReducedMotion.spec.ts | 6 +- .../fuselage-hooks/src/useResizeObserver.ts | 13 ++-- packages/fuselage-hooks/src/useSafely.spec.ts | 10 +-- packages/fuselage-hooks/src/useSafely.ts | 27 ++++--- packages/fuselage-hooks/src/useStableArray.ts | 2 +- packages/fuselage-hooks/src/useStorage.ts | 31 ++++---- packages/fuselage-hooks/tsconfig.build.json | 2 +- packages/fuselage-hooks/tsconfig.json | 16 ++-- .../src/components/Box/stylingProps.ts | 2 + .../src/components/Callout/Callout.spec.tsx | 13 ++-- .../fuselage/src/components/Slider/Slider.tsx | 2 + .../src/components/Slider/SliderTrack.tsx | 3 + packages/fuselage/src/styleTokens.ts | 12 +++ ...config-bundle.json => tsconfig.build.json} | 0 packages/fuselage/tsconfig.json | 13 +--- packages/fuselage/webpack.config.js | 2 +- .../SplitPlaneContainer.tsx | 8 +- tsconfig.base.json | 17 +++++ 51 files changed, 275 insertions(+), 178 deletions(-) rename _templates/create-package/library/files/{tsconfig-cjs.json.t => tsconfig.cjs.json.t} (77%) rename _templates/create-package/library/files/{tsconfig-esm.json.t => tsconfig.esm.json.t} (62%) create mode 100644 packages/css-in-js/tsconfig.build.json rename packages/css-supports/{tsconfig-cjs.json => tsconfig.cjs.json} (100%) rename packages/css-supports/{tsconfig-esm.json => tsconfig.esm.json} (100%) create mode 100644 packages/emitter/tsconfig.build.json rename packages/fuselage/{tsconfig-bundle.json => tsconfig.build.json} (100%) create mode 100644 tsconfig.base.json diff --git a/_templates/create-package/library/files/package.json.t b/_templates/create-package/library/files/package.json.t index 07acf8c6dd..5fc81bc330 100644 --- a/_templates/create-package/library/files/package.json.t +++ b/_templates/create-package/library/files/package.json.t @@ -31,8 +31,8 @@ to: packages/<%=package%>/package.json "scripts": { "clean": "rimraf dist", "build": "run .:build:esm && run .:build:cjs", - ".:build:esm": "tsc -p tsconfig-esm.json", - ".:build:cjs": "tsc -p tsconfig-cjs.json", + ".:build:esm": "tsc -p tsconfig.esm.json", + ".:build:cjs": "tsc -p tsconfig.cjs.json", "lint": "lint", "lint-and-fix": "lint-and-fix", "lint-staged": "lint-staged", diff --git a/_templates/create-package/library/files/tsconfig-cjs.json.t b/_templates/create-package/library/files/tsconfig.cjs.json.t similarity index 77% rename from _templates/create-package/library/files/tsconfig-cjs.json.t rename to _templates/create-package/library/files/tsconfig.cjs.json.t index 2b0e5180bc..d5cd88b93b 100644 --- a/_templates/create-package/library/files/tsconfig-cjs.json.t +++ b/_templates/create-package/library/files/tsconfig.cjs.json.t @@ -1,5 +1,5 @@ --- -to: packages/<%=package%>/tsconfig-cjs.json +to: packages/<%=package%>/tsconfig.cjs.json --- { "extends": "./tsconfig.json", diff --git a/_templates/create-package/library/files/tsconfig-esm.json.t b/_templates/create-package/library/files/tsconfig.esm.json.t similarity index 62% rename from _templates/create-package/library/files/tsconfig-esm.json.t rename to _templates/create-package/library/files/tsconfig.esm.json.t index 51c6192fd7..3140020b71 100644 --- a/_templates/create-package/library/files/tsconfig-esm.json.t +++ b/_templates/create-package/library/files/tsconfig.esm.json.t @@ -1,5 +1,5 @@ --- -to: packages/<%=package%>/tsconfig-esm.json +to: packages/<%=package%>/tsconfig.esm.json --- { "extends": "./tsconfig.json", diff --git a/_templates/create-package/library/files/tsconfig.json.t b/_templates/create-package/library/files/tsconfig.json.t index 3c83872fe8..aad3770f2e 100644 --- a/_templates/create-package/library/files/tsconfig.json.t +++ b/_templates/create-package/library/files/tsconfig.json.t @@ -2,17 +2,12 @@ to: packages/<%=package%>/tsconfig.json --- { + "extends": "../../tsconfig.base.json", "compilerOptions": { - "target": "es5", "module": "ESNext", - "declaration": true, - "declarationMap": true, - "sourceMap": true, "outDir": "./dist/esm", - "strict": true, "esModuleInterop": true, "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, "moduleResolution": "node", "resolveJsonModule": true }, diff --git a/packages/css-in-js/rollup.config.js b/packages/css-in-js/rollup.config.js index e747754a78..f3d8b8b59b 100644 --- a/packages/css-in-js/rollup.config.js +++ b/packages/css-in-js/rollup.config.js @@ -28,7 +28,9 @@ const plugins = [ json(), nodeResolve(), commonjs(), - typescript(), + typescript({ + tsconfig: './tsconfig.build.json', + }), ]; export default [ diff --git a/packages/css-in-js/tsconfig.build.json b/packages/css-in-js/tsconfig.build.json new file mode 100644 index 0000000000..5417c7dc09 --- /dev/null +++ b/packages/css-in-js/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["src/**/*.spec.ts"] +} diff --git a/packages/css-in-js/tsconfig.json b/packages/css-in-js/tsconfig.json index f1fdcc3c85..b4cc396e40 100644 --- a/packages/css-in-js/tsconfig.json +++ b/packages/css-in-js/tsconfig.json @@ -1,24 +1,13 @@ { + "extends": "../../tsconfig.base.json", "compilerOptions": { "rootDir": "./src", "module": "ESNext", - "target": "es5", "lib": ["dom", "es6"], - "sourceMap": true, - "allowJs": false, - "jsx": "react", - "declaration": true, "declarationDir": "./dist", "outDir": "./dist", "moduleResolution": "node", - "forceConsistentCasingInFileNames": true, "noEmit": true, - "noImplicitReturns": true, - "noImplicitThis": true, - "noImplicitAny": true, - "strictNullChecks": true, - "noUnusedLocals": true, - "noUnusedParameters": true, "esModuleInterop": true, "skipLibCheck": true }, diff --git a/packages/css-supports/package.json b/packages/css-supports/package.json index d50ff3cb78..45ccba6bf5 100644 --- a/packages/css-supports/package.json +++ b/packages/css-supports/package.json @@ -27,7 +27,7 @@ ], "scripts": { "clean": "rimraf dist", - "build": "tsc -p tsconfig-esm.json && tsc -p tsconfig-cjs.json", + "build": "tsc -p tsconfig.esm.json && tsc -p tsconfig.cjs.json", "lint": "lint", "lint-and-fix": "lint-and-fix", "lint-staged": "lint-staged", diff --git a/packages/css-supports/tsconfig-cjs.json b/packages/css-supports/tsconfig.cjs.json similarity index 100% rename from packages/css-supports/tsconfig-cjs.json rename to packages/css-supports/tsconfig.cjs.json diff --git a/packages/css-supports/tsconfig-esm.json b/packages/css-supports/tsconfig.esm.json similarity index 100% rename from packages/css-supports/tsconfig-esm.json rename to packages/css-supports/tsconfig.esm.json diff --git a/packages/css-supports/tsconfig.json b/packages/css-supports/tsconfig.json index 1002ee74d1..23682df3d9 100644 --- a/packages/css-supports/tsconfig.json +++ b/packages/css-supports/tsconfig.json @@ -1,16 +1,11 @@ { + "extends": "../../tsconfig.base.json", "compilerOptions": { "rootDir": "./src", - "target": "es5", "module": "ESNext", - "declaration": true, - "declarationMap": true, - "sourceMap": true, "outDir": "./dist/esm", - "strict": true, "esModuleInterop": true, "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, "moduleResolution": "node", "resolveJsonModule": true }, diff --git a/packages/emitter/rollup.config.js b/packages/emitter/rollup.config.js index 42f07bdd0f..400f7f3cbf 100644 --- a/packages/emitter/rollup.config.js +++ b/packages/emitter/rollup.config.js @@ -47,6 +47,8 @@ export default { json(), nodeResolve(), commonjs(), - typescript(), + typescript({ + tsconfig: './tsconfig.build.json', + }), ], }; diff --git a/packages/emitter/src/index.ts b/packages/emitter/src/index.ts index 5ddb41c348..42f3186037 100644 --- a/packages/emitter/src/index.ts +++ b/packages/emitter/src/index.ts @@ -117,11 +117,10 @@ export class Emitter */ on< T extends AnyEventOf, - EventType extends AnyEventTypeOf = EventTypeOf - >( - type: EventType, - handler: EventHandlerOf - ): OffCallbackHandler { + TType extends AnyEventTypeOf = EventTypeOf + >(type: TType, handler: EventHandlerOf): OffCallbackHandler; + + on(type: keyof EventMap, handler: (...args: any[]) => void) { const handlers = this[evts].get(type) ?? []; handlers.push(handler); this[evts].set(type, handlers); @@ -139,7 +138,9 @@ export class Emitter >( type: EventType, handler: EventHandlerOf - ): OffCallbackHandler { + ): OffCallbackHandler; + + once(type: keyof EventMap, handler: (...args: any[]) => void) { const counter = this[once].get(handler) || 0; this[once].set(handler, counter + 1); return this.on(type, handler); @@ -151,13 +152,15 @@ export class Emitter off< T extends AnyEventOf, EventType extends AnyEventTypeOf = EventTypeOf - >(type: EventType, handler: EventHandlerOf): void { + >(type: EventType, handler: EventHandlerOf): void; + + off(type: keyof EventMap, handler: (...args: any[]) => void) { const handlers = this[evts].get(type); if (!handlers) { return; } - const counter = this[once].get(handler); + const counter = this[once].get(handler) ?? 0; if (counter > 1) { this[once].set(handler, counter - 1); } else { @@ -186,15 +189,15 @@ export class Emitter ...[event]: EventOf extends void ? [undefined?] : [EventOf] - ): void { - [...(this[evts].get(type) ?? [])].forEach( - (handler: EventHandlerOf) => { - handler(event); - - if (this[once].get(handler)) { - this.off(type, handler); - } + ): void; + + emit(type: keyof EventMap, ...[event]: any[]) { + [...(this[evts].get(type) ?? [])].forEach((handler) => { + handler(event); + + if (this[once].get(handler)) { + this.off(type, handler); } - ); + }); } } diff --git a/packages/emitter/tsconfig.build.json b/packages/emitter/tsconfig.build.json new file mode 100644 index 0000000000..5417c7dc09 --- /dev/null +++ b/packages/emitter/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["src/**/*.spec.ts"] +} diff --git a/packages/emitter/tsconfig.json b/packages/emitter/tsconfig.json index 7918aadabd..4c899c6467 100644 --- a/packages/emitter/tsconfig.json +++ b/packages/emitter/tsconfig.json @@ -1,23 +1,17 @@ { + "extends": "../../tsconfig.base.json", "compilerOptions": { "rootDir": "./src", "module": "ESNext", "target": "ES5", "lib": ["dom", "ES2015"], - "sourceMap": true, - "allowJs": false, - "jsx": "react", - "declaration": true, "declarationDir": "./dist", "outDir": "./dist", "moduleResolution": "node", - "forceConsistentCasingInFileNames": true, - "noUnusedLocals": true, - "noUnusedParameters": true, "esModuleInterop": true, "resolveJsonModule": true, "skipLibCheck": true }, "include": ["src"], - "exclude": ["dist", "node_modules", "src/*.spec.ts"] + "exclude": ["dist", "node_modules"] } diff --git a/packages/eslint-config-alt/.eslintrc.js b/packages/eslint-config-alt/.eslintrc.js index 74a90692eb..6074be0213 100644 --- a/packages/eslint-config-alt/.eslintrc.js +++ b/packages/eslint-config-alt/.eslintrc.js @@ -1,3 +1,4 @@ +/** @type {import('eslint').Linter.Config} */ module.exports = { extends: './minimal', }; diff --git a/packages/eslint-config-alt/minimal/index.js b/packages/eslint-config-alt/minimal/index.js index b94c1c5395..e67bca66d3 100644 --- a/packages/eslint-config-alt/minimal/index.js +++ b/packages/eslint-config-alt/minimal/index.js @@ -1,3 +1,4 @@ +/** @type {import('eslint').Linter.Config} */ module.exports = { extends: ['../original', 'prettier'], plugins: ['prettier'], diff --git a/packages/eslint-config-alt/original/index.js b/packages/eslint-config-alt/original/index.js index 49c8f49802..2f7e6b4e99 100644 --- a/packages/eslint-config-alt/original/index.js +++ b/packages/eslint-config-alt/original/index.js @@ -1,3 +1,4 @@ +/** @type {import('eslint').Linter.Config} */ module.exports = { extends: [ './rules/best-practices', diff --git a/packages/eslint-config-alt/react/index.js b/packages/eslint-config-alt/react/index.js index 410802b1b5..bb4d4c29b6 100644 --- a/packages/eslint-config-alt/react/index.js +++ b/packages/eslint-config-alt/react/index.js @@ -1,3 +1,4 @@ +/** @type {import('eslint').Linter.Config} */ module.exports = { extends: '../minimal', plugins: ['react', 'react-hooks'], diff --git a/packages/eslint-config-alt/typescript/index.js b/packages/eslint-config-alt/typescript/index.js index bd9409cb8c..4133d25682 100644 --- a/packages/eslint-config-alt/typescript/index.js +++ b/packages/eslint-config-alt/typescript/index.js @@ -1,3 +1,4 @@ +/** @type {import('eslint').Linter.Config} */ module.exports = { extends: [ 'plugin:@typescript-eslint/recommended', @@ -59,4 +60,13 @@ module.exports = { typescript: {}, }, }, + overrides: [ + { + files: ['*.ts', '*.tsx'], + rules: { + '@typescript-eslint/no-dupe-class-members': 'error', + 'no-dupe-class-members': 'off', + }, + }, + ], }; diff --git a/packages/fuselage-hooks/src/useAutoFocus.ts b/packages/fuselage-hooks/src/useAutoFocus.ts index c863b442cb..e9f86b977c 100644 --- a/packages/fuselage-hooks/src/useAutoFocus.ts +++ b/packages/fuselage-hooks/src/useAutoFocus.ts @@ -16,7 +16,7 @@ export const useAutoFocus = < isFocused = true, options?: FocusOptions ): Ref => { - const elementRef = useRef(); + const elementRef = useRef(null); const { preventScroll } = options || {}; diff --git a/packages/fuselage-hooks/src/useBorderBoxSize.server.spec.ts b/packages/fuselage-hooks/src/useBorderBoxSize.server.spec.ts index 3075047aa5..856addc389 100644 --- a/packages/fuselage-hooks/src/useBorderBoxSize.server.spec.ts +++ b/packages/fuselage-hooks/src/useBorderBoxSize.server.spec.ts @@ -8,7 +8,7 @@ import { useRef } from 'react'; import { useBorderBoxSize } from './useBorderBoxSize'; it('immediately returns zero size', () => { - const { result } = renderHook(() => useBorderBoxSize(useRef())); + const { result } = renderHook(() => useBorderBoxSize(useRef(null))); expect(result.current.inlineSize).toStrictEqual(0); expect(result.current.blockSize).toStrictEqual(0); diff --git a/packages/fuselage-hooks/src/useBorderBoxSize.spec.ts b/packages/fuselage-hooks/src/useBorderBoxSize.spec.ts index eefc38b47e..d335cbadde 100644 --- a/packages/fuselage-hooks/src/useBorderBoxSize.spec.ts +++ b/packages/fuselage-hooks/src/useBorderBoxSize.spec.ts @@ -31,14 +31,14 @@ const wrapRef = (ref: RefObject) => { }; it('immediately returns size', async () => { - const { result } = renderHook(() => useBorderBoxSize(wrapRef(useRef()))); + const { result } = renderHook(() => useBorderBoxSize(wrapRef(useRef(null)))); expect(result.current.inlineSize).toStrictEqual(50); expect(result.current.blockSize).toStrictEqual(40); }); it('gets the observed element size after resize', async () => { - const { result } = renderHook(() => useBorderBoxSize(wrapRef(useRef()))); + const { result } = renderHook(() => useBorderBoxSize(wrapRef(useRef(null)))); // triggers MutationObserver await act(async () => { @@ -74,7 +74,7 @@ it('debounces the observed element size', async () => { const delay = 2 * halfDelay; const { result } = renderHook(() => - useBorderBoxSize(wrapRef(useRef()), { debounceDelay: delay }) + useBorderBoxSize(wrapRef(useRef(null)), { debounceDelay: delay }) ); // triggers MutationObserver diff --git a/packages/fuselage-hooks/src/useBorderBoxSize.ts b/packages/fuselage-hooks/src/useBorderBoxSize.ts index 1e929647ed..01bda6d36a 100644 --- a/packages/fuselage-hooks/src/useBorderBoxSize.ts +++ b/packages/fuselage-hooks/src/useBorderBoxSize.ts @@ -7,7 +7,9 @@ import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect'; export const useBorderBoxSize = ( ref: RefObject, - options: { + { + debounceDelay = 0, + }: { debounceDelay?: number; } = {} ): Readonly<{ @@ -19,10 +21,7 @@ export const useBorderBoxSize = ( blockSize: ref.current?.offsetHeight ?? 0, })); - const setSizeWithDebounce = useDebouncedCallback( - setSize, - options.debounceDelay - ); + const setSizeWithDebounce = useDebouncedCallback(setSize, debounceDelay); useIsomorphicLayoutEffect(() => { const element = ref.current; diff --git a/packages/fuselage-hooks/src/useBreakpoints.spec.ts b/packages/fuselage-hooks/src/useBreakpoints.spec.ts index 404711769e..0880c3dacf 100644 --- a/packages/fuselage-hooks/src/useBreakpoints.spec.ts +++ b/packages/fuselage-hooks/src/useBreakpoints.spec.ts @@ -17,7 +17,9 @@ it('returns matching breakpoint names', async () => { const finalBreakpoints = breakpoints.slice(0, -2); setViewport({ - width: initialBreakpoints[initialBreakpoints.length - 1].minViewportWidth, + width: + initialBreakpoints[initialBreakpoints.length - 1].minViewportWidth ?? + undefined, }); const { result } = renderHook(() => useBreakpoints()); @@ -28,7 +30,9 @@ it('returns matching breakpoint names', async () => { await act(async () => { setViewport({ - width: finalBreakpoints[finalBreakpoints.length - 1].minViewportWidth, + width: + finalBreakpoints[finalBreakpoints.length - 1].minViewportWidth ?? + undefined, }); }); diff --git a/packages/fuselage-hooks/src/useClipboard.spec.ts b/packages/fuselage-hooks/src/useClipboard.spec.ts index 2da5ec7889..b6d1cefc5f 100644 --- a/packages/fuselage-hooks/src/useClipboard.spec.ts +++ b/packages/fuselage-hooks/src/useClipboard.spec.ts @@ -3,7 +3,7 @@ import { withClipboardMock } from 'testing-utils/mocks/withClipboardMock'; import { useClipboard } from './useClipboard'; -let container: Element; +let container: Element | undefined; beforeAll(() => { jest.useFakeTimers(); @@ -15,8 +15,8 @@ beforeEach(() => { }); afterEach(() => { - container.remove(); - container = null; + container?.remove(); + container = undefined; }); const withWriteText = withClipboardMock(); diff --git a/packages/fuselage-hooks/src/useClipboard.ts b/packages/fuselage-hooks/src/useClipboard.ts index f224fbe3eb..9e6eb3b610 100644 --- a/packages/fuselage-hooks/src/useClipboard.ts +++ b/packages/fuselage-hooks/src/useClipboard.ts @@ -5,7 +5,7 @@ import { useMutableCallback } from './useMutableCallback'; type UseClipboardParams = { clearTime?: number; onCopySuccess?: (e?: Event) => void; - onCopyError?: (e?: Event) => void; + onCopyError?: (e?: Error) => void; }; export type UseClipboardReturn = { @@ -36,7 +36,12 @@ export const useClipboard = ( onCopySuccess(e); setHasCopied(true); } catch (e) { - onCopyError(e); + if (e instanceof Error) { + onCopyError(e); + return; + } + + throw e; } }); diff --git a/packages/fuselage-hooks/src/useContentBoxSize.server.spec.ts b/packages/fuselage-hooks/src/useContentBoxSize.server.spec.ts index 7e6d5cdb4d..ac054a22db 100644 --- a/packages/fuselage-hooks/src/useContentBoxSize.server.spec.ts +++ b/packages/fuselage-hooks/src/useContentBoxSize.server.spec.ts @@ -8,7 +8,7 @@ import { useRef } from 'react'; import { useContentBoxSize } from './useContentBoxSize'; it('immediately returns zero size', () => { - const { result } = renderHook(() => useContentBoxSize(useRef())); + const { result } = renderHook(() => useContentBoxSize(useRef(null))); expect(result.current.inlineSize).toStrictEqual(0); expect(result.current.blockSize).toStrictEqual(0); diff --git a/packages/fuselage-hooks/src/useContentBoxSize.spec.ts b/packages/fuselage-hooks/src/useContentBoxSize.spec.ts index 3f179c5eb2..599bb66287 100644 --- a/packages/fuselage-hooks/src/useContentBoxSize.spec.ts +++ b/packages/fuselage-hooks/src/useContentBoxSize.spec.ts @@ -31,14 +31,14 @@ const wrapRef = (ref: RefObject) => { }; it('immediately returns size', async () => { - const { result } = renderHook(() => useContentBoxSize(wrapRef(useRef()))); + const { result } = renderHook(() => useContentBoxSize(wrapRef(useRef(null)))); expect(result.current.inlineSize).toStrictEqual(40); expect(result.current.blockSize).toStrictEqual(30); }); it('gets the observed element size after resize', async () => { - const { result } = renderHook(() => useContentBoxSize(wrapRef(useRef()))); + const { result } = renderHook(() => useContentBoxSize(wrapRef(useRef(null)))); // triggers MutationObserver await act(async () => { @@ -74,7 +74,7 @@ it('debounces the observed element size', async () => { const delay = 2 * halfDelay; const { result } = renderHook(() => - useContentBoxSize(wrapRef(useRef()), { debounceDelay: delay }) + useContentBoxSize(wrapRef(useRef(null)), { debounceDelay: delay }) ); // triggers MutationObserver diff --git a/packages/fuselage-hooks/src/useContentBoxSize.ts b/packages/fuselage-hooks/src/useContentBoxSize.ts index b128703ada..b16f63601d 100644 --- a/packages/fuselage-hooks/src/useContentBoxSize.ts +++ b/packages/fuselage-hooks/src/useContentBoxSize.ts @@ -7,7 +7,9 @@ import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect'; export const useContentBoxSize = ( ref: RefObject, - options: { + { + debounceDelay = 0, + }: { debounceDelay?: number; } = {} ): Readonly<{ @@ -19,10 +21,7 @@ export const useContentBoxSize = ( blockSize: ref.current?.clientHeight ?? 0, }); - const setSizeWithDebounce = useDebouncedCallback( - setSize, - options.debounceDelay - ); + const setSizeWithDebounce = useDebouncedCallback(setSize, debounceDelay); useIsomorphicLayoutEffect(() => { const element = ref.current; diff --git a/packages/fuselage-hooks/src/useDebouncedCallback.ts b/packages/fuselage-hooks/src/useDebouncedCallback.ts index c95ae42eb9..7313e0c5cb 100644 --- a/packages/fuselage-hooks/src/useDebouncedCallback.ts +++ b/packages/fuselage-hooks/src/useDebouncedCallback.ts @@ -19,7 +19,7 @@ export const useDebouncedCallback =

( cancel: () => void; } => { // eslint-disable-next-line react-hooks/exhaustive-deps - const effectiveCallback = useCallback(callback, deps); + const effectiveCallback = useMemo(() => callback, deps); const timerCallbackRef = useRef<() => void>(); const timerRef = useRef>(); @@ -37,7 +37,7 @@ export const useDebouncedCallback =

( const flush = useCallback(() => { clearTimeout(timerRef.current); - timerCallbackRef.current(); + timerCallbackRef.current?.(); }, []); const cancel = useCallback(() => { diff --git a/packages/fuselage-hooks/src/useDebouncedReducer.ts b/packages/fuselage-hooks/src/useDebouncedReducer.ts index d8dc0e06b7..45095cf2c5 100644 --- a/packages/fuselage-hooks/src/useDebouncedReducer.ts +++ b/packages/fuselage-hooks/src/useDebouncedReducer.ts @@ -10,6 +10,17 @@ import { useReducer } from 'react'; import { useDebouncedUpdates } from './useDebouncedUpdates'; +/** + * Hook to create a reduced state with a debounced `dispatch()` function. + * + * @param reducer - the reducer function + * @param initialArg - the initial state value or the argument passed to the + * initial state generator function + * @param init - the initial state generator function + * @param delay - the number of milliseconds to delay the updater + * @returns a state and debounced `dispatch()` function + * @public + */ export function useDebouncedReducer>( reducer: R, initialArg: S, @@ -23,6 +34,17 @@ export function useDebouncedReducer>( } ]; +/** + * Hook to create a reduced state with a debounced `dispatch()` function. + * + * @param reducer - the reducer function + * @param initialArg - the initial state value or the argument passed to the + * initial state generator function + * @param init - the initial state generator function + * @param delay - the number of milliseconds to delay the updater + * @returns a state and debounced `dispatch()` function + * @public + */ export function useDebouncedReducer, I>( reducer: R, initialArg: I, @@ -36,18 +58,29 @@ export function useDebouncedReducer, I>( } ]; -export function useDebouncedReducer>( - reducer: R, - initialArg: S, - init: undefined, - delay: number -): [ - ReducerState, - Dispatch & { - flush: () => void; - cancel: () => void; - } -]; +// /** +// * Hook to create a reduced state with a debounced `dispatch()` function. +// * +// * @param reducer - the reducer function +// * @param initialArg - the initial state value or the argument passed to the +// * initial state generator function +// * @param init - the initial state generator function +// * @param delay - the number of milliseconds to delay the updater +// * @returns a state and debounced `dispatch()` function +// * @public +// */ +// export function useDebouncedReducer>( +// reducer: R, +// initialArg: S, +// init: undefined, +// delay: number +// ): [ +// ReducerState, +// Dispatch & { +// flush: () => void; +// cancel: () => void; +// } +// ]; /** * Hook to create a reduced state with a debounced `dispatch()` function. @@ -71,6 +104,20 @@ export function useDebouncedReducer, I>( flush: () => void; cancel: () => void; } -] { - return useDebouncedUpdates(useReducer(reducer, initialArg, init), delay); +]; + +export function useDebouncedReducer( + reducer: (prevState: unknown, action?: unknown) => unknown, + initialArg: unknown, + init: ((arg?: unknown) => unknown) | undefined, + delay: number +) { + return useDebouncedUpdates( + init !== undefined + ? // eslint-disable-next-line react-hooks/rules-of-hooks + useReducer(reducer, initialArg, init) + : // eslint-disable-next-line react-hooks/rules-of-hooks + useReducer(reducer, initialArg), + delay + ); } diff --git a/packages/fuselage-hooks/src/useDebouncedUpdates.ts b/packages/fuselage-hooks/src/useDebouncedUpdates.ts index 32a1b48061..2fe5fd41c1 100644 --- a/packages/fuselage-hooks/src/useDebouncedUpdates.ts +++ b/packages/fuselage-hooks/src/useDebouncedUpdates.ts @@ -5,13 +5,13 @@ import { useDebouncedCallback } from './useDebouncedCallback'; /** * Hook to debounce the state dispatcher function returned by hooks like `useState()` and `useReducer()`. * - * @param pair - the state and dispatcher pair which will be debounced - * @param delay - the number of milliseconds to delay the dispatcher + * @param pair the state value and dispatcher function pair + * @param delay the number of milliseconds to delay the dispatcher * @returns a state value and debounced dispatcher pair * @public */ export function useDebouncedUpdates( - [state, dispatch]: [S, DispatchWithoutAction], + pair: [state: S, dispatch: DispatchWithoutAction], delay: number ): [ S, @@ -20,8 +20,17 @@ export function useDebouncedUpdates( cancel: () => void; } ]; + +/** + * Hook to debounce the state dispatcher function returned by hooks like `useState()` and `useReducer()`. + * + * @param pair the state value and dispatcher function pair + * @param delay the number of milliseconds to delay the dispatcher + * @returns a state value and debounced dispatcher pair + * @public + */ export function useDebouncedUpdates( - [state, dispatch]: [S, Dispatch], + pair: [state: S, dispatch: Dispatch], delay: number ): [ S, @@ -30,9 +39,10 @@ export function useDebouncedUpdates( cancel: () => void; } ]; + export function useDebouncedUpdates( - [state, dispatch]: [unknown, () => unknown], + [state, dispatch]: [state: unknown, dispatch: (action?: unknown) => void], delay: number -): [unknown, unknown] { +) { return [state, useDebouncedCallback(dispatch, delay, [])]; } diff --git a/packages/fuselage-hooks/src/usePrefersReducedMotion.spec.ts b/packages/fuselage-hooks/src/usePrefersReducedMotion.spec.ts index 4c57903973..e4615e92b0 100644 --- a/packages/fuselage-hooks/src/usePrefersReducedMotion.spec.ts +++ b/packages/fuselage-hooks/src/usePrefersReducedMotion.spec.ts @@ -5,7 +5,7 @@ import { usePrefersReducedMotion } from './usePrefersReducedMotion'; const setViewport = withMatchMediaMock(); -let container: HTMLDivElement; +let container: HTMLDivElement | undefined; beforeEach(() => { container = document.createElement('div'); @@ -13,8 +13,8 @@ beforeEach(() => { }); afterEach(() => { - container.remove(); - container = null; + container?.remove(); + container = undefined; }); it('returns false on the initial call', () => { diff --git a/packages/fuselage-hooks/src/useResizeObserver.ts b/packages/fuselage-hooks/src/useResizeObserver.ts index 280588b7cd..70bdd02865 100644 --- a/packages/fuselage-hooks/src/useResizeObserver.ts +++ b/packages/fuselage-hooks/src/useResizeObserver.ts @@ -22,16 +22,17 @@ type UseResizeObserverOptions = { * @public */ export const useResizeObserver = ({ - debounceDelay, + debounceDelay = 0, }: UseResizeObserverOptions = {}): { ref: RefObject; - contentBoxSize: ResizeObserverSize; - borderBoxSize: ResizeObserverSize; + contentBoxSize: Partial; + borderBoxSize: Partial; } => { - const ref = useRef(); + const ref = useRef(null); + const [{ borderBoxSize, contentBoxSize }, setSizes] = useDebouncedState<{ - borderBoxSize: ResizeObserverSize; - contentBoxSize: ResizeObserverSize; + borderBoxSize: Partial; + contentBoxSize: Partial; }>( { borderBoxSize: { diff --git a/packages/fuselage-hooks/src/useSafely.spec.ts b/packages/fuselage-hooks/src/useSafely.spec.ts index b89ea03be0..6cca510e17 100644 --- a/packages/fuselage-hooks/src/useSafely.spec.ts +++ b/packages/fuselage-hooks/src/useSafely.spec.ts @@ -1,5 +1,5 @@ import { renderHook, act } from '@testing-library/react-hooks'; -import type { DispatchWithoutAction, Dispatch } from 'react'; +import type { Dispatch } from 'react'; import { useState } from 'react'; import { useSafely } from './useSafely'; @@ -8,9 +8,7 @@ it('returns a new dispatcher that invokes the previous one', () => { const state = Symbol(); const dispatcher = jest.fn(); - const { result } = renderHook(() => - useSafely([state, dispatcher]) - ); + const { result } = renderHook(() => useSafely([state, dispatcher])); const [, newDispatcher] = result.current; act(() => { @@ -24,9 +22,7 @@ it('returns a new dispatcher that can be called after unmount', () => { const state = Symbol(); const dispatcher = jest.fn(); - const { result, unmount } = renderHook(() => - useSafely([state, dispatcher]) - ); + const { result, unmount } = renderHook(() => useSafely([state, dispatcher])); const [, newDispatcher] = result.current; unmount(); diff --git a/packages/fuselage-hooks/src/useSafely.ts b/packages/fuselage-hooks/src/useSafely.ts index f59c11fa93..a460ba009f 100644 --- a/packages/fuselage-hooks/src/useSafely.ts +++ b/packages/fuselage-hooks/src/useSafely.ts @@ -1,7 +1,5 @@ import type { Dispatch, DispatchWithoutAction } from 'react'; -import { useEffect, useRef } from 'react'; - -import { useMutableCallback } from './useMutableCallback'; +import { useCallback, useEffect, useRef } from 'react'; /** * Hook that wraps pairs of state and dispatcher to provide a new dispatcher @@ -11,23 +9,30 @@ import { useMutableCallback } from './useMutableCallback'; * @returns a state value and safe dispatcher pair * @public */ -export const useSafely = >([ +export function useSafely>([ state, dispatcher, -]: [S, Dispatch | DispatchWithoutAction]): [S, D] => { - const dispatcherRef = useRef(dispatcher); +]: [state: S, dispatch: D]): [state: S, dispatch: D]; + +export function useSafely([state, dispatcher]: [ + state: unknown, + dispatch: (action?: unknown) => void +]) { + const dispatcherRef = useRef<((action?: unknown) => void) | undefined>( + dispatcher + ); useEffect( () => () => { - dispatcherRef.current = () => undefined; + dispatcherRef.current = undefined; }, [] ); - const safeDispatcher = useMutableCallback((action?: A) => { + const safeDispatcher = useCallback((action) => { const dispatcher = dispatcherRef.current; - dispatcher(action); - }) as D; + dispatcher?.(action); + }, []); return [state, safeDispatcher]; -}; +} diff --git a/packages/fuselage-hooks/src/useStableArray.ts b/packages/fuselage-hooks/src/useStableArray.ts index 5ccb95349a..a08229c9b9 100644 --- a/packages/fuselage-hooks/src/useStableArray.ts +++ b/packages/fuselage-hooks/src/useStableArray.ts @@ -47,6 +47,6 @@ export const useStableArray = ( array: T, compare: (a: T, b: T) => boolean = Object.is ): T => { - const ref = useRef(Array.isArray(array) ? array : ([] as T)); + const ref = useRef(array); return getCurrentArray(ref, array, compare); }; diff --git a/packages/fuselage-hooks/src/useStorage.ts b/packages/fuselage-hooks/src/useStorage.ts index 7e3331b010..8e710a9ffe 100644 --- a/packages/fuselage-hooks/src/useStorage.ts +++ b/packages/fuselage-hooks/src/useStorage.ts @@ -1,12 +1,12 @@ import { Emitter } from '@rocket.chat/emitter'; import type { Dispatch, SetStateAction } from 'react'; -import { useState, useEffect, useCallback } from 'react'; +import { useRef, useState, useEffect, useCallback } from 'react'; -const makeStorage = ( +function makeStorageHook( storageFactory: Storage | (() => Storage), name: string -): ((key: string, initialValue: T) => [T, Dispatch>]) => { - let storage: Storage = null; +): (key: string, initialValue: T) => [T, Dispatch>] { + let storage: Storage | undefined = undefined; if (typeof window !== 'undefined') { storage = @@ -17,10 +17,13 @@ const makeStorage = ( const ee = new Emitter(); - return function useGenericStorage( + return ( key: string, initialValue: T - ): [T, Dispatch>] { + ): [T, Dispatch>] => { + const initialValueRef = useRef(initialValue); + initialValueRef.current = initialValue; + const [storedValue, setStoredValue] = useState(() => { if (!storage) { return initialValue; @@ -31,11 +34,11 @@ const makeStorage = ( }); const setValue: Dispatch> = useCallback( - (value: T extends unknown ? SetStateAction : never): void => { + (value) => { setStoredValue((prevValue: T) => { const valueToStore: T = - typeof value === 'function' ? value(prevValue) : value; - storage.setItem(getKey(key), JSON.stringify(valueToStore)); + value instanceof Function ? value(prevValue) : value; + storage?.setItem(getKey(key), JSON.stringify(valueToStore)); ee.emit(key, valueToStore); return valueToStore; }); @@ -49,7 +52,9 @@ const makeStorage = ( return; } - setStoredValue(JSON.parse(event.newValue)); + setStoredValue( + event.newValue ? JSON.parse(event.newValue) : initialValueRef.current + ); }; const handleSyntheticEvent = (value: T): void => { @@ -65,7 +70,7 @@ const makeStorage = ( return [storedValue, setValue]; }; -}; +} /** * Hook to deal with localStorage @@ -74,7 +79,7 @@ const makeStorage = ( * @returns a state and a setter function * @public */ -export const useLocalStorage = makeStorage( +export const useLocalStorage = makeStorageHook( () => window.localStorage, 'localStorage' ); @@ -86,7 +91,7 @@ export const useLocalStorage = makeStorage( * @returns a state and a setter function * @public */ -export const useSessionStorage = makeStorage( +export const useSessionStorage = makeStorageHook( () => window.sessionStorage, 'sessionStorage' ); diff --git a/packages/fuselage-hooks/tsconfig.build.json b/packages/fuselage-hooks/tsconfig.build.json index 020a8b2d1d..d7d529fb9a 100644 --- a/packages/fuselage-hooks/tsconfig.build.json +++ b/packages/fuselage-hooks/tsconfig.build.json @@ -1,4 +1,4 @@ { "extends": "./tsconfig.json", - "exclude": ["src/*.spec.ts"] + "exclude": ["./src/**/*.spec.ts"] } diff --git a/packages/fuselage-hooks/tsconfig.json b/packages/fuselage-hooks/tsconfig.json index 7714636ced..aadf6c69c7 100644 --- a/packages/fuselage-hooks/tsconfig.json +++ b/packages/fuselage-hooks/tsconfig.json @@ -1,21 +1,15 @@ { + "extends": "../../tsconfig.base.json", "compilerOptions": { "rootDir": "./src", "module": "ESNext", - "target": "ES5", "lib": ["DOM", "ES2015"], - "sourceMap": true, - "allowJs": false, - "jsx": "react", - "declaration": true, "declarationDir": "./dist", "outDir": "./dist", "moduleResolution": "node", - "forceConsistentCasingInFileNames": true, - "noUnusedLocals": true, - "noUnusedParameters": true, "esModuleInterop": true, - "resolveJsonModule": true, - "strict": false - } + "resolveJsonModule": true + }, + "include": ["src"], + "exclude": ["dist", "node_modules"] } diff --git a/packages/fuselage/src/components/Box/stylingProps.ts b/packages/fuselage/src/components/Box/stylingProps.ts index 9f3a0a036d..89a0d5b06d 100644 --- a/packages/fuselage/src/components/Box/stylingProps.ts +++ b/packages/fuselage/src/components/Box/stylingProps.ts @@ -399,6 +399,8 @@ export const propDefs: Record = { 0px 0px 12px 0px ${Palette.shadow['shadow-elevation-2y']}; `; } + + return undefined; }, }, invisible: { diff --git a/packages/fuselage/src/components/Callout/Callout.spec.tsx b/packages/fuselage/src/components/Callout/Callout.spec.tsx index 3389a93561..9f7936fe0f 100644 --- a/packages/fuselage/src/components/Callout/Callout.spec.tsx +++ b/packages/fuselage/src/components/Callout/Callout.spec.tsx @@ -17,7 +17,7 @@ describe('[Callout Component]', () => { ['Success', Success], ['Warning', Warning], ['Danger', Danger], - ])('renders %p story without crashing', (storyName, Story) => { + ])('renders %p story without crashing', (_storyName, Story) => { render(); }); @@ -26,10 +26,13 @@ describe('[Callout Component]', () => { ['.rcx-callout--type-success', 'success', Success], ['.rcx-callout--type-warning', 'warning', Warning], ['.rcx-callout--type-danger', 'danger', Danger], - ])('should have class %p when type is %p', (className, typeName, Story) => { - const { container } = render(); - expect(container.querySelector(className)).toBeInTheDocument(); - }); + ])( + 'should have class %p when type is %p', + (className, _typeName, Story) => { + const { container } = render(); + expect(container.querySelector(className)).toBeInTheDocument(); + } + ); }); it('should show title when this property is passed', () => { diff --git a/packages/fuselage/src/components/Slider/Slider.tsx b/packages/fuselage/src/components/Slider/Slider.tsx index c8299034cf..796d2f7e73 100644 --- a/packages/fuselage/src/components/Slider/Slider.tsx +++ b/packages/fuselage/src/components/Slider/Slider.tsx @@ -79,6 +79,8 @@ export function Slider( } return [0, 100] as T; } + + return undefined; }; const { defaultValue = getMultiThumbDefaultValue() } = props; diff --git a/packages/fuselage/src/components/Slider/SliderTrack.tsx b/packages/fuselage/src/components/Slider/SliderTrack.tsx index 211d62eb65..117b97f3b4 100644 --- a/packages/fuselage/src/components/Slider/SliderTrack.tsx +++ b/packages/fuselage/src/components/Slider/SliderTrack.tsx @@ -62,7 +62,10 @@ export const SliderTrack = ({ state.values[0] )}%, transparent 0%`; } + + return undefined; }; + const track = useStyle( css` &::before { diff --git a/packages/fuselage/src/styleTokens.ts b/packages/fuselage/src/styleTokens.ts index a9ac4efb7b..8f218207e1 100644 --- a/packages/fuselage/src/styleTokens.ts +++ b/packages/fuselage/src/styleTokens.ts @@ -61,6 +61,8 @@ export const borderWidth = measure((value: unknown) => { if (value === 'default') { return borderWidth('x1'); } + + return undefined; }); export const borderRadius = measure((value: unknown) => { @@ -71,6 +73,8 @@ export const borderRadius = measure((value: unknown) => { if (value === 'full') { return '9999px'; } + + return undefined; }); const mapTypeToPrefix = { @@ -281,24 +285,32 @@ export const size = measure((value: unknown) => { if (value === 'sh') { return '100vh'; } + + return undefined; }); export const inset = measure((value: unknown) => { if (value === 'none') { return '0px'; } + + return undefined; }); export const margin = measure((value: unknown) => { if (value === 'none') { return '0px'; } + + return undefined; }); export const padding = measure((value: unknown) => { if (value === 'none') { return '0px'; } + + return undefined; }); type FontFamily = keyof typeof tokenTypography.fontFamilies; diff --git a/packages/fuselage/tsconfig-bundle.json b/packages/fuselage/tsconfig.build.json similarity index 100% rename from packages/fuselage/tsconfig-bundle.json rename to packages/fuselage/tsconfig.build.json diff --git a/packages/fuselage/tsconfig.json b/packages/fuselage/tsconfig.json index 631713ebd9..5720237b72 100644 --- a/packages/fuselage/tsconfig.json +++ b/packages/fuselage/tsconfig.json @@ -1,28 +1,19 @@ { + "extends": "../../tsconfig.base.json", "compilerOptions": { "rootDirs": ["./src/", "./.storybook/"], "target": "ES5", "module": "ESNext", "lib": ["ES2020", "DOM"], "downlevelIteration": true, - "declaration": true, - "declarationMap": true, - "sourceMap": true, "outDir": "./dist/", - "strict": true, "esModuleInterop": true, "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, "moduleResolution": "node", "resolveJsonModule": true, "allowJs": true, "jsx": "react" }, "include": ["./src/", "./.jest/**/*.d.ts"], - "exclude": [ - "./dist/", - "./storybook-static/", - "./src/**/*.spec.{js,ts,tsx}", - "./*.js" - ] + "exclude": ["./dist/", "./storybook-static/", "./*.js"] } diff --git a/packages/fuselage/webpack.config.js b/packages/fuselage/webpack.config.js index 8496932527..50854c83d6 100644 --- a/packages/fuselage/webpack.config.js +++ b/packages/fuselage/webpack.config.js @@ -41,7 +41,7 @@ module.exports = (env, { mode = 'production' }) => ({ use: { loader: 'ts-loader', options: { - configFile: path.resolve(__dirname, './tsconfig-bundle.json'), + configFile: path.resolve(__dirname, './tsconfig.build.json'), }, }, }, diff --git a/packages/uikit-playground/src/Components/Preview/SplitPlaneContainer/SplitPlaneContainer.tsx b/packages/uikit-playground/src/Components/Preview/SplitPlaneContainer/SplitPlaneContainer.tsx index 64f01f06d9..b649c7bbf8 100644 --- a/packages/uikit-playground/src/Components/Preview/SplitPlaneContainer/SplitPlaneContainer.tsx +++ b/packages/uikit-playground/src/Components/Preview/SplitPlaneContainer/SplitPlaneContainer.tsx @@ -8,8 +8,8 @@ import Display from '../Display'; import Editor from '../Editor'; type PreviewSizeType = { - blockSize: number; - inlineSize: number; + blockSize?: number; + inlineSize?: number; }; const SplitPlaneContainer: FC<{ PreviewSize: PreviewSizeType }> = ({ PreviewSize, @@ -24,9 +24,9 @@ const SplitPlaneContainer: FC<{ PreviewSize: PreviewSizeType }> = ({ }, [isTablet, dispatch]); const splitPaneProps = { - defaultSize: PreviewSize.inlineSize * 0.5, + defaultSize: (PreviewSize.inlineSize ?? 0) * 0.5, minSize: 500, - maxSize: PreviewSize.inlineSize - 300, + maxSize: (PreviewSize.inlineSize ?? 0) - 300, allowResize: !isTablet, }; diff --git a/tsconfig.base.json b/tsconfig.base.json new file mode 100644 index 0000000000..bf384dae8c --- /dev/null +++ b/tsconfig.base.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "ES5", + "sourceMap": true, + "declaration": true, + "declarationMap": true, + "allowJs": false, + "noImplicitReturns": true, + "noImplicitThis": true, + "noImplicitAny": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "strictNullChecks": true, + "strict": true, + "forceConsistentCasingInFileNames": true + } +} From 07fe4071f815630b75b51b95e1e4e16d7cc7f2e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlia=20Jaeger=20Foresti?= <60678893+juliajforesti@users.noreply.github.com> Date: Wed, 19 Apr 2023 14:50:28 -0300 Subject: [PATCH 010/103] chore(fuselage): add option to use `IconButton` with emoji (#1033) --- .../components/Button/IconButton.stories.tsx | 14 ++++++++++++++ .../src/components/Button/IconButton.tsx | 18 +++++++++++------- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/packages/fuselage/src/components/Button/IconButton.stories.tsx b/packages/fuselage/src/components/Button/IconButton.stories.tsx index 5a6c783b58..b7762d9b5a 100644 --- a/packages/fuselage/src/components/Button/IconButton.stories.tsx +++ b/packages/fuselage/src/components/Button/IconButton.stories.tsx @@ -38,6 +38,20 @@ export const _IconButton: ComponentStory = () => ( export const _IconButtonDisabled: ComponentStory = () => ( ); +export const _IconButtonWithEmoji: ComponentStory = () => ( + + + 🤘🏾 + + + } + /> +); export const Variants = () => ( <> diff --git a/packages/fuselage/src/components/Button/IconButton.tsx b/packages/fuselage/src/components/Button/IconButton.tsx index 4a0d2e4694..5657c7866f 100644 --- a/packages/fuselage/src/components/Button/IconButton.tsx +++ b/packages/fuselage/src/components/Button/IconButton.tsx @@ -1,5 +1,5 @@ -import type { ComponentProps, ReactNode, Ref } from 'react'; -import React, { useMemo, forwardRef } from 'react'; +import type { ComponentProps, ReactElement, Ref } from 'react'; +import React, { isValidElement, useMemo, forwardRef } from 'react'; import Box from '../Box'; import { Icon } from '../Icon'; @@ -11,8 +11,7 @@ type ButtonSize = { }; type IconButtonProps = { - icon: ComponentProps['name']; - children?: ReactNode; + icon: ComponentProps['name'] | ReactElement; primary?: boolean; secondary?: boolean; info?: boolean; @@ -28,7 +27,6 @@ export const IconButton = forwardRef( ( { icon, - children, primary, info, secondary, @@ -77,8 +75,14 @@ export const IconButton = forwardRef( ref={ref} {...props} > - {children} - + {isValidElement(icon) ? ( + icon + ) : ( + ['name']} + size={getSize({ mini })} + /> + )} ); } From 96870d1c3015ebeeff1d088ae8773b58306ac8e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlia=20Jaeger=20Foresti?= <60678893+juliajforesti@users.noreply.github.com> Date: Thu, 20 Apr 2023 14:09:17 -0300 Subject: [PATCH 011/103] fix(fuselage): icon alignment (#1026) Co-authored-by: Douglas Fabris --- packages/fuselage/src/components/Icon/Icon.styles.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fuselage/src/components/Icon/Icon.styles.scss b/packages/fuselage/src/components/Icon/Icon.styles.scss index 5f722b1383..1c0738508d 100644 --- a/packages/fuselage/src/components/Icon/Icon.styles.scss +++ b/packages/fuselage/src/components/Icon/Icon.styles.scss @@ -3,7 +3,7 @@ user-select: none; - vertical-align: middle; + vertical-align: text-bottom; letter-spacing: 0; From 07485ef534be6ab09aa729f683a3b0062f6a6ed0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlia=20Jaeger=20Foresti?= <60678893+juliajforesti@users.noreply.github.com> Date: Mon, 24 Apr 2023 13:59:51 -0300 Subject: [PATCH 012/103] chore(fuselage): `IconButton` variants (#1034) --- .../src/components/Button/Button.styles.scss | 12 +- .../components/Button/IconButton.stories.tsx | 219 ++++++++++++------ .../src/components/Button/IconButton.tsx | 86 +++++-- .../fuselage/src/styles/mixins/states.scss | 6 + .../src/styles/primitives/button.scss | 5 + .../src/styles/variables/buttons.scss | 23 +- 6 files changed, 257 insertions(+), 94 deletions(-) diff --git a/packages/fuselage/src/components/Button/Button.styles.scss b/packages/fuselage/src/components/Button/Button.styles.scss index a90ec7c2f0..fd41bcabd8 100644 --- a/packages/fuselage/src/components/Button/Button.styles.scss +++ b/packages/fuselage/src/components/Button/Button.styles.scss @@ -109,18 +109,22 @@ } } - &--tiny-square { - @include with-squared-size($size: 24px); - } - &--mini-square { @include with-squared-size($size: 20px); } + &--tiny-square { + @include with-squared-size($size: 24px); + } + &--small-square { @include with-squared-size($size: 28px); } + &--medium-square { + @include with-squared-size($size: 32px); + } + &--primary { @include button.kind-variant(colors.$primary); } diff --git a/packages/fuselage/src/components/Button/IconButton.stories.tsx b/packages/fuselage/src/components/Button/IconButton.stories.tsx index b7762d9b5a..bf42a755e4 100644 --- a/packages/fuselage/src/components/Button/IconButton.stories.tsx +++ b/packages/fuselage/src/components/Button/IconButton.stories.tsx @@ -10,9 +10,21 @@ import { import type { ComponentStory, ComponentMeta } from '@storybook/react'; import React from 'react'; +import { PropsVariationSection } from '../../../.storybook/helpers'; import { ButtonGroup } from '../ButtonGroup'; import { IconButton } from './IconButton'; +const EmojiElement = ( +

+); + export default { title: 'Inputs/IconButton', component: IconButton, @@ -35,113 +47,186 @@ export default { export const _IconButton: ComponentStory = () => ( ); -export const _IconButtonDisabled: ComponentStory = () => ( - -); -export const _IconButtonWithEmoji: ComponentStory = () => ( - - - 🤘🏾 - - - } - /> + +export const States = () => ( + <> + + {/* + */} + ); export const Variants = () => ( <> - - - - - - - - - - - - - - - - - - - - - - - - + ); export const Sizes = () => ( - - - + + + + + ); +export const _IconButtonDisabled: ComponentStory = () => ( + +); + +export const _IconButtonWithEmoji: ComponentStory = () => ( + +); export const _IconButtonInfo: ComponentStory = () => ( ); -export const _IconButtonInfoDisabled: ComponentStory< - typeof IconButton -> = () => ; export const _IconButtonSecondaryInfo: ComponentStory< typeof IconButton > = () => ; -export const _IconButtonSecondaryInfoDisabled: ComponentStory< - typeof IconButton -> = () => ; export const _IconButtonSuccess: ComponentStory = () => ( ); -export const _IconButtonSuccessDisabled: ComponentStory< - typeof IconButton -> = () => ; export const _IconButtonSecondarySuccess: ComponentStory< typeof IconButton > = () => ; -export const _IconButtonSecondarySuccessDisabled: ComponentStory< - typeof IconButton -> = () => ; export const _IconButtonWarning: ComponentStory = () => ( ); -export const _IconButtonWarningDisabled: ComponentStory< - typeof IconButton -> = () => ; export const _IconButtonSecondaryWarning: ComponentStory< typeof IconButton > = () => ; -export const _IconButtonSecondaryWarningDisabled: ComponentStory< - typeof IconButton -> = () => ; export const _IconButtonDanger: ComponentStory = () => ( ); -export const _IconButtonDangerDisabled: ComponentStory< - typeof IconButton -> = () => ; export const _IconButtonSecondaryDanger: ComponentStory< typeof IconButton > = () => ; -export const _IconButtonSecondaryDangerDisabled: ComponentStory< - typeof IconButton -> = () => ; diff --git a/packages/fuselage/src/components/Button/IconButton.tsx b/packages/fuselage/src/components/Button/IconButton.tsx index 5657c7866f..1bf2d7fb67 100644 --- a/packages/fuselage/src/components/Button/IconButton.tsx +++ b/packages/fuselage/src/components/Button/IconButton.tsx @@ -5,9 +5,10 @@ import Box from '../Box'; import { Icon } from '../Icon'; type ButtonSize = { - mini?: boolean; - tiny?: boolean; + medium?: boolean; small?: boolean; + tiny?: boolean; + mini?: boolean; }; type IconButtonProps = { @@ -18,10 +19,26 @@ type IconButtonProps = { danger?: boolean; warning?: boolean; success?: boolean; + pressed?: boolean; } & ButtonSize & ComponentProps; -const getSize = ({ mini }: ButtonSize) => (mini ? 'x16' : 'x20'); +const getVariantClass = (variant: string) => { + if (variant) { + const variantClass = [ + `rcx-button--icon-${[variant].filter(Boolean).join('-')}`, + ]; + return variantClass; + } + return ['']; +}; + +const getPressedClass = (variant: string) => { + const variantClass = [ + `rcx-button--icon-${[variant].filter(Boolean).join('-')}-pressed`, + ]; + return variantClass; +}; export const IconButton = forwardRef( ( @@ -33,33 +50,65 @@ export const IconButton = forwardRef( danger, warning, success, - small, - tiny, mini, + tiny, + small, + medium, + pressed, ...props }: IconButtonProps, ref: Ref ) => { - const kindAndVariantProps = useMemo(() => { - const variant = - (secondary && info && 'secondary-info') || + const variant = useMemo( + () => (secondary && danger && 'secondary-danger') || (secondary && warning && 'secondary-warning') || (secondary && success && 'secondary-success') || - ((primary || info) && 'info') || + (secondary && info && 'secondary-info') || + (info && 'info') || (success && 'success') || (warning && 'warning') || (danger && 'danger') || - (secondary && 'secondary'); + (primary && 'secondary-info') || + (secondary && 'secondary') || + '', + [danger, info, primary, secondary, success, warning] + ); + const kindAndVariantProps = useMemo(() => { + const variantProp = {} as any; if (variant) { - return { - [`rcx-button--icon-${[variant].filter(Boolean).join('-')}`]: true, - }; + variantProp[`${getVariantClass(variant)}`] = true; + } + if (pressed) { + variantProp[`${getPressedClass(variant)}`] = true; } + return variantProp; + }, [variant, pressed]); - return {}; - }, [primary, info, secondary, danger, warning, success]); + const size = useMemo( + () => + (mini && 'mini') || + (tiny && 'tiny') || + (small && 'small') || + (medium && 'medium'), + [medium, mini, small, tiny] + ); + + const getSizeClass = () => ({ [`rcx-button--${size}-square`]: true }); + + const getIconSize = () => { + if (mini) { + return 'x16'; + } + if (small || tiny) { + return 'x18'; + } + if (medium) { + return 'x20'; + } + return 'x24'; + }; return ( @@ -80,7 +128,7 @@ export const IconButton = forwardRef( ) : ( ['name']} - size={getSize({ mini })} + size={getIconSize()} /> )} diff --git a/packages/fuselage/src/styles/mixins/states.scss b/packages/fuselage/src/styles/mixins/states.scss index 555f8ef25c..dbc8e9c86a 100644 --- a/packages/fuselage/src/styles/mixins/states.scss +++ b/packages/fuselage/src/styles/mixins/states.scss @@ -58,3 +58,9 @@ @content; } } + +@mixin on-pressed { + &-pressed { + @content; + } +} diff --git a/packages/fuselage/src/styles/primitives/button.scss b/packages/fuselage/src/styles/primitives/button.scss index 4bcd9dad1e..8df4c316e9 100644 --- a/packages/fuselage/src/styles/primitives/button.scss +++ b/packages/fuselage/src/styles/primitives/button.scss @@ -34,6 +34,11 @@ @include use-no-shadow; } + @include on-pressed { + color: map.get($colors, pressed-color); + border-color: map.get($colors, pressed-border-color); + background-color: map.get($colors, pressed-background-color); + } @include on-disabled { color: map.get($colors, disabled-color); border-color: map.get($colors, disabled-border-color); diff --git a/packages/fuselage/src/styles/variables/buttons.scss b/packages/fuselage/src/styles/variables/buttons.scss index b7a76f2178..a3269518de 100644 --- a/packages/fuselage/src/styles/variables/buttons.scss +++ b/packages/fuselage/src/styles/variables/buttons.scss @@ -169,6 +169,9 @@ $icon: ( disabled-background-color: -color('icon', 'disabled-background-color', transparent), disabled-border-color: -color('icon', 'disabled-border-color', transparent), disabled-color: -color('icon', 'disabled-color', map.get($secondary, disabled-color)), + pressed-background-color: -color('icon', 'pressed-background-color', transparent), + pressed-border-color: -color('icon', 'pressed-border-color', map.get($secondary, color)), + pressed-color: -color('icon', 'pressed-color', map.get($secondary, color)), ); $icon-info: ( @@ -184,7 +187,10 @@ $icon-info: ( focus-shadow-color: -color('icon-info', 'focus-shadow-color', map.get($secondary, focus-shadow-color)), disabled-background-color: -color('icon', 'disabled-background-color', transparent), disabled-border-color: -color('icon', 'disabled-border-color', transparent), - disabled-color: -color('icon-info', 'disabled-color', map.get($secondary, disabled-color)), + disabled-color: -color('icon-info', 'disabled-color', map.get($primary, disabled-background-color)), + pressed-background-color: -color('icon', 'pressed-background-color', transparent), + pressed-border-color: -color('icon', 'pressed-border-color', colors.status-font(on-info)), + pressed-color: -color('icon', 'pressed-color', colors.status-font(on-info)), ); $icon-success: ( @@ -200,7 +206,10 @@ $icon-success: ( focus-shadow-color: -color('icon-success', 'focus-shadow-color', map.get($secondary, focus-shadow-color)), disabled-background-color: -color('icon', 'disabled-background-color', transparent), disabled-border-color: -color('icon', 'disabled-border-color', transparent), - disabled-color: -color('icon-success', 'disabled-color', map.get($secondary, disabled-color)), + disabled-color: -color('icon-success', 'disabled-color', map.get($success, disabled-background-color)), + pressed-background-color: -color('icon', 'pressed-background-color', transparent), + pressed-border-color: -color('icon', 'pressed-border-color', colors.status-font(on-success)), + pressed-color: -color('icon', 'pressed-color', colors.status-font(on-success)), ); $icon-warning: ( @@ -216,7 +225,10 @@ $icon-warning: ( focus-shadow-color: -color('icon-warning', 'focus-shadow-color', map.get($secondary, focus-shadow-color)), disabled-background-color: -color('icon', 'disabled-background-color', transparent), disabled-border-color: -color('icon', 'disabled-border-color', transparent), - disabled-color: -color('icon-warning', 'disabled-color', map.get($secondary, disabled-color)), + disabled-color: -color('icon-warning', 'disabled-color', map.get($warning, disabled-background-color)), + pressed-background-color: -color('icon', 'pressed-background-color', transparent), + pressed-border-color: -color('icon', 'pressed-border-color', colors.status-font(on-warning)), + pressed-color: -color('icon', 'pressed-color', colors.status-font(on-warning)), ); $icon-danger: ( @@ -232,5 +244,8 @@ $icon-danger: ( focus-shadow-color: -color('icon-danger', 'focus-shadow-color', map.get($secondary, focus-shadow-color)), disabled-background-color: -color('icon', 'disabled-background-color', transparent), disabled-border-color: -color('icon', 'disabled-border-color', transparent), - disabled-color: -color('icon-danger', 'disabled-color', map.get($secondary, disabled-color)), + disabled-color: -color('icon-danger', 'disabled-color', map.get($danger, disabled-background-color)), + pressed-background-color: -color('icon', 'pressed-background-color', transparent), + pressed-border-color: -color('icon', 'pressed-border-color', colors.status-font(on-danger)), + pressed-color: -color('icon', 'pressed-color', colors.status-font(on-danger)), ); From c41a0222775477288202da29315d19138de5d2e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlia=20Jaeger=20Foresti?= <60678893+juliajforesti@users.noreply.github.com> Date: Mon, 24 Apr 2023 14:37:52 -0300 Subject: [PATCH 013/103] fix(fuselage): sidebar header alignment (#1031) Co-authored-by: Douglas Fabris --- packages/fuselage/src/components/Sidebar/Sidebar.styles.scss | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/fuselage/src/components/Sidebar/Sidebar.styles.scss b/packages/fuselage/src/components/Sidebar/Sidebar.styles.scss index 2370e91a02..d29edf941d 100644 --- a/packages/fuselage/src/components/Sidebar/Sidebar.styles.scss +++ b/packages/fuselage/src/components/Sidebar/Sidebar.styles.scss @@ -178,10 +178,6 @@ $sidebar-banner-color-danger: theme( color: $sidebar-item-color; - &--section { - padding-block-start: lengths.padding(4); - } - &--toolbox { height: $sidebar-section-height; } From 031c4a559e9d849f1b219a8f3e486bee4348d95d Mon Sep 17 00:00:00 2001 From: Douglas Fabris Date: Mon, 24 Apr 2023 14:44:30 -0300 Subject: [PATCH 014/103] feat(fuselage): `ToastBar` visual improvements (#1025) --- .../components/ToastBar/ToastBar.stories.tsx | 23 +--- .../components/ToastBar/ToastBar.styles.scss | 122 ++++++++++++------ .../src/components/ToastBar/ToastBar.tsx | 26 ++-- packages/fuselage/src/styles/lengths.scss | 3 +- 4 files changed, 98 insertions(+), 76 deletions(-) diff --git a/packages/fuselage/src/components/ToastBar/ToastBar.stories.tsx b/packages/fuselage/src/components/ToastBar/ToastBar.stories.tsx index 38e1d21620..5de35b8734 100644 --- a/packages/fuselage/src/components/ToastBar/ToastBar.stories.tsx +++ b/packages/fuselage/src/components/ToastBar/ToastBar.stories.tsx @@ -56,27 +56,12 @@ Error.args = { variant: 'error', }; -export const Small = Template.bind({}); -Small.args = { - children: 'Lorem ipsum dolor sit amet', -}; - -export const SuccessWithCloseButton = Template.bind({}); -SuccessWithCloseButton.args = { - children: 'Lorem ipsum dolor sit amet', - variant: 'success', +export const WithCloseButton = Template.bind({}); +WithCloseButton.args = { onClose: action('clicked'), }; -export const ErrorWithCloseButton = Template.bind({}); -ErrorWithCloseButton.args = { +export const TinyText = Template.bind({}); +TinyText.args = { children: 'Lorem ipsum dolor sit amet', - variant: 'error', - onClose: action('clicked'), -}; - -export const DefaultWithCloseButton = Template.bind({}); -DefaultWithCloseButton.args = { - children: 'Lorem ipsum dolor sit amet', - onClose: action('clicked'), }; diff --git a/packages/fuselage/src/components/ToastBar/ToastBar.styles.scss b/packages/fuselage/src/components/ToastBar/ToastBar.styles.scss index c2fc8a8327..b4c00461d4 100644 --- a/packages/fuselage/src/components/ToastBar/ToastBar.styles.scss +++ b/packages/fuselage/src/components/ToastBar/ToastBar.styles.scss @@ -2,74 +2,114 @@ @use '../../styles/lengths.scss'; @use '../../styles/typography.scss'; +$toastbar-color: theme('toastbar-color', colors.font(default)); + +$toastbar-border-radius: theme( + 'toastbar-border-radius', + lengths.border-radius(medium) +); + +$toastbar-success-color: theme( + 'toastbar-success-color', + colors.status-font(on-success) +); + +$toastbar-error-color: theme( + 'toastbar-error-color', + colors.status-font(on-danger) +); + +$toastbar-background-color: theme( + 'toastbar-background-color', + colors.surface(tint) +); + +$toastbar-progressbar-background-color: theme( + 'toastbar-progressbar-background-color', + colors.surface(neutral) +); + .rcx-toastbar { position: relative; min-width: lengths.size(232); max-width: lengths.size(416); - border-radius: theme('toastbar-border-radius', lengths.border-radius(medium)); + color: $toastbar-color; + + border-radius: $toastbar-border-radius; + + background-color: $toastbar-background-color; @include typography.use-font-scale(p2); - &--info { - background-color: theme( - 'toastbar-info-background-color', - colors.surface(neutral) - ); + &::before { + position: absolute; + top: 0; + + display: block; + + width: 100%; + height: lengths.size(4); + + content: ''; + + border-radius: $toastbar-border-radius $toastbar-border-radius 0 0; + background-color: transparent; } &--success { - color: theme('toastbar-success-color', colors.status-font(on-success)); - background-color: theme( - 'toastbar-success-background-color', - colors.status-background(success) - ); + &::before { + background-color: $toastbar-success-color; + } } &--error { - color: theme('toastbar-error-color', colors.font(danger)); - background-color: theme( - 'toastbar-error-background-color', - colors.status-background(danger) - ); + &::before { + background-color: $toastbar-error-color; + } } -} -.rcx-toastbar-inner { - display: flex; + &_inner { + display: flex; - padding: lengths.padding(16); -} + padding: lengths.padding(16); + } -.rcx-toastbar-content { - width: lengths.size(full); - margin: lengths.margin(0) lengths.margin(16); -} + &_content { + width: lengths.size(full); + margin: lengths.margin(0) lengths.margin(16); + } -$toastbar-border-radius: theme( - 'toastbar-progressbar-border-radius', - lengths.border-radius(medium) -); + &_icon { + &--success { + color: $toastbar-success-color; + } -.rcx-toastbar-progressbar { - position: absolute; - bottom: 0; + &--error { + color: $toastbar-error-color; + } + } - overflow: hidden; + &_progressbar { + position: absolute; + bottom: 0; - width: 100%; - height: lengths.size(4); + overflow: hidden; - border-radius: 0 0 $toastbar-border-radius $toastbar-border-radius; + width: 100%; + height: lengths.size(4); - &::after { - display: block; + border-radius: 0 0 $toastbar-border-radius $toastbar-border-radius; - height: 100%; + &::after { + display: block; - content: ''; + height: 100%; + + content: ''; - background-color: colors.surface-neutral-alpha(10); + background-color: $toastbar-progressbar-background-color; + } } } diff --git a/packages/fuselage/src/components/ToastBar/ToastBar.tsx b/packages/fuselage/src/components/ToastBar/ToastBar.tsx index 44670ff18c..65951f7d99 100644 --- a/packages/fuselage/src/components/ToastBar/ToastBar.tsx +++ b/packages/fuselage/src/components/ToastBar/ToastBar.tsx @@ -25,8 +25,8 @@ export function ToastBar({ onClose, }: ToastBarProps) { const iconName = - (variant === 'success' && 'check') || - (variant === 'error' && 'warning') || + (variant === 'success' && 'circle-check') || + (variant === 'error' && 'ban') || 'info'; const sideOpen = keyframes` @@ -73,26 +73,22 @@ export function ToastBar({ elevation='2nb' borderRadius='x4' > -
- -
+
+ +
{children}
{onClose && (
- onClose(toastId)} - icon='cross' - /> + onClose(toastId)} icon='cross' />
)}
- + ); diff --git a/packages/fuselage/src/styles/lengths.scss b/packages/fuselage/src/styles/lengths.scss index d3e14388e4..3d5bf11c23 100644 --- a/packages/fuselage/src/styles/lengths.scss +++ b/packages/fuselage/src/styles/lengths.scss @@ -65,6 +65,7 @@ $border-width-sizes: ( 'default': 1, 'medium': 2, + 'large': 4, ); @function border-width($value, $scape: px) { @@ -78,7 +79,7 @@ $border-width-sizes: ( } @return functions.to-rem(map.get($border-width-sizes, $value)); } @else { - @error 'value must be none, default, medium, 1, 2, or 4'; + @error 'value must be none, default, medium, large, 1, 2, or 4'; } } From 9162f3dbf2e7faa2c1e170d0aade8b8f1988d367 Mon Sep 17 00:00:00 2001 From: Douglas Fabris Date: Tue, 25 Apr 2023 12:10:15 -0300 Subject: [PATCH 015/103] chore(fuselage): Remove fit-content width from `Tag` (#1036) --- packages/fuselage/src/components/Tag/Tag.styles.scss | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/fuselage/src/components/Tag/Tag.styles.scss b/packages/fuselage/src/components/Tag/Tag.styles.scss index 3134f035e7..8f46aaf7d7 100644 --- a/packages/fuselage/src/components/Tag/Tag.styles.scss +++ b/packages/fuselage/src/components/Tag/Tag.styles.scss @@ -112,8 +112,6 @@ $tag-colors-disabled-background-color: theme( justify-content: center; align-items: center; - width: fit-content; - padding: lengths.padding(2) lengths.padding(4); white-space: nowrap; From d94260eca090e852af89401d85bd08bda9f3fe8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlia=20Jaeger=20Foresti?= <60678893+juliajforesti@users.noreply.github.com> Date: Thu, 27 Apr 2023 15:00:13 -0300 Subject: [PATCH 016/103] fix(fuselage): message link color (#1038) Co-authored-by: Douglas Fabris --- .../fuselage/src/components/Message/Messages.styles.scss | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/fuselage/src/components/Message/Messages.styles.scss b/packages/fuselage/src/components/Message/Messages.styles.scss index db3e488015..c6cbdeac9d 100644 --- a/packages/fuselage/src/components/Message/Messages.styles.scss +++ b/packages/fuselage/src/components/Message/Messages.styles.scss @@ -50,6 +50,8 @@ $message-background-color-highlight: functions.theme( colors.status-background(warning-2) ); +$message-link-color: functions.theme('message-link-color', colors.font(info)); + .rcx-message { @include mixins.container(); position: relative; @@ -191,6 +193,10 @@ $message-background-color-highlight: functions.theme( color: colors.font(default); + & a { + color: $message-link-color; + } + & h1 { @include typography.use-font-scale(h1); } From 05c41c8120a423aceb719c9f723f6ef3f36ff2da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlia=20Jaeger=20Foresti?= <60678893+juliajforesti@users.noreply.github.com> Date: Fri, 28 Apr 2023 13:18:22 -0300 Subject: [PATCH 017/103] chore(fuselage): `Option` padding-right improve (#1037) Co-authored-by: Douglas Fabris --- .../src/components/Option/Option.styles.scss | 18 ++++++++++++++++-- .../src/components/Option/OptionInput.tsx | 12 ++++++++++++ .../fuselage/src/components/Option/index.tsx | 2 ++ 3 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 packages/fuselage/src/components/Option/OptionInput.tsx diff --git a/packages/fuselage/src/components/Option/Option.styles.scss b/packages/fuselage/src/components/Option/Option.styles.scss index 6bc80f1da5..22acdf8286 100644 --- a/packages/fuselage/src/components/Option/Option.styles.scss +++ b/packages/fuselage/src/components/Option/Option.styles.scss @@ -21,7 +21,9 @@ $variants: ( display: list-item; - padding: lengths.padding(4) lengths.padding(12); + padding-block: lengths.padding(4); + padding-inline-start: lengths.padding(12); + padding-inline-end: lengths.padding(24); list-style: none; @@ -32,7 +34,8 @@ $variants: ( padding-block-start: lengths.padding(8); padding-block-end: lengths.padding(4); - padding-inline: lengths.padding(12); + padding-inline-start: lengths.padding(12); + padding-inline-end: lengths.padding(24); color: colors.font(default); } @@ -94,6 +97,17 @@ $variants: ( min-height: lengths.size(20); } + .rcx-option__input { + display: flex; + + justify-content: center; + align-items: center; + + min-width: lengths.size(20); + min-height: lengths.size(20); + margin-inline-end: lengths.margin(-12); + } + .rcx-option__description { @include typography.use-font-scale(p2); @extend %column; diff --git a/packages/fuselage/src/components/Option/OptionInput.tsx b/packages/fuselage/src/components/Option/OptionInput.tsx new file mode 100644 index 0000000000..f4df80ad50 --- /dev/null +++ b/packages/fuselage/src/components/Option/OptionInput.tsx @@ -0,0 +1,12 @@ +import type { ReactNode } from 'react'; +import React from 'react'; + +type OptionInputProps = { + children?: ReactNode; +}; + +const OptionInput = (props: OptionInputProps) => ( +
+); + +export default OptionInput; diff --git a/packages/fuselage/src/components/Option/index.tsx b/packages/fuselage/src/components/Option/index.tsx index ecf8b8a437..9c29ca2015 100644 --- a/packages/fuselage/src/components/Option/index.tsx +++ b/packages/fuselage/src/components/Option/index.tsx @@ -6,6 +6,7 @@ import OptionDescription from './OptionDescription'; import OptionDivider from './OptionDivider'; import OptionHeader from './OptionHeader'; import OptionIcon from './OptionIcon'; +import OptionInput from './OptionInput'; import OptionMenu from './OptionMenu'; import OptionSkeleton from './OptionSkeleton'; import OptionTitle from './OptionTitle'; @@ -36,6 +37,7 @@ export { OptionContent }; export { OptionDescription }; export { OptionDivider }; export { OptionIcon }; +export { OptionInput }; export { OptionMenu }; export { OptionSkeleton }; export { OptionTitle }; From 9dcf01afbf9124e47eaf353bd1a6a0efee415fa9 Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo Date: Fri, 28 Apr 2023 15:59:05 -0300 Subject: [PATCH 018/103] fix(fuselage): multiple div being added with Position (#1039) Co-authored-by: Douglas Fabris --- .../fuselage/src/components/Position/Position.tsx | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/fuselage/src/components/Position/Position.tsx b/packages/fuselage/src/components/Position/Position.tsx index 69d91a82fd..5319646b86 100644 --- a/packages/fuselage/src/components/Position/Position.tsx +++ b/packages/fuselage/src/components/Position/Position.tsx @@ -6,7 +6,7 @@ import type { ReactPortal, ReactElement, } from 'react'; -import { useRef, useMemo, useEffect, cloneElement } from 'react'; +import { useRef, useMemo, useEffect, cloneElement, useState } from 'react'; import { createPortal } from 'react-dom'; import type Box from '../Box'; @@ -38,11 +38,18 @@ const Position = ({ () => ({ position: 'fixed', ...positionStyle }), [positionStyle] ); - const portalContainer = useMemo(() => { + const [portalContainer] = useState(() => { + const prev = document.getElementById('position-container'); + if (prev) { + return prev; + } const element = document.createElement('div'); + + element.id = 'position-container'; + document.body.appendChild(element); return element; - }, []); + }); useEffect( () => From 222c5b3a4a91ea74cd9eb3d05304c22f8ffaddec Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo Date: Sat, 29 Apr 2023 02:20:34 -0300 Subject: [PATCH 019/103] Update Position.tsx --- packages/fuselage/src/components/Position/Position.tsx | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/packages/fuselage/src/components/Position/Position.tsx b/packages/fuselage/src/components/Position/Position.tsx index 5319646b86..8be0262c76 100644 --- a/packages/fuselage/src/components/Position/Position.tsx +++ b/packages/fuselage/src/components/Position/Position.tsx @@ -6,7 +6,7 @@ import type { ReactPortal, ReactElement, } from 'react'; -import { useRef, useMemo, useEffect, cloneElement, useState } from 'react'; +import { useRef, useMemo, cloneElement, useState } from 'react'; import { createPortal } from 'react-dom'; import type Box from '../Box'; @@ -51,14 +51,6 @@ const Position = ({ return element; }); - useEffect( - () => - function () { - document.body.removeChild(portalContainer); - }, - [portalContainer] - ); - return createPortal( cloneElement(children, { ref: target, From a10a0783d86b22d9dc59ca3e1855f1e0fd1a74a7 Mon Sep 17 00:00:00 2001 From: Douglas Fabris Date: Wed, 3 May 2023 14:57:45 -0300 Subject: [PATCH 020/103] chore(icons): Add new icons (#1043) --- packages/icons/glyphsMapping.json | 18 ++++++++++++++++++ packages/icons/src/airplane.svg | 5 +++++ packages/icons/src/burger-menu.svg | 5 +++++ packages/icons/src/burger.svg | 6 +++--- packages/icons/src/lamp-bulb.svg | 5 +++++ packages/icons/src/leaf.svg | 5 +++++ packages/icons/src/percentage.svg | 11 +++++++++++ packages/icons/src/rocket.svg | 8 ++++++++ .../src/Components/DropDown/ItemsIcon.tsx | 4 +++- 9 files changed, 63 insertions(+), 4 deletions(-) create mode 100644 packages/icons/src/airplane.svg create mode 100644 packages/icons/src/burger-menu.svg create mode 100644 packages/icons/src/lamp-bulb.svg create mode 100644 packages/icons/src/leaf.svg create mode 100644 packages/icons/src/percentage.svg create mode 100644 packages/icons/src/rocket.svg diff --git a/packages/icons/glyphsMapping.json b/packages/icons/glyphsMapping.json index 6cf5c536a4..67aa4328eb 100644 --- a/packages/icons/glyphsMapping.json +++ b/packages/icons/glyphsMapping.json @@ -910,5 +910,23 @@ }, "desktop-text": { "start": "\ue125" + }, + "rocket": { + "start": "\ue127" + }, + "burger-menu": { + "start": "\ue129" + }, + "airplane": { + "start": "\ue12b" + }, + "lamp-bulb": { + "start": "\ue12d" + }, + "percentage": { + "start": "\ue12f" + }, + "leaf": { + "start": "\ue131" } } diff --git a/packages/icons/src/airplane.svg b/packages/icons/src/airplane.svg new file mode 100644 index 0000000000..afdd92d974 --- /dev/null +++ b/packages/icons/src/airplane.svg @@ -0,0 +1,5 @@ + + + diff --git a/packages/icons/src/burger-menu.svg b/packages/icons/src/burger-menu.svg new file mode 100644 index 0000000000..833278ea1f --- /dev/null +++ b/packages/icons/src/burger-menu.svg @@ -0,0 +1,5 @@ + + + diff --git a/packages/icons/src/burger.svg b/packages/icons/src/burger.svg index 06fb57765c..8ee108701f 100644 --- a/packages/icons/src/burger.svg +++ b/packages/icons/src/burger.svg @@ -1,6 +1,6 @@ - + + diff --git a/packages/icons/src/lamp-bulb.svg b/packages/icons/src/lamp-bulb.svg new file mode 100644 index 0000000000..45ebaa1144 --- /dev/null +++ b/packages/icons/src/lamp-bulb.svg @@ -0,0 +1,5 @@ + + + diff --git a/packages/icons/src/leaf.svg b/packages/icons/src/leaf.svg new file mode 100644 index 0000000000..e9565a7f82 --- /dev/null +++ b/packages/icons/src/leaf.svg @@ -0,0 +1,5 @@ + + + diff --git a/packages/icons/src/percentage.svg b/packages/icons/src/percentage.svg new file mode 100644 index 0000000000..82627c0d97 --- /dev/null +++ b/packages/icons/src/percentage.svg @@ -0,0 +1,11 @@ + + + + + diff --git a/packages/icons/src/rocket.svg b/packages/icons/src/rocket.svg new file mode 100644 index 0000000000..326fbf39b5 --- /dev/null +++ b/packages/icons/src/rocket.svg @@ -0,0 +1,8 @@ + + + + diff --git a/packages/uikit-playground/src/Components/DropDown/ItemsIcon.tsx b/packages/uikit-playground/src/Components/DropDown/ItemsIcon.tsx index 39d305292e..2a4530f716 100644 --- a/packages/uikit-playground/src/Components/DropDown/ItemsIcon.tsx +++ b/packages/uikit-playground/src/Components/DropDown/ItemsIcon.tsx @@ -19,7 +19,9 @@ const ItemsIcon = ({ if (lastNode) { return ; } - return ; + return ( + + ); }; return <>{selectIcon(layer, hover)}; }; From b5f270d0d8d1cf440ba30786c52b1e834faf2cbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlia=20Jaeger=20Foresti?= <60678893+juliajforesti@users.noreply.github.com> Date: Thu, 4 May 2023 12:15:44 -0300 Subject: [PATCH 021/103] fix(fuselage): change `$message-divider-color-unread` (#1042) Co-authored-by: Douglas Fabris --- .../Message/MessageDivider/MessageDivider.styles.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/fuselage/src/components/Message/MessageDivider/MessageDivider.styles.scss b/packages/fuselage/src/components/Message/MessageDivider/MessageDivider.styles.scss index edcf71a340..be469ea87a 100644 --- a/packages/fuselage/src/components/Message/MessageDivider/MessageDivider.styles.scss +++ b/packages/fuselage/src/components/Message/MessageDivider/MessageDivider.styles.scss @@ -15,11 +15,11 @@ $message-divider-color: theme('message-divider-color', colors.font(default)); $message-divider-color-unread: theme( 'message-divider-color-unread', - colors.stroke(error) + colors.font(danger) ); $message-divider-background-color-unread: theme( 'message-divider-background-color-unread', - colors.stroke(extra-light-error) + colors.stroke(error) ); $message-divider-size: theme( From 5c6ea919d2f79f604c02d7e35d3d61ba69a45402 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlia=20Jaeger=20Foresti?= <60678893+juliajforesti@users.noreply.github.com> Date: Thu, 4 May 2023 17:37:55 -0300 Subject: [PATCH 022/103] chore(fuselage): status-bullet colors (#1040) --- .../src/usePosition/getPositionStyle.ts | 0 packages/fuselage-tokens/colors.js | 3 ++ packages/fuselage-tokens/colors.json | 3 ++ packages/fuselage-tokens/colors.mjs | 3 ++ packages/fuselage-tokens/colors.scss | 3 ++ packages/fuselage-tokens/src/colors.jsonc | 3 ++ packages/fuselage-tokens/src/colors/base.json | 3 ++ .../StatusBullet/StatusBullet.styles.scss | 42 +++++-------------- .../components/StatusBullet/StatusBullet.tsx | 40 ++++++++++-------- .../components/StatusBullet/icons/Away.tsx | 24 +++++++++++ .../components/StatusBullet/icons/Busy.tsx | 24 +++++++++++ .../StatusBullet/icons/Disabled.tsx | 24 +++++++++++ .../components/StatusBullet/icons/Loading.tsx | 28 +++++++++++++ .../components/StatusBullet/icons/Offline.tsx | 27 ++++++++++++ .../components/StatusBullet/icons/Online.tsx | 20 +++++++++ .../components/StatusBullet/icons/away.svg | 14 ------- .../components/StatusBullet/icons/busy.svg | 14 ------- .../StatusBullet/icons/disabled.svg | 14 ------- .../components/StatusBullet/icons/loading.svg | 16 ------- .../components/StatusBullet/icons/offline.svg | 9 ---- packages/fuselage/src/styles/colors.scss | 14 +++++++ 21 files changed, 212 insertions(+), 116 deletions(-) delete mode 100644 packages/fuselage-hooks/src/usePosition/getPositionStyle.ts create mode 100644 packages/fuselage/src/components/StatusBullet/icons/Away.tsx create mode 100644 packages/fuselage/src/components/StatusBullet/icons/Busy.tsx create mode 100644 packages/fuselage/src/components/StatusBullet/icons/Disabled.tsx create mode 100644 packages/fuselage/src/components/StatusBullet/icons/Loading.tsx create mode 100644 packages/fuselage/src/components/StatusBullet/icons/Offline.tsx create mode 100644 packages/fuselage/src/components/StatusBullet/icons/Online.tsx delete mode 100644 packages/fuselage/src/components/StatusBullet/icons/away.svg delete mode 100644 packages/fuselage/src/components/StatusBullet/icons/busy.svg delete mode 100644 packages/fuselage/src/components/StatusBullet/icons/disabled.svg delete mode 100644 packages/fuselage/src/components/StatusBullet/icons/loading.svg delete mode 100644 packages/fuselage/src/components/StatusBullet/icons/offline.svg diff --git a/packages/fuselage-hooks/src/usePosition/getPositionStyle.ts b/packages/fuselage-hooks/src/usePosition/getPositionStyle.ts deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/packages/fuselage-tokens/colors.js b/packages/fuselage-tokens/colors.js index 580e505cba..dc2cb5b145 100644 --- a/packages/fuselage-tokens/colors.js +++ b/packages/fuselage-tokens/colors.js @@ -8,6 +8,7 @@ module.exports = { 'd500': '#EC0D2A', 'd550': '#F5455C', 'd600': '#D40C26', + 'd650': '#DA1F37', 'd700': '#BB0B21', 'd800': '#9B1325', 'd900': '#8B0719', @@ -48,6 +49,7 @@ module.exports = { 's400': '#6CE9C0', 's500': '#2DE0A5', 's600': '#1ECB92', + 's650': '#158D65', 's700': '#19AC7C', 's800': '#148660', 's900': '#106D4F', @@ -76,6 +78,7 @@ module.exports = { 'w400': '#FFD95A', 'w500': '#FFD031', 'w600': '#F3BE08', + 'w650': '#AC892F', 'w700': '#DFAC00', 'w800': '#B68D00', 'w900': '#8E6300', diff --git a/packages/fuselage-tokens/colors.json b/packages/fuselage-tokens/colors.json index b4a3228118..5a12551d26 100644 --- a/packages/fuselage-tokens/colors.json +++ b/packages/fuselage-tokens/colors.json @@ -6,6 +6,7 @@ "d500": "#EC0D2A", "d550": "#F5455C", "d600": "#D40C26", + "d650": "#DA1F37", "d700": "#BB0B21", "d800": "#9B1325", "d900": "#8B0719", @@ -46,6 +47,7 @@ "s400": "#6CE9C0", "s500": "#2DE0A5", "s600": "#1ECB92", + "s650": "#158D65", "s700": "#19AC7C", "s800": "#148660", "s900": "#106D4F", @@ -74,6 +76,7 @@ "w400": "#FFD95A", "w500": "#FFD031", "w600": "#F3BE08", + "w650": "#AC892F", "w700": "#DFAC00", "w800": "#B68D00", "w900": "#8E6300", diff --git a/packages/fuselage-tokens/colors.mjs b/packages/fuselage-tokens/colors.mjs index 59a330103b..8b3ef0ee08 100644 --- a/packages/fuselage-tokens/colors.mjs +++ b/packages/fuselage-tokens/colors.mjs @@ -6,6 +6,7 @@ export default { 'd500': '#EC0D2A', 'd550': '#F5455C', 'd600': '#D40C26', + 'd650': '#DA1F37', 'd700': '#BB0B21', 'd800': '#9B1325', 'd900': '#8B0719', @@ -46,6 +47,7 @@ export default { 's400': '#6CE9C0', 's500': '#2DE0A5', 's600': '#1ECB92', + 's650': '#158D65', 's700': '#19AC7C', 's800': '#148660', 's900': '#106D4F', @@ -74,6 +76,7 @@ export default { 'w400': '#FFD95A', 'w500': '#FFD031', 'w600': '#F3BE08', + 'w650': '#AC892F', 'w700': '#DFAC00', 'w800': '#B68D00', 'w900': '#8E6300', diff --git a/packages/fuselage-tokens/colors.scss b/packages/fuselage-tokens/colors.scss index 1fce9428e1..3eb1b52efa 100644 --- a/packages/fuselage-tokens/colors.scss +++ b/packages/fuselage-tokens/colors.scss @@ -6,6 +6,7 @@ $colors: ( d500: #ec0d2a, d550: #f5455c, d600: #d40c26, + d650: #da1f37, d700: #bb0b21, d800: #9b1325, d900: #8b0719, @@ -46,6 +47,7 @@ $colors: ( s400: #6ce9c0, s500: #2de0a5, s600: #1ecb92, + s650: #158d65, s700: #19ac7c, s800: #148660, s900: #106d4f, @@ -74,6 +76,7 @@ $colors: ( w400: #ffd95a, w500: #ffd031, w600: #f3be08, + w650: #ac892f, w700: #dfac00, w800: #b68d00, w900: #8e6300, diff --git a/packages/fuselage-tokens/src/colors.jsonc b/packages/fuselage-tokens/src/colors.jsonc index b4a3228118..5a12551d26 100644 --- a/packages/fuselage-tokens/src/colors.jsonc +++ b/packages/fuselage-tokens/src/colors.jsonc @@ -6,6 +6,7 @@ "d500": "#EC0D2A", "d550": "#F5455C", "d600": "#D40C26", + "d650": "#DA1F37", "d700": "#BB0B21", "d800": "#9B1325", "d900": "#8B0719", @@ -46,6 +47,7 @@ "s400": "#6CE9C0", "s500": "#2DE0A5", "s600": "#1ECB92", + "s650": "#158D65", "s700": "#19AC7C", "s800": "#148660", "s900": "#106D4F", @@ -74,6 +76,7 @@ "w400": "#FFD95A", "w500": "#FFD031", "w600": "#F3BE08", + "w650": "#AC892F", "w700": "#DFAC00", "w800": "#B68D00", "w900": "#8E6300", diff --git a/packages/fuselage-tokens/src/colors/base.json b/packages/fuselage-tokens/src/colors/base.json index 8f1191ac4f..aaf2626617 100644 --- a/packages/fuselage-tokens/src/colors/base.json +++ b/packages/fuselage-tokens/src/colors/base.json @@ -7,6 +7,7 @@ "d500": { "value": "#EC0D2A", "group": "colors" }, "d550": { "value": "#F5455C", "group": "colors" }, "d600": { "value": "#D40C26", "group": "colors" }, + "d650": { "value": "#DA1F37", "group": "colors" }, "d700": { "value": "#BB0B21", "group": "colors" }, "d800": { "value": "#9B1325", "group": "colors" }, "d900": { "value": "#8B0719", "group": "colors" }, @@ -47,6 +48,7 @@ "s400": { "value": "#6CE9C0", "group": "colors" }, "s500": { "value": "#2DE0A5", "group": "colors" }, "s600": { "value": "#1ECB92", "group": "colors" }, + "s650": { "value": "#158D65", "group": "colors" }, "s700": { "value": "#19AC7C", "group": "colors" }, "s800": { "value": "#148660", "group": "colors" }, "s900": { "value": "#106D4F", "group": "colors" }, @@ -75,6 +77,7 @@ "w400": { "value": "#FFD95A", "group": "colors" }, "w500": { "value": "#FFD031", "group": "colors" }, "w600": { "value": "#F3BE08", "group": "colors" }, + "w650": { "value": "#AC892F", "group": "colors" }, "w700": { "value": "#DFAC00", "group": "colors" }, "w800": { "value": "#B68D00", "group": "colors" }, "w900": { "value": "#8E6300", "group": "colors" }, diff --git a/packages/fuselage/src/components/StatusBullet/StatusBullet.styles.scss b/packages/fuselage/src/components/StatusBullet/StatusBullet.styles.scss index 1c3fb321a3..61f50ce8aa 100644 --- a/packages/fuselage/src/components/StatusBullet/StatusBullet.styles.scss +++ b/packages/fuselage/src/components/StatusBullet/StatusBullet.styles.scss @@ -4,31 +4,6 @@ @use '../../styles/functions.scss'; @use '../../styles/mixins/size.scss'; -$status-bullet-online-background-color: functions.theme( - 'status-bullet-online-background-color', - colors.success(500) -); -$status-bullet-away-background: functions.theme( - 'status-bullet-away-background', - url('./icons/away.svg') top left / contain no-repeat -); -$status-bullet-busy-background: functions.theme( - 'status-bullet-busy-background', - url('./icons/busy.svg') top left / contain no-repeat -); -$status-bullet-offline-background: functions.theme( - 'status-bullet-offline-background', - url('./icons/offline.svg') top left / contain no-repeat -); -$status-bullet-loading-background: functions.theme( - 'status-bullet-loading-background', - url('./icons/loading.svg') top left / contain no-repeat -); -$status-bullet-disabled-background: functions.theme( - 'status-bullet-disabled-background', - url('./icons/disabled.svg') top left / contain no-repeat -); - .rcx-status-bullet { display: inline-block; @@ -37,7 +12,6 @@ $status-bullet-disabled-background: functions.theme( border-radius: lengths.border-radius(full); - background: $status-bullet-loading-background; background-size: contain; @include size.square(lengths.size(12)); @@ -47,22 +21,26 @@ $status-bullet-disabled-background: functions.theme( } &--online { - background: $status-bullet-online-background-color; + fill: colors.status-bullet(online); } &--away { - background: $status-bullet-away-background; + fill: colors.status-bullet(away); } &--busy { - background: $status-bullet-busy-background; + fill: colors.status-bullet(busy); + } + + &--disabled { + fill: colors.status-bullet(disabled); } &--offline { - background: $status-bullet-offline-background; + stroke: colors.status-bullet(offline); } - &--disabled { - background: $status-bullet-disabled-background; + &--loading { + stroke: colors.status-bullet(loading); } } diff --git a/packages/fuselage/src/components/StatusBullet/StatusBullet.tsx b/packages/fuselage/src/components/StatusBullet/StatusBullet.tsx index 784677124d..e4245a979d 100644 --- a/packages/fuselage/src/components/StatusBullet/StatusBullet.tsx +++ b/packages/fuselage/src/components/StatusBullet/StatusBullet.tsx @@ -3,28 +3,34 @@ import React from 'react'; import { useStyleSheet } from '../../hooks/useStyleSheet'; import styleSheet from './StatusBullet.styles.scss'; +import Away from './icons/Away'; +import Busy from './icons/Busy'; +import Disabled from './icons/Disabled'; +import Loading from './icons/Loading'; +import Offline from './icons/Offline'; +import Online from './icons/Online'; -type StatusBulletProps = { +export type StatusBulletProps = { status?: 'loading' | 'online' | 'busy' | 'away' | 'offline' | 'disabled'; size?: 'small' | 'large'; -} & Omit, 'size'>; +} & Omit, 'size'>; -const StatusBullet = ({ - status = 'loading', - size, - className = '', - ...props -}: StatusBulletProps) => { - useStyleSheet(); +const StatusBullet = ({ status = 'loading', ...props }: StatusBulletProps) => { useStyleSheet(styleSheet); - return ( - - ); + switch (status) { + case 'online': + return ; + case 'away': + return ; + case 'busy': + return ; + case 'disabled': + return ; + case 'offline': + return ; + default: + return ; + } }; export { StatusBullet }; diff --git a/packages/fuselage/src/components/StatusBullet/icons/Away.tsx b/packages/fuselage/src/components/StatusBullet/icons/Away.tsx new file mode 100644 index 0000000000..154df8174b --- /dev/null +++ b/packages/fuselage/src/components/StatusBullet/icons/Away.tsx @@ -0,0 +1,24 @@ +import React from 'react'; + +import type { StatusBulletProps } from '../StatusBullet'; + +const Away = ({ size, className, ...props }: StatusBulletProps) => ( + + + +); + +export default Away; diff --git a/packages/fuselage/src/components/StatusBullet/icons/Busy.tsx b/packages/fuselage/src/components/StatusBullet/icons/Busy.tsx new file mode 100644 index 0000000000..fcb9dc6977 --- /dev/null +++ b/packages/fuselage/src/components/StatusBullet/icons/Busy.tsx @@ -0,0 +1,24 @@ +import React from 'react'; + +import type { StatusBulletProps } from '../StatusBullet'; + +const Busy = ({ size, className, ...props }: StatusBulletProps) => ( + + + +); + +export default Busy; diff --git a/packages/fuselage/src/components/StatusBullet/icons/Disabled.tsx b/packages/fuselage/src/components/StatusBullet/icons/Disabled.tsx new file mode 100644 index 0000000000..61bc8565f4 --- /dev/null +++ b/packages/fuselage/src/components/StatusBullet/icons/Disabled.tsx @@ -0,0 +1,24 @@ +import React from 'react'; + +import type { StatusBulletProps } from '../StatusBullet'; + +const Disabled = ({ size, className, ...props }: StatusBulletProps) => ( + + + +); + +export default Disabled; diff --git a/packages/fuselage/src/components/StatusBullet/icons/Loading.tsx b/packages/fuselage/src/components/StatusBullet/icons/Loading.tsx new file mode 100644 index 0000000000..83d961fc0f --- /dev/null +++ b/packages/fuselage/src/components/StatusBullet/icons/Loading.tsx @@ -0,0 +1,28 @@ +import React from 'react'; + +import type { StatusBulletProps } from '../StatusBullet'; + +const Loading = ({ size, className, ...props }: StatusBulletProps) => ( + + + +); + +export default Loading; diff --git a/packages/fuselage/src/components/StatusBullet/icons/Offline.tsx b/packages/fuselage/src/components/StatusBullet/icons/Offline.tsx new file mode 100644 index 0000000000..e0eff430ad --- /dev/null +++ b/packages/fuselage/src/components/StatusBullet/icons/Offline.tsx @@ -0,0 +1,27 @@ +import React from 'react'; + +import type { StatusBulletProps } from '../StatusBullet'; + +const Offline = ({ size, className, ...props }: StatusBulletProps) => ( + + + +); + +export default Offline; diff --git a/packages/fuselage/src/components/StatusBullet/icons/Online.tsx b/packages/fuselage/src/components/StatusBullet/icons/Online.tsx new file mode 100644 index 0000000000..45121a0066 --- /dev/null +++ b/packages/fuselage/src/components/StatusBullet/icons/Online.tsx @@ -0,0 +1,20 @@ +import React from 'react'; + +import type { StatusBulletProps } from '../StatusBullet'; + +const Online = ({ size, className, ...props }: StatusBulletProps) => ( + + + +); + +export default Online; diff --git a/packages/fuselage/src/components/StatusBullet/icons/away.svg b/packages/fuselage/src/components/StatusBullet/icons/away.svg deleted file mode 100644 index 2cc8dceefb..0000000000 --- a/packages/fuselage/src/components/StatusBullet/icons/away.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - diff --git a/packages/fuselage/src/components/StatusBullet/icons/busy.svg b/packages/fuselage/src/components/StatusBullet/icons/busy.svg deleted file mode 100644 index ae86c825f0..0000000000 --- a/packages/fuselage/src/components/StatusBullet/icons/busy.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - diff --git a/packages/fuselage/src/components/StatusBullet/icons/disabled.svg b/packages/fuselage/src/components/StatusBullet/icons/disabled.svg deleted file mode 100644 index e6be47f227..0000000000 --- a/packages/fuselage/src/components/StatusBullet/icons/disabled.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - diff --git a/packages/fuselage/src/components/StatusBullet/icons/loading.svg b/packages/fuselage/src/components/StatusBullet/icons/loading.svg deleted file mode 100644 index 23b08de3fd..0000000000 --- a/packages/fuselage/src/components/StatusBullet/icons/loading.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - diff --git a/packages/fuselage/src/components/StatusBullet/icons/offline.svg b/packages/fuselage/src/components/StatusBullet/icons/offline.svg deleted file mode 100644 index fb7c66084a..0000000000 --- a/packages/fuselage/src/components/StatusBullet/icons/offline.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/packages/fuselage/src/styles/colors.scss b/packages/fuselage/src/styles/colors.scss index bc8375725b..3881c72fbc 100644 --- a/packages/fuselage/src/styles/colors.scss +++ b/packages/fuselage/src/styles/colors.scss @@ -134,6 +134,20 @@ $-font: ( @return var(--rcx-color-font-#{$type}, $color); } +$-status-bullet: ( + online: success(650), + away: warning(650), + busy: danger(650), + disabled: service-1(500), + offline: neutral(700), + loading: neutral(600), +); + +@function status-bullet($type) { + $color: map.get($-status-bullet, $type); + @return var(--rcx-color-status-bullet-#{$type}, $color); +} + $-status-backgrounds: ( success: success(200), warning: warning(200), From 6fbce69ae798e50027004a12c0043a5eeb60c143 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlia=20Jaeger=20Foresti?= <60678893+juliajforesti@users.noreply.github.com> Date: Fri, 5 May 2023 17:27:37 -0300 Subject: [PATCH 023/103] chore(fuselage): new `Slider` style (#1044) --- .../src/components/Slider/SliderThumb.tsx | 10 ++++--- .../src/components/Slider/SliderTrack.tsx | 27 ++++++++++--------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/packages/fuselage/src/components/Slider/SliderThumb.tsx b/packages/fuselage/src/components/Slider/SliderThumb.tsx index a44cb4006c..8cc5f10a8c 100644 --- a/packages/fuselage/src/components/Slider/SliderThumb.tsx +++ b/packages/fuselage/src/components/Slider/SliderThumb.tsx @@ -7,6 +7,7 @@ import { VisuallyHidden, } from 'react-aria'; +import { Palette } from '../../Theme'; import { useStyle } from '../../hooks/useStyle'; export const SliderThumb = (props: any) => { @@ -25,13 +26,14 @@ export const SliderThumb = (props: any) => { const thumb = useStyle( css` - width: 16px; - height: 16px; + width: 12px; + height: 12px; cursor: ${state.isDisabled ? 'not-allowed' : 'pointer'}; - border: 1px solid #095ad2; border-radius: 50%; - background: ${isFocusVisible || isDragging ? '#76B7FC' : '#156ff5'}; + background: ${isFocusVisible || isDragging + ? Palette.text['font-info'] + : Palette.stroke['stroke-highlight']}; ${state.orientation === 'horizontal' ? css` top: 50%; diff --git a/packages/fuselage/src/components/Slider/SliderTrack.tsx b/packages/fuselage/src/components/Slider/SliderTrack.tsx index 117b97f3b4..796cab2818 100644 --- a/packages/fuselage/src/components/Slider/SliderTrack.tsx +++ b/packages/fuselage/src/components/Slider/SliderTrack.tsx @@ -3,6 +3,7 @@ import type { DOMAttributes, MutableRefObject, ReactNode } from 'react'; import React, { useMemo } from 'react'; import type { SliderState } from 'react-stately'; +import { Palette } from '../../Theme'; import { useStyle } from '../../hooks/useStyle'; type SliderTrackProps = { @@ -13,6 +14,9 @@ type SliderTrackProps = { multiThumb?: boolean; }; +const highlight = Palette.stroke['stroke-highlight']; +const light = Palette.stroke['stroke-light']; + export const SliderTrack = ({ trackProps, trackRef, @@ -41,26 +45,26 @@ export const SliderTrack = ({ const getTrackGradient = () => { if (isHorizontal) { return multiThumb - ? `to right, transparent ${getThumbPosition( + ? `to right, ${light}} ${getThumbPosition( state.values[0] - )}%, #156ff5 0, #156ff5 ${getThumbPosition( + )}%, ${highlight} 0, ${highlight} ${getThumbPosition( state.values[1] - )}%, transparent 0` - : `to right, #156ff5 ${getThumbPosition( + )}%, ${light} 0` + : `to right, ${highlight} ${getThumbPosition( state.values[0] - )}%, transparent 0%`; + )}%, ${light} 0%`; } if (isVertical) { return multiThumb - ? `to top, transparent ${getThumbPosition( + ? `to top, ${light} ${getThumbPosition( state.values[0] - )}%, #156ff5 0, #156ff5 ${getThumbPosition( + )}%, ${highlight} 0, ${highlight} ${getThumbPosition( state.values[1] - )}%, transparent 0` - : `to top, #156ff5 ${getThumbPosition( + )}%, ${light} 0` + : `to top, ${highlight} ${getThumbPosition( state.values[0] - )}%, transparent 0%`; + )}%, ${light} 0%`; } return undefined; @@ -76,7 +80,6 @@ export const SliderTrack = ({ background: linear-gradient(${getTrackGradient()}); transform: translateX(-50%); border-radius: 1rem; - border: 1px solid #095ad2; } ${isHorizontal && css` @@ -85,7 +88,7 @@ export const SliderTrack = ({ &::before { top: 50%; width: 100%; - height: 8px; + height: 4px; transform: translateY(-50%); } `}; From 6bae1cfe2d3127ebb61c0820defb9672521e4f53 Mon Sep 17 00:00:00 2001 From: Tasso Evangelista Date: Fri, 5 May 2023 17:31:54 -0300 Subject: [PATCH 024/103] fix(mp3-encoder): Fork LAME implementation (#1032) --- .../eslint-config-alt/typescript/index.js | 2 +- packages/mp3-encoder/.eslintignore | 2 - packages/mp3-encoder/.eslintrc.js | 5 + packages/mp3-encoder/package.json | 11 +- packages/mp3-encoder/rollup.config.js | 25 +- packages/mp3-encoder/src/index.ts | 4 +- packages/mp3-encoder/src/lame/ABRPresets.ts | 436 +++ packages/mp3-encoder/src/lame/ATH.ts | 29 + packages/mp3-encoder/src/lame/BitStream.ts | 766 +++++ packages/mp3-encoder/src/lame/Bits.ts | 7 + .../src/lame/CBRNewIterationLoop.ts | 149 + .../mp3-encoder/src/lame/CalcNoiseData.ts | 11 + .../mp3-encoder/src/lame/CalcNoiseResult.ts | 13 + packages/mp3-encoder/src/lame/Encoder.ts | 351 +++ packages/mp3-encoder/src/lame/FFT.ts | 235 ++ packages/mp3-encoder/src/lame/GainAnalysis.ts | 577 ++++ packages/mp3-encoder/src/lame/GrInfo.ts | 105 + packages/mp3-encoder/src/lame/Header.ts | 7 + packages/mp3-encoder/src/lame/HuffCodeTab.ts | 9 + packages/mp3-encoder/src/lame/IIISideInfo.ts | 17 + .../mp3-encoder/src/lame/III_psy_ratio.ts | 7 + packages/mp3-encoder/src/lame/III_psy_xmin.ts | 17 + packages/mp3-encoder/src/lame/InOut.ts | 5 + packages/mp3-encoder/src/lame/Lame.ts | 1342 +++++++++ .../mp3-encoder/src/lame/LameGlobalFlags.ts | 80 + .../mp3-encoder/src/lame/LameInternalFlags.ts | 237 ++ packages/mp3-encoder/src/lame/MPEGMode.ts | 13 + packages/mp3-encoder/src/lame/MeanBits.ts | 3 + .../mp3-encoder/src/lame/Mp3Encoder.spec.ts | 102 + packages/mp3-encoder/src/lame/Mp3Encoder.ts | 57 + packages/mp3-encoder/src/lame/NewMDCT.ts | 1050 +++++++ packages/mp3-encoder/src/lame/NsPsy.ts | 17 + packages/mp3-encoder/src/lame/NumUsed.ts | 3 + packages/mp3-encoder/src/lame/PSY.ts | 11 + packages/mp3-encoder/src/lame/Presets.ts | 126 + packages/mp3-encoder/src/lame/PsyModel.ts | 2611 +++++++++++++++++ packages/mp3-encoder/src/lame/Quality.ts | 1 + packages/mp3-encoder/src/lame/Quantize.ts | 1013 +++++++ packages/mp3-encoder/src/lame/QuantizePVT.ts | 433 +++ packages/mp3-encoder/src/lame/ReplayGain.ts | 53 + packages/mp3-encoder/src/lame/Reservoir.ts | 102 + packages/mp3-encoder/src/lame/ScaleFac.ts | 58 + packages/mp3-encoder/src/lame/ShortBlock.ts | 6 + packages/mp3-encoder/src/lame/StartLine.ts | 3 + packages/mp3-encoder/src/lame/Tables.ts | 360 +++ packages/mp3-encoder/src/lame/Takehiro.ts | 1208 ++++++++ packages/mp3-encoder/src/lame/TotalBytes.ts | 3 + packages/mp3-encoder/src/lame/VBRPresets.ts | 451 +++ packages/mp3-encoder/src/lame/VBRTag.ts | 50 + packages/mp3-encoder/src/lame/VbrMode.ts | 8 + packages/mp3-encoder/src/lame/WavHeader.ts | 65 + packages/mp3-encoder/src/lame/arrays.ts | 69 + packages/mp3-encoder/src/lame/assert.ts | 8 + packages/mp3-encoder/src/lame/bitrates.ts | 88 + packages/mp3-encoder/src/lame/constants.ts | 65 + .../src/lame/getLameShortVersion.ts | 9 + packages/mp3-encoder/src/lame/index.ts | 1 + packages/mp3-encoder/src/lame/math.ts | 31 + packages/mp3-encoder/src/lame/sampleRates.ts | 23 + packages/mp3-encoder/src/lamejs.d.ts | 9 - packages/mp3-encoder/testdata/Left44100.wav | Bin 0 -> 661578 bytes packages/mp3-encoder/testdata/Right44100.wav | Bin 0 -> 661578 bytes packages/mp3-encoder/tsconfig.build.json | 4 + packages/mp3-encoder/tsconfig.json | 14 +- yarn.lock | 173 +- 65 files changed, 12692 insertions(+), 58 deletions(-) delete mode 100644 packages/mp3-encoder/.eslintignore create mode 100644 packages/mp3-encoder/src/lame/ABRPresets.ts create mode 100644 packages/mp3-encoder/src/lame/ATH.ts create mode 100644 packages/mp3-encoder/src/lame/BitStream.ts create mode 100644 packages/mp3-encoder/src/lame/Bits.ts create mode 100644 packages/mp3-encoder/src/lame/CBRNewIterationLoop.ts create mode 100644 packages/mp3-encoder/src/lame/CalcNoiseData.ts create mode 100644 packages/mp3-encoder/src/lame/CalcNoiseResult.ts create mode 100644 packages/mp3-encoder/src/lame/Encoder.ts create mode 100644 packages/mp3-encoder/src/lame/FFT.ts create mode 100644 packages/mp3-encoder/src/lame/GainAnalysis.ts create mode 100644 packages/mp3-encoder/src/lame/GrInfo.ts create mode 100644 packages/mp3-encoder/src/lame/Header.ts create mode 100644 packages/mp3-encoder/src/lame/HuffCodeTab.ts create mode 100644 packages/mp3-encoder/src/lame/IIISideInfo.ts create mode 100644 packages/mp3-encoder/src/lame/III_psy_ratio.ts create mode 100644 packages/mp3-encoder/src/lame/III_psy_xmin.ts create mode 100644 packages/mp3-encoder/src/lame/InOut.ts create mode 100644 packages/mp3-encoder/src/lame/Lame.ts create mode 100644 packages/mp3-encoder/src/lame/LameGlobalFlags.ts create mode 100644 packages/mp3-encoder/src/lame/LameInternalFlags.ts create mode 100644 packages/mp3-encoder/src/lame/MPEGMode.ts create mode 100644 packages/mp3-encoder/src/lame/MeanBits.ts create mode 100644 packages/mp3-encoder/src/lame/Mp3Encoder.spec.ts create mode 100644 packages/mp3-encoder/src/lame/Mp3Encoder.ts create mode 100644 packages/mp3-encoder/src/lame/NewMDCT.ts create mode 100644 packages/mp3-encoder/src/lame/NsPsy.ts create mode 100644 packages/mp3-encoder/src/lame/NumUsed.ts create mode 100644 packages/mp3-encoder/src/lame/PSY.ts create mode 100644 packages/mp3-encoder/src/lame/Presets.ts create mode 100644 packages/mp3-encoder/src/lame/PsyModel.ts create mode 100644 packages/mp3-encoder/src/lame/Quality.ts create mode 100644 packages/mp3-encoder/src/lame/Quantize.ts create mode 100644 packages/mp3-encoder/src/lame/QuantizePVT.ts create mode 100644 packages/mp3-encoder/src/lame/ReplayGain.ts create mode 100644 packages/mp3-encoder/src/lame/Reservoir.ts create mode 100644 packages/mp3-encoder/src/lame/ScaleFac.ts create mode 100644 packages/mp3-encoder/src/lame/ShortBlock.ts create mode 100644 packages/mp3-encoder/src/lame/StartLine.ts create mode 100644 packages/mp3-encoder/src/lame/Tables.ts create mode 100644 packages/mp3-encoder/src/lame/Takehiro.ts create mode 100644 packages/mp3-encoder/src/lame/TotalBytes.ts create mode 100644 packages/mp3-encoder/src/lame/VBRPresets.ts create mode 100644 packages/mp3-encoder/src/lame/VBRTag.ts create mode 100644 packages/mp3-encoder/src/lame/VbrMode.ts create mode 100644 packages/mp3-encoder/src/lame/WavHeader.ts create mode 100644 packages/mp3-encoder/src/lame/arrays.ts create mode 100644 packages/mp3-encoder/src/lame/assert.ts create mode 100644 packages/mp3-encoder/src/lame/bitrates.ts create mode 100644 packages/mp3-encoder/src/lame/constants.ts create mode 100644 packages/mp3-encoder/src/lame/getLameShortVersion.ts create mode 100644 packages/mp3-encoder/src/lame/index.ts create mode 100644 packages/mp3-encoder/src/lame/math.ts create mode 100644 packages/mp3-encoder/src/lame/sampleRates.ts delete mode 100644 packages/mp3-encoder/src/lamejs.d.ts create mode 100644 packages/mp3-encoder/testdata/Left44100.wav create mode 100644 packages/mp3-encoder/testdata/Right44100.wav create mode 100644 packages/mp3-encoder/tsconfig.build.json diff --git a/packages/eslint-config-alt/typescript/index.js b/packages/eslint-config-alt/typescript/index.js index 4133d25682..7ace5a1338 100644 --- a/packages/eslint-config-alt/typescript/index.js +++ b/packages/eslint-config-alt/typescript/index.js @@ -62,7 +62,7 @@ module.exports = { }, overrides: [ { - files: ['*.ts', '*.tsx'], + files: ['*.+(ts|tsx|cts|ctsx|mts|mtsx)'], rules: { '@typescript-eslint/no-dupe-class-members': 'error', 'no-dupe-class-members': 'off', diff --git a/packages/mp3-encoder/.eslintignore b/packages/mp3-encoder/.eslintignore deleted file mode 100644 index 8225baa4a7..0000000000 --- a/packages/mp3-encoder/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -/node_modules -/dist diff --git a/packages/mp3-encoder/.eslintrc.js b/packages/mp3-encoder/.eslintrc.js index d11c05a965..fb82ca10b0 100644 --- a/packages/mp3-encoder/.eslintrc.js +++ b/packages/mp3-encoder/.eslintrc.js @@ -1,6 +1,11 @@ +/** @type {import('eslint').ESLint.ConfigData} */ module.exports = { extends: '@rocket.chat/eslint-config-alt/typescript', env: { jest: true, }, + rules: { + 'new-cap': 'off', + }, + ignorePatterns: ['dist', 'node_modules', 'src/lame/*.js'], }; diff --git a/packages/mp3-encoder/package.json b/packages/mp3-encoder/package.json index 17f58f8b71..67aebd1963 100644 --- a/packages/mp3-encoder/package.json +++ b/packages/mp3-encoder/package.json @@ -40,9 +40,6 @@ "publishConfig": { "access": "public" }, - "dependencies": { - "lamejs": "git+https://github.com/zhuker/lamejs.git#commit=582bbba6a12f981b984d8fb9e1874499fed85675" - }, "devDependencies": { "@babel/core": "~7.21.4", "@babel/plugin-transform-runtime": "~7.21.4", @@ -50,9 +47,9 @@ "@babel/preset-typescript": "~7.21.4", "@rocket.chat/eslint-config-alt": "workspace:~", "@rocket.chat/prettier-config": "workspace:~", - "@rollup/plugin-commonjs": "~21.0.3", - "@rollup/plugin-node-resolve": "~13.1.3", - "@rollup/plugin-typescript": "~8.3.4", + "@rollup/plugin-commonjs": "~24.1.0", + "@rollup/plugin-node-resolve": "~15.0.2", + "@rollup/plugin-typescript": "~11.1.0", "@types/jest": "~29.5.0", "bump": "workspace:~", "eslint": "~8.38.0", @@ -61,7 +58,7 @@ "lint-all": "workspace:~", "lint-staged": "~13.2.1", "prettier": "~2.8.7", - "rollup": "~2.67.3", + "rollup": "~3.20.4", "ts-jest": "~29.1.0", "typedoc": "~0.24.1", "typescript": "~5.0.4" diff --git a/packages/mp3-encoder/rollup.config.js b/packages/mp3-encoder/rollup.config.js index a7c6000f0c..bc0eb72e04 100644 --- a/packages/mp3-encoder/rollup.config.js +++ b/packages/mp3-encoder/rollup.config.js @@ -1,12 +1,13 @@ -import path from 'path'; +const path = require('path'); -import commonjs from '@rollup/plugin-commonjs'; -import resolve from '@rollup/plugin-node-resolve'; -import typescript from '@rollup/plugin-typescript'; +const commonjs = require('@rollup/plugin-commonjs'); +const resolve = require('@rollup/plugin-node-resolve'); +const typescript = require('@rollup/plugin-typescript').default; -import pkg from './package.json'; +const pkg = require('./package.json'); -export default [ +/** @type {import('rollup').RollupOptions[]} */ +module.exports = [ { input: 'src/index.ts', output: { @@ -17,7 +18,9 @@ export default [ strict: false, }, plugins: [ - typescript({ declaration: true, declarationDir: 'dist/' }), + typescript({ + tsconfig: 'tsconfig.build.json', + }), resolve(), commonjs(), ], @@ -29,6 +32,12 @@ export default [ format: 'esm', sourcemap: true, }, - plugins: [typescript(), resolve(), commonjs()], + plugins: [ + typescript({ + tsconfig: 'tsconfig.build.json', + }), + resolve(), + commonjs(), + ], }, ]; diff --git a/packages/mp3-encoder/src/index.ts b/packages/mp3-encoder/src/index.ts index 156b19afb4..0e382e200f 100644 --- a/packages/mp3-encoder/src/index.ts +++ b/packages/mp3-encoder/src/index.ts @@ -1,6 +1,4 @@ -import { Mp3Encoder } from 'lamejs'; - -declare const self: any; +import { Mp3Encoder } from './lame'; type Config = { numChannels?: number; diff --git a/packages/mp3-encoder/src/lame/ABRPresets.ts b/packages/mp3-encoder/src/lame/ABRPresets.ts new file mode 100644 index 0000000000..593371d429 --- /dev/null +++ b/packages/mp3-encoder/src/lame/ABRPresets.ts @@ -0,0 +1,436 @@ +import type { LameGlobalFlags } from './LameGlobalFlags'; +import { VbrMode } from './VbrMode'; +import type { Bitrate } from './bitrates'; +import { equals } from './math'; + +interface ABRPreset { + readonly kbps: number; + readonly quant_comp: number; + readonly quant_comp_s: number; + readonly safejoint: number; + readonly nsmsfix: number; + readonly st_lrm: number; + readonly st_s: number; + readonly nsbass: number; + readonly scale: number; + readonly masking_adj: number; + readonly ath_lower: number; + readonly ath_curve: number; + readonly interch: number; + readonly sfscale: 0 | 1; +} + +interface BandPass { + readonly bitrate: number; + readonly lowpass: number; +} + +type FullBitrateIndex = number & { __brand: 'FullBitrateIndex' }; + +type PresetMap = Record; + +export class ABRPresets { + private readonly fullBitrates = [ + 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, + ] as const satisfies readonly Bitrate[]; + + private findNearestFullBitrateIndex(bitrate: number): FullBitrateIndex { + let lowerRange = this.fullBitrates.length - 1; + let upperRange = this.fullBitrates.length - 1; + + for ( + let maybeLowerRange = 0; + maybeLowerRange < this.fullBitrates.length - 1; + maybeLowerRange++ + ) { + const maybeUpperRange = maybeLowerRange + 1; + + if (this.fullBitrates[maybeUpperRange] > bitrate) { + lowerRange = maybeLowerRange; + upperRange = maybeUpperRange; + break; + } + } + + return bitrate - this.fullBitrates[lowerRange] < + this.fullBitrates[upperRange] - bitrate + ? (lowerRange as FullBitrateIndex) + : (upperRange as FullBitrateIndex); + } + + private readonly presetMap = [ + { + kbps: 8, + quant_comp: 9, + quant_comp_s: 9, + safejoint: 0, + nsmsfix: 0, + st_lrm: 6.6, + st_s: 145, + nsbass: 0, + scale: 0.95, + masking_adj: 0, + ath_lower: -30, + ath_curve: 11, + interch: 0.0012, + sfscale: 1, + }, + { + kbps: 16, + quant_comp: 9, + quant_comp_s: 9, + safejoint: 0, + nsmsfix: 0, + st_lrm: 6.6, + st_s: 145, + nsbass: 0, + scale: 0.95, + masking_adj: 0, + ath_lower: -25, + ath_curve: 11, + interch: 0.001, + sfscale: 1, + }, + { + kbps: 24, + quant_comp: 9, + quant_comp_s: 9, + safejoint: 0, + nsmsfix: 0, + st_lrm: 6.6, + st_s: 145, + nsbass: 0, + scale: 0.95, + masking_adj: 0, + ath_lower: -20, + ath_curve: 11, + interch: 0.001, + sfscale: 1, + }, + { + kbps: 32, + quant_comp: 9, + quant_comp_s: 9, + safejoint: 0, + nsmsfix: 0, + st_lrm: 6.6, + st_s: 145, + nsbass: 0, + scale: 0.95, + masking_adj: 0, + ath_lower: -15, + ath_curve: 11, + interch: 0.001, + sfscale: 1, + }, + { + kbps: 40, + quant_comp: 9, + quant_comp_s: 9, + safejoint: 0, + nsmsfix: 0, + st_lrm: 6.6, + st_s: 145, + nsbass: 0, + scale: 0.95, + masking_adj: 0, + ath_lower: -10, + ath_curve: 11, + interch: 0.0009, + sfscale: 1, + }, + { + kbps: 48, + quant_comp: 9, + quant_comp_s: 9, + safejoint: 0, + nsmsfix: 0, + st_lrm: 6.6, + st_s: 145, + nsbass: 0, + scale: 0.95, + masking_adj: 0, + ath_lower: -10, + ath_curve: 11, + interch: 0.0009, + sfscale: 1, + }, + { + kbps: 56, + quant_comp: 9, + quant_comp_s: 9, + safejoint: 0, + nsmsfix: 0, + st_lrm: 6.6, + st_s: 145, + nsbass: 0, + scale: 0.95, + masking_adj: 0, + ath_lower: -6, + ath_curve: 11, + interch: 0.0008, + sfscale: 1, + }, + { + kbps: 64, + quant_comp: 9, + quant_comp_s: 9, + safejoint: 0, + nsmsfix: 0, + st_lrm: 6.6, + st_s: 145, + nsbass: 0, + scale: 0.95, + masking_adj: 0, + ath_lower: -2, + ath_curve: 11, + interch: 0.0008, + sfscale: 1, + }, + { + kbps: 80, + quant_comp: 9, + quant_comp_s: 9, + safejoint: 0, + nsmsfix: 0, + st_lrm: 6.6, + st_s: 145, + nsbass: 0, + scale: 0.95, + masking_adj: 0, + ath_lower: 0, + ath_curve: 8, + interch: 0.0007, + sfscale: 1, + }, + { + kbps: 96, + quant_comp: 9, + quant_comp_s: 9, + safejoint: 0, + nsmsfix: 2.5, + st_lrm: 6.6, + st_s: 145, + nsbass: 0, + scale: 0.95, + masking_adj: 0, + ath_lower: 1, + ath_curve: 5.5, + interch: 0.0006, + sfscale: 1, + }, + { + kbps: 112, + quant_comp: 9, + quant_comp_s: 9, + safejoint: 0, + nsmsfix: 2.25, + st_lrm: 6.6, + st_s: 145, + nsbass: 0, + scale: 0.95, + masking_adj: 0, + ath_lower: 2, + ath_curve: 4.5, + interch: 0.0005, + sfscale: 1, + }, + { + kbps: 128, + quant_comp: 9, + quant_comp_s: 9, + safejoint: 0, + nsmsfix: 1.95, + st_lrm: 6.4, + st_s: 140, + nsbass: 0, + scale: 0.95, + masking_adj: 0, + ath_lower: 3, + ath_curve: 4, + interch: 0.0002, + sfscale: 1, + }, + { + kbps: 160, + quant_comp: 9, + quant_comp_s: 9, + safejoint: 1, + nsmsfix: 1.79, + st_lrm: 6, + st_s: 135, + nsbass: 0, + scale: 0.95, + masking_adj: -2, + ath_lower: 5, + ath_curve: 3.5, + interch: 0, + sfscale: 1, + }, + { + kbps: 192, + quant_comp: 9, + quant_comp_s: 9, + safejoint: 1, + nsmsfix: 1.49, + st_lrm: 5.6, + st_s: 125, + nsbass: 0, + scale: 0.97, + masking_adj: -4, + ath_lower: 7, + ath_curve: 3, + interch: 0, + sfscale: 0, + }, + { + kbps: 224, + quant_comp: 9, + quant_comp_s: 9, + safejoint: 1, + nsmsfix: 1.25, + st_lrm: 5.2, + st_s: 125, + nsbass: 0, + scale: 0.98, + masking_adj: -6, + ath_lower: 9, + ath_curve: 2, + interch: 0, + sfscale: 0, + }, + { + kbps: 256, + quant_comp: 9, + quant_comp_s: 9, + safejoint: 1, + nsmsfix: 0.97, + st_lrm: 5.2, + st_s: 125, + nsbass: 0, + scale: 1, + masking_adj: -8, + ath_lower: 10, + ath_curve: 1, + interch: 0, + sfscale: 0, + }, + { + kbps: 320, + quant_comp: 9, + quant_comp_s: 9, + safejoint: 1, + nsmsfix: 0.9, + st_lrm: 5.2, + st_s: 125, + nsbass: 0, + scale: 1, + masking_adj: -10, + ath_lower: 12, + ath_curve: 0, + interch: 0, + sfscale: 0, + }, + ] as const satisfies PresetMap; + + public apply(gfp: LameGlobalFlags, bitrate: number) { + const preset = this.presetMap[this.findNearestFullBitrateIndex(bitrate)]; + + gfp.VBR = VbrMode.vbr_abr; + gfp.VBR_mean_bitrate_kbps = bitrate; + gfp.VBR_mean_bitrate_kbps = Math.min(gfp.VBR_mean_bitrate_kbps, 320); + gfp.VBR_mean_bitrate_kbps = Math.max(gfp.VBR_mean_bitrate_kbps, 8); + gfp.brate = gfp.VBR_mean_bitrate_kbps; + + if (preset.safejoint > 0) { + gfp.exp_nspsytune |= 2; + } + + if (preset.sfscale > 0) { + gfp.internal_flags.noise_shaping = 2; + } + + if (Math.abs(preset.nsbass) > 0) { + let k = Math.trunc(preset.nsbass * 4); + if (k < 0) { + k += 64; + } + gfp.exp_nspsytune |= k << 2; + } + + if (equals(gfp.quant_comp, -1)) { + gfp.quant_comp = preset.quant_comp; + } + + if (equals(gfp.quant_comp_short, -1)) { + gfp.quant_comp_short = preset.quant_comp_s; + } + + if (equals(gfp.msfix, -1)) { + gfp.msfix = preset.nsmsfix; + } + + if (equals(gfp.internal_flags.nsPsy.attackthre, -1)) { + gfp.internal_flags.nsPsy.attackthre = preset.st_lrm; + } + + if (equals(gfp.internal_flags.nsPsy.attackthre_s, -1)) { + gfp.internal_flags.nsPsy.attackthre_s = preset.st_s; + } + + if (equals(gfp.scale, -1)) { + gfp.scale = preset.scale; + } + + if (equals(gfp.maskingadjust, 0)) { + gfp.maskingadjust = preset.masking_adj; + } + + if (preset.masking_adj > 0) { + if (equals(gfp.maskingadjust_short, 0)) { + gfp.maskingadjust_short = preset.masking_adj * 0.9; + } + } else if (equals(gfp.maskingadjust_short, 0)) { + gfp.maskingadjust_short = preset.masking_adj * 1.1; + } + + if (equals(-gfp.ATHlower * 10, 0)) { + gfp.ATHlower = -preset.ath_lower / 10; + } + + if (equals(gfp.ATHcurve, -1)) { + gfp.ATHcurve = preset.ath_curve; + } + + if (equals(gfp.interChRatio, -1)) { + gfp.interChRatio = preset.interch; + } + + return bitrate; + } + + private readonly optimumBandwidths = [ + { bitrate: 8, lowpass: 2000 }, + { bitrate: 16, lowpass: 3700 }, + { bitrate: 24, lowpass: 3900 }, + { bitrate: 32, lowpass: 5500 }, + { bitrate: 40, lowpass: 7000 }, + { bitrate: 48, lowpass: 7500 }, + { bitrate: 56, lowpass: 10000 }, + { bitrate: 64, lowpass: 11000 }, + { bitrate: 80, lowpass: 13500 }, + { bitrate: 96, lowpass: 15100 }, + { bitrate: 112, lowpass: 15600 }, + { bitrate: 128, lowpass: 17000 }, + { bitrate: 160, lowpass: 17500 }, + { bitrate: 192, lowpass: 18600 }, + { bitrate: 224, lowpass: 19400 }, + { bitrate: 256, lowpass: 19700 }, + { bitrate: 320, lowpass: 20500 }, + ] as const satisfies Record; + + public getOptimumBandwidth(bitrate: number) { + const table_index = this.findNearestFullBitrateIndex(bitrate); + return this.optimumBandwidths[table_index].lowpass; + } +} diff --git a/packages/mp3-encoder/src/lame/ATH.ts b/packages/mp3-encoder/src/lame/ATH.ts new file mode 100644 index 0000000000..222fbb54a0 --- /dev/null +++ b/packages/mp3-encoder/src/lame/ATH.ts @@ -0,0 +1,29 @@ +import { BLKSIZE, CBANDS, PSFB12, PSFB21, SBMAX_l, SBMAX_s } from './constants'; + +export class ATH { + useAdjust = 0; + + aaSensitivityP = 0; + + adjust = 0; + + adjustLimit = 0; + + decay = 0; + + floor = 0; + + readonly l = new Float32Array(SBMAX_l); + + readonly s = new Float32Array(SBMAX_s); + + readonly psfb21 = new Float32Array(PSFB21); + + readonly psfb12 = new Float32Array(PSFB12); + + readonly cb_l = new Float32Array(CBANDS); + + readonly cb_s = new Float32Array(CBANDS); + + readonly eql_w = new Float32Array(BLKSIZE / 2); +} diff --git a/packages/mp3-encoder/src/lame/BitStream.ts b/packages/mp3-encoder/src/lame/BitStream.ts new file mode 100644 index 0000000000..b0e7034709 --- /dev/null +++ b/packages/mp3-encoder/src/lame/BitStream.ts @@ -0,0 +1,766 @@ +import { GainAnalysis } from './GainAnalysis'; +import type { GrInfo } from './GrInfo'; +import type { LameGlobalFlags } from './LameGlobalFlags'; +import type { LameInternalFlags } from './LameInternalFlags'; +import * as tables from './Tables'; +import { Takehiro } from './Takehiro'; +import { TotalBytes } from './TotalBytes'; +import { VBRTag } from './VBRTag'; +import { copyArray, fillArray } from './arrays'; +import { assert } from './assert'; +import { getBitrate } from './bitrates'; +import { + LAME_MAXMP3BUFFER, + MAX_HEADER_BUF, + NORM_TYPE, + SHORT_TYPE, +} from './constants'; +import { getLameShortVersion } from './getLameShortVersion'; +import { isCloseToEachOther } from './math'; + +export class BitStream { + private static readonly MAX_LENGTH = 32; + + readonly ga = new GainAnalysis(); + + private readonly vbr = new VBRTag(); + + private readonly buf = new Uint8Array(LAME_MAXMP3BUFFER); + + private totbit = 0; + + private bufByteIdx = -1; + + private bufBitIdx = 0; + + resetPointers(gfc: LameInternalFlags) { + gfc.w_ptr = 0; + gfc.h_ptr = 0; + gfc.header[gfc.h_ptr].write_timing = 0; + } + + getframebits(gfp: LameGlobalFlags) { + const gfc = gfp.internal_flags; + let bit_rate; + + if (gfc.bitrate_index !== 0) { + bit_rate = getBitrate(gfp.version, gfc.bitrate_index); + } else { + bit_rate = gfp.brate; + } + assert(bit_rate >= 8 && bit_rate <= 640); + + const bytes = Math.trunc( + ((gfp.version + 1) * 72000 * bit_rate) / gfp.out_samplerate + gfc.padding + ); + return 8 * bytes; + } + + private putheader_bits(gfc: LameInternalFlags) { + copyArray( + gfc.header[gfc.w_ptr].buf, + 0, + this.buf, + this.bufByteIdx, + gfc.sideinfo_len + ); + this.bufByteIdx += gfc.sideinfo_len; + this.totbit += gfc.sideinfo_len * 8; + gfc.w_ptr = (gfc.w_ptr + 1) & (MAX_HEADER_BUF - 1); + } + + private putbits2(gfc: LameInternalFlags, val: number, j: number) { + assert(j < BitStream.MAX_LENGTH - 2); + + while (j > 0) { + if (this.bufBitIdx === 0) { + this.bufBitIdx = 8; + this.bufByteIdx++; + assert(this.bufByteIdx < LAME_MAXMP3BUFFER); + assert(gfc.header[gfc.w_ptr].write_timing >= this.totbit); + if (gfc.header[gfc.w_ptr].write_timing === this.totbit) { + this.putheader_bits(gfc); + } + this.buf[this.bufByteIdx] = 0; + } + + const k = Math.min(j, this.bufBitIdx); + j -= k; + + this.bufBitIdx -= k; + + assert(j < BitStream.MAX_LENGTH); + + assert(this.bufBitIdx < BitStream.MAX_LENGTH); + + this.buf[this.bufByteIdx] |= (val >> j) << this.bufBitIdx; + this.totbit += k; + } + } + + private drain_into_ancillary(gfp: LameGlobalFlags, remainingBits: number) { + const gfc = gfp.internal_flags; + let i; + assert(remainingBits >= 0); + + if (remainingBits >= 8) { + this.putbits2(gfc, 0x4c, 8); + remainingBits -= 8; + } + if (remainingBits >= 8) { + this.putbits2(gfc, 0x41, 8); + remainingBits -= 8; + } + if (remainingBits >= 8) { + this.putbits2(gfc, 0x4d, 8); + remainingBits -= 8; + } + if (remainingBits >= 8) { + this.putbits2(gfc, 0x45, 8); + remainingBits -= 8; + } + + if (remainingBits >= 32) { + const version = getLameShortVersion(); + if (remainingBits >= 32) + for (i = 0; i < version.length && remainingBits >= 8; ++i) { + remainingBits -= 8; + this.putbits2(gfc, version.charCodeAt(i), 8); + } + } + + for (; remainingBits >= 1; remainingBits -= 1) { + this.putbits2(gfc, 0, 1); + } + + assert(remainingBits === 0); + } + + private writeheader(gfc: LameInternalFlags, val: number, j: number) { + let { ptr } = gfc.header[gfc.h_ptr]; + + while (j > 0) { + const k = Math.min(j, 8 - (ptr & 7)); + j -= k; + assert(j < BitStream.MAX_LENGTH); + + gfc.header[gfc.h_ptr].buf[ptr >> 3] |= (val >> j) << (8 - (ptr & 7) - k); + ptr += k; + } + gfc.header[gfc.h_ptr].ptr = ptr; + } + + private encodeSideInfo2(gfp: LameGlobalFlags, bitsPerFrame: number) { + const gfc = gfp.internal_flags; + let gr; + let ch; + + const { l3_side } = gfc; + gfc.header[gfc.h_ptr].ptr = 0; + fillArray(gfc.header[gfc.h_ptr].buf, 0, gfc.sideinfo_len, 0); + if (gfp.out_samplerate < 16000) { + this.writeheader(gfc, 0xffe, 12); + } else { + this.writeheader(gfc, 0xfff, 12); + } + this.writeheader(gfc, gfp.version, 1); + this.writeheader(gfc, 4 - 3, 2); + this.writeheader(gfc, 1, 1); + this.writeheader(gfc, gfc.bitrate_index, 4); + this.writeheader(gfc, gfc.samplerate_index, 2); + this.writeheader(gfc, gfc.padding, 1); + this.writeheader(gfc, 0, 1); + this.writeheader(gfc, gfp.mode.ordinal, 2); + this.writeheader(gfc, gfc.mode_ext, 2); + this.writeheader(gfc, 0, 1); + this.writeheader(gfc, 1, 1); + this.writeheader(gfc, 0, 2); + + if (gfp.version === 1) { + assert(l3_side.main_data_begin >= 0); + this.writeheader(gfc, l3_side.main_data_begin, 9); + + if (gfc.channels_out === 2) + this.writeheader(gfc, l3_side.private_bits, 3); + else this.writeheader(gfc, l3_side.private_bits, 5); + + for (ch = 0; ch < gfc.channels_out; ch++) { + for (let band = 0; band < 4; band++) { + this.writeheader(gfc, l3_side.scfsi[ch][band], 1); + } + } + + for (gr = 0; gr < 2; gr++) { + for (ch = 0; ch < gfc.channels_out; ch++) { + const gi = l3_side.tt[gr][ch]; + this.writeheader(gfc, gi.part2_3_length + gi.part2_length, 12); + this.writeheader(gfc, gi.big_values / 2, 9); + this.writeheader(gfc, gi.global_gain, 8); + this.writeheader(gfc, gi.scalefac_compress, 4); + + if (gi.block_type !== NORM_TYPE) { + this.writeheader(gfc, 1, 1); + + this.writeheader(gfc, gi.block_type, 2); + this.writeheader(gfc, gi.mixed_block_flag, 1); + + if (gi.table_select[0] === 14) gi.table_select[0] = 16; + this.writeheader(gfc, gi.table_select[0], 5); + if (gi.table_select[1] === 14) gi.table_select[1] = 16; + this.writeheader(gfc, gi.table_select[1], 5); + + this.writeheader(gfc, gi.subblock_gain[0], 3); + this.writeheader(gfc, gi.subblock_gain[1], 3); + this.writeheader(gfc, gi.subblock_gain[2], 3); + } else { + this.writeheader(gfc, 0, 1); + + if (gi.table_select[0] === 14) gi.table_select[0] = 16; + this.writeheader(gfc, gi.table_select[0], 5); + if (gi.table_select[1] === 14) gi.table_select[1] = 16; + this.writeheader(gfc, gi.table_select[1], 5); + if (gi.table_select[2] === 14) gi.table_select[2] = 16; + this.writeheader(gfc, gi.table_select[2], 5); + + assert(gi.region0_count >= 0 && gi.region0_count < 16); + assert(gi.region1_count >= 0 && gi.region1_count < 8); + this.writeheader(gfc, gi.region0_count, 4); + this.writeheader(gfc, gi.region1_count, 3); + } + this.writeheader(gfc, gi.preflag, 1); + this.writeheader(gfc, gi.scalefac_scale, 1); + this.writeheader(gfc, gi.count1table_select, 1); + } + } + } else { + assert(l3_side.main_data_begin >= 0); + this.writeheader(gfc, l3_side.main_data_begin, 8); + this.writeheader(gfc, l3_side.private_bits, gfc.channels_out); + + gr = 0; + for (ch = 0; ch < gfc.channels_out; ch++) { + const gi = l3_side.tt[gr][ch]; + this.writeheader(gfc, gi.part2_3_length + gi.part2_length, 12); + this.writeheader(gfc, gi.big_values / 2, 9); + this.writeheader(gfc, gi.global_gain, 8); + this.writeheader(gfc, gi.scalefac_compress, 9); + + if (gi.block_type !== NORM_TYPE) { + this.writeheader(gfc, 1, 1); + + this.writeheader(gfc, gi.block_type, 2); + this.writeheader(gfc, gi.mixed_block_flag, 1); + + if (gi.table_select[0] === 14) gi.table_select[0] = 16; + this.writeheader(gfc, gi.table_select[0], 5); + if (gi.table_select[1] === 14) gi.table_select[1] = 16; + this.writeheader(gfc, gi.table_select[1], 5); + + this.writeheader(gfc, gi.subblock_gain[0], 3); + this.writeheader(gfc, gi.subblock_gain[1], 3); + this.writeheader(gfc, gi.subblock_gain[2], 3); + } else { + this.writeheader(gfc, 0, 1); + + if (gi.table_select[0] === 14) gi.table_select[0] = 16; + this.writeheader(gfc, gi.table_select[0], 5); + if (gi.table_select[1] === 14) gi.table_select[1] = 16; + this.writeheader(gfc, gi.table_select[1], 5); + if (gi.table_select[2] === 14) gi.table_select[2] = 16; + this.writeheader(gfc, gi.table_select[2], 5); + + assert(gi.region0_count >= 0 && gi.region0_count < 16); + assert(gi.region1_count >= 0 && gi.region1_count < 8); + this.writeheader(gfc, gi.region0_count, 4); + this.writeheader(gfc, gi.region1_count, 3); + } + + this.writeheader(gfc, gi.scalefac_scale, 1); + this.writeheader(gfc, gi.count1table_select, 1); + } + } + + const old = gfc.h_ptr; + assert(gfc.header[old].ptr === gfc.sideinfo_len * 8); + + gfc.h_ptr = (old + 1) & (MAX_HEADER_BUF - 1); + gfc.header[gfc.h_ptr].write_timing = + gfc.header[old].write_timing + bitsPerFrame; + + if (gfc.h_ptr === gfc.w_ptr) { + console.warn('MAX_HEADER_BUF too small in bitstream.'); + } + } + + private huffman_coder_count1(gfc: LameInternalFlags, gi: GrInfo) { + const h = tables.ht[gi.count1table_select + 32]; + let i; + let bits = 0; + + let ix = gi.big_values; + let xr = gi.big_values; + assert(gi.count1table_select < 2); + + for (i = (gi.count1 - gi.big_values) / 4; i > 0; --i) { + let huffbits = 0; + let p = 0; + let v; + + v = gi.l3_enc[ix + 0]; + if (v !== 0) { + p += 8; + if (gi.xr[xr + 0] < 0) huffbits++; + assert(v <= 1); + } + + v = gi.l3_enc[ix + 1]; + if (v !== 0) { + p += 4; + huffbits *= 2; + if (gi.xr[xr + 1] < 0) huffbits++; + assert(v <= 1); + } + + v = gi.l3_enc[ix + 2]; + if (v !== 0) { + p += 2; + huffbits *= 2; + if (gi.xr[xr + 2] < 0) huffbits++; + assert(v <= 1); + } + + v = gi.l3_enc[ix + 3]; + if (v !== 0) { + p++; + huffbits *= 2; + if (gi.xr[xr + 3] < 0) huffbits++; + assert(v <= 1); + } + + assert(h.table !== undefined); + assert(h.hlen !== undefined); + + ix += 4; + xr += 4; + this.putbits2(gfc, huffbits + h.table[p], h.hlen[p]); + bits += h.hlen[p]; + } + return bits; + } + + private huffmancode( + gfc: LameInternalFlags, + tableindex: number, + start: number, + end: number, + gi: GrInfo + ) { + const h = tables.ht[tableindex]; + let bits = 0; + + assert(tableindex < 32); + if (tableindex === 0) return bits; + + for (let i = start; i < end; i += 2) { + let cbits = 0; + let xbits = 0; + const linbits = h.xlen; + let { xlen } = h; + let ext = 0; + let x1 = gi.l3_enc[i]; + let x2 = gi.l3_enc[i + 1]; + + if (x1 !== 0) { + if (gi.xr[i] < 0) ext++; + cbits--; + } + + if (tableindex > 15) { + if (x1 > 14) { + const linbits_x1 = x1 - 15; + assert(linbits_x1 <= h.linmax); + ext |= linbits_x1 << 1; + xbits = linbits; + x1 = 15; + } + + if (x2 > 14) { + const linbits_x2 = x2 - 15; + assert(linbits_x2 <= h.linmax); + ext <<= linbits; + ext |= linbits_x2; + xbits += linbits; + x2 = 15; + } + xlen = 16; + } + + if (x2 !== 0) { + ext <<= 1; + if (gi.xr[i + 1] < 0) ext++; + cbits--; + } + + assert((x1 | x2) < 16); + assert(h.hlen !== undefined); + assert(h.table !== undefined); + + x1 = x1 * xlen + x2; + xbits -= cbits; + cbits += h.hlen[x1]; + + assert(cbits <= BitStream.MAX_LENGTH); + assert(xbits <= BitStream.MAX_LENGTH); + assert(h.table !== undefined); + + this.putbits2(gfc, h.table[x1], cbits); + this.putbits2(gfc, ext, xbits); + bits += cbits + xbits; + } + return bits; + } + + private shortHuffmancodebits(gfc: LameInternalFlags, gi: GrInfo) { + let region1Start = 3 * gfc.scalefac_band.s[3]; + if (region1Start > gi.big_values) region1Start = gi.big_values; + + let bits = this.huffmancode(gfc, gi.table_select[0], 0, region1Start, gi); + bits += this.huffmancode( + gfc, + gi.table_select[1], + region1Start, + gi.big_values, + gi + ); + return bits; + } + + private longHuffmancodebits(gfc: LameInternalFlags, gi: GrInfo) { + let bits; + let region1Start; + let region2Start; + + const bigvalues = gi.big_values; + assert(bigvalues >= 0 && bigvalues <= 576); + + let i = gi.region0_count + 1; + assert(i >= 0); + assert(i < gfc.scalefac_band.l.length); + region1Start = gfc.scalefac_band.l[i]; + i += gi.region1_count + 1; + assert(i >= 0); + assert(i < gfc.scalefac_band.l.length); + region2Start = gfc.scalefac_band.l[i]; + + if (region1Start > bigvalues) { + region1Start = bigvalues; + } + + if (region2Start > bigvalues) { + region2Start = bigvalues; + } + + bits = this.huffmancode(gfc, gi.table_select[0], 0, region1Start, gi); + bits += this.huffmancode( + gfc, + gi.table_select[1], + region1Start, + region2Start, + gi + ); + bits += this.huffmancode( + gfc, + gi.table_select[2], + region2Start, + bigvalues, + gi + ); + return bits; + } + + private writeMainData(gfp: LameGlobalFlags) { + let gr; + let ch; + let sfb; + let data_bits; + let tot_bits = 0; + const gfc = gfp.internal_flags; + const { l3_side } = gfc; + + if (gfp.version === 1) { + for (gr = 0; gr < 2; gr++) { + for (ch = 0; ch < gfc.channels_out; ch++) { + const gi = l3_side.tt[gr][ch]; + const slen1 = Takehiro.slen1_tab[gi.scalefac_compress]; + const slen2 = Takehiro.slen2_tab[gi.scalefac_compress]; + data_bits = 0; + for (sfb = 0; sfb < gi.sfbdivide; sfb++) { + if (gi.scalefac[sfb] === -1) { + continue; + } + + this.putbits2(gfc, gi.scalefac[sfb], slen1); + data_bits += slen1; + } + for (; sfb < gi.sfbmax; sfb++) { + if (gi.scalefac[sfb] === -1) { + continue; + } + + this.putbits2(gfc, gi.scalefac[sfb], slen2); + data_bits += slen2; + } + assert(data_bits === gi.part2_length); + + if (gi.block_type === SHORT_TYPE) { + data_bits += this.shortHuffmancodebits(gfc, gi); + } else { + data_bits += this.longHuffmancodebits(gfc, gi); + } + data_bits += this.huffman_coder_count1(gfc, gi); + + assert(data_bits === gi.part2_3_length + gi.part2_length); + tot_bits += data_bits; + } + } + return tot_bits; + } + + gr = 0; + for (ch = 0; ch < gfc.channels_out; ch++) { + const gi = l3_side.tt[gr][ch]; + let i; + let sfb_partition; + let scale_bits = 0; + assert(gi.sfb_partition_table !== null); + data_bits = 0; + sfb = 0; + sfb_partition = 0; + + if (gi.block_type === SHORT_TYPE) { + for (; sfb_partition < 4; sfb_partition++) { + const sfbs = gi.sfb_partition_table[sfb_partition] / 3; + const slen = gi.slen[sfb_partition]; + for (i = 0; i < sfbs; i++, sfb++) { + this.putbits2(gfc, Math.max(gi.scalefac[sfb * 3 + 0], 0), slen); + this.putbits2(gfc, Math.max(gi.scalefac[sfb * 3 + 1], 0), slen); + this.putbits2(gfc, Math.max(gi.scalefac[sfb * 3 + 2], 0), slen); + scale_bits += 3 * slen; + } + } + data_bits += this.shortHuffmancodebits(gfc, gi); + } else { + for (; sfb_partition < 4; sfb_partition++) { + const sfbs = gi.sfb_partition_table[sfb_partition]; + const slen = gi.slen[sfb_partition]; + for (i = 0; i < sfbs; i++, sfb++) { + this.putbits2(gfc, Math.max(gi.scalefac[sfb], 0), slen); + scale_bits += slen; + } + } + data_bits += this.longHuffmancodebits(gfc, gi); + } + data_bits += this.huffman_coder_count1(gfc, gi); + + assert(data_bits === gi.part2_3_length); + assert(scale_bits === gi.part2_length); + tot_bits += scale_bits + data_bits; + } + + return tot_bits; + } + + private compute_flushbits( + gfp: LameGlobalFlags, + total_bytes_output: TotalBytes + ) { + const gfc = gfp.internal_flags; + let flushbits; + let remaining_headers; + let last_ptr; + const first_ptr = gfc.w_ptr; + + last_ptr = gfc.h_ptr - 1; + + if (last_ptr === -1) last_ptr = MAX_HEADER_BUF - 1; + + flushbits = gfc.header[last_ptr].write_timing - this.totbit; + total_bytes_output.total = flushbits; + + if (flushbits >= 0) { + remaining_headers = 1 + last_ptr - first_ptr; + if (last_ptr < first_ptr) { + remaining_headers = 1 + last_ptr - first_ptr + MAX_HEADER_BUF; + } + flushbits -= remaining_headers * 8 * gfc.sideinfo_len; + } + + const bitsPerFrame = this.getframebits(gfp); + flushbits += bitsPerFrame; + total_bytes_output.total += bitsPerFrame; + + if (total_bytes_output.total % 8 !== 0) + total_bytes_output.total = 1 + total_bytes_output.total / 8; + else total_bytes_output.total /= 8; + total_bytes_output.total += this.bufByteIdx + 1; + + if (flushbits < 0) { + console.warn('strange error flushing buffer ... '); + } + return flushbits; + } + + flush_bitstream(gfp: LameGlobalFlags) { + const gfc = gfp.internal_flags; + let flushbits; + let last_ptr = gfc.h_ptr - 1; + + if (last_ptr === -1) last_ptr = MAX_HEADER_BUF - 1; + const { l3_side } = gfc; + + if ((flushbits = this.compute_flushbits(gfp, new TotalBytes())) < 0) return; + this.drain_into_ancillary(gfp, flushbits); + + assert( + gfc.header[last_ptr].write_timing + this.getframebits(gfp) === this.totbit + ); + + gfc.ResvSize = 0; + l3_side.main_data_begin = 0; + + if (gfc.findReplayGain) { + const radioGain = this.ga.getTitleGain(gfc.rgdata); + assert( + !isCloseToEachOther(radioGain, GainAnalysis.GAIN_NOT_ENOUGH_SAMPLES) + ); + gfc.RadioGain = Math.floor(radioGain * 10.0 + 0.5); + } + + if (gfc.findPeakSample) { + gfc.noclipGainChange = Math.ceil( + Math.log10(gfc.PeakSample / 32767.0) * 20.0 * 10.0 + ); + + if (gfc.noclipGainChange > 0) { + if ( + isCloseToEachOther(gfp.scale, 1.0) || + isCloseToEachOther(gfp.scale, 0.0) + ) { + gfc.noclipScale = + Math.floor((32767.0 / gfc.PeakSample) * 100.0) / 100.0; + } else { + gfc.noclipScale = -1; + } + } else { + gfc.noclipScale = -1; + } + } + } + + format_bitstream(gfp: LameGlobalFlags) { + const gfc = gfp.internal_flags; + const { l3_side } = gfc; + + const bitsPerFrame = this.getframebits(gfp); + this.drain_into_ancillary(gfp, l3_side.resvDrain_pre); + + this.encodeSideInfo2(gfp, bitsPerFrame); + let bits = 8 * gfc.sideinfo_len; + bits += this.writeMainData(gfp); + this.drain_into_ancillary(gfp, l3_side.resvDrain_post); + bits += l3_side.resvDrain_post; + + l3_side.main_data_begin += (bitsPerFrame - bits) / 8; + + if (this.compute_flushbits(gfp, new TotalBytes()) !== gfc.ResvSize) { + console.warn('Internal buffer inconsistency. flushbits <> ResvSize'); + } + + if (l3_side.main_data_begin * 8 !== gfc.ResvSize) { + console.warn( + `bit reservoir error: \n` + + `l3_side.main_data_begin: ${8 * l3_side.main_data_begin} \n` + + `Resvoir size: ${gfc.ResvSize} \n` + + `resv drain (post) ${l3_side.resvDrain_post} \n` + + `resv drain (pre) ${l3_side.resvDrain_pre} \n` + + `header and sideinfo: ${8 * gfc.sideinfo_len} \n` + + `data bits: ${ + bits - l3_side.resvDrain_post - 8 * gfc.sideinfo_len + } \n` + + `total bits: ${bits} (remainder: ${bits % 8}) \n` + + `bitsperframe: ${bitsPerFrame}` + ); + + console.warn('This is a fatal error. It has several possible causes:'); + console.warn( + '90%% LAME compiled with buggy version of gcc using advanced optimizations' + ); + console.warn(' 9%% Your system is overclocked'); + console.warn(' 1%% bug in LAME encoding library'); + + gfc.ResvSize = l3_side.main_data_begin * 8; + } + assert(this.totbit % 8 === 0); + + if (this.totbit > 1000000000) { + for (let i = 0; i < MAX_HEADER_BUF; ++i) { + gfc.header[i].write_timing -= this.totbit; + } + this.totbit = 0; + } + + return 0; + } + + copyMetadata( + gfc: LameInternalFlags, + buffer: Uint8Array, + bufferPos: number, + size: number + ) { + return this.copyBuffer(gfc, buffer, bufferPos, size, false); + } + + copyFrameData( + gfc: LameInternalFlags, + buffer: Uint8Array, + bufferPos: number, + size: number + ) { + return this.copyBuffer(gfc, buffer, bufferPos, size, true); + } + + private copyBuffer( + gfc: LameInternalFlags, + buffer: Uint8Array, + bufferPos: number, + size: number, + mp3data: boolean + ) { + const minimum = this.bufByteIdx + 1; + if (minimum <= 0) { + return 0; + } + + if (size !== 0 && minimum > size) { + return -1; + } + + copyArray(this.buf, 0, buffer, bufferPos, minimum); + this.bufByteIdx = -1; + this.bufBitIdx = 0; + + if (mp3data) { + const crc = new Int32Array(1); + crc[0] = gfc.nMusicCRC; + this.vbr.updateMusicCRC(crc, buffer, bufferPos, minimum); + gfc.nMusicCRC = crc[0]; + + if (minimum > 0) { + gfc.VBR_seek_table.nBytesWritten += minimum; + } + } + + return minimum; + } +} diff --git a/packages/mp3-encoder/src/lame/Bits.ts b/packages/mp3-encoder/src/lame/Bits.ts new file mode 100644 index 0000000000..0c57d6de33 --- /dev/null +++ b/packages/mp3-encoder/src/lame/Bits.ts @@ -0,0 +1,7 @@ +export class Bits { + public bits: number; + + constructor(bits: number) { + this.bits = Math.trunc(bits); + } +} diff --git a/packages/mp3-encoder/src/lame/CBRNewIterationLoop.ts b/packages/mp3-encoder/src/lame/CBRNewIterationLoop.ts new file mode 100644 index 0000000000..43b26ed15a --- /dev/null +++ b/packages/mp3-encoder/src/lame/CBRNewIterationLoop.ts @@ -0,0 +1,149 @@ +import type { III_psy_ratio } from './III_psy_ratio'; +import type { LameGlobalFlags } from './LameGlobalFlags'; +import { MeanBits } from './MeanBits'; +import type { Quantize } from './Quantize'; +import { assert } from './assert'; +import { + MAX_BITS_PER_CHANNEL, + MAX_BITS_PER_GRANULE, + MPG_MD_MS_LR, + SFBMAX, + SHORT_TYPE, +} from './constants'; + +export class CBRNewIterationLoop { + constructor(public quantize: Quantize) {} + + iteration_loop( + gfp: LameGlobalFlags, + pe: number[][], + ms_ener_ratio: number[], + ratio: III_psy_ratio[][] + ) { + const gfc = gfp.internal_flags; + const l3_xmin = new Float32Array(SFBMAX); + const xrpow = new Float32Array(576); + const targ_bits = new Int32Array(2); + let mean_bits = 0; + let max_bits; + const { l3_side } = gfc; + + const mb = new MeanBits(mean_bits); + this.quantize.rv.ResvFrameBegin(gfp, mb); + mean_bits = mb.bits; + + for (let gr = 0; gr < gfc.mode_gr; gr++) { + max_bits = this.on_pe(gfp, pe, targ_bits, mean_bits, gr, gr); + + if (gfc.mode_ext === MPG_MD_MS_LR) { + this.quantize.ms_convert(gfc.l3_side, gr); + this.quantize.qupvt.reduce_side( + targ_bits, + ms_ener_ratio[gr], + mean_bits, + max_bits + ); + } + + for (let ch = 0; ch < gfc.channels_out; ch++) { + let adjust; + let masking_lower_db; + const cod_info = l3_side.tt[gr][ch]; + + if (cod_info.block_type !== SHORT_TYPE) { + // NORM, START or STOP type + adjust = 0; + masking_lower_db = gfc.PSY.mask_adjust - adjust; + } else { + adjust = 0; + masking_lower_db = gfc.PSY.mask_adjust_short - adjust; + } + gfc.masking_lower = Math.pow(10.0, masking_lower_db * 0.1); + + this.quantize.init_outer_loop(gfc, cod_info); + if (this.quantize.init_xrpow(gfc, cod_info, xrpow)) { + this.quantize.qupvt.calc_xmin(gfp, ratio[gr][ch], cod_info, l3_xmin); + this.quantize.outer_loop( + gfp, + cod_info, + l3_xmin, + xrpow, + ch, + targ_bits[ch] + ); + } + + this.quantize.iteration_finish_one(gfc, gr, ch); + assert(cod_info.part2_3_length <= MAX_BITS_PER_CHANNEL); + assert(cod_info.part2_3_length <= targ_bits[ch]); + } + } + + this.quantize.rv.ResvFrameEnd(gfc, mean_bits); + } + + private on_pe( + gfp: LameGlobalFlags, + pe: number[][], + targ_bits: Int32Array, + mean_bits: number, + gr: number, + cbr: number + ) { + const gfc = gfp.internal_flags; + let tbits = 0; + let bits; + const add_bits = new Int32Array(2); + let ch; + + const mb = new MeanBits(tbits); + let extra_bits = this.quantize.rv.ResvMaxBits(gfp, mean_bits, mb, cbr); + tbits = mb.bits; + + let max_bits = tbits + extra_bits; + if (max_bits > MAX_BITS_PER_GRANULE) { + max_bits = MAX_BITS_PER_GRANULE; + } + for (bits = 0, ch = 0; ch < gfc.channels_out; ++ch) { + targ_bits[ch] = Math.min(MAX_BITS_PER_CHANNEL, tbits / gfc.channels_out); + + add_bits[ch] = Math.trunc( + (targ_bits[ch] * pe[gr][ch]) / 700.0 - targ_bits[ch] + ); + + if (add_bits[ch] > (mean_bits * 3) / 4) + add_bits[ch] = (mean_bits * 3) / 4; + if (add_bits[ch] < 0) add_bits[ch] = 0; + + if (add_bits[ch] + targ_bits[ch] > MAX_BITS_PER_CHANNEL) + add_bits[ch] = Math.max(0, MAX_BITS_PER_CHANNEL - targ_bits[ch]); + + bits += add_bits[ch]; + } + if (bits > extra_bits) { + for (ch = 0; ch < gfc.channels_out; ++ch) { + add_bits[ch] = (extra_bits * add_bits[ch]) / bits; + } + } + + for (ch = 0; ch < gfc.channels_out; ++ch) { + targ_bits[ch] += add_bits[ch]; + extra_bits -= add_bits[ch]; + } + + for (bits = 0, ch = 0; ch < gfc.channels_out; ++ch) { + bits += targ_bits[ch]; + } + if (bits > MAX_BITS_PER_GRANULE) { + let sum = 0; + for (ch = 0; ch < gfc.channels_out; ++ch) { + targ_bits[ch] *= MAX_BITS_PER_GRANULE; + targ_bits[ch] /= bits; + sum += targ_bits[ch]; + } + assert(sum <= MAX_BITS_PER_GRANULE); + } + + return max_bits; + } +} diff --git a/packages/mp3-encoder/src/lame/CalcNoiseData.ts b/packages/mp3-encoder/src/lame/CalcNoiseData.ts new file mode 100644 index 0000000000..74ac52df22 --- /dev/null +++ b/packages/mp3-encoder/src/lame/CalcNoiseData.ts @@ -0,0 +1,11 @@ +export class CalcNoiseData { + global_gain = 0; + + sfb_count1 = 0; + + step = new Int32Array(39); + + noise = new Float32Array(39); + + noise_log = new Float32Array(39); +} diff --git a/packages/mp3-encoder/src/lame/CalcNoiseResult.ts b/packages/mp3-encoder/src/lame/CalcNoiseResult.ts new file mode 100644 index 0000000000..508efac7ad --- /dev/null +++ b/packages/mp3-encoder/src/lame/CalcNoiseResult.ts @@ -0,0 +1,13 @@ +export class CalcNoiseResult { + over_noise = 0; + + tot_noise = 0; + + max_noise = 0; + + over_count = 0; + + over_SSD = 0; + + bits = 0; +} diff --git a/packages/mp3-encoder/src/lame/Encoder.ts b/packages/mp3-encoder/src/lame/Encoder.ts new file mode 100644 index 0000000000..9c461ef1fe --- /dev/null +++ b/packages/mp3-encoder/src/lame/Encoder.ts @@ -0,0 +1,351 @@ +import type { BitStream } from './BitStream'; +import { III_psy_ratio } from './III_psy_ratio'; +import type { LameGlobalFlags } from './LameGlobalFlags'; +import type { LameInternalFlags } from './LameInternalFlags'; +import { MPEGMode } from './MPEGMode'; +import { NewMDCT } from './NewMDCT'; +import type { PsyModel } from './PsyModel'; +import { VbrMode } from './VbrMode'; +import { assert } from './assert'; +import { + BLKSIZE, + FFTOFFSET, + MPG_MD_LR_LR, + MPG_MD_MS_LR, + NORM_TYPE, + SHORT_TYPE, +} from './constants'; + +export class Encoder { + private readonly bs: BitStream; + + private readonly psy: PsyModel; + + constructor(bs: BitStream, psy: PsyModel) { + this.bs = bs; + this.psy = psy; + } + + private newMDCT = new NewMDCT(); + + private adjust_ATH(gfc: LameInternalFlags) { + if (gfc.ATH.useAdjust === 0) { + gfc.ATH.adjust = 1.0; + + return; + } + + let max_pow = gfc.loudness_sq[0][0]; + let gr2_max = gfc.loudness_sq[1][0]; + if (gfc.channels_out === 2) { + max_pow += gfc.loudness_sq[0][1]; + gr2_max += gfc.loudness_sq[1][1]; + } else { + max_pow += max_pow; + gr2_max += gr2_max; + } + if (gfc.mode_gr === 2) { + max_pow = Math.max(max_pow, gr2_max); + } + max_pow *= 0.5; + + max_pow *= gfc.ATH.aaSensitivityP; + + if (max_pow > 0.03125) { + if (gfc.ATH.adjust >= 1.0) { + gfc.ATH.adjust = 1.0; + } else if (gfc.ATH.adjust < gfc.ATH.adjustLimit) { + gfc.ATH.adjust = gfc.ATH.adjustLimit; + } + + gfc.ATH.adjustLimit = 1.0; + } else { + const adj_lim_new = 31.98 * max_pow + 0.000625; + if (gfc.ATH.adjust >= adj_lim_new) { + gfc.ATH.adjust *= adj_lim_new * 0.075 + 0.925; + if (gfc.ATH.adjust < adj_lim_new) { + gfc.ATH.adjust = adj_lim_new; + } + } else if (gfc.ATH.adjustLimit >= adj_lim_new) { + gfc.ATH.adjust = adj_lim_new; + } else if (gfc.ATH.adjust < gfc.ATH.adjustLimit) { + gfc.ATH.adjust = gfc.ATH.adjustLimit; + } + + gfc.ATH.adjustLimit = adj_lim_new; + } + } + + private updateStats(gfc: LameInternalFlags) { + let gr; + let ch; + assert(gfc.bitrate_index >= 0 && gfc.bitrate_index < 16); + assert(gfc.mode_ext >= 0 && gfc.mode_ext < 4); + + gfc.bitrate_stereoMode_Hist[gfc.bitrate_index][4]++; + gfc.bitrate_stereoMode_Hist[15][4]++; + + if (gfc.channels_out === 2) { + gfc.bitrate_stereoMode_Hist[gfc.bitrate_index][gfc.mode_ext]++; + gfc.bitrate_stereoMode_Hist[15][gfc.mode_ext]++; + } + for (gr = 0; gr < gfc.mode_gr; ++gr) { + for (ch = 0; ch < gfc.channels_out; ++ch) { + let bt = Math.trunc(gfc.l3_side.tt[gr][ch].block_type); + if (gfc.l3_side.tt[gr][ch].mixed_block_flag !== 0) bt = 4; + gfc.bitrate_blockType_Hist[gfc.bitrate_index][bt]++; + gfc.bitrate_blockType_Hist[gfc.bitrate_index][5]++; + gfc.bitrate_blockType_Hist[15][bt]++; + gfc.bitrate_blockType_Hist[15][5]++; + } + } + } + + private lame_encode_frame_init( + gfp: LameGlobalFlags, + inbuf: [Float32Array, Float32Array] + ) { + const gfc = gfp.internal_flags; + + let ch; + let gr; + + if (!gfc.lame_encode_frame_init) { + let i; + let j; + const primebuff0 = new Float32Array(286 + 1152 + 576); + const primebuff1 = new Float32Array(286 + 1152 + 576); + gfc.lame_encode_frame_init = true; + for (i = 0, j = 0; i < 286 + 576 * (1 + gfc.mode_gr); ++i) { + if (i < 576 * gfc.mode_gr) { + primebuff0[i] = 0; + if (gfc.channels_out === 2) primebuff1[i] = 0; + } else { + primebuff0[i] = inbuf[0][j]; + if (gfc.channels_out === 2) primebuff1[i] = inbuf[1][j]; + ++j; + } + } + + for (gr = 0; gr < gfc.mode_gr; gr++) { + for (ch = 0; ch < gfc.channels_out; ch++) { + gfc.l3_side.tt[gr][ch].block_type = SHORT_TYPE; + } + } + this.newMDCT.mdct_sub48(gfc, primebuff0, primebuff1); + + assert(FFTOFFSET <= 576); + + assert(gfc.mf_size >= BLKSIZE + gfp.framesize - FFTOFFSET); + + assert(gfc.mf_size >= 512 + gfp.framesize - 32); + } + } + + // eslint-disable-next-line complexity + lame_encode_mp3_frame( + gfp: LameGlobalFlags, + inbuf_l: Float32Array, + inbuf_r: Float32Array, + mp3buf: Uint8Array, + mp3bufPos: number, + mp3buf_size: number + ) { + const masking_LR = Array.from({ length: 2 }, () => + Array.from({ length: 2 }, () => new III_psy_ratio()) + ); + + const masking_MS = Array.from({ length: 2 }, () => + Array.from({ length: 2 }, () => new III_psy_ratio()) + ); + + masking_MS[0][0] = new III_psy_ratio(); + masking_MS[0][1] = new III_psy_ratio(); + masking_MS[1][0] = new III_psy_ratio(); + masking_MS[1][1] = new III_psy_ratio(); + + let masking; + + const gfc = gfp.internal_flags; + + const tot_ener = Array.from({ length: 2 }, () => new Float32Array(4)); + const ms_ener_ratio = [0.5, 0.5]; + const pe = [ + [0, 0], + [0, 0], + ]; + const pe_MS = [ + [0, 0], + [0, 0], + ]; + + let pe_use; + + let ch; + let gr; + + const inbuf: [Float32Array, Float32Array] = [inbuf_l, inbuf_r]; + + if (!gfc.lame_encode_frame_init) { + this.lame_encode_frame_init(gfp, inbuf); + } + + gfc.padding = 0; + if ((gfc.slot_lag -= gfc.frac_SpF) < 0) { + gfc.slot_lag += gfp.out_samplerate; + gfc.padding = 1; + } + + if (gfc.psymodel !== 0) { + let ret; + + let bufpPos = 0; + + const blocktype = new Int32Array(2); + + const bufp: Float32Array[] = []; + + for (gr = 0; gr < gfc.mode_gr; gr++) { + for (ch = 0; ch < gfc.channels_out; ch++) { + bufp[ch] = inbuf[ch]; + bufpPos = 576 + gr * 576 - FFTOFFSET; + } + if (gfp.VBR === VbrMode.vbr_mtrh || gfp.VBR === VbrMode.vbr_mt) { + ret = this.psy.L3psycho_anal_vbr( + gfp, + bufp, + bufpPos, + gr, + masking_LR, + masking_MS, + pe[gr], + pe_MS[gr], + tot_ener[gr], + blocktype + ); + } else { + ret = this.psy.L3psycho_anal_ns( + gfp, + bufp, + bufpPos, + gr, + masking_LR, + masking_MS, + pe[gr], + pe_MS[gr], + tot_ener[gr], + blocktype + ); + } + if (ret !== 0) return -4; + + if (gfp.mode === MPEGMode.JOINT_STEREO) { + ms_ener_ratio[gr] = tot_ener[gr][2] + tot_ener[gr][3]; + if (ms_ener_ratio[gr] > 0) + ms_ener_ratio[gr] = tot_ener[gr][3] / ms_ener_ratio[gr]; + } + + for (ch = 0; ch < gfc.channels_out; ch++) { + const cod_info = gfc.l3_side.tt[gr][ch]; + cod_info.block_type = blocktype[ch]; + cod_info.mixed_block_flag = 0; + } + } + } else { + for (gr = 0; gr < gfc.mode_gr; gr++) + for (ch = 0; ch < gfc.channels_out; ch++) { + gfc.l3_side.tt[gr][ch].block_type = NORM_TYPE; + gfc.l3_side.tt[gr][ch].mixed_block_flag = 0; + pe_MS[gr][ch] = 700; + pe[gr][ch] = 700; + } + } + + this.adjust_ATH(gfc); + + this.newMDCT.mdct_sub48(gfc, inbuf[0], inbuf[1]); + + gfc.mode_ext = MPG_MD_LR_LR; + + if (gfp.mode === MPEGMode.JOINT_STEREO) { + let sum_pe_MS = 0; + let sum_pe_LR = 0; + for (gr = 0; gr < gfc.mode_gr; gr++) { + for (ch = 0; ch < gfc.channels_out; ch++) { + sum_pe_MS += pe_MS[gr][ch]; + sum_pe_LR += pe[gr][ch]; + } + } + + if (sum_pe_MS <= 1.0 * sum_pe_LR) { + const gi0 = gfc.l3_side.tt[0]; + const gi1 = gfc.l3_side.tt[gfc.mode_gr - 1]; + + if ( + gi0[0].block_type === gi0[1].block_type && + gi1[0].block_type === gi1[1].block_type + ) { + gfc.mode_ext = MPG_MD_MS_LR; + } + } + } + + if (gfc.mode_ext === MPG_MD_MS_LR) { + masking = masking_MS; + + pe_use = pe_MS; + } else { + masking = masking_LR; + + pe_use = pe; + } + + if (gfp.VBR === VbrMode.vbr_off || gfp.VBR === VbrMode.vbr_abr) { + let i; + let f; + + for (i = 0; i < 18; i++) + gfc.nsPsy.pefirbuf[i] = gfc.nsPsy.pefirbuf[i + 1]; + + f = 0.0; + for (gr = 0; gr < gfc.mode_gr; gr++) + for (ch = 0; ch < gfc.channels_out; ch++) f += pe_use[gr][ch]; + gfc.nsPsy.pefirbuf[18] = f; + + f = gfc.nsPsy.pefirbuf[9]; + for (i = 0; i < 9; i++) + f += + (gfc.nsPsy.pefirbuf[i] + gfc.nsPsy.pefirbuf[18 - i]) * + Encoder.fircoef[i]; + + f = (670 * 5 * gfc.mode_gr * gfc.channels_out) / f; + for (gr = 0; gr < gfc.mode_gr; gr++) { + for (ch = 0; ch < gfc.channels_out; ch++) { + pe_use[gr][ch] *= f; + } + } + } + assert(gfc.iteration_loop !== null); + gfc.iteration_loop.iteration_loop(gfp, pe_use, ms_ener_ratio, masking); + + this.bs.format_bitstream(gfp); + + const mp3count = this.bs.copyFrameData(gfc, mp3buf, mp3bufPos, mp3buf_size); + + this.updateStats(gfc); + + return mp3count; + } + + static fircoef = [ + -0.0207887 * 5, + -0.0378413 * 5, + -0.0432472 * 5, + -0.031183 * 5, + 7.79609e-18 * 5, + 0.0467745 * 5, + 0.10091 * 5, + 0.151365 * 5, + 0.187098 * 5, + ] as const; +} diff --git a/packages/mp3-encoder/src/lame/FFT.ts b/packages/mp3-encoder/src/lame/FFT.ts new file mode 100644 index 0000000000..6f15d36ae1 --- /dev/null +++ b/packages/mp3-encoder/src/lame/FFT.ts @@ -0,0 +1,235 @@ +import type { LameInternalFlags } from './LameInternalFlags'; +import { BLKSIZE, BLKSIZE_s } from './constants'; + +export class FFT { + private window: Float32Array = new Float32Array(BLKSIZE); + + private window_s: Float32Array = new Float32Array(BLKSIZE_s / 2); + + private readonly costab = [ + 9.238795325112867e-1, 3.826834323650898e-1, 9.951847266721969e-1, + 9.80171403295606e-2, 9.996988186962042e-1, 2.454122852291229e-2, + 9.999811752826011e-1, 6.135884649154475e-3, + ] as const; + + private fht(fz: Float32Array, fzPos: number, n: number) { + let tri = 0; + let k4: number; + let fi: number; + let gi: number; + + n <<= 1; + + const fn = fzPos + n; + k4 = 4; + do { + let s1; + let c1; + let i; + const kx = k4 >> 1; + const k1 = k4; + const k2 = k4 << 1; + const k3 = k2 + k1; + k4 = k2 << 1; + fi = fzPos; + gi = fi + kx; + do { + let f0; + let f1; + let f2; + let f3; + f1 = fz[fi + 0] - fz[fi + k1]; + f0 = fz[fi + 0] + fz[fi + k1]; + f3 = fz[fi + k2] - fz[fi + k3]; + f2 = fz[fi + k2] + fz[fi + k3]; + fz[fi + k2] = f0 - f2; + fz[fi + 0] = f0 + f2; + fz[fi + k3] = f1 - f3; + fz[fi + k1] = f1 + f3; + f1 = fz[gi + 0] - fz[gi + k1]; + f0 = fz[gi + 0] + fz[gi + k1]; + f3 = Math.SQRT2 * fz[gi + k3]; + f2 = Math.SQRT2 * fz[gi + k2]; + fz[gi + k2] = f0 - f2; + fz[gi + 0] = f0 + f2; + fz[gi + k3] = f1 - f3; + fz[gi + k1] = f1 + f3; + gi += k4; + fi += k4; + } while (fi < fn); + c1 = this.costab[tri + 0]; + s1 = this.costab[tri + 1]; + for (i = 1; i < kx; i++) { + let c2: number = 1 - 2 * s1 * s1; + const s2 = 2 * s1 * c1; + fi = fzPos + i; + gi = fzPos + k1 - i; + do { + let a: number; + let b: number; + b = s2 * fz[fi + k1] - c2 * fz[gi + k1]; + a = c2 * fz[fi + k1] + s2 * fz[gi + k1]; + const f1 = fz[fi + 0] - a; + const f0 = fz[fi + 0] + a; + const g1 = fz[gi + 0] - b; + const g0 = fz[gi + 0] + b; + b = s2 * fz[fi + k3] - c2 * fz[gi + k3]; + a = c2 * fz[fi + k3] + s2 * fz[gi + k3]; + const f3 = fz[fi + k2] - a; + const f2 = fz[fi + k2] + a; + const g3 = fz[gi + k2] - b; + const g2 = fz[gi + k2] + b; + b = s1 * f2 - c1 * g3; + a = c1 * f2 + s1 * g3; + fz[fi + k2] = f0 - a; + fz[fi + 0] = f0 + a; + fz[gi + k3] = g1 - b; + fz[gi + k1] = g1 + b; + b = c1 * g2 - s1 * f3; + a = s1 * g2 + c1 * f3; + fz[gi + k2] = g0 - a; + fz[gi + 0] = g0 + a; + fz[fi + k3] = f1 - b; + fz[fi + k1] = f1 + b; + gi += k4; + fi += k4; + } while (fi < fn); + c2 = c1; + c1 = c2 * this.costab[tri + 0] - s1 * this.costab[tri + 1]; + s1 = c2 * this.costab[tri + 1] + s1 * this.costab[tri + 0]; + } + tri += 2; + } while (k4 < n); + } + + private readonly rv_tbl = [ + 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, 0x10, 0x90, 0x50, 0xd0, + 0x30, 0xb0, 0x70, 0xf0, 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, + 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, 0x04, 0x84, 0x44, 0xc4, + 0x24, 0xa4, 0x64, 0xe4, 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, + 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, 0x1c, 0x9c, 0x5c, 0xdc, + 0x3c, 0xbc, 0x7c, 0xfc, 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, + 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, 0x0a, 0x8a, 0x4a, 0xca, + 0x2a, 0xaa, 0x6a, 0xea, 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, + 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, 0x16, 0x96, 0x56, 0xd6, + 0x36, 0xb6, 0x76, 0xf6, 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, + 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, + ] as const; + + fft_short( + _gfc: LameInternalFlags, + x_real: Float32Array[], + chn: number, + buffer: Float32Array[], + bufPos: number + ) { + for (let b = 0; b < 3; b++) { + let x = BLKSIZE_s / 2; + const k = 0xffff & ((576 / 3) * (b + 1)); + let j = BLKSIZE_s / 8 - 1; + do { + let f0; + let f1; + let f2; + let f3; + let w; + const i = this.rv_tbl[j << 2] & 0xff; + + f0 = this.window_s[i] * buffer[chn][bufPos + i + k]; + w = this.window_s[0x7f - i] * buffer[chn][bufPos + i + k + 0x80]; + f1 = f0 - w; + f0 += w; + f2 = this.window_s[i + 0x40] * buffer[chn][bufPos + i + k + 0x40]; + w = this.window_s[0x3f - i] * buffer[chn][bufPos + i + k + 0xc0]; + f3 = f2 - w; + f2 += w; + + x -= 4; + x_real[b][x + 0] = f0 + f2; + x_real[b][x + 2] = f0 - f2; + x_real[b][x + 1] = f1 + f3; + x_real[b][x + 3] = f1 - f3; + + f0 = this.window_s[i + 0x01] * buffer[chn][bufPos + i + k + 0x01]; + w = this.window_s[0x7e - i] * buffer[chn][bufPos + i + k + 0x81]; + f1 = f0 - w; + f0 += w; + f2 = this.window_s[i + 0x41] * buffer[chn][bufPos + i + k + 0x41]; + w = this.window_s[0x3e - i] * buffer[chn][bufPos + i + k + 0xc1]; + f3 = f2 - w; + f2 += w; + + x_real[b][x + BLKSIZE_s / 2 + 0] = f0 + f2; + x_real[b][x + BLKSIZE_s / 2 + 2] = f0 - f2; + x_real[b][x + BLKSIZE_s / 2 + 1] = f1 + f3; + x_real[b][x + BLKSIZE_s / 2 + 3] = f1 - f3; + } while (--j >= 0); + + this.fht(x_real[b], x, BLKSIZE_s / 2); + } + } + + fft_long( + _gfc: LameInternalFlags, + y: Float32Array, + chn: number, + buffer: Float32Array[], + bufPos: number + ) { + let jj = BLKSIZE / 8 - 1; + let x = BLKSIZE / 2; + + do { + let f0; + let f1; + let f2; + let f3; + let w; + const i = this.rv_tbl[jj] & 0xff; + f0 = this.window[i] * buffer[chn][bufPos + i]; + w = this.window[i + 0x200] * buffer[chn][bufPos + i + 0x200]; + f1 = f0 - w; + f0 += w; + f2 = this.window[i + 0x100] * buffer[chn][bufPos + i + 0x100]; + w = this.window[i + 0x300] * buffer[chn][bufPos + i + 0x300]; + f3 = f2 - w; + f2 += w; + + x -= 4; + y[x + 0] = f0 + f2; + y[x + 2] = f0 - f2; + y[x + 1] = f1 + f3; + y[x + 3] = f1 - f3; + + f0 = this.window[i + 0x001] * buffer[chn][bufPos + i + 0x001]; + w = this.window[i + 0x201] * buffer[chn][bufPos + i + 0x201]; + f1 = f0 - w; + f0 += w; + f2 = this.window[i + 0x101] * buffer[chn][bufPos + i + 0x101]; + w = this.window[i + 0x301] * buffer[chn][bufPos + i + 0x301]; + f3 = f2 - w; + f2 += w; + + y[x + BLKSIZE / 2 + 0] = f0 + f2; + y[x + BLKSIZE / 2 + 2] = f0 - f2; + y[x + BLKSIZE / 2 + 1] = f1 + f3; + y[x + BLKSIZE / 2 + 3] = f1 - f3; + } while (--jj >= 0); + + this.fht(y, x, BLKSIZE / 2); + } + + init() { + for (let i = 0; i < BLKSIZE; i++) { + this.window[i] = + 0.42 - + 0.5 * Math.cos((2 * Math.PI * (i + 0.5)) / BLKSIZE) + + 0.08 * Math.cos((4 * Math.PI * (i + 0.5)) / BLKSIZE); + } + + for (let i = 0; i < BLKSIZE_s / 2; i++) { + this.window_s[i] = + 0.5 * (1.0 - Math.cos((2.0 * Math.PI * (i + 0.5)) / BLKSIZE_s)); + } + } +} diff --git a/packages/mp3-encoder/src/lame/GainAnalysis.ts b/packages/mp3-encoder/src/lame/GainAnalysis.ts new file mode 100644 index 0000000000..d364219ec2 --- /dev/null +++ b/packages/mp3-encoder/src/lame/GainAnalysis.ts @@ -0,0 +1,577 @@ +import type { ReplayGain } from './ReplayGain'; +import { copyArray, fillArray } from './arrays'; +import { fsqr } from './math'; + +export class GainAnalysis { + static readonly STEPS_per_dB = 100; + + static readonly MAX_dB = 120; + + static readonly GAIN_NOT_ENOUGH_SAMPLES = -24601; + + static readonly GAIN_ANALYSIS_ERROR = 0; + + static readonly GAIN_ANALYSIS_OK = 1; + + static readonly INIT_GAIN_ANALYSIS_ERROR = 0; + + static readonly INIT_GAIN_ANALYSIS_OK = 1; + + static readonly YULE_ORDER = 10; + + static readonly MAX_ORDER = GainAnalysis.YULE_ORDER; + + static readonly MAX_SAMP_FREQ = 48000; + + static readonly RMS_WINDOW_TIME_NUMERATOR = 1; + + static readonly RMS_WINDOW_TIME_DENOMINATOR = 20; + + static readonly MAX_SAMPLES_PER_WINDOW = + (GainAnalysis.MAX_SAMP_FREQ * GainAnalysis.RMS_WINDOW_TIME_NUMERATOR) / + GainAnalysis.RMS_WINDOW_TIME_DENOMINATOR + + 1; + + private static readonly PINK_REF = 64.82; + + private static readonly RMS_PERCENTILE = 0.95; + + private ABYule = [ + [ + 0.038575994352, -3.84664617118067, -0.02160367184185, 7.81501653005538, + -0.00123395316851, -11.34170355132042, -0.00009291677959, + 13.05504219327545, -0.01655260341619, -12.28759895145294, + 0.02161526843274, 9.4829380631979, -0.02074045215285, -5.87257861775999, + 0.00594298065125, 2.75465861874613, 0.00306428023191, -0.86984376593551, + 0.00012025322027, 0.13919314567432, 0.00288463683916, + ], + [ + 0.0541865640643, -3.47845948550071, -0.02911007808948, 6.36317777566148, + -0.00848709379851, -8.54751527471874, -0.00851165645469, 9.4769360780128, + -0.00834990904936, -8.81498681370155, 0.02245293253339, 6.85401540936998, + -0.02596338512915, -4.39470996079559, 0.01624864962975, 2.19611684890774, + -0.00240879051584, -0.75104302451432, 0.00674613682247, 0.13149317958808, + -0.00187763777362, + ], + [ + 0.15457299681924, -2.37898834973084, -0.09331049056315, 2.84868151156327, + -0.06247880153653, -2.64577170229825, 0.02163541888798, 2.23697657451713, + -0.05588393329856, -1.67148153367602, 0.04781476674921, 1.00595954808547, + 0.00222312597743, -0.45953458054983, 0.03174092540049, 0.16378164858596, + -0.01390589421898, -0.05032077717131, 0.00651420667831, 0.0234789740702, + -0.00881362733839, + ], + [ + 0.30296907319327, -1.61273165137247, -0.22613988682123, 1.0797749225997, + -0.08587323730772, -0.2565625775407, 0.03282930172664, -0.1627671912044, + -0.00915702933434, -0.22638893773906, -0.02364141202522, 0.39120800788284, + -0.00584456039913, -0.22138138954925, 0.06276101321749, 0.04500235387352, + -0.00000828086748, 0.02005851806501, 0.00205861885564, 0.00302439095741, + -0.02950134983287, + ], + [ + 0.33642304856132, -1.49858979367799, -0.2557224142557, 0.87350271418188, + -0.11828570177555, 0.12205022308084, 0.11921148675203, -0.80774944671438, + -0.07834489609479, 0.47854794562326, -0.0046997791438, -0.12453458140019, + -0.0058950022444, -0.04067510197014, 0.05724228140351, 0.08333755284107, + 0.00832043980773, -0.04237348025746, -0.0163538138454, 0.02977207319925, + -0.0176017656815, + ], + [ + 0.4491525660845, -0.62820619233671, -0.14351757464547, 0.29661783706366, + -0.22784394429749, -0.372563729424, -0.01419140100551, 0.00213767857124, + 0.04078262797139, -0.42029820170918, -0.12398163381748, 0.22199650564824, + 0.04097565135648, 0.00613424350682, 0.10478503600251, 0.06747620744683, + -0.01863887810927, 0.05784820375801, -0.03193428438915, 0.03222754072173, + 0.00541907748707, + ], + [ + 0.56619470757641, -1.04800335126349, -0.75464456939302, 0.29156311971249, + 0.1624213774223, -0.26806001042947, 0.16744243493672, 0.00819999645858, + -0.18901604199609, 0.45054734505008, 0.3093178284183, -0.33032403314006, + -0.27562961986224, 0.0673936833311, 0.00647310677246, -0.04784254229033, + 0.08647503780351, 0.01639907836189, -0.0378898455484, 0.01807364323573, + -0.00588215443421, + ], + [ + 0.58100494960553, -0.51035327095184, -0.53174909058578, -0.31863563325245, + -0.14289799034253, -0.20256413484477, 0.17520704835522, 0.1472815413433, + 0.02377945217615, 0.38952639978999, 0.15558449135573, -0.23313271880868, + -0.25344790059353, -0.05246019024463, 0.01628462406333, -0.02505961724053, + 0.06920467763959, 0.02442357316099, -0.03721611395801, 0.01818801111503, + -0.00749618797172, + ], + [ + 0.53648789255105, -0.2504987195602, -0.42163034350696, -0.43193942311114, + -0.00275953611929, -0.03424681017675, 0.04267842219415, -0.04678328784242, + -0.10214864179676, 0.26408300200955, 0.14590772289388, 0.15113130533216, + -0.02459864859345, -0.17556493366449, -0.11202315195388, + -0.18823009262115, -0.04060034127, 0.05477720428674, 0.0478866554818, + 0.0470440968812, -0.02217936801134, + ], + ]; + + private ABButter = [ + [ + 0.98621192462708, -1.97223372919527, -1.97242384925416, 0.97261396931306, + 0.98621192462708, + ], + [ + 0.98500175787242, -1.96977855582618, -1.97000351574484, 0.9702284756635, + 0.98500175787242, + ], + [ + 0.97938932735214, -1.95835380975398, -1.95877865470428, 0.95920349965459, + 0.97938932735214, + ], + [ + 0.97531843204928, -1.95002759149878, -1.95063686409857, 0.95124613669835, + 0.97531843204928, + ], + [ + 0.97316523498161, -1.94561023566527, -1.94633046996323, 0.94705070426118, + 0.97316523498161, + ], + [ + 0.96454515552826, -1.92783286977036, -1.92909031105652, 0.93034775234268, + 0.96454515552826, + ], + [ + 0.96009142950541, -1.91858953033784, -1.92018285901082, 0.92177618768381, + 0.96009142950541, + ], + [ + 0.95856916599601, -1.9154210807478, -1.91713833199203, 0.91885558323625, + 0.95856916599601, + ], + [ + 0.94597685600279, -1.88903307939452, -1.89195371200558, 0.89487434461664, + 0.94597685600279, + ], + ]; + + private filterYule( + input: Float32Array, + inputPos: number, + output: Float32Array, + outputPos: number, + nSamples: number, + kernel: number[] + ): void { + while (nSamples-- !== 0) { + output[outputPos] = + 1e-10 + + input[inputPos + 0] * kernel[0] - + output[outputPos - 1] * kernel[1] + + input[inputPos - 1] * kernel[2] - + output[outputPos - 2] * kernel[3] + + input[inputPos - 2] * kernel[4] - + output[outputPos - 3] * kernel[5] + + input[inputPos - 3] * kernel[6] - + output[outputPos - 4] * kernel[7] + + input[inputPos - 4] * kernel[8] - + output[outputPos - 5] * kernel[9] + + input[inputPos - 5] * kernel[10] - + output[outputPos - 6] * kernel[11] + + input[inputPos - 6] * kernel[12] - + output[outputPos - 7] * kernel[13] + + input[inputPos - 7] * kernel[14] - + output[outputPos - 8] * kernel[15] + + input[inputPos - 8] * kernel[16] - + output[outputPos - 9] * kernel[17] + + input[inputPos - 9] * kernel[18] - + output[outputPos - 10] * kernel[19] + + input[inputPos - 10] * kernel[20]; + ++outputPos; + ++inputPos; + } + } + + private filterButter( + input: Float32Array, + inputPos: number, + output: Float32Array, + outputPos: number, + nSamples: number, + kernel: number[] + ) { + while (nSamples-- !== 0) { + output[outputPos] = + input[inputPos + 0] * kernel[0] - + output[outputPos - 1] * kernel[1] + + input[inputPos - 1] * kernel[2] - + output[outputPos - 2] * kernel[3] + + input[inputPos - 2] * kernel[4]; + ++outputPos; + ++inputPos; + } + } + + private resetSampleFrequency(rgData: ReplayGain, samplefreq: number) { + for (let i = 0; i < GainAnalysis.MAX_ORDER; i++) { + rgData.linprebuf[i] = 0; + rgData.lstepbuf[i] = 0; + rgData.loutbuf[i] = 0; + rgData.rinprebuf[i] = 0; + rgData.rstepbuf[i] = 0; + rgData.routbuf[i] = 0; + } + + switch (Math.trunc(samplefreq)) { + case 48000: + rgData.reqindex = 0; + break; + case 44100: + rgData.reqindex = 1; + break; + case 32000: + rgData.reqindex = 2; + break; + case 24000: + rgData.reqindex = 3; + break; + case 22050: + rgData.reqindex = 4; + break; + case 16000: + rgData.reqindex = 5; + break; + case 12000: + rgData.reqindex = 6; + break; + case 11025: + rgData.reqindex = 7; + break; + case 8000: + rgData.reqindex = 8; + break; + default: + return GainAnalysis.INIT_GAIN_ANALYSIS_ERROR; + } + + rgData.sampleWindow = Math.trunc( + (samplefreq * GainAnalysis.RMS_WINDOW_TIME_NUMERATOR + + GainAnalysis.RMS_WINDOW_TIME_DENOMINATOR - + 1) / + GainAnalysis.RMS_WINDOW_TIME_DENOMINATOR + ); + + rgData.lsum = 0; + rgData.rsum = 0; + rgData.totsamp = 0; + + fillArray(rgData.A, 0); + + return GainAnalysis.INIT_GAIN_ANALYSIS_OK; + } + + initGainAnalysis(rgData: ReplayGain, samplefreq: number) { + if ( + this.resetSampleFrequency(rgData, samplefreq) !== + GainAnalysis.INIT_GAIN_ANALYSIS_OK + ) { + return GainAnalysis.INIT_GAIN_ANALYSIS_ERROR; + } + + rgData.linpre = GainAnalysis.MAX_ORDER; + rgData.rinpre = GainAnalysis.MAX_ORDER; + rgData.lstep = GainAnalysis.MAX_ORDER; + rgData.rstep = GainAnalysis.MAX_ORDER; + rgData.lout = GainAnalysis.MAX_ORDER; + rgData.rout = GainAnalysis.MAX_ORDER; + + fillArray(rgData.B, 0); + + return GainAnalysis.INIT_GAIN_ANALYSIS_OK; + } + + analyzeSamples( + rgData: ReplayGain, + left_samples: Float32Array, + left_samplesPos: number, + right_samples: Float32Array, + right_samplesPos: number, + num_samples: number, + num_channels: number + ) { + let curleft; + let curleftBase; + let curright; + let currightBase; + let batchsamples; + let cursamples; + let cursamplepos; + + if (num_samples === 0) return GainAnalysis.GAIN_ANALYSIS_OK; + + cursamplepos = 0; + batchsamples = num_samples; + + switch (num_channels) { + case 1: + right_samples = left_samples; + right_samplesPos = left_samplesPos; + break; + case 2: + break; + default: + return GainAnalysis.GAIN_ANALYSIS_ERROR; + } + + if (num_samples < GainAnalysis.MAX_ORDER) { + copyArray( + left_samples, + left_samplesPos, + rgData.linprebuf, + GainAnalysis.MAX_ORDER, + num_samples + ); + copyArray( + right_samples, + right_samplesPos, + rgData.rinprebuf, + GainAnalysis.MAX_ORDER, + num_samples + ); + } else { + copyArray( + left_samples, + left_samplesPos, + rgData.linprebuf, + GainAnalysis.MAX_ORDER, + GainAnalysis.MAX_ORDER + ); + copyArray( + right_samples, + right_samplesPos, + rgData.rinprebuf, + GainAnalysis.MAX_ORDER, + GainAnalysis.MAX_ORDER + ); + } + + while (batchsamples > 0) { + cursamples = + batchsamples > rgData.sampleWindow - rgData.totsamp + ? rgData.sampleWindow - rgData.totsamp + : batchsamples; + if (cursamplepos < GainAnalysis.MAX_ORDER) { + curleft = rgData.linpre + cursamplepos; + curleftBase = rgData.linprebuf; + curright = rgData.rinpre + cursamplepos; + currightBase = rgData.rinprebuf; + if (cursamples > GainAnalysis.MAX_ORDER - cursamplepos) + cursamples = GainAnalysis.MAX_ORDER - cursamplepos; + } else { + curleft = left_samplesPos + cursamplepos; + curleftBase = left_samples; + curright = right_samplesPos + cursamplepos; + currightBase = right_samples; + } + + this.filterYule( + curleftBase, + curleft, + rgData.lstepbuf, + rgData.lstep + rgData.totsamp, + cursamples, + this.ABYule[rgData.reqindex] + ); + this.filterYule( + currightBase, + curright, + rgData.rstepbuf, + rgData.rstep + rgData.totsamp, + cursamples, + this.ABYule[rgData.reqindex] + ); + + this.filterButter( + rgData.lstepbuf, + rgData.lstep + rgData.totsamp, + rgData.loutbuf, + rgData.lout + rgData.totsamp, + cursamples, + this.ABButter[rgData.reqindex] + ); + this.filterButter( + rgData.rstepbuf, + rgData.rstep + rgData.totsamp, + rgData.routbuf, + rgData.rout + rgData.totsamp, + cursamples, + this.ABButter[rgData.reqindex] + ); + + curleft = rgData.lout + rgData.totsamp; + + curleftBase = rgData.loutbuf; + curright = rgData.rout + rgData.totsamp; + currightBase = rgData.routbuf; + + let i = cursamples % 8; + while (i-- !== 0) { + rgData.lsum += fsqr(curleftBase[curleft++]); + rgData.rsum += fsqr(currightBase[curright++]); + } + i = cursamples / 8; + while (i-- !== 0) { + rgData.lsum += + fsqr(curleftBase[curleft + 0]) + + fsqr(curleftBase[curleft + 1]) + + fsqr(curleftBase[curleft + 2]) + + fsqr(curleftBase[curleft + 3]) + + fsqr(curleftBase[curleft + 4]) + + fsqr(curleftBase[curleft + 5]) + + fsqr(curleftBase[curleft + 6]) + + fsqr(curleftBase[curleft + 7]); + curleft += 8; + rgData.rsum += + fsqr(currightBase[curright + 0]) + + fsqr(currightBase[curright + 1]) + + fsqr(currightBase[curright + 2]) + + fsqr(currightBase[curright + 3]) + + fsqr(currightBase[curright + 4]) + + fsqr(currightBase[curright + 5]) + + fsqr(currightBase[curright + 6]) + + fsqr(currightBase[curright + 7]); + curright += 8; + } + + batchsamples -= cursamples; + cursamplepos += cursamples; + rgData.totsamp += cursamples; + if (rgData.totsamp === rgData.sampleWindow) { + const val = + GainAnalysis.STEPS_per_dB * + 10 * + Math.log10( + ((rgData.lsum + rgData.rsum) / rgData.totsamp) * 0.5 + 1e-37 + ); + let ival = val <= 0 ? 0 : Math.trunc(val); + if (ival >= rgData.A.length) ival = rgData.A.length - 1; + rgData.A[ival]++; + rgData.lsum = 0; + rgData.rsum = 0; + + copyArray( + rgData.loutbuf, + rgData.totsamp, + rgData.loutbuf, + 0, + GainAnalysis.MAX_ORDER + ); + copyArray( + rgData.routbuf, + rgData.totsamp, + rgData.routbuf, + 0, + GainAnalysis.MAX_ORDER + ); + copyArray( + rgData.lstepbuf, + rgData.totsamp, + rgData.lstepbuf, + 0, + GainAnalysis.MAX_ORDER + ); + copyArray( + rgData.rstepbuf, + rgData.totsamp, + rgData.rstepbuf, + 0, + GainAnalysis.MAX_ORDER + ); + rgData.totsamp = 0; + } + if (rgData.totsamp > rgData.sampleWindow) { + return GainAnalysis.GAIN_ANALYSIS_ERROR; + } + } + if (num_samples < GainAnalysis.MAX_ORDER) { + copyArray( + rgData.linprebuf, + num_samples, + rgData.linprebuf, + 0, + GainAnalysis.MAX_ORDER - num_samples + ); + copyArray( + rgData.rinprebuf, + num_samples, + rgData.rinprebuf, + 0, + GainAnalysis.MAX_ORDER - num_samples + ); + copyArray( + left_samples, + left_samplesPos, + rgData.linprebuf, + GainAnalysis.MAX_ORDER - num_samples, + num_samples + ); + copyArray( + right_samples, + right_samplesPos, + rgData.rinprebuf, + GainAnalysis.MAX_ORDER - num_samples, + num_samples + ); + } else { + copyArray( + left_samples, + left_samplesPos + num_samples - GainAnalysis.MAX_ORDER, + rgData.linprebuf, + 0, + GainAnalysis.MAX_ORDER + ); + copyArray( + right_samples, + right_samplesPos + num_samples - GainAnalysis.MAX_ORDER, + rgData.rinprebuf, + 0, + GainAnalysis.MAX_ORDER + ); + } + + return GainAnalysis.GAIN_ANALYSIS_OK; + } + + private analyzeResult(Array: Int32Array, len: number) { + let i; + + let elems = 0; + for (i = 0; i < len; i++) elems += Array[i]; + if (elems === 0) return GainAnalysis.GAIN_NOT_ENOUGH_SAMPLES; + + let upper = Math.ceil(elems * (1 - GainAnalysis.RMS_PERCENTILE)); + for (i = len; i-- > 0; ) { + if ((upper -= Array[i]) <= 0) break; + } + + return GainAnalysis.PINK_REF - i / GainAnalysis.STEPS_per_dB; + } + + getTitleGain(rgData: ReplayGain) { + const retval = this.analyzeResult(rgData.A, rgData.A.length); + + for (let i = 0; i < rgData.A.length; i++) { + rgData.B[i] += rgData.A[i]; + rgData.A[i] = 0; + } + + for (let i = 0; i < GainAnalysis.MAX_ORDER; i++) { + rgData.linprebuf[i] = 0; + rgData.lstepbuf[i] = 0; + rgData.loutbuf[i] = 0; + rgData.rinprebuf[i] = 0; + rgData.rstepbuf[i] = 0; + rgData.routbuf[i] = 0; + } + + rgData.totsamp = 0; + rgData.lsum = 0; + rgData.rsum = 0; + return retval; + } +} diff --git a/packages/mp3-encoder/src/lame/GrInfo.ts b/packages/mp3-encoder/src/lame/GrInfo.ts new file mode 100644 index 0000000000..3e6c919bf8 --- /dev/null +++ b/packages/mp3-encoder/src/lame/GrInfo.ts @@ -0,0 +1,105 @@ +import { SFBMAX } from './constants'; + +export class GrInfo { + xr = new Float32Array(576); + + l3_enc = new Int32Array(576); + + scalefac = new Int32Array(SFBMAX); + + xrpow_max = 0; + + part2_3_length = 0; + + big_values = 0; + + count1 = 0; + + global_gain = 0; + + scalefac_compress = 0; + + block_type = 0; + + mixed_block_flag = 0; + + table_select = new Int32Array(3); + + subblock_gain = new Int32Array(3 + 1); + + region0_count = 0; + + region1_count = 0; + + preflag = 0; + + scalefac_scale = 0; + + count1table_select = 0; + + part2_length = 0; + + sfb_lmax = 0; + + sfb_smin = 0; + + psy_lmax = 0; + + sfbmax = 0; + + psymax = 0; + + sfbdivide = 0; + + width = new Int32Array(SFBMAX); + + window = new Int32Array(SFBMAX); + + count1bits = 0; + + sfb_partition_table: readonly number[] | null = null; + + slen = new Int32Array(4); + + max_nonzero_coeff = 0; + + assign(other: GrInfo) { + this.xr = new Float32Array(other.xr); + this.l3_enc = new Int32Array(other.l3_enc); + this.scalefac = new Int32Array(other.scalefac); + this.xrpow_max = other.xrpow_max; + + this.part2_3_length = other.part2_3_length; + this.big_values = other.big_values; + this.count1 = other.count1; + this.global_gain = other.global_gain; + this.scalefac_compress = other.scalefac_compress; + this.block_type = other.block_type; + this.mixed_block_flag = other.mixed_block_flag; + this.table_select = new Int32Array(other.table_select); + this.subblock_gain = new Int32Array(other.subblock_gain); + this.region0_count = other.region0_count; + this.region1_count = other.region1_count; + this.preflag = other.preflag; + this.scalefac_scale = other.scalefac_scale; + this.count1table_select = other.count1table_select; + + this.part2_length = other.part2_length; + this.sfb_lmax = other.sfb_lmax; + this.sfb_smin = other.sfb_smin; + this.psy_lmax = other.psy_lmax; + this.sfbmax = other.sfbmax; + this.psymax = other.psymax; + this.sfbdivide = other.sfbdivide; + this.width = new Int32Array(other.width); + this.window = new Int32Array(other.window); + this.count1bits = other.count1bits; + + this.sfb_partition_table = + other.sfb_partition_table !== null + ? Array.from(other.sfb_partition_table) + : null; + this.slen = new Int32Array(other.slen); + this.max_nonzero_coeff = other.max_nonzero_coeff; + } +} diff --git a/packages/mp3-encoder/src/lame/Header.ts b/packages/mp3-encoder/src/lame/Header.ts new file mode 100644 index 0000000000..4105be1b8b --- /dev/null +++ b/packages/mp3-encoder/src/lame/Header.ts @@ -0,0 +1,7 @@ +export class Header { + write_timing = 0; + + ptr = 0; + + readonly buf = new Uint8Array(40); +} diff --git a/packages/mp3-encoder/src/lame/HuffCodeTab.ts b/packages/mp3-encoder/src/lame/HuffCodeTab.ts new file mode 100644 index 0000000000..f89929d04f --- /dev/null +++ b/packages/mp3-encoder/src/lame/HuffCodeTab.ts @@ -0,0 +1,9 @@ +export interface HuffCodeTab { + xlen: number; + + linmax: number; + + table?: readonly number[]; + + hlen?: readonly number[]; +} diff --git a/packages/mp3-encoder/src/lame/IIISideInfo.ts b/packages/mp3-encoder/src/lame/IIISideInfo.ts new file mode 100644 index 0000000000..c48b143a46 --- /dev/null +++ b/packages/mp3-encoder/src/lame/IIISideInfo.ts @@ -0,0 +1,17 @@ +import { GrInfo } from './GrInfo'; + +export class IIISideInfo { + tt = Array.from({ length: 2 }, () => + Array.from({ length: 2 }, () => new GrInfo()) + ); + + main_data_begin = 0; + + private_bits = 0; + + resvDrain_pre = 0; + + resvDrain_post = 0; + + scfsi = Array.from({ length: 2 }, () => new Int32Array(4)); +} diff --git a/packages/mp3-encoder/src/lame/III_psy_ratio.ts b/packages/mp3-encoder/src/lame/III_psy_ratio.ts new file mode 100644 index 0000000000..0c92c14112 --- /dev/null +++ b/packages/mp3-encoder/src/lame/III_psy_ratio.ts @@ -0,0 +1,7 @@ +import { III_psy_xmin } from './III_psy_xmin'; + +export class III_psy_ratio { + thm = new III_psy_xmin(); + + en = new III_psy_xmin(); +} diff --git a/packages/mp3-encoder/src/lame/III_psy_xmin.ts b/packages/mp3-encoder/src/lame/III_psy_xmin.ts new file mode 100644 index 0000000000..0307462e4c --- /dev/null +++ b/packages/mp3-encoder/src/lame/III_psy_xmin.ts @@ -0,0 +1,17 @@ +import { copyArray } from './arrays'; +import { SBMAX_l, SBMAX_s } from './constants'; + +export class III_psy_xmin { + l = new Float32Array(SBMAX_l); + + s = Array.from({ length: SBMAX_s }, () => new Float32Array(3)); + + assign(iii_psy_xmin: Readonly) { + copyArray(iii_psy_xmin.l, 0, this.l, 0, SBMAX_l); + for (let i = 0; i < SBMAX_s; i++) { + for (let j = 0; j < 3; j++) { + this.s[i][j] = iii_psy_xmin.s[i][j]; + } + } + } +} diff --git a/packages/mp3-encoder/src/lame/InOut.ts b/packages/mp3-encoder/src/lame/InOut.ts new file mode 100644 index 0000000000..0f857f2426 --- /dev/null +++ b/packages/mp3-encoder/src/lame/InOut.ts @@ -0,0 +1,5 @@ +export class InOut { + n_in = 0; + + n_out = 0; +} diff --git a/packages/mp3-encoder/src/lame/Lame.ts b/packages/mp3-encoder/src/lame/Lame.ts new file mode 100644 index 0000000000..c19d7e4307 --- /dev/null +++ b/packages/mp3-encoder/src/lame/Lame.ts @@ -0,0 +1,1342 @@ +import { BitStream } from './BitStream'; +import { CBRNewIterationLoop } from './CBRNewIterationLoop'; +import { Encoder } from './Encoder'; +import { GainAnalysis } from './GainAnalysis'; +import { InOut } from './InOut'; +import { LameGlobalFlags } from './LameGlobalFlags'; +import { MPEGMode } from './MPEGMode'; +import { NumUsed } from './NumUsed'; +import { Presets } from './Presets'; +import { PsyModel } from './PsyModel'; +import { Quantize } from './Quantize'; +import { ScaleFac } from './ScaleFac'; +import { ShortBlock } from './ShortBlock'; +import { VbrMode } from './VbrMode'; +import { assert } from './assert'; +import { findBitrateIndex, findNearestBitrate, getBitrate } from './bitrates'; +import { + BLKSIZE, + BPC, + ENCDELAY, + FFTOFFSET, + LAME_ID, + MFSIZE, + MPG_MD_MS_LR, + POSTDELAY, + PSFB12, + PSFB21, + SBMAX_l, + SBMAX_s, +} from './constants'; +import { isCloseToEachOther, blackmanWindow, gcd } from './math'; +import type { SampleRate } from './sampleRates'; +import { findNearestSampleRate } from './sampleRates'; + +export class Lame { + private readonly bs: BitStream; + + private readonly p: Presets = new Presets(); + + private readonly qu: Quantize; + + private readonly enc: Encoder; + + constructor() { + this.bs = new BitStream(); + this.qu = new Quantize(this.bs); + this.enc = new Encoder(this.bs, this.qu.qupvt.psy); + } + + lame_init(channels: number, samplerate: number, kbps: number) { + const gfp = new LameGlobalFlags(channels, samplerate, kbps); + this.lame_init_params(gfp); + return gfp; + } + + // eslint-disable-next-line complexity + private lame_init_params(gfp: LameGlobalFlags): void { + const gfc = gfp.internal_flags; + + gfc.Class_ID = 0; + + gfc.channels_in = gfp.num_channels; + if (gfc.channels_in === 1) { + gfp.mode = MPEGMode.MONO; + } + gfc.channels_out = gfp.mode === MPEGMode.MONO ? 1 : 2; + gfc.mode_ext = MPG_MD_MS_LR; + + if ( + gfp.VBR === VbrMode.vbr_off && + gfp.VBR_mean_bitrate_kbps !== 128 && + gfp.brate === 0 + ) { + gfp.brate = gfp.VBR_mean_bitrate_kbps; + } + + if (gfp.VBR === VbrMode.vbr_off && gfp.brate === 0) { + if (isCloseToEachOther(gfp.compression_ratio, 0)) { + gfp.compression_ratio = 11.025; + } + } + + if (gfp.VBR === VbrMode.vbr_off && gfp.compression_ratio > 0) { + if (gfp.out_samplerate === 0) { + gfp.out_samplerate = findNearestSampleRate( + Math.trunc(0.97 * gfp.in_samplerate) + ); + } + + gfp.brate = Math.trunc( + (gfp.out_samplerate * 16 * gfc.channels_out) / + (1e3 * gfp.compression_ratio) + ); + + Lame.smpFrqIndex(gfp); + + gfp.brate = findNearestBitrate( + gfp.brate, + gfp.version, + gfp.out_samplerate + ); + } + + if (gfp.out_samplerate !== 0) { + if (gfp.out_samplerate < 16000) { + gfp.VBR_mean_bitrate_kbps = Math.max(gfp.VBR_mean_bitrate_kbps, 8); + gfp.VBR_mean_bitrate_kbps = Math.min(gfp.VBR_mean_bitrate_kbps, 64); + } else if (gfp.out_samplerate < 32000) { + gfp.VBR_mean_bitrate_kbps = Math.max(gfp.VBR_mean_bitrate_kbps, 8); + gfp.VBR_mean_bitrate_kbps = Math.min(gfp.VBR_mean_bitrate_kbps, 160); + } else { + gfp.VBR_mean_bitrate_kbps = Math.max(gfp.VBR_mean_bitrate_kbps, 32); + gfp.VBR_mean_bitrate_kbps = Math.min(gfp.VBR_mean_bitrate_kbps, 320); + } + } + + if (gfp.lowpassfreq === 0) { + let lowpass: number; + + switch (gfp.VBR) { + case VbrMode.vbr_off: { + lowpass = this.p.abrPresets.getOptimumBandwidth(gfp.brate); + break; + } + case VbrMode.vbr_abr: { + lowpass = this.p.abrPresets.getOptimumBandwidth( + gfp.VBR_mean_bitrate_kbps + ); + break; + } + case VbrMode.vbr_rh: { + const x = [ + 19500, 19000, 18600, 18000, 17500, 16000, 15600, 14900, 12500, + 10000, 3950, + ]; + if (gfp.VBR_q >= 0 && gfp.VBR_q <= 9) { + lowpass = x[gfp.VBR_q]; + } else { + lowpass = 19500; + } + break; + } + default: { + const x = [ + 19500, 19000, 18500, 18000, 17500, 16500, 15500, 14500, 12500, 9500, + 3950, + ]; + if (gfp.VBR_q >= 0 && gfp.VBR_q <= 9) { + lowpass = x[gfp.VBR_q]; + } else { + lowpass = 19500; + } + } + } + if ( + gfp.mode === MPEGMode.MONO && + (gfp.VBR === VbrMode.vbr_off || gfp.VBR === VbrMode.vbr_abr) + ) { + lowpass *= 1.5; + } + + gfp.lowpassfreq = Math.trunc(lowpass); + } + + if (gfp.out_samplerate === 0) { + if (2 * gfp.lowpassfreq > gfp.in_samplerate) { + gfp.lowpassfreq = gfp.in_samplerate / 2; + } + gfp.out_samplerate = this.optimum_samplefreq( + Math.trunc(gfp.lowpassfreq), + gfp.in_samplerate + ); + } + + gfp.lowpassfreq = Math.min(20500, gfp.lowpassfreq); + gfp.lowpassfreq = Math.min(gfp.out_samplerate / 2, gfp.lowpassfreq); + + if (gfp.VBR === VbrMode.vbr_off) { + gfp.compression_ratio = + (gfp.out_samplerate * 16 * gfc.channels_out) / (1e3 * gfp.brate); + } + if (gfp.VBR === VbrMode.vbr_abr) { + gfp.compression_ratio = + (gfp.out_samplerate * 16 * gfc.channels_out) / + (1e3 * gfp.VBR_mean_bitrate_kbps); + } + + gfc.findPeakSample = false; + + gfc.findReplayGain = false; + + if (gfc.findReplayGain) { + if ( + this.bs.ga.initGainAnalysis(gfc.rgdata, gfp.out_samplerate) === + GainAnalysis.INIT_GAIN_ANALYSIS_ERROR + ) { + throw new Error('INIT_GAIN_ANALYSIS_ERROR'); + } + } + + gfc.mode_gr = gfp.out_samplerate <= 24000 ? 1 : 2; + + gfp.framesize = 576 * gfc.mode_gr; + + gfc.resample_ratio = gfp.in_samplerate / gfp.out_samplerate; + + switch (gfp.VBR) { + case VbrMode.vbr_mt: + case VbrMode.vbr_rh: + case VbrMode.vbr_mtrh: + { + const cmp = [5.7, 6.5, 7.3, 8.2, 10, 11.9, 13, 14, 15, 16.5]; + gfp.compression_ratio = cmp[gfp.VBR_q]; + } + break; + case VbrMode.vbr_abr: + gfp.compression_ratio = + (gfp.out_samplerate * 16 * gfc.channels_out) / + (1e3 * gfp.VBR_mean_bitrate_kbps); + break; + default: + gfp.compression_ratio = + (gfp.out_samplerate * 16 * gfc.channels_out) / (1e3 * gfp.brate); + break; + } + + if (gfp.mode === MPEGMode.NOT_SET) { + gfp.mode = MPEGMode.JOINT_STEREO; + } + + gfc.highpass1 = 0; + gfc.highpass2 = 0; + + if (gfp.lowpassfreq > 0) { + gfc.lowpass2 = 2 * gfp.lowpassfreq; + + gfc.lowpass1 = (1 - 0.0) * 2 * gfp.lowpassfreq; + + gfc.lowpass1 /= gfp.out_samplerate; + gfc.lowpass2 /= gfp.out_samplerate; + } else { + gfc.lowpass1 = 0; + gfc.lowpass2 = 0; + } + + this.lame_init_params_ppflt(gfp); + + Lame.smpFrqIndex(gfp); + if (gfc.samplerate_index < 0) { + throw new Error('Invalid sample rate'); + } + + if (gfp.VBR === VbrMode.vbr_off) { + gfp.brate = findNearestBitrate( + gfp.brate, + gfp.version, + gfp.out_samplerate + ); + gfc.bitrate_index = findBitrateIndex( + gfp.brate, + gfp.version, + gfp.out_samplerate + ); + } else { + gfc.bitrate_index = 1; + } + + this.bs.resetPointers(gfc); + + const j = + gfc.samplerate_index + + 3 * gfp.version + + 6 * (gfp.out_samplerate < 16000 ? 1 : 0); + for (let i = 0; i < SBMAX_l + 1; i++) + gfc.scalefac_band.l[i] = this.sfBandIndex[j].l[i]; + + for (let i = 0; i < PSFB21 + 1; i++) { + const size = (gfc.scalefac_band.l[22] - gfc.scalefac_band.l[21]) / PSFB21; + const start = gfc.scalefac_band.l[21] + i * size; + gfc.scalefac_band.psfb21[i] = start; + } + gfc.scalefac_band.psfb21[PSFB21] = 576; + + for (let i = 0; i < SBMAX_s + 1; i++) { + gfc.scalefac_band.s[i] = this.sfBandIndex[j].s[i]; + } + + for (let i = 0; i < PSFB12 + 1; i++) { + const size = (gfc.scalefac_band.s[13] - gfc.scalefac_band.s[12]) / PSFB12; + const start = gfc.scalefac_band.s[12] + i * size; + gfc.scalefac_band.psfb12[i] = start; + } + gfc.scalefac_band.psfb12[PSFB12] = 192; + + if (gfp.version === 1) { + gfc.sideinfo_len = gfc.channels_out === 1 ? 4 + 17 : 4 + 32; + } else { + gfc.sideinfo_len = gfc.channels_out === 1 ? 4 + 9 : 4 + 17; + } + + this.lame_init_bitstream(gfp); + + gfc.Class_ID = LAME_ID; + + let k; + + for (k = 0; k < 19; k++) { + gfc.nsPsy.pefirbuf[k] = 700 * gfc.mode_gr * gfc.channels_out; + } + + if (gfp.ATHtype === -1) { + gfp.ATHtype = 4; + } + + assert(gfp.VBR_q <= 9); + assert(gfp.VBR_q >= 0); + + switch (gfp.VBR) { + case VbrMode.vbr_mt: + gfp.VBR = VbrMode.vbr_mtrh; + + // eslint-disable-next-line no-fallthrough + case VbrMode.vbr_mtrh: { + this.p.applyPresetFromQuality(gfp, gfp.VBR_q); + + if (gfp.quality < 0) gfp.quality = Lame.LAME_DEFAULT_QUALITY; + if (gfp.quality < 5) gfp.quality = 0; + if (gfp.quality > 5) gfp.quality = 5; + + gfc.PSY.mask_adjust = gfp.maskingadjust; + gfc.PSY.mask_adjust_short = gfp.maskingadjust_short; + + if (gfp.experimentalY) gfc.sfb21_extra = false; + else gfc.sfb21_extra = gfp.out_samplerate > 44000; + + gfc.iteration_loop = new CBRNewIterationLoop(this.qu); + break; + } + case VbrMode.vbr_rh: { + this.p.applyPresetFromQuality(gfp, gfp.VBR_q); + + gfc.PSY.mask_adjust = gfp.maskingadjust; + gfc.PSY.mask_adjust_short = gfp.maskingadjust_short; + + if (gfp.experimentalY) { + gfc.sfb21_extra = false; + } else gfc.sfb21_extra = gfp.out_samplerate > 44000; + + if (gfp.quality > 6) { + gfp.quality = 6; + } + + if (gfp.quality < 0) { + gfp.quality = Lame.LAME_DEFAULT_QUALITY; + } + + gfc.iteration_loop = new CBRNewIterationLoop(this.qu); + break; + } + + default: { + gfc.sfb21_extra = false; + + if (gfp.quality < 0) { + gfp.quality = Lame.LAME_DEFAULT_QUALITY; + } + + const vbrmode = gfp.VBR; + if (vbrmode === VbrMode.vbr_off) { + gfp.VBR_mean_bitrate_kbps = gfp.brate; + } + + this.p.apply(gfp, gfp.VBR_mean_bitrate_kbps); + gfp.VBR = vbrmode; + + gfc.PSY.mask_adjust = gfp.maskingadjust; + gfc.PSY.mask_adjust_short = gfp.maskingadjust_short; + + if (vbrmode === VbrMode.vbr_off) { + gfc.iteration_loop = new CBRNewIterationLoop(this.qu); + } else { + gfc.iteration_loop = new CBRNewIterationLoop(this.qu); + } + break; + } + } + assert(gfp.scale >= 0); + + if (gfp.VBR !== VbrMode.vbr_off) { + gfc.VBR_min_bitrate = 1; + + gfc.VBR_max_bitrate = 14; + + if (gfp.out_samplerate < 16000) { + gfc.VBR_max_bitrate = 8; + } + + if (gfp.VBR_min_bitrate_kbps !== 0) { + gfp.VBR_min_bitrate_kbps = findNearestBitrate( + gfp.VBR_min_bitrate_kbps, + gfp.version, + gfp.out_samplerate + ); + gfc.VBR_min_bitrate = findBitrateIndex( + gfp.VBR_min_bitrate_kbps, + gfp.version, + gfp.out_samplerate + ); + } + if (gfp.VBR_max_bitrate_kbps !== 0) { + gfp.VBR_max_bitrate_kbps = findNearestBitrate( + gfp.VBR_max_bitrate_kbps, + gfp.version, + gfp.out_samplerate + ); + gfc.VBR_max_bitrate = findBitrateIndex( + gfp.VBR_max_bitrate_kbps, + gfp.version, + gfp.out_samplerate + ); + } + gfp.VBR_min_bitrate_kbps = getBitrate(gfp.version, gfc.VBR_min_bitrate); + gfp.VBR_max_bitrate_kbps = getBitrate(gfp.version, gfc.VBR_max_bitrate); + gfp.VBR_mean_bitrate_kbps = Math.min( + getBitrate(gfp.version, gfc.VBR_max_bitrate), + gfp.VBR_mean_bitrate_kbps + ); + gfp.VBR_mean_bitrate_kbps = Math.max( + getBitrate(gfp.version, gfc.VBR_min_bitrate), + gfp.VBR_mean_bitrate_kbps + ); + } + + this.lame_init_qval(gfp); + assert(gfp.scale >= 0); + + gfc.ATH.useAdjust = 3; + + gfc.ATH.aaSensitivityP = Math.pow(10.0, gfp.athaa_sensitivity / -10.0); + + if (gfp.short_blocks === null) { + gfp.short_blocks = ShortBlock.short_block_allowed; + } + + if ( + gfp.short_blocks === ShortBlock.short_block_allowed && + (gfp.mode === MPEGMode.JOINT_STEREO || gfp.mode === MPEGMode.STEREO) + ) { + gfp.short_blocks = ShortBlock.short_block_coupled; + } + + if (gfp.quant_comp < 0) { + gfp.quant_comp = 1; + } + if (gfp.quant_comp_short < 0) { + gfp.quant_comp_short = 0; + } + + if (gfp.msfix < 0) { + gfp.msfix = 0; + } + + gfp.exp_nspsytune |= 1; + + if (gfp.internal_flags.nsPsy.attackthre < 0) { + gfp.internal_flags.nsPsy.attackthre = PsyModel.NSATTACKTHRE; + } + if (gfp.internal_flags.nsPsy.attackthre_s < 0) { + gfp.internal_flags.nsPsy.attackthre_s = PsyModel.NSATTACKTHRE_S; + } + + assert(gfp.scale >= 0); + + if (gfp.scale < 0) { + gfp.scale = 1; + } + + if (gfp.ATHtype < 0) { + gfp.ATHtype = 4; + } + + if (gfp.ATHcurve < 0) { + gfp.ATHcurve = 4; + } + + if (gfp.athaa_loudapprox < 0) { + gfp.athaa_loudapprox = 2; + } + + if (gfp.interChRatio < 0) { + gfp.interChRatio = 0; + } + + gfc.slot_lag = 0; + gfc.frac_SpF = 0; + if (gfp.VBR === VbrMode.vbr_off) { + gfc.frac_SpF = + ((gfp.version + 1) * 72000 * gfp.brate) % + Math.trunc(gfp.out_samplerate); + gfc.slot_lag = gfc.frac_SpF; + } + + this.qu.qupvt.iteration_init(gfp, this.qu.tak); + this.qu.qupvt.psy.psymodel_init(gfp); + assert(gfp.scale >= 0); + } + + private filterCoeficient(x: number) { + if (x > 1.0) { + return 0.0; + } + if (x <= 0.0) { + return 1.0; + } + + return Math.cos((Math.PI / 2) * x); + } + + private optimum_samplefreq( + lowpassfreq: number, + input_samplefreq: number + ): SampleRate { + let suggested_samplefreq: SampleRate = 44100; + + if (input_samplefreq >= 48000) suggested_samplefreq = 48000; + else if (input_samplefreq >= 44100) suggested_samplefreq = 44100; + else if (input_samplefreq >= 32000) suggested_samplefreq = 32000; + else if (input_samplefreq >= 24000) suggested_samplefreq = 24000; + else if (input_samplefreq >= 22050) suggested_samplefreq = 22050; + else if (input_samplefreq >= 16000) suggested_samplefreq = 16000; + else if (input_samplefreq >= 12000) suggested_samplefreq = 12000; + else if (input_samplefreq >= 11025) suggested_samplefreq = 11025; + else if (input_samplefreq >= 8000) suggested_samplefreq = 8000; + + if (lowpassfreq === -1) return suggested_samplefreq; + + if (lowpassfreq <= 15960) suggested_samplefreq = 44100; + if (lowpassfreq <= 15250) suggested_samplefreq = 32000; + if (lowpassfreq <= 11220) suggested_samplefreq = 24000; + if (lowpassfreq <= 9970) suggested_samplefreq = 22050; + if (lowpassfreq <= 7230) suggested_samplefreq = 16000; + if (lowpassfreq <= 5420) suggested_samplefreq = 12000; + if (lowpassfreq <= 4510) suggested_samplefreq = 11025; + if (lowpassfreq <= 3970) suggested_samplefreq = 8000; + + if (input_samplefreq < suggested_samplefreq) { + if (input_samplefreq > 44100) return 48000; + if (input_samplefreq > 32000) return 44100; + if (input_samplefreq > 24000) return 32000; + if (input_samplefreq > 22050) return 24000; + if (input_samplefreq > 16000) return 22050; + if (input_samplefreq > 12000) return 16000; + if (input_samplefreq > 11025) return 12000; + if (input_samplefreq > 8000) return 11025; + return 8000; + } + + return suggested_samplefreq; + } + + private static smpFrqIndex(gpf: LameGlobalFlags): void { + switch (gpf.out_samplerate) { + case 44100: + gpf.version = 1; + gpf.internal_flags.samplerate_index = 0; + return; + case 48000: + gpf.version = 1; + gpf.internal_flags.samplerate_index = 1; + return; + case 32000: + gpf.version = 1; + gpf.internal_flags.samplerate_index = 2; + return; + case 22050: + gpf.version = 0; + gpf.internal_flags.samplerate_index = 0; + return; + case 24000: + gpf.version = 0; + gpf.internal_flags.samplerate_index = 1; + return; + case 16000: + gpf.version = 0; + gpf.internal_flags.samplerate_index = 2; + return; + case 11025: + gpf.version = 0; + gpf.internal_flags.samplerate_index = 0; + return; + case 12000: + gpf.version = 0; + gpf.internal_flags.samplerate_index = 1; + return; + case 8000: + gpf.version = 0; + gpf.internal_flags.samplerate_index = 2; + return; + default: + gpf.version = 0; + gpf.internal_flags.samplerate_index = -1; + } + } + + private lame_init_params_ppflt(gfp: LameGlobalFlags) { + const gfc = gfp.internal_flags; + + let lowpass_band = 32; + let highpass_band = -1; + + if (gfc.lowpass1 > 0) { + let minband = 999; + for (let band = 0; band <= 31; band++) { + const freq = band / 31.0; + + if (freq >= gfc.lowpass2) { + lowpass_band = Math.min(lowpass_band, band); + } + if (gfc.lowpass1 < freq && freq < gfc.lowpass2) { + minband = Math.min(minband, band); + } + } + + if (minband === 999) { + gfc.lowpass1 = (lowpass_band - 0.75) / 31.0; + } else { + gfc.lowpass1 = (minband - 0.75) / 31.0; + } + gfc.lowpass2 = lowpass_band / 31.0; + } + + if (gfc.highpass2 > 0) { + if (gfc.highpass2 < 0.9 * (0.75 / 31.0)) { + gfc.highpass1 = 0; + gfc.highpass2 = 0; + console.warn( + 'Warning: highpass filter disabled. highpass frequency too small' + ); + } + } + + if (gfc.highpass2 > 0) { + let maxband = -1; + for (let band = 0; band <= 31; band++) { + const freq = band / 31.0; + + if (freq <= gfc.highpass1) { + highpass_band = Math.max(highpass_band, band); + } + if (gfc.highpass1 < freq && freq < gfc.highpass2) { + maxband = Math.max(maxband, band); + } + } + + gfc.highpass1 = highpass_band / 31.0; + if (maxband === -1) { + gfc.highpass2 = (highpass_band + 0.75) / 31.0; + } else { + gfc.highpass2 = (maxband + 0.75) / 31.0; + } + } + + for (let band = 0; band < 32; band++) { + let fc1; + let fc2; + const freq = band / 31.0; + if (gfc.highpass2 > gfc.highpass1) { + fc1 = this.filterCoeficient( + (gfc.highpass2 - freq) / (gfc.highpass2 - gfc.highpass1 + 1e-20) + ); + } else { + fc1 = 1.0; + } + if (gfc.lowpass2 > gfc.lowpass1) { + fc2 = this.filterCoeficient( + (freq - gfc.lowpass1) / (gfc.lowpass2 - gfc.lowpass1 + 1e-20) + ); + } else { + fc2 = 1.0; + } + gfc.amp_filter[band] = fc1 * fc2; + } + } + + private lame_init_qval(gfp: LameGlobalFlags) { + const gfc = gfp.internal_flags; + + switch (gfp.quality) { + default: + case 9: + gfc.psymodel = 0; + gfc.noise_shaping = 0; + gfc.noise_shaping_amp = 0; + gfc.noise_shaping_stop = 0; + gfc.use_best_huffman = 0; + gfc.full_outer_loop = 0; + break; + + case 8: + gfp.quality = 7; + + // eslint-disable-next-line no-fallthrough + case 7: + gfc.psymodel = 1; + gfc.noise_shaping = 0; + gfc.noise_shaping_amp = 0; + gfc.noise_shaping_stop = 0; + gfc.use_best_huffman = 0; + gfc.full_outer_loop = 0; + break; + + case 6: + gfc.psymodel = 1; + if (gfc.noise_shaping === 0) gfc.noise_shaping = 1; + gfc.noise_shaping_amp = 0; + gfc.noise_shaping_stop = 0; + if (gfc.subblock_gain === -1) gfc.subblock_gain = 1; + gfc.use_best_huffman = 0; + gfc.full_outer_loop = 0; + break; + + case 5: + gfc.psymodel = 1; + if (gfc.noise_shaping === 0) gfc.noise_shaping = 1; + gfc.noise_shaping_amp = 0; + gfc.noise_shaping_stop = 0; + if (gfc.subblock_gain === -1) gfc.subblock_gain = 1; + gfc.use_best_huffman = 0; + gfc.full_outer_loop = 0; + break; + + case 4: + gfc.psymodel = 1; + if (gfc.noise_shaping === 0) gfc.noise_shaping = 1; + gfc.noise_shaping_amp = 0; + gfc.noise_shaping_stop = 0; + if (gfc.subblock_gain === -1) gfc.subblock_gain = 1; + gfc.use_best_huffman = 1; + gfc.full_outer_loop = 0; + break; + + case 3: + gfc.psymodel = 1; + if (gfc.noise_shaping === 0) gfc.noise_shaping = 1; + gfc.noise_shaping_amp = 1; + gfc.noise_shaping_stop = 1; + if (gfc.subblock_gain === -1) gfc.subblock_gain = 1; + gfc.use_best_huffman = 1; + gfc.full_outer_loop = 0; + break; + + case 2: + gfc.psymodel = 1; + if (gfc.noise_shaping === 0) gfc.noise_shaping = 1; + if (gfc.substep_shaping === 0) gfc.substep_shaping = 2; + gfc.noise_shaping_amp = 1; + gfc.noise_shaping_stop = 1; + if (gfc.subblock_gain === -1) gfc.subblock_gain = 1; + gfc.use_best_huffman = 1; + + gfc.full_outer_loop = 0; + break; + + case 1: + gfc.psymodel = 1; + if (gfc.noise_shaping === 0) gfc.noise_shaping = 1; + if (gfc.substep_shaping === 0) gfc.substep_shaping = 2; + gfc.noise_shaping_amp = 2; + gfc.noise_shaping_stop = 1; + if (gfc.subblock_gain === -1) gfc.subblock_gain = 1; + gfc.use_best_huffman = 1; + gfc.full_outer_loop = 0; + break; + + case 0: + gfc.psymodel = 1; + if (gfc.noise_shaping === 0) gfc.noise_shaping = 1; + if (gfc.substep_shaping === 0) gfc.substep_shaping = 2; + gfc.noise_shaping_amp = 2; + gfc.noise_shaping_stop = 1; + if (gfc.subblock_gain === -1) gfc.subblock_gain = 1; + gfc.use_best_huffman = 1; + + gfc.full_outer_loop = 0; + + break; + } + } + + private lame_init_bitstream(gfp: LameGlobalFlags) { + const gfc = gfp.internal_flags; + gfp.frameNum = 0; + gfc.PeakSample = 0.0; + } + + private static readonly LAME_DEFAULT_QUALITY = 3; + + lame_encode_flush( + gfp: LameGlobalFlags, + mp3buffer: Uint8Array, + mp3bufferPos: number, + mp3buffer_size: number + ) { + const gfc = gfp.internal_flags; + + if (gfc.mf_samples_to_encode < 1) { + return 0; + } + + let samples_to_encode = gfc.mf_samples_to_encode - POSTDELAY; + if (gfp.in_samplerate !== gfp.out_samplerate) { + samples_to_encode += (16 * gfp.out_samplerate) / gfp.in_samplerate; + } + let end_padding = gfp.framesize - (samples_to_encode % gfp.framesize); + if (end_padding < 576) end_padding += gfp.framesize; + + let frames_left = (samples_to_encode + end_padding) / gfp.framesize; + + const buffer = Array.from({ length: 2 }, () => new Int16Array(1152)); + const mf_needed = Lame.calcNeeded(gfp); + let mp3count = 0; + let imp3 = 0; + let mp3buffer_size_remaining; + + while (frames_left > 0 && imp3 >= 0) { + let bunch = mf_needed - gfc.mf_size; + const frame_num = gfp.frameNum; + + bunch *= gfp.in_samplerate; + bunch /= gfp.out_samplerate; + if (bunch > 1152) bunch = 1152; + if (bunch < 1) bunch = 1; + + mp3buffer_size_remaining = mp3buffer_size - mp3count; + + if (mp3buffer_size === 0) mp3buffer_size_remaining = 0; + + imp3 = this.lame_encode_buffer( + gfp, + buffer[0], + buffer[1], + bunch, + mp3buffer, + mp3bufferPos, + mp3buffer_size_remaining + ); + + mp3bufferPos += imp3; + mp3count += imp3; + frames_left -= frame_num !== gfp.frameNum ? 1 : 0; + } + + gfc.mf_samples_to_encode = 0; + + if (imp3 < 0) { + return imp3; + } + + mp3buffer_size_remaining = mp3buffer_size - mp3count; + + if (mp3buffer_size === 0) mp3buffer_size_remaining = 0; + + this.bs.flush_bitstream(gfp); + imp3 = this.bs.copyFrameData( + gfc, + mp3buffer, + mp3bufferPos, + mp3buffer_size_remaining + ); + if (imp3 < 0) { + return imp3; + } + mp3bufferPos += imp3; + mp3count += imp3; + + return mp3count; + } + + lame_encode_buffer( + gfp: LameGlobalFlags, + buffer_l: Int16Array, + buffer_r: Int16Array, + nsamples: number, + mp3buf: Uint8Array, + mp3bufPos: number, + mp3buf_size: number + ) { + const gfc = gfp.internal_flags; + + if (gfc.Class_ID !== LAME_ID) return -3; + + if (nsamples === 0) return 0; + + if ( + gfc.in_buffer_0 === null || + gfc.in_buffer_1 === null || + gfc.in_buffer_nsamples < nsamples + ) { + gfc.in_buffer_0 = new Float32Array(nsamples); + gfc.in_buffer_1 = new Float32Array(nsamples); + gfc.in_buffer_nsamples = nsamples; + } + + const in_buffer = [gfc.in_buffer_0, gfc.in_buffer_1] as const; + + for (let i = 0; i < nsamples; i++) { + in_buffer[0][i] = buffer_l[i]; + if (gfc.channels_in > 1) { + in_buffer[1][i] = buffer_r[i]; + } + } + + return this.lame_encode_buffer_sample( + gfp, + in_buffer[0], + in_buffer[1], + nsamples, + mp3buf, + mp3bufPos, + mp3buf_size + ); + } + + private static calcNeeded(gfp: LameGlobalFlags) { + let mf_needed = BLKSIZE + gfp.framesize - FFTOFFSET; + + mf_needed = Math.max(mf_needed, 512 + gfp.framesize - 32); + assert(MFSIZE >= mf_needed); + + return mf_needed; + } + + private lame_encode_buffer_sample( + gfp: LameGlobalFlags, + buffer_l: Float32Array, + buffer_r: Float32Array, + nsamples: number, + mp3buf: Uint8Array, + mp3bufPos: number, + mp3buf_size: number + ) { + const gfc = gfp.internal_flags; + + if (gfc.Class_ID !== LAME_ID) return -3; + + if (nsamples === 0) return 0; + + const mp3out = this.bs.copyMetadata(gfc, mp3buf, mp3bufPos, mp3buf_size); + if (mp3out < 0) return mp3out; + + mp3bufPos += mp3out; + let mp3size = mp3out; + + const in_buffer = [buffer_l, buffer_r] as const; + + if ( + !isCloseToEachOther(gfp.scale, 0) && + !isCloseToEachOther(gfp.scale, 1.0) + ) { + for (let i = 0; i < nsamples; ++i) { + in_buffer[0][i] *= gfp.scale; + if (gfc.channels_out === 2) in_buffer[1][i] *= gfp.scale; + } + } + + if (gfp.num_channels === 2 && gfc.channels_out === 1) { + for (let i = 0; i < nsamples; ++i) { + in_buffer[0][i] = 0.5 * (in_buffer[0][i] + in_buffer[1][i]); + in_buffer[1][i] = 0.0; + } + } + + const mf_needed = Lame.calcNeeded(gfp); + + const mfbuf: [Float32Array, Float32Array] = [gfc.mfbuf[0], gfc.mfbuf[1]]; + + let in_bufferPos = 0; + while (nsamples > 0) { + const in_buffer_ptr: [Float32Array, Float32Array] = [ + in_buffer[0], + in_buffer[1], + ]; + + const inOut = new InOut(); + Lame.fill_buffer( + gfp, + mfbuf, + in_buffer_ptr, + in_bufferPos, + nsamples, + inOut + ); + const { n_in } = inOut; + const { n_out } = inOut; + + if (gfc.findReplayGain) + if ( + this.bs.ga.analyzeSamples( + gfc.rgdata, + mfbuf[0], + gfc.mf_size, + mfbuf[1], + gfc.mf_size, + n_out, + gfc.channels_out + ) === GainAnalysis.GAIN_ANALYSIS_ERROR + ) { + return -6; + } + + nsamples -= n_in; + in_bufferPos += n_in; + + gfc.mf_size += n_out; + assert(gfc.mf_size <= MFSIZE); + + if (gfc.mf_samples_to_encode < 1) { + gfc.mf_samples_to_encode = ENCDELAY + POSTDELAY; + } + gfc.mf_samples_to_encode += n_out; + + if (gfc.mf_size >= mf_needed) { + let buf_size = mp3buf_size - mp3size; + if (mp3buf_size === 0) buf_size = 0; + + const ret = this.lame_encode_frame( + gfp, + mfbuf[0], + mfbuf[1], + mp3buf, + mp3bufPos, + buf_size + ); + + if (ret < 0) return ret; + mp3bufPos += ret; + mp3size += ret; + + gfc.mf_size -= gfp.framesize; + gfc.mf_samples_to_encode -= gfp.framesize; + for (let ch = 0; ch < gfc.channels_out; ch++) { + for (let i = 0; i < gfc.mf_size; i++) { + mfbuf[ch][i] = mfbuf[ch][i + gfp.framesize]; + } + } + } + } + assert(nsamples === 0); + + return mp3size; + } + + private lame_encode_frame( + gfp: LameGlobalFlags, + inbuf_l: Float32Array, + inbuf_r: Float32Array, + mp3buf: Uint8Array, + mp3bufPos: number, + mp3buf_size: number + ) { + const ret = this.enc.lame_encode_mp3_frame( + gfp, + inbuf_l, + inbuf_r, + mp3buf, + mp3bufPos, + mp3buf_size + ); + gfp.frameNum++; + return ret; + } + + private static fill_buffer_resample( + gfp: LameGlobalFlags, + outbuf: Float32Array, + outbufPos: number, + desired_len: number, + inbuf: Float32Array, + in_bufferPos: number, + len: number, + num_used: NumUsed, + ch: number + ) { + const gfc = gfp.internal_flags; + let i; + let j = 0; + let k; + + let bpc = gfp.out_samplerate / gcd(gfp.out_samplerate, gfp.in_samplerate); + if (bpc > BPC) bpc = BPC; + + const intratio = + Math.abs(gfc.resample_ratio - Math.floor(0.5 + gfc.resample_ratio)) < + 0.0001 + ? 1 + : 0; + let fcn = 1.0 / gfc.resample_ratio; + if (fcn > 1.0) fcn = 1.0; + let filter_l = 31; + if (filter_l % 2 === 0) --filter_l; + + filter_l += intratio; + + const BLACKSIZE = filter_l + 1; + + if (!gfc.fill_buffer_resample_init) { + gfc.inbuf_old[0] = new Float32Array(BLACKSIZE); + gfc.inbuf_old[1] = new Float32Array(BLACKSIZE); + for (i = 0; i <= 2 * bpc; ++i) + gfc.blackfilt[i] = new Float32Array(BLACKSIZE); + + gfc.itime[0] = 0; + gfc.itime[1] = 0; + + for (j = 0; j <= 2 * bpc; j++) { + let sum = 0; + const offset = (j - bpc) / (2 * bpc); + for (i = 0; i <= filter_l; i++) { + gfc.blackfilt[j][i] = blackmanWindow(i - offset, fcn, filter_l); + sum += gfc.blackfilt[j][i]; + } + for (i = 0; i <= filter_l; i++) gfc.blackfilt[j][i] /= sum; + } + gfc.fill_buffer_resample_init = true; + } + + const inbuf_old = gfc.inbuf_old[ch]; + + for (k = 0; k < desired_len; k++) { + const time0 = k * gfc.resample_ratio; + + j = Math.floor(time0 - gfc.itime[ch]); + + if (filter_l + j - filter_l / 2 >= len) break; + + const offset = time0 - gfc.itime[ch] - (j + 0.5 * (filter_l % 2)); + assert(Math.abs(offset) <= 0.501); + + const joff = Math.floor(offset * 2 * bpc + bpc + 0.5); + let xvalue = 0; + for (i = 0; i <= filter_l; ++i) { + const j2 = Math.trunc(i + j - filter_l / 2); + assert(j2 < len); + assert(j2 + BLACKSIZE >= 0); + const y = j2 < 0 ? inbuf_old[BLACKSIZE + j2] : inbuf[in_bufferPos + j2]; + xvalue += y * gfc.blackfilt[joff][i]; + } + outbuf[outbufPos + k] = xvalue; + } + + num_used.num_used = Math.min(len, filter_l + j - filter_l / 2); + + gfc.itime[ch] += num_used.num_used - k * gfc.resample_ratio; + + if (num_used.num_used >= BLACKSIZE) { + for (i = 0; i < BLACKSIZE; i++) { + inbuf_old[i] = inbuf[in_bufferPos + num_used.num_used + i - BLACKSIZE]; + } + } else { + const n_shift = BLACKSIZE - num_used.num_used; + + for (i = 0; i < n_shift; ++i) { + inbuf_old[i] = inbuf_old[i + num_used.num_used]; + } + + for (j = 0; i < BLACKSIZE; ++i, ++j) { + inbuf_old[i] = inbuf[in_bufferPos + j]; + } + + assert(j === num_used.num_used); + } + return k; + } + + private static fill_buffer( + gfp: LameGlobalFlags, + mfbuf: [Float32Array, Float32Array], + in_buffer: Float32Array[], + in_bufferPos: number, + nsamples: number, + io: InOut + ) { + const gfc = gfp.internal_flags; + + if (gfc.resample_ratio < 0.9999 || gfc.resample_ratio > 1.0001) { + for (let ch = 0; ch < gfc.channels_out; ch++) { + const numUsed = new NumUsed(); + io.n_out = Lame.fill_buffer_resample( + gfp, + mfbuf[ch], + gfc.mf_size, + gfp.framesize, + in_buffer[ch], + in_bufferPos, + nsamples, + numUsed, + ch + ); + io.n_in = numUsed.num_used; + } + } else { + io.n_out = Math.min(gfp.framesize, nsamples); + io.n_in = io.n_out; + for (let i = 0; i < io.n_out; ++i) { + mfbuf[0][gfc.mf_size + i] = in_buffer[0][in_bufferPos + i]; + if (gfc.channels_out === 2) + mfbuf[1][gfc.mf_size + i] = in_buffer[1][in_bufferPos + i]; + } + } + } + + private readonly sfBandIndex = [ + new ScaleFac( + [ + 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, + 284, 336, 396, 464, 522, 576, + ], + [0, 4, 8, 12, 18, 24, 32, 42, 56, 74, 100, 132, 174, 192], + [0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0] + ), + + new ScaleFac( + [ + 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 114, 136, 162, 194, 232, + 278, 332, 394, 464, 540, 576, + ], + [0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 136, 180, 192], + [0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0] + ), + new ScaleFac( + [ + 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, + 284, 336, 396, 464, 522, 576, + ], + [0, 4, 8, 12, 18, 26, 36, 48, 62, 80, 104, 134, 174, 192], + [0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0] + ), + new ScaleFac( + [ + 0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 52, 62, 74, 90, 110, 134, 162, 196, + 238, 288, 342, 418, 576, + ], + [0, 4, 8, 12, 16, 22, 30, 40, 52, 66, 84, 106, 136, 192], + [0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0] + ), + new ScaleFac( + [ + 0, 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 60, 72, 88, 106, 128, 156, 190, + 230, 276, 330, 384, 576, + ], + [0, 4, 8, 12, 16, 22, 28, 38, 50, 64, 80, 100, 126, 192], + [0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0] + ), + new ScaleFac( + [ + 0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 54, 66, 82, 102, 126, 156, 194, + 240, 296, 364, 448, 550, 576, + ], + [0, 4, 8, 12, 16, 22, 30, 42, 58, 78, 104, 138, 180, 192], + [0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0] + ), + new ScaleFac( + [ + 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, + 284, 336, 396, 464, 522, 576, + ], + [ + 0 / 3, + 12 / 3, + 24 / 3, + 36 / 3, + 54 / 3, + 78 / 3, + 108 / 3, + 144 / 3, + 186 / 3, + 240 / 3, + 312 / 3, + 402 / 3, + 522 / 3, + 576 / 3, + ], + [0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0] + ), + new ScaleFac( + [ + 0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, + 284, 336, 396, 464, 522, 576, + ], + [ + 0 / 3, + 12 / 3, + 24 / 3, + 36 / 3, + 54 / 3, + 78 / 3, + 108 / 3, + 144 / 3, + 186 / 3, + 240 / 3, + 312 / 3, + 402 / 3, + 522 / 3, + 576 / 3, + ], + [0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0] + ), + + new ScaleFac( + [ + 0, 12, 24, 36, 48, 60, 72, 88, 108, 132, 160, 192, 232, 280, 336, 400, + 476, 566, 568, 570, 572, 574, 576, + ], + [ + 0 / 3, + 24 / 3, + 48 / 3, + 72 / 3, + 108 / 3, + 156 / 3, + 216 / 3, + 288 / 3, + 372 / 3, + 480 / 3, + 486 / 3, + 492 / 3, + 498 / 3, + 576 / 3, + ], + [0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0] + ), + ] as const; +} diff --git a/packages/mp3-encoder/src/lame/LameGlobalFlags.ts b/packages/mp3-encoder/src/lame/LameGlobalFlags.ts new file mode 100644 index 0000000000..656d038c8e --- /dev/null +++ b/packages/mp3-encoder/src/lame/LameGlobalFlags.ts @@ -0,0 +1,80 @@ +import { LameInternalFlags } from './LameInternalFlags'; +import { MPEGMode } from './MPEGMode'; +import type { Quality } from './Quality'; +import type { ShortBlock } from './ShortBlock'; +import { VbrMode } from './VbrMode'; +import type { SampleRate } from './sampleRates'; + +export class LameGlobalFlags { + num_channels: number; + + in_samplerate: number; + + out_samplerate: SampleRate | 0 = 0; + + scale = -1; + + quality: Quality = 3; + + mode = MPEGMode.STEREO; + + brate: number; + + compression_ratio = 0; + + quant_comp = -1; + + quant_comp_short = -1; + + experimentalY = false; + + exp_nspsytune = 0; + + preset = 0; + + VBR = VbrMode.vbr_off; + + VBR_q: Quality = 4; + + VBR_mean_bitrate_kbps = 128; + + VBR_min_bitrate_kbps = 0; + + VBR_max_bitrate_kbps = 0; + + lowpassfreq = 0; + + maskingadjust = 0; + + maskingadjust_short = 0; + + ATHtype = -1; + + ATHcurve = -1; + + ATHlower = 0; + + athaa_loudapprox = -1; + + athaa_sensitivity = 0; + + short_blocks: ShortBlock | null = null; + + interChRatio = -1; + + msfix = -1; + + version: 0 | 1 = 0; + + framesize = 0; + + frameNum = 0; + + readonly internal_flags = new LameInternalFlags(); + + constructor(channels: number, samplerate: number, kbps: number) { + this.num_channels = channels; + this.in_samplerate = samplerate; + this.brate = kbps; + } +} diff --git a/packages/mp3-encoder/src/lame/LameInternalFlags.ts b/packages/mp3-encoder/src/lame/LameInternalFlags.ts new file mode 100644 index 0000000000..73c4441b7b --- /dev/null +++ b/packages/mp3-encoder/src/lame/LameInternalFlags.ts @@ -0,0 +1,237 @@ +import { ATH } from './ATH'; +import type { CBRNewIterationLoop } from './CBRNewIterationLoop'; +import { Header } from './Header'; +import { IIISideInfo } from './IIISideInfo'; +import { III_psy_xmin } from './III_psy_xmin'; +import { NsPsy } from './NsPsy'; +import { PSY } from './PSY'; +import { ReplayGain } from './ReplayGain'; +import { ScaleFac } from './ScaleFac'; +import { + BPC, + CBANDS, + ENCDELAY, + MAX_HEADER_BUF, + MDCTDELAY, + MFSIZE, + POSTDELAY, + SBLIMIT, + SBMAX_l, + SBMAX_s, + SFBMAX, +} from './constants'; + +export class LameInternalFlags { + Class_ID = 0; + + lame_encode_frame_init = false; + + iteration_init_init = false; + + fill_buffer_resample_init = false; + + readonly mfbuf = Array.from({ length: 2 }, () => new Float32Array(MFSIZE)); + + mode_gr = 0; + + channels_in = 0; + + channels_out = 0; + + resample_ratio = 1; + + mf_samples_to_encode = ENCDELAY + POSTDELAY; + + mf_size = ENCDELAY - MDCTDELAY; + + VBR_min_bitrate = 1; + + VBR_max_bitrate = 13; + + bitrate_index = 0; + + samplerate_index = 0; + + mode_ext = 0; + + lowpass1 = 0; + + lowpass2 = 0; + + highpass1 = 0; + + highpass2 = 0; + + noise_shaping = 0; + + noise_shaping_amp = 0; + + substep_shaping = 0; + + psymodel = 0; + + noise_shaping_stop = 0; + + subblock_gain = -1; + + use_best_huffman = 0; + + full_outer_loop = 0; + + readonly l3_side = new IIISideInfo(); + + padding = 0; + + frac_SpF = 0; + + slot_lag = 0; + + nMusicCRC = 0; + + oldValue = new Int32Array([180, 180]); + + currentStep = new Int32Array([4, 4]); + + masking_lower = 1; + + readonly bv_scf = new Int32Array(576); + + readonly pseudohalf = new Int32Array(SFBMAX); + + sfb21_extra = false; + + readonly inbuf_old = Array.from({ length: 2 }, () => new Float32Array()); + + readonly blackfilt = Array.from( + { length: 2 * BPC + 1 }, + () => new Float32Array() + ); + + readonly itime = new Float64Array(2); + + sideinfo_len = 0; + + readonly sb_sample = Array.from({ length: 2 }, () => + Array.from({ length: 2 }, () => + Array.from({ length: 18 }, () => new Float32Array(SBLIMIT)) + ) + ); + + readonly amp_filter = new Float32Array(32); + + readonly header = Array.from({ length: MAX_HEADER_BUF }, () => new Header()); + + h_ptr = 0; + + w_ptr = 0; + + ResvSize = 0; + + readonly scalefac_band = new ScaleFac(); + + readonly minval_l = new Float32Array(CBANDS); + + readonly minval_s = new Float32Array(CBANDS); + + readonly nb_1 = Array.from({ length: 4 }, () => new Float32Array(CBANDS)); + + readonly nb_2 = Array.from({ length: 4 }, () => new Float32Array(CBANDS)); + + readonly nb_s1 = Array.from({ length: 4 }, () => new Float32Array(CBANDS)); + + readonly nb_s2 = Array.from({ length: 4 }, () => new Float32Array(CBANDS)); + + s3_ss: Float32Array | null = null; + + s3_ll: Float32Array | null = null; + + decay = 0; + + readonly thm = Array.from({ length: 4 }, () => new III_psy_xmin()); + + readonly en = Array.from({ length: 4 }, () => new III_psy_xmin()); + + readonly tot_ener = new Float32Array(4); + + readonly loudness_sq = Array.from({ length: 2 }, () => new Float32Array(2)); + + readonly loudness_sq_save = new Float32Array(2); + + readonly mld_l = new Float32Array(SBMAX_l); + + readonly mld_s = new Float32Array(SBMAX_s); + + readonly bm_l = new Int32Array(SBMAX_l); + + readonly bo_l = new Int32Array(SBMAX_l); + + readonly bm_s = new Int32Array(SBMAX_s); + + readonly bo_s = new Int32Array(SBMAX_s); + + npart_l = 0; + + npart_s = 0; + + readonly s3ind = Array.from({ length: CBANDS }, () => new Int32Array(2)); + + readonly s3ind_s = Array.from({ length: CBANDS }, () => new Int32Array(2)); + + readonly numlines_s = new Int32Array(CBANDS); + + readonly numlines_l = new Int32Array(CBANDS); + + readonly rnumlines_l = new Float32Array(CBANDS); + + readonly mld_cb_l = new Float32Array(CBANDS); + + readonly mld_cb_s = new Float32Array(CBANDS); + + ms_ener_ratio_old = 0; + + readonly blocktype_old = new Int32Array(2); + + readonly nsPsy = new NsPsy(); + + readonly VBR_seek_table = { + nBytesWritten: 0, + }; + + readonly ATH = new ATH(); + + readonly PSY = new PSY(); + + findReplayGain = false; + + findPeakSample = false; + + PeakSample = 0; + + RadioGain = 0; + + AudiophileGain = 0; + + readonly rgdata = new ReplayGain(); + + noclipGainChange = 0; + + noclipScale = -1.0; + + readonly bitrate_stereoMode_Hist = Array.from( + { length: 16 }, + () => new Int32Array(4 + 1) + ); + + readonly bitrate_blockType_Hist = Array.from( + { length: 16 }, + () => new Int32Array(4 + 1 + 1) + ); + + in_buffer_nsamples = 0; + + in_buffer_0: Float32Array | null = null; + + in_buffer_1: Float32Array | null = null; + + iteration_loop: CBRNewIterationLoop | null = null; +} diff --git a/packages/mp3-encoder/src/lame/MPEGMode.ts b/packages/mp3-encoder/src/lame/MPEGMode.ts new file mode 100644 index 0000000000..4f9e5ea594 --- /dev/null +++ b/packages/mp3-encoder/src/lame/MPEGMode.ts @@ -0,0 +1,13 @@ +export class MPEGMode { + private constructor(public readonly ordinal: number) {} + + static readonly STEREO = new MPEGMode(0); + + static readonly JOINT_STEREO = new MPEGMode(1); + + static readonly DUAL_CHANNEL = new MPEGMode(2); + + static readonly MONO = new MPEGMode(3); + + static readonly NOT_SET = new MPEGMode(4); +} diff --git a/packages/mp3-encoder/src/lame/MeanBits.ts b/packages/mp3-encoder/src/lame/MeanBits.ts new file mode 100644 index 0000000000..a27c47b6d2 --- /dev/null +++ b/packages/mp3-encoder/src/lame/MeanBits.ts @@ -0,0 +1,3 @@ +export class MeanBits { + constructor(public bits: number) {} +} diff --git a/packages/mp3-encoder/src/lame/Mp3Encoder.spec.ts b/packages/mp3-encoder/src/lame/Mp3Encoder.spec.ts new file mode 100644 index 0000000000..1d9258fbb9 --- /dev/null +++ b/packages/mp3-encoder/src/lame/Mp3Encoder.spec.ts @@ -0,0 +1,102 @@ +import { createHash } from 'crypto'; +import { readFile } from 'fs/promises'; +import { join } from 'path'; + +import { Mp3Encoder } from './Mp3Encoder'; +import { WavHeader } from './WavHeader'; + +let leftSampleBuffer: ArrayBufferLike; +let rightSampleBuffer: ArrayBufferLike; + +beforeAll(async () => { + const leftPath = join('testdata', 'Left44100.wav'); + const rightPath = join('testdata', 'Right44100.wav'); + + leftSampleBuffer = new Uint8Array(await readFile(leftPath)).buffer; + rightSampleBuffer = new Uint8Array(await readFile(rightPath)).buffer; +}); + +test('mono', async () => { + const waveHeader = WavHeader.readHeader(new DataView(leftSampleBuffer)); + const samples = new Int16Array( + leftSampleBuffer, + waveHeader.dataOffset, + waveHeader.dataLen / 2 + ); + + const hash = createHash('sha1'); + hash.setEncoding('hex'); + + let remainingSamples = samples.length; + + const encoder = new Mp3Encoder(); + const maxSamples = 1152; + + for (let i = 0; remainingSamples >= maxSamples; i += maxSamples) { + const left = samples.subarray(i, i + maxSamples); + const right = samples.subarray(i, i + maxSamples); + + const mp3buf = encoder.encodeBuffer(left, right); + if (mp3buf.length > 0) { + hash.write(Buffer.from(mp3buf)); + } + remainingSamples -= maxSamples; + } + + const mp3buf = encoder.flush(); + if (mp3buf.length > 0) { + hash.write(Buffer.from(mp3buf)); + } + + hash.end(); + + expect(hash.read()).toBe('ca9292fc5fea3ba4cb07c4a0ba60cf0c267b783b'); +}); + +test('stereo', async () => { + const leftWaveHeader = WavHeader.readHeader(new DataView(leftSampleBuffer)); + const rightWaveHeader = WavHeader.readHeader(new DataView(rightSampleBuffer)); + + expect(leftWaveHeader.sampleRate).toBe(rightWaveHeader.sampleRate); + + const leftSamples = new Int16Array( + leftSampleBuffer, + leftWaveHeader.dataOffset, + leftWaveHeader.dataLen / 2 + ); + const rightSamples = new Int16Array( + rightSampleBuffer, + rightWaveHeader.dataOffset, + rightWaveHeader.dataLen / 2 + ); + + expect(leftSamples.length).toBe(rightSamples.length); + + const hash = createHash('sha1'); + hash.setEncoding('hex'); + + let remainingSamples = leftSamples.length; + + const encoder = new Mp3Encoder(2, leftWaveHeader.sampleRate, 128); + const maxSamples = 1152; + + for (let i = 0; remainingSamples >= maxSamples; i += maxSamples) { + const left = leftSamples.subarray(i, i + maxSamples); + const right = rightSamples.subarray(i, i + maxSamples); + + const mp3buf = encoder.encodeBuffer(left, right); + if (mp3buf.length > 0) { + hash.write(Buffer.from(mp3buf)); + } + remainingSamples -= maxSamples; + } + + const mp3buf = encoder.flush(); + if (mp3buf.length > 0) { + hash.write(Buffer.from(mp3buf)); + } + + hash.end(); + + expect(hash.read()).toBe('ab6daeb1c563389cafacc0ec4ed963ee8ae8e8d7'); +}); diff --git a/packages/mp3-encoder/src/lame/Mp3Encoder.ts b/packages/mp3-encoder/src/lame/Mp3Encoder.ts new file mode 100644 index 0000000000..55e2ad8154 --- /dev/null +++ b/packages/mp3-encoder/src/lame/Mp3Encoder.ts @@ -0,0 +1,57 @@ +import { Lame } from './Lame'; +import type { LameGlobalFlags } from './LameGlobalFlags'; + +export class Mp3Encoder { + private readonly lame: Lame; + + private readonly gfp: LameGlobalFlags; + + private mp3buf: Uint8Array; + + private mp3buf_size: number; + + private maxSamples: number; + + constructor(channels = 1, samplerate = 44100, kbps = 128) { + this.lame = new Lame(); + + this.gfp = this.lame.lame_init(channels, samplerate, kbps); + + this.maxSamples = 1152; + this.mp3buf_size = Math.trunc(1.25 * this.maxSamples + 7200); + this.mp3buf = new Uint8Array(this.mp3buf_size); + } + + encodeBuffer(left: Int16Array, right: Int16Array = left) { + if (left.length !== right.length) { + throw new Error('left and right channel buffers must be the same length'); + } + + if (left.length > this.maxSamples) { + this.maxSamples = left.length; + this.mp3buf_size = Math.trunc(1.25 * this.maxSamples + 7200); + this.mp3buf = new Uint8Array(this.mp3buf_size); + } + + const size = this.lame.lame_encode_buffer( + this.gfp, + left, + right, + left.length, + this.mp3buf, + 0, + this.mp3buf_size + ); + return new Uint8Array(this.mp3buf.subarray(0, size)); + } + + flush() { + const size = this.lame.lame_encode_flush( + this.gfp, + this.mp3buf, + 0, + this.mp3buf_size + ); + return new Uint8Array(this.mp3buf.subarray(0, size)); + } +} diff --git a/packages/mp3-encoder/src/lame/NewMDCT.ts b/packages/mp3-encoder/src/lame/NewMDCT.ts new file mode 100644 index 0000000000..28ea42c83a --- /dev/null +++ b/packages/mp3-encoder/src/lame/NewMDCT.ts @@ -0,0 +1,1050 @@ +import type { LameInternalFlags } from './LameInternalFlags'; +import { copyArray, fillArray } from './arrays'; +import { SHORT_TYPE } from './constants'; + +export class NewMDCT { + private readonly enwindow = [ + (-4.77e-7 * 0.740951125354959) / 2.384e-6, + (1.03951e-4 * 0.740951125354959) / 2.384e-6, + (9.53674e-4 * 0.740951125354959) / 2.384e-6, + (2.841473e-3 * 0.740951125354959) / 2.384e-6, + (3.5758972e-2 * 0.740951125354959) / 2.384e-6, + (3.401756e-3 * 0.740951125354959) / 2.384e-6, + (9.83715e-4 * 0.740951125354959) / 2.384e-6, + (9.9182e-5 * 0.740951125354959) / 2.384e-6, + (1.2398e-5 * 0.740951125354959) / 2.384e-6, + (1.91212e-4 * 0.740951125354959) / 2.384e-6, + (2.283096e-3 * 0.740951125354959) / 2.384e-6, + (1.6994476e-2 * 0.740951125354959) / 2.384e-6, + (-1.8756866e-2 * 0.740951125354959) / 2.384e-6, + (-2.630711e-3 * 0.740951125354959) / 2.384e-6, + (-2.47478e-4 * 0.740951125354959) / 2.384e-6, + (-1.4782e-5 * 0.740951125354959) / 2.384e-6, + 9.063471690191471e-1, + 1.960342806591213e-1, + + (-4.77e-7 * 0.773010453362737) / 2.384e-6, + (1.05858e-4 * 0.773010453362737) / 2.384e-6, + (9.30786e-4 * 0.773010453362737) / 2.384e-6, + (2.521515e-3 * 0.773010453362737) / 2.384e-6, + (3.5694122e-2 * 0.773010453362737) / 2.384e-6, + (3.643036e-3 * 0.773010453362737) / 2.384e-6, + (9.91821e-4 * 0.773010453362737) / 2.384e-6, + (9.6321e-5 * 0.773010453362737) / 2.384e-6, + (1.1444e-5 * 0.773010453362737) / 2.384e-6, + (1.65462e-4 * 0.773010453362737) / 2.384e-6, + (2.110004e-3 * 0.773010453362737) / 2.384e-6, + (1.6112804e-2 * 0.773010453362737) / 2.384e-6, + (-1.9634247e-2 * 0.773010453362737) / 2.384e-6, + (-2.803326e-3 * 0.773010453362737) / 2.384e-6, + (-2.77042e-4 * 0.773010453362737) / 2.384e-6, + (-1.6689e-5 * 0.773010453362737) / 2.384e-6, + 8.206787908286602e-1, + 3.901806440322567e-1, + + (-4.77e-7 * 0.803207531480645) / 2.384e-6, + (1.07288e-4 * 0.803207531480645) / 2.384e-6, + (9.02653e-4 * 0.803207531480645) / 2.384e-6, + (2.174854e-3 * 0.803207531480645) / 2.384e-6, + (3.5586357e-2 * 0.803207531480645) / 2.384e-6, + (3.858566e-3 * 0.803207531480645) / 2.384e-6, + (9.95159e-4 * 0.803207531480645) / 2.384e-6, + (9.346e-5 * 0.803207531480645) / 2.384e-6, + (1.0014e-5 * 0.803207531480645) / 2.384e-6, + (1.4019e-4 * 0.803207531480645) / 2.384e-6, + (1.937389e-3 * 0.803207531480645) / 2.384e-6, + (1.5233517e-2 * 0.803207531480645) / 2.384e-6, + (-2.0506859e-2 * 0.803207531480645) / 2.384e-6, + (-2.974033e-3 * 0.803207531480645) / 2.384e-6, + (-3.0756e-4 * 0.803207531480645) / 2.384e-6, + (-1.812e-5 * 0.803207531480645) / 2.384e-6, + 7.416505462720353e-1, + 5.805693545089249e-1, + + (-4.77e-7 * 0.831469612302545) / 2.384e-6, + (1.08242e-4 * 0.831469612302545) / 2.384e-6, + (8.68797e-4 * 0.831469612302545) / 2.384e-6, + (1.800537e-3 * 0.831469612302545) / 2.384e-6, + (3.54352e-2 * 0.831469612302545) / 2.384e-6, + (4.049301e-3 * 0.831469612302545) / 2.384e-6, + (9.94205e-4 * 0.831469612302545) / 2.384e-6, + (9.0599e-5 * 0.831469612302545) / 2.384e-6, + (9.06e-6 * 0.831469612302545) / 2.384e-6, + (1.16348e-4 * 0.831469612302545) / 2.384e-6, + (1.766682e-3 * 0.831469612302545) / 2.384e-6, + (1.4358521e-2 * 0.831469612302545) / 2.384e-6, + (-2.1372318e-2 * 0.831469612302545) / 2.384e-6, + (-3.14188e-3 * 0.831469612302545) / 2.384e-6, + (-3.39031e-4 * 0.831469612302545) / 2.384e-6, + (-1.955e-5 * 0.831469612302545) / 2.384e-6, + 6.681786379192989e-1, + 7.653668647301797e-1, + + (-4.77e-7 * 0.857728610000272) / 2.384e-6, + (1.08719e-4 * 0.857728610000272) / 2.384e-6, + (8.2922e-4 * 0.857728610000272) / 2.384e-6, + (1.399517e-3 * 0.857728610000272) / 2.384e-6, + (3.5242081e-2 * 0.857728610000272) / 2.384e-6, + (4.21524e-3 * 0.857728610000272) / 2.384e-6, + (9.89437e-4 * 0.857728610000272) / 2.384e-6, + (8.7261e-5 * 0.857728610000272) / 2.384e-6, + (8.106e-6 * 0.857728610000272) / 2.384e-6, + (9.3937e-5 * 0.857728610000272) / 2.384e-6, + (1.597881e-3 * 0.857728610000272) / 2.384e-6, + (1.3489246e-2 * 0.857728610000272) / 2.384e-6, + (-2.2228718e-2 * 0.857728610000272) / 2.384e-6, + (-3.306866e-3 * 0.857728610000272) / 2.384e-6, + (-3.71456e-4 * 0.857728610000272) / 2.384e-6, + (-2.1458e-5 * 0.857728610000272) / 2.384e-6, + 5.993769336819237e-1, + 9.427934736519954e-1, + + (-4.77e-7 * 0.881921264348355) / 2.384e-6, + (1.08719e-4 * 0.881921264348355) / 2.384e-6, + (7.8392e-4 * 0.881921264348355) / 2.384e-6, + (9.71317e-4 * 0.881921264348355) / 2.384e-6, + (3.5007e-2 * 0.881921264348355) / 2.384e-6, + (4.357815e-3 * 0.881921264348355) / 2.384e-6, + (9.80854e-4 * 0.881921264348355) / 2.384e-6, + (8.3923e-5 * 0.881921264348355) / 2.384e-6, + (7.629e-6 * 0.881921264348355) / 2.384e-6, + (7.2956e-5 * 0.881921264348355) / 2.384e-6, + (1.432419e-3 * 0.881921264348355) / 2.384e-6, + (1.2627602e-2 * 0.881921264348355) / 2.384e-6, + (-2.307415e-2 * 0.881921264348355) / 2.384e-6, + (-3.467083e-3 * 0.881921264348355) / 2.384e-6, + (-4.04358e-4 * 0.881921264348355) / 2.384e-6, + (-2.3365e-5 * 0.881921264348355) / 2.384e-6, + 5.345111359507916e-1, + 1.111140466039205, + + (-9.54e-7 * 0.903989293123443) / 2.384e-6, + (1.08242e-4 * 0.903989293123443) / 2.384e-6, + (7.31945e-4 * 0.903989293123443) / 2.384e-6, + (5.15938e-4 * 0.903989293123443) / 2.384e-6, + (3.4730434e-2 * 0.903989293123443) / 2.384e-6, + (4.477024e-3 * 0.903989293123443) / 2.384e-6, + (9.68933e-4 * 0.903989293123443) / 2.384e-6, + (8.0585e-5 * 0.903989293123443) / 2.384e-6, + (6.676e-6 * 0.903989293123443) / 2.384e-6, + (5.2929e-5 * 0.903989293123443) / 2.384e-6, + (1.269817e-3 * 0.903989293123443) / 2.384e-6, + (1.1775017e-2 * 0.903989293123443) / 2.384e-6, + (-2.3907185e-2 * 0.903989293123443) / 2.384e-6, + (-3.622532e-3 * 0.903989293123443) / 2.384e-6, + (-4.38213e-4 * 0.903989293123443) / 2.384e-6, + (-2.5272e-5 * 0.903989293123443) / 2.384e-6, + 4.729647758913199e-1, + 1.268786568327291, + + (-9.54e-7 * 0.9238795325112867) / 2.384e-6, + (1.06812e-4 * 0.9238795325112867) / 2.384e-6, + (6.74248e-4 * 0.9238795325112867) / 2.384e-6, + (3.3379e-5 * 0.9238795325112867) / 2.384e-6, + (3.4412861e-2 * 0.9238795325112867) / 2.384e-6, + (4.573822e-3 * 0.9238795325112867) / 2.384e-6, + (9.54151e-4 * 0.9238795325112867) / 2.384e-6, + (7.6771e-5 * 0.9238795325112867) / 2.384e-6, + (6.199e-6 * 0.9238795325112867) / 2.384e-6, + (3.4332e-5 * 0.9238795325112867) / 2.384e-6, + (1.111031e-3 * 0.9238795325112867) / 2.384e-6, + (1.0933399e-2 * 0.9238795325112867) / 2.384e-6, + (-2.4725437e-2 * 0.9238795325112867) / 2.384e-6, + (-3.771782e-3 * 0.9238795325112867) / 2.384e-6, + (-4.72546e-4 * 0.9238795325112867) / 2.384e-6, + (-2.7657e-5 * 0.9238795325112867) / 2.384e-6, + 0.41421356237309503, + 1.414213562373095, + + (-9.54e-7 * 0.941544065183021) / 2.384e-6, + (1.05381e-4 * 0.941544065183021) / 2.384e-6, + (6.10352e-4 * 0.941544065183021) / 2.384e-6, + (-4.75883e-4 * 0.941544065183021) / 2.384e-6, + (3.405571e-2 * 0.941544065183021) / 2.384e-6, + (4.649162e-3 * 0.941544065183021) / 2.384e-6, + (9.35555e-4 * 0.941544065183021) / 2.384e-6, + (7.3433e-5 * 0.941544065183021) / 2.384e-6, + (5.245e-6 * 0.941544065183021) / 2.384e-6, + (1.7166e-5 * 0.941544065183021) / 2.384e-6, + (9.56535e-4 * 0.941544065183021) / 2.384e-6, + (1.0103703e-2 * 0.941544065183021) / 2.384e-6, + (-2.5527e-2 * 0.941544065183021) / 2.384e-6, + (-3.914356e-3 * 0.941544065183021) / 2.384e-6, + (-5.07355e-4 * 0.941544065183021) / 2.384e-6, + (-3.0041e-5 * 0.941544065183021) / 2.384e-6, + 3.578057213145241e-1, + 1.546020906725474, + + (-9.54e-7 * 0.956940335732209) / 2.384e-6, + (1.0252e-4 * 0.956940335732209) / 2.384e-6, + (5.39303e-4 * 0.956940335732209) / 2.384e-6, + (-1.011848e-3 * 0.956940335732209) / 2.384e-6, + (3.3659935e-2 * 0.956940335732209) / 2.384e-6, + (4.703045e-3 * 0.956940335732209) / 2.384e-6, + (9.15051e-4 * 0.956940335732209) / 2.384e-6, + (7.0095e-5 * 0.956940335732209) / 2.384e-6, + (4.768e-6 * 0.956940335732209) / 2.384e-6, + (9.54e-7 * 0.956940335732209) / 2.384e-6, + (8.06808e-4 * 0.956940335732209) / 2.384e-6, + (9.287834e-3 * 0.956940335732209) / 2.384e-6, + (-2.6310921e-2 * 0.956940335732209) / 2.384e-6, + (-4.048824e-3 * 0.956940335732209) / 2.384e-6, + (-5.42164e-4 * 0.956940335732209) / 2.384e-6, + (-3.2425e-5 * 0.956940335732209) / 2.384e-6, + 3.033466836073424e-1, + 1.66293922460509, + + (-1.431e-6 * 0.970031253194544) / 2.384e-6, + (9.9182e-5 * 0.970031253194544) / 2.384e-6, + (4.62532e-4 * 0.970031253194544) / 2.384e-6, + (-1.573563e-3 * 0.970031253194544) / 2.384e-6, + (3.3225536e-2 * 0.970031253194544) / 2.384e-6, + (4.737377e-3 * 0.970031253194544) / 2.384e-6, + (8.91685e-4 * 0.970031253194544) / 2.384e-6, + (6.628e-5 * 0.970031253194544) / 2.384e-6, + (4.292e-6 * 0.970031253194544) / 2.384e-6, + (-1.3828e-5 * 0.970031253194544) / 2.384e-6, + (6.6185e-4 * 0.970031253194544) / 2.384e-6, + (8.487225e-3 * 0.970031253194544) / 2.384e-6, + (-2.707386e-2 * 0.970031253194544) / 2.384e-6, + (-4.174709e-3 * 0.970031253194544) / 2.384e-6, + (-5.76973e-4 * 0.970031253194544) / 2.384e-6, + (-3.4809e-5 * 0.970031253194544) / 2.384e-6, + 2.504869601913055e-1, + 1.76384252869671, + + (-1.431e-6 * 0.98078528040323) / 2.384e-6, + (9.5367e-5 * 0.98078528040323) / 2.384e-6, + (3.78609e-4 * 0.98078528040323) / 2.384e-6, + (-2.161503e-3 * 0.98078528040323) / 2.384e-6, + (3.2754898e-2 * 0.98078528040323) / 2.384e-6, + (4.752159e-3 * 0.98078528040323) / 2.384e-6, + (8.66413e-4 * 0.98078528040323) / 2.384e-6, + (6.2943e-5 * 0.98078528040323) / 2.384e-6, + (3.815e-6 * 0.98078528040323) / 2.384e-6, + (-2.718e-5 * 0.98078528040323) / 2.384e-6, + (5.22137e-4 * 0.98078528040323) / 2.384e-6, + (7.703304e-3 * 0.98078528040323) / 2.384e-6, + (-2.7815342e-2 * 0.98078528040323) / 2.384e-6, + (-4.290581e-3 * 0.98078528040323) / 2.384e-6, + (-6.11782e-4 * 0.98078528040323) / 2.384e-6, + (-3.767e-5 * 0.98078528040323) / 2.384e-6, + 1.98912367379658e-1, + 1.847759065022573, + + (-1.907e-6 * 0.989176509964781) / 2.384e-6, + (9.0122e-5 * 0.989176509964781) / 2.384e-6, + (2.88486e-4 * 0.989176509964781) / 2.384e-6, + (-2.774239e-3 * 0.989176509964781) / 2.384e-6, + (3.224802e-2 * 0.989176509964781) / 2.384e-6, + (4.748821e-3 * 0.989176509964781) / 2.384e-6, + (8.38757e-4 * 0.989176509964781) / 2.384e-6, + (5.9605e-5 * 0.989176509964781) / 2.384e-6, + (3.338e-6 * 0.989176509964781) / 2.384e-6, + (-3.9577e-5 * 0.989176509964781) / 2.384e-6, + (3.88145e-4 * 0.989176509964781) / 2.384e-6, + (6.937027e-3 * 0.989176509964781) / 2.384e-6, + (-2.8532982e-2 * 0.989176509964781) / 2.384e-6, + (-4.395962e-3 * 0.989176509964781) / 2.384e-6, + (-6.46591e-4 * 0.989176509964781) / 2.384e-6, + (-4.0531e-5 * 0.989176509964781) / 2.384e-6, + 1.483359875383474e-1, + 1.913880671464418, + + (-1.907e-6 * 0.995184726672197) / 2.384e-6, + (8.44e-5 * 0.995184726672197) / 2.384e-6, + (1.91689e-4 * 0.995184726672197) / 2.384e-6, + (-3.411293e-3 * 0.995184726672197) / 2.384e-6, + (3.170681e-2 * 0.995184726672197) / 2.384e-6, + (4.728317e-3 * 0.995184726672197) / 2.384e-6, + (8.09669e-4 * 0.995184726672197) / 2.384e-6, + (5.579e-5 * 0.995184726672197) / 2.384e-6, + (3.338e-6 * 0.995184726672197) / 2.384e-6, + (-5.0545e-5 * 0.995184726672197) / 2.384e-6, + (2.59876e-4 * 0.995184726672197) / 2.384e-6, + (6.189346e-3 * 0.995184726672197) / 2.384e-6, + (-2.9224873e-2 * 0.995184726672197) / 2.384e-6, + (-4.489899e-3 * 0.995184726672197) / 2.384e-6, + (-6.80923e-4 * 0.995184726672197) / 2.384e-6, + (-4.3392e-5 * 0.995184726672197) / 2.384e-6, + 9.849140335716425e-2, + 1.961570560806461, + + (-2.384e-6 * 0.998795456205172) / 2.384e-6, + (7.7724e-5 * 0.998795456205172) / 2.384e-6, + (8.8215e-5 * 0.998795456205172) / 2.384e-6, + (-4.072189e-3 * 0.998795456205172) / 2.384e-6, + (3.1132698e-2 * 0.998795456205172) / 2.384e-6, + (4.691124e-3 * 0.998795456205172) / 2.384e-6, + (7.79152e-4 * 0.998795456205172) / 2.384e-6, + (5.2929e-5 * 0.998795456205172) / 2.384e-6, + (2.861e-6 * 0.998795456205172) / 2.384e-6, + (-6.0558e-5 * 0.998795456205172) / 2.384e-6, + (1.37329e-4 * 0.998795456205172) / 2.384e-6, + (5.46217e-3 * 0.998795456205172) / 2.384e-6, + (-2.989006e-2 * 0.998795456205172) / 2.384e-6, + (-4.570484e-3 * 0.998795456205172) / 2.384e-6, + (-7.14302e-4 * 0.998795456205172) / 2.384e-6, + (-4.6253e-5 * 0.998795456205172) / 2.384e-6, + 4.912684976946725e-2, + 1.990369453344394, + + (3.5780907e-2 * Math.SQRT2 * 0.5) / 2.384e-6, + (1.7876148e-2 * Math.SQRT2 * 0.5) / 2.384e-6, + (3.134727e-3 * Math.SQRT2 * 0.5) / 2.384e-6, + (2.457142e-3 * Math.SQRT2 * 0.5) / 2.384e-6, + (9.71317e-4 * Math.SQRT2 * 0.5) / 2.384e-6, + (2.18868e-4 * Math.SQRT2 * 0.5) / 2.384e-6, + (1.01566e-4 * Math.SQRT2 * 0.5) / 2.384e-6, + (1.3828e-5 * Math.SQRT2 * 0.5) / 2.384e-6, + + 3.0526638e-2 / 2.384e-6, + 4.638195e-3 / 2.384e-6, + 7.47204e-4 / 2.384e-6, + 4.9591e-5 / 2.384e-6, + 4.756451e-3 / 2.384e-6, + 2.1458e-5 / 2.384e-6, + -6.9618e-5 / 2.384e-6, + ] as const; + + private static readonly NS = 12; + + private static readonly NL = 36; + + private readonly win = [ + [ + 2.382191739347913e-13, 6.423305872147834e-13, 9.400849094049688e-13, + 1.122435026096556e-12, 1.183840321267481e-12, 1.122435026096556e-12, + 9.40084909404969e-13, 6.423305872147839e-13, 2.382191739347918e-13, + + 5.456116108943412e-12, 4.878985199565852e-12, 4.240448995017367e-12, + 3.559909094758252e-12, 2.858043359288075e-12, 2.156177623817898e-12, + 1.475637723558783e-12, 8.371015190102974e-13, 2.599706096327376e-13, + + -5.456116108943412e-12, -4.878985199565852e-12, -4.240448995017367e-12, + -3.559909094758252e-12, -2.858043359288076e-12, -2.156177623817898e-12, + -1.475637723558783e-12, -8.371015190102975e-13, -2.599706096327376e-13, + + -2.382191739347923e-13, -6.423305872147843e-13, -9.400849094049696e-13, + -1.122435026096556e-12, -1.183840321267481e-12, -1.122435026096556e-12, + -9.400849094049694e-13, -6.42330587214784e-13, -2.382191739347918e-13, + ], + [ + 2.382191739347913e-13, 6.423305872147834e-13, 9.400849094049688e-13, + 1.122435026096556e-12, 1.183840321267481e-12, 1.122435026096556e-12, + 9.400849094049688e-13, 6.423305872147841e-13, 2.382191739347918e-13, + + 5.456116108943413e-12, 4.878985199565852e-12, 4.240448995017367e-12, + 3.559909094758253e-12, 2.858043359288075e-12, 2.156177623817898e-12, + 1.475637723558782e-12, 8.371015190102975e-13, 2.599706096327376e-13, + + -5.461314069809755e-12, -4.921085770524055e-12, -4.343405037091838e-12, + -3.732668368707687e-12, -3.093523840190885e-12, -2.430835727329465e-12, + -1.734679010007751e-12, -9.748253656609281e-13, -2.797435120168326e-13, + + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -2.283748241799531e-13, + -4.037858874020686e-13, -2.146547464825323e-13, + ], + [ + 1.316524975873958e-1, 4.14213562373095e-1, 7.673269879789602e-1, + + 1.091308501069271, 1.303225372841206, 1.56968557711749, 1.920982126971166, + 2.414213562373094, 3.171594802363212, 4.510708503662055, + 7.595754112725146, 2.290376554843115e1, + + 0.98480775301220802032, 0.64278760968653936292, 0.34202014332566882393, + 0.93969262078590842791, -0.17364817766693030343, -0.76604444311897790243, + 0.86602540378443870761, 0.5, + + -5.144957554275265e-1, -4.717319685649723e-1, -3.133774542039019e-1, + -1.819131996109812e-1, -9.457419252642064e-2, -4.096558288530405e-2, + -1.419856857247115e-2, -3.699974673760037e-3, + + 8.574929257125442e-1, 8.817419973177052e-1, 9.496286491027329e-1, + 9.833145924917901e-1, 9.955178160675857e-1, 9.991605581781475e-1, + 9.99899195244447e-1, 9.999931550702802e-1, + ], + [ + 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 2.283748241799531e-13, + 4.037858874020686e-13, 2.146547464825323e-13, + + 5.461314069809755e-12, 4.921085770524055e-12, 4.343405037091838e-12, + 3.732668368707687e-12, 3.093523840190885e-12, 2.430835727329466e-12, + 1.734679010007751e-12, 9.748253656609281e-13, 2.797435120168326e-13, + + -5.456116108943413e-12, -4.878985199565852e-12, -4.240448995017367e-12, + -3.559909094758253e-12, -2.858043359288075e-12, -2.156177623817898e-12, + -1.475637723558782e-12, -8.371015190102975e-13, -2.599706096327376e-13, + + -2.382191739347913e-13, -6.423305872147834e-13, -9.400849094049688e-13, + -1.122435026096556e-12, -1.183840321267481e-12, -1.122435026096556e-12, + -9.400849094049688e-13, -6.423305872147841e-13, -2.382191739347918e-13, + ], + ] as const; + + private readonly tantab_l = this.win[SHORT_TYPE]; + + private readonly cx = this.win[SHORT_TYPE]; + + private readonly ca = this.win[SHORT_TYPE]; + + private readonly cs = this.win[SHORT_TYPE]; + + private readonly order = [ + 0, 1, 16, 17, 8, 9, 24, 25, 4, 5, 20, 21, 12, 13, 28, 29, 2, 3, 18, 19, 10, + 11, 26, 27, 6, 7, 22, 23, 14, 15, 30, 31, + ] as const; + + private window_subband(x1: Float32Array, x1Pos: number, a: Float32Array) { + let wp = 10; + + let x2 = x1Pos + 238 - 14 - 286; + + for (let i = -15; i < 0; i++) { + let w; + let s; + let t; + + w = this.enwindow[wp + -10]; + s = x1[x2 + -224] * w; + t = x1[x1Pos + 224] * w; + w = this.enwindow[wp + -9]; + s += x1[x2 + -160] * w; + t += x1[x1Pos + 160] * w; + w = this.enwindow[wp + -8]; + s += x1[x2 + -96] * w; + t += x1[x1Pos + 96] * w; + w = this.enwindow[wp + -7]; + s += x1[x2 + -32] * w; + t += x1[x1Pos + 32] * w; + w = this.enwindow[wp + -6]; + s += x1[x2 + 32] * w; + t += x1[x1Pos + -32] * w; + w = this.enwindow[wp + -5]; + s += x1[x2 + 96] * w; + t += x1[x1Pos + -96] * w; + w = this.enwindow[wp + -4]; + s += x1[x2 + 160] * w; + t += x1[x1Pos + -160] * w; + w = this.enwindow[wp + -3]; + s += x1[x2 + 224] * w; + t += x1[x1Pos + -224] * w; + + w = this.enwindow[wp + -2]; + s += x1[x1Pos + -256] * w; + t -= x1[x2 + 256] * w; + w = this.enwindow[wp + -1]; + s += x1[x1Pos + -192] * w; + t -= x1[x2 + 192] * w; + w = this.enwindow[wp + 0]; + s += x1[x1Pos + -128] * w; + t -= x1[x2 + 128] * w; + w = this.enwindow[wp + 1]; + s += x1[x1Pos + -64] * w; + t -= x1[x2 + 64] * w; + w = this.enwindow[wp + 2]; + s += x1[x1Pos + 0] * w; + t -= x1[x2 + 0] * w; + w = this.enwindow[wp + 3]; + s += x1[x1Pos + 64] * w; + t -= x1[x2 + -64] * w; + w = this.enwindow[wp + 4]; + s += x1[x1Pos + 128] * w; + t -= x1[x2 + -128] * w; + w = this.enwindow[wp + 5]; + s += x1[x1Pos + 192] * w; + t -= x1[x2 + -192] * w; + + s *= this.enwindow[wp + 6]; + w = t - s; + a[30 + i * 2] = t + s; + a[31 + i * 2] = this.enwindow[wp + 7] * w; + wp += 18; + x1Pos--; + x2++; + } + + let s; + let t; + t = x1[x1Pos + -16] * this.enwindow[wp + -10]; + s = x1[x1Pos + -32] * this.enwindow[wp + -2]; + t += (x1[x1Pos + -48] - x1[x1Pos + 16]) * this.enwindow[wp + -9]; + s += x1[x1Pos + -96] * this.enwindow[wp + -1]; + t += (x1[x1Pos + -80] + x1[x1Pos + 48]) * this.enwindow[wp + -8]; + s += x1[x1Pos + -160] * this.enwindow[wp + 0]; + t += (x1[x1Pos + -112] - x1[x1Pos + 80]) * this.enwindow[wp + -7]; + s += x1[x1Pos + -224] * this.enwindow[wp + 1]; + t += (x1[x1Pos + -144] + x1[x1Pos + 112]) * this.enwindow[wp + -6]; + s -= x1[x1Pos + 32] * this.enwindow[wp + 2]; + t += (x1[x1Pos + -176] - x1[x1Pos + 144]) * this.enwindow[wp + -5]; + s -= x1[x1Pos + 96] * this.enwindow[wp + 3]; + t += (x1[x1Pos + -208] + x1[x1Pos + 176]) * this.enwindow[wp + -4]; + s -= x1[x1Pos + 160] * this.enwindow[wp + 4]; + t += (x1[x1Pos + -240] - x1[x1Pos + 208]) * this.enwindow[wp + -3]; + s -= x1[x1Pos + 224]; + + const u = s - t; + const v = s + t; + + t = a[14]; + s = a[15] - t; + + a[31] = v + t; + a[30] = u + s; + a[15] = u - s; + a[14] = v - t; + + let xr; + xr = a[28] - a[0]; + a[0] += a[28]; + a[28] = xr * this.enwindow[wp + -2 * 18 + 7]; + xr = a[29] - a[1]; + a[1] += a[29]; + a[29] = xr * this.enwindow[wp + -2 * 18 + 7]; + + xr = a[26] - a[2]; + a[2] += a[26]; + a[26] = xr * this.enwindow[wp + -4 * 18 + 7]; + xr = a[27] - a[3]; + a[3] += a[27]; + a[27] = xr * this.enwindow[wp + -4 * 18 + 7]; + + xr = a[24] - a[4]; + a[4] += a[24]; + a[24] = xr * this.enwindow[wp + -6 * 18 + 7]; + xr = a[25] - a[5]; + a[5] += a[25]; + a[25] = xr * this.enwindow[wp + -6 * 18 + 7]; + + xr = a[22] - a[6]; + a[6] += a[22]; + a[22] = xr * Math.SQRT2; + xr = a[23] - a[7]; + a[7] += a[23]; + a[23] = xr * Math.SQRT2 - a[7]; + a[7] -= a[6]; + a[22] -= a[7]; + a[23] -= a[22]; + + xr = a[6]; + a[6] = a[31] - xr; + a[31] += xr; + xr = a[7]; + a[7] = a[30] - xr; + a[30] += xr; + xr = a[22]; + a[22] = a[15] - xr; + a[15] += xr; + xr = a[23]; + a[23] = a[14] - xr; + a[14] += xr; + + xr = a[20] - a[8]; + a[8] += a[20]; + a[20] = xr * this.enwindow[wp + -10 * 18 + 7]; + xr = a[21] - a[9]; + a[9] += a[21]; + a[21] = xr * this.enwindow[wp + -10 * 18 + 7]; + + xr = a[18] - a[10]; + a[10] += a[18]; + a[18] = xr * this.enwindow[wp + -12 * 18 + 7]; + xr = a[19] - a[11]; + a[11] += a[19]; + a[19] = xr * this.enwindow[wp + -12 * 18 + 7]; + + xr = a[16] - a[12]; + a[12] += a[16]; + a[16] = xr * this.enwindow[wp + -14 * 18 + 7]; + xr = a[17] - a[13]; + a[13] += a[17]; + a[17] = xr * this.enwindow[wp + -14 * 18 + 7]; + + xr = -a[20] + a[24]; + a[20] += a[24]; + a[24] = xr * this.enwindow[wp + -12 * 18 + 7]; + xr = -a[21] + a[25]; + a[21] += a[25]; + a[25] = xr * this.enwindow[wp + -12 * 18 + 7]; + + xr = a[4] - a[8]; + a[4] += a[8]; + a[8] = xr * this.enwindow[wp + -12 * 18 + 7]; + xr = a[5] - a[9]; + a[5] += a[9]; + a[9] = xr * this.enwindow[wp + -12 * 18 + 7]; + + xr = a[0] - a[12]; + a[0] += a[12]; + a[12] = xr * this.enwindow[wp + -4 * 18 + 7]; + xr = a[1] - a[13]; + a[1] += a[13]; + a[13] = xr * this.enwindow[wp + -4 * 18 + 7]; + xr = a[16] - a[28]; + a[16] += a[28]; + a[28] = xr * this.enwindow[wp + -4 * 18 + 7]; + xr = -a[17] + a[29]; + a[17] += a[29]; + a[29] = xr * this.enwindow[wp + -4 * 18 + 7]; + + xr = Math.SQRT2 * (a[2] - a[10]); + a[2] += a[10]; + a[10] = xr; + xr = Math.SQRT2 * (a[3] - a[11]); + a[3] += a[11]; + a[11] = xr; + xr = Math.SQRT2 * (-a[18] + a[26]); + a[18] += a[26]; + a[26] = xr - a[18]; + xr = Math.SQRT2 * (-a[19] + a[27]); + a[19] += a[27]; + a[27] = xr - a[19]; + + xr = a[2]; + a[19] -= a[3]; + a[3] -= xr; + a[2] = a[31] - xr; + a[31] += xr; + xr = a[3]; + a[11] -= a[19]; + a[18] -= xr; + a[3] = a[30] - xr; + a[30] += xr; + xr = a[18]; + a[27] -= a[11]; + a[19] -= xr; + a[18] = a[15] - xr; + a[15] += xr; + + xr = a[19]; + a[10] -= xr; + a[19] = a[14] - xr; + a[14] += xr; + xr = a[10]; + a[11] -= xr; + a[10] = a[23] - xr; + a[23] += xr; + xr = a[11]; + a[26] -= xr; + a[11] = a[22] - xr; + a[22] += xr; + xr = a[26]; + a[27] -= xr; + a[26] = a[7] - xr; + a[7] += xr; + + xr = a[27]; + a[27] = a[6] - xr; + a[6] += xr; + + xr = Math.SQRT2 * (a[0] - a[4]); + a[0] += a[4]; + a[4] = xr; + xr = Math.SQRT2 * (a[1] - a[5]); + a[1] += a[5]; + a[5] = xr; + xr = Math.SQRT2 * (a[16] - a[20]); + a[16] += a[20]; + a[20] = xr; + xr = Math.SQRT2 * (a[17] - a[21]); + a[17] += a[21]; + a[21] = xr; + + xr = -Math.SQRT2 * (a[8] - a[12]); + a[8] += a[12]; + a[12] = xr - a[8]; + xr = -Math.SQRT2 * (a[9] - a[13]); + a[9] += a[13]; + a[13] = xr - a[9]; + xr = -Math.SQRT2 * (a[25] - a[29]); + a[25] += a[29]; + a[29] = xr - a[25]; + xr = -Math.SQRT2 * (a[24] + a[28]); + a[24] -= a[28]; + a[28] = xr - a[24]; + + xr = a[24] - a[16]; + a[24] = xr; + xr = a[20] - xr; + a[20] = xr; + xr = a[28] - xr; + a[28] = xr; + + xr = a[25] - a[17]; + a[25] = xr; + xr = a[21] - xr; + a[21] = xr; + xr = a[29] - xr; + a[29] = xr; + + xr = a[17] - a[1]; + a[17] = xr; + xr = a[9] - xr; + a[9] = xr; + xr = a[25] - xr; + a[25] = xr; + xr = a[5] - xr; + a[5] = xr; + xr = a[21] - xr; + a[21] = xr; + xr = a[13] - xr; + a[13] = xr; + xr = a[29] - xr; + a[29] = xr; + + xr = a[1] - a[0]; + a[1] = xr; + xr = a[16] - xr; + a[16] = xr; + xr = a[17] - xr; + a[17] = xr; + xr = a[8] - xr; + a[8] = xr; + xr = a[9] - xr; + a[9] = xr; + xr = a[24] - xr; + a[24] = xr; + xr = a[25] - xr; + a[25] = xr; + xr = a[4] - xr; + a[4] = xr; + xr = a[5] - xr; + a[5] = xr; + xr = a[20] - xr; + a[20] = xr; + xr = a[21] - xr; + a[21] = xr; + xr = a[12] - xr; + a[12] = xr; + xr = a[13] - xr; + a[13] = xr; + xr = a[28] - xr; + a[28] = xr; + xr = a[29] - xr; + a[29] = xr; + + xr = a[0]; + a[0] += a[31]; + a[31] -= xr; + xr = a[1]; + a[1] += a[30]; + a[30] -= xr; + xr = a[16]; + a[16] += a[15]; + a[15] -= xr; + xr = a[17]; + a[17] += a[14]; + a[14] -= xr; + xr = a[8]; + a[8] += a[23]; + a[23] -= xr; + xr = a[9]; + a[9] += a[22]; + a[22] -= xr; + xr = a[24]; + a[24] += a[7]; + a[7] -= xr; + xr = a[25]; + a[25] += a[6]; + a[6] -= xr; + xr = a[4]; + a[4] += a[27]; + a[27] -= xr; + xr = a[5]; + a[5] += a[26]; + a[26] -= xr; + xr = a[20]; + a[20] += a[11]; + a[11] -= xr; + xr = a[21]; + a[21] += a[10]; + a[10] -= xr; + xr = a[12]; + a[12] += a[19]; + a[19] -= xr; + xr = a[13]; + a[13] += a[18]; + a[18] -= xr; + xr = a[28]; + a[28] += a[3]; + a[3] -= xr; + xr = a[29]; + a[29] += a[2]; + a[2] -= xr; + } + + private mdct_short(inout: Float32Array, inoutPos: number) { + for (let l = 0; l < 3; l++) { + let tc0; + let tc1; + let tc2; + let ts0; + let ts1; + let ts2; + + ts0 = + inout[inoutPos + 2 * 3] * this.win[SHORT_TYPE][0] - + inout[inoutPos + 5 * 3]; + tc0 = + inout[inoutPos + 0 * 3] * this.win[SHORT_TYPE][2] - + inout[inoutPos + 3 * 3]; + tc1 = ts0 + tc0; + tc2 = ts0 - tc0; + + ts0 = + inout[inoutPos + 5 * 3] * this.win[SHORT_TYPE][0] + + inout[inoutPos + 2 * 3]; + tc0 = + inout[inoutPos + 3 * 3] * this.win[SHORT_TYPE][2] + + inout[inoutPos + 0 * 3]; + ts1 = ts0 + tc0; + ts2 = -ts0 + tc0; + + tc0 = + (inout[inoutPos + 1 * 3] * this.win[SHORT_TYPE][1] - + inout[inoutPos + 4 * 3]) * + 2.069978111953089e-11; + + ts0 = + (inout[inoutPos + 4 * 3] * this.win[SHORT_TYPE][1] + + inout[inoutPos + 1 * 3]) * + 2.069978111953089e-11; + + inout[inoutPos + 3 * 0] = tc1 * 1.90752519173728e-11 + tc0; + + inout[inoutPos + 3 * 5] = -ts1 * 1.90752519173728e-11 + ts0; + + tc2 = tc2 * 0.86602540378443870761 * 1.907525191737281e-11; + + ts1 = ts1 * 0.5 * 1.907525191737281e-11 + ts0; + inout[inoutPos + 3 * 1] = tc2 - ts1; + inout[inoutPos + 3 * 2] = tc2 + ts1; + + tc1 = tc1 * 0.5 * 1.907525191737281e-11 - tc0; + ts2 = ts2 * 0.86602540378443870761 * 1.907525191737281e-11; + + inout[inoutPos + 3 * 3] = tc1 + ts2; + inout[inoutPos + 3 * 4] = tc1 - ts2; + + inoutPos++; + } + } + + private mdct_long(out: Float32Array, outPos: number, _in: Float32Array) { + let ct; + let st; + { + const tc1 = _in[17] - _in[9]; + const tc3 = _in[15] - _in[11]; + const tc4 = _in[14] - _in[12]; + const ts5 = _in[0] + _in[8]; + let ts6 = _in[1] + _in[7]; + const ts7 = _in[2] + _in[6]; + const ts8 = _in[3] + _in[5]; + + out[outPos + 17] = ts5 + ts7 - ts8 - (ts6 - _in[4]); + st = (ts5 + ts7 - ts8) * this.cx[12 + 7] + (ts6 - _in[4]); + ct = (tc1 - tc3 - tc4) * this.cx[12 + 6]; + out[outPos + 5] = ct + st; + out[outPos + 6] = ct - st; + + const tc2 = (_in[16] - _in[10]) * this.cx[12 + 6]; + ts6 = ts6 * this.cx[12 + 7] + _in[4]; + ct = + tc1 * this.cx[12 + 0] + + tc2 + + tc3 * this.cx[12 + 1] + + tc4 * this.cx[12 + 2]; + st = + -ts5 * this.cx[12 + 4] + + ts6 - + ts7 * this.cx[12 + 5] + + ts8 * this.cx[12 + 3]; + out[outPos + 1] = ct + st; + out[outPos + 2] = ct - st; + + ct = + tc1 * this.cx[12 + 1] - + tc2 - + tc3 * this.cx[12 + 2] + + tc4 * this.cx[12 + 0]; + st = + -ts5 * this.cx[12 + 5] + + ts6 - + ts7 * this.cx[12 + 3] + + ts8 * this.cx[12 + 4]; + out[outPos + 9] = ct + st; + out[outPos + 10] = ct - st; + + ct = + tc1 * this.cx[12 + 2] - + tc2 + + tc3 * this.cx[12 + 0] - + tc4 * this.cx[12 + 1]; + st = + ts5 * this.cx[12 + 3] - + ts6 + + ts7 * this.cx[12 + 4] - + ts8 * this.cx[12 + 5]; + out[outPos + 13] = ct + st; + out[outPos + 14] = ct - st; + } + { + const ts1 = _in[8] - _in[0]; + const ts3 = _in[6] - _in[2]; + const ts4 = _in[5] - _in[3]; + const tc5 = _in[17] + _in[9]; + let tc6 = _in[16] + _in[10]; + const tc7 = _in[15] + _in[11]; + const tc8 = _in[14] + _in[12]; + + out[outPos + 0] = tc5 + tc7 + tc8 + (tc6 + _in[13]); + ct = (tc5 + tc7 + tc8) * this.cx[12 + 7] - (tc6 + _in[13]); + st = (ts1 - ts3 + ts4) * this.cx[12 + 6]; + out[outPos + 11] = ct + st; + out[outPos + 12] = ct - st; + + const ts2 = (_in[7] - _in[1]) * this.cx[12 + 6]; + tc6 = _in[13] - tc6 * this.cx[12 + 7]; + ct = + tc5 * this.cx[12 + 3] - + tc6 + + tc7 * this.cx[12 + 4] + + tc8 * this.cx[12 + 5]; + st = + ts1 * this.cx[12 + 2] + + ts2 + + ts3 * this.cx[12 + 0] + + ts4 * this.cx[12 + 1]; + out[outPos + 3] = ct + st; + out[outPos + 4] = ct - st; + + ct = + -tc5 * this.cx[12 + 5] + + tc6 - + tc7 * this.cx[12 + 3] - + tc8 * this.cx[12 + 4]; + st = + ts1 * this.cx[12 + 1] + + ts2 - + ts3 * this.cx[12 + 2] - + ts4 * this.cx[12 + 0]; + out[outPos + 7] = ct + st; + out[outPos + 8] = ct - st; + + ct = + -tc5 * this.cx[12 + 4] + + tc6 - + tc7 * this.cx[12 + 5] - + tc8 * this.cx[12 + 3]; + st = + ts1 * this.cx[12 + 0] - + ts2 + + ts3 * this.cx[12 + 1] - + ts4 * this.cx[12 + 2]; + out[outPos + 15] = ct + st; + out[outPos + 16] = ct - st; + } + } + + mdct_sub48(gfc: LameInternalFlags, w0: Float32Array, w1: Float32Array) { + let wk = w0; + let wkPos = 286; + + for (let ch = 0; ch < gfc.channels_out; ch++) { + for (let gr = 0; gr < gfc.mode_gr; gr++) { + let band; + const gi = gfc.l3_side.tt[gr][ch]; + const mdct_enc = gi.xr; + let mdct_encPos = 0; + const samp = gfc.sb_sample[ch][1 - gr]; + let sampPos = 0; + + for (let k = 0; k < 18 / 2; k++) { + this.window_subband(wk, wkPos, samp[sampPos]); + this.window_subband(wk, wkPos + 32, samp[sampPos + 1]); + sampPos += 2; + wkPos += 64; + + for (band = 1; band < 32; band += 2) { + samp[sampPos - 1][band] *= -1; + } + } + + for (band = 0; band < 32; band++, mdct_encPos += 18) { + let type = gi.block_type; + const band0 = gfc.sb_sample[ch][gr]; + const band1 = gfc.sb_sample[ch][1 - gr]; + if (gi.mixed_block_flag !== 0 && band < 2) type = 0; + if (gfc.amp_filter[band] < 1e-12) { + fillArray(mdct_enc, mdct_encPos + 0, mdct_encPos + 18, 0); + } else { + if (gfc.amp_filter[band] < 1.0) { + for (let k = 0; k < 18; k++) + band1[k][this.order[band]] *= gfc.amp_filter[band]; + } + if (type === SHORT_TYPE) { + for (let k = -NewMDCT.NS / 4; k < 0; k++) { + const w = this.win[SHORT_TYPE][k + 3]; + mdct_enc[mdct_encPos + k * 3 + 9] = + band0[9 + k][this.order[band]] * w - + band0[8 - k][this.order[band]]; + mdct_enc[mdct_encPos + k * 3 + 18] = + band0[14 - k][this.order[band]] * w + + band0[15 + k][this.order[band]]; + mdct_enc[mdct_encPos + k * 3 + 10] = + band0[15 + k][this.order[band]] * w - + band0[14 - k][this.order[band]]; + mdct_enc[mdct_encPos + k * 3 + 19] = + band1[2 - k][this.order[band]] * w + + band1[3 + k][this.order[band]]; + mdct_enc[mdct_encPos + k * 3 + 11] = + band1[3 + k][this.order[band]] * w - + band1[2 - k][this.order[band]]; + mdct_enc[mdct_encPos + k * 3 + 20] = + band1[8 - k][this.order[band]] * w + + band1[9 + k][this.order[band]]; + } + this.mdct_short(mdct_enc, mdct_encPos); + } else { + const work = new Float32Array(18); + for (let k = -NewMDCT.NL / 4; k < 0; k++) { + const a = + this.win[type][k + 27] * band1[k + 9][this.order[band]] + + this.win[type][k + 36] * band1[8 - k][this.order[band]]; + const b = + this.win[type][k + 9] * band0[k + 9][this.order[band]] - + this.win[type][k + 18] * band0[8 - k][this.order[band]]; + work[k + 9] = a - b * this.tantab_l[3 + k + 9]; + work[k + 18] = a * this.tantab_l[3 + k + 9] + b; + } + + this.mdct_long(mdct_enc, mdct_encPos, work); + } + } + + if (type !== SHORT_TYPE && band !== 0) { + for (let k = 7; k >= 0; --k) { + const bu = + mdct_enc[mdct_encPos + k] * this.ca[20 + k] + + mdct_enc[mdct_encPos + -1 - k] * this.cs[28 + k]; + const bd = + mdct_enc[mdct_encPos + k] * this.cs[28 + k] - + mdct_enc[mdct_encPos + -1 - k] * this.ca[20 + k]; + + mdct_enc[mdct_encPos + -1 - k] = bu; + mdct_enc[mdct_encPos + k] = bd; + } + } + } + } + wk = w1; + wkPos = 286; + if (gfc.mode_gr === 1) { + for (let i = 0; i < 18; i++) { + copyArray(gfc.sb_sample[ch][1][i], 0, gfc.sb_sample[ch][0][i], 0, 32); + } + } + } + } +} diff --git a/packages/mp3-encoder/src/lame/NsPsy.ts b/packages/mp3-encoder/src/lame/NsPsy.ts new file mode 100644 index 0000000000..c742e44fde --- /dev/null +++ b/packages/mp3-encoder/src/lame/NsPsy.ts @@ -0,0 +1,17 @@ +import { SBMAX_l, SBMAX_s } from './constants'; + +export class NsPsy { + last_en_subshort = Array.from({ length: 4 }, () => new Float32Array(9)); + + lastAttacks = new Int32Array(4); + + pefirbuf = new Float32Array(19); + + longfact = new Float32Array(SBMAX_l); + + shortfact = new Float32Array(SBMAX_s); + + attackthre = -1; + + attackthre_s = -1; +} diff --git a/packages/mp3-encoder/src/lame/NumUsed.ts b/packages/mp3-encoder/src/lame/NumUsed.ts new file mode 100644 index 0000000000..75abad4f18 --- /dev/null +++ b/packages/mp3-encoder/src/lame/NumUsed.ts @@ -0,0 +1,3 @@ +export class NumUsed { + num_used = 0; +} diff --git a/packages/mp3-encoder/src/lame/PSY.ts b/packages/mp3-encoder/src/lame/PSY.ts new file mode 100644 index 0000000000..964ab3f7f5 --- /dev/null +++ b/packages/mp3-encoder/src/lame/PSY.ts @@ -0,0 +1,11 @@ +import { SBMAX_l, SBMAX_s } from './constants'; + +export class PSY { + mask_adjust = 0; + + mask_adjust_short = 0; + + readonly bo_l_weight = new Float32Array(SBMAX_l); + + readonly bo_s_weight = new Float32Array(SBMAX_s); +} diff --git a/packages/mp3-encoder/src/lame/Presets.ts b/packages/mp3-encoder/src/lame/Presets.ts new file mode 100644 index 0000000000..bc877eec88 --- /dev/null +++ b/packages/mp3-encoder/src/lame/Presets.ts @@ -0,0 +1,126 @@ +import { ABRPresets } from './ABRPresets'; +import type { LameGlobalFlags } from './LameGlobalFlags'; +import type { Quality } from './Quality'; +import { VBRPresets } from './VBRPresets'; +import { VbrMode } from './VbrMode'; + +const enum Preset { + V9 = 410, + V8 = 420, + V7 = 430, + V6 = 440, + V5 = 450, + V4 = 460, + V3 = 470, + V2 = 480, + V1 = 490, + V0 = 500, + R3MIX = 1000, + STANDARD = 1001, + EXTREME = 1002, + INSANE = 1003, + STANDARD_FAST = 1004, + EXTREME_FAST = 1005, + MEDIUM = 1006, + MEDIUM_FAST = 1007, +} + +export class Presets { + private readonly vbrPresets = new VBRPresets(); + + public readonly abrPresets = new ABRPresets(); + + apply(gfp: LameGlobalFlags, preset: Preset) { + switch (preset) { + case Preset.R3MIX: { + preset = Preset.V3; + gfp.VBR = VbrMode.vbr_mtrh; + break; + } + case Preset.MEDIUM: { + preset = Preset.V4; + gfp.VBR = VbrMode.vbr_rh; + break; + } + case Preset.MEDIUM_FAST: { + preset = Preset.V4; + gfp.VBR = VbrMode.vbr_mtrh; + break; + } + case Preset.STANDARD: { + preset = Preset.V2; + gfp.VBR = VbrMode.vbr_rh; + break; + } + case Preset.STANDARD_FAST: { + preset = Preset.V2; + gfp.VBR = VbrMode.vbr_mtrh; + break; + } + case Preset.EXTREME: { + preset = Preset.V0; + gfp.VBR = VbrMode.vbr_rh; + break; + } + case Preset.EXTREME_FAST: { + preset = Preset.V0; + gfp.VBR = VbrMode.vbr_mtrh; + break; + } + case Preset.INSANE: { + gfp.preset = 320; + gfp.VBR = VbrMode.vbr_off; + this.abrPresets.apply(gfp, 320); + return 320; + } + } + + gfp.preset = preset; + + switch (preset) { + case Preset.V9: + this.vbrPresets.apply(gfp, 9); + return preset; + case Preset.V8: + this.vbrPresets.apply(gfp, 8); + return preset; + case Preset.V7: + this.vbrPresets.apply(gfp, 7); + return preset; + case Preset.V6: + this.vbrPresets.apply(gfp, 6); + return preset; + case Preset.V5: + this.vbrPresets.apply(gfp, 5); + return preset; + case Preset.V4: + this.vbrPresets.apply(gfp, 4); + return preset; + case Preset.V3: + this.vbrPresets.apply(gfp, 3); + return preset; + case Preset.V2: + this.vbrPresets.apply(gfp, 2); + return preset; + case Preset.V1: + this.vbrPresets.apply(gfp, 1); + return preset; + case Preset.V0: + this.vbrPresets.apply(gfp, 0); + return preset; + default: + break; + } + + if (preset >= 8 && preset <= 320) { + return this.abrPresets.apply(gfp, preset); + } + + gfp.preset = 0; + return preset; + } + + applyPresetFromQuality(gfp: LameGlobalFlags, quality: Quality) { + return this.apply(gfp, 500 - 10 * quality); + } +} diff --git a/packages/mp3-encoder/src/lame/PsyModel.ts b/packages/mp3-encoder/src/lame/PsyModel.ts new file mode 100644 index 0000000000..520a914205 --- /dev/null +++ b/packages/mp3-encoder/src/lame/PsyModel.ts @@ -0,0 +1,2611 @@ +import { FFT } from './FFT'; +import type { III_psy_ratio } from './III_psy_ratio'; +import type { LameGlobalFlags } from './LameGlobalFlags'; +import type { LameInternalFlags } from './LameInternalFlags'; +import { MPEGMode } from './MPEGMode'; +import { ShortBlock } from './ShortBlock'; +import { VbrMode } from './VbrMode'; +import { fillArray } from './arrays'; +import { assert } from './assert'; +import { + BLKSIZE, + BLKSIZE_s, + CBANDS, + HBLKSIZE, + HBLKSIZE_s, + LOG10, + MAX_FLOAT32_VALUE, + NORM_TYPE, + SBMAX_l, + SBMAX_s, + SHORT_TYPE, + START_TYPE, + STOP_TYPE, +} from './constants'; + +export class PsyModel { + private readonly fft = new FFT(); + + private readonly rpelev = 2; + + private readonly rpelev2 = 16; + + private readonly rpelev_s = 2; + + private readonly rpelev2_s = 16; + + private static readonly DELBARK = 0.34; + + private static readonly VO_SCALE = 1 / (14752 * 14752) / (BLKSIZE / 2); + + private readonly temporalmask_sustain_sec = 0.01; + + private static readonly NS_PREECHO_ATT0 = 0.8; + + private static readonly NS_PREECHO_ATT1 = 0.6; + + private static readonly NS_PREECHO_ATT2 = 0.3; + + private static readonly NS_MSFIX = 3.5; + + static readonly NSATTACKTHRE = 4.4; + + static readonly NSATTACKTHRE_S = 25; + + private static readonly NSFIRLEN = 21; + + private static readonly LN_TO_LOG10 = 0.2302585093; + + private psycho_loudness_approx(energy: Float32Array, gfc: LameInternalFlags) { + let loudness_power = 0.0; + + for (let i = 0; i < BLKSIZE / 2; ++i) { + loudness_power += energy[i] * gfc.ATH.eql_w[i]; + } + loudness_power *= PsyModel.VO_SCALE; + + return loudness_power; + } + + private compute_ffts( + gfp: LameGlobalFlags, + fftenergy: Float32Array, + fftenergy_s: Float32Array[], + wsamp_l: Float32Array[], + wsamp_lPos: number, + wsamp_s: Float32Array[][], + wsamp_sPos: number, + gr_out: number, + chn: number, + buffer: Float32Array[], + bufPos: number + ) { + const gfc = gfp.internal_flags; + if (chn < 2) { + this.fft.fft_long(gfc, wsamp_l[wsamp_lPos], chn, buffer, bufPos); + this.fft.fft_short(gfc, wsamp_s[wsamp_sPos], chn, buffer, bufPos); + } else if (chn === 2) { + for (let j = BLKSIZE - 1; j >= 0; --j) { + const l = wsamp_l[wsamp_lPos + 0][j]; + const r = wsamp_l[wsamp_lPos + 1][j]; + wsamp_l[wsamp_lPos + 0][j] = (l + r) * Math.SQRT2 * 0.5; + wsamp_l[wsamp_lPos + 1][j] = (l - r) * Math.SQRT2 * 0.5; + } + for (let b = 2; b >= 0; --b) { + for (let j = BLKSIZE_s - 1; j >= 0; --j) { + const l = wsamp_s[wsamp_sPos + 0][b][j]; + const r = wsamp_s[wsamp_sPos + 1][b][j]; + wsamp_s[wsamp_sPos + 0][b][j] = (l + r) * Math.SQRT2 * 0.5; + wsamp_s[wsamp_sPos + 1][b][j] = (l - r) * Math.SQRT2 * 0.5; + } + } + } + + fftenergy[0] = wsamp_l[wsamp_lPos + 0][0]; + fftenergy[0] *= fftenergy[0]; + + for (let j = BLKSIZE / 2 - 1; j >= 0; --j) { + const re = wsamp_l[wsamp_lPos + 0][BLKSIZE / 2 - j]; + const im = wsamp_l[wsamp_lPos + 0][BLKSIZE / 2 + j]; + fftenergy[BLKSIZE / 2 - j] = (re * re + im * im) * 0.5; + } + for (let b = 2; b >= 0; --b) { + fftenergy_s[b][0] = wsamp_s[wsamp_sPos + 0][b][0]; + fftenergy_s[b][0] *= fftenergy_s[b][0]; + for (let j = BLKSIZE_s / 2 - 1; j >= 0; --j) { + const re = wsamp_s[wsamp_sPos + 0][b][BLKSIZE_s / 2 - j]; + const im = wsamp_s[wsamp_sPos + 0][b][BLKSIZE_s / 2 + j]; + fftenergy_s[b][BLKSIZE_s / 2 - j] = (re * re + im * im) * 0.5; + } + } + + let totalenergy = 0.0; + for (let j = 11; j < HBLKSIZE; j++) { + totalenergy += fftenergy[j]; + } + + gfc.tot_ener[chn] = totalenergy; + + if (gfp.athaa_loudapprox === 2 && chn < 2) { + gfc.loudness_sq[gr_out][chn] = gfc.loudness_sq_save[chn]; + gfc.loudness_sq_save[chn] = this.psycho_loudness_approx(fftenergy, gfc); + } + } + + private static readonly I1LIMIT = 8; + + private static readonly I2LIMIT = 23; + + private static readonly MLIMIT = 15; + + private ma_max_i1 = 0; + + private ma_max_i2 = 0; + + private ma_max_m = 0; + + private readonly tab = [ + 1.0, 0.79433, 0.63096, 0.63096, 0.63096, 0.63096, 0.63096, 0.25119, 0.11749, + ] as const; + + private init_mask_add_max_values() { + this.ma_max_i1 = Math.pow(10, (PsyModel.I1LIMIT + 1) / 16.0); + this.ma_max_i2 = Math.pow(10, (PsyModel.I2LIMIT + 1) / 16.0); + this.ma_max_m = Math.pow(10, PsyModel.MLIMIT / 10.0); + } + + private readonly table1 = [ + 3.3246 * 3.3246, + 3.23837 * 3.23837, + 3.15437 * 3.15437, + 3.00412 * 3.00412, + 2.86103 * 2.86103, + 2.65407 * 2.65407, + 2.46209 * 2.46209, + 2.284 * 2.284, + 2.11879 * 2.11879, + 1.96552 * 1.96552, + 1.82335 * 1.82335, + 1.69146 * 1.69146, + 1.56911 * 1.56911, + 1.46658 * 1.46658, + 1.37074 * 1.37074, + 1.31036 * 1.31036, + 1.25264 * 1.25264, + 1.20648 * 1.20648, + 1.16203 * 1.16203, + 1.12765 * 1.12765, + 1.09428 * 1.09428, + 1.0659 * 1.0659, + 1.03826 * 1.03826, + 1.01895 * 1.01895, + 1, + ] as const; + + private readonly table2 = [ + 1.33352 * 1.33352, + 1.35879 * 1.35879, + 1.38454 * 1.38454, + 1.39497 * 1.39497, + 1.40548 * 1.40548, + 1.3537 * 1.3537, + 1.30382 * 1.30382, + 1.22321 * 1.22321, + 1.14758 * 1.14758, + 1, + ] as const; + + private readonly table3 = [ + 2.35364 * 2.35364, + 2.29259 * 2.29259, + 2.23313 * 2.23313, + 2.12675 * 2.12675, + 2.02545 * 2.02545, + 1.87894 * 1.87894, + 1.74303 * 1.74303, + 1.61695 * 1.61695, + 1.49999 * 1.49999, + 1.39148 * 1.39148, + 1.29083 * 1.29083, + 1.19746 * 1.19746, + 1.11084 * 1.11084, + 1.03826 * 1.03826, + ] as const; + + private mask_add( + m1: number, + m2: number, + kk: number, + b: number, + gfc: LameInternalFlags, + shortblock: number + ) { + let ratio; + + if (m2 > m1) { + if (m2 < m1 * this.ma_max_i2) ratio = m2 / m1; + else return m1 + m2; + } else { + if (m1 >= m2 * this.ma_max_i2) return m1 + m2; + ratio = m1 / m2; + } + + assert(m1 >= 0); + assert(m2 >= 0); + + m1 += m2; + + if (b + 3 <= 3 + 3) { + if (ratio >= this.ma_max_i1) { + return m1; + } + + const i = Math.trunc(Math.log10(ratio) * 16.0); + return m1 * this.table2[i]; + } + + const i = Math.trunc(Math.log10(ratio) * 16.0); + if (shortblock !== 0) { + m2 = gfc.ATH.cb_s[kk] * gfc.ATH.adjust; + } else { + m2 = gfc.ATH.cb_l[kk] * gfc.ATH.adjust; + } + assert(m2 >= 0); + if (m1 < this.ma_max_m * m2) { + if (m1 > m2) { + let f; + f = 1.0; + if (i <= 13) f = this.table3[i]; + + const r = Math.log10(m1 / m2) * (10.0 / 15.0); + return m1 * ((this.table1[i] - f) * r + f); + } + + if (i > 13) { + return m1; + } + + return m1 * this.table3[i]; + } + + return m1 * this.table1[i]; + } + + private readonly table2_ = [ + 1.33352 * 1.33352, + 1.35879 * 1.35879, + 1.38454 * 1.38454, + 1.39497 * 1.39497, + 1.40548 * 1.40548, + 1.3537 * 1.3537, + 1.30382 * 1.30382, + 1.22321 * 1.22321, + 1.14758 * 1.14758, + 1, + ] as const; + + private vbrpsy_mask_add(m1: number, m2: number, b: number) { + let ratio; + + if (m1 < 0) { + m1 = 0; + } + if (m2 < 0) { + m2 = 0; + } + if (m1 <= 0) { + return m2; + } + if (m2 <= 0) { + return m1; + } + if (m2 > m1) { + ratio = m2 / m1; + } else { + ratio = m1 / m2; + } + if (b >= -2 && b <= 2) { + if (ratio >= this.ma_max_i1) { + return m1 + m2; + } + const i = Math.trunc(Math.log10(ratio) * 16.0); + return (m1 + m2) * this.table2_[i]; + } + if (ratio < this.ma_max_i2) { + return m1 + m2; + } + if (m1 < m2) { + m1 = m2; + } + return m1; + } + + private calc_interchannel_masking(gfp: LameGlobalFlags, ratio: number) { + const gfc = gfp.internal_flags; + if (gfc.channels_out > 1) { + for (let sb = 0; sb < SBMAX_l; sb++) { + const l = gfc.thm[0].l[sb]; + const r = gfc.thm[1].l[sb]; + gfc.thm[0].l[sb] += r * ratio; + gfc.thm[1].l[sb] += l * ratio; + } + for (let sb = 0; sb < SBMAX_s; sb++) { + for (let sblock = 0; sblock < 3; sblock++) { + const l = gfc.thm[0].s[sb][sblock]; + const r = gfc.thm[1].s[sb][sblock]; + gfc.thm[0].s[sb][sblock] += r * ratio; + gfc.thm[1].s[sb][sblock] += l * ratio; + } + } + } + } + + private msfix1(gfc: LameInternalFlags) { + for (let sb = 0; sb < SBMAX_l; sb++) { + if ( + gfc.thm[0].l[sb] > 1.58 * gfc.thm[1].l[sb] || + gfc.thm[1].l[sb] > 1.58 * gfc.thm[0].l[sb] + ) + continue; + let mld = gfc.mld_l[sb] * gfc.en[3].l[sb]; + const rmid = Math.max(gfc.thm[2].l[sb], Math.min(gfc.thm[3].l[sb], mld)); + + mld = gfc.mld_l[sb] * gfc.en[2].l[sb]; + const rside = Math.max(gfc.thm[3].l[sb], Math.min(gfc.thm[2].l[sb], mld)); + gfc.thm[2].l[sb] = rmid; + gfc.thm[3].l[sb] = rside; + } + + for (let sb = 0; sb < SBMAX_s; sb++) { + for (let sblock = 0; sblock < 3; sblock++) { + if ( + gfc.thm[0].s[sb][sblock] > 1.58 * gfc.thm[1].s[sb][sblock] || + gfc.thm[1].s[sb][sblock] > 1.58 * gfc.thm[0].s[sb][sblock] + ) + continue; + let mld = gfc.mld_s[sb] * gfc.en[3].s[sb][sblock]; + const rmid = Math.max( + gfc.thm[2].s[sb][sblock], + Math.min(gfc.thm[3].s[sb][sblock], mld) + ); + + mld = gfc.mld_s[sb] * gfc.en[2].s[sb][sblock]; + const rside = Math.max( + gfc.thm[3].s[sb][sblock], + Math.min(gfc.thm[2].s[sb][sblock], mld) + ); + + gfc.thm[2].s[sb][sblock] = rmid; + gfc.thm[3].s[sb][sblock] = rside; + } + } + } + + private ns_msfix(gfc: LameInternalFlags, msfix: number, athadjust: number) { + let msfix2 = msfix; + let athlower = Math.pow(10, athadjust); + + msfix *= 2.0; + msfix2 *= 2.0; + for (let sb = 0; sb < SBMAX_l; sb++) { + let thmM; + let thmS; + const ath = gfc.ATH.cb_l[gfc.bm_l[sb]] * athlower; + const thmLR = Math.min( + Math.max(gfc.thm[0].l[sb], ath), + Math.max(gfc.thm[1].l[sb], ath) + ); + thmM = Math.max(gfc.thm[2].l[sb], ath); + thmS = Math.max(gfc.thm[3].l[sb], ath); + if (thmLR * msfix < thmM + thmS) { + const f = (thmLR * msfix2) / (thmM + thmS); + thmM *= f; + thmS *= f; + assert(thmM + thmS > 0); + } + gfc.thm[2].l[sb] = Math.min(thmM, gfc.thm[2].l[sb]); + gfc.thm[3].l[sb] = Math.min(thmS, gfc.thm[3].l[sb]); + } + + athlower *= BLKSIZE_s / BLKSIZE; + for (let sb = 0; sb < SBMAX_s; sb++) { + for (let sblock = 0; sblock < 3; sblock++) { + let thmM; + let thmS; + const ath = gfc.ATH.cb_s[gfc.bm_s[sb]] * athlower; + const thmLR = Math.min( + Math.max(gfc.thm[0].s[sb][sblock], ath), + Math.max(gfc.thm[1].s[sb][sblock], ath) + ); + thmM = Math.max(gfc.thm[2].s[sb][sblock], ath); + thmS = Math.max(gfc.thm[3].s[sb][sblock], ath); + + if (thmLR * msfix < thmM + thmS) { + const f = (thmLR * msfix) / (thmM + thmS); + thmM *= f; + thmS *= f; + assert(thmM + thmS > 0); + } + gfc.thm[2].s[sb][sblock] = Math.min(gfc.thm[2].s[sb][sblock], thmM); + gfc.thm[3].s[sb][sblock] = Math.min(gfc.thm[3].s[sb][sblock], thmS); + } + } + } + + private convert_partition2scalefac_s( + gfc: LameInternalFlags, + eb: Float32Array, + thr: Float32Array, + chn: number, + sblock: number + ) { + let sb = 0; + let b = 0; + let enn = 0.0; + let thmm = 0.0; + for (; sb < SBMAX_s; ++b, ++sb) { + const bo_s_sb = gfc.bo_s[sb]; + const { npart_s } = gfc; + const b_lim = bo_s_sb < npart_s ? bo_s_sb : npart_s; + while (b < b_lim) { + assert(eb[b] >= 0); + + assert(thr[b] >= 0); + enn += eb[b]; + thmm += thr[b]; + b++; + } + gfc.en[chn].s[sb][sblock] = enn; + gfc.thm[chn].s[sb][sblock] = thmm; + + if (b >= npart_s) { + ++sb; + break; + } + assert(eb[b] >= 0); + + assert(thr[b] >= 0); + + const w_curr = gfc.PSY.bo_s_weight[sb]; + const w_next = 1.0 - w_curr; + enn = w_curr * eb[b]; + thmm = w_curr * thr[b]; + gfc.en[chn].s[sb][sblock] += enn; + gfc.thm[chn].s[sb][sblock] += thmm; + enn = w_next * eb[b]; + thmm = w_next * thr[b]; + } + + for (; sb < SBMAX_s; ++sb) { + gfc.en[chn].s[sb][sblock] = 0; + gfc.thm[chn].s[sb][sblock] = 0; + } + } + + private convert_partition2scalefac_l( + gfc: LameInternalFlags, + eb: Float32Array, + thr: Float32Array, + chn: number + ) { + let sb = 0; + let b = 0; + let enn = 0.0; + let thmm = 0.0; + for (; sb < SBMAX_l; ++b, ++sb) { + const bo_l_sb = gfc.bo_l[sb]; + const { npart_l } = gfc; + const b_lim = bo_l_sb < npart_l ? bo_l_sb : npart_l; + while (b < b_lim) { + assert(eb[b] >= 0); + + assert(thr[b] >= 0); + enn += eb[b]; + thmm += thr[b]; + b++; + } + gfc.en[chn].l[sb] = enn; + gfc.thm[chn].l[sb] = thmm; + + if (b >= npart_l) { + ++sb; + break; + } + assert(eb[b] >= 0); + assert(thr[b] >= 0); + + const w_curr = gfc.PSY.bo_l_weight[sb]; + const w_next = 1.0 - w_curr; + enn = w_curr * eb[b]; + thmm = w_curr * thr[b]; + gfc.en[chn].l[sb] += enn; + gfc.thm[chn].l[sb] += thmm; + enn = w_next * eb[b]; + thmm = w_next * thr[b]; + } + + for (; sb < SBMAX_l; ++sb) { + gfc.en[chn].l[sb] = 0; + gfc.thm[chn].l[sb] = 0; + } + } + + private compute_masking_s( + gfp: LameGlobalFlags, + fftenergy_s: Float32Array[], + eb: Float32Array, + thr: Float32Array, + chn: number, + sblock: number + ) { + const gfc = gfp.internal_flags; + let j = 0; + let b = 0; + + for (; b < gfc.npart_s; ++b) { + let ebb = 0; + let m = 0; + const n = gfc.numlines_s[b]; + for (let i = 0; i < n; ++i, ++j) { + const el = fftenergy_s[sblock][j]; + ebb += el; + if (m < el) m = el; + } + eb[b] = ebb; + } + assert(b === gfc.npart_s); + assert(j === 129); + j = 0; + b = 0; + assert(gfc.s3_ss !== null); + for (; b < gfc.npart_s; b++) { + let kk = gfc.s3ind_s[b][0]; + let ecb = gfc.s3_ss[j++] * eb[kk]; + ++kk; + while (kk <= gfc.s3ind_s[b][1]) { + ecb += gfc.s3_ss[j] * eb[kk]; + ++j; + ++kk; + } + + const x = this.rpelev_s * gfc.nb_s1[chn][b]; + thr[b] = Math.min(ecb, x); + + if (gfc.blocktype_old[chn & 1] === SHORT_TYPE) { + const x = this.rpelev2_s * gfc.nb_s2[chn][b]; + const y = thr[b]; + thr[b] = Math.min(x, y); + } + + gfc.nb_s2[chn][b] = gfc.nb_s1[chn][b]; + gfc.nb_s1[chn][b] = ecb; + assert(thr[b] >= 0); + } + for (; b <= CBANDS; ++b) { + eb[b] = 0; + thr[b] = 0; + } + } + + private block_type_set( + gfp: LameGlobalFlags, + uselongblock: Int32Array, + blocktype_d: Int32Array, + blocktype: Int32Array + ) { + const gfc = gfp.internal_flags; + + if ( + gfp.short_blocks === ShortBlock.short_block_coupled && + !(uselongblock[0] !== 0 && uselongblock[1] !== 0) + ) { + uselongblock[0] = 0; + uselongblock[1] = 0; + } + + for (let chn = 0; chn < gfc.channels_out; chn++) { + blocktype[chn] = NORM_TYPE; + + if (gfp.short_blocks === ShortBlock.short_block_dispensed) + uselongblock[chn] = 1; + if (gfp.short_blocks === ShortBlock.short_block_forced) + uselongblock[chn] = 0; + + if (uselongblock[chn] !== 0) { + assert(gfc.blocktype_old[chn] !== START_TYPE); + if (gfc.blocktype_old[chn] === SHORT_TYPE) blocktype[chn] = STOP_TYPE; + } else { + blocktype[chn] = SHORT_TYPE; + if (gfc.blocktype_old[chn] === NORM_TYPE) { + gfc.blocktype_old[chn] = START_TYPE; + } + if (gfc.blocktype_old[chn] === STOP_TYPE) + gfc.blocktype_old[chn] = SHORT_TYPE; + } + + blocktype_d[chn] = gfc.blocktype_old[chn]; + + gfc.blocktype_old[chn] = blocktype[chn]; + } + } + + private nsInterp(x: number, y: number, r: number) { + if (r >= 1.0) { + return x; + } + if (r <= 0.0) return y; + if (y > 0.0) { + return Math.pow(x / y, r) * y; + } + + return 0.0; + } + + private readonly regcoef_s = [ + 11.8, 13.6, 17.2, 32, 46.5, 51.3, 57.5, 67.1, 71.5, 84.6, 97.6, 130, + ] as const; + + private pecalc_s(mr: III_psy_ratio, masking_lower: number) { + let pe_s = 1236.28 / 4; + for (let sb = 0; sb < SBMAX_s - 1; sb++) { + for (let sblock = 0; sblock < 3; sblock++) { + const thm = mr.thm.s[sb][sblock]; + assert(sb < this.regcoef_s.length); + if (thm > 0.0) { + const x = thm * masking_lower; + const en = mr.en.s[sb][sblock]; + if (en > x) { + if (en > x * 1e10) { + pe_s += this.regcoef_s[sb] * (10.0 * LOG10); + } else { + assert(x > 0); + pe_s += this.regcoef_s[sb] * Math.log10(en / x); + } + } + } + } + } + + return pe_s; + } + + private readonly regcoef_l = [ + 6.8, 5.8, 5.8, 6.4, 6.5, 9.9, 12.1, 14.4, 15, 18.9, 21.6, 26.9, 34.2, 40.2, + 46.8, 56.5, 60.7, 73.9, 85.7, 93.4, 126.1, + ] as const; + + private pecalc_l(mr: III_psy_ratio, masking_lower: number) { + let pe_l = 1124.23 / 4; + for (let sb = 0; sb < SBMAX_l - 1; sb++) { + const thm = mr.thm.l[sb]; + assert(sb < this.regcoef_l.length); + if (thm > 0.0) { + const x = thm * masking_lower; + const en = mr.en.l[sb]; + if (en > x) { + if (en > x * 1e10) { + pe_l += this.regcoef_l[sb] * (10.0 * LOG10); + } else { + assert(x > 0); + pe_l += this.regcoef_l[sb] * Math.log10(en / x); + } + } + } + } + return pe_l; + } + + private calc_energy( + gfc: LameInternalFlags, + fftenergy: Float32Array, + eb: Float32Array, + max: Float32Array, + avg: Float32Array + ) { + let b = 0; + let j = 0; + + for (; b < gfc.npart_l; ++b) { + let ebb = 0; + let m = 0; + let i; + for (i = 0; i < gfc.numlines_l[b]; ++i, ++j) { + const el = fftenergy[j]; + assert(el >= 0); + ebb += el; + if (m < el) m = el; + } + eb[b] = ebb; + max[b] = m; + avg[b] = ebb * gfc.rnumlines_l[b]; + assert(gfc.rnumlines_l[b] >= 0); + assert(ebb >= 0); + assert(eb[b] >= 0); + assert(max[b] >= 0); + assert(avg[b] >= 0); + } + } + + private calc_mask_index_l( + gfc: LameInternalFlags, + max: Float32Array, + avg: Float32Array, + mask_idx: Int32Array + ) { + const last_tab_entry = this.tab.length - 1; + let b = 0; + let a = avg[b] + avg[b + 1]; + assert(a >= 0); + if (a > 0.0) { + let m = max[b]; + if (m < max[b + 1]) m = max[b + 1]; + assert(gfc.numlines_l[b] + gfc.numlines_l[b + 1] - 1 > 0); + a = + (20.0 * (m * 2.0 - a)) / + (a * (gfc.numlines_l[b] + gfc.numlines_l[b + 1] - 1)); + let k = Math.trunc(a); + if (k > last_tab_entry) k = last_tab_entry; + mask_idx[b] = k; + } else { + mask_idx[b] = 0; + } + + for (b = 1; b < gfc.npart_l - 1; b++) { + a = avg[b - 1] + avg[b] + avg[b + 1]; + assert(a >= 0); + if (a > 0.0) { + let m = max[b - 1]; + if (m < max[b]) m = max[b]; + if (m < max[b + 1]) m = max[b + 1]; + assert( + gfc.numlines_l[b - 1] + + gfc.numlines_l[b] + + gfc.numlines_l[b + 1] - + 1 > + 0 + ); + a = + (20.0 * (m * 3.0 - a)) / + (a * + (gfc.numlines_l[b - 1] + + gfc.numlines_l[b] + + gfc.numlines_l[b + 1] - + 1)); + let k = Math.trunc(a); + if (k > last_tab_entry) k = last_tab_entry; + mask_idx[b] = k; + } else { + mask_idx[b] = 0; + } + } + assert(b > 0); + assert(b === gfc.npart_l - 1); + + a = avg[b - 1] + avg[b]; + assert(a >= 0); + if (a > 0.0) { + let m = max[b - 1]; + if (m < max[b]) m = max[b]; + assert(gfc.numlines_l[b - 1] + gfc.numlines_l[b] - 1 > 0); + a = + (20.0 * (m * 2.0 - a)) / + (a * (gfc.numlines_l[b - 1] + gfc.numlines_l[b] - 1)); + let k = Math.trunc(a); + if (k > last_tab_entry) k = last_tab_entry; + mask_idx[b] = k; + } else { + mask_idx[b] = 0; + } + assert(b === gfc.npart_l - 1); + } + + private readonly fircoef = [ + -8.65163e-18 * 2, + -0.00851586 * 2, + -6.74764e-18 * 2, + 0.0209036 * 2, + -3.36639e-17 * 2, + -0.0438162 * 2, + -1.54175e-17 * 2, + 0.0931738 * 2, + -5.52212e-17 * 2, + -0.313819 * 2, + ] as const; + + // eslint-disable-next-line complexity + L3psycho_anal_ns( + gfp: LameGlobalFlags, + buffer: Float32Array[], + bufPos: number, + gr_out: number, + masking_ratio: III_psy_ratio[][], + masking_MS_ratio: III_psy_ratio[][], + percep_entropy: number[], + percep_MS_entropy: number[], + energy: Float32Array, + blocktype_d: Int32Array + ) { + const gfc = gfp.internal_flags; + + const wsamp_L = Array.from({ length: 2 }, () => new Float32Array(BLKSIZE)); + const wsamp_S = Array.from({ length: 2 }, () => + Array.from({ length: 3 }, () => new Float32Array(BLKSIZE_s)) + ); + + const eb_l = new Float32Array(CBANDS + 1); + const eb_s = new Float32Array(CBANDS + 1); + const thr = new Float32Array(CBANDS + 2); + + const blocktype = new Int32Array(2); + const uselongblock = new Int32Array(2); + + let numchn; + let chn; + let b; + let i; + let j; + let k; + let sb; + let sblock; + + const ns_hpfsmpl = Array.from({ length: 2 }, () => new Float32Array(576)); + let pcfact; + const mask_idx_l = new Int32Array(CBANDS + 2); + const mask_idx_s = new Int32Array(CBANDS + 2); + + fillArray(mask_idx_s, 0); + + numchn = gfc.channels_out; + + if (gfp.mode === MPEGMode.JOINT_STEREO) { + numchn = 4; + } + + if (gfp.VBR === VbrMode.vbr_off) { + pcfact = 0; + } else if ( + gfp.VBR === VbrMode.vbr_rh || + gfp.VBR === VbrMode.vbr_mtrh || + gfp.VBR === VbrMode.vbr_mt + ) { + pcfact = 0.6; + } else pcfact = 1.0; + + for (chn = 0; chn < gfc.channels_out; chn++) { + const firbuf = buffer[chn]; + const firbufPos = bufPos + 576 - 350 - PsyModel.NSFIRLEN + 192; + assert(this.fircoef.length === (PsyModel.NSFIRLEN - 1) / 2); + for (i = 0; i < 576; i++) { + let sum1; + let sum2; + sum1 = firbuf[firbufPos + i + 10]; + sum2 = 0.0; + for (j = 0; j < (PsyModel.NSFIRLEN - 1) / 2 - 1; j += 2) { + sum1 += + this.fircoef[j] * + (firbuf[firbufPos + i + j] + + firbuf[firbufPos + i + PsyModel.NSFIRLEN - j]); + sum2 += + this.fircoef[j + 1] * + (firbuf[firbufPos + i + j + 1] + + firbuf[firbufPos + i + PsyModel.NSFIRLEN - j - 1]); + } + ns_hpfsmpl[chn][i] = sum1 + sum2; + } + masking_ratio[gr_out][chn].en.assign(gfc.en[chn]); + masking_ratio[gr_out][chn].thm.assign(gfc.thm[chn]); + if (numchn > 2) { + masking_MS_ratio[gr_out][chn].en.assign(gfc.en[chn + 2]); + masking_MS_ratio[gr_out][chn].thm.assign(gfc.thm[chn + 2]); + } + } + + for (chn = 0; chn < numchn; chn++) { + const en_subshort = new Float32Array(12); + const en_short = [0, 0, 0, 0]; + const attack_intensity = new Float32Array(12); + let ns_uselongblock = 1; + const max = new Float32Array(CBANDS); + const avg = new Float32Array(CBANDS); + const ns_attacks = [0, 0, 0, 0]; + const fftenergy = new Float32Array(HBLKSIZE); + const fftenergy_s = Array.from( + { length: 3 }, + () => new Float32Array(HBLKSIZE_s) + ); + + assert(gfc.npart_s <= CBANDS); + assert(gfc.npart_l <= CBANDS); + + for (i = 0; i < 3; i++) { + en_subshort[i] = gfc.nsPsy.last_en_subshort[chn][i + 6]; + assert(gfc.nsPsy.last_en_subshort[chn][i + 4] > 0); + attack_intensity[i] = + en_subshort[i] / gfc.nsPsy.last_en_subshort[chn][i + 4]; + en_short[0] += en_subshort[i]; + } + + if (chn === 2) { + for (i = 0; i < 576; i++) { + const l = ns_hpfsmpl[0][i]; + const r = ns_hpfsmpl[1][i]; + ns_hpfsmpl[0][i] = l + r; + ns_hpfsmpl[1][i] = l - r; + } + } + + const pf = ns_hpfsmpl[chn & 1]; + let pfPos = 0; + for (i = 0; i < 9; i++) { + const pfe = pfPos + 576 / 9; + let p = 1; + for (; pfPos < pfe; pfPos++) + if (p < Math.abs(pf[pfPos])) p = Math.abs(pf[pfPos]); + + gfc.nsPsy.last_en_subshort[chn][i] = p; + en_subshort[i + 3] = p; + en_short[1 + i / 3] += p; + if (p > en_subshort[i + 3 - 2]) { + assert(en_subshort[i + 3 - 2] > 0); + p /= en_subshort[i + 3 - 2]; + } else if (en_subshort[i + 3 - 2] > p * 10.0) { + assert(p > 0); + p = en_subshort[i + 3 - 2] / (p * 10.0); + } else p = 0.0; + attack_intensity[i + 3] = p; + } + + const attackThreshold = + chn === 3 ? gfc.nsPsy.attackthre_s : gfc.nsPsy.attackthre; + for (i = 0; i < 12; i++) { + if (ns_attacks[i / 3] === 0 && attack_intensity[i] > attackThreshold) { + ns_attacks[i / 3] = (i % 3) + 1; + } + } + + for (i = 1; i < 4; i++) { + let ratio; + if (en_short[i - 1] > en_short[i]) { + assert(en_short[i] > 0); + ratio = en_short[i - 1] / en_short[i]; + } else { + assert(en_short[i - 1] > 0); + ratio = en_short[i] / en_short[i - 1]; + } + if (ratio < 1.7) { + ns_attacks[i] = 0; + if (i === 1) ns_attacks[0] = 0; + } + } + + if (ns_attacks[0] !== 0 && gfc.nsPsy.lastAttacks[chn] !== 0) + ns_attacks[0] = 0; + + if ( + gfc.nsPsy.lastAttacks[chn] === 3 || + ns_attacks[0] + ns_attacks[1] + ns_attacks[2] + ns_attacks[3] !== 0 + ) { + ns_uselongblock = 0; + + if (ns_attacks[1] !== 0 && ns_attacks[0] !== 0) ns_attacks[1] = 0; + if (ns_attacks[2] !== 0 && ns_attacks[1] !== 0) ns_attacks[2] = 0; + if (ns_attacks[3] !== 0 && ns_attacks[2] !== 0) ns_attacks[3] = 0; + } + + if (chn < 2) { + uselongblock[chn] = ns_uselongblock; + } else if (ns_uselongblock === 0) { + uselongblock[0] = 0; + uselongblock[1] = 0; + } + + energy[chn] = gfc.tot_ener[chn]; + + const wsamp_s = wsamp_S; + const wsamp_l = wsamp_L; + this.compute_ffts( + gfp, + fftenergy, + fftenergy_s, + wsamp_l, + chn & 1, + wsamp_s, + chn & 1, + gr_out, + chn, + buffer, + bufPos + ); + + this.calc_energy(gfc, fftenergy, eb_l, max, avg); + this.calc_mask_index_l(gfc, max, avg, mask_idx_l); + + for (sblock = 0; sblock < 3; sblock++) { + let enn; + let thmm; + this.compute_masking_s(gfp, fftenergy_s, eb_s, thr, chn, sblock); + this.convert_partition2scalefac_s(gfc, eb_s, thr, chn, sblock); + + for (sb = 0; sb < SBMAX_s; sb++) { + thmm = gfc.thm[chn].s[sb][sblock]; + + thmm *= PsyModel.NS_PREECHO_ATT0; + if (ns_attacks[sblock] >= 2 || ns_attacks[sblock + 1] === 1) { + const idx = sblock !== 0 ? sblock - 1 : 2; + const p = this.nsInterp( + gfc.thm[chn].s[sb][idx], + thmm, + PsyModel.NS_PREECHO_ATT1 * pcfact + ); + thmm = Math.min(thmm, p); + } + + if (ns_attacks[sblock] === 1) { + const idx = sblock !== 0 ? sblock - 1 : 2; + const p = this.nsInterp( + gfc.thm[chn].s[sb][idx], + thmm, + PsyModel.NS_PREECHO_ATT2 * pcfact + ); + thmm = Math.min(thmm, p); + } else if ( + (sblock !== 0 && ns_attacks[sblock - 1] === 3) || + (sblock === 0 && gfc.nsPsy.lastAttacks[chn] === 3) + ) { + const idx = sblock !== 2 ? sblock + 1 : 0; + const p = this.nsInterp( + gfc.thm[chn].s[sb][idx], + thmm, + PsyModel.NS_PREECHO_ATT2 * pcfact + ); + thmm = Math.min(thmm, p); + } + + enn = + en_subshort[sblock * 3 + 3] + + en_subshort[sblock * 3 + 4] + + en_subshort[sblock * 3 + 5]; + if (en_subshort[sblock * 3 + 5] * 6 < enn) { + thmm *= 0.5; + if (en_subshort[sblock * 3 + 4] * 6 < enn) thmm *= 0.5; + } + + gfc.thm[chn].s[sb][sblock] = thmm; + } + } + gfc.nsPsy.lastAttacks[chn] = ns_attacks[2]; + + k = 0; + + assert(gfc.s3_ll !== null); + for (b = 0; b < gfc.npart_l; b++) { + let kk = gfc.s3ind[b][0]; + let eb2 = eb_l[kk] * this.tab[mask_idx_l[kk]]; + let ecb = gfc.s3_ll[k++] * eb2; + while (++kk <= gfc.s3ind[b][1]) { + eb2 = eb_l[kk] * this.tab[mask_idx_l[kk]]; + ecb = this.mask_add(ecb, gfc.s3_ll[k++] * eb2, kk, kk - b, gfc, 0); + } + ecb *= 0.158489319246111; + + if (gfc.blocktype_old[chn & 1] === SHORT_TYPE) thr[b] = ecb; + else + thr[b] = this.nsInterp( + Math.min( + ecb, + Math.min( + this.rpelev * gfc.nb_1[chn][b], + this.rpelev2 * gfc.nb_2[chn][b] + ) + ), + ecb, + pcfact + ); + + gfc.nb_2[chn][b] = gfc.nb_1[chn][b]; + gfc.nb_1[chn][b] = ecb; + } + + for (; b <= CBANDS; ++b) { + eb_l[b] = 0; + thr[b] = 0; + } + + this.convert_partition2scalefac_l(gfc, eb_l, thr, chn); + } + + if (gfp.mode === MPEGMode.STEREO || gfp.mode === MPEGMode.JOINT_STEREO) { + if (gfp.interChRatio > 0.0) { + this.calc_interchannel_masking(gfp, gfp.interChRatio); + } + } + + if (gfp.mode === MPEGMode.JOINT_STEREO) { + this.msfix1(gfc); + const { msfix } = gfp; + if (Math.abs(msfix) > 0.0) + this.ns_msfix(gfc, msfix, gfp.ATHlower * gfc.ATH.adjust); + } + + this.block_type_set(gfp, uselongblock, blocktype_d, blocktype); + + for (chn = 0; chn < numchn; chn++) { + let ppe; + let ppePos = 0; + let type; + let mr; + + if (chn > 1) { + ppe = percep_MS_entropy; + ppePos = -2; + type = NORM_TYPE; + if (blocktype_d[0] === SHORT_TYPE || blocktype_d[1] === SHORT_TYPE) + type = SHORT_TYPE; + mr = masking_MS_ratio[gr_out][chn - 2]; + } else { + ppe = percep_entropy; + ppePos = 0; + type = blocktype_d[chn]; + mr = masking_ratio[gr_out][chn]; + } + + if (type === SHORT_TYPE) + ppe[ppePos + chn] = this.pecalc_s(mr, gfc.masking_lower); + else ppe[ppePos + chn] = this.pecalc_l(mr, gfc.masking_lower); + } + return 0; + } + + private vbrpsy_compute_fft_l( + gfp: LameGlobalFlags, + buffer: Float32Array[], + bufPos: number, + chn: number, + fftenergy: Float32Array, + wsamp_l: Float32Array[], + wsamp_lPos: number + ) { + const gfc = gfp.internal_flags; + if (chn < 2) { + this.fft.fft_long(gfc, wsamp_l[wsamp_lPos], chn, buffer, bufPos); + } else if (chn === 2) { + for (let j = BLKSIZE - 1; j >= 0; --j) { + const l = wsamp_l[wsamp_lPos + 0][j]; + const r = wsamp_l[wsamp_lPos + 1][j]; + wsamp_l[wsamp_lPos + 0][j] = (l + r) * Math.SQRT2 * 0.5; + wsamp_l[wsamp_lPos + 1][j] = (l - r) * Math.SQRT2 * 0.5; + } + } + + fftenergy[0] = wsamp_l[wsamp_lPos + 0][0]; + fftenergy[0] *= fftenergy[0]; + + for (let j = BLKSIZE / 2 - 1; j >= 0; --j) { + const re = wsamp_l[wsamp_lPos + 0][BLKSIZE / 2 - j]; + const im = wsamp_l[wsamp_lPos + 0][BLKSIZE / 2 + j]; + fftenergy[BLKSIZE / 2 - j] = (re * re + im * im) * 0.5; + } + + let totalenergy = 0.0; + for (let j = 11; j < HBLKSIZE; j++) totalenergy += fftenergy[j]; + + gfc.tot_ener[chn] = totalenergy; + } + + private vbrpsy_compute_fft_s( + gfp: LameGlobalFlags, + buffer: Float32Array[], + bufPos: number, + chn: number, + sblock: number, + fftenergy_s: Float32Array[], + wsamp_s: Float32Array[][], + wsamp_sPos: number + ) { + const gfc = gfp.internal_flags; + + if (sblock === 0 && chn < 2) { + this.fft.fft_short(gfc, wsamp_s[wsamp_sPos], chn, buffer, bufPos); + } + if (chn === 2) { + for (let j = BLKSIZE_s - 1; j >= 0; --j) { + const l = wsamp_s[wsamp_sPos + 0][sblock][j]; + const r = wsamp_s[wsamp_sPos + 1][sblock][j]; + wsamp_s[wsamp_sPos + 0][sblock][j] = (l + r) * Math.SQRT2 * 0.5; + wsamp_s[wsamp_sPos + 1][sblock][j] = (l - r) * Math.SQRT2 * 0.5; + } + } + + fftenergy_s[sblock][0] = wsamp_s[wsamp_sPos + 0][sblock][0]; + fftenergy_s[sblock][0] *= fftenergy_s[sblock][0]; + for (let j = BLKSIZE_s / 2 - 1; j >= 0; --j) { + const re = wsamp_s[wsamp_sPos + 0][sblock][BLKSIZE_s / 2 - j]; + const im = wsamp_s[wsamp_sPos + 0][sblock][BLKSIZE_s / 2 + j]; + fftenergy_s[sblock][BLKSIZE_s / 2 - j] = (re * re + im * im) * 0.5; + } + } + + private vbrpsy_compute_loudness_approximation_l( + gfp: LameGlobalFlags, + gr_out: number, + chn: number, + fftenergy: Float32Array + ) { + const gfc = gfp.internal_flags; + if (gfp.athaa_loudapprox === 2 && chn < 2) { + gfc.loudness_sq[gr_out][chn] = gfc.loudness_sq_save[chn]; + gfc.loudness_sq_save[chn] = this.psycho_loudness_approx(fftenergy, gfc); + } + } + + private readonly fircoef_ = [ + -8.65163e-18 * 2, + -0.00851586 * 2, + -6.74764e-18 * 2, + 0.0209036 * 2, + -3.36639e-17 * 2, + -0.0438162 * 2, + -1.54175e-17 * 2, + 0.0931738 * 2, + -5.52212e-17 * 2, + -0.313819 * 2, + ] as const; + + // eslint-disable-next-line complexity + private vbrpsy_attack_detection( + gfp: LameGlobalFlags, + buffer: Float32Array[], + bufPos: number, + gr_out: number, + masking_ratio: III_psy_ratio[][], + masking_MS_ratio: III_psy_ratio[][], + energy: Float32Array, + sub_short_factor: Float32Array[], + ns_attacks: number[][], + uselongblock: Int32Array + ) { + const ns_hpfsmpl = Array.from({ length: 2 }, () => new Float32Array(576)); + const gfc = gfp.internal_flags; + const n_chn_out = gfc.channels_out; + + const n_chn_psy = gfp.mode === MPEGMode.JOINT_STEREO ? 4 : n_chn_out; + + for (let chn = 0; chn < n_chn_out; chn++) { + const firbuf = buffer[chn]; + const firbufPos = bufPos + 576 - 350 - PsyModel.NSFIRLEN + 192; + assert(this.fircoef_.length === (PsyModel.NSFIRLEN - 1) / 2); + for (let i = 0; i < 576; i++) { + let sum1; + let sum2; + sum1 = firbuf[firbufPos + i + 10]; + sum2 = 0.0; + for (let j = 0; j < (PsyModel.NSFIRLEN - 1) / 2 - 1; j += 2) { + sum1 += + this.fircoef_[j] * + (firbuf[firbufPos + i + j] + + firbuf[firbufPos + i + PsyModel.NSFIRLEN - j]); + sum2 += + this.fircoef_[j + 1] * + (firbuf[firbufPos + i + j + 1] + + firbuf[firbufPos + i + PsyModel.NSFIRLEN - j - 1]); + } + ns_hpfsmpl[chn][i] = sum1 + sum2; + } + masking_ratio[gr_out][chn].en.assign(gfc.en[chn]); + masking_ratio[gr_out][chn].thm.assign(gfc.thm[chn]); + if (n_chn_psy > 2) { + masking_MS_ratio[gr_out][chn].en.assign(gfc.en[chn + 2]); + masking_MS_ratio[gr_out][chn].thm.assign(gfc.thm[chn + 2]); + } + } + for (let chn = 0; chn < n_chn_psy; chn++) { + const attack_intensity = new Float32Array(12); + const en_subshort = new Float32Array(12); + const en_short = [0, 0, 0, 0]; + const pf = ns_hpfsmpl[chn & 1]; + let pfPos = 0; + const attackThreshold = + chn === 3 ? gfc.nsPsy.attackthre_s : gfc.nsPsy.attackthre; + let ns_uselongblock = 1; + + if (chn === 2) { + for (let i = 0, j = 576; j > 0; ++i, --j) { + const l = ns_hpfsmpl[0][i]; + const r = ns_hpfsmpl[1][i]; + ns_hpfsmpl[0][i] = l + r; + ns_hpfsmpl[1][i] = l - r; + } + } + + for (let i = 0; i < 3; i++) { + en_subshort[i] = gfc.nsPsy.last_en_subshort[chn][i + 6]; + assert(gfc.nsPsy.last_en_subshort[chn][i + 4] > 0); + attack_intensity[i] = + en_subshort[i] / gfc.nsPsy.last_en_subshort[chn][i + 4]; + en_short[0] += en_subshort[i]; + } + + for (let i = 0; i < 9; i++) { + const pfe = pfPos + 576 / 9; + let p = 1; + for (; pfPos < pfe; pfPos++) + if (p < Math.abs(pf[pfPos])) p = Math.abs(pf[pfPos]); + + gfc.nsPsy.last_en_subshort[chn][i] = p; + en_subshort[i + 3] = p; + en_short[1 + i / 3] += p; + if (p > en_subshort[i + 3 - 2]) { + assert(en_subshort[i + 3 - 2] > 0); + p /= en_subshort[i + 3 - 2]; + } else if (en_subshort[i + 3 - 2] > p * 10.0) { + assert(p > 0); + p = en_subshort[i + 3 - 2] / (p * 10.0); + } else { + p = 0.0; + } + attack_intensity[i + 3] = p; + } + + for (let i = 0; i < 3; ++i) { + const enn = + en_subshort[i * 3 + 3] + + en_subshort[i * 3 + 4] + + en_subshort[i * 3 + 5]; + let factor = 1; + if (en_subshort[i * 3 + 5] * 6 < enn) { + factor *= 0.5; + if (en_subshort[i * 3 + 4] * 6 < enn) { + factor *= 0.5; + } + } + sub_short_factor[chn][i] = factor; + } + + for (let i = 0; i < 12; i++) { + if ( + ns_attacks[chn][i / 3] === 0 && + attack_intensity[i] > attackThreshold + ) { + ns_attacks[chn][i / 3] = (i % 3) + 1; + } + } + + for (let i = 1; i < 4; i++) { + const u = en_short[i - 1]; + const v = en_short[i]; + const m = Math.max(u, v); + if (m < 40000) { + if (u < 1.7 * v && v < 1.7 * u) { + if (i === 1 && ns_attacks[chn][0] <= ns_attacks[chn][i]) { + ns_attacks[chn][0] = 0; + } + ns_attacks[chn][i] = 0; + } + } + } + + if (ns_attacks[chn][0] <= gfc.nsPsy.lastAttacks[chn]) { + ns_attacks[chn][0] = 0; + } + + if ( + gfc.nsPsy.lastAttacks[chn] === 3 || + ns_attacks[chn][0] + + ns_attacks[chn][1] + + ns_attacks[chn][2] + + ns_attacks[chn][3] !== + 0 + ) { + ns_uselongblock = 0; + + if (ns_attacks[chn][1] !== 0 && ns_attacks[chn][0] !== 0) { + ns_attacks[chn][1] = 0; + } + if (ns_attacks[chn][2] !== 0 && ns_attacks[chn][1] !== 0) { + ns_attacks[chn][2] = 0; + } + if (ns_attacks[chn][3] !== 0 && ns_attacks[chn][2] !== 0) { + ns_attacks[chn][3] = 0; + } + } + if (chn < 2) { + uselongblock[chn] = ns_uselongblock; + } else if (ns_uselongblock === 0) { + uselongblock[0] = 0; + uselongblock[1] = 0; + } + + energy[chn] = gfc.tot_ener[chn]; + } + } + + private vbrpsy_skip_masking_s( + gfc: LameInternalFlags, + chn: number, + sblock: number + ) { + if (sblock === 0) { + for (let b = 0; b < gfc.npart_s; b++) { + gfc.nb_s2[chn][b] = gfc.nb_s1[chn][b]; + gfc.nb_s1[chn][b] = 0; + } + } + } + + private vbrpsy_skip_masking_l(gfc: LameInternalFlags, chn: number) { + for (let b = 0; b < gfc.npart_l; b++) { + gfc.nb_2[chn][b] = gfc.nb_1[chn][b]; + gfc.nb_1[chn][b] = 0; + } + } + + private psyvbr_calc_mask_index_s( + gfc: LameInternalFlags, + max: number[], + avg: Float32Array, + mask_idx: number[] + ) { + const last_tab_entry = this.tab.length - 1; + let b = 0; + let a = avg[b] + avg[b + 1]; + assert(a >= 0); + if (a > 0.0) { + let m = max[b]; + if (m < max[b + 1]) m = max[b + 1]; + assert(gfc.numlines_s[b] + gfc.numlines_s[b + 1] - 1 > 0); + a = + (20.0 * (m * 2.0 - a)) / + (a * (gfc.numlines_s[b] + gfc.numlines_s[b + 1] - 1)); + let k = Math.trunc(a); + if (k > last_tab_entry) k = last_tab_entry; + mask_idx[b] = k; + } else { + mask_idx[b] = 0; + } + + for (b = 1; b < gfc.npart_s - 1; b++) { + a = avg[b - 1] + avg[b] + avg[b + 1]; + assert(b + 1 < gfc.npart_s); + assert(a >= 0); + if (a > 0.0) { + let m = max[b - 1]; + if (m < max[b]) m = max[b]; + if (m < max[b + 1]) m = max[b + 1]; + assert( + gfc.numlines_s[b - 1] + + gfc.numlines_s[b] + + gfc.numlines_s[b + 1] - + 1 > + 0 + ); + a = + (20.0 * (m * 3.0 - a)) / + (a * + (gfc.numlines_s[b - 1] + + gfc.numlines_s[b] + + gfc.numlines_s[b + 1] - + 1)); + let k = Math.trunc(a); + if (k > last_tab_entry) k = last_tab_entry; + mask_idx[b] = k; + } else { + mask_idx[b] = 0; + } + } + assert(b > 0); + assert(b === gfc.npart_s - 1); + + a = avg[b - 1] + avg[b]; + assert(a >= 0); + if (a > 0.0) { + let m = max[b - 1]; + if (m < max[b]) m = max[b]; + assert(gfc.numlines_s[b - 1] + gfc.numlines_s[b] - 1 > 0); + a = + (20.0 * (m * 2.0 - a)) / + (a * (gfc.numlines_s[b - 1] + gfc.numlines_s[b] - 1)); + let k = Math.trunc(a); + if (k > last_tab_entry) k = last_tab_entry; + mask_idx[b] = k; + } else { + mask_idx[b] = 0; + } + assert(b === gfc.npart_s - 1); + } + + private vbrpsy_compute_masking_s( + gfp: LameGlobalFlags, + fftenergy_s: Float32Array[], + eb: Float32Array, + thr: Float32Array, + chn: number, + sblock: number + ) { + const gfc = gfp.internal_flags; + const max = new Array(CBANDS); + const avg = new Float32Array(CBANDS); + let i; + let j = 0; + let b = 0; + const mask_idx_s = new Array(CBANDS); + + for (; b < gfc.npart_s; ++b) { + let ebb = 0; + let m = 0; + const n = gfc.numlines_s[b]; + for (i = 0; i < n; ++i, ++j) { + const el = fftenergy_s[sblock][j]; + ebb += el; + if (m < el) m = el; + } + eb[b] = ebb; + assert(ebb >= 0); + max[b] = m; + assert(n > 0); + avg[b] = ebb / n; + assert(avg[b] >= 0); + } + assert(b === gfc.npart_s); + assert(j === 129); + for (; b < CBANDS; ++b) { + max[b] = 0; + avg[b] = 0; + } + j = 0; + b = 0; + this.psyvbr_calc_mask_index_s(gfc, max, avg, mask_idx_s); + assert(gfc.s3_ss !== null); + for (; b < gfc.npart_s; b++) { + let kk = gfc.s3ind_s[b][0]; + const last = gfc.s3ind_s[b][1]; + let dd; + let dd_n; + let x; + let ecb; + dd = mask_idx_s[kk]; + dd_n = 1; + ecb = gfc.s3_ss[j] * eb[kk] * this.tab[mask_idx_s[kk]]; + ++j; + ++kk; + while (kk <= last) { + dd += mask_idx_s[kk]; + dd_n += 1; + x = gfc.s3_ss[j] * eb[kk] * this.tab[mask_idx_s[kk]]; + ecb = this.vbrpsy_mask_add(ecb, x, kk - b); + ++j; + ++kk; + } + dd = (1 + 2 * dd) / (2 * dd_n); + const avg_mask = this.tab[dd] * 0.5; + ecb *= avg_mask; + thr[b] = ecb; + gfc.nb_s2[chn][b] = gfc.nb_s1[chn][b]; + gfc.nb_s1[chn][b] = ecb; + + x = max[b]; + x *= gfc.minval_s[b]; + x *= avg_mask; + if (thr[b] > x) { + thr[b] = x; + } + + if (gfc.masking_lower > 1) { + thr[b] *= gfc.masking_lower; + } + if (thr[b] > eb[b]) { + thr[b] = eb[b]; + } + if (gfc.masking_lower < 1) { + thr[b] *= gfc.masking_lower; + } + + assert(thr[b] >= 0); + } + for (; b < CBANDS; ++b) { + eb[b] = 0; + thr[b] = 0; + } + } + + private vbrpsy_compute_masking_l( + gfc: LameInternalFlags, + fftenergy: Float32Array, + eb_l: Float32Array, + thr: Float32Array, + chn: number + ) { + const max = new Float32Array(CBANDS); + const avg = new Float32Array(CBANDS); + const mask_idx_l = new Int32Array(CBANDS + 2); + let b; + + this.calc_energy(gfc, fftenergy, eb_l, max, avg); + this.calc_mask_index_l(gfc, max, avg, mask_idx_l); + + let k = 0; + assert(gfc.s3_ll !== null); + for (b = 0; b < gfc.npart_l; b++) { + let x; + let ecb; + let t; + + let kk = gfc.s3ind[b][0]; + const last = gfc.s3ind[b][1]; + let dd = 0; + let dd_n = 0; + dd = mask_idx_l[kk]; + dd_n += 1; + ecb = gfc.s3_ll[k] * eb_l[kk] * this.tab[mask_idx_l[kk]]; + ++k; + ++kk; + while (kk <= last) { + dd += mask_idx_l[kk]; + dd_n += 1; + x = gfc.s3_ll[k] * eb_l[kk] * this.tab[mask_idx_l[kk]]; + t = this.vbrpsy_mask_add(ecb, x, kk - b); + ecb = t; + ++k; + ++kk; + } + dd = (1 + 2 * dd) / (2 * dd_n); + const avg_mask = this.tab[dd] * 0.5; + ecb *= avg_mask; + + if (gfc.blocktype_old[chn & 0x01] === SHORT_TYPE) { + const ecb_limit = this.rpelev * gfc.nb_1[chn][b]; + if (ecb_limit > 0) { + thr[b] = Math.min(ecb, ecb_limit); + } else { + thr[b] = Math.min(ecb, eb_l[b] * PsyModel.NS_PREECHO_ATT2); + } + } else { + let ecb_limit_2 = this.rpelev2 * gfc.nb_2[chn][b]; + let ecb_limit_1 = this.rpelev * gfc.nb_1[chn][b]; + let ecb_limit; + if (ecb_limit_2 <= 0) { + ecb_limit_2 = ecb; + } + if (ecb_limit_1 <= 0) { + ecb_limit_1 = ecb; + } + if (gfc.blocktype_old[chn & 0x01] === NORM_TYPE) { + ecb_limit = Math.min(ecb_limit_1, ecb_limit_2); + } else { + ecb_limit = ecb_limit_1; + } + thr[b] = Math.min(ecb, ecb_limit); + } + gfc.nb_2[chn][b] = gfc.nb_1[chn][b]; + gfc.nb_1[chn][b] = ecb; + + x = max[b]; + x *= gfc.minval_l[b]; + x *= avg_mask; + if (thr[b] > x) { + thr[b] = x; + } + + if (gfc.masking_lower > 1) { + thr[b] *= gfc.masking_lower; + } + if (thr[b] > eb_l[b]) { + thr[b] = eb_l[b]; + } + if (gfc.masking_lower < 1) { + thr[b] *= gfc.masking_lower; + } + assert(thr[b] >= 0); + } + for (; b < CBANDS; ++b) { + eb_l[b] = 0; + thr[b] = 0; + } + } + + private vbrpsy_compute_block_type( + gfp: LameGlobalFlags, + uselongblock: Int32Array + ) { + const gfc = gfp.internal_flags; + + if ( + gfp.short_blocks === ShortBlock.short_block_coupled && + !(uselongblock[0] !== 0 && uselongblock[1] !== 0) + ) { + uselongblock[0] = 0; + uselongblock[1] = 0; + } + + for (let chn = 0; chn < gfc.channels_out; chn++) { + if (gfp.short_blocks === ShortBlock.short_block_dispensed) { + uselongblock[chn] = 1; + } + if (gfp.short_blocks === ShortBlock.short_block_forced) { + uselongblock[chn] = 0; + } + } + } + + private vbrpsy_apply_block_type( + gfp: LameGlobalFlags, + uselongblock: Int32Array, + blocktype_d: Int32Array + ) { + const gfc = gfp.internal_flags; + + for (let chn = 0; chn < gfc.channels_out; chn++) { + let blocktype = NORM_TYPE; + + if (uselongblock[chn] !== 0) { + assert(gfc.blocktype_old[chn] !== START_TYPE); + if (gfc.blocktype_old[chn] === SHORT_TYPE) blocktype = STOP_TYPE; + } else { + blocktype = SHORT_TYPE; + if (gfc.blocktype_old[chn] === NORM_TYPE) { + gfc.blocktype_old[chn] = START_TYPE; + } + if (gfc.blocktype_old[chn] === STOP_TYPE) + gfc.blocktype_old[chn] = SHORT_TYPE; + } + + blocktype_d[chn] = gfc.blocktype_old[chn]; + + gfc.blocktype_old[chn] = blocktype; + } + } + + private vbrpsy_compute_MS_thresholds( + eb: Float32Array[], + thr: Float32Array[], + cb_mld: Float32Array, + ath_cb: Float32Array, + athadjust: number, + msfix: number, + n: number + ) { + const msfix2 = msfix * 2; + const athlower = msfix > 0 ? Math.pow(10, athadjust) : 1; + let rside; + let rmid; + for (let b = 0; b < n; ++b) { + const ebM = eb[2][b]; + const ebS = eb[3][b]; + const thmL = thr[0][b]; + const thmR = thr[1][b]; + let thmM = thr[2][b]; + let thmS = thr[3][b]; + + if (thmL <= 1.58 * thmR && thmR <= 1.58 * thmL) { + const mld_m = cb_mld[b] * ebS; + const mld_s = cb_mld[b] * ebM; + rmid = Math.max(thmM, Math.min(thmS, mld_m)); + rside = Math.max(thmS, Math.min(thmM, mld_s)); + } else { + rmid = thmM; + rside = thmS; + } + if (msfix > 0) { + const ath = ath_cb[b] * athlower; + const thmLR = Math.min(Math.max(thmL, ath), Math.max(thmR, ath)); + thmM = Math.max(rmid, ath); + thmS = Math.max(rside, ath); + const thmMS = thmM + thmS; + if (thmMS > 0 && thmLR * msfix2 < thmMS) { + const f = (thmLR * msfix2) / thmMS; + thmM *= f; + thmS *= f; + assert(thmMS > 0); + } + rmid = Math.min(thmM, rmid); + rside = Math.min(thmS, rside); + } + if (rmid > ebM) { + rmid = ebM; + } + if (rside > ebS) { + rside = ebS; + } + thr[2][b] = rmid; + thr[3][b] = rside; + } + } + + // eslint-disable-next-line complexity + L3psycho_anal_vbr( + gfp: LameGlobalFlags, + buffer: Float32Array[], + bufPos: number, + gr_out: number, + masking_ratio: III_psy_ratio[][], + masking_MS_ratio: III_psy_ratio[][], + percep_entropy: number[], + percep_MS_entropy: number[], + energy: Float32Array, + blocktype_d: Int32Array + ) { + const gfc = gfp.internal_flags; + + let wsamp_l; + let wsamp_s; + const fftenergy = new Float32Array(HBLKSIZE); + const fftenergy_s = Array.from( + { length: 3 }, + () => new Float32Array(HBLKSIZE_s) + ); + const wsamp_L = Array.from({ length: 2 }, () => new Float32Array(BLKSIZE)); + const wsamp_S = Array.from({ length: 2 }, () => + Array.from({ length: 3 }, () => new Float32Array(BLKSIZE_s)) + ); + const eb = Array.from({ length: 4 }, () => new Float32Array(CBANDS)); + const thr = Array.from({ length: 4 }, () => new Float32Array(CBANDS)); + const sub_short_factor = Array.from( + { length: 4 }, + () => new Float32Array(3) + ); + const pcfact = 0.6; + + const ns_attacks = [ + [0, 0, 0, 0], + [0, 0, 0, 0], + [0, 0, 0, 0], + [0, 0, 0, 0], + ]; + const uselongblock = new Int32Array(2); + + const n_chn_psy = gfp.mode === MPEGMode.JOINT_STEREO ? 4 : gfc.channels_out; + + this.vbrpsy_attack_detection( + gfp, + buffer, + bufPos, + gr_out, + masking_ratio, + masking_MS_ratio, + energy, + sub_short_factor, + ns_attacks, + uselongblock + ); + + this.vbrpsy_compute_block_type(gfp, uselongblock); + + for (let chn = 0; chn < n_chn_psy; chn++) { + const ch01 = chn & 0x01; + wsamp_l = wsamp_L; + this.vbrpsy_compute_fft_l( + gfp, + buffer, + bufPos, + chn, + fftenergy, + wsamp_l, + ch01 + ); + + this.vbrpsy_compute_loudness_approximation_l(gfp, gr_out, chn, fftenergy); + + if (uselongblock[ch01] !== 0) { + this.vbrpsy_compute_masking_l(gfc, fftenergy, eb[chn], thr[chn], chn); + } else { + this.vbrpsy_skip_masking_l(gfc, chn); + } + } + if (uselongblock[0] + uselongblock[1] === 2) { + if (gfp.mode === MPEGMode.JOINT_STEREO) { + this.vbrpsy_compute_MS_thresholds( + eb, + thr, + gfc.mld_cb_l, + gfc.ATH.cb_l, + gfp.ATHlower * gfc.ATH.adjust, + gfp.msfix, + gfc.npart_l + ); + } + } + + for (let chn = 0; chn < n_chn_psy; chn++) { + const ch01 = chn & 0x01; + if (uselongblock[ch01] !== 0) { + this.convert_partition2scalefac_l(gfc, eb[chn], thr[chn], chn); + } + } + + for (let sblock = 0; sblock < 3; sblock++) { + for (let chn = 0; chn < n_chn_psy; ++chn) { + const ch01 = chn & 0x01; + + if (uselongblock[ch01] !== 0) { + this.vbrpsy_skip_masking_s(gfc, chn, sblock); + } else { + wsamp_s = wsamp_S; + this.vbrpsy_compute_fft_s( + gfp, + buffer, + bufPos, + chn, + sblock, + fftenergy_s, + wsamp_s, + ch01 + ); + this.vbrpsy_compute_masking_s( + gfp, + fftenergy_s, + eb[chn], + thr[chn], + chn, + sblock + ); + } + } + if (uselongblock[0] + uselongblock[1] === 0) { + if (gfp.mode === MPEGMode.JOINT_STEREO) { + this.vbrpsy_compute_MS_thresholds( + eb, + thr, + gfc.mld_cb_s, + gfc.ATH.cb_s, + gfp.ATHlower * gfc.ATH.adjust, + gfp.msfix, + gfc.npart_s + ); + } + } + + for (let chn = 0; chn < n_chn_psy; ++chn) { + const ch01 = chn & 0x01; + if (uselongblock[ch01] === 0) { + this.convert_partition2scalefac_s( + gfc, + eb[chn], + thr[chn], + chn, + sblock + ); + } + } + } + + for (let chn = 0; chn < n_chn_psy; chn++) { + const ch01 = chn & 0x01; + + if (uselongblock[ch01] !== 0) { + continue; + } + for (let sb = 0; sb < SBMAX_s; sb++) { + const new_thmm = new Float32Array(3); + for (let sblock = 0; sblock < 3; sblock++) { + let thmm = gfc.thm[chn].s[sb][sblock]; + thmm *= PsyModel.NS_PREECHO_ATT0; + + if ( + ns_attacks[chn][sblock] >= 2 || + ns_attacks[chn][sblock + 1] === 1 + ) { + const idx = sblock !== 0 ? sblock - 1 : 2; + const p = this.nsInterp( + gfc.thm[chn].s[sb][idx], + thmm, + PsyModel.NS_PREECHO_ATT1 * pcfact + ); + thmm = Math.min(thmm, p); + } else if (ns_attacks[chn][sblock] === 1) { + const idx = sblock !== 0 ? sblock - 1 : 2; + const p = this.nsInterp( + gfc.thm[chn].s[sb][idx], + thmm, + PsyModel.NS_PREECHO_ATT2 * pcfact + ); + thmm = Math.min(thmm, p); + } else if ( + (sblock !== 0 && ns_attacks[chn][sblock - 1] === 3) || + (sblock === 0 && gfc.nsPsy.lastAttacks[chn] === 3) + ) { + const idx = sblock !== 2 ? sblock + 1 : 0; + const p = this.nsInterp( + gfc.thm[chn].s[sb][idx], + thmm, + PsyModel.NS_PREECHO_ATT2 * pcfact + ); + thmm = Math.min(thmm, p); + } + + thmm *= sub_short_factor[chn][sblock]; + + new_thmm[sblock] = thmm; + } + for (let sblock = 0; sblock < 3; sblock++) { + gfc.thm[chn].s[sb][sblock] = new_thmm[sblock]; + } + } + } + + for (let chn = 0; chn < n_chn_psy; chn++) { + gfc.nsPsy.lastAttacks[chn] = ns_attacks[chn][2]; + } + + this.vbrpsy_apply_block_type(gfp, uselongblock, blocktype_d); + + for (let chn = 0; chn < n_chn_psy; chn++) { + let ppe; + let ppePos; + let type; + let mr; + + if (chn > 1) { + ppe = percep_MS_entropy; + ppePos = -2; + type = NORM_TYPE; + if (blocktype_d[0] === SHORT_TYPE || blocktype_d[1] === SHORT_TYPE) + type = SHORT_TYPE; + mr = masking_MS_ratio[gr_out][chn - 2]; + } else { + ppe = percep_entropy; + ppePos = 0; + type = blocktype_d[chn]; + mr = masking_ratio[gr_out][chn]; + } + + if (type === SHORT_TYPE) { + ppe[ppePos + chn] = this.pecalc_s(mr, gfc.masking_lower); + } else { + ppe[ppePos + chn] = this.pecalc_l(mr, gfc.masking_lower); + } + } + return 0; + } + + private s3_func_x(bark: number, hf_slope: number) { + const tempx = bark; + let tempy; + + if (tempx >= 0) { + tempy = -tempx * 27; + } else { + tempy = tempx * hf_slope; + } + if (tempy <= -72.0) { + return 0; + } + return Math.exp(tempy * PsyModel.LN_TO_LOG10); + } + + private norm_s3_func_x(hf_slope: number) { + let lim_a = 0; + let lim_b = 0; + + let x = 0; + let l; + let h; + for (x = 0; this.s3_func_x(x, hf_slope) > 1e-20; x -= 1); + l = x; + h = 0; + while (Math.abs(h - l) > 1e-12) { + x = (h + l) / 2; + if (this.s3_func_x(x, hf_slope) > 0) { + h = x; + } else { + l = x; + } + } + lim_a = l; + + for (x = 0; this.s3_func_x(x, hf_slope) > 1e-20; x += 1); + l = 0; + h = x; + while (Math.abs(h - l) > 1e-12) { + x = (h + l) / 2; + if (this.s3_func_x(x, hf_slope) > 0) { + l = x; + } else { + h = x; + } + } + lim_b = h; + + let sum = 0; + const m = 1000; + let i; + for (i = 0; i <= m; ++i) { + const x = lim_a + (i * (lim_b - lim_a)) / m; + const y = this.s3_func_x(x, hf_slope); + sum += y; + } + + const norm = (m + 1) / (sum * (lim_b - lim_a)); + + return norm; + } + + private s3_func(bark: number) { + let tempx; + let x; + let temp; + tempx = bark; + if (tempx >= 0) tempx *= 3; + else tempx *= 1.5; + + if (tempx >= 0.5 && tempx <= 2.5) { + temp = tempx - 0.5; + x = 8.0 * (temp * temp - 2.0 * temp); + } else x = 0.0; + tempx += 0.474; + const tempy = + 15.811389 + 7.5 * tempx - 17.5 * Math.sqrt(1.0 + tempx * tempx); + + if (tempy <= -60.0) return 0.0; + + tempx = Math.exp((x + tempy) * PsyModel.LN_TO_LOG10); + + tempx /= 0.6609193; + return tempx; + } + + private freq2bark(freq: number) { + if (freq < 0) freq = 0; + freq *= 0.001; + return ( + 13.0 * Math.atan(0.76 * freq) + + 3.5 * Math.atan((freq * freq) / (7.5 * 7.5)) + ); + } + + private init_numline( + numlines: Int32Array, + bo: Int32Array, + bm: Int32Array, + bval: Float32Array, + bval_width: Float32Array, + mld: Float32Array, + bo_w: Float32Array, + sfreq: number, + blksize: number, + scalepos: Int32Array, + deltafreq: number, + sbmax: number + ) { + const b_frq = new Float32Array(CBANDS + 1); + const sample_freq_frac = sfreq / (sbmax > 15 ? 2 * 576 : 2 * 192); + const partition = new Int32Array(HBLKSIZE); + let i; + sfreq /= blksize; + let j = 0; + let ni = 0; + + for (i = 0; i < CBANDS; i++) { + let j2; + const bark1 = this.freq2bark(sfreq * j); + + b_frq[i] = sfreq * j; + + for ( + j2 = j; + this.freq2bark(sfreq * j2) - bark1 < PsyModel.DELBARK && + j2 <= blksize / 2; + j2++ + ); + + numlines[i] = j2 - j; + ni = i + 1; + + while (j < j2) { + assert(j < HBLKSIZE); + partition[j++] = i; + } + if (j > blksize / 2) { + j = blksize / 2; + ++i; + break; + } + } + assert(i < CBANDS); + b_frq[i] = sfreq * j; + + for (let sfb = 0; sfb < sbmax; sfb++) { + let i1; + let i2; + let arg; + const start = scalepos[sfb]; + const end = scalepos[sfb + 1]; + + i1 = Math.floor(0.5 + deltafreq * (start - 0.5)); + if (i1 < 0) i1 = 0; + i2 = Math.floor(0.5 + deltafreq * (end - 0.5)); + + if (i2 > blksize / 2) i2 = blksize / 2; + + bm[sfb] = (partition[i1] + partition[i2]) / 2; + bo[sfb] = partition[i2]; + const f_tmp = sample_freq_frac * end; + + bo_w[sfb] = + (f_tmp - b_frq[bo[sfb]]) / (b_frq[bo[sfb] + 1] - b_frq[bo[sfb]]); + if (bo_w[sfb] < 0) { + bo_w[sfb] = 0; + } else if (bo_w[sfb] > 1) { + bo_w[sfb] = 1; + } + + arg = this.freq2bark(sfreq * scalepos[sfb] * deltafreq); + arg = Math.min(arg, 15.5) / 15.5; + + mld[sfb] = Math.pow(10.0, 1.25 * (1 - Math.cos(Math.PI * arg)) - 2.5); + } + + j = 0; + for (let k = 0; k < ni; k++) { + const w = numlines[k]; + let bark1; + let bark2; + + bark1 = this.freq2bark(sfreq * j); + bark2 = this.freq2bark(sfreq * (j + w - 1)); + bval[k] = 0.5 * (bark1 + bark2); + + bark1 = this.freq2bark(sfreq * (j - 0.5)); + bark2 = this.freq2bark(sfreq * (j + w - 0.5)); + bval_width[k] = bark2 - bark1; + j += w; + } + + return ni; + } + + private init_s3_values( + s3ind: Int32Array[], + npart: number, + bval: Float32Array, + bval_width: Float32Array, + norm: Float32Array, + use_old_s3: boolean + ) { + const s3 = Array.from({ length: CBANDS }, () => new Float32Array(CBANDS)); + + let j; + let numberOfNoneZero = 0; + + if (use_old_s3) { + for (let i = 0; i < npart; i++) { + for (j = 0; j < npart; j++) { + const v = this.s3_func(bval[i] - bval[j]) * bval_width[j]; + s3[i][j] = v * norm[i]; + } + } + } else { + for (j = 0; j < npart; j++) { + const hf_slope = 15 + Math.min(21 / bval[j], 12); + const s3_x_norm = this.norm_s3_func_x(hf_slope); + for (let i = 0; i < npart; i++) { + const v = + s3_x_norm * + this.s3_func_x(bval[i] - bval[j], hf_slope) * + bval_width[j]; + s3[i][j] = v * norm[i]; + } + } + } + for (let i = 0; i < npart; i++) { + for (j = 0; j < npart; j++) { + if (s3[i][j] > 0.0) break; + } + s3ind[i][0] = j; + + for (j = npart - 1; j > 0; j--) { + if (s3[i][j] > 0.0) break; + } + s3ind[i][1] = j; + numberOfNoneZero += s3ind[i][1] - s3ind[i][0] + 1; + } + + const p = new Float32Array(numberOfNoneZero); + let k = 0; + for (let i = 0; i < npart; i++) + for (j = s3ind[i][0]; j <= s3ind[i][1]; j++) p[k++] = s3[i][j]; + + return p; + } + + private stereo_demask(f: number) { + let arg = this.freq2bark(f); + arg = Math.min(arg, 15.5) / 15.5; + + return Math.pow(10.0, 1.25 * (1 - Math.cos(Math.PI * arg)) - 2.5); + } + + // eslint-disable-next-line complexity + psymodel_init(gfp: LameGlobalFlags) { + const gfc = gfp.internal_flags; + let i; + const useOldS3 = true; + const bvl_a = 13; + const bvl_b = 24; + const snr_l_a = 0; + const snr_l_b = 0; + const snr_s_a = -8.25; + const snr_s_b = -4.5; + const bval = new Float32Array(CBANDS); + const bval_width = new Float32Array(CBANDS); + const norm = new Float32Array(CBANDS); + const sfreq = gfp.out_samplerate; + + gfc.ms_ener_ratio_old = 0.25; + gfc.blocktype_old[0] = NORM_TYPE; + gfc.blocktype_old[1] = NORM_TYPE; + + for (i = 0; i < 4; ++i) { + for (let j = 0; j < CBANDS; ++j) { + gfc.nb_1[i][j] = 1e20; + gfc.nb_2[i][j] = 1e20; + gfc.nb_s1[i][j] = 1.0; + gfc.nb_s2[i][j] = 1.0; + } + for (let sb = 0; sb < SBMAX_l; sb++) { + gfc.en[i].l[sb] = 1e20; + gfc.thm[i].l[sb] = 1e20; + } + for (let j = 0; j < 3; ++j) { + for (let sb = 0; sb < SBMAX_s; sb++) { + gfc.en[i].s[sb][j] = 1e20; + gfc.thm[i].s[sb][j] = 1e20; + } + gfc.nsPsy.lastAttacks[i] = 0; + } + for (let j = 0; j < 9; j++) gfc.nsPsy.last_en_subshort[i][j] = 10; + } + + gfc.loudness_sq_save[0] = 0.0; + gfc.loudness_sq_save[1] = 0.0; + + gfc.npart_l = this.init_numline( + gfc.numlines_l, + gfc.bo_l, + gfc.bm_l, + bval, + bval_width, + gfc.mld_l, + gfc.PSY.bo_l_weight, + sfreq, + BLKSIZE, + gfc.scalefac_band.l, + BLKSIZE / (2.0 * 576), + SBMAX_l + ); + assert(gfc.npart_l < CBANDS); + + for (i = 0; i < gfc.npart_l; i++) { + let snr = snr_l_a; + if (bval[i] >= bvl_a) { + snr = + (snr_l_b * (bval[i] - bvl_a)) / (bvl_b - bvl_a) + + (snr_l_a * (bvl_b - bval[i])) / (bvl_b - bvl_a); + } + norm[i] = Math.pow(10.0, snr / 10.0); + if (gfc.numlines_l[i] > 0) { + gfc.rnumlines_l[i] = 1.0 / gfc.numlines_l[i]; + } else { + gfc.rnumlines_l[i] = 0; + } + } + gfc.s3_ll = this.init_s3_values( + gfc.s3ind, + gfc.npart_l, + bval, + bval_width, + norm, + useOldS3 + ); + + let j = 0; + for (i = 0; i < gfc.npart_l; i++) { + let x; + + x = MAX_FLOAT32_VALUE; + for (let k = 0; k < gfc.numlines_l[i]; k++, j++) { + const freq = (sfreq * j) / (1000.0 * BLKSIZE); + let level; + + level = this.ATHformula(freq * 1000, gfp) - 20; + + level = Math.pow(10, 0.1 * level); + + level *= gfc.numlines_l[i]; + if (x > level) x = level; + } + gfc.ATH.cb_l[i] = x; + + x = -20 + (bval[i] * 20) / 10; + if (x > 6) { + x = 100; + } + if (x < -15) { + x = -15; + } + x -= 8; + gfc.minval_l[i] = Math.pow(10.0, x / 10) * gfc.numlines_l[i]; + } + + gfc.npart_s = this.init_numline( + gfc.numlines_s, + gfc.bo_s, + gfc.bm_s, + bval, + bval_width, + gfc.mld_s, + gfc.PSY.bo_s_weight, + sfreq, + BLKSIZE_s, + gfc.scalefac_band.s, + BLKSIZE_s / (2.0 * 192), + SBMAX_s + ); + assert(gfc.npart_s < CBANDS); + + j = 0; + for (i = 0; i < gfc.npart_s; i++) { + let x; + let snr = snr_s_a; + if (bval[i] >= bvl_a) { + snr = + (snr_s_b * (bval[i] - bvl_a)) / (bvl_b - bvl_a) + + (snr_s_a * (bvl_b - bval[i])) / (bvl_b - bvl_a); + } + norm[i] = Math.pow(10.0, snr / 10.0); + + x = MAX_FLOAT32_VALUE; + for (let k = 0; k < gfc.numlines_s[i]; k++, j++) { + const freq = (sfreq * j) / (1000.0 * BLKSIZE_s); + let level; + + level = this.ATHformula(freq * 1000, gfp) - 20; + + level = Math.pow(10, 0.1 * level); + + level *= gfc.numlines_s[i]; + if (x > level) x = level; + } + gfc.ATH.cb_s[i] = x; + + x = -7.0 + (bval[i] * 7.0) / 12.0; + if (bval[i] > 12) { + x *= 1 + Math.log(1 + x) * 3.1; + } + if (bval[i] < 12) { + x *= 1 + Math.log(1 - x) * 2.3; + } + if (x < -15) { + x = -15; + } + x -= 8; + gfc.minval_s[i] = Math.pow(10.0, x / 10) * gfc.numlines_s[i]; + } + + gfc.s3_ss = this.init_s3_values( + gfc.s3ind_s, + gfc.npart_s, + bval, + bval_width, + norm, + useOldS3 + ); + + this.init_mask_add_max_values(); + this.fft.init(); + + gfc.decay = Math.exp( + (-1.0 * LOG10) / ((this.temporalmask_sustain_sec * sfreq) / 192.0) + ); + + { + let msfix; + msfix = PsyModel.NS_MSFIX; + if ((gfp.exp_nspsytune & 2) !== 0) msfix = 1.0; + if (Math.abs(gfp.msfix) > 0.0) msfix = gfp.msfix; + gfp.msfix = msfix; + + for (let b = 0; b < gfc.npart_l; b++) + if (gfc.s3ind[b][1] > gfc.npart_l - 1) + gfc.s3ind[b][1] = gfc.npart_l - 1; + } + + const frame_duration = (576 * gfc.mode_gr) / sfreq; + gfc.ATH.decay = Math.pow(10, (-12 / 10) * frame_duration); + gfc.ATH.adjust = 0.01; + + gfc.ATH.adjustLimit = 1.0; + + assert(gfc.bo_l[SBMAX_l - 1] <= gfc.npart_l); + assert(gfc.bo_s[SBMAX_s - 1] <= gfc.npart_s); + + if (gfp.ATHtype !== -1) { + let freq; + const freq_inc = gfp.out_samplerate / BLKSIZE; + let eql_balance = 0.0; + freq = 0.0; + for (i = 0; i < BLKSIZE / 2; ++i) { + freq += freq_inc; + gfc.ATH.eql_w[i] = 1 / Math.pow(10, this.ATHformula(freq, gfp) / 10); + eql_balance += gfc.ATH.eql_w[i]; + } + eql_balance = 1.0 / eql_balance; + for (i = BLKSIZE / 2; --i >= 0; ) { + gfc.ATH.eql_w[i] *= eql_balance; + } + } + { + let b = 0; + let j = 0; + for (; b < gfc.npart_s; ++b) { + for (i = 0; i < gfc.numlines_s[b]; ++i) { + ++j; + } + } + assert(j === 129); + b = 0; + j = 0; + for (; b < gfc.npart_l; ++b) { + for (i = 0; i < gfc.numlines_l[b]; ++i) { + ++j; + } + } + assert(j === 513); + } + j = 0; + for (i = 0; i < gfc.npart_l; i++) { + const freq = (sfreq * (j + gfc.numlines_l[i] / 2)) / (1.0 * BLKSIZE); + gfc.mld_cb_l[i] = this.stereo_demask(freq); + j += gfc.numlines_l[i]; + } + for (; i < CBANDS; ++i) { + gfc.mld_cb_l[i] = 1; + } + j = 0; + for (i = 0; i < gfc.npart_s; i++) { + const freq = (sfreq * (j + gfc.numlines_s[i] / 2)) / (1.0 * BLKSIZE_s); + gfc.mld_cb_s[i] = this.stereo_demask(freq); + j += gfc.numlines_s[i]; + } + for (; i < CBANDS; ++i) { + gfc.mld_cb_s[i] = 1; + } + return 0; + } + + private ATHformula_GB(f: number, value: number) { + if (f < -0.3) f = 3410; + + f /= 1000; + f = Math.max(0.1, f); + const ath = + 3.64 * Math.pow(f, -0.8) - + 6.8 * Math.exp(-0.6 * Math.pow(f - 3.4, 2.0)) + + 6.0 * Math.exp(-0.15 * Math.pow(f - 8.7, 2.0)) + + (0.6 + 0.04 * value) * 0.001 * Math.pow(f, 4.0); + return ath; + } + + ATHformula(f: number, gfp: LameGlobalFlags) { + let ath; + switch (gfp.ATHtype) { + case 0: + ath = this.ATHformula_GB(f, 9); + break; + case 1: + ath = this.ATHformula_GB(f, -1); + break; + case 2: + ath = this.ATHformula_GB(f, 0); + break; + case 3: + ath = this.ATHformula_GB(f, 1) + 6; + break; + case 4: + ath = this.ATHformula_GB(f, gfp.ATHcurve); + break; + default: + ath = this.ATHformula_GB(f, 0); + break; + } + return ath; + } +} diff --git a/packages/mp3-encoder/src/lame/Quality.ts b/packages/mp3-encoder/src/lame/Quality.ts new file mode 100644 index 0000000000..84133a7193 --- /dev/null +++ b/packages/mp3-encoder/src/lame/Quality.ts @@ -0,0 +1 @@ +export type Quality = 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0; diff --git a/packages/mp3-encoder/src/lame/Quantize.ts b/packages/mp3-encoder/src/lame/Quantize.ts new file mode 100644 index 0000000000..5e3dd86a57 --- /dev/null +++ b/packages/mp3-encoder/src/lame/Quantize.ts @@ -0,0 +1,1013 @@ +import type { BitStream } from './BitStream'; +import { CalcNoiseData } from './CalcNoiseData'; +import { CalcNoiseResult } from './CalcNoiseResult'; +import { GrInfo } from './GrInfo'; +import type { IIISideInfo } from './IIISideInfo'; +import type { LameGlobalFlags } from './LameGlobalFlags'; +import type { LameInternalFlags } from './LameInternalFlags'; +import { PsyModel } from './PsyModel'; +import { QuantizePVT } from './QuantizePVT'; +import { Reservoir } from './Reservoir'; +import { StartLine } from './StartLine'; +import { Takehiro } from './Takehiro'; +import { VbrMode } from './VbrMode'; +import { copyArray, fillArray, sortArray } from './arrays'; +import { assert } from './assert'; +import { + PSFB12, + PSFB21, + SBMAX_l, + SBMAX_s, + SBPSY_l, + SBPSY_s, + SFBMAX, + SHORT_TYPE, +} from './constants'; +import { isCloseToEachOther } from './math'; + +export class Quantize { + readonly rv: Reservoir; + + readonly qupvt: QuantizePVT; + + readonly tak: Takehiro; + + constructor(bs: BitStream) { + this.rv = new Reservoir(bs); + this.qupvt = new QuantizePVT(new PsyModel()); + this.tak = new Takehiro(this.qupvt); + } + + ms_convert(l3_side: IIISideInfo, gr: number) { + for (let i = 0; i < 576; ++i) { + const l = l3_side.tt[gr][0].xr[i]; + const r = l3_side.tt[gr][1].xr[i]; + l3_side.tt[gr][0].xr[i] = (l + r) * (Math.SQRT2 * 0.5); + l3_side.tt[gr][1].xr[i] = (l - r) * (Math.SQRT2 * 0.5); + } + } + + private init_xrpow_core( + cod_info: GrInfo, + xrpow: Float32Array, + upper: number, + sum: number + ) { + sum = 0; + for (let i = 0; i <= upper; ++i) { + const tmp = Math.abs(cod_info.xr[i]); + sum += tmp; + xrpow[i] = Math.sqrt(tmp * Math.sqrt(tmp)); + + if (xrpow[i] > cod_info.xrpow_max) cod_info.xrpow_max = xrpow[i]; + } + return sum; + } + + init_xrpow(gfc: LameInternalFlags, cod_info: GrInfo, xrpow: Float32Array) { + let sum = 0; + const upper = Math.trunc(cod_info.max_nonzero_coeff); + + assert(xrpow !== null); + cod_info.xrpow_max = 0; + + assert(upper >= 0 && upper <= 575); + + fillArray(xrpow, upper, 576, 0); + + sum = this.init_xrpow_core(cod_info, xrpow, upper, sum); + + if (sum > 1e-20) { + let j = 0; + if ((gfc.substep_shaping & 2) !== 0) j = 1; + + for (let i = 0; i < cod_info.psymax; i++) gfc.pseudohalf[i] = j; + + return true; + } + + fillArray(cod_info.l3_enc, 0, 576, 0); + return false; + } + + private psfb21_analogsilence(gfc: LameInternalFlags, cod_info: GrInfo) { + const ath = gfc.ATH; + const { xr } = cod_info; + + if (cod_info.block_type !== SHORT_TYPE) { + let stop = false; + for (let gsfb = PSFB21 - 1; gsfb >= 0 && !stop; gsfb--) { + const start = gfc.scalefac_band.psfb21[gsfb]; + const end = gfc.scalefac_band.psfb21[gsfb + 1]; + let ath21 = this.qupvt.athAdjust( + ath.adjust, + ath.psfb21[gsfb], + ath.floor + ); + + if (gfc.nsPsy.longfact[21] > 1e-12) ath21 *= gfc.nsPsy.longfact[21]; + + for (let j = end - 1; j >= start; j--) { + if (Math.abs(xr[j]) < ath21) xr[j] = 0; + else { + stop = true; + break; + } + } + } + } else { + for (let block = 0; block < 3; block++) { + let stop = false; + for (let gsfb = PSFB12 - 1; gsfb >= 0 && !stop; gsfb--) { + const start = + gfc.scalefac_band.s[12] * 3 + + (gfc.scalefac_band.s[13] - gfc.scalefac_band.s[12]) * block + + (gfc.scalefac_band.psfb12[gsfb] - gfc.scalefac_band.psfb12[0]); + const end = + start + + (gfc.scalefac_band.psfb12[gsfb + 1] - + gfc.scalefac_band.psfb12[gsfb]); + let ath12 = this.qupvt.athAdjust( + ath.adjust, + ath.psfb12[gsfb], + ath.floor + ); + + if (gfc.nsPsy.shortfact[12] > 1e-12) ath12 *= gfc.nsPsy.shortfact[12]; + + for (let j = end - 1; j >= start; j--) { + if (Math.abs(xr[j]) < ath12) xr[j] = 0; + else { + stop = true; + break; + } + } + } + } + } + } + + init_outer_loop(gfc: LameInternalFlags, cod_info: GrInfo) { + cod_info.part2_3_length = 0; + cod_info.big_values = 0; + cod_info.count1 = 0; + cod_info.global_gain = 210; + cod_info.scalefac_compress = 0; + + cod_info.table_select[0] = 0; + cod_info.table_select[1] = 0; + cod_info.table_select[2] = 0; + cod_info.subblock_gain[0] = 0; + cod_info.subblock_gain[1] = 0; + cod_info.subblock_gain[2] = 0; + cod_info.subblock_gain[3] = 0; + + cod_info.region0_count = 0; + cod_info.region1_count = 0; + cod_info.preflag = 0; + cod_info.scalefac_scale = 0; + cod_info.count1table_select = 0; + cod_info.part2_length = 0; + cod_info.sfb_lmax = SBPSY_l; + cod_info.sfb_smin = SBPSY_s; + cod_info.psy_lmax = gfc.sfb21_extra ? SBMAX_l : SBPSY_l; + cod_info.psymax = cod_info.psy_lmax; + cod_info.sfbmax = cod_info.sfb_lmax; + cod_info.sfbdivide = 11; + for (let sfb = 0; sfb < SBMAX_l; sfb++) { + cod_info.width[sfb] = + gfc.scalefac_band.l[sfb + 1] - gfc.scalefac_band.l[sfb]; + + cod_info.window[sfb] = 3; + } + if (cod_info.block_type === SHORT_TYPE) { + const ixwork = new Float32Array(576); + + cod_info.sfb_smin = 0; + cod_info.sfb_lmax = 0; + if (cod_info.mixed_block_flag !== 0) { + cod_info.sfb_smin = 3; + cod_info.sfb_lmax = gfc.mode_gr * 2 + 4; + } + cod_info.psymax = + cod_info.sfb_lmax + + 3 * ((gfc.sfb21_extra ? SBMAX_s : SBPSY_s) - cod_info.sfb_smin); + cod_info.sfbmax = cod_info.sfb_lmax + 3 * (SBPSY_s - cod_info.sfb_smin); + cod_info.sfbdivide = cod_info.sfbmax - 18; + cod_info.psy_lmax = cod_info.sfb_lmax; + + let ix = gfc.scalefac_band.l[cod_info.sfb_lmax]; + copyArray(cod_info.xr, 0, ixwork, 0, 576); + for (let sfb = cod_info.sfb_smin; sfb < SBMAX_s; sfb++) { + const start = gfc.scalefac_band.s[sfb]; + const end = gfc.scalefac_band.s[sfb + 1]; + for (let window = 0; window < 3; window++) { + for (let l = start; l < end; l++) { + cod_info.xr[ix++] = ixwork[3 * l + window]; + } + } + } + + let j = cod_info.sfb_lmax; + for (let sfb = cod_info.sfb_smin; sfb < SBMAX_s; sfb++) { + const y = gfc.scalefac_band.s[sfb + 1] - gfc.scalefac_band.s[sfb]; + cod_info.width[j] = y; + cod_info.width[j + 1] = y; + cod_info.width[j + 2] = y; + cod_info.window[j] = 0; + cod_info.window[j + 1] = 1; + cod_info.window[j + 2] = 2; + j += 3; + } + } + + cod_info.count1bits = 0; + cod_info.sfb_partition_table = this.qupvt.nr_of_sfb_block[0][0]; + cod_info.slen[0] = 0; + cod_info.slen[1] = 0; + cod_info.slen[2] = 0; + cod_info.slen[3] = 0; + + cod_info.max_nonzero_coeff = 575; + + fillArray(cod_info.scalefac, 0); + + this.psfb21_analogsilence(gfc, cod_info); + } + + private bin_search_StepSize( + gfc: LameInternalFlags, + cod_info: GrInfo, + desired_rate: number, + ch: number, + xrpow: Float32Array + ) { + const enum BinSearchDirection { + BINSEARCH_NONE, + BINSEARCH_UP, + BINSEARCH_DOWN, + } + + let nBits; + let CurrentStep = gfc.currentStep[ch]; + let flagGoneOver = false; + const start = gfc.oldValue[ch]; + let direction = BinSearchDirection.BINSEARCH_NONE; + cod_info.global_gain = start; + desired_rate -= cod_info.part2_length; + + assert(CurrentStep !== 0); + for (;;) { + let step; + nBits = this.tak.count_bits(gfc, xrpow, cod_info, null); + + if (CurrentStep === 1 || nBits === desired_rate) break; + + if (nBits > desired_rate) { + if (direction === BinSearchDirection.BINSEARCH_DOWN) + flagGoneOver = true; + + if (flagGoneOver) CurrentStep /= 2; + direction = BinSearchDirection.BINSEARCH_UP; + step = CurrentStep; + } else { + if (direction === BinSearchDirection.BINSEARCH_UP) flagGoneOver = true; + + if (flagGoneOver) CurrentStep /= 2; + direction = BinSearchDirection.BINSEARCH_DOWN; + step = -CurrentStep; + } + cod_info.global_gain += step; + if (cod_info.global_gain < 0) { + cod_info.global_gain = 0; + flagGoneOver = true; + } + if (cod_info.global_gain > 255) { + cod_info.global_gain = 255; + flagGoneOver = true; + } + } + + assert(cod_info.global_gain >= 0); + assert(cod_info.global_gain < 256); + + while (nBits > desired_rate && cod_info.global_gain < 255) { + cod_info.global_gain++; + nBits = this.tak.count_bits(gfc, xrpow, cod_info, null); + } + gfc.currentStep[ch] = start - cod_info.global_gain >= 4 ? 4 : 2; + gfc.oldValue[ch] = cod_info.global_gain; + cod_info.part2_3_length = nBits; + return nBits; + } + + trancate_smallspectrums( + gfc: LameInternalFlags, + gi: GrInfo, + l3_xmin: Float32Array, + work: Float32Array + ) { + const distort = new Float32Array(SFBMAX); + + if ( + ((gfc.substep_shaping & 4) === 0 && gi.block_type === SHORT_TYPE) || + (gfc.substep_shaping & 0x80) !== 0 + ) + return; + this.calc_noise(gi, l3_xmin, distort, new CalcNoiseResult(), null); + for (let j = 0; j < 576; j++) { + let xr = 0.0; + if (gi.l3_enc[j] !== 0) xr = Math.abs(gi.xr[j]); + work[j] = xr; + } + + let j = 0; + let sfb = 8; + if (gi.block_type === SHORT_TYPE) sfb = 6; + do { + let allowedNoise; + let trancateThreshold; + let nsame; + let start; + + let width = gi.width[sfb]; + j += width; + if (distort[sfb] >= 1.0) continue; + + sortArray(work, j - width, width); + if (isCloseToEachOther(work[j - 1], 0.0)) continue; + + allowedNoise = (1.0 - distort[sfb]) * l3_xmin[sfb]; + trancateThreshold = 0.0; + start = 0; + do { + for (nsame = 1; start + nsame < width; nsame++) + if ( + !isCloseToEachOther( + work[start + j - width], + work[start + j + nsame - width] + ) + ) + break; + + const noise = work[start + j - width] * work[start + j - width] * nsame; + if (allowedNoise < noise) { + if (start !== 0) trancateThreshold = work[start + j - width - 1]; + break; + } + allowedNoise -= noise; + start += nsame; + } while (start < width); + if (isCloseToEachOther(trancateThreshold, 0.0)) continue; + + do { + if (Math.abs(gi.xr[j - width]) <= trancateThreshold) + gi.l3_enc[j - width] = 0; + } while (--width > 0); + } while (++sfb < gi.psymax); + + gi.part2_3_length = this.tak.noquant_count_bits(gfc, gi, null); + } + + private loop_break(cod_info: GrInfo) { + for (let sfb = 0; sfb < cod_info.sfbmax; sfb++) + if ( + cod_info.scalefac[sfb] + + cod_info.subblock_gain[cod_info.window[sfb]] === + 0 + ) + return false; + + return true; + } + + private penalties(noise: number) { + return Math.log10(0.368 + 0.632 * noise * noise * noise); + } + + private get_klemm_noise(distort: Float32Array, gi: GrInfo) { + let klemm_noise = 1e-37; + for (let sfb = 0; sfb < gi.psymax; sfb++) + klemm_noise += this.penalties(distort[sfb]); + + return Math.max(1e-20, klemm_noise); + } + + // eslint-disable-next-line complexity + private quant_compare( + quant_comp: number, + best: CalcNoiseResult, + calc: CalcNoiseResult, + gi: GrInfo, + distort: Float32Array + ) { + let better; + + switch (quant_comp) { + default: + case 9: { + if (best.over_count > 0) { + better = calc.over_SSD <= best.over_SSD; + if (calc.over_SSD === best.over_SSD) better = calc.bits < best.bits; + } else { + better = + calc.max_noise < 0 && + calc.max_noise * 10 + calc.bits <= best.max_noise * 10 + best.bits; + } + break; + } + + case 0: + better = + calc.over_count < best.over_count || + (calc.over_count === best.over_count && + calc.over_noise < best.over_noise) || + (calc.over_count === best.over_count && + isCloseToEachOther(calc.over_noise, best.over_noise) && + calc.tot_noise < best.tot_noise); + break; + + case 8: + calc.max_noise = this.get_klemm_noise(distort, gi); + + // eslint-disable-next-line no-fallthrough + case 1: + better = calc.max_noise < best.max_noise; + break; + case 2: + better = calc.tot_noise < best.tot_noise; + break; + case 3: + better = + calc.tot_noise < best.tot_noise && calc.max_noise < best.max_noise; + break; + case 4: + better = + (calc.max_noise <= 0.0 && best.max_noise > 0.2) || + (calc.max_noise <= 0.0 && + best.max_noise < 0.0 && + best.max_noise > calc.max_noise - 0.2 && + calc.tot_noise < best.tot_noise) || + (calc.max_noise <= 0.0 && + best.max_noise > 0.0 && + best.max_noise > calc.max_noise - 0.2 && + calc.tot_noise < best.tot_noise + best.over_noise) || + (calc.max_noise > 0.0 && + best.max_noise > -0.05 && + best.max_noise > calc.max_noise - 0.1 && + calc.tot_noise + calc.over_noise < + best.tot_noise + best.over_noise) || + (calc.max_noise > 0.0 && + best.max_noise > -0.1 && + best.max_noise > calc.max_noise - 0.15 && + calc.tot_noise + calc.over_noise + calc.over_noise < + best.tot_noise + best.over_noise + best.over_noise); + break; + case 5: + better = + calc.over_noise < best.over_noise || + (isCloseToEachOther(calc.over_noise, best.over_noise) && + calc.tot_noise < best.tot_noise); + break; + case 6: + better = + calc.over_noise < best.over_noise || + (isCloseToEachOther(calc.over_noise, best.over_noise) && + (calc.max_noise < best.max_noise || + (isCloseToEachOther(calc.max_noise, best.max_noise) && + calc.tot_noise <= best.tot_noise))); + break; + case 7: + better = + calc.over_count < best.over_count || + calc.over_noise < best.over_noise; + break; + } + + if (best.over_count === 0) { + better = better && calc.bits < best.bits; + } + + return better; + } + + private amp_scalefac_bands( + gfp: LameGlobalFlags, + cod_info: GrInfo, + distort: Float32Array, + xrpow: Float32Array, + bRefine: boolean + ) { + const gfc = gfp.internal_flags; + let ifqstep34; + + if (cod_info.scalefac_scale === 0) { + ifqstep34 = 1.29683955465100964055; + } else { + ifqstep34 = 1.68179283050742922612; + } + + let trigger = 0; + for (let sfb = 0; sfb < cod_info.sfbmax; sfb++) { + if (trigger < distort[sfb]) trigger = distort[sfb]; + } + + let { noise_shaping_amp } = gfc; + if (noise_shaping_amp === 3) { + if (bRefine) noise_shaping_amp = 2; + else noise_shaping_amp = 1; + } + switch (noise_shaping_amp) { + case 2: + break; + + case 1: + if (trigger > 1.0) trigger = Math.pow(trigger, 0.5); + else trigger *= 0.95; + break; + + case 0: + default: + if (trigger > 1.0) trigger = 1.0; + else trigger *= 0.95; + break; + } + + let j = 0; + for (let sfb = 0; sfb < cod_info.sfbmax; sfb++) { + const width = cod_info.width[sfb]; + let l; + j += width; + if (distort[sfb] < trigger) continue; + + if ((gfc.substep_shaping & 2) !== 0) { + gfc.pseudohalf[sfb] = gfc.pseudohalf[sfb] === 0 ? 1 : 0; + if (gfc.pseudohalf[sfb] === 0 && gfc.noise_shaping_amp === 2) return; + } + cod_info.scalefac[sfb]++; + for (l = -width; l < 0; l++) { + xrpow[j + l] *= ifqstep34; + if (xrpow[j + l] > cod_info.xrpow_max) + cod_info.xrpow_max = xrpow[j + l]; + } + + if (gfc.noise_shaping_amp === 2) return; + } + } + + private inc_scalefac_scale(cod_info: GrInfo, xrpow: Float32Array) { + const ifqstep34 = 1.29683955465100964055; + + let j = 0; + for (let sfb = 0; sfb < cod_info.sfbmax; sfb++) { + const width = cod_info.width[sfb]; + let s = cod_info.scalefac[sfb]; + if (cod_info.preflag !== 0) s += this.qupvt.pretab[sfb]; + j += width; + if ((s & 1) !== 0) { + s++; + for (let l = -width; l < 0; l++) { + xrpow[j + l] *= ifqstep34; + if (xrpow[j + l] > cod_info.xrpow_max) + cod_info.xrpow_max = xrpow[j + l]; + } + } + cod_info.scalefac[sfb] = s >> 1; + } + cod_info.preflag = 0; + cod_info.scalefac_scale = 1; + } + + private inc_subblock_gain( + gfc: LameInternalFlags, + cod_info: GrInfo, + xrpow: Float32Array + ) { + let sfb; + const { scalefac } = cod_info; + + for (sfb = 0; sfb < cod_info.sfb_lmax; sfb++) { + if (scalefac[sfb] >= 16) return true; + } + + for (let window = 0; window < 3; window++) { + let s1 = 0; + let s2 = 0; + + for ( + sfb = cod_info.sfb_lmax + window; + sfb < cod_info.sfbdivide; + sfb += 3 + ) { + if (s1 < scalefac[sfb]) s1 = scalefac[sfb]; + } + for (; sfb < cod_info.sfbmax; sfb += 3) { + if (s2 < scalefac[sfb]) s2 = scalefac[sfb]; + } + + if (s1 < 16 && s2 < 8) continue; + + if (cod_info.subblock_gain[window] >= 7) return true; + + cod_info.subblock_gain[window]++; + let j = gfc.scalefac_band.l[cod_info.sfb_lmax]; + for (sfb = cod_info.sfb_lmax + window; sfb < cod_info.sfbmax; sfb += 3) { + let amp; + const width = cod_info.width[sfb]; + let s = scalefac[sfb]; + assert(s >= 0); + s -= 4 >> cod_info.scalefac_scale; + if (s >= 0) { + scalefac[sfb] = s; + j += width * 3; + continue; + } + + scalefac[sfb] = 0; + { + const gain = 210 + (s << (cod_info.scalefac_scale + 1)); + amp = this.qupvt.ipow20(gain); + } + j += width * (window + 1); + for (let l = -width; l < 0; l++) { + xrpow[j + l] *= amp; + if (xrpow[j + l] > cod_info.xrpow_max) + cod_info.xrpow_max = xrpow[j + l]; + } + j += width * (3 - window - 1); + } + + const amp = this.qupvt.ipow20(202); + j += cod_info.width[sfb] * (window + 1); + for (let l = -cod_info.width[sfb]; l < 0; l++) { + xrpow[j + l] *= amp; + if (xrpow[j + l] > cod_info.xrpow_max) + cod_info.xrpow_max = xrpow[j + l]; + } + } + return false; + } + + private balance_noise( + gfp: LameGlobalFlags, + cod_info: GrInfo, + distort: Float32Array, + xrpow: Float32Array, + bRefine: boolean + ) { + const gfc = gfp.internal_flags; + + this.amp_scalefac_bands(gfp, cod_info, distort, xrpow, bRefine); + + let status = this.loop_break(cod_info); + + if (status) return false; + + if (gfc.mode_gr === 2) status = this.tak.scale_bitcount(cod_info); + else status = this.tak.scale_bitcount_lsf(gfc, cod_info); + + if (!status) return true; + + if (gfc.noise_shaping > 1) { + fillArray(gfc.pseudohalf, 0); + if (cod_info.scalefac_scale === 0) { + this.inc_scalefac_scale(cod_info, xrpow); + status = false; + } else if (cod_info.block_type === SHORT_TYPE && gfc.subblock_gain > 0) { + status = + this.inc_subblock_gain(gfc, cod_info, xrpow) || + this.loop_break(cod_info); + } + } + + if (!status) { + if (gfc.mode_gr === 2) status = this.tak.scale_bitcount(cod_info); + else status = this.tak.scale_bitcount_lsf(gfc, cod_info); + } + return !status; + } + + // eslint-disable-next-line complexity + outer_loop( + gfp: LameGlobalFlags, + cod_info: GrInfo, + l3_xmin: Float32Array, + xrpow: Float32Array, + ch: number, + targ_bits: number + ) { + const gfc = gfp.internal_flags; + const cod_info_w = new GrInfo(); + const save_xrpow = new Float32Array(576); + const distort = new Float32Array(SFBMAX); + let best_noise_info = new CalcNoiseResult(); + let better; + const prev_noise = new CalcNoiseData(); + let best_part2_3_length = 9999999; + let bEndOfSearch = false; + let bRefine = false; + let best_ggain_pass1 = 0; + + this.bin_search_StepSize(gfc, cod_info, targ_bits, ch, xrpow); + + if (gfc.noise_shaping === 0) { + return 100; + } + + this.calc_noise(cod_info, l3_xmin, distort, best_noise_info, prev_noise); + best_noise_info.bits = cod_info.part2_3_length; + + cod_info_w.assign(cod_info); + let age = 0; + copyArray(xrpow, 0, save_xrpow, 0, 576); + + while (!bEndOfSearch) { + do { + const noise_info = new CalcNoiseResult(); + let search_limit; + let maxggain = 255; + + if ((gfc.substep_shaping & 2) !== 0) { + search_limit = 20; + } else { + search_limit = 3; + } + + if (gfc.sfb21_extra) { + if (distort[cod_info_w.sfbmax] > 1.0) break; + if ( + cod_info_w.block_type === SHORT_TYPE && + (distort[cod_info_w.sfbmax + 1] > 1.0 || + distort[cod_info_w.sfbmax + 2] > 1.0) + ) + break; + } + + if (!this.balance_noise(gfp, cod_info_w, distort, xrpow, bRefine)) + break; + if (cod_info_w.scalefac_scale !== 0) maxggain = 254; + + const huff_bits = targ_bits - cod_info_w.part2_length; + if (huff_bits <= 0) break; + + while ( + (cod_info_w.part2_3_length = this.tak.count_bits( + gfc, + xrpow, + cod_info_w, + prev_noise + )) > huff_bits && + cod_info_w.global_gain <= maxggain + ) + cod_info_w.global_gain++; + + if (cod_info_w.global_gain > maxggain) break; + + if (best_noise_info.over_count === 0) { + while ( + (cod_info_w.part2_3_length = this.tak.count_bits( + gfc, + xrpow, + cod_info_w, + prev_noise + )) > best_part2_3_length && + cod_info_w.global_gain <= maxggain + ) + cod_info_w.global_gain++; + + if (cod_info_w.global_gain > maxggain) break; + } + + this.calc_noise(cod_info_w, l3_xmin, distort, noise_info, prev_noise); + noise_info.bits = cod_info_w.part2_3_length; + + if (cod_info.block_type !== SHORT_TYPE) { + better = gfp.quant_comp; + } else better = gfp.quant_comp_short; + + better = this.quant_compare( + better, + best_noise_info, + noise_info, + cod_info_w, + distort + ) + ? 1 + : 0; + + if (better !== 0) { + best_part2_3_length = cod_info.part2_3_length; + best_noise_info = noise_info; + cod_info.assign(cod_info_w); + age = 0; + + copyArray(xrpow, 0, save_xrpow, 0, 576); + } else if (gfc.full_outer_loop === 0) { + if (++age > search_limit && best_noise_info.over_count === 0) break; + if (gfc.noise_shaping_amp === 3 && bRefine && age > 30) break; + if ( + gfc.noise_shaping_amp === 3 && + bRefine && + cod_info_w.global_gain - best_ggain_pass1 > 15 + ) + break; + } + } while (cod_info_w.global_gain + cod_info_w.scalefac_scale < 255); + + if (gfc.noise_shaping_amp === 3) { + if (!bRefine) { + cod_info_w.assign(cod_info); + copyArray(save_xrpow, 0, xrpow, 0, 576); + age = 0; + best_ggain_pass1 = cod_info_w.global_gain; + + bRefine = true; + } else { + bEndOfSearch = true; + } + } else { + bEndOfSearch = true; + } + } + + assert(cod_info.global_gain + cod_info.scalefac_scale <= 255); + + if (gfp.VBR === VbrMode.vbr_rh || gfp.VBR === VbrMode.vbr_mtrh) { + copyArray(save_xrpow, 0, xrpow, 0, 576); + } else if ((gfc.substep_shaping & 1) !== 0) { + this.trancate_smallspectrums(gfc, cod_info, l3_xmin, xrpow); + } + + return best_noise_info.over_count; + } + + iteration_finish_one(gfc: LameInternalFlags, gr: number, ch: number) { + const { l3_side } = gfc; + const cod_info = l3_side.tt[gr][ch]; + + this.tak.best_scalefac_store(gfc, gr, ch, l3_side); + + if (gfc.use_best_huffman === 1) this.tak.best_huffman_divide(gfc, cod_info); + + this.rv.ResvAdjust(gfc, cod_info); + } + + private _pow20: Float32Array | undefined; + + private pow20(x: number) { + assert(x + QuantizePVT.Q_MAX2 >= 0 && x < QuantizePVT.Q_MAX); + + if (this._pow20 === undefined) { + this._pow20 = new Float32Array( + QuantizePVT.Q_MAX + QuantizePVT.Q_MAX2 + 1 + ); + for (let i = 0; i <= QuantizePVT.Q_MAX + QuantizePVT.Q_MAX2; i++) { + this._pow20[i] = Math.pow(2.0, (i - 210 - QuantizePVT.Q_MAX2) * 0.25); + } + } + + return this._pow20[x + QuantizePVT.Q_MAX2]; + } + + private calc_noise_core( + cod_info: GrInfo, + startline: StartLine, + l: number, + step: number + ) { + let noise = 0; + let j = startline.s; + const ix = cod_info.l3_enc; + + if (j > cod_info.count1) { + while (l-- !== 0) { + let temp; + temp = cod_info.xr[j]; + j++; + noise += temp * temp; + temp = cod_info.xr[j]; + j++; + noise += temp * temp; + } + } else if (j > cod_info.big_values) { + const ix01 = new Float32Array(2); + ix01[0] = 0; + ix01[1] = step; + while (l-- !== 0) { + let temp; + temp = Math.abs(cod_info.xr[j]) - ix01[ix[j]]; + j++; + noise += temp * temp; + temp = Math.abs(cod_info.xr[j]) - ix01[ix[j]]; + j++; + noise += temp * temp; + } + } else { + while (l-- !== 0) { + let temp; + temp = Math.abs(cod_info.xr[j]) - this.qupvt.pow43(ix[j]) * step; + j++; + noise += temp * temp; + temp = Math.abs(cod_info.xr[j]) - this.qupvt.pow43(ix[j]) * step; + j++; + noise += temp * temp; + } + } + + startline.s = j; + return noise; + } + + private calc_noise( + cod_info: GrInfo, + l3_xmin: Float32Array, + distort: Float32Array, + res: CalcNoiseResult, + prev_noise: CalcNoiseData | null + ) { + let distortPos = 0; + let l3_xminPos = 0; + let sfb; + let l; + let over = 0; + let over_noise_db = 0; + + let tot_noise_db = 0; + + let max_noise = -20.0; + let j = 0; + const { scalefac } = cod_info; + let scalefacPos = 0; + + res.over_SSD = 0; + + for (sfb = 0; sfb < cod_info.psymax; sfb++) { + const s = + cod_info.global_gain - + ((scalefac[scalefacPos++] + + (cod_info.preflag !== 0 ? this.qupvt.pretab[sfb] : 0)) << + (cod_info.scalefac_scale + 1)) - + cod_info.subblock_gain[cod_info.window[sfb]] * 8; + let noise = 0.0; + + if (prev_noise !== null && prev_noise.step[sfb] === s) { + noise = prev_noise.noise[sfb]; + j += cod_info.width[sfb]; + distort[distortPos++] = noise / l3_xmin[l3_xminPos++]; + + noise = prev_noise.noise_log[sfb]; + } else { + const step = this.pow20(s); + l = cod_info.width[sfb] >> 1; + + if (j + cod_info.width[sfb] > cod_info.max_nonzero_coeff) { + const usefullsize = cod_info.max_nonzero_coeff - j + 1; + + if (usefullsize > 0) l = usefullsize >> 1; + else l = 0; + } + + const sl = new StartLine(j); + noise = this.calc_noise_core(cod_info, sl, l, step); + j = sl.s; + + if (prev_noise !== null) { + prev_noise.step[sfb] = s; + prev_noise.noise[sfb] = noise; + } + + noise /= l3_xmin[l3_xminPos++]; + distort[distortPos++] = noise; + + noise = Math.log10(Math.max(noise, 1e-20)); + + if (prev_noise !== null) { + prev_noise.noise_log[sfb] = noise; + } + } + + if (prev_noise !== null) { + prev_noise.global_gain = cod_info.global_gain; + } + + tot_noise_db += noise; + + if (noise > 0.0) { + const tmp = Math.max(Math.trunc(noise * 10 + 0.5), 1); + res.over_SSD += tmp * tmp; + + over++; + + over_noise_db += noise; + } + max_noise = Math.max(max_noise, noise); + } + + res.over_count = over; + res.tot_noise = tot_noise_db; + res.over_noise = over_noise_db; + res.max_noise = max_noise; + + return over; + } +} diff --git a/packages/mp3-encoder/src/lame/QuantizePVT.ts b/packages/mp3-encoder/src/lame/QuantizePVT.ts new file mode 100644 index 0000000000..2723b0a3bf --- /dev/null +++ b/packages/mp3-encoder/src/lame/QuantizePVT.ts @@ -0,0 +1,433 @@ +import type { GrInfo } from './GrInfo'; +import type { III_psy_ratio } from './III_psy_ratio'; +import type { LameGlobalFlags } from './LameGlobalFlags'; +import type { PsyModel } from './PsyModel'; +import type { Takehiro } from './Takehiro'; +import { VbrMode } from './VbrMode'; +import { assert } from './assert'; +import { + MAX_BITS_PER_CHANNEL, + MAX_BITS_PER_GRANULE, + MAX_FLOAT32_VALUE, + PSFB12, + PSFB21, + SBMAX_l, + SBMAX_s, + SBPSY_l, + SBPSY_s, + SHORT_TYPE, +} from './constants'; +import { isCloseToEachOther } from './math'; + +export class QuantizePVT { + static Q_MAX = 256 + 1; + + static Q_MAX2 = 116; + + static IXMAX_VAL = 8206; + + readonly psy: PsyModel; + + constructor(psy: PsyModel) { + this.psy = psy; + } + + private static readonly DBL_EPSILON = 2.2204460492503131e-16; + + static readonly PRECALC_SIZE = QuantizePVT.IXMAX_VAL + 2; + + private static readonly NSATHSCALE = 100; + + readonly nr_of_sfb_block = [ + [ + [6, 5, 5, 5], + [9, 9, 9, 9], + [6, 9, 9, 9], + ], + [ + [6, 5, 7, 3], + [9, 9, 12, 6], + [6, 9, 12, 6], + ], + [ + [11, 10, 0, 0], + [18, 18, 0, 0], + [15, 18, 0, 0], + ], + [ + [7, 7, 7, 0], + [12, 12, 12, 0], + [6, 15, 12, 0], + ], + [ + [6, 6, 6, 3], + [12, 9, 9, 6], + [6, 12, 9, 6], + ], + [ + [8, 8, 5, 0], + [15, 12, 9, 0], + [6, 18, 9, 0], + ], + ] as const; + + private _ipow20: Float32Array | undefined; + + ipow20(x: number) { + assert(x >= 0 && x < QuantizePVT.Q_MAX); + + if (this._ipow20 === undefined) { + this._ipow20 = new Float32Array(QuantizePVT.Q_MAX); + for (let i = 0; i < QuantizePVT.Q_MAX; i++) { + this._ipow20[i] = Math.pow(2.0, (i - 210) * -0.1875); + } + } + + return this._ipow20[x]; + } + + private _pow43: Float32Array | undefined; + + pow43(k: number) { + if (this._pow43 === undefined) { + this._pow43 = new Float32Array(QuantizePVT.PRECALC_SIZE); + this._pow43[0] = 0.0; + for (let i = 1; i < QuantizePVT.PRECALC_SIZE; i++) { + this._pow43[i] = Math.pow(i, 4.0 / 3.0); + } + } + + return this._pow43[k]; + } + + _adj43: Float32Array | undefined; + + adj43(k: number) { + if (this._adj43 === undefined) { + this._adj43 = new Float32Array(QuantizePVT.PRECALC_SIZE); + + let i; + for (i = 0; i < QuantizePVT.PRECALC_SIZE - 1; i++) { + this._adj43[i] = + i + 1 - Math.pow(0.5 * (this.pow43(i) + this.pow43(i + 1)), 0.75); + } + this._adj43[i] = 0.5; + } + return this._adj43[k]; + } + + private ATHmdct(gfp: LameGlobalFlags, f: number) { + let ath = this.psy.ATHformula(f, gfp); + + ath -= QuantizePVT.NSATHSCALE; + + ath = Math.pow(10.0, ath / 10.0 + gfp.ATHlower); + return ath; + } + + private compute_ath(gfp: LameGlobalFlags) { + const ATH_l = gfp.internal_flags.ATH.l; + const ATH_psfb21 = gfp.internal_flags.ATH.psfb21; + const ATH_s = gfp.internal_flags.ATH.s; + const ATH_psfb12 = gfp.internal_flags.ATH.psfb12; + const gfc = gfp.internal_flags; + const samp_freq = gfp.out_samplerate; + + for (let sfb = 0; sfb < SBMAX_l; sfb++) { + const start = gfc.scalefac_band.l[sfb]; + const end = gfc.scalefac_band.l[sfb + 1]; + ATH_l[sfb] = MAX_FLOAT32_VALUE; + for (let i = start; i < end; i++) { + const freq = (i * samp_freq) / (2 * 576); + const ATH_f = this.ATHmdct(gfp, freq); + + ATH_l[sfb] = Math.min(ATH_l[sfb], ATH_f); + } + } + + for (let sfb = 0; sfb < PSFB21; sfb++) { + const start = gfc.scalefac_band.psfb21[sfb]; + const end = gfc.scalefac_band.psfb21[sfb + 1]; + ATH_psfb21[sfb] = MAX_FLOAT32_VALUE; + for (let i = start; i < end; i++) { + const freq = (i * samp_freq) / (2 * 576); + const ATH_f = this.ATHmdct(gfp, freq); + + ATH_psfb21[sfb] = Math.min(ATH_psfb21[sfb], ATH_f); + } + } + + for (let sfb = 0; sfb < SBMAX_s; sfb++) { + const start = gfc.scalefac_band.s[sfb]; + const end = gfc.scalefac_band.s[sfb + 1]; + ATH_s[sfb] = MAX_FLOAT32_VALUE; + for (let i = start; i < end; i++) { + const freq = (i * samp_freq) / (2 * 192); + const ATH_f = this.ATHmdct(gfp, freq); + + ATH_s[sfb] = Math.min(ATH_s[sfb], ATH_f); + } + ATH_s[sfb] *= gfc.scalefac_band.s[sfb + 1] - gfc.scalefac_band.s[sfb]; + } + + for (let sfb = 0; sfb < PSFB12; sfb++) { + const start = gfc.scalefac_band.psfb12[sfb]; + const end = gfc.scalefac_band.psfb12[sfb + 1]; + ATH_psfb12[sfb] = MAX_FLOAT32_VALUE; + for (let i = start; i < end; i++) { + const freq = (i * samp_freq) / (2 * 192); + const ATH_f = this.ATHmdct(gfp, freq); + + ATH_psfb12[sfb] = Math.min(ATH_psfb12[sfb], ATH_f); + } + + ATH_psfb12[sfb] *= gfc.scalefac_band.s[13] - gfc.scalefac_band.s[12]; + } + + gfc.ATH.floor = 10 * Math.log10(this.ATHmdct(gfp, -1)); + } + + iteration_init(gfp: LameGlobalFlags, tak: Takehiro) { + const gfc = gfp.internal_flags; + const { l3_side } = gfc; + let i; + + if (!gfc.iteration_init_init) { + gfc.iteration_init_init = true; + + l3_side.main_data_begin = 0; + this.compute_ath(gfp); + + tak.huffman_init(gfc); + + i = (gfp.exp_nspsytune >> 2) & 63; + if (i >= 32) i -= 64; + const bass = Math.pow(10, i / 4.0 / 10.0); + + i = (gfp.exp_nspsytune >> 8) & 63; + if (i >= 32) i -= 64; + const alto = Math.pow(10, i / 4.0 / 10.0); + + i = (gfp.exp_nspsytune >> 14) & 63; + if (i >= 32) i -= 64; + const treble = Math.pow(10, i / 4.0 / 10.0); + + i = (gfp.exp_nspsytune >> 20) & 63; + if (i >= 32) i -= 64; + const sfb21 = treble * Math.pow(10, i / 4.0 / 10.0); + for (i = 0; i < SBMAX_l; i++) { + let f; + if (i <= 6) f = bass; + else if (i <= 13) f = alto; + else if (i <= 20) f = treble; + else f = sfb21; + + gfc.nsPsy.longfact[i] = f; + } + for (i = 0; i < SBMAX_s; i++) { + let f; + if (i <= 5) f = bass; + else if (i <= 10) f = alto; + else if (i <= 11) f = treble; + else f = sfb21; + + gfc.nsPsy.shortfact[i] = f; + } + } + } + + reduce_side( + targ_bits: Int32Array, + ms_ener_ratio: number, + mean_bits: number, + max_bits: number + ) { + assert(max_bits <= MAX_BITS_PER_GRANULE); + assert(targ_bits[0] + targ_bits[1] <= MAX_BITS_PER_GRANULE); + + let fac = (0.33 * (0.5 - ms_ener_ratio)) / 0.5; + if (fac < 0) fac = 0; + if (fac > 0.5) fac = 0.5; + + let move_bits = Math.trunc(fac * 0.5 * (targ_bits[0] + targ_bits[1])); + + if (move_bits > MAX_BITS_PER_CHANNEL - targ_bits[0]) { + move_bits = MAX_BITS_PER_CHANNEL - targ_bits[0]; + } + if (move_bits < 0) move_bits = 0; + + if (targ_bits[1] >= 125) { + if (targ_bits[1] - move_bits > 125) { + if (targ_bits[0] < mean_bits) targ_bits[0] += move_bits; + targ_bits[1] -= move_bits; + } else { + targ_bits[0] += targ_bits[1] - 125; + targ_bits[1] = 125; + } + } + + move_bits = targ_bits[0] + targ_bits[1]; + if (move_bits > max_bits) { + targ_bits[0] = (max_bits * targ_bits[0]) / move_bits; + targ_bits[1] = (max_bits * targ_bits[1]) / move_bits; + } + assert(targ_bits[0] <= MAX_BITS_PER_CHANNEL); + assert(targ_bits[1] <= MAX_BITS_PER_CHANNEL); + assert(targ_bits[0] + targ_bits[1] <= MAX_BITS_PER_GRANULE); + } + + athAdjust(a: number, x: number, athFloor: number) { + const o = 90.30873362; + const p = 94.82444863; + let u = Math.log10(x) * 10.0; + const v = a * a; + let w = 0.0; + u -= athFloor; + + if (v > 1e-20) w = 1 + Math.log10(v) * (10.0 / o); + if (w < 0) w = 0; + u *= w; + u += athFloor + o - p; + + return Math.pow(10, 0.1 * u); + } + + // eslint-disable-next-line complexity + calc_xmin( + gfp: LameGlobalFlags, + ratio: III_psy_ratio, + cod_info: GrInfo, + pxmin: Float32Array + ) { + let pxminPos = 0; + const gfc = gfp.internal_flags; + let gsfb; + let j = 0; + let ath_over = 0; + const { ATH } = gfc; + const { xr } = cod_info; + const enable_athaa_fix = gfp.VBR === VbrMode.vbr_mtrh ? 1 : 0; + let { masking_lower } = gfc; + + if (gfp.VBR === VbrMode.vbr_mtrh || gfp.VBR === VbrMode.vbr_mt) { + masking_lower = 1.0; + } + + for (gsfb = 0; gsfb < cod_info.psy_lmax; gsfb++) { + let en0; + let xmin; + let rh2; + let l; + + if (gfp.VBR === VbrMode.vbr_rh || gfp.VBR === VbrMode.vbr_mtrh) + xmin = this.athAdjust(ATH.adjust, ATH.l[gsfb], ATH.floor); + else xmin = ATH.adjust * ATH.l[gsfb]; + + const width = cod_info.width[gsfb]; + const rh1 = xmin / width; + rh2 = QuantizePVT.DBL_EPSILON; + l = width >> 1; + en0 = 0.0; + do { + const xa = xr[j] * xr[j]; + en0 += xa; + rh2 += xa < rh1 ? xa : rh1; + j++; + const xb = xr[j] * xr[j]; + en0 += xb; + rh2 += xb < rh1 ? xb : rh1; + j++; + } while (--l > 0); + if (en0 > xmin) ath_over++; + + if (gsfb === SBPSY_l) { + const x = xmin * gfc.nsPsy.longfact[gsfb]; + if (rh2 < x) { + rh2 = x; + } + } + if (enable_athaa_fix !== 0) { + xmin = rh2; + } + + const e = ratio.en.l[gsfb]; + if (e > 0.0) { + let x; + x = (en0 * ratio.thm.l[gsfb] * masking_lower) / e; + if (enable_athaa_fix !== 0) x *= gfc.nsPsy.longfact[gsfb]; + if (xmin < x) xmin = x; + } + + if (enable_athaa_fix !== 0) pxmin[pxminPos++] = xmin; + else pxmin[pxminPos++] = xmin * gfc.nsPsy.longfact[gsfb]; + } + + let max_nonzero = 575; + if (cod_info.block_type !== SHORT_TYPE) { + let k = 576; + while (k-- !== 0 && isCloseToEachOther(xr[k], 0)) { + max_nonzero = k; + } + } + cod_info.max_nonzero_coeff = max_nonzero; + + for ( + let sfb = cod_info.sfb_smin; + gsfb < cod_info.psymax; + sfb++, gsfb += 3 + ) { + let b; + let tmpATH; + if (gfp.VBR === VbrMode.vbr_rh || gfp.VBR === VbrMode.vbr_mtrh) + tmpATH = this.athAdjust(ATH.adjust, ATH.s[sfb], ATH.floor); + else tmpATH = ATH.adjust * ATH.s[sfb]; + + const width = cod_info.width[gsfb]; + for (b = 0; b < 3; b++) { + let en0 = 0.0; + let xmin; + let rh2; + let l = width >> 1; + + const rh1 = tmpATH / width; + rh2 = QuantizePVT.DBL_EPSILON; + do { + const xa = xr[j] * xr[j]; + en0 += xa; + rh2 += xa < rh1 ? xa : rh1; + j++; + const xb = xr[j] * xr[j]; + en0 += xb; + rh2 += xb < rh1 ? xb : rh1; + j++; + } while (--l > 0); + if (en0 > tmpATH) ath_over++; + if (sfb === SBPSY_s) { + const x = tmpATH * gfc.nsPsy.shortfact[sfb]; + if (rh2 < x) { + rh2 = x; + } + } + if (enable_athaa_fix !== 0) xmin = rh2; + else xmin = tmpATH; + + const e = ratio.en.s[sfb][b]; + if (e > 0.0) { + let x; + x = (en0 * ratio.thm.s[sfb][b] * masking_lower) / e; + if (enable_athaa_fix !== 0) x *= gfc.nsPsy.shortfact[sfb]; + if (xmin < x) xmin = x; + } + + if (enable_athaa_fix !== 0) pxmin[pxminPos++] = xmin; + else pxmin[pxminPos++] = xmin * gfc.nsPsy.shortfact[sfb]; + } + } + + return ath_over; + } + + readonly pretab = [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0, + ] as const; +} diff --git a/packages/mp3-encoder/src/lame/ReplayGain.ts b/packages/mp3-encoder/src/lame/ReplayGain.ts new file mode 100644 index 0000000000..5ee1bb3762 --- /dev/null +++ b/packages/mp3-encoder/src/lame/ReplayGain.ts @@ -0,0 +1,53 @@ +import { GainAnalysis } from './GainAnalysis'; + +export class ReplayGain { + linprebuf = new Float32Array(GainAnalysis.MAX_ORDER * 2); + + linpre = 0; + + lstepbuf = new Float32Array( + GainAnalysis.MAX_SAMPLES_PER_WINDOW + GainAnalysis.MAX_ORDER + ); + + lstep = 0; + + loutbuf = new Float32Array( + GainAnalysis.MAX_SAMPLES_PER_WINDOW + GainAnalysis.MAX_ORDER + ); + + lout = 0; + + rinprebuf = new Float32Array(GainAnalysis.MAX_ORDER * 2); + + rinpre = 0; + + rstepbuf = new Float32Array( + GainAnalysis.MAX_SAMPLES_PER_WINDOW + GainAnalysis.MAX_ORDER + ); + + rstep = 0; + + routbuf = new Float32Array( + GainAnalysis.MAX_SAMPLES_PER_WINDOW + GainAnalysis.MAX_ORDER + ); + + rout = 0; + + sampleWindow = 0; + + totsamp = 0; + + lsum = 0; + + rsum = 0; + + freqindex = 0; + + first = 0; + + A = new Int32Array(GainAnalysis.STEPS_per_dB * GainAnalysis.MAX_dB); + + B = new Int32Array(GainAnalysis.STEPS_per_dB * GainAnalysis.MAX_dB); + + reqindex = 0; +} diff --git a/packages/mp3-encoder/src/lame/Reservoir.ts b/packages/mp3-encoder/src/lame/Reservoir.ts new file mode 100644 index 0000000000..3187b2d266 --- /dev/null +++ b/packages/mp3-encoder/src/lame/Reservoir.ts @@ -0,0 +1,102 @@ +import type { BitStream } from './BitStream'; +import type { GrInfo } from './GrInfo'; +import type { LameGlobalFlags } from './LameGlobalFlags'; +import type { LameInternalFlags } from './LameInternalFlags'; +import type { MeanBits } from './MeanBits'; +import { assert } from './assert'; + +export class Reservoir { + private bs: BitStream | undefined; + + constructor(bs: BitStream) { + this.bs = bs; + } + + ResvFrameBegin(gfp: LameGlobalFlags, mean_bits: MeanBits) { + const gfc = gfp.internal_flags; + let maxmp3buf; + const { l3_side } = gfc; + + const frameLength = this.bs?.getframebits(gfp) ?? 0; + mean_bits.bits = (frameLength - gfc.sideinfo_len * 8) / gfc.mode_gr; + + if (gfp.brate > 320) { + maxmp3buf = + 8 * + Math.trunc((gfp.brate * 1000) / (gfp.out_samplerate / 1152) / 8 + 0.5); + } else { + maxmp3buf = 8 * 1440; + } + + let fullFrameBits = + mean_bits.bits * gfc.mode_gr + Math.min(gfc.ResvSize, 0); + + if (fullFrameBits > maxmp3buf) fullFrameBits = maxmp3buf; + + l3_side.resvDrain_pre = 0; + + return fullFrameBits; + } + + ResvMaxBits( + gfp: LameGlobalFlags, + mean_bits: number, + targ_bits: MeanBits, + cbr: number + ) { + const gfc = gfp.internal_flags; + let add_bits; + let { ResvSize } = gfc; + + if (cbr !== 0) ResvSize += mean_bits; + + targ_bits.bits = mean_bits; + + if (ResvSize * 10 > 0) { + add_bits = ResvSize; + targ_bits.bits += add_bits; + gfc.substep_shaping |= 0x80; + } else { + add_bits = 0; + gfc.substep_shaping &= 0x7f; + } + + let extra_bits = ResvSize < 0 ? ResvSize : 0; + extra_bits -= add_bits; + + if (extra_bits < 0) extra_bits = 0; + return extra_bits; + } + + ResvAdjust(gfc: LameInternalFlags, gi: GrInfo) { + gfc.ResvSize -= gi.part2_3_length + gi.part2_length; + } + + ResvFrameEnd(gfc: LameInternalFlags, mean_bits: number) { + let over_bits; + const { l3_side } = gfc; + + gfc.ResvSize += mean_bits * gfc.mode_gr; + let stuffingBits = 0; + l3_side.resvDrain_post = 0; + l3_side.resvDrain_pre = 0; + + if ((over_bits = gfc.ResvSize % 8) !== 0) stuffingBits += over_bits; + + over_bits = gfc.ResvSize - stuffingBits; + if (over_bits > 0) { + assert(over_bits % 8 === 0); + assert(over_bits >= 0); + stuffingBits += over_bits; + } + + const mdb_bytes = Math.min(l3_side.main_data_begin * 8, stuffingBits) / 8; + l3_side.resvDrain_pre += 8 * mdb_bytes; + stuffingBits -= 8 * mdb_bytes; + gfc.ResvSize -= 8 * mdb_bytes; + l3_side.main_data_begin -= mdb_bytes; + + l3_side.resvDrain_post += stuffingBits; + gfc.ResvSize -= stuffingBits; + } +} diff --git a/packages/mp3-encoder/src/lame/ScaleFac.ts b/packages/mp3-encoder/src/lame/ScaleFac.ts new file mode 100644 index 0000000000..a9c5cf197a --- /dev/null +++ b/packages/mp3-encoder/src/lame/ScaleFac.ts @@ -0,0 +1,58 @@ +import { copyArray } from './arrays'; +import { PSFB12, PSFB21, SBMAX_l, SBMAX_s } from './constants'; + +export class ScaleFac { + private readonly arrL: number[] | undefined; + + private readonly arrS: number[] | undefined; + + private readonly arr21: number[] | undefined; + + private readonly arr12: number[] | undefined; + + readonly l: Int32Array; + + readonly s: Int32Array; + + readonly psfb21: Int32Array; + + readonly psfb12: Int32Array; + + constructor(); + + constructor(arrL: number[], arrS: number[], arr21: number[], arr12: number[]); + + constructor( + ...args: + | [] + | [arrL: number[], arrS: number[], arr21: number[], arr12: number[]] + ) { + this.l = new Int32Array(1 + SBMAX_l); + this.s = new Int32Array(1 + SBMAX_s); + this.psfb21 = new Int32Array(1 + PSFB21); + this.psfb12 = new Int32Array(1 + PSFB12); + const { l } = this; + const { s } = this; + + if (args.length === 4) { + [this.arrL, this.arrS, this.arr21, this.arr12] = args; + + copyArray(this.arrL, 0, l, 0, Math.min(this.arrL.length, this.l.length)); + copyArray(this.arrS, 0, s, 0, Math.min(this.arrS.length, this.s.length)); + copyArray( + this.arr21, + 0, + this.psfb21, + 0, + Math.min(this.arr21.length, this.psfb21.length) + ); + copyArray( + this.arr12, + 0, + this.psfb12, + 0, + Math.min(this.arr12.length, this.psfb12.length) + ); + } + } +} diff --git a/packages/mp3-encoder/src/lame/ShortBlock.ts b/packages/mp3-encoder/src/lame/ShortBlock.ts new file mode 100644 index 0000000000..199201e063 --- /dev/null +++ b/packages/mp3-encoder/src/lame/ShortBlock.ts @@ -0,0 +1,6 @@ +export const enum ShortBlock { + short_block_allowed, + short_block_coupled, + short_block_dispensed, + short_block_forced, +} diff --git a/packages/mp3-encoder/src/lame/StartLine.ts b/packages/mp3-encoder/src/lame/StartLine.ts new file mode 100644 index 0000000000..9eff9dc867 --- /dev/null +++ b/packages/mp3-encoder/src/lame/StartLine.ts @@ -0,0 +1,3 @@ +export class StartLine { + constructor(public s: number) {} +} diff --git a/packages/mp3-encoder/src/lame/Tables.ts b/packages/mp3-encoder/src/lame/Tables.ts new file mode 100644 index 0000000000..ddf78a60ef --- /dev/null +++ b/packages/mp3-encoder/src/lame/Tables.ts @@ -0,0 +1,360 @@ +import type { HuffCodeTab } from './HuffCodeTab'; + +const t1HB = [1, 1, 1, 0] as const; + +const t2HB = [1, 2, 1, 3, 1, 1, 3, 2, 0] as const; + +const t3HB = [3, 2, 1, 1, 1, 1, 3, 2, 0] as const; + +const t5HB = [1, 2, 6, 5, 3, 1, 4, 4, 7, 5, 7, 1, 6, 1, 1, 0] as const; + +const t6HB = [7, 3, 5, 1, 6, 2, 3, 2, 5, 4, 4, 1, 3, 3, 2, 0] as const; + +const t7HB = [ + 1, 2, 10, 19, 16, 10, 3, 3, 7, 10, 5, 3, 11, 4, 13, 17, 8, 4, 12, 11, 18, 15, + 11, 2, 7, 6, 9, 14, 3, 1, 6, 4, 5, 3, 2, 0, +] as const; + +const t8HB = [ + 3, 4, 6, 18, 12, 5, 5, 1, 2, 16, 9, 3, 7, 3, 5, 14, 7, 3, 19, 17, 15, 13, 10, + 4, 13, 5, 8, 11, 5, 1, 12, 4, 4, 1, 1, 0, +] as const; + +const t9HB = [ + 7, 5, 9, 14, 15, 7, 6, 4, 5, 5, 6, 7, 7, 6, 8, 8, 8, 5, 15, 6, 9, 10, 5, 1, + 11, 7, 9, 6, 4, 1, 14, 4, 6, 2, 6, 0, +] as const; + +const t10HB = [ + 1, 2, 10, 23, 35, 30, 12, 17, 3, 3, 8, 12, 18, 21, 12, 7, 11, 9, 15, 21, 32, + 40, 19, 6, 14, 13, 22, 34, 46, 23, 18, 7, 20, 19, 33, 47, 27, 22, 9, 3, 31, + 22, 41, 26, 21, 20, 5, 3, 14, 13, 10, 11, 16, 6, 5, 1, 9, 8, 7, 8, 4, 4, 2, 0, +] as const; + +const t11HB = [ + 3, 4, 10, 24, 34, 33, 21, 15, 5, 3, 4, 10, 32, 17, 11, 10, 11, 7, 13, 18, 30, + 31, 20, 5, 25, 11, 19, 59, 27, 18, 12, 5, 35, 33, 31, 58, 30, 16, 7, 5, 28, + 26, 32, 19, 17, 15, 8, 14, 14, 12, 9, 13, 14, 9, 4, 1, 11, 4, 6, 6, 6, 3, 2, + 0, +] as const; + +const t12HB = [ + 9, 6, 16, 33, 41, 39, 38, 26, 7, 5, 6, 9, 23, 16, 26, 11, 17, 7, 11, 14, 21, + 30, 10, 7, 17, 10, 15, 12, 18, 28, 14, 5, 32, 13, 22, 19, 18, 16, 9, 5, 40, + 17, 31, 29, 17, 13, 4, 2, 27, 12, 11, 15, 10, 7, 4, 1, 27, 12, 8, 12, 6, 3, 1, + 0, +] as const; + +const t13HB = [ + 1, 5, 14, 21, 34, 51, 46, 71, 42, 52, 68, 52, 67, 44, 43, 19, 3, 4, 12, 19, + 31, 26, 44, 33, 31, 24, 32, 24, 31, 35, 22, 14, 15, 13, 23, 36, 59, 49, 77, + 65, 29, 40, 30, 40, 27, 33, 42, 16, 22, 20, 37, 61, 56, 79, 73, 64, 43, 76, + 56, 37, 26, 31, 25, 14, 35, 16, 60, 57, 97, 75, 114, 91, 54, 73, 55, 41, 48, + 53, 23, 24, 58, 27, 50, 96, 76, 70, 93, 84, 77, 58, 79, 29, 74, 49, 41, 17, + 47, 45, 78, 74, 115, 94, 90, 79, 69, 83, 71, 50, 59, 38, 36, 15, 72, 34, 56, + 95, 92, 85, 91, 90, 86, 73, 77, 65, 51, 44, 43, 42, 43, 20, 30, 44, 55, 78, + 72, 87, 78, 61, 46, 54, 37, 30, 20, 16, 53, 25, 41, 37, 44, 59, 54, 81, 66, + 76, 57, 54, 37, 18, 39, 11, 35, 33, 31, 57, 42, 82, 72, 80, 47, 58, 55, 21, + 22, 26, 38, 22, 53, 25, 23, 38, 70, 60, 51, 36, 55, 26, 34, 23, 27, 14, 9, 7, + 34, 32, 28, 39, 49, 75, 30, 52, 48, 40, 52, 28, 18, 17, 9, 5, 45, 21, 34, 64, + 56, 50, 49, 45, 31, 19, 12, 15, 10, 7, 6, 3, 48, 23, 20, 39, 36, 35, 53, 21, + 16, 23, 13, 10, 6, 1, 4, 2, 16, 15, 17, 27, 25, 20, 29, 11, 17, 12, 16, 8, 1, + 1, 0, 1, +] as const; + +const t15HB = [ + 7, 12, 18, 53, 47, 76, 124, 108, 89, 123, 108, 119, 107, 81, 122, 63, 13, 5, + 16, 27, 46, 36, 61, 51, 42, 70, 52, 83, 65, 41, 59, 36, 19, 17, 15, 24, 41, + 34, 59, 48, 40, 64, 50, 78, 62, 80, 56, 33, 29, 28, 25, 43, 39, 63, 55, 93, + 76, 59, 93, 72, 54, 75, 50, 29, 52, 22, 42, 40, 67, 57, 95, 79, 72, 57, 89, + 69, 49, 66, 46, 27, 77, 37, 35, 66, 58, 52, 91, 74, 62, 48, 79, 63, 90, 62, + 40, 38, 125, 32, 60, 56, 50, 92, 78, 65, 55, 87, 71, 51, 73, 51, 70, 30, 109, + 53, 49, 94, 88, 75, 66, 122, 91, 73, 56, 42, 64, 44, 21, 25, 90, 43, 41, 77, + 73, 63, 56, 92, 77, 66, 47, 67, 48, 53, 36, 20, 71, 34, 67, 60, 58, 49, 88, + 76, 67, 106, 71, 54, 38, 39, 23, 15, 109, 53, 51, 47, 90, 82, 58, 57, 48, 72, + 57, 41, 23, 27, 62, 9, 86, 42, 40, 37, 70, 64, 52, 43, 70, 55, 42, 25, 29, 18, + 11, 11, 118, 68, 30, 55, 50, 46, 74, 65, 49, 39, 24, 16, 22, 13, 14, 7, 91, + 44, 39, 38, 34, 63, 52, 45, 31, 52, 28, 19, 14, 8, 9, 3, 123, 60, 58, 53, 47, + 43, 32, 22, 37, 24, 17, 12, 15, 10, 2, 1, 71, 37, 34, 30, 28, 20, 17, 26, 21, + 16, 10, 6, 8, 6, 2, 0, +] as const; + +const t16HB = [ + 1, 5, 14, 44, 74, 63, 110, 93, 172, 149, 138, 242, 225, 195, 376, 17, 3, 4, + 12, 20, 35, 62, 53, 47, 83, 75, 68, 119, 201, 107, 207, 9, 15, 13, 23, 38, 67, + 58, 103, 90, 161, 72, 127, 117, 110, 209, 206, 16, 45, 21, 39, 69, 64, 114, + 99, 87, 158, 140, 252, 212, 199, 387, 365, 26, 75, 36, 68, 65, 115, 101, 179, + 164, 155, 264, 246, 226, 395, 382, 362, 9, 66, 30, 59, 56, 102, 185, 173, 265, + 142, 253, 232, 400, 388, 378, 445, 16, 111, 54, 52, 100, 184, 178, 160, 133, + 257, 244, 228, 217, 385, 366, 715, 10, 98, 48, 91, 88, 165, 157, 148, 261, + 248, 407, 397, 372, 380, 889, 884, 8, 85, 84, 81, 159, 156, 143, 260, 249, + 427, 401, 392, 383, 727, 713, 708, 7, 154, 76, 73, 141, 131, 256, 245, 426, + 406, 394, 384, 735, 359, 710, 352, 11, 139, 129, 67, 125, 247, 233, 229, 219, + 393, 743, 737, 720, 885, 882, 439, 4, 243, 120, 118, 115, 227, 223, 396, 746, + 742, 736, 721, 712, 706, 223, 436, 6, 202, 224, 222, 218, 216, 389, 386, 381, + 364, 888, 443, 707, 440, 437, 1728, 4, 747, 211, 210, 208, 370, 379, 734, 723, + 714, 1735, 883, 877, 876, 3459, 865, 2, 377, 369, 102, 187, 726, 722, 358, + 711, 709, 866, 1734, 871, 3458, 870, 434, 0, 12, 10, 7, 11, 10, 17, 11, 9, 13, + 12, 10, 7, 5, 3, 1, 3, +] as const; + +const t24HB = [ + 15, 13, 46, 80, 146, 262, 248, 434, 426, 669, 653, 649, 621, 517, 1032, 88, + 14, 12, 21, 38, 71, 130, 122, 216, 209, 198, 327, 345, 319, 297, 279, 42, 47, + 22, 41, 74, 68, 128, 120, 221, 207, 194, 182, 340, 315, 295, 541, 18, 81, 39, + 75, 70, 134, 125, 116, 220, 204, 190, 178, 325, 311, 293, 271, 16, 147, 72, + 69, 135, 127, 118, 112, 210, 200, 188, 352, 323, 306, 285, 540, 14, 263, 66, + 129, 126, 119, 114, 214, 202, 192, 180, 341, 317, 301, 281, 262, 12, 249, 123, + 121, 117, 113, 215, 206, 195, 185, 347, 330, 308, 291, 272, 520, 10, 435, 115, + 111, 109, 211, 203, 196, 187, 353, 332, 313, 298, 283, 531, 381, 17, 427, 212, + 208, 205, 201, 193, 186, 177, 169, 320, 303, 286, 268, 514, 377, 16, 335, 199, + 197, 191, 189, 181, 174, 333, 321, 305, 289, 275, 521, 379, 371, 11, 668, 184, + 183, 179, 175, 344, 331, 314, 304, 290, 277, 530, 383, 373, 366, 10, 652, 346, + 171, 168, 164, 318, 309, 299, 287, 276, 263, 513, 375, 368, 362, 6, 648, 322, + 316, 312, 307, 302, 292, 284, 269, 261, 512, 376, 370, 364, 359, 4, 620, 300, + 296, 294, 288, 282, 273, 266, 515, 380, 374, 369, 365, 361, 357, 2, 1033, 280, + 278, 274, 267, 264, 259, 382, 378, 372, 367, 363, 360, 358, 356, 0, 43, 20, + 19, 17, 15, 13, 11, 9, 7, 6, 4, 7, 5, 3, 1, 3, +] as const; + +const t32HB = [ + 1 << 0, + 5 << 1, + 4 << 1, + 5 << 2, + 6 << 1, + 5 << 2, + 4 << 2, + 4 << 3, + 7 << 1, + 3 << 2, + 6 << 2, + 0 << 3, + 7 << 2, + 2 << 3, + 3 << 3, + 1 << 4, +] as const; + +const t33HB = [ + 15 << 0, + 14 << 1, + 13 << 1, + 12 << 2, + 11 << 1, + 10 << 2, + 9 << 2, + 8 << 3, + 7 << 1, + 6 << 2, + 5 << 2, + 4 << 3, + 3 << 2, + 2 << 3, + 1 << 3, + 0 << 4, +] as const; + +const t1l = [1, 4, 3, 5] as const; + +const t2l = [1, 4, 7, 4, 5, 7, 6, 7, 8] as const; + +const t3l = [2, 3, 7, 4, 4, 7, 6, 7, 8] as const; + +const t5l = [1, 4, 7, 8, 4, 5, 8, 9, 7, 8, 9, 10, 8, 8, 9, 10] as const; + +const t6l = [3, 4, 6, 8, 4, 4, 6, 7, 5, 6, 7, 8, 7, 7, 8, 9] as const; + +const t7l = [ + 1, 4, 7, 9, 9, 10, 4, 6, 8, 9, 9, 10, 7, 7, 9, 10, 10, 11, 8, 9, 10, 11, 11, + 11, 8, 9, 10, 11, 11, 12, 9, 10, 11, 12, 12, 12, +] as const; + +const t8l = [ + 2, 4, 7, 9, 9, 10, 4, 4, 6, 10, 10, 10, 7, 6, 8, 10, 10, 11, 9, 10, 10, 11, + 11, 12, 9, 9, 10, 11, 12, 12, 10, 10, 11, 11, 13, 13, +] as const; + +const t9l = [ + 3, 4, 6, 7, 9, 10, 4, 5, 6, 7, 8, 10, 5, 6, 7, 8, 9, 10, 7, 7, 8, 9, 9, 10, 8, + 8, 9, 9, 10, 11, 9, 9, 10, 10, 11, 11, +] as const; + +const t10l = [ + 1, 4, 7, 9, 10, 10, 10, 11, 4, 6, 8, 9, 10, 11, 10, 10, 7, 8, 9, 10, 11, 12, + 11, 11, 8, 9, 10, 11, 12, 12, 11, 12, 9, 10, 11, 12, 12, 12, 12, 12, 10, 11, + 12, 12, 13, 13, 12, 13, 9, 10, 11, 12, 12, 12, 13, 13, 10, 10, 11, 12, 12, 13, + 13, 13, +] as const; + +const t11l = [ + 2, 4, 6, 8, 9, 10, 9, 10, 4, 5, 6, 8, 10, 10, 9, 10, 6, 7, 8, 9, 10, 11, 10, + 10, 8, 8, 9, 11, 10, 12, 10, 11, 9, 10, 10, 11, 11, 12, 11, 12, 9, 10, 11, 12, + 12, 13, 12, 13, 9, 9, 9, 10, 11, 12, 12, 12, 9, 9, 10, 11, 12, 12, 12, 12, +] as const; + +const t12l = [ + 4, 4, 6, 8, 9, 10, 10, 10, 4, 5, 6, 7, 9, 9, 10, 10, 6, 6, 7, 8, 9, 10, 9, 10, + 7, 7, 8, 8, 9, 10, 10, 10, 8, 8, 9, 9, 10, 10, 10, 11, 9, 9, 10, 10, 10, 11, + 10, 11, 9, 9, 9, 10, 10, 11, 11, 12, 10, 10, 10, 11, 11, 11, 11, 12, +] as const; + +const t13l = [ + 1, 5, 7, 8, 9, 10, 10, 11, 10, 11, 12, 12, 13, 13, 14, 14, 4, 6, 8, 9, 10, 10, + 11, 11, 11, 11, 12, 12, 13, 14, 14, 14, 7, 8, 9, 10, 11, 11, 12, 12, 11, 12, + 12, 13, 13, 14, 15, 15, 8, 9, 10, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, + 15, 15, 9, 9, 11, 11, 12, 12, 13, 13, 12, 13, 13, 14, 14, 15, 15, 16, 10, 10, + 11, 12, 12, 12, 13, 13, 13, 13, 14, 13, 15, 15, 16, 16, 10, 11, 12, 12, 13, + 13, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, 11, 11, 12, 13, 13, 13, 14, 14, + 14, 14, 15, 15, 15, 16, 18, 18, 10, 10, 11, 12, 12, 13, 13, 14, 14, 14, 14, + 15, 15, 16, 17, 17, 11, 11, 12, 12, 13, 13, 13, 15, 14, 15, 15, 16, 16, 16, + 18, 17, 11, 12, 12, 13, 13, 14, 14, 15, 14, 15, 16, 15, 16, 17, 18, 19, 12, + 12, 12, 13, 14, 14, 14, 14, 15, 15, 15, 16, 17, 17, 17, 18, 12, 13, 13, 14, + 14, 15, 14, 15, 16, 16, 17, 17, 17, 18, 18, 18, 13, 13, 14, 15, 15, 15, 16, + 16, 16, 16, 16, 17, 18, 17, 18, 18, 14, 14, 14, 15, 15, 15, 17, 16, 16, 19, + 17, 17, 17, 19, 18, 18, 13, 14, 15, 16, 16, 16, 17, 16, 17, 17, 18, 18, 21, + 20, 21, 18, +] as const; + +const t15l = [ + 3, 5, 6, 8, 8, 9, 10, 10, 10, 11, 11, 12, 12, 12, 13, 14, 5, 5, 7, 8, 9, 9, + 10, 10, 10, 11, 11, 12, 12, 12, 13, 13, 6, 7, 7, 8, 9, 9, 10, 10, 10, 11, 11, + 12, 12, 13, 13, 13, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, + 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 12, 12, 12, 13, 13, 13, 9, 9, 9, 10, 10, + 10, 11, 11, 11, 11, 12, 12, 13, 13, 13, 14, 10, 9, 10, 10, 10, 11, 11, 11, 11, + 12, 12, 12, 13, 13, 14, 14, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, + 13, 13, 13, 14, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 14, 14, + 14, 10, 10, 11, 11, 11, 11, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 11, 11, + 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 14, 15, 14, 11, 11, 11, 11, 12, + 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 15, 12, 12, 11, 12, 12, 12, 13, 13, + 13, 13, 13, 13, 14, 14, 15, 15, 12, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, + 14, 14, 14, 15, 15, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, + 14, 15, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15, +] as const; + +const t16_5l = [ + 1, 5, 7, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 13, 14, 11, 4, 6, 8, 9, 10, + 11, 11, 11, 12, 12, 12, 13, 14, 13, 14, 11, 7, 8, 9, 10, 11, 11, 12, 12, 13, + 12, 13, 13, 13, 14, 14, 12, 9, 9, 10, 11, 11, 12, 12, 12, 13, 13, 14, 14, 14, + 15, 15, 13, 10, 10, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 12, + 10, 10, 11, 11, 12, 13, 13, 14, 13, 14, 14, 15, 15, 15, 16, 13, 11, 11, 11, + 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 16, 13, 11, 11, 12, 12, 13, 13, + 13, 14, 14, 15, 15, 15, 15, 17, 17, 13, 11, 12, 12, 13, 13, 13, 14, 14, 15, + 15, 15, 15, 16, 16, 16, 13, 12, 12, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, + 15, 16, 15, 14, 12, 13, 12, 13, 14, 14, 14, 14, 15, 16, 16, 16, 17, 17, 16, + 13, 13, 13, 13, 13, 14, 14, 15, 16, 16, 16, 16, 16, 16, 15, 16, 14, 13, 14, + 14, 14, 14, 15, 15, 15, 15, 17, 16, 16, 16, 16, 18, 14, 15, 14, 14, 14, 15, + 15, 16, 16, 16, 18, 17, 17, 17, 19, 17, 14, 14, 15, 13, 14, 16, 16, 15, 16, + 16, 17, 18, 17, 19, 17, 16, 14, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14, + 14, 14, 14, 14, 12, +] as const; + +const t16l = [ + 1, 5, 7, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 13, 14, 10, 4, 6, 8, 9, 10, + 11, 11, 11, 12, 12, 12, 13, 14, 13, 14, 10, 7, 8, 9, 10, 11, 11, 12, 12, 13, + 12, 13, 13, 13, 14, 14, 11, 9, 9, 10, 11, 11, 12, 12, 12, 13, 13, 14, 14, 14, + 15, 15, 12, 10, 10, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 11, + 10, 10, 11, 11, 12, 13, 13, 14, 13, 14, 14, 15, 15, 15, 16, 12, 11, 11, 11, + 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 16, 12, 11, 11, 12, 12, 13, 13, + 13, 14, 14, 15, 15, 15, 15, 17, 17, 12, 11, 12, 12, 13, 13, 13, 14, 14, 15, + 15, 15, 15, 16, 16, 16, 12, 12, 12, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, + 15, 16, 15, 13, 12, 13, 12, 13, 14, 14, 14, 14, 15, 16, 16, 16, 17, 17, 16, + 12, 13, 13, 13, 13, 14, 14, 15, 16, 16, 16, 16, 16, 16, 15, 16, 13, 13, 14, + 14, 14, 14, 15, 15, 15, 15, 17, 16, 16, 16, 16, 18, 13, 15, 14, 14, 14, 15, + 15, 16, 16, 16, 18, 17, 17, 17, 19, 17, 13, 14, 15, 13, 14, 16, 16, 15, 16, + 16, 17, 18, 17, 19, 17, 16, 13, 10, 10, 10, 11, 11, 12, 12, 12, 13, 13, 13, + 13, 13, 13, 13, 10, +] as const; + +const t24l = [ + 4, 5, 7, 8, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 13, 10, 5, 6, 7, 8, 9, 10, + 10, 11, 11, 11, 12, 12, 12, 12, 12, 10, 7, 7, 8, 9, 9, 10, 10, 11, 11, 11, 11, + 12, 12, 12, 13, 9, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 9, + 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 12, 12, 12, 12, 13, 9, 10, 9, 10, 10, 10, + 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, + 12, 12, 12, 12, 12, 13, 9, 11, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, + 13, 13, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 10, + 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 10, 12, 11, 11, + 11, 11, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 10, 12, 12, 11, 11, 11, 12, + 12, 12, 12, 12, 12, 13, 13, 13, 13, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 13, 13, 13, 13, 13, 10, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, + 13, 13, 13, 10, 13, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, + 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 6, +] as const; + +const t32l = [ + 1 + 0, + 4 + 1, + 4 + 1, + 5 + 2, + 4 + 1, + 6 + 2, + 5 + 2, + 6 + 3, + 4 + 1, + 5 + 2, + 5 + 2, + 6 + 3, + 5 + 2, + 6 + 3, + 6 + 3, + 6 + 4, +] as const; + +const t33l = [ + 4 + 0, + 4 + 1, + 4 + 1, + 4 + 2, + 4 + 1, + 4 + 2, + 4 + 2, + 4 + 3, + 4 + 1, + 4 + 2, + 4 + 2, + 4 + 3, + 4 + 2, + 4 + 3, + 4 + 3, + 4 + 4, +] as const; + +const ht: readonly HuffCodeTab[] = [ + { xlen: 0, linmax: 0 }, + { xlen: 2, linmax: 0, table: t1HB, hlen: t1l }, + { xlen: 3, linmax: 0, table: t2HB, hlen: t2l }, + { xlen: 3, linmax: 0, table: t3HB, hlen: t3l }, + { xlen: 0, linmax: 0 }, + { xlen: 4, linmax: 0, table: t5HB, hlen: t5l }, + { xlen: 4, linmax: 0, table: t6HB, hlen: t6l }, + { xlen: 6, linmax: 0, table: t7HB, hlen: t7l }, + { xlen: 6, linmax: 0, table: t8HB, hlen: t8l }, + { xlen: 6, linmax: 0, table: t9HB, hlen: t9l }, + { xlen: 8, linmax: 0, table: t10HB, hlen: t10l }, + { xlen: 8, linmax: 0, table: t11HB, hlen: t11l }, + { xlen: 8, linmax: 0, table: t12HB, hlen: t12l }, + { xlen: 16, linmax: 0, table: t13HB, hlen: t13l }, + { xlen: 0, linmax: 0, hlen: t16_5l }, + { xlen: 16, linmax: 0, table: t15HB, hlen: t15l }, + { xlen: 1, linmax: 1, table: t16HB, hlen: t16l }, + { xlen: 2, linmax: 3, table: t16HB, hlen: t16l }, + { xlen: 3, linmax: 7, table: t16HB, hlen: t16l }, + { xlen: 4, linmax: 15, table: t16HB, hlen: t16l }, + { xlen: 6, linmax: 63, table: t16HB, hlen: t16l }, + { xlen: 8, linmax: 255, table: t16HB, hlen: t16l }, + { xlen: 10, linmax: 1023, table: t16HB, hlen: t16l }, + { xlen: 13, linmax: 8191, table: t16HB, hlen: t16l }, + { xlen: 4, linmax: 15, table: t24HB, hlen: t24l }, + { xlen: 5, linmax: 31, table: t24HB, hlen: t24l }, + { xlen: 6, linmax: 63, table: t24HB, hlen: t24l }, + { xlen: 7, linmax: 127, table: t24HB, hlen: t24l }, + { xlen: 8, linmax: 255, table: t24HB, hlen: t24l }, + { xlen: 9, linmax: 511, table: t24HB, hlen: t24l }, + { xlen: 11, linmax: 2047, table: t24HB, hlen: t24l }, + { xlen: 13, linmax: 8191, table: t24HB, hlen: t24l }, + { xlen: 0, linmax: 0, table: t32HB, hlen: t32l }, + { xlen: 0, linmax: 0, table: t33HB, hlen: t33l }, +]; + +export { t32l, t33l, ht }; diff --git a/packages/mp3-encoder/src/lame/Takehiro.ts b/packages/mp3-encoder/src/lame/Takehiro.ts new file mode 100644 index 0000000000..5ccfaa2066 --- /dev/null +++ b/packages/mp3-encoder/src/lame/Takehiro.ts @@ -0,0 +1,1208 @@ +import { Bits } from './Bits'; +import type { CalcNoiseData } from './CalcNoiseData'; +import { GrInfo } from './GrInfo'; +import type { IIISideInfo } from './IIISideInfo'; +import type { LameInternalFlags } from './LameInternalFlags'; +import { QuantizePVT } from './QuantizePVT'; +import * as tables from './Tables'; +import { fillArray } from './arrays'; +import { assert } from './assert'; +import { NORM_TYPE, SBMAX_l, SBPSY_l, SHORT_TYPE } from './constants'; + +export class Takehiro { + private static readonly LARGE_BITS = 100000; + + private readonly qupvt: QuantizePVT; + + constructor(qupvt: QuantizePVT) { + this.qupvt = qupvt; + } + + private readonly largetbl = [ + 0x010004, 0x050005, 0x070007, 0x090008, 0x0a0009, 0x0a000a, 0x0b000a, + 0x0b000b, 0x0c000b, 0x0c000c, 0x0c000c, 0x0d000c, 0x0d000c, 0x0d000c, + 0x0e000d, 0x0a000a, 0x040005, 0x060006, 0x080007, 0x090008, 0x0a0009, + 0x0b000a, 0x0b000a, 0x0b000b, 0x0c000b, 0x0c000b, 0x0c000c, 0x0d000c, + 0x0e000c, 0x0d000c, 0x0e000c, 0x0a000a, 0x070007, 0x080007, 0x090008, + 0x0a0009, 0x0b0009, 0x0b000a, 0x0c000a, 0x0c000b, 0x0d000b, 0x0c000b, + 0x0d000b, 0x0d000c, 0x0d000c, 0x0e000c, 0x0e000d, 0x0b0009, 0x090008, + 0x090008, 0x0a0009, 0x0b0009, 0x0b000a, 0x0c000a, 0x0c000a, 0x0c000b, + 0x0d000b, 0x0d000b, 0x0e000b, 0x0e000c, 0x0e000c, 0x0f000c, 0x0f000c, + 0x0c0009, 0x0a0009, 0x0a0009, 0x0b0009, 0x0b000a, 0x0c000a, 0x0c000a, + 0x0d000a, 0x0d000b, 0x0d000b, 0x0e000b, 0x0e000c, 0x0e000c, 0x0f000c, + 0x0f000c, 0x0f000d, 0x0b0009, 0x0a000a, 0x0a0009, 0x0b000a, 0x0b000a, + 0x0c000a, 0x0d000a, 0x0d000b, 0x0e000b, 0x0d000b, 0x0e000b, 0x0e000c, + 0x0f000c, 0x0f000c, 0x0f000c, 0x10000c, 0x0c0009, 0x0b000a, 0x0b000a, + 0x0b000a, 0x0c000a, 0x0d000a, 0x0d000b, 0x0d000b, 0x0d000b, 0x0e000b, + 0x0e000c, 0x0e000c, 0x0e000c, 0x0f000c, 0x0f000c, 0x10000d, 0x0c0009, + 0x0b000b, 0x0b000a, 0x0c000a, 0x0c000a, 0x0d000b, 0x0d000b, 0x0d000b, + 0x0e000b, 0x0e000c, 0x0f000c, 0x0f000c, 0x0f000c, 0x0f000c, 0x11000d, + 0x11000d, 0x0c000a, 0x0b000b, 0x0c000b, 0x0c000b, 0x0d000b, 0x0d000b, + 0x0d000b, 0x0e000b, 0x0e000b, 0x0f000b, 0x0f000c, 0x0f000c, 0x0f000c, + 0x10000c, 0x10000d, 0x10000d, 0x0c000a, 0x0c000b, 0x0c000b, 0x0c000b, + 0x0d000b, 0x0d000b, 0x0e000b, 0x0e000b, 0x0f000c, 0x0f000c, 0x0f000c, + 0x0f000c, 0x10000c, 0x0f000d, 0x10000d, 0x0f000d, 0x0d000a, 0x0c000c, + 0x0d000b, 0x0c000b, 0x0d000b, 0x0e000b, 0x0e000c, 0x0e000c, 0x0e000c, + 0x0f000c, 0x10000c, 0x10000c, 0x10000d, 0x11000d, 0x11000d, 0x10000d, + 0x0c000a, 0x0d000c, 0x0d000c, 0x0d000b, 0x0d000b, 0x0e000b, 0x0e000c, + 0x0f000c, 0x10000c, 0x10000c, 0x10000c, 0x10000c, 0x10000d, 0x10000d, + 0x0f000d, 0x10000d, 0x0d000a, 0x0d000c, 0x0e000c, 0x0e000c, 0x0e000c, + 0x0e000c, 0x0f000c, 0x0f000c, 0x0f000c, 0x0f000c, 0x11000c, 0x10000d, + 0x10000d, 0x10000d, 0x10000d, 0x12000d, 0x0d000a, 0x0f000c, 0x0e000c, + 0x0e000c, 0x0e000c, 0x0f000c, 0x0f000c, 0x10000c, 0x10000c, 0x10000d, + 0x12000d, 0x11000d, 0x11000d, 0x11000d, 0x13000d, 0x11000d, 0x0d000a, + 0x0e000d, 0x0f000c, 0x0d000c, 0x0e000c, 0x10000c, 0x10000c, 0x0f000c, + 0x10000d, 0x10000d, 0x11000d, 0x12000d, 0x11000d, 0x13000d, 0x11000d, + 0x10000d, 0x0d000a, 0x0a0009, 0x0a0009, 0x0a0009, 0x0b0009, 0x0b0009, + 0x0c0009, 0x0c0009, 0x0c0009, 0x0d0009, 0x0d0009, 0x0d0009, 0x0d000a, + 0x0d000a, 0x0d000a, 0x0d000a, 0x0a0006, + ] as const; + + private readonly table23 = [ + 0x010002, 0x040003, 0x070007, 0x040004, 0x050004, 0x070007, 0x060006, + 0x070007, 0x080008, + ] as const; + + private readonly table56 = [ + 0x010003, 0x040004, 0x070006, 0x080008, 0x040004, 0x050004, 0x080006, + 0x090007, 0x070005, 0x080006, 0x090007, 0x0a0008, 0x080007, 0x080007, + 0x090008, 0x0a0009, + ] as const; + + private readonly scfsi_band = [0, 6, 11, 16, 21] as const; + + private readonly subdv_table = [ + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 1], + [1, 1], + [1, 1], + [1, 2], + [2, 2], + [2, 3], + [2, 3], + [3, 4], + [3, 4], + [3, 4], + [4, 5], + [4, 5], + [4, 6], + [5, 6], + [5, 6], + [5, 7], + [6, 7], + [6, 7], + ] as const; + + private quantize_lines_xrpow_01( + l: number, + istep: number, + xr: Float32Array, + xrPos: number, + ix: Int32Array, + ixPos: number + ) { + const compareval0 = (1.0 - 0.4054) / istep; + + assert(l > 0); + l >>= 1; + while (l-- !== 0) { + ix[ixPos++] = compareval0 > xr[xrPos++] ? 0 : 1; + ix[ixPos++] = compareval0 > xr[xrPos++] ? 0 : 1; + } + } + + private quantize_lines_xrpow( + l: number, + istep: number, + xr: Float32Array, + xrPos: number, + ix: Int32Array, + ixPos: number + ) { + assert(l > 0); + + l >>= 1; + const remaining = l % 2; + l >>= 1; + while (l-- !== 0) { + let x0 = xr[xrPos++] * istep; + let x1 = xr[xrPos++] * istep; + const rx0 = Math.trunc(x0); + let x2 = xr[xrPos++] * istep; + const rx1 = Math.trunc(x1); + let x3 = xr[xrPos++] * istep; + const rx2 = Math.trunc(x2); + x0 += this.qupvt.adj43(rx0); + const rx3 = Math.trunc(x3); + x1 += this.qupvt.adj43(rx1); + ix[ixPos++] = Math.trunc(x0); + x2 += this.qupvt.adj43(rx2); + ix[ixPos++] = Math.trunc(x1); + x3 += this.qupvt.adj43(rx3); + ix[ixPos++] = Math.trunc(x2); + ix[ixPos++] = Math.trunc(x3); + } + if (remaining !== 0) { + let x0 = xr[xrPos++] * istep; + let x1 = xr[xrPos++] * istep; + const rx0 = Math.trunc(x0); + const rx1 = Math.trunc(x1); + x0 += this.qupvt.adj43(rx0); + x1 += this.qupvt.adj43(rx1); + ix[ixPos++] = Math.trunc(x0); + ix[ixPos++] = Math.trunc(x1); + } + } + + private quantize_xrpow( + xp: Float32Array, + pi: Int32Array, + istep: number, + codInfo: GrInfo, + prevNoise: CalcNoiseData | null + ) { + let sfb; + let sfbmax; + let j = 0; + let accumulate = 0; + let accumulate01 = 0; + let xpPos = 0; + const iData = pi; + let iDataPos = 0; + let acc_iData = iData; + let acc_iDataPos = 0; + let acc_xp = xp; + let acc_xpPos = 0; + + const prev_data_use = + prevNoise !== null && codInfo.global_gain === prevNoise.global_gain; + + if (codInfo.block_type === SHORT_TYPE) sfbmax = 38; + else sfbmax = 21; + + for (sfb = 0; sfb <= sfbmax; sfb++) { + let step = -1; + + if (prev_data_use || codInfo.block_type === NORM_TYPE) { + step = + codInfo.global_gain - + ((codInfo.scalefac[sfb] + + (codInfo.preflag !== 0 ? this.qupvt.pretab[sfb] : 0)) << + (codInfo.scalefac_scale + 1)) - + codInfo.subblock_gain[codInfo.window[sfb]] * 8; + } + assert(codInfo.width[sfb] >= 0); + if (prev_data_use && prevNoise.step[sfb] === step) { + if (accumulate !== 0) { + this.quantize_lines_xrpow( + accumulate, + istep, + acc_xp, + acc_xpPos, + acc_iData, + acc_iDataPos + ); + accumulate = 0; + } + if (accumulate01 !== 0) { + this.quantize_lines_xrpow_01( + accumulate01, + istep, + acc_xp, + acc_xpPos, + acc_iData, + acc_iDataPos + ); + accumulate01 = 0; + } + } else { + let l = codInfo.width[sfb]; + + if (j + codInfo.width[sfb] > codInfo.max_nonzero_coeff) { + const usefullsize = codInfo.max_nonzero_coeff - j + 1; + fillArray(pi, codInfo.max_nonzero_coeff, 576, 0); + l = usefullsize; + + if (l < 0) { + l = 0; + } + + sfb = sfbmax + 1; + } + + if (accumulate === 0 && accumulate01 === 0) { + acc_iData = iData; + acc_iDataPos = iDataPos; + acc_xp = xp; + acc_xpPos = xpPos; + } + if ( + prevNoise !== null && + prevNoise.sfb_count1 > 0 && + sfb >= prevNoise.sfb_count1 && + prevNoise.step[sfb] > 0 && + step >= prevNoise.step[sfb] + ) { + if (accumulate !== 0) { + this.quantize_lines_xrpow( + accumulate, + istep, + acc_xp, + acc_xpPos, + acc_iData, + acc_iDataPos + ); + accumulate = 0; + acc_iData = iData; + acc_iDataPos = iDataPos; + acc_xp = xp; + acc_xpPos = xpPos; + } + accumulate01 += l; + } else { + if (accumulate01 !== 0) { + this.quantize_lines_xrpow_01( + accumulate01, + istep, + acc_xp, + acc_xpPos, + acc_iData, + acc_iDataPos + ); + accumulate01 = 0; + acc_iData = iData; + acc_iDataPos = iDataPos; + acc_xp = xp; + acc_xpPos = xpPos; + } + accumulate += l; + } + + if (l <= 0) { + if (accumulate01 !== 0) { + this.quantize_lines_xrpow_01( + accumulate01, + istep, + acc_xp, + acc_xpPos, + acc_iData, + acc_iDataPos + ); + accumulate01 = 0; + } + if (accumulate !== 0) { + this.quantize_lines_xrpow( + accumulate, + istep, + acc_xp, + acc_xpPos, + acc_iData, + acc_iDataPos + ); + accumulate = 0; + } + + break; + } + } + if (sfb <= sfbmax) { + iDataPos += codInfo.width[sfb]; + xpPos += codInfo.width[sfb]; + j += codInfo.width[sfb]; + } + } + + if (accumulate !== 0) { + this.quantize_lines_xrpow( + accumulate, + istep, + acc_xp, + acc_xpPos, + acc_iData, + acc_iDataPos + ); + } + + if (accumulate01 !== 0) { + this.quantize_lines_xrpow_01( + accumulate01, + istep, + acc_xp, + acc_xpPos, + acc_iData, + acc_iDataPos + ); + } + } + + private ix_max(ix: Int32Array, ixPos: number, endPos: number) { + let max1 = 0; + let max2 = 0; + + do { + const x1 = ix[ixPos++]; + const x2 = ix[ixPos++]; + if (max1 < x1) max1 = x1; + + if (max2 < x2) max2 = x2; + } while (ixPos < endPos); + if (max1 < max2) max1 = max2; + return max1; + } + + private count_bit_ESC( + ix: Int32Array, + ixPos: number, + end: number, + t1: number, + t2: number, + s: Bits + ) { + const linbits = tables.ht[t1].xlen * 65536 + tables.ht[t2].xlen; + let sum = 0; + do { + let x = ix[ixPos++]; + let y = ix[ixPos++]; + + if (x !== 0) { + if (x > 14) { + x = 15; + sum += linbits; + } + x *= 16; + } + + if (y !== 0) { + if (y > 14) { + y = 15; + sum += linbits; + } + x += y; + } + + sum += this.largetbl[x]; + } while (ixPos < end); + + const sum2 = sum & 0xffff; + sum >>= 16; + + if (sum > sum2) { + sum = sum2; + t1 = t2; + } + + s.bits += sum; + return t1; + } + + private count_bit_noESC(ix: Int32Array, ixPos: number, end: number, s: Bits) { + let sum1 = 0; + const hlen1 = tables.ht[1].hlen; + assert(hlen1 !== undefined); + + do { + const x = ix[ixPos + 0] * 2 + ix[ixPos + 1]; + ixPos += 2; + sum1 += hlen1[x]; + } while (ixPos < end); + + s.bits += sum1; + return 1; + } + + private count_bit_noESC_from2( + ix: Int32Array, + ixPos: number, + end: number, + t1: number, + s: Bits + ) { + let sum = 0; + const { xlen } = tables.ht[t1]; + let hlen; + if (t1 === 2) hlen = this.table23; + else hlen = this.table56; + + do { + const x = ix[ixPos + 0] * xlen + ix[ixPos + 1]; + ixPos += 2; + sum += hlen[x]; + } while (ixPos < end); + + const sum2 = sum & 0xffff; + sum >>= 16; + + if (sum > sum2) { + sum = sum2; + t1++; + } + + s.bits += sum; + return t1; + } + + private count_bit_noESC_from3( + ix: Int32Array, + ixPos: number, + end: number, + t1: number, + s: Bits + ) { + let sum1 = 0; + let sum2 = 0; + let sum3 = 0; + const { xlen } = tables.ht[t1]; + const hlen1 = tables.ht[t1].hlen; + const hlen2 = tables.ht[t1 + 1].hlen; + const hlen3 = tables.ht[t1 + 2].hlen; + + assert(hlen1 !== undefined); + assert(hlen2 !== undefined); + assert(hlen3 !== undefined); + + do { + const x = ix[ixPos + 0] * xlen + ix[ixPos + 1]; + ixPos += 2; + sum1 += hlen1[x]; + sum2 += hlen2[x]; + sum3 += hlen3[x]; + } while (ixPos < end); + let t = t1; + if (sum1 > sum2) { + sum1 = sum2; + t++; + } + if (sum1 > sum3) { + sum1 = sum3; + t = t1 + 2; + } + s.bits += sum1; + + return t; + } + + private readonly huf_tbl_noESC = [ + 1, 2, 5, 7, 7, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, + ] as const; + + private choose_table(ix: Int32Array, ixPos: number, endPos: number, s: Bits) { + let max = this.ix_max(ix, ixPos, endPos); + + switch (max) { + case 0: + return max; + + case 1: + return this.count_bit_noESC(ix, ixPos, endPos, s); + + case 2: + case 3: + return this.count_bit_noESC_from2( + ix, + ixPos, + endPos, + this.huf_tbl_noESC[max - 1], + s + ); + + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + return this.count_bit_noESC_from3( + ix, + ixPos, + endPos, + this.huf_tbl_noESC[max - 1], + s + ); + + default: + if (max > QuantizePVT.IXMAX_VAL) { + s.bits = Takehiro.LARGE_BITS; + return -1; + } + max -= 15; + let choice2; + for (choice2 = 24; choice2 < 32; choice2++) { + if (tables.ht[choice2].linmax >= max) { + break; + } + } + let choice; + for (choice = choice2 - 8; choice < 24; choice++) { + if (tables.ht[choice].linmax >= max) { + break; + } + } + return this.count_bit_ESC(ix, ixPos, endPos, choice, choice2, s); + } + } + + noquant_count_bits( + gfc: LameInternalFlags, + gi: GrInfo, + prev_noise: CalcNoiseData | null + ) { + const ix = gi.l3_enc; + let i = Math.min(576, ((gi.max_nonzero_coeff + 2) >> 1) << 1); + + if (prev_noise !== null) prev_noise.sfb_count1 = 0; + + for (; i > 1; i -= 2) if ((ix[i - 1] | ix[i - 2]) !== 0) break; + gi.count1 = i; + + let a1 = 0; + let a2 = 0; + for (; i > 3; i -= 4) { + if (((ix[i - 1] | ix[i - 2] | ix[i - 3] | ix[i - 4]) & 0x7fffffff) > 1) { + break; + } + const p = ((ix[i - 4] * 2 + ix[i - 3]) * 2 + ix[i - 2]) * 2 + ix[i - 1]; + a1 += tables.t32l[p]; + a2 += tables.t33l[p]; + } + let bits = a1; + gi.count1table_select = 0; + if (a1 > a2) { + bits = a2; + gi.count1table_select = 1; + } + + gi.count1bits = bits; + gi.big_values = i; + if (i === 0) return bits; + + if (gi.block_type === SHORT_TYPE) { + a1 = 3 * gfc.scalefac_band.s[3]; + if (a1 > gi.big_values) a1 = gi.big_values; + a2 = gi.big_values; + } else if (gi.block_type === NORM_TYPE) { + assert(i <= 576); + + a1 = gfc.bv_scf[i - 2]; + gi.region0_count = gfc.bv_scf[i - 2]; + a2 = gfc.bv_scf[i - 1]; + gi.region1_count = gfc.bv_scf[i - 1]; + + assert(a1 + a2 + 2 < SBPSY_l); + a2 = gfc.scalefac_band.l[a1 + a2 + 2]; + a1 = gfc.scalefac_band.l[a1 + 1]; + if (a2 < i) { + const bi = new Bits(bits); + gi.table_select[2] = this.choose_table(ix, a2, i, bi); + bits = bi.bits; + } + } else { + gi.region0_count = 7; + + gi.region1_count = SBMAX_l - 1 - 7 - 1; + a1 = gfc.scalefac_band.l[7 + 1]; + a2 = i; + if (a1 > a2) { + a1 = a2; + } + } + + a1 = Math.min(a1, i); + a2 = Math.min(a2, i); + + assert(a1 >= 0); + assert(a2 >= 0); + + if (a1 > 0) { + const bi = new Bits(bits); + gi.table_select[0] = this.choose_table(ix, 0, a1, bi); + bits = bi.bits; + } + if (a1 < a2) { + const bi = new Bits(bits); + gi.table_select[1] = this.choose_table(ix, a1, a2, bi); + bits = bi.bits; + } + if (gfc.use_best_huffman === 2) { + gi.part2_3_length = bits; + this.best_huffman_divide(gfc, gi); + bits = gi.part2_3_length; + } + + if (prev_noise !== null) { + if (gi.block_type === NORM_TYPE) { + let sfb = 0; + while (gfc.scalefac_band.l[sfb] < gi.big_values) { + sfb++; + } + prev_noise.sfb_count1 = sfb; + } + } + + return bits; + } + + count_bits( + gfc: LameInternalFlags, + xr: Float32Array, + gi: GrInfo, + prev_noise: CalcNoiseData | null + ) { + const ix = gi.l3_enc; + + const w = QuantizePVT.IXMAX_VAL / this.qupvt.ipow20(gi.global_gain); + + if (gi.xrpow_max > w) return Takehiro.LARGE_BITS; + + this.quantize_xrpow( + xr, + ix, + this.qupvt.ipow20(gi.global_gain), + gi, + prev_noise + ); + + if ((gfc.substep_shaping & 2) !== 0) { + let j = 0; + + const gain = gi.global_gain + gi.scalefac_scale; + const roundfac = 0.634521682242439 / this.qupvt.ipow20(gain); + for (let sfb = 0; sfb < gi.sfbmax; sfb++) { + const width = gi.width[sfb]; + assert(width >= 0); + if (gfc.pseudohalf[sfb] === 0) { + j += width; + } else { + let k; + for (k = j, j += width; k < j; ++k) { + ix[k] = xr[k] >= roundfac ? ix[k] : 0; + } + } + } + } + return this.noquant_count_bits(gfc, gi, prev_noise); + } + + private recalc_divide_init( + gfc: LameInternalFlags, + cod_info: GrInfo, + ix: Int32Array, + r01_bits: Int32Array, + r01_div: Int32Array, + r0_tbl: Int32Array, + r1_tbl: Int32Array + ) { + const bigv = cod_info.big_values; + + for (let r0 = 0; r0 <= 7 + 15; r0++) { + r01_bits[r0] = Takehiro.LARGE_BITS; + } + + for (let r0 = 0; r0 < 16; r0++) { + const a1 = gfc.scalefac_band.l[r0 + 1]; + if (a1 >= bigv) break; + let r0bits = 0; + let bi = new Bits(r0bits); + const r0t = this.choose_table(ix, 0, a1, bi); + r0bits = bi.bits; + + for (let r1 = 0; r1 < 8; r1++) { + const a2 = gfc.scalefac_band.l[r0 + r1 + 2]; + if (a2 >= bigv) break; + let bits = r0bits; + bi = new Bits(bits); + const r1t = this.choose_table(ix, a1, a2, bi); + bits = bi.bits; + if (r01_bits[r0 + r1] > bits) { + r01_bits[r0 + r1] = bits; + r01_div[r0 + r1] = r0; + r0_tbl[r0 + r1] = r0t; + r1_tbl[r0 + r1] = r1t; + } + } + } + } + + private recalc_divide_sub( + gfc: LameInternalFlags, + cod_info2: GrInfo, + gi: GrInfo, + ix: Int32Array, + r01_bits: Int32Array, + r01_div: Int32Array, + r0_tbl: Int32Array, + r1_tbl: Int32Array + ) { + const bigv = cod_info2.big_values; + + for (let r2 = 2; r2 < SBMAX_l + 1; r2++) { + const a2 = gfc.scalefac_band.l[r2]; + if (a2 >= bigv) break; + let bits = r01_bits[r2 - 2] + cod_info2.count1bits; + if (gi.part2_3_length <= bits) break; + + const bi = new Bits(bits); + const r2t = this.choose_table(ix, a2, bigv, bi); + bits = bi.bits; + if (gi.part2_3_length <= bits) continue; + + gi.assign(cod_info2); + gi.part2_3_length = bits; + gi.region0_count = r01_div[r2 - 2]; + gi.region1_count = r2 - 2 - r01_div[r2 - 2]; + gi.table_select[0] = r0_tbl[r2 - 2]; + gi.table_select[1] = r1_tbl[r2 - 2]; + gi.table_select[2] = r2t; + } + } + + best_huffman_divide(gfc: LameInternalFlags, gi: GrInfo) { + const cod_info2 = new GrInfo(); + const ix = gi.l3_enc; + const r01_bits = new Int32Array(7 + 15 + 1); + const r01_div = new Int32Array(7 + 15 + 1); + const r0_tbl = new Int32Array(7 + 15 + 1); + const r1_tbl = new Int32Array(7 + 15 + 1); + + if (gi.block_type === SHORT_TYPE && gfc.mode_gr === 1) return; + + cod_info2.assign(gi); + if (gi.block_type === NORM_TYPE) { + this.recalc_divide_init(gfc, gi, ix, r01_bits, r01_div, r0_tbl, r1_tbl); + this.recalc_divide_sub( + gfc, + cod_info2, + gi, + ix, + r01_bits, + r01_div, + r0_tbl, + r1_tbl + ); + } + let i = cod_info2.big_values; + if (i === 0 || (ix[i - 2] | ix[i - 1]) > 1) return; + + i = gi.count1 + 2; + if (i > 576) return; + + cod_info2.assign(gi); + cod_info2.count1 = i; + let a1 = 0; + let a2 = 0; + + assert(i <= 576); + + for (; i > cod_info2.big_values; i -= 4) { + const p = ((ix[i - 4] * 2 + ix[i - 3]) * 2 + ix[i - 2]) * 2 + ix[i - 1]; + a1 += tables.t32l[p]; + a2 += tables.t33l[p]; + } + cod_info2.big_values = i; + + cod_info2.count1table_select = 0; + if (a1 > a2) { + a1 = a2; + cod_info2.count1table_select = 1; + } + + cod_info2.count1bits = a1; + + if (cod_info2.block_type === NORM_TYPE) { + this.recalc_divide_sub( + gfc, + cod_info2, + gi, + ix, + r01_bits, + r01_div, + r0_tbl, + r1_tbl + ); + } else { + cod_info2.part2_3_length = a1; + a1 = gfc.scalefac_band.l[7 + 1]; + if (a1 > i) { + a1 = i; + } + if (a1 > 0) { + const bi = new Bits(cod_info2.part2_3_length); + cod_info2.table_select[0] = this.choose_table(ix, 0, a1, bi); + cod_info2.part2_3_length = bi.bits; + } + if (i > a1) { + const bi = new Bits(cod_info2.part2_3_length); + cod_info2.table_select[1] = this.choose_table(ix, a1, i, bi); + cod_info2.part2_3_length = bi.bits; + } + if (gi.part2_3_length > cod_info2.part2_3_length) gi.assign(cod_info2); + } + } + + static readonly slen1_tab = [ + 0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, + ] as const; + + static readonly slen2_tab = [ + 0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3, + ] as const; + + private readonly slen1_n = [ + 1, 1, 1, 1, 8, 2, 2, 2, 4, 4, 4, 8, 8, 8, 16, 16, + ] as const; + + private readonly slen2_n = [ + 1, 2, 4, 8, 1, 2, 4, 8, 2, 4, 8, 2, 4, 8, 4, 8, + ] as const; + + private scfsi_calc(ch: number, l3_side: IIISideInfo) { + let sfb; + const gi = l3_side.tt[1][ch]; + const g0 = l3_side.tt[0][ch]; + + for (let i = 0; i < this.scfsi_band.length - 1; i++) { + for (sfb = this.scfsi_band[i]; sfb < this.scfsi_band[i + 1]; sfb++) { + if (g0.scalefac[sfb] !== gi.scalefac[sfb] && gi.scalefac[sfb] >= 0) + break; + } + if (sfb === this.scfsi_band[i + 1]) { + for (sfb = this.scfsi_band[i]; sfb < this.scfsi_band[i + 1]; sfb++) { + gi.scalefac[sfb] = -1; + } + l3_side.scfsi[ch][i] = 1; + } + } + let s1 = 0; + let c1 = 0; + for (sfb = 0; sfb < 11; sfb++) { + if (gi.scalefac[sfb] === -1) continue; + c1++; + if (s1 < gi.scalefac[sfb]) s1 = gi.scalefac[sfb]; + } + let s2 = 0; + let c2 = 0; + for (; sfb < SBPSY_l; sfb++) { + if (gi.scalefac[sfb] === -1) continue; + c2++; + if (s2 < gi.scalefac[sfb]) s2 = gi.scalefac[sfb]; + } + + for (let i = 0; i < 16; i++) { + if (s1 < this.slen1_n[i] && s2 < this.slen2_n[i]) { + const c = Takehiro.slen1_tab[i] * c1 + Takehiro.slen2_tab[i] * c2; + if (gi.part2_length > c) { + gi.part2_length = c; + gi.scalefac_compress = i; + } + } + } + } + + best_scalefac_store( + gfc: LameInternalFlags, + gr: number, + ch: number, + l3_side: IIISideInfo + ) { + const gi = l3_side.tt[gr][ch]; + let sfb; + let i; + let j; + let l; + let recalc = 0; + + j = 0; + for (sfb = 0; sfb < gi.sfbmax; sfb++) { + const width = gi.width[sfb]; + assert(width >= 0); + j += width; + for (l = -width; l < 0; l++) { + if (gi.l3_enc[l + j] !== 0) break; + } + if (l === 0) { + gi.scalefac[sfb] = -2; + recalc = -2; + } + } + + if (gi.scalefac_scale === 0 && gi.preflag === 0) { + let s = 0; + for (sfb = 0; sfb < gi.sfbmax; sfb++) + if (gi.scalefac[sfb] > 0) s |= gi.scalefac[sfb]; + + if ((s & 1) === 0 && s !== 0) { + for (sfb = 0; sfb < gi.sfbmax; sfb++) { + if (gi.scalefac[sfb] > 0) { + gi.scalefac[sfb] >>= 1; + } + } + + gi.scalefac_scale = 1; + recalc = 1; + } + } + + if (gi.preflag === 0 && gi.block_type !== SHORT_TYPE && gfc.mode_gr === 2) { + for (sfb = 11; sfb < SBPSY_l; sfb++) + if ( + gi.scalefac[sfb] < this.qupvt.pretab[sfb] && + gi.scalefac[sfb] !== -2 + ) + break; + if (sfb === SBPSY_l) { + for (sfb = 11; sfb < SBPSY_l; sfb++) + if (gi.scalefac[sfb] > 0) gi.scalefac[sfb] -= this.qupvt.pretab[sfb]; + + gi.preflag = 1; + recalc = 1; + } + } + + for (i = 0; i < 4; i++) { + l3_side.scfsi[ch][i] = 0; + } + + if ( + gfc.mode_gr === 2 && + gr === 1 && + l3_side.tt[0][ch].block_type !== SHORT_TYPE && + l3_side.tt[1][ch].block_type !== SHORT_TYPE + ) { + this.scfsi_calc(ch, l3_side); + recalc = 0; + } + for (sfb = 0; sfb < gi.sfbmax; sfb++) { + if (gi.scalefac[sfb] === -2) { + gi.scalefac[sfb] = 0; + } + } + if (recalc !== 0) { + if (gfc.mode_gr === 2) { + this.scale_bitcount(gi); + } else { + this.scale_bitcount_lsf(gfc, gi); + } + } + } + + private all_scalefactors_not_negative(scalefac: Int32Array, n: number) { + for (let i = 0; i < n; ++i) { + if (scalefac[i] < 0) return false; + } + return true; + } + + private readonly scale_short = [ + 0, 18, 36, 54, 54, 36, 54, 72, 54, 72, 90, 72, 90, 108, 108, 126, + ] as const; + + private readonly scale_mixed = [ + 0, 18, 36, 54, 51, 35, 53, 71, 52, 70, 88, 69, 87, 105, 104, 122, + ] as const; + + private readonly scale_long = [ + 0, 10, 20, 30, 33, 21, 31, 41, 32, 42, 52, 43, 53, 63, 64, 74, + ] as const; + + scale_bitcount(cod_info: GrInfo) { + let k; + let sfb; + let max_slen1 = 0; + let max_slen2 = 0; + + let tab; + const { scalefac } = cod_info; + + assert(this.all_scalefactors_not_negative(scalefac, cod_info.sfbmax)); + + if (cod_info.block_type === SHORT_TYPE) { + tab = this.scale_short; + if (cod_info.mixed_block_flag !== 0) tab = this.scale_mixed; + } else { + tab = this.scale_long; + if (cod_info.preflag === 0) { + for (sfb = 11; sfb < SBPSY_l; sfb++) + if (scalefac[sfb] < this.qupvt.pretab[sfb]) break; + + if (sfb === SBPSY_l) { + cod_info.preflag = 1; + for (sfb = 11; sfb < SBPSY_l; sfb++) + scalefac[sfb] -= this.qupvt.pretab[sfb]; + } + } + } + + for (sfb = 0; sfb < cod_info.sfbdivide; sfb++) { + if (max_slen1 < scalefac[sfb]) { + max_slen1 = scalefac[sfb]; + } + } + + for (; sfb < cod_info.sfbmax; sfb++) { + if (max_slen2 < scalefac[sfb]) { + max_slen2 = scalefac[sfb]; + } + } + + cod_info.part2_length = Takehiro.LARGE_BITS; + for (k = 0; k < 16; k++) { + if ( + max_slen1 < this.slen1_n[k] && + max_slen2 < this.slen2_n[k] && + cod_info.part2_length > tab[k] + ) { + cod_info.part2_length = tab[k]; + cod_info.scalefac_compress = k; + } + } + return cod_info.part2_length === Takehiro.LARGE_BITS; + } + + private readonly max_range_sfac_tab = [ + [15, 15, 7, 7], + [15, 15, 7, 0], + [7, 3, 0, 0], + [15, 31, 31, 0], + [7, 7, 7, 0], + [3, 3, 0, 0], + ] as const; + + private readonly log2tab = [ + 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, + ] as const; + + scale_bitcount_lsf(_gfc: LameInternalFlags, cod_info: GrInfo) { + let table_number; + let row_in_table; + let partition; + let nr_sfb; + let window; + let over; + let i; + let sfb; + const max_sfac = new Int32Array(4); + + const { scalefac } = cod_info; + + if (cod_info.preflag !== 0) { + table_number = 2; + } else { + table_number = 0; + } + + for (i = 0; i < 4; i++) { + max_sfac[i] = 0; + } + + if (cod_info.block_type === SHORT_TYPE) { + row_in_table = 1; + const partition_table = + this.qupvt.nr_of_sfb_block[table_number][row_in_table]; + for (sfb = 0, partition = 0; partition < 4; partition++) { + nr_sfb = partition_table[partition] / 3; + for (i = 0; i < nr_sfb; i++, sfb++) { + for (window = 0; window < 3; window++) { + if (scalefac[sfb * 3 + window] > max_sfac[partition]) { + max_sfac[partition] = scalefac[sfb * 3 + window]; + } + } + } + } + } else { + row_in_table = 0; + const partition_table = + this.qupvt.nr_of_sfb_block[table_number][row_in_table]; + for (sfb = 0, partition = 0; partition < 4; partition++) { + nr_sfb = partition_table[partition]; + for (i = 0; i < nr_sfb; i++, sfb++) { + if (scalefac[sfb] > max_sfac[partition]) { + max_sfac[partition] = scalefac[sfb]; + } + } + } + } + + for (over = false, partition = 0; partition < 4; partition++) { + if ( + max_sfac[partition] > this.max_range_sfac_tab[table_number][partition] + ) { + over = true; + } + } + if (!over) { + cod_info.sfb_partition_table = + this.qupvt.nr_of_sfb_block[table_number][row_in_table]; + for (partition = 0; partition < 4; partition++) { + cod_info.slen[partition] = this.log2tab[max_sfac[partition]]; + } + + const slen1 = cod_info.slen[0]; + const slen2 = cod_info.slen[1]; + const slen3 = cod_info.slen[2]; + const slen4 = cod_info.slen[3]; + + switch (table_number) { + case 0: + cod_info.scalefac_compress = + ((slen1 * 5 + slen2) << 4) + (slen3 << 2) + slen4; + break; + + case 1: + cod_info.scalefac_compress = 400 + ((slen1 * 5 + slen2) << 2) + slen3; + break; + + case 2: + cod_info.scalefac_compress = 500 + slen1 * 3 + slen2; + break; + + default: + console.warn('intensity stereo not implemented yet'); + break; + } + } + if (!over) { + assert(cod_info.sfb_partition_table !== null); + cod_info.part2_length = 0; + for (partition = 0; partition < 4; partition++) + cod_info.part2_length += + cod_info.slen[partition] * cod_info.sfb_partition_table[partition]; + } + return over; + } + + huffman_init(gfc: LameInternalFlags) { + for (let i = 2; i <= 576; i += 2) { + let scfb_anz = 0; + let bv_index; + while (gfc.scalefac_band.l[++scfb_anz] < i); + + bv_index = this.subdv_table[scfb_anz][0]; + while (gfc.scalefac_band.l[bv_index + 1] > i) bv_index--; + + if (bv_index < 0) { + bv_index = this.subdv_table[scfb_anz][0]; + } + + gfc.bv_scf[i - 2] = bv_index; + + bv_index = this.subdv_table[scfb_anz][1]; + while (gfc.scalefac_band.l[bv_index + gfc.bv_scf[i - 2] + 2] > i) + bv_index--; + + if (bv_index < 0) { + bv_index = this.subdv_table[scfb_anz][1]; + } + + gfc.bv_scf[i - 1] = bv_index; + } + } +} diff --git a/packages/mp3-encoder/src/lame/TotalBytes.ts b/packages/mp3-encoder/src/lame/TotalBytes.ts new file mode 100644 index 0000000000..37789e349e --- /dev/null +++ b/packages/mp3-encoder/src/lame/TotalBytes.ts @@ -0,0 +1,3 @@ +export class TotalBytes { + total = 0; +} diff --git a/packages/mp3-encoder/src/lame/VBRPresets.ts b/packages/mp3-encoder/src/lame/VBRPresets.ts new file mode 100644 index 0000000000..dc1a2bb696 --- /dev/null +++ b/packages/mp3-encoder/src/lame/VBRPresets.ts @@ -0,0 +1,451 @@ +import type { LameGlobalFlags } from './LameGlobalFlags'; +import type { Quality } from './Quality'; +import { VbrMode } from './VbrMode'; +import { equals } from './math'; + +interface VBRPreset { + readonly vbr_q: Quality; + readonly quant_comp: 9; + readonly quant_comp_s: 9; + readonly expY: 0 | 1; + readonly st_lrm: number; + readonly st_s: number; + readonly masking_adj: number; + readonly masking_adj_short: number; + readonly ath_lower: number; + readonly ath_curve: number; + readonly ath_sensitivity: number; + readonly interch: number; + readonly safejoint: number; + readonly sfb21mod: number; + readonly msfix: number; +} + +type PresetMap = Record; + +export class VBRPresets { + private readonly oldSwitchMap = [ + { + vbr_q: 0, + quant_comp: 9, + quant_comp_s: 9, + expY: 0, + st_lrm: 5.2, + st_s: 125, + masking_adj: -4.2, + masking_adj_short: -6.3, + ath_lower: 4.8, + ath_curve: 1, + ath_sensitivity: 0, + interch: 0, + safejoint: 2, + sfb21mod: 21, + msfix: 0.97, + }, + { + vbr_q: 1, + quant_comp: 9, + quant_comp_s: 9, + expY: 0, + st_lrm: 5.3, + st_s: 125, + masking_adj: -3.6, + masking_adj_short: -5.6, + ath_lower: 4.5, + ath_curve: 1.5, + ath_sensitivity: 0, + interch: 0, + safejoint: 2, + sfb21mod: 21, + msfix: 1.35, + }, + { + vbr_q: 2, + quant_comp: 9, + quant_comp_s: 9, + expY: 0, + st_lrm: 5.6, + st_s: 125, + masking_adj: -2.2, + masking_adj_short: -3.5, + ath_lower: 2.8, + ath_curve: 2, + ath_sensitivity: 0, + interch: 0, + safejoint: 2, + sfb21mod: 21, + msfix: 1.49, + }, + { + vbr_q: 3, + quant_comp: 9, + quant_comp_s: 9, + expY: 1, + st_lrm: 5.8, + st_s: 130, + masking_adj: -1.8, + masking_adj_short: -2.8, + ath_lower: 2.6, + ath_curve: 3, + ath_sensitivity: -4, + interch: 0, + safejoint: 2, + sfb21mod: 20, + msfix: 1.64, + }, + { + vbr_q: 4, + quant_comp: 9, + quant_comp_s: 9, + expY: 1, + st_lrm: 6, + st_s: 135, + masking_adj: -0.7, + masking_adj_short: -1.1, + ath_lower: 1.1, + ath_curve: 3.5, + ath_sensitivity: -8, + interch: 0, + safejoint: 2, + sfb21mod: 0, + msfix: 1.79, + }, + { + vbr_q: 5, + quant_comp: 9, + quant_comp_s: 9, + expY: 1, + st_lrm: 6.4, + st_s: 140, + masking_adj: 0.5, + masking_adj_short: 0.4, + ath_lower: -7.5, + ath_curve: 4, + ath_sensitivity: -12, + interch: 0.0002, + safejoint: 0, + sfb21mod: 0, + msfix: 1.95, + }, + { + vbr_q: 6, + quant_comp: 9, + quant_comp_s: 9, + expY: 1, + st_lrm: 6.6, + st_s: 145, + masking_adj: 0.67, + masking_adj_short: 0.65, + ath_lower: -14.7, + ath_curve: 6.5, + ath_sensitivity: -19, + interch: 0.0004, + safejoint: 0, + sfb21mod: 0, + msfix: 2.3, + }, + { + vbr_q: 7, + quant_comp: 9, + quant_comp_s: 9, + expY: 1, + st_lrm: 6.6, + st_s: 145, + masking_adj: 0.8, + masking_adj_short: 0.75, + ath_lower: -19.7, + ath_curve: 8, + ath_sensitivity: -22, + interch: 0.0006, + safejoint: 0, + sfb21mod: 0, + msfix: 2.7, + }, + { + vbr_q: 8, + quant_comp: 9, + quant_comp_s: 9, + expY: 1, + st_lrm: 6.6, + st_s: 145, + masking_adj: 1.2, + masking_adj_short: 1.15, + ath_lower: -27.5, + ath_curve: 10, + ath_sensitivity: -23, + interch: 0.0007, + safejoint: 0, + sfb21mod: 0, + msfix: 0, + }, + { + vbr_q: 9, + quant_comp: 9, + quant_comp_s: 9, + expY: 1, + st_lrm: 6.6, + st_s: 145, + masking_adj: 1.6, + masking_adj_short: 1.6, + ath_lower: -36, + ath_curve: 11, + ath_sensitivity: -25, + interch: 0.0008, + safejoint: 0, + sfb21mod: 0, + msfix: 0, + }, + ] as const satisfies PresetMap; + + private readonly switchMap = [ + { + vbr_q: 0, + quant_comp: 9, + quant_comp_s: 9, + expY: 0, + st_lrm: 4.2, + st_s: 25, + masking_adj: -7, + masking_adj_short: -4, + ath_lower: 7.5, + ath_curve: 1, + ath_sensitivity: 0, + interch: 0, + safejoint: 2, + sfb21mod: 26, + msfix: 0.97, + }, + { + vbr_q: 1, + quant_comp: 9, + quant_comp_s: 9, + expY: 0, + st_lrm: 4.2, + st_s: 25, + masking_adj: -5.6, + masking_adj_short: -3.6, + ath_lower: 4.5, + ath_curve: 1.5, + ath_sensitivity: 0, + interch: 0, + safejoint: 2, + sfb21mod: 21, + msfix: 1.35, + }, + { + vbr_q: 2, + quant_comp: 9, + quant_comp_s: 9, + expY: 0, + st_lrm: 4.2, + st_s: 25, + masking_adj: -4.4, + masking_adj_short: -1.8, + ath_lower: 2, + ath_curve: 2, + ath_sensitivity: 0, + interch: 0, + safejoint: 2, + sfb21mod: 18, + msfix: 1.49, + }, + { + vbr_q: 3, + quant_comp: 9, + quant_comp_s: 9, + expY: 1, + st_lrm: 4.2, + st_s: 25, + masking_adj: -3.4, + masking_adj_short: -1.25, + ath_lower: 1.1, + ath_curve: 3, + ath_sensitivity: -4, + interch: 0, + safejoint: 2, + sfb21mod: 15, + msfix: 1.64, + }, + { + vbr_q: 4, + quant_comp: 9, + quant_comp_s: 9, + expY: 1, + st_lrm: 4.2, + st_s: 25, + masking_adj: -2.2, + masking_adj_short: 0.1, + ath_lower: 0, + ath_curve: 3.5, + ath_sensitivity: -8, + interch: 0, + safejoint: 2, + sfb21mod: 0, + msfix: 1.79, + }, + { + vbr_q: 5, + quant_comp: 9, + quant_comp_s: 9, + expY: 1, + st_lrm: 4.2, + st_s: 25, + masking_adj: -1, + masking_adj_short: 1.65, + ath_lower: -7.7, + ath_curve: 4, + ath_sensitivity: -12, + interch: 0.0002, + safejoint: 0, + sfb21mod: 0, + msfix: 1.95, + }, + { + vbr_q: 6, + quant_comp: 9, + quant_comp_s: 9, + expY: 1, + st_lrm: 4.2, + st_s: 25, + masking_adj: -0, + masking_adj_short: 2.47, + ath_lower: -7.7, + ath_curve: 6.5, + ath_sensitivity: -19, + interch: 0.0004, + safejoint: 0, + sfb21mod: 0, + msfix: 2, + }, + { + vbr_q: 7, + quant_comp: 9, + quant_comp_s: 9, + expY: 1, + st_lrm: 4.2, + st_s: 25, + masking_adj: 0.5, + masking_adj_short: 2, + ath_lower: -14.5, + ath_curve: 8, + ath_sensitivity: -22, + interch: 0.0006, + safejoint: 0, + sfb21mod: 0, + msfix: 2, + }, + { + vbr_q: 8, + quant_comp: 9, + quant_comp_s: 9, + expY: 1, + st_lrm: 4.2, + st_s: 25, + masking_adj: 1, + masking_adj_short: 2.4, + ath_lower: -22, + ath_curve: 10, + ath_sensitivity: -23, + interch: 0.0007, + safejoint: 0, + sfb21mod: 0, + msfix: 2, + }, + { + vbr_q: 9, + quant_comp: 9, + quant_comp_s: 9, + expY: 1, + st_lrm: 4.2, + st_s: 25, + masking_adj: 1.5, + masking_adj_short: 2.95, + ath_lower: -30, + ath_curve: 11, + ath_sensitivity: -25, + interch: 0.0008, + safejoint: 0, + sfb21mod: 0, + msfix: 2, + }, + ] as const satisfies PresetMap; + + private setVBRQuality(gfp: LameGlobalFlags, VBR_q: Quality): void { + if (VBR_q < 0) { + VBR_q = 0; + } + + if (VBR_q > 9) { + VBR_q = 9; + } + + gfp.VBR_q = VBR_q; + } + + public apply(gfp: LameGlobalFlags, a: Quality) { + const presetMap = + gfp.VBR === VbrMode.vbr_rh ? this.oldSwitchMap : this.switchMap; + + const set: VBRPreset = presetMap[a]; + + this.setVBRQuality(gfp, set.vbr_q); + + if (equals(gfp.quant_comp, -1)) { + gfp.quant_comp = set.quant_comp; + } + + if (equals(gfp.quant_comp_short, -1)) { + gfp.quant_comp_short = set.quant_comp_s; + } + + if (set.expY !== 0) { + gfp.experimentalY = true; + } + + if (equals(gfp.internal_flags.nsPsy.attackthre, -1)) { + gfp.internal_flags.nsPsy.attackthre = set.st_lrm; + } + + if (equals(gfp.internal_flags.nsPsy.attackthre_s, -1)) { + gfp.internal_flags.nsPsy.attackthre_s = set.st_s; + } + + if (equals(gfp.maskingadjust, 0)) { + gfp.maskingadjust = set.masking_adj; + } + + if (equals(gfp.maskingadjust_short, 0)) { + gfp.maskingadjust_short = set.masking_adj_short; + } + + if (equals(-gfp.ATHlower * 10.0, 0)) { + gfp.ATHlower = -set.ath_lower / 10.0; + } + + if (equals(gfp.ATHcurve, -1)) { + gfp.ATHcurve = set.ath_curve; + } + + if (equals(gfp.athaa_sensitivity, -1)) { + gfp.athaa_sensitivity = set.ath_sensitivity; + } + + if (set.interch > 0 && equals(gfp.interChRatio, -1)) { + gfp.interChRatio = set.interch; + } + + if (set.safejoint > 0) { + gfp.exp_nspsytune |= set.safejoint; + } + + if (set.sfb21mod > 0) { + gfp.exp_nspsytune |= set.sfb21mod << 20; + } + + if (equals(gfp.msfix, -1)) { + gfp.msfix = set.msfix; + } + + gfp.VBR_q = a; + } +} diff --git a/packages/mp3-encoder/src/lame/VBRTag.ts b/packages/mp3-encoder/src/lame/VBRTag.ts new file mode 100644 index 0000000000..42b42aaf01 --- /dev/null +++ b/packages/mp3-encoder/src/lame/VBRTag.ts @@ -0,0 +1,50 @@ +export class VBRTag { + private readonly crc16Lookup = [ + 0x0000, 0xc0c1, 0xc181, 0x0140, 0xc301, 0x03c0, 0x0280, 0xc241, 0xc601, + 0x06c0, 0x0780, 0xc741, 0x0500, 0xc5c1, 0xc481, 0x0440, 0xcc01, 0x0cc0, + 0x0d80, 0xcd41, 0x0f00, 0xcfc1, 0xce81, 0x0e40, 0x0a00, 0xcac1, 0xcb81, + 0x0b40, 0xc901, 0x09c0, 0x0880, 0xc841, 0xd801, 0x18c0, 0x1980, 0xd941, + 0x1b00, 0xdbc1, 0xda81, 0x1a40, 0x1e00, 0xdec1, 0xdf81, 0x1f40, 0xdd01, + 0x1dc0, 0x1c80, 0xdc41, 0x1400, 0xd4c1, 0xd581, 0x1540, 0xd701, 0x17c0, + 0x1680, 0xd641, 0xd201, 0x12c0, 0x1380, 0xd341, 0x1100, 0xd1c1, 0xd081, + 0x1040, 0xf001, 0x30c0, 0x3180, 0xf141, 0x3300, 0xf3c1, 0xf281, 0x3240, + 0x3600, 0xf6c1, 0xf781, 0x3740, 0xf501, 0x35c0, 0x3480, 0xf441, 0x3c00, + 0xfcc1, 0xfd81, 0x3d40, 0xff01, 0x3fc0, 0x3e80, 0xfe41, 0xfa01, 0x3ac0, + 0x3b80, 0xfb41, 0x3900, 0xf9c1, 0xf881, 0x3840, 0x2800, 0xe8c1, 0xe981, + 0x2940, 0xeb01, 0x2bc0, 0x2a80, 0xea41, 0xee01, 0x2ec0, 0x2f80, 0xef41, + 0x2d00, 0xedc1, 0xec81, 0x2c40, 0xe401, 0x24c0, 0x2580, 0xe541, 0x2700, + 0xe7c1, 0xe681, 0x2640, 0x2200, 0xe2c1, 0xe381, 0x2340, 0xe101, 0x21c0, + 0x2080, 0xe041, 0xa001, 0x60c0, 0x6180, 0xa141, 0x6300, 0xa3c1, 0xa281, + 0x6240, 0x6600, 0xa6c1, 0xa781, 0x6740, 0xa501, 0x65c0, 0x6480, 0xa441, + 0x6c00, 0xacc1, 0xad81, 0x6d40, 0xaf01, 0x6fc0, 0x6e80, 0xae41, 0xaa01, + 0x6ac0, 0x6b80, 0xab41, 0x6900, 0xa9c1, 0xa881, 0x6840, 0x7800, 0xb8c1, + 0xb981, 0x7940, 0xbb01, 0x7bc0, 0x7a80, 0xba41, 0xbe01, 0x7ec0, 0x7f80, + 0xbf41, 0x7d00, 0xbdc1, 0xbc81, 0x7c40, 0xb401, 0x74c0, 0x7580, 0xb541, + 0x7700, 0xb7c1, 0xb681, 0x7640, 0x7200, 0xb2c1, 0xb381, 0x7340, 0xb101, + 0x71c0, 0x7080, 0xb041, 0x5000, 0x90c1, 0x9181, 0x5140, 0x9301, 0x53c0, + 0x5280, 0x9241, 0x9601, 0x56c0, 0x5780, 0x9741, 0x5500, 0x95c1, 0x9481, + 0x5440, 0x9c01, 0x5cc0, 0x5d80, 0x9d41, 0x5f00, 0x9fc1, 0x9e81, 0x5e40, + 0x5a00, 0x9ac1, 0x9b81, 0x5b40, 0x9901, 0x59c0, 0x5880, 0x9841, 0x8801, + 0x48c0, 0x4980, 0x8941, 0x4b00, 0x8bc1, 0x8a81, 0x4a40, 0x4e00, 0x8ec1, + 0x8f81, 0x4f40, 0x8d01, 0x4dc0, 0x4c80, 0x8c41, 0x4400, 0x84c1, 0x8581, + 0x4540, 0x8701, 0x47c0, 0x4680, 0x8641, 0x8201, 0x42c0, 0x4380, 0x8341, + 0x4100, 0x81c1, 0x8081, 0x4040, + ] as const; + + private crcUpdateLookup(value: number, crc: number) { + const tmp = crc ^ value; + crc = (crc >> 8) ^ this.crc16Lookup[tmp & 0xff]; + return crc; + } + + updateMusicCRC( + crc: Int32Array, + buffer: Uint8Array, + bufferPos: number, + size: number + ) { + for (let i = 0; i < size; ++i) { + crc[0] = this.crcUpdateLookup(buffer[bufferPos + i], crc[0]); + } + } +} diff --git a/packages/mp3-encoder/src/lame/VbrMode.ts b/packages/mp3-encoder/src/lame/VbrMode.ts new file mode 100644 index 0000000000..8b85ae3a62 --- /dev/null +++ b/packages/mp3-encoder/src/lame/VbrMode.ts @@ -0,0 +1,8 @@ +export const enum VbrMode { + vbr_off, + vbr_mt, + vbr_rh, + vbr_abr, + vbr_mtrh, + vbr_default = VbrMode.vbr_mtrh, +} diff --git a/packages/mp3-encoder/src/lame/WavHeader.ts b/packages/mp3-encoder/src/lame/WavHeader.ts new file mode 100644 index 0000000000..2dae456ad0 --- /dev/null +++ b/packages/mp3-encoder/src/lame/WavHeader.ts @@ -0,0 +1,65 @@ +export class WavHeader { + private constructor( + public readonly dataOffset: number, + public readonly dataLen: number, + public readonly channels: number, + public readonly sampleRate: number + ) {} + + private static fourccToInt(fourcc: string) { + return ( + (fourcc.charCodeAt(0) << 24) | + (fourcc.charCodeAt(1) << 16) | + (fourcc.charCodeAt(2) << 8) | + fourcc.charCodeAt(3) + ); + } + + private static readonly RIFF = WavHeader.fourccToInt('RIFF'); + + private static readonly WAVE = WavHeader.fourccToInt('WAVE'); + + private static readonly fmt_ = WavHeader.fourccToInt('fmt '); + + private static readonly data = WavHeader.fourccToInt('data'); + + static readHeader(dataView: DataView) { + let header = dataView.getUint32(0, false); + if (WavHeader.RIFF !== header) { + throw new Error('Invalid WAV file'); + } + + dataView.getUint32(4, true); + if (WavHeader.WAVE !== dataView.getUint32(8, false)) { + throw new Error('Invalid WAV file'); + } + if (WavHeader.fmt_ !== dataView.getUint32(12, false)) { + throw new Error('Invalid WAV file'); + } + const fmtLen = dataView.getUint32(16, true); + let pos = 16 + 4; + let channels = 0; + let sampleRate = 0; + switch (fmtLen) { + case 16: + case 18: + channels = dataView.getUint16(pos + 2, true); + sampleRate = dataView.getUint32(pos + 4, true); + break; + default: + throw new Error('extended fmt chunk not implemented'); + } + pos += fmtLen; + let len = 0; + while (WavHeader.data !== header) { + header = dataView.getUint32(pos, false); + len = dataView.getUint32(pos + 4, true); + if (WavHeader.data === header) { + break; + } + pos += len + 8; + } + + return new WavHeader(pos + 8, len, channels, sampleRate); + } +} diff --git a/packages/mp3-encoder/src/lame/arrays.ts b/packages/mp3-encoder/src/lame/arrays.ts new file mode 100644 index 0000000000..b59393c45a --- /dev/null +++ b/packages/mp3-encoder/src/lame/arrays.ts @@ -0,0 +1,69 @@ +type TypedArray = + | Int8Array + | Uint8Array + | Int16Array + | Uint16Array + | Int32Array + | Uint32Array + | Float32Array + | Float64Array; + +const hasSubarray = (a: unknown): a is Pick => + typeof a === 'object' && + a !== null && + 'subarray' in a && + typeof a.subarray === 'function'; + +const hasSet = (a: unknown): a is Pick => + typeof a === 'object' && + a !== null && + 'set' in a && + typeof a.set === 'function'; + +export function copyArray( + src: ArrayLike, + srcPos: number, + dest: { [index: number]: T }, + destPos: number, + length: number +) { + if (hasSubarray(src) && hasSet(dest)) { + dest.set(src.subarray(srcPos, srcPos + length), destPos); + return; + } + + const srcEnd = srcPos + length; + while (srcPos < srcEnd) dest[destPos++] = src[srcPos++]; +} + +export function sortArray(a: TypedArray, fromIndex: number, toIndex: number) { + const sorted = Array.from(a).slice(fromIndex, toIndex).sort(); + for (let i = fromIndex; i < toIndex; i++) { + a[i] = sorted[i - fromIndex]; + } +} + +export function fillArray(a: TypedArray, val: number): void; +export function fillArray( + a: TypedArray, + fromIndex: number, + toIndex: number, + val: number +): void; +export function fillArray( + ...args: + | [a: TypedArray, val: number] + | [a: TypedArray, fromIndex: number, toIndex: number, val: number] +) { + if (args.length === 2) { + const [a, val] = args; + for (let i = 0; i < a.length; i++) { + a[i] = val; + } + } else { + const [a, fromIndex, toIndex, val] = args; + for (let i = fromIndex; i < toIndex; i++) { + a[i] = val; + } + } +} diff --git a/packages/mp3-encoder/src/lame/assert.ts b/packages/mp3-encoder/src/lame/assert.ts new file mode 100644 index 0000000000..23722872d4 --- /dev/null +++ b/packages/mp3-encoder/src/lame/assert.ts @@ -0,0 +1,8 @@ +export function assert( + condition: boolean, + message?: string +): asserts condition { + if (!condition) { + throw new Error(message); + } +} diff --git a/packages/mp3-encoder/src/lame/bitrates.ts b/packages/mp3-encoder/src/lame/bitrates.ts new file mode 100644 index 0000000000..5bb18b0add --- /dev/null +++ b/packages/mp3-encoder/src/lame/bitrates.ts @@ -0,0 +1,88 @@ +export type Bitrate = + | 8 + | 16 + | 24 + | 32 + | 40 + | 48 + | 56 + | 64 + | 80 + | 96 + | 112 + | 128 + | 144 + | 160 + | 192 + | 224 + | 256 + | 320; + +const bitratesMap = { + mpeg2: [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1], + mpeg1: [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, -1], + mpeg2_5: [0, 8, 16, 24, 32, 40, 48, 56, 64, -1, -1, -1, -1, -1, -1, -1], +} as const satisfies Record; + +const LOW_SAMPLE_RATE_THRESHOLD = 16000; + +const getBitrates = ( + version: 0 | 1, + samplerate = LOW_SAMPLE_RATE_THRESHOLD +) => { + if (samplerate < 16000) { + return bitratesMap.mpeg2_5; + } + + if (version === 0) { + return bitratesMap.mpeg2; + } + + return bitratesMap.mpeg1; +}; + +export function findNearestBitrate( + bRate: number, + version: 0 | 1, + samplerate: number +): Bitrate { + const bitrates = getBitrates(version, samplerate); + + let matchingBitrate: Bitrate = bitrates[1]; + + for (let i = 2; i <= 14; i++) { + const bitrate = bitrates[i]; + if (bitrate !== 0 && bitrate !== -1) { + if (Math.abs(bitrate - bRate) < Math.abs(matchingBitrate - bRate)) { + matchingBitrate = bitrate; + } + } + } + return matchingBitrate; +} + +export type BitrateIndex = number & { __brand: 'BitrateIndex' }; + +export function findBitrateIndex( + bRate: number, + version: 0 | 1, + samplerate: number +): BitrateIndex { + const bitrates = getBitrates(version, samplerate); + + for (let i = 1; i <= 14; i++) { + const bitrate = bitrates[i]; + if (bitrate > 0) { + if (bitrate === bRate) { + return i as BitrateIndex; + } + } + } + + throw new Error(`Invalid bitrate ${bRate}`); +} + +export function getBitrate(version: 0 | 1, index: number): Bitrate | 0 | -1 { + const bitrates = getBitrates(version); + return bitrates[index]; +} diff --git a/packages/mp3-encoder/src/lame/constants.ts b/packages/mp3-encoder/src/lame/constants.ts new file mode 100644 index 0000000000..0577366273 --- /dev/null +++ b/packages/mp3-encoder/src/lame/constants.ts @@ -0,0 +1,65 @@ +export const MAX_FLOAT32_VALUE = 3.4028235e38; + +export const LOG10 = 2.302585092994046; + +export const SBMAX_l = 22; + +export const SBMAX_s = 13; + +export const PSFB21 = 6; + +export const PSFB12 = 6; + +export const CBANDS = 64; + +export const NORM_TYPE = 0; + +export const START_TYPE = 1; + +export const SHORT_TYPE = 2; + +export const STOP_TYPE = 3; + +export const LAME_MAXALBUMART = 128 * 1024; + +export const LAME_MAXMP3BUFFER = 16384 + LAME_MAXALBUMART; + +export const BLKSIZE = 1024; + +export const HBLKSIZE = BLKSIZE / 2 + 1; + +export const BLKSIZE_s = 256; + +export const HBLKSIZE_s = BLKSIZE_s / 2 + 1; + +export const SFBMAX = SBMAX_s * 3; + +export const MPG_MD_LR_LR = 0; + +export const MPG_MD_MS_LR = 2; + +export const SBPSY_l = 21; + +export const SBPSY_s = 12; + +export const SBLIMIT = 32; + +export const ENCDELAY = 576; + +export const POSTDELAY = 1152; + +export const MDCTDELAY = 48; + +export const FFTOFFSET = 224 + MDCTDELAY; + +export const LAME_ID = 0xfff88e3b; + +export const BPC = 320; + +export const MAX_BITS_PER_GRANULE = 7680; + +export const MAX_BITS_PER_CHANNEL = 4095; + +export const MAX_HEADER_BUF = 256; + +export const MFSIZE = 3 * 1152 + ENCDELAY - MDCTDELAY; diff --git a/packages/mp3-encoder/src/lame/getLameShortVersion.ts b/packages/mp3-encoder/src/lame/getLameShortVersion.ts new file mode 100644 index 0000000000..3153f9f8dc --- /dev/null +++ b/packages/mp3-encoder/src/lame/getLameShortVersion.ts @@ -0,0 +1,9 @@ +const LAME_MAJOR_VERSION = 3; + +const LAME_MINOR_VERSION = 98; + +const LAME_PATCH_VERSION = 4; + +export function getLameShortVersion() { + return `${LAME_MAJOR_VERSION}.${LAME_MINOR_VERSION}.${LAME_PATCH_VERSION}` as const; +} diff --git a/packages/mp3-encoder/src/lame/index.ts b/packages/mp3-encoder/src/lame/index.ts new file mode 100644 index 0000000000..68fa6b60e5 --- /dev/null +++ b/packages/mp3-encoder/src/lame/index.ts @@ -0,0 +1 @@ +export { Mp3Encoder } from './Mp3Encoder'; diff --git a/packages/mp3-encoder/src/lame/math.ts b/packages/mp3-encoder/src/lame/math.ts new file mode 100644 index 0000000000..ad3ea40dd9 --- /dev/null +++ b/packages/mp3-encoder/src/lame/math.ts @@ -0,0 +1,31 @@ +export function blackmanWindow(x: number, fcn: number, l: number) { + const wcn = Math.PI * fcn; + + x /= l; + if (x < 0) x = 0; + if (x > 1) x = 1; + const x2 = x - 0.5; + + const bkwn = + 0.42 - 0.5 * Math.cos(2 * x * Math.PI) + 0.08 * Math.cos(4 * x * Math.PI); + if (Math.abs(x2) < 1e-9) return wcn / Math.PI; + return (bkwn * Math.sin(l * wcn * x2)) / (Math.PI * l * x2); +} + +export function gcd(i: number, j: number): number { + return j !== 0 ? gcd(j, i % j) : i; +} + +export function isCloseToEachOther(a: number, b: number) { + return Math.abs(a) > Math.abs(b) + ? Math.abs(a - b) <= Math.abs(a) * 1e-6 + : Math.abs(a - b) <= Math.abs(b) * 1e-6; +} + +export function fsqr(d: number) { + return d * d; +} + +export function equals(a: number, b: number) { + return !(Math.abs(a - b) > 0); +} diff --git a/packages/mp3-encoder/src/lame/sampleRates.ts b/packages/mp3-encoder/src/lame/sampleRates.ts new file mode 100644 index 0000000000..980840186d --- /dev/null +++ b/packages/mp3-encoder/src/lame/sampleRates.ts @@ -0,0 +1,23 @@ +export type SampleRate = + | 44100 + | 48000 + | 32000 + | 24000 + | 22050 + | 16000 + | 12000 + | 11025 + | 8000; + +export function findNearestSampleRate(freq: number): SampleRate { + if (freq <= 8000) return 8000; + if (freq <= 11025) return 11025; + if (freq <= 12000) return 12000; + if (freq <= 16000) return 16000; + if (freq <= 22050) return 22050; + if (freq <= 24000) return 24000; + if (freq <= 32000) return 32000; + if (freq <= 44100) return 44100; + + return 48000; +} diff --git a/packages/mp3-encoder/src/lamejs.d.ts b/packages/mp3-encoder/src/lamejs.d.ts deleted file mode 100644 index 68af610574..0000000000 --- a/packages/mp3-encoder/src/lamejs.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -declare module 'lamejs' { - export class Mp3Encoder { - constructor(numChannels: number, sampleRate: number, bitRate: number); - - encodeBuffer(buffer: Int16Array): Iterable; - - flush(): Iterable; - } -} diff --git a/packages/mp3-encoder/testdata/Left44100.wav b/packages/mp3-encoder/testdata/Left44100.wav new file mode 100644 index 0000000000000000000000000000000000000000..e7dfc6f26bcddbe5bb411ffa219efe745f840e61 GIT binary patch literal 661578 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ͶO}TuBQIciWkzR)^S@~8I@q^gp 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 A4yw~=ec!@Y^=*x|wR|0eIy88V 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 ZEG4j%z)}KB2`nYBl)zE~|L02J{{m|uu;u^& literal 0 HcmV?d00001 diff --git a/packages/mp3-encoder/testdata/Right44100.wav b/packages/mp3-encoder/testdata/Right44100.wav new file mode 100644 index 0000000000000000000000000000000000000000..1366b7485999a441595c6f61fb214222f8c254da GIT binary patch literal 661578 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

^?nvPv}yc5L@D!u_w6ck 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

BzFZmZg1*DMDV(Y) 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�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 HdH??cDn32A literal 0 HcmV?d00001 diff --git a/packages/mp3-encoder/tsconfig.build.json b/packages/mp3-encoder/tsconfig.build.json new file mode 100644 index 0000000000..8c0f74bb02 --- /dev/null +++ b/packages/mp3-encoder/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["**/*.spec.ts"] +} diff --git a/packages/mp3-encoder/tsconfig.json b/packages/mp3-encoder/tsconfig.json index d6f8a9cdf6..ef367fd30c 100644 --- a/packages/mp3-encoder/tsconfig.json +++ b/packages/mp3-encoder/tsconfig.json @@ -1,11 +1,13 @@ { + "extends": "../../tsconfig.base.json", "compilerOptions": { - "target": "es5", - "lib": ["es2015", "webworker"], - "strict": false, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, "rootDir": "./src", + "module": "ESNext", + "lib": ["ES2015", "WebWorker"], + "outDir": "./dist", + "esModuleInterop": true, + "moduleResolution": "node", "skipLibCheck": true - } + }, + "include": ["src"] } diff --git a/yarn.lock b/yarn.lock index 28d3a6f4a8..80f0c971d5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2873,6 +2873,13 @@ __metadata: languageName: node linkType: hard +"@jridgewell/sourcemap-codec@npm:^1.4.13": + version: 1.4.15 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" + checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 + languageName: node + linkType: hard + "@jridgewell/trace-mapping@npm:0.3.9": version: 0.3.9 resolution: "@jridgewell/trace-mapping@npm:0.3.9" @@ -6079,19 +6086,18 @@ __metadata: "@babel/preset-typescript": ~7.21.4 "@rocket.chat/eslint-config-alt": "workspace:~" "@rocket.chat/prettier-config": "workspace:~" - "@rollup/plugin-commonjs": ~21.0.3 - "@rollup/plugin-node-resolve": ~13.1.3 - "@rollup/plugin-typescript": ~8.3.4 + "@rollup/plugin-commonjs": ~24.1.0 + "@rollup/plugin-node-resolve": ~15.0.2 + "@rollup/plugin-typescript": ~11.1.0 "@types/jest": ~29.5.0 bump: "workspace:~" eslint: ~8.38.0 jest: ~29.5.0 jest-environment-jsdom: ~29.5.0 - lamejs: "git+https://github.com/zhuker/lamejs.git#commit=582bbba6a12f981b984d8fb9e1874499fed85675" lint-all: "workspace:~" lint-staged: ~13.2.1 prettier: ~2.8.7 - rollup: ~2.67.3 + rollup: ~3.20.4 ts-jest: ~29.1.0 typedoc: ~0.24.1 typescript: ~5.0.4 @@ -6373,6 +6379,25 @@ __metadata: languageName: node linkType: hard +"@rollup/plugin-commonjs@npm:~24.1.0": + version: 24.1.0 + resolution: "@rollup/plugin-commonjs@npm:24.1.0" + dependencies: + "@rollup/pluginutils": ^5.0.1 + commondir: ^1.0.1 + estree-walker: ^2.0.2 + glob: ^8.0.3 + is-reference: 1.2.1 + magic-string: ^0.27.0 + peerDependencies: + rollup: ^2.68.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 42faafc9bc8e04d75c86bb50d693ebb9c5eee19bf9ab3c09780b872547d12ff5ea85cfec7da75f5176d0aa4b5233101f667f44b85b331450a7bb14c95180852e + languageName: node + linkType: hard + "@rollup/plugin-json@npm:~4.1.0": version: 4.1.0 resolution: "@rollup/plugin-json@npm:4.1.0" @@ -6416,6 +6441,25 @@ __metadata: languageName: node linkType: hard +"@rollup/plugin-node-resolve@npm:~15.0.2": + version: 15.0.2 + resolution: "@rollup/plugin-node-resolve@npm:15.0.2" + dependencies: + "@rollup/pluginutils": ^5.0.1 + "@types/resolve": 1.20.2 + deepmerge: ^4.2.2 + is-builtin-module: ^3.2.1 + is-module: ^1.0.0 + resolve: ^1.22.1 + peerDependencies: + rollup: ^2.78.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 328eafee06ff967a36441b55e77fbd0d4f599d256e5d1977800ee71915846c46bc1b6185df35c7b512ad2b4023b05b65a332be77b8b00b9d8a20f87d056b8166 + languageName: node + linkType: hard + "@rollup/plugin-replace@npm:^2.4.1": version: 2.4.2 resolution: "@rollup/plugin-replace@npm:2.4.2" @@ -6428,6 +6472,25 @@ __metadata: languageName: node linkType: hard +"@rollup/plugin-typescript@npm:~11.1.0": + version: 11.1.0 + resolution: "@rollup/plugin-typescript@npm:11.1.0" + dependencies: + "@rollup/pluginutils": ^5.0.1 + resolve: ^1.22.1 + peerDependencies: + rollup: ^2.14.0||^3.0.0 + tslib: "*" + typescript: ">=3.7.0" + peerDependenciesMeta: + rollup: + optional: true + tslib: + optional: true + checksum: 64ed5abbae392032fb190a5d3a29beb73f968919aed964ed5545e2732de6a1670f97131785e9376c06f784ae61545c5ad47352c126f3830aaa16b669bee2e9b9 + languageName: node + linkType: hard + "@rollup/plugin-typescript@npm:~8.3.4": version: 8.3.4 resolution: "@rollup/plugin-typescript@npm:8.3.4" @@ -6458,6 +6521,22 @@ __metadata: languageName: node linkType: hard +"@rollup/pluginutils@npm:^5.0.1": + version: 5.0.2 + resolution: "@rollup/pluginutils@npm:5.0.2" + dependencies: + "@types/estree": ^1.0.0 + estree-walker: ^2.0.2 + picomatch: ^2.3.1 + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: edea15e543bebc7dcac3b0ac8bc7b8e8e6dbd46e2864dbe5dd28072de1fbd5b0e10d545a610c0edaa178e8a7ac432e2a2a52e547ece1308471412caba47db8ce + languageName: node + linkType: hard + "@rushstack/eslint-patch@npm:^1.1.0": version: 1.1.4 resolution: "@rushstack/eslint-patch@npm:1.1.4" @@ -8709,6 +8788,13 @@ __metadata: languageName: node linkType: hard +"@types/resolve@npm:1.20.2": + version: 1.20.2 + resolution: "@types/resolve@npm:1.20.2" + checksum: 61c2cad2499ffc8eab36e3b773945d337d848d3ac6b7b0a87c805ba814bc838ef2f262fc0f109bfd8d2e0898ff8bd80ad1025f9ff64f1f71d3d4294c9f14e5f6 + languageName: node + linkType: hard + "@types/responselike@npm:*, @types/responselike@npm:^1.0.0": version: 1.0.0 resolution: "@types/responselike@npm:1.0.0" @@ -11193,6 +11279,13 @@ __metadata: languageName: node linkType: hard +"builtin-modules@npm:^3.3.0": + version: 3.3.0 + resolution: "builtin-modules@npm:3.3.0" + checksum: db021755d7ed8be048f25668fe2117620861ef6703ea2c65ed2779c9e3636d5c3b82325bd912244293959ff3ae303afa3471f6a15bf5060c103e4cc3a839749d + languageName: node + linkType: hard + "builtin-status-codes@npm:^3.0.0": version: 3.0.0 resolution: "builtin-status-codes@npm:3.0.0" @@ -14979,6 +15072,13 @@ __metadata: languageName: node linkType: hard +"estree-walker@npm:^2.0.2": + version: 2.0.2 + resolution: "estree-walker@npm:2.0.2" + checksum: 6151e6f9828abe2259e57f5fd3761335bb0d2ebd76dc1a01048ccee22fabcfef3c0859300f6d83ff0d1927849368775ec5a6d265dde2f6de5a1be1721cd94efc + languageName: node + linkType: hard + "esutils@npm:^2.0.2": version: 2.0.3 resolution: "esutils@npm:2.0.3" @@ -16342,6 +16442,19 @@ fsevents@^1.2.7: languageName: node linkType: hard +"glob@npm:^8.0.3": + version: 8.1.0 + resolution: "glob@npm:8.1.0" + dependencies: + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^5.0.1 + once: ^1.3.0 + checksum: 92fbea3221a7d12075f26f0227abac435de868dd0736a17170663783296d0dd8d3d532a5672b4488a439bf5d7fb85cdd07c11185d6cd39184f0385cbdfb86a47 + languageName: node + linkType: hard + "global-modules@npm:^2.0.0": version: 2.0.0 resolution: "global-modules@npm:2.0.0" @@ -17722,6 +17835,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"is-builtin-module@npm:^3.2.1": + version: 3.2.1 + resolution: "is-builtin-module@npm:3.2.1" + dependencies: + builtin-modules: ^3.3.0 + checksum: e8f0ffc19a98240bda9c7ada84d846486365af88d14616e737d280d378695c8c448a621dcafc8332dbf0fcd0a17b0763b845400709963fa9151ddffece90ae88 + languageName: node + linkType: hard + "is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": version: 1.2.7 resolution: "is-callable@npm:1.2.7" @@ -18074,7 +18196,7 @@ fsevents@^1.2.7: languageName: node linkType: hard -"is-reference@npm:^1.2.1": +"is-reference@npm:1.2.1, is-reference@npm:^1.2.1": version: 1.2.1 resolution: "is-reference@npm:1.2.1" dependencies: @@ -19908,15 +20030,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"lamejs@git+https://github.com/zhuker/lamejs.git#commit=582bbba6a12f981b984d8fb9e1874499fed85675": - version: 1.2.1 - resolution: "lamejs@https://github.com/zhuker/lamejs.git#commit=582bbba6a12f981b984d8fb9e1874499fed85675" - dependencies: - use-strict: 1.0.1 - checksum: fa829e0c170a65573e653b4d908a44aaf06a50e1bbade3b1217a300a03ccd59a537e294e2d924a584f9d70c7726a12d4c3af9c675436d48d08be5fb94b5eb400 - languageName: node - linkType: hard - "language-subtag-registry@npm:~0.3.2": version: 0.3.22 resolution: "language-subtag-registry@npm:0.3.22" @@ -20457,6 +20570,15 @@ fsevents@^1.2.7: languageName: node linkType: hard +"magic-string@npm:^0.27.0": + version: 0.27.0 + resolution: "magic-string@npm:0.27.0" + dependencies: + "@jridgewell/sourcemap-codec": ^1.4.13 + checksum: 273faaa50baadb7a2df6e442eac34ad611304fc08fe16e24fe2e472fd944bfcb73ffb50d2dc972dc04e92784222002af46868cb9698b1be181c81830fd95a13e + languageName: node + linkType: hard + "make-dir@npm:^2.0.0, make-dir@npm:^2.1.0": version: 2.1.0 resolution: "make-dir@npm:2.1.0" @@ -26363,6 +26485,20 @@ fsevents@^1.2.7: languageName: node linkType: hard +"rollup@npm:~3.20.4": + version: 3.20.4 + resolution: "rollup@npm:3.20.4" + dependencies: + fsevents: ~2.3.2 + dependenciesMeta: + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 6b80ca4c455b4009cf1ed528bbf5906c0620eb15e38461f697384bd35f1537914599aa853d998be7a6683ce7014108e563b57c183cc8ee842906c33bc2051d12 + languageName: node + linkType: hard + "rsvp@npm:^4.8.4": version: 4.8.5 resolution: "rsvp@npm:4.8.5" @@ -30011,13 +30147,6 @@ fsevents@^1.2.7: languageName: node linkType: hard -"use-strict@npm:1.0.1": - version: 1.0.1 - resolution: "use-strict@npm:1.0.1" - checksum: e2798c587b8dc95483ac376e1b9b13fbab179bbd498ed7bd55cba2ef72792569621ba25d9aa5df21f884a161d28624d39165070a690fc5f088bf903e097fc267 - languageName: node - linkType: hard - "use-subscription@npm:^1.7.0": version: 1.8.0 resolution: "use-subscription@npm:1.8.0" From 279bc867f1e2e8054ec799b1833b7a1d61d7978b Mon Sep 17 00:00:00 2001 From: Douglas Fabris Date: Sat, 6 May 2023 00:02:46 -0300 Subject: [PATCH 025/103] feat: `AudioPlayer` Component (#1046) Co-authored-by: Guilherme Gazzo --- .../AudioPlayer/AudioPlayer.stories.tsx | 40 ++++ .../components/AudioPlayer/AudioPlayer.tsx | 190 ++++++++++++++++++ .../src/components/AudioPlayer/index.ts | 1 + .../src/components/Button/Button.styles.scss | 14 ++ .../fuselage/src/components/Button/Button.tsx | 4 + .../src/components/Button/IconButton.tsx | 12 +- packages/fuselage/src/components/index.ts | 2 + packages/fuselage/src/styles/colors.scss | 2 +- packages/fuselage/webpack.config.js | 7 + 9 files changed, 269 insertions(+), 3 deletions(-) create mode 100644 packages/fuselage/src/components/AudioPlayer/AudioPlayer.stories.tsx create mode 100644 packages/fuselage/src/components/AudioPlayer/AudioPlayer.tsx create mode 100644 packages/fuselage/src/components/AudioPlayer/index.ts diff --git a/packages/fuselage/src/components/AudioPlayer/AudioPlayer.stories.tsx b/packages/fuselage/src/components/AudioPlayer/AudioPlayer.stories.tsx new file mode 100644 index 0000000000..51306195cb --- /dev/null +++ b/packages/fuselage/src/components/AudioPlayer/AudioPlayer.stories.tsx @@ -0,0 +1,40 @@ +import { + Title, + Subtitle, + Description, + Primary as PrimaryStory, + ArgsTable, + Stories, + PRIMARY_STORY, +} from '@storybook/addon-docs'; +import type { ComponentMeta } from '@storybook/react'; +import React from 'react'; + +import { AudioPlayer } from '../..'; + +export default { + title: 'Media/AudioPlayer', + component: AudioPlayer, + parameters: { + docs: { + description: { + component: 'A fuselage`s custom AudioPlayer.', + }, + page: () => ( + <> + + <Subtitle /> + <Description /> + <PrimaryStory /> + <Stories title={''} /> + <ArgsTable story={PRIMARY_STORY} /> + </> + ), + }, + }, +} as ComponentMeta<typeof AudioPlayer>; + +const AUDIO_URL = + 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-17.mp3'; + +export const AudioPlayerDefault = () => <AudioPlayer src={AUDIO_URL} />; diff --git a/packages/fuselage/src/components/AudioPlayer/AudioPlayer.tsx b/packages/fuselage/src/components/AudioPlayer/AudioPlayer.tsx new file mode 100644 index 0000000000..bc20fc50ef --- /dev/null +++ b/packages/fuselage/src/components/AudioPlayer/AudioPlayer.tsx @@ -0,0 +1,190 @@ +import { useMergedRefs } from '@rocket.chat/fuselage-hooks'; +import React, { useState, useRef, forwardRef } from 'react'; + +import { Box, IconButton } from '../..'; +import { Slider } from '../Slider'; + +const getMaskTime = (durationTime: number) => + new Date(durationTime * 1000) + .toISOString() + .slice(durationTime > 60 * 60 ? 11 : 14, 19); + +function forceDownload(url: string, fileName?: string) { + const xhr = new XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.responseType = 'blob'; + xhr.onload = function () { + const urlCreator = window.URL || window.webkitURL; + const imageUrl = urlCreator.createObjectURL(this.response); + const tag = document.createElement('a'); + tag.href = imageUrl; + if (fileName) { + tag.download = fileName; + } + document.body.appendChild(tag); + tag.click(); + document.body.removeChild(tag); + }; + xhr.send(); +} + +export const AudioPlayer = forwardRef< + HTMLAudioElement, + { + src: string; + maxPlaybackSpeed?: number; + minPlaybackSpeed?: number; + playbackSpeedStep?: number; + } +>( + ( + { + src, + maxPlaybackSpeed = 2, + minPlaybackSpeed = 0.5, + playbackSpeedStep = 0.5, + }, + ref + ) => { + const audioRef = useRef<HTMLAudioElement>(null); + const refs = useMergedRefs(ref, audioRef); + const [isPlaying, setIsPlaying] = useState(false); + const [currentTime, setCurrentTime] = useState(0); + const [durationTime, setDurationTime] = useState(0); + const [playbackSpeed, setPlaybackSpeed] = useState(1); + + const handlePlay = () => { + const isPlaying = audioRef.current?.paused; + + if (isPlaying) { + audioRef.current?.play(); + } else { + audioRef.current?.pause(); + } + }; + + const handlePlaybackSpeed = (mod: 1 | -1) => { + if (audioRef.current) { + audioRef.current.playbackRate = Math.max( + Math.min( + audioRef.current.playbackRate + playbackSpeedStep * mod, + maxPlaybackSpeed + ), + minPlaybackSpeed + ); + } + }; + + const handleIncreasePlayBackSpeed = () => handlePlaybackSpeed(1); + + const handleDecreasePlayBackSpeed = () => handlePlaybackSpeed(-1); + + return ( + <Box + borderWidth='default' + borderColor='extra-light' + p='x16' + width='fit-content' + borderRadius='x4' + > + <Box display='flex' alignItems='center'> + <IconButton + large + onClick={handlePlay} + icon={isPlaying ? 'pause-unfilled' : 'play-unfilled'} + /> + <Box mi='x12' position='relative'> + <Slider + showOutput={false} + value={currentTime} + maxValue={durationTime} + onChange={(value) => { + if (audioRef.current) { + audioRef.current.currentTime = value; + } + }} + /> + <Box + display='flex' + alignItems='center' + justifyContent='space-between' + color='secondary-info' + fontScale='micro' + position='absolute' + width='100%' + mb={'neg-x8'} + > + {getMaskTime(currentTime)} + <Box + fontScale='micro' + display='flex' + justifyContent='space-around' + id='controllers' + > + <Box + mi='x8' + display='flex' + alignItems='center' + justifyContent='space-between' + > + <IconButton + disabled={playbackSpeed <= minPlaybackSpeed} + icon='h-bar' + mini + onClick={handleDecreasePlayBackSpeed} + /> + <Box mi='x8'>{playbackSpeed.toFixed(1)}x</Box> + <IconButton + disabled={playbackSpeed >= maxPlaybackSpeed} + icon='plus' + mini + onClick={handleIncreasePlayBackSpeed} + /> + </Box> + </Box> + {getMaskTime(durationTime)} + </Box> + </Box> + <IconButton + is='a' + href={src} + download + icon='download' + large + onClick={(e) => { + const { host } = new URL(src); + if (host !== window.location.host) { + e.preventDefault(); + forceDownload(src); + } + }} + /> + </Box> + <audio + style={{ display: 'none' }} + onTimeUpdate={(e) => { + setCurrentTime((e.target as HTMLAudioElement).currentTime); + }} + onLoadedData={(e) => { + setDurationTime((e.target as HTMLAudioElement).duration); + }} + onEnded={() => setIsPlaying(false)} + ref={refs} + preload='metadata' + onRateChange={(e) => { + setPlaybackSpeed((e.target as HTMLAudioElement).playbackRate); + }} + onPlay={() => { + setIsPlaying(true); + }} + onPause={() => { + setIsPlaying(false); + }} + controls + > + <source src={src} type='audio/mpeg' /> + </audio> + </Box> + ); + } +); diff --git a/packages/fuselage/src/components/AudioPlayer/index.ts b/packages/fuselage/src/components/AudioPlayer/index.ts new file mode 100644 index 0000000000..58f3d538fc --- /dev/null +++ b/packages/fuselage/src/components/AudioPlayer/index.ts @@ -0,0 +1 @@ +export * from './AudioPlayer'; diff --git a/packages/fuselage/src/components/Button/Button.styles.scss b/packages/fuselage/src/components/Button/Button.styles.scss index fd41bcabd8..f04af235c2 100644 --- a/packages/fuselage/src/components/Button/Button.styles.scss +++ b/packages/fuselage/src/components/Button/Button.styles.scss @@ -58,6 +58,16 @@ ); } + &--large { + @include typography.use-font-scale(p1); + + @include with-rectangular-size( + $height: 48px, + $padding-x: 24px, + $line-height: typography.line-height(p1) + ); + } + &--square { @include with-squared-size($size: 40px); display: flex; @@ -125,6 +135,10 @@ @include with-squared-size($size: 32px); } + &--large-square { + @include with-squared-size($size: 48px); + } + &--primary { @include button.kind-variant(colors.$primary); } diff --git a/packages/fuselage/src/components/Button/Button.tsx b/packages/fuselage/src/components/Button/Button.tsx index aa9ae1dc73..f29bd64192 100644 --- a/packages/fuselage/src/components/Button/Button.tsx +++ b/packages/fuselage/src/components/Button/Button.tsx @@ -13,6 +13,7 @@ export type ButtonProps = ComponentProps<typeof Box> & { small?: boolean; mini?: boolean; tiny?: boolean; + large?: boolean; square?: boolean; external?: boolean; }; @@ -30,6 +31,7 @@ export const Button = forwardRef(function Button( small, tiny, mini, + large, square, ...props }: ButtonProps, @@ -73,10 +75,12 @@ export const Button = forwardRef(function Button( rcx-button {...kindAndVariantProps} rcx-button--small={small} + rcx-button--large={large} rcx-button--square={square} rcx-button--small-square={small && square} rcx-button--tiny-square={tiny && square} rcx-button--mini-square={mini && square} + rcx-button--large-square={large && square} ref={ref} {...extraProps} {...props} diff --git a/packages/fuselage/src/components/Button/IconButton.tsx b/packages/fuselage/src/components/Button/IconButton.tsx index 1bf2d7fb67..4c520ea008 100644 --- a/packages/fuselage/src/components/Button/IconButton.tsx +++ b/packages/fuselage/src/components/Button/IconButton.tsx @@ -5,6 +5,7 @@ import Box from '../Box'; import { Icon } from '../Icon'; type ButtonSize = { + large?: boolean; medium?: boolean; small?: boolean; tiny?: boolean; @@ -51,6 +52,7 @@ export const IconButton = forwardRef( warning, success, mini, + large, tiny, small, medium, @@ -91,8 +93,9 @@ export const IconButton = forwardRef( (mini && 'mini') || (tiny && 'tiny') || (small && 'small') || - (medium && 'medium'), - [medium, mini, small, tiny] + (medium && 'medium') || + (large && 'large'), + [medium, mini, small, tiny, large] ); const getSizeClass = () => ({ [`rcx-button--${size}-square`]: true }); @@ -107,6 +110,11 @@ export const IconButton = forwardRef( if (medium) { return 'x20'; } + + if (large) { + return 'x32'; + } + return 'x24'; }; diff --git a/packages/fuselage/src/components/index.ts b/packages/fuselage/src/components/index.ts index d8cc1f6533..36efc48a0b 100644 --- a/packages/fuselage/src/components/index.ts +++ b/packages/fuselage/src/components/index.ts @@ -1,5 +1,6 @@ export * from './Accordion'; export { default as AnimatedVisibility } from './AnimatedVisibility'; +export * from './AudioPlayer'; export * from './AutoComplete'; export * from './Avatar'; export * from './Badge'; @@ -45,6 +46,7 @@ export * from './RadioButton'; export { default as Scrollable } from './Scrollable'; export * from './SearchInput'; export * from './Select'; +export * from './Slider'; export * from './PaginatedSelect'; export * from './SelectInput'; export { default as Sidebar } from './Sidebar'; diff --git a/packages/fuselage/src/styles/colors.scss b/packages/fuselage/src/styles/colors.scss index 3881c72fbc..49380f57db 100644 --- a/packages/fuselage/src/styles/colors.scss +++ b/packages/fuselage/src/styles/colors.scss @@ -33,7 +33,7 @@ $-map-type-to-prefix: ( $base-color: map.get(token-colors.$colors, #{$prefix}#{$grade}); @if not $base-color { - @error 'invalid color reference'; + @error 'invalid color reference: #{$prefix}#{$grade}'; } @if ($alpha != null) { diff --git a/packages/fuselage/webpack.config.js b/packages/fuselage/webpack.config.js index 50854c83d6..3ad97f7ed2 100644 --- a/packages/fuselage/webpack.config.js +++ b/packages/fuselage/webpack.config.js @@ -99,6 +99,13 @@ module.exports = (env, { mode = 'production' }) => ({ 'react-dom', '@rocket.chat/icons', '@rocket.chat/fuselage-hooks', + 'react-aria', + 'react-stately', + '@rocket.chat/css-in-js', + '@rocket.chat/css-supports', + '@rocket.chat/fuselage-tokens', + '@rocket.chat/memo', + '@rocket.chat/styled', ], plugins: [ new webpack.DefinePlugin({ From 9ba3fac64aa3548afa501fa1f90fbba238bfc3a7 Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo <guilhermegazzo@gmail.com> Date: Tue, 9 May 2023 15:31:44 -0300 Subject: [PATCH 026/103] fix(fuselage, fuselage-hooks): `Position` (#1045) Co-authored-by: Douglas Fabris <devfabris@gmail.com> --- packages/fuselage-hooks/src/usePosition/index.ts | 15 +++++++++------ .../fuselage/src/components/Position/Position.tsx | 11 ++++++++++- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/packages/fuselage-hooks/src/usePosition/index.ts b/packages/fuselage-hooks/src/usePosition/index.ts index 4ee969f389..b7aff9c0e6 100644 --- a/packages/fuselage-hooks/src/usePosition/index.ts +++ b/packages/fuselage-hooks/src/usePosition/index.ts @@ -1,4 +1,4 @@ -import { useState } from 'react'; +import { useEffect, useRef, useState } from 'react'; import type { RefObject, CSSProperties } from 'react'; import { useDebouncedCallback } from '../useDebouncedCallback'; @@ -171,7 +171,7 @@ export function getPositionStyle({ } as UsePositionResult; } -const UPDATE_DEBOUNCE_DELAY = 10; +const UPDATE_DEBOUNCE_DELAY = 30; /** * Hook to deal and position an element using an anchor @@ -192,6 +192,12 @@ export function usePosition<TTarget extends Element, TAnchor extends Element>( ): UsePositionResult { const [style, setStyle] = useSafely(useState<UsePositionResult>(emptyStyle)); + const containerRef = useRef(container); + + useEffect(() => { + containerRef.current = container; + }, [container]); + const handleBoundingClientRectChange = useDebouncedCallback( useMutableCallback(() => { const target = targetRef.current; @@ -238,9 +244,6 @@ export function usePosition<TTarget extends Element, TAnchor extends Element>( useBoundingClientRectChanges(targetRef, handleBoundingClientRectChange); useBoundingClientRectChanges(anchorRef, handleBoundingClientRectChange); - useBoundingClientRectChanges( - { current: container }, - handleBoundingClientRectChange - ); + useBoundingClientRectChanges(containerRef, handleBoundingClientRectChange); return style; } diff --git a/packages/fuselage/src/components/Position/Position.tsx b/packages/fuselage/src/components/Position/Position.tsx index 8be0262c76..ccff0187c8 100644 --- a/packages/fuselage/src/components/Position/Position.tsx +++ b/packages/fuselage/src/components/Position/Position.tsx @@ -6,7 +6,7 @@ import type { ReactPortal, ReactElement, } from 'react'; -import { useRef, useMemo, cloneElement, useState } from 'react'; +import { useRef, useMemo, cloneElement, useState, useEffect } from 'react'; import { createPortal } from 'react-dom'; import type Box from '../Box'; @@ -51,6 +51,15 @@ const Position = ({ return element; }); + useEffect( + () => () => { + if (portalContainer.childNodes.length === 0) { + document.body.removeChild(portalContainer); + } + }, + [portalContainer] + ); + return createPortal( cloneElement(children, { ref: target, From 3a3f5e6fee3db33b2b290be834b36085355d17d8 Mon Sep 17 00:00:00 2001 From: Douglas Fabris <devfabris@gmail.com> Date: Tue, 9 May 2023 15:35:40 -0300 Subject: [PATCH 027/103] chore(fuselage): `AudioPlayer` small tweaks (#1047) --- .../components/AudioPlayer/AudioPlayer.tsx | 37 +++++++++++-------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/packages/fuselage/src/components/AudioPlayer/AudioPlayer.tsx b/packages/fuselage/src/components/AudioPlayer/AudioPlayer.tsx index bc20fc50ef..6428a88b71 100644 --- a/packages/fuselage/src/components/AudioPlayer/AudioPlayer.tsx +++ b/packages/fuselage/src/components/AudioPlayer/AudioPlayer.tsx @@ -32,17 +32,21 @@ export const AudioPlayer = forwardRef< HTMLAudioElement, { src: string; + type?: string; maxPlaybackSpeed?: number; minPlaybackSpeed?: number; playbackSpeedStep?: number; + download?: boolean; } >( ( { src, + type = 'audio/mpeg', maxPlaybackSpeed = 2, minPlaybackSpeed = 0.5, playbackSpeedStep = 0.5, + download = false, }, ref ) => { @@ -82,6 +86,7 @@ export const AudioPlayer = forwardRef< return ( <Box borderWidth='default' + bg='light' borderColor='extra-light' p='x16' width='fit-content' @@ -145,20 +150,22 @@ export const AudioPlayer = forwardRef< {getMaskTime(durationTime)} </Box> </Box> - <IconButton - is='a' - href={src} - download - icon='download' - large - onClick={(e) => { - const { host } = new URL(src); - if (host !== window.location.host) { - e.preventDefault(); - forceDownload(src); - } - }} - /> + {download && ( + <IconButton + is='a' + href={src} + download + icon='download' + large + onClick={(e) => { + const { host } = new URL(src); + if (host !== window.location.host) { + e.preventDefault(); + forceDownload(src); + } + }} + /> + )} </Box> <audio style={{ display: 'none' }} @@ -182,7 +189,7 @@ export const AudioPlayer = forwardRef< }} controls > - <source src={src} type='audio/mpeg' /> + <source src={src} type={type} /> </audio> </Box> ); From 3812ee3822b0ba4ee76f4223f48d4b026a54b25c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlia=20Jaeger=20Foresti?= <60678893+juliajforesti@users.noreply.github.com> Date: Mon, 15 May 2023 10:15:54 -0300 Subject: [PATCH 028/103] fix(fuselage): `ModalThumb` size (#1048) --- packages/fuselage/src/components/Modal/ModalThumb.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fuselage/src/components/Modal/ModalThumb.tsx b/packages/fuselage/src/components/Modal/ModalThumb.tsx index 1f24cfdd53..623a185549 100644 --- a/packages/fuselage/src/components/Modal/ModalThumb.tsx +++ b/packages/fuselage/src/components/Modal/ModalThumb.tsx @@ -8,6 +8,6 @@ export type ModalThumbProps = ComponentProps<typeof Avatar>; export const ModalThumb = (props: ModalThumbProps) => ( <Box> - <Avatar size='x32' {...props} /> + <Avatar size='x28' {...props} /> </Box> ); From e9d484348de8023635f529921e4c7ea905d7539b Mon Sep 17 00:00:00 2001 From: Douglas Fabris <devfabris@gmail.com> Date: Tue, 16 May 2023 13:02:39 -0300 Subject: [PATCH 029/103] chore(fuselage): Missing `aria-label` on `AudioPlayer` (#1049) --- .../src/components/AudioPlayer/AudioPlayer.tsx | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/packages/fuselage/src/components/AudioPlayer/AudioPlayer.tsx b/packages/fuselage/src/components/AudioPlayer/AudioPlayer.tsx index 6428a88b71..0efaf4f154 100644 --- a/packages/fuselage/src/components/AudioPlayer/AudioPlayer.tsx +++ b/packages/fuselage/src/components/AudioPlayer/AudioPlayer.tsx @@ -37,6 +37,12 @@ export const AudioPlayer = forwardRef< minPlaybackSpeed?: number; playbackSpeedStep?: number; download?: boolean; + playLabel?: string; + pauseLabel?: string; + audioPlaybackRangeLabel?: string; + reducePlaybackSpeedLabel?: string; + increasePlaybackSpeedLabel?: string; + downloadAudioFileLabel?: string; } >( ( @@ -47,6 +53,12 @@ export const AudioPlayer = forwardRef< minPlaybackSpeed = 0.5, playbackSpeedStep = 0.5, download = false, + playLabel = 'Play', + pauseLabel = 'Pause', + audioPlaybackRangeLabel = 'Audio Playback Range', + reducePlaybackSpeedLabel = 'Reduce Playback Speed', + increasePlaybackSpeedLabel = 'Increase Playback Speed', + downloadAudioFileLabel = 'Download Audio File', }, ref ) => { @@ -96,10 +108,12 @@ export const AudioPlayer = forwardRef< <IconButton large onClick={handlePlay} + aria-label={isPlaying ? pauseLabel : playLabel} icon={isPlaying ? 'pause-unfilled' : 'play-unfilled'} /> <Box mi='x12' position='relative'> <Slider + aria-label={audioPlaybackRangeLabel} showOutput={false} value={currentTime} maxValue={durationTime} @@ -133,6 +147,7 @@ export const AudioPlayer = forwardRef< justifyContent='space-between' > <IconButton + aria-label={reducePlaybackSpeedLabel} disabled={playbackSpeed <= minPlaybackSpeed} icon='h-bar' mini @@ -140,6 +155,7 @@ export const AudioPlayer = forwardRef< /> <Box mi='x8'>{playbackSpeed.toFixed(1)}x</Box> <IconButton + aria-label={increasePlaybackSpeedLabel} disabled={playbackSpeed >= maxPlaybackSpeed} icon='plus' mini @@ -152,6 +168,7 @@ export const AudioPlayer = forwardRef< </Box> {download && ( <IconButton + aria-label={downloadAudioFileLabel} is='a' href={src} download From 8558795eca74898844b024efc16901b212366714 Mon Sep 17 00:00:00 2001 From: Douglas Fabris <devfabris@gmail.com> Date: Wed, 17 May 2023 17:35:15 -0300 Subject: [PATCH 030/103] chore(fuselage): Change `StatesTitle` to h3 (#1051) --- .../src/components/States/States.styles.scss | 3 ++- packages/fuselage/src/components/States/States.tsx | 10 ++++++---- .../fuselage/src/components/States/StatesAction.tsx | 4 ++-- .../src/components/States/StatesActions.tsx | 2 +- .../fuselage/src/components/States/StatesIcon.tsx | 7 +++---- .../src/components/States/StatesSubtitle.tsx | 10 ++++++---- .../src/components/States/StatesSuggestion.tsx | 10 ++++++---- .../src/components/States/StatesSuggestionList.tsx | 13 +++++++++---- .../components/States/StatesSuggestionListItem.tsx | 7 ++++--- .../src/components/States/StatesSuggestionText.tsx | 13 +++++++++---- .../fuselage/src/components/States/StatesTitle.tsx | 10 ++++++---- 11 files changed, 54 insertions(+), 35 deletions(-) diff --git a/packages/fuselage/src/components/States/States.styles.scss b/packages/fuselage/src/components/States/States.styles.scss index 6ee0cc2b44..26640f5634 100644 --- a/packages/fuselage/src/components/States/States.styles.scss +++ b/packages/fuselage/src/components/States/States.styles.scss @@ -38,12 +38,13 @@ $variants: ( } &__title { + margin-block-start: lengths.margin(0); margin-block-end: lengths.margin(8); text-align: center; color: colors.font(default); - @include typography.use-font-scale(h2); + @include typography.use-font-scale(h3); } &__list, diff --git a/packages/fuselage/src/components/States/States.tsx b/packages/fuselage/src/components/States/States.tsx index bdc0a564bc..8cb25e3866 100644 --- a/packages/fuselage/src/components/States/States.tsx +++ b/packages/fuselage/src/components/States/States.tsx @@ -1,12 +1,14 @@ -import type { ReactNode } from 'react'; +import type { AllHTMLAttributes, ReactNode } from 'react'; import React from 'react'; type StatesProps = { children?: ReactNode; -}; +} & AllHTMLAttributes<HTMLDivElement>; -const States = ({ children }: StatesProps) => ( - <div className='rcx-states'>{children}</div> +const States = ({ children, ...props }: StatesProps) => ( + <div {...props} className='rcx-states'> + {children} + </div> ); export default States; diff --git a/packages/fuselage/src/components/States/StatesAction.tsx b/packages/fuselage/src/components/States/StatesAction.tsx index 23a103cc01..a0220bb86c 100644 --- a/packages/fuselage/src/components/States/StatesAction.tsx +++ b/packages/fuselage/src/components/States/StatesAction.tsx @@ -5,8 +5,8 @@ import { Button } from '..'; type StatesActionProps = ComponentProps<typeof Button>; -const StatesAction = ({ ...props }: StatesActionProps) => ( - <Button primary {...props} /> +const StatesAction = (props: StatesActionProps) => ( + <Button {...props} primary /> ); export default StatesAction; diff --git a/packages/fuselage/src/components/States/StatesActions.tsx b/packages/fuselage/src/components/States/StatesActions.tsx index bdb0fb9b4f..15ebdddfb2 100644 --- a/packages/fuselage/src/components/States/StatesActions.tsx +++ b/packages/fuselage/src/components/States/StatesActions.tsx @@ -6,7 +6,7 @@ import { ButtonGroup } from '../ButtonGroup'; type StatesActionsProps = ComponentProps<typeof ButtonGroup>; const StatesActions = ({ children, ...props }: StatesActionsProps) => ( - <ButtonGroup {...props}> {children} </ButtonGroup> + <ButtonGroup {...props}>{children}</ButtonGroup> ); export default StatesActions; diff --git a/packages/fuselage/src/components/States/StatesIcon.tsx b/packages/fuselage/src/components/States/StatesIcon.tsx index ece7cdd177..1d973202ce 100644 --- a/packages/fuselage/src/components/States/StatesIcon.tsx +++ b/packages/fuselage/src/components/States/StatesIcon.tsx @@ -4,15 +4,14 @@ import React from 'react'; import { Icon } from '../Icon'; type StatesIconProps = { - name: ComponentProps<typeof Icon>['name']; variation?: 'danger' | 'success' | 'warning' | 'primary'; -}; +} & ComponentProps<typeof Icon>; -const StatesIcon = ({ name, variation }: StatesIconProps) => ( +const StatesIcon = ({ variation, ...props }: StatesIconProps) => ( <Icon + {...props} rcx-states__icon className={variation && `rcx-states__icon--${variation}`} - name={name} size='x32' /> ); diff --git a/packages/fuselage/src/components/States/StatesSubtitle.tsx b/packages/fuselage/src/components/States/StatesSubtitle.tsx index c279435609..041a0b44be 100644 --- a/packages/fuselage/src/components/States/StatesSubtitle.tsx +++ b/packages/fuselage/src/components/States/StatesSubtitle.tsx @@ -1,12 +1,14 @@ -import type { ReactNode } from 'react'; +import type { AllHTMLAttributes, ReactNode } from 'react'; import React from 'react'; type StatesSubtitleProps = { children?: ReactNode; -}; +} & AllHTMLAttributes<HTMLDivElement>; -const StatesSubtitle = ({ children }: StatesSubtitleProps) => ( - <div className='rcx-states__subtitle'>{children}</div> +const StatesSubtitle = ({ children, ...props }: StatesSubtitleProps) => ( + <div {...props} className='rcx-states__subtitle'> + {children} + </div> ); export default StatesSubtitle; diff --git a/packages/fuselage/src/components/States/StatesSuggestion.tsx b/packages/fuselage/src/components/States/StatesSuggestion.tsx index cf86b56c67..8a95787658 100644 --- a/packages/fuselage/src/components/States/StatesSuggestion.tsx +++ b/packages/fuselage/src/components/States/StatesSuggestion.tsx @@ -1,12 +1,14 @@ -import type { ReactNode } from 'react'; +import type { ReactNode, AllHTMLAttributes } from 'react'; import React from 'react'; type StatesSuggestionProps = { children?: ReactNode; -}; +} & AllHTMLAttributes<HTMLDivElement>; -const StatesSuggestion = ({ children }: StatesSuggestionProps) => ( - <div className='rcx-states__suggestion'>{children}</div> +const StatesSuggestion = ({ children, ...props }: StatesSuggestionProps) => ( + <div {...props} className='rcx-states__suggestion'> + {children} + </div> ); export default StatesSuggestion; diff --git a/packages/fuselage/src/components/States/StatesSuggestionList.tsx b/packages/fuselage/src/components/States/StatesSuggestionList.tsx index 8d60be3886..46596debfd 100644 --- a/packages/fuselage/src/components/States/StatesSuggestionList.tsx +++ b/packages/fuselage/src/components/States/StatesSuggestionList.tsx @@ -1,12 +1,17 @@ -import type { ReactNode } from 'react'; +import type { AllHTMLAttributes, ReactNode } from 'react'; import React from 'react'; type StatesSuggestionListProps = { children?: ReactNode; -}; +} & AllHTMLAttributes<HTMLUListElement>; -const StatesSuggestionList = ({ children }: StatesSuggestionListProps) => ( - <ul className='rcx-states__list'>{children}</ul> +const StatesSuggestionList = ({ + children, + ...props +}: StatesSuggestionListProps) => ( + <ul {...props} className='rcx-states__list'> + {children} + </ul> ); export default StatesSuggestionList; diff --git a/packages/fuselage/src/components/States/StatesSuggestionListItem.tsx b/packages/fuselage/src/components/States/StatesSuggestionListItem.tsx index 83562627e1..fb431ed2b8 100644 --- a/packages/fuselage/src/components/States/StatesSuggestionListItem.tsx +++ b/packages/fuselage/src/components/States/StatesSuggestionListItem.tsx @@ -1,14 +1,15 @@ -import type { ReactNode } from 'react'; +import type { AllHTMLAttributes, ReactNode } from 'react'; import React from 'react'; type StatesSuggestionListItemProps = { children?: ReactNode; -}; +} & AllHTMLAttributes<HTMLLIElement>; const StatesSuggestionListItem = ({ children, + ...props }: StatesSuggestionListItemProps) => ( - <li className='rcx-states__list-item'> + <li {...props} className='rcx-states__list-item'> <span className='rcx-states__list-item-wrapper'>{children}</span> </li> ); diff --git a/packages/fuselage/src/components/States/StatesSuggestionText.tsx b/packages/fuselage/src/components/States/StatesSuggestionText.tsx index c4c9861852..1bc00fa7f4 100644 --- a/packages/fuselage/src/components/States/StatesSuggestionText.tsx +++ b/packages/fuselage/src/components/States/StatesSuggestionText.tsx @@ -1,12 +1,17 @@ -import type { ReactNode } from 'react'; +import type { AllHTMLAttributes, ReactNode } from 'react'; import React from 'react'; type StatesSuggestionTextProps = { children?: ReactNode; -}; +} & AllHTMLAttributes<HTMLDivElement>; -const StatesSuggestionText = ({ children }: StatesSuggestionTextProps) => ( - <div className='rcx-states__suggestion-text'>{children}</div> +const StatesSuggestionText = ({ + children, + ...props +}: StatesSuggestionTextProps) => ( + <div {...props} className='rcx-states__suggestion-text'> + {children} + </div> ); export default StatesSuggestionText; diff --git a/packages/fuselage/src/components/States/StatesTitle.tsx b/packages/fuselage/src/components/States/StatesTitle.tsx index 8f7ae7d4c9..ebd4d2291e 100644 --- a/packages/fuselage/src/components/States/StatesTitle.tsx +++ b/packages/fuselage/src/components/States/StatesTitle.tsx @@ -1,12 +1,14 @@ -import type { ReactNode } from 'react'; +import type { AllHTMLAttributes, ReactNode } from 'react'; import React from 'react'; type StatesTitleProps = { children?: ReactNode; -}; +} & AllHTMLAttributes<HTMLHeadingElement>; -const StatesTitle = ({ children }: StatesTitleProps) => ( - <div className='rcx-states__title'>{children}</div> +const StatesTitle = ({ children, ...props }: StatesTitleProps) => ( + <h3 {...props} className='rcx-states__title'> + {children} + </h3> ); export default StatesTitle; From 6c3874003be3d0fc4c636607428f64528add897d Mon Sep 17 00:00:00 2001 From: gabriellsh <40830821+gabriellsh@users.noreply.github.com> Date: Thu, 18 May 2023 11:56:54 -0300 Subject: [PATCH 031/103] feat: Message Highlight and Mention components (#1050) --- packages/fuselage/src/Theme.ts | 1 + .../components/Message/MessageHighlight.tsx | 38 ++++++++ .../src/components/Message/MessageMention.tsx | 25 +++++ .../components/Message/Messages.stories.tsx | 41 +++++++- .../components/Message/Messages.styles.scss | 95 +++++++++++++++++++ .../fuselage/src/components/Message/index.tsx | 6 ++ packages/fuselage/src/styles/colors.scss | 1 + 7 files changed, 202 insertions(+), 5 deletions(-) create mode 100644 packages/fuselage/src/components/Message/MessageHighlight.tsx create mode 100644 packages/fuselage/src/components/Message/MessageMention.tsx diff --git a/packages/fuselage/src/Theme.ts b/packages/fuselage/src/Theme.ts index 0636525b34..3008108a01 100644 --- a/packages/fuselage/src/Theme.ts +++ b/packages/fuselage/src/Theme.ts @@ -210,6 +210,7 @@ export const statusColors = { type StatusColors = keyof typeof statusColors; export const badgeBackgroundColors = { + 'badge-background-level-0': neutral.n400.theme('badge-background-level-0'), 'badge-background-level-1': neutral.n600.theme('badge-background-level-1'), 'badge-background-level-2': primary.p550.theme('badge-background-level-2'), 'badge-background-level-3': service1[500].theme('badge-background-level-3'), diff --git a/packages/fuselage/src/components/Message/MessageHighlight.tsx b/packages/fuselage/src/components/Message/MessageHighlight.tsx new file mode 100644 index 0000000000..0bb52dd54b --- /dev/null +++ b/packages/fuselage/src/components/Message/MessageHighlight.tsx @@ -0,0 +1,38 @@ +import type { ElementType } from 'react'; +import React from 'react'; + +import { prependClassName } from '../../helpers/prependClassName'; + +export type MessageHighlightProps = { + is?: ElementType; + clickable?: boolean; + variant?: 'critical' | 'relevant' | 'other'; + className?: string; + children: any; + title?: string; +}; + +function MessageHighlight({ + is: Tag = 'span', + variant = 'other', + className, + clickable, + ...props +}: MessageHighlightProps) { + const modifiers = [variant, clickable && 'clickable'] + .filter(Boolean) + .map((modifier) => `rcx-message__highlight--${modifier}`) + .join(' '); + + return ( + <Tag + className={prependClassName( + className, + `rcx-box rcx-box--full rcx-message__highlight ${modifiers}` + )} + {...props} + /> + ); +} + +export default MessageHighlight; diff --git a/packages/fuselage/src/components/Message/MessageMention.tsx b/packages/fuselage/src/components/Message/MessageMention.tsx new file mode 100644 index 0000000000..22baca65e8 --- /dev/null +++ b/packages/fuselage/src/components/Message/MessageMention.tsx @@ -0,0 +1,25 @@ +import type { ComponentProps } from 'react'; +import React from 'react'; + +import MessageHighlight from './MessageHighlight'; + +type MessageMentionProps = { + tag?: '#' | '@'; + innerClassName?: string; +} & ComponentProps<typeof MessageHighlight>; + +function MessageMention({ + tag, + className = '', + innerClassName, + ...props +}: MessageMentionProps) { + return ( + <span className={`${className} rcx-message__mention`}> + {tag} + <MessageHighlight className={innerClassName} {...props} /> + </span> + ); +} + +export default MessageMention; diff --git a/packages/fuselage/src/components/Message/Messages.stories.tsx b/packages/fuselage/src/components/Message/Messages.stories.tsx index 2c5982815a..eb32b35ecc 100644 --- a/packages/fuselage/src/components/Message/Messages.stories.tsx +++ b/packages/fuselage/src/components/Message/Messages.stories.tsx @@ -42,12 +42,43 @@ export const Default: ComponentStory<typeof Message> = () => ( <Message.Timestamp>12:00 PM</Message.Timestamp> </Message.Header> <Message.Body> - Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris - nisi ut aliquip ex ea commodo consequat a duis aute irure dolor in + Ut enim ad minim veniam,{' '} + <Message.Mention clickable tag='#' variant='other'> + channel + </Message.Mention>{' '} + quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea + commodo consequat a duis aute irure dolor in{' '} + <Message.Mention clickable tag='@' variant='critical'> + Haylie George + </Message.Mention>{' '} + <Message.Mention clickable tag='@' variant='critical'> + Haylie George + </Message.Mention>{' '} + <Message.Mention clickable tag='@' variant='critical'> + Haylie George + </Message.Mention>{' '} + <Message.Mention clickable tag='@' variant='critical'> + Haylie George + </Message.Mention>{' '} + <Message.Mention clickable tag='@' variant='critical'> + Haylie George + </Message.Mention>{' '} + commodo consequat a duis aute irure dolor in reprehenderit in + voluptate velit esse cillum dolore eu fugiat nulla pariatur. + Consectetur adipiscing commodo consequat a duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla - pariatur. Consectetur adipiscing elit, sed do eiusmod tempor - incididunt ut labore et dolore magna aliqua. Ut enim ad minim - veniam... + pariatur. Consectetur adipiscing{' '} + <Message.Highlight variant='critical'> + highlighted text + </Message.Highlight>{' '} + <Message.Mention clickable tag='@' variant='relevant'> + all + </Message.Mention>{' '} + elit, sed do eiusmod tempor incididunt ut labore et dolore magna + <Message.Mention clickable tag='@' variant='other'> + Gabriel.Henriques + </Message.Mention>{' '} + aliqua. Ut enim ad minim veniam... </Message.Body> <MessageReactions> <MessageReactions.Reaction mine counter={1} /> diff --git a/packages/fuselage/src/components/Message/Messages.styles.scss b/packages/fuselage/src/components/Message/Messages.styles.scss index c6cbdeac9d..b2d46e95a4 100644 --- a/packages/fuselage/src/components/Message/Messages.styles.scss +++ b/packages/fuselage/src/components/Message/Messages.styles.scss @@ -52,6 +52,33 @@ $message-background-color-highlight: functions.theme( $message-link-color: functions.theme('message-link-color', colors.font(info)); +$message-highlight-colors-critical-color: theme( + 'message-highlight-colors-critical-color', + colors.font(pure-white) +); +$message-highlight-colors-background-critical-color: theme( + 'message-highlight-colors-background-critical-color', + colors.badge('level-4') +); + +$message-highlight-colors-relevant-color: theme( + 'message-highlight-colors-relevant-color', + colors.font(pure-white) +); +$message-highlight-colors-background-relevant-color: theme( + 'message-highlight-colors-background-relevant-color', + colors.badge('level-3') +); + +$message-highlight-colors-other-color: theme( + 'message-highlight-colors-other-color', + colors.font(info) +); +$message-highlight-colors-background-other-color: theme( + 'message-highlight-colors-background-other-color', + colors.badge('level-0') +); + .rcx-message { @include mixins.container(); position: relative; @@ -287,4 +314,72 @@ $message-link-color: functions.theme('message-link-color', colors.font(info)); @include size.square(lengths.size(44)); } } + + &__mention { + white-space: nowrap; + word-break: keep-all; + } + + &__highlight { + position: relative; + + z-index: 1; + + display: inline-block; + + padding-inline-start: lengths.padding(2); + + white-space: nowrap; + + word-break: keep-all; + + font-weight: 500; + + &--clickable { + cursor: pointer; + + &:hover { + text-decoration: underline; + } + } + + &::before { + position: absolute; + + z-index: -1; + + width: calc(100% + lengths.padding(2)); + height: 18px; + + content: ''; + + transform: translateY(lengths.margin(2)) translateX(lengths.margin(-2)); + + border-radius: theme( + 'message-highlight-border-radius', + lengths.border-radius(medium) + ); + } + + &--critical { + &::before { + background-color: $message-highlight-colors-background-critical-color; + } + color: $message-highlight-colors-critical-color; + } + + &--relevant { + &::before { + background-color: $message-highlight-colors-background-relevant-color; + } + color: $message-highlight-colors-relevant-color; + } + + &--other { + &::before { + background-color: $message-highlight-colors-background-other-color; + } + color: $message-highlight-colors-other-color; + } + } } diff --git a/packages/fuselage/src/components/Message/index.tsx b/packages/fuselage/src/components/Message/index.tsx index 977df2f049..d2652ad91a 100644 --- a/packages/fuselage/src/components/Message/index.tsx +++ b/packages/fuselage/src/components/Message/index.tsx @@ -5,7 +5,9 @@ import { MessageContainer } from './MessageContainer'; import { MessageContainerFixed } from './MessageContainerFixed'; import { MessageDivider } from './MessageDivider'; import { MessageHeader } from './MessageHeader'; +import MessageHighlight from './MessageHighlight'; import { MessageLeftContainer } from './MessageLeftContainer'; +import MessageMention from './MessageMention'; import MessageMetrics from './MessageMetrics'; import { MessageName } from './MessageName'; import { MessageNameContainer } from './MessageNameContainer'; @@ -36,6 +38,8 @@ export * from './MessageRoles'; export * from './MessageTimestamp'; export * from './MessageUsername'; export * from './MessageEmoji'; +export * from './MessageHighlight'; +export * from './MessageMention'; export default Object.assign(Message, { Metrics: MessageMetrics, @@ -53,4 +57,6 @@ export default Object.assign(Message, { Roles: MessageRoles, Role: MessageRole, Divider: MessageDivider, + Highlight: MessageHighlight, + Mention: MessageMention, }); diff --git a/packages/fuselage/src/styles/colors.scss b/packages/fuselage/src/styles/colors.scss index 49380f57db..c47edc81f2 100644 --- a/packages/fuselage/src/styles/colors.scss +++ b/packages/fuselage/src/styles/colors.scss @@ -196,6 +196,7 @@ $-strokes: ( } $-badge-backgrounds: ( + level-0: neutral(400), level-1: neutral(600), level-2: primary(550), level-3: service-1(500), From 9aa087ae245096ffde5a3467c31fe6715b180fdc Mon Sep 17 00:00:00 2001 From: gabriellsh <40830821+gabriellsh@users.noreply.github.com> Date: Thu, 18 May 2023 13:21:59 -0300 Subject: [PATCH 032/103] fix(fuselage): Message Mention and Highlight types and export (#1053) --- .../fuselage/src/components/Message/MessageHighlight.tsx | 8 +++----- .../fuselage/src/components/Message/MessageMention.tsx | 6 ++---- packages/fuselage/src/components/Message/index.tsx | 4 ++-- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/packages/fuselage/src/components/Message/MessageHighlight.tsx b/packages/fuselage/src/components/Message/MessageHighlight.tsx index 0bb52dd54b..721ebdd22c 100644 --- a/packages/fuselage/src/components/Message/MessageHighlight.tsx +++ b/packages/fuselage/src/components/Message/MessageHighlight.tsx @@ -1,4 +1,4 @@ -import type { ElementType } from 'react'; +import type { ElementType, HTMLAttributes } from 'react'; import React from 'react'; import { prependClassName } from '../../helpers/prependClassName'; @@ -10,9 +10,9 @@ export type MessageHighlightProps = { className?: string; children: any; title?: string; -}; +} & HTMLAttributes<HTMLElement>; -function MessageHighlight({ +export function MessageHighlight({ is: Tag = 'span', variant = 'other', className, @@ -34,5 +34,3 @@ function MessageHighlight({ /> ); } - -export default MessageHighlight; diff --git a/packages/fuselage/src/components/Message/MessageMention.tsx b/packages/fuselage/src/components/Message/MessageMention.tsx index 22baca65e8..88e7ff179f 100644 --- a/packages/fuselage/src/components/Message/MessageMention.tsx +++ b/packages/fuselage/src/components/Message/MessageMention.tsx @@ -1,14 +1,14 @@ import type { ComponentProps } from 'react'; import React from 'react'; -import MessageHighlight from './MessageHighlight'; +import { MessageHighlight } from './MessageHighlight'; type MessageMentionProps = { tag?: '#' | '@'; innerClassName?: string; } & ComponentProps<typeof MessageHighlight>; -function MessageMention({ +export function MessageMention({ tag, className = '', innerClassName, @@ -21,5 +21,3 @@ function MessageMention({ </span> ); } - -export default MessageMention; diff --git a/packages/fuselage/src/components/Message/index.tsx b/packages/fuselage/src/components/Message/index.tsx index d2652ad91a..6c118291ea 100644 --- a/packages/fuselage/src/components/Message/index.tsx +++ b/packages/fuselage/src/components/Message/index.tsx @@ -5,9 +5,9 @@ import { MessageContainer } from './MessageContainer'; import { MessageContainerFixed } from './MessageContainerFixed'; import { MessageDivider } from './MessageDivider'; import { MessageHeader } from './MessageHeader'; -import MessageHighlight from './MessageHighlight'; +import { MessageHighlight } from './MessageHighlight'; import { MessageLeftContainer } from './MessageLeftContainer'; -import MessageMention from './MessageMention'; +import { MessageMention } from './MessageMention'; import MessageMetrics from './MessageMetrics'; import { MessageName } from './MessageName'; import { MessageNameContainer } from './MessageNameContainer'; From 5d64e33dca05a5ebaa60a169b65456cd8002e311 Mon Sep 17 00:00:00 2001 From: gabriellsh <40830821+gabriellsh@users.noreply.github.com> Date: Fri, 19 May 2023 15:38:33 -0300 Subject: [PATCH 033/103] fix(fuselage): Message Highlight touching text (#1056) --- .../src/components/Message/Messages.stories.tsx | 11 ++++++----- .../src/components/Message/Messages.styles.scss | 4 ++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/fuselage/src/components/Message/Messages.stories.tsx b/packages/fuselage/src/components/Message/Messages.stories.tsx index eb32b35ecc..d5fad5220a 100644 --- a/packages/fuselage/src/components/Message/Messages.stories.tsx +++ b/packages/fuselage/src/components/Message/Messages.stories.tsx @@ -70,15 +70,16 @@ export const Default: ComponentStory<typeof Message> = () => ( pariatur. Consectetur adipiscing{' '} <Message.Highlight variant='critical'> highlighted text - </Message.Highlight>{' '} + </Message.Highlight> + touching text.{' '} <Message.Mention clickable tag='@' variant='relevant'> all - </Message.Mention>{' '} - elit, sed do eiusmod tempor incididunt ut labore et dolore magna + </Message.Mention> + . elit, sed do eiusmod tempor incididunt ut labore et dolore magna <Message.Mention clickable tag='@' variant='other'> Gabriel.Henriques - </Message.Mention>{' '} - aliqua. Ut enim ad minim veniam... + </Message.Mention> + . aliqua. Ut enim ad minim veniam... </Message.Body> <MessageReactions> <MessageReactions.Reaction mine counter={1} /> diff --git a/packages/fuselage/src/components/Message/Messages.styles.scss b/packages/fuselage/src/components/Message/Messages.styles.scss index b2d46e95a4..59aceeb468 100644 --- a/packages/fuselage/src/components/Message/Messages.styles.scss +++ b/packages/fuselage/src/components/Message/Messages.styles.scss @@ -327,7 +327,7 @@ $message-highlight-colors-background-other-color: theme( display: inline-block; - padding-inline-start: lengths.padding(2); + padding-inline: lengths.padding(2); white-space: nowrap; @@ -348,7 +348,7 @@ $message-highlight-colors-background-other-color: theme( z-index: -1; - width: calc(100% + lengths.padding(2)); + width: 100%; height: 18px; content: ''; From 75bdb4e6e57f4e64e29a0ba4798237005282e69c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlia=20Jaeger=20Foresti?= <60678893+juliajforesti@users.noreply.github.com> Date: Fri, 19 May 2023 20:37:32 +0100 Subject: [PATCH 034/103] fix(fuselage): `AudioPlayer` responsiveness (#1052) --- .../components/AudioPlayer/AudioPlayer.tsx | 104 ++++++++++++------ .../src/components/Slider/Slider.stories.tsx | 35 ++---- .../fuselage/src/components/Slider/Slider.tsx | 11 +- .../src/components/Slider/SliderTrack.tsx | 4 +- 4 files changed, 83 insertions(+), 71 deletions(-) diff --git a/packages/fuselage/src/components/AudioPlayer/AudioPlayer.tsx b/packages/fuselage/src/components/AudioPlayer/AudioPlayer.tsx index 0efaf4f154..8e199f44f1 100644 --- a/packages/fuselage/src/components/AudioPlayer/AudioPlayer.tsx +++ b/packages/fuselage/src/components/AudioPlayer/AudioPlayer.tsx @@ -1,7 +1,9 @@ -import { useMergedRefs } from '@rocket.chat/fuselage-hooks'; +import { css } from '@rocket.chat/css-in-js'; +import { useMergedRefs, useResizeObserver } from '@rocket.chat/fuselage-hooks'; import React, { useState, useRef, forwardRef } from 'react'; import { Box, IconButton } from '../..'; +import { Palette } from '../../Theme'; import { Slider } from '../Slider'; const getMaskTime = (durationTime: number) => @@ -27,6 +29,12 @@ function forceDownload(url: string, fileName?: string) { }; xhr.send(); } +const SpeedControlStyle = css` + cursor: pointer; + &:hover { + background-color: ${Palette.surface['surface-hover']}; + } +`; export const AudioPlayer = forwardRef< HTMLAudioElement, @@ -68,6 +76,10 @@ export const AudioPlayer = forwardRef< const [currentTime, setCurrentTime] = useState(0); const [durationTime, setDurationTime] = useState(0); const [playbackSpeed, setPlaybackSpeed] = useState(1); + const { ref: containerRef, borderBoxSize } = useResizeObserver(); + + const collapseControls = + borderBoxSize.inlineSize && borderBoxSize.inlineSize < 240; const handlePlay = () => { const isPlaying = audioRef.current?.paused; @@ -81,13 +93,7 @@ export const AudioPlayer = forwardRef< const handlePlaybackSpeed = (mod: 1 | -1) => { if (audioRef.current) { - audioRef.current.playbackRate = Math.max( - Math.min( - audioRef.current.playbackRate + playbackSpeedStep * mod, - maxPlaybackSpeed - ), - minPlaybackSpeed - ); + audioRef.current.playbackRate += playbackSpeedStep * mod; } }; @@ -95,14 +101,27 @@ export const AudioPlayer = forwardRef< const handleDecreasePlayBackSpeed = () => handlePlaybackSpeed(-1); + const handlePlaybackSpeedSingleControl = () => { + const reachedMaxPlaybackSpeed = + maxPlaybackSpeed === audioRef?.current?.playbackRate; + + if (reachedMaxPlaybackSpeed) { + audioRef.current.playbackRate = minPlaybackSpeed; + return; + } + handleIncreasePlayBackSpeed(); + }; + return ( <Box borderWidth='default' bg='light' borderColor='extra-light' - p='x16' - width='fit-content' + p='x8' borderRadius='x4' + w='100%' + maxWidth='x300' + ref={containerRef} > <Box display='flex' alignItems='center'> <IconButton @@ -111,7 +130,7 @@ export const AudioPlayer = forwardRef< aria-label={isPlaying ? pauseLabel : playLabel} icon={isPlaying ? 'pause-unfilled' : 'play-unfilled'} /> - <Box mi='x12' position='relative'> + <Box mi='x12' position='relative' w='100%'> <Slider aria-label={audioPlaybackRangeLabel} showOutput={false} @@ -134,35 +153,48 @@ export const AudioPlayer = forwardRef< mb={'neg-x8'} > {getMaskTime(currentTime)} - <Box - fontScale='micro' - display='flex' - justifyContent='space-around' - id='controllers' - > + {collapseControls ? ( + <Box width='100%' display='flex' justifyContent='space-around'> + <Box + p='x4' + onClick={handlePlaybackSpeedSingleControl} + borderRadius='x4' + className={SpeedControlStyle} + > + {playbackSpeed.toFixed(1)}x + </Box> + </Box> + ) : ( <Box - mi='x8' + fontScale='micro' display='flex' - alignItems='center' - justifyContent='space-between' + justifyContent='space-around' + id='controllers' > - <IconButton - aria-label={reducePlaybackSpeedLabel} - disabled={playbackSpeed <= minPlaybackSpeed} - icon='h-bar' - mini - onClick={handleDecreasePlayBackSpeed} - /> - <Box mi='x8'>{playbackSpeed.toFixed(1)}x</Box> - <IconButton - aria-label={increasePlaybackSpeedLabel} - disabled={playbackSpeed >= maxPlaybackSpeed} - icon='plus' - mini - onClick={handleIncreasePlayBackSpeed} - /> + <Box + mi='x8' + display='flex' + alignItems='center' + justifyContent='space-between' + > + <IconButton + aria-label={reducePlaybackSpeedLabel} + disabled={playbackSpeed <= minPlaybackSpeed} + icon='h-bar' + mini + onClick={handleDecreasePlayBackSpeed} + /> + <Box mi='x8'>{playbackSpeed.toFixed(1)}x</Box> + <IconButton + aria-label={increasePlaybackSpeedLabel} + disabled={playbackSpeed >= maxPlaybackSpeed} + icon='plus' + mini + onClick={handleIncreasePlayBackSpeed} + /> + </Box> </Box> - </Box> + )} {getMaskTime(durationTime)} </Box> </Box> diff --git a/packages/fuselage/src/components/Slider/Slider.stories.tsx b/packages/fuselage/src/components/Slider/Slider.stories.tsx index bd774beb33..63b31a045f 100644 --- a/packages/fuselage/src/components/Slider/Slider.stories.tsx +++ b/packages/fuselage/src/components/Slider/Slider.stories.tsx @@ -31,7 +31,12 @@ export default { } as ComponentMeta<typeof Slider>; const Template: ComponentStory<typeof Slider> = (args) => ( - <Box width='500px' minHeight='100%' display='flex' alignItems='center'> + <Box width='x300' display='flex' alignItems='center'> + <Slider {...args} /> + </Box> +); +const TemplateVertical: ComponentStory<typeof Slider> = (args) => ( + <Box h='x200' display='flex' alignItems='center'> <Slider {...args} /> </Box> ); @@ -63,18 +68,6 @@ Default.args = { 'maxValue': 500, } as const; -export const Small: ComponentStory<typeof Slider> = Template.bind({}); -Small.args = { - 'aria-label': 'aria-range-label', - 'small': true, -} as const; - -export const Large: ComponentStory<typeof Slider> = Template.bind({}); -Large.args = { - 'aria-label': 'aria-range-label', - 'large': true, -} as const; - export const NoOutput: ComponentStory<typeof Slider> = Template.bind({}); NoOutput.args = { 'showOutput': false, @@ -87,16 +80,17 @@ WithLabel.args = { 'aria-label': 'range', } as const; -export const Vertical: ComponentStory<typeof Slider> = Template.bind({}); +export const Vertical: ComponentStory<typeof Slider> = TemplateVertical.bind( + {} +); Vertical.args = { 'label': 'Range', 'aria-label': 'range', 'orientation': 'vertical', } as const; -export const VerticalMultiThumb: ComponentStory<typeof Slider> = Template.bind( - {} -); +export const VerticalMultiThumb: ComponentStory<typeof Slider> = + TemplateVertical.bind({}); VerticalMultiThumb.args = { 'label': 'Range', 'aria-label': 'range', @@ -104,13 +98,6 @@ VerticalMultiThumb.args = { 'multiThumb': true, } as const; -export const VerticalSmall: ComponentStory<typeof Slider> = Template.bind({}); -VerticalSmall.args = { - 'aria-label': 'aria-range-label', - 'small': true, - 'orientation': 'vertical', -} as const; - export const WithDefaultValue: ComponentStory<typeof Slider> = Template.bind( {} ); diff --git a/packages/fuselage/src/components/Slider/Slider.tsx b/packages/fuselage/src/components/Slider/Slider.tsx index 796d2f7e73..7502a17d00 100644 --- a/packages/fuselage/src/components/Slider/Slider.tsx +++ b/packages/fuselage/src/components/Slider/Slider.tsx @@ -35,11 +35,6 @@ type SliderProps<T extends number | number[]> = AriaAttributes & { orientation?: 'horizontal' | 'vertical'; disabled?: boolean; defaultValue?: T; - small?: boolean; - /** - * 100% of parent's dimention - */ - large?: boolean; } & ( | { value: T; @@ -61,8 +56,6 @@ export function Slider<T extends number | [min: number, max: number]>( multiThumb, maxValue, minValue, - small, - large, } = props; // Get a defaultValue in the range for multiThumb @@ -119,12 +112,12 @@ export function Slider<T extends number | [min: number, max: number]>( ${isHorizontal && css` flex-direction: column; - width: ${small ? '150px' : large ? '100%' : '300px'}; + width: 100%; `}; ${isVertical && css` flex-direction: row-reverse; - height: ${small ? '50px' : large ? '100%' : '100px'}; + height: 100%; `} `, sliderState diff --git a/packages/fuselage/src/components/Slider/SliderTrack.tsx b/packages/fuselage/src/components/Slider/SliderTrack.tsx index 796cab2818..1ca942c88d 100644 --- a/packages/fuselage/src/components/Slider/SliderTrack.tsx +++ b/packages/fuselage/src/components/Slider/SliderTrack.tsx @@ -45,7 +45,7 @@ export const SliderTrack = ({ const getTrackGradient = () => { if (isHorizontal) { return multiThumb - ? `to right, ${light}} ${getThumbPosition( + ? `to right, ${light} ${getThumbPosition( state.values[0] )}%, ${highlight} 0, ${highlight} ${getThumbPosition( state.values[1] @@ -98,7 +98,7 @@ export const SliderTrack = ({ height: 100%; &::before { left: 50%; - width: 8px; + width: 4px; height: 100%; } `}; From f7c5854168c07c3b0da8c91c93651668f8cf74ce Mon Sep 17 00:00:00 2001 From: Douglas Fabris <devfabris@gmail.com> Date: Mon, 22 May 2023 12:13:49 -0300 Subject: [PATCH 035/103] feat(fuselage): Add `spacedColumn` prop to `Option` component (#1057) --- .../src/components/Option/Option.stories.tsx | 9 ++++++++ .../src/components/Option/Option.styles.scss | 10 +++++--- .../fuselage/src/components/Option/Option.tsx | 23 +++++++++++++------ 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/packages/fuselage/src/components/Option/Option.stories.tsx b/packages/fuselage/src/components/Option/Option.stories.tsx index eddd58565e..b935e3a764 100644 --- a/packages/fuselage/src/components/Option/Option.stories.tsx +++ b/packages/fuselage/src/components/Option/Option.stories.tsx @@ -208,3 +208,12 @@ export const AsSkeleton: ComponentStory<typeof Option> = () => ( <OptionSkeleton /> </Box> ); + +export const SpacedColumn: ComponentStory<typeof Option> = () => ( + <Box position='relative'> + <Option spacedColumn> + <OptionColumn>Lorem Ipsum</OptionColumn> + <OptionColumn>Lorem Ipsum</OptionColumn> + </Option> + </Box> +); diff --git a/packages/fuselage/src/components/Option/Option.styles.scss b/packages/fuselage/src/components/Option/Option.styles.scss index 22acdf8286..ce9de88ef3 100644 --- a/packages/fuselage/src/components/Option/Option.styles.scss +++ b/packages/fuselage/src/components/Option/Option.styles.scss @@ -45,6 +45,10 @@ $variants: ( align-items: center; margin-inline: lengths.margin(-2); + + &--spacedColumn { + justify-content: space-between; + } } &__icon { @@ -86,7 +90,7 @@ $variants: ( opacity: 0; } - .rcx-option__column { + &__column { @extend %column; display: flex; @@ -97,7 +101,7 @@ $variants: ( min-height: lengths.size(20); } - .rcx-option__input { + &__input { display: flex; justify-content: center; @@ -108,7 +112,7 @@ $variants: ( margin-inline-end: lengths.margin(-12); } - .rcx-option__description { + &__description { @include typography.use-font-scale(p2); @extend %column; display: inline; diff --git a/packages/fuselage/src/components/Option/Option.tsx b/packages/fuselage/src/components/Option/Option.tsx index 93770045fc..e96a8f8108 100644 --- a/packages/fuselage/src/components/Option/Option.tsx +++ b/packages/fuselage/src/components/Option/Option.tsx @@ -28,8 +28,9 @@ type OptionProps = { title?: string; disabled?: boolean; value?: string; + spacedColumn?: boolean; variant?: 'danger' | 'success' | 'warning' | 'primary'; - onClick?: (event: MouseEvent<HTMLDivElement>) => void; + onClick?: (event: MouseEvent<HTMLElement>) => void; } & AllHTMLAttributes<HTMLElement>; const Option = memo( @@ -46,16 +47,18 @@ const Option = memo( avatar, title, disabled, - onClick, + spacedColumn, variant, - ...options + onClick, + ...props }: OptionProps) => ( <Tag + {...props} key={id} id={id} ref={ref} - aria-selected={selected} - aria-disabled={String(disabled)} + aria-selected={!!selected} + aria-disabled={!!disabled} title={title} onClick={(e: React.MouseEvent<HTMLDivElement>) => { if (disabled) { @@ -64,7 +67,6 @@ const Option = memo( } onClick?.(e); }} - {...options} className={[ 'rcx-option', className, @@ -76,7 +78,14 @@ const Option = memo( .filter(Boolean) .join(' ')} > - <div className='rcx-option__wrapper'> + <div + className={[ + 'rcx-option__wrapper', + spacedColumn && 'rcx-option__wrapper--spacedColumn', + ] + .filter(Boolean) + .join(' ')} + > {avatar && <OptionAvatar>{avatar}</OptionAvatar>} {icon && <OptionIcon name={icon} />} {label && <OptionContent>{label}</OptionContent>} From e2f74539bce690f7ec335e07d2cefcf26cfb8c42 Mon Sep 17 00:00:00 2001 From: Pedro Berleze Rorato <41977327+PedroRorato@users.noreply.github.com> Date: Wed, 24 May 2023 00:05:26 -0300 Subject: [PATCH 036/103] feat(fuselage): `Contextualbar` component (#749) Co-authored-by: dougfabris <devfabris@gmail.com> --- .../Contextualbar/Contextualbar.stories.tsx | 91 +++++++++++++++++++ .../Contextualbar/Contextualbar.tsx | 34 +++++++ .../Contextualbar/ContextualbarAction.tsx | 18 ++++ .../Contextualbar/ContextualbarActions.tsx | 10 ++ .../Contextualbar/ContextualbarButton.tsx | 10 ++ .../Contextualbar/ContextualbarContent.tsx | 24 +++++ .../ContextualbarEmptyContent.tsx | 32 +++++++ .../Contextualbar/ContextualbarFooter.tsx | 16 ++++ .../Contextualbar/ContextualbarHeader.tsx | 39 ++++++++ .../Contextualbar/ContextualbarIcon.tsx | 10 ++ .../Contextualbar/ContextualbarSkeleton.tsx | 25 +++++ .../Contextualbar/ContextualbarTitle.tsx | 12 +++ .../src/components/Contextualbar/index.ts | 25 +++++ .../components/Skeleton/Skeleton.styles.scss | 4 +- packages/fuselage/src/components/index.ts | 1 + 15 files changed, 349 insertions(+), 2 deletions(-) create mode 100644 packages/fuselage/src/components/Contextualbar/Contextualbar.stories.tsx create mode 100644 packages/fuselage/src/components/Contextualbar/Contextualbar.tsx create mode 100644 packages/fuselage/src/components/Contextualbar/ContextualbarAction.tsx create mode 100644 packages/fuselage/src/components/Contextualbar/ContextualbarActions.tsx create mode 100644 packages/fuselage/src/components/Contextualbar/ContextualbarButton.tsx create mode 100644 packages/fuselage/src/components/Contextualbar/ContextualbarContent.tsx create mode 100644 packages/fuselage/src/components/Contextualbar/ContextualbarEmptyContent.tsx create mode 100644 packages/fuselage/src/components/Contextualbar/ContextualbarFooter.tsx create mode 100644 packages/fuselage/src/components/Contextualbar/ContextualbarHeader.tsx create mode 100644 packages/fuselage/src/components/Contextualbar/ContextualbarIcon.tsx create mode 100644 packages/fuselage/src/components/Contextualbar/ContextualbarSkeleton.tsx create mode 100644 packages/fuselage/src/components/Contextualbar/ContextualbarTitle.tsx create mode 100644 packages/fuselage/src/components/Contextualbar/index.ts diff --git a/packages/fuselage/src/components/Contextualbar/Contextualbar.stories.tsx b/packages/fuselage/src/components/Contextualbar/Contextualbar.stories.tsx new file mode 100644 index 0000000000..1cc1fb81a9 --- /dev/null +++ b/packages/fuselage/src/components/Contextualbar/Contextualbar.stories.tsx @@ -0,0 +1,91 @@ +import type { ComponentStory, ComponentMeta } from '@storybook/react'; +import React from 'react'; + +import { + Contextualbar, + ContextualbarAction, + ContextualbarActions, + ContextualbarButton, + ContextualbarContent, + ContextualbarEmptyContent, + ContextualbarFooter, + ContextualbarHeader, + ContextualbarSkeleton, + ContextualbarTitle, +} from '.'; +import { Button, ButtonGroup, IconButton, Box } from '..'; + +export default { + title: 'Containers/Contextualbar', + component: Contextualbar, + parameters: { + docs: { + description: { + component: `The \`Contextualbar\` has the purpose to persist and input information about the scope of the related page. + `, + }, + }, + }, + decorators: [ + (storyFn) => ( + <Box width='x400' elevation='2'> + {storyFn()} + </Box> + ), + ], +} as ComponentMeta<typeof Contextualbar>; + +export const Default: ComponentStory<typeof Contextualbar> = () => ( + <Contextualbar position='static' height='x540'> + <ContextualbarHeader> + <ContextualbarAction name='chevron-right' /> + <ContextualbarAction title='Back' name='arrow-back' /> + <ContextualbarTitle>Contextualbar Title</ContextualbarTitle> + <ContextualbarActions> + <ContextualbarAction + title='Title' + name='new-window' + onClick={() => {}} + /> + <ContextualbarAction + name='add-user' + onClick={() => console.log('close')} + /> + </ContextualbarActions> + </ContextualbarHeader> + <ContextualbarContent>Contextualbar Content</ContextualbarContent> + <ContextualbarFooter> + <ButtonGroup> + <ContextualbarButton width='full' secondary> + Cancel + </ContextualbarButton> + <Button width='full' primary> + Save + </Button> + <IconButton icon='menu' /> + </ButtonGroup> + </ContextualbarFooter> + </Contextualbar> +); + +export const Skeleton: ComponentStory<typeof Contextualbar> = () => ( + <ContextualbarSkeleton position='static' height='x540' /> +); + +export const Empty: ComponentStory<typeof Contextualbar> = () => ( + <Contextualbar position='static' height='x540'> + <ContextualbarHeader> + <ContextualbarAction name='chevron-right' /> + <ContextualbarTitle>Contextualbar Empty</ContextualbarTitle> + <ContextualbarActions> + <ContextualbarAction + title='Title' + name='new-window' + onClick={() => {}} + /> + </ContextualbarActions> + </ContextualbarHeader> + <ContextualbarEmptyContent /> + <ContextualbarFooter>Footer</ContextualbarFooter> + </Contextualbar> +); diff --git a/packages/fuselage/src/components/Contextualbar/Contextualbar.tsx b/packages/fuselage/src/components/Contextualbar/Contextualbar.tsx new file mode 100644 index 0000000000..4efdec8c7d --- /dev/null +++ b/packages/fuselage/src/components/Contextualbar/Contextualbar.tsx @@ -0,0 +1,34 @@ +import type { ComponentProps } from 'react'; +import React, { memo } from 'react'; + +import { Box } from '..'; + +type ContextualbarProps = ComponentProps<typeof Box>; + +const Contextualbar = ({ + children, + width, + position, + bg = 'room', + ...props +}: ContextualbarProps) => ( + <Box + rcx-vertical-bar + bg={bg} + display='flex' + flexDirection='column' + flexShrink={0} + width={width} + borderInlineStartWidth='default' + borderInlineStartColor='extra-light' + borderInlineStartStyle='solid' + height='full' + position={position} + zIndex={5} + {...props} + > + {children} + </Box> +); + +export default memo(Contextualbar); diff --git a/packages/fuselage/src/components/Contextualbar/ContextualbarAction.tsx b/packages/fuselage/src/components/Contextualbar/ContextualbarAction.tsx new file mode 100644 index 0000000000..9b2e7f91e7 --- /dev/null +++ b/packages/fuselage/src/components/Contextualbar/ContextualbarAction.tsx @@ -0,0 +1,18 @@ +import type { ReactElement, ComponentProps } from 'react'; +import React, { memo } from 'react'; + +import type { Icon } from '..'; +import { IconButton } from '..'; + +type ContextualbarActionProps = { + name: ComponentProps<typeof Icon>['name']; +} & Omit<ComponentProps<typeof IconButton>, 'icon'>; + +const ContextualbarAction = ({ + name, + ...props +}: ContextualbarActionProps): ReactElement => ( + <IconButton flexShrink={0} icon={name} {...props} tiny /> +); + +export default memo(ContextualbarAction); diff --git a/packages/fuselage/src/components/Contextualbar/ContextualbarActions.tsx b/packages/fuselage/src/components/Contextualbar/ContextualbarActions.tsx new file mode 100644 index 0000000000..56c80dfe53 --- /dev/null +++ b/packages/fuselage/src/components/Contextualbar/ContextualbarActions.tsx @@ -0,0 +1,10 @@ +import type { ReactElement, ComponentProps } from 'react'; +import React, { memo } from 'react'; + +import { ButtonGroup } from '..'; + +const ContextualbarActions = ( + props: ComponentProps<typeof ButtonGroup> +): ReactElement => <ButtonGroup {...props} />; + +export default memo(ContextualbarActions); diff --git a/packages/fuselage/src/components/Contextualbar/ContextualbarButton.tsx b/packages/fuselage/src/components/Contextualbar/ContextualbarButton.tsx new file mode 100644 index 0000000000..3e9cdc53d1 --- /dev/null +++ b/packages/fuselage/src/components/Contextualbar/ContextualbarButton.tsx @@ -0,0 +1,10 @@ +import type { ComponentProps, ReactElement } from 'react'; +import React, { memo } from 'react'; + +import { Button } from '..'; + +const ContextualbarButton = ( + props: ComponentProps<typeof Button> +): ReactElement => <Button {...props} />; + +export default memo(ContextualbarButton); diff --git a/packages/fuselage/src/components/Contextualbar/ContextualbarContent.tsx b/packages/fuselage/src/components/Contextualbar/ContextualbarContent.tsx new file mode 100644 index 0000000000..a85aae8128 --- /dev/null +++ b/packages/fuselage/src/components/Contextualbar/ContextualbarContent.tsx @@ -0,0 +1,24 @@ +import type { ComponentProps } from 'react'; +import React, { forwardRef, memo } from 'react'; + +import { Box } from '..'; + +const ContextualbarContent = forwardRef< + HTMLElement, + ComponentProps<typeof Box> +>(function ContextualbarContent(props, ref) { + return ( + <Box + ref={ref} + rcx-vertical-bar__content + paddingInline='x24' + display='flex' + flexDirection='column' + overflowY='hidden' + height='full' + {...props} + /> + ); +}); + +export default memo(ContextualbarContent); diff --git a/packages/fuselage/src/components/Contextualbar/ContextualbarEmptyContent.tsx b/packages/fuselage/src/components/Contextualbar/ContextualbarEmptyContent.tsx new file mode 100644 index 0000000000..6e66941fb7 --- /dev/null +++ b/packages/fuselage/src/components/Contextualbar/ContextualbarEmptyContent.tsx @@ -0,0 +1,32 @@ +import type { ComponentProps } from 'react'; +import React, { forwardRef, memo } from 'react'; + +import type { Box } from '..'; +import { StatesIcon, States, StatesTitle, StatesSubtitle } from '..'; +import ContextualbarContent from './ContextualbarContent'; + +type ContextualbarEmptyContentProps = ComponentProps<typeof Box> & { + icon?: ComponentProps<typeof StatesIcon>['name']; + title?: string; + subtitle?: string; +}; + +const ContextualbarEmptyContent = forwardRef< + HTMLElement, + ContextualbarEmptyContentProps +>(function ContextualbarEmptyContent( + { icon = 'magnifier', title = 'Nothing Found', subtitle, ...props }, + ref +) { + return ( + <ContextualbarContent justifyContent='center' {...props} ref={ref}> + <States> + <StatesIcon name={icon} /> + <StatesTitle>{title}</StatesTitle> + {subtitle && <StatesSubtitle>{subtitle}</StatesSubtitle>} + </States> + </ContextualbarContent> + ); +}); + +export default memo(ContextualbarEmptyContent); diff --git a/packages/fuselage/src/components/Contextualbar/ContextualbarFooter.tsx b/packages/fuselage/src/components/Contextualbar/ContextualbarFooter.tsx new file mode 100644 index 0000000000..3fe6ea41fe --- /dev/null +++ b/packages/fuselage/src/components/Contextualbar/ContextualbarFooter.tsx @@ -0,0 +1,16 @@ +import type { ComponentProps } from 'react'; +import React, { forwardRef, memo } from 'react'; + +import { Box } from '..'; + +const ContextualbarFooter = forwardRef<HTMLElement, ComponentProps<typeof Box>>( + function ContextualbarFooter({ children, ...props }, ref) { + return ( + <Box is='footer' p='x24' {...props} ref={ref}> + {children} + </Box> + ); + } +); + +export default memo(ContextualbarFooter); diff --git a/packages/fuselage/src/components/Contextualbar/ContextualbarHeader.tsx b/packages/fuselage/src/components/Contextualbar/ContextualbarHeader.tsx new file mode 100644 index 0000000000..73e7e47850 --- /dev/null +++ b/packages/fuselage/src/components/Contextualbar/ContextualbarHeader.tsx @@ -0,0 +1,39 @@ +import type { ComponentProps } from 'react'; +import React, { memo } from 'react'; + +import Box from '../Box'; +import Margins from '../Margins'; + +type ContextualbarHeaderProps = ComponentProps<typeof Box>; + +const ContextualbarHeader = ({ + children, + ...props +}: ContextualbarHeaderProps) => ( + <Box + display='flex' + alignItems='center' + height='56px' + is='h3' + pi='x24' + borderBlockEndWidth='default' + borderBlockColor='extra-light' + flexShrink={0} + {...props} + > + <Box + marginInline='neg-x4' + display='flex' + alignItems='center' + justifyContent='space-between' + fontScale='h4' + flexGrow={1} + overflow='hidden' + color='default' + > + <Margins inline='x4'>{children}</Margins> + </Box> + </Box> +); + +export default memo(ContextualbarHeader); diff --git a/packages/fuselage/src/components/Contextualbar/ContextualbarIcon.tsx b/packages/fuselage/src/components/Contextualbar/ContextualbarIcon.tsx new file mode 100644 index 0000000000..ef1142f6fe --- /dev/null +++ b/packages/fuselage/src/components/Contextualbar/ContextualbarIcon.tsx @@ -0,0 +1,10 @@ +import type { ReactElement, ComponentProps } from 'react'; +import React, { memo } from 'react'; + +import { Icon } from '..'; + +const ContextualbarIcon = ( + props: ComponentProps<typeof Icon> +): ReactElement => <Icon {...props} pi='x2' size='x24' />; + +export default memo(ContextualbarIcon); diff --git a/packages/fuselage/src/components/Contextualbar/ContextualbarSkeleton.tsx b/packages/fuselage/src/components/Contextualbar/ContextualbarSkeleton.tsx new file mode 100644 index 0000000000..bdea581c96 --- /dev/null +++ b/packages/fuselage/src/components/Contextualbar/ContextualbarSkeleton.tsx @@ -0,0 +1,25 @@ +import type { ReactElement, ComponentProps } from 'react'; +import React, { memo } from 'react'; + +import { Contextualbar, ContextualbarHeader } from '.'; +import { Box, Skeleton } from '..'; + +const ContextualbarSkeleton = ( + props: ComponentProps<typeof Box> +): ReactElement => ( + <Contextualbar {...props} width='100%'> + <ContextualbarHeader> + <Skeleton width='100%' /> + </ContextualbarHeader> + <Box p='x24'> + <Skeleton mbe='x4' width='32px' height='32px' variant='rect' /> + {Array(5) + .fill(5) + .map((_, index) => ( + <Skeleton key={index} /> + ))} + </Box> + </Contextualbar> +); + +export default memo(ContextualbarSkeleton); diff --git a/packages/fuselage/src/components/Contextualbar/ContextualbarTitle.tsx b/packages/fuselage/src/components/Contextualbar/ContextualbarTitle.tsx new file mode 100644 index 0000000000..32d7117ef1 --- /dev/null +++ b/packages/fuselage/src/components/Contextualbar/ContextualbarTitle.tsx @@ -0,0 +1,12 @@ +import type { ReactElement, ComponentProps } from 'react'; +import React, { memo } from 'react'; + +import { Box } from '..'; + +const ContextualbarTitle = ( + props: ComponentProps<typeof Box> +): ReactElement => ( + <Box flexShrink={1} flexGrow={1} withTruncatedText {...props} /> +); + +export default memo(ContextualbarTitle); diff --git a/packages/fuselage/src/components/Contextualbar/index.ts b/packages/fuselage/src/components/Contextualbar/index.ts new file mode 100644 index 0000000000..9d21b8c6bf --- /dev/null +++ b/packages/fuselage/src/components/Contextualbar/index.ts @@ -0,0 +1,25 @@ +import Contextualbar from './Contextualbar'; +import ContextualbarAction from './ContextualbarAction'; +import ContextualbarActions from './ContextualbarActions'; +import ContextualbarButton from './ContextualbarButton'; +import ContextualbarContent from './ContextualbarContent'; +import ContextualbarEmptyContent from './ContextualbarEmptyContent'; +import ContextualbarFooter from './ContextualbarFooter'; +import ContextualbarHeader from './ContextualbarHeader'; +import ContextualbarIcon from './ContextualbarIcon'; +import ContextualbarSkeleton from './ContextualbarSkeleton'; +import ContextualbarTitle from './ContextualbarTitle'; + +export { + Contextualbar, + ContextualbarAction, + ContextualbarActions, + ContextualbarButton, + ContextualbarContent, + ContextualbarEmptyContent, + ContextualbarFooter, + ContextualbarHeader, + ContextualbarIcon, + ContextualbarSkeleton, + ContextualbarTitle, +}; diff --git a/packages/fuselage/src/components/Skeleton/Skeleton.styles.scss b/packages/fuselage/src/components/Skeleton/Skeleton.styles.scss index fc1d991764..1c6d7bfbb2 100644 --- a/packages/fuselage/src/components/Skeleton/Skeleton.styles.scss +++ b/packages/fuselage/src/components/Skeleton/Skeleton.styles.scss @@ -8,6 +8,8 @@ animation: rcx-skeleton__animation 1s linear 0s infinite running; + border-radius: lengths.border-radius(medium); + background-color: colors.stroke(extra-dark); &--text { @@ -17,8 +19,6 @@ transform: scale(1, 0.6); transform-origin: 0 60%; - border-radius: lengths.border-radius(medium); - &:empty::before { content: '\00a0'; } diff --git a/packages/fuselage/src/components/index.ts b/packages/fuselage/src/components/index.ts index 36efc48a0b..c044121a8d 100644 --- a/packages/fuselage/src/components/index.ts +++ b/packages/fuselage/src/components/index.ts @@ -13,6 +13,7 @@ export * from './Callout'; export * from './CheckBox'; export * from './Chevron'; export { default as CodeSnippet } from './CodeSnippet'; +export * from './Contextualbar'; export { default as Chip } from './Chip'; export * from './Divider'; export * from './Dropdown'; From ff016cc05889f641b3a8166f8e0fa8b822655ded Mon Sep 17 00:00:00 2001 From: gabriellsh <40830821+gabriellsh@users.noreply.github.com> Date: Wed, 24 May 2023 10:17:19 -0300 Subject: [PATCH 037/103] fix(fuselage): Reintroduce children to IconButton (#1061) --- packages/fuselage/src/components/Button/IconButton.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/fuselage/src/components/Button/IconButton.tsx b/packages/fuselage/src/components/Button/IconButton.tsx index 4c520ea008..d40a29cf17 100644 --- a/packages/fuselage/src/components/Button/IconButton.tsx +++ b/packages/fuselage/src/components/Button/IconButton.tsx @@ -57,6 +57,7 @@ export const IconButton = forwardRef( small, medium, pressed, + children, ...props }: IconButtonProps, ref: Ref<HTMLElement> @@ -131,6 +132,7 @@ export const IconButton = forwardRef( ref={ref} {...props} > + {children} {isValidElement(icon) ? ( icon ) : ( From 97f8045ff57b61cec507a542282fd5264a51b764 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlia=20Jaeger=20Foresti?= <60678893+juliajforesti@users.noreply.github.com> Date: Wed, 24 May 2023 14:59:03 +0100 Subject: [PATCH 038/103] chore(fuselage, fuselage-tokens): update `status-warning-2` color (#1058) Co-authored-by: Douglas Fabris <devfabris@gmail.com> --- packages/fuselage-tokens/colors.js | 1 + packages/fuselage-tokens/colors.json | 1 + packages/fuselage-tokens/colors.mjs | 1 + packages/fuselage-tokens/colors.scss | 1 + packages/fuselage-tokens/src/colors.jsonc | 1 + packages/fuselage-tokens/src/colors/base.json | 1 + packages/fuselage/src/Theme.ts | 3 ++- packages/fuselage/src/styles/colors.scss | 2 +- 8 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/fuselage-tokens/colors.js b/packages/fuselage-tokens/colors.js index dc2cb5b145..821b46eeca 100644 --- a/packages/fuselage-tokens/colors.js +++ b/packages/fuselage-tokens/colors.js @@ -73,6 +73,7 @@ module.exports = { 's2-800': '#4A105D', 's2-900': '#350B42', 'w100': '#FFF6D6', + 'w150': '#FFF8E0', 'w200': '#FFECAD', 'w300': '#FFE383', 'w400': '#FFD95A', diff --git a/packages/fuselage-tokens/colors.json b/packages/fuselage-tokens/colors.json index 5a12551d26..f52c578747 100644 --- a/packages/fuselage-tokens/colors.json +++ b/packages/fuselage-tokens/colors.json @@ -71,6 +71,7 @@ "s2-800": "#4A105D", "s2-900": "#350B42", "w100": "#FFF6D6", + "w150": "#FFF8E0", "w200": "#FFECAD", "w300": "#FFE383", "w400": "#FFD95A", diff --git a/packages/fuselage-tokens/colors.mjs b/packages/fuselage-tokens/colors.mjs index 8b3ef0ee08..fb41bdc54a 100644 --- a/packages/fuselage-tokens/colors.mjs +++ b/packages/fuselage-tokens/colors.mjs @@ -71,6 +71,7 @@ export default { 's2-800': '#4A105D', 's2-900': '#350B42', 'w100': '#FFF6D6', + 'w150': '#FFF8E0', 'w200': '#FFECAD', 'w300': '#FFE383', 'w400': '#FFD95A', diff --git a/packages/fuselage-tokens/colors.scss b/packages/fuselage-tokens/colors.scss index 3eb1b52efa..6eb29e2052 100644 --- a/packages/fuselage-tokens/colors.scss +++ b/packages/fuselage-tokens/colors.scss @@ -71,6 +71,7 @@ $colors: ( s2-800: #4a105d, s2-900: #350b42, w100: #fff6d6, + w150: #fff8e0, w200: #ffecad, w300: #ffe383, w400: #ffd95a, diff --git a/packages/fuselage-tokens/src/colors.jsonc b/packages/fuselage-tokens/src/colors.jsonc index 5a12551d26..f52c578747 100644 --- a/packages/fuselage-tokens/src/colors.jsonc +++ b/packages/fuselage-tokens/src/colors.jsonc @@ -71,6 +71,7 @@ "s2-800": "#4A105D", "s2-900": "#350B42", "w100": "#FFF6D6", + "w150": "#FFF8E0", "w200": "#FFECAD", "w300": "#FFE383", "w400": "#FFD95A", diff --git a/packages/fuselage-tokens/src/colors/base.json b/packages/fuselage-tokens/src/colors/base.json index aaf2626617..0d18e6d083 100644 --- a/packages/fuselage-tokens/src/colors/base.json +++ b/packages/fuselage-tokens/src/colors/base.json @@ -72,6 +72,7 @@ "s2-800": { "value": "#4A105D", "group": "colors" }, "s2-900": { "value": "#350B42", "group": "colors" }, "w100": { "value": "#FFF6D6", "group": "colors" }, + "w150": { "value": "#FFF8E0", "group": "colors" }, "w200": { "value": "#FFECAD", "group": "colors" }, "w300": { "value": "#FFE383", "group": "colors" }, "w400": { "value": "#FFD95A", "group": "colors" }, diff --git a/packages/fuselage/src/Theme.ts b/packages/fuselage/src/Theme.ts index 3008108a01..9ba09d6611 100644 --- a/packages/fuselage/src/Theme.ts +++ b/packages/fuselage/src/Theme.ts @@ -83,6 +83,7 @@ const success = { const warning = { w100: new Var('warning-100', tokenColors.w100), + w150: new Var('warning-150', tokenColors.w150), w200: new Var('warning-200', tokenColors.w200), w300: new Var('warning-300', tokenColors.w300), w400: new Var('warning-400', tokenColors.w400), @@ -184,7 +185,7 @@ export const statusBackgroundColors = { 'status-background-success': success.s200.theme('status-background-success'), 'status-background-danger': danger.d200.theme('status-background-danger'), 'status-background-warning': warning.w200.theme('status-background-warning'), - 'status-background-warning-2': warning.w100.theme( + 'status-background-warning-2': warning.w150.theme( 'status-background-warning-2' ), 'status-background-service-1': service1['200'].theme( diff --git a/packages/fuselage/src/styles/colors.scss b/packages/fuselage/src/styles/colors.scss index c47edc81f2..725993f9c5 100644 --- a/packages/fuselage/src/styles/colors.scss +++ b/packages/fuselage/src/styles/colors.scss @@ -151,7 +151,7 @@ $-status-bullet: ( $-status-backgrounds: ( success: success(200), warning: warning(200), - warning-2: warning(100), + warning-2: warning(150), danger: danger(200), service-1: service-1(200), service-2: service-2(200), From d575365b2944f0cf6eb2737e45d3b3652b641c49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlia=20Jaeger=20Foresti?= <60678893+juliajforesti@users.noreply.github.com> Date: Wed, 24 May 2023 18:07:16 +0100 Subject: [PATCH 039/103] chore(fuselage): `IconButton` stories (#1062) --- .../components/Button/IconButton.stories.tsx | 24 ++----------------- 1 file changed, 2 insertions(+), 22 deletions(-) diff --git a/packages/fuselage/src/components/Button/IconButton.stories.tsx b/packages/fuselage/src/components/Button/IconButton.stories.tsx index bf42a755e4..c0eb684e6d 100644 --- a/packages/fuselage/src/components/Button/IconButton.stories.tsx +++ b/packages/fuselage/src/components/Button/IconButton.stories.tsx @@ -65,19 +65,14 @@ export const States = () => ( disabled: { disabled: true }, }} yAxis={{ - default: { - children: 'IconButton', - }, + default: {}, info: { - children: 'IconButton', info: true, }, danger: { - children: 'IconButton', danger: true, }, emoji: { - children: 'IconButton', icon: EmojiElement, }, }} @@ -99,18 +94,14 @@ export const States = () => ( }} yAxis={{ default: { - children: 'IconButton', }, info: { - children: 'IconButton', info: true, }, danger: { - children: 'IconButton', danger: true, }, emoji: { - children: 'IconButton', icon: EmojiElement, }, }} @@ -134,46 +125,35 @@ export const Variants = () => ( disabled: { disabled: true }, }} yAxis={{ - 'default': { - children: 'IconButton', - }, + 'default': {}, 'info': { - children: 'IconButton', info: true, }, 'danger': { - children: 'IconButton', danger: true, }, 'success': { - children: 'IconButton', success: true, }, 'warning': { - children: 'IconButton', warning: true, }, 'secondary': { - children: 'IconButton', secondary: true, }, 'secondary-info | primary': { - children: 'IconButton', info: true, secondary: true, }, 'secondary-danger': { - children: 'IconButton', danger: true, secondary: true, }, 'secondary-success': { - children: 'IconButton', success: true, secondary: true, }, 'secondary-warning': { - children: 'IconButton', warning: true, secondary: true, }, From 53089af1404ee8f3c064348c8c81ee324480b5a0 Mon Sep 17 00:00:00 2001 From: Tiago Evangelista Pinto <tiago.evangelista@rocket.chat> Date: Wed, 24 May 2023 14:08:00 -0300 Subject: [PATCH 040/103] chore: Remove `fuselage-ui-kit` and `uikit-playground` packages (#1060) --- .github/workflows/cd.yml | 6 +- .github/workflows/ci-pr-closed.yml | 2 +- .github/workflows/ci-pr-opened.yml | 4 - .github/workflows/ci-pr.yml | 2 - README.md | 2 - packages/fuselage-ui-kit/.babelrc.json | 3 - packages/fuselage-ui-kit/.eslintignore | 5 - packages/fuselage-ui-kit/.eslintrc.js | 3 - packages/fuselage-ui-kit/.gitignore | 4 - packages/fuselage-ui-kit/.prettierignore | 3 - packages/fuselage-ui-kit/.prettierrc.js | 1 - packages/fuselage-ui-kit/.storybook/logo.svg | 68 - .../fuselage-ui-kit/.storybook/logo.svg.d.ts | 3 - packages/fuselage-ui-kit/.storybook/main.js | 14 - .../fuselage-ui-kit/.storybook/manager.ts | 17 - .../fuselage-ui-kit/.storybook/preview.tsx | 22 - packages/fuselage-ui-kit/CHANGELOG.md | 322 -- packages/fuselage-ui-kit/README.md | 102 - packages/fuselage-ui-kit/package.json | 90 - .../src/blocks/ActionsBlock.Action.tsx | 37 - .../src/blocks/ActionsBlock.tsx | 59 - .../src/blocks/ContextBlock.Item.tsx | 37 - .../src/blocks/ContextBlock.tsx | 40 - .../src/blocks/DividerBlock.tsx | 14 - .../src/blocks/ImageBlock.styles.tsx | 24 - .../fuselage-ui-kit/src/blocks/ImageBlock.tsx | 106 - .../fuselage-ui-kit/src/blocks/InputBlock.tsx | 48 - .../src/blocks/PreviewBlock.tsx | 91 - .../src/blocks/SectionBlock.Fields.tsx | 29 - .../src/blocks/SectionBlock.tsx | 56 - .../src/contexts/SurfaceContext.ts | 8 - .../src/contexts/kitContext.ts | 53 - .../src/elements/ButtonElement.tsx | 63 - .../ContextElement/ContextElement.tsx | 32 - .../ContextElement/ContextElementItem.tsx | 39 - .../src/elements/ContextElement/index.tsx | 1 - .../src/elements/DatePickerElement.tsx | 39 - .../src/elements/ImageElement.styles.tsx | 24 - .../src/elements/ImageElement.tsx | 26 - .../src/elements/LinearScaleElement.tsx | 99 - .../src/elements/MultiStaticSelectElement.tsx | 52 - .../src/elements/OverflowElement.tsx | 93 - .../src/elements/PlainTextInputElement.tsx | 55 - .../src/elements/StaticSelectElement.tsx | 51 - .../src/hooks/useUiKitState.ts | 138 - packages/fuselage-ui-kit/src/index.ts | 4 - .../src/stories/Banner.stories.tsx | 153 - .../src/stories/Message.stories.tsx | 148 - .../src/stories/Modal.stories.tsx | 194 - .../src/stories/payloads/actions.ts | 219 - .../src/stories/payloads/conditional.ts | 20 - .../src/stories/payloads/context.ts | 67 - .../src/stories/payloads/divider.ts | 7 - .../src/stories/payloads/image.ts | 24 - .../src/stories/payloads/img.ts | 3 - .../src/stories/payloads/index.ts | 8 - .../src/stories/payloads/input.ts | 149 - .../src/stories/payloads/preview.ts | 66 - .../src/stories/payloads/section.ts | 173 - .../src/surfaces/BannerSurface.tsx | 17 - .../src/surfaces/FuselageSurfaceRenderer.tsx | 344 -- .../src/surfaces/MessageSurface.tsx | 17 - .../src/surfaces/ModalSurface.tsx | 17 - .../fuselage-ui-kit/src/surfaces/Surface.tsx | 13 - .../src/surfaces/SurfaceContext.tsx | 27 - .../src/surfaces/createSurfaceRenderer.tsx | 23 - .../fuselage-ui-kit/src/surfaces/index.ts | 18 - .../fuselage-ui-kit/src/utils/BlockProps.ts | 11 - .../src/utils/UiKitComponent.tsx | 14 - .../src/utils/fromTextObjectToString.ts | 21 - packages/fuselage-ui-kit/tsconfig-cjs.json | 7 - packages/fuselage-ui-kit/tsconfig-esm.json | 7 - packages/fuselage-ui-kit/tsconfig.json | 25 - packages/uikit-playground/.eslintignore | 7 - packages/uikit-playground/.eslintrc.js | 32 - packages/uikit-playground/.gitignore | 23 - packages/uikit-playground/.prettierignore | 6 - packages/uikit-playground/.prettierrc.js | 1 - packages/uikit-playground/README.md | 46 - packages/uikit-playground/package.json | 83 - packages/uikit-playground/public/favicon.ico | Bin 3870 -> 0 bytes packages/uikit-playground/public/index.html | 43 - packages/uikit-playground/public/logo192.png | Bin 5347 -> 0 bytes packages/uikit-playground/public/logo512.png | Bin 9664 -> 0 bytes .../uikit-playground/public/manifest.json | 25 - packages/uikit-playground/public/robots.txt | 3 - packages/uikit-playground/src/App.css | 39 - packages/uikit-playground/src/App.tsx | 18 - .../CodeEditor/Extensions/HighlightStyle.ts | 14 - .../CodeEditor/Extensions/basicSetup.ts | 59 - .../Components/CodeEditor/Extensions/index.ts | 10 - .../Components/CodeEditor/Extensions/lint.ts | 5 - .../Components/CodeEditor/Extensions/theme.ts | 41 - .../src/Components/CodeEditor/index.tsx | 68 - .../ComponentSideBar/ScrollableSideBar.tsx | 25 - .../Components/ComponentSideBar/SideBar.tsx | 45 - .../Components/ComponentSideBar/SliderBtn.tsx | 116 - .../src/Components/ComponentSideBar/index.tsx | 1 - .../Components/Draggable/DraggableList.tsx | 51 - .../Draggable/DraggableListItem.tsx | 35 - .../src/Components/DropDown/DropDown.tsx | 34 - .../src/Components/DropDown/Items.tsx | 65 - .../src/Components/DropDown/ItemsIcon.tsx | 29 - .../src/Components/DropDown/index.tsx | 1 - .../src/Components/DropDown/itemsStyle.ts | 45 - .../src/Components/DropDown/types.ts | 16 - .../NavBar/BurgerIcon/BurgerIcon.tsx | 25 - .../src/Components/NavBar/BurgerIcon/Line.tsx | 53 - .../Components/NavBar/BurgerIcon/Wrapper.tsx | 25 - .../Components/NavBar/BurgerIcon/index.tsx | 1 - .../src/Components/NavBar/Divider.tsx | 7 - .../src/Components/NavBar/Logo.tsx | 19 - .../src/Components/NavBar/NavBar.tsx | 32 - .../src/Components/NavBar/RightNavBtn.tsx | 24 - .../src/Components/NavBar/index.tsx | 1 - .../Components/Preview/Display/Display.tsx | 18 - .../RenderPayload/DeleteElementBtn.tsx | 42 - .../Display/RenderPayload/ElementWrapper.tsx | 40 - .../Display/RenderPayload/RenderPayload.tsx | 36 - .../Preview/Display/RenderPayload/intex.ts | 1 - .../Preview/Display/Surface/BannerSurface.tsx | 13 - .../Display/Surface/MessageSurface.tsx | 50 - .../Preview/Display/Surface/ModalSurface.tsx | 36 - .../Preview/Display/Surface/Reorder.ts | 11 - .../Preview/Display/Surface/Surface.tsx | 61 - .../Preview/Display/Surface/index.ts | 1 - .../src/Components/Preview/Display/index.ts | 1 - .../src/Components/Preview/Editor/Editor.tsx | 25 - .../src/Components/Preview/Editor/index.tsx | 1 - .../Components/Preview/NavPanel/NavPanel.tsx | 57 - .../Components/Preview/NavPanel/PanelBtn.tsx | 38 - .../Components/Preview/NavPanel/TabChange.tsx | 36 - .../src/Components/Preview/NavPanel/index.tsx | 1 - .../src/Components/Preview/Preview.tsx | 39 - .../SplitPlaneContainer.tsx | 46 - .../Preview/SplitPlaneContainer/index.ts | 1 - .../SplitPlaneContainer/splitPlane.css | 54 - .../src/Components/Preview/Wrapper.tsx | 46 - .../src/Components/Preview/index.tsx | 1 - .../SurfaceSelect/SurfaceSelect.tsx | 25 - .../src/Components/SurfaceSelect/index.ts | 1 - .../src/Components/SurfaceSelect/options.ts | 9 - .../src/Components/navMenu/Menu/MenuItem.tsx | 36 - .../src/Components/navMenu/Menu/Wrapper.tsx | 20 - .../src/Components/navMenu/Menu/index.tsx | 49 - .../src/Components/navMenu/NavMenu.tsx | 47 - .../src/Components/navMenu/index.ts | 1 - .../src/Context/action/docAction.ts | 11 - .../src/Context/action/index.ts | 7 - .../src/Context/action/isMobileAction.ts | 9 - .../src/Context/action/isTabletAction.ts | 9 - .../src/Context/action/navMenuToggleAction.ts | 9 - .../src/Context/action/sidebarToggleAction.ts | 9 - .../src/Context/action/surfaceAction.ts | 9 - .../src/Context/action/tabsToggleAction.ts | 9 - .../src/Context/createCtx.tsx | 23 - .../uikit-playground/src/Context/index.tsx | 15 - .../src/Context/initialState.ts | 26 - .../uikit-playground/src/Context/reducer.ts | 31 - .../uikit-playground/src/Pages/Playground.tsx | 50 - .../src/Payload/BlocksTree.ts | 268 - .../src/Payload/action/button.ts | 80 - .../src/Payload/action/datePicker.ts | 21 - .../src/Payload/action/image.ts | 10 - .../src/Payload/action/index.ts | 13 - .../src/Payload/action/input.ts | 37 - .../src/Payload/action/linearScale.ts | 18 - .../src/Payload/action/menu.ts | 33 - .../src/Payload/action/staticSelect.ts | 75 - .../src/Payload/context/index.ts | 61 - .../src/Payload/divider/index.ts | 7 - .../src/Payload/image/index.ts | 22 - .../src/Payload/input/datePicker.ts | 24 - .../src/Payload/input/index.ts | 7 - .../src/Payload/input/input.ts | 49 - .../src/Payload/input/linearScale.ts | 21 - .../src/Payload/input/staticSelect.ts | 81 - .../src/Payload/preview/index.ts | 121 - .../src/Payload/section/button.ts | 88 - .../src/Payload/section/datePicker.ts | 23 - .../src/Payload/section/image.ts | 16 - .../src/Payload/section/index.ts | 9 - .../src/Payload/section/menu.ts | 59 - .../src/Payload/section/text.ts | 55 - .../uikit-playground/src/cssVariables.css | 14 - .../src/hooks/useCodeMirror.ts | 80 - packages/uikit-playground/src/index.css | 24 - packages/uikit-playground/src/index.tsx | 16 - packages/uikit-playground/src/logo.svg | 7 - packages/uikit-playground/src/module.d.ts | 7 - .../src/utils/codePrettier.ts | 14 - packages/uikit-playground/tsconfig.json | 21 - packages/uikit-playground/webpack.config.ts | 42 - yarn.lock | 4871 +---------------- 194 files changed, 247 insertions(+), 12063 deletions(-) delete mode 100644 packages/fuselage-ui-kit/.babelrc.json delete mode 100644 packages/fuselage-ui-kit/.eslintignore delete mode 100644 packages/fuselage-ui-kit/.eslintrc.js delete mode 100644 packages/fuselage-ui-kit/.gitignore delete mode 100644 packages/fuselage-ui-kit/.prettierignore delete mode 100644 packages/fuselage-ui-kit/.prettierrc.js delete mode 100644 packages/fuselage-ui-kit/.storybook/logo.svg delete mode 100644 packages/fuselage-ui-kit/.storybook/logo.svg.d.ts delete mode 100644 packages/fuselage-ui-kit/.storybook/main.js delete mode 100644 packages/fuselage-ui-kit/.storybook/manager.ts delete mode 100644 packages/fuselage-ui-kit/.storybook/preview.tsx delete mode 100644 packages/fuselage-ui-kit/CHANGELOG.md delete mode 100644 packages/fuselage-ui-kit/README.md delete mode 100644 packages/fuselage-ui-kit/package.json delete mode 100644 packages/fuselage-ui-kit/src/blocks/ActionsBlock.Action.tsx delete mode 100644 packages/fuselage-ui-kit/src/blocks/ActionsBlock.tsx delete mode 100644 packages/fuselage-ui-kit/src/blocks/ContextBlock.Item.tsx delete mode 100644 packages/fuselage-ui-kit/src/blocks/ContextBlock.tsx delete mode 100644 packages/fuselage-ui-kit/src/blocks/DividerBlock.tsx delete mode 100644 packages/fuselage-ui-kit/src/blocks/ImageBlock.styles.tsx delete mode 100644 packages/fuselage-ui-kit/src/blocks/ImageBlock.tsx delete mode 100644 packages/fuselage-ui-kit/src/blocks/InputBlock.tsx delete mode 100644 packages/fuselage-ui-kit/src/blocks/PreviewBlock.tsx delete mode 100644 packages/fuselage-ui-kit/src/blocks/SectionBlock.Fields.tsx delete mode 100644 packages/fuselage-ui-kit/src/blocks/SectionBlock.tsx delete mode 100644 packages/fuselage-ui-kit/src/contexts/SurfaceContext.ts delete mode 100644 packages/fuselage-ui-kit/src/contexts/kitContext.ts delete mode 100644 packages/fuselage-ui-kit/src/elements/ButtonElement.tsx delete mode 100644 packages/fuselage-ui-kit/src/elements/ContextElement/ContextElement.tsx delete mode 100644 packages/fuselage-ui-kit/src/elements/ContextElement/ContextElementItem.tsx delete mode 100644 packages/fuselage-ui-kit/src/elements/ContextElement/index.tsx delete mode 100644 packages/fuselage-ui-kit/src/elements/DatePickerElement.tsx delete mode 100644 packages/fuselage-ui-kit/src/elements/ImageElement.styles.tsx delete mode 100644 packages/fuselage-ui-kit/src/elements/ImageElement.tsx delete mode 100644 packages/fuselage-ui-kit/src/elements/LinearScaleElement.tsx delete mode 100644 packages/fuselage-ui-kit/src/elements/MultiStaticSelectElement.tsx delete mode 100644 packages/fuselage-ui-kit/src/elements/OverflowElement.tsx delete mode 100644 packages/fuselage-ui-kit/src/elements/PlainTextInputElement.tsx delete mode 100644 packages/fuselage-ui-kit/src/elements/StaticSelectElement.tsx delete mode 100644 packages/fuselage-ui-kit/src/hooks/useUiKitState.ts delete mode 100644 packages/fuselage-ui-kit/src/index.ts delete mode 100644 packages/fuselage-ui-kit/src/stories/Banner.stories.tsx delete mode 100644 packages/fuselage-ui-kit/src/stories/Message.stories.tsx delete mode 100644 packages/fuselage-ui-kit/src/stories/Modal.stories.tsx delete mode 100644 packages/fuselage-ui-kit/src/stories/payloads/actions.ts delete mode 100644 packages/fuselage-ui-kit/src/stories/payloads/conditional.ts delete mode 100644 packages/fuselage-ui-kit/src/stories/payloads/context.ts delete mode 100644 packages/fuselage-ui-kit/src/stories/payloads/divider.ts delete mode 100644 packages/fuselage-ui-kit/src/stories/payloads/image.ts delete mode 100644 packages/fuselage-ui-kit/src/stories/payloads/img.ts delete mode 100644 packages/fuselage-ui-kit/src/stories/payloads/index.ts delete mode 100644 packages/fuselage-ui-kit/src/stories/payloads/input.ts delete mode 100644 packages/fuselage-ui-kit/src/stories/payloads/preview.ts delete mode 100644 packages/fuselage-ui-kit/src/stories/payloads/section.ts delete mode 100644 packages/fuselage-ui-kit/src/surfaces/BannerSurface.tsx delete mode 100644 packages/fuselage-ui-kit/src/surfaces/FuselageSurfaceRenderer.tsx delete mode 100644 packages/fuselage-ui-kit/src/surfaces/MessageSurface.tsx delete mode 100644 packages/fuselage-ui-kit/src/surfaces/ModalSurface.tsx delete mode 100644 packages/fuselage-ui-kit/src/surfaces/Surface.tsx delete mode 100644 packages/fuselage-ui-kit/src/surfaces/SurfaceContext.tsx delete mode 100644 packages/fuselage-ui-kit/src/surfaces/createSurfaceRenderer.tsx delete mode 100644 packages/fuselage-ui-kit/src/surfaces/index.ts delete mode 100644 packages/fuselage-ui-kit/src/utils/BlockProps.ts delete mode 100644 packages/fuselage-ui-kit/src/utils/UiKitComponent.tsx delete mode 100644 packages/fuselage-ui-kit/src/utils/fromTextObjectToString.ts delete mode 100644 packages/fuselage-ui-kit/tsconfig-cjs.json delete mode 100644 packages/fuselage-ui-kit/tsconfig-esm.json delete mode 100644 packages/fuselage-ui-kit/tsconfig.json delete mode 100644 packages/uikit-playground/.eslintignore delete mode 100644 packages/uikit-playground/.eslintrc.js delete mode 100644 packages/uikit-playground/.gitignore delete mode 100644 packages/uikit-playground/.prettierignore delete mode 100644 packages/uikit-playground/.prettierrc.js delete mode 100644 packages/uikit-playground/README.md delete mode 100644 packages/uikit-playground/package.json delete mode 100644 packages/uikit-playground/public/favicon.ico delete mode 100644 packages/uikit-playground/public/index.html delete mode 100644 packages/uikit-playground/public/logo192.png delete mode 100644 packages/uikit-playground/public/logo512.png delete mode 100644 packages/uikit-playground/public/manifest.json delete mode 100644 packages/uikit-playground/public/robots.txt delete mode 100644 packages/uikit-playground/src/App.css delete mode 100644 packages/uikit-playground/src/App.tsx delete mode 100644 packages/uikit-playground/src/Components/CodeEditor/Extensions/HighlightStyle.ts delete mode 100644 packages/uikit-playground/src/Components/CodeEditor/Extensions/basicSetup.ts delete mode 100644 packages/uikit-playground/src/Components/CodeEditor/Extensions/index.ts delete mode 100644 packages/uikit-playground/src/Components/CodeEditor/Extensions/lint.ts delete mode 100644 packages/uikit-playground/src/Components/CodeEditor/Extensions/theme.ts delete mode 100644 packages/uikit-playground/src/Components/CodeEditor/index.tsx delete mode 100644 packages/uikit-playground/src/Components/ComponentSideBar/ScrollableSideBar.tsx delete mode 100644 packages/uikit-playground/src/Components/ComponentSideBar/SideBar.tsx delete mode 100644 packages/uikit-playground/src/Components/ComponentSideBar/SliderBtn.tsx delete mode 100644 packages/uikit-playground/src/Components/ComponentSideBar/index.tsx delete mode 100644 packages/uikit-playground/src/Components/Draggable/DraggableList.tsx delete mode 100644 packages/uikit-playground/src/Components/Draggable/DraggableListItem.tsx delete mode 100644 packages/uikit-playground/src/Components/DropDown/DropDown.tsx delete mode 100644 packages/uikit-playground/src/Components/DropDown/Items.tsx delete mode 100644 packages/uikit-playground/src/Components/DropDown/ItemsIcon.tsx delete mode 100644 packages/uikit-playground/src/Components/DropDown/index.tsx delete mode 100644 packages/uikit-playground/src/Components/DropDown/itemsStyle.ts delete mode 100644 packages/uikit-playground/src/Components/DropDown/types.ts delete mode 100644 packages/uikit-playground/src/Components/NavBar/BurgerIcon/BurgerIcon.tsx delete mode 100644 packages/uikit-playground/src/Components/NavBar/BurgerIcon/Line.tsx delete mode 100644 packages/uikit-playground/src/Components/NavBar/BurgerIcon/Wrapper.tsx delete mode 100644 packages/uikit-playground/src/Components/NavBar/BurgerIcon/index.tsx delete mode 100644 packages/uikit-playground/src/Components/NavBar/Divider.tsx delete mode 100644 packages/uikit-playground/src/Components/NavBar/Logo.tsx delete mode 100644 packages/uikit-playground/src/Components/NavBar/NavBar.tsx delete mode 100644 packages/uikit-playground/src/Components/NavBar/RightNavBtn.tsx delete mode 100644 packages/uikit-playground/src/Components/NavBar/index.tsx delete mode 100644 packages/uikit-playground/src/Components/Preview/Display/Display.tsx delete mode 100644 packages/uikit-playground/src/Components/Preview/Display/RenderPayload/DeleteElementBtn.tsx delete mode 100644 packages/uikit-playground/src/Components/Preview/Display/RenderPayload/ElementWrapper.tsx delete mode 100644 packages/uikit-playground/src/Components/Preview/Display/RenderPayload/RenderPayload.tsx delete mode 100644 packages/uikit-playground/src/Components/Preview/Display/RenderPayload/intex.ts delete mode 100644 packages/uikit-playground/src/Components/Preview/Display/Surface/BannerSurface.tsx delete mode 100644 packages/uikit-playground/src/Components/Preview/Display/Surface/MessageSurface.tsx delete mode 100644 packages/uikit-playground/src/Components/Preview/Display/Surface/ModalSurface.tsx delete mode 100644 packages/uikit-playground/src/Components/Preview/Display/Surface/Reorder.ts delete mode 100644 packages/uikit-playground/src/Components/Preview/Display/Surface/Surface.tsx delete mode 100644 packages/uikit-playground/src/Components/Preview/Display/Surface/index.ts delete mode 100644 packages/uikit-playground/src/Components/Preview/Display/index.ts delete mode 100644 packages/uikit-playground/src/Components/Preview/Editor/Editor.tsx delete mode 100644 packages/uikit-playground/src/Components/Preview/Editor/index.tsx delete mode 100644 packages/uikit-playground/src/Components/Preview/NavPanel/NavPanel.tsx delete mode 100644 packages/uikit-playground/src/Components/Preview/NavPanel/PanelBtn.tsx delete mode 100644 packages/uikit-playground/src/Components/Preview/NavPanel/TabChange.tsx delete mode 100644 packages/uikit-playground/src/Components/Preview/NavPanel/index.tsx delete mode 100644 packages/uikit-playground/src/Components/Preview/Preview.tsx delete mode 100644 packages/uikit-playground/src/Components/Preview/SplitPlaneContainer/SplitPlaneContainer.tsx delete mode 100644 packages/uikit-playground/src/Components/Preview/SplitPlaneContainer/index.ts delete mode 100644 packages/uikit-playground/src/Components/Preview/SplitPlaneContainer/splitPlane.css delete mode 100644 packages/uikit-playground/src/Components/Preview/Wrapper.tsx delete mode 100644 packages/uikit-playground/src/Components/Preview/index.tsx delete mode 100644 packages/uikit-playground/src/Components/SurfaceSelect/SurfaceSelect.tsx delete mode 100644 packages/uikit-playground/src/Components/SurfaceSelect/index.ts delete mode 100644 packages/uikit-playground/src/Components/SurfaceSelect/options.ts delete mode 100644 packages/uikit-playground/src/Components/navMenu/Menu/MenuItem.tsx delete mode 100644 packages/uikit-playground/src/Components/navMenu/Menu/Wrapper.tsx delete mode 100644 packages/uikit-playground/src/Components/navMenu/Menu/index.tsx delete mode 100644 packages/uikit-playground/src/Components/navMenu/NavMenu.tsx delete mode 100644 packages/uikit-playground/src/Components/navMenu/index.ts delete mode 100644 packages/uikit-playground/src/Context/action/docAction.ts delete mode 100644 packages/uikit-playground/src/Context/action/index.ts delete mode 100644 packages/uikit-playground/src/Context/action/isMobileAction.ts delete mode 100644 packages/uikit-playground/src/Context/action/isTabletAction.ts delete mode 100644 packages/uikit-playground/src/Context/action/navMenuToggleAction.ts delete mode 100644 packages/uikit-playground/src/Context/action/sidebarToggleAction.ts delete mode 100644 packages/uikit-playground/src/Context/action/surfaceAction.ts delete mode 100644 packages/uikit-playground/src/Context/action/tabsToggleAction.ts delete mode 100644 packages/uikit-playground/src/Context/createCtx.tsx delete mode 100644 packages/uikit-playground/src/Context/index.tsx delete mode 100644 packages/uikit-playground/src/Context/initialState.ts delete mode 100644 packages/uikit-playground/src/Context/reducer.ts delete mode 100644 packages/uikit-playground/src/Pages/Playground.tsx delete mode 100644 packages/uikit-playground/src/Payload/BlocksTree.ts delete mode 100644 packages/uikit-playground/src/Payload/action/button.ts delete mode 100644 packages/uikit-playground/src/Payload/action/datePicker.ts delete mode 100644 packages/uikit-playground/src/Payload/action/image.ts delete mode 100644 packages/uikit-playground/src/Payload/action/index.ts delete mode 100644 packages/uikit-playground/src/Payload/action/input.ts delete mode 100644 packages/uikit-playground/src/Payload/action/linearScale.ts delete mode 100644 packages/uikit-playground/src/Payload/action/menu.ts delete mode 100644 packages/uikit-playground/src/Payload/action/staticSelect.ts delete mode 100644 packages/uikit-playground/src/Payload/context/index.ts delete mode 100644 packages/uikit-playground/src/Payload/divider/index.ts delete mode 100644 packages/uikit-playground/src/Payload/image/index.ts delete mode 100644 packages/uikit-playground/src/Payload/input/datePicker.ts delete mode 100644 packages/uikit-playground/src/Payload/input/index.ts delete mode 100644 packages/uikit-playground/src/Payload/input/input.ts delete mode 100644 packages/uikit-playground/src/Payload/input/linearScale.ts delete mode 100644 packages/uikit-playground/src/Payload/input/staticSelect.ts delete mode 100644 packages/uikit-playground/src/Payload/preview/index.ts delete mode 100644 packages/uikit-playground/src/Payload/section/button.ts delete mode 100644 packages/uikit-playground/src/Payload/section/datePicker.ts delete mode 100644 packages/uikit-playground/src/Payload/section/image.ts delete mode 100644 packages/uikit-playground/src/Payload/section/index.ts delete mode 100644 packages/uikit-playground/src/Payload/section/menu.ts delete mode 100644 packages/uikit-playground/src/Payload/section/text.ts delete mode 100644 packages/uikit-playground/src/cssVariables.css delete mode 100644 packages/uikit-playground/src/hooks/useCodeMirror.ts delete mode 100644 packages/uikit-playground/src/index.css delete mode 100644 packages/uikit-playground/src/index.tsx delete mode 100644 packages/uikit-playground/src/logo.svg delete mode 100644 packages/uikit-playground/src/module.d.ts delete mode 100644 packages/uikit-playground/src/utils/codePrettier.ts delete mode 100644 packages/uikit-playground/tsconfig.json delete mode 100644 packages/uikit-playground/webpack.config.ts diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 210371186d..710aaf02f9 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -44,8 +44,6 @@ jobs: name: storybooks path: | packages/fuselage/storybook-static - packages/fuselage-ui-kit/storybook-static - packages/uikit-playground/build packages/onboarding-ui/storybook-static packages/layout/storybook-static - if: github.ref == 'refs/heads/master' @@ -125,10 +123,8 @@ jobs: name: docs path: . - run: | - rm -rf "fuselage/${{ needs.build-and-test.outputs.branch-name }}" "layout/${{ needs.build-and-test.outputs.branch-name }}" "uikit-playground/${{ needs.build-and-test.outputs.branch-name }}" "fuselage-ui-kit/${{ needs.build-and-test.outputs.branch-name }}" "onboarding-ui/${{ needs.build-and-test.outputs.branch-name }}" + rm -rf "fuselage/${{ needs.build-and-test.outputs.branch-name }}" "layout/${{ needs.build-and-test.outputs.branch-name }}" "onboarding-ui/${{ needs.build-and-test.outputs.branch-name }}" mv -v "packages/fuselage/storybook-static" "fuselage/${{ needs.build-and-test.outputs.branch-name }}" - mv -v "packages/uikit-playground/build" "uikit-playground/${{ needs.build-and-test.outputs.branch-name }}" - mv -v "packages/fuselage-ui-kit/storybook-static" "fuselage-ui-kit/${{ needs.build-and-test.outputs.branch-name }}" mv -v "packages/onboarding-ui/storybook-static" "onboarding-ui/${{ needs.build-and-test.outputs.branch-name }}" mv -v "packages/layout/storybook-static" "layout/${{ needs.build-and-test.outputs.branch-name }}" rm -rf packages diff --git a/.github/workflows/ci-pr-closed.yml b/.github/workflows/ci-pr-closed.yml index 613c3ae58a..3c441576cf 100644 --- a/.github/workflows/ci-pr-closed.yml +++ b/.github/workflows/ci-pr-closed.yml @@ -13,7 +13,7 @@ jobs: - uses: actions/checkout@v2 with: ref: gh-pages - - run: rm -rf "fuselage/${{ github.event.number }}" "layout/${{ github.event.number }}" "fuselage-ui-kit/${{ github.event.number }}" "uikit-playground/${{ github.event.number }}" "onboarding-ui/${{ github.event.number }}" + - run: rm -rf "fuselage/${{ github.event.number }}" "layout/${{ github.event.number }}" "onboarding-ui/${{ github.event.number }}" - uses: crazy-max/ghaction-github-pages@v2 with: target_branch: gh-pages diff --git a/.github/workflows/ci-pr-opened.yml b/.github/workflows/ci-pr-opened.yml index 20604660c6..a8120e6270 100644 --- a/.github/workflows/ci-pr-opened.yml +++ b/.github/workflows/ci-pr-opened.yml @@ -42,8 +42,6 @@ jobs: name: storybooks path: | fuselage/storybook-static - uikit-playground/build - fuselage-ui-kit/storybook-static onboarding-ui/storybook-static layout/storybook-static publish-to-gh-pages: @@ -65,8 +63,6 @@ jobs: - run: | rm -rf "fuselage/${{ needs.download-artifact.outputs.pr-number }}" "layout/${{ needs.download-artifact.outputs.pr-number }}" "uikit-playground/${{ needs.download-artifact.outputs.pr-number }}" "fuselage-ui-kit/${{ needs.download-artifact.outputs.pr-number }}" "onboarding-ui/${{ needs.download-artifact.outputs.pr-number }}" mv -v packages/fuselage/storybook-static "fuselage/${{ needs.download-artifact.outputs.pr-number }}" - mv -v packages/uikit-playground/build "uikit-playground/${{ needs.download-artifact.outputs.pr-number }}" - mv -v packages/fuselage-ui-kit/storybook-static "fuselage-ui-kit/${{ needs.download-artifact.outputs.pr-number }}" mv -v packages/onboarding-ui/storybook-static "onboarding-ui/${{ needs.download-artifact.outputs.pr-number }}" mv -v packages/layout/storybook-static "layout/${{ needs.download-artifact.outputs.pr-number }}" rm -rf packages diff --git a/.github/workflows/ci-pr.yml b/.github/workflows/ci-pr.yml index 92e72acd20..0cbc2dd304 100644 --- a/.github/workflows/ci-pr.yml +++ b/.github/workflows/ci-pr.yml @@ -42,7 +42,5 @@ jobs: name: "storybooks-${{ github.event.number }}" path: | packages/fuselage/storybook-static - packages/uikit-playground/build - packages/fuselage-ui-kit/storybook-static packages/onboarding-ui/storybook-static packages/layout/storybook-static diff --git a/README.md b/README.md index dff64ef208..748c8a8c59 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,6 @@ | 📦 [`@rocket.chat/fuselage-polyfills`](/packages/fuselage-polyfills) | A bundle of useful poly/ponyfills used by fuselage | [![npm](https://img.shields.io/npm/v/@rocket.chat/fuselage-polyfills?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/fuselage-polyfills) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/fuselage-polyfills?style=flat-square) | | 📦 [`@rocket.chat/fuselage-toastbar`](/packages/fuselage-toastbar) | Fuselage ToastBar component | [![npm](https://img.shields.io/npm/v/@rocket.chat/fuselage-toastbar?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/fuselage-toastbar) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/fuselage-toastbar?style=flat-square) | | 📦 [`@rocket.chat/fuselage-tokens`](/packages/fuselage-tokens) | Design tokens for Fuselage, Rocket.Chat's design system | [![npm](https://img.shields.io/npm/v/@rocket.chat/fuselage-tokens?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/fuselage-tokens) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/fuselage-tokens?style=flat-square) | -| 📦 [`@rocket.chat/fuselage-ui-kit`](/packages/fuselage-ui-kit) | UiKit elements for Rocket.Chat Apps built under Fuselage design system | [![npm](https://img.shields.io/npm/v/@rocket.chat/fuselage-ui-kit?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/fuselage-ui-kit) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/fuselage-ui-kit?style=flat-square) | | 📦 [`@rocket.chat/icons`](/packages/icons) | Rocket.Chat's Icons | [![npm](https://img.shields.io/npm/v/@rocket.chat/icons?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/icons) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/icons?style=flat-square) | | 📦 [`@rocket.chat/layout`](/packages/layout) | Shared Application Layout Components | [![npm](https://img.shields.io/npm/v/@rocket.chat/layout?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/layout) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/layout?style=flat-square) | | 📦 [`@rocket.chat/logo`](/packages/logo) | Rocket.Chat logo package | [![npm](https://img.shields.io/npm/v/@rocket.chat/logo?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/logo) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/logo?style=flat-square) | @@ -35,4 +34,3 @@ | 📦 [`@rocket.chat/styled`](/packages/styled) | A simple styled API for React components | [![npm](https://img.shields.io/npm/v/@rocket.chat/styled?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/styled) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/styled?style=flat-square) | | 📦 [`@rocket.chat/stylis-logical-props-middleware`](/packages/stylis-logical-props-middleware) | Stylis middleware to handle CSS Logical Properties and their fallbacks | [![npm](https://img.shields.io/npm/v/@rocket.chat/stylis-logical-props-middleware?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/stylis-logical-props-middleware) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/stylis-logical-props-middleware?style=flat-square) | | 📦 [`@rocket.chat/ui-kit`](/packages/ui-kit) | Interactive UI elements for Rocket.Chat Apps | [![npm](https://img.shields.io/npm/v/@rocket.chat/ui-kit?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/ui-kit) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/ui-kit?style=flat-square) | -| 📦 [`@rocket.chat/uikit-playground`](/packages/uikit-playground) | | [![npm](https://img.shields.io/npm/v/@rocket.chat/uikit-playground?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/uikit-playground) | ![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/uikit-playground?style=flat-square) | diff --git a/packages/fuselage-ui-kit/.babelrc.json b/packages/fuselage-ui-kit/.babelrc.json deleted file mode 100644 index 1320b9a327..0000000000 --- a/packages/fuselage-ui-kit/.babelrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "presets": ["@babel/preset-env"] -} diff --git a/packages/fuselage-ui-kit/.eslintignore b/packages/fuselage-ui-kit/.eslintignore deleted file mode 100644 index a02f1c5a67..0000000000 --- a/packages/fuselage-ui-kit/.eslintignore +++ /dev/null @@ -1,5 +0,0 @@ -/dist -/storybook-static -/node_modules -!/.eslintrc.js -!/.storybook diff --git a/packages/fuselage-ui-kit/.eslintrc.js b/packages/fuselage-ui-kit/.eslintrc.js deleted file mode 100644 index cb81eef4f6..0000000000 --- a/packages/fuselage-ui-kit/.eslintrc.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - extends: '@rocket.chat/eslint-config-alt/react', -}; diff --git a/packages/fuselage-ui-kit/.gitignore b/packages/fuselage-ui-kit/.gitignore deleted file mode 100644 index 4e50609e79..0000000000 --- a/packages/fuselage-ui-kit/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/dist/* -/storybook-static/ -/bundle-report.html -/src/version.ts diff --git a/packages/fuselage-ui-kit/.prettierignore b/packages/fuselage-ui-kit/.prettierignore deleted file mode 100644 index d4b5909e36..0000000000 --- a/packages/fuselage-ui-kit/.prettierignore +++ /dev/null @@ -1,3 +0,0 @@ -/dist -/node_modules -/storybook-static diff --git a/packages/fuselage-ui-kit/.prettierrc.js b/packages/fuselage-ui-kit/.prettierrc.js deleted file mode 100644 index b57f474edb..0000000000 --- a/packages/fuselage-ui-kit/.prettierrc.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('@rocket.chat/prettier-config/fuselage'); diff --git a/packages/fuselage-ui-kit/.storybook/logo.svg b/packages/fuselage-ui-kit/.storybook/logo.svg deleted file mode 100644 index 9f73265787..0000000000 --- a/packages/fuselage-ui-kit/.storybook/logo.svg +++ /dev/null @@ -1,68 +0,0 @@ -<svg - width="768" - height="221" - viewBox="0 0 768 221" - fill="none" - xmlns="http://www.w3.org/2000/svg" -> - <path - d="M687.178 68.3765H699.452V85.2808H710.808V96.4023H699.452V126.607H710.193V137.528C708.453 137.935 706.305 138.141 703.849 138.141C692.7 138.141 687.174 132.326 687.174 120.692V68.3765H687.178Z" - fill="#F5455C" - /> - <path - d="M663.995 92.7303V85.2809H676.268V136.708H663.995V129.259C662.255 134.259 656.017 137.83 647.526 137.83C640.265 137.83 634.123 135.28 629.111 130.179C624.2 124.973 621.744 118.65 621.744 110.994C621.744 103.339 624.2 97.0159 629.111 91.9107C634.123 86.7048 640.26 84.1545 647.526 84.1545C656.013 84.1591 662.255 87.7305 663.995 92.7303ZM660.309 122.221C663.38 119.263 664.913 115.486 664.913 110.999C664.913 106.512 663.38 102.735 660.309 99.7722C657.344 96.8145 653.557 95.2806 649.16 95.2806C644.763 95.2806 641.183 96.8099 638.213 99.7722C635.349 102.73 633.917 106.507 633.917 110.999C633.917 115.491 635.349 119.263 638.213 122.221C641.178 125.179 644.758 126.713 649.16 126.713C653.562 126.713 657.344 125.179 660.309 122.221Z" - fill="#F5455C" - /> - <path - d="M209.724 136.708V85.2808H221.896V92.9317C224.352 87.5243 229.979 84.2598 237.24 84.2598C238.672 84.2598 239.903 84.3605 240.922 84.5665V96.4023C239.388 96.0955 237.649 95.8941 235.808 95.8941C227.317 95.8941 221.896 101.201 221.896 109.671V136.713H209.724V136.708Z" - fill="#F5455C" - /> - <path - d="M243.992 110.995C243.992 103.339 246.755 96.8099 252.176 91.604C257.597 86.3981 264.248 83.7471 272.124 83.7471C280 83.7471 286.651 86.3981 292.072 91.604C297.493 96.8099 300.256 103.339 300.256 110.995C300.256 118.645 297.493 125.179 292.072 130.38C286.651 135.586 280 138.237 272.124 138.237C264.248 138.237 257.597 135.586 252.176 130.38C246.755 125.179 243.992 118.645 243.992 110.995ZM283.479 122.524C286.55 119.36 288.083 115.582 288.083 110.995C288.083 106.402 286.55 102.625 283.479 99.5662C280.409 96.4024 276.627 94.8731 272.124 94.8731C267.52 94.8731 263.738 96.4024 260.667 99.5662C257.702 102.629 256.165 106.402 256.165 110.995C256.165 115.587 257.698 119.36 260.667 122.524C263.738 125.587 267.52 127.116 272.124 127.116C276.627 127.116 280.409 125.587 283.479 122.524Z" - fill="#F5455C" - /> - <path - d="M351.3 88.852V101.095C346.903 96.9104 341.583 94.7676 335.446 94.7676C330.641 94.7676 326.647 96.2969 323.48 99.36C320.309 102.423 318.776 106.301 318.776 110.889C318.776 115.481 320.309 119.359 323.48 122.418C326.652 125.481 330.641 127.01 335.446 127.01C341.689 127.01 347.004 124.868 351.3 120.683V132.926C347.004 136.397 341.482 138.132 334.73 138.132C326.753 138.132 320.102 135.582 314.682 130.376C309.261 125.17 306.599 118.741 306.599 110.884C306.599 103.027 309.256 96.5991 314.682 91.3932C320.102 86.1873 326.753 83.637 334.73 83.637C341.377 83.6461 346.903 85.3814 351.3 88.852Z" - fill="#F5455C" - /> - <path - d="M360.407 136.708V68.3765H372.58V107.217L389.971 85.2762H403.883L384.344 109.868L405.517 136.703H391.197L372.58 112.927V136.703H360.407V136.708Z" - fill="#F5455C" - /> - <path - d="M405.824 110.994C405.824 102.931 408.28 96.4023 413.292 91.5031C418.304 86.5033 424.749 84.0537 432.524 84.0537C439.992 84.0537 446.028 86.5033 450.631 91.5031C455.336 96.4023 457.691 102.524 457.691 109.767C457.691 111.297 457.59 112.83 457.484 114.154H417.997C418.405 122.317 424.441 127.523 433.548 127.523C441.63 127.523 447.767 125.586 452.063 121.603V133.031C447.051 136.502 440.708 138.237 433.038 138.237C424.955 138.237 418.309 135.788 413.297 130.994C408.284 126.095 405.829 119.566 405.829 111.503V110.994H405.824ZM445.206 105.486C445.206 102.528 443.98 99.8729 441.525 97.7301C439.069 95.5873 436.104 94.4655 432.524 94.4655C428.737 94.4655 425.465 95.5873 422.706 97.7301C419.943 99.8729 418.511 102.423 418.309 105.486H445.206Z" - fill="#F5455C" - /> - <path - d="M466.944 68.3765H479.218V85.2808H490.573V96.4023H479.218V126.607H489.958V137.528C488.218 137.935 486.07 138.141 483.615 138.141C472.466 138.141 466.939 132.326 466.939 120.692V68.3765H466.944Z" - fill="#F5455C" - /> - <path - d="M502.713 123.215C498.642 123.215 495.342 126.493 495.342 130.536C495.342 134.579 498.642 137.857 502.713 137.857C506.785 137.857 510.085 134.579 510.085 130.536C510.085 126.493 506.785 123.215 502.713 123.215Z" - fill="#F5455C" - /> - <path - d="M558.22 88.852V101.095C553.823 96.9104 548.503 94.7676 542.366 94.7676C537.561 94.7676 533.567 96.2969 530.4 99.36C527.229 102.423 525.696 106.301 525.696 110.889C525.696 115.481 527.229 119.359 530.4 122.418C533.572 125.481 537.561 127.01 542.366 127.01C548.604 127.01 553.924 124.868 558.22 120.683V132.926C553.924 136.397 548.402 138.132 541.65 138.132C533.673 138.132 527.022 135.582 521.601 130.376C516.181 125.17 513.519 118.741 513.519 110.884C513.519 103.027 516.176 96.5991 521.601 91.3932C527.022 86.1873 533.673 83.637 541.65 83.637C548.297 83.6461 553.823 85.3814 558.22 88.852Z" - fill="#F5455C" - /> - <path - d="M567.326 136.708V68.3765H579.499V92.4234C581.853 87.5243 587.476 84.2597 594.535 84.2597C606.4 84.2597 613.359 92.1167 613.359 104.873V136.708H601.186V106.603C601.186 99.5615 597.399 95.1752 590.854 95.1752C584.203 95.1752 579.499 100.074 579.499 107.112V136.703H567.326V136.708Z" - fill="#F5455C" - /> - <path - d="M174.643 91.8055C171.307 86.6179 166.629 82.0255 160.75 78.152C149.39 70.6796 134.463 66.5635 118.72 66.5635C113.46 66.5635 108.277 67.0213 103.247 67.9279C100.126 64.9197 96.4767 62.2138 92.612 60.0755C78.273 52.9191 65.6323 55.5885 59.2477 57.8824C57.1501 58.6378 56.5029 61.298 58.0543 62.896C62.557 67.5479 70.0065 76.7418 68.1751 85.1023C61.0515 92.3824 57.1914 101.155 57.1914 110.289C57.1914 119.598 61.0515 128.37 68.1705 135.646C70.0019 144.006 62.5525 153.205 58.0497 157.857C56.5029 159.455 57.1455 162.11 59.2431 162.866C65.6277 165.164 78.2638 167.834 92.6074 160.677C96.4721 158.539 100.121 155.833 103.242 152.825C108.273 153.731 113.455 154.189 118.715 154.189C134.463 154.189 149.39 150.078 160.745 142.605C166.625 138.732 171.302 134.144 174.639 128.952C178.357 123.174 180.239 116.951 180.239 110.468C180.243 103.801 178.357 97.5883 174.643 91.8055ZM118.077 143.397C111.27 143.397 104.78 142.518 98.8635 140.93L94.5398 145.092C92.1897 147.353 89.4358 149.4 86.5625 151.012C82.7574 152.875 78.9982 153.896 75.2804 154.203C75.4915 153.823 75.6843 153.438 75.8908 153.054C80.2237 145.087 81.3942 137.926 79.3975 131.575C72.3107 126.003 68.0604 118.87 68.0604 111.1C68.0604 93.266 90.4547 78.8067 118.077 78.8067C145.699 78.8067 168.098 93.266 168.098 111.1C168.094 128.943 145.699 143.397 118.077 143.397Z" - fill="#F5455C" - /> - <path - d="M94.1449 103.678C90.0736 103.678 86.7734 106.956 86.7734 110.999C86.7734 115.042 90.0736 118.32 94.1449 118.32C98.2162 118.32 101.516 115.042 101.516 110.999C101.516 106.956 98.2162 103.678 94.1449 103.678Z" - fill="#F5455C" - /> - <path - d="M117.875 103.678C113.804 103.678 110.504 106.956 110.504 110.999C110.504 115.042 113.804 118.32 117.875 118.32C121.947 118.32 125.247 115.042 125.247 110.999C125.247 106.956 121.947 103.678 117.875 103.678Z" - fill="#F5455C" - /> - <path - d="M141.605 103.678C137.534 103.678 134.233 106.956 134.233 110.999C134.233 115.042 137.534 118.32 141.605 118.32C145.676 118.32 148.976 115.042 148.976 110.999C148.976 106.956 145.672 103.678 141.605 103.678Z" - fill="#F5455C" - /> -</svg> diff --git a/packages/fuselage-ui-kit/.storybook/logo.svg.d.ts b/packages/fuselage-ui-kit/.storybook/logo.svg.d.ts deleted file mode 100644 index 27c0914b23..0000000000 --- a/packages/fuselage-ui-kit/.storybook/logo.svg.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -declare const path: string; - -export = path; diff --git a/packages/fuselage-ui-kit/.storybook/main.js b/packages/fuselage-ui-kit/.storybook/main.js deleted file mode 100644 index d71e9958fa..0000000000 --- a/packages/fuselage-ui-kit/.storybook/main.js +++ /dev/null @@ -1,14 +0,0 @@ -/** @type {import('@storybook/react/types').StorybookConfig} */ -module.exports = { - core: { - builder: 'webpack5', - }, - features: { - postcss: false, - }, - typescript: { - reactDocgen: 'react-docgen-typescript-plugin', - }, - addons: ['@storybook/addon-essentials'], - stories: ['../src/**/*.stories.tsx', '../src/**/stories.tsx'], -}; diff --git a/packages/fuselage-ui-kit/.storybook/manager.ts b/packages/fuselage-ui-kit/.storybook/manager.ts deleted file mode 100644 index 194ef4014c..0000000000 --- a/packages/fuselage-ui-kit/.storybook/manager.ts +++ /dev/null @@ -1,17 +0,0 @@ -import colorTokens from '@rocket.chat/fuselage-tokens/colors.json'; -import { addons } from '@storybook/addons'; -import { create } from '@storybook/theming'; - -import manifest from '../package.json'; -import logo from './logo.svg'; - -addons.setConfig({ - theme: create({ - base: 'light', - brandTitle: manifest.name, - brandImage: logo, - brandUrl: manifest.homepage, - colorPrimary: colorTokens.n500, - colorSecondary: colorTokens.p500, - }), -}); diff --git a/packages/fuselage-ui-kit/.storybook/preview.tsx b/packages/fuselage-ui-kit/.storybook/preview.tsx deleted file mode 100644 index 01f8446858..0000000000 --- a/packages/fuselage-ui-kit/.storybook/preview.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { DocsPage, DocsContainer } from '@storybook/addon-docs'; -import { addParameters } from '@storybook/react'; -import '@rocket.chat/icons/dist/rocketchat.css'; -import '@rocket.chat/fuselage-polyfills'; -import 'normalize.css/normalize.css'; - -addParameters({ - backgrounds: { - grid: { - cellSize: 4, - cellAmount: 4, - opacity: 0.5, - }, - }, - docs: { - container: DocsContainer, - page: DocsPage, - }, - options: { - storySort: ([, a], [, b]) => a.kind.localeCompare(b.kind), - }, -}); diff --git a/packages/fuselage-ui-kit/CHANGELOG.md b/packages/fuselage-ui-kit/CHANGELOG.md deleted file mode 100644 index 9b5733937e..0000000000 --- a/packages/fuselage-ui-kit/CHANGELOG.md +++ /dev/null @@ -1,322 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -# [0.31.0](https://github.com/RocketChat/fuselage/compare/v0.30.1...v0.31.0) (2021-12-28) - -### Bug Fixes - -- **fuselage-ui-kit:** Initial Value being ignored on text input fields upon modal update ([#600](https://github.com/RocketChat/fuselage/issues/600)) ([d9bd704](https://github.com/RocketChat/fuselage/commit/d9bd704848eb9f2d9dd8b45f33cb8992ea39f9e2)) -- docker image version ([8f181cf](https://github.com/RocketChat/fuselage/commit/8f181cf5a96084d7abd9ea94efd46cc50840c798)) - -### Features - -- Message Preview ([#587](https://github.com/RocketChat/fuselage/issues/587)) ([e69dad3](https://github.com/RocketChat/fuselage/commit/e69dad3a6619e98ff70bcd1cb68567a159187336)) -- **fuselage:** Replace typography of Message's user name and Banner's title ([#577](https://github.com/RocketChat/fuselage/issues/577)) ([6af2dba](https://github.com/RocketChat/fuselage/commit/6af2dbabc90d2e2f1598cbbd113ecc3ea82adfc0)) -- New hooks for element size tracking ([#413](https://github.com/RocketChat/fuselage/issues/413)) ([8ca682c](https://github.com/RocketChat/fuselage/commit/8ca682c636d2e4813f7d346cb881513382be63cf)) -- **fuselage:** Message preview component ([#553](https://github.com/RocketChat/fuselage/issues/553)) ([f8bd0ad](https://github.com/RocketChat/fuselage/commit/f8bd0ad637c0d2edad47b3c2384dac9c84e8d4fd)) - -## [0.30.1](https://github.com/RocketChat/fuselage/compare/v0.30.0...v0.30.1) (2021-10-20) - -**Note:** Version bump only for package @rocket.chat/fuselage-ui-kit - -# [0.30.0](https://github.com/RocketChat/fuselage/compare/v0.29.0...v0.30.0) (2021-10-06) - -### Bug Fixes - -- **fuselage:** Remove Field margin ([#543](https://github.com/RocketChat/fuselage/issues/543)) ([0cc10e1](https://github.com/RocketChat/fuselage/commit/0cc10e1b86bcf14a9ae590537a3d8e460b39b167)) - -# [0.29.0](https://github.com/RocketChat/fuselage/compare/v0.28.0...v0.29.0) (2021-08-31) - -**Note:** Version bump only for package @rocket.chat/fuselage-ui-kit - -# [0.28.0](https://github.com/RocketChat/fuselage/compare/v0.27.0...v0.28.0) (2021-07-30) - -### Bug Fixes - -- **fuselage-ui-kit:** Implements missing url prop for buttons ([#488](https://github.com/RocketChat/fuselage/issues/488)) ([bb19344](https://github.com/RocketChat/fuselage/commit/bb193441804c9b20174e2586d22c4b2845a486c3)) - -### Features - -- **onboarding-ui:** Administrator information form and Organization information form ([#489](https://github.com/RocketChat/fuselage/issues/489)) ([b289f68](https://github.com/RocketChat/fuselage/commit/b289f68676954b91c792d8d97680314178bf2c60)) -- styled API; monorepo grooming ([#482](https://github.com/RocketChat/fuselage/issues/482)) ([1b6b70c](https://github.com/RocketChat/fuselage/commit/1b6b70cf67ec16927b1566adc2350295a8927223)) - -# [0.27.0](https://github.com/RocketChat/fuselage/compare/v0.26.0...v0.27.0) (2021-06-28) - -### Features - -- ui-kit-unified ([#392](https://github.com/RocketChat/fuselage/issues/392)) ([ce48ca9](https://github.com/RocketChat/fuselage/commit/ce48ca9d9806283bba8be5df7c29c7aa8c1e716f)) - -# [0.26.0](https://github.com/RocketChat/fuselage/compare/v0.25.0...v0.26.0) (2021-05-28) - -**Note:** Version bump only for package @rocket.chat/fuselage-ui-kit - -# [0.25.0](https://github.com/RocketChat/fuselage/compare/v0.24.0...v0.25.0) (2021-05-19) - -**Note:** Version bump only for package @rocket.chat/fuselage-ui-kit - -# [0.24.0](https://github.com/RocketChat/fuselage/compare/v0.23.0...v0.24.0) (2021-04-28) - -### Features - -- [@rocket](https://github.com/rocket).chat/string-helpers ([#431](https://github.com/RocketChat/fuselage/issues/431)) ([2509d6a](https://github.com/RocketChat/fuselage/commit/2509d6acdbe5ec8b216e8d4430373797c5f5dfe2)) - -# [0.23.0](https://github.com/RocketChat/fuselage/compare/v0.22.0...v0.23.0) (2021-04-01) - -### Bug Fixes - -- **npm:** Wrong paths in "files" field of package.json ([6d3c811](https://github.com/RocketChat/fuselage/commit/6d3c811f6fd747de7f47aff145902d88476272ee)) - -### Features - -- New icons ([#407](https://github.com/RocketChat/fuselage/issues/407)) ([9e708b4](https://github.com/RocketChat/fuselage/commit/9e708b42a0a3003669e1c5e76dce84b8ef563e21)) - -# [0.22.0](https://github.com/RocketChat/fuselage/compare/v0.21.0...v0.22.0) (2021-02-26) - -**Note:** Version bump only for package @rocket.chat/fuselage-ui-kit - -# [0.21.0](https://github.com/RocketChat/fuselage/compare/v0.20.3...v0.21.0) (2021-01-31) - -### Bug Fixes - -- Banner surface adjustments ([#362](https://github.com/RocketChat/fuselage/issues/362)) ([2d59b7c](https://github.com/RocketChat/fuselage/commit/2d59b7c41962f24aa13face91a9b9f0ea8f1718a)) -- Pass appId and blockId from blocks to elements ([#366](https://github.com/RocketChat/fuselage/issues/366)) ([8a1b552](https://github.com/RocketChat/fuselage/commit/8a1b552f8dbc3a9b321d888f4a7e9dc9af2922cf)) - -### Features - -- Built modules for design tokens ([#356](https://github.com/RocketChat/fuselage/issues/356)) ([f9c3449](https://github.com/RocketChat/fuselage/commit/f9c344953b8161a4385cab3a3dcc8b6a7210446f)) -- linear_scale element ([#365](https://github.com/RocketChat/fuselage/issues/365)) ([43a4c54](https://github.com/RocketChat/fuselage/commit/43a4c54ed10d096ef2259ddcd30c3bbd97ae866a)) - -## [0.20.3](https://github.com/RocketChat/fuselage/compare/v0.20.2...v0.20.3) (2021-01-29) - -**Note:** Version bump only for package @rocket.chat/fuselage-ui-kit - -## [0.20.2](https://github.com/RocketChat/fuselage/compare/v0.20.1...v0.20.2) (2021-01-27) - -**Note:** Version bump only for package @rocket.chat/fuselage-ui-kit - -## [0.20.1](https://github.com/RocketChat/fuselage/compare/v0.20.0...v0.20.1) (2020-12-22) - -**Note:** Version bump only for package @rocket.chat/fuselage-ui-kit - -# [0.20.0](https://github.com/RocketChat/fuselage/compare/v0.19.0...v0.20.0) (2020-12-21) - -**Note:** Version bump only for package @rocket.chat/fuselage-ui-kit - -# [0.19.0](https://github.com/RocketChat/fuselage/compare/v0.18.0...v0.19.0) (2020-11-28) - -**Note:** Version bump only for package @rocket.chat/fuselage-ui-kit - -# [0.18.0](https://github.com/RocketChat/fuselage/compare/v0.17.3...v0.18.0) (2020-11-16) - -### Bug Fixes - -- Set a conservative output.environment on Webpack bundles ([#330](https://github.com/RocketChat/fuselage/issues/330)) ([62bf728](https://github.com/RocketChat/fuselage/commit/62bf728d3541d8d7ee72420347f2351359fb5df7)) - -## [0.17.3](https://github.com/RocketChat/fuselage/compare/v0.17.2...v0.17.3) (2020-11-16) - -### Bug Fixes - -- Set a conservative output.environment on Webpack bundles ([#330](https://github.com/RocketChat/fuselage/issues/330)) ([85d4a3a](https://github.com/RocketChat/fuselage/commit/85d4a3a5fd6881b07e97fb690d31baef405cfa69)) - -## [0.17.2](https://github.com/RocketChat/fuselage/compare/v0.17.1...v0.17.2) (2020-10-28) - -**Note:** Version bump only for package @rocket.chat/fuselage-ui-kit - -## [0.17.1](https://github.com/RocketChat/fuselage/compare/v0.17.0...v0.17.1) (2020-10-26) - -**Note:** Version bump only for package @rocket.chat/fuselage-ui-kit - -# [0.17.0](https://github.com/RocketChat/fuselage/compare/v0.16.0...v0.17.0) (2020-10-25) - -**Note:** Version bump only for package @rocket.chat/fuselage-ui-kit - -# [0.16.0](https://github.com/RocketChat/fuselage/compare/v0.15.1...v0.16.0) (2020-09-30) - -**Note:** Version bump only for package @rocket.chat/fuselage-ui-kit - -## [0.15.1](https://github.com/RocketChat/fuselage/compare/v0.15.0...v0.15.1) (2020-09-22) - -**Note:** Version bump only for package @rocket.chat/fuselage-ui-kit - -# [0.15.0](https://github.com/RocketChat/fuselage/compare/v0.14.1...v0.15.0) (2020-09-17) - -**Note:** Version bump only for package @rocket.chat/fuselage-ui-kit - -## [0.14.1](https://github.com/RocketChat/fuselage/compare/v0.14.0...v0.14.1) (2020-08-22) - -**Note:** Version bump only for package @rocket.chat/fuselage-ui-kit - -# [0.14.0](https://github.com/RocketChat/fuselage/compare/v0.13.2...v0.14.0) (2020-08-18) - -**Note:** Version bump only for package @rocket.chat/fuselage-ui-kit - -## [0.13.2](https://github.com/RocketChat/fuselage/compare/v0.13.1...v0.13.2) (2020-07-24) - -**Note:** Version bump only for package @rocket.chat/fuselage-ui-kit - -## [0.13.1](https://github.com/RocketChat/fuselage/compare/v0.13.0...v0.13.1) (2020-07-17) - -### Bug Fixes - -- Select mutations and ui-kit alerts ([#263](https://github.com/RocketChat/fuselage/issues/263)) ([661398d](https://github.com/RocketChat/fuselage/commit/661398dfdeaf827dadc46d24a7382d69f43f9742)) - -# [0.13.0](https://github.com/RocketChat/fuselage/compare/v0.12.0...v0.13.0) (2020-07-14) - -**Note:** Version bump only for package @rocket.chat/fuselage-ui-kit - -# [0.12.0](https://github.com/RocketChat/fuselage/compare/v0.11.0...v0.12.0) (2020-07-14) - -**Note:** Version bump only for package @rocket.chat/fuselage-ui-kit - -# [0.11.0](https://github.com/RocketChat/fuselage/compare/v0.10.0...v0.11.0) (2020-07-11) - -**Note:** Version bump only for package @rocket.chat/fuselage-ui-kit - -# [0.10.0](https://github.com/RocketChat/fuselage/compare/v0.9.0...v0.10.0) (2020-06-20) - -### Bug Fixes - -- Missing legacy icons ([#238](https://github.com/RocketChat/fuselage/issues/238)) ([1d74390](https://github.com/RocketChat/fuselage/commit/1d74390)) - -# [0.9.0](https://github.com/RocketChat/fuselage/compare/v0.8.0...v0.9.0) (2020-05-21) - -### Bug Fixes - -- Deprecation warnings ([#227](https://github.com/RocketChat/fuselage/issues/227)) ([46322a8](https://github.com/RocketChat/fuselage/commit/46322a8e2781b4293adc7fdf4fcffae20f0d170f)) - -### Features - -- New Box props ([#213](https://github.com/RocketChat/fuselage/issues/213)) ([b593875](https://github.com/RocketChat/fuselage/commit/b593875f3561e334412f9d7e2fbe81007ed8098e)) - -# [0.8.0](https://github.com/RocketChat/fuselage/compare/v0.7.1...v0.8.0) (2020-04-22) - -### Features - -- Refactor static styles ([#201](https://github.com/RocketChat/fuselage/issues/201)) ([e1bdc65](https://github.com/RocketChat/fuselage/commit/e1bdc655a0dfe0f88261d3fab84c2e42c2ad581e)) - -## [0.7.1](https://github.com/RocketChat/fuselage/compare/v0.7.0...v0.7.1) (2020-04-01) - -### Bug Fixes - -- Fix ui kit babel config ([#191](https://github.com/RocketChat/fuselage/issues/191)) ([47295d8](https://github.com/RocketChat/fuselage/commit/47295d87740bc0ceb5e2bbb1901c2340cab860b6)) - -# [0.7.0](https://github.com/RocketChat/fuselage/compare/v0.6.2...v0.7.0) (2020-04-01) - -### Bug Fixes - -- Production build of [@rocket](https://github.com/rocket).chat/fuselage-ui-kit ([#190](https://github.com/RocketChat/fuselage/issues/190)) ([15a975a](https://github.com/RocketChat/fuselage/commit/15a975ab58688b29bfa93cd110bdc3d7e10de4ef)) - -### Features - -- Custom prop types and more props to Box ([#181](https://github.com/RocketChat/fuselage/issues/181)) ([119e815](https://github.com/RocketChat/fuselage/commit/119e815ac9a0b85c1649c53bab62390b25aae4b3)) - -## [0.6.2](https://github.com/RocketChat/fuselage/compare/v0.6.1...v0.6.2) (2020-03-31) - -**Note:** Version bump only for package @rocket.chat/fuselage-ui-kit - -## [0.6.1](https://github.com/RocketChat/fuselage/compare/v0.6.0...v0.6.1) (2020-03-24) - -### Bug Fixes - -- Spacing and markup in Ui Kit inputs ([#176](https://github.com/RocketChat/fuselage/issues/176)) ([e6df266](https://github.com/RocketChat/fuselage/commit/e6df266c1297e75c9de21149e98d23c919f76f79)) - -# [0.6.0](https://github.com/RocketChat/fuselage/compare/v0.5.0...v0.6.0) (2020-03-20) - -**Note:** Version bump only for package @rocket.chat/fuselage-ui-kit - -# [0.5.0](https://github.com/RocketChat/fuselage/compare/v0.4.1...v0.5.0) (2020-03-20) - -**Note:** Version bump only for package @rocket.chat/fuselage-ui-kit - -## [0.4.1](https://github.com/RocketChat/fuselage/compare/v0.4.0...v0.4.1) (2020-03-16) - -**Note:** Version bump only for package @rocket.chat/fuselage-ui-kit - -# [0.4.0](https://github.com/RocketChat/fuselage/compare/v0.3.0...v0.4.0) (2020-03-10) - -**Note:** Version bump only for package @rocket.chat/fuselage-ui-kit - -# [0.3.0](https://github.com/RocketChat/fuselage/compare/v0.2.0...v0.3.0) (2020-02-17) - -### Bug Fixes - -- actionId on action hooks ([#149](https://github.com/RocketChat/fuselage/issues/149)) ([c305eb2](https://github.com/RocketChat/fuselage/commit/c305eb2171463589ed24460d05d648daf984d267)) - -# [0.2.0](https://github.com/RocketChat/fuselage/compare/v0.2.0-alpha.30...v0.2.0) (2020-02-13) - -**Note:** Version bump only for package @rocket.chat/fuselage-ui-kit - -# [0.2.0-alpha.30](https://github.com/RocketChat/fuselage/compare/v0.2.0-alpha.29...v0.2.0-alpha.30) (2020-02-12) - -### Bug Fixes - -- Safari not triggering buttons anchors ([#146](https://github.com/RocketChat/fuselage/issues/146)) ([2cb5aaa](https://github.com/RocketChat/fuselage/commit/2cb5aaaf4c71e277a0a8ea556a8b9efbb3e58620)) - -# [0.2.0-alpha.29](https://github.com/RocketChat/fuselage/compare/v0.2.0-alpha.28...v0.2.0-alpha.29) (2020-02-10) - -**Note:** Version bump only for package @rocket.chat/fuselage-ui-kit - -# [0.2.0-alpha.28](https://github.com/RocketChat/fuselage/compare/v0.2.0-alpha.27...v0.2.0-alpha.28) (2020-02-10) - -**Note:** Version bump only for package @rocket.chat/fuselage-ui-kit - -# [0.2.0-alpha.27](https://github.com/RocketChat/fuselage/compare/v0.2.0-alpha.26...v0.2.0-alpha.27) (2020-02-10) - -**Note:** Version bump only for package @rocket.chat/fuselage-ui-kit - -# [0.2.0-alpha.26](https://github.com/RocketChat/fuselage/compare/v0.2.0-alpha.25...v0.2.0-alpha.26) (2020-02-10) - -### Bug Fixes - -- Select autofocus ([#141](https://github.com/RocketChat/fuselage/issues/141)) ([25849ee](https://github.com/RocketChat/fuselage/commit/25849eed55e4edbf26f54ae4a72c71c1d528e850)) - -# [0.2.0-alpha.25](https://github.com/RocketChat/fuselage/compare/v0.2.0-alpha.24...v0.2.0-alpha.25) (2020-02-10) - -**Note:** Version bump only for package @rocket.chat/fuselage-ui-kit - -# [0.2.0-alpha.24](https://github.com/RocketChat/fuselage/compare/v0.2.0-alpha.23...v0.2.0-alpha.24) (2020-02-09) - -**Note:** Version bump only for package @rocket.chat/fuselage-ui-kit - -# [0.2.0-alpha.23](https://github.com/RocketChat/fuselage/compare/v0.2.0-alpha.22...v0.2.0-alpha.23) (2020-02-07) - -### Bug Fixes - -- Section with Overflow visibility ([#138](https://github.com/RocketChat/fuselage/issues/138)) ([d0da3cd](https://github.com/RocketChat/fuselage/commit/d0da3cd7db31880c812519b7799f04555776167f)) - -# [0.2.0-alpha.22](https://github.com/RocketChat/fuselage/compare/v0.2.0-alpha.21...v0.2.0-alpha.22) (2020-02-07) - -### Bug Fixes - -- Select/MultiSelect focus submitting form ([#134](https://github.com/RocketChat/fuselage/issues/134)) ([630e622](https://github.com/RocketChat/fuselage/commit/630e622d8535fcaa06a8a736c6e0d273b450b739)) -- UIKit stopPropagation ([#137](https://github.com/RocketChat/fuselage/issues/137)) ([86939ea](https://github.com/RocketChat/fuselage/commit/86939eaae182d6554879468745780d83bc977b9e)) -- uikit using react components ([#135](https://github.com/RocketChat/fuselage/issues/135)) ([52fcedb](https://github.com/RocketChat/fuselage/commit/52fcedb0efbc33ad4240c83fd92a325fcc9f0f4c)) - -# [0.2.0-alpha.21](https://github.com/RocketChat/fuselage/compare/v0.2.0-alpha.20...v0.2.0-alpha.21) (2020-02-05) - -**Note:** Version bump only for package @rocket.chat/fuselage-ui-kit - -# [0.2.0-alpha.20](https://github.com/RocketChat/fuselage/compare/v0.2.0-alpha.19...v0.2.0-alpha.20) (2020-02-01) - -### Bug Fixes - -- ui-kit margins warnings and unique ids ([#130](https://github.com/RocketChat/fuselage/issues/130)) ([cdaa358](https://github.com/RocketChat/fuselage/commit/cdaa3580516aa652d7a318c6d076065954a3e289)) - -### Features - -- ui-kit initial value ([#131](https://github.com/RocketChat/fuselage/issues/131)) ([3c6cab4](https://github.com/RocketChat/fuselage/commit/3c6cab4bd7d6ba459841f6f847ef42229b097294)) -- UiKit error states ([#133](https://github.com/RocketChat/fuselage/issues/133)) ([d6b3842](https://github.com/RocketChat/fuselage/commit/d6b38429597963e1e437189c64a7e2be5e8715c0)) - -# [0.2.0-alpha.19](https://github.com/RocketChat/fuselage/compare/v0.2.0-alpha.18...v0.2.0-alpha.19) (2020-01-13) - -### Features - -- Position, Modal, Options components ([#116](https://github.com/RocketChat/fuselage/issues/116)) ([af1916a](https://github.com/RocketChat/fuselage/commit/af1916a22c677939adda04fe417dafe406292762)), closes [#117](https://github.com/RocketChat/fuselage/issues/117) - -# [0.2.0-alpha.18](https://github.com/RocketChat/fuselage/compare/v0.2.0-alpha.17...v0.2.0-alpha.18) (2019-12-31) - -### Features - -- UI Kit ([#95](https://github.com/RocketChat/fuselage/issues/95)) ([6d4162b](https://github.com/RocketChat/fuselage/commit/6d4162bb8c121b1e89f8c818e7106bce49f09c27)), closes [#94](https://github.com/RocketChat/fuselage/issues/94) [#109](https://github.com/RocketChat/fuselage/issues/109) [#108](https://github.com/RocketChat/fuselage/issues/108) [#111](https://github.com/RocketChat/fuselage/issues/111) diff --git a/packages/fuselage-ui-kit/README.md b/packages/fuselage-ui-kit/README.md deleted file mode 100644 index fc5243aae4..0000000000 --- a/packages/fuselage-ui-kit/README.md +++ /dev/null @@ -1,102 +0,0 @@ -<!--header--> - -<p align="center"> - <a href="https://rocket.chat" title="Rocket.Chat"> - <img src="https://github.com/RocketChat/Rocket.Chat.Artwork/raw/master/Logos/2020/png/logo-horizontal-red.png" alt="Rocket.Chat" /> - </a> -</p> - -# `@rocket.chat/fuselage-ui-kit` - -> UiKit elements for Rocket.Chat Apps built under Fuselage design system - ---- - -[![npm@latest](https://img.shields.io/npm/v/@rocket.chat/fuselage-ui-kit/latest?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/fuselage-ui-kit/v/latest) [![npm@next](https://img.shields.io/npm/v/@rocket.chat/fuselage-ui-kit/next?style=flat-square)](https://www.npmjs.com/package/@rocket.chat/fuselage-ui-kit/v/next) ![react version](https://img.shields.io/npm/dependency-version/@rocket.chat/fuselage-ui-kit/peer/react?style=flat-square) [![Storybook](https://cdn.jsdelivr.net/gh/storybookjs/brand@master/badge/badge-storybook.svg)](https://rocketchat.github.io/fuselage/fuselage-ui-kit) ![npm downloads](https://img.shields.io/npm/dw/@rocket.chat/fuselage-ui-kit?style=flat-square) ![License: MIT](https://img.shields.io/npm/l/@rocket.chat/fuselage-ui-kit?style=flat-square) - -![deps](https://img.shields.io/librariesio/release/npm/@rocket.chat/fuselage-ui-kit?style=flat-square) ![npm bundle size](https://img.shields.io/bundlephobia/min/@rocket.chat/fuselage-ui-kit?style=flat-square) - -<!--/header--> - -## Install - -<!--install--> - -Firstly, install the peer dependencies (prerequisites): - -```sh -npm i @rocket.chat/fuselage @rocket.chat/fuselage-hooks @rocket.chat/fuselage-polyfills @rocket.chat/icons @rocket.chat/styled react react-dom - -# or, if you are using yarn: - -yarn add @rocket.chat/fuselage @rocket.chat/fuselage-hooks @rocket.chat/fuselage-polyfills @rocket.chat/icons @rocket.chat/styled react react-dom -``` - -Add `@rocket.chat/fuselage-ui-kit` as a dependency: - -```sh -npm i @rocket.chat/fuselage-ui-kit - -# or, if you are using yarn: - -yarn add @rocket.chat/fuselage-ui-kit -``` - -<!--/install--> - -## Contributing - -<!--contributing(msg)--> - -Contributions, issues, and feature requests are welcome!<br /> -Feel free to check the [issues](https://github.com/RocketChat/fuselage/issues). - -<!--/contributing(msg)--> - -### Building - -As this package dependends on others in this monorepo, before anything run the following at the root directory: - -<!--yarn(build)--> - -```sh -yarn build -``` - -<!--/yarn(build)--> - -### Linting - -To ensure the source is matching our coding style, we perform [linting](<https://en.wikipedia.org/wiki/Lint_(software)>). -Before commiting, check if your code fits our style by running: - -<!--yarn(lint)--> - -```sh -yarn lint -``` - -<!--/yarn(lint)--> - -Some linter warnings and errors can be automatically fixed: - -<!--yarn(lint-and-fix)--> - -```sh -yarn lint-and-fix -``` - -<!--/yarn(lint-and-fix)--> - -### Component stories - -We develop and describe our visual components in the form of stories, manage by a tool called [Storybook](https://storybook.js.org/). -To start developing with Storybook, run: - -<!--yarn(storybook)--> - -```sh -yarn storybook -``` - -<!--/yarn(storybook)--> diff --git a/packages/fuselage-ui-kit/package.json b/packages/fuselage-ui-kit/package.json deleted file mode 100644 index 56e054b075..0000000000 --- a/packages/fuselage-ui-kit/package.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "name": "@rocket.chat/fuselage-ui-kit", - "version": "0.31.22", - "description": "UiKit elements for Rocket.Chat Apps built under Fuselage design system", - "homepage": "https://rocketchat.github.io/Rocket.Chat.Fuselage/", - "author": { - "name": "Rocket.Chat", - "url": "https://rocket.chat/" - }, - "license": "MIT", - "repository": { - "type": "git", - "url": "git+https://github.com/RocketChat/fuselage.git", - "directory": "packages/fuselage-ui-kit" - }, - "bugs": { - "url": "https://github.com/RocketChat/fuselage/issues" - }, - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/esm/index.d.ts", - "files": [ - "/dist" - ], - "publishConfig": { - "access": "public" - }, - "scripts": { - "build": "run-s .:build:clean .:build:esm .:build:cjs", - ".:build:clean": "rimraf dist", - ".:build:esm": "tsc -p tsconfig-esm.json", - ".:build:cjs": "tsc -p tsconfig-cjs.json", - "lint": "lint", - "lint-and-fix": "lint-and-fix", - "lint-staged": "lint-staged", - "docs": "cross-env NODE_ENV=production build-storybook -o ../../static/fuselage-ui-kit", - "storybook": "start-storybook -p 6006", - "build-storybook": "cross-env NODE_ENV=production build-storybook", - "bump-next": "bump-next" - }, - "peerDependencies": { - "@rocket.chat/fuselage": "*", - "@rocket.chat/fuselage-hooks": "*", - "@rocket.chat/fuselage-polyfills": "*", - "@rocket.chat/icons": "*", - "@rocket.chat/styled": "*", - "react": "^17.0.2", - "react-dom": "^17.0.2" - }, - "devDependencies": { - "@rocket.chat/apps-engine": "~1.30.0", - "@rocket.chat/eslint-config-alt": "workspace:~", - "@rocket.chat/fuselage": "workspace:~", - "@rocket.chat/fuselage-hooks": "workspace:~", - "@rocket.chat/fuselage-polyfills": "workspace:~", - "@rocket.chat/icons": "workspace:~", - "@rocket.chat/prettier-config": "workspace:~", - "@rocket.chat/styled": "workspace:~", - "@storybook/addon-essentials": "~6.5.16", - "@storybook/addons": "~6.5.16", - "@storybook/builder-webpack5": "~6.5.16", - "@storybook/manager-webpack5": "~6.5.16", - "@storybook/react": "~6.5.16", - "@storybook/theming": "~6.5.16", - "@types/react": "~17.0.57", - "@types/react-dom": "^17.0.19", - "babel-loader": "~9.1.2", - "bump": "workspace:~", - "cross-env": "^7.0.3", - "eslint": "~8.38.0", - "lint-all": "workspace:~", - "lint-staged": "~13.2.1", - "normalize.css": "^8.0.1", - "npm-run-all": "^4.1.5", - "prettier": "~2.8.7", - "react": "^17.0.2", - "react-docgen-typescript-plugin": "~1.0.5", - "react-dom": "^17.0.2", - "rimraf": "^3.0.2", - "typescript": "~5.0.4", - "webpack": "~5.78.0", - "write-version-module": "workspace:~" - }, - "dependencies": { - "@rocket.chat/ui-kit": "workspace:~" - }, - "volta": { - "extends": "../../package.json" - } -} diff --git a/packages/fuselage-ui-kit/src/blocks/ActionsBlock.Action.tsx b/packages/fuselage-ui-kit/src/blocks/ActionsBlock.Action.tsx deleted file mode 100644 index fddca585db..0000000000 --- a/packages/fuselage-ui-kit/src/blocks/ActionsBlock.Action.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { Box } from '@rocket.chat/fuselage'; -import * as UiKit from '@rocket.chat/ui-kit'; -import type { ReactElement } from 'react'; -import React from 'react'; - -type ActionProps = { - element: UiKit.ActionsBlock['elements'][number]; - parser: UiKit.SurfaceRenderer<ReactElement>; - index: number; -}; - -const Action = ({ - element, - parser, - index, -}: ActionProps): ReactElement | null => { - const renderedElement = parser.renderActionsBlockElement(element, index); - - if (!renderedElement) { - return null; - } - - return ( - <Box - display='flex' - margin={4} - flexGrow={element.type !== UiKit.BlockElementType.BUTTON ? 1 : undefined} - flexBasis={ - element.type !== UiKit.BlockElementType.BUTTON ? '45%' : undefined - } - > - {renderedElement} - </Box> - ); -}; - -export default Action; diff --git a/packages/fuselage-ui-kit/src/blocks/ActionsBlock.tsx b/packages/fuselage-ui-kit/src/blocks/ActionsBlock.tsx deleted file mode 100644 index c750935fe3..0000000000 --- a/packages/fuselage-ui-kit/src/blocks/ActionsBlock.tsx +++ /dev/null @@ -1,59 +0,0 @@ -import { Box, Button } from '@rocket.chat/fuselage'; -import * as UiKit from '@rocket.chat/ui-kit'; -import type { ReactElement } from 'react'; -import React, { memo, useCallback, useMemo, useState } from 'react'; - -import { useSurfaceType } from '../contexts/SurfaceContext'; -import type { BlockProps } from '../utils/BlockProps'; -import Action from './ActionsBlock.Action'; - -type ActionsBlockProps = BlockProps<UiKit.ActionsBlock>; - -const ActionsBlock = ({ - className, - block, - surfaceRenderer, -}: ActionsBlockProps): ReactElement => { - const surfaceType = useSurfaceType(); - - const [showMoreVisible, setShowMoreVisible] = useState( - () => block.elements.length > 5 && surfaceType !== 'banner' - ); - - const handleShowMoreClick = useCallback(() => { - setShowMoreVisible(false); - }, []); - - const actionElements = useMemo( - () => - (showMoreVisible ? block.elements.slice(0, 5) : block.elements).map( - (element) => ({ - ...element, - appId: element.appId ?? block.appId, - blockId: element.blockId ?? block.blockId, - }) - ), - [block.appId, block.blockId, block.elements, showMoreVisible] - ); - - return ( - <Box className={className} display='flex' flexWrap='wrap' margin={-4}> - {actionElements.map((element, i) => ( - <Action key={i} element={element} parser={surfaceRenderer} index={i} /> - ))} - {showMoreVisible && ( - <Box display='flex' margin={4}> - <Button small onClick={handleShowMoreClick}> - {surfaceRenderer.renderTextObject( - { type: 'plain_text', text: 'Show more...' }, - 0, - UiKit.BlockContext.NONE - )} - </Button> - </Box> - )} - </Box> - ); -}; - -export default memo(ActionsBlock); diff --git a/packages/fuselage-ui-kit/src/blocks/ContextBlock.Item.tsx b/packages/fuselage-ui-kit/src/blocks/ContextBlock.Item.tsx deleted file mode 100644 index 005c939e9f..0000000000 --- a/packages/fuselage-ui-kit/src/blocks/ContextBlock.Item.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { Box } from '@rocket.chat/fuselage'; -import * as UiKit from '@rocket.chat/ui-kit'; -import type { ReactElement } from 'react'; -import React from 'react'; - -type ItemProps = { - block: UiKit.ContextBlock['elements'][number]; - surfaceRenderer: UiKit.SurfaceRenderer<ReactElement>; - index: number; -}; - -const Item = ({ - block: element, - surfaceRenderer: parser, - index, -}: ItemProps): ReactElement | null => { - const renderedElement = parser.renderContextBlockElement(element, index); - - if (!renderedElement) { - return null; - } - - switch (element.type) { - case UiKit.TextObjectType.PLAIN_TEXT: - case UiKit.TextObjectType.MARKDOWN: - return ( - <Box is='span' fontScale='c1' color='info' margin={4}> - {renderedElement} - </Box> - ); - - default: - return renderedElement; - } -}; - -export default Item; diff --git a/packages/fuselage-ui-kit/src/blocks/ContextBlock.tsx b/packages/fuselage-ui-kit/src/blocks/ContextBlock.tsx deleted file mode 100644 index cce7fdcd62..0000000000 --- a/packages/fuselage-ui-kit/src/blocks/ContextBlock.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import { Box } from '@rocket.chat/fuselage'; -import type * as UiKit from '@rocket.chat/ui-kit'; -import type { ReactElement } from 'react'; -import React, { memo, useMemo } from 'react'; - -import type { BlockProps } from '../utils/BlockProps'; -import Item from './ContextBlock.Item'; - -type ContextBlockProps = BlockProps<UiKit.ContextBlock>; - -const ContextBlock = ({ - className, - block, - surfaceRenderer, -}: ContextBlockProps): ReactElement => { - const itemElements = useMemo( - () => - block.elements.map((element) => ({ - ...element, - appId: block.appId, - blockId: block.blockId, - })), - [block.appId, block.blockId, block.elements] - ); - - return ( - <Box className={className} display='flex' alignItems='center' margin={-4}> - {itemElements.map((element, i) => ( - <Item - key={i} - block={element} - surfaceRenderer={surfaceRenderer} - index={i} - /> - ))} - </Box> - ); -}; - -export default memo(ContextBlock); diff --git a/packages/fuselage-ui-kit/src/blocks/DividerBlock.tsx b/packages/fuselage-ui-kit/src/blocks/DividerBlock.tsx deleted file mode 100644 index 8134070e47..0000000000 --- a/packages/fuselage-ui-kit/src/blocks/DividerBlock.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { Divider } from '@rocket.chat/fuselage'; -import type * as UiKit from '@rocket.chat/ui-kit'; -import type { ReactElement } from 'react'; -import React, { memo } from 'react'; - -import type { BlockProps } from '../utils/BlockProps'; - -type DividerBlockProps = BlockProps<UiKit.DividerBlock>; - -const DividerBlock = ({ className }: DividerBlockProps): ReactElement => ( - <Divider className={className} marginBlock='x24' /> -); - -export default memo(DividerBlock); diff --git a/packages/fuselage-ui-kit/src/blocks/ImageBlock.styles.tsx b/packages/fuselage-ui-kit/src/blocks/ImageBlock.styles.tsx deleted file mode 100644 index 060b15ee91..0000000000 --- a/packages/fuselage-ui-kit/src/blocks/ImageBlock.styles.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import styled from '@rocket.chat/styled'; - -const filterImageProps = ({ - imageUrl: _imageUrl, - width: _width, - height: _height, - ...props -}: { - imageUrl: string; - width: number; - height: number; -}) => props; - -export const Image = styled('div', filterImageProps)` - box-shadow: 0 0 0px 1px rgba(204, 204, 204, 38%); - background-repeat: no-repeat; - background-position: 50%; - background-size: cover; - background-color: rgba(204, 204, 204, 38%); - background-image: url(${(props) => props.imageUrl}); - width: ${(props) => String(props.width)}px; - height: ${(props) => String(props.height)}px; - overflow: hidden; -`; diff --git a/packages/fuselage-ui-kit/src/blocks/ImageBlock.tsx b/packages/fuselage-ui-kit/src/blocks/ImageBlock.tsx deleted file mode 100644 index 1c615ba2f1..0000000000 --- a/packages/fuselage-ui-kit/src/blocks/ImageBlock.tsx +++ /dev/null @@ -1,106 +0,0 @@ -import { Box, Skeleton } from '@rocket.chat/fuselage'; -import * as UiKit from '@rocket.chat/ui-kit'; -import type { ReactElement } from 'react'; -import React, { memo, useEffect, useState } from 'react'; - -import { useSurfaceType } from '../contexts/SurfaceContext'; -import type { BlockProps } from '../utils/BlockProps'; -import { Image } from './ImageBlock.styles'; - -const maxSize = 360; - -const fetchImageState = (img: HTMLImageElement) => { - if (!img.complete) { - return { - loading: true, - width: maxSize, - height: (maxSize * 9) / 21, - }; - } - - const { naturalWidth, naturalHeight } = img; - - const scaleRatio = - naturalWidth > naturalHeight - ? Math.min(naturalWidth, maxSize) / naturalWidth - : Math.min(naturalHeight, maxSize) / naturalHeight; - - return { - loading: false, - width: naturalWidth * scaleRatio, - height: naturalHeight * scaleRatio, - }; -}; - -type ImageBlockProps = BlockProps<UiKit.ImageBlock>; - -const ImageBlock = ({ - className, - block, - surfaceRenderer, -}: ImageBlockProps): ReactElement => { - const surface = useSurfaceType(); - - const alignment = - surface === 'banner' || surface === 'message' ? 'flex-start' : 'center'; - - const [{ loading, width, height }, setState] = useState(() => { - const img = document.createElement('img'); - img.src = block.imageUrl; - return fetchImageState(img); - }); - - useEffect(() => { - const img = document.createElement('img'); - - const handleLoad = () => { - setState(fetchImageState(img)); - }; - - img.addEventListener('load', handleLoad); - img.src = block.imageUrl; - - if (img.complete) { - img.removeEventListener('load', handleLoad); - setState(fetchImageState(img)); - } - - return () => { - img.removeEventListener('load', handleLoad); - }; - }, [block.imageUrl]); - - return ( - <Box - className={className} - display='flex' - flexDirection='column' - flexWrap='nowrap' - alignItems={alignment} - > - <Box overflow='hidden' width={width}> - {block.title && ( - <Box fontScale='c1' color='info' withTruncatedText marginBlockEnd={4}> - {surfaceRenderer.renderTextObject( - block.title, - 0, - UiKit.BlockContext.NONE - )} - </Box> - )} - {loading ? ( - <Skeleton variant='rect' width={width} height={height} /> - ) : ( - <Image - imageUrl={block.imageUrl} - width={width} - height={height} - aria-label={block.altText} - /> - )} - </Box> - </Box> - ); -}; - -export default memo(ImageBlock); diff --git a/packages/fuselage-ui-kit/src/blocks/InputBlock.tsx b/packages/fuselage-ui-kit/src/blocks/InputBlock.tsx deleted file mode 100644 index 11331e020f..0000000000 --- a/packages/fuselage-ui-kit/src/blocks/InputBlock.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { Field } from '@rocket.chat/fuselage'; -import * as UiKit from '@rocket.chat/ui-kit'; -import type { ReactElement } from 'react'; -import React, { memo, useMemo } from 'react'; - -import { useUiKitState } from '../hooks/useUiKitState'; -import type { BlockProps } from '../utils/BlockProps'; - -type InputBlockProps = BlockProps<UiKit.InputBlock>; - -const InputBlock = ({ - className, - block, - surfaceRenderer, - context, -}: InputBlockProps): ReactElement => { - const inputElement = useMemo( - () => ({ - ...block.element, - appId: block.element.appId ?? block.appId, - blockId: block.element.blockId ?? block.blockId, - }), - [block.element, block.appId, block.blockId] - ); - - const [{ error }] = useUiKitState(inputElement, context); - - return ( - <Field className={className}> - {block.label && ( - <Field.Label> - {surfaceRenderer.renderTextObject( - block.label, - 0, - UiKit.BlockContext.NONE - )} - </Field.Label> - )} - <Field.Row> - {surfaceRenderer.renderInputBlockElement(inputElement, 0)} - </Field.Row> - {error && <Field.Error>{error}</Field.Error>} - {block.hint && <Field.Hint>{block.hint}</Field.Hint>} - </Field> - ); -}; - -export default memo(InputBlock); diff --git a/packages/fuselage-ui-kit/src/blocks/PreviewBlock.tsx b/packages/fuselage-ui-kit/src/blocks/PreviewBlock.tsx deleted file mode 100644 index 1eca469e43..0000000000 --- a/packages/fuselage-ui-kit/src/blocks/PreviewBlock.tsx +++ /dev/null @@ -1,91 +0,0 @@ -import { - MessageGenericPreview, - MessageGenericPreviewContent, - MessageGenericPreviewDescription, - MessageGenericPreviewImage, - MessageGenericPreviewTitle, - MessageGenericPreviewFooter, - MessageGenericPreviewThumb, - Box, -} from '@rocket.chat/fuselage'; -import * as UiKit from '@rocket.chat/ui-kit'; -import { - isPreviewBlockWithThumb, - isPreviewBlockWithPreview, -} from '@rocket.chat/ui-kit'; -import type { ReactElement } from 'react'; -import React, { memo } from 'react'; - -import type { BlockProps } from '../utils/BlockProps'; -import ContextBlock from './ContextBlock'; - -type PreviewBlockProps = BlockProps<UiKit.PreviewBlock>; - -const PreviewBlock = ({ - block, - surfaceRenderer, -}: PreviewBlockProps): ReactElement => ( - <Box> - <MessageGenericPreview> - {isPreviewBlockWithPreview(block) && block.preview?.dimensions && ( - <MessageGenericPreviewImage - width={block.preview.dimensions.width} - height={block.preview.dimensions.height} - url={block.preview.url} - /> - )} - <MessageGenericPreviewContent - thumb={ - isPreviewBlockWithThumb(block) ? ( - <MessageGenericPreviewThumb> - <MessageGenericPreviewImage - height={192} - width={368} - url={block.thumb.url} - /> - </MessageGenericPreviewThumb> - ) : undefined - } - > - {Array.isArray(block.title) ? ( - <MessageGenericPreviewTitle - externalUrl={ - isPreviewBlockWithPreview(block) ? block.externalUrl : undefined - } - > - {block.title.map((title) => - surfaceRenderer.renderTextObject( - title, - 0, - UiKit.BlockContext.NONE - ) - )} - </MessageGenericPreviewTitle> - ) : null} - {Array.isArray(block.description) ? ( - <MessageGenericPreviewDescription clamp> - {block.description.map((description) => - surfaceRenderer.renderTextObject( - description, - 0, - UiKit.BlockContext.NONE - ) - )} - </MessageGenericPreviewDescription> - ) : null} - {block.footer && ( - <MessageGenericPreviewFooter> - <ContextBlock - block={block.footer} - surfaceRenderer={surfaceRenderer} - context={UiKit.BlockContext.BLOCK} - index={0} - /> - </MessageGenericPreviewFooter> - )} - </MessageGenericPreviewContent> - </MessageGenericPreview> - </Box> -); - -export default memo(PreviewBlock); diff --git a/packages/fuselage-ui-kit/src/blocks/SectionBlock.Fields.tsx b/packages/fuselage-ui-kit/src/blocks/SectionBlock.Fields.tsx deleted file mode 100644 index 00be3f42e3..0000000000 --- a/packages/fuselage-ui-kit/src/blocks/SectionBlock.Fields.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { Grid } from '@rocket.chat/fuselage'; -import * as UiKit from '@rocket.chat/ui-kit'; -import type { ReactElement } from 'react'; -import React from 'react'; - -const breakpoints = { - xs: 4, - sm: 4, - md: 4, - lg: 6, - xl: 6, -} as const; - -type FieldsProps = { - fields: readonly UiKit.TextObject[]; - surfaceRenderer: UiKit.SurfaceRenderer<ReactElement>; -}; - -const Fields = ({ fields, surfaceRenderer }: FieldsProps): ReactElement => ( - <Grid> - {fields.map((field, i) => ( - <Grid.Item {...breakpoints} key={i}> - {surfaceRenderer.renderTextObject(field, 0, UiKit.BlockContext.NONE)} - </Grid.Item> - ))} - </Grid> -); - -export default Fields; diff --git a/packages/fuselage-ui-kit/src/blocks/SectionBlock.tsx b/packages/fuselage-ui-kit/src/blocks/SectionBlock.tsx deleted file mode 100644 index 773fb97d1f..0000000000 --- a/packages/fuselage-ui-kit/src/blocks/SectionBlock.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import { Box, Flex, Grid } from '@rocket.chat/fuselage'; -import type * as UiKit from '@rocket.chat/ui-kit'; -import type { ReactElement } from 'react'; -import React, { memo, useMemo } from 'react'; - -import type { BlockProps } from '../utils/BlockProps'; -import Fields from './SectionBlock.Fields'; - -type SectionBlockProps = BlockProps<UiKit.SectionBlock>; - -const SectionBlock = ({ - className, - block, - surfaceRenderer, -}: SectionBlockProps): ReactElement => { - const { text, fields } = block; - - const accessoryElement = useMemo( - () => - block.accessory - ? { - appId: block.appId, - blockId: block.blockId, - ...block.accessory, - } - : undefined, - [block.appId, block.blockId, block.accessory] - ); - - return ( - <Grid className={className}> - <Grid.Item> - {text && ( - <Box is='span' fontScale='p2' color='default'> - {surfaceRenderer.text(text)} - </Box> - )} - {fields && <Fields fields={fields} surfaceRenderer={surfaceRenderer} />} - </Grid.Item> - {block.accessory && ( - <Flex.Item grow={0}> - <Grid.Item> - {accessoryElement - ? surfaceRenderer.renderSectionAccessoryBlockElement( - accessoryElement, - 0 - ) - : null} - </Grid.Item> - </Flex.Item> - )} - </Grid> - ); -}; - -export default memo(SectionBlock); diff --git a/packages/fuselage-ui-kit/src/contexts/SurfaceContext.ts b/packages/fuselage-ui-kit/src/contexts/SurfaceContext.ts deleted file mode 100644 index 62bd57bd4b..0000000000 --- a/packages/fuselage-ui-kit/src/contexts/SurfaceContext.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { createContext, useContext } from 'react'; - -type SurfaceContextValue = 'attachment' | 'banner' | 'message' | 'modal'; - -export const SurfaceContext = createContext<SurfaceContextValue>('message'); - -export const useSurfaceType = (): SurfaceContextValue => - useContext(SurfaceContext); diff --git a/packages/fuselage-ui-kit/src/contexts/kitContext.ts b/packages/fuselage-ui-kit/src/contexts/kitContext.ts deleted file mode 100644 index b0cb4141b1..0000000000 --- a/packages/fuselage-ui-kit/src/contexts/kitContext.ts +++ /dev/null @@ -1,53 +0,0 @@ -import type { InputElementDispatchAction } from '@rocket.chat/ui-kit'; -import { createContext, useContext } from 'react'; - -type ActionParams = { - blockId: string; - appId: string; - actionId: string; - value: unknown; - viewId?: string; - dispatchActionConfig?: InputElementDispatchAction[]; -}; - -type UiKitContext = { - action: ( - state: ActionParams, - event: Parameters<React.MouseEventHandler<HTMLElement>>[0] - ) => Promise<void> | void; - state: ( - state: ActionParams, - event: Parameters<React.MouseEventHandler<HTMLElement>>[0] - ) => Promise<void> | void; - appId: string; - errors?: Record<string, string>; - values: Record<string, { value: string } | undefined>; - viewId?: string; -}; - -export const defaultContext = { - action: console.log, - state: console.log, - appId: 'core', - errors: {}, - values: {}, -}; - -export const kitContext = createContext<UiKitContext>(defaultContext); - -export const useUiKitContext = () => useContext(kitContext); - -export const useUiKitStateValue = <T extends string | number | undefined>( - actionId: string, - initialValue: T -): { - value: T; - error: string | undefined; -} => { - const { values, errors } = useUiKitContext(); - - return { - value: (values && (values[actionId]?.value as T)) ?? initialValue, - error: errors && errors[actionId], - }; -}; diff --git a/packages/fuselage-ui-kit/src/elements/ButtonElement.tsx b/packages/fuselage-ui-kit/src/elements/ButtonElement.tsx deleted file mode 100644 index cfb620aff2..0000000000 --- a/packages/fuselage-ui-kit/src/elements/ButtonElement.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { Button, Throbber } from '@rocket.chat/fuselage'; -import * as UiKit from '@rocket.chat/ui-kit'; -import type { ReactElement } from 'react'; -import React from 'react'; - -import { useUiKitState } from '../hooks/useUiKitState'; -import type { BlockProps } from '../utils/BlockProps'; - -type ButtonElementProps = BlockProps<UiKit.ButtonElement>; - -const ButtonElement = ({ - block, - context, - surfaceRenderer, -}: ButtonElementProps): ReactElement => { - const [{ loading }, action] = useUiKitState(block, context); - - if (block.url) { - return ( - <Button - is='a' - target='_blank' - href={block.url} - disabled={loading} - primary={block.style === 'primary'} - danger={block.style === 'danger'} - minWidth='4ch' - small - onClick={action} - > - {loading ? ( - <Throbber /> - ) : ( - surfaceRenderer.renderTextObject( - block.text, - 0, - UiKit.BlockContext.NONE - ) - )} - </Button> - ); - } - - return ( - <Button - disabled={loading} - primary={block.style === 'primary'} - danger={block.style === 'danger'} - minWidth='4ch' - small - value={block.value} - onClick={action} - > - {loading ? ( - <Throbber /> - ) : ( - surfaceRenderer.renderTextObject(block.text, 0, UiKit.BlockContext.NONE) - )} - </Button> - ); -}; - -export default ButtonElement; diff --git a/packages/fuselage-ui-kit/src/elements/ContextElement/ContextElement.tsx b/packages/fuselage-ui-kit/src/elements/ContextElement/ContextElement.tsx deleted file mode 100644 index 898a3abb9e..0000000000 --- a/packages/fuselage-ui-kit/src/elements/ContextElement/ContextElement.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { Box } from '@rocket.chat/fuselage'; -import type * as UiKit from '@rocket.chat/ui-kit'; -import type { FC } from 'react'; -import React from 'react'; - -import type { BlockProps } from '../../utils/BlockProps'; -import { ContextElementItem } from './ContextElementItem'; - -type ContextElementProps = BlockProps<UiKit.ContextBlock>; - -export const ContextElement: FC<ContextElementProps> = ({ - block, - surfaceRenderer, - className, -}) => ( - <Box - className={className} - display='flex' - alignItems='center' - margin={-4} - withTruncatedText - > - {block.elements.map((element, i) => ( - <ContextElementItem - index={i} - key={i} - element={element} - surfaceRenderer={surfaceRenderer} - /> - ))} - </Box> -); diff --git a/packages/fuselage-ui-kit/src/elements/ContextElement/ContextElementItem.tsx b/packages/fuselage-ui-kit/src/elements/ContextElement/ContextElementItem.tsx deleted file mode 100644 index c50044e45c..0000000000 --- a/packages/fuselage-ui-kit/src/elements/ContextElement/ContextElementItem.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { Box } from '@rocket.chat/fuselage'; -import type * as UiKit from '@rocket.chat/ui-kit'; -import { BlockContext, ElementType } from '@rocket.chat/ui-kit'; -import type { FC } from 'react'; -import React from 'react'; - -import type { BlockProps } from '../../utils/BlockProps'; - -type ContextElementProps = BlockProps<UiKit.ContextBlock>; - -export const ContextElementItem: FC<{ - element: ContextElementProps['block']['elements'][number]; - surfaceRenderer: ContextElementProps['surfaceRenderer']; - index: number; -}> = ({ element, surfaceRenderer, index }) => { - const renderedElement = surfaceRenderer.renderContext( - element, - BlockContext.CONTEXT, - undefined, - index - ); - - if (!renderedElement) { - return null; - } - - switch (element.type) { - case ElementType.PLAIN_TEXT: - case ElementType.MARKDOWN: - return ( - <Box is='span' withTruncatedText fontScale='c1' color='info' margin={4}> - {renderedElement} - </Box> - ); - - default: - return <>{renderedElement}</>; - } -}; diff --git a/packages/fuselage-ui-kit/src/elements/ContextElement/index.tsx b/packages/fuselage-ui-kit/src/elements/ContextElement/index.tsx deleted file mode 100644 index 65f71e66c9..0000000000 --- a/packages/fuselage-ui-kit/src/elements/ContextElement/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export * from './ContextElement'; diff --git a/packages/fuselage-ui-kit/src/elements/DatePickerElement.tsx b/packages/fuselage-ui-kit/src/elements/DatePickerElement.tsx deleted file mode 100644 index ba05bedf9b..0000000000 --- a/packages/fuselage-ui-kit/src/elements/DatePickerElement.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { InputBox } from '@rocket.chat/fuselage'; -import type * as UiKit from '@rocket.chat/ui-kit'; -import type { ReactElement } from 'react'; -import React from 'react'; - -import { useUiKitState } from '../hooks/useUiKitState'; -import type { BlockProps } from '../utils/BlockProps'; -import { fromTextObjectToString } from '../utils/fromTextObjectToString'; - -type DatePickerElementProps = BlockProps<UiKit.DatePickerElement>; - -const DatePickerElement = ({ - block, - context, - surfaceRenderer, -}: DatePickerElementProps): ReactElement => { - const [{ loading, value, error }, action] = useUiKitState(block, context); - const { actionId, placeholder } = block; - - return ( - <InputBox - type='date' - error={error} - value={value as string} - disabled={loading} - id={actionId} - name={actionId} - rows={6} - placeholder={ - placeholder - ? fromTextObjectToString(surfaceRenderer, placeholder, 0) - : undefined - } - onInput={action} - /> - ); -}; - -export default DatePickerElement; diff --git a/packages/fuselage-ui-kit/src/elements/ImageElement.styles.tsx b/packages/fuselage-ui-kit/src/elements/ImageElement.styles.tsx deleted file mode 100644 index d3c28516ad..0000000000 --- a/packages/fuselage-ui-kit/src/elements/ImageElement.styles.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import styled from '@rocket.chat/styled'; - -const filterElementProps = ({ - imageUrl: _imageUrl, - size: _size, - ...props -}: { - imageUrl: string; - size: number; -}) => props; - -export const Element = styled('div', filterElementProps)` - box-shadow: 0 0 0px 1px rgba(204, 204, 204, 38%); - background-repeat: no-repeat; - background-position: 50%; - background-size: cover; - background-color: rgba(204, 204, 204, 38%); - background-image: url(${(props) => props.imageUrl}); - width: ${(props) => String(props.size)}px; - height: ${(props) => String(props.size)}px; - border-radius: 4px; - overflow: hidden; - margin-inline-start: 4px; -`; diff --git a/packages/fuselage-ui-kit/src/elements/ImageElement.tsx b/packages/fuselage-ui-kit/src/elements/ImageElement.tsx deleted file mode 100644 index ec56a868c3..0000000000 --- a/packages/fuselage-ui-kit/src/elements/ImageElement.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import * as UiKit from '@rocket.chat/ui-kit'; -import type { ReactElement } from 'react'; -import React from 'react'; - -import type { BlockProps } from '../utils/BlockProps'; -import { Element } from './ImageElement.styles'; - -type ImageElementProps = BlockProps<UiKit.ImageElement>; - -const ImageElement = ({ - block, - context, -}: ImageElementProps): ReactElement | null => { - const size = - (context === UiKit.BlockContext.SECTION && 88) || - (context === UiKit.BlockContext.CONTEXT && 20) || - undefined; - - if (!size) { - return null; - } - - return <Element imageUrl={block.imageUrl} size={size} />; -}; - -export default ImageElement; diff --git a/packages/fuselage-ui-kit/src/elements/LinearScaleElement.tsx b/packages/fuselage-ui-kit/src/elements/LinearScaleElement.tsx deleted file mode 100644 index e35ea819db..0000000000 --- a/packages/fuselage-ui-kit/src/elements/LinearScaleElement.tsx +++ /dev/null @@ -1,99 +0,0 @@ -import { Box, Button, ButtonGroup } from '@rocket.chat/fuselage'; -import * as UiKit from '@rocket.chat/ui-kit'; -import type { ReactElement } from 'react'; -import React, { memo, useMemo } from 'react'; - -import { useUiKitState } from '../hooks/useUiKitState'; -import type { BlockProps } from '../utils/BlockProps'; - -type LinearScaleElementProps = BlockProps<UiKit.LinearScaleElement>; - -const LinearScaleElement = ({ - className, - block, - context, - surfaceRenderer, -}: LinearScaleElementProps): ReactElement => { - const { - minValue = 0, - maxValue = 10, - initialValue, - preLabel, - postLabel, - } = block; - - const [{ loading, value = initialValue, error }, action] = useUiKitState( - block, - context - ); - - const points = useMemo( - () => - Array.from({ length: Math.max(maxValue - minValue + 1, 1) }, (_, i) => - String(minValue + i) - ), - [maxValue, minValue] - ); - - return ( - <Box - display='flex' - flexDirection='row' - flexWrap='nowrap' - alignItems='center' - > - {preLabel && ( - <Box fontScale='c2' paddingInlineEnd={8} textAlign='start'> - {surfaceRenderer.renderTextObject( - preLabel, - 0, - UiKit.BlockContext.NONE - )} - </Box> - )} - <Box> - <ButtonGroup - className={className} - align='center' - marginInline={-2} - minWidth={0} - > - {points.map((point, i) => ( - <Button - key={i} - className={point === String(value) ? 'active' : undefined} - disabled={loading} - danger={!!error} - minWidth='4ch' - small - value={point} - marginInline={2} - flexShrink={1} - onClick={action} - > - {surfaceRenderer.renderTextObject( - { - type: 'plain_text', - text: String(i + minValue), - }, - 0, - UiKit.BlockContext.NONE - )} - </Button> - ))} - </ButtonGroup> - </Box> - {postLabel && ( - <Box fontScale='c2' paddingInlineStart={8} textAlign='end'> - {surfaceRenderer.renderTextObject( - postLabel, - 0, - UiKit.BlockContext.NONE - )} - </Box> - )} - </Box> - ); -}; - -export default memo(LinearScaleElement); diff --git a/packages/fuselage-ui-kit/src/elements/MultiStaticSelectElement.tsx b/packages/fuselage-ui-kit/src/elements/MultiStaticSelectElement.tsx deleted file mode 100644 index e7c4ed49bd..0000000000 --- a/packages/fuselage-ui-kit/src/elements/MultiStaticSelectElement.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import type { SelectOption } from '@rocket.chat/fuselage'; -import { MultiSelectFiltered } from '@rocket.chat/fuselage'; -import type * as UiKit from '@rocket.chat/ui-kit'; -import type { ReactElement } from 'react'; -import React, { memo, useCallback, useMemo } from 'react'; - -import { useUiKitState } from '../hooks/useUiKitState'; -import type { BlockProps } from '../utils/BlockProps'; -import { fromTextObjectToString } from '../utils/fromTextObjectToString'; - -type MultiStaticSelectElementProps = BlockProps<UiKit.MultiStaticSelectElement>; - -const MultiStaticSelectElement = ({ - block, - context, - surfaceRenderer, -}: MultiStaticSelectElementProps): ReactElement => { - const [{ loading, value, error }, action] = useUiKitState(block, context); - - const options = useMemo<SelectOption[]>( - () => - block.options.map(({ value, text }, i) => [ - value, - fromTextObjectToString(surfaceRenderer, text, i) ?? '', - ]), - [block.options, surfaceRenderer] - ); - - const handleChange = useCallback( - (value) => { - action({ target: { value } }); - }, - [action] - ); - - return ( - <MultiSelectFiltered - value={value} - disabled={loading} - error={error} - options={options} - placeholder={fromTextObjectToString( - surfaceRenderer, - block.placeholder, - 0 - )} - onChange={handleChange} - /> - ); -}; - -export default memo(MultiStaticSelectElement); diff --git a/packages/fuselage-ui-kit/src/elements/OverflowElement.tsx b/packages/fuselage-ui-kit/src/elements/OverflowElement.tsx deleted file mode 100644 index 400feeec6c..0000000000 --- a/packages/fuselage-ui-kit/src/elements/OverflowElement.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import type { OptionType } from '@rocket.chat/fuselage'; -import { - IconButton, - PositionAnimated, - Options, - useCursor, -} from '@rocket.chat/fuselage'; -import type * as UiKit from '@rocket.chat/ui-kit'; -import type { ReactElement } from 'react'; -import React, { useRef, useCallback, useMemo } from 'react'; - -import { useUiKitState } from '../hooks/useUiKitState'; -import type { BlockProps } from '../utils/BlockProps'; -import { fromTextObjectToString } from '../utils/fromTextObjectToString'; - -type OverflowElementProps = BlockProps<UiKit.OverflowElement>; - -const OverflowElement = ({ - block, - context, - surfaceRenderer, -}: OverflowElementProps): ReactElement => { - const [{ loading }, action] = useUiKitState(block, context); - - const fireChange = useCallback( - ([value]: [UiKit.ActionOf<UiKit.OverflowElement>, string]) => - action({ target: { value } }), - [action] - ); - - const options = useMemo<OptionType[]>( - () => - block.options.map(({ value, text, url }: UiKit.Option, i) => [ - value, - fromTextObjectToString(surfaceRenderer, text, i) ?? '', - undefined, - undefined, - undefined, - url, - ]), - [block.options, surfaceRenderer] - ); - - const [cursor, handleKeyDown, handleKeyUp, reset, [visible, hide, show]] = - useCursor(-1, options, (selectedOption, [, hide]) => { - fireChange([selectedOption[0] as string, selectedOption[1] as string]); - reset(); - hide(); - }); - - const ref = useRef<HTMLElement>(null); - const onClick = useCallback(() => { - ref.current?.focus(); - show(); - }, [show]); - - const handleSelection = useCallback( - ([value, _label, _selected, _type, url]: OptionType) => { - if (url) { - window.open(url); - } - action({ target: { value: String(value) } }); - reset(); - hide(); - }, - [action, hide, reset] - ); - - return ( - <> - <IconButton - ref={ref} - small - onClick={onClick} - onBlur={hide} - onKeyUp={handleKeyUp} - onKeyDown={handleKeyDown} - disabled={loading} - icon='kebab' - /> - <PositionAnimated - width='auto' - visible={visible} - anchor={ref} - placement='bottom-start' - > - <Options onSelect={handleSelection} options={options} cursor={cursor} /> - </PositionAnimated> - </> - ); -}; - -export default OverflowElement; diff --git a/packages/fuselage-ui-kit/src/elements/PlainTextInputElement.tsx b/packages/fuselage-ui-kit/src/elements/PlainTextInputElement.tsx deleted file mode 100644 index 7394b605ed..0000000000 --- a/packages/fuselage-ui-kit/src/elements/PlainTextInputElement.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import { TextAreaInput, TextInput } from '@rocket.chat/fuselage'; -import type * as UiKit from '@rocket.chat/ui-kit'; -import type { ReactElement } from 'react'; -import React, { memo } from 'react'; - -import { useUiKitState } from '../hooks/useUiKitState'; -import type { BlockProps } from '../utils/BlockProps'; -import { fromTextObjectToString } from '../utils/fromTextObjectToString'; - -type PlainTextInputElementProps = BlockProps<UiKit.PlainTextInputElement>; - -const PlainTextInputElement = ({ - block, - context, - surfaceRenderer, -}: PlainTextInputElementProps): ReactElement => { - const [{ loading, value, error }, action] = useUiKitState(block, context); - - if (block.multiline) { - return ( - <TextAreaInput - disabled={loading} - id={block.actionId} - name={block.actionId} - rows={6} - error={error} - value={value} - onChange={action} - placeholder={ - block.placeholder - ? fromTextObjectToString(surfaceRenderer, block.placeholder, 0) - : undefined - } - /> - ); - } - - return ( - <TextInput - disabled={loading} - id={block.actionId} - name={block.actionId} - error={error} - value={value} - onChange={action} - placeholder={ - block.placeholder - ? fromTextObjectToString(surfaceRenderer, block.placeholder, 0) - : undefined - } - /> - ); -}; - -export default memo(PlainTextInputElement); diff --git a/packages/fuselage-ui-kit/src/elements/StaticSelectElement.tsx b/packages/fuselage-ui-kit/src/elements/StaticSelectElement.tsx deleted file mode 100644 index 797e33c4f4..0000000000 --- a/packages/fuselage-ui-kit/src/elements/StaticSelectElement.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { SelectFiltered } from '@rocket.chat/fuselage'; -import type * as UiKit from '@rocket.chat/ui-kit'; -import type { ReactElement } from 'react'; -import React, { memo, useCallback, useMemo } from 'react'; - -import { useUiKitState } from '../hooks/useUiKitState'; -import type { BlockProps } from '../utils/BlockProps'; -import { fromTextObjectToString } from '../utils/fromTextObjectToString'; - -type StaticSelectElementProps = BlockProps<UiKit.StaticSelectElement>; - -const StaticSelectElement = ({ - block, - context, - surfaceRenderer, -}: StaticSelectElementProps): ReactElement => { - const [{ loading, value, error }, action] = useUiKitState(block, context); - - const options = useMemo<[string, string][]>( - () => - block.options.map((option, i) => [ - option.value, - fromTextObjectToString(surfaceRenderer, option.text, i) ?? '', - ]), - [block.options, surfaceRenderer] - ); - - const handleChange = useCallback( - (value) => { - action({ target: { value } }); - }, - [action] - ); - - return ( - <SelectFiltered - value={value} - disabled={loading} - error={error} - options={options} - placeholder={fromTextObjectToString( - surfaceRenderer, - block.placeholder, - 0 - )} - onChange={handleChange} - /> - ); -}; - -export default memo(StaticSelectElement); diff --git a/packages/fuselage-ui-kit/src/hooks/useUiKitState.ts b/packages/fuselage-ui-kit/src/hooks/useUiKitState.ts deleted file mode 100644 index 5c05a1e448..0000000000 --- a/packages/fuselage-ui-kit/src/hooks/useUiKitState.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { useMutableCallback, useSafely } from '@rocket.chat/fuselage-hooks'; -import * as UiKit from '@rocket.chat/ui-kit'; -import { useContext, useMemo, useState } from 'react'; - -import { kitContext, useUiKitStateValue } from '../contexts/kitContext'; - -type UiKitState< - TElement extends UiKit.ActionableElement = UiKit.ActionableElement -> = { - loading: boolean; - setLoading: (loading: boolean) => void; - error?: string; - value: UiKit.ActionOf<TElement>; -}; - -const hasInitialValue = <TElement extends UiKit.ActionableElement>( - element: TElement -): element is TElement & { initialValue: number | string } => - 'initialValue' in element; - -const hasInitialOption = <TElement extends UiKit.ActionableElement>( - element: TElement -): element is TElement & { initialOption: UiKit.Option } => - 'initialOption' in element; - -export const useUiKitState: <TElement extends UiKit.ActionableElement>( - element: TElement, - context: UiKit.BlockContext -) => [ - state: UiKitState<TElement>, - action: ( - pseudoEvent?: - | Event - | { target: EventTarget } - | { target: { value: UiKit.ActionOf<TElement> } } - ) => void -] = (rest, context) => { - const { blockId, actionId, appId, dispatchActionConfig } = rest; - const { - action, - appId: appIdFromContext, - viewId, - state, - } = useContext(kitContext); - - const initialValue = - (hasInitialValue(rest) && rest.initialValue) || - (hasInitialOption(rest) && rest.initialOption.value) || - undefined; - - const { value: _value, error } = useUiKitStateValue(actionId, initialValue); - const [value, setValue] = useSafely(useState(_value)); - const [loading, setLoading] = useSafely(useState(false)); - - const actionFunction = useMutableCallback(async (e) => { - const { - target: { value }, - } = e; - setLoading(true); - setValue(value); - state && (await state({ blockId, appId, actionId, value, viewId }, e)); - await action( - { - blockId, - appId: appId || appIdFromContext, - actionId, - value, - viewId, - }, - e - ); - setLoading(false); - }); - - // Used for triggering actions on text inputs. Removing the load state - // makes the text input field remain focused after running the action - const noLoadStateActionFunction = useMutableCallback(async (e) => { - const { - target: { value }, - } = e; - setValue(value); - state && (await state({ blockId, appId, actionId, value, viewId }, e)); - await action( - { - blockId, - appId: appId || appIdFromContext, - actionId, - value, - viewId, - dispatchActionConfig, - }, - e - ); - }); - - const stateFunction = useMutableCallback(async (e) => { - const { - target: { value }, - } = e; - setValue(value); - await state( - { - blockId, - appId: appId || appIdFromContext, - actionId, - value, - viewId, - }, - e - ); - }); - - const result: UiKitState = useMemo( - () => ({ loading, setLoading, error, value }), - [loading, setLoading, error, value] - ); - - if ( - rest.type === 'plain_text_input' && - Array.isArray(rest?.dispatchActionConfig) && - rest.dispatchActionConfig.includes('on_character_entered') - ) { - return [result, noLoadStateActionFunction]; - } - - if ( - (context && - [UiKit.BlockContext.SECTION, UiKit.BlockContext.ACTION].includes( - context - )) || - (Array.isArray(rest?.dispatchActionConfig) && - rest.dispatchActionConfig.includes('on_item_selected')) - ) { - return [result, actionFunction]; - } - - return [result, stateFunction]; -}; diff --git a/packages/fuselage-ui-kit/src/index.ts b/packages/fuselage-ui-kit/src/index.ts deleted file mode 100644 index 534dbfbdb0..0000000000 --- a/packages/fuselage-ui-kit/src/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './hooks/useUiKitState'; -export * from './contexts/kitContext'; -export * from './surfaces'; -export { UiKitComponent } from './utils/UiKitComponent'; diff --git a/packages/fuselage-ui-kit/src/stories/Banner.stories.tsx b/packages/fuselage-ui-kit/src/stories/Banner.stories.tsx deleted file mode 100644 index 956e29238b..0000000000 --- a/packages/fuselage-ui-kit/src/stories/Banner.stories.tsx +++ /dev/null @@ -1,153 +0,0 @@ -/* eslint-disable new-cap */ -import { Banner, Icon } from '@rocket.chat/fuselage'; -import type * as UiKit from '@rocket.chat/ui-kit'; -import { action } from '@storybook/addon-actions'; -import React from 'react'; - -import { kitContext, UiKitBanner } from '..'; -import * as payloads from './payloads'; - -export default { - title: 'Surfaces/Banner', - argTypes: { - blocks: { control: 'object' }, - type: { - control: { - type: 'radio', - }, - options: ['neutral', 'info', 'success', 'warning', 'danger'], - defaultValue: 'neutral', - }, - errors: { control: 'object' }, - }, -}; - -const createStory = (blocks: readonly UiKit.LayoutBlock[], errors = {}) => { - const story = ({ - blocks, - type, - errors, - }: { - blocks: readonly UiKit.LayoutBlock[]; - type: 'neutral' | 'info' | 'success' | 'warning' | 'danger'; - errors: Record<string, string>; - }) => ( - <kitContext.Provider - value={{ - action: action('action'), - state: action('state'), - values: {}, - appId: 'core', - errors, - }} - > - <Banner icon={<Icon name='info' size='x20' />} closeable variant={type}> - {UiKitBanner(blocks)} - </Banner> - </kitContext.Provider> - ); - story.args = { - blocks, - errors, - }; - - return story; -}; - -export const Divider = createStory(payloads.divider); - -export const SectionWithPlainText = createStory(payloads.sectionWithPlainText); - -export const SectionWithMrkdwn = createStory(payloads.sectionWithMrkdwn); - -export const SectionWithTextFields = createStory( - payloads.sectionWithTextFields -); - -export const SectionWithButtonAccessory = createStory( - payloads.sectionWithButtonAccessory -); - -export const SectionWithImageAccessory = createStory( - payloads.sectionWithImageAccessory -); - -export const SectionWithOverflowMenuAccessory = createStory( - payloads.sectionWithOverflowMenuAccessory -); - -export const SectionWithDatePickerAccessory = createStory( - payloads.sectionWithDatePickerAccessory -); - -export const ImageWithTitle = createStory(payloads.imageWithTitle); - -export const ImageWithoutTitle = createStory(payloads.imageWithoutTitle); - -export const ActionsWithAllSelects = createStory( - payloads.actionsWithAllSelects -); - -export const ActionsWithFilteredConversationsSelect = createStory( - payloads.actionsWithFilteredConversationsSelect -); - -export const ActionsWithInitializedSelects = createStory( - payloads.actionsWithInitializedSelects -); - -export const ActionsWithButton = createStory(payloads.actionsWithButton); - -export const ActionsWithButtonAsLink = createStory( - payloads.actionsWithButtonAsLink -); - -export const ActionsWithDatePicker = createStory( - payloads.actionsWithDatePicker -); - -export const ContextWithPlainText = createStory(payloads.contextWithPlainText); - -export const ContextWithMrkdwn = createStory(payloads.contextWithMrkdwn); - -export const ContextWithTextAndImages = createStory( - payloads.contextWithTextAndImages -); - -export const InputWithMultilinePlainTextInput = createStory( - payloads.inputWithMultilinePlainTextInput, - { - 'input-0': 'Error', - } -); - -export const InputWithPlainTextInput = createStory( - payloads.inputWithPlainTextInput, - { - 'input-0': 'Error', - } -); - -export const InputWithMultiUsersSelect = createStory( - payloads.inputWithMultiUsersSelect, - { - 'input-0': 'Error', - } -); - -export const InputWithStaticSelect = createStory( - payloads.inputWithStaticSelect, - { - 'input-0': 'Error', - } -); - -export const InputWithDatePicker = createStory(payloads.inputWithDatePicker, { - 'input-0': 'Error', -}); - -export const InputWithLinearScale = createStory(payloads.inputWithLinearScale, { - 'input-0': 'Error', -}); - -export const Conditional = createStory(payloads.conditional); diff --git a/packages/fuselage-ui-kit/src/stories/Message.stories.tsx b/packages/fuselage-ui-kit/src/stories/Message.stories.tsx deleted file mode 100644 index 0bd61a052a..0000000000 --- a/packages/fuselage-ui-kit/src/stories/Message.stories.tsx +++ /dev/null @@ -1,148 +0,0 @@ -/* eslint-disable new-cap */ -import { Message, Avatar } from '@rocket.chat/fuselage'; -import type * as UiKit from '@rocket.chat/ui-kit'; -import { action } from '@storybook/addon-actions'; -import React from 'react'; - -import { kitContext, UiKitMessage } from '..'; -import * as payloads from './payloads'; - -export default { - title: 'Surfaces/Message', - argTypes: { - blocks: { control: 'object' }, - }, -}; - -const createStory = (blocks: readonly UiKit.LayoutBlock[]) => { - const story = ({ - blocks, - errors, - }: { - blocks: readonly UiKit.LayoutBlock[]; - errors: Record<string, string>; - }) => ( - <Message clickable> - <Message.LeftContainer> - <Avatar - url='data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC - 4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj - IyMjIyMjIyMjIyMjIyMjL/wAARCAAoACgDASIAAhEBAxEB/8QAGwAAAgIDAQAAAAAAAAAAAAAAAAcEBgIDBQj/xAAuEAACAQQAAwcEAQUAAA - AAAAABAgMABAUREiExBhMUIkFRYQcWcYGhFTJSgpH/xAAYAQADAQEAAAAAAAAAAAAAAAACAwQBAP/EAB4RAAIBBQEBAQAAAAAAAAAAAAABAg - MREiExE0HR/9oADAMBAAIRAxEAPwBuXuIkhBuMe5ib/AHQP49q4L3mLitryTLTSpOiHQI5k/HzXa/qbFOEudVTu1dumWvcTaNCZYZ7vU6g6L - xqjOU/24dfs1Ouh9FnkMpd3Reeyx83hAxZZEhkdV9/MBrX71WGPvJcqrJBGveKATtuXXqNU0pu02bTHXD/AGvJAluyxxRd6F4x00o+NdKoVr - jbzJdvVe1t5cVLc2ck8qjnohgpPtz2v7G6JtPQ2VJwjlcw+37mchpnK6GtIuv5NFWeTsLNPvxWTvpfjvOEfwKKzEVkSct2vscS/BIzSN0YRk - eX81UpPqO8masJETu7OOccY4dswYFQeftv096XV5knuJGdm2T1+agvMXj8jEaHX905QihabvcbuS7X566mLWLwSY8PuRnk/u4eZ0deTl71Ef - 6hY+0yM88TzeNZY4luYwpVYyduOfrvhPTnr0pXSX9y5mCsyJMdyxxvwq599em+taItqCSNc90ChvZRUruUcT0JiO18Elpk7t8v41LWzacxkB - SuvjQ/FFJayjDWrCTepAQ2vUH0oo/Jk3ovpwJJeVCP5CN+lFFaaMqy+nAyuChvrTI2kN9JAsi2ZOy4IBHMnkSCP+iqBexSWdxLazoUljJVlP - UH2oorkV10pRc7b1zXb/hZOzuJvM86QWEXeELxOzHSIPcmiiiunVlF2RNTpRkrs//Z' - size={'x36'} - /> - </Message.LeftContainer> - <Message.Container> - <Message.Header> - <Message.NameContainer> - <Message.Name>Haylie George</Message.Name>{' '} - <Message.Username>@haylie.george</Message.Username> - </Message.NameContainer> - <Message.Role>Admin</Message.Role> - <Message.Role>User</Message.Role> - <Message.Role>Owner</Message.Role> - <Message.Timestamp>12:00 PM</Message.Timestamp> - </Message.Header> - <Message.Body> - <kitContext.Provider - value={{ - action: action('action'), - state: action('state'), - values: {}, - appId: 'core', - errors, - }} - > - {UiKitMessage(blocks)} - </kitContext.Provider> - </Message.Body> - </Message.Container> - <Message.Toolbox.Wrapper> - <Message.Toolbox> - <Message.Toolbox.Item icon='quote' /> - <Message.Toolbox.Item icon='clock' /> - <Message.Toolbox.Item icon='thread' /> - </Message.Toolbox> - </Message.Toolbox.Wrapper> - </Message> - ); - story.args = { - blocks, - }; - - return story; -}; - -export const Divider = createStory(payloads.divider); - -export const SectionWithPlainText = createStory(payloads.sectionWithPlainText); - -export const SectionWithMrkdwn = createStory(payloads.sectionWithMrkdwn); - -export const SectionWithTextFields = createStory( - payloads.sectionWithTextFields -); - -export const SectionWithButtonAccessory = createStory( - payloads.sectionWithButtonAccessory -); - -export const SectionWithImageAccessory = createStory( - payloads.sectionWithImageAccessory -); - -export const SectionWithOverflowMenuAccessory = createStory( - payloads.sectionWithOverflowMenuAccessory -); - -export const SectionWithDatePickerAccessory = createStory( - payloads.sectionWithDatePickerAccessory -); - -export const ImageWithTitle = createStory(payloads.imageWithTitle); - -export const ImageWithoutTitle = createStory(payloads.imageWithoutTitle); - -export const ActionsWithAllSelects = createStory( - payloads.actionsWithAllSelects -); - -export const ActionsWithFilteredConversationsSelect = createStory( - payloads.actionsWithFilteredConversationsSelect -); - -export const ActionsWithInitializedSelects = createStory( - payloads.actionsWithInitializedSelects -); - -export const ActionsWithButton = createStory(payloads.actionsWithButton); - -export const ActionsWithButtonAsLink = createStory( - payloads.actionsWithButtonAsLink -); - -export const ActionsWithDatePicker = createStory( - payloads.actionsWithDatePicker -); - -export const ContextWithPlainText = createStory(payloads.contextWithPlainText); - -export const ContextWithMrkdwn = createStory(payloads.contextWithMrkdwn); - -export const ContextWithTextAndImages = createStory( - payloads.contextWithTextAndImages -); - -export const Conditional = createStory(payloads.conditional); - -export const Preview = createStory(payloads.preview); -export const PreviewWithExternalUrl = createStory( - payloads.previewWithExternalUrl -); diff --git a/packages/fuselage-ui-kit/src/stories/Modal.stories.tsx b/packages/fuselage-ui-kit/src/stories/Modal.stories.tsx deleted file mode 100644 index ab4f63d95e..0000000000 --- a/packages/fuselage-ui-kit/src/stories/Modal.stories.tsx +++ /dev/null @@ -1,194 +0,0 @@ -/* eslint-disable new-cap */ -import { - AnimatedVisibility, - Button, - ButtonGroup, - Modal, - ModalHeader, - ModalThumb, - ModalContent, - ModalTitle, - ModalFooter, - ModalClose, -} from '@rocket.chat/fuselage'; -import type * as UiKit from '@rocket.chat/ui-kit'; -import { action } from '@storybook/addon-actions'; -import type { ReactNode } from 'react'; -import React from 'react'; - -import { kitContext, UiKitModal } from '..'; -import * as payloads from './payloads'; - -type VisibilityType = 'hidden' | 'visible' | 'hiding' | 'unhiding' | undefined; - -const DemoModal = ({ - children, - visible, -}: { - children?: ReactNode; - visible: boolean; -}) => ( - <AnimatedVisibility - visibility={ - visible - ? (AnimatedVisibility.VISIBLE as VisibilityType) - : (AnimatedVisibility.HIDDEN as VisibilityType) - } - > - <Modal open={visible}> - <ModalHeader> - <ModalThumb url='data:image/gif;base64,R0lGODlhAQABAIAAAMLCwgAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==' /> - <ModalTitle>Modal Header</ModalTitle> - <ModalClose onClick={action('close')} /> - </ModalHeader> - <ModalContent>{children}</ModalContent> - <ModalFooter> - <ButtonGroup align='end'> - <Button onClick={action('cancel')}>Cancel</Button> - <Button primary onClick={action('submit')}> - Submit - </Button> - </ButtonGroup> - </ModalFooter> - </Modal> - </AnimatedVisibility> -); - -export default { - title: 'Surfaces/Modal', - argTypes: { - blocks: { control: 'object' }, - errors: { control: 'object' }, - visible: { control: 'boolean', defaultValue: true }, - }, -}; - -const createStory = (blocks: readonly UiKit.LayoutBlock[], errors = {}) => { - const story = ({ - blocks, - errors, - visible, - }: { - blocks: readonly UiKit.LayoutBlock[]; - errors: Record<string, string>; - visible: boolean; - }) => ( - <DemoModal visible={visible}> - <kitContext.Provider - value={{ - action: action('action'), - state: action('state'), - values: {}, - appId: 'core', - errors, - }} - > - {UiKitModal(blocks)} - </kitContext.Provider> - </DemoModal> - ); - story.args = { - blocks, - errors, - }; - - return story; -}; - -export const Divider = createStory(payloads.divider); - -export const SectionWithPlainText = createStory(payloads.sectionWithPlainText); - -export const SectionWithMrkdwn = createStory(payloads.sectionWithMrkdwn); - -export const SectionWithTextFields = createStory( - payloads.sectionWithTextFields -); - -export const SectionWithButtonAccessory = createStory( - payloads.sectionWithButtonAccessory -); - -export const SectionWithImageAccessory = createStory( - payloads.sectionWithImageAccessory -); - -export const SectionWithOverflowMenuAccessory = createStory( - payloads.sectionWithOverflowMenuAccessory -); - -export const SectionWithDatePickerAccessory = createStory( - payloads.sectionWithDatePickerAccessory -); - -export const ImageWithTitle = createStory(payloads.imageWithTitle); - -export const ImageWithoutTitle = createStory(payloads.imageWithoutTitle); - -export const ActionsWithAllSelects = createStory( - payloads.actionsWithAllSelects -); - -export const ActionsWithFilteredConversationsSelect = createStory( - payloads.actionsWithFilteredConversationsSelect -); - -export const ActionsWithInitializedSelects = createStory( - payloads.actionsWithInitializedSelects -); - -export const ActionsWithButton = createStory(payloads.actionsWithButton); - -export const ActionsWithButtonAsLink = createStory( - payloads.actionsWithButtonAsLink -); - -export const ActionsWithDatePicker = createStory( - payloads.actionsWithDatePicker -); - -export const ContextWithPlainText = createStory(payloads.contextWithPlainText); - -export const ContextWithMrkdwn = createStory(payloads.contextWithMrkdwn); - -export const ContextWithTextAndImages = createStory( - payloads.contextWithTextAndImages -); - -export const InputWithMultilinePlainTextInput = createStory( - payloads.inputWithMultilinePlainTextInput, - { - 'input-0': 'Error', - } -); - -export const InputWithPlainTextInput = createStory( - payloads.inputWithPlainTextInput, - { - 'input-0': 'Error', - } -); - -export const InputWithMultiUsersSelect = createStory( - payloads.inputWithMultiUsersSelect, - { - 'input-0': 'Error', - } -); - -export const InputWithStaticSelect = createStory( - payloads.inputWithStaticSelect, - { - 'input-0': 'Error', - } -); - -export const InputWithDatePicker = createStory(payloads.inputWithDatePicker, { - 'input-0': 'Error', -}); - -export const InputWithLinearScale = createStory(payloads.inputWithLinearScale, { - 'input-0': 'Error', -}); - -export const Conditional = createStory(payloads.conditional); diff --git a/packages/fuselage-ui-kit/src/stories/payloads/actions.ts b/packages/fuselage-ui-kit/src/stories/payloads/actions.ts deleted file mode 100644 index 2b248412cc..0000000000 --- a/packages/fuselage-ui-kit/src/stories/payloads/actions.ts +++ /dev/null @@ -1,219 +0,0 @@ -import type * as UiKit from '@rocket.chat/ui-kit'; - -export const actionsWithAllSelects: readonly UiKit.LayoutBlock[] = [ - { - type: 'actions', - elements: [ - { - appId: 'dummy-app-id', - blockId: 'dummy-block-id', - actionId: 'dummy-action-id', - type: 'conversations_select', - // placeholder: { - // type: 'plain_text', - // text: 'Select a conversation', - // emoji: true, - // }, - }, - { - appId: 'dummy-app-id', - blockId: 'dummy-block-id', - actionId: 'dummy-action-id', - type: 'channels_select', - // placeholder: { - // type: 'plain_text', - // text: 'Select a channel', - // emoji: true, - // }, - }, - { - appId: 'dummy-app-id', - blockId: 'dummy-block-id', - actionId: 'dummy-action-id', - type: 'users_select', - // placeholder: { - // type: 'plain_text', - // text: 'Select a user', - // emoji: true, - // }, - }, - { - appId: 'dummy-app-id', - blockId: 'dummy-block-id', - actionId: 'dummy-action-id', - type: 'static_select', - placeholder: { - type: 'plain_text', - text: 'Select an item', - emoji: true, - }, - options: [ - { - text: { - type: 'plain_text', - text: '*this is plain_text text*', - emoji: true, - }, - value: 'value-0', - }, - { - text: { - type: 'plain_text', - text: '*this is plain_text text*', - emoji: true, - }, - value: 'value-1', - }, - { - text: { - type: 'plain_text', - text: '*this is plain_text text*', - emoji: true, - }, - value: 'value-2', - }, - ], - }, - ], - }, -] as const; - -export const actionsWithFilteredConversationsSelect: readonly UiKit.LayoutBlock[] = - [ - { - type: 'actions', - elements: [ - { - appId: 'dummy-app-id', - blockId: 'dummy-block-id', - actionId: 'dummy-action-id', - type: 'conversations_select', - // placeholder: { - // type: 'plain_text', - // text: 'Select private conversation', - // emoji: true, - // }, - // filter: { - // include: ['private'], - // }, - }, - ], - }, - ] as const; - -export const actionsWithInitializedSelects: readonly UiKit.LayoutBlock[] = [ - { - type: 'actions', - elements: [ - { - appId: 'dummy-app-id', - blockId: 'dummy-block-id', - actionId: 'dummy-action-id', - type: 'conversations_select', - // placeholder: { - // type: 'plain_text', - // text: 'Select a conversation', - // emoji: true, - // }, - // initialConversation: 'D123', - }, - { - appId: 'dummy-app-id', - blockId: 'dummy-block-id', - actionId: 'dummy-action-id', - type: 'users_select', - // placeholder: { - // type: 'plain_text', - // text: 'Select a user', - // emoji: true, - // }, - // initialUser: 'U123', - }, - { - appId: 'dummy-app-id', - blockId: 'dummy-block-id', - actionId: 'dummy-action-id', - type: 'channels_select', - // placeholder: { - // type: 'plain_text', - // text: 'Select a channel', - // emoji: true, - // }, - // initialChannel: 'C123', - }, - ], - }, -] as const; - -export const actionsWithButton: readonly UiKit.LayoutBlock[] = [ - { - type: 'actions', - elements: [ - { - appId: 'dummy-app-id', - blockId: 'dummy-block-id', - actionId: 'dummy-action-id', - type: 'button', - text: { - type: 'plain_text', - text: 'Click Me', - emoji: true, - }, - value: 'click_me_123', - }, - ], - }, -] as const; - -export const actionsWithButtonAsLink: readonly UiKit.LayoutBlock[] = [ - { - type: 'actions', - elements: [ - { - appId: 'dummy-app-id', - blockId: 'dummy-block-id', - actionId: 'dummy-action-id', - type: 'button', - text: { - type: 'plain_text', - text: 'Click Me', - emoji: true, - }, - url: 'https://rocket.chat', - value: 'click_me_123', - }, - ], - }, -] as const; - -export const actionsWithDatePicker: readonly UiKit.LayoutBlock[] = [ - { - type: 'actions', - elements: [ - { - appId: 'dummy-app-id', - blockId: 'dummy-block-id', - actionId: 'dummy-action-id', - type: 'datepicker', - initialDate: '1990-04-28', - placeholder: { - type: 'plain_text', - text: 'Select a date', - emoji: true, - }, - }, - { - appId: 'dummy-app-id', - blockId: 'dummy-block-id', - actionId: 'dummy-action-id', - type: 'datepicker', - initialDate: '1990-04-28', - placeholder: { - type: 'plain_text', - text: 'Select a date', - emoji: true, - }, - }, - ], - }, -] as const; diff --git a/packages/fuselage-ui-kit/src/stories/payloads/conditional.ts b/packages/fuselage-ui-kit/src/stories/payloads/conditional.ts deleted file mode 100644 index 4694ddfdf5..0000000000 --- a/packages/fuselage-ui-kit/src/stories/payloads/conditional.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type * as UiKit from '@rocket.chat/ui-kit'; - -export const conditional: readonly UiKit.LayoutBlock[] = [ - { - type: 'conditional', - when: { - engine: ['rocket.chat'], - }, - render: [ - { - type: 'section', - text: { - type: 'plain_text', - text: 'This is a plain text section block.', - emoji: true, - }, - }, - ], - }, -] as const; diff --git a/packages/fuselage-ui-kit/src/stories/payloads/context.ts b/packages/fuselage-ui-kit/src/stories/payloads/context.ts deleted file mode 100644 index d639c6caef..0000000000 --- a/packages/fuselage-ui-kit/src/stories/payloads/context.ts +++ /dev/null @@ -1,67 +0,0 @@ -import type * as UiKit from '@rocket.chat/ui-kit'; - -export const contextWithPlainText: readonly UiKit.LayoutBlock[] = [ - { - type: 'context', - elements: [ - { - type: 'plain_text', - text: 'Author: K A Applegate', - emoji: true, - }, - ], - }, -] as const; - -export const contextWithMrkdwn: readonly UiKit.LayoutBlock[] = [ - { - type: 'context', - elements: [ - { - type: 'image', - imageUrl: - 'data:image/jpeg;base64,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', - altText: 'cute cat', - }, - { - type: 'mrkdwn', - text: '*Cat* has approved this message.', - }, - ], - }, -] as const; - -export const contextWithTextAndImages: readonly UiKit.LayoutBlock[] = [ - { - type: 'context', - elements: [ - { - type: 'mrkdwn', - text: '*This* is :smile: markdown', - }, - { - type: 'image', - imageUrl: - 'data:image/jpeg;base64,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', - altText: 'cute cat', - }, - { - type: 'image', - imageUrl: - 'data:image/jpeg;base64,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', - altText: 'cute cat', - }, - { - type: 'image', - imageUrl: - 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gKgSUNDX1BST0ZJTEUAAQEAAAKQbGNtcwQwAABtbnRyUkdCIFhZWiAH3wAHABsACwAwABVhY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLWxjbXMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtkZXNjAAABCAAAADhjcHJ0AAABQAAAAE53dHB0AAABkAAAABRjaGFkAAABpAAAACxyWFlaAAAB0AAAABRiWFlaAAAB5AAAABRnWFlaAAAB+AAAABRyVFJDAAACDAAAACBnVFJDAAACLAAAACBiVFJDAAACTAAAACBjaHJtAAACbAAAACRtbHVjAAAAAAAAAAEAAAAMZW5VUwAAABwAAAAcAHMAUgBHAEIAIABiAHUAaQBsAHQALQBpAG4AAG1sdWMAAAAAAAAAAQAAAAxlblVTAAAAMgAAABwATgBvACAAYwBvAHAAeQByAGkAZwBoAHQALAAgAHUAcwBlACAAZgByAGUAZQBsAHkAAAAAWFlaIAAAAAAAAPbWAAEAAAAA0y1zZjMyAAAAAAABDEoAAAXj///zKgAAB5sAAP2H///7ov///aMAAAPYAADAlFhZWiAAAAAAAABvlAAAOO4AAAOQWFlaIAAAAAAAACSdAAAPgwAAtr5YWVogAAAAAAAAYqUAALeQAAAY3nBhcmEAAAAAAAMAAAACZmYAAPKnAAANWQAAE9AAAApbcGFyYQAAAAAAAwAAAAJmZgAA8qcAAA1ZAAAT0AAACltwYXJhAAAAAAADAAAAAmZmAADypwAADVkAABPQAAAKW2Nocm0AAAAAAAMAAAAAo9cAAFR7AABMzQAAmZoAACZmAAAPXP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicgIiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAQABAAMBIgACEQEDEQH/xAAcAAABBQEBAQAAAAAAAAAAAAAFAAIDBAYBBwj/xAA+EAACAQMCAwYDBgYBBAEFAAABAgMABBESIQUxQRMiUWFxgQaRoRQjMkKx8AcVUsHR4WIzcoLxkkNTorLC/8QAGgEAAwEBAQEAAAAAAAAAAAAAAAECAwQFBv/EACYRAAICAgICAwACAwEAAAAAAAABAhEDIRIxQVEEEyIyYRRCUnH/2gAMAwEAAhEDEQA/APSaVKlXz564qVKuUAdrldrhoAVLrSpGgDlKlSoAVLNKlQAt65SNcpiO1ylSoAVKlSoAVKlSoAVcpUqAFSNKuUAI1yumuUANrhrtNNAHKaa6aaTTAaTvTDzpxphqhBWlQ+y4lHcRgq+rxB5ir4YMAQdqzLZ2uGlSoEKlSpUAKuGlSoAVI1w7Us4oAQ8a7SHKuGgQjTa6a5TAVLNcpUwO12m12kAqVLNcoA7XKVKgBUq5SoAVcNKuGgDhrhrpptMDhphpxpppoQw0w040w89hk+FMDKwNJasJE1o3hWg4dxhZmCOQshHXkaz/AGk8+yRkDxPM04QSpgtnPj4Vco2b1Zt0uFOx2Ip4kXxFZi34iV0R3Dd3G0gPKrklzJAAxbVGeTjlWfHwZtUHdY8aWoUETiGetTre5p8GTYV1CuZqgt2D1qT7WKniFluuHlVb7UB12ppuh40cQsuCl7VWF0vjThcDxo4gTH0rmD4GoxcCniYeNVxFYsN4V3SfA04S+dPEo8aOIrIwjf0mlofP4TUwkFPDrT4C5lYRufymu9jIfy1bDDnTxItP6yXkKQt5f6a79mlP5avhhTg4p/UL7Qf9kl8BTvsMp/pogGGalVhT+pC+1gv+Xy9SK7/Lm/rHyooWFM1iqWJC+xlAcN8ZPpXf5avVjV7WKWsU1iQvsZR/lsXUn513+XQj8p+dWmkAodxHiqWkJcsBtTcYxVsIylJ0iK+NnZQO76F0jJLdKwvFeOT3+qGyb7PERu3Jm8tuVd41xaS+mMZPdG+llyB7dT67VR7CEYdZ40Y76ZB/gVmku2dcIcUWrW7neMPpWJOmdyale7nb/psT44G1V0Eax65WOOgzzq5BdRphVjBz0FNotaIBOSpEoYD02qSyvzaSGIr2tu/NTy9qulLZxqljSMH+p6gdeHHKmcDw0rgfOpoG0yeSJVxPbNrgbmo5p/qrEallDAgjyoUe04bmaEu8XPxH0opYX8Fx3QFjcjOOQPpQ26M2iYKwru9WV7J8gHDDfBqtcyLA2WIAB50lIQgxHpUbTAZ32/WqN1xCNEcqc43GOdDzdyMI8I2kbMfIsQf1HzNWovyIN/agFyTUq3GVzn1rLG4mTisSLG4ZkVnH9OQTjHjzPyrr38lskiSKxbtCWAOe7yp8b6Bs1Ud0rHZgcb4qf7QFALNzrDy8XazMjyxtGgbU2D4bY+e23WjHDOKm+tklERIkOlCy7YzjP78PKqcGlZPJGkW4HPO1SrMCM5rDycRMatI10EPaaQinO1Eri7aK0imM51ZP3YO/TGfbfFJwaFaNUJfMU8TgdRWNnvJWtu0S4eIlhGikZLseVW45L37O7MRvhkIPMY8KOLFaNULgAZyKi/mEYONY51nnE1rw/tJpiOerPPkT/Y/KhtpxCeWPtpYgsYDAnP8Ay2Py+tC6slxRuVvkLkax5b043yBgusbivPru/nhdtELLoCuxffCZIHLn+vTnQ9uN3EkkrSRvD2ZAUtzZdsbePP68ulpNi4I9VF9GAO+PHnUi30R27QfOvPIOLrJOqN3FIQhTzx4/WiFlxKGdQF5sfoTt9MVL5IagjZtxCFR+MfOojxOEfnFCcRhckjA5mnLGp6b1n9rK+pBE8VhH5vpUbcXjBwM/KqfZLnAGaH3nE7exJ0YkkzjIGQD4DxNCyt6QLEgpfcYS2tw8gIBGy9TWLueMSXM7SyyDUCQEU91ffBz+lR3szXbk3U7RF98Efh9RmobYW2dLNbMF6shJqqfbN4QUVodFO7SFxH2p8Wl5foatoWlAzboQD+RsYP8A5ZFO7S5RQbeWyx0VTv8AIb1BJeXjf9R5Cw5qDt/mnRRUto5L2UvLlIVOAvjRMXEVsumNFVj05mqV1J2Nw2jcE7Z5ZpqW5kBZycnnR2DRbU207Eyvlz5k49qtJZ2rLpabST0aq0YhhUYCjbnT3nMi4Qlz0AGAKT/oWx7WtxaHNvJqQ7Yz/aqr3CpIpePsW/qUYGa6khMmiQBM8iDU08mtCrDWxO2RuDS6Bnf5jNDPGhIlQjYjnyqCe6nuwAjnTjvg7d3qPlUcdiyiOZjgZIwN/b6fWpiwRZUYKJHBAH9Q6H6kUWk9EUNNohWPv4KgDfqxxy8MilwxvtLOiAdnbs0ZZ85JPIb+p+QpnCe1undrgsuJhz2OR5csbH94o7xCDsVc2wGvWpkJOMqCpHr5Um/AgJecQW3a3EiM7g4LczuAdyP+W1E7A21zOs7Igcklcb5OjugeJxj6ishe3Ul3xCa3ADys0fZ74z39h4c3b5Vs+G8KW3hQyJiWLLALsBqPnzxpA96c0opWCtgf4j4XE4WQRa7fSpO43CAsAx65yTnwAyRWk+H3jXh8RliWNmXSqIMBDyx47cvfbnVD4kmmi4XIYmIYjukc8nckHB6f46iqHAryLh/B4orhtKQoU7Qtgfh3II9yR+uN5TcoUJx3ZSuuHi441LPbyMsMWAkajKqTgtg9divmdXQCm3txHrWWNFEqgsp5q39OF8eRyaq/zeP+YSq7SQpGWkdQTmM5IAbJ6ajt/VkbDAqSFILy+jCBiWUkgsBoIYKOvLST+8V0q0k2ZNXpBmxi7ezE0rqq61KyMAxVcHJ+mNs7bjynseJvdLLHbQl2jWIZc4ycch6Ab+vzzkl9LxPjlpwshxaKuqZg25/MQT4YIA8jitcIShYrjtARKCoG5YAf/wAmssjrsuMQff31s0U9s9wo7+p8jJBLDZScADTjP/d6ioIuM2axu8aqIYl1GMDGCMnG/XmfbyoVxVkQMJdI7a3eXBGNDaABt0yB9fKstahbvigTIJmcuwbONBcMxOf+Iz55NaRxqSE3xN/HdCayUTxSLASI3BHe0794DnksoI6gEHlVO5mtnljeZAk8qggAkrvq2HmSM5/tRy0tOzsgjyOmTI2ldyWY+3LVjw3HKgHHrd7OzlWF2QM3ZxLFyGfxEA4Goam5dSMctso1yordEEqfalUIiyxE3AV1GDhX0qPof3yqXIuLC9D22ZCrd4DZdl2HrkD98q/DOJT28d7cyySmAAlXL6ghYg6cEZx6cs7ZzkGrC+g4h2jxqB3e8rD8JKjGfbPruOlaO4f+CVSCVhxS4lhjEgAY4Zt84zj/AN0aivERi0j4GPc1lm++mVlYZOH7Md3O+5/7cYx/2mp57jSAwGCd85yeeM4/fPHOsZKzRRL/ABDjchEscDYAB7w+n1zQeDso1H2l9UhORl8hfn18/pUdrP2sLSpkRruC2+dse5Ixy6Y3wd6yyu8xLRoZW3yVG3kAOfrWkYpaQ0Gki4bjEmZAeevDY99mxTXsIZd7GRGUc1UnPyOD/ahwFzH3+wdkzzAwPlg1Yiv7Vj31aJv6k2p0PZA2iKQiZFZ/+7De22f1qN3EnchmRT/TJgEf2P0qzdsZRhuznHgwwfb/AFQa4jUlgjFsflY95fXNUkNsOPFJLAZAMuvjUMdwqHS5BI6VrBwxRnbYis3xDh6287LpOTvnxrJTTYR2qGmeMjvfh6bZNIzzSD7tHjXxPWo4+yhO+AfOo57qdlwsi46AVTQDlvNDtCx1g74bY5q3DJ2AZmLFGIIDcxv0+tD4bSRbrVIrZJwev75/StFZcLjvQzd2MEghWXZvl4+VRJpCKTyXV7LIYoSqDmQNR1eOB08xUM8EsyQqX0PkMjZxnPMA+PgPbfNaB+FRWXeEIAwNo2OPQZHd/fOqsdzZSN2TIZCSSwlAznrkHmPTcZG2+az5+kCRY4XHA8fZsuhieo2zty33Gw26YxyGKm+IgYuFTyqBrVCDjrttjz8ParPDo1xoXQRkkAeH78f/AFY4tAJLcjGfHzFQ5VsO5Hm/wVGOIcRe9YKyhdOcHI3Jz5cxj3r0WVkSMLpGQcFSeg60N4ZZW/DAREigs7FjjnnBrl7xBEmeUqxwcrjrgf4/WicvslaKUaBfFJ2E7M0ZIV8pp5joORGSRnG+xUE+FDmnmke07SHRGkYcJgBix1MMj+kac8tsVckuILqcKUGiNiSc7YB3Pz3Hp5UyOJRHCjnVNI+GOcBnYguoz0wvrzHOtYKiJOwQ9vJGZEV8vchpdZyCqkghfUjQDn05je7w+JhFKsUPdMxchgDlABjc+LZI57YPmSEcMcqlpOyLpLI7E4/Bkt+mlvnTmb7LapcRyY1FkdAcgPuANthg5GR5HO1W5tqiUkVuE2UcfbyuC4kkIU4xhV6emDn/ANVpAnaNhTjA2IPQ5/xWaiu1hgmiiwCuvQDghTkKP/2U/KtFaYZQ2CrADcH1H+/essl+S1/Rnvia1C2zs69wJjCkb7DA39TQL4Isku+LKChYLE2o9MsRnY+QHL06itj8SWi3liiHKliGOGwRtnn6gVX+FuH2/DmZ7dQATgcjlt88vDkPl0qoZKxtBKF7QdvLed0MEDdmcBXl6IvQL01Yzv8Al2ODWO4zfxzdpZ2yzCKMiLtS4weRwG5436AkBTsBitbxO7knhEUYJVwcYyqk42yR08uvjnnlL/hF/IVmlFtEFJ0oFUlATnGWA0sMny8uWCDV7JS8gDh9kxsrlFDvIWZsRgHDHYbAYXG2CdhjpzqvNPccJQ2sKuzqWaVsEsXJzgKME752IHTltWiMEnDLCFzcwoM6shNQfl+HvHBO/IHO+QdqqPal4MmRXTTrfGSz7ZI3AC5257jntg1up7vwTx0U+HXjG5mkZGkkYIj4J0ALgL7Ab46d7fO1GWliPDxcTaNTR9q4fOUQDYHHr/8Al5UGbh9+UiEcUUds/elVNOHUDZSc4wSeR8BttkkTdLMnZuBPNJKkbyDOhSBuF8QG2GOuTjmaJpPaFG1plZrie5SONiY4lXGjB745nYdM4Hmc0Ytrd2ULDbRxdFyBn3659Ko5YyLGrokcbAsIlC6xg7A8sZPPlsenOW34ohPZrMEK91zzb0zjbz5b1LutGiLD2ccB1G90zE5OSxz71HM1pIxEpjEh2D6gNX9qVxewS/ciAykcy7AA+x3qlJbxqhxZsgzuFOoH51Uf7AVyVhOkxkr0xsw9PGhEl9qk7ObMoGwcrpdakkW5UMtvIHhGcxY2U/TFC55nOcZwOaOAwHpWqQHumBQb4gtl+yGcHSU5mi+qqfFohc8Mniz+JTXnLscXs88lkDgkd70pcPhS7kfLBFX8S759cVyaNLC3EYB11y84jBw+0WOUKZSO7KmNtutdi60EmajhqQTTMkswZEwAGfTn0P75Uc1W9nCREwjVTkYdh9MCvMeE/E3YQAOV3clQCV0/IbUR4l8VxfYG74yVx1FY5MUrFGpFrjnxZZ2ryKbx1bBBIOSPXI+maw918eBJCYVMhB/GSdXz/wDdZfiEk3EbmafLNErfiJJyfAV2z+Hbq6w7qVU8geddsPjwjG5HPPNLlUEbnhH8UI4ZVS5gaNeQYbgf4recO+L7Pi8X3NysgG5AO49q8lj+AuIzW5kgsZJcDlrUE+gzQSa2vuB3qkx3NjcDvKsyFSfY9Kmfxsc/46FH5DT/AFs+jFQTAFDlTsPlQnjljK9nIuspsxyvQ9D86Cfwx+K5OO3EnDb0AXMagof6h+/1r0rivDu04ZNsC2nK5G2RuK4MkJYpbOmORS6PLLGF4maKVQ4RO+ujuAkAkbdTnGPPqKMRlxIry5diTLGmMgZ0rnTnYkIceOccyckLHg620XaBh2jHU2CCp9PDx+nhh81osbqmgMFAyFAByAAMeHX51bypsOHogFvoiidQO0jIySASyhQDnYblcL1xmgnFbmGPtpLVQ1tlZQp21hvLHTc+YrRTwFSj5XB5DJAwc5OPHAH1oPccLjiDGNAp27nQjljPUDI2pxku2LiDOG96aKMRM41FWGOajBGfqPYVrrcSRK4ByD18/wB5qzwTgHZgyYLbbZHIcsUWk4eYoiANhuKic+T0Umo6M5ct2kLdoc/4zyqK2uEtE1MVG2kE8gPLfw/SgXxd8T2vAyI1KtKdgB0/fhXl3Evi7inEpyVlZE5AA9K1xfHlNX4DJmhBUz2y5+JLO1UuZgHbYIGBJ9Tt58vHlWbPxOJLwKGMygbNsroRsRrBwNugHsa8lMF9dHXLI3qxpycOnUgxTgMPAkV0x+NCPbOZ52+kezWMnD52Y20csZmILAuhLnPPUf8AA+laOOFI2H2Z3jLEa9CKMkfs/mrwGHi/GOFtqEhIxgk9fUjBPua1vw//ABCnkZLe7CqoGFCKAB8sEfM1E/jy7TtFRyxk66Z6Bxa2hltSLg3MjHIEswDOudzuQFG3mP0oEtqXt2fWHDAqZUmJOggg5zjJOwB/ySdFbcVtOJ2gUyKB/UC67/rj39qA8Ss4kna8jkLpqCKqTaufggOxPjnB688VlBuqZclsbbSZe4WeJTJIw1Rs2ToAAwcEBckZPQ8jtTJrWO1YzR6Y3wO+RnJxsFHPlvyGACdwRmvbSTaGaIyFsjTq+7Gc5A2x4DI/TajnDbkhZF7VHnYbHT3ckg7Z589+Rz08Kba2gQD1RJlJpD2nUg8v8e1dV0iAMFzMMf1qT8iTUHFLK7tszyMWY7EoVC58Ac/TGaDJxW40siw423c53+ZH6VrGNrQ3JBqXigfOqeNmG2OTVRmY3EuEaN2555H5UJE/2yTE6hsH8Yzn55o3a2tvJARHqDAZAO9U6iNJvZ6UvE0P5qbc8QVrdxq5isas8/8AyqYTyM6pIcAnrWDwozU2QTXEUzs8inK/gKnr5edZi54VLxWYkSFXk2jLAqHOeRIGPnWhv3Sa5W2Q5CnmEzj1xWp4JZQWuWMUSsRhZAQM56b+edqbmsasqnIx3w//AAzupSJrxnjUdF2PoQfPkd8j2pvxrwK24LawxQIxmlYKGcnmTjlXtHD2inGCRnnp648xjY1lv4mfCdzxXg0d3w+PtLm0ftBGObAdKzh8iTyJz6FSUXGPZ5HwuwWS7aJUBgtu6mfznq3nk0Tv7ocOh7UABUGFXxPQVF8MxMeGFH19rEzBlIwfcc80H+MbhwLZV7qlicCu1frIck5VGvZat/j3idnJlSpI6DpVf4h+N5fiDhws7uEHByGODpPQrtt1zvvWQLEu7Z3Pj4VesOEcQ4jFJLbWc0sabNKE7q7ctXKuptJbOeMLejb/AMGLbtfjBrh2ISGBsD+okjb+9e98Uv4mAgXD9H8PSvEPgnhl3wOJrmZuxllXZQe9vtW4tuJq0IUthj8/WvG+bLnP89HrfHwVFORo3mhjjCvhixzgb1Xt/vJXd49K57gJ6VVik1jA1PkdBTmuBGwzkt4g9POuFxZ1Kui7PBCyaUXKnng79aZFb29ymh0TUmNj5HIoTPfRoSCxUHbY7Z96qHjsUEv48Pvlc9KuKkxOKrR6LZqscAI228ay3xx8VQ8F4TI6MrSHIAHMmhh+J5ookdW7jfiBPLwrznixvviK6kieXtEjQsoXmM5O/wDmunBDk6l0c8oOP6PP+KX8/Fb5ppWJJJxn1ohwrhuplBGCdyx5AeNRfyO+srtWubaVIicq7IcH/dHIvuYiyANsQd69VtajHo892rlLs0PDuIfBvDmRLmw+0yp+J5iSCfNc4+lWOKcW+DZbQGHh0CZLAdkdJzgZyAc9difPB2OPLJ7h3nkJORz5detRK5dhuQK2UI+jB292bBo7O5LtbOXhPNW5rWf4pw77DKJ4D3M/KpeA3HZcQKYOll3B8aJ8UjU28qHSMDAP7/e1YtcZaN4ytUznC+M362uFjZ0G2QMgf4q5Pxq6Da9ccTZycnSffffr51uf4afCszcDF9eQMiSk9mjLuVPXB6UQ+IP4cWV+jSwqsTj+kfh8hjl7g1ySzY1k4s7EpOH9nm9r8QMiNGt2DjfOgEt74367ZxWn4Zxq3mjRQZGcYCBE2HkATj/PpyA8T+BJeHu3ZGOVlByAwBXH78vQVR4cZbNsFdaj8hU7D9BWrUJK4mack6kb2O8FwGguY0WZttyBge4x7frWG4zYXJvJWCYhDHvruPDnWrseIfdnvQouQWDKnTbYnH6dBTb60fi9i/azBSm+nOokeI3OamP5ZTd6MTATG4jVsnPhitPwpTrU777UCisza3Kq7AkfhBo7/MUs7XKgGQjYeFVNX0aRlo3bcKVQTprL8Xk+xM4ibvHkuN63PELpLaEnI1dAaxt1A1/OC8esBs5TbHrXLjk7tjaKHBhMJXeVTHORqVh/gcx+/KjNpeGMlWuZQ5zl+8Q3lpPLp9arz2X2W2BSIRuDlSXA3z+XIpvbC4gBfUkgAA6jV6j9DTm+THGNIMWXHng+9BkeNSMYJBweXd0kfLyrWcL+Mbe8i1PIhwdJAYEEeO+D7b15oViWWFpSgVSSjs27b76t8b56nP0otaxQgia0yxC5DW76pcb51aumTsf1BqZQi0S0bS9+Gvhb4ilW8EUcVw4z2sB0F89T0Prig1//AAd4PxR1SXi132SHOFZNWfUg/pQy1tZu3XXNP94p+70jWOeMkDA9MjPU0btreaFsJcyuFXSyMvLxOM+tRyeP+MiXi5djLT+FPwV8Pok88TXUkfe1XUmvP/iMKflVaaGPjd2sFtafZeH2zfdqoA1dNxvt6eNGI+GS8RJjkaRYM97vE6vLc7elForKG0hENumEHgtYTzN7btmsIKB55x5I7YKFJCKCXONz5Cg9re30spmSLA6DwFEvj67SB0i1d4P3hq3xz5VneFfEdvLJ9mVwJB0POt8P8OTVm01yaV0axONPHEA8MxlH9I6etUL7i97oZuwbB6k70hxRR0GaC8W+JbS17kki6m6DnWkWm6URSwOKtyOxcbN0ktvI2JBupNOske/1RzRsyEZJXYj0rOG8SW5juInC5OCfGvUPhS1jlhXQVLgYdhvvRmSguUULG3uMmQScL18Nh0sx0Yy2cHA6/wC6y1lE1p8RrNbnsznZQWGD4ZIzy8a9fHDU06X31eIrLX/w01hcSOgDK+4JUED2rmx5lbUintaNFw2zsuMWBtr+3R1bqRzFZnjn8I+11vwW6WMtk9lNkr44yNxRrhsklvAsfaEkYCjSf7cqLS8Ru44DJAzmQcoyMg+5ohOUH+Wc+WCmfPl9/Cn4xsrhoxwh5lzhXilRg31z8xUMH8LPjOZQV4HMAf65Y0+hYV7w3xXxCNuzuFRSD3nKZGD+nvTLr4hvmdhHOuMbaocjP/jua7V8vL6RzfQjyvgH8GviuS67S8itrKLGPvJwx38kJ/UV6Nwn+FnCrCRJ+LXX250IKwnupkeO/e36bDy601+OcSiIJad42I7iacbjyJPQ9KqX3xBcwzKnbzK5HdQMGZs9SQMD5GonlyTdNlxwqOz0KaSOKILFEndHdQFR+tAbviyKskhlLDONClQAfM5I+v6V51fcTlFwgmhdpAD9402llGd+UYB5f6qrJxS3vJxFMUZdOVaWQHH0A6cvOs1h2aJUaPid79oEkfa6ISO8iuG3HjpGM+x5dazfGrZeIBDJcyrONgrKqj12G2fOuSXMNxiGDsjEMhkjVIyf/LOrFOQfZ0UQSyxzA7KisyjPljBraEXF6HKmjNwXCQXD2z7MuVJBDb+vLBo5bC2aA6HaFR+LLaFO/pvQLjjyyXZdkxKuNeY9HzBz/wCqtcI4iqFIpU746ZOw8cDeumStWYJ7LvFLMTDtoScqCy7ZLf3oBwKyu+K8eEbOyxqQWB8PStdlJd4u0dHOASuPUg7n/HjTvhbh0dvxa4fvMc7MetQpVFlNWzYcUVLjMbOBgZxjem2HB+0IkZzpUYBPWn/ZLfiUvauHQp16UT7aOG3CxtGFUcuVcEnWkdCugTeJp7SIMCoyNI3/AFrE3sMkd4ZAsnZk8hk5+RH0rScW4nGs57LWzjljl/mg89/aXRCNFG5GxxlSTVwTWzRIq2ZEtwZbMhpTnMeco2c51Ak4PqKmiFqlyDcyqhAIOn8XPlnUAfTalLaQwW2uGOP7zmhY/QjP9qs8GhK3CuJMS5BRWIkwPQ4wf3yq29Co2dpdB7aMFiVwCoUaR5c8/Imr1pGk0pOp1Q47mf7D/VDIpIoUL3MZDrlmJH6VHb3V7xG5ii4fEXX8UksgwqjPQczXHJNukNRSVmvjk1AKoUKNhtzorbQArkgH25UHtbKSOVZr64GhBhI12B8zRVeIRH8JOB4Crx40ts5ssm9RPPP4k/w1PxFL9vs5miuVXBA5MOleHS/D/EeA/EEMN0jI+rn4ivrSa5DLhuR5V5T/ABP4eRbJxGOIkxHDY6KetdmLI4/hdGajyacuzzpb1/tBXV7Vlb+1u73jckMaNJKx7qjwq4LoDiWpW7unnXp/8OODRXU0nE7qNQxwsZI3xW0I/V+mb/IyLNHj6ZjeB/wu+JuJyRhkNrGd9TnOPavffg/4Og+FeEJaiR5pj3nlcbsaMWrxxqETSPSrX2gDYuB5Y5VhkyPIqZypceircRKPy7c+eN6pSCNkMeSFPjvRO4AnTAkIyKxPFzxrhd3I6xNPBjIOAR+u1cUsWzqxSvRclhkt5gcM4z3dtqcLgTBkKsQPEZH0rM2XxZFxYyQSB4biPYqCanTiXZkL2rFvA439edPg1pmrjasJXkSyxEjW6puGjK5U+hxisldrGksiIY9UowzlsuffUcdKPW9/odoZVjeNztIRkn9+3pQvjcWgPLbuyqO8y4GnPljGDW2O0yOPhlZ7+O1tliWQQkAkfeMcn+29DGnvXUuzl0C6iY2AQY6lflTLeR54VZbsopbvKsq4PkcqcevOpZIp0geBUKA5I0MGGPA4xn2FbdBxOW7Wl4wS7aC6LZyeyYlRj+oAjn44rkyXscTQIkLwsABFMseSPDXgb++KHzWZuYQ7sgVhglHU8umAMj51DZi/muTFG57LkQ8gHz8fnVUvAqaImilt70QC2KY/Eo1PjrjIzg+lFoF7VDFNbaQw7p7FVP8Av3PtRGDgKW8GZpLjT1QYZCPXOBUcNhE0iukbPG3XGMe+QfltRyTE0CLzhMklthUxjYBcYJ/sfQYrNzw3EMhZoWUcu6B/b+4r0K+4TCUd4IVk/qOkggepOPYVl7zg8s0OlnbIYnvuBgdMd7n7e9aQyGUoeiWxvriW1TLJqVe5lAf05H1rSfDzwvxWMucl/wARztWMt8cLu0gjJdzggknJHhj9+tH+HcTaPiUbSE6ywIbThQPIch7GnJehL+zQWPFWFq2U0tnc9DQ6/wCNyRd4DQfFjThJGokgVCrH8uKG3Nm9xEzBsJnSXI0qp8Cx2rlfHmdmOP52BeJ8SN2zK/cPRkfH0qKztri4YqLlWX8qs8i/qMUTg4WscpDXaYOR9zrZgfPBC48wTR3h9htkRdQcyN2mn+xB8CDWrkkqRCTu2BYOFcQjPZxSlmKnuIdR/Q/pWg4Vb3FrGslxPEupdiQCWH/HHX5GiTW7BdLuqxoe9lRhCf8AiO6vTnj1p0ENqsuslppCeeSd/PGPmGNYudmhds+E3d/Ce1mW1tW/piHaPvzB6ZrRwEQQpZ8OiKqnd22+ZqvrTsE1S9nGBuvU+VcTiuVMVjAFUbauntWXZk7YaS0Ud+eXc81zU7S20Kd0DbxoCBcMA00uF546VVupSdzMQvLuneqM+HthK84zFAx2OPGsl8RcXVraUXBRrdhsOZPtTeKcQgVSWyxj3GTmsFxfjDSvIX0jbA369a6MWOwaUTLrZWo+IGdQOy1aljPLfpXrPw/xO47LQNMSKAFO2PPavFY73PEiWYnPUVuuDcRkijCKR2SkAhhzrsywuJhjatns/D+IhkBZkYDqtFFWCcahIQx8688sOIoUWPKoCNiOlHLCaSNMCXUD4GvPlGuzfj6NHNYT9m2id/EYNU0v5bVNF4upORLDf60OPHL2CULpZlHUb1Zfj9vcr2NzGw1bZIqaDi/JRu/h/hN7K15w9lguzzZRjPyrJ3t3xGxv2s+IROE5xzgbGte0CBStvMpQ8tOxHuOVRLeGPMN8pdeQ7VR+oqTWMmjLRcRMx0LO8u+MbBv7Z96ZfXMz2xWJmV1O4K9PPwo3eWVlLG0scaauYGMah4Z/90LkRZoQI511qMBJtiPIN4VafktUzEvdTOZFRYEbOdUY0n3339/nT7W5uHUxvrCgZyozj/x2qzxvhciXInRZIZm31cwfPzoLJJeKQZcArykXGR5jP962W0Jmjtknmc7xtGOYaMBh77e1WXW1U6HBZk30ylR6jLDPyNYaS9mE2qb71xussbA49un0p443O8Zjml1g4AZlGR+/Ymq+tmbkjZ/zIodMUE6xn82rKg+AYb/rRSz4hDMwjdkVsjZZDt7jG/kax3DWTtV7WaQl17pjABHku1ayxktrdsMVZycBhIpYjxOAGHX61MkkhBa5te2WPKhnXYPJkkDybb9Pesxxa3eWUlL3sBGTqSNAurHnkkn0zWohMk7KLa6dGXlkagP36+FA/iidLVo/tCLNMW7o2jZvfrU47uiX0ZB7dYy7F8R89Tggk+h72c+IotwuK3nmW4DN2ee8FYb/ACqsONm6Bie17UqDo1MSwPXqa5wu/wBN20EqNGcggAjI98ZPrmuhp1sjXg1FzOIbx+yVVB2LAaifnnB9MVJMlvfr2jya3C4JYDV9d6bcjRxIH7OcnmVbAx4nPSro7LSCiEyHkQcD5dffz2rjaOtMo2PCotRdZHQYP3hJx+u/tRWORUASFZGYfnkQgewz/mqDxtJlW1A/mZstt0FWoSqIcERQrgNIwCj/ACfQUMRJLbLMuZn1kclU4VR5cwPQVet7QxbMFhHQYy3tnf61RS+XUBbHbpJzY+n9P6+dTqwXJJA8Rnr5n5bVDQ7YRZoQu/e8etNXixA0QQk4HM1RFysqjSRjO7HlTjdxIhCAHqT4+tKgSRK1/Oz/AHh+uwoPd8YSIyMZNsHP+qdxG8b7M5XAJ2GOua844xeXE9x2EOr8WGA8K6MUOT2RN8VZe4p8RghhEfxbAVlrl7m+2wQucUbsuCGUl5A2onljeiq8ISNcAAHHyrqUox0jH65T2zCrw6SOTI5jeiFrxK5txpddl3rStw9Vz1bbcDkKoXHD1MeCBvtnzq/t9k/4/oJ8P44kgVlPewcHNaiz447xY1gSZB35EeNeWXFpLbDXFqBqXh3Gpo3EUrEMOW/SpljUlaBTcXUj2q14lIFCy41DkR1FPk4lw+U6JWCtnmVrIWHE1mt4207cic8qvokMgJYhlYcietckoU9nSkmGnQSEPZXKrJ1XOzf7qN+JXKfd3tsXTlrFDH4eAimGY6T+HfBqeC5utBikkDOBgOw5jwb/ADUNFUWft0QLRqSmRkZ3HrVGUtKe9GMnqCCDU8RVyqSxKGG4Xo3mPCpniRjpjUt/wYYb5jn7AmkPSAc1zFa5jd2ROq4Dr/8AEn+4qh2UN/kWdxGsu2IskBvLBGr5ahRbiFnK8TGFVlUZBU5yPlWbFjqdgq5I3K5z/itIuxNFfiVgY8xz2yBidzpJHrqUmgN1AY1AjGlm20g6sj05+2DW7gkdrcxTw9tDgbSIWCjkPAgAeBoLecDEkkjWlzqbGTbuO9jPMYHfHtnO2OtbRlRjJeAHZ3FxAXyAo6oRt6Ebn6Vq+FcRlXAlVsau6ANSj1wAR9axtxCUYo6KhQ6Sys3Pz25+W1MiNwjoIkYMxzhWz9PD1q3FSRnya0ep2vEY1fKRhXGMtGAAx8xk+fhR0xHikDwyOpVlxnQdvevLOG8Sltn0zxZTGD2fNfY8q13CuKokypLBL3vwMqEqR6gkZ9hXPKFPRo9op8W+GLe2kJaF3U/iJkUY3zzYDJ9xgVnIrSyt+LKO0uohz70YIHodX616lc3Ie1JgDaiCe+rEfpg153dxQy8R7skccpOdIwFJ8jzB5HB2578hWmKTfZnJI3fHLWRoi0S4XnpG+9ZiHiT25ImHZgddxWvluBNGVYYHjyrLcUhjtMzuSI+a6ub+Q8B5/KufH6Z0vomjvbcxie4neKJThVbm58Bjr/b2y6S8+3ukcYCoqkqCv4R4/wCzWZF+lye2kIjhXYHG3oq9f3mpFv8AXkQx6Is53bdvMnbJ+lbfWZ8zUQSJCpWJizEd6Rt/l+/1qRrguOpHLegcE7Mu7hR6YohbzxtjS2AObVDgXyLcs0gGjO+Mt4KKpTXz91IwQvTVzPmatPJHICqjCjx6nxPnQ6eRF1ZOTy96EhWOmneZVAOcb5qtDw1DNrYKCd+WTTo5lLbkdNhVyB1Yj+1N2ik0y1FZoqZCnYddqYYgVYYHy5/6q7kLGM4z4eFVZXXsm/XPOoTZRVeNWGIxkkgZx0qvJagwA6ThttuXrRJMd1QuzDG/79agLBFaPIAwNPtV2wAF5ZLKjDJIG2azHE+FamLR91h1Fbl2VGZhumc+1D7iFO1JX8Dcj4VrCbRlOKktmc4ZxWeztwk4zuAK1HD+KQSDQXwHG2ehoLeWSnfYEcsUP7GRIgV2w2xFatRmZLlDSN3Z8TjlP2ftAO0HdJ5Z6e/SpUu9D4c6HBwc9DXnpW4im7SJsqTrA8PH61oBcT3iakb75QHX/mp/uOWfOs5YkVHK/KNgl2k0ZJXvjmvj5iuySpIvNs8g+eXkf81nrKZiV1DGRyojHKWI5d4bN/msXCjVMuLcs7APIRKuwdjgnyPj7/7EF8kVyhD6Y7kbLLjZj4Njkf8A3UMjpMhAbTINsf2/x+8jxxBuy0OwK50hjy/7W/z08qaiJsicTwTGGaBwwxkxH8Q8cZwfIj5VVup9GqSKQuqH8DjBUjmfEfPIq4X0oyysRDqOC2xjPUbdPT133BguLQSANKuoDkynDctvUb5HjzrVGZUknt+LlUcgTjYshy2PIY39DjlsRQq4s5LchOzidW/A4zk+/M8/Wrs9nGMuq9rg7qW76+Yb/Irks0rREIskkf8A9WFwD7r/AEt9Oe25FNL0S3QIXUk3LSRyOeXv/qtLwqYYGLgq5P4Q+VY+nMfpWVuLSRHEkRZk/L5jqDvsd9wfEdMVesAoZe92nURnOQfIjf8AfI1UkiYt9G+V76PGe9CwwU7o+WRWZnVYr46xJjorAAkfMinDil0sRRdDRODsV1eu3MfWqbzGeXWcqDsQdsHx3qIxaG3o9SmVYxk41dByxWW41cEq43kJHUbUfurkhSNBoPMYpXz3h5Fc1wRm0ej9SfZ5/eQX00hfPptsB4CqobiUWAH2+Vb57WJt9S//AAA/QUw8PhO+UNbx+U12jKXxIvoxa318NmQ4/wCNW4+PTxgAwsoX8xHL08a1B4RG6nA+Rph4CjD8Jq18qL7Rm/iNdMAH4rVIwmJBjqRVOb4kDYAJ0+J6mtDN8OAjIAoXcfDTZYqvvirjnxEP42VdMqQ/EMEYGqTcdADvR/g/FkuJNZYDwGazUnw1KpyE+lPtuFXdq2UUhhVueKS0ZrHmi9o3018BH+LAzsPGqJvhIxydl6VmpZeJKP8Apknx8Kq/ab2MEdix32xUqEfDNHKa8G0m4gqyI+r8KkYz1NULriCjSAw5H/dZK54jfsSBA4HnVCW6v3cFkbOMcquONeyHkkvDNlHfq8TDI5daha/VlVRjJz71kY579GP3bYI3GKcH4g+MRHI8qvhH2R9kvRqWuVkUDPIbHxpqEMmnbOc5rPKeI/8A28Z8uVWoRxLSMxDPjS/K8jTm/wDUPpbLJgdQdgKJW1skegn8p38x1HyrORtxJSPuwP70Rgl4kQokVfMgcxUScfZaU/8Ak0n2WNiVP41O/n4GopT2Jwdt85H60P7e8V4nAGoKB/Y1LNLO/e7MEHoDutZ3FeTRRn6FNNl9akBvlmh13OkcvapsWGHU+NPeCdjlB7E1VNndairprj8NtvMVUXH2KUZ+iX7SH5HfT1bZgPpkefTblzktGOGtVPezqRTupHhg9Cd+u/rmg7Wt9byBljkwD08uR/3UmueLco+kbhcch1HoD771f58GTUvKC626q6uMpJzwSG9NPLK/X161rlLaTvCZIplzvqABP9j+zmqlzxG4KLcKwKv3ZFI/P48uvP5+FUZJzKpIEbDfK5wR5r6eG+N8dcPiLlRHeO7gkh5EJw6jf3X0yeXmOpod2emXSXBXoc7HwP73p8u0hC61JP4tX+hUkUUsh7GRyWBymQefht4++/qTVmT2y1DdrbgKUkBPUjn71cMhMOG7w8Q29DI0ZWxIRk9cg1Lhu2AGhhtjTSSG5aPWrmMEneqT24xjAq9ODqNQHV4141nuJFN4RttTDEPDarTAk13SCNxTsZWWLbbNSqGAGGPzqZVWnhF8KVgVizKMA1E7swwQDV1oxiq0iHNGgK2EYbpgU1EQtuKsGI+YpJHvjFPQ6sieCBhnAqIWcJH4RVySLK8qrtEQedAJIrNYRE/hGahfhkXRauNkNTTnxNVv2FIqJwtMZKg0hw9FOyCriswB3ppZugpXIOKK/wBiT+kUktccgKsa2HMfKpoypXB507kKkVBCQdwKnVQPy71YwuOQqVVU42pWxUiIRjA25UjEDzUVaCKacEGcVPIEig0EZ/KKhMCDkKJmMVG0AO+KOYcQeIVx1Fd7AquzfSrZhxTGQ4p8g4lBrZjnIUqfEVE9nExy0MeehxV9y2MYpoXPMVSm/YnBegTJwm2c5MC58tqYPh61mIyrjHLejWgZ2FTxqBjAqvtkvJDxQfgCSfDMDZZW3P8AUM1Ui+HGim+7ZDvyJNa1gdPOoUX7yrWefszfx8b8ByUAE1VcCrcoqpJXIdKIcb13bwrh2pDnzqijukU8Cl0FPUZNITOYyKiZMnlVrTXNGaaYikwwaaDvVxoqhZMGnYDDuKjK1MU2zVeQEHnQNEbpk0xo6k3pb4p2UQaOmKQh351OB4ipFUHpRZJX7A+NdEJA5VdWMEU7stuVPkKykE8jUyqFFTGLel2flSsLGqSOtdLEc672dcK7b0gImkOaYZMeNddaiKmgY7tM9aRao9BxTWVhRQEoI8BTwqkZxiqwY1KGooCRUGedTLGD4VWU71Mr4ooTJXj22qBIyJOVSGWlE+XpqyWj/9k=', - altText: 'cute cat', - }, - { - type: 'plain_text', - text: 'Author: K A Applegate', - emoji: true, - }, - ], - }, -] as const; diff --git a/packages/fuselage-ui-kit/src/stories/payloads/divider.ts b/packages/fuselage-ui-kit/src/stories/payloads/divider.ts deleted file mode 100644 index df5fa7f2dc..0000000000 --- a/packages/fuselage-ui-kit/src/stories/payloads/divider.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type * as UiKit from '@rocket.chat/ui-kit'; - -export const divider: readonly UiKit.LayoutBlock[] = [ - { - type: 'divider', - }, -] as const; diff --git a/packages/fuselage-ui-kit/src/stories/payloads/image.ts b/packages/fuselage-ui-kit/src/stories/payloads/image.ts deleted file mode 100644 index 9dffb86a0b..0000000000 --- a/packages/fuselage-ui-kit/src/stories/payloads/image.ts +++ /dev/null @@ -1,24 +0,0 @@ -import type * as UiKit from '@rocket.chat/ui-kit'; - -export const imageWithTitle: readonly UiKit.LayoutBlock[] = [ - { - type: 'image', - title: { - type: 'plain_text', - text: 'I Need a Marg', - emoji: true, - }, - imageUrl: - 'data:image/jpeg;base64,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', - altText: 'marg', - }, -]; - -export const imageWithoutTitle: readonly UiKit.LayoutBlock[] = [ - { - type: 'image', - imageUrl: - 'data:image/jpeg;base64,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', - altText: 'inspiration', - }, -]; diff --git a/packages/fuselage-ui-kit/src/stories/payloads/img.ts b/packages/fuselage-ui-kit/src/stories/payloads/img.ts deleted file mode 100644 index bd5926679d..0000000000 --- a/packages/fuselage-ui-kit/src/stories/payloads/img.ts +++ /dev/null @@ -1,3 +0,0 @@ -const img = - 'data:image/jpeg;base64,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'; -export default img; diff --git a/packages/fuselage-ui-kit/src/stories/payloads/index.ts b/packages/fuselage-ui-kit/src/stories/payloads/index.ts deleted file mode 100644 index 2de52ceac4..0000000000 --- a/packages/fuselage-ui-kit/src/stories/payloads/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export * from './actions'; -export * from './conditional'; -export * from './context'; -export * from './divider'; -export * from './image'; -export * from './input'; -export * from './section'; -export * from './preview'; diff --git a/packages/fuselage-ui-kit/src/stories/payloads/input.ts b/packages/fuselage-ui-kit/src/stories/payloads/input.ts deleted file mode 100644 index b52911d3b1..0000000000 --- a/packages/fuselage-ui-kit/src/stories/payloads/input.ts +++ /dev/null @@ -1,149 +0,0 @@ -import type * as UiKit from '@rocket.chat/ui-kit'; - -export const inputWithMultilinePlainTextInput: readonly UiKit.LayoutBlock[] = [ - { - type: 'input', - element: { - appId: 'dummy-app-id', - blockId: 'dummy-block-id', - type: 'plain_text_input', - multiline: true, - actionId: 'input-0', - }, - label: { - type: 'plain_text', - text: 'Label', - emoji: true, - }, - }, -] as const; - -export const inputWithPlainTextInput: readonly UiKit.LayoutBlock[] = [ - { - type: 'input', - element: { - appId: 'dummy-app-id', - blockId: 'dummy-block-id', - type: 'plain_text_input', - actionId: 'input-0', - }, - label: { - type: 'plain_text', - text: 'Label', - emoji: true, - }, - }, -] as const; - -export const inputWithMultiUsersSelect: readonly UiKit.LayoutBlock[] = [ - { - type: 'input', - element: { - appId: 'dummy-app-id', - blockId: 'dummy-block-id', - type: 'multi_users_select', - // placeholder: { - // type: 'plain_text', - // text: 'Select users', - // emoji: true, - // }, - actionId: 'input-0', - }, - label: { - type: 'plain_text', - text: 'Label', - emoji: true, - }, - }, -] as const; - -export const inputWithStaticSelect: readonly UiKit.LayoutBlock[] = [ - { - type: 'input', - element: { - appId: 'dummy-app-id', - blockId: 'dummy-block-id', - type: 'static_select', - placeholder: { - type: 'plain_text', - text: 'Select an item', - emoji: true, - }, - options: [ - { - text: { - type: 'plain_text', - text: '*this is plain_text text*', - emoji: true, - }, - value: 'value-0', - }, - { - text: { - type: 'plain_text', - text: '*this is plain_text text*', - emoji: true, - }, - value: 'value-1', - }, - { - text: { - type: 'plain_text', - text: '*this is plain_text text*', - emoji: true, - }, - value: 'value-2', - }, - ], - actionId: 'input-0', - }, - label: { - type: 'plain_text', - text: 'Label', - emoji: true, - }, - }, -] as const; - -export const inputWithDatePicker: readonly UiKit.LayoutBlock[] = [ - { - type: 'input', - element: { - appId: 'dummy-app-id', - blockId: 'dummy-block-id', - type: 'datepicker', - initialDate: '1990-04-28', - placeholder: { - type: 'plain_text', - text: 'Select a date', - emoji: true, - }, - actionId: 'input-0', - }, - label: { - type: 'plain_text', - text: 'Label', - emoji: true, - }, - }, -] as const; - -export const inputWithLinearScale: readonly UiKit.LayoutBlock[] = [ - { - type: 'input', - element: { - appId: 'dummy-app-id', - blockId: 'dummy-block-id', - type: 'linear_scale', - minValue: 0, - maxValue: 10, - initialValue: 7, - actionId: 'input-0', - }, - label: { - type: 'plain_text', - text: 'Label', - emoji: true, - }, - }, -] as const; diff --git a/packages/fuselage-ui-kit/src/stories/payloads/preview.ts b/packages/fuselage-ui-kit/src/stories/payloads/preview.ts deleted file mode 100644 index ef95f91c45..0000000000 --- a/packages/fuselage-ui-kit/src/stories/payloads/preview.ts +++ /dev/null @@ -1,66 +0,0 @@ -// import * as UiKit from '@rocket.chat/ui-kit'; -import type { PreviewBlock } from '@rocket.chat/ui-kit'; - -import img from './img'; - -export const preview: PreviewBlock[] = [ - { - type: 'preview', - title: [ - { - type: 'plain_text', - text: 'I Need a Marg', - emoji: true, - }, - ], - description: [ - { - type: 'plain_text', - text: 'I Need a Description', - emoji: true, - }, - ], - thumb: { url: img }, - footer: { - type: 'context', - elements: [ - { - type: 'plain_text', - text: 'google.com', - }, - ], - }, - }, -]; - -export const previewWithExternalUrl: PreviewBlock[] = [ - { - type: 'preview', - title: [ - { - type: 'plain_text', - text: 'I Need a Marg', - emoji: true, - }, - ], - description: [ - { - type: 'plain_text', - text: 'I Need a Description', - emoji: true, - }, - ], - // thumb: { url: img }, - footer: { - type: 'context', - elements: [ - { - type: 'plain_text', - text: 'google.com', - }, - ], - }, - externalUrl: - 'https://rocketchat.github.io/Rocket.Chat.Fuselage/?path=/story/*', - }, -]; diff --git a/packages/fuselage-ui-kit/src/stories/payloads/section.ts b/packages/fuselage-ui-kit/src/stories/payloads/section.ts deleted file mode 100644 index 8187ade0c3..0000000000 --- a/packages/fuselage-ui-kit/src/stories/payloads/section.ts +++ /dev/null @@ -1,173 +0,0 @@ -import type * as UiKit from '@rocket.chat/ui-kit'; - -export const sectionWithPlainText: readonly UiKit.LayoutBlock[] = [ - { - type: 'section', - text: { - type: 'plain_text', - text: 'This is a plain text section block.', - emoji: true, - }, - }, -] as const; - -export const sectionWithMrkdwn: readonly UiKit.LayoutBlock[] = [ - { - type: 'section', - text: { - type: 'mrkdwn', - text: 'This is a mrkdwn section block :ghost: *this is bold*, and ~this is crossed out~, and <https://google.com|this is a link>', - }, - }, -] as const; - -export const sectionWithTextFields: readonly UiKit.LayoutBlock[] = [ - { - type: 'section', - fields: [ - { - type: 'plain_text', - text: '*this is plain_text text*', - emoji: true, - }, - { - type: 'plain_text', - text: '*this is plain_text text*', - emoji: true, - }, - { - type: 'plain_text', - text: '*this is plain_text text*', - emoji: true, - }, - { - type: 'plain_text', - text: '*this is plain_text text*', - emoji: true, - }, - { - type: 'plain_text', - text: '*this is plain_text text*', - emoji: true, - }, - ], - }, -] as const; - -export const sectionWithButtonAccessory: readonly UiKit.LayoutBlock[] = [ - { - type: 'section', - text: { - type: 'mrkdwn', - text: 'This is a section block with a button.', - }, - accessory: { - appId: 'dummy-app-id', - blockId: 'dummy-block-id', - actionId: 'dummy-action-id', - type: 'button', - text: { - type: 'plain_text', - text: 'Click Me', - emoji: true, - }, - value: 'click_me_123', - }, - }, -] as const; - -export const sectionWithImageAccessory: readonly UiKit.LayoutBlock[] = [ - { - type: 'section', - text: { - type: 'mrkdwn', - text: 'This is a section block with an accessory image.', - }, - accessory: { - type: 'image', - imageUrl: - 'data:image/jpeg;base64,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', - altText: 'cute cat', - }, - }, -] as const; - -export const sectionWithOverflowMenuAccessory: readonly UiKit.LayoutBlock[] = [ - { - type: 'section', - text: { - type: 'mrkdwn', - text: 'This is a section block with an overflow menu.', - }, - accessory: { - appId: 'dummy-app-id', - blockId: 'dummy-block-id', - actionId: 'dummy-action-id', - type: 'overflow', - options: [ - { - text: { - type: 'plain_text', - text: '*this is plain_text text*', - emoji: true, - }, - value: 'value-0', - }, - { - text: { - type: 'plain_text', - text: '*this is plain_text text*', - emoji: true, - }, - value: 'value-1', - }, - { - text: { - type: 'plain_text', - text: '*this is plain_text text*', - emoji: true, - }, - value: 'value-2', - }, - { - text: { - type: 'plain_text', - text: '*this is plain_text text*', - emoji: true, - }, - value: 'value-3', - }, - { - text: { - type: 'plain_text', - text: '*this is plain_text text*', - emoji: true, - }, - value: 'value-4', - }, - ], - }, - }, -] as const; - -export const sectionWithDatePickerAccessory: readonly UiKit.LayoutBlock[] = [ - { - type: 'section', - text: { - type: 'mrkdwn', - text: 'Pick a date for the deadline.', - }, - accessory: { - appId: 'dummy-app-id', - blockId: 'dummy-block-id', - actionId: 'dummy-action-id', - type: 'datepicker', - initialDate: '1990-04-28', - placeholder: { - type: 'plain_text', - text: 'Select a date', - emoji: true, - }, - }, - }, -] as const; diff --git a/packages/fuselage-ui-kit/src/surfaces/BannerSurface.tsx b/packages/fuselage-ui-kit/src/surfaces/BannerSurface.tsx deleted file mode 100644 index a1df576be0..0000000000 --- a/packages/fuselage-ui-kit/src/surfaces/BannerSurface.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { Margins } from '@rocket.chat/fuselage'; -import type { ReactElement, ReactNode } from 'react'; -import React from 'react'; - -import { Surface } from './Surface'; - -type BannerSurfaceProps = { - children?: ReactNode; -}; - -const BannerSurface = ({ children }: BannerSurfaceProps): ReactElement => ( - <Surface type='banner'> - <Margins block='x8'>{children}</Margins> - </Surface> -); - -export default BannerSurface; diff --git a/packages/fuselage-ui-kit/src/surfaces/FuselageSurfaceRenderer.tsx b/packages/fuselage-ui-kit/src/surfaces/FuselageSurfaceRenderer.tsx deleted file mode 100644 index f548f63ac6..0000000000 --- a/packages/fuselage-ui-kit/src/surfaces/FuselageSurfaceRenderer.tsx +++ /dev/null @@ -1,344 +0,0 @@ -import * as UiKit from '@rocket.chat/ui-kit'; -import type { ReactElement } from 'react'; -import React, { Fragment } from 'react'; - -import ActionsBlock from '../blocks/ActionsBlock'; -import ContextBlock from '../blocks/ContextBlock'; -import DividerBlock from '../blocks/DividerBlock'; -import ImageBlock from '../blocks/ImageBlock'; -import InputBlock from '../blocks/InputBlock'; -import PreviewBlock from '../blocks/PreviewBlock'; -import SectionBlock from '../blocks/SectionBlock'; -import ButtonElement from '../elements/ButtonElement'; -import DatePickerElement from '../elements/DatePickerElement'; -import ImageElement from '../elements/ImageElement'; -import LinearScaleElement from '../elements/LinearScaleElement'; -import MultiStaticSelectElement from '../elements/MultiStaticSelectElement'; -import OverflowElement from '../elements/OverflowElement'; -import PlainTextInputElement from '../elements/PlainTextInputElement'; -import StaticSelectElement from '../elements/StaticSelectElement'; - -export class FuselageSurfaceRenderer extends UiKit.SurfaceRenderer<ReactElement> { - public constructor() { - super([ - 'actions', - 'context', - 'divider', - 'image', - 'input', - 'section', - 'preview', - ]); - } - - public plain_text( - { text = '' }: UiKit.PlainText, - context: UiKit.BlockContext, - index: number - ): ReactElement | null { - if (context === UiKit.BlockContext.BLOCK) { - return null; - } - - return text ? <Fragment key={index}>{text}</Fragment> : null; - } - - public mrkdwn( - { text = '' }: UiKit.Markdown, - context: UiKit.BlockContext, - index: number - ): ReactElement | null { - if (context === UiKit.BlockContext.BLOCK) { - return null; - } - - return text ? <Fragment key={index}>{text}</Fragment> : null; - } - - actions( - block: UiKit.ActionsBlock, - context: UiKit.BlockContext, - index: number - ): ReactElement | null { - if (context === UiKit.BlockContext.BLOCK) { - return ( - <ActionsBlock - key={index} - block={block} - context={context} - index={index} - surfaceRenderer={this} - /> - ); - } - - return null; - } - - preview( - block: UiKit.PreviewBlock, - context: UiKit.BlockContext, - index: number - ): ReactElement | null { - if (context !== UiKit.BlockContext.BLOCK) { - return null; - } - return ( - <PreviewBlock - key={index} - block={block} - context={context} - index={index} - surfaceRenderer={this} - /> - ); - } - - context( - block: UiKit.ContextBlock, - context: UiKit.BlockContext, - index: number - ): ReactElement | null { - if (context === UiKit.BlockContext.BLOCK) { - return ( - <ContextBlock - key={index} - block={block} - context={context} - index={index} - surfaceRenderer={this} - /> - ); - } - - return null; - } - - divider( - block: UiKit.DividerBlock, - context: UiKit.BlockContext, - index: number - ): ReactElement | null { - if (context === UiKit.BlockContext.BLOCK) { - return ( - <DividerBlock - key={index} - block={block} - context={context} - index={index} - surfaceRenderer={this} - /> - ); - } - - return null; - } - - image( - block: UiKit.ImageBlock | UiKit.ImageElement, - context: UiKit.BlockContext, - index: number - ): ReactElement | null { - if (context === UiKit.BlockContext.BLOCK) { - return ( - <ImageBlock - key={index} - block={block} - context={context} - index={index} - surfaceRenderer={this} - /> - ); - } - - return ( - <ImageElement - key={index} - block={block} - context={context} - index={index} - surfaceRenderer={this} - /> - ); - } - - input( - block: UiKit.InputBlock, - context: UiKit.BlockContext, - index: number - ): ReactElement | null { - if (context === UiKit.BlockContext.BLOCK) { - return ( - <InputBlock - key={block.element.actionId || index} - block={block} - context={context} - index={index} - surfaceRenderer={this} - /> - ); - } - - return null; - } - - section( - block: UiKit.SectionBlock, - context: UiKit.BlockContext, - index: number - ): ReactElement | null { - if (context === UiKit.BlockContext.BLOCK) { - return ( - <SectionBlock - key={index} - block={block} - context={context} - index={index} - surfaceRenderer={this} - /> - ); - } - - return null; - } - - button( - block: UiKit.ButtonElement, - context: UiKit.BlockContext, - index: number - ): ReactElement | null { - if (context === UiKit.BlockContext.BLOCK) { - return null; - } - - return ( - <ButtonElement - key={index} - block={block} - context={context} - index={index} - surfaceRenderer={this} - /> - ); - } - - datepicker( - block: UiKit.DatePickerElement, - context: UiKit.BlockContext, - index: number - ): ReactElement | null { - if (context === UiKit.BlockContext.BLOCK) { - return null; - } - - return ( - <DatePickerElement - key={block.actionId || index} - block={block} - context={context} - index={index} - surfaceRenderer={this} - /> - ); - } - - static_select( - block: UiKit.StaticSelectElement, - context: UiKit.BlockContext, - index: number - ): ReactElement | null { - if (context === UiKit.BlockContext.BLOCK) { - return null; - } - - return ( - <StaticSelectElement - key={block.actionId || index} - block={block} - context={context} - index={index} - surfaceRenderer={this} - /> - ); - } - - multi_static_select( - block: UiKit.MultiStaticSelectElement, - context: UiKit.BlockContext, - index: number - ): ReactElement | null { - if (context === UiKit.BlockContext.BLOCK) { - return null; - } - - return ( - <MultiStaticSelectElement - key={block.actionId || index} - block={block} - context={context} - index={index} - surfaceRenderer={this} - /> - ); - } - - overflow( - block: UiKit.OverflowElement, - context: UiKit.BlockContext, - index: number - ): ReactElement | null { - if (context === UiKit.BlockContext.BLOCK) { - return null; - } - - return ( - <OverflowElement - key={index} - block={block} - context={context} - index={index} - surfaceRenderer={this} - /> - ); - } - - plain_text_input( - block: UiKit.PlainTextInputElement, - context: UiKit.BlockContext, - index: number - ): ReactElement | null { - if (context === UiKit.BlockContext.BLOCK) { - return null; - } - - return ( - <PlainTextInputElement - key={block.actionId || index} - block={block} - context={context} - index={index} - surfaceRenderer={this} - /> - ); - } - - linear_scale( - block: UiKit.LinearScaleElement, - context: UiKit.BlockContext, - index: number - ): ReactElement | null { - if (context === UiKit.BlockContext.BLOCK) { - return null; - } - - return ( - <LinearScaleElement - key={block.actionId || index} - block={block} - context={context} - index={index} - surfaceRenderer={this} - /> - ); - } -} diff --git a/packages/fuselage-ui-kit/src/surfaces/MessageSurface.tsx b/packages/fuselage-ui-kit/src/surfaces/MessageSurface.tsx deleted file mode 100644 index af08af1090..0000000000 --- a/packages/fuselage-ui-kit/src/surfaces/MessageSurface.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { Margins } from '@rocket.chat/fuselage'; -import type { ReactElement, ReactNode } from 'react'; -import React from 'react'; - -import { Surface } from './Surface'; - -type MessageSurfaceProps = { - children?: ReactNode; -}; - -const MessageSurface = ({ children }: MessageSurfaceProps): ReactElement => ( - <Surface type='message'> - <Margins blockEnd='x16'>{children}</Margins> - </Surface> -); - -export default MessageSurface; diff --git a/packages/fuselage-ui-kit/src/surfaces/ModalSurface.tsx b/packages/fuselage-ui-kit/src/surfaces/ModalSurface.tsx deleted file mode 100644 index 7be41b4c5e..0000000000 --- a/packages/fuselage-ui-kit/src/surfaces/ModalSurface.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { Margins } from '@rocket.chat/fuselage'; -import type { ReactElement, ReactNode } from 'react'; -import React from 'react'; - -import { Surface } from './Surface'; - -type ModalSurfaceProps = { - children?: ReactNode; -}; - -const ModalSurface = ({ children }: ModalSurfaceProps): ReactElement => ( - <Surface type='modal'> - <Margins blockEnd='x16'>{children}</Margins> - </Surface> -); - -export default ModalSurface; diff --git a/packages/fuselage-ui-kit/src/surfaces/Surface.tsx b/packages/fuselage-ui-kit/src/surfaces/Surface.tsx deleted file mode 100644 index 1ce5d01743..0000000000 --- a/packages/fuselage-ui-kit/src/surfaces/Surface.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import type { ContextType, ReactElement, ReactNode } from 'react'; -import React from 'react'; - -import { SurfaceContext } from '../contexts/SurfaceContext'; - -type SurfaceProps = { - children: ReactNode; - type: ContextType<typeof SurfaceContext>; -}; - -export const Surface = ({ children, type }: SurfaceProps): ReactElement => ( - <SurfaceContext.Provider value={type}>{children}</SurfaceContext.Provider> -); diff --git a/packages/fuselage-ui-kit/src/surfaces/SurfaceContext.tsx b/packages/fuselage-ui-kit/src/surfaces/SurfaceContext.tsx deleted file mode 100644 index 4529022064..0000000000 --- a/packages/fuselage-ui-kit/src/surfaces/SurfaceContext.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import type { FC } from 'react'; -import React, { createContext, useContext } from 'react'; - -export type SurfaceContextValue = { - type: 'message' | 'modal' | 'banner'; -}; - -export const SurfaceContext = createContext<SurfaceContextValue | undefined>( - undefined -); - -export const Surface: FC<{ value: SurfaceContextValue }> = (props) => ( - <SurfaceContext.Provider {...props} /> -); - -export const useSurface = (): SurfaceContextValue => { - const context = useContext(SurfaceContext); - if (!context) { - throw new Error('Invalid Surface Content'); - } - return context; -}; - -export const useSurfaceType = (): SurfaceContextValue['type'] => { - const context = useSurface(); - return context.type; -}; diff --git a/packages/fuselage-ui-kit/src/surfaces/createSurfaceRenderer.tsx b/packages/fuselage-ui-kit/src/surfaces/createSurfaceRenderer.tsx deleted file mode 100644 index c17b42002f..0000000000 --- a/packages/fuselage-ui-kit/src/surfaces/createSurfaceRenderer.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import type * as UiKit from '@rocket.chat/ui-kit'; -import type { ComponentType, ReactElement } from 'react'; -import React from 'react'; - -export const createSurfaceRenderer = < - S extends UiKit.SurfaceRenderer<ReactElement> ->( - SurfaceComponent: ComponentType, - surfaceRenderer: S -) => - function Surface( - blocks: readonly UiKit.LayoutBlock[], - conditions: UiKit.Conditions = {} - ): ReactElement { - return ( - <SurfaceComponent> - {surfaceRenderer.render(blocks, { - engine: 'rocket.chat', - ...conditions, - })} - </SurfaceComponent> - ); - }; diff --git a/packages/fuselage-ui-kit/src/surfaces/index.ts b/packages/fuselage-ui-kit/src/surfaces/index.ts deleted file mode 100644 index dd29183435..0000000000 --- a/packages/fuselage-ui-kit/src/surfaces/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -import BannerSurface from './BannerSurface'; -import { FuselageSurfaceRenderer } from './FuselageSurfaceRenderer'; -import MessageSurface from './MessageSurface'; -import ModalSurface from './ModalSurface'; -import { createSurfaceRenderer } from './createSurfaceRenderer'; - -// export const attachmentParser = new FuselageSurfaceRenderer(); -export const bannerParser = new FuselageSurfaceRenderer(); -export const messageParser = new FuselageSurfaceRenderer(); -export const modalParser = new FuselageSurfaceRenderer(); - -// export const UiKitAttachment = createSurfaceRenderer(AttachmentSurface, attachmentParser); -export const UiKitBanner = createSurfaceRenderer(BannerSurface, bannerParser); -export const UiKitMessage = createSurfaceRenderer( - MessageSurface, - messageParser -); -export const UiKitModal = createSurfaceRenderer(ModalSurface, modalParser); diff --git a/packages/fuselage-ui-kit/src/utils/BlockProps.ts b/packages/fuselage-ui-kit/src/utils/BlockProps.ts deleted file mode 100644 index d11e8577e5..0000000000 --- a/packages/fuselage-ui-kit/src/utils/BlockProps.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { Box } from '@rocket.chat/fuselage'; -import type * as UiKit from '@rocket.chat/ui-kit'; -import type { ComponentProps, ReactElement } from 'react'; - -export type BlockProps<B extends UiKit.Block> = { - className?: ComponentProps<typeof Box>['className']; - block: B; - context: UiKit.BlockContext; - index: number; - surfaceRenderer: UiKit.SurfaceRenderer<ReactElement>; -}; diff --git a/packages/fuselage-ui-kit/src/utils/UiKitComponent.tsx b/packages/fuselage-ui-kit/src/utils/UiKitComponent.tsx deleted file mode 100644 index f43057a6ab..0000000000 --- a/packages/fuselage-ui-kit/src/utils/UiKitComponent.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import type * as UiKit from '@rocket.chat/ui-kit'; -import type { ReactElement } from 'react'; - -import type { UiKitBanner, UiKitMessage, UiKitModal } from '../surfaces'; - -type UiKitComponentProps = { - render: typeof UiKitBanner | typeof UiKitMessage | typeof UiKitModal; - blocks: UiKit.LayoutBlock[]; -}; - -export const UiKitComponent = ({ - render, - blocks, -}: UiKitComponentProps): ReactElement | null => render(blocks); diff --git a/packages/fuselage-ui-kit/src/utils/fromTextObjectToString.ts b/packages/fuselage-ui-kit/src/utils/fromTextObjectToString.ts deleted file mode 100644 index adc624986c..0000000000 --- a/packages/fuselage-ui-kit/src/utils/fromTextObjectToString.ts +++ /dev/null @@ -1,21 +0,0 @@ -import * as UiKit from '@rocket.chat/ui-kit'; -import type { ReactElement } from 'react'; -import { renderToStaticMarkup } from 'react-dom/server'; - -export const fromTextObjectToString = ( - surfaceRenderer: UiKit.SurfaceRenderer<ReactElement>, - textObject: UiKit.TextObject, - index: number -): string | undefined => { - const element = surfaceRenderer.renderTextObject( - textObject, - index, - UiKit.BlockContext.NONE - ); - - if (!element) { - return undefined; - } - - return renderToStaticMarkup(element); -}; diff --git a/packages/fuselage-ui-kit/tsconfig-cjs.json b/packages/fuselage-ui-kit/tsconfig-cjs.json deleted file mode 100644 index 44b902831e..0000000000 --- a/packages/fuselage-ui-kit/tsconfig-cjs.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "module": "commonjs", - "outDir": "./dist/cjs" - } -} diff --git a/packages/fuselage-ui-kit/tsconfig-esm.json b/packages/fuselage-ui-kit/tsconfig-esm.json deleted file mode 100644 index 48e68b0620..0000000000 --- a/packages/fuselage-ui-kit/tsconfig-esm.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "module": "ESNext", - "outDir": "./dist/esm" - } -} diff --git a/packages/fuselage-ui-kit/tsconfig.json b/packages/fuselage-ui-kit/tsconfig.json deleted file mode 100644 index 96f2f543ff..0000000000 --- a/packages/fuselage-ui-kit/tsconfig.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "compilerOptions": { - "rootDir": "./src", - "module": "ESNext", - "target": "es5", - "lib": ["dom", "es6"], - "sourceMap": true, - "allowJs": false, - "jsx": "react", - "declaration": true, - "outDir": "./dist", - "moduleResolution": "node", - "forceConsistentCasingInFileNames": true, - "noImplicitReturns": true, - "noImplicitThis": true, - "noImplicitAny": true, - "strict": true, - "strictNullChecks": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "esModuleInterop": true, - "skipLibCheck": true - }, - "exclude": ["node_modules", "dist"] -} diff --git a/packages/uikit-playground/.eslintignore b/packages/uikit-playground/.eslintignore deleted file mode 100644 index 70e2c25fce..0000000000 --- a/packages/uikit-playground/.eslintignore +++ /dev/null @@ -1,7 +0,0 @@ -/dist -/build -/node_modules -/storybook-static -!/.jest -!/.storybook -/.storybook/jest-results.json diff --git a/packages/uikit-playground/.eslintrc.js b/packages/uikit-playground/.eslintrc.js deleted file mode 100644 index 0384b7a623..0000000000 --- a/packages/uikit-playground/.eslintrc.js +++ /dev/null @@ -1,32 +0,0 @@ -module.exports = { - extends: ['@rocket.chat/eslint-config-alt/typescript'], - rules: { - '@typescript-eslint/explicit-module-boundary-types': 'off', - '@typescript-eslint/no-empty-function': 'off', - '@typescript-eslint/no-use-before-define': 'off', - 'react/display-name': 'off', - 'react/no-multi-comp': 'off', - }, - env: { - jest: true, - }, - overrides: [ - { - files: ['*.mdx'], - extends: [ - '@rocket.chat/eslint-config-alt/react', - 'plugin:mdx/recommended', - ], - parserOptions: { - ecmaFeatures: { - jsx: true, - }, - }, - rules: { - 'new-cap': 'off', - 'prefer-arrow-callback': 'off', - 'semi': 'off', - }, - }, - ], -}; diff --git a/packages/uikit-playground/.gitignore b/packages/uikit-playground/.gitignore deleted file mode 100644 index 4d29575de8..0000000000 --- a/packages/uikit-playground/.gitignore +++ /dev/null @@ -1,23 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# production -/build - -# misc -.DS_Store -.env.local -.env.development.local -.env.test.local -.env.production.local - -npm-debug.log* -yarn-debug.log* -yarn-error.log* diff --git a/packages/uikit-playground/.prettierignore b/packages/uikit-playground/.prettierignore deleted file mode 100644 index 5cb8608252..0000000000 --- a/packages/uikit-playground/.prettierignore +++ /dev/null @@ -1,6 +0,0 @@ -/dist -/build -/node_modules -/storybook-static -/.storybook/jest-results.json -/**/*.mdx diff --git a/packages/uikit-playground/.prettierrc.js b/packages/uikit-playground/.prettierrc.js deleted file mode 100644 index b57f474edb..0000000000 --- a/packages/uikit-playground/.prettierrc.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('@rocket.chat/prettier-config/fuselage'); diff --git a/packages/uikit-playground/README.md b/packages/uikit-playground/README.md deleted file mode 100644 index b87cb00449..0000000000 --- a/packages/uikit-playground/README.md +++ /dev/null @@ -1,46 +0,0 @@ -# Getting Started with Create React App - -This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). - -## Available Scripts - -In the project directory, you can run: - -### `npm start` - -Runs the app in the development mode.\ -Open [http://localhost:3000](http://localhost:3000) to view it in the browser. - -The page will reload if you make edits.\ -You will also see any lint errors in the console. - -### `npm test` - -Launches the test runner in the interactive watch mode.\ -See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. - -### `npm run build` - -Builds the app for production to the `build` folder.\ -It correctly bundles React in production mode and optimizes the build for the best performance. - -The build is minified and the filenames include the hashes.\ -Your app is ready to be deployed! - -See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. - -### `npm run eject` - -**Note: this is a one-way operation. Once you `eject`, you can’t go back!** - -If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. - -Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own. - -You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. - -## Learn More - -You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). - -To learn React, check out the [React documentation](https://reactjs.org/). diff --git a/packages/uikit-playground/package.json b/packages/uikit-playground/package.json deleted file mode 100644 index b9840deff6..0000000000 --- a/packages/uikit-playground/package.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "name": "@rocket.chat/uikit-playground", - "version": "0.31.22", - "homepage": "./", - "private": true, - "dependencies": { - "@codemirror/lang-javascript": "^6.1.5", - "@codemirror/lang-json": "^6.0.1", - "@codemirror/tooltip": "^0.19.16", - "@lezer/highlight": "^1.1.4", - "@rocket.chat/css-in-js": "^0.31.12", - "@rocket.chat/fuselage": "workspace:~", - "@rocket.chat/fuselage-hooks": "workspace:~", - "@rocket.chat/fuselage-polyfills": "workspace:~", - "@rocket.chat/fuselage-tokens": "workspace:~", - "@rocket.chat/fuselage-ui-kit": "workspace:~", - "@rocket.chat/icons": "workspace:~", - "@rocket.chat/logo": "workspace:~", - "@rocket.chat/styled": "workspace:~", - "@types/jest": "^29.5.0", - "@types/node": "~14.18.42", - "@types/react": "^17.0.57", - "@types/react-dom": "^17.0.19", - "codemirror": "^6.0.1", - "eslint4b-prebuilt": "^6.7.2", - "json5": "^2.2.3", - "react": "^17.0.2", - "react-beautiful-dnd": "^13.1.1", - "react-dom": "^17.0.2", - "react-router-dom": "^6.3.0", - "react-scripts": "^5.0.1", - "react-split-pane": "^0.1.92", - "react-virtuoso": "~3.1.5", - "typescript": "~5.0.4", - "use-subscription": "^1.7.0", - "web-vitals": "^2.1.4", - "webpack": "~5.78.0" - }, - "scripts": { - "lint": "lint", - "lint-and-fix": "lint-and-fix", - "lint-staged": "lint-staged", - "predeploy": "npm run build", - "deploy": "gh-pages -d build", - "start": "react-scripts start", - "build": "react-scripts build", - "eject": "react-scripts eject" - }, - "eslintConfig": { - "extends": [ - "react-app", - "react-app/jest" - ] - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - }, - "devDependencies": { - "@babel/eslint-parser": "~7.21.3", - "@rocket.chat/eslint-config-alt": "workspace:~", - "@types/react-beautiful-dnd": "^13.1.4", - "eslint": "~8.38.0", - "eslint-plugin-import": "~2.26.0", - "gh-pages": "^4.0.0", - "lint-all": "workspace:~", - "lint-staged": "~13.2.1", - "prettier": "~2.8.7" - }, - "postcss": { - "plugins": { - "postcss-plugin": {} - } - } -} diff --git a/packages/uikit-playground/public/favicon.ico b/packages/uikit-playground/public/favicon.ico deleted file mode 100644 index a11777cc471a4344702741ab1c8a588998b1311a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3870 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 baj7?x%VD!5Cxk2YbYLNVeiXvvpMCWYo=by@ diff --git a/packages/uikit-playground/public/index.html b/packages/uikit-playground/public/index.html deleted file mode 100644 index aa069f27cb..0000000000 --- a/packages/uikit-playground/public/index.html +++ /dev/null @@ -1,43 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> - <head> - <meta charset="utf-8" /> - <link rel="icon" href="%PUBLIC_URL%/favicon.ico" /> - <meta name="viewport" content="width=device-width, initial-scale=1" /> - <meta name="theme-color" content="#000000" /> - <meta - name="description" - content="Web site created using create-react-app" - /> - <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" /> - <!-- - manifest.json provides metadata used when your web app is installed on a - user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/ - --> - <link rel="manifest" href="%PUBLIC_URL%/manifest.json" /> - <!-- - Notice the use of %PUBLIC_URL% in the tags above. - It will be replaced with the URL of the `public` folder during the build. - Only files inside the `public` folder can be referenced from the HTML. - - Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will - work correctly both with client-side routing and a non-root public URL. - Learn how to configure a non-root public URL by running `npm run build`. - --> - <title>React App - - - -

- - - diff --git a/packages/uikit-playground/public/logo192.png b/packages/uikit-playground/public/logo192.png deleted file mode 100644 index fc44b0a3796c0e0a64c3d858ca038bd4570465d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5347 zcmZWtbyO6NvR-oO24RV%BvuJ&=?+<7=`LvyB&A_#M7mSDYw1v6DJkiYl9XjT!%$dLEBTQ8R9|wd3008in6lFF3GV-6mLi?MoP_y~}QUnaDCHI#t z7w^m$@6DI)|C8_jrT?q=f8D?0AM?L)Z}xAo^e^W>t$*Y0KlT5=@bBjT9kxb%-KNdk zeOS1tKO#ChhG7%{ApNBzE2ZVNcxbrin#E1TiAw#BlUhXllzhN$qWez5l;h+t^q#Eav8PhR2|T}y5kkflaK`ba-eoE+Z2q@o6P$)=&` z+(8}+-McnNO>e#$Rr{32ngsZIAX>GH??tqgwUuUz6kjns|LjsB37zUEWd|(&O!)DY zQLrq%Y>)Y8G`yYbYCx&aVHi@-vZ3|ebG!f$sTQqMgi0hWRJ^Wc+Ibv!udh_r%2|U) zPi|E^PK?UE!>_4`f`1k4hqqj_$+d!EB_#IYt;f9)fBOumGNyglU(ofY`yHq4Y?B%- zp&G!MRY<~ajTgIHErMe(Z8JG*;D-PJhd@RX@QatggM7+G(Lz8eZ;73)72Hfx5KDOE zkT(m}i2;@X2AT5fW?qVp?@WgN$aT+f_6eo?IsLh;jscNRp|8H}Z9p_UBO^SJXpZew zEK8fz|0Th%(Wr|KZBGTM4yxkA5CFdAj8=QSrT$fKW#tweUFqr0TZ9D~a5lF{)%-tTGMK^2tz(y2v$i%V8XAxIywrZCp=)83p(zIk6@S5AWl|Oa2hF`~~^W zI;KeOSkw1O#TiQ8;U7OPXjZM|KrnN}9arP)m0v$c|L)lF`j_rpG(zW1Qjv$=^|p*f z>)Na{D&>n`jOWMwB^TM}slgTEcjxTlUby89j1)|6ydRfWERn3|7Zd2&e7?!K&5G$x z`5U3uFtn4~SZq|LjFVrz$3iln-+ucY4q$BC{CSm7Xe5c1J<=%Oagztj{ifpaZk_bQ z9Sb-LaQMKp-qJA*bP6DzgE3`}*i1o3GKmo2pn@dj0;He}F=BgINo};6gQF8!n0ULZ zL>kC0nPSFzlcB7p41doao2F7%6IUTi_+!L`MM4o*#Y#0v~WiO8uSeAUNp=vA2KaR&=jNR2iVwG>7t%sG2x_~yXzY)7K& zk3p+O0AFZ1eu^T3s};B%6TpJ6h-Y%B^*zT&SN7C=N;g|#dGIVMSOru3iv^SvO>h4M=t-N1GSLLDqVTcgurco6)3&XpU!FP6Hlrmj}f$ zp95;b)>M~`kxuZF3r~a!rMf4|&1=uMG$;h^g=Kl;H&Np-(pFT9FF@++MMEx3RBsK?AU0fPk-#mdR)Wdkj)`>ZMl#^<80kM87VvsI3r_c@_vX=fdQ`_9-d(xiI z4K;1y1TiPj_RPh*SpDI7U~^QQ?%0&!$Sh#?x_@;ag)P}ZkAik{_WPB4rHyW#%>|Gs zdbhyt=qQPA7`?h2_8T;-E6HI#im9K>au*(j4;kzwMSLgo6u*}-K`$_Gzgu&XE)udQ zmQ72^eZd|vzI)~!20JV-v-T|<4@7ruqrj|o4=JJPlybwMg;M$Ud7>h6g()CT@wXm` zbq=A(t;RJ^{Xxi*Ff~!|3!-l_PS{AyNAU~t{h;(N(PXMEf^R(B+ZVX3 z8y0;0A8hJYp@g+c*`>eTA|3Tgv9U8#BDTO9@a@gVMDxr(fVaEqL1tl?md{v^j8aUv zm&%PX4^|rX|?E4^CkplWWNv*OKM>DxPa z!RJ)U^0-WJMi)Ksc!^ixOtw^egoAZZ2Cg;X7(5xZG7yL_;UJ#yp*ZD-;I^Z9qkP`} zwCTs0*%rIVF1sgLervtnUo&brwz?6?PXRuOCS*JI-WL6GKy7-~yi0giTEMmDs_-UX zo=+nFrW_EfTg>oY72_4Z0*uG>MnXP=c0VpT&*|rvv1iStW;*^={rP1y?Hv+6R6bxFMkxpWkJ>m7Ba{>zc_q zEefC3jsXdyS5??Mz7IET$Kft|EMNJIv7Ny8ZOcKnzf`K5Cd)&`-fTY#W&jnV0l2vt z?Gqhic}l}mCv1yUEy$%DP}4AN;36$=7aNI^*AzV(eYGeJ(Px-j<^gSDp5dBAv2#?; zcMXv#aj>%;MiG^q^$0MSg-(uTl!xm49dH!{X0){Ew7ThWV~Gtj7h%ZD zVN-R-^7Cf0VH!8O)uUHPL2mO2tmE*cecwQv_5CzWeh)ykX8r5Hi`ehYo)d{Jnh&3p z9ndXT$OW51#H5cFKa76c<%nNkP~FU93b5h-|Cb}ScHs@4Q#|}byWg;KDMJ#|l zE=MKD*F@HDBcX@~QJH%56eh~jfPO-uKm}~t7VkHxHT;)4sd+?Wc4* z>CyR*{w@4(gnYRdFq=^(#-ytb^5ESD?x<0Skhb%Pt?npNW1m+Nv`tr9+qN<3H1f<% zZvNEqyK5FgPsQ`QIu9P0x_}wJR~^CotL|n zk?dn;tLRw9jJTur4uWoX6iMm914f0AJfB@C74a;_qRrAP4E7l890P&{v<}>_&GLrW z)klculcg`?zJO~4;BBAa=POU%aN|pmZJn2{hA!d!*lwO%YSIzv8bTJ}=nhC^n}g(ld^rn#kq9Z3)z`k9lvV>y#!F4e{5c$tnr9M{V)0m(Z< z#88vX6-AW7T2UUwW`g<;8I$Jb!R%z@rCcGT)-2k7&x9kZZT66}Ztid~6t0jKb&9mm zpa}LCb`bz`{MzpZR#E*QuBiZXI#<`5qxx=&LMr-UUf~@dRk}YI2hbMsAMWOmDzYtm zjof16D=mc`^B$+_bCG$$@R0t;e?~UkF?7<(vkb70*EQB1rfUWXh$j)R2)+dNAH5%R zEBs^?N;UMdy}V};59Gu#0$q53$}|+q7CIGg_w_WlvE}AdqoS<7DY1LWS9?TrfmcvT zaypmplwn=P4;a8-%l^e?f`OpGb}%(_mFsL&GywhyN(-VROj`4~V~9bGv%UhcA|YW% zs{;nh@aDX11y^HOFXB$a7#Sr3cEtNd4eLm@Y#fc&j)TGvbbMwze zXtekX_wJqxe4NhuW$r}cNy|L{V=t#$%SuWEW)YZTH|!iT79k#?632OFse{+BT_gau zJwQcbH{b}dzKO?^dV&3nTILYlGw{27UJ72ZN){BILd_HV_s$WfI2DC<9LIHFmtyw? zQ;?MuK7g%Ym+4e^W#5}WDLpko%jPOC=aN)3!=8)s#Rnercak&b3ESRX3z{xfKBF8L z5%CGkFmGO@x?_mPGlpEej!3!AMddChabyf~nJNZxx!D&{@xEb!TDyvqSj%Y5@A{}9 zRzoBn0?x}=krh{ok3Nn%e)#~uh;6jpezhA)ySb^b#E>73e*frBFu6IZ^D7Ii&rsiU z%jzygxT-n*joJpY4o&8UXr2s%j^Q{?e-voloX`4DQyEK+DmrZh8A$)iWL#NO9+Y@!sO2f@rI!@jN@>HOA< z?q2l{^%mY*PNx2FoX+A7X3N}(RV$B`g&N=e0uvAvEN1W^{*W?zT1i#fxuw10%~))J zjx#gxoVlXREWZf4hRkgdHx5V_S*;p-y%JtGgQ4}lnA~MBz-AFdxUxU1RIT$`sal|X zPB6sEVRjGbXIP0U+?rT|y5+ev&OMX*5C$n2SBPZr`jqzrmpVrNciR0e*Wm?fK6DY& zl(XQZ60yWXV-|Ps!A{EF;=_z(YAF=T(-MkJXUoX zI{UMQDAV2}Ya?EisdEW;@pE6dt;j0fg5oT2dxCi{wqWJ<)|SR6fxX~5CzblPGr8cb zUBVJ2CQd~3L?7yfTpLNbt)He1D>*KXI^GK%<`bq^cUq$Q@uJifG>p3LU(!H=C)aEL zenk7pVg}0{dKU}&l)Y2Y2eFMdS(JS0}oZUuVaf2+K*YFNGHB`^YGcIpnBlMhO7d4@vV zv(@N}(k#REdul8~fP+^F@ky*wt@~&|(&&meNO>rKDEnB{ykAZ}k>e@lad7to>Ao$B zz<1(L=#J*u4_LB=8w+*{KFK^u00NAmeNN7pr+Pf+N*Zl^dO{LM-hMHyP6N!~`24jd zXYP|Ze;dRXKdF2iJG$U{k=S86l@pytLx}$JFFs8e)*Vi?aVBtGJ3JZUj!~c{(rw5>vuRF$`^p!P8w1B=O!skwkO5yd4_XuG^QVF z`-r5K7(IPSiKQ2|U9+`@Js!g6sfJwAHVd|s?|mnC*q zp|B|z)(8+mxXyxQ{8Pg3F4|tdpgZZSoU4P&9I8)nHo1@)9_9u&NcT^FI)6|hsAZFk zZ+arl&@*>RXBf-OZxhZerOr&dN5LW9@gV=oGFbK*J+m#R-|e6(Loz(;g@T^*oO)0R zN`N=X46b{7yk5FZGr#5&n1!-@j@g02g|X>MOpF3#IjZ_4wg{dX+G9eqS+Es9@6nC7 zD9$NuVJI}6ZlwtUm5cCAiYv0(Yi{%eH+}t)!E^>^KxB5^L~a`4%1~5q6h>d;paC9c zTj0wTCKrhWf+F#5>EgX`sl%POl?oyCq0(w0xoL?L%)|Q7d|Hl92rUYAU#lc**I&^6p=4lNQPa0 znQ|A~i0ip@`B=FW-Q;zh?-wF;Wl5!+q3GXDu-x&}$gUO)NoO7^$BeEIrd~1Dh{Tr` z8s<(Bn@gZ(mkIGnmYh_ehXnq78QL$pNDi)|QcT*|GtS%nz1uKE+E{7jdEBp%h0}%r zD2|KmYGiPa4;md-t_m5YDz#c*oV_FqXd85d@eub?9N61QuYcb3CnVWpM(D-^|CmkL z(F}L&N7qhL2PCq)fRh}XO@U`Yn<?TNGR4L(mF7#4u29{i~@k;pLsgl({YW5`Mo+p=zZn3L*4{JU;++dG9 X@eDJUQo;Ye2mwlRs?y0|+_a0zY+Zo%Dkae}+MySoIppb75o?vUW_?)>@g{U2`ERQIXV zeY$JrWnMZ$QC<=ii4X|@0H8`si75jB(ElJb00HAB%>SlLR{!zO|C9P3zxw_U8?1d8uRZ=({Ga4shyN}3 zAK}WA(ds|``G4jA)9}Bt2Hy0+f3rV1E6b|@?hpGA=PI&r8)ah|)I2s(P5Ic*Ndhn^ z*T&j@gbCTv7+8rpYbR^Ty}1AY)YH;p!m948r#%7x^Z@_-w{pDl|1S4`EM3n_PaXvK z1JF)E3qy$qTj5Xs{jU9k=y%SQ0>8E$;x?p9ayU0bZZeo{5Z@&FKX>}s!0+^>C^D#z z>xsCPvxD3Z=dP}TTOSJhNTPyVt14VCQ9MQFN`rn!c&_p?&4<5_PGm4a;WS&1(!qKE z_H$;dDdiPQ!F_gsN`2>`X}$I=B;={R8%L~`>RyKcS$72ai$!2>d(YkciA^J0@X%G4 z4cu!%Ps~2JuJ8ex`&;Fa0NQOq_nDZ&X;^A=oc1&f#3P1(!5il>6?uK4QpEG8z0Rhu zvBJ+A9RV?z%v?!$=(vcH?*;vRs*+PPbOQ3cdPr5=tOcLqmfx@#hOqX0iN)wTTO21jH<>jpmwRIAGw7`a|sl?9y9zRBh>(_%| zF?h|P7}~RKj?HR+q|4U`CjRmV-$mLW>MScKnNXiv{vD3&2@*u)-6P@h0A`eeZ7}71 zK(w%@R<4lLt`O7fs1E)$5iGb~fPfJ?WxhY7c3Q>T-w#wT&zW522pH-B%r5v#5y^CF zcC30Se|`D2mY$hAlIULL%-PNXgbbpRHgn<&X3N9W!@BUk@9g*P5mz-YnZBb*-$zMM z7Qq}ic0mR8n{^L|=+diODdV}Q!gwr?y+2m=3HWwMq4z)DqYVg0J~^}-%7rMR@S1;9 z7GFj6K}i32X;3*$SmzB&HW{PJ55kT+EI#SsZf}bD7nW^Haf}_gXciYKX{QBxIPSx2Ma? zHQqgzZq!_{&zg{yxqv3xq8YV+`S}F6A>Gtl39_m;K4dA{pP$BW0oIXJ>jEQ!2V3A2 zdpoTxG&V=(?^q?ZTj2ZUpDUdMb)T?E$}CI>r@}PFPWD9@*%V6;4Ag>D#h>!s)=$0R zRXvdkZ%|c}ubej`jl?cS$onl9Tw52rBKT)kgyw~Xy%z62Lr%V6Y=f?2)J|bZJ5(Wx zmji`O;_B+*X@qe-#~`HFP<{8$w@z4@&`q^Q-Zk8JG3>WalhnW1cvnoVw>*R@c&|o8 zZ%w!{Z+MHeZ*OE4v*otkZqz11*s!#s^Gq>+o`8Z5 z^i-qzJLJh9!W-;SmFkR8HEZJWiXk$40i6)7 zZpr=k2lp}SasbM*Nbn3j$sn0;rUI;%EDbi7T1ZI4qL6PNNM2Y%6{LMIKW+FY_yF3) zSKQ2QSujzNMSL2r&bYs`|i2Dnn z=>}c0>a}>|uT!IiMOA~pVT~R@bGlm}Edf}Kq0?*Af6#mW9f9!}RjW7om0c9Qlp;yK z)=XQs(|6GCadQbWIhYF=rf{Y)sj%^Id-ARO0=O^Ad;Ph+ z0?$eE1xhH?{T$QI>0JP75`r)U_$#%K1^BQ8z#uciKf(C701&RyLQWBUp*Q7eyn76} z6JHpC9}R$J#(R0cDCkXoFSp;j6{x{b&0yE@P7{;pCEpKjS(+1RQy38`=&Yxo%F=3y zCPeefABp34U-s?WmU#JJw23dcC{sPPFc2#J$ZgEN%zod}J~8dLm*fx9f6SpO zn^Ww3bt9-r0XaT2a@Wpw;C23XM}7_14#%QpubrIw5aZtP+CqIFmsG4`Cm6rfxl9n5 z7=r2C-+lM2AB9X0T_`?EW&Byv&K?HS4QLoylJ|OAF z`8atBNTzJ&AQ!>sOo$?^0xj~D(;kS$`9zbEGd>f6r`NC3X`tX)sWgWUUOQ7w=$TO&*j;=u%25ay-%>3@81tGe^_z*C7pb9y*Ed^H3t$BIKH2o+olp#$q;)_ zfpjCb_^VFg5fU~K)nf*d*r@BCC>UZ!0&b?AGk_jTPXaSnCuW110wjHPPe^9R^;jo3 zwvzTl)C`Zl5}O2}3lec=hZ*$JnkW#7enKKc)(pM${_$9Hc=Sr_A9Biwe*Y=T?~1CK z6eZ9uPICjy-sMGbZl$yQmpB&`ouS8v{58__t0$JP%i3R&%QR3ianbZqDs<2#5FdN@n5bCn^ZtH992~5k(eA|8|@G9u`wdn7bnpg|@{m z^d6Y`*$Zf2Xr&|g%sai#5}Syvv(>Jnx&EM7-|Jr7!M~zdAyjt*xl;OLhvW-a%H1m0 z*x5*nb=R5u><7lyVpNAR?q@1U59 zO+)QWwL8t zyip?u_nI+K$uh{y)~}qj?(w0&=SE^8`_WMM zTybjG=999h38Yes7}-4*LJ7H)UE8{mE(6;8voE+TYY%33A>S6`G_95^5QHNTo_;Ao ztIQIZ_}49%{8|=O;isBZ?=7kfdF8_@azfoTd+hEJKWE!)$)N%HIe2cplaK`ry#=pV z0q{9w-`i0h@!R8K3GC{ivt{70IWG`EP|(1g7i_Q<>aEAT{5(yD z=!O?kq61VegV+st@XCw475j6vS)_z@efuqQgHQR1T4;|-#OLZNQJPV4k$AX1Uk8Lm z{N*b*ia=I+MB}kWpupJ~>!C@xEN#Wa7V+7{m4j8c?)ChV=D?o~sjT?0C_AQ7B-vxqX30s0I_`2$in86#`mAsT-w?j{&AL@B3$;P z31G4(lV|b}uSDCIrjk+M1R!X7s4Aabn<)zpgT}#gE|mIvV38^ODy@<&yflpCwS#fRf9ZX3lPV_?8@C5)A;T zqmouFLFk;qIs4rA=hh=GL~sCFsXHsqO6_y~*AFt939UYVBSx1s(=Kb&5;j7cSowdE;7()CC2|-i9Zz+_BIw8#ll~-tyH?F3{%`QCsYa*b#s*9iCc`1P1oC26?`g<9))EJ3%xz+O!B3 zZ7$j~To)C@PquR>a1+Dh>-a%IvH_Y7^ys|4o?E%3`I&ADXfC8++hAdZfzIT#%C+Jz z1lU~K_vAm0m8Qk}K$F>|>RPK%<1SI0(G+8q~H zAsjezyP+u!Se4q3GW)`h`NPSRlMoBjCzNPesWJwVTY!o@G8=(6I%4XHGaSiS3MEBK zhgGFv6Jc>L$4jVE!I?TQuwvz_%CyO!bLh94nqK11C2W$*aa2ueGopG8DnBICVUORP zgytv#)49fVXDaR$SukloYC3u7#5H)}1K21=?DKj^U)8G;MS)&Op)g^zR2($<>C*zW z;X7`hLxiIO#J`ANdyAOJle4V%ppa*(+0i3w;8i*BA_;u8gOO6)MY`ueq7stBMJTB; z-a0R>hT*}>z|Gg}@^zDL1MrH+2hsR8 zHc}*9IvuQC^Ju)^#Y{fOr(96rQNPNhxc;mH@W*m206>Lo<*SaaH?~8zg&f&%YiOEG zGiz?*CP>Bci}!WiS=zj#K5I}>DtpregpP_tfZtPa(N<%vo^#WCQ5BTv0vr%Z{)0q+ z)RbfHktUm|lg&U3YM%lMUM(fu}i#kjX9h>GYctkx9Mt_8{@s%!K_EI zScgwy6%_fR?CGJQtmgNAj^h9B#zmaMDWgH55pGuY1Gv7D z;8Psm(vEPiwn#MgJYu4Ty9D|h!?Rj0ddE|&L3S{IP%H4^N!m`60ZwZw^;eg4sk6K{ ziA^`Sbl_4~f&Oo%n;8Ye(tiAdlZKI!Z=|j$5hS|D$bDJ}p{gh$KN&JZYLUjv4h{NY zBJ>X9z!xfDGY z+oh_Z&_e#Q(-}>ssZfm=j$D&4W4FNy&-kAO1~#3Im;F)Nwe{(*75(p=P^VI?X0GFakfh+X-px4a%Uw@fSbmp9hM1_~R>?Z8+ ziy|e9>8V*`OP}4x5JjdWp}7eX;lVxp5qS}0YZek;SNmm7tEeSF*-dI)6U-A%m6YvCgM(}_=k#a6o^%-K4{`B1+}O4x zztDT%hVb;v#?j`lTvlFQ3aV#zkX=7;YFLS$uIzb0E3lozs5`Xy zi~vF+%{z9uLjKvKPhP%x5f~7-Gj+%5N`%^=yk*Qn{`> z;xj&ROY6g`iy2a@{O)V(jk&8#hHACVDXey5a+KDod_Z&}kHM}xt7}Md@pil{2x7E~ zL$k^d2@Ec2XskjrN+IILw;#7((abu;OJii&v3?60x>d_Ma(onIPtcVnX@ELF0aL?T zSmWiL3(dOFkt!x=1O!_0n(cAzZW+3nHJ{2S>tgSK?~cFha^y(l@-Mr2W$%MN{#af8J;V*>hdq!gx=d0h$T7l}>91Wh07)9CTX zh2_ZdQCyFOQ)l(}gft0UZG`Sh2`x-w`5vC2UD}lZs*5 zG76$akzn}Xi))L3oGJ75#pcN=cX3!=57$Ha=hQ2^lwdyU#a}4JJOz6ddR%zae%#4& za)bFj)z=YQela(F#Y|Q#dp}PJghITwXouVaMq$BM?K%cXn9^Y@g43$=O)F&ZlOUom zJiad#dea;-eywBA@e&D6Pdso1?2^(pXiN91?jvcaUyYoKUmvl5G9e$W!okWe*@a<^ z8cQQ6cNSf+UPDx%?_G4aIiybZHHagF{;IcD(dPO!#=u zWfqLcPc^+7Uu#l(Bpxft{*4lv#*u7X9AOzDO z1D9?^jIo}?%iz(_dwLa{ex#T}76ZfN_Z-hwpus9y+4xaUu9cX}&P{XrZVWE{1^0yw zO;YhLEW!pJcbCt3L8~a7>jsaN{V3>tz6_7`&pi%GxZ=V3?3K^U+*ryLSb)8^IblJ0 zSRLNDvIxt)S}g30?s_3NX>F?NKIGrG_zB9@Z>uSW3k2es_H2kU;Rnn%j5qP)!XHKE zPB2mHP~tLCg4K_vH$xv`HbRsJwbZMUV(t=ez;Ec(vyHH)FbfLg`c61I$W_uBB>i^r z&{_P;369-&>23R%qNIULe=1~T$(DA`ev*EWZ6j(B$(te}x1WvmIll21zvygkS%vwG zzkR6Z#RKA2!z!C%M!O>!=Gr0(J0FP=-MN=5t-Ir)of50y10W}j`GtRCsXBakrKtG& zazmITDJMA0C51&BnLY)SY9r)NVTMs);1<=oosS9g31l{4ztjD3#+2H7u_|66b|_*O z;Qk6nalpqdHOjx|K&vUS_6ITgGll;TdaN*ta=M_YtyC)I9Tmr~VaPrH2qb6sd~=AcIxV+%z{E&0@y=DPArw zdV7z(G1hBx7hd{>(cr43^WF%4Y@PXZ?wPpj{OQ#tvc$pABJbvPGvdR`cAtHn)cSEV zrpu}1tJwQ3y!mSmH*uz*x0o|CS<^w%&KJzsj~DU0cLQUxk5B!hWE>aBkjJle8z~;s z-!A=($+}Jq_BTK5^B!`R>!MulZN)F=iXXeUd0w5lUsE5VP*H*oCy(;?S$p*TVvTxwAeWFB$jHyb0593)$zqalVlDX=GcCN1gU0 zlgU)I$LcXZ8Oyc2TZYTPu@-;7<4YYB-``Qa;IDcvydIA$%kHhJKV^m*-zxcvU4viy&Kr5GVM{IT>WRywKQ9;>SEiQD*NqplK-KK4YR`p0@JW)n_{TU3bt0 zim%;(m1=#v2}zTps=?fU5w^(*y)xT%1vtQH&}50ZF!9YxW=&7*W($2kgKyz1mUgfs zfV<*XVVIFnohW=|j+@Kfo!#liQR^x>2yQdrG;2o8WZR+XzU_nG=Ed2rK?ntA;K5B{ z>M8+*A4!Jm^Bg}aW?R?6;@QG@uQ8&oJ{hFixcfEnJ4QH?A4>P=q29oDGW;L;= z9-a0;g%c`C+Ai!UmK$NC*4#;Jp<1=TioL=t^YM)<<%u#hnnfSS`nq63QKGO1L8RzX z@MFDqs1z ztYmxDl@LU)5acvHk)~Z`RW7=aJ_nGD!mOSYD>5Odjn@TK#LY{jf?+piB5AM-CAoT_ z?S-*q7}wyLJzK>N%eMPuFgN)Q_otKP;aqy=D5f!7<=n(lNkYRXVpkB{TAYLYg{|(jtRqYmg$xH zjmq?B(RE4 zQx^~Pt}gxC2~l=K$$-sYy_r$CO(d=+b3H1MB*y_5g6WLaWTXn+TKQ|hNY^>Mp6k*$ zwkovomhu776vQATqT4blf~g;TY(MWCrf^^yfWJvSAB$p5l;jm@o#=!lqw+Lqfq>X= z$6~kxfm7`3q4zUEB;u4qa#BdJxO!;xGm)wwuisj{0y2x{R(IGMrsIzDY9LW>m!Y`= z04sx3IjnYvL<4JqxQ8f7qYd0s2Ig%`ytYPEMKI)s(LD}D@EY>x`VFtqvnADNBdeao zC96X+MxnwKmjpg{U&gP3HE}1=s!lv&D{6(g_lzyF3A`7Jn*&d_kL<;dAFx!UZ>hB8 z5A*%LsAn;VLp>3${0>M?PSQ)9s3}|h2e?TG4_F{}{Cs>#3Q*t$(CUc}M)I}8cPF6% z=+h(Kh^8)}gj(0}#e7O^FQ6`~fd1#8#!}LMuo3A0bN`o}PYsm!Y}sdOz$+Tegc=qT z8x`PH$7lvnhJp{kHWb22l;@7B7|4yL4UOOVM0MP_>P%S1Lnid)+k9{+3D+JFa#Pyf zhVc#&df87APl4W9X)F3pGS>@etfl=_E5tBcVoOfrD4hmVeTY-cj((pkn%n@EgN{0f zwb_^Rk0I#iZuHK!l*lN`ceJn(sI{$Fq6nN& zE<-=0_2WN}m+*ivmIOxB@#~Q-cZ>l136w{#TIJe478`KE7@=a{>SzPHsKLzYAyBQO zAtuuF$-JSDy_S@6GW0MOE~R)b;+0f%_NMrW(+V#c_d&U8Z9+ec4=HmOHw?gdjF(Lu zzra83M_BoO-1b3;9`%&DHfuUY)6YDV21P$C!Rc?mv&{lx#f8oc6?0?x zK08{WP65?#>(vPfA-c=MCY|%*1_<3D4NX zeVTi-JGl2uP_2@0F{G({pxQOXt_d{g_CV6b?jNpfUG9;8yle-^4KHRvZs-_2siata zt+d_T@U$&t*xaD22(fH(W1r$Mo?3dc%Tncm=C6{V9y{v&VT#^1L04vDrLM9qBoZ4@ z6DBN#m57hX7$C(=#$Y5$bJmwA$T8jKD8+6A!-IJwA{WOfs%s}yxUw^?MRZjF$n_KN z6`_bGXcmE#5e4Ym)aQJ)xg3Pg0@k`iGuHe?f(5LtuzSq=nS^5z>vqU0EuZ&75V%Z{ zYyhRLN^)$c6Ds{f7*FBpE;n5iglx5PkHfWrj3`x^j^t z7ntuV`g!9Xg#^3!x)l*}IW=(Tz3>Y5l4uGaB&lz{GDjm2D5S$CExLT`I1#n^lBH7Y zDgpMag@`iETKAI=p<5E#LTkwzVR@=yY|uBVI1HG|8h+d;G-qfuj}-ZR6fN>EfCCW z9~wRQoAPEa#aO?3h?x{YvV*d+NtPkf&4V0k4|L=uj!U{L+oLa(z#&iuhJr3-PjO3R z5s?=nn_5^*^Rawr>>Nr@K(jwkB#JK-=+HqwfdO<+P5byeim)wvqGlP-P|~Nse8=XF zz`?RYB|D6SwS}C+YQv+;}k6$-%D(@+t14BL@vM z2q%q?f6D-A5s$_WY3{^G0F131bbh|g!}#BKw=HQ7mx;Dzg4Z*bTLQSfo{ed{4}NZW zfrRm^Ca$rlE{Ue~uYv>R9{3smwATcdM_6+yWIO z*ZRH~uXE@#p$XTbCt5j7j2=86e{9>HIB6xDzV+vAo&B?KUiMP|ttOElepnl%|DPqL b{|{}U^kRn2wo}j7|0ATu<;8xA7zX}7|B6mN diff --git a/packages/uikit-playground/public/manifest.json b/packages/uikit-playground/public/manifest.json deleted file mode 100644 index 080d6c77ac..0000000000 --- a/packages/uikit-playground/public/manifest.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "short_name": "React App", - "name": "Create React App Sample", - "icons": [ - { - "src": "favicon.ico", - "sizes": "64x64 32x32 24x24 16x16", - "type": "image/x-icon" - }, - { - "src": "logo192.png", - "type": "image/png", - "sizes": "192x192" - }, - { - "src": "logo512.png", - "type": "image/png", - "sizes": "512x512" - } - ], - "start_url": ".", - "display": "standalone", - "theme_color": "#000000", - "background_color": "#ffffff" -} diff --git a/packages/uikit-playground/public/robots.txt b/packages/uikit-playground/public/robots.txt deleted file mode 100644 index e9e57dc4d4..0000000000 --- a/packages/uikit-playground/public/robots.txt +++ /dev/null @@ -1,3 +0,0 @@ -# https://www.robotstxt.org/robotstxt.html -User-agent: * -Disallow: diff --git a/packages/uikit-playground/src/App.css b/packages/uikit-playground/src/App.css deleted file mode 100644 index 10e4996c0f..0000000000 --- a/packages/uikit-playground/src/App.css +++ /dev/null @@ -1,39 +0,0 @@ -.App { - text-align: center; -} - -.App-logo { - height: 40vmin; - pointer-events: none; -} - -@media (prefers-reduced-motion: no-preference) { - .App-logo { - animation: App-logo-spin infinite 20s linear; - } -} - -.App-header { - background-color: #282c34; - min-height: 100vh; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - font-size: calc(10px + 2vmin); - color: white; -} - -.App-link { - color: #61dafb; -} - -@keyframes App-logo-spin { - from { - transform: rotate(0deg); - } - - to { - transform: rotate(360deg); - } -} diff --git a/packages/uikit-playground/src/App.tsx b/packages/uikit-playground/src/App.tsx deleted file mode 100644 index 750c4df479..0000000000 --- a/packages/uikit-playground/src/App.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import './App.css'; -import './cssVariables.css'; -import { BrowserRouter, Routes, Route } from 'react-router-dom'; - -import Playground from './Pages/Playground'; - -function App() { - return ( - - - } /> - } /> - - - ); -} - -export default App; diff --git a/packages/uikit-playground/src/Components/CodeEditor/Extensions/HighlightStyle.ts b/packages/uikit-playground/src/Components/CodeEditor/Extensions/HighlightStyle.ts deleted file mode 100644 index 3329c3c6a8..0000000000 --- a/packages/uikit-playground/src/Components/CodeEditor/Extensions/HighlightStyle.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { HighlightStyle, syntaxHighlighting } from '@codemirror/language'; -import { tags as t } from '@lezer/highlight'; - -const highLightStyle = () => { - const style = HighlightStyle.define([ - { tag: t.literal, color: 'var(--RCPG-primary-color)' }, - { tag: t.bool, color: 'var(--RCPG-tertary-color)' }, - { tag: t.number, color: 'var(--RCPG-secondary-color)' }, - ]); - - return syntaxHighlighting(style); -}; - -export default highLightStyle(); diff --git a/packages/uikit-playground/src/Components/CodeEditor/Extensions/basicSetup.ts b/packages/uikit-playground/src/Components/CodeEditor/Extensions/basicSetup.ts deleted file mode 100644 index e5973a7922..0000000000 --- a/packages/uikit-playground/src/Components/CodeEditor/Extensions/basicSetup.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { - completionKeymap, - closeBrackets, - closeBracketsKeymap, -} from '@codemirror/autocomplete'; -import { - defaultKeymap, - history, - historyKeymap, - indentWithTab, -} from '@codemirror/commands'; -import { - defaultHighlightStyle, - syntaxHighlighting, - indentOnInput, - bracketMatching, - foldGutter, - foldKeymap, -} from '@codemirror/language'; -import { lintKeymap } from '@codemirror/lint'; -import { searchKeymap, highlightSelectionMatches } from '@codemirror/search'; -import type { Extension } from '@codemirror/state'; -import { - keymap, - drawSelection, - dropCursor, - rectangularSelection, - crosshairCursor, - lineNumbers, - EditorView, -} from '@codemirror/view'; - -const basicSetup: Extension = (() => [ - lineNumbers(), - history(), - foldGutter(), - drawSelection(), - dropCursor(), - indentOnInput(), - EditorView.lineWrapping, - syntaxHighlighting(defaultHighlightStyle, { fallback: true }), - bracketMatching(), - closeBrackets(), - rectangularSelection(), - crosshairCursor(), - highlightSelectionMatches(), - keymap.of([ - ...closeBracketsKeymap, - ...defaultKeymap, - ...searchKeymap, - ...historyKeymap, - ...foldKeymap, - ...completionKeymap, - ...lintKeymap, - indentWithTab, - ]), -])(); - -export default basicSetup; diff --git a/packages/uikit-playground/src/Components/CodeEditor/Extensions/index.ts b/packages/uikit-playground/src/Components/CodeEditor/Extensions/index.ts deleted file mode 100644 index 9dda5b45b5..0000000000 --- a/packages/uikit-playground/src/Components/CodeEditor/Extensions/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { javascript } from '@codemirror/lang-javascript'; - -import highlightStyle from './HighlightStyle'; -import basicSetup from './basicSetup'; -import lint from './lint'; -import theme from './theme'; - -const extensions = [highlightStyle, javascript(), lint, basicSetup, ...theme]; - -export default extensions; diff --git a/packages/uikit-playground/src/Components/CodeEditor/Extensions/lint.ts b/packages/uikit-playground/src/Components/CodeEditor/Extensions/lint.ts deleted file mode 100644 index d8eb7870f0..0000000000 --- a/packages/uikit-playground/src/Components/CodeEditor/Extensions/lint.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { esLint } from '@codemirror/lang-javascript'; -import { lintGutter, linter } from '@codemirror/lint'; -import Linter from 'eslint4b-prebuilt'; - -export default [lintGutter(), linter(esLint(new Linter()))]; diff --git a/packages/uikit-playground/src/Components/CodeEditor/Extensions/theme.ts b/packages/uikit-playground/src/Components/CodeEditor/Extensions/theme.ts deleted file mode 100644 index 71938add61..0000000000 --- a/packages/uikit-playground/src/Components/CodeEditor/Extensions/theme.ts +++ /dev/null @@ -1,41 +0,0 @@ -import type { Extension } from '@codemirror/state'; -import { EditorView } from '@codemirror/view'; - -const gutters: Extension = EditorView.theme({ - '.cm-gutters': { - backgroundColor: 'transparent', - border: 'none', - userSelect: 'none', - minWidth: '32px', - display: 'flex', - justifyContent: 'flex-end', - }, - - '.cm-activeLineGutter': { - backgroundColor: 'transparent', - }, -}); - -const selection: Extension = EditorView.theme({ - '.cm-selectionBackground': { - backgroundColor: 'var(--RCPG-secondary-color) !important', - opacity: 0.3, - }, - - '.cm-selectionMatch': { - backgroundColor: '#74808930 !important', - }, - - '.cm-matchingBracket': { - backgroundColor: 'transparent !important', - border: '1px solid #1d74f580', - }, -}); - -const line: Extension = EditorView.theme({ - '.cm-activeLine': { - backgroundColor: 'transparent !important', - }, -}); - -export default [gutters, selection, line] as const; diff --git a/packages/uikit-playground/src/Components/CodeEditor/index.tsx b/packages/uikit-playground/src/Components/CodeEditor/index.tsx deleted file mode 100644 index bb56002376..0000000000 --- a/packages/uikit-playground/src/Components/CodeEditor/index.tsx +++ /dev/null @@ -1,68 +0,0 @@ -import type { Extension } from '@codemirror/state'; -import { Box } from '@rocket.chat/fuselage'; -import { useDebouncedValue } from '@rocket.chat/fuselage-hooks'; -import json5 from 'json5'; -import { useEffect, useContext } from 'react'; - -import { docAction, context } from '../../Context'; -import useCodeMirror from '../../hooks/useCodeMirror'; -import codePrettier from '../../utils/codePrettier'; - -type CodeMirrorProps = { - extensions?: Extension[]; -}; - -const CodeEditor = ({ extensions }: CodeMirrorProps) => { - const { state, dispatch } = useContext(context); - const { editor, changes, setValue } = useCodeMirror( - extensions, - json5.stringify(state.doc.payload, undefined, 4) - ); - const debounceValue = useDebouncedValue(changes?.value, 1500); - - useEffect(() => { - if (!changes?.isDispatch) { - try { - const parsedCode = json5.parse(changes.value); - dispatch( - docAction({ - payload: parsedCode, - changedByEditor: false, - }) - ); - - dispatch(docAction({ payload: parsedCode })); - } catch (e) { - console.log(e); - // do nothing - } - } - }, [changes?.value]); - - useEffect(() => { - if (!changes?.isDispatch) { - try { - const prettierCode = codePrettier(changes.value, changes.cursor); - setValue(prettierCode.formatted, { - cursor: prettierCode.cursorOffset, - }); - } catch (e) { - // do nothing - } - } - }, [debounceValue]); - - useEffect(() => { - if (!state.doc.changedByEditor) { - setValue(JSON.stringify(state.doc.payload, undefined, 4), {}); - } - }, [state.doc.payload]); - - return ( - <> - - - ); -}; - -export default CodeEditor; diff --git a/packages/uikit-playground/src/Components/ComponentSideBar/ScrollableSideBar.tsx b/packages/uikit-playground/src/Components/ComponentSideBar/ScrollableSideBar.tsx deleted file mode 100644 index d0cef58652..0000000000 --- a/packages/uikit-playground/src/Components/ComponentSideBar/ScrollableSideBar.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { css } from '@rocket.chat/css-in-js'; -import { Scrollable, Box } from '@rocket.chat/fuselage'; -import type { FC } from 'react'; -import React from 'react'; - -import BlocksTree from '../../Payload/BlocksTree'; -import DropDown from '../DropDown'; - -const ScrollableSideBar: FC = () => ( - - - - - -); - -export default ScrollableSideBar; diff --git a/packages/uikit-playground/src/Components/ComponentSideBar/SideBar.tsx b/packages/uikit-playground/src/Components/ComponentSideBar/SideBar.tsx deleted file mode 100644 index ef58fbc732..0000000000 --- a/packages/uikit-playground/src/Components/ComponentSideBar/SideBar.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import { css } from '@rocket.chat/css-in-js'; -import { Box } from '@rocket.chat/fuselage'; -import type { FC } from 'react'; -import React, { useEffect, useContext } from 'react'; - -import { context, sidebarToggleAction } from '../../Context'; -import ScrollableSideBar from './ScrollableSideBar'; -import SliderBtn from './SliderBtn'; - -const SideBar: FC = () => { - const { state, dispatch } = useContext(context); - - useEffect(() => { - dispatch(sidebarToggleAction(false)); - }, [state?.isMobile, dispatch]); - - const slide = state?.isMobile - ? css` - width: 100%; - user-select: none; - transform: translateX(${state?.sideBarToggle ? '0' : '-100%'}); - transition: var(--animation-default); - ` - : css` - width: var(--sidebar-width); - user-select: none; - transition: var(--animation-default); - `; - - return ( - - - - - ); -}; - -export default SideBar; diff --git a/packages/uikit-playground/src/Components/ComponentSideBar/SliderBtn.tsx b/packages/uikit-playground/src/Components/ComponentSideBar/SliderBtn.tsx deleted file mode 100644 index 0f13639581..0000000000 --- a/packages/uikit-playground/src/Components/ComponentSideBar/SliderBtn.tsx +++ /dev/null @@ -1,116 +0,0 @@ -import { css } from '@rocket.chat/css-in-js'; -import { Box, Label } from '@rocket.chat/fuselage'; -import type { FC } from 'react'; -import React, { useContext } from 'react'; - -import { context, sidebarToggleAction } from '../../Context'; - -const SliderBtn: FC = () => { - const { - state: { sideBarToggle, isMobile }, - dispatch, - } = useContext(context); - const slideBtnAnimation = sideBarToggle - ? css` - clip-path: polygon( - 10% 0, - 50% 40%, - 90% 0, - 100% 10%, - 60% 50%, - 100% 90%, - 90% 100%, - 50% 60%, - 10% 100%, - 0 90%, - 40% 50%, - 0 10% - ); - cursor: pointer; - transition: var(--animation-default); - ` - : css` - clip-path: polygon( - 32% 35%, - 32% 35%, - 79% 0, - 87% 10%, - 32% 50%, - 87% 90%, - 79% 100%, - 32% 64%, - 32% 65%, - 13% 50%, - 13% 50%, - 13% 50% - ); - transform: rotate(180deg); - transition: var(--animation-default); - `; - - // eslint-disable-next-line no-nested-ternary - const toggleStyle = !isMobile - ? css` - left: 0px; - ` - : sideBarToggle - ? css` - right: 0; - transition: var(--animation-default); - ` - : css` - right: 0; - transform: translateX(100%); - cursor: pointer; - transition: var(--animation-default); - `; - - return ( - - !sideBarToggle && dispatch(sidebarToggleAction(!sideBarToggle)) - } - zIndex={1} - className={toggleStyle} - > - - {isMobile && ( - - sideBarToggle && dispatch(sidebarToggleAction(!sideBarToggle)) - } - className={css` - cursor: pointer; - `} - > - - - )} - - ); -}; - -export default SliderBtn; diff --git a/packages/uikit-playground/src/Components/ComponentSideBar/index.tsx b/packages/uikit-playground/src/Components/ComponentSideBar/index.tsx deleted file mode 100644 index c90236635b..0000000000 --- a/packages/uikit-playground/src/Components/ComponentSideBar/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { default } from './SideBar'; diff --git a/packages/uikit-playground/src/Components/Draggable/DraggableList.tsx b/packages/uikit-playground/src/Components/Draggable/DraggableList.tsx deleted file mode 100644 index 76e7af1553..0000000000 --- a/packages/uikit-playground/src/Components/Draggable/DraggableList.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import type { LayoutBlock } from '@rocket.chat/ui-kit'; -import * as React from 'react'; -import type { OnDragEndResponder } from 'react-beautiful-dnd'; -import { DragDropContext, Droppable } from 'react-beautiful-dnd'; - -import DraggableListItem from './DraggableListItem'; - -export type Block = { - id: string; - payload: LayoutBlock; -}; - -export type DraggableListProps = { - blocks: Block[]; - surface?: number; - onDragEnd: OnDragEndResponder; -}; - -const DraggableList = React.memo( - ({ blocks, surface, onDragEnd }: DraggableListProps) => ( - <> - - <> - - {(provided) => ( -
- <> - {blocks.map((block, index) => ( - - ))} - {provided.placeholder} - -
- )} -
- -
- - ) -); - -export default DraggableList; diff --git a/packages/uikit-playground/src/Components/Draggable/DraggableListItem.tsx b/packages/uikit-playground/src/Components/Draggable/DraggableListItem.tsx deleted file mode 100644 index 7751c295a4..0000000000 --- a/packages/uikit-playground/src/Components/Draggable/DraggableListItem.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import * as React from 'react'; -import { Draggable } from 'react-beautiful-dnd'; - -import RenderPayload from '../Preview/Display/RenderPayload/RenderPayload'; -import type { Block } from './DraggableList'; - -export type DraggableListItemProps = { - block: Block; - surface: number; - index: number; -}; - -const DraggableListItem = ({ - block, - surface, - index, -}: DraggableListItemProps) => ( - - {(provided) => ( -
- -
- )} -
-); - -export default DraggableListItem; diff --git a/packages/uikit-playground/src/Components/DropDown/DropDown.tsx b/packages/uikit-playground/src/Components/DropDown/DropDown.tsx deleted file mode 100644 index 33984572c1..0000000000 --- a/packages/uikit-playground/src/Components/DropDown/DropDown.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { Box } from '@rocket.chat/fuselage'; -import React, { Fragment } from 'react'; - -import Items from './Items'; -import type { Item, ItemBranch } from './types'; - -interface DropDownProps { - readonly BlocksTree: Item; -} - -const DropDown = ({ BlocksTree }: DropDownProps) => { - const layer = 1; - - const recursiveComponentTree = (branch: ItemBranch, layer: number) => ( - - {branch.branches && - branch.branches.map((branch: ItemBranch, index: number) => ( - - {recursiveComponentTree(branch, layer + 1)} - - ))} - - ); - - return ( - - {BlocksTree.map((branch: ItemBranch, i: number) => ( - {recursiveComponentTree(branch, layer)} - ))} - - ); -}; - -export default DropDown; diff --git a/packages/uikit-playground/src/Components/DropDown/Items.tsx b/packages/uikit-playground/src/Components/DropDown/Items.tsx deleted file mode 100644 index c9f04995c0..0000000000 --- a/packages/uikit-playground/src/Components/DropDown/Items.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import { css } from '@rocket.chat/css-in-js'; -import { Box, Label, Chevron } from '@rocket.chat/fuselage'; -import React, { useState, useContext } from 'react'; - -import { context, docAction } from '../../Context'; -import ItemsIcon from './ItemsIcon'; -import { itemStyle, labelStyle } from './itemsStyle'; -import type { ItemProps } from './types'; - -const Items = ({ label, children, layer, payload }: ItemProps) => { - const [isOpen, toggleItemOpen] = useState(layer === 1); - const [hover, setHover] = useState(false); - const { state, dispatch } = useContext(context); - - const itemClickHandler = () => { - toggleItemOpen(!isOpen); - payload && - dispatch( - docAction({ - payload: [...state.doc.payload, payload[0]], - changedByEditor: false, - }) - ); - }; - - return ( - - setHover(true)} - onMouseLeave={() => setHover(false)} - onClick={itemClickHandler} - > - - {children && children.length > 0 && ( - - - - )} - - - - - - - {isOpen && children} - - ); -}; - -export default Items; diff --git a/packages/uikit-playground/src/Components/DropDown/ItemsIcon.tsx b/packages/uikit-playground/src/Components/DropDown/ItemsIcon.tsx deleted file mode 100644 index 2a4530f716..0000000000 --- a/packages/uikit-playground/src/Components/DropDown/ItemsIcon.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { Icon } from '@rocket.chat/fuselage'; -import React from 'react'; - -const ItemsIcon = ({ - layer, - lastNode, - hover, -}: { - layer: number; - lastNode: boolean; - hover: boolean; -}) => { - const selectIcon = (layer: number, hover: boolean) => { - if (layer === 1) { - return ( - - ); - } - if (lastNode) { - return ; - } - return ( - - ); - }; - return <>{selectIcon(layer, hover)}; -}; - -export default ItemsIcon; diff --git a/packages/uikit-playground/src/Components/DropDown/index.tsx b/packages/uikit-playground/src/Components/DropDown/index.tsx deleted file mode 100644 index d76df1b0ff..0000000000 --- a/packages/uikit-playground/src/Components/DropDown/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { default } from './DropDown'; diff --git a/packages/uikit-playground/src/Components/DropDown/itemsStyle.ts b/packages/uikit-playground/src/Components/DropDown/itemsStyle.ts deleted file mode 100644 index da9c9ff0b2..0000000000 --- a/packages/uikit-playground/src/Components/DropDown/itemsStyle.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { css } from '@rocket.chat/css-in-js'; - -export const itemStyle = (layer: number, hover: boolean) => { - const style = css` - cursor: pointer; - padding-left: ${10 + (layer - 1) * 16}px; - background-color: ${hover ? 'var(--RCPG-primary-color)' : 'transparent'}; - `; - return style; -}; - -export const labelStyle = (layer: number, hover: boolean) => { - let customStyle; - const basicStyle = css` - cursor: pointer !important; - padding-left: 4px !important; - `; - switch (layer) { - case 1: - customStyle = css` - font-weight: 700; - font-size: 14px; - letter-spacing: 0.3px; - color: ${hover ? '#fff' : '#999'}; - text-transform: uppercase; - `; - break; - case 2: - customStyle = css` - letter-spacing: 0.1px; - font-size: 12px; - color: ${hover ? '#fff' : '#555'}; - text-transform: capitalize; - `; - break; - default: - customStyle = css` - font-size: 12px; - color: ${hover ? '#fff' : '#555'}; - text-transform: capitalize; - `; - break; - } - return [customStyle, basicStyle]; -}; diff --git a/packages/uikit-playground/src/Components/DropDown/types.ts b/packages/uikit-playground/src/Components/DropDown/types.ts deleted file mode 100644 index 3b0c505d38..0000000000 --- a/packages/uikit-playground/src/Components/DropDown/types.ts +++ /dev/null @@ -1,16 +0,0 @@ -import type { LayoutBlock } from '@rocket.chat/ui-kit'; - -export type ItemProps = { - label: string; - layer: number; - payload?: readonly LayoutBlock[]; - children?: ReadonlyArray; -}; - -export type ItemBranch = { - label: string; - branches?: Item; - payload?: readonly LayoutBlock[]; -}; - -export type Item = ItemBranch[]; diff --git a/packages/uikit-playground/src/Components/NavBar/BurgerIcon/BurgerIcon.tsx b/packages/uikit-playground/src/Components/NavBar/BurgerIcon/BurgerIcon.tsx deleted file mode 100644 index 4c1409153c..0000000000 --- a/packages/uikit-playground/src/Components/NavBar/BurgerIcon/BurgerIcon.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { usePrefersReducedMotion } from '@rocket.chat/fuselage-hooks'; -import type { ReactElement, ReactNode } from 'react'; -import React, { useContext } from 'react'; - -import { context } from '../../../Context'; -import Line from './Line'; -import Wrapper from './Wrapper'; - -const BurgerIcon = ({ children }: { children?: ReactNode }): ReactElement => { - const isReducedMotionPreferred = usePrefersReducedMotion(); - const { - state: { navMenuToggle }, - } = useContext(context); - - return ( - - - - - {children} - - ); -}; - -export default BurgerIcon; diff --git a/packages/uikit-playground/src/Components/NavBar/BurgerIcon/Line.tsx b/packages/uikit-playground/src/Components/NavBar/BurgerIcon/Line.tsx deleted file mode 100644 index d970bf55ba..0000000000 --- a/packages/uikit-playground/src/Components/NavBar/BurgerIcon/Line.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import { css } from '@rocket.chat/css-in-js'; -import { Box } from '@rocket.chat/fuselage'; -import type { ReactElement } from 'react'; -import React from 'react'; - -const Line = ({ - animated, - moved, -}: { - animated: boolean; - moved?: boolean; -}): ReactElement => { - const animatedStyle = animated - ? css` - will-change: transform; - transition: transform 0.1s ease-out; - ` - : ''; - - const movedStyle = moved - ? css` - &:nth-child(1), - &:nth-child(3) { - transform-origin: 50%, 50%, 0; - } - &:nth-child(1) { - transform: translate(-25%, 3px) rotate(-45deg) scale(0.5, 1); - } - [dir='rtl'] &:nth-child(1) { - transform: translate(25%, 3px) rotate(45deg) scale(0.5, 1); - } - &:nth-child(3) { - transform: translate(-25%, -3px) rotate(45deg) scale(0.5, 1); - } - [dir='rtl'] &:nth-child(3) { - transform: translate(25%, -3px) rotate(-45deg) scale(0.5, 1); - } - ` - : ''; - - return ( -