diff options
Diffstat (limited to 'packages/webapi/src/lib')
25 files changed, 0 insertions, 1761 deletions
diff --git a/packages/webapi/src/lib/Alert.ts b/packages/webapi/src/lib/Alert.ts deleted file mode 100644 index 0aacd645f..000000000 --- a/packages/webapi/src/lib/Alert.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function alert(...messages: any[]) { - console.log(...messages) -} diff --git a/packages/webapi/src/lib/AnimationFrame.ts b/packages/webapi/src/lib/AnimationFrame.ts deleted file mode 100644 index e29d3cabf..000000000 --- a/packages/webapi/src/lib/AnimationFrame.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { - clearTimeout as nodeClearTimeout, - setTimeout as nodeSetTimeout, -} from 'node:timers' -import * as _ from './utils.js' - -const INTERNAL = { tick: 0, pool: new Map() } - -export function requestAnimationFrame< - TArgs extends any[], - TFunc extends (...args: TArgs) => any ->(callback: TFunc): number { - if (!INTERNAL.pool.size) { - nodeSetTimeout(() => { - const next = _.__performance_now() - - for (const func of INTERNAL.pool.values()) { - func(next) - } - - INTERNAL.pool.clear() - }, 1000 / 16) - } - - const func = _.__function_bind(callback, undefined) - const tick = ++INTERNAL.tick - - INTERNAL.pool.set(tick, func) - - return tick -} - -export function cancelAnimationFrame(requestId: number): void { - const timeout = INTERNAL.pool.get(requestId) - - if (timeout) { - nodeClearTimeout(timeout) - - INTERNAL.pool.delete(requestId) - } -} diff --git a/packages/webapi/src/lib/CanvasRenderingContext2D.ts b/packages/webapi/src/lib/CanvasRenderingContext2D.ts deleted file mode 100644 index 147a80ca9..000000000 --- a/packages/webapi/src/lib/CanvasRenderingContext2D.ts +++ /dev/null @@ -1,222 +0,0 @@ -import type { HTMLCanvasElement } from './HTMLCanvasElement' -import type { OffscreenCanvas } from './OffscreenCanvas' - -import { ImageData } from './ImageData' -import * as _ from './utils' - -export class CanvasRenderingContext2D { - get canvas(): HTMLCanvasElement | OffscreenCanvas | null { - return _.internalsOf(this, 'CanvasRenderingContext2D', 'canvas').canvas - } - - get direction(): 'ltr' | 'rtl' | 'inherit' { - return _.internalsOf(this, 'CanvasRenderingContext2D', 'direction') - .direction - } - - get fillStyle(): string { - return _.internalsOf(this, 'CanvasRenderingContext2D', 'fillStyle') - .fillStyle - } - - get filter(): string { - return _.internalsOf(this, 'CanvasRenderingContext2D', 'filter').filter - } - - get globalAlpha(): number { - return _.internalsOf(this, 'CanvasRenderingContext2D', 'globalAlpha') - .globalAlpha - } - - get globalCompositeOperation(): string { - return _.internalsOf( - this, - 'CanvasRenderingContext2D', - 'globalCompositeOperation' - ).globalCompositeOperation - } - - get font(): string { - return _.internalsOf(this, 'CanvasRenderingContext2D', 'font').font - } - - get imageSmoothingEnabled(): boolean { - return _.internalsOf( - this, - 'CanvasRenderingContext2D', - 'imageSmoothingEnabled' - ).imageSmoothingEnabled - } - - get imageSmoothingQuality(): 'low' | 'medium' | 'high' { - return _.internalsOf( - this, - 'CanvasRenderingContext2D', - 'imageSmoothingQuality' - ).imageSmoothingQuality - } - - get lineCap(): 'butt' | 'round' | 'square' { - return _.internalsOf(this, 'CanvasRenderingContext2D', 'lineCap').lineCap - } - - get lineDashOffset(): number { - return _.internalsOf(this, 'CanvasRenderingContext2D', 'lineDashOffset') - .lineDashOffset - } - - get lineJoin(): 'bevel' | 'round' | 'miter' { - return _.internalsOf(this, 'CanvasRenderingContext2D', 'lineJoin').lineJoin - } - - get lineWidth(): number { - return _.internalsOf(this, 'CanvasRenderingContext2D', 'lineWidth') - .lineWidth - } - - get miterLimit(): number { - return _.internalsOf(this, 'CanvasRenderingContext2D', 'miterLimit') - .miterLimit - } - - get strokeStyle(): string { - return _.internalsOf(this, 'CanvasRenderingContext2D', 'strokeStyle') - .strokeStyle - } - - get shadowOffsetX(): number { - return _.internalsOf(this, 'CanvasRenderingContext2D', 'shadowOffsetX') - .shadowOffsetX - } - - get shadowOffsetY(): number { - return _.internalsOf(this, 'CanvasRenderingContext2D', 'shadowOffsetY') - .shadowOffsetY - } - - get shadowBlur(): number { - return _.internalsOf(this, 'CanvasRenderingContext2D', 'shadowBlur') - .shadowBlur - } - - get shadowColor(): string { - return _.internalsOf(this, 'CanvasRenderingContext2D', 'shadowColor') - .shadowColor - } - - get textAlign(): 'left' | 'right' | 'center' | 'start' | 'end' { - return _.internalsOf(this, 'CanvasRenderingContext2D', 'textAlign') - .textAlign - } - - get textBaseline(): - | 'top' - | 'hanging' - | 'middle' - | 'alphabetic' - | 'ideographic' - | 'bottom' { - return _.internalsOf(this, 'CanvasRenderingContext2D', 'textBaseline') - .textBaseline - } - - arc() {} - arcTo() {} - beginPath() {} - bezierCurveTo() {} - clearRect() {} - clip() {} - closePath() {} - - createImageData(width: number, height: number): void - createImageData(imagedata: ImageData): void - - createImageData(arg0: number | ImageData, arg1?: void | number) { - /** Whether ImageData is provided. */ - const hasData = _.__object_isPrototypeOf(ImageData.prototype, arg0) - - const w = hasData ? (arg0 as ImageData).width : (arg0 as number) - const h = hasData ? (arg0 as ImageData).height : (arg1 as number) - const d = hasData - ? (arg0 as ImageData).data - : new Uint8ClampedArray(w * h * 4) - - return new ImageData(d, w, h) - } - - createLinearGradient() {} - createPattern() {} - createRadialGradient() {} - drawFocusIfNeeded() {} - drawImage() {} - ellipse() {} - fill() {} - fillRect() {} - fillText() {} - getContextAttributes() {} - getImageData() {} - getLineDash() {} - getTransform() {} - isPointInPath() {} - isPointInStroke() {} - lineTo() {} - measureText() {} - moveTo() {} - putImageData() {} - quadraticCurveTo() {} - rect() {} - resetTransform() {} - restore() {} - rotate() {} - save() {} - scale() {} - setLineDash() {} - setTransform() {} - stroke() {} - strokeRect() {} - strokeText() {} - transform() {} - translate() {} -} - -_.allowStringTag(CanvasRenderingContext2D) - -export const __createCanvasRenderingContext2D = ( - canvas: EventTarget -): CanvasRenderingContext2D => { - const renderingContext2D = Object.create( - CanvasRenderingContext2D.prototype - ) as CanvasRenderingContext2D - - _.INTERNALS.set(renderingContext2D, { - canvas, - direction: 'inherit', - fillStyle: '#000', - filter: 'none', - font: '10px sans-serif', - globalAlpha: 0, - globalCompositeOperation: 'source-over', - imageSmoothingEnabled: false, - imageSmoothingQuality: 'high', - lineCap: 'butt', - lineDashOffset: 0.0, - lineJoin: 'miter', - lineWidth: 1.0, - miterLimit: 10.0, - shadowBlur: 0, - shadowColor: '#000', - shadowOffsetX: 0, - shadowOffsetY: 0, - strokeStyle: '#000', - textAlign: 'start', - textBaseline: 'alphabetic', - }) - - return renderingContext2D -} - -/** Returns whether the value is an instance of ImageData. */ -const isImageData = <T>(value: T) => - (Object(value).data instanceof Uint8ClampedArray) as T extends ImageData - ? true - : false diff --git a/packages/webapi/src/lib/CharacterData.ts b/packages/webapi/src/lib/CharacterData.ts deleted file mode 100644 index 430657ffb..000000000 --- a/packages/webapi/src/lib/CharacterData.ts +++ /dev/null @@ -1,45 +0,0 @@ -import * as _ from './utils' - -export class CharacterData extends Node { - constructor(data: string) { - _.INTERNALS.set(super(), { - data: String(data), - } as CharacterDataInternals) - } - get data(): string { - return _.internalsOf<CharacterDataInternals>(this, 'CharacterData', 'data') - .data - } - - get textContent(): string { - return _.internalsOf<CharacterDataInternals>( - this, - 'CharacterData', - 'textContent' - ).data - } -} - -export class Comment extends CharacterData {} - -export class Text extends CharacterData { - get assignedSlot(): HTMLSlotElement | null { - return null - } - - get wholeText(): string { - return _.internalsOf<CharacterDataInternals>( - this, - 'CharacterData', - 'textContent' - ).data - } -} - -_.allowStringTag(CharacterData) -_.allowStringTag(Text) -_.allowStringTag(Comment) - -interface CharacterDataInternals { - data: string -} diff --git a/packages/webapi/src/lib/CustomElementRegistry.ts b/packages/webapi/src/lib/CustomElementRegistry.ts deleted file mode 100644 index 21f775d5e..000000000 --- a/packages/webapi/src/lib/CustomElementRegistry.ts +++ /dev/null @@ -1,92 +0,0 @@ -import * as _ from './utils' - -export class CustomElementRegistry { - /** Defines a new custom element using the given tag name and HTMLElement constructor. */ - define( - name: string, - constructor: Function, - options?: ElementDefinitionOptions - ) { - const internals = _.internalsOf<CustomElementRegistryInternals>( - this, - 'CustomElementRegistry', - 'define' - ) - - name = String(name) - - if (/[A-Z]/.test(name)) - throw new SyntaxError( - 'Custom element name cannot contain an uppercase ASCII letter' - ) - if (!/^[a-z]/.test(name)) - throw new SyntaxError( - 'Custom element name must have a lowercase ASCII letter as its first character' - ) - if (!/-/.test(name)) - throw new SyntaxError('Custom element name must contain a hyphen') - - _.INTERNALS.set(constructor, { - attributes: {}, - localName: name, - } as any) - - internals.constructorByName.set(name, constructor) - internals.nameByConstructor.set(constructor, name) - - void options - } - - /** Returns the constructor associated with the given tag name. */ - get(name: string) { - const internals = _.internalsOf<CustomElementRegistryInternals>( - this, - 'CustomElementRegistry', - 'get' - ) - - name = String(name).toLowerCase() - - return internals.constructorByName.get(name) - } - - getName(constructor: Function) { - const internals = _.internalsOf<CustomElementRegistryInternals>( - this, - 'CustomElementRegistry', - 'getName' - ) - - return internals.nameByConstructor.get(constructor) - } -} - -_.allowStringTag(CustomElementRegistry) - -interface CustomElementRegistryInternals { - constructorByName: Map<string, Function> - nameByConstructor: Map<Function, string> -} - -interface ElementDefinitionOptions { - extends?: string | undefined -} - -export const initCustomElementRegistry = ( - target: Record<any, any>, - exclude: Set<string> -) => { - if (exclude.has('customElements')) return - - const CustomElementRegistry = - target.CustomElementRegistry || globalThis.CustomElementRegistry - - const customElements: CustomElementRegistry = - target.customElements || - (target.customElements = new CustomElementRegistry()) - - _.INTERNALS.set(customElements, { - constructorByName: new Map(), - nameByConstructor: new Map(), - } as CustomElementRegistryInternals) -} diff --git a/packages/webapi/src/lib/CustomEvent.ts b/packages/webapi/src/lib/CustomEvent.ts deleted file mode 100644 index 1269b7216..000000000 --- a/packages/webapi/src/lib/CustomEvent.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Event } from 'event-target-shim' -import * as _ from './utils' - -class CustomEvent< - TEventType extends string = string -> extends Event<TEventType> { - constructor(type: TEventType, params?: CustomEventInit) { - params = Object(params) as Required<CustomEventInit> - - super(type, params) - - if ('detail' in params) this.detail = params.detail - } - - detail!: any -} - -_.allowStringTag(CustomEvent) - -export { CustomEvent } - -interface CustomEventInit { - bubbles?: boolean - cancelable?: false - detail?: any -} diff --git a/packages/webapi/src/lib/DOMException.ts b/packages/webapi/src/lib/DOMException.ts deleted file mode 100644 index 539871c6b..000000000 --- a/packages/webapi/src/lib/DOMException.ts +++ /dev/null @@ -1,40 +0,0 @@ -import * as _ from './utils' - -export class DOMException extends Error { - constructor(message = '', name = 'Error') { - super(message) - - this.code = 0 - this.name = name - } - - code!: number - - static INDEX_SIZE_ERR = 1 - static DOMSTRING_SIZE_ERR = 2 - static HIERARCHY_REQUEST_ERR = 3 - static WRONG_DOCUMENT_ERR = 4 - static INVALID_CHARACTER_ERR = 5 - static NO_DATA_ALLOWED_ERR = 6 - static NO_MODIFICATION_ALLOWED_ERR = 7 - static NOT_FOUND_ERR = 8 - static NOT_SUPPORTED_ERR = 9 - static INUSE_ATTRIBUTE_ERR = 10 - static INVALID_STATE_ERR = 11 - static SYNTAX_ERR = 12 - static INVALID_MODIFICATION_ERR = 13 - static NAMESPACE_ERR = 14 - static INVALID_ACCESS_ERR = 15 - static VALIDATION_ERR = 16 - static TYPE_MISMATCH_ERR = 17 - static SECURITY_ERR = 18 - static NETWORK_ERR = 19 - static ABORT_ERR = 20 - static URL_MISMATCH_ERR = 21 - static QUOTA_EXCEEDED_ERR = 22 - static TIMEOUT_ERR = 23 - static INVALID_NODE_TYPE_ERR = 24 - static DATA_CLONE_ERR = 25 -} - -_.allowStringTag(DOMException) diff --git a/packages/webapi/src/lib/Document.ts b/packages/webapi/src/lib/Document.ts deleted file mode 100644 index b9c30b3a3..000000000 --- a/packages/webapi/src/lib/Document.ts +++ /dev/null @@ -1,197 +0,0 @@ -import { Text } from './CharacterData' -import { TreeWalker } from './TreeWalker' -import * as _ from './utils' - -export class Document extends Node { - createElement(name: string) { - const internals = _.internalsOf<DocumentInternals>( - this, - 'Document', - 'createElement' - ) - - const customElementInternals: CustomElementRegistryInternals = - _.INTERNALS.get(internals.target.customElements) - - name = String(name).toLowerCase() - - const TypeOfHTMLElement = - internals.constructorByName.get(name) || - (customElementInternals && - customElementInternals.constructorByName.get(name)) || - HTMLUnknownElement - - const element = Object.setPrototypeOf( - new EventTarget(), - TypeOfHTMLElement.prototype - ) as HTMLElement - - _.INTERNALS.set(element, { - attributes: {}, - localName: name, - ownerDocument: this, - shadowInit: null as unknown as ShadowRootInit, - shadowRoot: null as unknown as ShadowRoot, - } as ElementInternals) - - return element - } - - createNodeIterator( - root: Node, - whatToShow: number = NodeFilter.SHOW_ALL, - filter?: NodeIteratorInternals['filter'] - ) { - const target = Object.create(NodeIterator.prototype) - - _.INTERNALS.set(target, { - filter, - pointerBeforeReferenceNode: false, - referenceNode: root, - root, - whatToShow, - } as NodeIteratorInternals) - - return target - } - - createTextNode(data: string) { - return new Text(data) - } - - createTreeWalker( - root: Node, - whatToShow: number = NodeFilter.SHOW_ALL, - filter?: NodeFilter, - expandEntityReferences?: boolean - ) { - const target = Object.create(TreeWalker.prototype) - - _.INTERNALS.set(target, { - filter, - currentNode: root, - root, - whatToShow, - } as TreeWalkerInternals) - - return target - } - - get adoptedStyleSheets(): StyleSheet[] { - return [] - } - - get styleSheets(): StyleSheet[] { - return [] - } - - body!: HTMLBodyElement - documentElement!: HTMLHtmlElement - head!: HTMLHeadElement -} - -export class HTMLDocument extends Document {} - -_.allowStringTag(Document) -_.allowStringTag(HTMLDocument) - -export const initDocument = (target: Target, exclude: Set<string>) => { - if (exclude.has('document')) return - - const EventTarget = target.EventTarget || globalThis.EventTarget - const HTMLDocument = target.HTMLDocument || globalThis.HTMLDocument - - const document: HTMLDocument = (target.document = Object.setPrototypeOf( - new EventTarget(), - HTMLDocument.prototype - )) - - _.INTERNALS.set(document, { - target, - constructorByName: new Map<string, Function>([ - ['body', target.HTMLBodyElement], - ['canvas', target.HTMLCanvasElement], - ['div', target.HTMLDivElement], - ['head', target.HTMLHeadElement], - ['html', target.HTMLHtmlElement], - ['img', target.HTMLImageElement], - ['span', target.HTMLSpanElement], - ['style', target.HTMLStyleElement], - ]), - nameByConstructor: new Map(), - } as DocumentInternals) - - const initElement = (name: string, Class: Function) => { - const target = Object.setPrototypeOf(new EventTarget(), Class.prototype) - - _.INTERNALS.set(target, { - attributes: {}, - localName: name, - ownerDocument: document, - shadowRoot: null as unknown as ShadowRoot, - shadowInit: null as unknown as ShadowRootInit, - } as ElementInternals) - - return target - } - - document.body = initElement('body', target.HTMLBodyElement) as HTMLBodyElement - document.head = initElement('head', target.HTMLHeadElement) as HTMLHeadElement - document.documentElement = initElement( - 'html', - target.HTMLHtmlElement - ) as HTMLHtmlElement -} - -interface DocumentInternals { - body: HTMLBodyElement - documentElement: HTMLHtmlElement - head: HTMLHeadElement - constructorByName: Map<string, Function> - nameByConstructor: Map<Function, string> - target: Target -} - -interface CustomElementRegistryInternals { - constructorByName: Map<string, Function> - nameByConstructor: Map<Function, string> -} - -interface ElementInternals { - attributes: { [name: string]: string } - localName: string - ownerDocument: Document - shadowRoot: ShadowRoot - shadowInit: ShadowRootInit -} - -interface ShadowRootInit extends Record<any, any> { - mode?: string -} - -interface Target extends Record<any, any> { - HTMLBodyElement: typeof HTMLBodyElement - HTMLDivElement: typeof HTMLDivElement - HTMLElement: typeof HTMLElement - HTMLHeadElement: typeof HTMLHeadElement - HTMLHtmlElement: typeof HTMLHtmlElement - HTMLSpanElement: typeof HTMLSpanElement - HTMLStyleElement: typeof HTMLStyleElement - customElements: CustomElementRegistry - document: DocumentInternals -} - -interface NodeIteratorInternals { - filter: NodeFilter - pointerBeforeReferenceNode: boolean - referenceNode: Node - root: Node - whatToShow: number -} - -interface TreeWalkerInternals { - filter: NodeFilter - currentNode: Node - root: Node - whatToShow: number -} diff --git a/packages/webapi/src/lib/Element.ts b/packages/webapi/src/lib/Element.ts deleted file mode 100644 index 013571e63..000000000 --- a/packages/webapi/src/lib/Element.ts +++ /dev/null @@ -1,166 +0,0 @@ -import * as _ from './utils' - -export class Element extends Node { - constructor() { - super() - - if (_.INTERNALS.has(new.target)) { - const internals = _.internalsOf(new.target, 'Element', 'localName') - _.INTERNALS.set(this, { - attributes: {}, - localName: (internals as unknown as Element).localName, - ownerDocument: this.ownerDocument, - shadowInit: null as unknown as ShadowRootInit, - shadowRoot: null as unknown as ShadowRoot, - } as ElementInternals) - } - } - - hasAttribute(name: string): boolean { - void name - - return false - } - - getAttribute(name: string): string | null { - return null - } - - setAttribute(name: string, value: string): void { - void name - void value - } - - removeAttribute(name: string): void { - void name - } - - attachShadow(init: Partial<ShadowRootInit>) { - if (arguments.length < 1) - throw new TypeError( - `Failed to execute 'attachShadow' on 'Element': 1 argument required, but only 0 present.` - ) - - if (init !== Object(init)) - throw new TypeError( - `Failed to execute 'attachShadow' on 'Element': The provided value is not of type 'ShadowRootInit'.` - ) - - if (init.mode !== 'open' && init.mode !== 'closed') - throw new TypeError( - `Failed to execute 'attachShadow' on 'Element': Failed to read the 'mode' property from 'ShadowRootInit': The provided value '${init.mode}' is not a valid enum value of type ShadowRootMode.` - ) - - const internals = _.internalsOf<ElementInternals>( - this, - 'Element', - 'attachShadow' - ) - - if (internals.shadowRoot) throw new Error('The operation is not supported.') - - internals.shadowInit = internals.shadowInit || { - mode: init.mode, - delegatesFocus: Boolean(init.delegatesFocus), - } - - internals.shadowRoot = - internals.shadowRoot || - (/^open$/.test(internals.shadowInit.mode as string) - ? (Object.setPrototypeOf( - new EventTarget(), - ShadowRoot.prototype - ) as ShadowRoot) - : null) - - return internals.shadowRoot - } - - get assignedSlot(): HTMLSlotElement | null { - return null - } - - get innerHTML(): string { - _.internalsOf<ElementInternals>(this, 'Element', 'innerHTML') - - return '' - } - - set innerHTML(value) { - _.internalsOf<ElementInternals>(this, 'Element', 'innerHTML') - - void value - } - - get shadowRoot(): ShadowRoot | null { - const internals = _.internalsOf<ElementInternals>( - this, - 'Element', - 'shadowRoot' - ) - - return Object(internals.shadowInit).mode === 'open' - ? internals.shadowRoot - : null - } - - get localName(): string { - return _.internalsOf<ElementInternals>(this, 'Element', 'localName') - .localName as string - } - - get nodeName(): string { - return ( - _.internalsOf<ElementInternals>(this, 'Element', 'nodeName') - .localName as string - ).toUpperCase() - } - - get tagName(): string { - return ( - _.internalsOf<ElementInternals>(this, 'Element', 'tagName') - .localName as string - ).toUpperCase() - } -} - -export class HTMLElement extends Element {} - -export class HTMLBodyElement extends HTMLElement {} - -export class HTMLDivElement extends HTMLElement {} - -export class HTMLHeadElement extends HTMLElement {} - -export class HTMLHtmlElement extends HTMLElement {} - -export class HTMLSpanElement extends HTMLElement {} - -export class HTMLStyleElement extends HTMLElement {} - -export class HTMLTemplateElement extends HTMLElement {} - -export class HTMLUnknownElement extends HTMLElement {} - -_.allowStringTag(Element) -_.allowStringTag(HTMLElement) -_.allowStringTag(HTMLBodyElement) -_.allowStringTag(HTMLDivElement) -_.allowStringTag(HTMLHeadElement) -_.allowStringTag(HTMLHtmlElement) -_.allowStringTag(HTMLSpanElement) -_.allowStringTag(HTMLStyleElement) -_.allowStringTag(HTMLTemplateElement) -_.allowStringTag(HTMLUnknownElement) - -export interface ElementInternals { - attributes: { [name: string]: string } - localName?: string - shadowRoot: ShadowRoot | null - shadowInit: ShadowRootInit | void -} - -export interface ShadowRootInit { - mode: 'open' | 'closed' - delegatesFocus: boolean -} diff --git a/packages/webapi/src/lib/HTMLCanvasElement.ts b/packages/webapi/src/lib/HTMLCanvasElement.ts deleted file mode 100644 index a38471498..000000000 --- a/packages/webapi/src/lib/HTMLCanvasElement.ts +++ /dev/null @@ -1,69 +0,0 @@ -import type { CanvasRenderingContext2D } from './CanvasRenderingContext2D' - -import { __createCanvasRenderingContext2D } from './CanvasRenderingContext2D' -import * as _ from './utils' - -export class HTMLCanvasElement extends HTMLElement { - get height(): number { - return _.internalsOf(this, 'HTMLCanvasElement', 'height').height - } - - set height(value) { - _.internalsOf(this, 'HTMLCanvasElement', 'height').height = - Number(value) || 0 - } - - get width(): number { - return _.internalsOf(this, 'HTMLCanvasElement', 'width').width - } - - set width(value) { - _.internalsOf(this, 'HTMLCanvasElement', 'width').width = Number(value) || 0 - } - - captureStream(): null { - return null - } - - getContext( - contextType: PredefinedContextId - ): CanvasRenderingContext2D | null { - const internals = _.internalsOf<HTMLCanvasElementInternals>( - this, - 'HTMLCanvasElement', - 'getContext' - ) - - switch (contextType) { - case '2d': - if (internals.renderingContext2D) return internals.renderingContext2D - - internals.renderingContext2D = __createCanvasRenderingContext2D(this) - - return internals.renderingContext2D - default: - return null - } - } - - toBlob() {} - - toDataURL() {} - - transferControlToOffscreen() {} -} - -_.allowStringTag(HTMLCanvasElement) - -interface HTMLCanvasElementInternals { - width: number - height: number - renderingContext2D: CanvasRenderingContext2D -} - -type PredefinedContextId = - | '2d' - | 'bitmaprenderer' - | 'webgl' - | 'webgl2' - | 'webgpu' diff --git a/packages/webapi/src/lib/HTMLImageElement.ts b/packages/webapi/src/lib/HTMLImageElement.ts deleted file mode 100644 index fd9e5f605..000000000 --- a/packages/webapi/src/lib/HTMLImageElement.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { HTMLElement } from './Element' -import * as _ from './utils' - -export class HTMLImageElement extends HTMLElement { - get src(): string { - return _.internalsOf(this, 'HTMLImageElement', 'src').src - } - - set src(value) { - const internals = _.internalsOf(this, 'HTMLImageElement', 'src') - - internals.src = String(value) - } -} - -_.allowStringTag(HTMLImageElement) diff --git a/packages/webapi/src/lib/IdleCallback.ts b/packages/webapi/src/lib/IdleCallback.ts deleted file mode 100644 index bc73f22f1..000000000 --- a/packages/webapi/src/lib/IdleCallback.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { - clearTimeout as nodeClearTimeout, - setTimeout as nodeSetTimeout, -} from 'node:timers' -import * as _ from './utils.js' - -const INTERNAL = { tick: 0, pool: new Map() } - -export function requestIdleCallback< - TArgs extends any[], - TFunc extends (...args: TArgs) => any ->(callback: TFunc): number { - if (!INTERNAL.pool.size) { - nodeSetTimeout(() => { - const next = _.__performance_now() - - for (const func of INTERNAL.pool.values()) { - func(next) - } - - INTERNAL.pool.clear() - }, 1000 / 16) - } - - const func = _.__function_bind(callback, undefined) - const tick = ++INTERNAL.tick - - INTERNAL.pool.set(tick, func) - - return tick -} - -export function cancelIdleCallback(requestId: number): void { - const timeout = INTERNAL.pool.get(requestId) - - if (timeout) { - nodeClearTimeout(timeout) - - INTERNAL.pool.delete(requestId) - } -} diff --git a/packages/webapi/src/lib/Image.ts b/packages/webapi/src/lib/Image.ts deleted file mode 100644 index c2e0a10fb..000000000 --- a/packages/webapi/src/lib/Image.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { HTMLImageElement } from './HTMLImageElement' -import * as _ from './utils' - -export function Image() { - // @ts-expect-error - _.INTERNALS.set(this, { - attributes: {}, - localName: 'img', - innerHTML: '', - shadowRoot: null, - shadowInit: null, - }) -} - -Image.prototype = HTMLImageElement.prototype diff --git a/packages/webapi/src/lib/ImageData.ts b/packages/webapi/src/lib/ImageData.ts deleted file mode 100644 index 595b5023f..000000000 --- a/packages/webapi/src/lib/ImageData.ts +++ /dev/null @@ -1,111 +0,0 @@ -import * as _ from './utils' - -export class ImageData { - constructor(width: number, height: number) - constructor(width: number, height: number, settings: ImageDataSettings) - constructor(data: Uint8ClampedArray, width: number) - constructor(data: Uint8ClampedArray, width: number, height: number) - constructor( - data: Uint8ClampedArray, - width: number, - height: number, - settings: ImageDataSettings - ) - - constructor( - arg0: number | Uint8ClampedArray, - arg1: number, - ...args: [] | [number] | [ImageDataSettings] | [number, ImageDataSettings] - ) { - if (arguments.length < 2) - throw new TypeError( - `Failed to construct 'ImageData': 2 arguments required.` - ) - - /** Whether Uint8ClampedArray data is provided. */ - const hasData = _.__object_isPrototypeOf(Uint8ClampedArray.prototype, arg0) - - /** Image data, either provided or calculated. */ - const d = hasData - ? (arg0 as Uint8ClampedArray) - : new Uint8ClampedArray( - asNumber(arg0, 'width') * asNumber(arg1, 'height') * 4 - ) - - /** Image width. */ - const w = asNumber(hasData ? arg1 : arg0, 'width') - - /** Image height. */ - const h = d.length / w / 4 - - /** Image color space. */ - const c = String( - Object(hasData ? args[1] : args[0]).colorSpace || 'srgb' - ) as PredefinedColorSpace - - // throw if a provided height does not match the calculated height - if (args.length && asNumber(args[0], 'height') !== h) - throw new DOMException( - 'height is not equal to (4 * width * height)', - 'IndexSizeError' - ) - - // throw if a provided colorspace does not match a known colorspace - if (c !== 'srgb' && c !== 'rec2020' && c !== 'display-p3') - throw new TypeError('colorSpace is not known value') - - Object.defineProperty(this, 'data', { - configurable: true, - enumerable: true, - value: d, - }) - - _.INTERNALS.set(this, { - width: w, - height: h, - colorSpace: c, - } as ImageDataInternals) - } - - get data(): Uint8ClampedArray { - _.internalsOf<ImageDataInternals>(this, 'ImageData', 'data') - - return ( - Object.getOwnPropertyDescriptor(this, 'data') as { - value: Uint8ClampedArray - } - ).value - } - - get width(): ImageDataInternals['width'] { - return _.internalsOf<ImageDataInternals>(this, 'ImageData', 'width').width - } - - get height(): ImageDataInternals['height'] { - return _.internalsOf<ImageDataInternals>(this, 'ImageData', 'height').height - } -} - -_.allowStringTag(ImageData) - -/** Returns a coerced number, optionally throwing if the number is zero-ish. */ -const asNumber = (value: any, axis: string): number => { - value = Number(value) || 0 - - if (value === 0) - throw new TypeError(`The source ${axis} is zero or not a number.`) - - return value -} - -interface ImageDataInternals { - colorSpace: PredefinedColorSpace - height: number - width: number -} - -interface ImageDataSettings { - colorSpace?: PredefinedColorSpace -} - -type PredefinedColorSpace = 'srgb' | 'rec2020' | 'display-p3' diff --git a/packages/webapi/src/lib/MediaQueryList.ts b/packages/webapi/src/lib/MediaQueryList.ts deleted file mode 100644 index cc9137183..000000000 --- a/packages/webapi/src/lib/MediaQueryList.ts +++ /dev/null @@ -1,40 +0,0 @@ -import * as _ from './utils' - -export class MediaQueryList extends EventTarget { - get matches(): boolean { - return _.internalsOf(this, 'MediaQueryList', 'matches').matches - } - - get media(): string { - return _.internalsOf(this, 'MediaQueryList', 'media').media - } -} - -_.allowStringTag(MediaQueryList) - -export const initMediaQueryList = (target: Target, exclude: Set<string>) => { - if (exclude.has('MediaQueryList') || exclude.has('matchMedia')) return - - const EventTarget = target.EventTarget || globalThis.EventTarget - const MediaQueryList = target.MediaQueryList || globalThis.MediaQueryList - - target.matchMedia = function matchMedia(media: string) { - const mql = Object.setPrototypeOf( - new EventTarget(), - MediaQueryList.prototype - ) as MediaQueryList - - _.INTERNALS.set(mql, { - matches: false, - media, - }) - - return mql - } -} - -interface Target extends Record<any, any> { - matchMedia: { - (media: string): MediaQueryList - } -} diff --git a/packages/webapi/src/lib/Node.ts b/packages/webapi/src/lib/Node.ts deleted file mode 100644 index 464404b34..000000000 --- a/packages/webapi/src/lib/Node.ts +++ /dev/null @@ -1,192 +0,0 @@ -import * as _ from './utils' - -export class Node extends EventTarget { - append(...nodesOrDOMStrings: NodeOrString[]): void { - void nodesOrDOMStrings - } - - appendChild(childNode: Node): Node { - return childNode - } - - after(...nodesOrDOMStrings: NodeOrString[]): void { - void nodesOrDOMStrings - } - - before(...nodesOrDOMStrings: NodeOrString[]): void { - void nodesOrDOMStrings - } - - prepend(...nodesOrDOMStrings: NodeOrString[]): void { - void nodesOrDOMStrings - } - - replaceChild(newChild: Node, oldChild: Node): Node { - void newChild - - return oldChild - } - - removeChild(childNode: Node): Node { - return childNode - } - - get attributes(): object { - return {} - } - - get childNodes(): Node[] { - return [] - } - - get children(): Element[] { - return [] - } - - get ownerDocument(): Node | null { - return null - } - - get nodeValue(): string { - return '' - } - - set nodeValue(value: string) { - void value - } - - get textContent(): string { - return '' - } - - set textContent(value: string) { - void value - } - - get previousElementSibling(): Node | null { - return null - } - - get nextElementSibling(): Node | null { - return null - } - - [Symbol.for('nodejs.util.inspect.custom')]( - depth: number, - options: Record<string, any> - ) { - return `${this.constructor.name}` - } -} - -export class DocumentFragment extends Node {} - -export class ShadowRoot extends DocumentFragment { - get innerHTML() { - return '' - } - - set innerHTML(value: string) { - void value - } -} - -export const NodeFilter = Object.assign( - { - NodeFilter() { - throw new TypeError('Illegal constructor') - }, - }.NodeFilter, - { - FILTER_ACCEPT: 1, - FILTER_REJECT: 2, - FILTER_SKIP: 3, - SHOW_ALL: 4294967295, - SHOW_ELEMENT: 1, - SHOW_ATTRIBUTE: 2, - SHOW_TEXT: 4, - SHOW_CDATA_SECTION: 8, - SHOW_ENTITY_REFERENCE: 16, - SHOW_ENTITY: 32, - SHOW_PROCESSING_INSTRUCTION: 64, - SHOW_COMMENT: 128, - SHOW_DOCUMENT: 256, - SHOW_DOCUMENT_TYPE: 512, - SHOW_DOCUMENT_FRAGMENT: 1024, - SHOW_NOTATION: 2048, - } -) - -export class NodeIterator { - nextNode(): Node | null { - return null - } - - previousNode(): Node | null { - return null - } - - get filter(): NodeFilter { - const internals = _.internalsOf<NodeIteratorInternals>( - this, - 'NodeIterator', - 'filter' - ) - return internals.filter - } - - get pointerBeforeReferenceNode(): boolean { - const internals = _.internalsOf<NodeIteratorInternals>( - this, - 'NodeIterator', - 'pointerBeforeReferenceNode' - ) - return internals.pointerBeforeReferenceNode - } - - get referenceNode(): Node { - const internals = _.internalsOf<NodeIteratorInternals>( - this, - 'NodeIterator', - 'referenceNode' - ) - return internals.referenceNode - } - - get root(): Node { - const internals = _.internalsOf<NodeIteratorInternals>( - this, - 'NodeIterator', - 'root' - ) - return internals.root - } - - get whatToShow(): number { - const internals = _.internalsOf<NodeIteratorInternals>( - this, - 'NodeIterator', - 'whatToShow' - ) - return internals.whatToShow - } -} - -_.allowStringTag(Node) -_.allowStringTag(NodeIterator) -_.allowStringTag(DocumentFragment) -_.allowStringTag(ShadowRoot) - -type NodeOrString = string | Node - -export interface NodeFilter { - acceptNode(node: Node): number -} - -export interface NodeIteratorInternals { - filter: NodeFilter - pointerBeforeReferenceNode: boolean - referenceNode: Node - root: Node - whatToShow: number -} diff --git a/packages/webapi/src/lib/Observer.ts b/packages/webapi/src/lib/Observer.ts deleted file mode 100644 index 845de1312..000000000 --- a/packages/webapi/src/lib/Observer.ts +++ /dev/null @@ -1,41 +0,0 @@ -import * as _ from './utils' - -export class IntersectionObserver { - disconnect() {} - - observe() {} - - takeRecords() { - return [] - } - - unobserve() {} -} - -export class MutationObserver { - disconnect() {} - - observe() {} - - takeRecords() { - return [] - } - - unobserve() {} -} - -export class ResizeObserver { - disconnect() {} - - observe() {} - - takeRecords() { - return [] - } - - unobserve() {} -} - -_.allowStringTag(MutationObserver) -_.allowStringTag(IntersectionObserver) -_.allowStringTag(ResizeObserver) diff --git a/packages/webapi/src/lib/OffscreenCanvas.ts b/packages/webapi/src/lib/OffscreenCanvas.ts deleted file mode 100644 index e799f7210..000000000 --- a/packages/webapi/src/lib/OffscreenCanvas.ts +++ /dev/null @@ -1,102 +0,0 @@ -import type { CanvasRenderingContext2D } from './CanvasRenderingContext2D' - -import { __createCanvasRenderingContext2D } from './CanvasRenderingContext2D' -import * as _ from './utils' - -export class OffscreenCanvas extends EventTarget { - constructor(width: number, height: number) { - super() - - if (arguments.length < 2) - throw new TypeError( - `Failed to construct 'OffscreenCanvas': 2 arguments required.` - ) - - width = Number(width) || 0 - height = Number(height) || 0 - - _.INTERNALS.set(this, { width, height } as OffscreenCanvasInternals) - } - - get height(): number { - return _.internalsOf(this, 'OffscreenCanvas', 'height').height - } - - set height(value) { - _.internalsOf(this, 'OffscreenCanvas', 'height').height = Number(value) || 0 - } - - get width(): number { - return _.internalsOf(this, 'OffscreenCanvas', 'width').width - } - - set width(value) { - _.internalsOf(this, 'OffscreenCanvas', 'width').width = Number(value) || 0 - } - - getContext( - contextType: PredefinedContextId - ): CanvasRenderingContext2D | null { - const internals = _.internalsOf<OffscreenCanvasInternals>( - this, - 'HTMLCanvasElement', - 'getContext' - ) - - switch (contextType) { - case '2d': - if (internals.renderingContext2D) return internals.renderingContext2D - - internals.renderingContext2D = __createCanvasRenderingContext2D(this) - - return internals.renderingContext2D - default: - return null - } - } - - convertToBlob(options: Partial<ConvertToBlobOptions>) { - options = Object(options) - - const quality = Number(options.quality) || 0 - const type = getImageType(String(options.type).trim().toLowerCase()) - - void quality - - return Promise.resolve(new Blob([], { type })) - } -} - -_.allowStringTag(OffscreenCanvas) - -const getImageType = (type: string): PredefinedImageType => - type === 'image/avif' || - type === 'image/jpeg' || - type === 'image/png' || - type === 'image/webp' - ? type - : 'image/png' - -interface OffscreenCanvasInternals { - height: number - renderingContext2D: CanvasRenderingContext2D - width: number -} - -interface ConvertToBlobOptions { - quality: number - type: PredefinedImageType -} - -type PredefinedContextId = - | '2d' - | 'bitmaprenderer' - | 'webgl' - | 'webgl2' - | 'webgpu' - -type PredefinedImageType = - | 'image/avif' - | 'image/jpeg' - | 'image/png' - | 'image/webp' diff --git a/packages/webapi/src/lib/Storage.ts b/packages/webapi/src/lib/Storage.ts deleted file mode 100644 index 7f9426552..000000000 --- a/packages/webapi/src/lib/Storage.ts +++ /dev/null @@ -1,67 +0,0 @@ -import * as _ from './utils' - -export class Storage { - clear(): void { - _.internalsOf<StorageInternals>(this, 'Storage', 'clear').storage.clear() - } - - getItem(key: string): string | null { - return getStringOrNull( - _.internalsOf<StorageInternals>(this, 'Storage', 'getItem').storage.get( - String(key) - ) - ) - } - - key(index: number): string | null { - return getStringOrNull( - [ - ..._.internalsOf<StorageInternals>( - this, - 'Storage', - 'key' - ).storage.keys(), - ][Number(index) || 0] - ) - } - - removeItem(key: string): void { - _.internalsOf<StorageInternals>(this, 'Storage', 'getItem').storage.delete( - String(key) - ) - } - - setItem(key: string, value: any): void { - _.internalsOf<StorageInternals>(this, 'Storage', 'getItem').storage.set( - String(key), - String(value) - ) - } - - get length() { - return _.internalsOf<StorageInternals>(this, 'Storage', 'size').storage.size - } -} - -const getStringOrNull = (value: string | void) => - typeof value === 'string' ? value : null - -export const initStorage = (target: Target, exclude: Set<string>) => { - if (exclude.has('Storage') || exclude.has('localStorage')) return - - target.localStorage = Object.create(Storage.prototype) - - const storageInternals = new Map<string, string>() - - _.INTERNALS.set(target.localStorage, { - storage: storageInternals, - } as StorageInternals) -} - -interface StorageInternals { - storage: Map<string, string> -} - -interface Target { - localStorage: Storage -} diff --git a/packages/webapi/src/lib/StyleSheet.ts b/packages/webapi/src/lib/StyleSheet.ts deleted file mode 100644 index d4b2d9e33..000000000 --- a/packages/webapi/src/lib/StyleSheet.ts +++ /dev/null @@ -1,24 +0,0 @@ -import * as _ from './utils' - -export class StyleSheet {} - -export class CSSStyleSheet extends StyleSheet { - async replace(text: string) { - void text - - return new CSSStyleSheet() - } - - replaceSync(text: string) { - void text - - return new CSSStyleSheet() - } - - get cssRules() { - return [] - } -} - -_.allowStringTag(StyleSheet) -_.allowStringTag(CSSStyleSheet) diff --git a/packages/webapi/src/lib/Timeout.ts b/packages/webapi/src/lib/Timeout.ts deleted file mode 100644 index 2ad4f153e..000000000 --- a/packages/webapi/src/lib/Timeout.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { - clearTimeout as nodeClearTimeout, - setTimeout as nodeSetTimeout, -} from 'node:timers' -import * as _ from './utils.js' - -const INTERNAL = { tick: 0, pool: new Map() } - -export function setTimeout< - TArgs extends any[], - TFunc extends (...args: TArgs) => any ->(callback: TFunc, delay = 0, ...args: TArgs): number { - const func = _.__function_bind(callback, globalThis) - const tick = ++INTERNAL.tick - const timeout = nodeSetTimeout(func as any, delay, ...args) - - INTERNAL.pool.set(tick, timeout) - - return tick -} - -export function clearTimeout(timeoutId: number): void { - const timeout = INTERNAL.pool.get(timeoutId) - - if (timeout) { - nodeClearTimeout(timeout) - - INTERNAL.pool.delete(timeoutId) - } -} diff --git a/packages/webapi/src/lib/TreeWalker.ts b/packages/webapi/src/lib/TreeWalker.ts deleted file mode 100644 index 423397022..000000000 --- a/packages/webapi/src/lib/TreeWalker.ts +++ /dev/null @@ -1,67 +0,0 @@ -import * as _ from './utils' - -export class TreeWalker { - parentNode(): Node | null { - return null - } - - firstChild(): Node | null { - return null - } - - lastChild(): Node | null { - return null - } - - previousSibling(): Node | null { - return null - } - - nextSibling(): Node | null { - return null - } - - previousNode(): Node | null { - return null - } - - nextNode(): Node | null { - return null - } - - get currentNode(): Node { - const internals = _.internalsOf<TreeWalkerInternals>( - this, - 'TreeWalker', - 'currentNode' - ) - return internals.currentNode - } - - get root(): Node { - const internals = _.internalsOf<TreeWalkerInternals>( - this, - 'TreeWalker', - 'root' - ) - return internals.root - } - - get whatToShow(): number { - const internals = _.internalsOf<TreeWalkerInternals>( - this, - 'TreeWalker', - 'whatToShow' - ) - return internals.whatToShow - } -} - -_.allowStringTag(TreeWalker) - -export interface TreeWalkerInternals { - filter: NodeFilter - currentNode: Node - root: Node - whatToShow: number -} diff --git a/packages/webapi/src/lib/Window.ts b/packages/webapi/src/lib/Window.ts deleted file mode 100644 index ac3312c93..000000000 --- a/packages/webapi/src/lib/Window.ts +++ /dev/null @@ -1,49 +0,0 @@ -import * as _ from './utils' - -export class Window extends EventTarget { - get self(): this { - return this - } - - get top(): this { - return this - } - - get window(): this { - return this - } - - get innerHeight(): number { - return 0 - } - - get innerWidth(): number { - return 0 - } - - get scrollX(): number { - return 0 - } - - get scrollY(): number { - return 0 - } -} - -_.allowStringTag(Window) - -export const initWindow = (target: Target, exclude: Set<string>) => { - if (exclude.has('Window') || exclude.has('window')) return - - target.window = target -} - -export interface WindowInternals { - document: null - location: URL - window: this -} - -interface Target extends Record<any, any> { - window: this -} diff --git a/packages/webapi/src/lib/structuredClone.ts b/packages/webapi/src/lib/structuredClone.ts deleted file mode 100644 index f51fb529f..000000000 --- a/packages/webapi/src/lib/structuredClone.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { deserialize } from '@ungap/structured-clone/esm/deserialize.js' -import { serialize } from '@ungap/structured-clone/esm/serialize.js' - -export default (any: any, options: any) => deserialize(serialize(any, options)) diff --git a/packages/webapi/src/lib/utils.ts b/packages/webapi/src/lib/utils.ts deleted file mode 100644 index 63a6bba7b..000000000 --- a/packages/webapi/src/lib/utils.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { performance } from 'node:perf_hooks' - -/** Returns the function bound to the given object. */ -export const __function_bind = Function.bind.bind( - Function.call as unknown as any -) as <TArgs extends any[], TFunc extends (...args: TArgs) => any>( - callback: TFunc, - thisArg: unknown, - ...args: TArgs -) => TFunc - -/** Returns whether the object prototype exists in another object. */ -export const __object_isPrototypeOf = Function.call.bind( - Object.prototype.isPrototypeOf -) as { <T1 extends object, T2>(p: T1, v: T2): T2 extends T1 ? true : false } - -/** Current high resolution millisecond timestamp. */ -export const __performance_now = performance.now as () => number - -// @ts-expect-error -export const INTERNALS = new WeakMap<unknown, any>() - -export const internalsOf = <T extends object>( - target: T | object, - className: string, - propName: string -): T => { - const internals: T = INTERNALS.get(target) - - if (!internals) - throw new TypeError( - `${className}.${propName} can only be used on instances of ${className}` - ) - - return internals -} - -export const allowStringTag = (value: any) => - (value.prototype[Symbol.toStringTag] = value.name) - -/** Returns any kind of path as a posix path. */ -export const pathToPosix = (pathname: any) => - String(pathname == null ? '' : pathname) - .replace( - // convert slashes - /\\+/g, - '/' - ) - .replace( - // prefix a slash to drive letters - /^(?=[A-Za-z]:\/)/, - '/' - ) - .replace( - // encode path characters - /%/g, - '%25' - ) - .replace(/\n/g, '%0A') - .replace(/\r/g, '%0D') - .replace(/\t/g, '%09') |