diff --git a/types/aframe/aframe-tests.ts b/types/aframe/aframe-tests.ts new file mode 100644 index 0000000000..439d314f4a --- /dev/null +++ b/types/aframe/aframe-tests.ts @@ -0,0 +1,50 @@ +// Global + +const threeCamera = new AFRAME.THREE.Camera(); +AFRAME.TWEEN.Easing; + +// Entity +const entity = document.createElement('a-entity'); +entity.emit('rotate'); +entity.emit('collide', { target: entity }); +entity.emit('sink', null, false); + +const position = entity.getAttribute('position'); +position.x; +position.y; +position.z; +entity.setAttribute('material', 'color', 'red'); + +entity.components['geometry'].data; + +type MyEntity = AFrame.Entity<{ + camera: THREE.Camera; + material: THREE.Material; + sound: { pause(): void }; +}>; +const camera = document.querySelector('a-entity[camera]').components.camera; +const material = document.querySelector('a-entity[material]').components.material; +document.querySelector('a-entity[sound]').components.sound.pause(); + +entity.getDOMAttribute('geometry').primitive; + +entity.setAttribute('light', { + type: 'spot', + distance: 30, + intensity: 2.0 +}); + +entity.addEventListener('child-detached', (event) => { + event.detail; +}); + +// Components +const Component = AFRAME.registerComponent('test', {}); + +// Scene + +const scene = document.querySelector('a-scene'); +scene.hasLoaded; + +// System +const system = scene.systems['systemName']; diff --git a/types/aframe/index.d.ts b/types/aframe/index.d.ts new file mode 100644 index 0000000000..f1f5cd7a20 --- /dev/null +++ b/types/aframe/index.d.ts @@ -0,0 +1,328 @@ +// Type definitions for AFRAME 0.5 +// Project: https://aframe.io/ +// Definitions by: Paul Shannon +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 2.3 + +/** + * Extended tests available at https://github.com/devpaul/aframe-typings.git + */ + +/// +/// + +// Globals +declare var AFRAME: AFrame.AFrameGlobal; +declare var hasNativeWebVRImplementation: boolean; + +interface NodeSelector { + querySelector(selectors: 'a-scene'): AFrame.Scene; + querySelector>(selectors: string): T; + querySelectorAll(selectors: string): NodeListOf | Element>; +} + +interface Document { + createElement(tagName: string): AFrame.Entity; +} + +// Interfaces +declare namespace AFrame { + interface ObjectMap { + [ key: string ]: T; + } + + interface AFrameGlobal { + AEntity: Entity; + ANode: ANode; + AScene: Scene; + components: { [ key: string ]: ComponentDescriptor }; + geometries: { [ key: string ]: GeometryDescriptor }; + primitives: { [ key: string ]: Entity }; + registerComponent(name: string, component: ComponentDefinition): ComponentConstructor; + registerElement(name: string, element: ANode): void; + registerGeometry(name: string, geometery: THREE.Geometry): Geometry; + registerPrimitive(name: string, primitive: PrimitiveDefinition): void; + registerShader(name: string, shader: any): void; + registerSystem(name: string, definition: SystemDefinition): void; + schema: SchemaUtils; + shaders: { [ key: string ]: ShaderDescriptor }; + systems: { [key: string]: System }; + THREE: typeof THREE; + TWEEN: typeof TWEEN; + utils: Utils; + version: string; + } + + 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 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 Behavior { + tick(): void; + } + + interface Component { + attrName?: string; + data?: any; + dependencies?: string[]; + el: Entity; + id: string; + multiple?: boolean; + name: string; + schema: Schema; + + init(): void; + pause(): void; + play(): void; + remove(): void; + tick?(time: number, timeDelta: number): void; + update(oldData: any): void; + updateSchema?(): void; + + extendSchema(update: Schema): void; + flushToDOM(): void; + } + + interface ComponentConstructor { + new (el: Entity, name: string, id: string): Component; + } + + interface ComponentDefinition { + dependencies?: string[]; + el?: Entity; + id?: string; + multiple?: boolean; + schema?: Schema; + + init?(): void; + pause?(): void; + play?(): void; + remove?(): void; + tick?(time: number, timeDelta: number): void; + update?(oldData: any): void; + updateSchema?(): void; + + [ key: string ]: any; + } + + interface ComponentDescriptor { + Component: Component; + dependencies: string[] | null; + multiple: boolean | null; + + // internal APIs2 + // parse + // parseAttrValueForCache + // schema + // stringify + // type + [ key: string ]: any; + } + + interface Coordinate { + x: number; + y: number; + z: number; + } + + interface Entity> extends ANode { + components: C; + isPlaying: boolean; + object3D: THREE.Object3D; + object3DMap: ObjectMap; + sceneEl?: Scene; + + addState(name: string): void; + flushToDOM(recursive?: boolean): void; + /** + * @deprecated since 0.4.0 + */ + getComputedAttribute(attr: string): T; + getDOMAttribute(attr: string): T; + 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(attr: string): T; + 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(type: K, listener: (event: Event & EntityEventMap[K]) => void, useCapture?: boolean): void; + addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void; + } + + type DetailEvent = Event & { detail: D }; + + interface EntityEventMap { + 'child-attached': DetailEvent<{ el: Element | Entity }>; + 'child-detached': DetailEvent<{ el: Element | Entity }>; + 'componentchanged': DetailEvent<{ name: 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 }>; + } + + interface Geometry { + name: string; + geometry: THREE.Geometry; + schema: Schema; + update(data: object): void; + [ key: string ]: any; + } + + interface GeometryDescriptor { + Geometry: Geometry; + schema: Schema; + } + + interface MultiPropertySchema { + [ key: string ]: SinglePropertySchema; + } + + interface PrimitiveDefinition { + defaultComponents?: any; // TODO cleanup type + deprecated?: boolean; + mappings?: any; // TODO cleanup type + transforms?: any; // TODO cleanup type + } + + type PropertyTypes = 'array' | 'boolean' | 'color' | 'int' | 'number' | 'selector' | + 'selectorAll' | 'src' | 'string' | 'vec2' | 'vec3' | 'vec4'; + + type SceneEvents = 'enter-vr' | 'exit-vr' | 'loaded' | 'renderstart'; + + 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; + time: number; + + enterVR(): Promise | void; + exitVR(): Promise | void; + reload(): void; + + addEventListener(type: string, listener: EventListenerOrEventListenerObject, useCapture?: boolean): void; + addEventListener(type: SceneEvents, listener: EventListener, useCapture?: boolean): void; + } + + type Schema = SinglePropertySchema | MultiPropertySchema; + + interface SchemaUtils { + isSingleProperty(schema: Schema): boolean; + process(schema: Schema): boolean; + } + + interface Shader { + name: string; + schema: Schema; + } + + interface ShaderDescriptor { + Shader: Shader; + schema: Schema; + } + + interface SinglePropertySchema { + type?: PropertyTypes; + 'default'?: T; + parse?(value: string): T; + stringify?(value: T): string; + [ key: string ]: any; + } + + interface System { + data: any; + schema: Schema; + init(): void; + pause(): void; + play(): void; + tick?(): void; + } + + interface SystemDefinition { + schema?: Schema; + init?(): void; + pause?(): void; + play?(): void; + tick?(): void; + [ key: string ]: any; + } + + 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; + } +} diff --git a/types/aframe/tsconfig.json b/types/aframe/tsconfig.json new file mode 100755 index 0000000000..9488fe8297 --- /dev/null +++ b/types/aframe/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "baseUrl": "..", + "lib": [ + "es5", + "dom", + "es2015.iterable", + "es2015.promise" + ], + "module": "commonjs", + "noImplicitAny": true, + "noImplicitThis": true, + "removeComments": false, + "sourceMap": true, + "strictNullChecks": true, + "noEmit": true, + "forceConsistentCasingInFileNames": true, + "typeRoots": [ "../" ], + "types": [ ] + }, + "files": [ + "index.d.ts", + "aframe-tests.ts" + ] +} diff --git a/types/aframe/tslint.json b/types/aframe/tslint.json new file mode 100644 index 0000000000..d88586e5bd --- /dev/null +++ b/types/aframe/tslint.json @@ -0,0 +1,3 @@ +{ + "extends": "dtslint/dt.json" +}