From ef4eb68c56207312e47747f024605b9b10a3c788 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 10 Dec 2025 21:56:09 +0000 Subject: [PATCH 01/12] Initial plan From bf5ba8990fc072150e79da892a676a7c86eccdc4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 10 Dec 2025 22:04:00 +0000 Subject: [PATCH 02/12] Fix race condition in atomic-tab-manager by adding nullish coalescing for expression property Co-authored-by: fbeaudoincoveo <23503066+fbeaudoincoveo@users.noreply.github.com> --- .../atomic-tab-manager.spec.ts | 20 +++++++++++++++++++ .../atomic-tab-manager/atomic-tab-manager.ts | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.spec.ts b/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.spec.ts index a562331ab40..6f60327ab34 100644 --- a/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.spec.ts +++ b/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.spec.ts @@ -172,4 +172,24 @@ describe('atomic-tab-manager', () => { }); }); }); + + describe('when tab expression property is undefined (race condition)', () => { + it('should use empty string as fallback for undefined expression', async () => { + await renderTabManager({ + slottedContent: html` + + `, + }); + + // Verify buildTab was called with empty string for expression + const buildTabCalls = vi.mocked(buildTab).mock.calls; + expect(buildTabCalls.length).toBeGreaterThan(0); + buildTabCalls.forEach((call) => { + // The expression should be a string (either empty or defined) + expect(typeof call[1]?.options?.expression).toBe('string'); + // Should not be undefined + expect(call[1]?.options?.expression).not.toBeUndefined(); + }); + }); + }); }); diff --git a/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.ts b/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.ts index 2face696b92..0b5f52e9b66 100644 --- a/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.ts +++ b/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.ts @@ -93,7 +93,7 @@ export class AtomicTabManager } const tabController = buildTab(this.bindings.engine, { options: { - expression: tabElement.expression, + expression: tabElement.expression ?? '', id: tabElement.name, clearFiltersOnTabChange: this.clearFiltersOnTabChange, }, From 919e3808f6a9a3ff080007b8135a91396a36e05f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 10 Dec 2025 22:19:00 +0000 Subject: [PATCH 03/12] Refactor test: remove describe wrapper, inline comments, and force undefined expression to simulate race condition Co-authored-by: fbeaudoincoveo <23503066+fbeaudoincoveo@users.noreply.github.com> --- .../atomic-tab-manager.spec.ts | 52 +++++++++++++------ 1 file changed, 37 insertions(+), 15 deletions(-) diff --git a/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.spec.ts b/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.spec.ts index 6f60327ab34..d82a8f86f41 100644 --- a/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.spec.ts +++ b/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.spec.ts @@ -173,23 +173,45 @@ describe('atomic-tab-manager', () => { }); }); - describe('when tab expression property is undefined (race condition)', () => { - it('should use empty string as fallback for undefined expression', async () => { - await renderTabManager({ - slottedContent: html` + it('should use empty string as fallback for undefined expression when tab expression property is undefined (race condition)', async () => { + const fakeTabManager = buildFakeTabManager({ + activeTab: 'all', + }); + + mockConsole(); + + vi.mocked(buildTabManager).mockReturnValue(fakeTabManager); + + vi.mocked(buildTab).mockImplementation((_engine, options) => { + return { + state: { + isActive: options?.options?.id === fakeTabManager.state.activeTab, + }, + select: vi.fn(), + subscribe: vi.fn(), + } as never; + }); + + const {element} = await renderInAtomicSearchInterface({ + template: html` + - `, - }); + + `, + selector: 'atomic-tab-manager', + }); - // Verify buildTab was called with empty string for expression - const buildTabCalls = vi.mocked(buildTab).mock.calls; - expect(buildTabCalls.length).toBeGreaterThan(0); - buildTabCalls.forEach((call) => { - // The expression should be a string (either empty or defined) - expect(typeof call[1]?.options?.expression).toBe('string'); - // Should not be undefined - expect(call[1]?.options?.expression).not.toBeUndefined(); - }); + const tabElement = element.querySelector('atomic-tab')!; + Object.defineProperty(tabElement, 'expression', { + get: () => undefined, + configurable: true, }); + + element.initialize(); + + const buildTabCalls = vi.mocked(buildTab).mock.calls; + const lastCall = buildTabCalls[buildTabCalls.length - 1]; + expect(lastCall[1]?.options?.expression).toBe(''); + expect(lastCall[1]?.options?.expression).not.toBeUndefined(); }); }); From 403187f9eef7b303809314f2733eb4f0137cc4e8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 11 Dec 2025 14:23:33 +0000 Subject: [PATCH 04/12] Fix test: clear mock calls before re-initializing to properly test race condition fix Co-authored-by: fbeaudoincoveo <23503066+fbeaudoincoveo@users.noreply.github.com> --- .../search/atomic-tab-manager/atomic-tab-manager.spec.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.spec.ts b/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.spec.ts index d82a8f86f41..511fb19f084 100644 --- a/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.spec.ts +++ b/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.spec.ts @@ -207,11 +207,13 @@ describe('atomic-tab-manager', () => { configurable: true, }); + vi.mocked(buildTab).mockClear(); + element.initialize(); const buildTabCalls = vi.mocked(buildTab).mock.calls; - const lastCall = buildTabCalls[buildTabCalls.length - 1]; - expect(lastCall[1]?.options?.expression).toBe(''); - expect(lastCall[1]?.options?.expression).not.toBeUndefined(); + expect(buildTabCalls).toHaveLength(1); + expect(buildTabCalls[0][1]?.options?.expression).toBe(''); + expect(buildTabCalls[0][1]?.options?.expression).not.toBeUndefined(); }); }); From 9543735e48506ab0d6dddbe2a255dc729a7a5124 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 11 Dec 2025 16:30:09 +0000 Subject: [PATCH 05/12] Fix test: override expression property before initialization and capture value in mock Co-authored-by: fbeaudoincoveo <23503066+fbeaudoincoveo@users.noreply.github.com> --- .../atomic-tab-manager.spec.ts | 38 ++++++++++--------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.spec.ts b/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.spec.ts index 511fb19f084..99891afa57b 100644 --- a/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.spec.ts +++ b/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.spec.ts @@ -175,14 +175,17 @@ describe('atomic-tab-manager', () => { it('should use empty string as fallback for undefined expression when tab expression property is undefined (race condition)', async () => { const fakeTabManager = buildFakeTabManager({ - activeTab: 'all', + activeTab: 'test', }); mockConsole(); vi.mocked(buildTabManager).mockReturnValue(fakeTabManager); + let expressionValue: string | undefined; + vi.mocked(buildTab).mockImplementation((_engine, options) => { + expressionValue = options?.options?.expression; return { state: { isActive: options?.options?.id === fakeTabManager.state.activeTab, @@ -192,28 +195,27 @@ describe('atomic-tab-manager', () => { } as never; }); - const {element} = await renderInAtomicSearchInterface({ + await renderInAtomicSearchInterface({ template: html` `, selector: 'atomic-tab-manager', - }); - - const tabElement = element.querySelector('atomic-tab')!; - Object.defineProperty(tabElement, 'expression', { - get: () => undefined, - configurable: true, - }); - - vi.mocked(buildTab).mockClear(); - - element.initialize(); - - const buildTabCalls = vi.mocked(buildTab).mock.calls; - expect(buildTabCalls).toHaveLength(1); - expect(buildTabCalls[0][1]?.options?.expression).toBe(''); - expect(buildTabCalls[0][1]?.options?.expression).not.toBeUndefined(); + bindings: (bindings) => { + const manager = document.querySelector('atomic-tab-manager'); + const tabElement = manager?.querySelector('atomic-tab'); + if (tabElement) { + Object.defineProperty(tabElement, 'expression', { + get: () => undefined, + configurable: true, + }); + } + return bindings; + }, + }); + + expect(expressionValue).toBe(''); + expect(expressionValue).not.toBeUndefined(); }); }); From 8d311f35e8d571e1ddc733e9682063f9247e9c6f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 11 Dec 2025 19:30:15 +0000 Subject: [PATCH 06/12] Fix test: manually control fixture and setBindings to override property at correct time Co-authored-by: fbeaudoincoveo <23503066+fbeaudoincoveo@users.noreply.github.com> --- .../atomic-tab-manager.spec.ts | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.spec.ts b/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.spec.ts index 99891afa57b..6c4a43b5f15 100644 --- a/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.spec.ts +++ b/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.spec.ts @@ -1,8 +1,13 @@ import {buildTab, buildTabManager, type TabManagerState} from '@coveo/headless'; import {html} from 'lit'; import {describe, expect, it, vi} from 'vitest'; -import {renderInAtomicSearchInterface} from '@/vitest-utils/testing-helpers/fixtures/atomic/search/atomic-search-interface-fixture'; +import { + defaultBindings, + type FixtureAtomicSearchInterface, + renderInAtomicSearchInterface, +} from '@/vitest-utils/testing-helpers/fixtures/atomic/search/atomic-search-interface-fixture'; import {buildFakeTabManager} from '@/vitest-utils/testing-helpers/fixtures/headless/search/tab-manager-controller'; +import {fixture} from '@/vitest-utils/testing-helpers/testing-utils/fixture'; import type {AtomicTabManager} from './atomic-tab-manager'; import './atomic-tab-manager'; import {mockConsole} from '@/vitest-utils/testing-helpers/testing-utils/mock-console'; @@ -195,26 +200,26 @@ describe('atomic-tab-manager', () => { } as never; }); - await renderInAtomicSearchInterface({ - template: html` + const atomicInterface = await fixture( + html` - `, - selector: 'atomic-tab-manager', - bindings: (bindings) => { - const manager = document.querySelector('atomic-tab-manager'); - const tabElement = manager?.querySelector('atomic-tab'); - if (tabElement) { - Object.defineProperty(tabElement, 'expression', { - get: () => undefined, - configurable: true, - }); - } - return bindings; - }, + ` + ); + + const manager = atomicInterface.querySelector('atomic-tab-manager')!; + const tabElement = manager.querySelector('atomic-tab')!; + + Object.defineProperty(tabElement, 'expression', { + get: () => undefined, + configurable: true, }); + atomicInterface.setBindings(defaultBindings); + await atomicInterface.updateComplete; + await manager.updateComplete; + expect(expressionValue).toBe(''); expect(expressionValue).not.toBeUndefined(); }); From 885dd6735df4002d41d8833590db8dc043173259 Mon Sep 17 00:00:00 2001 From: fbeaudoincoveo Date: Mon, 15 Dec 2025 11:45:47 -0500 Subject: [PATCH 07/12] Fix failing test --- .../search/atomic-tab-manager/atomic-tab-manager.spec.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.spec.ts b/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.spec.ts index 6c4a43b5f15..3e0c4742864 100644 --- a/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.spec.ts +++ b/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.spec.ts @@ -7,9 +7,9 @@ import { renderInAtomicSearchInterface, } from '@/vitest-utils/testing-helpers/fixtures/atomic/search/atomic-search-interface-fixture'; import {buildFakeTabManager} from '@/vitest-utils/testing-helpers/fixtures/headless/search/tab-manager-controller'; -import {fixture} from '@/vitest-utils/testing-helpers/testing-utils/fixture'; import type {AtomicTabManager} from './atomic-tab-manager'; import './atomic-tab-manager'; +import {fixture} from '@/vitest-utils/testing-helpers/fixture'; import {mockConsole} from '@/vitest-utils/testing-helpers/testing-utils/mock-console'; vi.mock('@coveo/headless', {spy: true}); @@ -183,8 +183,6 @@ describe('atomic-tab-manager', () => { activeTab: 'test', }); - mockConsole(); - vi.mocked(buildTabManager).mockReturnValue(fakeTabManager); let expressionValue: string | undefined; @@ -211,6 +209,11 @@ describe('atomic-tab-manager', () => { const manager = atomicInterface.querySelector('atomic-tab-manager')!; const tabElement = manager.querySelector('atomic-tab')!; + await tabElement.updateComplete; + + tabElement.name = tabElement.getAttribute('name')!; + tabElement.label = tabElement.getAttribute('label')!; + Object.defineProperty(tabElement, 'expression', { get: () => undefined, configurable: true, From 70c2e98334bbdd81cc682d382e558ea894028033 Mon Sep 17 00:00:00 2001 From: fbeaudoincoveo Date: Tue, 16 Dec 2025 15:18:44 -0500 Subject: [PATCH 08/12] Use ChildrenUpdateCompleteMixin instead of falling back undefined atomic-tab expression to '' --- .../atomic-tab-manager.spec.ts | 56 +------------------ .../atomic-tab-manager/atomic-tab-manager.ts | 5 +- 2 files changed, 4 insertions(+), 57 deletions(-) diff --git a/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.spec.ts b/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.spec.ts index 3e0c4742864..a562331ab40 100644 --- a/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.spec.ts +++ b/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.spec.ts @@ -1,15 +1,10 @@ import {buildTab, buildTabManager, type TabManagerState} from '@coveo/headless'; import {html} from 'lit'; import {describe, expect, it, vi} from 'vitest'; -import { - defaultBindings, - type FixtureAtomicSearchInterface, - renderInAtomicSearchInterface, -} from '@/vitest-utils/testing-helpers/fixtures/atomic/search/atomic-search-interface-fixture'; +import {renderInAtomicSearchInterface} from '@/vitest-utils/testing-helpers/fixtures/atomic/search/atomic-search-interface-fixture'; import {buildFakeTabManager} from '@/vitest-utils/testing-helpers/fixtures/headless/search/tab-manager-controller'; import type {AtomicTabManager} from './atomic-tab-manager'; import './atomic-tab-manager'; -import {fixture} from '@/vitest-utils/testing-helpers/fixture'; import {mockConsole} from '@/vitest-utils/testing-helpers/testing-utils/mock-console'; vi.mock('@coveo/headless', {spy: true}); @@ -177,53 +172,4 @@ describe('atomic-tab-manager', () => { }); }); }); - - it('should use empty string as fallback for undefined expression when tab expression property is undefined (race condition)', async () => { - const fakeTabManager = buildFakeTabManager({ - activeTab: 'test', - }); - - vi.mocked(buildTabManager).mockReturnValue(fakeTabManager); - - let expressionValue: string | undefined; - - vi.mocked(buildTab).mockImplementation((_engine, options) => { - expressionValue = options?.options?.expression; - return { - state: { - isActive: options?.options?.id === fakeTabManager.state.activeTab, - }, - select: vi.fn(), - subscribe: vi.fn(), - } as never; - }); - - const atomicInterface = await fixture( - html` - - - - ` - ); - - const manager = atomicInterface.querySelector('atomic-tab-manager')!; - const tabElement = manager.querySelector('atomic-tab')!; - - await tabElement.updateComplete; - - tabElement.name = tabElement.getAttribute('name')!; - tabElement.label = tabElement.getAttribute('label')!; - - Object.defineProperty(tabElement, 'expression', { - get: () => undefined, - configurable: true, - }); - - atomicInterface.setBindings(defaultBindings); - await atomicInterface.updateComplete; - await manager.updateComplete; - - expect(expressionValue).toBe(''); - expect(expressionValue).not.toBeUndefined(); - }); }); diff --git a/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.ts b/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.ts index 0f0850170da..13b96557f27 100644 --- a/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.ts +++ b/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.ts @@ -17,6 +17,7 @@ import type {InitializableComponent} from '@/src/decorators/types'; import {withTailwindStyles} from '@/src/decorators/with-tailwind-styles'; import styles from './atomic-tab-manager.tw.css'; import '@/src/components/common/atomic-tab-bar/atomic-tab-bar'; +import {ChildrenUpdateCompleteMixin} from '@/src/mixins/children-update-complete-mixin'; interface TabInfo { label: string; @@ -47,7 +48,7 @@ interface TabInfo { @bindings() @withTailwindStyles export class AtomicTabManager - extends LitElement + extends ChildrenUpdateCompleteMixin(LitElement) implements InitializableComponent { static styles: CSSResultGroup = styles; @@ -94,7 +95,7 @@ export class AtomicTabManager } const tabController = buildTab(this.bindings.engine, { options: { - expression: tabElement.expression ?? '', + expression: tabElement.expression, id: tabElement.name, clearFiltersOnTabChange: this.clearFiltersOnTabChange, }, From 14bdee13e5975e674770dcef1c8b8461f29aaed1 Mon Sep 17 00:00:00 2001 From: fbeaudoincoveo Date: Wed, 17 Dec 2025 13:05:31 -0500 Subject: [PATCH 09/12] Better fix --- .../search/atomic-tab-manager/atomic-tab-manager.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.ts b/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.ts index 13b96557f27..a1e3ab225fb 100644 --- a/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.ts +++ b/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.ts @@ -17,7 +17,6 @@ import type {InitializableComponent} from '@/src/decorators/types'; import {withTailwindStyles} from '@/src/decorators/with-tailwind-styles'; import styles from './atomic-tab-manager.tw.css'; import '@/src/components/common/atomic-tab-bar/atomic-tab-bar'; -import {ChildrenUpdateCompleteMixin} from '@/src/mixins/children-update-complete-mixin'; interface TabInfo { label: string; @@ -48,7 +47,7 @@ interface TabInfo { @bindings() @withTailwindStyles export class AtomicTabManager - extends ChildrenUpdateCompleteMixin(LitElement) + extends LitElement implements InitializableComponent { static styles: CSSResultGroup = styles; @@ -95,7 +94,7 @@ export class AtomicTabManager } const tabController = buildTab(this.bindings.engine, { options: { - expression: tabElement.expression, + expression: tabElement.getAttribute('expression') ?? '', id: tabElement.name, clearFiltersOnTabChange: this.clearFiltersOnTabChange, }, From e01197c9da39dd9e23b077daacbe605ea3d5468f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 21:14:06 +0000 Subject: [PATCH 10/12] Use getAttribute for name and label, store all attributes in variables Co-authored-by: fbeaudoincoveo <23503066+fbeaudoincoveo@users.noreply.github.com> --- .../atomic-tab-manager/atomic-tab-manager.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.ts b/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.ts index a1e3ab225fb..9f669e25b03 100644 --- a/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.ts +++ b/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.ts @@ -86,7 +86,11 @@ export class AtomicTabManager } tabElements.forEach((tabElement) => { - if (!tabElement.name) { + const name = tabElement.getAttribute('name') || ''; + const expression = tabElement.getAttribute('expression') ?? ''; + const label = tabElement.getAttribute('label') || ''; + + if (!name) { this.error = new Error( 'The "name" attribute must be defined on all "atomic-tab" children.' ); @@ -94,15 +98,15 @@ export class AtomicTabManager } const tabController = buildTab(this.bindings.engine, { options: { - expression: tabElement.getAttribute('expression') ?? '', - id: tabElement.name, + expression, + id: name, clearFiltersOnTabChange: this.clearFiltersOnTabChange, }, }); this.tabs.push({ - label: tabElement.label, - name: tabElement.name, + label, + name, tabController, }); }); From aa64d2fe4c36bbe6f0d324a4a7d89a15f4d550d0 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 17 Dec 2025 21:33:40 +0000 Subject: [PATCH 11/12] Remove unnecessary fallback operators for required name and label attributes Co-authored-by: fbeaudoincoveo <23503066+fbeaudoincoveo@users.noreply.github.com> --- .../search/atomic-tab-manager/atomic-tab-manager.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.ts b/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.ts index 9f669e25b03..70320048839 100644 --- a/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.ts +++ b/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.ts @@ -86,9 +86,9 @@ export class AtomicTabManager } tabElements.forEach((tabElement) => { - const name = tabElement.getAttribute('name') || ''; + const name = tabElement.getAttribute('name'); const expression = tabElement.getAttribute('expression') ?? ''; - const label = tabElement.getAttribute('label') || ''; + const label = tabElement.getAttribute('label'); if (!name) { this.error = new Error( From 8d0330cdd1e0de188ee2952be1be9de04f3360b9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 19 Dec 2025 14:13:40 +0000 Subject: [PATCH 12/12] Add fallback operators for name and label to fix TypeScript compilation Co-authored-by: fbeaudoincoveo <23503066+fbeaudoincoveo@users.noreply.github.com> --- .../search/atomic-tab-manager/atomic-tab-manager.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.ts b/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.ts index 003b05c5444..259048b001b 100644 --- a/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.ts +++ b/packages/atomic/src/components/search/atomic-tab-manager/atomic-tab-manager.ts @@ -87,9 +87,9 @@ export class AtomicTabManager } tabElements.forEach((tabElement) => { - const name = tabElement.getAttribute('name'); + const name = tabElement.getAttribute('name') || ''; const expression = tabElement.getAttribute('expression') ?? ''; - const label = tabElement.getAttribute('label'); + const label = tabElement.getAttribute('label') || ''; if (!name) { this.error = new Error(