From d7cc20b106a1d2b40848114df5b52c3c4cfeaaad Mon Sep 17 00:00:00 2001 From: Alex Lavrov <36633600+alexslavr@users.noreply.github.com> Date: Thu, 26 Dec 2024 15:15:12 +0400 Subject: [PATCH 01/15] Optimize testcafe tests workflow (#28639) --- .github/workflows/testcafe_tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/testcafe_tests.yml b/.github/workflows/testcafe_tests.yml index b57aae70df2c..164703f8f47d 100644 --- a/.github/workflows/testcafe_tests.yml +++ b/.github/workflows/testcafe_tests.yml @@ -216,7 +216,7 @@ jobs: [ "${{ matrix.ARGS.platform }}" != "" ] && PLATFORM="--platform ${{ matrix.ARGS.platform }}" all_args="--browsers=chrome:devextreme-shr2 --componentFolder ${{ matrix.ARGS.componentFolder }} $CONCURRENCY $INDICES $PLATFORM $THEME" echo "$all_args" - pnpx nx test $all_args + pnpm run test $all_args - name: Copy compared screenshot artifacts if: ${{ failure() }} From ce330584635a2d324b0c66036694e121c6dcb4a9 Mon Sep 17 00:00:00 2001 From: Nikki Gonzales <38495263+nikkithelegendarypokemonster@users.noreply.github.com> Date: Fri, 27 Dec 2024 14:07:06 +0800 Subject: [PATCH 02/15] Chart: fix export error by enforcing jquery wrapping (T1266360) (#28641) --- packages/devextreme/js/viz/core/export.js | 2 +- .../tests/DevExpress.viz.core/export.tests.js | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/packages/devextreme/js/viz/core/export.js b/packages/devextreme/js/viz/core/export.js index 49add1f9fbe9..c61512e0b9db 100644 --- a/packages/devextreme/js/viz/core/export.js +++ b/packages/devextreme/js/viz/core/export.js @@ -308,7 +308,7 @@ export let combineMarkups = function(widgets, options = { }) { const rowInfo = row.reduce((r, item, colIndex) => { const size = item.getSize(); const backgroundColor = item.option('backgroundColor') || getTheme(item.option('theme')).backgroundColor; - const node = item.element() + const node = $(item.element()) .find('svg') .get(0) .cloneNode(true); diff --git a/packages/devextreme/testing/tests/DevExpress.viz.core/export.tests.js b/packages/devextreme/testing/tests/DevExpress.viz.core/export.tests.js index 80f69969948f..d57164bf2cbd 100644 --- a/packages/devextreme/testing/tests/DevExpress.viz.core/export.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.viz.core/export.tests.js @@ -737,6 +737,31 @@ QUnit.test('exportFromMarkup. backgroundColor from current theme', function(asse } }); +QUnit.test('exportWidgets method should be able export plain DOM element (T1266360)', function(assert) { + const optionMock = () => { + return { + fileName: 'chart', + format: 'PNG', + }; + }; + + const widgets = [ + createMockWidget({ height: 25, width: 10 }, optionMock), + ]; + + widgets.forEach(widget => { + const originalElement = widget.element(); + widget.element = sinon.stub().returns(originalElement[0]); // Get native DOM + }); + + try { + exportModule.exportWidgets(widgets); + assert.strictEqual(clientExporter.export.getCall(0).args[0].nodeName, 'svg', 'combineMarkups should pass to export DOM node'); + } catch(error) { + assert.ok(false, 'exportWidgets doesnt work when plain DOM is passed as argument'); + } +}); + QUnit.test('exportWidgets method should pass to export markup as DOM node', function(assert) { const optionMock = (param) => { if(param === 'theme') return 'someTheme.light'; From 2a7b79b44dcc883a89cbc5425a5ac45535e5220c Mon Sep 17 00:00:00 2001 From: EugeniyKiyashko Date: Fri, 27 Dec 2024 12:33:00 +0400 Subject: [PATCH 03/15] ThemeBuilder - Text Color parameter is not applied to Outlined and Text buttons (T1212078) (#28636) (#28637) --- .../scss/widgets/fluent/button/_colors.scss | 42 +++++++++- .../scss/widgets/fluent/button/_mixins.scss | 11 ++- .../scss/widgets/generic/button/_colors.scss | 78 +++++++++++++------ .../scss/widgets/generic/button/_mixins.scss | 4 +- .../scss/widgets/material/button/_colors.scss | 26 ++++++- .../scss/widgets/material/button/_index.scss | 6 +- .../scss/widgets/material/button/_mixins.scss | 19 ++++- 7 files changed, 148 insertions(+), 38 deletions(-) diff --git a/packages/devextreme-scss/scss/widgets/fluent/button/_colors.scss b/packages/devextreme-scss/scss/widgets/fluent/button/_colors.scss index 6c14cb587ad1..fca2088edfce 100644 --- a/packages/devextreme-scss/scss/widgets/fluent/button/_colors.scss +++ b/packages/devextreme-scss/scss/widgets/fluent/button/_colors.scss @@ -53,7 +53,7 @@ $button-normal-selected-bg: $base-selected-bg !default; $button-normal-bg-inverted: null !default; /** -* $name 10. Text color +* $name 10. Text color (contained) * $type color */ $button-default-color: null !default; @@ -94,6 +94,10 @@ $button-default-active-bg: null !default; */ $button-default-selected-bg: null !default; +/** +* $name 11. Text color (outlined) +* $type color +*/ $button-default-outlined-color: $base-accent !default; $button-default-outlined-border-color: $base-accent !default; $button-default-outlined-hover-bg: null !default; @@ -101,6 +105,10 @@ $button-default-outlined-focused-bg: null !default; $button-default-outlined-active-bg: null !default; $button-default-outlined-selected-bg: null !default; +/** +* $name 11. Text color (text) +* $type color +*/ $button-default-text-color: $base-accent !default; /** @@ -337,13 +345,41 @@ $button-normal-text-focused-bg: $button-normal-hover-bg !default; $button-normal-text-active-bg: $button-normal-active-bg !default; $button-normal-text-selected-bg: $button-normal-selected-bg !default; +/** +* $name 12. Hover state text color (outlined) +* $type color +*/ $button-default-outlined-color-hover: $button-accent-foreground-color !default; + +/** +* $name 13. Active state text color (outlined) +* $type color +*/ $button-default-outlined-color-active: $button-accent-foreground-color !default; + +/** +* $name 21. Selected state text color (outlined) +* $type color +*/ $button-default-outlined-selected-color: $button-accent-foreground-color !default; -$button-default-text-color-hover: $button-default-outlined-color-hover !default; +/** +* $name 12. Hover state text color (text) +* $type color +*/ +$button-default-text-color-hover: $button-accent-foreground-color !default; + +/** +* $name 13. Active state text color (text) +* $type color +*/ $button-default-text-color-active: $button-default-outlined-color-active !default; -$button-default-text-selected-color: $button-default-outlined-selected-color !default; + +/** +* $name 21. Selected state text color (text) +* $type color +*/ +$button-default-text-selected-color: $button-accent-foreground-color !default; $button-default-text-hover-bg: $button-default-outlined-hover-bg !default; $button-default-text-focused-bg: $button-default-outlined-focused-bg !default; diff --git a/packages/devextreme-scss/scss/widgets/fluent/button/_mixins.scss b/packages/devextreme-scss/scss/widgets/fluent/button/_mixins.scss index 92c0edf17a87..2181fff621f4 100644 --- a/packages/devextreme-scss/scss/widgets/fluent/button/_mixins.scss +++ b/packages/devextreme-scss/scss/widgets/fluent/button/_mixins.scss @@ -145,7 +145,16 @@ } } -@mixin dx-button-flat-color-styling($button-color, $button-color-hover, $button-color-active, $hover-bg, $focused-bg, $active-bg, $selected-bg: $active-bg, $selected-color: $button-color) { +@mixin dx-button-flat-color-styling( + $button-color, + $button-color-hover, + $button-color-active, + $hover-bg, + $focused-bg, + $active-bg, + $selected-bg: $active-bg, + $selected-color: $button-color +) { @include dx-button-styling-variant( transparent, $button-color, diff --git a/packages/devextreme-scss/scss/widgets/generic/button/_colors.scss b/packages/devextreme-scss/scss/widgets/generic/button/_colors.scss index a1ccb2f0a1f2..0777a07ecbac 100644 --- a/packages/devextreme-scss/scss/widgets/generic/button/_colors.scss +++ b/packages/devextreme-scss/scss/widgets/generic/button/_colors.scss @@ -53,7 +53,7 @@ $button-normal-text-bg-active: null !default; $button-normal-text-bg-selected: null !default; /** -* $name 10. Text color +* $name 10. Text color (contained) * $type color */ $button-default-color: $base-inverted-text-color !default; @@ -78,6 +78,12 @@ $button-default-contained-bg-active: null !default; * $type color */ $button-default-contained-bg-selected: null !default; + +/** +* $name 11. Text color (outlined) +* $type color +*/ +$button-default-outlined-color: null !default; $button-default-outlined-bg-hover: null !default; $button-default-outlined-bg-focused: null !default; $button-default-outlined-bg-active: null !default; @@ -87,6 +93,12 @@ $button-default-outlined-bg-active: null !default; * $type color */ $button-default-outlined-bg-selected: null !default; + +/** +* $name 11. Text color (text) +* $type color +*/ +$button-default-text-color: null !default; $button-default-text-bg-hover: null !default; $button-default-text-bg-focused: null !default; $button-default-text-bg-active: null !default; @@ -189,7 +201,7 @@ $button-success-text-bg-selected: null !default; @if $color == "carmine" { $button-normal-bg: $base-element-bg !default; - $button-normal-border-color: darken($base-border-color, 17%) !default; // #dee1e3 => #b1b7bd + $button-normal-border-color: darken($base-border-color, 17%) !default; $button-normal-bg-inverted: darken($button-normal-bg, 100%) !default; $button-normal-contained-bg-hover: darken($button-normal-bg, 4%) !default; $button-normal-contained-bg-focused: darken($button-normal-bg, 8%) !default; @@ -204,20 +216,22 @@ $button-success-text-bg-selected: null !default; $button-normal-text-bg-active: color.change($button-normal-bg-inverted, $alpha: 0.24) !default; $button-normal-text-bg-selected: color.change($button-normal-bg-inverted, $alpha: 0.17) !default; $button-default-bg: $base-accent !default; - $button-default-border-color: darken($base-accent, 5%) !default; + $button-default-border-color: darken($button-default-bg, 5%) !default; $button-default-contained-bg-hover: darken($button-default-bg, 9%) !default; $button-default-contained-bg-focused: darken($button-default-bg, 12%) !default; $button-default-contained-bg-active: darken($button-default-bg, 23%) !default; $button-default-contained-bg-selected: darken($button-default-bg, 17%) !default; + $button-default-outlined-color: darken($button-default-bg, 5%) !default; $button-default-outlined-bg-hover: color.change($button-default-border-color, $alpha: 0.1) !default; $button-default-outlined-bg-focused: color.change($button-default-border-color, $alpha: 0.1) !default; $button-default-outlined-bg-active: color.change($button-default-border-color, $alpha: 0.4) !default; $button-default-outlined-bg-selected: color.change($button-default-bg, $alpha: 0.3) !default; + $button-default-text-color: darken($button-default-bg, 5%) !default; $button-default-text-bg-hover: $button-default-outlined-bg-hover !default; $button-default-text-bg-focused: $button-default-outlined-bg-focused !default; $button-default-text-bg-active: $button-default-outlined-bg-active !default; $button-default-text-bg-selected: color.change($button-default-bg, $alpha: 0.3) !default; - $button-danger-border-color: darken($base-danger, 5%) !default; + $button-danger-border-color: darken($button-danger-bg, 5%) !default; $button-danger-contained-bg-hover: darken($button-danger-bg, 9%) !default; $button-danger-contained-bg-focused: darken($button-danger-bg, 12%) !default; $button-danger-contained-bg-active: darken($button-danger-bg, 23%) !default; @@ -230,7 +244,7 @@ $button-success-text-bg-selected: null !default; $button-danger-text-bg-focused: $button-danger-outlined-bg-focused !default; $button-danger-text-bg-active: $button-danger-outlined-bg-active !default; $button-danger-text-bg-selected: color.change($button-danger-bg, $alpha: 0.3) !default; - $button-success-border-color: darken($base-success, 5%) !default; + $button-success-border-color: darken($button-success-bg, 5%) !default; $button-success-contained-bg-hover: darken($button-success-bg, 9%) !default; $button-success-contained-bg-focused: darken($button-success-bg, 12%) !default; $button-success-contained-bg-active: darken($button-success-bg, 23%) !default; @@ -266,15 +280,17 @@ $button-success-text-bg-selected: null !default; $button-default-contained-bg-focused: $base-inverted-bg !default; $button-default-contained-bg-active: $button-default-bg !default; $button-default-contained-bg-selected: $base-inverted-bg !default; + $button-default-outlined-color: $base-default !default; $button-default-outlined-bg-hover: $base-inverted-bg !default; $button-default-outlined-bg-focused: $base-inverted-bg !default; $button-default-outlined-bg-active: $base-bg !default; $button-default-outlined-bg-selected: $base-inverted-bg !default; + $button-default-text-color: $base-default !default; $button-default-text-bg-hover: $base-inverted-bg !default; $button-default-text-bg-focused: $base-inverted-bg !default; $button-default-text-bg-active: $base-bg !default; $button-default-text-bg-selected: $base-inverted-bg !default; - $button-danger-border-color: $base-danger !default; + $button-danger-border-color: $button-danger-bg !default; $button-danger-contained-bg-hover: $base-inverted-bg !default; $button-danger-contained-bg-focused: $base-inverted-bg !default; $button-danger-contained-bg-active: $button-danger-bg !default; @@ -287,7 +303,7 @@ $button-success-text-bg-selected: null !default; $button-danger-text-bg-focused: $base-inverted-bg !default; $button-danger-text-bg-active: $base-bg !default; $button-danger-text-bg-selected: $base-inverted-bg !default; - $button-success-border-color: $base-success !default; + $button-success-border-color: $button-success-bg !default; $button-success-contained-bg-hover: $base-inverted-bg !default; $button-success-contained-bg-focused: $base-inverted-bg !default; $button-success-contained-bg-active: $button-success-bg !default; @@ -319,20 +335,22 @@ $button-success-text-bg-selected: null !default; $button-normal-text-bg-active: color.change($button-normal-bg-inverted, $alpha: 0.24) !default; $button-normal-text-bg-selected: color.change($button-normal-bg-inverted, $alpha: 0.17) !default; $button-default-bg: $base-accent !default; - $button-default-border-color: darken($base-accent, 5%) !default; + $button-default-border-color: darken($button-default-bg, 5%) !default; $button-default-contained-bg-hover: lighten($button-default-bg, 9%) !default; $button-default-contained-bg-focused: lighten($button-default-bg, 12%) !default; $button-default-contained-bg-active: lighten($button-default-bg, 23%) !default; $button-default-contained-bg-selected: lighten($button-default-bg, 17%) !default; + $button-default-outlined-color: darken($button-default-bg, 5%) !default; $button-default-outlined-bg-hover: color.change($button-default-border-color, $alpha: 0.1) !default; $button-default-outlined-bg-focused: color.change($button-default-border-color, $alpha: 0.1) !default; $button-default-outlined-bg-active: color.change($button-default-border-color, $alpha: 0.4) !default; $button-default-outlined-bg-selected: color.change($button-default-bg, $alpha: 0.3) !default; + $button-default-text-color: darken($button-default-bg, 5%) !default; $button-default-text-bg-hover: $button-default-outlined-bg-hover !default; $button-default-text-bg-focused: $button-default-outlined-bg-focused !default; $button-default-text-bg-active: $button-default-outlined-bg-active !default; $button-default-text-bg-selected: color.change($button-default-bg, $alpha: 0.3) !default; - $button-danger-border-color: darken($base-danger, 5%) !default; + $button-danger-border-color: darken($button-danger-bg, 5%) !default; $button-danger-contained-bg-hover: lighten($button-danger-bg, 9%) !default; $button-danger-contained-bg-focused: lighten($button-danger-bg, 12%) !default; $button-danger-contained-bg-active: lighten($button-danger-bg, 23%) !default; @@ -345,7 +363,7 @@ $button-success-text-bg-selected: null !default; $button-danger-text-bg-focused: $button-danger-outlined-bg-focused !default; $button-danger-text-bg-active: $button-danger-outlined-bg-active !default; $button-danger-text-bg-selected: color.change($button-danger-bg, $alpha: 0.3) !default; - $button-success-border-color: darken($base-success, 5%) !default; + $button-success-border-color: darken($button-success-bg, 5%) !default; $button-success-contained-bg-hover: lighten($button-success-bg, 9%) !default; $button-success-contained-bg-focused: lighten($button-success-bg, 12%) !default; $button-success-contained-bg-active: lighten($button-success-bg, 23%) !default; @@ -377,20 +395,22 @@ $button-success-text-bg-selected: null !default; $button-normal-text-bg-active: color.change($button-normal-bg-inverted, $alpha: 0.24) !default; $button-normal-text-bg-selected: color.change($button-normal-bg-inverted, $alpha: 0.17) !default; $button-default-bg: $base-accent !default; - $button-default-border-color: darken($base-accent, 5%) !default; + $button-default-border-color: darken($button-default-bg, 5%) !default; $button-default-contained-bg-hover: lighten($button-default-bg, 9%) !default; $button-default-contained-bg-focused: lighten($button-default-bg, 12%) !default; $button-default-contained-bg-active: lighten($button-default-bg, 23%) !default; $button-default-contained-bg-selected: lighten($button-default-bg, 17%) !default; + $button-default-outlined-color: darken($button-default-bg, 5%) !default; $button-default-outlined-bg-hover: color.change($button-default-border-color, $alpha: 0.1) !default; $button-default-outlined-bg-focused: color.change($button-default-border-color, $alpha: 0.1) !default; $button-default-outlined-bg-active: color.change($button-default-border-color, $alpha: 0.4) !default; $button-default-outlined-bg-selected: color.change($button-default-bg, $alpha: 0.3) !default; + $button-default-text-color: darken($button-default-bg, 5%) !default; $button-default-text-bg-hover: $button-default-outlined-bg-hover !default; $button-default-text-bg-focused: $button-default-outlined-bg-focused !default; $button-default-text-bg-active: $button-default-outlined-bg-active !default; $button-default-text-bg-selected: color.change($button-default-bg, $alpha: 0.3) !default; - $button-danger-border-color: darken($base-danger, 5%) !default; + $button-danger-border-color: darken($button-danger-bg, 5%) !default; $button-danger-contained-bg-hover: lighten($button-danger-bg, 9%) !default; $button-danger-contained-bg-focused: lighten($button-danger-bg, 12%) !default; $button-danger-contained-bg-active: lighten($button-danger-bg, 23%) !default; @@ -403,7 +423,7 @@ $button-success-text-bg-selected: null !default; $button-danger-text-bg-focused: $button-danger-outlined-bg-focused !default; $button-danger-text-bg-active: $button-danger-outlined-bg-active !default; $button-danger-text-bg-selected: color.change($button-danger-bg, $alpha: 0.3) !default; - $button-success-border-color: darken($base-success, 5%) !default; + $button-success-border-color: darken($button-success-bg, 5%) !default; $button-success-contained-bg-hover: lighten($button-success-bg, 9%) !default; $button-success-contained-bg-focused: lighten($button-success-bg, 12%) !default; $button-success-contained-bg-active: lighten($button-success-bg, 23%) !default; @@ -435,20 +455,22 @@ $button-success-text-bg-selected: null !default; $button-normal-text-bg-active: color.change($button-normal-bg-inverted, $alpha: 0.24) !default; $button-normal-text-bg-selected: color.change($button-normal-bg-inverted, $alpha: 0.17) !default; $button-default-bg: $base-accent !default; - $button-default-border-color: darken($base-accent, 5%) !default; + $button-default-border-color: darken($button-default-bg, 5%) !default; $button-default-contained-bg-hover: lighten($button-default-bg, 9%) !default; $button-default-contained-bg-focused: lighten($button-default-bg, 12%) !default; $button-default-contained-bg-active: lighten($button-default-bg, 23%) !default; $button-default-contained-bg-selected: lighten($button-default-bg, 17%) !default; + $button-default-outlined-color: darken($button-default-bg, 5%) !default; $button-default-outlined-bg-hover: color.change($button-default-border-color, $alpha: 0.1) !default; $button-default-outlined-bg-focused: color.change($button-default-border-color, $alpha: 0.1) !default; $button-default-outlined-bg-active: color.change($button-default-border-color, $alpha: 0.4) !default; $button-default-outlined-bg-selected: color.change($button-default-bg, $alpha: 0.3) !default; + $button-default-text-color: darken($button-default-bg, 5%) !default; $button-default-text-bg-hover: $button-default-outlined-bg-hover !default; $button-default-text-bg-focused: $button-default-outlined-bg-focused !default; $button-default-text-bg-active: $button-default-outlined-bg-active !default; $button-default-text-bg-selected: color.change($button-default-bg, $alpha: 0.3) !default; - $button-danger-border-color: darken($base-danger, 5%) !default; + $button-danger-border-color: darken($button-danger-bg, 5%) !default; $button-danger-contained-bg-hover: lighten($button-danger-bg, 9%) !default; $button-danger-contained-bg-focused: lighten($button-danger-bg, 12%) !default; $button-danger-contained-bg-active: lighten($button-danger-bg, 23%) !default; @@ -461,7 +483,7 @@ $button-success-text-bg-selected: null !default; $button-danger-text-bg-focused: $button-danger-outlined-bg-focused !default; $button-danger-text-bg-active: $button-danger-outlined-bg-active !default; $button-danger-text-bg-selected: color.change($button-danger-bg, $alpha: 0.3) !default; - $button-success-border-color: darken($base-success, 5%) !default; + $button-success-border-color: darken($button-success-bg, 5%) !default; $button-success-contained-bg-hover: lighten($button-success-bg, 9%) !default; $button-success-contained-bg-focused: lighten($button-success-bg, 12%) !default; $button-success-contained-bg-active: lighten($button-success-bg, 23%) !default; @@ -493,20 +515,22 @@ $button-success-text-bg-selected: null !default; $button-normal-text-bg-active: color.change($button-normal-bg-inverted, $alpha: 0.24) !default; $button-normal-text-bg-selected: color.change($button-normal-bg-inverted, $alpha: 0.17) !default; $button-default-bg: $base-accent !default; - $button-default-border-color: darken($base-accent, 5%) !default; + $button-default-border-color: darken($button-default-bg, 5%) !default; $button-default-contained-bg-hover: darken($button-default-bg, 9%) !default; $button-default-contained-bg-focused: darken($button-default-bg, 12%) !default; $button-default-contained-bg-active: darken($button-default-bg, 23%) !default; $button-default-contained-bg-selected: darken($button-default-bg, 17%) !default; + $button-default-outlined-color: darken($button-default-bg, 5%) !default; $button-default-outlined-bg-hover: color.change($button-default-border-color, $alpha: 0.1) !default; $button-default-outlined-bg-focused: color.change($button-default-border-color, $alpha: 0.1) !default; $button-default-outlined-bg-active: color.change($button-default-border-color, $alpha: 0.4) !default; $button-default-outlined-bg-selected: color.change($button-default-bg, $alpha: 0.3) !default; + $button-default-text-color: darken($button-default-bg, 5%) !default; $button-default-text-bg-hover: $button-default-outlined-bg-hover !default; $button-default-text-bg-focused: $button-default-outlined-bg-focused !default; $button-default-text-bg-active: $button-default-outlined-bg-active !default; $button-default-text-bg-selected: color.change($button-default-bg, $alpha: 0.3) !default; - $button-danger-border-color: darken($base-danger, 5%) !default; + $button-danger-border-color: darken($button-danger-bg, 5%) !default; $button-danger-contained-bg-hover: darken($button-danger-bg, 9%) !default; $button-danger-contained-bg-focused: darken($button-danger-bg, 12%) !default; $button-danger-contained-bg-active: darken($button-danger-bg, 23%) !default; @@ -519,7 +543,7 @@ $button-success-text-bg-selected: null !default; $button-danger-text-bg-focused: $button-danger-outlined-bg-focused !default; $button-danger-text-bg-active: $button-danger-outlined-bg-active !default; $button-danger-text-bg-selected: color.change($button-danger-bg, $alpha: 0.3) !default; - $button-success-border-color: darken($base-success, 5%) !default; + $button-success-border-color: darken($button-success-bg, 5%) !default; $button-success-contained-bg-hover: darken($button-success-bg, 9%) !default; $button-success-contained-bg-focused: darken($button-success-bg, 12%) !default; $button-success-contained-bg-active: darken($button-success-bg, 23%) !default; @@ -551,20 +575,22 @@ $button-success-text-bg-selected: null !default; $button-normal-text-bg-active: color.change($button-normal-bg-inverted, $alpha: 0.24) !default; $button-normal-text-bg-selected: color.change($button-normal-bg-inverted, $alpha: 0.17) !default; $button-default-bg: $base-accent !default; - $button-default-border-color: darken($base-accent, 5%) !default; + $button-default-border-color: darken($button-default-bg, 5%) !default; $button-default-contained-bg-hover: darken($button-default-bg, 9%) !default; $button-default-contained-bg-focused: darken($button-default-bg, 12%) !default; $button-default-contained-bg-active: darken($button-default-bg, 23%) !default; $button-default-contained-bg-selected: darken($button-default-bg, 17%) !default; + $button-default-outlined-color: darken($button-default-bg, 5%) !default; $button-default-outlined-bg-hover: color.change($button-default-border-color, $alpha: 0.1) !default; $button-default-outlined-bg-focused: color.change($button-default-border-color, $alpha: 0.1) !default; $button-default-outlined-bg-active: color.change($button-default-border-color, $alpha: 0.4) !default; $button-default-outlined-bg-selected: color.change($button-default-bg, $alpha: 0.3) !default; + $button-default-text-color: darken($button-default-bg, 5%) !default; $button-default-text-bg-hover: $button-default-outlined-bg-hover !default; $button-default-text-bg-focused: $button-default-outlined-bg-focused !default; $button-default-text-bg-active: $button-default-outlined-bg-active !default; $button-default-text-bg-selected: color.change($button-default-bg, $alpha: 0.3) !default; - $button-danger-border-color: darken($base-danger, 5%) !default; + $button-danger-border-color: darken($button-danger-bg, 5%) !default; $button-danger-contained-bg-hover: darken($button-danger-bg, 9%) !default; $button-danger-contained-bg-focused: darken($button-danger-bg, 12%) !default; $button-danger-contained-bg-active: darken($button-danger-bg, 23%) !default; @@ -577,7 +603,7 @@ $button-success-text-bg-selected: null !default; $button-danger-text-bg-focused: $button-danger-outlined-bg-focused !default; $button-danger-text-bg-active: $button-danger-outlined-bg-active !default; $button-danger-text-bg-selected: color.change($button-danger-bg, $alpha: 0.3) !default; - $button-success-border-color: darken($base-success, 5%) !default; + $button-success-border-color: darken($button-success-bg, 5%) !default; $button-success-contained-bg-hover: darken($button-success-bg, 9%) !default; $button-success-contained-bg-focused: darken($button-success-bg, 12%) !default; $button-success-contained-bg-active: darken($button-success-bg, 23%) !default; @@ -609,20 +635,22 @@ $button-success-text-bg-selected: null !default; $button-normal-text-bg-active: color.change($button-normal-bg-inverted, $alpha: 0.24) !default; $button-normal-text-bg-selected: color.change($button-normal-bg-inverted, $alpha: 0.17) !default; $button-default-bg: $base-accent !default; - $button-default-border-color: darken($base-accent, 5%) !default; + $button-default-border-color: darken($button-default-bg, 5%) !default; $button-default-contained-bg-hover: darken($button-default-bg, 9%) !default; $button-default-contained-bg-focused: darken($button-default-bg, 12%) !default; $button-default-contained-bg-active: darken($button-default-bg, 23%) !default; $button-default-contained-bg-selected: darken($button-default-bg, 17%) !default; + $button-default-outlined-color: darken($button-default-bg, 5%) !default; $button-default-outlined-bg-hover: color.change($button-default-border-color, $alpha: 0.1) !default; $button-default-outlined-bg-focused: color.change($button-default-border-color, $alpha: 0.1) !default; $button-default-outlined-bg-active: color.change($button-default-border-color, $alpha: 0.4) !default; $button-default-outlined-bg-selected: color.change($button-default-bg, $alpha: 0.3) !default; + $button-default-text-color: darken($button-default-bg, 5%) !default; $button-default-text-bg-hover: $button-default-outlined-bg-hover !default; $button-default-text-bg-focused: $button-default-outlined-bg-focused !default; $button-default-text-bg-active: $button-default-outlined-bg-active !default; $button-default-text-bg-selected: color.change($button-default-bg, $alpha: 0.3) !default; - $button-danger-border-color: darken($base-danger, 5%) !default; + $button-danger-border-color: darken($button-danger-bg, 5%) !default; $button-danger-contained-bg-hover: darken($button-danger-bg, 9%) !default; $button-danger-contained-bg-focused: darken($button-danger-bg, 12%) !default; $button-danger-contained-bg-active: darken($button-danger-bg, 23%) !default; @@ -635,7 +663,7 @@ $button-success-text-bg-selected: null !default; $button-danger-text-bg-focused: $button-danger-outlined-bg-focused !default; $button-danger-text-bg-active: $button-danger-outlined-bg-active !default; $button-danger-text-bg-selected: color.change($button-danger-bg, $alpha: 0.3) !default; - $button-success-border-color: darken($base-success, 5%) !default; + $button-success-border-color: darken($button-success-bg, 5%) !default; $button-success-contained-bg-hover: darken($button-success-bg, 9%) !default; $button-success-contained-bg-focused: darken($button-success-bg, 12%) !default; $button-success-contained-bg-active: darken($button-success-bg, 23%) !default; diff --git a/packages/devextreme-scss/scss/widgets/generic/button/_mixins.scss b/packages/devextreme-scss/scss/widgets/generic/button/_mixins.scss index c0a3c3aae0d7..0dffc1478218 100644 --- a/packages/devextreme-scss/scss/widgets/generic/button/_mixins.scss +++ b/packages/devextreme-scss/scss/widgets/generic/button/_mixins.scss @@ -171,7 +171,7 @@ @include dx-button-styling-variant( transparent, $button-default-border-color, - $button-default-border-color, + $button-default-outlined-color, $button-default-outlined-bg-hover, $button-default-outlined-bg-focused, $button-default-outlined-bg-active, @@ -227,7 +227,7 @@ @include dx-button-styling-variant( transparent, transparent, - $button-default-border-color, + $button-default-text-color, $button-default-text-bg-hover, $button-default-text-bg-focused, $button-default-text-bg-active, diff --git a/packages/devextreme-scss/scss/widgets/material/button/_colors.scss b/packages/devextreme-scss/scss/widgets/material/button/_colors.scss index e62e59502352..de5cd6670894 100644 --- a/packages/devextreme-scss/scss/widgets/material/button/_colors.scss +++ b/packages/devextreme-scss/scss/widgets/material/button/_colors.scss @@ -60,7 +60,7 @@ $button-normal-bg-inverted: null !default; $button-default-color: $base-inverted-text-color !default; /** -* $name 20. Selected state text color +* $name 20. Selected state text color (contained) * $type color */ $button-default-selected-color: $base-inverted-text-color !default; @@ -99,12 +99,35 @@ $button-default-outlined-hover-bg: color.change($button-default-bg, $alpha: 0.08 $button-default-outlined-focused-bg: color.change($button-default-bg, $alpha: 0.08) !default; $button-default-outlined-active-bg: color.change($button-default-bg, $alpha: 0.36) !default; $button-default-outlined-selected-bg: color.change($button-default-bg, $alpha: 0.36) !default; + +/** +* $name 11. Text color (outlined) +* $type color +*/ +$button-default-outlined-color: $button-default-bg !default; +$button-default-outlined-border-color: $button-default-bg !default; + +/** +* $name 21. Selected state text color (outlined) +* $type color +*/ $button-default-outlined-selected-color: $button-default-bg !default; $button-default-text-hover-bg: color.change($button-default-bg, $alpha: 0.08) !default; $button-default-text-focused-bg: color.change($button-default-bg, $alpha: 0.08) !default; $button-default-text-active-bg: color.change($button-default-bg, $alpha: 0.36) !default; $button-default-text-selected-bg: color.change($button-default-bg, $alpha: 0.36) !default; + +/** +* $name 11. Text color (text) +* $type color +*/ +$button-default-text-color: $button-default-bg !default; + +/** +* $name 21. Selected state text color (text) +* $type color +*/ $button-default-text-selected-color: $button-default-bg !default; /** @@ -271,4 +294,3 @@ $button-normal-text-hover-bg: color.change($button-normal-bg-inverted, $alpha: 0 $button-normal-text-focused-bg: color.change($button-normal-bg-inverted, $alpha: 0.08) !default; $button-normal-text-active-bg: color.change($button-normal-bg-inverted, $alpha: 0.3) !default; $button-normal-text-selected-bg: color.change($button-normal-bg-inverted, $alpha: 0.18) !default; - diff --git a/packages/devextreme-scss/scss/widgets/material/button/_index.scss b/packages/devextreme-scss/scss/widgets/material/button/_index.scss index c422110c613a..deb9f042057a 100644 --- a/packages/devextreme-scss/scss/widgets/material/button/_index.scss +++ b/packages/devextreme-scss/scss/widgets/material/button/_index.scss @@ -139,7 +139,7 @@ &.dx-button-default { @include dx-button-flat-color-styling( - $button-default-bg, + $button-default-text-color, $button-default-text-hover-bg, $button-default-text-focused-bg, $button-default-text-active-bg, @@ -184,8 +184,8 @@ &.dx-button-default { @include dx-button-outlined-color-styling( - $button-default-bg, - $button-default-bg, + $button-default-outlined-color, + $button-default-outlined-border-color, $button-default-outlined-hover-bg, $button-default-outlined-focused-bg, $button-default-outlined-active-bg, diff --git a/packages/devextreme-scss/scss/widgets/material/button/_mixins.scss b/packages/devextreme-scss/scss/widgets/material/button/_mixins.scss index cc02e3a408eb..c641e75cd348 100644 --- a/packages/devextreme-scss/scss/widgets/material/button/_mixins.scss +++ b/packages/devextreme-scss/scss/widgets/material/button/_mixins.scss @@ -130,7 +130,14 @@ } } -@mixin dx-button-flat-color-styling($button-color, $hover-bg, $focused-bg, $active-bg, $selected-bg: $active-bg, $selected-color: $button-color) { +@mixin dx-button-flat-color-styling( + $button-color, + $hover-bg, + $focused-bg, + $active-bg, + $selected-bg: $active-bg, + $selected-color: $button-color +) { @include dx-button-styling-variant( transparent, $button-color, @@ -143,7 +150,15 @@ ); } -@mixin dx-button-outlined-color-styling($button-color, $border-color, $hover-bg, $focused-bg, $active-bg, $selected-bg, $selected-color) { +@mixin dx-button-outlined-color-styling( + $button-color, + $border-color, + $hover-bg, + $focused-bg, + $active-bg, + $selected-bg, + $selected-color +) { border-width: 1px; border-style: solid; border-color: $border-color; From ef2202fcc7d67bf9089dbd7409ab6a09104d919b Mon Sep 17 00:00:00 2001 From: EugeniyKiyashko Date: Fri, 27 Dec 2024 17:36:17 +0400 Subject: [PATCH 04/15] Splitter: Initially collapsed pane cannot be expanded if an adjacent pane's maxSize is specified (T1240306) (#28646) --- .../js/__internal/ui/splitter/utils/layout.ts | 11 ++++++++++ .../ui/splitter/utils/layout_default.ts | 10 +++++++--- .../DevExpress.ui.widgets/splitter.tests.js | 20 +++++++++++++++++++ 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/packages/devextreme/js/__internal/ui/splitter/utils/layout.ts b/packages/devextreme/js/__internal/ui/splitter/utils/layout.ts index 27122e2004e5..3793a47714cb 100644 --- a/packages/devextreme/js/__internal/ui/splitter/utils/layout.ts +++ b/packages/devextreme/js/__internal/ui/splitter/utils/layout.ts @@ -40,6 +40,17 @@ export function findLastIndexOfNonCollapsedItem(items: Item[]): number { return -1; } +export function findLastVisibleExpandedItemIndex(items: Item[]): number { + for (let i = items.length - 1; i >= 0; i -= 1) { + const { collapsed, visible } = items[i]; + + if (collapsed !== true && visible !== false) { + return i; + } + } + return -1; +} + export function findIndexOfNextVisibleItem(items: Item[], index: number): number { for (let i = index + 1; i < items.length; i += 1) { if (items[i].visible !== false) { diff --git a/packages/devextreme/js/__internal/ui/splitter/utils/layout_default.ts b/packages/devextreme/js/__internal/ui/splitter/utils/layout_default.ts index a7fa013f7288..7c76f9a728c5 100644 --- a/packages/devextreme/js/__internal/ui/splitter/utils/layout_default.ts +++ b/packages/devextreme/js/__internal/ui/splitter/utils/layout_default.ts @@ -1,7 +1,11 @@ import { toFixed } from '@js/common/core/localization/utils'; import { isDefined } from '@js/core/utils/type'; -import { findLastIndexOfVisibleItem, normalizePanelSize } from './layout'; +import { + findLastIndexOfVisibleItem, + findLastVisibleExpandedItemIndex, + normalizePanelSize, +} from './layout'; import { compareNumbersWithPrecision, PRECISION } from './number_comparison'; import type { PaneRestrictions } from './types'; @@ -135,9 +139,9 @@ export function getDefaultLayout(layoutRestrictions: PaneRestrictions[]): number } if (remainingSize > 0) { - const paneIndex = findLastIndexOfVisibleItem(layoutRestrictions); + const paneIndex = findLastVisibleExpandedItemIndex(layoutRestrictions); - if (layoutRestrictions[paneIndex].collapsed === false) { + if (paneIndex !== -1) { nextLayout[paneIndex] += remainingSize; } } diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets/splitter.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets/splitter.tests.js index 6a56836c19be..318e1b0dd584 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets/splitter.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets/splitter.tests.js @@ -728,6 +728,24 @@ QUnit.module('Pane sizing', moduleConfig, () => { }, { items: [{ }, { collapsed: true }], expectedLayout: ['100', '0'], + }, { + items: [{ maxSize: '75%' }, { collapsed: true }], + expectedLayout: ['100', '0'], + }, { + items: [{ collapsed: true }, { visible: false }, { maxSize: '75%' }], + expectedLayout: ['0', '0', '100'], + }, { + items: [{ maxSize: '75%' }, { visible: false }, { collapsed: true }], + expectedLayout: ['100', '0', '0'], + }, { + items: [{ visible: false }, { collapsed: true }, { maxSize: '75%' }, { visible: false }], + expectedLayout: ['0', '0', '100', '0'], + }, { + items: [{ visible: false }, { maxSize: '75%' }, { visible: false }, { collapsed: true }, { visible: false }], + expectedLayout: ['0', '100', '0', '0', '0'], + }, { + items: [{ collapsed: true }, { maxSize: '75%' }], + expectedLayout: ['0', '100'], }, { items: [{ collapsed: true }, { collapsed: true }, { collapsed: true }], expectedLayout: ['0', '0', '0'], @@ -773,6 +791,8 @@ QUnit.module('Pane sizing', moduleConfig, () => { { position: 'prev', expectedLayout: ['0', '100'], items: [{ maxSize: '75%', collapsible: true }, { collapsible: true }] }, { position: 'prev', expectedLayout: ['0', '100'], items: [{ maxSize: '75%', collapsible: true }, { collapsible: true }] }, { position: 'prev', expectedLayout: ['0', '100'], items: [{ maxSize: '75%', collapsible: true }, { collapsible: true }] }, + { position: 'prev', expectedLayout: ['50', '50'], items: [{ maxSize: '75%', collapsible: false }, { collapsed: true, collapsible: true }] }, + { position: 'next', expectedLayout: ['50', '50'], items: [{ collapsed: true, collapsible: true }, { maxSize: '75%', collapsible: false }] }, { position: 'prev', expectedLayout: ['10.0806', '89.9194'], items: [{ collapsible: true, collapsedSize: 100 }, { collapsible: true, collapsedSize: 100 }] }, { position: 'next', expectedLayout: ['89.9194', '10.0806'], items: [{ collapsible: true, collapsedSize: 100 }, { collapsible: true, collapsedSize: 100 }] }, { position: 'next', expectedLayout: ['100', '0'], items: [{ minSize: '15%', collapsible: true }, { collapsible: true }] }, From 7db1651295e222e24e78073989a1dd6cfa6ab5ce Mon Sep 17 00:00:00 2001 From: EugeniyKiyashko Date: Fri, 27 Dec 2024 18:23:07 +0400 Subject: [PATCH 05/15] Splitter - Panes cannot be expanded/collapsed after window resize (T1262088) (#28648) --- .../js/__internal/ui/splitter/utils/layout.ts | 3 +-- .../DevExpress.ui.widgets/splitter.tests.js | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/packages/devextreme/js/__internal/ui/splitter/utils/layout.ts b/packages/devextreme/js/__internal/ui/splitter/utils/layout.ts index 3793a47714cb..20c9a39cefd1 100644 --- a/packages/devextreme/js/__internal/ui/splitter/utils/layout.ts +++ b/packages/devextreme/js/__internal/ui/splitter/utils/layout.ts @@ -220,8 +220,7 @@ export function getNextLayout( } const totalSize = nextLayout.reduce((total, size) => size + total, 0); - - if (!(compareNumbersWithPrecision(totalSize, 100, 3) === 0)) { + if (!(compareNumbersWithPrecision(totalSize, 100, 2) === 0)) { return currentLayout; } diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets/splitter.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets/splitter.tests.js index 318e1b0dd584..8f1e107d0d22 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets/splitter.tests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets/splitter.tests.js @@ -1307,6 +1307,25 @@ QUnit.module('Pane sizing', moduleConfig, () => { }, resizeObserverTimeout); }); }); + + QUnit.test('The splitter pane can safely collapse if the total size layout calculation error is less than three decimal places (T1262088)', function(assert) { + this.reinit({ + width: 733.67, + height: 200, + items: [ { collapsible: true }, { collapsible: true }, { collapsible: true }], + }); + + this.assertLayout(['33.3333', '33.3333', '33.3333']); + + this.instance._layout = [33.3338502509, 33.3338502509, 33.3338502509]; + + const $resizeHandle = this.getResizeHandles().first(); + const $collapsePrevButton = this.getCollapsePrevButton($resizeHandle); + + $collapsePrevButton.trigger('dxclick'); + + this.assertLayout(['0', '66.6677', '33.3339']); + }); }); QUnit.module('Resizing', moduleConfig, () => { From 1cc7b7ca6179f829dc3a84485f44f24f25033fa4 Mon Sep 17 00:00:00 2001 From: Anna Shakhova <68295572+anna-shakhova@users.noreply.github.com> Date: Fri, 27 Dec 2024 16:35:28 +0100 Subject: [PATCH 06/15] CollectionAsync: use unique string keys to index _asyncTemplateItems (T1269855) (#28653) --- apps/demos/testing/common.test.js | 6 - .../js/__internal/ui/collection/base.ts | 1 + .../collection/m_collection_widget.async.ts | 29 +++-- .../ui/tree_view/m_tree_view.base.ts | 2 +- .../listParts/commonTests.js | 48 +++++++ .../treeView.async.tests.js | 122 ++++++++++++++++++ 6 files changed, 193 insertions(+), 15 deletions(-) create mode 100644 packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.async.tests.js diff --git a/apps/demos/testing/common.test.js b/apps/demos/testing/common.test.js index d71bf8f3cc76..d7c0b22b13eb 100644 --- a/apps/demos/testing/common.test.js +++ b/apps/demos/testing/common.test.js @@ -133,9 +133,6 @@ const SKIPPED_TESTS = { ], }, React: { - Common: [ - { demo: 'ActionAndListsOverview', themes: [THEME.generic, THEME.material] }, - ], Charts: [ { demo: 'PiesWithEqualSize', themes: [THEME.material] }, { demo: 'CustomAnnotations', themes: [THEME.material] }, @@ -182,9 +179,6 @@ const SKIPPED_TESTS = { ], }, Vue: { - Common: [ - { demo: 'ActionAndListsOverview', themes: [THEME.generic, THEME.material] }, - ], Charts: [ { demo: 'TilingAlgorithms', themes: [THEME.material] }, { demo: 'ExportAndPrintingAPI', themes: [THEME.material] }, diff --git a/packages/devextreme/js/__internal/ui/collection/base.ts b/packages/devextreme/js/__internal/ui/collection/base.ts index 9928a0d14007..ee4c3b547cc8 100644 --- a/packages/devextreme/js/__internal/ui/collection/base.ts +++ b/packages/devextreme/js/__internal/ui/collection/base.ts @@ -47,6 +47,7 @@ declare class Base< container: dxElementWrapper; contentClass: string; defaultTemplateName: string; + uniqueKey?: string; }): dxElementWrapper; _renderContent(): void; _postprocessRenderItem(args: unknown): void; diff --git a/packages/devextreme/js/__internal/ui/collection/m_collection_widget.async.ts b/packages/devextreme/js/__internal/ui/collection/m_collection_widget.async.ts index 7660b180bc8d..e4c3dc9f1365 100644 --- a/packages/devextreme/js/__internal/ui/collection/m_collection_widget.async.ts +++ b/packages/devextreme/js/__internal/ui/collection/m_collection_widget.async.ts @@ -1,11 +1,13 @@ +import Guid from '@js/core/guid'; import { noop } from '@js/core/utils/common'; +import type { DeferredObj } from '@js/core/utils/deferred'; import { Deferred, when } from '@js/core/utils/deferred'; import CollectionWidgetEdit from './m_collection_widget.edit'; const AsyncCollectionWidget = CollectionWidgetEdit.inherit({ _initMarkup() { - this._asyncTemplateItems = []; + this._asyncTemplateItemsMap = {}; this.callBase(); }, @@ -17,9 +19,10 @@ const AsyncCollectionWidget = CollectionWidgetEdit.inherit({ _renderItemContent(args) { const renderContentDeferred = Deferred(); const itemDeferred = Deferred(); + const uniqueKey = `dx${new Guid()}`; - this._asyncTemplateItems[args.index] = itemDeferred; - const $itemContent = this.callBase(args); + this._asyncTemplateItemsMap[uniqueKey] = itemDeferred; + const $itemContent = this.callBase({ ...args, uniqueKey }); itemDeferred.done(() => { renderContentDeferred.resolve($itemContent); @@ -30,7 +33,7 @@ const AsyncCollectionWidget = CollectionWidgetEdit.inherit({ _onItemTemplateRendered(itemTemplate, renderArgs) { return () => { - this._asyncTemplateItems[renderArgs.index]?.resolve(); + this._asyncTemplateItemsMap[renderArgs.uniqueKey]?.resolve(); }; }, @@ -38,19 +41,29 @@ const AsyncCollectionWidget = CollectionWidgetEdit.inherit({ _planPostRenderActions(...args: unknown[]) { const d = Deferred(); - when.apply(this, this._asyncTemplateItems).done(() => { + const asyncTemplateItems = Object.values>(this._asyncTemplateItemsMap); + + when.apply(this, asyncTemplateItems).done(() => { this._postProcessRenderItems(...args); - d.resolve(); + + d.resolve().done(() => { + this._asyncTemplateItemsMap = {}; + }); }); + return d.promise(); }, _clean() { this.callBase(); - this._asyncTemplateItems.forEach((item) => { + + const asyncTemplateItems = Object.values>(this._asyncTemplateItemsMap); + + asyncTemplateItems.forEach((item) => { item.reject(); }); - this._asyncTemplateItems = []; + + this._asyncTemplateItemsMap = {}; }, }); diff --git a/packages/devextreme/js/__internal/ui/tree_view/m_tree_view.base.ts b/packages/devextreme/js/__internal/ui/tree_view/m_tree_view.base.ts index bab507e26c34..7bbcc586858a 100644 --- a/packages/devextreme/js/__internal/ui/tree_view/m_tree_view.base.ts +++ b/packages/devextreme/js/__internal/ui/tree_view/m_tree_view.base.ts @@ -1441,7 +1441,7 @@ const TreeViewBase = (HierarchicalCollectionWidget as any).inherit({ if (this._showCheckboxes()) { const parentValue = parentNode.internalFields.selected; - this._getCheckBoxInstance($parentNode).option('value', parentValue); + this._getCheckBoxInstance($parentNode)?.option('value', parentValue); this._toggleSelectedClass($parentNode, parentValue); } diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets/listParts/commonTests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets/listParts/commonTests.js index 73d02c4d7201..072dc0b5b7cc 100644 --- a/packages/devextreme/testing/tests/DevExpress.ui.widgets/listParts/commonTests.js +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets/listParts/commonTests.js @@ -3683,6 +3683,54 @@ QUnit.module('regressions', moduleSetup, () => { assert.equal(count, 1); }); + + QUnit.test('Selection: item selected correctly on async render with tree structure (T1269855)', function(assert) { + this.clock.restore(); + const done = assert.async(); + + const data = [ + { id: 1, name: 'Item 1_1', group: 'group_1' }, + { id: 2, name: 'Item 1_2', group: 'group_1' }, + { id: 3, name: 'Item 1_3', group: 'group_1' }, + { id: 4, name: 'Item 2_1', group: 'group_2' }, + ]; + + const dataSource = new DataSource({ + store: new ArrayStore({ data, key: 'id' }), + group: 'group', + }); + + const instance = new List($('#list'), { + dataSource, + grouped: true, + templatesRenderAsynchronously: true, + integrationOptions: { + templates: { + 'item': { + render: function({ model, container, onRendered }) { + setTimeout(function() { + const $item = $(`
${model.name}
`); + $item.appendTo(container); + + onRendered(); + }, 100); + } + }, + } + }, + selectionMode: 'single', + selectedItemKeys: [data[0].id], + }); + + instance.option('_onItemsRendered', () => { + const listElement = instance.element(); + const $firstGroup = $(listElement).find(`.${LIST_GROUP_CLASS}`).eq(0); + const $firstItemInFirstGroup = $firstGroup.find(`.${LIST_ITEM_CLASS}`).eq(0); + + assert.ok($firstItemInFirstGroup.hasClass(LIST_ITEM_SELECTED_CLASS), 'First item in first group should be selected'); + done(); + }); + }); }); QUnit.module('widget sizing render', {}, () => { diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.async.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.async.tests.js new file mode 100644 index 000000000000..9cba4f0d050b --- /dev/null +++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets/treeView.async.tests.js @@ -0,0 +1,122 @@ +import $ from 'jquery'; +import TreeView from 'ui/tree_view'; + +import 'generic_light.css!'; + +const { testStart } = QUnit; + +testStart(function() { + const markup = '
'; + + $('#qunit-fixture').html(markup); +}); + +const asyncTemplateRenderTimeout = 50; + +const CHECKBOX_CLASS = 'dx-checkbox'; +const CHECKBOX_CHECKED_CLASS = 'dx-checkbox-checked'; +const CHECKBOX_INDETERMINATE_CLASS = 'dx-checkbox-indeterminate'; +const TREEVIEW_ROOT_NODE_CLASS = 'dx-treeview-root-node'; + +QUnit.module('Async render', () => { + ['normal', 'selectAll'].forEach((showCheckBoxesMode) => { + QUnit.test(`TreeView checkboxed should be correctly rendered in async mode. checkboxMode: ${showCheckBoxesMode} (T1269855)`, function(assert) { + const done = assert.async(); + + const data = [ + { + id: 1, + text: 'Item 1', + expanded: true, + selected: true, + items: [ + { + id: 12, text: 'Nested Item 2', expanded: true, items: [ + { id: 121, text: 'Third level item 1' }, + { id: 122, text: 'Third level item 2' } + ] + } + ] + }, + { + id: 2, + text: 'Item 2', + expanded: true, + items: [ + { + id: 22, text: 'Nested Item 2', expanded: true, items: [ + { id: 221, text: 'Third level item 1' }, + { id: 222, text: 'Third level item 2', selected: true } + ] + } + ] + }, + { + id: 3, + text: 'Item 3', + expanded: true, + items: [ + { + id: 33, text: 'Nested Item 3', expanded: true, items: [ + { id: 331, text: 'Third level item 1' }, + { id: 332, text: 'Third level item 2' } + ] + } + ] + } + ]; + + const instance = new TreeView($('#treeView'), { + items: data, + showCheckBoxesMode, + templatesRenderAsynchronously: true, + itemTemplate: 'myTemplate', + integrationOptions: { + templates: { + myTemplate: { + render({ model, container, onRendered }) { + setTimeout(() => { + const $item = $(`
${model.text}
`); + $item.appendTo(container); + + onRendered(); + }); + } + } + } + }, + }); + + setTimeout(() => { + const element = instance.itemsContainer(); + const $treeRootNodes = $(element).find(`.${TREEVIEW_ROOT_NODE_CLASS}`); + + const $firstRootNode = $treeRootNodes.eq(0); + const $firstGroupCheckboxes = $firstRootNode.find(`.${CHECKBOX_CLASS}`); + + assert.ok($firstGroupCheckboxes.eq(0).hasClass(CHECKBOX_CHECKED_CLASS), 'First group root checkbox has selected class'); + assert.ok($firstGroupCheckboxes.eq(1).hasClass(CHECKBOX_CHECKED_CLASS), 'First group nested node checkbox has selected class'); + assert.ok($firstGroupCheckboxes.eq(2).hasClass(CHECKBOX_CHECKED_CLASS), 'First group leaf node 1 checkbox has selected class'); + assert.ok($firstGroupCheckboxes.eq(3).hasClass(CHECKBOX_CHECKED_CLASS), 'First group leaf node 2 checkbox has selected class'); + + const $secondRootNode = $treeRootNodes.eq(1); + const $secondGroupCheckboxes = $secondRootNode.find(`.${CHECKBOX_CLASS}`); + + assert.ok($secondGroupCheckboxes.eq(0).hasClass(CHECKBOX_INDETERMINATE_CLASS), 'Second group root checkbox has indeterminate class'); + assert.ok($secondGroupCheckboxes.eq(1).hasClass(CHECKBOX_INDETERMINATE_CLASS), 'Second group nested node checkbox has indeterminate class'); + assert.notOk($secondGroupCheckboxes.eq(2).hasClass(CHECKBOX_CHECKED_CLASS), 'Second group leaf node 1 checkbox has not selected class'); + assert.ok($secondGroupCheckboxes.eq(3).hasClass(CHECKBOX_CHECKED_CLASS), 'Second group leaf node 2 checkbox has selected class'); + + const $thirdRootNode = $treeRootNodes.eq(2); + const $thirdGroupCheckboxes = $thirdRootNode.find(`.${CHECKBOX_CLASS}`); + + assert.notOk($thirdGroupCheckboxes.eq(0).hasClass(CHECKBOX_CHECKED_CLASS), 'Third group root checkbox has not selected class'); + assert.notOk($thirdGroupCheckboxes.eq(1).hasClass(CHECKBOX_CHECKED_CLASS), 'Third group nested node checkbox has not selected class'); + assert.notOk($thirdGroupCheckboxes.eq(2).hasClass(CHECKBOX_CHECKED_CLASS), 'Third group leaf node 1 checkbox has not selected class'); + assert.notOk($thirdGroupCheckboxes.eq(3).hasClass(CHECKBOX_CHECKED_CLASS), 'Third group leaf node 2 checkbox has not selected class'); + + done(); + }, asyncTemplateRenderTimeout); + }); + }); +}); From e15ebe0c4b22ad5791452782112ecf1744e8a5f8 Mon Sep 17 00:00:00 2001 From: Vlada Skorohodova <94827090+vladaskorohodova@users.noreply.github.com> Date: Mon, 30 Dec 2024 14:50:48 +0400 Subject: [PATCH 07/15] 24.2 demos: update descriptions (#28655) (#28656) --- .../Chat/AIAndChatbotIntegration/description.md | 4 ++-- .../Demos/Chat/Customization/description.md | 2 +- apps/demos/Demos/Chat/Overview/description.md | 16 ++++++++-------- .../Demos/Chat/Overview/jQuery/description.md | 16 ++++++++-------- .../DataGrid/ColumnReordering/description.md | 8 ++++---- .../FixedAndStickyColumns/description.md | 12 ++++++------ .../HtmlEditor/MarkdownSupport/description.md | 6 +++--- .../Demos/Map/ProvidersAndTypes/description.md | 8 ++++---- .../Demos/Pagination/Overview/description.md | 6 +++--- .../Demos/TreeList/ColumnFixing/description.md | 12 ++++++------ .../Demos/TreeList/Reordering/description.md | 8 ++++---- 11 files changed, 49 insertions(+), 49 deletions(-) diff --git a/apps/demos/Demos/Chat/AIAndChatbotIntegration/description.md b/apps/demos/Demos/Chat/AIAndChatbotIntegration/description.md index a7e914317678..b53fb1b2a7b4 100644 --- a/apps/demos/Demos/Chat/AIAndChatbotIntegration/description.md +++ b/apps/demos/Demos/Chat/AIAndChatbotIntegration/description.md @@ -1,8 +1,8 @@ -This demo uses an [Azure OpenAI](https://azure.microsoft.com/en-us/products/ai-services/openai-service) service and the DevExtreme Chat component to create a chatbot UI. You can integrate Chat with various AI services, including [OpenAI](https://openai.com/), [Google Dialogflow](https://cloud.google.com/dialogflow/docs), and [Microsoft Bot Framework](https://dev.botframework.com/). +This demo leverages the [Azure OpenAI](https://azure.microsoft.com/en-us/products/ai-services/openai-service) service alongside the DevExtreme Chat component. You can integrate Chat with multiple AI services, including [OpenAI](https://openai.com/), [Google Dialogflow](https://cloud.google.com/dialogflow/docs), and [Microsoft Bot Framework](https://dev.botframework.com/). ## Handling dataSource (reloadOnChange: false) -The Chat component's [dataSource](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#dataSource) is a [CustomStore](/Documentation/ApiReference/Data_Layer/CustomStore/) that implements its own load and insert functions. The Chat deactivates [reloadOnChange](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#reloadOnChange) to push updates directly into the store and update the conversation manually. See the [onMessageEntered](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#onMessageEntered) event handler and the `processMessageSending` function to review the code that manages data transfer between the Chat and its data store. +The Chat component's [dataSource](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#dataSource) is a [CustomStore](/Documentation/ApiReference/Data_Layer/CustomStore/) that implements its own load and insert functions. The DevExtreme Chat component deactivates [reloadOnChange](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#reloadOnChange) to push updates directly into the store and update the conversation manually. See the[onMessageEntered](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#onMessageEntered) event handler and the `processMessageSending` function to review the code that manages data transfer between our Chat component and its data store. ## Custom Message Template diff --git a/apps/demos/Demos/Chat/Customization/description.md b/apps/demos/Demos/Chat/Customization/description.md index d2a48de2bfb3..36bef8d097d2 100644 --- a/apps/demos/Demos/Chat/Customization/description.md +++ b/apps/demos/Demos/Chat/Customization/description.md @@ -1,4 +1,4 @@ -Use the following properties to customize the Chat component: +Use the following properties to customize the DevExtreme Chat component: - To display/hide Chat UI elements: - [showAvatar](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#showAvatar) diff --git a/apps/demos/Demos/Chat/Overview/description.md b/apps/demos/Demos/Chat/Overview/description.md index 309df619d015..5991dc8a0b31 100644 --- a/apps/demos/Demos/Chat/Overview/description.md +++ b/apps/demos/Demos/Chat/Overview/description.md @@ -1,27 +1,27 @@ -Chat is an interactive interface that allows users to send and receive messages in real time. +Chat is an interactive UI component designed to send/receive messages in real time. To get started with the DevExtreme Chat component, refer to the following step-by-step tutorial: [Getting Started with Chat](/Documentation/Guide/UI_Components/Chat/Getting_Started_with_Chat/). -The demo implements basic Chat functionality: specifies initial messages, updates the conversation with new incoming and outgoing messages, manages users, and links two chats in real-time. +The demo implements basic Chat functionality: specifies initial messages, updates the conversation with new incoming/outgoing messages, manages users, and links two chats in real-time. ## Messages -To specify initial messages, you can either populate the [items](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#items) array (shown in this demo) or use a [dataSource](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#dataSource). +To specify an initial message, you can populate the [items](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#items) array (shown in this demo) or use a [dataSource](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#dataSource). Use the following API to render new messages: -- If you use **items**, update the array with the new message. -- If you use a **dataSource**, implement [load](/Documentation/ApiReference/Data_Layer/CustomStore/Configuration/#load) and [insert](/Documentation/ApiReference/Data_Layer/CustomStore/Configuration/#insert) operations. +- If using **items**, update the array with the new message. +- If using a **dataSource**, implement [load](/Documentation/ApiReference/Data_Layer/CustomStore/Configuration/#load) and [insert](/Documentation/ApiReference/Data_Layer/CustomStore/Configuration/#insert) operations. ## Users -To specify the chat owner, set the [user](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#user) property. Owner messages align to the right (or left in RTL mode) and do not display the name or avatar. +To specify the chat owner, set the [user](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#user) property. Owner messages align to the right (or left in RTL mode) and do not display a name or avatar. Each message includes information about the sender ([author](/Documentation/ApiReference/UI_Components/dxChat/Types/Message/#author)): name, avatar, and alternative avatar text. If no avatar is set, the user's initials are displayed instead. ## Events -If a user enters a message, the Chat raises the [messageEntered](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#onMessageEntered) event. Use the event handler to process the message. For example, you can display the message in the message feed and send the message to the server for storage. +If a user enters a message, the Chat component raises the [messageEntered](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#onMessageEntered) event. Use the event handler to process the message. For example, you can display the message in the message feed and send the message to the server for storage. -When users start or finish typing, the Chat raises [typingStart](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#onTypingStart) and [typingEnd](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#onTypingEnd) events. Use these events to manage the [typingUsers](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#typingUsers) array. The Chat uses this array to display a list of active users. \ No newline at end of file +When users start or complete text entry, our Chat component raises [typingStart](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#onTypingStart) and [typingEnd](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#onTypingEnd) events. Use these events to manage the [typingUsers](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#typingUsers) array. The DevExtreme Chat uses this array to display a list of active users. \ No newline at end of file diff --git a/apps/demos/Demos/Chat/Overview/jQuery/description.md b/apps/demos/Demos/Chat/Overview/jQuery/description.md index d652a955e143..03cf50deacf3 100644 --- a/apps/demos/Demos/Chat/Overview/jQuery/description.md +++ b/apps/demos/Demos/Chat/Overview/jQuery/description.md @@ -1,27 +1,27 @@ -Chat is an interactive interface that allows users to send and receive messages in real time. +Chat is an interactive UI component designed to send/receive messages in real time. To get started with the DevExtreme Chat component, refer to the following step-by-step tutorial: [Getting Started with Chat](/Documentation/Guide/UI_Components/Chat/Getting_Started_with_Chat/). -The demo implements basic Chat functionality: specifies initial messages, updates the conversation with new incoming and outgoing messages, manages users, and links two chats in real-time. +The demo implements basic Chat functionality: specifies initial messages, updates the conversation with new incoming/outgoing messages, manages users, and links two chats in real-time. ## Messages -To specify initial messages, you can either populate the [items](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#items) array (shown in this demo) or use a [dataSource](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#dataSource). +To specify an initial message, you can populate the [items](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#items) array (shown in this demo) or use a [dataSource](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#dataSource). Use the following API to render new messages: -- If you use **items**, call the [renderMessage()](/Documentation/ApiReference/UI_Components/dxChat/Methods/#renderMessagemessage) method. -- If you use a **dataSource**, implement [load](/Documentation/ApiReference/Data_Layer/CustomStore/Configuration/#load) and [insert](/Documentation/ApiReference/Data_Layer/CustomStore/Configuration/#insert) operations. +- If using **items**, call the [renderMessage()](/Documentation/ApiReference/UI_Components/dxChat/Methods/#renderMessagemessage) method. +- If using a **dataSource**, implement [load](/Documentation/ApiReference/Data_Layer/CustomStore/Configuration/#load) and [insert](/Documentation/ApiReference/Data_Layer/CustomStore/Configuration/#insert) operations. ## Users -To specify the chat owner, set the [user](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#user) property. Owner messages align to the right (or left in RTL mode) and do not display the name or avatar. +To specify the chat owner, set the [user](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#user) property. Owner messages align to the right (or left in RTL mode) and do not display a name or avatar. Each message includes information about the sender ([author](/Documentation/ApiReference/UI_Components/dxChat/Types/Message/#author)): name, avatar, and alternative avatar text. If no avatar is set, the user's initials are displayed instead. ## Events -If a user enters a message, the Chat raises the [messageEntered](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#onMessageEntered) event. Use the event handler to process the message. For example, you can display the message in the message feed and send the message to the server for storage. +If a user enters a message, the Chat component raises the [messageEntered](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#onMessageEntered) event. Use the event handler to process the message. For example, you can display the message in the message feed and send the message to the server for storage. -When users start or finish typing, the Chat raises [typingStart](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#onTypingStart) and [typingEnd](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#onTypingEnd) events. Use these events to manage the [typingUsers](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#typingUsers) array. The Chat uses this array to display a list of active users. \ No newline at end of file +When users start or complete text entry, our Chat component raises [typingStart](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#onTypingStart) and [typingEnd](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#onTypingEnd) events. Use these events to manage the [typingUsers](/Documentation/ApiReference/UI_Components/dxChat/Configuration/#typingUsers) array. The DevExtreme Chat uses this array to display a list of active users. \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/ColumnReordering/description.md b/apps/demos/Demos/DataGrid/ColumnReordering/description.md index f2369f9506a3..260cb8dd42d5 100644 --- a/apps/demos/Demos/DataGrid/ColumnReordering/description.md +++ b/apps/demos/Demos/DataGrid/ColumnReordering/description.md @@ -1,12 +1,12 @@ -DataGrid columns have the same order as fields in data objects. You can use the [columns](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/columns/) array to specify a different order. To reorder a column at runtime, change **column**.[visibleIndex](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/columns/#visibleIndex) property. +DevExtreme DataGrid columns use the same display order as fields in data objects. You can use the [columns](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/columns/) array to specify a different display order. To reorder a column at runtime, change the **column**.[visibleIndex](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/columns/#visibleIndex) property. -Users can drag and drop column headers to reorder columns. To enable this feature, set the [allowColumnReordering](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/#allowColumnReordering) property to **true**. If you do not want users to drag a specific column, disable its **column**.[allowReordering](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/columns/#allowReordering) property. +Users can drag and drop column headers to reorder columns as needed. To activate this feature, set the [allowColumnReordering](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/#allowColumnReordering) property to **true**. If you wish to prevent reorder operations for a given column, disable its **column**.[allowReordering](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/columns/#allowReordering) property. -This demo shows how [fixed](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/columns/#fixed) columns behave during user-initiated reordering. Users can drag and drop columns within the following areas (but not between them): +This demo illustrates [fixed](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/columns/#fixed) column behavior during user-initiated column reorder operations. Users can drag & drop columns within the following areas (but not between them): - Columns fixed to the left - Non-fixed columns - Columns fixed to the right -Sticky columns (fixed with the 'sticky' [position](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/columns/#fixedPosition)) behave like non-fixed columns during reordering (even if they are in a state where they are attached to a border/fixed column). To see sticky columns in this demo, right-click a column to open a context menu. Choose "Set Fixed Position -> Sticky" to stick a column. \ No newline at end of file +Sticky columns (fixed with the 'sticky' [position](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/columns/#fixedPosition)) behave like non-fixed columns during reorder operations (even if they are in a state where they are attached to a border/fixed column). To see sticky columns in this demo, right-click a column to open the DataGrid’s context menu. Choose "Set Fixed Position -> Sticky" to stick a given column. \ No newline at end of file diff --git a/apps/demos/Demos/DataGrid/FixedAndStickyColumns/description.md b/apps/demos/Demos/DataGrid/FixedAndStickyColumns/description.md index 33e1bbc0b9f0..5db6ce1a9711 100644 --- a/apps/demos/Demos/DataGrid/FixedAndStickyColumns/description.md +++ b/apps/demos/Demos/DataGrid/FixedAndStickyColumns/description.md @@ -1,15 +1,15 @@ -A horizontal scrollbar appears when the total width of all columns exceeds the DataGrid component's width. To keep a column visible when scrolling, set the **columnFixing**.[enabled](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/columnFixing/#enabled) property to `true`. +A horizontal scrollbar appears when the total width of all grid columns exceeds the DevExtreme DataGrid’s overall width. To maintain column visibility when scrolling horizontally, set the **columnFixing**.[enabled](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/columnFixing/#enabled) property to `true`. -To fix a column programmatically, set its [fixed](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/columns/#fixed) property to `true` and select the column's [fixedPosition](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/columns/#fixedPosition): +To fix a column programmatically, set its [fixed](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/columns/#fixed) property to `true` and specify the desired [fixedPosition](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/columns/#fixedPosition): - *'left'* (default if `fixed: true`) -The column is fixed to the left edge of the grid. +The column is fixed to the leftmost edge of the grid. - *'right'* -The column is fixed to the right edge of the grid. +The column is fixed to the rightmost edge of the grid. - *'sticky'* -The column sticks to left and right edges when it reaches them. +The column "sticks" to the left or rightmost edge when it reaches either side of the grid. -To fix or unfix a column, users should right-click the column's header and select the corresponding operation in the context menu. To prevent users from fixing or unfixing a column, set its [allowFixing](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/columns/#allowFixing) property to `false`. +To fix (or unfix) a column, right-click a column header and select the desired operation using the DataGrid’s built-in context menu. To prevent users from fixing/unfixing a column, set its [allowFixing](/Documentation/ApiReference/UI_Components/dxDataGrid/Configuration/columns/#allowFixing) property to `false`. \ No newline at end of file diff --git a/apps/demos/Demos/HtmlEditor/MarkdownSupport/description.md b/apps/demos/Demos/HtmlEditor/MarkdownSupport/description.md index b99c5bc2b2da..09247fb40be8 100644 --- a/apps/demos/Demos/HtmlEditor/MarkdownSupport/description.md +++ b/apps/demos/Demos/HtmlEditor/MarkdownSupport/description.md @@ -1,6 +1,6 @@ -DevExtreme HTML Editor uses HTML markup to format its document content. This demo module converts content to Markdown with the help of the [unified](https://github.com/unifiedjs/unified) plugin library. +The DevExtreme HTML Editor uses HTML markup to format document content. This demo module converts content to Markdown using the [unified](https://github.com/unifiedjs/unified) plugin library. -The code sets the the editor's [converter](/Documentation/ApiReference/UI_Components/dxHtmlEditor/Configuration/converter/) property to an object that implements two functions: [toHtml](/Documentation/ApiReference/UI_Components/dxHtmlEditor/Configuration/converter/#toHtml) and [fromHtml](/Documentation/ApiReference/UI_Components/dxHtmlEditor/Configuration/converter/#fromHtml). +This sample implementation sets the HTML Editor's [converter](/Documentation/ApiReference/UI_Components/dxHtmlEditor/Configuration/converter/) property to an object that implements two functions: [toHtml](/Documentation/ApiReference/UI_Components/dxHtmlEditor/Configuration/converter/#toHtml) and [fromHtml](/Documentation/ApiReference/UI_Components/dxHtmlEditor/Configuration/converter/#fromHtml). -Try to edit or format text in the HTML Editor control and see how the Markdown Preview section reflects those changes. +To review our implementation, edit or format text within the HTML Editor control and see how the Markdown Preview section reflects changes. \ No newline at end of file diff --git a/apps/demos/Demos/Map/ProvidersAndTypes/description.md b/apps/demos/Demos/Map/ProvidersAndTypes/description.md index 386740a0d821..762fadaf50a5 100644 --- a/apps/demos/Demos/Map/ProvidersAndTypes/description.md +++ b/apps/demos/Demos/Map/ProvidersAndTypes/description.md @@ -1,13 +1,13 @@ -The [provider](/Documentation/ApiReference/UI_Components/dxMap/Configuration/#provider) property specifies which map provider to use: Google Maps (default), Azure Maps, Google Static Maps, or Bing Maps (deprecated). +The [provider](/Documentation/ApiReference/UI_Components/dxMap/Configuration/#provider) property specifies the map provider used: Google Maps (default), Azure Maps, Google Static Maps, or Bing Maps (deprecated). -You can also set the [type](/Documentation/ApiReference/UI_Components/dxMap/Configuration/#type) property to specify the map type: road, satellite (photographic), or hybrid map. +You can also set the [type](/Documentation/ApiReference/UI_Components/dxMap/Configuration/#type) property to specify desired map type: road, satellite (photographic), or hybrid map. [note] -On May 21, 2024, Microsoft announced that [Bing Maps for Enterprise and its API will be discontinued](https://www.microsoft.com/en-us/maps/bing-maps/discontinued-services). [Azure Maps](https://azure.microsoft.com/en-us/products/azure-maps/) will be a single unified enterprise mapping platform available from Microsoft. +On May 21, 2024, Microsoft announced that [Bing Maps for Enterprise and its API will be discontinued](https://www.microsoft.com/en-us/maps/bing-maps/discontinued-services). Moving forward, [Azure Maps](https://azure.microsoft.com/en-us/products/azure-maps/) will be Microsoft’s unified enterprise mapping platform. -If you have an existing Bing Maps for Enterprise license, you can continue using Bing for our Map component until its support ends. You need to transition to the new API before June 30, 2025 (free and basic license) or before June 30, 2028 (enterprise license). +If you have an existing Bing Maps for Enterprise license, you can continue using Bing alongside our Map component until support ends. You need to transition to a new API before June 30, 2025 (free and basic license) or before June 30, 2028 (enterprise license). The last date you can get a new Bing Maps for Enterprise license is June 30, 2024. If you do not have an existing license after this date, you can only use other [map providers](/Documentation/ApiReference/UI_Components/dxMap/Types/#MapProvider) supported by our controls: Azure, Google, and Google Static. diff --git a/apps/demos/Demos/Pagination/Overview/description.md b/apps/demos/Demos/Pagination/Overview/description.md index e334bd8d669b..49bcd82c6440 100644 --- a/apps/demos/Demos/Pagination/Overview/description.md +++ b/apps/demos/Demos/Pagination/Overview/description.md @@ -1,10 +1,10 @@ -DevExpress Pagination UI component allows users to navigate between pages and adjust page size at runtime. In this demo, users can browse employee cards with the Pagination component. +DevExpress Pagination component allows users to navigate between pages and adjust page size at runtime. In this demo, users can browse through individual employee cards using the Pagination component. -To set up a Pagination component, specify the following options: +To set up our Pagination component, specify the following options: - [itemCount](/Documentation/ApiReference/UI_Components/dxPagination/Configuration/#itemCount): the total number of elements in the target control. - [pageSize](/Documentation/ApiReference/UI_Components/dxPagination/Configuration/#pageSize): the number of items per page. -- [allowedPageSizes](/Documentation/ApiReference/UI_Components/dxPagination/Configuration/#allowedPageSizes) : available page size choices. +- [allowedPageSizes](/Documentation/ApiReference/UI_Components/dxPagination/Configuration/#allowedPageSizes): available page size choices. - [pageIndex](/Documentation/ApiReference/UI_Components/dxPagination/Configuration/#pageIndex): page displayed first. - [showNavigationButtons](/Documentation/ApiReference/UI_Components/dxPagination/Configuration/#showNavigationButtons): navigation button visibility. - [showInfo](/Documentation/ApiReference/UI_Components/dxPagination/Configuration/#showInfo): information pane visibility. \ No newline at end of file diff --git a/apps/demos/Demos/TreeList/ColumnFixing/description.md b/apps/demos/Demos/TreeList/ColumnFixing/description.md index d8d8917ac35d..3292a6800624 100644 --- a/apps/demos/Demos/TreeList/ColumnFixing/description.md +++ b/apps/demos/Demos/TreeList/ColumnFixing/description.md @@ -1,15 +1,15 @@ -A horizontal scrollbar appears when the total width of all columns exceeds the TreeList component's width. To keep a column visible when scrolling, set the **columnFixing**.[enabled](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columnFixing/#enabled) property to `true`. +A horizontal scrollbar appears when the total width of all grid columns exceeds the DevExtreme TreeList's overall width. To maintain column visibility when scrolling horizontally, set the **columnFixing**.[enabled](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columnFixing/#enabled) property to `true`. -To fix a column programmatically, set its [fixed](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#fixed) property to `true` and select the column's [fixedPosition](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#fixedPosition): +To fix a column programmatically, set its [fixed](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#fixed) property to `true` and specify the desired [fixedPosition](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#fixedPosition): - *'left'* (default if `fixed: true`) -The column is fixed to the left edge of the grid. +The column is fixed to the leftmost edge of the grid. - *'right'* -The column is fixed to the right edge of the grid. +The column is fixed to the rightmost edge of the grid. - *'sticky'* -The column sticks to left and right edges when it reaches them. +The column "sticks" to the left or rightmost edge when it reaches either side of the grid. -To fix or unfix a column, users should right-click the column's header and select the corresponding operation in the context menu. To prevent users from fixing or unfixing a column, set its [allowFixing](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#allowFixing) property to `false`. +To fix (or unfix) a column, right-click a column header and select the desired operation using the DataGrid’s built-in context menu. To prevent users from fixing/unfixing a column, set its [allowFixing](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#allowFixing) property to `false`. \ No newline at end of file diff --git a/apps/demos/Demos/TreeList/Reordering/description.md b/apps/demos/Demos/TreeList/Reordering/description.md index 2e0410703b4d..72553c74669e 100644 --- a/apps/demos/Demos/TreeList/Reordering/description.md +++ b/apps/demos/Demos/TreeList/Reordering/description.md @@ -1,12 +1,12 @@ -TreeList columns have the same order as fields in data objects. You can use the [columns](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/) array to specify a different order. To reorder a column at runtime, change **column**.[visibleIndex](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#visibleIndex) property. +DevExtreme TreeList columns use the same display order as fields in data objects. You can use the [columns](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/) array to specify a different display order. To reorder a column at runtime, change the **column**.[visibleIndex](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#visibleIndex) property. -Users can drag and drop column headers to reorder columns. To enable this feature, set the [allowColumnReordering](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/#allowColumnReordering) property to **true**. If you do not want users to drag a specific column, disable **column**.[allowReordering](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#allowReordering) property. +Users can drag and drop column headers to reorder columns as needed. To activate this feature, set the [allowColumnReordering](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/#allowColumnReordering) property to **true**. If you wish to prevent reorder operations for a given column, disable its **column**.[allowReordering](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#allowReordering) property. -This demo shows how [fixed](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#fixed) columns behave during user-initiated reordering. Users can drag and drop columns within the following areas (but not between them): +This demo illustrates [fixed](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#fixed) column behavior during user-initiated column reorder operations. Users can drag & drop columns within the following areas (but not between them): - Columns fixed to the left - Non-fixed columns - Columns fixed to the right -Sticky columns (fixed with the 'sticky' [position](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#fixedPosition)) behave like non-fixed columns during reordering (even if they are in a state where they are attached to a border/fixed column). To see sticky columns in this demo, right-click a column to open a context menu. Choose "Set Fixed Position -> Sticky" to stick a column. \ No newline at end of file +Sticky columns (fixed with the 'sticky' [position](/Documentation/ApiReference/UI_Components/dxTreeList/Configuration/columns/#fixedPosition)) behave like non-fixed columns during reorder operations (even if they are in a state where they are attached to a border/fixed column). To see sticky columns in this demo, right-click a column to open the TreeList’s context menu. Choose "Set Fixed Position -> Sticky" to stick a given column. \ No newline at end of file From 6525652cd3595cf927d6ec95525ac701c1633467 Mon Sep 17 00:00:00 2001 From: Anna Shakhova <68295572+anna-shakhova@users.noreply.github.com> Date: Fri, 3 Jan 2025 13:59:00 +0100 Subject: [PATCH 08/15] Chat: refactor AIAndChatbotIntegration React demo (#28659) --- .../AIAndChatbotIntegration/React/App.tsx | 169 ++++------------- .../AIAndChatbotIntegration/React/Message.tsx | 100 ++++++----- .../AIAndChatbotIntegration/React/useApi.ts | 133 ++++++++++++++ .../AIAndChatbotIntegration/ReactJs/App.js | 170 +++++------------- .../ReactJs/Message.js | 20 +-- .../AIAndChatbotIntegration/ReactJs/useApi.js | 113 ++++++++++++ 6 files changed, 381 insertions(+), 324 deletions(-) create mode 100644 apps/demos/Demos/Chat/AIAndChatbotIntegration/React/useApi.ts create mode 100644 apps/demos/Demos/Chat/AIAndChatbotIntegration/ReactJs/useApi.js diff --git a/apps/demos/Demos/Chat/AIAndChatbotIntegration/React/App.tsx b/apps/demos/Demos/Chat/AIAndChatbotIntegration/React/App.tsx index 78e60d3e670b..431be0ea9046 100644 --- a/apps/demos/Demos/Chat/AIAndChatbotIntegration/React/App.tsx +++ b/apps/demos/Demos/Chat/AIAndChatbotIntegration/React/App.tsx @@ -1,22 +1,14 @@ -import React, { useState } from 'react'; +import React, { useCallback, useState } from 'react'; import Chat, { ChatTypes } from 'devextreme-react/chat'; -import { AzureOpenAI } from 'openai'; import { MessageEnteredEvent } from 'devextreme/ui/chat'; -import CustomStore from 'devextreme/data/custom_store'; -import DataSource from 'devextreme/data/data_source'; import { loadMessages } from 'devextreme/localization'; -import { +import { user, assistant, - AzureOpenAIConfig, - REGENERATION_TEXT, CHAT_DISABLED_CLASS, - ALERT_TIMEOUT } from './data.ts'; import Message from './Message.tsx'; - -const store = []; -const messages = []; +import { dataSource, useApi } from './useApi.ts'; loadMessages({ en: { @@ -26,148 +18,49 @@ loadMessages({ }, }); -const chatService = new AzureOpenAI(AzureOpenAIConfig); - -async function getAIResponse(messages) { - const params = { - messages, - model: AzureOpenAIConfig.deployment, - max_tokens: 1000, - temperature: 0.7, - }; - - const response = await chatService.chat.completions.create(params); - const data = { choices: response.choices }; - - return data.choices[0].message?.content; -} - -function updateLastMessage(text = REGENERATION_TEXT) { - const items = dataSource.items(); - const lastMessage = items.at(-1); - - dataSource.store().push([{ - type: 'update', - key: lastMessage.id, - data: { text }, - }]); -} - -function renderAssistantMessage(text) { - const message = { - id: Date.now(), - timestamp: new Date(), - author: assistant, - text, - }; - - dataSource.store().push([{ type: 'insert', data: message }]); -} +export default function App() { + const { + alerts, insertMessage, fetchAIResponse, regenerateLastAIResponse, + } = useApi(); -const customStore = new CustomStore({ - key: 'id', - load: () => { - return new Promise((resolve) => { - setTimeout(() => { - resolve([...store]); - }, 0); - }); - }, - insert: (message) => { - return new Promise((resolve) => { - setTimeout(() => { - store.push(message); - resolve(message); - }); - }); - }, -}); + const [typingUsers, setTypingUsers] = useState([]); + const [isProcessing, setIsProcessing] = useState(false); -const dataSource = new DataSource({ - store: customStore, - paginate: false, -}) + const processAIRequest = useCallback(async (message: ChatTypes.Message): Promise => { + setIsProcessing(true); + setTypingUsers([assistant]); -export default function App() { - const [alerts, setAlerts] = useState([]); - const [typingUsers, setTypingUsers] = useState([]); - const [classList, setClassList] = useState(''); + await fetchAIResponse(message); - function alertLimitReached() { - setAlerts([{ - message: 'Request limit reached, try again in a minute.' - }]); - - setTimeout(() => { - setAlerts([]); - }, ALERT_TIMEOUT); - } + setTypingUsers([]); + setIsProcessing(false); + }, [fetchAIResponse]); - function toggleDisabledState(disabled: boolean, event = undefined) { - setClassList(disabled ? CHAT_DISABLED_CLASS : ''); + const onMessageEntered = useCallback(async ({ message, event }: MessageEnteredEvent): Promise => { + insertMessage({ id: Date.now(), ...message }); - if (disabled) { - event?.target.blur(); - } else { - event?.target.focus(); - } - }; + if (!alerts.length) { + (event.target as HTMLElement).blur(); - async function processMessageSending(message, event) { - toggleDisabledState(true, event); + await processAIRequest(message); - messages.push({ role: 'user', content: message.text }); - setTypingUsers([assistant]); - - try { - const aiResponse = await getAIResponse(messages); - - setTimeout(() => { - setTypingUsers([]); - messages.push({ role: 'assistant', content: aiResponse }); - renderAssistantMessage(aiResponse); - }, 200); - } catch { - setTypingUsers([]); - messages.pop(); - alertLimitReached(); - } finally { - toggleDisabledState(false, event); + (event.target as HTMLElement).focus(); } - } - - async function regenerate() { - toggleDisabledState(true); + }, [insertMessage, alerts.length, processAIRequest]); - try { - const aiResponse = await getAIResponse(messages.slice(0, -1)); + const onRegenerateButtonClick = useCallback(async (): Promise => { + setIsProcessing(true); - updateLastMessage(aiResponse); - messages.at(-1).content = aiResponse; - } catch { - updateLastMessage(messages.at(-1).content); - alertLimitReached(); - } finally { - toggleDisabledState(false); - } - } + await regenerateLastAIResponse(); - function onMessageEntered({ message, event }: MessageEnteredEvent) { - dataSource.store().push([{ type: 'insert', data: { id: Date.now(), ...message } }]); - - if (!alerts.length) { - processMessageSending(message, event); - } - } + setIsProcessing(false); + }, [regenerateLastAIResponse]); - function onRegenerateButtonClick() { - updateLastMessage(); - regenerate(); - } + const messageRender = useCallback(({ message }: { message: ChatTypes.Message }) => , [onRegenerateButtonClick]); return ( Message(data, onRegenerateButtonClick)} + messageRender={messageRender} /> ); } diff --git a/apps/demos/Demos/Chat/AIAndChatbotIntegration/React/Message.tsx b/apps/demos/Demos/Chat/AIAndChatbotIntegration/React/Message.tsx index 262cffe611e9..4ecde4813270 100644 --- a/apps/demos/Demos/Chat/AIAndChatbotIntegration/React/Message.tsx +++ b/apps/demos/Demos/Chat/AIAndChatbotIntegration/React/Message.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { useCallback, useState, FC } from 'react'; import Button from 'devextreme-react/button'; import { unified } from 'unified'; import remarkParse from 'remark-parse'; @@ -6,58 +6,62 @@ import remarkRehype from 'remark-rehype'; import rehypeStringify from 'rehype-stringify'; import HTMLReactParser from 'html-react-parser'; +import { Properties as dxButtonProperties } from 'devextreme/ui/button'; import { REGENERATION_TEXT } from './data.ts'; -function convertToHtml(value: string) { - const result = unified() - .use(remarkParse) - .use(remarkRehype) - .use(rehypeStringify) - .processSync(value) - .toString(); +function convertToHtml(value: string): string { + const result = unified() + .use(remarkParse) + .use(remarkRehype) + .use(rehypeStringify) + .processSync(value) + .toString(); - return result; + return result; } -function Message({ message }, onRegenerateButtonClick) { - const [icon, setIcon] = useState('copy'); - - if (message.text === REGENERATION_TEXT) { - return {REGENERATION_TEXT}; - } - - function onCopyButtonClick() { - navigator.clipboard?.writeText(message.text); - setIcon('check'); - - setTimeout(() => { - setIcon('copy'); - }, 2500); - } - - return ( - -
- {HTMLReactParser(convertToHtml(message.text))} -
-
-
-
- ) +interface MessageProps { + text: string; + onRegenerateButtonClick: dxButtonProperties['onClick']; } +const Message: FC = ({ text, onRegenerateButtonClick }) => { + const [icon, setIcon] = useState('copy'); + + const onCopyButtonClick = useCallback(() => { + navigator.clipboard?.writeText(text); + setIcon('check'); + + setTimeout(() => { + setIcon('copy'); + }, 2500); + }, [text]); + + if (text === REGENERATION_TEXT) { + return {REGENERATION_TEXT}; + } + + return ( + +
+ {HTMLReactParser(convertToHtml(text))} +
+
+
+
+ ); +}; + export default Message; diff --git a/apps/demos/Demos/Chat/AIAndChatbotIntegration/React/useApi.ts b/apps/demos/Demos/Chat/AIAndChatbotIntegration/React/useApi.ts new file mode 100644 index 000000000000..8a157373224e --- /dev/null +++ b/apps/demos/Demos/Chat/AIAndChatbotIntegration/React/useApi.ts @@ -0,0 +1,133 @@ +import { useCallback, useState } from 'react'; +import { AzureOpenAI, OpenAI } from 'openai'; +import { ChatTypes } from 'devextreme-react/chat'; +import CustomStore from 'devextreme/data/custom_store'; +import DataSource from 'devextreme/data/data_source'; +import { + ALERT_TIMEOUT, assistant, + AzureOpenAIConfig, REGENERATION_TEXT, +} from './data.ts'; + +type Message = (OpenAI.ChatCompletionUserMessageParam | OpenAI.ChatCompletionAssistantMessageParam) & { + content: string; +}; + +const chatService = new AzureOpenAI(AzureOpenAIConfig); + +const wait = (delay: number): Promise => + new Promise((resolve) => { + setTimeout(resolve, delay); + }); + +export async function getAIResponse(messages: Message[], delay?: number): Promise { + const params = { + messages, + model: AzureOpenAIConfig.deployment, + max_tokens: 1000, + temperature: 0.7, + }; + + const response = await chatService.chat.completions.create(params); + const data = { choices: response.choices }; + + if (delay) { + await wait(delay); + } + + return data.choices[0].message?.content; +} + +const store: ChatTypes.Message[] = []; + +const customStore = new CustomStore({ + key: 'id', + load: (): Promise => new Promise((resolve) => { + setTimeout(() => { + resolve([...store]); + }, 0); + }), + insert: (message: ChatTypes.Message): Promise => new Promise((resolve) => { + setTimeout(() => { + store.push(message); + resolve(message); + }); + }), +}); + +export const dataSource = new DataSource({ + store: customStore, + paginate: false, +}); + +const dataItemToMessage = (item: ChatTypes.Message): Message => ({ + role: item.author.id as Message['role'], + content: item.text, +}); + +const getMessageHistory = (): Message[] => [...dataSource.items()].map(dataItemToMessage); + +export const useApi = () => { + const [alerts, setAlerts] = useState([]); + + const insertMessage = useCallback((data: ChatTypes.Message): void => { + dataSource.store().push([{ type: 'insert', data }]); + }, []); + + const updateLastMessageContent = useCallback((text: string): void => { + const lastMessage = dataSource.items().at(-1); + + dataSource.store().push([{ + type: 'update', + key: lastMessage.id, + data: { text }, + }]); + }, []); + + const alertLimitReached = useCallback((): void => { + setAlerts([{ + message: 'Request limit reached, try again in a minute.', + }]); + + setTimeout(() => { + setAlerts([]); + }, ALERT_TIMEOUT); + }, []); + + const fetchAIResponse = useCallback(async (message: ChatTypes.Message): Promise => { + const messages = [...getMessageHistory(), dataItemToMessage(message)]; + + try { + const aiResponse = await getAIResponse(messages, 200); + + insertMessage({ + id: Date.now(), + timestamp: new Date(), + author: assistant, + text: aiResponse, + }); + } catch { + alertLimitReached(); + } + }, [alertLimitReached, insertMessage]); + + const regenerateLastAIResponse = useCallback(async (): Promise => { + const messageHistory = getMessageHistory(); + updateLastMessageContent(REGENERATION_TEXT); + + try { + const aiResponse = await getAIResponse(messageHistory.slice(0, -1)); + + updateLastMessageContent(aiResponse); + } catch { + updateLastMessageContent(messageHistory.at(-1).content); + alertLimitReached(); + } + }, [alertLimitReached, updateLastMessageContent]); + + return { + alerts, + insertMessage, + fetchAIResponse, + regenerateLastAIResponse, + }; +}; diff --git a/apps/demos/Demos/Chat/AIAndChatbotIntegration/ReactJs/App.js b/apps/demos/Demos/Chat/AIAndChatbotIntegration/ReactJs/App.js index c6754f563b62..658ea8a43d69 100644 --- a/apps/demos/Demos/Chat/AIAndChatbotIntegration/ReactJs/App.js +++ b/apps/demos/Demos/Chat/AIAndChatbotIntegration/ReactJs/App.js @@ -1,21 +1,10 @@ -import React, { useState } from 'react'; +import React, { useCallback, useState } from 'react'; import Chat from 'devextreme-react/chat'; -import { AzureOpenAI } from 'openai'; -import CustomStore from 'devextreme/data/custom_store'; -import DataSource from 'devextreme/data/data_source'; import { loadMessages } from 'devextreme/localization'; -import { - user, - assistant, - AzureOpenAIConfig, - REGENERATION_TEXT, - CHAT_DISABLED_CLASS, - ALERT_TIMEOUT, -} from './data.js'; +import { user, assistant, CHAT_DISABLED_CLASS } from './data.js'; import Message from './Message.js'; +import { dataSource, useApi } from './useApi.js'; -const store = []; -const messages = []; loadMessages({ en: { 'dxChat-emptyListMessage': 'Chat is Empty', @@ -23,123 +12,50 @@ loadMessages({ 'dxChat-textareaPlaceholder': 'Ask AI Assistant...', }, }); -const chatService = new AzureOpenAI(AzureOpenAIConfig); -async function getAIResponse(messages) { - const params = { - messages, - model: AzureOpenAIConfig.deployment, - max_tokens: 1000, - temperature: 0.7, - }; - const response = await chatService.chat.completions.create(params); - const data = { choices: response.choices }; - return data.choices[0].message?.content; -} -function updateLastMessage(text = REGENERATION_TEXT) { - const items = dataSource.items(); - const lastMessage = items.at(-1); - dataSource.store().push([ - { - type: 'update', - key: lastMessage.id, - data: { text }, - }, - ]); -} -function renderAssistantMessage(text) { - const message = { - id: Date.now(), - timestamp: new Date(), - author: assistant, - text, - }; - dataSource.store().push([{ type: 'insert', data: message }]); -} -const customStore = new CustomStore({ - key: 'id', - load: () => new Promise((resolve) => { - setTimeout(() => { - resolve([...store]); - }, 0); - }), - insert: (message) => new Promise((resolve) => { - setTimeout(() => { - store.push(message); - resolve(message); - }); - }), -}); -const dataSource = new DataSource({ - store: customStore, - paginate: false, -}); export default function App() { - const [alerts, setAlerts] = useState([]); + const { + alerts, insertMessage, fetchAIResponse, regenerateLastAIResponse, + } = useApi(); const [typingUsers, setTypingUsers] = useState([]); - const [classList, setClassList] = useState(''); - function alertLimitReached() { - setAlerts([ - { - message: 'Request limit reached, try again in a minute.', - }, - ]); - setTimeout(() => { - setAlerts([]); - }, ALERT_TIMEOUT); - } - function toggleDisabledState(disabled, event = undefined) { - setClassList(disabled ? CHAT_DISABLED_CLASS : ''); - if (disabled) { - event?.target.blur(); - } else { - event?.target.focus(); - } - } - async function processMessageSending(message, event) { - toggleDisabledState(true, event); - messages.push({ role: 'user', content: message.text }); - setTypingUsers([assistant]); - try { - const aiResponse = await getAIResponse(messages); - setTimeout(() => { - setTypingUsers([]); - messages.push({ role: 'assistant', content: aiResponse }); - renderAssistantMessage(aiResponse); - }, 200); - } catch { + const [isProcessing, setIsProcessing] = useState(false); + const processAIRequest = useCallback( + async(message) => { + setIsProcessing(true); + setTypingUsers([assistant]); + await fetchAIResponse(message); setTypingUsers([]); - messages.pop(); - alertLimitReached(); - } finally { - toggleDisabledState(false, event); - } - } - async function regenerate() { - toggleDisabledState(true); - try { - const aiResponse = await getAIResponse(messages.slice(0, -1)); - updateLastMessage(aiResponse); - messages.at(-1).content = aiResponse; - } catch { - updateLastMessage(messages.at(-1).content); - alertLimitReached(); - } finally { - toggleDisabledState(false); - } - } - function onMessageEntered({ message, event }) { - dataSource.store().push([{ type: 'insert', data: { id: Date.now(), ...message } }]); - if (!alerts.length) { - processMessageSending(message, event); - } - } - function onRegenerateButtonClick() { - updateLastMessage(); - regenerate(); - } + setIsProcessing(false); + }, + [fetchAIResponse], + ); + const onMessageEntered = useCallback( + async({ message, event }) => { + insertMessage({ id: Date.now(), ...message }); + if (!alerts.length) { + event.target.blur(); + await processAIRequest(message); + event.target.focus(); + } + }, + [insertMessage, alerts.length, processAIRequest], + ); + const onRegenerateButtonClick = useCallback(async() => { + setIsProcessing(true); + await regenerateLastAIResponse(); + setIsProcessing(false); + }, [regenerateLastAIResponse]); + const messageRender = useCallback( + ({ message }) => ( + + ), + [onRegenerateButtonClick], + ); return ( Message(data, onRegenerateButtonClick)} + messageRender={messageRender} /> ); } diff --git a/apps/demos/Demos/Chat/AIAndChatbotIntegration/ReactJs/Message.js b/apps/demos/Demos/Chat/AIAndChatbotIntegration/ReactJs/Message.js index b81bcc064707..f73cc864c8d5 100644 --- a/apps/demos/Demos/Chat/AIAndChatbotIntegration/ReactJs/Message.js +++ b/apps/demos/Demos/Chat/AIAndChatbotIntegration/ReactJs/Message.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { useCallback, useState } from 'react'; import Button from 'devextreme-react/button'; import { unified } from 'unified'; import remarkParse from 'remark-parse'; @@ -16,23 +16,21 @@ function convertToHtml(value) { .toString(); return result; } -function Message({ message }, onRegenerateButtonClick) { +const Message = ({ text, onRegenerateButtonClick }) => { const [icon, setIcon] = useState('copy'); - if (message.text === REGENERATION_TEXT) { - return {REGENERATION_TEXT}; - } - function onCopyButtonClick() { - navigator.clipboard?.writeText(message.text); + const onCopyButtonClick = useCallback(() => { + navigator.clipboard?.writeText(text); setIcon('check'); setTimeout(() => { setIcon('copy'); }, 2500); + }, [text]); + if (text === REGENERATION_TEXT) { + return {REGENERATION_TEXT}; } return ( -
- {HTMLReactParser(convertToHtml(message.text))} -
+
{HTMLReactParser(convertToHtml(text))}
+ + ); + }, [copyButtonIcon, onRegenerateButtonClick]); + + return ( +
+ +
+ ); + } +} diff --git a/apps/react-storybook/stories/chat/data.ts b/apps/react-storybook/stories/chat/data.ts index c5e7b209480a..360dd1284693 100644 --- a/apps/react-storybook/stories/chat/data.ts +++ b/apps/react-storybook/stories/chat/data.ts @@ -1,6 +1,7 @@ -import { SchedulerTypes } from 'devextreme-react/scheduler'; import { ChatTypes } from 'devextreme-react/chat'; +export const REGENERATION_TEXT = 'Regeneration...'; + export const firstAuthor: ChatTypes.User = { id: "c94c0e76-fb49-4b9b-8f07-9f93ed93b4f3", name: "John Doe", @@ -22,6 +23,12 @@ export const fourthAuthor: ChatTypes.User = { name: "Crash Bandicoot" }; +export const assistant: ChatTypes.User = { + id: 'assistant', + name: 'Virtual Assistant', + avatarUrl: "https://devexpress.github.io/DevExtreme/images/icons/bot.png", +}; + const todayDate = new Date(); const date = new Date(); @@ -86,3 +93,133 @@ export const initialMessages: ChatTypes.Message[] = [ ]; export const longError = { id: '1234', message: 'Error Message. An unexpected issue occurred while processing your request. Please check your internet connection or contact support for further assistance.' }; + +export const userRequest: ChatTypes.Message = + { + timestamp: todayDate, + author: secondAuthor, + text: "What is AI?" + } +; + +export const regenerationMessage: ChatTypes.Message = { + timestamp: todayDate, + author: assistant, + text: REGENERATION_TEXT, +}; + +export const assistantReplies: ChatTypes.Message[] = [ + { + timestamp: todayDate, + author: assistant, + text: `

Artificial Intelligence (AI) is a branch of computer science that focuses on + creating systems capable of performing tasks that typically require human intelligence. + These tasks include learning, reasoning, problem-solving, understanding natural + language, recognizing patterns, and even making decisions.

+

AI can be divided into several subfields and categories:

+

Types of AI Based on Capability

+
    +
  • Narrow AI (Weak AI): Specialized in performing a single task + or a narrow range of tasks, like language translation, facial recognition, + or recommendation systems. Most AI systems today fall into this category. +
  • +
  • General AI (Strong AI): A hypothetical form of AI that possesses + the ability to understand, learn, and apply knowledge across a broad range + of tasks, much like a human being. +
  • +
  • Superintelligent AI: A theoretical concept where AI surpasses + human intelligence across all domains, potentially transforming or outstripping + human capabilities. +
  • +
+

AI continues to evolve, impacting nearly every aspect of modern life while raising + ethical, societal, and technological challenges.

`.replace(/\s{2,}/gm, ''), + }, + { + timestamp: todayDate, + author: assistant, + text: `

Artificial Intelligence (AI) is a branch of computer science that focuses on + creating systems capable of performing tasks that typically require human intelligence. + These tasks include learning, reasoning, problem-solving, understanding natural + language, recognizing patterns, and even making decisions.

+

AI can be divided into several subfields and categories:

+

Types of AI Based on Functionality

+
    +
  1. Reactive Machines: AI systems that respond to specific inputs + with predefined outputs, without memory or past experiences influencing their + decisions (e.g., IBM's Deep Blue chess-playing computer). +
  2. +
  3. Limited Memory: AI systems that can use past data for a short + time to inform decisions, such as self-driving cars. +
  4. +
  5. Theory of Mind: A more advanced concept where AI would + understand emotions, beliefs, and intentions, allowing it to interact more + naturally with humans. This remains largely in the research phase. +
  6. +
  7. Self-Aware AI: A theoretical AI that has self-awareness and + consciousness. +
  8. +
+

AI continues to evolve, impacting nearly every aspect of modern life while raising + ethical, societal, and technological challenges.

`.replace(/\s{2,}/gm, ''), + }, + { + timestamp: todayDate, + author: assistant, + text: `

Artificial Intelligence (AI) is a branch of computer science that focuses on + creating systems capable of performing tasks that typically require human intelligence. + These tasks include learning, reasoning, problem-solving, understanding natural + language, recognizing patterns, and even making decisions.

+

AI can be divided into several subfields and categories:

+

Key Subfields of AI

+
    +
  • Machine Learning (ML): Enables systems to learn and improve + from data without explicit programming. +
  • +
  • Deep Learning: A subset of ML that uses neural networks with + many layers to analyze complex patterns. +
  • +
  • Natural Language Processing (NLP): Allows AI to understand, + interpret, and respond to human language. +
  • +
  • Computer Vision: Enables AI to process and analyze visual data + from the world. +
  • +
  • Robotics: Focuses on creating AI-driven robots to perform tasks + in the physical world. +
  • +
  • Expert Systems: Mimic human decision-making using rule-based + systems. +
  • +
+

AI continues to evolve, impacting nearly every aspect of modern life while raising + ethical, societal, and technological challenges.

`.replace(/\s{2,}/gm, ''), + }, + { + timestamp: todayDate, + author: assistant, + text: `

Artificial Intelligence (AI) is a branch of computer science that focuses on + creating systems capable of performing tasks that typically require human intelligence. + These tasks include learning, reasoning, problem-solving, understanding natural + language, recognizing patterns, and even making decisions.

+

AI can be divided into several subfields and categories:

+

Applications of AI

+
    +
  1. Healthcare: Diagnosing diseases, drug discovery, and patient + care. +
  2. +
  3. Finance: Fraud detection, stock market analysis, and personalized + financial advice. +
  4. +
  5. Transportation: Autonomous vehicles and traffic management.
  6. +
  7. Entertainment: Personalized content recommendations on platforms + like Netflix or Spotify. +
  8. +
  9. Customer Service: Chatbots and virtual assistants like Siri, + Alexa, or Google Assistant. +
  10. +
+

AI continues to evolve, impacting nearly every aspect of modern life while raising + ethical, societal, and technological challenges.

`.replace(/\s{2,}/gm, ''), + } +]; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 986640c43f6e..59117959b435 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,13 +10,13 @@ importers: devDependencies: '@nx/devkit': specifier: 18.3.4 - version: 18.3.4(nx@19.4.2(@swc/core@1.9.2)) + version: 18.3.4(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15))) '@nx/jest': specifier: 19.4.2 - version: 19.4.2(@babel/traverse@7.25.9)(@swc/core@1.9.2)(@types/node@20.12.8)(node-notifier@9.0.1)(nx@19.4.2(@swc/core@1.9.2))(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5))(typescript@5.4.5) + version: 19.4.2(@babel/traverse@7.25.9)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(node-notifier@9.0.1)(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5))(typescript@5.4.5) '@nx/js': specifier: 19.4.2 - version: 19.4.2(@babel/traverse@7.25.9)(@swc/core@1.9.2)(@types/node@20.12.8)(nx@19.4.2(@swc/core@1.9.2))(typescript@5.4.5) + version: 19.4.2(@babel/traverse@7.25.9)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))(typescript@5.4.5) '@types/jest': specifier: 29.5.12 version: 29.5.12 @@ -55,7 +55,7 @@ importers: version: 8.0.3 jest: specifier: 29.7.0 - version: 29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)) + version: 29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5)) jspdf-autotable: specifier: 3.8.3 version: 3.8.3(jspdf@2.5.2) @@ -64,7 +64,7 @@ importers: version: 14.0.1(enquirer@2.4.1) nx: specifier: 19.4.2 - version: 19.4.2(@swc/core@1.9.2) + version: 19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)) nx-cloud: specifier: 19.0.0 version: 19.0.0 @@ -85,7 +85,7 @@ importers: version: 3.0.6 ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5) + version: 10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5) vue: specifier: 3.4.27 version: 3.4.27(typescript@5.4.5) @@ -143,7 +143,7 @@ importers: devDependencies: '@angular-devkit/build-angular': specifier: 17.3.11 - version: 17.3.11(binmexszxhwi53xqtyuwwlssei) + version: 17.3.11(qwvpz4std2ihowmewzmfizrlqa) '@angular/cli': specifier: 17.3.11 version: 17.3.11(chokidar@3.6.0) @@ -164,7 +164,7 @@ importers: version: 7.0.3 ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@5.4.5) + version: 10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@5.4.5) typescript: specifier: 5.4.5 version: 5.4.5 @@ -489,7 +489,7 @@ importers: version: 1.1.4 jest: specifier: 29.7.0 - version: 29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)) + version: 29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5)) jest-environment-node: specifier: 29.7.0 version: 29.7.0 @@ -537,7 +537,7 @@ importers: version: 2.6.2 ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5) + version: 10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5) apps/react: dependencies: @@ -562,22 +562,22 @@ importers: version: 18.0.11 css-loader: specifier: 6.10.0 - version: 6.10.0(webpack@5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4)) + version: 6.10.0(webpack@5.94.0) source-map-loader: specifier: 4.0.2 - version: 4.0.2(webpack@5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4)) + version: 4.0.2(webpack@5.94.0) style-loader: specifier: 3.3.4 - version: 3.3.4(webpack@5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4)) + version: 3.3.4(webpack@5.94.0) ts-loader: specifier: 9.5.1 - version: 9.5.1(typescript@5.4.5)(webpack@5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4)) + version: 9.5.1(typescript@5.4.5)(webpack@5.94.0) tsconfig-paths-webpack-plugin: specifier: 4.1.0 version: 4.1.0 webpack: specifier: 5.94.0 - version: 5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4) + version: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack-cli@5.1.4) webpack-cli: specifier: 5.1.4 version: 5.1.4(webpack-dev-server@4.15.1)(webpack@5.94.0) @@ -593,6 +593,9 @@ importers: devextreme-react: specifier: workspace:~ version: link:../../packages/devextreme-react/npm + html-react-parser: + specifier: ^5.2.2 + version: 5.2.2(@types/react@18.0.38)(react@18.0.0) inferno: specifier: ^7.4.9 version: 7.4.11 @@ -657,19 +660,19 @@ importers: version: 2.0.0-beta.7(vue@3.2.47) css-loader: specifier: 6.10.0 - version: 6.10.0(webpack@5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4)) + version: 6.10.0(webpack@5.94.0) minimatch: specifier: 4.2.3 version: 4.2.3 source-map-loader: specifier: 4.0.2 - version: 4.0.2(webpack@5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4)) + version: 4.0.2(webpack@5.94.0) style-loader: specifier: 3.3.4 - version: 3.3.4(webpack@5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4)) + version: 3.3.4(webpack@5.94.0) ts-loader: specifier: 9.5.1 - version: 9.5.1(typescript@4.9.5)(webpack@5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4)) + version: 9.5.1(typescript@4.9.5)(webpack@5.94.0) tsconfig-paths-webpack-plugin: specifier: 4.1.0 version: 4.1.0 @@ -678,16 +681,16 @@ importers: version: 4.9.5 url-loader: specifier: 1.1.2 - version: 1.1.2(webpack@5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4)) + version: 1.1.2(webpack@5.94.0) vue-loader: specifier: 17.4.2 - version: 17.4.2(@vue/compiler-sfc@3.3.4)(vue@3.2.47)(webpack@5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4)) + version: 17.4.2(@vue/compiler-sfc@3.3.4)(vue@3.2.47)(webpack@5.94.0) vue-router: specifier: 4.2.5 version: 4.2.5(vue@3.2.47) webpack: specifier: 5.94.0 - version: 5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4) + version: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack-cli@5.1.4) webpack-cli: specifier: 5.1.4 version: 5.1.4(webpack-dev-server@4.15.1)(webpack@5.94.0) @@ -744,7 +747,7 @@ importers: version: 5.4.11(@types/node@20.12.8)(less@4.2.0)(lightningcss@1.28.1)(sass-embedded@1.66.0)(sass@1.81.0)(terser@5.36.0) webpack: specifier: 5.94.0 - version: 5.94.0(@swc/core@1.9.2)(webpack-cli@4.10.0) + version: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack-cli@4.10.0) webpack-cli: specifier: 4.10.0 version: 4.10.0(webpack@5.94.0) @@ -853,25 +856,25 @@ importers: version: 7.23.9(@babel/core@7.23.9) '@devextreme-generator/angular': specifier: 3.0.12 - version: 3.0.12(atnximysgm2qhxoullfrc4ld7m) + version: 3.0.12(mktse5lvs4n2jhnoaohf3tcuti) '@devextreme-generator/build-helpers': specifier: 3.0.12 - version: 3.0.12(jx45iv34cplwvde5i3ekp234ua) + version: 3.0.12(ectyjufymdsezb24bv2esmeafq) '@devextreme-generator/core': specifier: 3.0.12 - version: 3.0.12(atnximysgm2qhxoullfrc4ld7m) + version: 3.0.12(mktse5lvs4n2jhnoaohf3tcuti) '@devextreme-generator/declarations': specifier: 3.0.12 version: 3.0.12 '@devextreme-generator/inferno': specifier: 3.0.12 - version: 3.0.12(atnximysgm2qhxoullfrc4ld7m) + version: 3.0.12(mktse5lvs4n2jhnoaohf3tcuti) '@devextreme-generator/react': specifier: 3.0.12 - version: 3.0.12(atnximysgm2qhxoullfrc4ld7m) + version: 3.0.12(mktse5lvs4n2jhnoaohf3tcuti) '@devextreme-generator/vue': specifier: 3.0.12 - version: 3.0.12(atnximysgm2qhxoullfrc4ld7m) + version: 3.0.12(mktse5lvs4n2jhnoaohf3tcuti) '@jest/globals': specifier: 29.7.0 version: 29.7.0 @@ -958,7 +961,7 @@ importers: version: 17.1.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5))(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint-plugin-import@2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0))(eslint@8.56.0) eslint-config-devextreme: specifier: 1.1.5 - version: 1.1.5(dviz67724z5lsegdjr2jecno6q) + version: 1.1.5(2wu47vven6w2q4wadgy2aiclqi) eslint-plugin-i18n: specifier: 2.3.0 version: 2.3.0 @@ -967,7 +970,7 @@ importers: version: 2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0) eslint-plugin-jest: specifier: 27.6.0 - version: 27.6.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(jest@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)))(typescript@4.9.5) + version: 27.6.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(jest@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5)))(typescript@4.9.5) eslint-plugin-jest-formatting: specifier: 3.1.0 version: 3.1.0(eslint@8.56.0) @@ -1195,7 +1198,7 @@ importers: version: 1.3.0 string-replace-loader: specifier: 3.1.0 - version: 3.1.0(webpack@5.94.0(@swc/core@1.9.2)) + version: 3.1.0(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))) stylelint: specifier: 15.11.0 version: 15.11.0(typescript@4.9.5) @@ -1219,13 +1222,13 @@ importers: version: 0.0.11 terser-webpack-plugin: specifier: 5.3.9 - version: 5.3.9(@swc/core@1.9.2)(webpack@5.94.0(@swc/core@1.9.2)) + version: 5.3.9(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))) through2: specifier: 2.0.5 version: 2.0.5 ts-jest: specifier: 29.1.2 - version: 29.1.2(@babel/core@7.23.9)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(jest@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)))(typescript@4.9.5) + version: 29.1.2(@babel/core@7.23.9)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(jest@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5)))(typescript@4.9.5) tsc-alias: specifier: 1.8.10 version: 1.8.10 @@ -1246,10 +1249,10 @@ importers: version: 1.1.0 webpack: specifier: 5.94.0 - version: 5.94.0(@swc/core@1.9.2)(esbuild@0.20.1) + version: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) webpack-stream: specifier: 7.0.0 - version: 7.0.0(webpack@5.94.0(@swc/core@1.9.2)) + version: 7.0.0(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))) yaml: specifier: 2.5.0 version: 2.5.0 @@ -1362,7 +1365,7 @@ importers: version: 2.0.1(karma@6.4.4) karma-webpack: specifier: 5.0.1 - version: 5.0.1(webpack@5.94.0(@swc/core@1.9.2)) + version: 5.0.1(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))) ng-packagr: specifier: 17.3.0 version: 17.3.0(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.5))(tslib@2.6.3)(typescript@5.4.5) @@ -1386,7 +1389,7 @@ importers: version: 5.4.5 webpack: specifier: 5.94.0 - version: 5.94.0(@swc/core@1.9.2)(esbuild@0.20.1) + version: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) yargs: specifier: 17.7.2 version: 17.7.2 @@ -1402,7 +1405,7 @@ importers: version: 29.5.12 ts-jest: specifier: 29.1.3 - version: 29.1.3(@babel/core@7.24.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.0))(jest@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)))(typescript@5.4.5) + version: 29.1.3(@babel/core@7.24.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.0))(jest@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5)))(typescript@5.4.5) packages/devextreme-react: dependencies: @@ -1439,7 +1442,7 @@ importers: version: 17.1.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5))(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint-plugin-import@2.29.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0))(eslint@8.56.0) eslint-config-devextreme: specifier: 1.1.5 - version: 1.1.5(6j36mkhhhj37fby37wfpgi52ue) + version: 1.1.5(7y2kapk54x3chxrybrye64ikau) gulp: specifier: 4.0.2 version: 4.0.2 @@ -1463,7 +1466,7 @@ importers: version: 18.0.0(react@18.0.0) ts-jest: specifier: 29.1.3 - version: 29.1.3(@babel/core@7.24.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.0))(jest@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)))(typescript@4.9.5) + version: 29.1.3(@babel/core@7.24.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.0))(jest@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5)))(typescript@4.9.5) typescript: specifier: 4.9.5 version: 4.9.5 @@ -1518,7 +1521,7 @@ importers: version: 2.0.5 ts-jest: specifier: 29.1.2 - version: 29.1.2(@babel/core@7.24.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.0))(jest@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)))(typescript@5.4.5) + version: 29.1.2(@babel/core@7.24.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.0))(jest@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5)))(typescript@5.4.5) packages/devextreme-themebuilder: dependencies: @@ -1564,7 +1567,7 @@ importers: version: 17.1.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5))(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint-plugin-import@2.29.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0))(eslint@8.56.0) eslint-config-devextreme: specifier: 1.1.5 - version: 1.1.5(zsmfaq7l2ubx6arjipvaytbeca) + version: 1.1.5(s7hytideue6mgyvvaok756vzia) express: specifier: 4.21.1 version: 4.21.1 @@ -1585,10 +1588,10 @@ importers: version: 18.0.1 ts-jest: specifier: 29.1.2 - version: 29.1.2(@babel/core@7.24.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.0))(jest@29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@4.9.5)))(typescript@4.9.5) + version: 29.1.2(@babel/core@7.24.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.0))(jest@29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@4.9.5)))(typescript@4.9.5) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@4.9.5) + version: 10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@4.9.5) typescript: specifier: 4.9.5 version: 4.9.5 @@ -1622,7 +1625,7 @@ importers: version: 17.1.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5))(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint-plugin-import@2.29.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0))(eslint@8.56.0) eslint-config-devextreme: specifier: 1.1.5 - version: 1.1.5(6j36mkhhhj37fby37wfpgi52ue) + version: 1.1.5(7y2kapk54x3chxrybrye64ikau) eslint-plugin-spellcheck: specifier: 0.0.20 version: 0.0.20(eslint@8.56.0) @@ -1643,7 +1646,7 @@ importers: version: 29.7.0 ts-jest: specifier: 29.1.3 - version: 29.1.3(@babel/core@7.24.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.0))(jest@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)))(typescript@4.9.5) + version: 29.1.3(@babel/core@7.24.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.0))(jest@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5)))(typescript@4.9.5) typescript: specifier: 4.9.5 version: 4.9.5 @@ -8215,8 +8218,8 @@ packages: domutils@2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} - domutils@3.1.0: - resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + domutils@3.2.1: + resolution: {integrity: sha512-xWXmuRnN9OMP6ptPd2+H0cCbcYBULa5YDTbMm/2lvkWvNA3O4wcW+GvzooqBuNM8yy6pl3VIAeJTUUWUbfI5Fw==} dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} @@ -8379,6 +8382,10 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + entities@6.0.0: + resolution: {integrity: sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==} + engines: {node: '>=0.12'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -9440,7 +9447,7 @@ packages: resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} engines: {node: '>= 4.0'} os: [darwin] - deprecated: The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2 + deprecated: Upgrade to fsevents v2 to mitigate potential security issues fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} @@ -10025,6 +10032,9 @@ packages: html-dom-parser@1.2.0: resolution: {integrity: sha512-2HIpFMvvffsXHFUFjso0M9LqM+1Lm22BF+Df2ba+7QHJXjk63pWChEnI6YG27eaWqUdfnh5/Vy+OXrNTtepRsg==} + html-dom-parser@5.0.13: + resolution: {integrity: sha512-B7JonBuAfG32I7fDouUQEogBrz3jK9gAuN1r1AaXpED6dIhtg/JwiSRhjGL7aOJwRz3HU4efowCjQBaoXiREqg==} + html-element-map@1.3.1: resolution: {integrity: sha512-6XMlxrAFX4UEEGxctfFnmrFaaZFNf9i5fNuV5wZ3WWQ4FVaNP1aX1LkX9j2mfEx1NpjeE/rL3nmgEn23GdFmrg==} @@ -10048,6 +10058,15 @@ packages: peerDependencies: react: 0.14 || 15 || 16 || 17 || 18 + html-react-parser@5.2.2: + resolution: {integrity: sha512-yA5012CJGSFWYZsgYzfr6HXJgDap38/AEP4ra8Cw+WHIi2ZRDXRX/QVYdumRf1P8zKyScKd6YOrWYvVEiPfGKg==} + peerDependencies: + '@types/react': 0.14 || 15 || 16 || 17 || 18 || 19 + react: 0.14 || 15 || 16 || 17 || 18 || 19 + peerDependenciesMeta: + '@types/react': + optional: true + html-tags@3.3.1: resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} engines: {node: '>=8'} @@ -10104,6 +10123,9 @@ packages: uncss: optional: true + htmlparser2@10.0.0: + resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} + htmlparser2@6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} @@ -10362,6 +10384,9 @@ packages: inline-style-parser@0.1.1: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + inline-style-parser@0.2.4: + resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + inquirer@9.2.15: resolution: {integrity: sha512-vI2w4zl/mDluHt9YEQ/543VTCwPKWiHzKtm9dM2V0NdFcqEexDAjUHzO1oA60HRNaVifGXXM1tRRNluLVHa0Kg==} engines: {node: '>=18'} @@ -13453,6 +13478,9 @@ packages: react-property@2.0.0: resolution: {integrity: sha512-kzmNjIgU32mO4mmH5+iUyrqlpFQhF8K2k7eZ4fdLSOPFrD1XgEuSBv9LDEgxRXTMBqMd8ppT0x6TIzqE5pdGdw==} + react-property@2.0.2: + resolution: {integrity: sha512-+PbtI3VuDV0l6CleQMsx2gtK0JZbZKbpdu5ynr+lbsuvtmgbNcS3VM0tuY2QjFNOcWxvXeHjDpy42RO+4U2rug==} + react-refresh@0.14.2: resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} @@ -14701,9 +14729,15 @@ packages: style-to-js@1.1.1: resolution: {integrity: sha512-RJ18Z9t2B02sYhZtfWKQq5uplVctgvjTfLWT7+Eb1zjUjIrWzX5SdlkwLGQozrqarTmEzJJ/YmdNJCUNI47elg==} + style-to-js@1.1.16: + resolution: {integrity: sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==} + style-to-object@0.3.0: resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==} + style-to-object@1.0.8: + resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} + stylelint-config-html@1.1.0: resolution: {integrity: sha512-IZv4IVESjKLumUGi+HWeb7skgO6/g4VMuAYrJdlqQFndgbj6WJAXPhaysvBiXefX79upBdQVumgYcdd17gCpjQ==} engines: {node: ^12 || >=14} @@ -16390,11 +16424,11 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular-devkit/build-angular@17.3.11(binmexszxhwi53xqtyuwwlssei)': + '@angular-devkit/build-angular@17.3.11(qwvpz4std2ihowmewzmfizrlqa)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.1703.11(chokidar@3.6.0) - '@angular-devkit/build-webpack': 0.1703.11(chokidar@3.6.0)(webpack-dev-server@4.15.1(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)))(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)) + '@angular-devkit/build-webpack': 0.1703.11(chokidar@3.6.0)(webpack-dev-server@4.15.1(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)))(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)) '@angular-devkit/core': 17.3.11(chokidar@3.6.0) '@angular/compiler-cli': 17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.5) '@babel/core': 7.24.0 @@ -16407,16 +16441,16 @@ snapshots: '@babel/preset-env': 7.24.0(@babel/core@7.24.0) '@babel/runtime': 7.24.0 '@discoveryjs/json-ext': 0.5.7 - '@ngtools/webpack': 17.3.11(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.5))(typescript@5.4.5)(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)) + '@ngtools/webpack': 17.3.11(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.5))(typescript@5.4.5)(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)) '@vitejs/plugin-basic-ssl': 1.1.0(vite@5.1.8(@types/node@20.11.17)(less@4.2.0)(lightningcss@1.28.1)(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.94.0(@swc/core@1.9.2)(esbuild@0.20.1)) + babel-loader: 9.1.3(@babel/core@7.24.0)(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)) babel-plugin-istanbul: 6.1.1 browserslist: 4.24.2 - copy-webpack-plugin: 11.0.0(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)) + copy-webpack-plugin: 11.0.0(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)) critters: 0.0.22 - css-loader: 6.10.0(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)) + css-loader: 6.10.0(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)) esbuild-wasm: 0.20.1 fast-glob: 3.3.2 http-proxy-middleware: 2.0.7(@types/express@4.17.21) @@ -16425,11 +16459,11 @@ snapshots: jsonc-parser: 3.2.1 karma-source-map-support: 1.4.0 less: 4.2.0 - less-loader: 11.1.0(less@4.2.0)(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)) - license-webpack-plugin: 4.0.2(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)) + less-loader: 11.1.0(less@4.2.0)(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)) + license-webpack-plugin: 4.0.2(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)) loader-utils: 3.2.1 magic-string: 0.30.8 - mini-css-extract-plugin: 2.8.1(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)) + mini-css-extract-plugin: 2.8.1(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)) mrmime: 2.0.0 open: 8.4.2 ora: 5.4.1 @@ -16437,13 +16471,13 @@ snapshots: picomatch: 4.0.1 piscina: 4.4.0 postcss: 8.4.35 - postcss-loader: 8.1.1(postcss@8.4.35)(typescript@5.4.5)(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)) + postcss-loader: 8.1.1(postcss@8.4.35)(typescript@5.4.5)(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)) resolve-url-loader: 5.0.0 rxjs: 7.8.1 sass: 1.71.1 - sass-loader: 14.1.1(sass-embedded@1.66.0)(sass@1.71.1)(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)) + sass-loader: 14.1.1(sass-embedded@1.66.0)(sass@1.71.1)(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)) semver: 7.6.0 - source-map-loader: 5.0.0(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)) + source-map-loader: 5.0.0(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)) source-map-support: 0.5.21 terser: 5.29.1 tree-kill: 1.2.2 @@ -16452,15 +16486,15 @@ snapshots: undici: 6.11.1 vite: 5.1.8(@types/node@20.11.17)(less@4.2.0)(lightningcss@1.28.1)(sass@1.71.1)(terser@5.29.1) watchpack: 2.4.0 - webpack: 5.94.0(@swc/core@1.9.2)(esbuild@0.20.1) - webpack-dev-middleware: 6.1.2(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)) - webpack-dev-server: 4.15.1(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) + webpack-dev-middleware: 6.1.2(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)) + webpack-dev-server: 4.15.1(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)) webpack-merge: 5.10.0 - webpack-subresource-integrity: 5.1.0(html-webpack-plugin@5.6.3(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)))(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)) + webpack-subresource-integrity: 5.1.0(html-webpack-plugin@5.6.3(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)))(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)) optionalDependencies: '@angular/platform-server': 17.3.12(@angular/animations@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10))(@angular/platform-browser@17.3.12(@angular/animations@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(@angular/common@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10))(rxjs@7.8.1))(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10))) esbuild: 0.20.1 - jest: 29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@5.4.5)) + jest: 29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@5.4.5)) jest-environment-jsdom: 29.7.0 karma: 6.4.4 ng-packagr: 17.3.0(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.5))(tslib@2.6.3)(typescript@5.4.5) @@ -16483,12 +16517,12 @@ snapshots: - utf-8-validate - webpack-cli - '@angular-devkit/build-webpack@0.1703.11(chokidar@3.6.0)(webpack-dev-server@4.15.1(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)))(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1))': + '@angular-devkit/build-webpack@0.1703.11(chokidar@3.6.0)(webpack-dev-server@4.15.1(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)))(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1))': dependencies: '@angular-devkit/architect': 0.1703.11(chokidar@3.6.0) rxjs: 7.8.1 - webpack: 5.94.0(@swc/core@1.9.2)(esbuild@0.20.1) - webpack-dev-server: 4.15.1(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) + webpack-dev-server: 4.15.1(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)) transitivePeerDependencies: - chokidar @@ -18346,9 +18380,9 @@ snapshots: dependencies: tslib: 2.3.1 - '@devextreme-generator/angular@3.0.12(atnximysgm2qhxoullfrc4ld7m)': + '@devextreme-generator/angular@3.0.12(mktse5lvs4n2jhnoaohf3tcuti)': dependencies: - '@devextreme-generator/core': 3.0.12(atnximysgm2qhxoullfrc4ld7m) + '@devextreme-generator/core': 3.0.12(mktse5lvs4n2jhnoaohf3tcuti) transitivePeerDependencies: - '@typescript-eslint/eslint-plugin' - eslint @@ -18363,17 +18397,17 @@ snapshots: - eslint-plugin-spellcheck - supports-color - '@devextreme-generator/build-helpers@3.0.12(jx45iv34cplwvde5i3ekp234ua)': + '@devextreme-generator/build-helpers@3.0.12(ectyjufymdsezb24bv2esmeafq)': dependencies: - '@devextreme-generator/angular': 3.0.12(atnximysgm2qhxoullfrc4ld7m) - '@devextreme-generator/core': 3.0.12(atnximysgm2qhxoullfrc4ld7m) - '@devextreme-generator/inferno': 3.0.12(atnximysgm2qhxoullfrc4ld7m) - '@devextreme-generator/preact': 3.0.12(atnximysgm2qhxoullfrc4ld7m) - '@devextreme-generator/react': 3.0.12(atnximysgm2qhxoullfrc4ld7m) + '@devextreme-generator/angular': 3.0.12(mktse5lvs4n2jhnoaohf3tcuti) + '@devextreme-generator/core': 3.0.12(mktse5lvs4n2jhnoaohf3tcuti) + '@devextreme-generator/inferno': 3.0.12(mktse5lvs4n2jhnoaohf3tcuti) + '@devextreme-generator/preact': 3.0.12(mktse5lvs4n2jhnoaohf3tcuti) + '@devextreme-generator/react': 3.0.12(mktse5lvs4n2jhnoaohf3tcuti) loader-utils: 2.0.4 typescript: 4.3.5 vinyl: 2.2.1 - webpack: 5.94.0(@swc/core@1.9.2)(esbuild@0.20.1) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) transitivePeerDependencies: - '@swc/core' - '@typescript-eslint/eslint-plugin' @@ -18392,10 +18426,10 @@ snapshots: - uglify-js - webpack-cli - '@devextreme-generator/core@3.0.12(atnximysgm2qhxoullfrc4ld7m)': + '@devextreme-generator/core@3.0.12(mktse5lvs4n2jhnoaohf3tcuti)': dependencies: code-block-writer: 10.1.1 - eslint-config-devextreme: 0.2.0(atnximysgm2qhxoullfrc4ld7m) + eslint-config-devextreme: 0.2.0(mktse5lvs4n2jhnoaohf3tcuti) prettier: 2.8.8 prettier-eslint: 13.0.0 typescript: 4.3.5 @@ -18418,11 +18452,11 @@ snapshots: react: 17.0.2 react-dom: 17.0.2(react@17.0.2) - '@devextreme-generator/inferno@3.0.12(atnximysgm2qhxoullfrc4ld7m)': + '@devextreme-generator/inferno@3.0.12(mktse5lvs4n2jhnoaohf3tcuti)': dependencies: - '@devextreme-generator/core': 3.0.12(atnximysgm2qhxoullfrc4ld7m) - '@devextreme-generator/preact': 3.0.12(atnximysgm2qhxoullfrc4ld7m) - '@devextreme-generator/react': 3.0.12(atnximysgm2qhxoullfrc4ld7m) + '@devextreme-generator/core': 3.0.12(mktse5lvs4n2jhnoaohf3tcuti) + '@devextreme-generator/preact': 3.0.12(mktse5lvs4n2jhnoaohf3tcuti) + '@devextreme-generator/react': 3.0.12(mktse5lvs4n2jhnoaohf3tcuti) transitivePeerDependencies: - '@typescript-eslint/eslint-plugin' - eslint @@ -18437,10 +18471,10 @@ snapshots: - eslint-plugin-spellcheck - supports-color - '@devextreme-generator/preact@3.0.12(atnximysgm2qhxoullfrc4ld7m)': + '@devextreme-generator/preact@3.0.12(mktse5lvs4n2jhnoaohf3tcuti)': dependencies: - '@devextreme-generator/core': 3.0.12(atnximysgm2qhxoullfrc4ld7m) - '@devextreme-generator/react': 3.0.12(atnximysgm2qhxoullfrc4ld7m) + '@devextreme-generator/core': 3.0.12(mktse5lvs4n2jhnoaohf3tcuti) + '@devextreme-generator/react': 3.0.12(mktse5lvs4n2jhnoaohf3tcuti) transitivePeerDependencies: - '@typescript-eslint/eslint-plugin' - eslint @@ -18455,9 +18489,9 @@ snapshots: - eslint-plugin-spellcheck - supports-color - '@devextreme-generator/react@3.0.12(atnximysgm2qhxoullfrc4ld7m)': + '@devextreme-generator/react@3.0.12(mktse5lvs4n2jhnoaohf3tcuti)': dependencies: - '@devextreme-generator/core': 3.0.12(atnximysgm2qhxoullfrc4ld7m) + '@devextreme-generator/core': 3.0.12(mktse5lvs4n2jhnoaohf3tcuti) transitivePeerDependencies: - '@typescript-eslint/eslint-plugin' - eslint @@ -18472,10 +18506,10 @@ snapshots: - eslint-plugin-spellcheck - supports-color - '@devextreme-generator/vue@3.0.12(atnximysgm2qhxoullfrc4ld7m)': + '@devextreme-generator/vue@3.0.12(mktse5lvs4n2jhnoaohf3tcuti)': dependencies: - '@devextreme-generator/angular': 3.0.12(atnximysgm2qhxoullfrc4ld7m) - '@devextreme-generator/core': 3.0.12(atnximysgm2qhxoullfrc4ld7m) + '@devextreme-generator/angular': 3.0.12(mktse5lvs4n2jhnoaohf3tcuti) + '@devextreme-generator/core': 3.0.12(mktse5lvs4n2jhnoaohf3tcuti) prettier: 2.8.8 transitivePeerDependencies: - '@typescript-eslint/eslint-plugin' @@ -19001,7 +19035,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@4.9.5))': + '@jest/core@29.7.0(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@4.9.5))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0(node-notifier@9.0.1) @@ -19015,7 +19049,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@4.9.5)) + jest-config: 29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@4.9.5)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -19038,7 +19072,7 @@ snapshots: - supports-color - ts-node - '@jest/core@29.7.0(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@5.4.5))': + '@jest/core@29.7.0(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@5.4.5))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0(node-notifier@9.0.1) @@ -19052,7 +19086,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@5.4.5)) + jest-config: 29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@5.4.5)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -19076,7 +19110,7 @@ snapshots: - ts-node optional: true - '@jest/core@29.7.0(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5))': + '@jest/core@29.7.0(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0(node-notifier@9.0.1) @@ -19090,7 +19124,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)) + jest-config: 29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -19406,11 +19440,11 @@ snapshots: pump: 3.0.2 tar-fs: 2.1.1 - '@ngtools/webpack@17.3.11(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.5))(typescript@5.4.5)(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1))': + '@ngtools/webpack@17.3.11(@angular/compiler-cli@17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.5))(typescript@5.4.5)(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1))': dependencies: '@angular/compiler-cli': 17.3.12(@angular/compiler@17.3.12(@angular/core@17.3.12(rxjs@7.8.1)(zone.js@0.14.10)))(typescript@5.4.5) typescript: 5.4.5 - webpack: 5.94.0(@swc/core@1.9.2)(esbuild@0.20.1) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': dependencies: @@ -19492,21 +19526,21 @@ snapshots: - bluebird - supports-color - '@nrwl/devkit@18.3.4(nx@19.4.2(@swc/core@1.9.2))': + '@nrwl/devkit@18.3.4(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))': dependencies: - '@nx/devkit': 18.3.4(nx@19.4.2(@swc/core@1.9.2)) + '@nx/devkit': 18.3.4(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15))) transitivePeerDependencies: - nx - '@nrwl/devkit@19.4.2(nx@19.4.2(@swc/core@1.9.2))': + '@nrwl/devkit@19.4.2(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))': dependencies: - '@nx/devkit': 19.4.2(nx@19.4.2(@swc/core@1.9.2)) + '@nx/devkit': 19.4.2(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15))) transitivePeerDependencies: - nx - '@nrwl/jest@19.4.2(@babel/traverse@7.25.9)(@swc/core@1.9.2)(@types/node@20.12.8)(node-notifier@9.0.1)(nx@19.4.2(@swc/core@1.9.2))(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5))(typescript@5.4.5)': + '@nrwl/jest@19.4.2(@babel/traverse@7.25.9)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(node-notifier@9.0.1)(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5))(typescript@5.4.5)': dependencies: - '@nx/jest': 19.4.2(@babel/traverse@7.25.9)(@swc/core@1.9.2)(@types/node@20.12.8)(node-notifier@9.0.1)(nx@19.4.2(@swc/core@1.9.2))(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5))(typescript@5.4.5) + '@nx/jest': 19.4.2(@babel/traverse@7.25.9)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(node-notifier@9.0.1)(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5))(typescript@5.4.5) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -19522,9 +19556,9 @@ snapshots: - typescript - verdaccio - '@nrwl/js@19.4.2(@babel/traverse@7.25.9)(@swc/core@1.9.2)(@types/node@20.12.8)(nx@19.4.2(@swc/core@1.9.2))(typescript@5.4.5)': + '@nrwl/js@19.4.2(@babel/traverse@7.25.9)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))(typescript@5.4.5)': dependencies: - '@nx/js': 19.4.2(@babel/traverse@7.25.9)(@swc/core@1.9.2)(@types/node@20.12.8)(nx@19.4.2(@swc/core@1.9.2))(typescript@5.4.5) + '@nx/js': 19.4.2(@babel/traverse@7.25.9)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))(typescript@5.4.5) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -19543,59 +19577,59 @@ snapshots: transitivePeerDependencies: - debug - '@nrwl/tao@19.4.2(@swc/core@1.9.2)': + '@nrwl/tao@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15))': dependencies: - nx: 19.4.2(@swc/core@1.9.2) + nx: 19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)) tslib: 2.6.3 transitivePeerDependencies: - '@swc-node/register' - '@swc/core' - debug - '@nrwl/workspace@19.4.2(@swc/core@1.9.2)': + '@nrwl/workspace@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15))': dependencies: - '@nx/workspace': 19.4.2(@swc/core@1.9.2) + '@nx/workspace': 19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)) transitivePeerDependencies: - '@swc-node/register' - '@swc/core' - debug - '@nx/devkit@18.3.4(nx@19.4.2(@swc/core@1.9.2))': + '@nx/devkit@18.3.4(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))': dependencies: - '@nrwl/devkit': 18.3.4(nx@19.4.2(@swc/core@1.9.2)) + '@nrwl/devkit': 18.3.4(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15))) ejs: 3.1.10 enquirer: 2.3.6 ignore: 5.3.1 - nx: 19.4.2(@swc/core@1.9.2) + nx: 19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)) semver: 7.6.3 tmp: 0.2.3 tslib: 2.6.3 yargs-parser: 21.1.1 - '@nx/devkit@19.4.2(nx@19.4.2(@swc/core@1.9.2))': + '@nx/devkit@19.4.2(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))': dependencies: - '@nrwl/devkit': 19.4.2(nx@19.4.2(@swc/core@1.9.2)) + '@nrwl/devkit': 19.4.2(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15))) ejs: 3.1.10 enquirer: 2.3.6 ignore: 5.3.1 minimatch: 9.0.3 - nx: 19.4.2(@swc/core@1.9.2) + nx: 19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)) semver: 7.6.3 tmp: 0.2.3 tslib: 2.6.3 yargs-parser: 21.1.1 - '@nx/jest@19.4.2(@babel/traverse@7.25.9)(@swc/core@1.9.2)(@types/node@20.12.8)(node-notifier@9.0.1)(nx@19.4.2(@swc/core@1.9.2))(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5))(typescript@5.4.5)': + '@nx/jest@19.4.2(@babel/traverse@7.25.9)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(node-notifier@9.0.1)(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5))(typescript@5.4.5)': dependencies: '@jest/reporters': 29.7.0(node-notifier@9.0.1) '@jest/test-result': 29.7.0 - '@nrwl/jest': 19.4.2(@babel/traverse@7.25.9)(@swc/core@1.9.2)(@types/node@20.12.8)(node-notifier@9.0.1)(nx@19.4.2(@swc/core@1.9.2))(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5))(typescript@5.4.5) - '@nx/devkit': 19.4.2(nx@19.4.2(@swc/core@1.9.2)) - '@nx/js': 19.4.2(@babel/traverse@7.25.9)(@swc/core@1.9.2)(@types/node@20.12.8)(nx@19.4.2(@swc/core@1.9.2))(typescript@5.4.5) + '@nrwl/jest': 19.4.2(@babel/traverse@7.25.9)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(node-notifier@9.0.1)(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5))(typescript@5.4.5) + '@nx/devkit': 19.4.2(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15))) + '@nx/js': 19.4.2(@babel/traverse@7.25.9)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))(typescript@5.4.5) '@phenomnomnominal/tsquery': 5.0.1(typescript@5.4.5) chalk: 4.1.2 identity-obj-proxy: 3.0.0 - jest-config: 29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)) + jest-config: 29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5)) jest-resolve: 29.7.0 jest-util: 29.7.0 minimatch: 9.0.3 @@ -19617,7 +19651,7 @@ snapshots: - typescript - verdaccio - '@nx/js@19.4.2(@babel/traverse@7.25.9)(@swc/core@1.9.2)(@types/node@20.12.8)(nx@19.4.2(@swc/core@1.9.2))(typescript@5.4.5)': + '@nx/js@19.4.2(@babel/traverse@7.25.9)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))(typescript@5.4.5)': dependencies: '@babel/core': 7.23.9 '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.23.9) @@ -19626,9 +19660,9 @@ snapshots: '@babel/preset-env': 7.23.9(@babel/core@7.23.9) '@babel/preset-typescript': 7.26.0(@babel/core@7.23.9) '@babel/runtime': 7.26.0 - '@nrwl/js': 19.4.2(@babel/traverse@7.25.9)(@swc/core@1.9.2)(@types/node@20.12.8)(nx@19.4.2(@swc/core@1.9.2))(typescript@5.4.5) - '@nx/devkit': 19.4.2(nx@19.4.2(@swc/core@1.9.2)) - '@nx/workspace': 19.4.2(@swc/core@1.9.2) + '@nrwl/js': 19.4.2(@babel/traverse@7.25.9)(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)))(typescript@5.4.5) + '@nx/devkit': 19.4.2(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15))) + '@nx/workspace': 19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)) babel-plugin-const-enum: 1.2.0(@babel/core@7.23.9) babel-plugin-macros: 2.8.0 babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.23.9)(@babel/traverse@7.25.9) @@ -19645,7 +19679,7 @@ snapshots: ora: 5.3.0 semver: 7.6.3 source-map-support: 0.5.19 - ts-node: 10.9.1(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5) + ts-node: 10.9.1(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5) tsconfig-paths: 4.2.0 tslib: 2.6.3 transitivePeerDependencies: @@ -19689,13 +19723,13 @@ snapshots: '@nx/nx-win32-x64-msvc@19.4.2': optional: true - '@nx/workspace@19.4.2(@swc/core@1.9.2)': + '@nx/workspace@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15))': dependencies: - '@nrwl/workspace': 19.4.2(@swc/core@1.9.2) - '@nx/devkit': 19.4.2(nx@19.4.2(@swc/core@1.9.2)) + '@nrwl/workspace': 19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)) + '@nx/devkit': 19.4.2(nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15))) chalk: 4.1.2 enquirer: 2.3.6 - nx: 19.4.2(@swc/core@1.9.2) + nx: 19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)) tslib: 2.6.3 yargs-parser: 21.1.1 transitivePeerDependencies: @@ -19716,13 +19750,15 @@ snapshots: transitivePeerDependencies: - '@parcel/core' - '@parcel/cache@2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))': + '@parcel/cache@2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))(@swc/helpers@0.5.15)': dependencies: '@parcel/core': 2.12.0(@swc/helpers@0.5.15) '@parcel/fs': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))(@swc/helpers@0.5.15) '@parcel/logger': 2.12.0 '@parcel/utils': 2.12.0 lmdb: 2.8.5 + transitivePeerDependencies: + - '@swc/helpers' '@parcel/codeframe@2.12.0': dependencies: @@ -19782,7 +19818,7 @@ snapshots: '@parcel/core@2.12.0(@swc/helpers@0.5.15)': dependencies: '@mischnic/json-sourcemap': 0.1.1 - '@parcel/cache': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15)) + '@parcel/cache': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))(@swc/helpers@0.5.15) '@parcel/diagnostic': 2.12.0 '@parcel/events': 2.12.0 '@parcel/fs': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))(@swc/helpers@0.5.15) @@ -20197,7 +20233,7 @@ snapshots: '@parcel/types@2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))(@swc/helpers@0.5.15)': dependencies: - '@parcel/cache': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15)) + '@parcel/cache': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))(@swc/helpers@0.5.15) '@parcel/diagnostic': 2.12.0 '@parcel/fs': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))(@swc/helpers@0.5.15) '@parcel/package-manager': 2.12.0(@parcel/core@2.12.0(@swc/helpers@0.5.15))(@swc/helpers@0.5.15) @@ -22700,33 +22736,33 @@ snapshots: '@webcomponents/custom-elements@1.6.0': {} - '@webpack-cli/configtest@1.2.0(webpack-cli@4.10.0(webpack@5.94.0))(webpack@5.94.0(@swc/core@1.9.2)(webpack-cli@4.10.0))': + '@webpack-cli/configtest@1.2.0(webpack-cli@4.10.0)(webpack@5.94.0)': dependencies: - webpack: 5.94.0(@swc/core@1.9.2)(webpack-cli@4.10.0) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack-cli@4.10.0) webpack-cli: 4.10.0(webpack@5.94.0) - '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4(webpack-dev-server@4.15.1)(webpack@5.94.0))(webpack@5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4))': + '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.94.0)': dependencies: - webpack: 5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack-dev-server@4.15.1)(webpack@5.94.0) - '@webpack-cli/info@1.5.0(webpack-cli@4.10.0(webpack@5.94.0))': + '@webpack-cli/info@1.5.0(webpack-cli@4.10.0)': dependencies: envinfo: 7.14.0 webpack-cli: 4.10.0(webpack@5.94.0) - '@webpack-cli/info@2.0.2(webpack-cli@5.1.4(webpack-dev-server@4.15.1)(webpack@5.94.0))(webpack@5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4))': + '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.94.0)': dependencies: - webpack: 5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack-dev-server@4.15.1)(webpack@5.94.0) - '@webpack-cli/serve@1.7.0(webpack-cli@4.10.0(webpack@5.94.0))': + '@webpack-cli/serve@1.7.0(webpack-cli@4.10.0)': dependencies: webpack-cli: 4.10.0(webpack@5.94.0) - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4(webpack-dev-server@4.15.1)(webpack@5.94.0))(webpack-dev-server@4.15.1(webpack-cli@5.1.4)(webpack@5.94.0))(webpack@5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4))': + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack-dev-server@4.15.1)(webpack@5.94.0)': dependencies: - webpack: 5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack-dev-server@4.15.1)(webpack@5.94.0) optionalDependencies: webpack-dev-server: 4.15.1(webpack-cli@5.1.4)(webpack@5.94.0) @@ -23418,12 +23454,12 @@ snapshots: - supports-color optional: true - babel-loader@9.1.3(@babel/core@7.24.0)(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)): + babel-loader@9.1.3(@babel/core@7.24.0)(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)): dependencies: '@babel/core': 7.24.0 find-cache-dir: 4.0.0 schema-utils: 4.2.0 - webpack: 5.94.0(@swc/core@1.9.2)(esbuild@0.20.1) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) babel-loader@9.2.1(@babel/core@7.23.9)(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.18.20)): dependencies: @@ -24659,7 +24695,7 @@ snapshots: each-props: 1.3.2 is-plain-object: 5.0.0 - copy-webpack-plugin@11.0.0(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)): + copy-webpack-plugin@11.0.0(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)): dependencies: fast-glob: 3.3.2 glob-parent: 6.0.2 @@ -24667,7 +24703,7 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.94.0(@swc/core@1.9.2)(esbuild@0.20.1) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) core-js-compat@3.39.0: dependencies: @@ -24771,13 +24807,13 @@ snapshots: safe-buffer: 5.2.1 sha.js: 2.4.11 - create-jest@29.7.0(@types/node@20.11.17)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@4.9.5)): + create-jest@29.7.0(@types/node@20.11.17)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(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.11.17)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@4.9.5)) + jest-config: 29.7.0(@types/node@20.11.17)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@4.9.5)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -24786,13 +24822,13 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@20.11.17)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@5.4.5)): + create-jest@29.7.0(@types/node@20.11.17)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@5.4.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.11.17)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@5.4.5)) + jest-config: 29.7.0(@types/node@20.11.17)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@5.4.5)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -24802,13 +24838,13 @@ snapshots: - ts-node optional: true - create-jest@29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)): + create-jest@29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.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.12.8)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)) + jest-config: 29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -24886,7 +24922,7 @@ snapshots: optionalDependencies: webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.18.20) - css-loader@6.10.0(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)): + css-loader@6.10.0(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)): dependencies: icss-utils: 5.1.0(postcss@8.4.38) postcss: 8.4.38 @@ -24897,9 +24933,9 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.6.3 optionalDependencies: - webpack: 5.94.0(@swc/core@1.9.2)(esbuild@0.20.1) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) - css-loader@6.10.0(webpack@5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4)): + css-loader@6.10.0(webpack@5.94.0): dependencies: icss-utils: 5.1.0(postcss@8.4.38) postcss: 8.4.38 @@ -24910,7 +24946,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.6.3 optionalDependencies: - webpack: 5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack-cli@5.1.4) css-select@4.3.0: dependencies: @@ -24925,7 +24961,7 @@ snapshots: boolbase: 1.0.0 css-what: 6.1.0 domhandler: 5.0.3 - domutils: 3.1.0 + domutils: 3.2.1 nth-check: 2.1.1 css-selector-tokenizer@0.7.3: @@ -25497,7 +25533,7 @@ snapshots: domelementtype: 2.3.0 domhandler: 4.3.1 - domutils@3.1.0: + domutils@3.2.1: dependencies: dom-serializer: 2.0.0 domelementtype: 2.3.0 @@ -25670,6 +25706,8 @@ snapshots: entities@4.5.0: {} + entities@6.0.0: {} + env-paths@2.2.1: {} envinfo@7.14.0: {} @@ -26180,60 +26218,60 @@ snapshots: eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0))(eslint@8.56.0) eslint-plugin-import: 2.29.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0) - eslint-config-devextreme@0.2.0(atnximysgm2qhxoullfrc4ld7m): + eslint-config-devextreme@0.2.0(mktse5lvs4n2jhnoaohf3tcuti): dependencies: '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5) eslint: 8.56.0 eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0))(eslint@8.56.0) eslint-config-airbnb-typescript: 17.1.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5))(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint-plugin-import@2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0))(eslint@8.56.0) eslint-plugin-import: 2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0) - eslint-plugin-jest: 27.6.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(jest@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)))(typescript@4.9.5) + eslint-plugin-jest: 27.6.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(jest@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5)))(typescript@4.9.5) eslint-plugin-jest-formatting: 3.1.0(eslint@8.56.0) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.56.0) eslint-plugin-qunit: 7.3.4(eslint@8.56.0) eslint-plugin-rulesdir: 0.2.2 eslint-plugin-spellcheck: 0.0.20(eslint@8.56.0) - eslint-config-devextreme@1.1.5(6j36mkhhhj37fby37wfpgi52ue): + eslint-config-devextreme@1.1.5(2wu47vven6w2q4wadgy2aiclqi): dependencies: - '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5) eslint: 8.56.0 - eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0))(eslint@8.56.0) - eslint-config-airbnb-typescript: 17.1.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5))(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint-plugin-import@2.29.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0))(eslint@8.56.0) - eslint-plugin-import: 2.29.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0) - eslint-plugin-jest: 27.6.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(jest@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)))(typescript@4.9.5) + eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0))(eslint@8.56.0) + eslint-config-airbnb-typescript: 17.1.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5))(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint-plugin-import@2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0))(eslint@8.56.0) + eslint-plugin-import: 2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0) + eslint-plugin-jest: 27.6.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(jest@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5)))(typescript@4.9.5) eslint-plugin-jest-formatting: 3.1.0(eslint@8.56.0) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.56.0) eslint-plugin-qunit: 7.3.4(eslint@8.56.0) eslint-plugin-rulesdir: 0.2.2 eslint-plugin-spellcheck: 0.0.20(eslint@8.56.0) - stylelint: 16.5.0(typescript@4.9.5) - stylelint-config-standard: 35.0.0(stylelint@16.5.0(typescript@4.9.5)) + stylelint: 15.11.0(typescript@4.9.5) + stylelint-config-standard: 35.0.0(stylelint@15.11.0(typescript@4.9.5)) - eslint-config-devextreme@1.1.5(dviz67724z5lsegdjr2jecno6q): + eslint-config-devextreme@1.1.5(7y2kapk54x3chxrybrye64ikau): dependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5) + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5) eslint: 8.56.0 - eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0))(eslint@8.56.0) - eslint-config-airbnb-typescript: 17.1.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5))(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint-plugin-import@2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0))(eslint@8.56.0) - eslint-plugin-import: 2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0) - eslint-plugin-jest: 27.6.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(jest@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)))(typescript@4.9.5) + eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0))(eslint@8.56.0) + eslint-config-airbnb-typescript: 17.1.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5))(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint-plugin-import@2.29.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0))(eslint@8.56.0) + eslint-plugin-import: 2.29.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0) + eslint-plugin-jest: 27.6.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(jest@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5)))(typescript@4.9.5) eslint-plugin-jest-formatting: 3.1.0(eslint@8.56.0) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.56.0) eslint-plugin-qunit: 7.3.4(eslint@8.56.0) eslint-plugin-rulesdir: 0.2.2 eslint-plugin-spellcheck: 0.0.20(eslint@8.56.0) - stylelint: 15.11.0(typescript@4.9.5) - stylelint-config-standard: 35.0.0(stylelint@15.11.0(typescript@4.9.5)) + stylelint: 16.5.0(typescript@4.9.5) + stylelint-config-standard: 35.0.0(stylelint@16.5.0(typescript@4.9.5)) - eslint-config-devextreme@1.1.5(zsmfaq7l2ubx6arjipvaytbeca): + eslint-config-devextreme@1.1.5(s7hytideue6mgyvvaok756vzia): dependencies: '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5) eslint: 8.56.0 eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0))(eslint@8.56.0) eslint-config-airbnb-typescript: 17.1.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5))(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint-plugin-import@2.29.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0))(eslint@8.56.0) eslint-plugin-import: 2.29.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0) - eslint-plugin-jest: 27.6.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(jest@29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@4.9.5)))(typescript@4.9.5) + eslint-plugin-jest: 27.6.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(jest@29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@4.9.5)))(typescript@4.9.5) eslint-plugin-jest-formatting: 3.1.0(eslint@8.56.0) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.56.0) eslint-plugin-qunit: 7.3.4(eslint@8.56.0) @@ -26346,35 +26384,35 @@ snapshots: dependencies: eslint: 8.56.0 - eslint-plugin-jest@27.6.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(jest@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)))(typescript@4.9.5): + eslint-plugin-jest@27.6.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(jest@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5)))(typescript@4.9.5): dependencies: '@typescript-eslint/utils': 5.62.0(eslint@8.56.0)(typescript@4.9.5) eslint: 8.56.0 optionalDependencies: '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5) - jest: 29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)) + jest: 29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5)) transitivePeerDependencies: - supports-color - typescript - eslint-plugin-jest@27.6.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(jest@29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@4.9.5)))(typescript@4.9.5): + eslint-plugin-jest@27.6.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(jest@29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@4.9.5)))(typescript@4.9.5): dependencies: '@typescript-eslint/utils': 5.62.0(eslint@8.56.0)(typescript@4.9.5) eslint: 8.56.0 optionalDependencies: '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5) - jest: 29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@4.9.5)) + jest: 29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@4.9.5)) transitivePeerDependencies: - supports-color - typescript - eslint-plugin-jest@27.6.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(jest@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)))(typescript@4.9.5): + eslint-plugin-jest@27.6.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(jest@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5)))(typescript@4.9.5): dependencies: '@typescript-eslint/utils': 5.62.0(eslint@8.56.0)(typescript@4.9.5) eslint: 8.56.0 optionalDependencies: '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@4.9.5))(eslint@8.56.0)(typescript@4.9.5) - jest: 29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)) + jest: 29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5)) transitivePeerDependencies: - supports-color - typescript @@ -28175,6 +28213,11 @@ snapshots: domhandler: 4.3.1 htmlparser2: 7.2.0 + html-dom-parser@5.0.13: + dependencies: + domhandler: 5.0.3 + htmlparser2: 10.0.0 + html-element-map@1.3.1: dependencies: array.prototype.filter: 1.0.4 @@ -28206,6 +28249,16 @@ snapshots: react-property: 2.0.0 style-to-js: 1.1.1 + html-react-parser@5.2.2(@types/react@18.0.38)(react@18.0.0): + dependencies: + domhandler: 5.0.3 + html-dom-parser: 5.0.13 + react: 18.0.0 + react-property: 2.0.2 + style-to-js: 1.1.16 + optionalDependencies: + '@types/react': 18.0.38 + html-tags@3.3.1: {} html-void-elements@3.0.0: {} @@ -28220,7 +28273,7 @@ snapshots: optionalDependencies: webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.18.20) - html-webpack-plugin@5.6.3(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)): + html-webpack-plugin@5.6.3(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -28228,7 +28281,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.94.0(@swc/core@1.9.2)(esbuild@0.20.1) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) optional: true html2canvas@1.4.1: @@ -28252,6 +28305,13 @@ snapshots: transitivePeerDependencies: - typescript + htmlparser2@10.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.2.1 + entities: 6.0.0 + htmlparser2@6.1.0: dependencies: domelementtype: 2.3.0 @@ -28270,7 +28330,7 @@ snapshots: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 - domutils: 3.1.0 + domutils: 3.2.1 entities: 4.5.0 http-cache-semantics@4.1.1: {} @@ -28529,6 +28589,8 @@ snapshots: inline-style-parser@0.1.1: {} + inline-style-parser@0.2.4: {} + inquirer@9.2.15: dependencies: '@ljharb/through': 2.3.13 @@ -29039,16 +29101,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@4.9.5)): + jest-cli@29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@4.9.5)): dependencies: - '@jest/core': 29.7.0(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@4.9.5)) + '@jest/core': 29.7.0(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(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.11.17)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@4.9.5)) + create-jest: 29.7.0(@types/node@20.11.17)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@4.9.5)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.11.17)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@4.9.5)) + jest-config: 29.7.0(@types/node@20.11.17)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@4.9.5)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -29060,16 +29122,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@5.4.5)): + jest-cli@29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@5.4.5)): dependencies: - '@jest/core': 29.7.0(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@5.4.5)) + '@jest/core': 29.7.0(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@5.4.5)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.11.17)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@5.4.5)) + create-jest: 29.7.0(@types/node@20.11.17)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@5.4.5)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.11.17)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@5.4.5)) + jest-config: 29.7.0(@types/node@20.11.17)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@5.4.5)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -29082,16 +29144,16 @@ snapshots: - ts-node optional: true - jest-cli@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)): + jest-cli@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5)): dependencies: - '@jest/core': 29.7.0(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)) + '@jest/core': 29.7.0(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)) + create-jest: 29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)) + jest-config: 29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -29103,7 +29165,7 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@20.11.17)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@4.9.5)): + jest-config@29.7.0(@types/node@20.11.17)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@4.9.5)): dependencies: '@babel/core': 7.23.9 '@jest/test-sequencer': 29.7.0 @@ -29129,12 +29191,12 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.11.17 - ts-node: 10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@4.9.5) + ts-node: 10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@4.9.5) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.11.17)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@5.4.5)): + jest-config@29.7.0(@types/node@20.11.17)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@5.4.5)): dependencies: '@babel/core': 7.23.9 '@jest/test-sequencer': 29.7.0 @@ -29160,13 +29222,13 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.11.17 - ts-node: 10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@5.4.5) + ts-node: 10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@5.4.5) transitivePeerDependencies: - babel-plugin-macros - supports-color optional: true - jest-config@29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@4.9.5)): + jest-config@29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@4.9.5)): dependencies: '@babel/core': 7.23.9 '@jest/test-sequencer': 29.7.0 @@ -29192,12 +29254,12 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.12.8 - ts-node: 10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@4.9.5) + ts-node: 10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@4.9.5) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@5.4.5)): + jest-config@29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@5.4.5)): dependencies: '@babel/core': 7.23.9 '@jest/test-sequencer': 29.7.0 @@ -29223,13 +29285,13 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.12.8 - ts-node: 10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@5.4.5) + ts-node: 10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@5.4.5) transitivePeerDependencies: - babel-plugin-macros - supports-color optional: true - jest-config@29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)): + jest-config@29.7.0(@types/node@20.12.8)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5)): dependencies: '@babel/core': 7.23.9 '@jest/test-sequencer': 29.7.0 @@ -29255,7 +29317,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.12.8 - ts-node: 10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5) + ts-node: 10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -29501,12 +29563,12 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@4.9.5)): + jest@29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@4.9.5)): dependencies: - '@jest/core': 29.7.0(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@4.9.5)) + '@jest/core': 29.7.0(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@4.9.5)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@4.9.5)) + jest-cli: 29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@4.9.5)) optionalDependencies: node-notifier: 9.0.1 transitivePeerDependencies: @@ -29515,12 +29577,12 @@ snapshots: - supports-color - ts-node - jest@29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@5.4.5)): + jest@29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@5.4.5)): dependencies: - '@jest/core': 29.7.0(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@5.4.5)) + '@jest/core': 29.7.0(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@5.4.5)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@5.4.5)) + jest-cli: 29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@5.4.5)) optionalDependencies: node-notifier: 9.0.1 transitivePeerDependencies: @@ -29530,12 +29592,12 @@ snapshots: - ts-node optional: true - jest@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)): + jest@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5)): dependencies: - '@jest/core': 29.7.0(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)) + '@jest/core': 29.7.0(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)) + jest-cli: 29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5)) optionalDependencies: node-notifier: 9.0.1 transitivePeerDependencies: @@ -29783,11 +29845,11 @@ snapshots: dependencies: source-map-support: 0.5.21 - karma-webpack@5.0.1(webpack@5.94.0(@swc/core@1.9.2)): + karma-webpack@5.0.1(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))): dependencies: glob: 7.2.3 minimatch: 9.0.5 - webpack: 5.94.0(@swc/core@1.9.2)(esbuild@0.20.1) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) webpack-merge: 4.2.2 karma@6.4.4: @@ -29899,11 +29961,11 @@ snapshots: lead@4.0.0: {} - less-loader@11.1.0(less@4.2.0)(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)): + less-loader@11.1.0(less@4.2.0)(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)): dependencies: klona: 2.0.6 less: 4.2.0 - webpack: 5.94.0(@swc/core@1.9.2)(esbuild@0.20.1) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) less@4.2.0: dependencies: @@ -29926,11 +29988,11 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - license-webpack-plugin@4.0.2(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)): + license-webpack-plugin@4.0.2(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)): dependencies: webpack-sources: 3.2.3 optionalDependencies: - webpack: 5.94.0(@swc/core@1.9.2)(esbuild@0.20.1) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) lie@3.3.0: dependencies: @@ -30689,11 +30751,11 @@ snapshots: min-indent@1.0.1: {} - mini-css-extract-plugin@2.8.1(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)): + mini-css-extract-plugin@2.8.1(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)): dependencies: schema-utils: 4.2.0 tapable: 2.2.1 - webpack: 5.94.0(@swc/core@1.9.2)(esbuild@0.20.1) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) minimalistic-assert@1.0.1: {} @@ -31231,9 +31293,9 @@ snapshots: transitivePeerDependencies: - debug - nx@19.4.2(@swc/core@1.9.2): + nx@19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)): dependencies: - '@nrwl/tao': 19.4.2(@swc/core@1.9.2) + '@nrwl/tao': 19.4.2(@swc/core@1.9.2(@swc/helpers@0.5.15)) '@yarnpkg/lockfile': 1.1.0 '@yarnpkg/parsers': 3.0.0-rc.46 '@zkochan/js-yaml': 0.0.7 @@ -31914,14 +31976,14 @@ snapshots: postcss: 8.4.38 postcss-safe-parser: 6.0.0(postcss@8.4.38) - postcss-loader@8.1.1(postcss@8.4.35)(typescript@5.4.5)(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)): + postcss-loader@8.1.1(postcss@8.4.35)(typescript@5.4.5)(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)): dependencies: cosmiconfig: 9.0.0(typescript@5.4.5) jiti: 1.21.6 postcss: 8.4.35 semver: 7.6.3 optionalDependencies: - webpack: 5.94.0(@swc/core@1.9.2)(esbuild@0.20.1) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) transitivePeerDependencies: - typescript @@ -32383,6 +32445,8 @@ snapshots: react-property@2.0.0: {} + react-property@2.0.2: {} + react-refresh@0.14.2: {} react-refresh@0.9.0: {} @@ -33076,13 +33140,13 @@ snapshots: sass-embedded-win32-ia32: 1.66.0 sass-embedded-win32-x64: 1.66.0 - sass-loader@14.1.1(sass-embedded@1.66.0)(sass@1.71.1)(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)): + sass-loader@14.1.1(sass-embedded@1.66.0)(sass@1.71.1)(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)): dependencies: neo-async: 2.6.2 optionalDependencies: sass: 1.71.1 sass-embedded: 1.66.0 - webpack: 5.94.0(@swc/core@1.9.2)(esbuild@0.20.1) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) sass-lookup@5.0.1: dependencies: @@ -33431,17 +33495,17 @@ snapshots: source-map-js@1.2.1: {} - source-map-loader@4.0.2(webpack@5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4)): + source-map-loader@4.0.2(webpack@5.94.0): dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack-cli@5.1.4) - source-map-loader@5.0.0(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)): + source-map-loader@5.0.0(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)): dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.94.0(@swc/core@1.9.2)(esbuild@0.20.1) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) source-map-resolve@0.5.3: dependencies: @@ -33674,11 +33738,11 @@ snapshots: char-regex: 1.0.2 strip-ansi: 6.0.1 - string-replace-loader@3.1.0(webpack@5.94.0(@swc/core@1.9.2)): + string-replace-loader@3.1.0(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.94.0(@swc/core@1.9.2)(esbuild@0.20.1) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) string-width@1.0.2: dependencies: @@ -33815,9 +33879,9 @@ snapshots: dependencies: webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.18.20) - style-loader@3.3.4(webpack@5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4)): + style-loader@3.3.4(webpack@5.94.0): dependencies: - webpack: 5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack-cli@5.1.4) style-search@0.1.0: {} @@ -33825,10 +33889,18 @@ snapshots: dependencies: style-to-object: 0.3.0 + style-to-js@1.1.16: + dependencies: + style-to-object: 1.0.8 + style-to-object@0.3.0: dependencies: inline-style-parser: 0.1.1 + style-to-object@1.0.8: + dependencies: + inline-style-parser: 0.2.4 + stylelint-config-html@1.1.0(postcss-html@1.7.0)(stylelint@16.5.0(typescript@5.4.5)): dependencies: postcss-html: 1.7.0 @@ -34293,37 +34365,26 @@ snapshots: '@swc/core': 1.9.2(@swc/helpers@0.5.15) esbuild: 0.18.20 - terser-webpack-plugin@5.3.10(@swc/core@1.9.2)(esbuild@0.20.1)(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)): + terser-webpack-plugin@5.3.10(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.36.0 - webpack: 5.94.0(@swc/core@1.9.2)(esbuild@0.20.1) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) optionalDependencies: '@swc/core': 1.9.2(@swc/helpers@0.5.15) esbuild: 0.20.1 - terser-webpack-plugin@5.3.10(@swc/core@1.9.2)(webpack@5.94.0(@swc/core@1.9.2)(webpack-cli@4.10.0)): - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - jest-worker: 27.5.1 - schema-utils: 3.3.0 - serialize-javascript: 6.0.2 - terser: 5.36.0 - webpack: 5.94.0(@swc/core@1.9.2)(webpack-cli@4.10.0) - optionalDependencies: - '@swc/core': 1.9.2(@swc/helpers@0.5.15) - - terser-webpack-plugin@5.3.10(@swc/core@1.9.2)(webpack@5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4)): + terser-webpack-plugin@5.3.10(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack@5.94.0): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.36.0 - webpack: 5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack-cli@5.1.4) optionalDependencies: '@swc/core': 1.9.2(@swc/helpers@0.5.15) @@ -34339,14 +34400,14 @@ snapshots: '@swc/core': 1.9.2(@swc/helpers@0.5.15) esbuild: 0.18.20 - terser-webpack-plugin@5.3.9(@swc/core@1.9.2)(webpack@5.94.0(@swc/core@1.9.2)): + terser-webpack-plugin@5.3.9(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.36.0 - webpack: 5.94.0(@swc/core@1.9.2)(esbuild@0.20.1) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) optionalDependencies: '@swc/core': 1.9.2(@swc/helpers@0.5.15) @@ -34935,11 +34996,11 @@ snapshots: ts-dedent@2.2.0: {} - ts-jest@29.1.2(@babel/core@7.23.9)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(jest@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)))(typescript@4.9.5): + ts-jest@29.1.2(@babel/core@7.23.9)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(jest@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.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.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)) + jest: 29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -34952,11 +35013,11 @@ snapshots: '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.23.9) - ts-jest@29.1.2(@babel/core@7.24.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.0))(jest@29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@4.9.5)))(typescript@4.9.5): + ts-jest@29.1.2(@babel/core@7.24.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.0))(jest@29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(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.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@4.9.5)) + jest: 29.7.0(@types/node@20.11.17)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@4.9.5)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -34969,11 +35030,11 @@ snapshots: '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.24.0) - ts-jest@29.1.2(@babel/core@7.24.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.0))(jest@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)))(typescript@5.4.5): + ts-jest@29.1.2(@babel/core@7.24.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.0))(jest@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5)))(typescript@5.4.5): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)) + jest: 29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -34986,11 +35047,11 @@ snapshots: '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.24.0) - ts-jest@29.1.3(@babel/core@7.24.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.0))(jest@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)))(typescript@4.9.5): + ts-jest@29.1.3(@babel/core@7.24.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.0))(jest@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.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.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)) + jest: 29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -35004,11 +35065,11 @@ snapshots: '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.24.0) - ts-jest@29.1.3(@babel/core@7.24.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.0))(jest@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)))(typescript@5.4.5): + ts-jest@29.1.3(@babel/core@7.24.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.0))(jest@29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5)))(typescript@5.4.5): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5)) + jest: 29.7.0(@types/node@20.12.8)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -35022,7 +35083,7 @@ snapshots: '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.24.0) - ts-loader@9.5.1(typescript@4.9.5)(webpack@5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4)): + ts-loader@9.5.1(typescript@4.9.5)(webpack@5.94.0): dependencies: chalk: 4.1.2 enhanced-resolve: 5.17.1 @@ -35030,9 +35091,9 @@ snapshots: semver: 7.6.3 source-map: 0.7.4 typescript: 4.9.5 - webpack: 5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack-cli@5.1.4) - ts-loader@9.5.1(typescript@5.4.5)(webpack@5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4)): + ts-loader@9.5.1(typescript@5.4.5)(webpack@5.94.0): dependencies: chalk: 4.1.2 enhanced-resolve: 5.17.1 @@ -35040,9 +35101,9 @@ snapshots: semver: 7.6.3 source-map: 0.7.4 typescript: 5.4.5 - webpack: 5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack-cli@5.1.4) - ts-node@10.9.1(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5): + ts-node@10.9.1(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -35062,7 +35123,7 @@ snapshots: optionalDependencies: '@swc/core': 1.9.2(@swc/helpers@0.5.15) - ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@4.9.5): + ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@4.9.5): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -35082,7 +35143,7 @@ snapshots: optionalDependencies: '@swc/core': 1.9.2(@swc/helpers@0.5.15) - ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.11.17)(typescript@5.4.5): + ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.11.17)(typescript@5.4.5): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -35102,7 +35163,7 @@ snapshots: optionalDependencies: '@swc/core': 1.9.2(@swc/helpers@0.5.15) - ts-node@10.9.2(@swc/core@1.9.2)(@types/node@20.12.8)(typescript@5.4.5): + ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.15))(@types/node@20.12.8)(typescript@5.4.5): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -35487,12 +35548,12 @@ snapshots: url-join@4.0.1: {} - url-loader@1.1.2(webpack@5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4)): + url-loader@1.1.2(webpack@5.94.0): dependencies: loader-utils: 1.4.2 mime: 2.6.0 schema-utils: 1.0.0 - webpack: 5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack-cli@5.1.4) url-parse@1.5.10: dependencies: @@ -35781,12 +35842,12 @@ snapshots: transitivePeerDependencies: - supports-color - vue-loader@17.4.2(@vue/compiler-sfc@3.3.4)(vue@3.2.47)(webpack@5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4)): + vue-loader@17.4.2(@vue/compiler-sfc@3.3.4)(vue@3.2.47)(webpack@5.94.0): dependencies: chalk: 4.1.2 hash-sum: 2.0.0 watchpack: 2.4.2 - webpack: 5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack-cli@5.1.4) optionalDependencies: '@vue/compiler-sfc': 3.3.4 vue: 3.2.47 @@ -35857,9 +35918,9 @@ snapshots: webpack-cli@4.10.0(webpack@5.94.0): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0(webpack@5.94.0))(webpack@5.94.0(@swc/core@1.9.2)(webpack-cli@4.10.0)) - '@webpack-cli/info': 1.5.0(webpack-cli@4.10.0(webpack@5.94.0)) - '@webpack-cli/serve': 1.7.0(webpack-cli@4.10.0(webpack@5.94.0)) + '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0)(webpack@5.94.0) + '@webpack-cli/info': 1.5.0(webpack-cli@4.10.0) + '@webpack-cli/serve': 1.7.0(webpack-cli@4.10.0) colorette: 2.0.20 commander: 7.2.0 cross-spawn: 7.0.6 @@ -35867,15 +35928,15 @@ snapshots: import-local: 3.2.0 interpret: 2.2.0 rechoir: 0.7.1 - webpack: 5.94.0(@swc/core@1.9.2)(webpack-cli@4.10.0) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack-cli@4.10.0) webpack-merge: 5.10.0 webpack-cli@5.1.4(webpack-dev-server@4.15.1)(webpack@5.94.0): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4(webpack-dev-server@4.15.1)(webpack@5.94.0))(webpack@5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4)) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4(webpack-dev-server@4.15.1)(webpack@5.94.0))(webpack@5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4)) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4(webpack-dev-server@4.15.1)(webpack@5.94.0))(webpack-dev-server@4.15.1(webpack-cli@5.1.4)(webpack@5.94.0))(webpack@5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4)) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.94.0) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.94.0) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack-dev-server@4.15.1)(webpack@5.94.0) colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.6 @@ -35884,7 +35945,7 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack-cli@5.1.4) webpack-merge: 5.10.0 optionalDependencies: webpack-dev-server: 4.15.1(webpack-cli@5.1.4)(webpack@5.94.0) @@ -35899,25 +35960,25 @@ snapshots: webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.18.20) optional: true - webpack-dev-middleware@5.3.4(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)): + webpack-dev-middleware@5.3.4(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)): dependencies: colorette: 2.0.20 memfs: 3.5.3 mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.2.0 - webpack: 5.94.0(@swc/core@1.9.2)(esbuild@0.20.1) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) - webpack-dev-middleware@5.3.4(webpack@5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4)): + webpack-dev-middleware@5.3.4(webpack@5.94.0): dependencies: colorette: 2.0.20 memfs: 3.5.3 mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.2.0 - webpack: 5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack-cli@5.1.4) - webpack-dev-middleware@6.1.2(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)): + webpack-dev-middleware@6.1.2(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)): dependencies: colorette: 2.0.20 memfs: 3.5.3 @@ -35925,7 +35986,7 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.2.0 optionalDependencies: - webpack: 5.94.0(@swc/core@1.9.2)(esbuild@0.20.1) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) webpack-dev-middleware@6.1.3(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.18.20)): dependencies: @@ -35967,10 +36028,10 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 5.3.4(webpack@5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4)) + webpack-dev-middleware: 5.3.4(webpack@5.94.0) ws: 8.18.0 optionalDependencies: - webpack: 5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack-cli@5.1.4) webpack-cli: 5.1.4(webpack-dev-server@4.15.1)(webpack@5.94.0) transitivePeerDependencies: - bufferutil @@ -36019,7 +36080,7 @@ snapshots: - utf-8-validate optional: true - webpack-dev-server@4.15.1(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)): + webpack-dev-server@4.15.1(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -36049,10 +36110,10 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 5.3.4(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)) + webpack-dev-middleware: 5.3.4(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)) ws: 8.18.0 optionalDependencies: - webpack: 5.94.0(@swc/core@1.9.2)(esbuild@0.20.1) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) transitivePeerDependencies: - bufferutil - debug @@ -36077,7 +36138,7 @@ snapshots: webpack-sources@3.2.3: {} - webpack-stream@7.0.0(webpack@5.94.0(@swc/core@1.9.2)): + webpack-stream@7.0.0(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))): dependencies: fancy-log: 1.3.3 lodash.clone: 4.5.0 @@ -36087,14 +36148,14 @@ snapshots: supports-color: 8.1.1 through: 2.3.8 vinyl: 2.2.1 - webpack: 5.94.0(@swc/core@1.9.2)(esbuild@0.20.1) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) - webpack-subresource-integrity@5.1.0(html-webpack-plugin@5.6.3(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)))(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)): + webpack-subresource-integrity@5.1.0(html-webpack-plugin@5.6.3(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)))(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)): dependencies: typed-assert: 1.0.9 - webpack: 5.94.0(@swc/core@1.9.2)(esbuild@0.20.1) + webpack: 5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1) optionalDependencies: - html-webpack-plugin: 5.6.3(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)) + html-webpack-plugin: 5.6.3(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)) webpack-virtual-modules@0.5.0: {} @@ -36130,7 +36191,7 @@ snapshots: - esbuild - uglify-js - webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1): + webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1): dependencies: '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.14.1 @@ -36152,7 +36213,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.9.2)(esbuild@0.20.1)(webpack@5.94.0(@swc/core@1.9.2)(esbuild@0.20.1)) + terser-webpack-plugin: 5.3.10(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)(webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(esbuild@0.20.1)) watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -36160,7 +36221,7 @@ snapshots: - esbuild - uglify-js - webpack@5.94.0(@swc/core@1.9.2)(webpack-cli@4.10.0): + webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack-cli@4.10.0): dependencies: '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.14.1 @@ -36182,7 +36243,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.9.2)(webpack@5.94.0(@swc/core@1.9.2)(webpack-cli@4.10.0)) + terser-webpack-plugin: 5.3.10(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack@5.94.0) watchpack: 2.4.2 webpack-sources: 3.2.3 optionalDependencies: @@ -36192,7 +36253,7 @@ snapshots: - esbuild - uglify-js - webpack@5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4): + webpack@5.94.0(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack-cli@5.1.4): dependencies: '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.14.1 @@ -36214,7 +36275,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.9.2)(webpack@5.94.0(@swc/core@1.9.2)(webpack-cli@5.1.4)) + terser-webpack-plugin: 5.3.10(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack@5.94.0) watchpack: 2.4.2 webpack-sources: 3.2.3 optionalDependencies: From ad85b542952b60c8478fa02d573f63f1cc079533 Mon Sep 17 00:00:00 2001 From: Vasily Strelyaev Date: Wed, 8 Jan 2025 12:46:38 +0200 Subject: [PATCH 14/15] fix: address React 19 BC due to which configuration components do not apply their options (T1269933) (#28658) --- .../src/core/component-base.tsx | 46 +++++++++---------- 1 file changed, 21 insertions(+), 25 deletions(-) diff --git a/packages/devextreme-react/src/core/component-base.tsx b/packages/devextreme-react/src/core/component-base.tsx index 743dd160c541..66e5a424cb9b 100644 --- a/packages/devextreme-react/src/core/component-base.tsx +++ b/packages/devextreme-react/src/core/component-base.tsx @@ -26,7 +26,6 @@ import { elementPropNames, getClassName } from './widget-config'; import { TemplateManager } from './template-manager'; import { ComponentProps } from './component'; import { ElementType } from './configuration/react/element'; -import { IConfigNode } from './configuration/config-node'; import { NestedOptionContext, @@ -96,7 +95,25 @@ const ComponentBase = forwardRef( const prevPropsRef = useRef

(); - let widgetConfig: IConfigNode; + const templateContainer = useMemo(() => document.createElement('div'), []); + + const [widgetConfig, context] = useOptionScanning( + { + type: ElementType.Option, + descriptor: { + name: '', + isCollection: false, + templates: templateProps, + initialValuesProps: defaults, + predefinedValuesProps: {}, + expectedChildren, + }, + props, + }, + props.children, + templateContainer, + Symbol('initial update token'), + ); const restoreTree = useCallback(() => { if (childElementsDetached.current && childNodes.current?.length && element.current) { @@ -249,6 +266,7 @@ const ComponentBase = forwardRef( instance.current, subscribableOptions, independentEvents, + widgetConfig, ]); const onTemplatesRendered = useCallback(() => { @@ -279,6 +297,7 @@ const ComponentBase = forwardRef( scheduleTemplatesUpdate, updateCssClasses, props, + widgetConfig, ]); const onComponentMounted = useCallback(() => { @@ -339,29 +358,6 @@ const ComponentBase = forwardRef( shouldRestoreFocus.current, ]); - const templateContainer = useMemo(() => document.createElement('div'), []); - - const options = useOptionScanning( - { - type: ElementType.Option, - descriptor: { - name: '', - isCollection: false, - templates: templateProps, - initialValuesProps: defaults, - predefinedValuesProps: {}, - expectedChildren, - }, - props, - }, - props.children, - templateContainer, - Symbol('initial update token'), - ); - - [widgetConfig] = options; - const [, context] = options; - useLayoutEffect(() => { onComponentMounted(); From c7dc0e123801afe25a67564890ec9ed8833bfa21 Mon Sep 17 00:00:00 2001 From: Mikhail Preyskurantov <5574159+mpreyskurantov@users.noreply.github.com> Date: Wed, 8 Jan 2025 17:06:02 +0200 Subject: [PATCH 15/15] Revert "vue: suppress "Invalid prop: type" warn in demos ci" (#28683) --- apps/demos/testing/known-warnings.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/demos/testing/known-warnings.json b/apps/demos/testing/known-warnings.json index 27e6e7c27d98..97a7c082666d 100644 --- a/apps/demos/testing/known-warnings.json +++ b/apps/demos/testing/known-warnings.json @@ -2,6 +2,5 @@ "The specified credentials are invalid. You can sign up for a free developer account at http://www.bingmapsportal.com", "W0019 -", "W0022 -", - "W2108 -", - "[Vue warn]: Invalid prop: type check failed for prop" + "W2108 -" ]