diff --git a/.changeset/spicy-nails-fix.md b/.changeset/spicy-nails-fix.md new file mode 100644 index 0000000000..b958127ce1 --- /dev/null +++ b/.changeset/spicy-nails-fix.md @@ -0,0 +1,6 @@ +--- +'@swisspost/internet-header': patch +--- + +Fixed focus trap on overlay of the breadcrumb. +Added a focus trap on search overlay diff --git a/packages/internet-header/cypress/e2e/breadcrumbs.cy.ts b/packages/internet-header/cypress/e2e/breadcrumbs.cy.ts index 83b1380625..b75b0054fb 100644 --- a/packages/internet-header/cypress/e2e/breadcrumbs.cy.ts +++ b/packages/internet-header/cypress/e2e/breadcrumbs.cy.ts @@ -14,8 +14,8 @@ describe('breadcrumb', () => { cy.get('@breadcrumbs') .find('div.overlay') .should('exist') - .find('div.overlay-container') - .should('have.class', 'loaded'); + .find('[role=dialog].loaded', { timeout: 30000 }) + .should('exist'); cy.get('@breadcrumbs') .find('div.overlay') diff --git a/packages/internet-header/cypress/e2e/header.cy.ts b/packages/internet-header/cypress/e2e/header.cy.ts index cce02ac3f8..84aa623c4d 100644 --- a/packages/internet-header/cypress/e2e/header.cy.ts +++ b/packages/internet-header/cypress/e2e/header.cy.ts @@ -9,7 +9,7 @@ describe('header', () => { context('initial state', () => { it('renders', () => { - cy.get('swisspost-internet-header').should('have.class', 'hydrated'); + cy.get('swisspost-internet-header', { timeout: 30000 }).should('have.class', 'hydrated'); }); it(`has nav item 'Briefe versenden' selected`, () => { diff --git a/packages/internet-header/package.json b/packages/internet-header/package.json index d77eb1c20b..9ea2ba4efc 100644 --- a/packages/internet-header/package.json +++ b/packages/internet-header/package.json @@ -27,7 +27,7 @@ "loader/" ], "scripts": { - "dev": "stencil build --serve --port 9310 --watch --docs-readme", + "dev": "stencil build --serve --port 9310 --watch --docs-readme --dev", "start": "stencil build --watch --docs-readme", "build": "stencil build --docs-readme", "clean": "rimraf www dist loader", @@ -46,7 +46,6 @@ "body-scroll-lock": "4.0.0-beta.0", "iframe-resizer": "4.3.11", "jquery": "3.7.1", - "tabbable": "6.2.0", "throttle-debounce": "5.0.0", "url-polyfill": "1.1.12" }, @@ -71,6 +70,7 @@ "cypress-storybook": "0.5.1", "eslint": "8.57.0", "eslint-plugin-react": "7.34.1", + "focus-trap": "7.5.4", "globby": "14.0.1", "jest": "29.7.0", "jest-environment-jsdom": "29.7.0", diff --git a/packages/internet-header/src/components.d.ts b/packages/internet-header/src/components.d.ts index 849cc5c00c..52311ab7a5 100644 --- a/packages/internet-header/src/components.d.ts +++ b/packages/internet-header/src/components.d.ts @@ -18,6 +18,13 @@ export { StickynessOptions } from "./models/implementor.model"; export { Environment, ICustomConfig } from "./models/general.model"; export { IAvailableLanguage } from "./models/language.model"; export namespace Components { + /** + * Trap the focus inside a specific container. + * @param active activate or deactivate the focus trap + */ + interface FocusTrap { + "active": boolean; + } interface PostKlpLoginWidget { /** * Override the logout-url provided by the portal config. @@ -193,6 +200,16 @@ export interface SwisspostInternetHeaderCustomEvent extends CustomEvent { target: HTMLSwisspostInternetHeaderElement; } declare global { + /** + * Trap the focus inside a specific container. + * @param active activate or deactivate the focus trap + */ + interface HTMLFocusTrapElement extends Components.FocusTrap, HTMLStencilElement { + } + var HTMLFocusTrapElement: { + prototype: HTMLFocusTrapElement; + new (): HTMLFocusTrapElement; + }; interface HTMLPostKlpLoginWidgetElement extends Components.PostKlpLoginWidget, HTMLStencilElement { } var HTMLPostKlpLoginWidgetElement: { @@ -300,6 +317,7 @@ declare global { new (): HTMLSwisspostInternetHeaderElement; }; interface HTMLElementTagNameMap { + "focus-trap": HTMLFocusTrapElement; "post-klp-login-widget": HTMLPostKlpLoginWidgetElement; "post-language-switch": HTMLPostLanguageSwitchElement; "post-logo": HTMLPostLogoElement; @@ -313,6 +331,13 @@ declare global { } } declare namespace LocalJSX { + /** + * Trap the focus inside a specific container. + * @param active activate or deactivate the focus trap + */ + interface FocusTrap { + "active"?: boolean; + } interface PostKlpLoginWidget { /** * Override the logout-url provided by the portal config. @@ -450,6 +475,7 @@ declare namespace LocalJSX { "stickyness"?: StickynessOptions; } interface IntrinsicElements { + "focus-trap": FocusTrap; "post-klp-login-widget": PostKlpLoginWidget; "post-language-switch": PostLanguageSwitch; "post-logo": PostLogo; @@ -466,6 +492,11 @@ export { LocalJSX as JSX }; declare module "@stencil/core" { export namespace JSX { interface IntrinsicElements { + /** + * Trap the focus inside a specific container. + * @param active activate or deactivate the focus trap + */ + "focus-trap": LocalJSX.FocusTrap & JSXBase.HTMLAttributes; "post-klp-login-widget": LocalJSX.PostKlpLoginWidget & JSXBase.HTMLAttributes; "post-language-switch": LocalJSX.PostLanguageSwitch & JSXBase.HTMLAttributes; "post-logo": LocalJSX.PostLogo & JSXBase.HTMLAttributes; diff --git a/packages/internet-header/src/components/post-internet-breadcrumbs/components/focus-trap.component.tsx b/packages/internet-header/src/components/post-internet-breadcrumbs/components/focus-trap.component.tsx deleted file mode 100644 index 84f46c4f5d..0000000000 --- a/packages/internet-header/src/components/post-internet-breadcrumbs/components/focus-trap.component.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { FunctionalComponent, h } from '@stencil/core'; -import { tabbable } from 'tabbable'; - -let key = 0; - -/** - * Trap the focus inside a specific container by prepending/appending two focus trap - * input boxes who return the focus into the container. - * - * @param props active: activate or deactivate the focus trap - * @param children Child nodes - * @returns - */ -export const FocusTrap: FunctionalComponent<{ active?: boolean }> = (props, children) => { - // Default value for active is true - const active = props.active ?? false; - - const handleFocusIn = (event: FocusEvent, mode: 'first' | 'last') => { - if (children.length === 0) return; - - // Try to get a list of tabbable elements - const containerIndex = mode === 'first' ? 0 : children.length - 1; - const container = children[containerIndex].$elm$; - const focusable = tabbable(container); - - if (focusable.length === 0) return; - - // We can trap the focus, cancel the event - event.preventDefault(); - event.stopPropagation(); - - // Select the appropriate element from the list - const focusIndex = mode === 'first' ? 0 : focusable.length - 1; - let focusElement = focusable[focusIndex]; - focusElement.focus(); - }; - - key++; - - return [ - active && handleFocusIn(e, 'last')} - />, - children, - active && handleFocusIn(e, 'first')} - />, - ]; -}; diff --git a/packages/internet-header/src/components/post-internet-breadcrumbs/components/overlay.component.tsx b/packages/internet-header/src/components/post-internet-breadcrumbs/components/overlay.component.tsx index 3db02c6559..78ded2595a 100644 --- a/packages/internet-header/src/components/post-internet-breadcrumbs/components/overlay.component.tsx +++ b/packages/internet-header/src/components/post-internet-breadcrumbs/components/overlay.component.tsx @@ -1,7 +1,6 @@ import { h } from '@stencil/core'; import { SvgIcon } from '../../../utils/svg-icon.component'; import { IBreadcrumbOverlay } from '../../../models/breadcrumbs.model'; -import { FocusTrap } from './focus-trap.component'; /** * Overlay implementation with focus trap according to @@ -25,13 +24,8 @@ export const OverlayComponent = (props: { ref={e => e !== undefined && props.overlayRef(e)} > + ); } diff --git a/packages/internet-header/src/components/post-search/readme.md b/packages/internet-header/src/components/post-search/readme.md index c4242e7d18..238b2b8d3c 100644 --- a/packages/internet-header/src/components/post-search/readme.md +++ b/packages/internet-header/src/components/post-search/readme.md @@ -47,9 +47,14 @@ Boolean indicating open state of the component - [swisspost-internet-header](../post-internet-header) +### Depends on + +- [focus-trap](../shared) + ### Graph ```mermaid graph TD; + post-search --> focus-trap swisspost-internet-header --> post-search style post-search fill:#f9f,stroke:#333,stroke-width:4px ``` diff --git a/packages/internet-header/src/components/shared/focus-trap.tsx b/packages/internet-header/src/components/shared/focus-trap.tsx new file mode 100644 index 0000000000..4545f6fc75 --- /dev/null +++ b/packages/internet-header/src/components/shared/focus-trap.tsx @@ -0,0 +1,55 @@ +import { Component, Element, Prop, State, h, Host, Watch } from '@stencil/core'; +import * as focusTrap from 'focus-trap'; + +/** + * Trap the focus inside a specific container. + * + * @param active activate or deactivate the focus trap + */ +@Component({ + tag: 'focus-trap', + shadow: false, +}) +export class FocusTrap { + @Prop() active: boolean = false; + // eslint-disable-next-line @stencil-community/element-type + @Element() host: HTMLElement; + @State() trap: undefined | focusTrap.FocusTrap = undefined; + + @Watch('active') + handleActiveChange(active: boolean) { + this.toggleTrap(active); + } + + connectedCallback() { + if (!this.trap) { + this.trap = focusTrap.createFocusTrap(this.host?.firstElementChild as HTMLElement, { + allowOutsideClick: true, + }); + } + } + + componentDidLoad() { + this.toggleTrap(this.active); + } + + disconnectedCallback() { + this.trap?.deactivate(); + } + + private toggleTrap(active: boolean) { + if (active) { + this.trap?.activate(); + } else { + this.trap?.deactivate(); + } + } + + render() { + return ( + + + + ); + } +} diff --git a/packages/internet-header/src/components/shared/readme.md b/packages/internet-header/src/components/shared/readme.md new file mode 100644 index 0000000000..8b54baa7e1 --- /dev/null +++ b/packages/internet-header/src/components/shared/readme.md @@ -0,0 +1,36 @@ +# focus-trap + + + + + + +## Overview + +Trap the focus inside a specific container. + +## Properties + +| Property | Attribute | Description | Type | Default | +| -------- | --------- | ----------- | --------- | ------- | +| `active` | `active` | | `boolean` | `false` | + + +## Dependencies + +### Used by + + - [post-search](../post-search) + - [swisspost-internet-breadcrumbs](../post-internet-breadcrumbs) + +### Graph +```mermaid +graph TD; + post-search --> focus-trap + swisspost-internet-breadcrumbs --> focus-trap + style focus-trap fill:#f9f,stroke:#333,stroke-width:4px +``` + +---------------------------------------------- + +*Built with [StencilJS](https://stenciljs.com/)* diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f61320bced..c3506757e3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -679,9 +679,6 @@ importers: jquery: specifier: 3.7.1 version: 3.7.1 - tabbable: - specifier: 6.2.0 - version: 6.2.0 throttle-debounce: specifier: 5.0.0 version: 5.0.0 @@ -749,12 +746,15 @@ importers: eslint-plugin-react: specifier: 7.34.1 version: 7.34.1(eslint@8.57.0) + focus-trap: + specifier: 7.5.4 + version: 7.5.4 globby: specifier: 14.0.1 version: 14.0.1 jest: specifier: 29.7.0 - version: 29.7.0(@types/node@20.14.0)(ts-node@10.9.2(@types/node@20.14.0)(typescript@5.2.2)) + version: 29.7.0(@types/node@20.14.0)(ts-node@10.9.2(@types/node@20.14.0)(typescript@4.9.5)) jest-environment-jsdom: specifier: 29.7.0 version: 29.7.0 @@ -778,7 +778,7 @@ importers: version: 2.0.3 ts-jest: specifier: 29.1.2 - version: 29.1.2(@babel/core@7.24.5)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.5))(jest@29.7.0(@types/node@20.14.0))(typescript@4.9.5) + version: 29.1.2(@babel/core@7.24.5)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.5))(jest@29.7.0(@types/node@20.14.0)(ts-node@10.9.2(@types/node@20.14.0)(typescript@4.9.5)))(typescript@4.9.5) typescript: specifier: 4.9.5 version: 4.9.5 @@ -1048,7 +1048,7 @@ importers: version: 5.1.0 jest: specifier: 29.7.0 - version: 29.7.0(@types/node@20.14.0)(ts-node@10.9.2(@types/node@20.14.0)(typescript@5.2.2)) + version: 29.7.0(@types/node@20.14.0)(ts-node@10.9.2(@types/node@20.14.0)(typescript@5.3.3)) postcss: specifier: 8.4.38 version: 8.4.38 @@ -6062,6 +6062,9 @@ packages: flush-write-stream@1.1.1: resolution: {integrity: sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==} + focus-trap@7.5.4: + resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==} + follow-redirects@1.15.6: resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} engines: {node: '>=4.0'} @@ -11074,7 +11077,7 @@ snapshots: '@vitejs/plugin-basic-ssl': 1.1.0(vite@5.1.7(@types/node@20.12.7)(less@4.2.0)(sass@1.71.1)(terser@5.29.1)) ansi-colors: 4.1.3 autoprefixer: 10.4.18(postcss@8.4.35) - babel-loader: 9.1.3(@babel/core@7.24.0)(webpack@5.90.3) + babel-loader: 9.1.3(@babel/core@7.24.0)(webpack@5.90.3(esbuild@0.20.1)) babel-plugin-istanbul: 6.1.1 browserslist: 4.23.0 copy-webpack-plugin: 11.0.0(webpack@5.90.3(esbuild@0.20.1)) @@ -11168,7 +11171,7 @@ snapshots: '@vitejs/plugin-basic-ssl': 1.1.0(vite@5.1.7(@types/node@20.14.0)(less@4.2.0)(sass@1.71.1)(terser@5.29.1)) ansi-colors: 4.1.3 autoprefixer: 10.4.18(postcss@8.4.35) - babel-loader: 9.1.3(@babel/core@7.24.0)(webpack@5.90.3) + babel-loader: 9.1.3(@babel/core@7.24.0)(webpack@5.90.3(esbuild@0.20.1)) babel-plugin-istanbul: 6.1.1 browserslist: 4.23.0 copy-webpack-plugin: 11.0.0(webpack@5.90.3(esbuild@0.20.1)) @@ -13478,6 +13481,41 @@ snapshots: - ts-node optional: true + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@20.14.0)(typescript@4.9.5))': + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.14.0 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.8.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.14.0)(ts-node@10.9.2(@types/node@20.14.0)(typescript@4.9.5)) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.5 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@20.14.0)(typescript@5.2.2))': dependencies: '@jest/console': 29.7.0 @@ -16153,7 +16191,7 @@ snapshots: dependencies: array-buffer-byte-length: 1.0.0 call-bind: 1.0.7 - define-properties: 1.2.0 + define-properties: 1.2.1 get-intrinsic: 1.2.4 is-array-buffer: 3.0.2 is-shared-array-buffer: 1.0.2 @@ -16291,7 +16329,7 @@ snapshots: transitivePeerDependencies: - supports-color - babel-loader@9.1.3(@babel/core@7.24.0)(webpack@5.90.3): + babel-loader@9.1.3(@babel/core@7.24.0)(webpack@5.90.3(esbuild@0.20.1)): dependencies: '@babel/core': 7.24.0 find-cache-dir: 4.0.0 @@ -17040,6 +17078,21 @@ snapshots: - ts-node optional: true + create-jest@29.7.0(@types/node@20.14.0)(ts-node@10.9.2(@types/node@20.14.0)(typescript@4.9.5)): + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@20.14.0)(ts-node@10.9.2(@types/node@20.14.0)(typescript@4.9.5)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + create-jest@29.7.0(@types/node@20.14.0)(ts-node@10.9.2(@types/node@20.14.0)(typescript@5.2.2)): dependencies: '@jest/types': 29.6.3 @@ -18012,7 +18065,7 @@ snapshots: eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0) eslint-plugin-react: 7.34.1(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0) @@ -18043,7 +18096,7 @@ snapshots: enhanced-resolve: 5.16.0 eslint: 8.57.0 eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.7.0 is-core-module: 2.13.1 @@ -18109,7 +18162,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): dependencies: array-includes: 3.1.7 array.prototype.findlastindex: 1.2.3 @@ -18683,6 +18736,10 @@ snapshots: inherits: 2.0.4 readable-stream: 2.3.8 + focus-trap@7.5.4: + dependencies: + tabbable: 6.2.0 + follow-redirects@1.15.6(debug@4.3.4): optionalDependencies: debug: 4.3.4(supports-color@8.1.1) @@ -18788,8 +18845,8 @@ snapshots: function.prototype.name@1.1.5: dependencies: call-bind: 1.0.7 - define-properties: 1.2.0 - es-abstract: 1.22.1 + define-properties: 1.2.1 + es-abstract: 1.23.3 functions-have-names: 1.2.3 function.prototype.name@1.1.6: @@ -19906,6 +19963,25 @@ snapshots: - ts-node optional: true + jest-cli@29.7.0(@types/node@20.14.0)(ts-node@10.9.2(@types/node@20.14.0)(typescript@4.9.5)): + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.14.0)(typescript@4.9.5)) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@20.14.0)(ts-node@10.9.2(@types/node@20.14.0)(typescript@4.9.5)) + exit: 0.1.2 + import-local: 3.1.0 + jest-config: 29.7.0(@types/node@20.14.0)(ts-node@10.9.2(@types/node@20.14.0)(typescript@4.9.5)) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + jest-cli@29.7.0(@types/node@20.14.0)(ts-node@10.9.2(@types/node@20.14.0)(typescript@5.2.2)): dependencies: '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.14.0)(typescript@5.2.2)) @@ -20008,6 +20084,37 @@ snapshots: - supports-color optional: true + jest-config@29.7.0(@types/node@20.14.0)(ts-node@10.9.2(@types/node@20.14.0)(typescript@4.9.5)): + dependencies: + '@babel/core': 7.24.5 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.24.5) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 20.14.0 + ts-node: 10.9.2(@types/node@20.14.0)(typescript@4.9.5) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + jest-config@29.7.0(@types/node@20.14.0)(ts-node@10.9.2(@types/node@20.14.0)(typescript@5.2.2)): dependencies: '@babel/core': 7.24.5 @@ -20321,10 +20428,23 @@ snapshots: jest@29.7.0(@types/node@20.14.0): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.14.0)(typescript@5.2.2)) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.14.0)(typescript@4.9.5)) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.14.0)(ts-node@10.9.2(@types/node@20.14.0)(typescript@5.2.2)) + jest-cli: 29.7.0(@types/node@20.14.0)(ts-node@10.9.2(@types/node@20.14.0)(typescript@4.9.5)) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + optional: true + + jest@29.7.0(@types/node@20.14.0)(ts-node@10.9.2(@types/node@20.14.0)(typescript@4.9.5)): + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.14.0)(typescript@4.9.5)) + '@jest/types': 29.6.3 + import-local: 3.1.0 + jest-cli: 29.7.0(@types/node@20.14.0)(ts-node@10.9.2(@types/node@20.14.0)(typescript@4.9.5)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -22514,7 +22634,7 @@ snapshots: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-abstract: 1.23.3 es-errors: 1.3.0 get-intrinsic: 1.2.4 globalthis: 1.0.3 @@ -22550,7 +22670,7 @@ snapshots: regexp.prototype.flags@1.5.0: dependencies: call-bind: 1.0.7 - define-properties: 1.2.0 + define-properties: 1.2.1 functions-have-names: 1.2.3 regexp.prototype.flags@1.5.2: @@ -23365,14 +23485,14 @@ snapshots: string.prototype.trim@1.2.7: dependencies: call-bind: 1.0.7 - define-properties: 1.2.0 - es-abstract: 1.22.1 + define-properties: 1.2.1 + es-abstract: 1.23.3 string.prototype.trim@1.2.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-abstract: 1.23.3 string.prototype.trim@1.2.9: dependencies: @@ -23384,14 +23504,14 @@ snapshots: string.prototype.trimend@1.0.6: dependencies: call-bind: 1.0.7 - define-properties: 1.2.0 - es-abstract: 1.22.1 + define-properties: 1.2.1 + es-abstract: 1.23.3 string.prototype.trimend@1.0.7: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-abstract: 1.23.3 string.prototype.trimend@1.0.8: dependencies: @@ -23402,14 +23522,14 @@ snapshots: string.prototype.trimstart@1.0.6: dependencies: call-bind: 1.0.7 - define-properties: 1.2.0 - es-abstract: 1.22.1 + define-properties: 1.2.1 + es-abstract: 1.23.3 string.prototype.trimstart@1.0.7: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.4 + es-abstract: 1.23.3 string.prototype.trimstart@1.0.8: dependencies: @@ -23738,7 +23858,7 @@ snapshots: terser-webpack-plugin@5.3.10(webpack@5.91.0): dependencies: - '@jridgewell/trace-mapping': 0.3.22 + '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.1 @@ -23882,51 +24002,51 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@29.1.2(@babel/core@7.24.5)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.5))(jest@29.7.0(@types/node@20.14.0)(ts-node@10.9.2(@types/node@20.14.0)(typescript@5.2.2)))(typescript@5.2.2): + ts-jest@29.1.2(@babel/core@7.24.5)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.5))(jest@29.7.0(@types/node@20.14.0)(ts-node@10.9.2(@types/node@20.14.0)(typescript@4.9.5)))(typescript@4.9.5): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.14.0)(ts-node@10.9.2(@types/node@20.14.0)(typescript@5.2.2)) + jest: 29.7.0(@types/node@20.14.0)(ts-node@10.9.2(@types/node@20.14.0)(typescript@4.9.5)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.5.4 - typescript: 5.2.2 + typescript: 4.9.5 yargs-parser: 21.1.1 optionalDependencies: '@babel/core': 7.24.5 '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.24.5) - ts-jest@29.1.2(@babel/core@7.24.5)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.5))(jest@29.7.0(@types/node@20.14.0)(ts-node@10.9.2(@types/node@20.14.0)(typescript@5.3.3)))(typescript@5.3.3): + ts-jest@29.1.2(@babel/core@7.24.5)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.5))(jest@29.7.0(@types/node@20.14.0)(ts-node@10.9.2(@types/node@20.14.0)(typescript@5.2.2)))(typescript@5.2.2): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.14.0)(ts-node@10.9.2(@types/node@20.14.0)(typescript@5.3.3)) + jest: 29.7.0(@types/node@20.14.0)(ts-node@10.9.2(@types/node@20.14.0)(typescript@5.2.2)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.5.4 - typescript: 5.3.3 + typescript: 5.2.2 yargs-parser: 21.1.1 optionalDependencies: '@babel/core': 7.24.5 '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.24.5) - ts-jest@29.1.2(@babel/core@7.24.5)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.5))(jest@29.7.0(@types/node@20.14.0))(typescript@4.9.5): + ts-jest@29.1.2(@babel/core@7.24.5)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.5))(jest@29.7.0(@types/node@20.14.0)(ts-node@10.9.2(@types/node@20.14.0)(typescript@5.3.3)))(typescript@5.3.3): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.14.0) + jest: 29.7.0(@types/node@20.14.0)(ts-node@10.9.2(@types/node@20.14.0)(typescript@5.3.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.5.4 - typescript: 4.9.5 + typescript: 5.3.3 yargs-parser: 21.1.1 optionalDependencies: '@babel/core': 7.24.5 @@ -23951,6 +24071,25 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + ts-node@10.9.2(@types/node@20.14.0)(typescript@4.9.5): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.14.0 + acorn: 8.9.0 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.9.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optional: true + ts-node@10.9.2(@types/node@20.14.0)(typescript@5.2.2): dependencies: '@cspotcode/source-map-support': 0.8.1