diff options
Diffstat (limited to 'packages/webapi/src')
27 files changed, 785 insertions, 296 deletions
diff --git a/packages/webapi/src/exclusions.ts b/packages/webapi/src/exclusions.ts index d5a00f84f..edd8274b1 100644 --- a/packages/webapi/src/exclusions.ts +++ b/packages/webapi/src/exclusions.ts @@ -1,17 +1,60 @@ -const exclusionsForHTMLElement = [ 'CustomElementsRegistry', 'HTMLElement', 'HTMLBodyElement', 'HTMLCanvasElement', 'HTMLDivElement', 'HTMLHeadElement', 'HTMLHtmlElement', 'HTMLImageElement', 'HTMLStyleElement', 'HTMLTemplateElement', 'HTMLUnknownElement', 'Image' ] -const exclusionsForElement = [ 'Element', ...exclusionsForHTMLElement ] as const -const exclusionsForDocument = [ 'CustomElementsRegistry', 'Document', 'HTMLDocument', 'document', 'customElements' ] as const -const exclusionsForNode = [ 'Node', 'DocumentFragment', 'ShadowRoot', ...exclusionsForDocument, ...exclusionsForElement ] as const -const exclusionsForEventTarget = [ 'AbortSignal', 'Event', 'CustomEvent', 'EventTarget', 'OffscreenCanvas', 'MediaQueryList', 'Window', ...exclusionsForNode ] as const -const exclusionsForEvent = [ 'AbortSignal', 'Event', 'CustomEvent', 'EventTarget', 'MediaQueryList', 'OffscreenCanvas', 'Window', ...exclusionsForNode ] as const +const exclusionsForHTMLElement = [ + 'CustomElementsRegistry', + 'HTMLElement', + 'HTMLBodyElement', + 'HTMLCanvasElement', + 'HTMLDivElement', + 'HTMLHeadElement', + 'HTMLHtmlElement', + 'HTMLImageElement', + 'HTMLStyleElement', + 'HTMLTemplateElement', + 'HTMLUnknownElement', + 'Image', +] +const exclusionsForElement = ['Element', ...exclusionsForHTMLElement] as const +const exclusionsForDocument = [ + 'CustomElementsRegistry', + 'Document', + 'HTMLDocument', + 'document', + 'customElements', +] as const +const exclusionsForNode = [ + 'Node', + 'DocumentFragment', + 'ShadowRoot', + ...exclusionsForDocument, + ...exclusionsForElement, +] as const +const exclusionsForEventTarget = [ + 'AbortSignal', + 'Event', + 'CustomEvent', + 'EventTarget', + 'OffscreenCanvas', + 'MediaQueryList', + 'Window', + ...exclusionsForNode, +] as const +const exclusionsForEvent = [ + 'AbortSignal', + 'Event', + 'CustomEvent', + 'EventTarget', + 'MediaQueryList', + 'OffscreenCanvas', + 'Window', + ...exclusionsForNode, +] as const export const exclusions = { - 'Blob+': [ 'Blob', 'File' ], + 'Blob+': ['Blob', 'File'], 'Document+': exclusionsForDocument, 'Element+': exclusionsForElement, 'Event+': exclusionsForEvent, 'EventTarget+': exclusionsForEventTarget, 'HTMLElement+': exclusionsForHTMLElement, 'Node+': exclusionsForNode, - 'StyleSheet+': [ 'StyleSheet', 'CSSStyleSheet' ], + 'StyleSheet+': ['StyleSheet', 'CSSStyleSheet'], } diff --git a/packages/webapi/src/lib/AnimationFrame.ts b/packages/webapi/src/lib/AnimationFrame.ts index 744c445bf..ef89b631e 100644 --- a/packages/webapi/src/lib/AnimationFrame.ts +++ b/packages/webapi/src/lib/AnimationFrame.ts @@ -1,9 +1,15 @@ -import { setTimeout as nodeSetTimeout, clearTimeout as nodeClearTimeout } from 'node:timers' +import { + setTimeout as nodeSetTimeout, + clearTimeout as nodeClearTimeout, +} from 'node:timers' import * as _ from './utils.js' -const INTERNAL = { tick: 0, pool: new Map } +const INTERNAL = { tick: 0, pool: new Map() } -export function requestAnimationFrame<TArgs extends any[], TFunc extends (...args: TArgs) => any>(callback: TFunc): number { +export function requestAnimationFrame< + TArgs extends any[], + TFunc extends (...args: TArgs) => any +>(callback: TFunc): number { if (!INTERNAL.pool.size) { nodeSetTimeout(() => { const next = _.__performance_now() diff --git a/packages/webapi/src/lib/CanvasRenderingContext2D.ts b/packages/webapi/src/lib/CanvasRenderingContext2D.ts index d83a227aa..082125828 100644 --- a/packages/webapi/src/lib/CanvasRenderingContext2D.ts +++ b/packages/webapi/src/lib/CanvasRenderingContext2D.ts @@ -10,11 +10,13 @@ export class CanvasRenderingContext2D { } get direction(): 'ltr' | 'rtl' | 'inherit' { - return _.internalsOf(this, 'CanvasRenderingContext2D', 'direction').direction + return _.internalsOf(this, 'CanvasRenderingContext2D', 'direction') + .direction } get fillStyle(): string { - return _.internalsOf(this, 'CanvasRenderingContext2D', 'fillStyle').fillStyle + return _.internalsOf(this, 'CanvasRenderingContext2D', 'fillStyle') + .fillStyle } get filter(): string { @@ -22,11 +24,16 @@ export class CanvasRenderingContext2D { } get globalAlpha(): number { - return _.internalsOf(this, 'CanvasRenderingContext2D', 'globalAlpha').globalAlpha + return _.internalsOf(this, 'CanvasRenderingContext2D', 'globalAlpha') + .globalAlpha } get globalCompositeOperation(): string { - return _.internalsOf(this, 'CanvasRenderingContext2D', 'globalCompositeOperation').globalCompositeOperation + return _.internalsOf( + this, + 'CanvasRenderingContext2D', + 'globalCompositeOperation' + ).globalCompositeOperation } get font(): string { @@ -34,11 +41,19 @@ export class CanvasRenderingContext2D { } get imageSmoothingEnabled(): boolean { - return _.internalsOf(this, 'CanvasRenderingContext2D', 'imageSmoothingEnabled').imageSmoothingEnabled + return _.internalsOf( + this, + 'CanvasRenderingContext2D', + 'imageSmoothingEnabled' + ).imageSmoothingEnabled } get imageSmoothingQuality(): 'low' | 'medium' | 'high' { - return _.internalsOf(this, 'CanvasRenderingContext2D', 'imageSmoothingQuality').imageSmoothingQuality + return _.internalsOf( + this, + 'CanvasRenderingContext2D', + 'imageSmoothingQuality' + ).imageSmoothingQuality } get lineCap(): 'butt' | 'round' | 'square' { @@ -46,7 +61,8 @@ export class CanvasRenderingContext2D { } get lineDashOffset(): number { - return _.internalsOf(this, 'CanvasRenderingContext2D', 'lineDashOffset').lineDashOffset + return _.internalsOf(this, 'CanvasRenderingContext2D', 'lineDashOffset') + .lineDashOffset } get lineJoin(): 'bevel' | 'round' | 'miter' { @@ -54,39 +70,54 @@ export class CanvasRenderingContext2D { } get lineWidth(): number { - return _.internalsOf(this, 'CanvasRenderingContext2D', 'lineWidth').lineWidth + return _.internalsOf(this, 'CanvasRenderingContext2D', 'lineWidth') + .lineWidth } get miterLimit(): number { - return _.internalsOf(this, 'CanvasRenderingContext2D', 'miterLimit').miterLimit + return _.internalsOf(this, 'CanvasRenderingContext2D', 'miterLimit') + .miterLimit } get strokeStyle(): string { - return _.internalsOf(this, 'CanvasRenderingContext2D', 'strokeStyle').strokeStyle + return _.internalsOf(this, 'CanvasRenderingContext2D', 'strokeStyle') + .strokeStyle } get shadowOffsetX(): number { - return _.internalsOf(this, 'CanvasRenderingContext2D', 'shadowOffsetX').shadowOffsetX + return _.internalsOf(this, 'CanvasRenderingContext2D', 'shadowOffsetX') + .shadowOffsetX } get shadowOffsetY(): number { - return _.internalsOf(this, 'CanvasRenderingContext2D', 'shadowOffsetY').shadowOffsetY + return _.internalsOf(this, 'CanvasRenderingContext2D', 'shadowOffsetY') + .shadowOffsetY } get shadowBlur(): number { - return _.internalsOf(this, 'CanvasRenderingContext2D', 'shadowBlur').shadowBlur + return _.internalsOf(this, 'CanvasRenderingContext2D', 'shadowBlur') + .shadowBlur } get shadowColor(): string { - return _.internalsOf(this, 'CanvasRenderingContext2D', 'shadowColor').shadowColor + return _.internalsOf(this, 'CanvasRenderingContext2D', 'shadowColor') + .shadowColor } get textAlign(): 'left' | 'right' | 'center' | 'start' | 'end' { - return _.internalsOf(this, 'CanvasRenderingContext2D', 'textAlign').textAlign + return _.internalsOf(this, 'CanvasRenderingContext2D', 'textAlign') + .textAlign } - get textBaseline(): 'top' | 'hanging' | 'middle' | 'alphabetic' | 'ideographic' | 'bottom' { - return _.internalsOf(this, 'CanvasRenderingContext2D', 'textBaseline').textBaseline + get textBaseline(): + | 'top' + | 'hanging' + | 'middle' + | 'alphabetic' + | 'ideographic' + | 'bottom' { + return _.internalsOf(this, 'CanvasRenderingContext2D', 'textBaseline') + .textBaseline } arc() {} @@ -104,9 +135,11 @@ export class CanvasRenderingContext2D { /** 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) + 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) } @@ -148,8 +181,12 @@ export class CanvasRenderingContext2D { _.allowStringTag(CanvasRenderingContext2D) -export const __createCanvasRenderingContext2D = (canvas: EventTarget): CanvasRenderingContext2D => { - const renderingContext2D = Object.create(CanvasRenderingContext2D.prototype) as CanvasRenderingContext2D +export const __createCanvasRenderingContext2D = ( + canvas: EventTarget +): CanvasRenderingContext2D => { + const renderingContext2D = Object.create( + CanvasRenderingContext2D.prototype + ) as CanvasRenderingContext2D _.INTERNALS.set(renderingContext2D, { canvas, @@ -179,4 +216,7 @@ export const __createCanvasRenderingContext2D = (canvas: EventTarget): CanvasRen } /** 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 +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 index 8bbcce12d..430657ffb 100644 --- a/packages/webapi/src/lib/CharacterData.ts +++ b/packages/webapi/src/lib/CharacterData.ts @@ -7,11 +7,16 @@ export class CharacterData extends Node { } as CharacterDataInternals) } get data(): string { - return _.internalsOf<CharacterDataInternals>(this, 'CharacterData', 'data').data + return _.internalsOf<CharacterDataInternals>(this, 'CharacterData', 'data') + .data } get textContent(): string { - return _.internalsOf<CharacterDataInternals>(this, 'CharacterData', 'textContent').data + return _.internalsOf<CharacterDataInternals>( + this, + 'CharacterData', + 'textContent' + ).data } } @@ -23,7 +28,11 @@ export class Text extends CharacterData { } get wholeText(): string { - return _.internalsOf<CharacterDataInternals>(this, 'CharacterData', 'textContent').data + return _.internalsOf<CharacterDataInternals>( + this, + 'CharacterData', + 'textContent' + ).data } } diff --git a/packages/webapi/src/lib/ContextEvent.ts b/packages/webapi/src/lib/ContextEvent.ts index 98cd72de5..e712c4da1 100644 --- a/packages/webapi/src/lib/ContextEvent.ts +++ b/packages/webapi/src/lib/ContextEvent.ts @@ -28,10 +28,15 @@ export type Context<T = unknown> = { } /** A helper type which can extract a Context value type from a Context type. */ -export type ContextType<T extends Context> = T extends Context<infer Y> ? Y : never +export type ContextType<T extends Context> = T extends Context<infer Y> + ? Y + : never /** A function which creates a Context value object */ -export function createContext<T>(name: string, initialValue?: T): Readonly<Context<T>> { +export function createContext<T>( + name: string, + initialValue?: T +): Readonly<Context<T>> { return { name, initialValue, diff --git a/packages/webapi/src/lib/CustomElementRegistry.ts b/packages/webapi/src/lib/CustomElementRegistry.ts index 650435c17..3f7020087 100644 --- a/packages/webapi/src/lib/CustomElementRegistry.ts +++ b/packages/webapi/src/lib/CustomElementRegistry.ts @@ -2,14 +2,29 @@ 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') + 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') + 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.constructorByName.set(name, constructor) internals.nameByConstructor.set(constructor, name) @@ -19,7 +34,11 @@ export class CustomElementRegistry { /** Returns the constructor associated with the given tag name. */ get(name: string) { - const internals = _.internalsOf<CustomElementRegistryInternals>(this, 'CustomElementRegistry', 'get') + const internals = _.internalsOf<CustomElementRegistryInternals>( + this, + 'CustomElementRegistry', + 'get' + ) name = String(name).toLowerCase() @@ -27,7 +46,11 @@ export class CustomElementRegistry { } getName(constructor: Function) { - const internals = _.internalsOf<CustomElementRegistryInternals>(this, 'CustomElementRegistry', 'getName') + const internals = _.internalsOf<CustomElementRegistryInternals>( + this, + 'CustomElementRegistry', + 'getName' + ) return internals.nameByConstructor.get(constructor) } @@ -36,23 +59,28 @@ export class CustomElementRegistry { _.allowStringTag(CustomElementRegistry) interface CustomElementRegistryInternals { - constructorByName: Map<string, Function>; - nameByConstructor: Map<Function, string>; + constructorByName: Map<string, Function> + nameByConstructor: Map<Function, string> } interface ElementDefinitionOptions { - extends?: string | undefined; + extends?: string | undefined } -export const initCustomElementRegistry = (target: Record<any, any>, exclude: Set<string>) => { +export const initCustomElementRegistry = ( + target: Record<any, any>, + exclude: Set<string> +) => { if (exclude.has('customElements')) return - const CustomElementRegistry = target.CustomElementRegistry || globalThis.CustomElementRegistry + const CustomElementRegistry = + target.CustomElementRegistry || globalThis.CustomElementRegistry - const customElements: CustomElementRegistry = target.customElements = Object.create(CustomElementRegistry.prototype) + const customElements: CustomElementRegistry = (target.customElements = + Object.create(CustomElementRegistry.prototype)) _.INTERNALS.set(customElements, { - constructorByName: new Map, - nameByConstructor: new Map, + constructorByName: new Map(), + nameByConstructor: new Map(), } as CustomElementRegistryInternals) } diff --git a/packages/webapi/src/lib/CustomEvent.ts b/packages/webapi/src/lib/CustomEvent.ts index 951ca8e81..5fca7b598 100644 --- a/packages/webapi/src/lib/CustomEvent.ts +++ b/packages/webapi/src/lib/CustomEvent.ts @@ -1,7 +1,9 @@ import * as _ from './utils' import { Event } from 'event-target-shim' -class CustomEvent<TEventType extends string = string> extends Event<TEventType> { +class CustomEvent< + TEventType extends string = string +> extends Event<TEventType> { constructor(type: TEventType, params?: CustomEventInit) { params = Object(params) as Required<CustomEventInit> diff --git a/packages/webapi/src/lib/Document.ts b/packages/webapi/src/lib/Document.ts index 867cc4448..79f9b36fd 100644 --- a/packages/webapi/src/lib/Document.ts +++ b/packages/webapi/src/lib/Document.ts @@ -4,15 +4,27 @@ import { TreeWalker } from './TreeWalker' export class Document extends Node { createElement(name: string) { - const internals = _.internalsOf<DocumentInternals>(this, 'Document', 'createElement') + const internals = _.internalsOf<DocumentInternals>( + this, + 'Document', + 'createElement' + ) - const customElementInternals: CustomElementRegistryInternals = _.INTERNALS.get(internals.target.customElements) + 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 TypeOfHTMLElement = + internals.constructorByName.get(name) || + (customElementInternals && + customElementInternals.constructorByName.get(name)) || + HTMLUnknownElement - const element = Object.setPrototypeOf(new EventTarget(), TypeOfHTMLElement.prototype) as HTMLElement + const element = Object.setPrototypeOf( + new EventTarget(), + TypeOfHTMLElement.prototype + ) as HTMLElement _.INTERNALS.set(element, { attributes: {}, @@ -25,10 +37,20 @@ export class Document extends Node { return element } - createNodeIterator(root: Node, whatToShow: number = NodeFilter.SHOW_ALL, filter?: NodeIteratorInternals['filter']) { + 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) + _.INTERNALS.set(target, { + filter, + pointerBeforeReferenceNode: false, + referenceNode: root, + root, + whatToShow, + } as NodeIteratorInternals) return target } @@ -37,10 +59,20 @@ export class Document extends Node { return new Text(data) } - createTreeWalker(root: Node, whatToShow: number = NodeFilter.SHOW_ALL, filter?: NodeFilter, expandEntityReferences?: boolean) { + 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) + _.INTERNALS.set(target, { + filter, + currentNode: root, + root, + whatToShow, + } as TreeWalkerInternals) return target } @@ -69,7 +101,10 @@ export const initDocument = (target: Target, exclude: Set<string>) => { const EventTarget = target.EventTarget || globalThis.EventTarget const HTMLDocument = target.HTMLDocument || globalThis.HTMLDocument - const document: HTMLDocument = target.document = Object.setPrototypeOf(new EventTarget(), HTMLDocument.prototype) + const document: HTMLDocument = (target.document = Object.setPrototypeOf( + new EventTarget(), + HTMLDocument.prototype + )) _.INTERNALS.set(document, { target, @@ -83,7 +118,7 @@ export const initDocument = (target: Target, exclude: Set<string>) => { ['span', target.HTMLSpanElement], ['style', target.HTMLStyleElement], ]), - nameByConstructor: new Map, + nameByConstructor: new Map(), } as DocumentInternals) const initElement = (name: string, Class: Function) => { @@ -102,7 +137,10 @@ export const initDocument = (target: Target, exclude: Set<string>) => { document.body = initElement('body', target.HTMLBodyElement) as HTMLBodyElement document.head = initElement('head', target.HTMLHeadElement) as HTMLHeadElement - document.documentElement = initElement('html', target.HTMLHtmlElement) as HTMLHtmlElement + document.documentElement = initElement( + 'html', + target.HTMLHtmlElement + ) as HTMLHtmlElement } interface DocumentInternals { @@ -120,7 +158,7 @@ interface CustomElementRegistryInternals { } interface ElementInternals { - attributes: { [name: string]: string }, + attributes: { [name: string]: string } localName: string ownerDocument: Document shadowRoot: ShadowRoot diff --git a/packages/webapi/src/lib/Element.ts b/packages/webapi/src/lib/Element.ts index ec096fb6d..5827a0be0 100644 --- a/packages/webapi/src/lib/Element.ts +++ b/packages/webapi/src/lib/Element.ts @@ -21,13 +21,26 @@ export class Element extends Node { } 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 (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.') @@ -36,7 +49,14 @@ export class Element extends Node { delegatesFocus: Boolean(init.delegatesFocus), } - internals.shadowRoot = internals.shadowRoot || (/^open$/.test(internals.shadowInit.mode as string) ? Object.setPrototypeOf(new EventTarget(), ShadowRoot.prototype) as ShadowRoot : null) + internals.shadowRoot = + internals.shadowRoot || + (/^open$/.test(internals.shadowInit.mode as string) + ? (Object.setPrototypeOf( + new EventTarget(), + ShadowRoot.prototype + ) as ShadowRoot) + : null) return internals.shadowRoot } @@ -58,21 +78,34 @@ export class Element extends Node { } get shadowRoot(): ShadowRoot | null { - const internals = _.internalsOf<ElementInternals>(this, 'Element', 'shadowRoot') - - return Object(internals.shadowInit).mode === 'open' ? internals.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 + return _.internalsOf<ElementInternals>(this, 'Element', 'localName') + .localName as string } get nodeName(): string { - return (_.internalsOf<ElementInternals>(this, 'Element', 'nodeName').localName as string).toUpperCase() + return ( + _.internalsOf<ElementInternals>(this, 'Element', 'nodeName') + .localName as string + ).toUpperCase() } get tagName(): string { - return (_.internalsOf<ElementInternals>(this, 'Element', 'tagName').localName as string).toUpperCase() + return ( + _.internalsOf<ElementInternals>(this, 'Element', 'tagName') + .localName as string + ).toUpperCase() } } @@ -106,7 +139,7 @@ _.allowStringTag(HTMLTemplateElement) _.allowStringTag(HTMLUnknownElement) export interface ElementInternals { - attributes: { [name: string]: string }, + attributes: { [name: string]: string } localName?: string shadowRoot: ShadowRoot | null shadowInit: ShadowRootInit | void @@ -115,4 +148,4 @@ export interface ElementInternals { export interface ShadowRootInit { mode: 'open' | 'closed' delegatesFocus: boolean -}
\ No newline at end of file +} diff --git a/packages/webapi/src/lib/HTMLCanvasElement.ts b/packages/webapi/src/lib/HTMLCanvasElement.ts index 2558490a4..b5deda6aa 100644 --- a/packages/webapi/src/lib/HTMLCanvasElement.ts +++ b/packages/webapi/src/lib/HTMLCanvasElement.ts @@ -9,7 +9,8 @@ export class HTMLCanvasElement extends HTMLElement { } set height(value) { - _.internalsOf(this, 'HTMLCanvasElement', 'height').height = Number(value) || 0 + _.internalsOf(this, 'HTMLCanvasElement', 'height').height = + Number(value) || 0 } get width(): number { @@ -24,8 +25,14 @@ export class HTMLCanvasElement extends HTMLElement { return null } - getContext(contextType: PredefinedContextId): CanvasRenderingContext2D | null { - const internals = _.internalsOf<HTMLCanvasElementInternals>(this, 'HTMLCanvasElement', 'getContext') + getContext( + contextType: PredefinedContextId + ): CanvasRenderingContext2D | null { + const internals = _.internalsOf<HTMLCanvasElementInternals>( + this, + 'HTMLCanvasElement', + 'getContext' + ) switch (contextType) { case '2d': @@ -54,4 +61,9 @@ interface HTMLCanvasElementInternals { renderingContext2D: CanvasRenderingContext2D } -type PredefinedContextId = '2d' | 'bitmaprenderer' | 'webgl' | 'webgl2' | 'webgpu' +type PredefinedContextId = + | '2d' + | 'bitmaprenderer' + | 'webgl' + | 'webgl2' + | 'webgpu' diff --git a/packages/webapi/src/lib/IdleCallback.ts b/packages/webapi/src/lib/IdleCallback.ts index 0d0f25bdf..2f5700e18 100644 --- a/packages/webapi/src/lib/IdleCallback.ts +++ b/packages/webapi/src/lib/IdleCallback.ts @@ -1,9 +1,15 @@ -import { setTimeout as nodeSetTimeout, clearTimeout as nodeClearTimeout } from 'node:timers' +import { + setTimeout as nodeSetTimeout, + clearTimeout as nodeClearTimeout, +} from 'node:timers' import * as _ from './utils.js' -const INTERNAL = { tick: 0, pool: new Map } +const INTERNAL = { tick: 0, pool: new Map() } -export function requestIdleCallback<TArgs extends any[], TFunc extends (...args: TArgs) => any>(callback: TFunc): number { +export function requestIdleCallback< + TArgs extends any[], + TFunc extends (...args: TArgs) => any +>(callback: TFunc): number { if (!INTERNAL.pool.size) { nodeSetTimeout(() => { const next = _.__performance_now() diff --git a/packages/webapi/src/lib/ImageData.ts b/packages/webapi/src/lib/ImageData.ts index 776213880..595b5023f 100644 --- a/packages/webapi/src/lib/ImageData.ts +++ b/packages/webapi/src/lib/ImageData.ts @@ -1,20 +1,36 @@ 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.`) + 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) + const d = hasData + ? (arg0 as Uint8ClampedArray) + : new Uint8ClampedArray( + asNumber(arg0, 'width') * asNumber(arg1, 'height') * 4 + ) /** Image width. */ const w = asNumber(hasData ? arg1 : arg0, 'width') @@ -23,23 +39,42 @@ export class ImageData { const h = d.length / w / 4 /** Image color space. */ - const c = String(Object(hasData ? args[1] : args[0]).colorSpace || 'srgb') as PredefinedColorSpace + 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') + 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) + 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 + return ( + Object.getOwnPropertyDescriptor(this, 'data') as { + value: Uint8ClampedArray + } + ).value } get width(): ImageDataInternals['width'] { @@ -57,7 +92,8 @@ _.allowStringTag(ImageData) 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.`) + if (value === 0) + throw new TypeError(`The source ${axis} is zero or not a number.`) return value } diff --git a/packages/webapi/src/lib/MediaQueryList.ts b/packages/webapi/src/lib/MediaQueryList.ts index 44edd89be..cc9137183 100644 --- a/packages/webapi/src/lib/MediaQueryList.ts +++ b/packages/webapi/src/lib/MediaQueryList.ts @@ -19,7 +19,10 @@ export const initMediaQueryList = (target: Target, exclude: Set<string>) => { const MediaQueryList = target.MediaQueryList || globalThis.MediaQueryList target.matchMedia = function matchMedia(media: string) { - const mql = Object.setPrototypeOf(new EventTarget(), MediaQueryList.prototype) as MediaQueryList + const mql = Object.setPrototypeOf( + new EventTarget(), + MediaQueryList.prototype + ) as MediaQueryList _.INTERNALS.set(mql, { matches: false, diff --git a/packages/webapi/src/lib/Node.ts b/packages/webapi/src/lib/Node.ts index c2f621950..464404b34 100644 --- a/packages/webapi/src/lib/Node.ts +++ b/packages/webapi/src/lib/Node.ts @@ -71,8 +71,11 @@ export class Node extends EventTarget { return null } - [Symbol.for('nodejs.util.inspect.custom')](depth: number, options: Record<string, any>) { - return `${this.constructor.name}`; + [Symbol.for('nodejs.util.inspect.custom')]( + depth: number, + options: Record<string, any> + ) { + return `${this.constructor.name}` } } @@ -88,28 +91,31 @@ export class ShadowRoot extends DocumentFragment { } } -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 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 { @@ -121,27 +127,47 @@ export class NodeIterator { } get filter(): NodeFilter { - const internals = _.internalsOf<NodeIteratorInternals>(this, 'NodeIterator', 'filter') + const internals = _.internalsOf<NodeIteratorInternals>( + this, + 'NodeIterator', + 'filter' + ) return internals.filter } get pointerBeforeReferenceNode(): boolean { - const internals = _.internalsOf<NodeIteratorInternals>(this, 'NodeIterator', 'pointerBeforeReferenceNode') + const internals = _.internalsOf<NodeIteratorInternals>( + this, + 'NodeIterator', + 'pointerBeforeReferenceNode' + ) return internals.pointerBeforeReferenceNode } get referenceNode(): Node { - const internals = _.internalsOf<NodeIteratorInternals>(this, 'NodeIterator', 'referenceNode') + const internals = _.internalsOf<NodeIteratorInternals>( + this, + 'NodeIterator', + 'referenceNode' + ) return internals.referenceNode } get root(): Node { - const internals = _.internalsOf<NodeIteratorInternals>(this, 'NodeIterator', 'root') + const internals = _.internalsOf<NodeIteratorInternals>( + this, + 'NodeIterator', + 'root' + ) return internals.root } get whatToShow(): number { - const internals = _.internalsOf<NodeIteratorInternals>(this, 'NodeIterator', 'whatToShow') + const internals = _.internalsOf<NodeIteratorInternals>( + this, + 'NodeIterator', + 'whatToShow' + ) return internals.whatToShow } } diff --git a/packages/webapi/src/lib/Object.ts b/packages/webapi/src/lib/Object.ts index 5ad5b1388..cfc1ea4a4 100644 --- a/packages/webapi/src/lib/Object.ts +++ b/packages/webapi/src/lib/Object.ts @@ -3,11 +3,12 @@ import * as _ from './utils' export const hasOwn = { hasOwn(instance: object, property: any) { return _.__object_hasOwnProperty(instance, property) - } + }, }.hasOwn export const initObject = (target: any, exclude: Set<string>) => { - if (exclude.has('Object') || exclude.has('object') || exclude.has('hasOwn')) return + if (exclude.has('Object') || exclude.has('object') || exclude.has('hasOwn')) + return const Class = target.Object || globalThis.Object @@ -15,6 +16,6 @@ export const initObject = (target: any, exclude: Set<string>) => { value: hasOwn, writable: true, enumerable: false, - configurable: true + configurable: true, }) } diff --git a/packages/webapi/src/lib/OffscreenCanvas.ts b/packages/webapi/src/lib/OffscreenCanvas.ts index 01ee5d34a..0f1f3e2fa 100644 --- a/packages/webapi/src/lib/OffscreenCanvas.ts +++ b/packages/webapi/src/lib/OffscreenCanvas.ts @@ -7,7 +7,10 @@ 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.`) + if (arguments.length < 2) + throw new TypeError( + `Failed to construct 'OffscreenCanvas': 2 arguments required.` + ) width = Number(width) || 0 height = Number(height) || 0 @@ -31,8 +34,14 @@ export class OffscreenCanvas extends EventTarget { _.internalsOf(this, 'OffscreenCanvas', 'width').width = Number(value) || 0 } - getContext(contextType: PredefinedContextId): CanvasRenderingContext2D | null { - const internals = _.internalsOf<OffscreenCanvasInternals>(this, 'HTMLCanvasElement', 'getContext') + getContext( + contextType: PredefinedContextId + ): CanvasRenderingContext2D | null { + const internals = _.internalsOf<OffscreenCanvasInternals>( + this, + 'HTMLCanvasElement', + 'getContext' + ) switch (contextType) { case '2d': @@ -54,15 +63,19 @@ export class OffscreenCanvas extends EventTarget { void quality - return Promise.resolve( - new Blob([], { type }) - ) + 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' +const getImageType = (type: string): PredefinedImageType => + type === 'image/avif' || + type === 'image/jpeg' || + type === 'image/png' || + type === 'image/webp' + ? type + : 'image/png' interface OffscreenCanvasInternals { height: number @@ -75,6 +88,15 @@ interface ConvertToBlobOptions { type: PredefinedImageType } -type PredefinedContextId = '2d' | 'bitmaprenderer' | 'webgl' | 'webgl2' | 'webgpu' - -type PredefinedImageType = 'image/avif' | 'image/jpeg' | 'image/png' | 'image/webp' +type PredefinedContextId = + | '2d' + | 'bitmaprenderer' + | 'webgl' + | 'webgl2' + | 'webgpu' + +type PredefinedImageType = + | 'image/avif' + | 'image/jpeg' + | 'image/png' + | 'image/webp' diff --git a/packages/webapi/src/lib/Promise.ts b/packages/webapi/src/lib/Promise.ts index ea2c7c419..2591fb56a 100644 --- a/packages/webapi/src/lib/Promise.ts +++ b/packages/webapi/src/lib/Promise.ts @@ -1,18 +1,16 @@ export const any = { - async any <T>( - iterable: Iterable<T | PromiseLike<T>> - ): Promise<T> { + async any<T>(iterable: Iterable<T | PromiseLike<T>>): Promise<T> { return Promise.all( - [...iterable].map(promise => { + [...iterable].map((promise) => { return new Promise((resolve, reject) => Promise.resolve(promise).then(reject, resolve) ) }) ).then( - errors => Promise.reject(errors), - value => Promise.resolve<T>(value) + (errors) => Promise.reject(errors), + (value) => Promise.resolve<T>(value) ) - } + }, }.any export const initPromise = (target: any, exclude: Set<string>) => { @@ -20,10 +18,11 @@ export const initPromise = (target: any, exclude: Set<string>) => { const Class = target.Promise || globalThis.Promise - if (!Class.any) Object.defineProperty(Class, 'any', { - value: any, - writable: true, - enumerable: false, - configurable: true - }) + if (!Class.any) + Object.defineProperty(Class, 'any', { + value: any, + writable: true, + enumerable: false, + configurable: true, + }) } diff --git a/packages/webapi/src/lib/RelativeIndexingMethod.ts b/packages/webapi/src/lib/RelativeIndexingMethod.ts index 56627dfc3..d88349b80 100644 --- a/packages/webapi/src/lib/RelativeIndexingMethod.ts +++ b/packages/webapi/src/lib/RelativeIndexingMethod.ts @@ -1,32 +1,50 @@ -type TypedArray = Int8Array | Uint8Array | Uint8ClampedArray | Int16Array | Uint16Array | Int32Array | Uint32Array | Float32Array | Float64Array | BigInt64Array | BigUint64Array +type TypedArray = + | Int8Array + | Uint8Array + | Uint8ClampedArray + | Int16Array + | Uint16Array + | Int32Array + | Uint32Array + | Float32Array + | Float64Array + | BigInt64Array + | BigUint64Array export const at = { at<T extends Array<any> | string | TypedArray>(this: T, index: number) { index = Math.trunc(index) || 0 - - if (index < 0) index += this.length; - - if (index < 0 || index >= this.length) return undefined; - - return this[index]; - } + + if (index < 0) index += this.length + + if (index < 0 || index >= this.length) return undefined + + return this[index] + }, }.at -export const initRelativeIndexingMethod = (target: any, exclude: Set<string>) => { +export const initRelativeIndexingMethod = ( + target: any, + exclude: Set<string> +) => { if (exclude.has('at')) return const Classes = [] - if (!exclude.has('TypedArray')) Classes.push(Object.getPrototypeOf(target.Int8Array || globalThis.Int8Array)) + if (!exclude.has('TypedArray')) + Classes.push( + Object.getPrototypeOf(target.Int8Array || globalThis.Int8Array) + ) if (!exclude.has('Array')) Classes.push(target.Array || globalThis.Array) if (!exclude.has('String')) Classes.push(target.String || globalThis.String) for (const Class of Classes) { - if (!Class.prototype.at) Object.defineProperty(Class.prototype, 'at', { - value: at, - writable: true, - enumerable: false, - configurable: true - }) + if (!Class.prototype.at) + Object.defineProperty(Class.prototype, 'at', { + value: at, + writable: true, + enumerable: false, + configurable: true, + }) } } diff --git a/packages/webapi/src/lib/Storage.ts b/packages/webapi/src/lib/Storage.ts index 672c537c8..7f9426552 100644 --- a/packages/webapi/src/lib/Storage.ts +++ b/packages/webapi/src/lib/Storage.ts @@ -7,20 +7,35 @@ export class Storage { getItem(key: string): string | null { return getStringOrNull( - _.internalsOf<StorageInternals>(this, 'Storage', 'getItem').storage.get(String(key)) + _.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]) + 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)) + _.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)) + _.internalsOf<StorageInternals>(this, 'Storage', 'getItem').storage.set( + String(key), + String(value) + ) } get length() { @@ -28,7 +43,8 @@ export class Storage { } } -const getStringOrNull = (value: string | void) => typeof value === 'string' ? value : null +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 @@ -38,7 +54,7 @@ export const initStorage = (target: Target, exclude: Set<string>) => { const storageInternals = new Map<string, string>() _.INTERNALS.set(target.localStorage, { - storage: storageInternals + storage: storageInternals, } as StorageInternals) } diff --git a/packages/webapi/src/lib/String.ts b/packages/webapi/src/lib/String.ts index 49df3261c..92d39f39a 100644 --- a/packages/webapi/src/lib/String.ts +++ b/packages/webapi/src/lib/String.ts @@ -1,11 +1,18 @@ import * as _ from './utils' export const replaceAll = { - replaceAll(this: string, searchValue: RegExp | string, replaceValue: string | ((substring: string, ...args: any[]) => string)) { + replaceAll( + this: string, + searchValue: RegExp | string, + replaceValue: string | ((substring: string, ...args: any[]) => string) + ) { return _.__object_isPrototypeOf(RegExp.prototype, searchValue) ? this.replace(searchValue as RegExp, replaceValue as string) - : this.replace(new RegExp(_.__string_escapeRegExp(searchValue as string), 'g'), replaceValue as string) - } + : this.replace( + new RegExp(_.__string_escapeRegExp(searchValue as string), 'g'), + replaceValue as string + ) + }, }.replaceAll export const initString = (target: any, exclude: Set<string>) => { @@ -13,10 +20,11 @@ export const initString = (target: any, exclude: Set<string>) => { const Class = target.String || globalThis.String - if (!Class.prototype.replaceAll) Object.defineProperty(Class.prototype, 'replaceAll', { - value: replaceAll, - writable: true, - enumerable: false, - configurable: true - }) + if (!Class.prototype.replaceAll) + Object.defineProperty(Class.prototype, 'replaceAll', { + value: replaceAll, + writable: true, + enumerable: false, + configurable: true, + }) } diff --git a/packages/webapi/src/lib/Timeout.ts b/packages/webapi/src/lib/Timeout.ts index 53412adfd..4a25e4e73 100644 --- a/packages/webapi/src/lib/Timeout.ts +++ b/packages/webapi/src/lib/Timeout.ts @@ -1,9 +1,15 @@ -import { setTimeout as nodeSetTimeout, clearTimeout as nodeClearTimeout } from 'node:timers' +import { + setTimeout as nodeSetTimeout, + clearTimeout as nodeClearTimeout, +} from 'node:timers' import * as _ from './utils.js' -const INTERNAL = { tick: 0, pool: new Map } +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 { +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, delay, ...args) diff --git a/packages/webapi/src/lib/TreeWalker.ts b/packages/webapi/src/lib/TreeWalker.ts index 86e32ff20..423397022 100644 --- a/packages/webapi/src/lib/TreeWalker.ts +++ b/packages/webapi/src/lib/TreeWalker.ts @@ -30,17 +30,29 @@ export class TreeWalker { } get currentNode(): Node { - const internals = _.internalsOf<TreeWalkerInternals>(this, 'TreeWalker', 'currentNode') + const internals = _.internalsOf<TreeWalkerInternals>( + this, + 'TreeWalker', + 'currentNode' + ) return internals.currentNode } get root(): Node { - const internals = _.internalsOf<TreeWalkerInternals>(this, 'TreeWalker', 'root') + const internals = _.internalsOf<TreeWalkerInternals>( + this, + 'TreeWalker', + 'root' + ) return internals.root } get whatToShow(): number { - const internals = _.internalsOf<TreeWalkerInternals>(this, 'TreeWalker', 'whatToShow') + const internals = _.internalsOf<TreeWalkerInternals>( + this, + 'TreeWalker', + 'whatToShow' + ) return internals.whatToShow } } diff --git a/packages/webapi/src/lib/fetch.ts b/packages/webapi/src/lib/fetch.ts index 8ab1358e7..c62c46e30 100644 --- a/packages/webapi/src/lib/fetch.ts +++ b/packages/webapi/src/lib/fetch.ts @@ -1,74 +1,106 @@ -import { default as nodeFetch, Headers, Request, Response } from 'node-fetch/src/index.js' +import { + default as nodeFetch, + Headers, + Request, + Response, +} from 'node-fetch/src/index.js' import Stream from 'node:stream' import * as _ from './utils' export { Headers, Request, Response } export const fetch = { - fetch(resource: string | URL | Request, init?: Partial<FetchInit>): Promise<Response> { + fetch( + resource: string | URL | Request, + init?: Partial<FetchInit> + ): Promise<Response> { const resourceURL = new URL( _.__object_isPrototypeOf(Request.prototype, resource) ? (resource as Request).url - : _.pathToPosix(resource), - typeof Object(globalThis.process).cwd === 'function' ? 'file:' + _.pathToPosix(process.cwd()) + '/' : 'file:' + : _.pathToPosix(resource), + typeof Object(globalThis.process).cwd === 'function' + ? 'file:' + _.pathToPosix(process.cwd()) + '/' + : 'file:' ) if (resourceURL.protocol.toLowerCase() === 'file:') { - return import('node:fs').then( - fs => { - try { - const stats = fs.statSync(resourceURL) - const body = fs.createReadStream(resourceURL) + return import('node:fs').then((fs) => { + try { + const stats = fs.statSync(resourceURL) + const body = fs.createReadStream(resourceURL) - return new Response( - body, - { - status: 200, - statusText: '', - headers: { - 'content-length': String(stats.size), - 'date': new Date().toUTCString(), - 'last-modified': new Date(stats.mtimeMs).toUTCString(), - } - } - ) - } catch (error) { - const body = new Stream.Readable() + return new Response(body, { + status: 200, + statusText: '', + headers: { + 'content-length': String(stats.size), + date: new Date().toUTCString(), + 'last-modified': new Date(stats.mtimeMs).toUTCString(), + }, + }) + } catch (error) { + const body = new Stream.Readable() - body._read = () => {} - body.push(null) + body._read = () => {} + body.push(null) - return new Response( - body, - { - status: 404, - statusText: '', - headers: { - 'date': new Date().toUTCString(), - } - } - ) - } + return new Response(body, { + status: 404, + statusText: '', + headers: { + date: new Date().toUTCString(), + }, + }) } - ) + }) } else { return nodeFetch(resource, init) } - } + }, }.fetch -type USVString = ({} & string) +type USVString = {} & string interface FetchInit { - body: Blob | BufferSource | FormData | URLSearchParams | ReadableStream | USVString - cache: 'default' | 'no-store' | 'reload' | 'no-cache' | 'force-cache' | 'only-if-cached' + body: + | Blob + | BufferSource + | FormData + | URLSearchParams + | ReadableStream + | USVString + cache: + | 'default' + | 'no-store' + | 'reload' + | 'no-cache' + | 'force-cache' + | 'only-if-cached' credentials: 'omit' | 'same-origin' | 'include' headers: Headers | Record<string, string> - method: 'GET' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'CONNECT' | 'OPTIONS' | 'TRACE' | 'PATCH' | USVString + method: + | 'GET' + | 'HEAD' + | 'POST' + | 'PUT' + | 'DELETE' + | 'CONNECT' + | 'OPTIONS' + | 'TRACE' + | 'PATCH' + | USVString mode: 'cors' | 'no-cors' | 'same-origin' | USVString redirect: 'follow' | 'manual' | 'error' referrer: USVString - referrerPolicy: 'no-referrer' | 'no-referrer-when-downgrade' | 'same-origin' | 'origin' | 'strict-origin' | 'origin-when-cross-origin' | 'strict-origin-when-cross-origin' | 'unsafe-url' + referrerPolicy: + | 'no-referrer' + | 'no-referrer-when-downgrade' + | 'same-origin' + | 'origin' + | 'strict-origin' + | 'origin-when-cross-origin' + | 'strict-origin-when-cross-origin' + | 'unsafe-url' integrity: USVString keepalive: boolean signal: AbortSignal diff --git a/packages/webapi/src/lib/structuredClone.ts b/packages/webapi/src/lib/structuredClone.ts index e60252015..f51fb529f 100644 --- a/packages/webapi/src/lib/structuredClone.ts +++ b/packages/webapi/src/lib/structuredClone.ts @@ -1,4 +1,4 @@ -import { deserialize } from '@ungap/structured-clone/esm/deserialize.js'; -import { serialize } from '@ungap/structured-clone/esm/serialize.js'; +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 index e7c2c6115..0086f75b6 100644 --- a/packages/webapi/src/lib/utils.ts +++ b/packages/webapi/src/lib/utils.ts @@ -4,58 +4,93 @@ import { performance } from 'node:perf_hooks' export const __date_now = Date.now /** 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 +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 the function called with the specified values. */ -export const __function_call = Function.call.bind(Function.call as unknown as any) as <TArgs extends any, TFunc extends (...args: TArgs[]) => any>(callback: TFunc, thisArg: unknown, ...args: TArgs[]) => ReturnType<TFunc> +export const __function_call = Function.call.bind( + Function.call as unknown as any +) as <TArgs extends any, TFunc extends (...args: TArgs[]) => any>( + callback: TFunc, + thisArg: unknown, + ...args: TArgs[] +) => ReturnType<TFunc> /** Returns an object with the specified prototype. */ -export const __object_create = Object.create as { <T extends any = any>(value: T): any extends T ? Record<any, any> : T } +export const __object_create = Object.create as { + <T extends any = any>(value: T): any extends T ? Record<any, any> : T +} /** Returns whether an object has a property with the specified name. */ -export const __object_hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty) as { <T1 extends object, T2>(object: T1, key: T2): T2 extends keyof T1 ? true : false } +export const __object_hasOwnProperty = Function.call.bind( + Object.prototype.hasOwnProperty +) as { + <T1 extends object, T2>(object: T1, key: T2): T2 extends keyof T1 + ? true + : false +} /** Returns a string representation of an object. */ -export const __object_toString = Function.call.bind(Object.prototype.toString) as { (value: any): string } +export const __object_toString = Function.call.bind( + Object.prototype.toString +) as { (value: any): string } /** 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 } +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 /** Returns the string escaped for use inside regular expressions. */ -export const __string_escapeRegExp = (value: string) => value.replace(/[\\^$*+?.()|[\]{}]/g, '\\$&') +export const __string_escapeRegExp = (value: string) => + value.replace(/[\\^$*+?.()|[\]{}]/g, '\\$&') // @ts-ignore export const INTERNALS = new WeakMap<unknown, any>() -export const internalsOf = <T extends object>(target: T | object, className: string, propName: string): T => { +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}`) + 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 +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' -) +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') diff --git a/packages/webapi/src/polyfill.ts b/packages/webapi/src/polyfill.ts index 81df33185..cf162b649 100644 --- a/packages/webapi/src/polyfill.ts +++ b/packages/webapi/src/polyfill.ts @@ -60,7 +60,6 @@ import { WritableStreamDefaultController, WritableStreamDefaultWriter, Window, - alert, atob, btoa, @@ -72,7 +71,6 @@ import { requestIdleCallback, setTimeout, structuredClone, - initCustomElementRegistry, initDocument, initMediaQueryList, @@ -148,7 +146,6 @@ export { WritableStreamDefaultController, WritableStreamDefaultWriter, Window, - alert, atob, btoa, @@ -245,18 +242,25 @@ export const polyfill = (target: any, options?: PolyfillOptions) => { const excludeOptions = new Set( typeof Object(options).exclude === 'string' ? String(Object(options).exclude).trim().split(/\s+/) - : Array.isArray(Object(options).exclude) + : Array.isArray(Object(options).exclude) ? Object(options).exclude.reduce( - (array: string[], entry: unknown) => array.splice(array.length, 0, ...(typeof entry === 'string' ? entry.trim().split(/\s+/) : [])) && array, - [] - ) - : [] + (array: string[], entry: unknown) => + array.splice( + array.length, + 0, + ...(typeof entry === 'string' ? entry.trim().split(/\s+/) : []) + ) && array, + [] + ) + : [] ) as Set<string> // expand exclude options using exclusion shorthands for (const excludeOption of excludeOptions) { if (excludeOption in exclusions) { - for (const exclusion of exclusions[excludeOption as keyof typeof exclusions]) { + for (const exclusion of exclusions[ + excludeOption as keyof typeof exclusions + ]) { excludeOptions.add(exclusion) } } @@ -267,11 +271,16 @@ export const polyfill = (target: any, options?: PolyfillOptions) => { // skip WebAPIs that are excluded if (excludeOptions.has(name)) continue - // skip WebAPIs that are built-in + // skip WebAPIs that are built-in if (Object.hasOwnProperty.call(target, name)) continue // define WebAPIs on the target - Object.defineProperty(target, name, { configurable: true, enumerable: true, writable: true, value: webAPIs[name as keyof typeof webAPIs] }) + Object.defineProperty(target, name, { + configurable: true, + enumerable: true, + writable: true, + value: webAPIs[name as keyof typeof webAPIs], + }) } // ensure WebAPIs correctly inherit other WebAPIs @@ -288,14 +297,17 @@ export const polyfill = (target: any, options?: PolyfillOptions) => { // skip WebAPIs that are not available if (!Class || !Super) continue - // skip WebAPIs that are already inherited correctly + // skip WebAPIs that are already inherited correctly if (Object.getPrototypeOf(Class.prototype) === Super.prototype) continue // define WebAPIs inheritence Object.setPrototypeOf(Class.prototype, Super.prototype) } - if (!excludeOptions.has('HTMLDocument') && !excludeOptions.has('HTMLElement')) { + if ( + !excludeOptions.has('HTMLDocument') && + !excludeOptions.has('HTMLElement') + ) { initDocument(target, excludeOptions) if (!excludeOptions.has('CustomElementRegistry')) { diff --git a/packages/webapi/src/ponyfill.ts b/packages/webapi/src/ponyfill.ts index cbbfba909..06bf8a677 100644 --- a/packages/webapi/src/ponyfill.ts +++ b/packages/webapi/src/ponyfill.ts @@ -1,7 +1,13 @@ // @ts-check -import { AbortController, AbortSignal } from 'abort-controller/dist/abort-controller.mjs' -import { requestAnimationFrame, cancelAnimationFrame } from './lib/AnimationFrame' +import { + AbortController, + AbortSignal, +} from 'abort-controller/dist/abort-controller.mjs' +import { + requestAnimationFrame, + cancelAnimationFrame, +} from './lib/AnimationFrame' import { atob, btoa } from './lib/Base64' import { CharacterData, Comment, Text } from './lib/CharacterData' import { File, Blob } from 'fetch-blob/from.js' @@ -12,22 +18,59 @@ import { cancelIdleCallback, requestIdleCallback } from './lib/IdleCallback' import { Event, EventTarget } from 'event-target-shim' import { fetch, Headers, Request, Response } from './lib/fetch' import { FormData } from 'formdata-polyfill/esm.min.js' -import { ByteLengthQueuingStrategy, CountQueuingStrategy, ReadableByteStreamController, ReadableStream, ReadableStreamBYOBReader, ReadableStreamBYOBRequest, ReadableStreamDefaultController, ReadableStreamDefaultReader, TransformStream, WritableStream, WritableStreamDefaultController, WritableStreamDefaultWriter } from 'web-streams-polyfill/dist/ponyfill.es6.mjs' +import { + ByteLengthQueuingStrategy, + CountQueuingStrategy, + ReadableByteStreamController, + ReadableStream, + ReadableStreamBYOBReader, + ReadableStreamBYOBRequest, + ReadableStreamDefaultController, + ReadableStreamDefaultReader, + TransformStream, + WritableStream, + WritableStreamDefaultController, + WritableStreamDefaultWriter, +} from 'web-streams-polyfill/dist/ponyfill.es6.mjs' import { URLPattern } from 'urlpattern-polyfill' import { setTimeout, clearTimeout } from './lib/Timeout' import structuredClone from './lib/structuredClone' import { CanvasRenderingContext2D } from './lib/CanvasRenderingContext2D' import { CSSStyleSheet, StyleSheet } from './lib/StyleSheet' -import { CustomElementRegistry, initCustomElementRegistry } from './lib/CustomElementRegistry' +import { + CustomElementRegistry, + initCustomElementRegistry, +} from './lib/CustomElementRegistry' import { Document, HTMLDocument, initDocument } from './lib/Document' -import { DocumentFragment, Node, NodeFilter, NodeIterator, ShadowRoot } from './lib/Node' -import { Element, HTMLElement, HTMLBodyElement, HTMLDivElement, HTMLHeadElement, HTMLHtmlElement, HTMLSpanElement, HTMLStyleElement, HTMLTemplateElement, HTMLUnknownElement } from './lib/Element' +import { + DocumentFragment, + Node, + NodeFilter, + NodeIterator, + ShadowRoot, +} from './lib/Node' +import { + Element, + HTMLElement, + HTMLBodyElement, + HTMLDivElement, + HTMLHeadElement, + HTMLHtmlElement, + HTMLSpanElement, + HTMLStyleElement, + HTMLTemplateElement, + HTMLUnknownElement, +} from './lib/Element' import { HTMLCanvasElement } from './lib/HTMLCanvasElement' import { HTMLImageElement } from './lib/HTMLImageElement' import { Image } from './lib/Image' import { ImageData } from './lib/ImageData' -import { IntersectionObserver, MutationObserver, ResizeObserver } from './lib/Observer' +import { + IntersectionObserver, + MutationObserver, + ResizeObserver, +} from './lib/Observer' import { MediaQueryList, initMediaQueryList } from './lib/MediaQueryList' import { OffscreenCanvas } from './lib/OffscreenCanvas' import { Storage, initStorage } from './lib/Storage' @@ -102,7 +145,6 @@ export { WritableStreamDefaultController, WritableStreamDefaultWriter, Window, - alert, atob, btoa, @@ -114,7 +156,6 @@ export { requestIdleCallback, setTimeout, structuredClone, - initCustomElementRegistry, initDocument, initMediaQueryList, |