/* eslint-disable @typescript-eslint/no-explicit-any */ /** * Manual typings for types.js. * * Why not name this types.d.ts? Because then it won't be included in the build, * see https://stackoverflow.com/a/56440335/2747370. dts files are good for * specifying types that are only consumed in our source code, but no good for * specifying types that should be included in the output. */ import type { Color, Matrix3, Matrix4, Quaternion, Vector2, Vector3, Vector4, } from "three"; import type { MathboxNode, MathboxSelection } from "../../types"; import { Types as TypesUntyped } from "./types"; type OnInvalid = () => void; type Validate = ( value: In, target: unknown, invalid: OnInvalid ) => Out; export interface Type { validate: Validate; make(): Out; } export type Optional = T | null | undefined; export type BlendingModes = | "no" | "normal" | "add" | "subtract" | "multiply" | "custom"; export type Axes = | "x" | "y" | "z" | "w" | "W" | "H" | "D" | "I" | "width" | "height" | "depth" | "items" | 1 | 2 | 3 | 4; export type AxesWithZero = Axes | 0 | "zero" | "null"; /** * Values 'left' and 'right' correspond to -1 and +1, respectively. */ export type Alignments = "left" | "middle" | "right" | number; /** * If specified as a number, should range between -1 ("enter") to +1 ("exit"). */ export type TransitionStates = "enter" | "visible" | "exiit" | number; /** * A representation of a color. Can be: * - a string, which is parsed by THREE.Color * - a THREE.Color instance * - a number, which is interpreted as a hex value * - an array of numbers, which is interpreted as an RGB value */ type ColorDescription = string | Color | number | number[]; type Vec2Like = number | number[] | Vector2; type Vec3Like = number | number[] | Vector3; type Vec4Like = number | number[] | Vector4; export type TypeGenerators = { // Helpers nullable(type: Type): Type; nullable(type: Type, make: true): Type; array(type: Type, size?: number, value?: O): Type; // Primitives string(defaultValue?: string): Type, string>; bool(defaultValue?: boolean): Type, boolean>; number(defaultValue?: number): Type, number>; // collection-esque enum( value: E, keys: E[], map?: Record ): Type, E>; enumber( value: E | number, keys: E[], map?: Record ): Type, E | number>; // Others classes(): Type, string[]>; blending( defaultValue?: BlendingModes ): Type, BlendingModes>; anchor(defaultValue?: Alignments): Type, Alignments>; transitionState( defaultValue?: TransitionStates ): Type, TransitionStates>; // Internally, this axis type is not quite correct. When allowZero is true, the Axes enum should have an extra member. axis(value?: Axes, allowZero?: false): Type, number>; axis( value: AxesWithZero, allowZero: true ): Type, number>; select( defaultValue?: string ): Type< Optional, string | MathboxNode | MathboxSelection >; letters( type: Type, size?: number, value?: string ): Type, O[]>; int(value?: number): Type, number>; round(value?: number): Type, number>; positive(type: Type, strict?: boolean): Type; func: any; emitter: any; object: any; timestamp: any; vec2(x?: number, y?: number): Type; ivec2(x?: number, y?: number): Type; vec3(x?: number, y?: number, z?: number): Type; ivec3(x?: number, y?: number, z?: number): Type; vec4(x?: number, y?: number, z?: number, w?: number): Type; ivec4( x?: number, y?: number, z?: number, w?: number ): Type; mat3( n11?: number, n12?: number, n13?: number, n21?: number, n22?: number, n23?: number, n31?: number, n32?: number, n33?: number ): Type; mat4( n11?: number, n12?: number, n13?: number, n14?: number, n21?: number, n22?: number, n23?: number, n24?: number, n31?: number, n32?: number, n33?: number, n34?: number, n41?: number, n42?: number, n43?: number, n44?: number ): Type; quat( x?: number, y?: number, z?: number, w?: number ): Type; color( r?: number, g?: number, b?: number, a?: number ): Type; transpose(order?: string | Axes[]): Type, number[]>; swizzle( order?: string | Axes[], size?: number ): Type, number[]>; filter: any; type: any; scale: any; mapping: any; indexing: any; shape: any; join: any; stroke: any; vertexPass: any; fragmentPass: any; ease: any; fit: any; font: any; data: any; }; export const Types: TypeGenerators = TypesUntyped; type Emit = (...xyzw: number[]) => void; export type ArrayEmitter = ( emit: Emit, i: number, t: number, delta: number ) => void; export type IntervalEmitter = ( emit: Emit, x: number, i: number, t: number, delta: number ) => void; export type MatrixEmitter = ( emit: Emit, i: number, j: number, t: number, delta: number ) => void; export type AreaEmitter = ( emit: Emit, x: number, y: number, i: number, j: number, t: number, delta: number ) => void; export type VoxelEmitter = ( emit: Emit, i: number, j: number, k: number, t: number, delta: number ) => void; export type VolumeEmitter = ( emit: Emit, x: number, y: number, z: number, i: number, j: number, k: number, t: number, delta: number ) => void;