UNPKG

@tpluscode/rdfine

Version:
51 lines (50 loc) 2.56 kB
import type { DatasetCore, Literal, NamedNode, Term } from '@rdfjs/types'; import type { GraphPointer } from 'clownface'; import type { NamespaceBuilder } from '@rdfjs/namespace'; import type { Initializer, RdfResource, RdfResourceCore, ResourceNode } from '../RdfResource.js'; import { RdfineEnvironment } from '../environment.js'; import type { PropertyMeta } from './decorators/property/index.js'; export type AnyFunction<A = any> = (...input: any[]) => A; export interface Constructor<A extends RdfResourceCore<any> = RdfResourceCore> { new (...input: any[]): A; __mixins: Mixin[]; __properties: Map<string, PropertyMeta>; __initializers: Map<string, unknown>; __ns?: NamespaceBuilder; } export type ExtendingConstructor<TExtended, TExtension> = Constructor<RdfResourceCore & Partial<Omit<TExtended, keyof TExtension>>>; type EvaluatedMixin = { shouldApply: boolean | ((entity: RdfResource) => boolean); }; type SingleTypeMixin = { appliesTo: NamedNode; }; type MaybeArray<T> = T | T[]; export interface ResourceIndexer<T extends RdfResource = RdfResource> { [prop: string]: null | undefined | MaybeArray<T | Literal | T & ResourceIndexer<T>>; } export type Mixin<T extends AnyFunction = any> = InstanceType<ReturnType<T>>; export interface ResourceFactory<D extends DatasetCore = DatasetCore, R extends RdfResource<D> = RdfResource<D>, T extends AnyFunction = any> { addMixin(...mixins: (EvaluatedMixin | SingleTypeMixin)[]): void; createEntity<S>(term: GraphPointer<Term, D>, typeAndMixins?: Mixin<T>[] | [Constructor, ...Mixin<T>[]], // TODO: move mixins into options object options?: ResourceCreationOptions<D, R & S>): R & S & ResourceIndexer<R>; } export interface ResourceCreationOptions<D extends DatasetCore, R extends RdfResourceCore> { parent?: RdfResourceCore<D>; initializer?: Initializer<R>; } export default class<D extends DatasetCore = DatasetCore, R extends RdfResource<D> = RdfResource<D>, T extends AnyFunction = any> implements ResourceFactory<D, R, T> { private __env; private __mixins; private __alwaysMixins; private __typeMixins; private __typeCache; BaseClass: Constructor; constructor(__env: RdfineEnvironment); addMixin(...mixins: (EvaluatedMixin | SingleTypeMixin)[]): void; createEntity<S>(pointer: ResourceNode<D>, typeAndMixins?: Mixin<T>[] | [Constructor, ...Mixin<T>[]], options?: ResourceCreationOptions<D, R & S>): R & S & ResourceIndexer<R>; private __getBaseClass; private __extend; private __isConstructor; } export {};