import type { ScenePluginMetadata, ThemePluginMetadata, TransitionPluginMetadata, VideoResourceMetadata, } from '../resources/video-resource' import { VIDEO_RESOURCE_METADATA_KEY, createVideoResourceAnnotation, defineScenePluginMetadata as defineScenePluginMetadataBase, defineThemePluginMetadata as defineThemePluginMetadataBase, defineTransitionPluginMetadata as defineTransitionPluginMetadataBase, getVideoResourceMetadata, ScenePluginMetadataSchema, type VideoResourceDescriptor, } from '../resources/video-resource' import { sceneResourceDescriptor, themeResourceDescriptor, transitionResourceDescriptor, } from '../resources/resource-descriptors' import { ComponentProjectComponentMetadataSchema, type ComponentProjectComponentMetadata as LegacyComponentProjectComponentMetadata, } from '../schemas' export const COMPONENT_PROJECT_METADATA_KEY = VIDEO_RESOURCE_METADATA_KEY export type ComponentProjectComponentMetadata = LegacyComponentProjectComponentMetadata export function defineComponentProjectComponentMetadata( metadata: ComponentProjectComponentMetadata, ): ComponentProjectComponentMetadata { const parsed = ComponentProjectComponentMetadataSchema.parse(metadata) return parsed as ComponentProjectComponentMetadata } const sceneAnnotation = createVideoResourceAnnotation(sceneResourceDescriptor) const transitionAnnotation = createVideoResourceAnnotation(transitionResourceDescriptor) const themeAnnotation = createVideoResourceAnnotation(themeResourceDescriptor) function normalizeSceneMetadata( metadata: ComponentProjectComponentMetadata | ScenePluginMetadata, ): ScenePluginMetadata { if ('resourceKind' in metadata) { return defineScenePluginMetadataBase(metadata) } return ScenePluginMetadataSchema.parse({ resourceKind: 'scene', name: metadata.name, description: metadata.description, sourceFile: metadata.sourceFile, aspectRatio: metadata.aspectRatio, sceneType: metadata.sceneType, motion: metadata.motion, sceneFamily: 'custom', themePreset: undefined, slots: undefined, propsTypeName: metadata.propsTypeName, rootLayout: 'absolute-fill', tags: metadata.tags, pluginKey: metadata.pluginKey ?? metadata.name, }) } export function VideoComponent( metadata: ComponentProjectComponentMetadata | ScenePluginMetadata, ) { return sceneAnnotation.annotate(normalizeSceneMetadata(metadata)) } export const TransitionComponent = transitionAnnotation.annotate export const ThemeComponent = themeAnnotation.annotate export const defineScenePluginMetadata = defineScenePluginMetadataBase export const defineTransitionPluginMetadata = defineTransitionPluginMetadataBase export const defineThemePluginMetadata = defineThemePluginMetadataBase export function getComponentProjectComponentMetadata( target: unknown, ): ComponentProjectComponentMetadata | undefined { const metadata = getVideoResourceMetadata(target, 'scene') if (!metadata) { return undefined } const { resourceKind, pluginKey, rootLayout, sceneFamily, themePreset, slots, ...legacy } = metadata void resourceKind void pluginKey void rootLayout void sceneFamily void themePreset void slots return legacy as ComponentProjectComponentMetadata } export function getScenePluginMetadata(target: unknown): ScenePluginMetadata | undefined { return getVideoResourceMetadata(target, 'scene') } export function getTransitionPluginMetadata( target: unknown, ): TransitionPluginMetadata | undefined { return getVideoResourceMetadata(target, 'transition') } export function getThemePluginMetadata(target: unknown): ThemePluginMetadata | undefined { return getVideoResourceMetadata(target, 'theme') } export type { ScenePluginMetadata, ThemePluginMetadata, TransitionPluginMetadata, VideoResourceMetadata, VideoResourceDescriptor, }