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
8 changes: 4 additions & 4 deletions projects/core/src/logo/logo.examples.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export default {
*/
export const Default = {
render: () => html`
<nve-logo aria-label="NVIDIA"></nve-logo>
<nve-logo aria-label="NVIDIA">NV</nve-logo>
`
};

Expand Down Expand Up @@ -67,7 +67,7 @@ export const SlottedIcons = {
export const Color = {
render: () => html`
<div nve-layout="row gap:xs align:wrap">
<nve-logo aria-label="NVIDIA"></nve-logo>
<nve-logo aria-label="NVIDIA">NV</nve-logo>
<nve-logo color="red-cardinal" aria-label="red cardinal">Rc</nve-logo>
<nve-logo color="gray-slate" aria-label="gray slate">Gs</nve-logo>
<nve-logo color="gray-denim" aria-label="gray denim">Gd</nve-logo>
Expand Down Expand Up @@ -101,7 +101,7 @@ export const Color = {
export const LightTheme = {
render: () => html`
<div nve-theme="root light" nve-layout="row gap:xs align:wrap pad:sm" style="background: var(--nve-sys-layer-container-background) !important;">
<nve-logo aria-label="NVIDIA"></nve-logo>
<nve-logo aria-label="NVIDIA">NV</nve-logo>
<nve-logo color="red-cardinal" aria-label="red cardinal">Rc</nve-logo>
<nve-logo color="gray-slate" aria-label="gray slate">Gs</nve-logo>
<nve-logo color="gray-denim" aria-label="gray denim">Gd</nve-logo>
Expand Down Expand Up @@ -135,7 +135,7 @@ export const LightTheme = {
export const DarkTheme = {
render: () => html`
<div nve-theme="root dark" nve-layout="row gap:xs align:wrap pad:sm">
<nve-logo aria-label="NVIDIA"></nve-logo>
<nve-logo aria-label="NVIDIA">NV</nve-logo>
<nve-logo color="red-cardinal" aria-label="red cardinal">Rc</nve-logo>
<nve-logo color="gray-slate" aria-label="gray slate">Gs</nve-logo>
<nve-logo color="gray-denim" aria-label="gray denim">Gd</nve-logo>
Expand Down
2 changes: 1 addition & 1 deletion projects/core/src/logo/logo.test.axe.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ describe(Logo.metadata.tag, () => {

beforeEach(async () => {
fixture = await createFixture(html`
<nve-logo aria-label="logo"></nve-logo>
<nve-logo aria-label="logo" color="brand-green">NV</nve-logo>
`);
element = fixture.querySelector(Logo.metadata.tag);
await elementIsStable(element);
Expand Down
2 changes: 1 addition & 1 deletion projects/core/src/logo/logo.test.lighthouse.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { lighthouseRunner } from '@internals/vite';
describe('logo lighthouse report', () => {
test('logo should meet lighthouse benchmarks', async () => {
const report = await lighthouseRunner.getReport('nve-logo', /* html */`
<nve-logo aria-label="logo"></nve-logo>
<nve-logo aria-label="logo">NV</nve-logo>
<script type="module">
import '@nvidia-elements/core/logo/define.js';
</script>
Expand Down
2 changes: 1 addition & 1 deletion projects/core/src/logo/logo.test.ssr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import '@nvidia-elements/core/logo/define.js';

describe(Logo.metadata.tag, () => {
it('should pass baseline ssr check', async () => {
const result = await ssrRunner.render(html`<nve-logo></nve-logo>`);
const result = await ssrRunner.render(html`<nve-logo>NV</nve-logo>`);
expect(result.includes('shadowroot="open"')).toBe(true);
expect(result.includes('nve-logo')).toBe(true);
});
Expand Down
2 changes: 1 addition & 1 deletion projects/core/src/logo/logo.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ describe(Logo.metadata.tag, () => {

beforeEach(async () => {
fixture = await createFixture(html`
<nve-logo></nve-logo>
<nve-logo>NV</nve-logo>
`);
element = fixture.querySelector(Logo.metadata.tag);
await elementIsStable(element);
Expand Down
6 changes: 3 additions & 3 deletions projects/core/src/menu/menu.examples.ts
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ export const Complex = {
</nve-menu-item>
<nve-divider></nve-divider>
<nve-menu-item>
<nve-logo size="sm"></nve-logo> All Apps
<nve-logo size="sm">NV</nve-logo> All Apps
</nve-menu-item>
</nve-menu>
</nve-dropdown>
Expand All @@ -203,7 +203,7 @@ export const VerticalNavigationDrawer = {
render: () => html`
<nve-page>
<nve-page-header>
<nve-logo slot="prefix" size="sm"></nve-logo>
<nve-logo slot="prefix" size="sm">NV</nve-logo>
<h2 slot="prefix" nve-text="heading sm">NVIDIA</h2>
</nve-page-header>
<main nve-layout="column gap:md pad:md">
Expand Down Expand Up @@ -234,7 +234,7 @@ export const VerticalNavigationPanel = {
render: () => html`
<nve-page>
<nve-page-header>
<nve-logo slot="prefix" size="sm"></nve-logo>
<nve-logo slot="prefix" size="sm">NV</nve-logo>
<h2 slot="prefix" nve-text="heading sm">NVIDIA</h2>
</nve-page-header>
<nve-page-panel slot="left" expanded style="max-width:280px">
Expand Down
4 changes: 2 additions & 2 deletions projects/core/src/page-header/page-header.snippets.html
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<template name="Page Header" prefix="page-header" description="Basic page-header layout." type="pattern">
<nve-page-header slot="header">
<nve-logo slot="prefix" size="sm"></nve-logo>
<nve-logo slot="prefix" size="sm">NV</nve-logo>
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Consider adding aria-label to the snippet template.

Since these snippets establish patterns for developers, including aria-label="NVIDIA" would promote accessible implementations.

♿ Suggested accessibility improvement
-    <nve-logo slot="prefix" size="sm">NV</nve-logo>
+    <nve-logo slot="prefix" size="sm" aria-label="NVIDIA">NV</nve-logo>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<nve-logo slot="prefix" size="sm">NV</nve-logo>
<nve-logo slot="prefix" size="sm" aria-label="NVIDIA">NV</nve-logo>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@projects/core/src/page-header/page-header.snippets.html` at line 3, Add an
aria-label to the logo snippet so the pattern promotes accessibility: update the
<nve-logo> element (the snippet containing <nve-logo slot="prefix"
size="sm">NV</nve-logo>) to include aria-label="NVIDIA" so assistive
technologies have a readable name; ensure the attribute is added directly on the
nve-logo tag in the page-header snippet template.

<h2 slot="prefix">${1:NVIDIA}</h2>
</nve-page-header>
</template>
Expand All @@ -11,7 +11,7 @@ <h2 slot="prefix">${1:NVIDIA}</h2>
description="Basic page-header layout with links."
type="pattern">
<nve-page-header slot="header">
<nve-logo slot="prefix" size="sm"></nve-logo>
<nve-logo slot="prefix" size="sm">NV</nve-logo>
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Consider adding aria-label to the snippet template.

Since these snippets establish patterns for developers, including aria-label="NVIDIA" would promote accessible implementations.

♿ Suggested accessibility improvement
-    <nve-logo slot="prefix" size="sm">NV</nve-logo>
+    <nve-logo slot="prefix" size="sm" aria-label="NVIDIA">NV</nve-logo>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<nve-logo slot="prefix" size="sm">NV</nve-logo>
<nve-logo slot="prefix" size="sm" aria-label="NVIDIA">NV</nve-logo>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@projects/core/src/page-header/page-header.snippets.html` at line 14, The
snippet's nve-logo element (the <nve-logo slot="prefix" size="sm">NV</nve-logo>
instance) lacks an accessible name—add an aria-label attribute (e.g.,
aria-label="NVIDIA") to the nve-logo element so screen readers announce the
logo; update the snippet template where nve-logo is used (slot="prefix",
size="sm") to include aria-label="NVIDIA" to establish the accessible pattern
for consumers.

<h2 slot="prefix">${1:NVIDIA}</h2>
<nve-button selected container="flat"><a href="#">${2:Link 1}</a></nve-button>
<nve-button container="flat"><a href="#">${3:Link 2}</a></nve-button>
Expand Down
2 changes: 1 addition & 1 deletion projects/core/src/page/page.test.visual.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ function template(theme: '' | 'dark' = '') {
</style>
<nve-page>
<nve-page-header slot="header">
<nve-logo slot="prefix" size="sm"></nve-logo>
<nve-logo slot="prefix" size="sm">NV</nve-logo>
<h2 nve-text="heading" slot="prefix">•︎•︎•︎•︎•︎•︎</h2>
</nve-page-header>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ export const Dropdown = {
render: () => {
return html`
<nve-page-header>
<nve-logo slot="prefix" size="sm"></nve-logo>
<nve-logo slot="prefix" size="sm">NV</nve-logo>
<h2 slot="prefix" nve-text="heading sm">NVIDIA</h2>
<nve-icon-button slot="suffix" icon-name="gear" size="sm" popovertarget="preferences-input"></nve-icon-button>
</nve-page-header>
Expand Down
36 changes: 33 additions & 3 deletions projects/lint/src/eslint/rules/no-deprecated-css-imports.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { describe, it, expect, beforeEach } from 'vitest';
import { RuleTester } from 'eslint';
import type { JSRuleDefinition } from 'eslint';
import css from '@eslint/css';
import noDeprecatedCssImports from './no-deprecated-css-imports.js';
import noDeprecatedCssImports, { deprecatedImports } from './no-deprecated-css-imports.js';

const rule = noDeprecatedCssImports as unknown as JSRuleDefinition;

Expand Down Expand Up @@ -54,6 +54,13 @@ describe('noDeprecatedCssImports', () => {
});
});

it('should cover CSS entrypoints documented in the migration guide', () => {
expect(deprecatedImports['@maglev/elements/index.css']).toContain(
`@import '@nvidia-elements/styles/view-transitions.css';`
);
expect(deprecatedImports['@maglev/elements/inter.css']).toBe(`@import '@nvidia-elements/themes/fonts/inter.css';`);
});
Comment thread
coderabbitai[bot] marked this conversation as resolved.

it('should not allow use of deprecated CSS import paths', () => {
tester.run('should not allow use of deprecated CSS import paths', rule, {
valid: [],
Expand All @@ -62,9 +69,14 @@ describe('noDeprecatedCssImports', () => {
code: `@import '@maglev/elements/index.css';`,
output: `@import '@nvidia-elements/themes/fonts/inter.css';
@import '@nvidia-elements/themes/index.css';
@import '@nvidia-elements/themes/high-contrast.css';
@import '@nvidia-elements/themes/reduced-motion.css';
@import '@nvidia-elements/themes/compact.css';
@import '@nvidia-elements/themes/dark.css';
@import '@nvidia-elements/themes/debug.css';
@import '@nvidia-elements/styles/typography.css';
@import '@nvidia-elements/styles/layout.css';`,
@import '@nvidia-elements/styles/layout.css';
@import '@nvidia-elements/styles/view-transitions.css';`,
errors: [
{
messageId: 'deprecated-css-import',
Expand All @@ -73,9 +85,27 @@ describe('noDeprecatedCssImports', () => {
alternative: `
@import '@nvidia-elements/themes/fonts/inter.css';
@import '@nvidia-elements/themes/index.css';
@import '@nvidia-elements/themes/high-contrast.css';
@import '@nvidia-elements/themes/reduced-motion.css';
@import '@nvidia-elements/themes/compact.css';
@import '@nvidia-elements/themes/dark.css';
@import '@nvidia-elements/themes/debug.css';
@import '@nvidia-elements/styles/typography.css';
@import '@nvidia-elements/styles/layout.css';`.trim()
@import '@nvidia-elements/styles/layout.css';
@import '@nvidia-elements/styles/view-transitions.css';`.trim()
}
}
]
},
{
code: `@import '@maglev/elements/inter.css';`,
output: `@import '@nvidia-elements/themes/fonts/inter.css';`,
errors: [
{
messageId: 'deprecated-css-import',
data: {
value: '@maglev/elements/inter.css',
alternative: `@import '@nvidia-elements/themes/fonts/inter.css';`
}
}
]
Expand Down
18 changes: 15 additions & 3 deletions projects/lint/src/eslint/rules/no-deprecated-css-imports.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,23 @@ import type { Rule } from 'eslint';
import type { CssAtRuleNode } from '../rule-types.js';

declare const __ELEMENTS_PAGES_BASE_URL__: string;
const deprecatedImports: Record<string, string> = {
'@nvidia-elements/core/index.css': `@import '@nvidia-elements/themes/fonts/inter.css';\n@import '@nvidia-elements/themes/index.css';\n@import '@nvidia-elements/themes/dark.css';\n@import '@nvidia-elements/styles/typography.css';\n@import '@nvidia-elements/styles/layout.css';`,
const themeAndStyleImports = `@import '@nvidia-elements/themes/fonts/inter.css';
@import '@nvidia-elements/themes/index.css';
@import '@nvidia-elements/themes/high-contrast.css';
@import '@nvidia-elements/themes/reduced-motion.css';
@import '@nvidia-elements/themes/compact.css';
@import '@nvidia-elements/themes/dark.css';
@import '@nvidia-elements/themes/debug.css';
@import '@nvidia-elements/styles/typography.css';
@import '@nvidia-elements/styles/layout.css';
@import '@nvidia-elements/styles/view-transitions.css';`;

export const deprecatedImports: Record<string, string> = {
'@nvidia-elements/core/index.css': themeAndStyleImports,
'@nvidia-elements/core/css/module.layout.css': `@import '@nvidia-elements/styles/layout.css';`,
'@nvidia-elements/core/css/module.typography.css': `@import '@nvidia-elements/styles/typography.css';`,
'@maglev/elements/index.css': `@import '@nvidia-elements/themes/fonts/inter.css';\n@import '@nvidia-elements/themes/index.css';\n@import '@nvidia-elements/themes/dark.css';\n@import '@nvidia-elements/styles/typography.css';\n@import '@nvidia-elements/styles/layout.css';`,
'@maglev/elements/index.css': themeAndStyleImports,
'@maglev/elements/inter.css': `@import '@nvidia-elements/themes/fonts/inter.css';`,
'@maglev/elements/css/module.layout.css': `@import '@nvidia-elements/styles/layout.css';`,
'@maglev/elements/css/module.typography.css': `@import '@nvidia-elements/styles/typography.css';`
};
Expand Down
65 changes: 64 additions & 1 deletion projects/lint/src/eslint/rules/no-deprecated-packages.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { beforeEach, describe, expect, it } from 'vitest';
import { RuleTester } from 'eslint';
import json from '@eslint/json';
import type { JSRuleDefinition } from 'eslint';
import noDeprecatedPackages from './no-deprecated-packages.js';
import noDeprecatedPackages, { DEPRECATED_PACKAGES } from './no-deprecated-packages.js';

const rule = noDeprecatedPackages as unknown as JSRuleDefinition;

Expand Down Expand Up @@ -46,6 +46,24 @@ describe('noUnexpectedLibraryDependencies', () => {
});
});

it('should cover every package documented in the migration guide', () => {
expect(DEPRECATED_PACKAGES['@nve/elements']).toBe('@nvidia-elements/core');
expect(DEPRECATED_PACKAGES['@nve/styles']).toBe('@nvidia-elements/styles');
expect(DEPRECATED_PACKAGES['@nve/themes']).toBe('@nvidia-elements/themes');
expect(DEPRECATED_PACKAGES['@nve/monaco']).toBe('@nvidia-elements/monaco');
expect(DEPRECATED_PACKAGES['@nve-labs/forms']).toBe('@nvidia-elements/forms');
expect(DEPRECATED_PACKAGES['@nve-labs/cli']).toBe('@nvidia-elements/cli');
expect(DEPRECATED_PACKAGES['@nve-labs/code']).toBe('@nvidia-elements/code');
expect(DEPRECATED_PACKAGES['@nve-labs/create']).toBe('@nvidia-elements/create');
expect(DEPRECATED_PACKAGES['@nve-labs/markdown']).toBe('@nvidia-elements/markdown');
expect(DEPRECATED_PACKAGES['@nve-labs/media']).toBe('@nvidia-elements/media');
expect(DEPRECATED_PACKAGES['@nve-labs/lint']).toBe('@nvidia-elements/lint');
expect(DEPRECATED_PACKAGES['@maglev/elements']).toBe(
'@nvidia-elements/core + @nvidia-elements/themes + @nvidia-elements/styles'
);
expect(DEPRECATED_PACKAGES['@nve/testing']).toBe('project-supported test utilities');
});

it('should not allow deprecated dependencies', () => {
tester.run('should not allow deprecated dependencies', rule, {
valid: [],
Expand Down Expand Up @@ -83,4 +101,49 @@ describe('noUnexpectedLibraryDependencies', () => {
]
});
});

it('should not allow deprecated packages from the migration guide', () => {
tester.run('should not allow deprecated packages from the migration guide', rule, {
valid: [],
invalid: [
{
code: `{ "dependencies": { "@nve/elements": "1.0.0", "@nve-labs/forms": "1.0.0" } }`,
filename: 'package.json',
errors: [
{
messageId: 'unexpected-deprecated-package',
data: { package: '@nve/elements', alternative: '@nvidia-elements/core' }
},
{
messageId: 'unexpected-deprecated-package',
data: { package: '@nve-labs/forms', alternative: '@nvidia-elements/forms' }
}
]
},
{
code: `{ "devDependencies": { "@nve/testing": "1.0.0" } }`,
filename: 'package.json',
errors: [
{
messageId: 'unexpected-deprecated-package',
data: { package: '@nve/testing', alternative: 'project-supported test utilities' }
}
]
},
{
code: `{ "peerDependencies": { "@maglev/elements": "1.0.0" } }`,
filename: 'package.json',
errors: [
{
messageId: 'unexpected-deprecated-package',
data: {
package: '@maglev/elements',
alternative: '@nvidia-elements/core + @nvidia-elements/themes + @nvidia-elements/styles'
}
}
]
}
]
});
});
Comment thread
coryrylan marked this conversation as resolved.
});
31 changes: 24 additions & 7 deletions projects/lint/src/eslint/rules/no-deprecated-packages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,23 @@ import type { Rule } from 'eslint';
import type { HtmlTagNode } from '../rule-types.js';

declare const __ELEMENTS_PAGES_BASE_URL__: string;
export const DEPRECATED_PACKAGES: Record<string, string> = {
'@nve/elements': '@nvidia-elements/core',
'@nve/styles': '@nvidia-elements/styles',
'@nve/themes': '@nvidia-elements/themes',
'@nve/monaco': '@nvidia-elements/monaco',
'@nve-labs/forms': '@nvidia-elements/forms',
'@nve-labs/cli': '@nvidia-elements/cli',
'@nve-labs/code': '@nvidia-elements/code',
'@nve-labs/create': '@nvidia-elements/create',
'@nve-labs/markdown': '@nvidia-elements/markdown',
'@nve-labs/media': '@nvidia-elements/media',
'@nve-labs/lint': '@nvidia-elements/lint',
'@maglev/elements': '@nvidia-elements/core + @nvidia-elements/themes + @nvidia-elements/styles',
'@mlv/elements': '@nvidia-elements/core',
'@nve/testing': 'project-supported test utilities'
};

const rule = {
meta: {
type: 'problem' as const,
Expand All @@ -26,20 +43,20 @@ const rule = {
const dependencies = Object.keys(packageJson.dependencies ?? {});
const devDependencies = Object.keys(packageJson.devDependencies ?? {});
const peerDependencies = Object.keys(packageJson.peerDependencies ?? {});
const hasDeprecatedDevDependencies = devDependencies.find(dependency => dependency === '@mlv/elements');
const hasDeprecatedDependencies = dependencies.find(dependency => dependency === '@mlv/elements');
const hasDeprecatedPeerDependencies = peerDependencies.find(dependency => dependency === '@mlv/elements');
const deprecatedDependencies = [...dependencies, ...devDependencies, ...peerDependencies].filter(
dependency => dependency in DEPRECATED_PACKAGES
);
Comment thread
coryrylan marked this conversation as resolved.

if (hasDeprecatedPeerDependencies || hasDeprecatedDependencies || hasDeprecatedDevDependencies) {
deprecatedDependencies.forEach(dependency => {
context.report({
messageId: 'unexpected-deprecated-package',
loc: node.loc!,
data: {
package: '@mlv/elements',
alternative: '@nvidia-elements/core'
package: dependency,
alternative: DEPRECATED_PACKAGES[dependency]
}
});
}
});
Comment thread
coryrylan marked this conversation as resolved.
}
}
};
Expand Down
20 changes: 20 additions & 0 deletions projects/lint/src/eslint/rules/no-missing-slotted-elements.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,10 @@ describe('noMissingSlottedElements', () => {
`<nve-button>
button
</nve-button>`,
`<nve-logo>
<img src="./logo.svg" alt="NVIDIA" />
</nve-logo>`,
`<nve-logo>NV</nve-logo>`,
`<nve-input>\${}</nve-input>`,
`<nve-input>{{ }}</nve-input>`,
`<nve-input>{% %}</nve-input>`,
Expand Down Expand Up @@ -139,6 +143,22 @@ describe('noMissingSlottedElements', () => {
});
});

it('should report logos missing default slot content', () => {
tester.run('logos missing default slot content', rule, {
valid: [],
invalid: [
{
code: `<nve-logo></nve-logo>`,
errors: [{ messageId: 'missing-default-slot-content', data: { tagName: 'nve-logo' } }]
},
{
code: `<nve-logo><span slot="prefix">NV</span></nve-logo>`,
errors: [{ messageId: 'missing-default-slot-content', data: { tagName: 'nve-logo' } }]
}
]
});
});
Comment on lines +146 to +160
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Add a whitespace-only nve-logo invalid case to lock down an edge condition.

You already enforce this for nve-tree-node; adding the same assertion for nve-logo prevents regressions where blank text nodes are treated as valid content.

Proposed test diff
   it('should report logos missing default slot content', () => {
     tester.run('logos missing default slot content', rule, {
       valid: [],
       invalid: [
         {
           code: `<nve-logo></nve-logo>`,
           errors: [{ messageId: 'missing-default-slot-content', data: { tagName: 'nve-logo' } }]
         },
+        {
+          code: `<nve-logo>   </nve-logo>`,
+          errors: [{ messageId: 'missing-default-slot-content', data: { tagName: 'nve-logo' } }]
+        },
         {
           code: `<nve-logo><span slot="prefix">NV</span></nve-logo>`,
           errors: [{ messageId: 'missing-default-slot-content', data: { tagName: 'nve-logo' } }]
         }
       ]
     });
   });
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
it('should report logos missing default slot content', () => {
tester.run('logos missing default slot content', rule, {
valid: [],
invalid: [
{
code: `<nve-logo></nve-logo>`,
errors: [{ messageId: 'missing-default-slot-content', data: { tagName: 'nve-logo' } }]
},
{
code: `<nve-logo><span slot="prefix">NV</span></nve-logo>`,
errors: [{ messageId: 'missing-default-slot-content', data: { tagName: 'nve-logo' } }]
}
]
});
});
it('should report logos missing default slot content', () => {
tester.run('logos missing default slot content', rule, {
valid: [],
invalid: [
{
code: `<nve-logo></nve-logo>`,
errors: [{ messageId: 'missing-default-slot-content', data: { tagName: 'nve-logo' } }]
},
{
code: `<nve-logo> </nve-logo>`,
errors: [{ messageId: 'missing-default-slot-content', data: { tagName: 'nve-logo' } }]
},
{
code: `<nve-logo><span slot="prefix">NV</span></nve-logo>`,
errors: [{ messageId: 'missing-default-slot-content', data: { tagName: 'nve-logo' } }]
}
]
});
});
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@projects/lint/src/eslint/rules/no-missing-slotted-elements.test.ts` around
lines 146 - 160, Add an extra invalid test case to the logos group that covers a
whitespace-only default slot to prevent blank text nodes from being treated as
valid; inside the tester.run call for the 'logos missing default slot content'
test (the one using rule and errors with messageId
'missing-default-slot-content' and data { tagName: 'nve-logo' }), add another
invalid entry whose code is an nve-logo containing only whitespace (e.g.,
`<nve-logo> </nve-logo>`) and the same expected errors array so the rule rejects
whitespace-only default content.


it('should report custom required elements', () => {
tester.run('unexpected use of missing slotted elements', rule, {
valid: [],
Expand Down
Loading
Loading