Skip to content
Closed
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
23 changes: 22 additions & 1 deletion src/internal/base-component/component-metadata.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,28 +9,49 @@ export const COMPONENT_METADATA_KEY = '__awsuiMetadata__';
interface AwsUiMetadata {
name: string;
version: string;
theme?: string;
analytics?: AnalyticsMetadata;
}

interface HTMLMetadataElement extends HTMLElement {
[COMPONENT_METADATA_KEY]: AwsUiMetadata;
}

export interface PackageMetadata {
packageVersion: string;
packageTheme?: string;
}

export function useComponentMetadata<T = any>(
componentName: string,
packageVersion: string,
packageVersionOrMetadata: string | PackageMetadata, // after updating all packages using useComponentMetadata, we support only PackageMetadata format
analyticsMetadata?: AnalyticsMetadata
) {
const elementRef = useRef<T>(null);

useEffect(() => {
if (elementRef.current) {
const node = elementRef.current as unknown as HTMLMetadataElement;

// Handle both string and PackageMetadata formats
const packageVersion =
typeof packageVersionOrMetadata === 'string'
? packageVersionOrMetadata
: packageVersionOrMetadata.packageVersion;

const packageTheme =
typeof packageVersionOrMetadata === 'string' ? undefined : packageVersionOrMetadata.packageTheme;

const metadata: AwsUiMetadata = {
name: componentName,
version: packageVersion,
};

// Add theme to metadata if provided
if (packageTheme !== undefined) {
metadata.theme = packageTheme;
}

// Only add analytics property to metadata if analytics property is non-empty
if (analyticsMetadata && Object.keys(analyticsMetadata).length > 0) {
metadata.analytics = analyticsMetadata;
Expand Down