mirror of
https://github.com/FlipsideCrypto/DefinitelyTyped.git
synced 2026-02-06 10:56:53 +00:00
Better describe A-Frame using imports. Remove namespaces. (#28661)
This update removes the usage of namespaces in an effort to just be able to use A-Frame directly from an import.
These types are based on [this branch](576e4557b1/%40types) of work in my [a-frame experiements](https://github.com/devpaul/aframe-experiments) repo. Please take a look over there to see more complete usage and examples.
This commit is contained in:
parent
2b62080d62
commit
37b5c6a8e4
743
types/aframe/index.d.ts
vendored
743
types/aframe/index.d.ts
vendored
@ -1,345 +1,476 @@
|
||||
// Type definitions for AFRAME 0.7
|
||||
// Type definitions for AFRAME 0.8
|
||||
// Project: https://aframe.io/
|
||||
// Definitions by: Paul Shannon <https://github.com/devpaul>
|
||||
// Roberto Ritger <https://github.com/bertoritger>
|
||||
// Trygve Wastvedt <https://github.com/twastvedt>
|
||||
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
|
||||
// TypeScript Version: 2.3
|
||||
// TypeScript Version: 2.8
|
||||
|
||||
/**
|
||||
* Extended tests available at https://github.com/devpaul/aframe-typings.git
|
||||
* Extended tests and examples available at https://github.com/devpaul/aframe-experiments.git
|
||||
*/
|
||||
|
||||
/// <reference types="three" />
|
||||
/// <reference types="tween.js" />
|
||||
|
||||
// Globals
|
||||
declare var AFRAME: AFrame.AFrameGlobal;
|
||||
declare var hasNativeWebVRImplementation: boolean;
|
||||
import * as three from 'three';
|
||||
import * as tween from '@tweenjs/tween.js';
|
||||
|
||||
interface Document {
|
||||
createElement(tagName: string): AFrame.Entity;
|
||||
querySelector(selectors: 'a-scene'): AFrame.Scene;
|
||||
querySelector(selectors: string): AFrame.Entity<any>;
|
||||
querySelectorAll(selectors: string): NodeListOf<AFrame.Entity<any> | Element>;
|
||||
export type ThreeLib = typeof three;
|
||||
export type TweenLib = typeof tween;
|
||||
|
||||
export interface ObjectMap<T = any> {
|
||||
[key: string]: T;
|
||||
}
|
||||
|
||||
// Interfaces
|
||||
declare namespace AFrame {
|
||||
interface ObjectMap<T = any> {
|
||||
[ key: string ]: T;
|
||||
}
|
||||
export interface Animation {
|
||||
attribute: string;
|
||||
begin: string | number;
|
||||
delay: number;
|
||||
direction: 'alternate' | 'alternateReverse' | 'normal' | 'reverse';
|
||||
dur: number;
|
||||
easing(): void;
|
||||
end: string;
|
||||
fill: 'backwards' | 'both' | 'forwards' | 'none';
|
||||
from: any; // TODO type
|
||||
repeat: number | 'indefinite';
|
||||
to: number;
|
||||
}
|
||||
|
||||
interface AFrameGlobal {
|
||||
AEntity: Entity;
|
||||
ANode: ANode;
|
||||
AScene: Scene;
|
||||
components: { [ key: string ]: ComponentDescriptor };
|
||||
geometries: { [ key: string ]: GeometryDescriptor };
|
||||
primitives: { [ key: string ]: Entity };
|
||||
registerComponent<T extends Component>(name: string, component: ComponentDefinition<T>): ComponentConstructor<T>;
|
||||
registerElement(name: string, element: ANode): void;
|
||||
registerGeometry<T extends Geometry>(name: string, geometry: GeometryDefinition<T>): GeometryConstructor<T>;
|
||||
registerPrimitive(name: string, primitive: PrimitiveDefinition): void;
|
||||
registerShader<T extends Shader>(name: string, shader: T): ShaderConstructor<T>;
|
||||
registerSystem<T extends System>(name: string, definition: SystemDefinition<T>): SystemConstructor<T>;
|
||||
schema: SchemaUtils;
|
||||
shaders: { [ key: string ]: ShaderDescriptor };
|
||||
systems: { [key: string]: SystemConstructor };
|
||||
THREE: typeof THREE;
|
||||
TWEEN: typeof TWEEN;
|
||||
utils: Utils;
|
||||
version: string;
|
||||
}
|
||||
export interface ANode extends HTMLElement {
|
||||
// Only public APIs added. Many methods intentionally left out.
|
||||
// createdCallback
|
||||
// attachedCallback
|
||||
// attributeChangedCallback
|
||||
closestScene(): Scene;
|
||||
closest(selector: string): ANode;
|
||||
// detachedCallback
|
||||
hasLoaded: boolean;
|
||||
load(cb?: () => void, childFilter?: (el: Element) => boolean): void;
|
||||
// updateMixins
|
||||
registerMixin(id: string): void;
|
||||
setAttribute(type: string, newValue: any): void;
|
||||
unregisterMixin(id: string): void;
|
||||
removeMixinListener(id: string): void;
|
||||
attachMixinListener(mixin: HTMLElement): void;
|
||||
emit(name: string, detail?: any, bubbles?: boolean): void;
|
||||
emitter(name: string, detail?: any, bubbles?: boolean): () => void;
|
||||
}
|
||||
|
||||
interface Animation {
|
||||
attribute: string;
|
||||
begin: string | number;
|
||||
delay: number;
|
||||
direction: 'alternate' | 'alternateReverse' | 'normal' | 'reverse';
|
||||
dur: number;
|
||||
easing(): void;
|
||||
end: string;
|
||||
fill: 'backwards' | 'both' | 'forwards' | 'none';
|
||||
from: any; // TODO type
|
||||
repeat: number | 'indefinite';
|
||||
to: number;
|
||||
}
|
||||
export interface Behavior {
|
||||
tick(): void;
|
||||
}
|
||||
|
||||
interface ANode extends HTMLElement {
|
||||
// Only public APIs added. Many methods intentionally left out.
|
||||
// createdCallback
|
||||
// attachedCallback
|
||||
// attributeChangedCallback
|
||||
closestScene(): Scene;
|
||||
closest(selector: string): ANode;
|
||||
// detachedCallback
|
||||
hasLoaded: boolean;
|
||||
load(cb?: () => void, childFilter?: (el: Element) => boolean): void;
|
||||
// updateMixins
|
||||
registerMixin(id: string): void;
|
||||
setAttribute(type: string, newValue: any): void;
|
||||
unregisterMixin(id: string): void;
|
||||
removeMixinListener(id: string): void;
|
||||
attachMixinListener(mixin: HTMLElement): void;
|
||||
emit(name: string, detail?: any, bubbles?: boolean): void;
|
||||
emitter(name: string, detail?: any, bubbles?: boolean): () => void;
|
||||
}
|
||||
export interface Component<T extends object = any, S extends System = System> {
|
||||
attrName?: string;
|
||||
data: T;
|
||||
dependencies?: string[];
|
||||
el: Entity;
|
||||
id: string;
|
||||
multiple?: boolean;
|
||||
name: string;
|
||||
schema: Schema<T>;
|
||||
system: S | undefined;
|
||||
|
||||
interface Behavior {
|
||||
tick(): void;
|
||||
}
|
||||
init(data?: T): void;
|
||||
pause(): void;
|
||||
play(): void;
|
||||
remove(): void;
|
||||
tick?(time: number, timeDelta: number): void;
|
||||
update(oldData: T): void;
|
||||
updateSchema?(): void;
|
||||
|
||||
interface Component<T extends { [key: string]: any } = any, S extends System = System> {
|
||||
attrName?: string;
|
||||
data: T;
|
||||
dependencies?: string[];
|
||||
el: Entity;
|
||||
id: string;
|
||||
multiple?: boolean;
|
||||
extendSchema(update: Schema): void;
|
||||
flushToDOM(): void;
|
||||
}
|
||||
|
||||
export interface ComponentConstructor<T extends object> {
|
||||
new (el: Entity, attrValue: string, id: string): T & Component;
|
||||
prototype: T & {
|
||||
name: string;
|
||||
schema: Schema<T>;
|
||||
system: S | undefined;
|
||||
|
||||
init(this: this, data?: T): void;
|
||||
pause(this: this): void;
|
||||
play(this: this): void;
|
||||
remove(this: this): void;
|
||||
tick?(this: this, time: number, timeDelta: number): void;
|
||||
update(this: this, oldData: T): void;
|
||||
updateSchema?(this: this): void;
|
||||
|
||||
extendSchema(this: this, update: Schema): void;
|
||||
flushToDOM(this: this): void;
|
||||
}
|
||||
|
||||
interface ComponentConstructor<T extends Component> {
|
||||
new (el: Entity, attrValue: string, id: string): T;
|
||||
}
|
||||
|
||||
type ComponentDefinition<T extends Component = Component> = Partial<T>;
|
||||
|
||||
interface ComponentDescriptor<T extends Component = Component> {
|
||||
Component: ComponentConstructor<T>;
|
||||
dependencies: string[] | undefined;
|
||||
multiple: boolean | undefined;
|
||||
|
||||
// internal APIs2
|
||||
// parse
|
||||
// parseAttrValueForCache
|
||||
// schema
|
||||
// stringify
|
||||
// type
|
||||
}
|
||||
|
||||
interface Coordinate {
|
||||
x: number;
|
||||
y: number;
|
||||
z: number;
|
||||
}
|
||||
|
||||
interface DefaultComponents {
|
||||
position: Component<Coordinate>;
|
||||
rotation: Component<Coordinate>;
|
||||
scale: Component<Coordinate>;
|
||||
}
|
||||
|
||||
interface Entity<C = ObjectMap<Component>> extends ANode {
|
||||
components: C & DefaultComponents;
|
||||
isPlaying: boolean;
|
||||
object3D: THREE.Object3D;
|
||||
object3DMap: ObjectMap<THREE.Object3D>;
|
||||
sceneEl?: Scene;
|
||||
|
||||
addState(name: string): void;
|
||||
flushToDOM(recursive?: boolean): void;
|
||||
/**
|
||||
* @deprecated since 0.4.0
|
||||
*/
|
||||
getComputedAttribute(attr: string): Component;
|
||||
getDOMAttribute(attr: string): any;
|
||||
getObject3D(type: string): THREE.Object3D;
|
||||
getOrCreateObject3D(type: string, construct: any): THREE.Object3D;
|
||||
is(stateName: string): boolean;
|
||||
pause(): void;
|
||||
system: System;
|
||||
play(): void;
|
||||
setObject3D(type: string, obj: THREE.Object3D): void;
|
||||
removeAttribute(attr: string, property?: string): void;
|
||||
removeObject3D(type: string): void;
|
||||
removeState(stateName: string): void;
|
||||
|
||||
// getAttribute specific usages
|
||||
getAttribute(type: string): any;
|
||||
getAttribute(type: 'position' | 'rotation' | 'scale'): Coordinate;
|
||||
|
||||
// setAttribute specific usages
|
||||
setAttribute(attr: string, value: any): void;
|
||||
setAttribute(attr: string, property: string, componentAttrValue?: any): void;
|
||||
setAttribute(type: 'position' | 'rotation' | 'scale', value: Coordinate): void;
|
||||
|
||||
// addEventListener specific usages
|
||||
addEventListener<K extends keyof EntityEventMap>(type: K, listener: (event: Event & EntityEventMap[K]) => void, useCapture?: boolean): void;
|
||||
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
|
||||
}
|
||||
|
||||
type DetailEvent<D> = Event & {
|
||||
detail: D;
|
||||
target: EventTarget & Entity;
|
||||
pause(): void;
|
||||
};
|
||||
}
|
||||
|
||||
interface EntityEventMap {
|
||||
'child-attached': DetailEvent<{ el: Element | Entity }>;
|
||||
'child-detached': DetailEvent<{ el: Element | Entity }>;
|
||||
'componentchanged': DetailEvent<{
|
||||
name: string,
|
||||
id: string
|
||||
}>;
|
||||
'componentremoved': DetailEvent<{
|
||||
name: string,
|
||||
id: string,
|
||||
newData: any,
|
||||
oldData: any
|
||||
}>;
|
||||
'loaded': EventListener;
|
||||
'pause': EventListener;
|
||||
'play': EventListener;
|
||||
'stateadded': DetailEvent<{ state: string }>;
|
||||
'stateremoved': DetailEvent<{ state: string }>;
|
||||
'schemachanged': DetailEvent<{ componentName: string }>;
|
||||
}
|
||||
export interface ComponentDescriptor<T extends Component = Component> {
|
||||
Component: ComponentConstructor<T>;
|
||||
dependencies: string[] | undefined;
|
||||
multiple: boolean | undefined;
|
||||
|
||||
interface Geometry {
|
||||
// internal APIs2
|
||||
// parse
|
||||
// parseAttrValueForCache
|
||||
// schema
|
||||
// stringify
|
||||
// type
|
||||
}
|
||||
|
||||
export interface Coordinate {
|
||||
x: number;
|
||||
y: number;
|
||||
z: number;
|
||||
}
|
||||
|
||||
export interface DefaultComponents {
|
||||
position: Component<Coordinate>;
|
||||
rotation: Component<Coordinate>;
|
||||
scale: Component<Coordinate>;
|
||||
}
|
||||
|
||||
export interface Entity<C = ObjectMap<Component>> extends ANode {
|
||||
components: C & DefaultComponents;
|
||||
isPlaying: boolean;
|
||||
object3D: THREE.Object3D;
|
||||
object3DMap: ObjectMap<THREE.Object3D>;
|
||||
sceneEl?: Scene;
|
||||
|
||||
addState(name: string): void;
|
||||
flushToDOM(recursive?: boolean): void;
|
||||
/**
|
||||
* @deprecated since 0.4.0
|
||||
*/
|
||||
getComputedAttribute(attr: string): Component;
|
||||
getDOMAttribute(attr: string): any;
|
||||
getObject3D(type: string): THREE.Object3D;
|
||||
getOrCreateObject3D(type: string, construct: any): THREE.Object3D;
|
||||
is(stateName: string): boolean;
|
||||
pause(): void;
|
||||
play(): void;
|
||||
setObject3D(type: string, obj: THREE.Object3D): void;
|
||||
removeAttribute(attr: string, property?: string): void;
|
||||
removeObject3D(type: string): void;
|
||||
removeState(stateName: string): void;
|
||||
|
||||
// getAttribute specific usages
|
||||
getAttribute(type: string): any;
|
||||
getAttribute(type: 'position' | 'rotation' | 'scale'): Coordinate;
|
||||
|
||||
// setAttribute specific usages
|
||||
setAttribute(attr: string, value: any): void;
|
||||
setAttribute(attr: string, property: string, componentAttrValue?: any): void;
|
||||
setAttribute(type: 'position' | 'rotation' | 'scale', value: Coordinate): void;
|
||||
|
||||
// addEventListener specific usages
|
||||
addEventListener<K extends keyof EntityEventMap>(
|
||||
type: K,
|
||||
listener: (event: Event & EntityEventMap[K]) => void,
|
||||
useCapture?: boolean
|
||||
): void;
|
||||
addEventListener(
|
||||
type: string,
|
||||
listener: EventListenerOrEventListenerObject,
|
||||
useCapture?: boolean
|
||||
): void;
|
||||
}
|
||||
|
||||
export type DetailEvent<D> = Event & {
|
||||
detail: D;
|
||||
target: EventTarget & Entity;
|
||||
};
|
||||
|
||||
export interface EntityEventMap {
|
||||
'child-attached': DetailEvent<{ el: Element | Entity }>;
|
||||
'child-detached': DetailEvent<{ el: Element | Entity }>;
|
||||
componentchanged: DetailEvent<{
|
||||
name: string;
|
||||
geometry: THREE.Geometry;
|
||||
schema: Schema<any>;
|
||||
id: string;
|
||||
}>;
|
||||
componentremoved: DetailEvent<{
|
||||
name: string;
|
||||
id: string;
|
||||
newData: any;
|
||||
oldData: any;
|
||||
}>;
|
||||
loaded: EventListener;
|
||||
pause: EventListener;
|
||||
play: EventListener;
|
||||
stateadded: DetailEvent<{ state: string }>;
|
||||
stateremoved: DetailEvent<{ state: string }>;
|
||||
schemachanged: DetailEvent<{ componentName: string }>;
|
||||
}
|
||||
|
||||
init(this: this, data: { [P in keyof this['schema']]: any }): void;
|
||||
// Would like the above to be:
|
||||
// init?(this: this, data?: { [P in keyof T['schema']]: T['schema'][P]['default'] } ): void;
|
||||
// I think this is prevented by the following issue: https://github.com/Microsoft/TypeScript/issues/21760.
|
||||
}
|
||||
export interface Geometry<T = any> {
|
||||
data: T;
|
||||
name: string;
|
||||
geometry: THREE.Geometry;
|
||||
schema: Schema<any>;
|
||||
|
||||
interface GeometryConstructor<T extends Geometry> {
|
||||
new (): T;
|
||||
}
|
||||
init(data: any): void;
|
||||
}
|
||||
|
||||
type GeometryDefinition<T extends Geometry = Geometry> = Partial<T>;
|
||||
export interface GeometryConstructor<T extends object = object> {
|
||||
new (): T & Geometry;
|
||||
}
|
||||
|
||||
interface GeometryDescriptor<T extends Geometry = Geometry> {
|
||||
Geometry: GeometryConstructor<T>;
|
||||
schema: Schema;
|
||||
}
|
||||
export interface GeometryDescriptor<T extends Geometry = Geometry> {
|
||||
Geometry: GeometryConstructor<T>;
|
||||
schema: Schema;
|
||||
}
|
||||
|
||||
type MultiPropertySchema<T extends { [key: string ]: any }> = {
|
||||
[P in keyof T]: SinglePropertySchema<T[P]> | T[P];
|
||||
export type MultiPropertySchema<T extends object> = {
|
||||
[P in keyof T]: SinglePropertySchema<T[P]> | T[P]
|
||||
};
|
||||
|
||||
export type PropertyTypes =
|
||||
| 'array'
|
||||
| 'asset'
|
||||
| 'audio'
|
||||
| 'boolean'
|
||||
| 'color'
|
||||
| 'int'
|
||||
| 'map'
|
||||
| 'model'
|
||||
| 'number'
|
||||
| 'selector'
|
||||
| 'selectorAll'
|
||||
| 'string'
|
||||
| 'vec2'
|
||||
| 'vec3'
|
||||
| 'vec4';
|
||||
|
||||
export type SceneEvents = 'enter-vr' | 'exit-vr' | 'loaded' | 'renderstart';
|
||||
|
||||
export interface Scene extends Entity {
|
||||
behaviors: Behavior[];
|
||||
camera: THREE.Camera;
|
||||
canvas: HTMLCanvasElement;
|
||||
effect: THREE.VREffect;
|
||||
isMobile: boolean;
|
||||
object3D: THREE.Scene;
|
||||
renderer: THREE.WebGLRenderer;
|
||||
renderStarted: boolean;
|
||||
systems: ObjectMap<System>;
|
||||
time: number;
|
||||
|
||||
enterVR(): Promise<void> | void;
|
||||
exitVR(): Promise<void> | void;
|
||||
reload(): void;
|
||||
|
||||
addEventListener(
|
||||
type: string,
|
||||
listener: EventListenerOrEventListenerObject,
|
||||
useCapture?: boolean
|
||||
): void;
|
||||
addEventListener(type: SceneEvents, listener: EventListener, useCapture?: boolean): void;
|
||||
}
|
||||
|
||||
export type Schema<T extends object = object> = SinglePropertySchema<T> | MultiPropertySchema<T>;
|
||||
|
||||
export interface SchemaUtils {
|
||||
isSingleProperty(schema: Schema): boolean;
|
||||
process(schema: Schema): boolean;
|
||||
}
|
||||
|
||||
export interface Shader {
|
||||
name: string;
|
||||
data: object;
|
||||
schema: Schema<this['data']>;
|
||||
material: THREE.Material;
|
||||
vertexShader: string;
|
||||
fragmentShader: string;
|
||||
|
||||
init(data?: this['data']): void;
|
||||
tick?(time: number, timeDelta: number): void;
|
||||
update(oldData: this['data']): void;
|
||||
}
|
||||
|
||||
export interface ShaderConstructor<T extends object> {
|
||||
new (): T;
|
||||
}
|
||||
|
||||
export interface ShaderDescriptor<T extends Shader = Shader> {
|
||||
Shader: ShaderConstructor<T>;
|
||||
schema: Schema;
|
||||
}
|
||||
|
||||
export interface SinglePropertySchema<T> {
|
||||
type?: PropertyTypes;
|
||||
default?: T;
|
||||
parse?(value: string): T;
|
||||
stringify?(value: T): string;
|
||||
}
|
||||
|
||||
export interface System<T extends object = any> {
|
||||
data: T;
|
||||
schema: Schema<T>;
|
||||
init(): void;
|
||||
pause(): void;
|
||||
play(): void;
|
||||
tick?(t: number, dt: number): void;
|
||||
}
|
||||
|
||||
export interface SystemConstructor<T extends object = object> {
|
||||
new (scene: Scene): T & System;
|
||||
}
|
||||
|
||||
export interface Utils {
|
||||
coordinates: {
|
||||
isCoordinate(value: string): boolean;
|
||||
parse(value: string): Coordinate;
|
||||
stringify(coord: Coordinate): string;
|
||||
};
|
||||
entity: {
|
||||
getComponentProperty(entity: Entity, componentName: string, delimiter?: string): any;
|
||||
setComponentProperty(
|
||||
entity: Entity,
|
||||
componentName: string,
|
||||
value: any,
|
||||
delimiter?: string
|
||||
): void;
|
||||
};
|
||||
styleParser: {
|
||||
parse(value: string): object;
|
||||
stringify(data: object): string;
|
||||
};
|
||||
deepEqual(a: any, b: any): boolean;
|
||||
diff(a: object, b: object): object;
|
||||
extend(target: object, ...source: object[]): object;
|
||||
extendDeep(target: object, ...source: object[]): object;
|
||||
|
||||
interface PrimitiveDefinition {
|
||||
defaultComponents?: any; // TODO cleanup type
|
||||
deprecated?: boolean;
|
||||
mappings?: any; // TODO cleanup type
|
||||
transforms?: any; // TODO cleanup type
|
||||
}
|
||||
throttle(
|
||||
tickFunction: () => void,
|
||||
minimumInterval: number,
|
||||
optionalContext?: {}
|
||||
): (t: number, dt: number) => void;
|
||||
throttleTick(
|
||||
tickFunction: (t: number, dt: number) => void,
|
||||
minimumInterval: number,
|
||||
optionalContext?: {}
|
||||
): (t: number, dt: number) => void;
|
||||
}
|
||||
|
||||
type PropertyTypes = 'array' | 'asset' | 'audio' | 'boolean' | 'color' |
|
||||
'int' | 'map' | 'model' | 'number' | 'selector' | 'selectorAll' |
|
||||
'string' | 'vec2' | 'vec3' | 'vec4';
|
||||
// Definitions
|
||||
// used as mixins to register functions to create classes (newable functions) in A-Frame
|
||||
export type ComponentDefinition<T extends object = object> = T & Partial<Component>;
|
||||
export type GeometryDefinition<T extends object = object, U = any> = T & Partial<Geometry<U>>;
|
||||
export type NodeDefinition<T extends object = object> = T & Partial<ANode>;
|
||||
export interface PrimitiveDefinition {
|
||||
defaultComponents?: any; // TODO cleanup type
|
||||
deprecated?: boolean;
|
||||
mappings?: any; // TODO cleanup type
|
||||
transforms?: any; // TODO cleanup type
|
||||
}
|
||||
export interface MinimalShaderDefinition {
|
||||
schema: Shader['schema'];
|
||||
}
|
||||
export type ShaderDefinition<T extends object = MinimalShaderDefinition & object> = T &
|
||||
Partial<Shader>;
|
||||
export type SystemDefinition<T extends object = object> = T & Partial<System>;
|
||||
|
||||
type SceneEvents = 'enter-vr' | 'exit-vr' | 'loaded' | 'renderstart';
|
||||
// root export
|
||||
export interface AFrame {
|
||||
AComponent: Component;
|
||||
AEntity: Entity;
|
||||
ANode: ANode;
|
||||
AScene: Scene;
|
||||
|
||||
interface Scene extends Entity {
|
||||
behaviors: Behavior[];
|
||||
camera: THREE.Camera;
|
||||
canvas: HTMLCanvasElement;
|
||||
effect: THREE.VREffect;
|
||||
isMobile: boolean;
|
||||
object3D: THREE.Scene;
|
||||
renderer: THREE.WebGLRenderer;
|
||||
renderStarted: boolean;
|
||||
systems: ObjectMap<System>;
|
||||
time: number;
|
||||
|
||||
enterVR(): Promise<void> | void;
|
||||
exitVR(): Promise<void> | void;
|
||||
reload(): void;
|
||||
|
||||
addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void;
|
||||
addEventListener(type: SceneEvents, listener: EventListener, useCapture?: boolean): void;
|
||||
}
|
||||
|
||||
type Schema<T = { [key: string]: any }> = SinglePropertySchema<T> | MultiPropertySchema<T>;
|
||||
|
||||
interface SchemaUtils {
|
||||
isSingleProperty(schema: Schema): boolean;
|
||||
process(schema: Schema): boolean;
|
||||
}
|
||||
|
||||
interface Shader {
|
||||
name: string;
|
||||
data: { [key: string]: any };
|
||||
schema: Schema<this['data']>;
|
||||
material: THREE.Material;
|
||||
vertexShader: string;
|
||||
fragmentShader: string;
|
||||
|
||||
init(this: this, data?: this['data']): void;
|
||||
tick?(this: this, time: number, timeDelta: number): void;
|
||||
update(this: this, oldData: this['data']): void;
|
||||
}
|
||||
|
||||
interface ShaderConstructor<T extends Shader> {
|
||||
new (): T;
|
||||
}
|
||||
|
||||
type ShaderDefinition<T extends Shader = Shader> = Partial<T>;
|
||||
|
||||
interface ShaderDescriptor<T extends Shader = Shader> {
|
||||
Shader: ShaderConstructor<T>;
|
||||
schema: Schema;
|
||||
}
|
||||
|
||||
interface SinglePropertySchema<T> {
|
||||
type?: PropertyTypes;
|
||||
'default'?: T;
|
||||
parse?(value: string): T;
|
||||
stringify?(value: T): string;
|
||||
}
|
||||
|
||||
interface System {
|
||||
data: { [key: string]: any };
|
||||
schema: Schema<this['data']>;
|
||||
init(this: this): void;
|
||||
pause(this: this): void;
|
||||
play(this: this): void;
|
||||
tick?(this: this, t: number, dt: number): void;
|
||||
}
|
||||
|
||||
interface SystemConstructor<T extends System = System> {
|
||||
new (scene: Scene): T;
|
||||
}
|
||||
|
||||
type SystemDefinition<T extends System = System> = Partial<T>;
|
||||
|
||||
interface Utils {
|
||||
coordinates: {
|
||||
isCoordinate(value: string): boolean;
|
||||
parse(value: string): Coordinate;
|
||||
stringify(coord: Coordinate): string;
|
||||
components: ObjectMap<ComponentDescriptor>;
|
||||
geometries: ObjectMap<GeometryDescriptor>;
|
||||
primitives: {
|
||||
getMeshMixin(): {
|
||||
defaultComponents: { material: object };
|
||||
mappings: { [key: string]: any }; // TODO improve any type
|
||||
};
|
||||
entity: {
|
||||
getComponentProperty(entity: Entity, componentName: string, delimiter?: string): any;
|
||||
setComponentProperty(entity: Entity, componentName: string, value: any, delimiter?: string): void;
|
||||
};
|
||||
styleParser: {
|
||||
parse(value: string): object;
|
||||
stringify(data: object): string;
|
||||
};
|
||||
deepEqual(a: any, b: any): boolean;
|
||||
diff(a: object, b: object): object;
|
||||
extend(target: object, ... source: object[]): object;
|
||||
extendDeep(target: object, ... source: object[]): object;
|
||||
primitives: ObjectMap<Entity>;
|
||||
};
|
||||
scenes: Scene[];
|
||||
schema: SchemaUtils;
|
||||
shaders: ObjectMap<ShaderDescriptor>;
|
||||
systems: ObjectMap<SystemConstructor>;
|
||||
THREE: ThreeLib;
|
||||
TWEEN: TweenLib;
|
||||
utils: Utils;
|
||||
version: string;
|
||||
|
||||
throttle(tickFunction: () => void, minimumInterval: number, optionalContext?: {}): (t: number, dt: number) => void;
|
||||
throttleTick(tickFunction: (t: number, dt: number) => void, minimumInterval: number, optionalContext?: {}): (t: number, dt: number) => void;
|
||||
registerComponent<T extends object>(
|
||||
name: string,
|
||||
component: ComponentDefinition<T>
|
||||
): ComponentConstructor<T>;
|
||||
registerElement(name: string, element: object): void;
|
||||
registerGeometry<T extends object>(
|
||||
name: string,
|
||||
geometry: GeometryDefinition<T>
|
||||
): GeometryConstructor<T>;
|
||||
registerPrimitive(name: string, primitive: PrimitiveDefinition): void;
|
||||
registerShader<T extends MinimalShaderDefinition & object>(
|
||||
name: string,
|
||||
shader: ShaderDefinition<T>
|
||||
): ShaderConstructor<T>;
|
||||
registerSystem<T extends object>(
|
||||
name: string,
|
||||
definition: SystemDefinition<T>
|
||||
): SystemConstructor<T>;
|
||||
}
|
||||
|
||||
// module.exports
|
||||
export const AComponent: AFrame['AComponent'];
|
||||
export const AEntity: AFrame['AEntity'];
|
||||
export const ANode: AFrame['ANode'];
|
||||
export const AScene: AFrame['AScene'];
|
||||
export const components: AFrame['components'];
|
||||
export const geometries: AFrame['geometries'];
|
||||
export const primitives: AFrame['primitives'];
|
||||
export const scenes: AFrame['scenes'];
|
||||
export const schema: AFrame['schema'];
|
||||
export const shaders: AFrame['shaders'];
|
||||
export const systems: AFrame['systems'];
|
||||
export const THREE: AFrame['THREE'];
|
||||
export const TWEEN: AFrame['TWEEN'];
|
||||
export const utils: AFrame['utils'];
|
||||
export const version: AFrame['version'];
|
||||
export const registerComponent: AFrame['registerComponent'];
|
||||
export const registerElement: AFrame['registerElement'];
|
||||
export const registerGeometry: AFrame['registerGeometry'];
|
||||
export const registerPrimitive: AFrame['registerPrimitive'];
|
||||
export const registerShader: AFrame['registerShader'];
|
||||
export const registerSystem: AFrame['registerSystem'];
|
||||
|
||||
// global exports
|
||||
declare global {
|
||||
var hasNativeWebVRImplementation: boolean;
|
||||
|
||||
namespace AFRAME {
|
||||
const AComponent: AFrame['AComponent'];
|
||||
const AEntity: AFrame['AEntity'];
|
||||
const ANode: AFrame['ANode'];
|
||||
const AScene: AFrame['AScene'];
|
||||
const components: AFrame['components'];
|
||||
const geometries: AFrame['geometries'];
|
||||
const primitives: AFrame['primitives'];
|
||||
const scenes: AFrame['scenes'];
|
||||
const schema: AFrame['schema'];
|
||||
const shaders: AFrame['shaders'];
|
||||
const systems: AFrame['systems'];
|
||||
const THREE: AFrame['THREE'];
|
||||
const TWEEN: AFrame['TWEEN'];
|
||||
const utils: AFrame['utils'];
|
||||
const version: string;
|
||||
|
||||
const registerComponent: AFrame['registerComponent'];
|
||||
const registerElement: AFrame['registerElement'];
|
||||
const registerGeometry: AFrame['registerGeometry'];
|
||||
const registerPrimitive: AFrame['registerPrimitive'];
|
||||
const registerShader: AFrame['registerShader'];
|
||||
const registerSystem: AFrame['registerSystem'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Custom elements augment document methods to return custom HTML
|
||||
*/
|
||||
interface Document {
|
||||
createElement(tagName: string): Entity;
|
||||
querySelector(selectors: 'a-scene'): Scene;
|
||||
querySelector(selectors: string): Entity<any>;
|
||||
querySelectorAll(selectors: string): NodeListOf<Entity<any> | Element>;
|
||||
}
|
||||
|
||||
interface HTMLCollection extends HTMLCollectionBase {
|
||||
/**
|
||||
* Retrieves a select object or an object from an options collection.
|
||||
*/
|
||||
namedItem(name: string): Element | Entity | null;
|
||||
item(index: number): Element | Entity;
|
||||
[index: number]: Element | Entity;
|
||||
}
|
||||
}
|
||||
|
||||
1044
types/aframe/test/aframe-io-tests.ts
Normal file
1044
types/aframe/test/aframe-io-tests.ts
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,3 +1,14 @@
|
||||
import {
|
||||
Component,
|
||||
Entity,
|
||||
MultiPropertySchema,
|
||||
System,
|
||||
SystemDefinition,
|
||||
THREE,
|
||||
Geometry,
|
||||
registerComponent
|
||||
} from 'aframe';
|
||||
|
||||
// Global
|
||||
const threeCamera = new AFRAME.THREE.Camera();
|
||||
AFRAME.TWEEN.Easing;
|
||||
@ -16,7 +27,7 @@ entity.setAttribute('material', 'color', 'red');
|
||||
|
||||
entity.components['geometry'].data;
|
||||
|
||||
type MyEntity = AFrame.Entity<{
|
||||
type MyEntity = Entity<{
|
||||
camera: THREE.Camera;
|
||||
material: THREE.Material;
|
||||
sound: { pause(): void };
|
||||
@ -33,29 +44,31 @@ entity.setAttribute('light', {
|
||||
intensity: 2.0
|
||||
});
|
||||
|
||||
entity.addEventListener('child-detached', (event) => {
|
||||
entity.addEventListener('child-detached', event => {
|
||||
event.detail;
|
||||
});
|
||||
|
||||
// Components
|
||||
|
||||
interface TestComponent extends AFrame.Component {
|
||||
multiply: (f: number) => number;
|
||||
// interface TestComponent extends Component {
|
||||
// multiply: (f: number) => number;
|
||||
//
|
||||
// data: {
|
||||
// myProperty: any[],
|
||||
// string: string,
|
||||
// num: number
|
||||
// };
|
||||
//
|
||||
// system: TestSystem;
|
||||
// }
|
||||
|
||||
data: {
|
||||
myProperty: any[],
|
||||
string: string,
|
||||
num: number
|
||||
};
|
||||
|
||||
system: TestSystem;
|
||||
}
|
||||
|
||||
const Component = AFRAME.registerComponent<TestComponent>('test-component', {
|
||||
const Component = registerComponent('test-component', {
|
||||
schema: {
|
||||
myProperty: {
|
||||
default: [],
|
||||
parse() { return [true]; },
|
||||
parse() {
|
||||
return [true];
|
||||
}
|
||||
},
|
||||
string: { type: 'string' },
|
||||
num: 0
|
||||
@ -69,9 +82,9 @@ const Component = AFRAME.registerComponent<TestComponent>('test-component', {
|
||||
pause() {},
|
||||
play() {},
|
||||
|
||||
multiply(this: TestComponent, f: number) {
|
||||
multiply(f: number) {
|
||||
// Reference to system because both were registered with the same name.
|
||||
return f * this.data.num * this.system.data.counter;
|
||||
return f * this.data.num * this.system!.data.counter;
|
||||
}
|
||||
});
|
||||
|
||||
@ -81,13 +94,7 @@ scene.hasLoaded;
|
||||
|
||||
// System
|
||||
|
||||
interface TestSystem extends AFrame.System {
|
||||
data: {
|
||||
counter: number;
|
||||
};
|
||||
}
|
||||
|
||||
const testSystem: AFrame.SystemDefinition<TestSystem> = {
|
||||
const testSystem: SystemDefinition = {
|
||||
schema: {
|
||||
counter: 0
|
||||
},
|
||||
@ -101,13 +108,7 @@ AFRAME.registerSystem('test-component', testSystem);
|
||||
|
||||
// Register Custom Geometry
|
||||
|
||||
interface TestGeometry extends AFrame.Geometry {
|
||||
schema: AFrame.MultiPropertySchema<{
|
||||
groupIndex: number;
|
||||
}>;
|
||||
}
|
||||
|
||||
AFRAME.registerGeometry<TestGeometry>('a-test-geometry', {
|
||||
AFRAME.registerGeometry('a-test-geometry', {
|
||||
schema: {
|
||||
groupIndex: { default: 0 }
|
||||
},
|
||||
@ -21,6 +21,7 @@
|
||||
},
|
||||
"files": [
|
||||
"index.d.ts",
|
||||
"aframe-tests.ts"
|
||||
"test/aframe-tests.ts",
|
||||
"test/aframe-io-tests.ts"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user