Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions knip.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@ export default {
entry: [
...PACKAGE_FILES,
...SOURCE_INDEX,
...EXAMPLE_ENTRIES,
...TEST_ENTRIES,
...TEST_VARIANT_ENTRIES,
...VITE_CONFIGS,
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,7 @@
"release:lint",
"release:labs-forms",
"release:markdown",
"release:media",
"release:monaco",
"release:styles"
]
Expand Down
3 changes: 3 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions projects/forms/src/mixins/checkbox.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,15 @@ describe('CheckboxFormControlMixin', () => {
expect(element.checked).toBe(false);
});

it('should not toggle when the event default is prevented', () => {
const event = new Event('click', { cancelable: true });
event.preventDefault();

element.toggle(event);

expect(element.checked).toBe(false);
});

it('should request updates for checkbox state changes', () => {
vi.spyOn(element, 'requestUpdate');

Expand Down
6 changes: 3 additions & 3 deletions projects/forms/src/mixins/checkbox.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ export interface CheckboxFormControlMixinInstance extends FormControlMixinInstan
/**
* Toggles the checked state.
*/
toggle(): void;
toggle(event?: Event): void;
}

export type CheckboxFormControlMixinReturn<TBase extends Constructor> = (new (
Expand Down Expand Up @@ -196,8 +196,8 @@ export function CheckboxFormControlMixin<TBase extends Constructor>(
this.checkValidity();
}

toggle() {
if (this.disabled || this.readOnly) {
toggle(event?: Event) {
if (this.disabled || this.readOnly || event?.defaultPrevented) {
return;
}

Expand Down
37 changes: 36 additions & 1 deletion projects/internals/metadata/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,8 @@
"../../forms/dist/custom-elements.json",
"../../markdown/package.json",
"../../markdown/dist/custom-elements.json",
"../../media/package.json",
"../../media/dist/custom-elements.json",
"../../monaco/package.json",
"../../monaco/dist/custom-elements.json",
"../../patterns/package.json",
Expand Down Expand Up @@ -142,6 +144,10 @@
"script": "../../markdown:build",
"cascade": false
},
{
"script": "../../media:build",
"cascade": false
},
{
"script": "../../monaco:build",
"cascade": false
Expand Down Expand Up @@ -171,6 +177,9 @@
"../../markdown/package.json",
"../../markdown/README.md",
"../../markdown/CHANGELOG.md",
"../../media/package.json",
"../../media/README.md",
"../../media/CHANGELOG.md",
"../../monaco/package.json",
"../../monaco/README.md",
"../../monaco/CHANGELOG.md",
Expand Down Expand Up @@ -212,6 +221,11 @@
"../../markdown/coverage/unit/summary.json",
"../../markdown/coverage/visual/summary.json",
"../../markdown/coverage/ssr/summary.json",
"../../media/coverage/unit/coverage-summary.json",
"../../media/coverage/unit/summary.json",
"../../media/coverage/axe/summary.json",
"../../media/coverage/visual/summary.json",
"../../media/coverage/ssr/summary.json",
"../../monaco/coverage/unit/coverage-summary.json",
"../../monaco/coverage/unit/summary.json",
"../../monaco/coverage/visual/summary.json",
Expand Down Expand Up @@ -259,6 +273,22 @@
"script": "../../markdown:test:coverage",
"cascade": false
},
{
"script": "../../media:test:coverage",
"cascade": false
},
{
"script": "../../media:test:axe",
"cascade": false
},
{
"script": "../../media:test:ssr",
"cascade": false
},
{
"script": "../../media:test:visual",
"cascade": false
},
{
"script": "../../monaco:test:coverage",
"cascade": false
Expand Down Expand Up @@ -291,7 +321,8 @@
"../../monaco/dist/**/*.examples.json",
"../../code/dist/**/*.examples.json",
"../../forms/dist/**/*.examples.json",
"../../markdown/dist/**/*.examples.json"
"../../markdown/dist/**/*.examples.json",
"../../media/dist/**/*.examples.json"
],
"output": [
"static/examples.json"
Expand Down Expand Up @@ -321,6 +352,10 @@
"script": "../../monaco:build",
"cascade": false
},
{
"script": "../../media:build",
"cascade": false
},
{
"script": "../patterns:build",
"cascade": false
Expand Down
8 changes: 7 additions & 1 deletion projects/internals/metadata/src/services/api.service.test.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
// SPDX-License-Identifier: Apache-2.0

import { describe, expect, it } from 'vitest';
import MiniSearch from 'minisearch';
import { describe, expect, it, vi } from 'vitest';
import { ApiService } from './api.service.js';

describe('ApiService', () => {
Expand Down Expand Up @@ -41,7 +42,12 @@ describe('ApiService', () => {
});

it('should prioritize exact matches over fuzzy matches', async () => {
const searchSpy = vi.spyOn(MiniSearch.prototype, 'search').mockReturnValue([
{ id: 'nve-button-group', terms: ['button'], queryTerms: ['button'], score: 2, match: {} },
{ id: 'nve-button', terms: ['button'], queryTerms: ['button'], score: 1, match: {} }
]);
const results = await ApiService.search('nve-button');
searchSpy.mockRestore();
Comment thread
coryrylan marked this conversation as resolved.

expect(results[0]?.name).toBe('nve-button');
});
Expand Down
57 changes: 57 additions & 0 deletions projects/internals/metadata/src/tasks/api.utils.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,65 @@
import { describe, expect, it } from 'vitest';
import { getApi } from './api.utils.js';

type Api = Awaited<ReturnType<typeof getApi>>;
type ApiElement = Api['data']['elements'][number];

function getElement(api: Api, name: string) {
return api.data.elements.find(element => element.name === name);
}

function getMember(element: ApiElement | undefined, name: string) {
return element?.manifest?.members.find(member => member.name === name);
}

function getAttribute(element: ApiElement | undefined, name: string) {
return element?.manifest?.attributes?.find(attribute => attribute.name === name);
}

describe('ApiUtils', () => {
it('should return the api json', async () => {
expect(getApi).toBeDefined();
});
Comment thread
coryrylan marked this conversation as resolved.

it('should include attribute names for inherited button members', async () => {
const api = await getApi();
const button = getElement(api, 'nve-button');

expect(getMember(button, 'pressed')?.attribute).toBe('pressed');
expect(getMember(button, 'readOnly')?.attribute).toBe('readonly');
expect(getMember(button, 'commandForElement')?.attribute).toBe('commandfor');
expect(button?.markdown).toContain('| readOnly (readonly) |');
});

it('should project checkbox and button mixin APIs onto media mute button', async () => {
const api = await getApi();
const muteButton = getElement(api, 'nve-media-mute-button');

expect(getMember(muteButton, 'pressed')?.attribute).toBe('pressed');
expect(getMember(muteButton, 'checked')?.attribute).toBe('checked');
expect(getMember(muteButton, 'readOnly')?.attribute).toBe('readonly');
expect(getMember(muteButton, 'commandForElement')?.attribute).toBe('commandfor');
expect(getAttribute(muteButton, 'commandForElement')).toBeUndefined();
expect(muteButton?.markdown).toContain('| checked |');
});

it('should project slider mixin APIs onto media time range', async () => {
const api = await getApi();
const timeRange = getElement(api, 'nve-media-time-range');

expect(getMember(timeRange, 'min')?.attribute).toBe('min');
expect(getMember(timeRange, 'valueAsNumber')?.attribute).toBeUndefined();
expect(getAttribute(timeRange, 'commandForElement')).toBeUndefined();
expect(timeRange?.markdown).toContain('| valueAsNumber |');
});

it('should project select mixin APIs onto media playback rate select', async () => {
const api = await getApi();
const playbackRateSelect = getElement(api, 'nve-media-playback-rate-select');

expect(getMember(playbackRateSelect, 'selectedIndex')?.attribute).toBeUndefined();
expect(getMember(playbackRateSelect, 'value')?.attribute).toBe('value');
expect(getAttribute(playbackRateSelect, 'commandForElement')).toBeUndefined();
expect(playbackRateSelect?.markdown).toContain('| selectedIndex |');
});
});
1 change: 1 addition & 0 deletions projects/internals/metadata/src/tasks/api.utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@ export async function getApi(): Promise<{
'../../../../themes',
'../../../../code',
'../../../../markdown',
'../../../../media',
'../../../../monaco'
];

Expand Down
4 changes: 2 additions & 2 deletions projects/internals/metadata/static/adoption.json
Git LFS file not shown
4 changes: 2 additions & 2 deletions projects/internals/metadata/static/lighthouse.json
Git LFS file not shown
4 changes: 2 additions & 2 deletions projects/internals/metadata/static/releases.json
Git LFS file not shown
4 changes: 2 additions & 2 deletions projects/internals/metadata/static/tests.json
Git LFS file not shown
Loading