From bffab530ecb8a0e86dbb0f4a98cb6e7691e409b2 Mon Sep 17 00:00:00 2001 From: Boris Petrov Date: Tue, 5 Aug 2025 19:08:02 +0300 Subject: [PATCH] Allow for tracked-array subtypes --- packages/@glimmer/validator/index.ts | 2 +- .../@glimmer/validator/lib/collections/array.ts | 4 +++- .../validator/test/collections/array-test.ts | 14 +++++++++++++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/packages/@glimmer/validator/index.ts b/packages/@glimmer/validator/index.ts index a3abcaa50..e7325033b 100644 --- a/packages/@glimmer/validator/index.ts +++ b/packages/@glimmer/validator/index.ts @@ -8,7 +8,7 @@ if (Reflect.has(globalThis, GLIMMER_VALIDATOR_REGISTRATION)) { Reflect.set(globalThis, GLIMMER_VALIDATOR_REGISTRATION, true); -export { trackedArray } from './lib/collections/array'; +export { TrackedArray, trackedArray } from './lib/collections/array'; export { trackedMap } from './lib/collections/map'; export { trackedObject } from './lib/collections/object'; export { trackedSet } from './lib/collections/set'; diff --git a/packages/@glimmer/validator/lib/collections/array.ts b/packages/@glimmer/validator/lib/collections/array.ts index e58905858..6bbb6c0ee 100644 --- a/packages/@glimmer/validator/lib/collections/array.ts +++ b/packages/@glimmer/validator/lib/collections/array.ts @@ -147,7 +147,7 @@ class TrackedArray { }, getPrototypeOf() { - return TrackedArray.prototype; + return Object.getPrototypeOf(self); }, }) as TrackedArray; } @@ -197,6 +197,8 @@ interface TrackedArray extends Array {} // Ensure instanceof works correctly Object.setPrototypeOf(TrackedArray.prototype, Array.prototype); +export { TrackedArray }; + export function trackedArray( data?: T[], options?: { equals?: (a: T, b: T) => boolean; description?: string } diff --git a/packages/@glimmer/validator/test/collections/array-test.ts b/packages/@glimmer/validator/test/collections/array-test.ts index 0a5d1e985..a87ca01aa 100644 --- a/packages/@glimmer/validator/test/collections/array-test.ts +++ b/packages/@glimmer/validator/test/collections/array-test.ts @@ -1,6 +1,6 @@ /* eslint-disable import-x/no-extraneous-dependencies */ -import { trackedArray } from '@glimmer/validator'; +import { TrackedArray, trackedArray } from '@glimmer/validator'; import { expectTypeOf } from 'expect-type'; import { module, test } from '../-utils'; @@ -42,6 +42,18 @@ module('@glimmer/validator: trackedArray()', () => { assert.strictEqual(arr[0], undefined); }); + test('Allows creating subtypes', (assert) => { + class MyTrackedArray extends TrackedArray { + constructor() { + super([], { equals: Object.is, description: undefined }); + } + } + + let arr = new MyTrackedArray(); + + assert.strictEqual(Object.getPrototypeOf(arr).constructor, MyTrackedArray); + }); + module('methods', () => { test('isArray', (assert) => { let arr = trackedArray();