From 7b21302f7363b1ab66dc788199a264f5903ef07f Mon Sep 17 00:00:00 2001 From: Bartosz Hanc Date: Fri, 7 Aug 2026 22:39:36 +0200 Subject: [PATCH] chore: upgrade react-native-worklets to 0.10.3 and remove patch --- apps/computer-vision/package.json | 4 +- apps/nlp/package.json | 4 +- apps/speech/package.json | 4 +- package.json | 4 +- packages/react-native-executorch/package.json | 4 +- patches/react-native-worklets+0.9.1.patch | 309 ------------------ yarn.lock | 37 ++- 7 files changed, 29 insertions(+), 337 deletions(-) delete mode 100644 patches/react-native-worklets+0.9.1.patch diff --git a/apps/computer-vision/package.json b/apps/computer-vision/package.json index 0f7d19cd7e..d26e149908 100644 --- a/apps/computer-vision/package.json +++ b/apps/computer-vision/package.json @@ -42,11 +42,11 @@ "react-native-executorch": "workspace:*", "react-native-gesture-handler": "~2.31.1", "react-native-image-picker": "^8.2.1", - "react-native-reanimated": "4.4.0", + "react-native-reanimated": "4.5.3", "react-native-safe-area-context": "~5.7.0", "react-native-screens": "~4.25.2", "react-native-svg": "15.15.4", - "react-native-worklets": "0.9.1" + "react-native-worklets": "0.10.3" }, "devDependencies": { "@babel/core": "^7.29.0", diff --git a/apps/nlp/package.json b/apps/nlp/package.json index b932d704ba..64a0a01bfa 100644 --- a/apps/nlp/package.json +++ b/apps/nlp/package.json @@ -31,11 +31,11 @@ "react-native-drawer-layout": "^4.2.2", "react-native-executorch": "workspace:*", "react-native-gesture-handler": "~2.31.1", - "react-native-reanimated": "4.4.0", + "react-native-reanimated": "4.5.3", "react-native-safe-area-context": "~5.7.0", "react-native-screens": "~4.25.2", "react-native-svg": "15.15.4", - "react-native-worklets": "0.9.1" + "react-native-worklets": "0.10.3" }, "devDependencies": { "@babel/core": "^7.29.0", diff --git a/apps/speech/package.json b/apps/speech/package.json index c461c21484..3b27e92ad7 100644 --- a/apps/speech/package.json +++ b/apps/speech/package.json @@ -32,11 +32,11 @@ "react-native-drawer-layout": "^4.2.2", "react-native-executorch": "workspace:*", "react-native-gesture-handler": "~2.31.1", - "react-native-reanimated": "4.4.0", + "react-native-reanimated": "4.5.3", "react-native-safe-area-context": "~5.7.0", "react-native-screens": "~4.25.2", "react-native-svg": "15.15.4", - "react-native-worklets": "0.9.1" + "react-native-worklets": "0.10.3" }, "devDependencies": { "@babel/core": "^7.29.0", diff --git a/package.json b/package.json index 2037220fd9..1da32fa846 100644 --- a/package.json +++ b/package.json @@ -31,10 +31,10 @@ "patch-package": "^8.0.0", "prettier": "^3.3.3", "prettier-plugin-jsdoc": "^1.3.0", - "react-native-worklets": "0.9.1", + "react-native-worklets": "0.10.3", "typescript": "~5.9.2" }, "resolutions": { - "react-native-worklets": "0.9.1" + "react-native-worklets": "0.10.3" } } diff --git a/packages/react-native-executorch/package.json b/packages/react-native-executorch/package.json index 9311d4952c..4d7c71d5f6 100644 --- a/packages/react-native-executorch/package.json +++ b/packages/react-native-executorch/package.json @@ -86,7 +86,7 @@ "react": "*", "react-native": "*", "react-native-blob-util": "^0.24.0", - "react-native-worklets": "*" + "react-native-worklets": "^0.10.0" }, "devDependencies": { "@babel/core": "^7.25.1", @@ -98,7 +98,7 @@ "react-native": "0.83.6", "react-native-blob-util": "^0.24.0", "react-native-builder-bob": "^0.40.18", - "react-native-worklets": "0.9.1", + "react-native-worklets": "0.10.3", "typescript": "~5.9.2" }, "react-native-builder-bob": { diff --git a/patches/react-native-worklets+0.9.1.patch b/patches/react-native-worklets+0.9.1.patch deleted file mode 100644 index 32c25c0dce..0000000000 --- a/patches/react-native-worklets+0.9.1.patch +++ /dev/null @@ -1,309 +0,0 @@ -diff --git a/node_modules/react-native-worklets/Common/cpp/worklets/NativeModules/JSIWorkletsModuleProxy.cpp b/node_modules/react-native-worklets/Common/cpp/worklets/NativeModules/JSIWorkletsModuleProxy.cpp -index 33ff739..aa1fee2 100644 ---- a/node_modules/react-native-worklets/Common/cpp/worklets/NativeModules/JSIWorkletsModuleProxy.cpp -+++ b/node_modules/react-native-worklets/Common/cpp/worklets/NativeModules/JSIWorkletsModuleProxy.cpp -@@ -400,6 +400,18 @@ jsi::Object JSIWorkletsModuleProxy::toOptimizedObject(jsi::Runtime &rt) const { - return makeSerializableRegExp(rt, pattern, flags); - }); - -+ jsi_utils::addMethod<4>( -+ rt, -+ obj, -+ "createSerializableArrayBufferView", -+ [](jsi::Runtime &rt, const jsi::Value &, const jsi::Value(&args)[4]) { -+ auto typeName = at<0>(args).getString(rt).utf8(rt); -+ auto arrayBuffer = at<1>(args).getObject(rt).getArrayBuffer(rt); -+ auto byteOffset = static_cast(at<2>(args).asNumber()); -+ auto length = static_cast(at<3>(args).asNumber()); -+ return makeSerializableArrayBuffer(rt, arrayBuffer, typeName, byteOffset, length); -+ }); -+ - jsi_utils::addMethod<2>( - rt, obj, "createSerializableWorklet", [](jsi::Runtime &rt, const jsi::Value &, const jsi::Value(&args)[2]) { - return makeSerializableWorklet(rt, at<0>(args).getObject(rt), at<1>(args).getBool()); -diff --git a/node_modules/react-native-worklets/Common/cpp/worklets/SharedItems/Serializable.cpp b/node_modules/react-native-worklets/Common/cpp/worklets/SharedItems/Serializable.cpp -index 3114a09..26cc787 100644 ---- a/node_modules/react-native-worklets/Common/cpp/worklets/SharedItems/Serializable.cpp -+++ b/node_modules/react-native-worklets/Common/cpp/worklets/SharedItems/Serializable.cpp -@@ -160,7 +160,12 @@ jsi::Value SerializableArrayBuffer::toJSValue(jsi::Runtime &rt) { - auto arrayBuffer = - rt.global().getPropertyAsFunction(rt, "ArrayBuffer").callAsConstructor(rt, size).getObject(rt).getArrayBuffer(rt); - memcpy(arrayBuffer.data(rt), data_.data(), size); -- return arrayBuffer; -+ if (typeName_.empty()) { -+ return arrayBuffer; -+ } -+ -+ auto constructor = rt.global().getPropertyAsFunction(rt, typeName_.c_str()); -+ return constructor.callAsConstructor(rt, arrayBuffer, static_cast(byteOffset_), static_cast(length_)); - } - - SerializableObject::SerializableObject(jsi::Runtime &rt, const jsi::Object &object) -diff --git a/node_modules/react-native-worklets/Common/cpp/worklets/SharedItems/Serializable.h b/node_modules/react-native-worklets/Common/cpp/worklets/SharedItems/Serializable.h -index 4194097..f397b2b 100644 ---- a/node_modules/react-native-worklets/Common/cpp/worklets/SharedItems/Serializable.h -+++ b/node_modules/react-native-worklets/Common/cpp/worklets/SharedItems/Serializable.h -@@ -251,9 +251,24 @@ class SerializableArrayBuffer : public Serializable { - : Serializable(ValueType::ArrayBufferType), - data_(arrayBuffer.data(rt), arrayBuffer.data(rt) + arrayBuffer.size(rt)) {} - -+ SerializableArrayBuffer( -+ jsi::Runtime &rt, -+ const jsi::ArrayBuffer &arrayBuffer, -+ const std::string &typeName, -+ size_t byteOffset, -+ size_t length) -+ : Serializable(ValueType::ArrayBufferType), -+ typeName_(typeName), -+ byteOffset_(byteOffset), -+ length_(length), -+ data_(arrayBuffer.data(rt), arrayBuffer.data(rt) + arrayBuffer.size(rt)) {} -+ - jsi::Value toJSValue(jsi::Runtime &rt) override; - - protected: -+ const std::string typeName_; -+ const size_t byteOffset_{0}; -+ const size_t length_{0}; - const std::vector data_; - }; - -diff --git a/node_modules/react-native-worklets/Common/cpp/worklets/SharedItems/SerializableFactory.cpp b/node_modules/react-native-worklets/Common/cpp/worklets/SharedItems/SerializableFactory.cpp -index 97b0787..62bd3b7 100644 ---- a/node_modules/react-native-worklets/Common/cpp/worklets/SharedItems/SerializableFactory.cpp -+++ b/node_modules/react-native-worklets/Common/cpp/worklets/SharedItems/SerializableFactory.cpp -@@ -89,8 +89,19 @@ jsi::Value makeSerializableArray(jsi::Runtime &rt, const jsi::Array &array, cons - return SerializableJSRef::newNativeStateObject(rt, serializable); - } - --jsi::Value makeSerializableArrayBuffer(jsi::Runtime &rt, const jsi::ArrayBuffer &arrayBuffer) { -- auto serializable = std::make_shared(rt, arrayBuffer); -+jsi::Value makeSerializableArrayBuffer( -+ jsi::Runtime &rt, -+ const jsi::ArrayBuffer &arrayBuffer, -+ std::optional typeName, -+ std::optional byteOffset, -+ std::optional length) { -+ std::shared_ptr serializable; -+ if (typeName.has_value()) { -+ serializable = std::make_shared( -+ rt, arrayBuffer, *typeName, byteOffset.value_or(0), length.value_or(0)); -+ } else { -+ serializable = std::make_shared(rt, arrayBuffer); -+ } - return SerializableJSRef::newNativeStateObject(rt, serializable); - } - -diff --git a/node_modules/react-native-worklets/Common/cpp/worklets/SharedItems/SerializableFactory.h b/node_modules/react-native-worklets/Common/cpp/worklets/SharedItems/SerializableFactory.h -index a7ce5ef..ca1c67d 100644 ---- a/node_modules/react-native-worklets/Common/cpp/worklets/SharedItems/SerializableFactory.h -+++ b/node_modules/react-native-worklets/Common/cpp/worklets/SharedItems/SerializableFactory.h -@@ -4,6 +4,7 @@ - #include - - #include -+#include - #include - - namespace worklets { -@@ -37,7 +38,12 @@ jsi::Value makeSerializableHostObject(jsi::Runtime &rt, const std::shared_ptr typeName = std::nullopt, -+ std::optional byteOffset = std::nullopt, -+ std::optional length = std::nullopt); - - jsi::Value makeSerializableMap(jsi::Runtime &rt, const jsi::Array &keys, const jsi::Array &values); - -diff --git a/node_modules/react-native-worklets/lib/module/WorkletsModule/NativeWorklets.native.js b/node_modules/react-native-worklets/lib/module/WorkletsModule/NativeWorklets.native.js -index e55cd53..4245408 100644 ---- a/node_modules/react-native-worklets/lib/module/WorkletsModule/NativeWorklets.native.js -+++ b/node_modules/react-native-worklets/lib/module/WorkletsModule/NativeWorklets.native.js -@@ -93,6 +93,9 @@ See https://docs.swmansion.com/react-native-worklets/docs/guides/troubleshooting - createSerializableRegExp(pattern, flags) { - return this.#workletsModuleProxy.createSerializableRegExp(pattern, flags); - } -+ createSerializableArrayBufferView(typeName, buffer, byteOffset, length) { -+ return this.#workletsModuleProxy.createSerializableArrayBufferView(typeName, buffer, byteOffset, length); -+ } - createSerializableInitializer(obj) { - return this.#workletsModuleProxy.createSerializableInitializer(obj); - } -diff --git a/node_modules/react-native-worklets/lib/module/memory/serializable.native.js b/node_modules/react-native-worklets/lib/module/memory/serializable.native.js -index d0131ff..f7c60c2 100644 ---- a/node_modules/react-native-worklets/lib/module/memory/serializable.native.js -+++ b/node_modules/react-native-worklets/lib/module/memory/serializable.native.js -@@ -432,24 +432,14 @@ function cloneArrayBuffer(arrayBuffer) { - return clone; - } - function cloneArrayBufferView(value) { -- const buffer = value.buffer; - const typeName = value.constructor.name; -- const handle = cloneInitializer({ -- __init: () => { -- 'worklet'; -- -- if (!VALID_ARRAY_VIEWS_NAMES.includes(typeName)) { -- throw new Error(`[Worklets] Invalid array view name \`${typeName}\`.`); -- } -- const constructor = global[typeName]; -- if (constructor === undefined) { -- throw new Error(`[Worklets] Constructor for \`${typeName}\` not found.`); -- } -- return new constructor(buffer); -- } -- }); -- serializableMappingCache.set(value, handle); -- return handle; -+ if (!VALID_ARRAY_VIEWS_NAMES.includes(typeName)) { -+ throw new Error(`[Worklets] Invalid array view name \`${typeName}\`.`); -+ } -+ const length = typeName === 'DataView' ? value.byteLength : value.length; -+ const clone = WorkletsModule.createSerializableArrayBufferView(typeName, value.buffer, value.byteOffset, length); -+ serializableMappingCache.set(value, clone); -+ return clone; - } - function cloneSynchronizable(value) { - serializableMappingCache.set(value); -@@ -575,6 +565,17 @@ function makeShareableCloneOnUIRecursiveLEGACY(value) { - if (value instanceof RegExp) { - return globalThis.__workletsModuleProxy.createSerializableRegExp(value.source, value.flags); - } -+ if (value instanceof ArrayBuffer) { -+ return globalThis.__workletsModuleProxy.createSerializableArrayBuffer(value); -+ } -+ if (ArrayBuffer.isView(value)) { -+ const typeName = value.constructor.name; -+ if (!VALID_ARRAY_VIEWS_NAMES.includes(typeName)) { -+ throw new Error(`[Worklets] Invalid array view name \`${typeName}\`.`); -+ } -+ const length = typeName === 'DataView' ? value.byteLength : value.length; -+ return globalThis.__workletsModuleProxy.createSerializableArrayBufferView(typeName, value.buffer, value.byteOffset, length); -+ } - if (value instanceof Map) { - const keys = []; - const values = []; -diff --git a/node_modules/react-native-worklets/src/WorkletsModule/NativeWorklets.native.ts b/node_modules/react-native-worklets/src/WorkletsModule/NativeWorklets.native.ts -index 778a677..0a21bac 100644 ---- a/node_modules/react-native-worklets/src/WorkletsModule/NativeWorklets.native.ts -+++ b/node_modules/react-native-worklets/src/WorkletsModule/NativeWorklets.native.ts -@@ -168,6 +168,20 @@ See https://docs.swmansion.com/react-native-worklets/docs/guides/troubleshooting - return this.#workletsModuleProxy.createSerializableRegExp(pattern, flags); - } - -+ createSerializableArrayBufferView( -+ typeName: string, -+ buffer: ArrayBuffer, -+ byteOffset: number, -+ length: number -+ ): SerializableRef { -+ return this.#workletsModuleProxy.createSerializableArrayBufferView( -+ typeName, -+ buffer, -+ byteOffset, -+ length -+ ); -+ } -+ - createSerializableInitializer(obj: object) { - return this.#workletsModuleProxy.createSerializableInitializer(obj); - } -diff --git a/node_modules/react-native-worklets/src/WorkletsModule/workletsModuleProxy.ts b/node_modules/react-native-worklets/src/WorkletsModule/workletsModuleProxy.ts -index d545482..5cc7ff0 100644 ---- a/node_modules/react-native-worklets/src/WorkletsModule/workletsModuleProxy.ts -+++ b/node_modules/react-native-worklets/src/WorkletsModule/workletsModuleProxy.ts -@@ -92,6 +92,13 @@ export interface WorkletsModuleProxy { - flags: string - ): SerializableRef; - -+ createSerializableArrayBufferView( -+ typeName: string, -+ buffer: ArrayBuffer, -+ byteOffset: number, -+ length: number -+ ): SerializableRef; -+ - createSerializableInitializer(obj: object): SerializableRef; - - createSerializableNonWorkletFunction( -diff --git a/node_modules/react-native-worklets/src/memory/serializable.native.ts b/node_modules/react-native-worklets/src/memory/serializable.native.ts -index fd73c6b..ef23281 100644 ---- a/node_modules/react-native-worklets/src/memory/serializable.native.ts -+++ b/node_modules/react-native-worklets/src/memory/serializable.native.ts -@@ -639,26 +639,22 @@ function cloneArrayBuffer( - function cloneArrayBufferView( - value: TValue - ): SerializableRef { -- const buffer = value.buffer; - const typeName = value.constructor.name; -- const handle = cloneInitializer({ -- __init: () => { -- 'worklet'; -- if (!VALID_ARRAY_VIEWS_NAMES.includes(typeName)) { -- throw new Error(`[Worklets] Invalid array view name \`${typeName}\`.`); -- } -- const constructor = global[typeName as keyof typeof global]; -- if (constructor === undefined) { -- throw new Error( -- `[Worklets] Constructor for \`${typeName}\` not found.` -- ); -- } -- return new constructor(buffer); -- }, -- }) as unknown as SerializableRef; -- serializableMappingCache.set(value, handle); -- -- return handle; -+ if (!VALID_ARRAY_VIEWS_NAMES.includes(typeName)) { -+ throw new Error(`[Worklets] Invalid array view name \`${typeName}\`.`); -+ } -+ const length = -+ typeName === 'DataView' -+ ? value.byteLength -+ : (value as unknown as { length: number }).length; -+ const clone = WorkletsModule.createSerializableArrayBufferView( -+ typeName, -+ value.buffer as ArrayBuffer, -+ value.byteOffset, -+ length -+ ); -+ serializableMappingCache.set(value, clone); -+ return clone; - } - - function cloneSynchronizable( -@@ -821,6 +817,29 @@ function makeShareableCloneOnUIRecursiveLEGACY( - value.flags - ) as FlatSerializableRef; - } -+ if (value instanceof ArrayBuffer) { -+ return globalThis.__workletsModuleProxy.createSerializableArrayBuffer( -+ value -+ ) as FlatSerializableRef; -+ } -+ if (ArrayBuffer.isView(value)) { -+ const typeName = value.constructor.name; -+ if (!VALID_ARRAY_VIEWS_NAMES.includes(typeName)) { -+ throw new Error( -+ `[Worklets] Invalid array view name \`${typeName}\`.` -+ ); -+ } -+ const length = -+ typeName === 'DataView' -+ ? value.byteLength -+ : (value as unknown as { length: number }).length; -+ return globalThis.__workletsModuleProxy.createSerializableArrayBufferView( -+ typeName, -+ value.buffer as ArrayBuffer, -+ value.byteOffset, -+ length -+ ) as FlatSerializableRef; -+ } - if (value instanceof Map) { - const keys: unknown[] = []; - const values: unknown[] = []; \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index c3ada1c5a0..e90a8e5f3a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6811,12 +6811,12 @@ __metadata: react-native-executorch: "workspace:*" react-native-gesture-handler: "npm:~2.31.1" react-native-image-picker: "npm:^8.2.1" - react-native-reanimated: "npm:4.4.0" + react-native-reanimated: "npm:4.5.3" react-native-safe-area-context: "npm:~5.7.0" react-native-screens: "npm:~4.25.2" react-native-svg: "npm:15.15.4" react-native-svg-transformer: "npm:^1.5.3" - react-native-worklets: "npm:0.9.1" + react-native-worklets: "npm:0.10.3" react-refresh: "npm:^0.14.0" languageName: unknown linkType: soft @@ -11926,12 +11926,12 @@ __metadata: react-native-drawer-layout: "npm:^4.2.2" react-native-executorch: "workspace:*" react-native-gesture-handler: "npm:~2.31.1" - react-native-reanimated: "npm:4.4.0" + react-native-reanimated: "npm:4.5.3" react-native-safe-area-context: "npm:~5.7.0" react-native-screens: "npm:~4.25.2" react-native-svg: "npm:15.15.4" react-native-svg-transformer: "npm:^1.5.3" - react-native-worklets: "npm:0.9.1" + react-native-worklets: "npm:0.10.3" react-refresh: "npm:^0.14.0" languageName: unknown linkType: soft @@ -12924,7 +12924,7 @@ __metadata: patch-package: "npm:^8.0.0" prettier: "npm:^3.3.3" prettier-plugin-jsdoc: "npm:^1.3.0" - react-native-worklets: "npm:0.9.1" + react-native-worklets: "npm:0.10.3" typescript: "npm:~5.9.2" languageName: unknown linkType: soft @@ -12960,13 +12960,13 @@ __metadata: react-native: "npm:0.83.6" react-native-blob-util: "npm:^0.24.0" react-native-builder-bob: "npm:^0.40.18" - react-native-worklets: "npm:0.9.1" + react-native-worklets: "npm:0.10.3" typescript: "npm:~5.9.2" peerDependencies: react: "*" react-native: "*" react-native-blob-util: ^0.24.0 - react-native-worklets: "*" + react-native-worklets: ^0.10.0 languageName: unknown linkType: soft @@ -13025,17 +13025,17 @@ __metadata: languageName: node linkType: hard -"react-native-reanimated@npm:4.4.0": - version: 4.4.0 - resolution: "react-native-reanimated@npm:4.4.0" +"react-native-reanimated@npm:4.5.3": + version: 4.5.3 + resolution: "react-native-reanimated@npm:4.5.3" dependencies: react-native-is-edge-to-edge: "npm:^1.3.1" semver: "npm:^7.7.3" peerDependencies: react: "*" react-native: 0.83 - 0.86 - react-native-worklets: 0.9.x - checksum: 10/3c8c79d1cda0bfcc442deaf485867a0d1f175da417a46a144583e66f3a8c1f1a1e69d38993e30c99ff26da1c8166dab311ef5d657d7b354468b6ecfdb6a92262 + react-native-worklets: 0.10.x - 0.11.x + checksum: 10/b043b6316156a525f3b77bb22279dc9bc1113c06ae5e818e6511e879f989b5a0884a9b5abc2b8c93c8e14430011602850067585036e4645370ce503c7995673b languageName: node linkType: hard @@ -13119,9 +13119,9 @@ __metadata: languageName: node linkType: hard -"react-native-worklets@npm:0.9.1": - version: 0.9.1 - resolution: "react-native-worklets@npm:0.9.1" +"react-native-worklets@npm:0.10.3": + version: 0.10.3 + resolution: "react-native-worklets@npm:0.10.3" dependencies: "@babel/plugin-transform-arrow-functions": "npm:^7.27.1" "@babel/plugin-transform-class-properties": "npm:^7.28.6" @@ -13132,6 +13132,7 @@ __metadata: "@babel/plugin-transform-template-literals": "npm:^7.27.1" "@babel/plugin-transform-unicode-regex": "npm:^7.27.1" "@babel/preset-typescript": "npm:^7.28.5" + "@babel/types": "npm:^7.27.1" convert-source-map: "npm:^2.0.0" semver: "npm:^7.7.4" peerDependencies: @@ -13139,7 +13140,7 @@ __metadata: "@react-native/metro-config": "*" react: "*" react-native: 0.83 - 0.86 - checksum: 10/03ec3dfcff65311af247149135d2727e60851c99c12b67927093f8022a618115ad3dda29b707fcb77a7a8a0fe0a68efea065bfa3053020df8dc6f7b402d4d16f + checksum: 10/4e92345787ee6a8eae4f681f34fbcd4298037615245f9f541fbf9731898d9d957b92f1b25a4e2f2a35730d3bb528dc3e2f28b45b2de8a306b54534fc37138394 languageName: node linkType: hard @@ -14097,12 +14098,12 @@ __metadata: react-native-drawer-layout: "npm:^4.2.2" react-native-executorch: "workspace:*" react-native-gesture-handler: "npm:~2.31.1" - react-native-reanimated: "npm:4.4.0" + react-native-reanimated: "npm:4.5.3" react-native-safe-area-context: "npm:~5.7.0" react-native-screens: "npm:~4.25.2" react-native-svg: "npm:15.15.4" react-native-svg-transformer: "npm:^1.5.3" - react-native-worklets: "npm:0.9.1" + react-native-worklets: "npm:0.10.3" react-refresh: "npm:^0.14.0" languageName: unknown linkType: soft