@nitrogenbuilder/client-core
Version:
Nitrogen Builder Core Client
66 lines (65 loc) • 2.37 kB
JavaScript
import { describe, expect, it } from 'vitest';
import { createComponentManifest, createComponentManifestEntry, } from './componentManifest.js';
function makeSettings(overrides = {}) {
return {
options: { category: 'Layout' },
categories: {
content: {
label: 'Content',
groups: {
main: {
label: 'Main',
props: {
heading: { type: 'string', label: 'Heading', default: 'Hi' },
},
},
},
},
},
...overrides,
};
}
describe('createComponentManifestEntry', () => {
it('carries the module description onto the manifest entry', () => {
const entry = createComponentManifestEntry({
name: 'Section',
settings: makeSettings({
description: 'A full-width layout section.',
}),
});
expect(entry.name).toBe('Section');
expect(entry.description).toBe('A full-width layout section.');
// Schema still serialized so an agent can read prop paths.
expect(entry.categories.content.groups.main.props.heading.type).toBe('string');
});
it('leaves description undefined when not provided', () => {
const entry = createComponentManifestEntry({
name: 'Section',
settings: makeSettings(),
});
expect(entry.description).toBeUndefined();
});
});
describe('createComponentManifest', () => {
it('includes descriptions across the component list', () => {
const manifest = createComponentManifest([
{
name: 'Section',
settings: makeSettings({ description: 'Layout container.' }),
},
{
name: 'Button',
settings: makeSettings({ description: 'A clickable button.' }),
},
], { generatedAt: '2026-01-01T00:00:00.000Z' });
// Sorted by name → Button before Section.
expect(manifest.components.map((c) => c.name)).toEqual([
'Button',
'Section',
]);
expect(manifest.components.map((c) => c.description)).toEqual([
'A clickable button.',
'Layout container.',
]);
});
});