UNPKG

@gltf-transform/core

Version:

glTF 2.0 SDK for JavaScript and TypeScript, on Web and Node.js.

42 lines (36 loc) 1.73 kB
import { RefMap } from 'property-graph'; import type { Nullable } from '../constants.js'; import type { ExtensionProperty } from './extension-property.js'; import { type IProperty, Property } from './property.js'; export interface IExtensibleProperty extends IProperty { extensions: RefMap<ExtensionProperty>; } /** * *A {@link Property} that can have {@link ExtensionProperty} instances attached.* * * Most properties are extensible. See the {@link Extension} documentation for information about * how to use extensions. * * @category Properties */ export abstract class ExtensibleProperty<T extends IExtensibleProperty = IExtensibleProperty> extends Property<T> { protected getDefaults(): Nullable<T> { return Object.assign(super.getDefaults(), { extensions: new RefMap<ExtensionProperty>() }); } /** Returns an {@link ExtensionProperty} attached to this Property, if any. */ public getExtension<Prop extends ExtensionProperty>(name: string): Prop | null { return (this as ExtensibleProperty).getRefMap('extensions', name) as Prop; } /** * Attaches the given {@link ExtensionProperty} to this Property. For a given extension, only * one ExtensionProperty may be attached to any one Property at a time. */ public setExtension<Prop extends ExtensionProperty>(name: string, extensionProperty: Prop | null): this { if (extensionProperty) extensionProperty._validateParent(this as ExtensibleProperty); return (this as ExtensibleProperty).setRefMap('extensions', name, extensionProperty) as this; } /** Lists all {@link ExtensionProperty} instances attached to this Property. */ public listExtensions(): ExtensionProperty[] { return (this as ExtensibleProperty).listRefMapValues('extensions'); } }