skia-canvas 2.0.0 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,35 @@
2
2
 
3
3
  <!-- ## 🥚 ⟩ [Unreleased] -->
4
4
 
5
+
6
+ ## 🥚 ⟩ [v2.0.2] ⟩ Jan 28, 2025
7
+ ### New Features
8
+ - Added `fontHinting` attribute (off by default to better match font weights in browser rendering). Setting it to `true` may result in crisper edges but adds some weight to the font.
9
+
10
+ ### Bugfixes
11
+ - Text spacing
12
+ - Setting `letterSpacing` no longer indents text at beginning of line
13
+ - `letterSpacing` now properly handles negative values
14
+ - Improved accuracy of [`measureText()`][measureText()]
15
+ - Now uses font metrics' default leading when the line-height is left unspecified in the `ctx.font` string (NB: this is likely to cause vertical shifts for non-`alphabetic` baselines)
16
+ - Updated baseline offset calculations for `middle` & `hanging` to better match browsers
17
+ - The `actualBoundingBox*` & `lines[].x/y/width/height` rectangles returned by measureText() are now just the glyph-occupied area, not the whole line-height of the textblock
18
+ - Fixed the sign on `actualBoundingBoxLeft` (positive values now mean *left* of the origin)
19
+ - `lines[].baseline` now corresponds to the selected `ctx.textBaseline`, previously it was always the alphabetic baseline
20
+ - TypeScript definitions no longer include the entire DOM library (which had been pulling in tons of non-Canvas-related object types that this library doesn't emulate)
21
+
22
+ ## 📦 ⟩ [v2.0.1] ⟩ Dec 8, 2024
23
+
24
+ ### Misc. Improvements
25
+ - Added support for Intel integrated GPUs that would previously throw an "instantiated but unable to render" error
26
+ - Note: you may need to upgrade to the latest Mesa drivers ([24.3.1 or later][mesa_ppa]), especially for in-window rendering to work correctly on Linux
27
+ - Fixed window initialization for Vulkan GPUs that default to a framebuffer color-format Skia doesn't support
28
+ - Vulkan drivers that fall back to the [Mesa LLVMpipe][mesa_llvmpipe] software renderer now work correctly
29
+ - Optimized font library initialization to improve SVG parsing speed
30
+
31
+ [mesa_ppa]: https://launchpad.net/~kisak/+archive/ubuntu/kisak-mesa
32
+ [mesa_llvmpipe]: https://docs.mesa3d.org/drivers/llvmpipe.html
33
+
5
34
  ## 📦 ⟩ [v2.0.0] ⟩ Dec 2, 2024
6
35
 
7
36
  ### New Features
@@ -384,7 +413,9 @@
384
413
 
385
414
  **Initial public release** 🎉
386
415
 
387
- [unreleased]: https://github.com/samizdatco/skia-canvas/compare/v2.0.0...HEAD
416
+ [unreleased]: https://github.com/samizdatco/skia-canvas/compare/v2.0.2...HEAD
417
+ [v2.0.2]: https://github.com/samizdatco/skia-canvas/compare/v2.0.1...v2.0.2
418
+ [v2.0.1]: https://github.com/samizdatco/skia-canvas/compare/v2.0.0...v2.0.1
388
419
  [v2.0.0]: https://github.com/samizdatco/skia-canvas/compare/v1.0.2...v2.0.0
389
420
  [v1.0.2]: https://github.com/samizdatco/skia-canvas/compare/v1.0.1...v1.0.2
390
421
  [v1.0.1]: https://github.com/samizdatco/skia-canvas/compare/v1.0.0...v1.0.1
package/README.md CHANGED
@@ -211,7 +211,7 @@ This project is deeply indebted to the work of the [Rust Skia project](https://g
211
211
  - [@meihuanyu](https://github.com/meihuanyu) contributed filter & path rendering fixes
212
212
 
213
213
  ## Copyright
214
- © 2020–2024 [Samizdat Drafting Co.](https://samizdat.co)
214
+ © 2020–2025 [Samizdat Drafting Co.](https://samizdat.co)
215
215
 
216
216
  [bool-ops]: https://skia-canvas.org/api/path2d#complement-difference-intersect-union-and-xor
217
217
  [c2d_font]: https://skia-canvas.org/api/context#font
@@ -236,6 +236,8 @@ class CanvasRenderingContext2D extends RustClass{
236
236
  }
237
237
 
238
238
  // -- non-standard typography extensions --------------------------------------------
239
+ get fontHinting(){ return this.prop("fontHinting") }
240
+ set fontHinting(flag){ this.prop("fontHinting", !!flag) }
239
241
  get fontVariant(){ return this.prop('fontVariant') }
240
242
  set fontVariant(str){ this.prop('fontVariant', css.variant(str)) }
241
243
  get textWrap(){ return this.prop("textWrap") }
@@ -16,7 +16,7 @@ const styleRE = /^(normal|italic|oblique)$/,
16
16
  smallcapsRE = /^(normal|small-caps)$/,
17
17
  stretchRE = /^(normal|(semi-|extra-|ultra-)?(condensed|expanded))$/,
18
18
  namedSizeRE = /(?:xx?-)?small|smaller|medium|larger|(?:xx?-)?large|normal/,
19
- numSizeRE = /^([\d\.]+)(px|pt|pc|in|cm|mm|%|em|ex|ch|rem|q)/,
19
+ numSizeRE = /^(\-?[\d\.]+)(px|pt|pc|in|cm|mm|%|em|ex|ch|rem|q)/,
20
20
  namedWeightRE = /^(normal|bold(er)?|lighter)$/,
21
21
  numWeightRE = /^(1000|\d{1,3})$/,
22
22
  parameterizedRE = /([\w\-]+)\((.*?)\)/,
@@ -56,7 +56,7 @@ function parseFont(str){
56
56
  // so start processing what's been collected
57
57
  let [emSize, leading] = splitBy(token, '/'),
58
58
  size = parseSize(emSize),
59
- lineHeight = parseSize((leading || '1.2').replace(/(\d)$/, '$1em'), size),
59
+ lineHeight = leading ? parseSize(leading.replace(/(\d)$/, '$1em'), size) : undefined,
60
60
  weight = parseWeight(font.weight),
61
61
  family = splitBy(tokens.join(' '), /\s*,\s*/).map(unquote),
62
62
  features = font.variant=='small-caps' ? {on:['smcp', 'onum']} : {},
@@ -64,7 +64,7 @@ function parseFont(str){
64
64
 
65
65
  // make sure all the numeric fields have legitimate values
66
66
  let invalid = !isFinite(size) ? `font size "${emSize}"`
67
- : !isFinite(lineHeight) ? `line height "${leading}"`
67
+ : !isFinite(lineHeight) && lineHeight!==undefined ? `line height "${leading}"`
68
68
  : !isFinite(weight) ? `font weight "${font.weight}"`
69
69
  : family.length==0 ? `font family "${tokens.join(', ')}"`
70
70
  : false;
@@ -78,7 +78,7 @@ function parseFont(str){
78
78
  (variant !== style) && variant,
79
79
  ([variant, style].indexOf(weight) == -1) && weight,
80
80
  ([variant, style, weight].indexOf(stretch) == -1) && stretch,
81
- `${size}px/${lineHeight}px`,
81
+ `${size}px${isFinite(lineHeight) ? `/${lineHeight}px`: ''}`,
82
82
  family.map(nm => nm.match(/\s/) ? `"${nm}"` : nm).join(", ")
83
83
  ].filter(Boolean).join(' ')
84
84
  })
@@ -41,19 +41,18 @@ class FontLibrary extends RustClass {
41
41
 
42
42
  class TextMetrics{
43
43
  constructor([
44
- width, left, right, ascent, descent,
45
- fontAscent, fontDescent, emAscent, emDescent,
44
+ left, right, ascent, descent, fontAscent, fontDescent,
46
45
  hanging, alphabetic, ideographic
47
46
  ], lines){
48
- readOnly(this, "width", width)
47
+ readOnly(this, "width", Math.max(0, right) + Math.max(0, left))
49
48
  readOnly(this, "actualBoundingBoxLeft", left)
50
49
  readOnly(this, "actualBoundingBoxRight", right)
51
50
  readOnly(this, "actualBoundingBoxAscent", ascent)
52
51
  readOnly(this, "actualBoundingBoxDescent", descent)
53
52
  readOnly(this, "fontBoundingBoxAscent", fontAscent)
54
53
  readOnly(this, "fontBoundingBoxDescent", fontDescent)
55
- readOnly(this, "emHeightAscent", emAscent)
56
- readOnly(this, "emHeightDescent", emDescent)
54
+ readOnly(this, "emHeightAscent", fontAscent)
55
+ readOnly(this, "emHeightDescent", fontDescent)
57
56
  readOnly(this, "hangingBaseline", hanging)
58
57
  readOnly(this, "alphabeticBaseline", alphabetic)
59
58
  readOnly(this, "ideographicBaseline", ideographic)
package/lib/index.d.ts CHANGED
@@ -1,10 +1,110 @@
1
- /// <reference lib="dom"/>
2
- /// <reference types="node" />
1
+ //
2
+ // Geometry
3
+ //
4
+
5
+ interface DOMPointInit {
6
+ x?: number;
7
+ y?: number;
8
+ z?: number;
9
+ w?: number;
10
+ }
11
+
12
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMPoint) */
13
+ interface DOMPoint extends DOMPointReadOnly {
14
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMPoint/x) */
15
+ x: number;
16
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMPoint/y) */
17
+ y: number;
18
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMPoint/z) */
19
+ z: number;
20
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMPoint/w) */
21
+ w: number;
22
+ }
23
+
24
+ declare var DOMPoint: {
25
+ prototype: DOMPoint;
26
+ new(x?: number, y?: number, z?: number, w?: number): DOMPoint;
27
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMPoint/fromPoint_static) */
28
+ fromPoint(other?: DOMPointInit): DOMPoint;
29
+ };
30
+
31
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMPointReadOnly) */
32
+ interface DOMPointReadOnly {
33
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMPointReadOnly/x) */
34
+ readonly x: number;
35
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMPointReadOnly/y) */
36
+ readonly y: number;
37
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMPointReadOnly/z) */
38
+ readonly z: number;
39
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMPointReadOnly/w) */
40
+ readonly w: number;
41
+ matrixTransform(matrix?: DOMMatrixInit): DOMPoint;
42
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMPointReadOnly/toJSON) */
43
+ toJSON(): any;
44
+ }
45
+
46
+ declare var DOMPointReadOnly: {
47
+ prototype: DOMPointReadOnly;
48
+ new(x?: number, y?: number, z?: number, w?: number): DOMPointReadOnly;
49
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMPointReadOnly/fromPoint_static) */
50
+ fromPoint(other?: DOMPointInit): DOMPointReadOnly;
51
+ };
52
+
53
+
54
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMRect) */
55
+ interface DOMRect extends DOMRectReadOnly {
56
+ height: number;
57
+ width: number;
58
+ x: number;
59
+ y: number;
60
+ }
61
+
62
+ declare var DOMRect: {
63
+ prototype: DOMRect;
64
+ new(x?: number, y?: number, width?: number, height?: number): DOMRect;
65
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMRect/fromRect_static) */
66
+ fromRect(other?: DOMRectInit): DOMRect;
67
+ };
68
+
69
+ interface DOMRectList {
70
+ readonly length: number;
71
+ item(index: number): DOMRect | null;
72
+ [index: number]: DOMRect;
73
+ }
74
+
75
+ declare var DOMRectList: {
76
+ prototype: DOMRectList;
77
+ new(): DOMRectList;
78
+ };
79
+
80
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMRectReadOnly) */
81
+ interface DOMRectReadOnly {
82
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMRectReadOnly/bottom) */
83
+ readonly bottom: number;
84
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMRectReadOnly/height) */
85
+ readonly height: number;
86
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMRectReadOnly/left) */
87
+ readonly left: number;
88
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMRectReadOnly/right) */
89
+ readonly right: number;
90
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMRectReadOnly/top) */
91
+ readonly top: number;
92
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMRectReadOnly/width) */
93
+ readonly width: number;
94
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMRectReadOnly/x) */
95
+ readonly x: number;
96
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMRectReadOnly/y) */
97
+ readonly y: number;
98
+ toJSON(): any;
99
+ }
100
+
101
+ declare var DOMRectReadOnly: {
102
+ prototype: DOMRectReadOnly;
103
+ new(x?: number, y?: number, width?: number, height?: number): DOMRectReadOnly;
104
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/DOMRectReadOnly/fromRect_static) */
105
+ fromRect(other?: DOMRectInit): DOMRectReadOnly;
106
+ };
3
107
 
4
- export class DOMPoint extends globalThis.DOMPoint {}
5
- export class DOMRect extends globalThis.DOMRect {}
6
- export class CanvasGradient extends globalThis.CanvasGradient {}
7
- export class CanvasTexture {}
8
108
 
9
109
  //
10
110
  // Images
@@ -57,6 +157,35 @@ export class Image extends EventEmitter {
57
157
  // DOMMatrix
58
158
  //
59
159
 
160
+ interface DOMMatrix2DInit {
161
+ a?: number;
162
+ b?: number;
163
+ c?: number;
164
+ d?: number;
165
+ e?: number;
166
+ f?: number;
167
+ m11?: number;
168
+ m12?: number;
169
+ m21?: number;
170
+ m22?: number;
171
+ m41?: number;
172
+ m42?: number;
173
+ }
174
+
175
+ interface DOMMatrixInit extends DOMMatrix2DInit {
176
+ is2D?: boolean;
177
+ m13?: number;
178
+ m14?: number;
179
+ m23?: number;
180
+ m24?: number;
181
+ m31?: number;
182
+ m32?: number;
183
+ m33?: number;
184
+ m34?: number;
185
+ m43?: number;
186
+ m44?: number;
187
+ }
188
+
60
189
  interface DOMMatrix {
61
190
  a: number, b: number, c: number, d: number, e: number, f: number,
62
191
  m11: number, m12: number, m13: number, m14: number,
@@ -144,14 +273,31 @@ export interface SaveOptions extends RenderOptions {
144
273
  format?: ExportFormat
145
274
  }
146
275
 
276
+ /** [Skia Canvas Docs](https://skia-canvas.org/api/canvas) */
147
277
  export class Canvas {
148
- /** @internal */
149
- constructor(width?: number, height?: number)
150
278
  static contexts: WeakMap<Canvas, readonly CanvasRenderingContext2D[]>
279
+ /**
280
+ * Gets or sets the height of a canvas element on a document.
281
+ *
282
+ * [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLCanvasElement/height)
283
+ */
284
+ height: number;
285
+ /**
286
+ * Gets or sets the width of a canvas element on a document.
287
+ *
288
+ * [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLCanvasElement/width)
289
+ */
290
+ width: number;
291
+
292
+ /** [Skia Canvas Docs](https://skia-canvas.org/api/canvas#creating-new-canvas-objects) */
293
+ constructor(width?: number, height?: number)
151
294
 
152
- width: number
153
- height: number
154
-
295
+ /**
296
+ * Returns an object that provides methods and properties for drawing and manipulating images and graphics on a canvas element in a document. A context object includes information about colors, line widths, fonts, and other graphic parameters that can be drawn on a canvas.
297
+ * @param type The type of canvas to create. Skia Canvas only supports a 2-D context using canvas.getContext("2d")
298
+ *
299
+ * [MDN Reference](https://developer.mozilla.org/docs/Web/API/HTMLCanvasElement/getContext)
300
+ */
155
301
  getContext(type?: "2d"): CanvasRenderingContext2D
156
302
  newPage(width?: number, height?: number): CanvasRenderingContext2D
157
303
  readonly pages: CanvasRenderingContext2D[]
@@ -175,19 +321,75 @@ export class Canvas {
175
321
  }
176
322
 
177
323
  //
178
- // CanvasPattern
324
+ // Patterns
179
325
  //
180
326
 
327
+ /**
328
+ * An opaque object describing a pattern, based on an image, a canvas, or a video, created by the CanvasRenderingContext2D.createPattern() method.
329
+ *
330
+ * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasPattern)
331
+ */
181
332
  export class CanvasPattern{
182
333
  setTransform(transform: Matrix): void;
183
334
  setTransform(a: number, b: number, c: number, d: number, e: number, f: number): void
184
335
  }
185
336
 
337
+ /**
338
+ * An opaque object describing a gradient. It is returned by the methods CanvasRenderingContext2D.createLinearGradient() or CanvasRenderingContext2D.createRadialGradient().
339
+ *
340
+ * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasGradient)
341
+ */
342
+ interface CanvasGradient {
343
+ /**
344
+ * Adds a color stop with the given color to the gradient at the given offset. 0.0 is the offset at one end of the gradient, 1.0 is the offset at the other end.
345
+ *
346
+ * Throws an "IndexSizeError" DOMException if the offset is out of range. Throws a "SyntaxError" DOMException if the color cannot be parsed.
347
+ *
348
+ * [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasGradient/addColorStop)
349
+ */
350
+ addColorStop(offset: number, color: string): void;
351
+ }
352
+
353
+ declare var CanvasGradient: {
354
+ prototype: CanvasGradient;
355
+ new(): CanvasGradient;
356
+ };
357
+
358
+
359
+ export class CanvasTexture {}
360
+
361
+
186
362
  //
187
363
  // Context
188
364
  //
189
365
 
366
+ type CanvasDrawable = Canvas | Image | ImageData;
367
+ type CanvasPatternSource = Canvas | Image;
368
+ type CanvasDirection = "inherit" | "ltr" | "rtl";
369
+ type CanvasFillRule = "evenodd" | "nonzero";
370
+ type CanvasFontStretch = "condensed" | "expanded" | "extra-condensed" | "extra-expanded" | "normal" | "semi-condensed" | "semi-expanded" | "ultra-condensed" | "ultra-expanded";
371
+ type CanvasTextAlign = "center" | "end" | "left" | "right" | "start";
372
+ type CanvasTextBaseline = "alphabetic" | "bottom" | "hanging" | "ideographic" | "middle" | "top";
373
+ type CanvasLineCap = "butt" | "round" | "square";
374
+ type CanvasLineJoin = "bevel" | "miter" | "round";
375
+ // type CanvasFontKerning = "auto" | "none" | "normal";
376
+ // type CanvasFontVariantCaps = "all-petite-caps" | "all-small-caps" | "normal" | "petite-caps" | "small-caps" | "titling-caps" | "unicase";
377
+ // type CanvasTextRendering = "auto" | "geometricPrecision" | "optimizeLegibility" | "optimizeSpeed";
378
+
190
379
  type Offset = [x: number, y: number] | number
380
+ type QuadOrRect = [x1:number, y1:number, x2:number, y2:number, x3:number, y3:number, x4:number, y4:number] |
381
+ [left:number, top:number, right:number, bottom:number] | [width:number, height:number]
382
+ type GlobalCompositeOperation = "color" | "color-burn" | "color-dodge" | "copy" | "darken" | "destination-atop" | "destination-in" | "destination-out" | "destination-over" | "difference" | "exclusion" | "hard-light" | "hue" | "lighten" | "lighter" | "luminosity" | "multiply" | "overlay" | "saturation" | "screen" | "soft-light" | "source-atop" | "source-in" | "source-out" | "source-over" | "xor";
383
+ type ImageSmoothingQuality = "high" | "low" | "medium";
384
+
385
+ type FontVariantSetting = "normal" |
386
+ /* alternates */ "historical-forms" |
387
+ /* caps */ "small-caps" | "all-small-caps" | "petite-caps" | "all-petite-caps" | "unicase" | "titling-caps" |
388
+ /* numeric */ "lining-nums" | "oldstyle-nums" | "proportional-nums" | "tabular-nums" | "diagonal-fractions" | "stacked-fractions" | "ordinal" | "slashed-zero" |
389
+ /* ligatures */ "common-ligatures" | "no-common-ligatures" | "discretionary-ligatures" | "no-discretionary-ligatures" | "historical-ligatures" | "no-historical-ligatures" | "contextual" | "no-contextual" |
390
+ /* east-asian */ "jis78" | "jis83" | "jis90" | "jis04" | "simplified" | "traditional" | "full-width" | "proportional-width" | "ruby" |
391
+ /* position */ "super" | "sub";
392
+
191
393
 
192
394
  export interface CreateTextureOptions {
193
395
  /** The 2D shape to be drawn in a repeating grid with the specified spacing (if omitted, parallel lines will be used) */
@@ -206,8 +408,12 @@ export interface CreateTextureOptions {
206
408
  offset?: Offset
207
409
  }
208
410
 
209
- export type CanvasPatternSource = Canvas | Image;
210
- export type CanvasDrawable = Canvas | Image | ImageData;
411
+ interface CanvasCompositing {
412
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/globalAlpha) */
413
+ globalAlpha: number;
414
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation) */
415
+ globalCompositeOperation: GlobalCompositeOperation;
416
+ }
211
417
 
212
418
  interface CanvasDrawImage {
213
419
  drawImage(image: CanvasDrawable, dx: number, dy: number): void;
@@ -218,69 +424,228 @@ interface CanvasDrawImage {
218
424
  drawCanvas(image: Canvas, sx: number, sy: number, sw: number, sh: number, dx: number, dy: number, dw: number, dh: number): void;
219
425
  }
220
426
 
427
+ interface CanvasDrawPath {
428
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/beginPath) */
429
+ beginPath(): void;
430
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/clip) */
431
+ clip(fillRule?: CanvasFillRule): void;
432
+ clip(path: Path2D, fillRule?: CanvasFillRule): void;
433
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/fill) */
434
+ fill(fillRule?: CanvasFillRule): void;
435
+ fill(path: Path2D, fillRule?: CanvasFillRule): void;
436
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/isPointInPath) */
437
+ isPointInPath(x: number, y: number, fillRule?: CanvasFillRule): boolean;
438
+ isPointInPath(path: Path2D, x: number, y: number, fillRule?: CanvasFillRule): boolean;
439
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/isPointInStroke) */
440
+ isPointInStroke(x: number, y: number): boolean;
441
+ isPointInStroke(path: Path2D, x: number, y: number): boolean;
442
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/stroke) */
443
+ stroke(): void;
444
+ stroke(path: Path2D): void;
445
+ }
446
+
221
447
  interface CanvasFillStrokeStyles {
448
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/fillStyle) */
222
449
  fillStyle: string | CanvasGradient | CanvasPattern | CanvasTexture;
450
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/strokeStyle) */
223
451
  strokeStyle: string | CanvasGradient | CanvasPattern | CanvasTexture;
452
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/createConicGradient) */
224
453
  createConicGradient(startAngle: number, x: number, y: number): CanvasGradient;
454
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/createLinearGradient) */
225
455
  createLinearGradient(x0: number, y0: number, x1: number, y1: number): CanvasGradient;
226
- createRadialGradient(x0: number, y0: number, r0: number, x1: number, y1: number, r1: number): CanvasGradient;
456
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/createPattern) */
227
457
  createPattern(image: CanvasPatternSource, repetition: string | null): CanvasPattern | null;
458
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/createRadialGradient) */
459
+ createRadialGradient(x0: number, y0: number, r0: number, x1: number, y1: number, r1: number): CanvasGradient;
460
+
461
+ /** [Skia Canvas Docs](https://skia-canvas.org/api/context#createtexture) */
228
462
  createTexture(spacing: Offset, options?: CreateTextureOptions): CanvasTexture
229
463
  }
230
464
 
231
- type QuadOrRect = [x1:number, y1:number, x2:number, y2:number, x3:number, y3:number, x4:number, y4:number] |
232
- [left:number, top:number, right:number, bottom:number] | [width:number, height:number]
465
+ interface CanvasFilters {
466
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/filter) */
467
+ filter: string;
468
+ }
233
469
 
234
- type CornerRadius = number | DOMPoint
470
+ interface CanvasImageData {
471
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/createImageData) */
472
+ createImageData(width: number, height: number, settings?: ImageDataSettings): ImageData;
473
+ createImageData(imagedata: ImageData): ImageData;
235
474
 
236
- interface CanvasTransform extends Omit<globalThis.CanvasTransform, "transform" | "setTransform">{}
475
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/getImageData) */
476
+ getImageData(x: number, y: number, width: number, height: number, settings?: ImageDataSettings): ImageData;
237
477
 
238
- interface CanvasTextDrawingStyles extends Omit<globalThis.CanvasTextDrawingStyles, "fontKerning" | "fontVariantCaps" | "textRendering">{}
478
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/putImageData) */
479
+ putImageData(imagedata: ImageData, dx: number, dy: number): void;
480
+ putImageData(imagedata: ImageData, dx: number, dy: number, dirtyX: number, dirtyY: number, dirtyWidth: number, dirtyHeight: number): void;
481
+ }
239
482
 
240
- type FontVariantSetting = "normal" |
241
- /* alternates */ "historical-forms" |
242
- /* caps */ "small-caps" | "all-small-caps" | "petite-caps" | "all-petite-caps" | "unicase" | "titling-caps" |
243
- /* numeric */ "lining-nums" | "oldstyle-nums" | "proportional-nums" | "tabular-nums" | "diagonal-fractions" | "stacked-fractions" | "ordinal" | "slashed-zero" |
244
- /* ligatures */ "common-ligatures" | "no-common-ligatures" | "discretionary-ligatures" | "no-discretionary-ligatures" | "historical-ligatures" | "no-historical-ligatures" | "contextual" | "no-contextual" |
245
- /* east-asian */ "jis78" | "jis83" | "jis90" | "jis04" | "simplified" | "traditional" | "full-width" | "proportional-width" | "ruby" |
246
- /* position */ "super" | "sub";
483
+ interface CanvasImageSmoothing {
484
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/imageSmoothingEnabled) */
485
+ imageSmoothingEnabled: boolean;
486
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/imageSmoothingQuality) */
487
+ imageSmoothingQuality: ImageSmoothingQuality;
488
+ }
489
+
490
+
491
+ interface CanvasPath {
492
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/arc) */
493
+ arc(x: number, y: number, radius: number, startAngle: number, endAngle: number, counterclockwise?: boolean): void;
494
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/arcTo) */
495
+ arcTo(x1: number, y1: number, x2: number, y2: number, radius: number): void;
496
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/bezierCurveTo) */
497
+ bezierCurveTo(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number): void;
498
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/closePath) */
499
+ closePath(): void;
500
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/ellipse) */
501
+ ellipse(x: number, y: number, radiusX: number, radiusY: number, rotation: number, startAngle: number, endAngle: number, counterclockwise?: boolean): void;
502
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/lineTo) */
503
+ lineTo(x: number, y: number): void;
504
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/moveTo) */
505
+ moveTo(x: number, y: number): void;
506
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/quadraticCurveTo) */
507
+ quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): void;
508
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/rect) */
509
+ rect(x: number, y: number, w: number, h: number): void;
510
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/roundRect) */
511
+ roundRect(x: number, y: number, w: number, h: number, radii?: number | DOMPointInit | (number | DOMPointInit)[]): void;
512
+ }
513
+
514
+
515
+ interface CanvasPathDrawingStyles {
516
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/lineCap) */
517
+ lineCap: CanvasLineCap;
518
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/lineDashOffset) */
519
+ lineDashOffset: number;
520
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/lineJoin) */
521
+ lineJoin: CanvasLineJoin;
522
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/lineWidth) */
523
+ lineWidth: number;
524
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/miterLimit) */
525
+ miterLimit: number;
526
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/getLineDash) */
527
+ getLineDash(): number[];
528
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/setLineDash) */
529
+ setLineDash(segments: Iterable<number>): void;
530
+ }
531
+
532
+ interface CanvasRect {
533
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/clearRect) */
534
+ clearRect(x: number, y: number, w: number, h: number): void;
535
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/fillRect) */
536
+ fillRect(x: number, y: number, w: number, h: number): void;
537
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/strokeRect) */
538
+ strokeRect(x: number, y: number, w: number, h: number): void;
539
+ }
540
+
541
+ interface CanvasShadowStyles {
542
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/shadowBlur) */
543
+ shadowBlur: number;
544
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/shadowColor) */
545
+ shadowColor: string;
546
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/shadowOffsetX) */
547
+ shadowOffsetX: number;
548
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/shadowOffsetY) */
549
+ shadowOffsetY: number;
550
+ }
551
+
552
+ interface CanvasState {
553
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/reset) */
554
+ reset(): void;
555
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/restore) */
556
+ restore(): void;
557
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/save) */
558
+ save(): void;
559
+
560
+ // UNIMPLEMENTED
561
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/isContextLost) */
562
+ // isContextLost(): boolean;
563
+ }
564
+
565
+ interface CanvasText {
566
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/fillText) */
567
+ fillText(text: string, x: number, y: number, maxWidth?: number): void;
568
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/measureText) */
569
+ measureText(text: string): TextMetrics;
570
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/strokeText) */
571
+ strokeText(text: string, x: number, y: number, maxWidth?: number): void;
572
+ }
573
+
574
+ interface CanvasTextDrawingStyles {
575
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/direction) */
576
+ direction: CanvasDirection;
577
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/font) */
578
+ font: string;
579
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/fontStretch) */
580
+ fontStretch: CanvasFontStretch;
581
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/letterSpacing) */
582
+ letterSpacing: string;
583
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/textAlign) */
584
+ textAlign: CanvasTextAlign;
585
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/textBaseline) */
586
+ textBaseline: CanvasTextBaseline;
587
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/wordSpacing) */
588
+ wordSpacing: string;
589
+
590
+ // UNIMPLEMENTED
591
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/textRendering) */
592
+ // textRendering: CanvasTextRendering;
593
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/fontKerning) */
594
+ // fontKerning: CanvasFontKerning;
595
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/fontVariantCaps) */
596
+ // fontVariantCaps: CanvasFontVariantCaps;
597
+ }
598
+
599
+
600
+ interface CanvasTransform {
601
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/getTransform) */
602
+ getTransform(): DOMMatrix;
603
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/resetTransform) */
604
+ resetTransform(): void;
605
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/rotate) */
606
+ rotate(angle: number): void;
607
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/scale) */
608
+ scale(x: number, y: number): void;
609
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/setTransform) */
610
+ setTransform(a: number, b: number, c: number, d: number, e: number, f: number): void;
247
611
 
612
+ /** transform argument extensions (accept DOMMatrix & matrix-like objectx, not just param lists) */
613
+ setTransform(transform?: Matrix): void
614
+
615
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/transform) */
616
+ transform(a: number, b: number, c: number, d: number, e: number, f: number): void
617
+ transform(transform: Matrix): void
248
618
 
249
- export interface CanvasRenderingContext2D extends CanvasCompositing, CanvasDrawImage, CanvasDrawPath, CanvasFillStrokeStyles, CanvasFilters, CanvasImageSmoothing, CanvasPath, CanvasPathDrawingStyles, CanvasRect, CanvasShadowStyles, CanvasState, CanvasText, CanvasTextDrawingStyles, CanvasTransform, CanvasUserInterface {
619
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/translate) */
620
+ translate(x: number, y: number): void;
621
+ }
622
+
623
+ /**
624
+ * The CanvasRenderingContext2D interface, part of the Canvas API, provides the 2D rendering context for the drawing surface of a <canvas> element. It is used for drawing shapes, text, images, and other objects.
625
+ *
626
+ * - [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D)
627
+ * - [Skia Canvas Docs](https://skia-canvas.org/api/context)
628
+ */
629
+ export interface CanvasRenderingContext2D extends CanvasCompositing, CanvasDrawImage, CanvasDrawPath, CanvasFillStrokeStyles, CanvasFilters, CanvasImageData, CanvasImageSmoothing, CanvasPath, CanvasPathDrawingStyles, CanvasRect, CanvasShadowStyles, CanvasState, CanvasText, CanvasTextDrawingStyles, CanvasTransform {
630
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/CanvasRenderingContext2D/canvas) */
250
631
  readonly canvas: Canvas
251
632
  fontVariant: FontVariantSetting
633
+ fontHinting: boolean
252
634
  textWrap: boolean
253
635
  textDecoration: string
254
636
  lineDashMarker: Path2D | null
255
637
  lineDashFit: "move" | "turn" | "follow"
256
638
 
257
- // transform argument extensions (accept DOMMatrix & matrix-like objectx, not just param lists)
258
- setTransform(transform?: Matrix): void
259
- setTransform(a: number, b: number, c: number, d: number, e: number, f: number): void
260
-
261
- transform(transform: Matrix): void
262
- transform(a: number, b: number, c: number, d: number, e: number, f: number): void
263
-
639
+ // skia/chrome beziers & convenience methods
264
640
  get currentTransform(): DOMMatrix
265
641
  set currentTransform(matrix: Matrix)
266
642
  createProjection(quad: QuadOrRect, basis?: QuadOrRect): DOMMatrix
267
-
268
- // skia/chrome beziers & convenience methods
269
643
  conicCurveTo(cpx: number, cpy: number, x: number, y: number, weight: number): void
270
- roundRect(x: number, y: number, width: number, height: number, radii: number | CornerRadius[]): void
271
- reset(): void
272
644
  // getContextAttributes(): CanvasRenderingContext2DSettings;
273
645
 
274
- // add maxWidth to work in conjunction with textWrap
646
+ // add optional maxWidth to work in conjunction with textWrap
275
647
  measureText(text: string, maxWidth?: number): TextMetrics
276
648
  outlineText(text: string, maxWidth?: number): Path2D
277
-
278
- // use the local definitions for settings w/ supported ColorType values
279
- createImageData(width: number, height: number, settings?: ImageDataSettings): ImageData;
280
- createImageData(imagedata: ImageData): ImageData;
281
- getImageData(x: number, y: number, width: number, height: number, settings?: ImageDataSettings): ImageData;
282
- putImageData(imagedata: ImageData, dx: number, dy: number): void;
283
- putImageData(imagedata: ImageData, dx: number, dy: number, dirtyX: number, dirtyY: number, dirtyWidth: number, dirtyHeight: number): void;
284
649
  }
285
650
 
286
651
  //
@@ -298,10 +663,22 @@ export interface Path2DBounds {
298
663
 
299
664
  export type Path2DEdge = [verb: string, ...args: number[]]
300
665
 
301
- export class Path2D extends globalThis.Path2D {
302
- d: string
666
+ /**
667
+ * This Canvas 2D API interface is used to declare a path that can then be used on a CanvasRenderingContext2D object. The path methods of the CanvasRenderingContext2D interface are also present on this interface, which gives you the convenience of being able to retain and replay your path whenever desired.
668
+ *
669
+ * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Path2D)
670
+ */
671
+ interface Path2D extends CanvasPath {
303
672
  readonly bounds: Path2DBounds
304
673
  readonly edges: readonly Path2DEdge[]
674
+ d: string
675
+
676
+ /**
677
+ * Adds the path given by the argument to the path
678
+ *
679
+ * [MDN Reference](https://developer.mozilla.org/docs/Web/API/Path2D/addPath)
680
+ */
681
+ addPath(path: Path2D, transform?: DOMMatrix2DInit): void;
305
682
 
306
683
  contains(x: number, y: number): boolean
307
684
  conicCurveTo(
@@ -312,8 +689,6 @@ export class Path2D extends globalThis.Path2D {
312
689
  weight: number
313
690
  ): void
314
691
 
315
- roundRect(x: number, y: number, width: number, height: number, radii: number | CornerRadius[]): void
316
-
317
692
  complement(otherPath: Path2D): Path2D
318
693
  difference(otherPath: Path2D): Path2D
319
694
  intersect(otherPath: Path2D): Path2D
@@ -334,14 +709,56 @@ export class Path2D extends globalThis.Path2D {
334
709
  unwind(): Path2D
335
710
  }
336
711
 
712
+ declare var Path2D: {
713
+ prototype: Path2D;
714
+ new(path?: Path2D | string): Path2D;
715
+ }
716
+
337
717
  //
338
718
  // Typography
339
719
  //
340
720
 
341
- export interface TextMetrics extends globalThis.TextMetrics {
342
- lines: TextMetricsLine[]
721
+
722
+ /**
723
+ * The dimensions of a piece of text in the canvas, as created by the CanvasRenderingContext2D.measureText() method.
724
+ *
725
+ * [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextMetrics)
726
+ */
727
+ interface TextMetrics {
728
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextMetrics/actualBoundingBoxAscent) */
729
+ readonly actualBoundingBoxAscent: number;
730
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextMetrics/actualBoundingBoxDescent) */
731
+ readonly actualBoundingBoxDescent: number;
732
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextMetrics/actualBoundingBoxLeft) */
733
+ readonly actualBoundingBoxLeft: number;
734
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextMetrics/actualBoundingBoxRight) */
735
+ readonly actualBoundingBoxRight: number;
736
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextMetrics/alphabeticBaseline) */
737
+ readonly alphabeticBaseline: number;
738
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextMetrics/emHeightAscent) */
739
+ readonly emHeightAscent: number;
740
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextMetrics/emHeightDescent) */
741
+ readonly emHeightDescent: number;
742
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextMetrics/fontBoundingBoxAscent) */
743
+ readonly fontBoundingBoxAscent: number;
744
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextMetrics/fontBoundingBoxDescent) */
745
+ readonly fontBoundingBoxDescent: number;
746
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextMetrics/hangingBaseline) */
747
+ readonly hangingBaseline: number;
748
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextMetrics/ideographicBaseline) */
749
+ readonly ideographicBaseline: number;
750
+ /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/TextMetrics/width) */
751
+ readonly width: number;
752
+
753
+ /** Individual metrics for each line (only applicable when context's textWrap is set to `true` ) */
754
+ readonly lines: TextMetricsLine[]
343
755
  }
344
756
 
757
+ declare var TextMetrics: {
758
+ prototype: TextMetrics;
759
+ new(): TextMetrics;
760
+ };
761
+
345
762
  export interface TextMetricsLine {
346
763
  readonly x: number
347
764
  readonly y: number
@@ -367,7 +784,7 @@ export interface Font {
367
784
  file: string
368
785
  }
369
786
 
370
- export interface FontLibrary {
787
+ interface FontLibrary {
371
788
  families: readonly string[]
372
789
  family(name: string): FontFamily | undefined
373
790
  has(familyName: string): boolean
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skia-canvas",
3
- "version": "2.0.0",
3
+ "version": "2.0.2",
4
4
  "description": "A GPU-accelerated Canvas Graphics API for Node",
5
5
  "author": "Christian Swinehart <drafting@samizdat.co>",
6
6
  "license": "MIT",
@@ -42,8 +42,8 @@
42
42
  "devDependencies": {
43
43
  "@types/jest": "^29.5.14",
44
44
  "@types/lodash": "^4.17.13",
45
- "@types/node": "^22.9.0",
46
- "express": "^4.21.1",
45
+ "@types/node": "^22.10.1",
46
+ "express": "^4.21.2",
47
47
  "jest": "^29.7.0",
48
48
  "lodash": "^4.17.21",
49
49
  "nodemon": "^3.1.7",