From 7c65cb36e8e18215ba43e77ef6023a29ee70bc91 Mon Sep 17 00:00:00 2001 From: Denis Hilt Date: Sun, 11 Oct 2026 17:07:34 +0200 Subject: [PATCH 1/2] fix: reset all Adapter reactive sources on disposal --- src/classes/adapter.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/classes/adapter.ts b/src/classes/adapter.ts index 1aa2c849..54befe8b 100644 --- a/src/classes/adapter.ts +++ b/src/classes/adapter.ts @@ -431,10 +431,10 @@ export class Adapter implements IAdapter { }); } // reset reactive props - if (type === AdapterPropType.Reactive && reactiveStore) { - const property = reactiveStore[name]; + if (type === AdapterPropType.Reactive) { + this.source[name].reset(); + const property = reactiveStore?.[name]; if (property) { - property.default.reset(); property.emit(property.source, property.default.get()); } } From dd5d72c7a5b670b1598797292c6c9f3c40a320cf Mon Sep 17 00:00:00 2001 From: Denis Hilt Date: Sun, 11 Oct 2026 17:07:41 +0200 Subject: [PATCH 2/2] test: cover Adapter reactive state across datasource reuse --- tests/unit/adapter.spec.ts | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/tests/unit/adapter.spec.ts b/tests/unit/adapter.spec.ts index 6245cf11..ae7ba800 100644 --- a/tests/unit/adapter.spec.ts +++ b/tests/unit/adapter.spec.ts @@ -90,7 +90,7 @@ describe('Adapter Init Spec', () => { }); describe('Adapter Custom Reactive Source Spec', () => { - it('should preserve the source and forward values across recreation', () => { + it('should preserve and reset reactive sources across recreation', () => { const source = {}; const values: unknown[] = []; const CustomDatasource = makeDatasource(() => ({ @@ -106,6 +106,16 @@ describe('Adapter Custom Reactive Source Spec', () => { } })); const datasource = new CustomDatasource(MOCK.datasource); + const bof$ = datasource.adapter.bof$; + const bofValues: boolean[] = []; + const offBof = bof$.on(value => { + expect(datasource.adapter.bof).toBe(value); + bofValues.push(value); + }); + const initValues: boolean[] = []; + const offInit = datasource.adapter.init$.on(value => + initValues.push(value) + ); const createScroller = () => { const scroller = new Scroller({ datasource, @@ -121,14 +131,25 @@ describe('Adapter Custom Reactive Source Spec', () => { try { expect(datasource.adapter.isLoading$).toBe(source); scroller.state.cycle.busy.set(true); + scroller.buffer.absMinIndex = 1; scroller.dispose(true); + expect(datasource.adapter.bof).toBe(false); + expect(bof$.get()).toBe(false); scroller = createScroller(); expect(datasource.adapter.isLoading$).toBe(source); + expect(datasource.adapter.bof$).toBe(bof$); + expect(datasource.adapter.bof).toBe(false); + expect(bof$.get()).toBe(false); scroller.state.cycle.busy.set(true); + scroller.buffer.absMinIndex = 1; expect(values).toEqual([true, false, true]); + expect(bofValues).toEqual([true, false, true]); + expect(initValues).toEqual([true, false, true]); } finally { + offBof(); + offInit(); scroller.dispose(true); datasource.dispose(); }