@tpluscode/rdfine
Version:
RDF/JS idiomatic, native, effective
51 lines (50 loc) • 2.56 kB
TypeScript
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 {};