From 6276172016b2d65116b21adb096e4febe16031ad Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Mon, 19 Jan 2026 10:08:56 +0100 Subject: [PATCH 1/2] build: enable more integration tests for aria Fixes that the Aria package didn't enable the `ts-compat` and `linker` integration tests which in turn didn't catch some errors. --- integration/linker/BUILD.bazel | 1 + integration/linker/link-packages-test.mjs | 1 + integration/module-tests/BUILD.bazel | 1 + integration/package.json | 1 + integration/ts-compat/BUILD.bazel | 1 + integration/ts-compat/import-all-entry-points.bzl | 3 +++ pnpm-lock.yaml | 3 +++ 7 files changed, 11 insertions(+) diff --git a/integration/linker/BUILD.bazel b/integration/linker/BUILD.bazel index 8f625bdc8c02..0acb41a2d024 100644 --- a/integration/linker/BUILD.bazel +++ b/integration/linker/BUILD.bazel @@ -10,6 +10,7 @@ js_test( "//:node_modules/@babel/core", "//:node_modules/chalk", "//:node_modules/glob", + "//src/aria:npm_package", "//src/cdk:npm_package", "//src/cdk-experimental:npm_package", "//src/google-maps:npm_package", diff --git a/integration/linker/link-packages-test.mjs b/integration/linker/link-packages-test.mjs index 8213738af617..79268409e82b 100644 --- a/integration/linker/link-packages-test.mjs +++ b/integration/linker/link-packages-test.mjs @@ -17,6 +17,7 @@ const fileSystem = new NodeJSFileSystem(); const logger = new ConsoleLogger(LogLevel.info); /** List of NPM packages available in the Bazel runfiles. */ const npmPackages = [ + {name: 'aria', pkgPath: '../../src/aria/npm_package'}, {name: 'cdk', pkgPath: '../../src/cdk/npm_package'}, {name: 'cdk-experimental', pkgPath: '../../src/cdk-experimental/npm_package'}, {name: 'google-maps', pkgPath: '../../src/google-maps/npm_package'}, diff --git a/integration/module-tests/BUILD.bazel b/integration/module-tests/BUILD.bazel index 8a63a493ed81..3fec4e12921e 100644 --- a/integration/module-tests/BUILD.bazel +++ b/integration/module-tests/BUILD.bazel @@ -17,6 +17,7 @@ ts_project( module_test( name = "test", npm_packages = { + "//src/aria:npm_package": "src/aria/npm_package", "//src/cdk:npm_package": "src/cdk/npm_package", "//src/material:npm_package": "src/material/npm_package", }, diff --git a/integration/package.json b/integration/package.json index 400e22592be4..efe7453852e5 100644 --- a/integration/package.json +++ b/integration/package.json @@ -1,5 +1,6 @@ { "dependencies": { + "@angular/aria": "workspace:*", "@angular/cdk": "workspace:*", "@angular/cdk-experimental": "workspace:*", "@angular/material": "workspace:*", diff --git a/integration/ts-compat/BUILD.bazel b/integration/ts-compat/BUILD.bazel index 08d3da9c098f..f333a8147a4d 100644 --- a/integration/ts-compat/BUILD.bazel +++ b/integration/ts-compat/BUILD.bazel @@ -27,6 +27,7 @@ typescript_version_packages = [ "test.mjs", ":import-all-entry-points-file", "//:node_modules/shelljs", + "//integration:node_modules/@angular/aria", "//integration:node_modules/@angular/cdk", "//integration:node_modules/@angular/cdk-experimental", "//integration:node_modules/@angular/google-maps", diff --git a/integration/ts-compat/import-all-entry-points.bzl b/integration/ts-compat/import-all-entry-points.bzl index 4ff3b016b0ec..54f0531c0c71 100644 --- a/integration/ts-compat/import-all-entry-points.bzl +++ b/integration/ts-compat/import-all-entry-points.bzl @@ -1,3 +1,4 @@ +load("//src/aria:config.bzl", "ARIA_ENTRYPOINTS") load("//src/cdk:config.bzl", "CDK_ENTRYPOINTS") load("//src/cdk-experimental:config.bzl", "CDK_EXPERIMENTAL_ENTRYPOINTS") load("//src/material:config.bzl", "MATERIAL_ENTRYPOINTS", "MATERIAL_TESTING_ENTRYPOINTS") @@ -33,6 +34,8 @@ def generate_import_all_entry_points_file(): import * as youtube_player from "@angular/youtube-player"; export {cdk, cdk_experimental, material_experimental, google_maps, youtube_player}; """ + for ep in ARIA_ENTRYPOINTS: + output += create_import_export(ep, "aria") for ep in CDK_ENTRYPOINTS: output += create_import_export(ep, "cdk") for ep in CDK_EXPERIMENTAL_ENTRYPOINTS: diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index aab532e0922b..8759f1e289df 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -504,6 +504,9 @@ importers: integration: dependencies: + '@angular/aria': + specifier: workspace:* + version: link:../src/aria '@angular/cdk': specifier: workspace:* version: link:../src/cdk From 25f40e007fa96c987bfd57c949441d74f755235f Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Mon, 19 Jan 2026 10:17:36 +0100 Subject: [PATCH 2/2] fix(multiple): incorrect paths in declaration files for aria A few places in the `@angular/aria` package were producing invalid paths when compiled for npm. We didn't catch them, because the Aria package wasn't running the same integration tests as the rest of the repo. These changes fix the issues by using explicit type annotations. Fixes #32665. --- goldens/aria/grid/index.api.md | 3 +-- goldens/aria/listbox/index.api.md | 3 +-- goldens/aria/tabs/index.api.md | 8 +++----- goldens/aria/toolbar/index.api.md | 5 ++--- src/aria/grid/grid-row.ts | 4 ++-- src/aria/listbox/listbox.ts | 6 ++++-- src/aria/tabs/tab-list.ts | 4 ++-- src/aria/tabs/tabs.ts | 5 +++-- src/aria/toolbar/toolbar-widget.ts | 9 +++++++-- src/aria/toolbar/toolbar.ts | 4 ++-- 10 files changed, 27 insertions(+), 24 deletions(-) diff --git a/goldens/aria/grid/index.api.md b/goldens/aria/grid/index.api.md index 237af288901c..4481250cec06 100644 --- a/goldens/aria/grid/index.api.md +++ b/goldens/aria/grid/index.api.md @@ -4,7 +4,6 @@ ```ts -import * as _angular_aria_private_public_api from '@angular/aria/private/public-api'; import * as _angular_cdk_bidi from '@angular/cdk/bidi'; import * as _angular_core from '@angular/core'; import { ElementRef } from '@angular/core'; @@ -83,7 +82,7 @@ export class GridCellWidget { // @public export class GridRow { readonly element: HTMLElement; - readonly _gridPattern: Signal<_angular_aria_private_public_api.GridPattern>; + readonly _gridPattern: Signal; readonly _pattern: GridRowPattern; readonly rowIndex: _angular_core.InputSignal; // (undocumented) diff --git a/goldens/aria/listbox/index.api.md b/goldens/aria/listbox/index.api.md index 81a3e399963a..e81629c4008c 100644 --- a/goldens/aria/listbox/index.api.md +++ b/goldens/aria/listbox/index.api.md @@ -4,7 +4,6 @@ ```ts -import * as _angular_aria_private_public_api from '@angular/aria/private/public-api'; import * as _angular_cdk_bidi from '@angular/cdk/bidi'; import * as _angular_core from '@angular/core'; @@ -16,7 +15,7 @@ export class Listbox { focusMode: _angular_core.InputSignal<"roving" | "activedescendant">; gotoFirst(): void; readonly id: _angular_core.InputSignal; - protected items: _angular_core.Signal<_angular_aria_private_public_api.OptionPattern[]>; + protected items: _angular_core.Signal[]>; multi: _angular_core.InputSignalWithTransform; // (undocumented) _onFocus(): void; diff --git a/goldens/aria/tabs/index.api.md b/goldens/aria/tabs/index.api.md index 835892dd6851..1cdaf2286e95 100644 --- a/goldens/aria/tabs/index.api.md +++ b/goldens/aria/tabs/index.api.md @@ -4,8 +4,6 @@ ```ts -import * as _angular_aria_private from '@angular/aria/private'; -import * as _angular_aria_private_public_api from '@angular/aria/private/public-api'; import * as _angular_cdk_bidi from '@angular/cdk/bidi'; import * as _angular_core from '@angular/core'; import { OnDestroy } from '@angular/core'; @@ -59,7 +57,7 @@ export class TabList implements OnInit, OnDestroy { readonly selectedTab: _angular_core.ModelSignal; readonly selectionMode: _angular_core.InputSignal<"follow" | "explicit">; readonly softDisabled: _angular_core.InputSignalWithTransform; - readonly _tabPatterns: _angular_core.Signal<_angular_aria_private_public_api.TabPattern[]>; + readonly _tabPatterns: _angular_core.Signal; readonly textDirection: _angular_core.WritableSignal<_angular_cdk_bidi.Direction>; // (undocumented) _unregister(child: Tab): void; @@ -93,8 +91,8 @@ export class Tabs { readonly element: HTMLElement; // (undocumented) _register(child: TabList | TabPanel): void; - readonly _tabPatterns: _angular_core.Signal<_angular_aria_private.TabPattern[] | undefined>; - readonly _unorderedTabpanelPatterns: _angular_core.Signal<_angular_aria_private.TabPanelPattern[]>; + readonly _tabPatterns: _angular_core.Signal; + readonly _unorderedTabpanelPatterns: _angular_core.Signal; // (undocumented) _unregister(child: TabList | TabPanel): void; // (undocumented) diff --git a/goldens/aria/toolbar/index.api.md b/goldens/aria/toolbar/index.api.md index 2b5f29031e43..c43cad405838 100644 --- a/goldens/aria/toolbar/index.api.md +++ b/goldens/aria/toolbar/index.api.md @@ -4,7 +4,6 @@ ```ts -import * as _angular_aria_private_public_api from '@angular/aria/private/public-api'; import * as _angular_cdk_bidi from '@angular/cdk/bidi'; import * as _angular_core from '@angular/core'; import { OnDestroy } from '@angular/core'; @@ -15,7 +14,7 @@ export class Toolbar { constructor(); readonly disabled: _angular_core.InputSignalWithTransform; readonly element: HTMLElement; - readonly _itemPatterns: _angular_core.Signal<_angular_aria_private_public_api.ToolbarWidgetPattern[]>; + readonly _itemPatterns: _angular_core.Signal[]>; // (undocumented) _onFocus(): void; readonly orientation: _angular_core.InputSignal<"vertical" | "horizontal">; @@ -48,7 +47,7 @@ export class ToolbarWidget implements OnInit, OnDestroy { ngOnInit(): void; readonly _pattern: ToolbarWidgetPattern; readonly selected: () => boolean; - readonly _toolbarPattern: _angular_core.Signal<_angular_aria_private_public_api.ToolbarPattern>; + readonly _toolbarPattern: _angular_core.Signal>; readonly value: _angular_core.InputSignal; // (undocumented) static ɵdir: _angular_core.ɵɵDirectiveDeclaration, "[ngToolbarWidget]", ["ngToolbarWidget"], { "id": { "alias": "id"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>; diff --git a/src/aria/grid/grid-row.ts b/src/aria/grid/grid-row.ts index 07c9753acd4a..7a24a79f6dea 100644 --- a/src/aria/grid/grid-row.ts +++ b/src/aria/grid/grid-row.ts @@ -15,7 +15,7 @@ import { input, Signal, } from '@angular/core'; -import {GridRowPattern} from '../private'; +import {GridPattern, GridRowPattern} from '../private'; import {Grid} from './grid'; import {GRID_CELL, GRID_ROW} from './grid-tokens'; @@ -60,7 +60,7 @@ export class GridRow { private readonly _grid = inject(Grid); /** The parent grid UI pattern. */ - readonly _gridPattern = computed(() => this._grid._pattern); + readonly _gridPattern = computed(() => this._grid._pattern); /** The index of this row within the grid. */ readonly rowIndex = input(); diff --git a/src/aria/listbox/listbox.ts b/src/aria/listbox/listbox.ts index f1eef7ff83ea..4576d88b3d57 100644 --- a/src/aria/listbox/listbox.ts +++ b/src/aria/listbox/listbox.ts @@ -21,7 +21,7 @@ import { } from '@angular/core'; import {Directionality} from '@angular/cdk/bidi'; import {_IdGenerator} from '@angular/cdk/a11y'; -import {ComboboxListboxPattern, ListboxPattern} from '../private'; +import {ComboboxListboxPattern, ListboxPattern, OptionPattern} from '../private'; import {ComboboxPopup} from '../combobox'; import {Option} from './option'; import {LISTBOX} from './tokens'; @@ -91,7 +91,9 @@ export class Listbox { protected textDirection = inject(Directionality).valueSignal.asReadonly(); /** The Option UIPatterns of the child Options. */ - protected items = computed(() => this._options().map(option => option._pattern)); + protected items = computed[]>(() => + this._options().map(option => option._pattern), + ); /** Whether the list is vertically or horizontally oriented. */ orientation = input<'vertical' | 'horizontal'>('vertical'); diff --git a/src/aria/tabs/tab-list.ts b/src/aria/tabs/tab-list.ts index 992685520f0b..7e9d4b12f413 100644 --- a/src/aria/tabs/tab-list.ts +++ b/src/aria/tabs/tab-list.ts @@ -20,7 +20,7 @@ import { OnInit, OnDestroy, } from '@angular/core'; -import {TabListPattern} from '../private'; +import {TabListPattern, TabPattern} from '../private'; import {sortDirectives, TABS} from './utils'; import type {Tab} from './tab'; @@ -73,7 +73,7 @@ export class TabList implements OnInit, OnDestroy { readonly textDirection = inject(Directionality).valueSignal; /** The Tab UIPatterns of the child Tabs. */ - readonly _tabPatterns = computed(() => + readonly _tabPatterns = computed(() => [...this._unorderedTabs()].sort(sortDirectives).map(tab => tab._pattern), ); diff --git a/src/aria/tabs/tabs.ts b/src/aria/tabs/tabs.ts index 481906a1d8af..0c8d616f411e 100644 --- a/src/aria/tabs/tabs.ts +++ b/src/aria/tabs/tabs.ts @@ -10,6 +10,7 @@ import {computed, Directive, ElementRef, inject, signal} from '@angular/core'; import {TabList} from './tab-list'; import {TabPanel} from './tab-panel'; import {TABS} from './utils'; +import {TabPanelPattern, TabPattern} from '../private'; /** * A Tabs container. @@ -61,10 +62,10 @@ export class Tabs { private readonly _unorderedPanels = signal(new Set()); /** The Tab UIPattern of the child Tabs. */ - readonly _tabPatterns = computed(() => this._tablist()?._tabPatterns()); + readonly _tabPatterns = computed(() => this._tablist()?._tabPatterns()); /** The TabPanel UIPattern of the child TabPanels. */ - readonly _unorderedTabpanelPatterns = computed(() => + readonly _unorderedTabpanelPatterns = computed(() => [...this._unorderedPanels()].map(tabpanel => tabpanel._pattern), ); diff --git a/src/aria/toolbar/toolbar-widget.ts b/src/aria/toolbar/toolbar-widget.ts index c01976e8f51b..76d632952607 100644 --- a/src/aria/toolbar/toolbar-widget.ts +++ b/src/aria/toolbar/toolbar-widget.ts @@ -16,7 +16,12 @@ import { OnInit, OnDestroy, } from '@angular/core'; -import {ToolbarWidgetPattern, ToolbarWidgetGroupPattern, SignalLike} from '../private'; +import { + ToolbarWidgetPattern, + ToolbarWidgetGroupPattern, + SignalLike, + ToolbarPattern, +} from '../private'; import {_IdGenerator} from '@angular/cdk/a11y'; import {Toolbar} from './toolbar'; import {TOOLBAR_WIDGET_GROUP} from './utils'; @@ -65,7 +70,7 @@ export class ToolbarWidget implements OnInit, OnDestroy { readonly id = input(inject(_IdGenerator).getId('ng-toolbar-widget-', true)); /** The parent Toolbar UIPattern. */ - readonly _toolbarPattern = computed(() => this._toolbar._pattern); + readonly _toolbarPattern = computed>(() => this._toolbar._pattern); /** Whether the widget is disabled. */ readonly disabled = input(false, {transform: booleanAttribute}); diff --git a/src/aria/toolbar/toolbar.ts b/src/aria/toolbar/toolbar.ts index afbe8bc51c44..c1ef0774966a 100644 --- a/src/aria/toolbar/toolbar.ts +++ b/src/aria/toolbar/toolbar.ts @@ -17,7 +17,7 @@ import { signal, model, } from '@angular/core'; -import {ToolbarPattern} from '../private'; +import {ToolbarPattern, ToolbarWidgetPattern} from '../private'; import {Directionality} from '@angular/cdk/bidi'; import type {ToolbarWidget} from './toolbar-widget'; import {sortDirectives} from './utils'; @@ -72,7 +72,7 @@ export class Toolbar { readonly textDirection = inject(Directionality).valueSignal; /** Sorted UIPatterns of the child widgets */ - readonly _itemPatterns = computed(() => + readonly _itemPatterns = computed[]>(() => [...this._widgets()].sort(sortDirectives).map(widget => widget._pattern), );