From b68f6eb6d3786c174f9b643e26ee7e437b4864fb Mon Sep 17 00:00:00 2001 From: William Candillon Date: Sat, 11 Nov 2023 07:27:55 +0100 Subject: [PATCH 1/8] =?UTF-8?q?=F0=9F=92=9A=20fix=20build=20script=20(#197?= =?UTF-8?q?2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package/src/renderer/__tests__/setup.tsx | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/package/src/renderer/__tests__/setup.tsx b/package/src/renderer/__tests__/setup.tsx index 39b5f944eb..5416f75eb3 100644 --- a/package/src/renderer/__tests__/setup.tsx +++ b/package/src/renderer/__tests__/setup.tsx @@ -8,12 +8,7 @@ import type { Server, WebSocket } from "ws"; import { DependencyManager } from "../DependencyManager"; import { ValueApi } from "../../values/web"; -import type * as SkiaExports from "../../skia"; -import type * as AnimationExports from "../../animation"; -import type * as ValuesExports from "../../values"; -import type * as RendererExports from "../index"; -import type * as OffscreenExports from "../Offscreen"; -import type * as TouchHandlerExports from "../../views/useTouchHandler"; +import type * as SkiaExports from "../../index"; import { JsiSkApi } from "../../skia/web/JsiSkia"; import type { Node } from "../../dom/nodes"; import { JsiSkDOM } from "../../dom/nodes"; @@ -162,15 +157,15 @@ export const loadFont = (uri: string, ftSize?: number) => { return Skia.Font(tf!, ftSize ?? fontSize); }; -export const importSkia = () => { +export const importSkia = (): typeof SkiaExports => { //const core = require("../../skia/core"); - const skia: typeof SkiaExports = require("../../skia"); - const renderer: typeof RendererExports = require("../../renderer"); - const offscreen: typeof OffscreenExports = require("../Offscreen"); + const skia = require("../../skia"); + const renderer = require("../../renderer"); + const offscreen = require("../Offscreen"); // TODO: to remove - const animation: typeof AnimationExports = require("../../animation"); - const values: typeof ValuesExports = require("../../values"); - const useTouchHandler: typeof TouchHandlerExports = require("../../views/useTouchHandler"); + const animation = require("../../animation"); + const values = require("../../values"); + const useTouchHandler = require("../../views/useTouchHandler"); return { ...skia, ...renderer, From 012c94770d654fef0141d32e7bdb738462995e2b Mon Sep 17 00:00:00 2001 From: William Candillon Date: Sat, 11 Nov 2023 08:33:01 +0100 Subject: [PATCH 2/8] fix: undefined behavior of _drawingMode (#1973) Co-authored-by: gtbl2012 --- package/cpp/rnskia/RNSkView.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/cpp/rnskia/RNSkView.h b/package/cpp/rnskia/RNSkView.h index aa810b0a3e..9efdc62357 100644 --- a/package/cpp/rnskia/RNSkView.h +++ b/package/cpp/rnskia/RNSkView.h @@ -398,7 +398,7 @@ class RNSkView : public std::enable_shared_from_this { std::shared_ptr _onSize; std::function _onSizeUnsubscribe; - RNSkDrawingMode _drawingMode; + RNSkDrawingMode _drawingMode = RNSkDrawingMode::Default; size_t _nativeId; size_t _drawingLoopId = 0; From 29fbaf8e00ac32d948329164628f1f89559343f8 Mon Sep 17 00:00:00 2001 From: William Candillon Date: Sun, 12 Nov 2023 11:26:06 +0100 Subject: [PATCH 3/8] Keep reference to the main looper (#1965) --- .../reactnative/skia/PlatformContext.java | 19 +++++++++---------- .../reactnative/skia/SkiaBaseView.java | 6 +++++- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/package/android/src/main/java/com/shopify/reactnative/skia/PlatformContext.java b/package/android/src/main/java/com/shopify/reactnative/skia/PlatformContext.java index 0e7c7df2a1..00ebf26bf6 100644 --- a/package/android/src/main/java/com/shopify/reactnative/skia/PlatformContext.java +++ b/package/android/src/main/java/com/shopify/reactnative/skia/PlatformContext.java @@ -1,7 +1,5 @@ package com.shopify.reactnative.skia; -import android.app.Application; -import android.graphics.Bitmap; import android.os.Handler; import android.os.Looper; import android.util.Log; @@ -10,7 +8,6 @@ import com.facebook.jni.HybridData; import com.facebook.proguard.annotations.DoNotStrip; import com.facebook.react.bridge.ReactContext; -import com.facebook.react.turbomodule.core.CallInvokerHolderImpl; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; @@ -21,8 +18,6 @@ import java.net.URISyntaxException; import java.net.URL; import java.net.URLConnection; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; public class PlatformContext { @DoNotStrip @@ -35,6 +30,9 @@ public class PlatformContext { private final String TAG = "PlatformContext"; + private final Handler mainHandler = new Handler(Looper.getMainLooper()); + + public PlatformContext(ReactContext reactContext) { mContext = reactContext; mHybridData = initHybrid(reactContext.getResources().getDisplayMetrics().density); @@ -66,9 +64,10 @@ public void doFrame(long frameTimeNanos) { Choreographer.getInstance().postFrameCallback(frameCallback); } + @DoNotStrip public void notifyTaskReadyOnMainThread() { - new Handler(Looper.getMainLooper()).post(new Runnable() { + mainHandler.post(new Runnable() { @Override public void run() { notifyTaskReady(); @@ -83,7 +82,7 @@ Object takeScreenshotFromViewTag(int tag) { @DoNotStrip public void raise(final String message) { - new Handler(Looper.getMainLooper()).post(new Runnable() { + mainHandler.post(new Runnable() { @Override public void run() { mContext.handleException(new Exception(message)); @@ -97,7 +96,7 @@ public void beginDrawLoop() { return; } _drawLoopActive = true; - new Handler(Looper.getMainLooper()).post(new Runnable() { + mainHandler.post(new Runnable() { @Override public void run() { postFrameLoop(); @@ -169,7 +168,7 @@ void onResume() { Log.i(TAG, "Resume"); if(_drawLoopActive) { // Restart draw loop - new Handler(Looper.getMainLooper()).post(new Runnable() { + mainHandler.post(new Runnable() { @Override public void run() { postFrameLoop(); @@ -188,4 +187,4 @@ protected void finalize() throws Throwable { private native HybridData initHybrid(float pixelDensity); private native void notifyDrawLoop(); private native void notifyTaskReady(); -} +} \ No newline at end of file diff --git a/package/android/src/main/java/com/shopify/reactnative/skia/SkiaBaseView.java b/package/android/src/main/java/com/shopify/reactnative/skia/SkiaBaseView.java index aa97bdd2fd..c6dc1eed60 100644 --- a/package/android/src/main/java/com/shopify/reactnative/skia/SkiaBaseView.java +++ b/package/android/src/main/java/com/shopify/reactnative/skia/SkiaBaseView.java @@ -157,9 +157,13 @@ public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { return false; } + //private long _prevTimestamp = 0; @Override public void onSurfaceTextureUpdated(SurfaceTexture surface) { - // Nothing special to do here +// long timestamp = surface.getTimestamp(); +// long frameDuration = (timestamp - _prevTimestamp)/1000000; +// Log.i(tag, "onSurfaceTextureUpdated "+frameDuration+"ms"); +// _prevTimestamp = timestamp; } protected abstract void surfaceAvailable(Object surface, int width, int height); From 7649ea84962ad8a161b508e859abdc6c158645a4 Mon Sep 17 00:00:00 2001 From: William Candillon Date: Sun, 12 Nov 2023 20:41:21 +0100 Subject: [PATCH 4/8] Remove conflicting header name (#1977) --- package/cpp/rnskia/dom/nodes/JsiImageNode.h | 7 +------ .../cpp/rnskia/dom/props/{ImageProps.h => SkImageProps.h} | 0 2 files changed, 1 insertion(+), 6 deletions(-) rename package/cpp/rnskia/dom/props/{ImageProps.h => SkImageProps.h} (100%) diff --git a/package/cpp/rnskia/dom/nodes/JsiImageNode.h b/package/cpp/rnskia/dom/nodes/JsiImageNode.h index 987add6706..bcdcf93b23 100644 --- a/package/cpp/rnskia/dom/nodes/JsiImageNode.h +++ b/package/cpp/rnskia/dom/nodes/JsiImageNode.h @@ -1,12 +1,7 @@ #pragma once -#ifdef TARGET_OS_IPHONE -#include -#else -#include "ImageProps.h" -#endif - #include "JsiDomDrawingNode.h" +#include "SkImageProps.h" #include diff --git a/package/cpp/rnskia/dom/props/ImageProps.h b/package/cpp/rnskia/dom/props/SkImageProps.h similarity index 100% rename from package/cpp/rnskia/dom/props/ImageProps.h rename to package/cpp/rnskia/dom/props/SkImageProps.h From 1374c34e8f0393adf31465b41d69fce0f5493c10 Mon Sep 17 00:00:00 2001 From: William Candillon Date: Sat, 18 Nov 2023 15:37:36 +0100 Subject: [PATCH 5/8] Fix regression with Jest testing (#1990) --- docs/docs/getting-started/installation.md | 12 ++++++++++-- package/jestEnv.mjs | 4 ++-- package/jestSetup.mjs | 5 ++--- package/package.json | 3 ++- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/docs/docs/getting-started/installation.md b/docs/docs/getting-started/installation.md index 7fac57d129..6e059558e5 100644 --- a/docs/docs/getting-started/installation.md +++ b/docs/docs/getting-started/installation.md @@ -84,9 +84,17 @@ There is also an [React Native VSCode extension](https://marketplace.visualstudi ## Testing with Jest -React Native Skia test mocks use a web implementation that depends on loading CanvasKit. Before using the mocks, some setup actions are required. +React Native Skia test mocks use a web implementation that depends on loading CanvasKit. -We recommend using [ESM](https://jestjs.io/docs/ecmascript-modules). To enable ESM support, you need to update your `jest` command to `node --experimental-vm-modules node_modules/.bin/jest`. +The very first step is to make sure that your Skia files are not being transformed by jest, for instance, we can add it the `transformIgnorePatterns` directive: +```js +"transformIgnorePatterns": [ + "node_modules/(?!(react-native|react-native.*|@react-native.*|@?react-navigation.*|@shopify/react-native-skia)/)" +] +``` + +Next, we recommend using [ESM](https://jestjs.io/docs/ecmascript-modules). To enable ESM support, you need to update your `jest` command to `node --experimental-vm-modules node_modules/.bin/jest`. +But we also support [CommonJS](#commonjs-setup). ### ESM Setup diff --git a/package/jestEnv.mjs b/package/jestEnv.mjs index 12182acfcd..286daf0196 100644 --- a/package/jestEnv.mjs +++ b/package/jestEnv.mjs @@ -1,9 +1,9 @@ /* eslint-disable import/no-default-export */ // eslint-disable-next-line import/no-extraneous-dependencies import { TestEnvironment } from "jest-environment-node"; -import { LoadSkiaWeb } from "@shopify/react-native-skia/lib/commonjs/web/LoadSkiaWeb"; +import CanvasKitInit from "canvaskit-wasm/bin/full/canvaskit"; -const CanvasKit = await LoadSkiaWeb(); +const CanvasKit = await CanvasKitInit({}); export default class SkiaEnvironment extends TestEnvironment { constructor(config, context) { diff --git a/package/jestSetup.mjs b/package/jestSetup.mjs index f6254d3aa6..49e4ec2e41 100644 --- a/package/jestSetup.mjs +++ b/package/jestSetup.mjs @@ -1,8 +1,7 @@ /* eslint-disable import/no-extraneous-dependencies */ import { jest } from "@jest/globals"; import CanvasKitInit from "canvaskit-wasm/bin/full/canvaskit"; - -import Mock from "./src/mock"; +import { Mock } from "@shopify/react-native-skia/lib/module/mock"; global.CanvasKit = await CanvasKitInit({}); @@ -19,5 +18,5 @@ jest.mock("@shopify/react-native-skia", () => { View: Noop, }; }); - return Mock.Mock(global.CanvasKit); + return Mock(global.CanvasKit); }); diff --git a/package/package.json b/package/package.json index 9314f14595..c9896ff3bb 100644 --- a/package/package.json +++ b/package/package.json @@ -25,7 +25,8 @@ "libs/android/**", "index.js", "jestSetup.js", - "globalJestSetup.js", + "jestSetup.mjs", + "jestEnv.mjs", "cpp/**/*.{h,cpp}", "ios", "libs/ios/libskia.xcframework", From 808780ee87128fa86e6a57bc19c8ac1154d4a250 Mon Sep 17 00:00:00 2001 From: Dima Portenko Date: Sat, 18 Nov 2023 16:45:59 +0200 Subject: [PATCH 6/8] Update tutorials.md (#1987) * Update tutorials.md --------- Co-authored-by: William Candillon --- docs/docs/tutorials.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/docs/tutorials.md b/docs/docs/tutorials.md index d74e947734..0354ff4937 100644 --- a/docs/docs/tutorials.md +++ b/docs/docs/tutorials.md @@ -56,6 +56,7 @@ Please [make a PR](https://github.com/Shopify/react-native-skia/edit/main/docs/d * [Gradient along Path (youtu.be)](https://www.youtube.com/watch?v=7SCzL-XnfUU) * [Headspace Player - “Can it be done in React Native?” (youtu.be)](https://www.youtube.com/watch?v=pErnuAx5GjE) * [Make an Animated Wave Slider Effect with React-Native Skia (youtu.be)](https://www.youtube.com/watch?v=I6elFawLceY) +* [Liquid Wave Progress Indicator. Skia, Reanimated, D3. (youtu.be)](https://youtu.be/CGcLDoZWciA) ## Vertices * [Song of Bloom - “Can it be done in React Native?” (youtu.be)](https://www.youtube.com/watch?v=PfCQEA72ljU) From 74911b8aae2083bfd252dfcf1acb4ac1a2d35642 Mon Sep 17 00:00:00 2001 From: Joshua Head Date: Sat, 18 Nov 2023 16:22:25 +0100 Subject: [PATCH 7/8] fix: react-native in pkg needs to to point to src (#1981) This is for the react native codegen Co-authored-by: Joshua Head Co-authored-by: William Candillon --- scripts/build-npm-package.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build-npm-package.ts b/scripts/build-npm-package.ts index fa0d6a1580..8a6442c220 100644 --- a/scripts/build-npm-package.ts +++ b/scripts/build-npm-package.ts @@ -83,7 +83,7 @@ pck.version = nextVersion; pck.types = "lib/typescript/index.d.ts"; pck.main = "lib/module/index.js"; pck.module = "lib/module/index.js"; -pck["react-native"] = "lib/module/index.js"; +pck["react-native"] = "src/index.ts"; console.log("Building version:", nextVersion); // Overwrite the package.json file From 0b818a211f0950d0646547ccd5e6965e4ff4a30b Mon Sep 17 00:00:00 2001 From: William Candillon Date: Mon, 20 Nov 2023 08:35:52 +0100 Subject: [PATCH 8/8] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20Upgrade=20CanvasKit=20?= =?UTF-8?q?version=20(#1991)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package/package.json | 2 +- package/src/skia/__tests__/Enums.spec.ts | 3 + package/src/skia/types/Image/ImageFactory.ts | 55 ++++++++++--------- package/src/skia/web/JsiSkFontMgrFactory.ts | 2 - .../src/skia/web/JsiSkTypefaceFontProvider.ts | 4 -- package/yarn.lock | 15 +++-- 6 files changed, 45 insertions(+), 36 deletions(-) diff --git a/package/package.json b/package/package.json index c9896ff3bb..53b5c8ce8a 100644 --- a/package/package.json +++ b/package/package.json @@ -106,7 +106,7 @@ "ws": "^8.11.0" }, "dependencies": { - "canvaskit-wasm": "0.38.2", + "canvaskit-wasm": "0.39.1", "react-reconciler": "^0.27.0" }, "eslintIgnore": [ diff --git a/package/src/skia/__tests__/Enums.spec.ts b/package/src/skia/__tests__/Enums.spec.ts index 96e27b71a5..c02229b634 100644 --- a/package/src/skia/__tests__/Enums.spec.ts +++ b/package/src/skia/__tests__/Enums.spec.ts @@ -37,6 +37,9 @@ const checkEnum = (skiaEnum: T, canvasKitEnum: EmbindEnum) => { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error const selectedEnum = canvasKitEnum[namedKey]; + if (namedKey === undefined || selectedEnum === undefined) { + console.log({ skiaEnum, canvasKitEnum, key, namedKey, expected }); + } expect(selectedEnum).toBeDefined(); expect(expected).toBe(selectedEnum.value); }); diff --git a/package/src/skia/types/Image/ImageFactory.ts b/package/src/skia/types/Image/ImageFactory.ts index a93dea5c2f..4a98d3cd49 100644 --- a/package/src/skia/types/Image/ImageFactory.ts +++ b/package/src/skia/types/Image/ImageFactory.ts @@ -10,36 +10,41 @@ export enum AlphaType { } export enum ColorType { - Unknown, //!< uninitialized - Alpha_8, //!< pixel with alpha in 8-bit byte - RGB_565, //!< pixel with 5 bits red, 6 bits green, 5 bits blue, in 16-bit word - ARGB_4444, //!< pixel with 4 bits for alpha, red, green, blue; in 16-bit word - RGBA_8888, //!< pixel with 8 bits for red, green, blue, alpha; in 32-bit word - RGB_888x, //!< pixel with 8 bits each for red, green, blue; in 32-bit word - BGRA_8888, //!< pixel with 8 bits for blue, green, red, alpha; in 32-bit word - RGBA_1010102, //!< 10 bits for red, green, blue; 2 bits for alpha; in 32-bit word - BGRA_1010102, //!< 10 bits for blue, green, red; 2 bits for alpha; in 32-bit word - RGB_101010x, //!< pixel with 10 bits each for red, green, blue; in 32-bit word - BGR_101010x, //!< pixel with 10 bits each for blue, green, red; in 32-bit word - BGR_101010x_XR, //!< pixel with 10 bits each for blue, green, red; in 32-bit word, extended range - Gray_8, //!< pixel with grayscale level in 8-bit byte - RGBA_F16Norm, //!< pixel with half floats in [0,1] for red, green, blue, alpha; - // in 64-bit word - RGBA_F16, //!< pixel with half floats for red, green, blue, alpha; - // in 64-bit word - RGBA_F32, //!< pixel using C float for red, green, blue, alpha; in 128-bit word + Unknown, // uninitialized + Alpha_8, // pixel with alpha in 8-bit byte + RGB_565, // pixel with 5 bits red, 6 bits green, 5 bits blue, in 16-bit word + ARGB_4444, // pixel with 4 bits for alpha, red, green, blue; in 16-bit word + RGBA_8888, // pixel with 8 bits for red, green, blue, alpha; in 32-bit word + RGB_888x, // pixel with 8 bits each for red, green, blue; in 32-bit word + BGRA_8888, // pixel with 8 bits for blue, green, red, alpha; in 32-bit word + RGBA_1010102, // 10 bits for red, green, blue; 2 bits for alpha; in 32-bit word + BGRA_1010102, // 10 bits for blue, green, red; 2 bits for alpha; in 32-bit word + RGB_101010x, // pixel with 10 bits each for red, green, blue; in 32-bit word + BGR_101010x, // pixel with 10 bits each for blue, green, red; in 32-bit word + BGR_101010x_XR, // pixel with 10 bits each for blue, green, red; in 32-bit word, extended range + RGBA_10x6, // pixel with 10 used bits (most significant) followed by 6 unused + Gray_8, // pixel with grayscale level in 8-bit byte + RGBA_F16Norm, // pixel with half floats in [0,1] for red, green, blue, alpha; in 64-bit word + RGBA_F16, // pixel with half floats for red, green, blue, alpha; in 64-bit word + RGBA_F32, // pixel using C float for red, green, blue, alpha; in 128-bit word // The following 6 colortypes are just for reading from - not for rendering to - R8G8_unorm, //!< pixel with a uint8_t for red and green + R8G8_unorm, // pixel with a uint8_t for red and green - A16_float, //!< pixel with a half float for alpha - R16G16_float, //!< pixel with a half float for red and green + A16_float, // pixel with a half float for alpha + R16G16_float, // pixel with a half float for red and green + + A16_unorm, // pixel with a little endian uint16_t for alpha + R16G16_unorm, // pixel with a little endian uint16_t for red and green + R16G16B16A16_unorm, // pixel with a little endian uint16_t for red, green, blue, and alpha - A16_unorm, //!< pixel with a little endian uint16_t for alpha - R16G16_unorm, //!< pixel with a little endian uint16_t for red and green - R16G16B16A16_unorm, //!< pixel with a little endian uint16_t for red, green, blue - // and alpha SRGBA_8888, + R8_unorm, + + // The `kN32_SkColorType` is platform dependent in the original enum, + // and TypeScript doesn't support conditional compilation natively. + // You might need to handle it differently based on your use case. + N32_SkColorType, // either BGRA_8888 or RGBA_8888 based on the platform } export interface ImageInfo { diff --git a/package/src/skia/web/JsiSkFontMgrFactory.ts b/package/src/skia/web/JsiSkFontMgrFactory.ts index e07447d8ab..461da91c0c 100644 --- a/package/src/skia/web/JsiSkFontMgrFactory.ts +++ b/package/src/skia/web/JsiSkFontMgrFactory.ts @@ -15,8 +15,6 @@ export class JsiSkFontMgrFactory extends Host implements FontMgrFactory { if (!fontMgr) { throw new Error("Couldn't create system font manager"); } - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error return new JsiSkFontMgr(this.CanvasKit, fontMgr); } } diff --git a/package/src/skia/web/JsiSkTypefaceFontProvider.ts b/package/src/skia/web/JsiSkTypefaceFontProvider.ts index 47d3515d40..940a09833d 100644 --- a/package/src/skia/web/JsiSkTypefaceFontProvider.ts +++ b/package/src/skia/web/JsiSkTypefaceFontProvider.ts @@ -19,13 +19,9 @@ export class JsiSkTypefaceFontProvider throw new NotImplementedOnRNWeb(); } countFamilies() { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error return this.ref.countFamilies(); } getFamilyName(index: number) { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error return this.ref.getFamilyName(index); } registerFont(typeface: SkTypeface, familyName: string) { diff --git a/package/yarn.lock b/package/yarn.lock index a728f4cab2..b3bcdcdb13 100644 --- a/package/yarn.lock +++ b/package/yarn.lock @@ -2582,6 +2582,11 @@ "@typescript-eslint/types" "6.10.0" eslint-visitor-keys "^3.4.1" +"@webgpu/types@0.1.21": + version "0.1.21" + resolved "https://registry.yarnpkg.com/@webgpu/types/-/types-0.1.21.tgz#b181202daec30d66ccd67264de23814cfd176d3a" + integrity sha512-pUrWq3V5PiSGFLeLxoGqReTZmiiXwY3jRkIG5sLLKjyqNxrwm/04b4nw7LSmGWJcKk59XOM/YRTUwOzo4MMlow== + abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" @@ -3110,10 +3115,12 @@ caniuse-lite@^1.0.30001400: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001400.tgz#3038bee70d8b875604cd8833cb0e5e254ee0281a" integrity sha512-Mv659Hn65Z4LgZdJ7ge5JTVbE3rqbJaaXgW5LEI9/tOaXclfIZ8DW7D7FCWWWmWiiPS7AC48S8kf3DApSxQdgA== -canvaskit-wasm@0.38.2: - version "0.38.2" - resolved "https://registry.yarnpkg.com/canvaskit-wasm/-/canvaskit-wasm-0.38.2.tgz#b6c2be236670fd0f18977b9026652b2c0e201fee" - integrity sha512-ieRb6DO4yL91qUfyRgmyhp2Hi1KmQ9lIMfKacxHVlfp/CpKCkzgAxRGUbCsJFzwLKjs9fufGrIyvnzEYRwm1XQ== +canvaskit-wasm@0.39.1: + version "0.39.1" + resolved "https://registry.yarnpkg.com/canvaskit-wasm/-/canvaskit-wasm-0.39.1.tgz#c3c8f3962cbabbedf246f7bcf90e859013c7eae9" + integrity sha512-Gy3lCmhUdKq+8bvDrs9t8+qf7RvcjuQn+we7vTVVyqgOVO1UVfHpsnBxkTZw+R4ApEJ3D5fKySl9TU11hmjl/A== + dependencies: + "@webgpu/types" "0.1.21" chalk@^1.0.0: version "1.1.3"