Skip to content

Commit 40b4382

Browse files
chearonzbjornson
authored andcommitted
use tailored types instead of extending DOM
Fixes #1656
1 parent 672104c commit 40b4382

File tree

2 files changed

+204
-60
lines changed

2 files changed

+204
-60
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ project adheres to [Semantic Versioning](http://semver.org/).
1010
### Changed
1111
### Added
1212
### Fixed
13+
* Replace triple-slash directive in types with own types to avoid polluting TS modules with globals ([#1656](https://github.com/Automattic/node-canvas/issues/1656))
1314

1415
2.10.2
1516
==================

types/index.d.ts

Lines changed: 203 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
// TypeScript Version: 3.0
2-
/// <reference lib="dom" />
32

43
import { Readable } from 'stream'
54

@@ -80,7 +79,7 @@ export class Canvas {
8079

8180
constructor(width: number, height: number, type?: 'image'|'pdf'|'svg')
8281

83-
getContext(contextId: '2d', contextAttributes?: NodeCanvasRenderingContext2DSettings): NodeCanvasRenderingContext2D
82+
getContext(contextId: '2d', contextAttributes?: NodeCanvasRenderingContext2DSettings): CanvasRenderingContext2D
8483

8584
/**
8685
* For image canvases, encodes the canvas as a PNG. For PDF canvases,
@@ -128,19 +127,126 @@ export class Canvas {
128127
toDataURL(mimeType: 'image/jpeg', quality: number, cb: (err: Error|null, result: string) => void): void
129128
}
130129

131-
declare class NodeCanvasRenderingContext2D extends CanvasRenderingContext2D {
130+
export interface TextMetrics {
131+
readonly actualBoundingBoxAscent: number;
132+
readonly actualBoundingBoxDescent: number;
133+
readonly actualBoundingBoxLeft: number;
134+
readonly actualBoundingBoxRight: number;
135+
readonly fontBoundingBoxAscent: number;
136+
readonly fontBoundingBoxDescent: number;
137+
readonly width: number;
138+
}
139+
140+
export type CanvasFillRule = 'evenodd' | 'nonzero';
141+
142+
export type GlobalCompositeOperation =
143+
| 'clear'
144+
| 'copy'
145+
| 'destination'
146+
| 'source-over'
147+
| 'destination-over'
148+
| 'source-in'
149+
| 'destination-in'
150+
| 'source-out'
151+
| 'destination-out'
152+
| 'source-atop'
153+
| 'destination-atop'
154+
| 'xor'
155+
| 'lighter'
156+
| 'normal'
157+
| 'multiply'
158+
| 'screen'
159+
| 'overlay'
160+
| 'darken'
161+
| 'lighten'
162+
| 'color-dodge'
163+
| 'color-burn'
164+
| 'hard-light'
165+
| 'soft-light'
166+
| 'difference'
167+
| 'exclusion'
168+
| 'hue'
169+
| 'saturation'
170+
| 'color'
171+
| 'luminosity'
172+
| 'saturate';
173+
174+
export type CanvasLineCap = 'butt' | 'round' | 'square';
175+
176+
export type CanvasLineJoin = 'bevel' | 'miter' | 'round';
177+
178+
export type CanvasTextBaseline = 'alphabetic' | 'bottom' | 'hanging' | 'ideographic' | 'middle' | 'top';
179+
180+
export type CanvasTextAlign = 'center' | 'end' | 'left' | 'right' | 'start';
181+
182+
export class CanvasRenderingContext2D {
183+
drawImage(image: Canvas|Image, dx: number, dy: number): void
184+
drawImage(image: Canvas|Image, dx: number, dy: number, dw: number, dh: number): void
185+
drawImage(image: Canvas|Image, sx: number, sy: number, sw: number, sh: number, dx: number, dy: number, dw: number, dh: number): void
186+
putImageData(imagedata: ImageData, dx: number, dy: number): void;
187+
putImageData(imagedata: ImageData, dx: number, dy: number, dirtyX: number, dirtyY: number, dirtyWidth: number, dirtyHeight: number): void;
188+
getImageData(sx: number, sy: number, sw: number, sh: number): ImageData;
189+
createImageData(sw: number, sh: number): ImageData;
190+
createImageData(imagedata: ImageData): ImageData;
191+
/**
192+
* For PDF canvases, adds another page. If width and/or height are omitted,
193+
* the canvas's initial size is used.
194+
*/
195+
addPage(width?: number, height?: number): void
196+
save(): void;
197+
restore(): void;
198+
rotate(angle: number): void;
199+
translate(x: number, y: number): void;
200+
transform(a: number, b: number, c: number, d: number, e: number, f: number): void;
201+
getTransform(): DOMMatrix;
202+
resetTransform(): void;
203+
setTransform(transform?: DOMMatrix): void;
204+
isPointInPath(x: number, y: number, fillRule?: CanvasFillRule): boolean;
205+
scale(x: number, y: number): void;
206+
clip(fillRule?: CanvasFillRule): void;
207+
fill(fillRule?: CanvasFillRule): void;
208+
stroke(): void;
209+
fillText(text: string, x: number, y: number, maxWidth?: number): void;
210+
strokeText(text: string, x: number, y: number, maxWidth?: number): void;
211+
fillRect(x: number, y: number, w: number, h: number): void;
212+
strokeRect(x: number, y: number, w: number, h: number): void;
213+
clearRect(x: number, y: number, w: number, h: number): void;
214+
rect(x: number, y: number, w: number, h: number): void;
215+
roundRect(x: number, y: number, w: number, h: number, radii?: number | number[]): void;
216+
measureText(text: string): TextMetrics;
217+
moveTo(x: number, y: number): void;
218+
lineTo(x: number, y: number): void;
219+
bezierCurveTo(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number): void;
220+
quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): void;
221+
beginPath(): void;
222+
closePath(): void;
223+
arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, counterclockwise?: boolean): void;
224+
arcTo(x1: number, y1: number, x2: number, y2: number, radius: number): void;
225+
ellipse(x: number, y: number, radiusX: number, radiusY: number, rotation: number, startAngle: number, endAngle: number, counterclockwise?: boolean): void;
226+
setLineDash(segments: number[]): void;
227+
getLineDash(): number[];
228+
createPattern(image: Canvas|Image, repetition: 'repeat' | 'repeat-x' | 'repeat-y' | 'no-repeat' | '' | null): CanvasPattern
229+
createLinearGradient(x0: number, y0: number, x1: number, y1: number): CanvasGradient;
230+
createRadialGradient(x0: number, y0: number, r0: number, x1: number, y1: number, r1: number): CanvasGradient;
132231
/**
133232
* _Non-standard_. Defaults to 'good'. Affects pattern (gradient, image,
134233
* etc.) rendering quality.
135234
*/
136235
patternQuality: 'fast' | 'good' | 'best' | 'nearest' | 'bilinear'
137-
138-
/**
139-
* _Non-standard_. Defaults to 'good'. Like `patternQuality`, but applies to
140-
* transformations affecting more than just patterns.
141-
*/
142-
quality: 'fast' | 'good' | 'best' | 'nearest' | 'bilinear'
143-
236+
imageSmoothingEnabled: boolean;
237+
globalCompositeOperation: GlobalCompositeOperation;
238+
globalAlpha: number;
239+
shadowColor: string;
240+
miterLimit: number;
241+
lineWidth: number;
242+
lineCap: CanvasLineCap;
243+
lineJoin: CanvasLineJoin;
244+
lineDashOffset: number;
245+
shadowOffsetX: number;
246+
shadowOffsetY: number;
247+
shadowBlur: number;
248+
/** _Non-standard_. Sets the antialiasing mode. */
249+
antialias: 'default' | 'gray' | 'none' | 'subpixel'
144250
/**
145251
* Defaults to 'path'. The effect depends on the canvas type:
146252
*
@@ -165,55 +271,27 @@ declare class NodeCanvasRenderingContext2D extends CanvasRenderingContext2D {
165271
* (aside from using the stroke and fill style, respectively).
166272
*/
167273
textDrawingMode: 'path' | 'glyph'
168-
169-
/** _Non-standard_. Sets the antialiasing mode. */
170-
antialias: 'default' | 'gray' | 'none' | 'subpixel'
171-
172-
// Standard, but not in the TS lib and needs node-canvas class return type.
173-
/** Returns or sets a `DOMMatrix` for the current transformation matrix. */
174-
currentTransform: NodeCanvasDOMMatrix
175-
176-
// Standard, but need node-canvas class versions:
177-
getTransform(): NodeCanvasDOMMatrix
178-
setTransform(a: number, b: number, c: number, d: number, e: number, f: number): void
179-
setTransform(transform?: NodeCanvasDOMMatrix): void
180-
createImageData(sw: number, sh: number): NodeCanvasImageData
181-
createImageData(imagedata: NodeCanvasImageData): NodeCanvasImageData
182-
getImageData(sx: number, sy: number, sw: number, sh: number): NodeCanvasImageData
183-
putImageData(imagedata: NodeCanvasImageData, dx: number, dy: number): void
184-
putImageData(imagedata: NodeCanvasImageData, dx: number, dy: number, dirtyX: number, dirtyY: number, dirtyWidth: number, dirtyHeight: number): void
185-
drawImage(image: Canvas|Image, dx: number, dy: number): void
186-
drawImage(image: Canvas|Image, dx: number, dy: number, dw: number, dh: number): void
187-
drawImage(image: Canvas|Image, sx: number, sy: number, sw: number, sh: number, dx: number, dy: number, dw: number, dh: number): void
188274
/**
189-
* **Do not use this overload. Use one of the other three overloads.** This
190-
* is a catch-all definition required for compatibility with the base
191-
* `CanvasRenderingContext2D` interface.
192-
*/
193-
drawImage(...args: any[]): void
194-
createPattern(image: Canvas|Image, repetition: 'repeat' | 'repeat-x' | 'repeat-y' | 'no-repeat' | '' | null): NodeCanvasCanvasPattern
195-
/**
196-
* **Do not use this overload. Use the other three overload.** This is a
197-
* catch-all definition required for compatibility with the base
198-
* `CanvasRenderingContext2D` interface.
199-
*/
200-
createPattern(...args: any[]): NodeCanvasCanvasPattern
201-
createLinearGradient(x0: number, y0: number, x1: number, y1: number): NodeCanvasCanvasGradient;
202-
createRadialGradient(x0: number, y0: number, r0: number, x1: number, y1: number, r1: number): NodeCanvasCanvasGradient;
203-
204-
/**
205-
* For PDF canvases, adds another page. If width and/or height are omitted,
206-
* the canvas's initial size is used.
275+
* _Non-standard_. Defaults to 'good'. Like `patternQuality`, but applies to
276+
* transformations affecting more than just patterns.
207277
*/
208-
addPage(width?: number, height?: number): void
278+
quality: 'fast' | 'good' | 'best' | 'nearest' | 'bilinear'
279+
/** Returns or sets a `DOMMatrix` for the current transformation matrix. */
280+
currentTransform: DOMMatrix
281+
fillStyle: string | CanvasGradient | CanvasPattern;
282+
strokeStyle: string | CanvasGradient | CanvasPattern;
283+
font: string;
284+
textBaseline: CanvasTextBaseline;
285+
textAlign: CanvasTextAlign;
209286
}
210-
export { NodeCanvasRenderingContext2D as CanvasRenderingContext2D }
211287

212-
declare class NodeCanvasCanvasGradient extends CanvasGradient {}
213-
export { NodeCanvasCanvasGradient as CanvasGradient }
288+
export class CanvasGradient {
289+
addColorStop(offset: number, color: string): void;
290+
}
214291

215-
declare class NodeCanvasCanvasPattern extends CanvasPattern {}
216-
export { NodeCanvasCanvasPattern as CanvasPattern }
292+
export class CanvasPattern {
293+
setTransform(transform?: DOMMatrix): void;
294+
}
217295

218296
// This does not extend HTMLImageElement because there are dozens of inherited
219297
// methods and properties that we do not provide.
@@ -312,14 +390,79 @@ export class JPEGStream extends Readable {}
312390
/** This class must not be constructed directly; use `canvas.createPDFStream()`. */
313391
export class PDFStream extends Readable {}
314392

315-
declare class NodeCanvasDOMMatrix extends DOMMatrix {}
316-
export { NodeCanvasDOMMatrix as DOMMatrix }
393+
export class DOMPoint {
394+
w: number;
395+
x: number;
396+
y: number;
397+
z: number;
398+
}
317399

318-
declare class NodeCanvasDOMPoint extends DOMPoint {}
319-
export { NodeCanvasDOMPoint as DOMPoint }
400+
export class DOMMatrix {
401+
constructor(init: string | number[]);
402+
toString(): string;
403+
multiply(other?: DOMMatrix): DOMMatrix;
404+
multiplySelf(other?: DOMMatrix): DOMMatrix;
405+
preMultiplySelf(other?: DOMMatrix): DOMMatrix;
406+
translate(tx?: number, ty?: number, tz?: number): DOMMatrix;
407+
translateSelf(tx?: number, ty?: number, tz?: number): DOMMatrix;
408+
scale(scaleX?: number, scaleY?: number, scaleZ?: number, originX?: number, originY?: number, originZ?: number): DOMMatrix;
409+
scale3d(scale?: number, originX?: number, originY?: number, originZ?: number): DOMMatrix;
410+
scale3dSelf(scale?: number, originX?: number, originY?: number, originZ?: number): DOMMatrix;
411+
scaleSelf(scaleX?: number, scaleY?: number, scaleZ?: number, originX?: number, originY?: number, originZ?: number): DOMMatrix;
412+
rotateFromVector(x?: number, y?: number): DOMMatrix;
413+
rotateFromVectorSelf(x?: number, y?: number): DOMMatrix;
414+
rotate(rotX?: number, rotY?: number, rotZ?: number): DOMMatrix;
415+
rotateSelf(rotX?: number, rotY?: number, rotZ?: number): DOMMatrix;
416+
rotateAxisAngle(x?: number, y?: number, z?: number, angle?: number): DOMMatrix;
417+
rotateAxisAngleSelf(x?: number, y?: number, z?: number, angle?: number): DOMMatrix;
418+
skewX(sx?: number): DOMMatrix;
419+
skewXSelf(sx?: number): DOMMatrix;
420+
skewY(sy?: number): DOMMatrix;
421+
skewYSelf(sy?: number): DOMMatrix;
422+
flipX(): DOMMatrix;
423+
flipY(): DOMMatrix;
424+
inverse(): DOMMatrix;
425+
invertSelf(): DOMMatrix;
426+
setMatrixValue(transformList: string): DOMMatrix;
427+
transformPoint(point?: DOMPoint): DOMPoint;
428+
toFloat32Array(): Float32Array;
429+
toFloat64Array(): Float64Array;
430+
readonly is2D: boolean;
431+
readonly isIdentity: boolean;
432+
a: number;
433+
b: number;
434+
c: number;
435+
d: number;
436+
e: number;
437+
f: number;
438+
m11: number;
439+
m12: number;
440+
m13: number;
441+
m14: number;
442+
m21: number;
443+
m22: number;
444+
m23: number;
445+
m24: number;
446+
m31: number;
447+
m32: number;
448+
m33: number;
449+
m34: number;
450+
m41: number;
451+
m42: number;
452+
m43: number;
453+
m44: number;
454+
static fromMatrix(other: DOMMatrix): DOMMatrix;
455+
static fromFloat32Array(a: Float32Array): DOMMatrix;
456+
static fromFloat64Array(a: Float64Array): DOMMatrix;
457+
}
320458

321-
declare class NodeCanvasImageData extends ImageData {}
322-
export { NodeCanvasImageData as ImageData }
459+
export class ImageData {
460+
constructor(sw: number, sh: number);
461+
constructor(data: Uint8ClampedArray, sw: number, sh?: number);
462+
readonly data: Uint8ClampedArray;
463+
readonly height: number;
464+
readonly width: number;
465+
}
323466

324467
// This is marked private, but is exported...
325468
// export function parseFont(description: string): object

0 commit comments

Comments
 (0)