diff --git a/README.md b/README.md
index 991c7c76..8ed0fbe3 100644
--- a/README.md
+++ b/README.md
@@ -15,7 +15,7 @@
- Supports in-memory image operations like resizing and cropping without saving to file 📐
- Supports deferred `ImageLoader` types to optimize for displaying large lists of Images ⏳
- Fast Web Image loading and caching using [SDWebImage](https://github.com/SDWebImage/SDWebImage) (iOS) and [Coil](https://github.com/coil-kt/coil) (Android) 🌎
-- [ThumbHash](https://github.com/evanw/thumbhash) support for elegant placeholders 🖼️
+- [ThumbHash](https://github.com/evanw/thumbhash) support for elegant placeholders (via the separate [`react-native-nitro-image-thumbhash`](./packages/react-native-nitro-image-thumbhash) package) 🖼️
```tsx
function App() {
@@ -346,16 +346,22 @@ Since it is a very small buffer (or base64 string), it can be added to a payload
Everytime you upload a new profile picture for the user, you should encode the image to a new ThumbHash again and update the `users.profile_picture_thumbhash` field. This should ideally happen on your backend, but can also be performed on-device if needed.
-#### ThumbHash (`ArrayBuffer`) <> Image
+ThumbHash support lives in a separate package, [`react-native-nitro-image-thumbhash`](./packages/react-native-nitro-image-thumbhash), so apps that don't need it don't pay for it.
+
+```sh
+bun add react-native-nitro-image-thumbhash
+```
-NitroImage supports conversion from- and to- [ThumbHash](https://github.com/evanw/thumbhash) representations out of the box.
+#### ThumbHash (`ArrayBuffer`) <> Image
For performance reasons, a ThumbHash is represented as an `ArrayBuffer`.
```ts
+import { ThumbHash } from 'react-native-nitro-image-thumbhash'
+
const thumbHash = ...from server
-const image = Images.loadFromThumbHash(thumbHash)
-const thumbHashAgain = image.toThumbHash()
+const image = ThumbHash.decode(thumbHash)
+const thumbHashAgain = ThumbHash.encode(image)
```
##### ThumbHash (`ArrayBuffer`) <> Base64 String
@@ -363,9 +369,11 @@ const thumbHashAgain = image.toThumbHash()
If your ThumbHash is a `string`, convert it to an `ArrayBuffer` first, since this is more efficient:
```ts
+import { ThumbHash } from 'react-native-nitro-image-thumbhash'
+
const thumbHashBase64 = ...from server
-const thumbHashArrayBuffer = thumbHashFromBase64String(thumbHashBase64)
-const thumbHashBase64Again = thumbHashToBase64String(thumbHashArrayBuffer)
+const thumbHashArrayBuffer = ThumbHash.fromBase64String(thumbHashBase64)
+const thumbHashBase64Again = ThumbHash.toBase64String(thumbHashArrayBuffer)
```
##### Async ThumbHash
@@ -373,9 +381,11 @@ const thumbHashBase64Again = thumbHashToBase64String(thumbHashArrayBuffer)
Since ThumbHash decoding or encoding can be a slow process, you should consider using the async methods instead:
```ts
+import { ThumbHash } from 'react-native-nitro-image-thumbhash'
+
const thumbHash = ...from server
-const image = await Images.loadFromThumbHashAsync(thumbHash)
-const thumbHashAgain = await image.toThumbHash()
+const image = await ThumbHash.decodeAsync(thumbHash)
+const thumbHashAgain = await ThumbHash.encodeAsync(image)
```
## Using the native `Image` type in a third-party library
diff --git a/bun.lock b/bun.lock
index 7fb5a4bc..8386b7bd 100644
--- a/bun.lock
+++ b/bun.lock
@@ -30,6 +30,7 @@
"react-native-fast-image": "^8.6.3",
"react-native-harness": "^1.0.0-alpha.25",
"react-native-nitro-image": "workspace:*",
+ "react-native-nitro-image-thumbhash": "workspace:*",
"react-native-nitro-modules": "0.35.5",
"react-native-nitro-web-image": "workspace:*",
"react-native-safe-area-context": "^5.6.0",
@@ -69,6 +70,29 @@
"react-native-nitro-modules": "*",
},
},
+ "packages/react-native-nitro-image-thumbhash": {
+ "name": "react-native-nitro-image-thumbhash",
+ "version": "0.0.1",
+ "devDependencies": {
+ "@react-native/eslint-config": "0.83.0",
+ "@types/react": "^19.1.03",
+ "eslint": "^8.57.0",
+ "eslint-config-prettier": "^9.1.0",
+ "eslint-plugin-prettier": "^5.2.1",
+ "nitrogen": "*",
+ "prettier": "^3.3.3",
+ "react": "19.2.0",
+ "react-native": "0.83.0",
+ "react-native-nitro-modules": "*",
+ "typescript": "^5.8.3",
+ },
+ "peerDependencies": {
+ "react": "*",
+ "react-native": "*",
+ "react-native-nitro-image": "*",
+ "react-native-nitro-modules": "*",
+ },
+ },
"packages/react-native-nitro-web-image": {
"name": "react-native-nitro-web-image",
"version": "0.14.0",
@@ -95,6 +119,8 @@
"@babel/core": ["@babel/core@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-module-transforms": "^7.28.6", "@babel/helpers": "^7.28.6", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/traverse": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA=="],
+ "@babel/eslint-parser": ["@babel/eslint-parser@7.29.7", "", { "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.11.0", "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" } }, "sha512-zxt+UJTOMKvUt3yOg+D58MLuz334pHp93qifMFcjIIO+9hN6t+ufw2gi7vDPMpxvfnHRR+3VVXvIjineCcgyXw=="],
+
"@babel/generator": ["@babel/generator@7.29.1", "", { "dependencies": { "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw=="],
"@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" } }, "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg=="],
@@ -367,10 +393,24 @@
"@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="],
+ "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ=="],
+
+ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="],
+
+ "@eslint/eslintrc": ["@eslint/eslintrc@2.1.4", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ=="],
+
+ "@eslint/js": ["@eslint/js@8.57.1", "", {}, "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q=="],
+
"@hapi/hoek": ["@hapi/hoek@9.3.0", "", {}, "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ=="],
"@hapi/topo": ["@hapi/topo@5.1.0", "", { "dependencies": { "@hapi/hoek": "^9.0.0" } }, "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg=="],
+ "@humanwhocodes/config-array": ["@humanwhocodes/config-array@0.13.0", "", { "dependencies": { "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" } }, "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw=="],
+
+ "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="],
+
+ "@humanwhocodes/object-schema": ["@humanwhocodes/object-schema@2.0.3", "", {}, "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA=="],
+
"@iarna/toml": ["@iarna/toml@3.0.0", "", {}, "sha512-td6ZUkz2oS3VeleBcN+m//Q6HlCFCPrnI0FZhrt/h4XqLEdOyYp2u21nd8MdsR+WJy5r9PTDaHTDDfhf4H4l6Q=="],
"@inquirer/ansi": ["@inquirer/ansi@1.0.2", "", {}, "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ=="],
@@ -465,6 +505,8 @@
"@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.12", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.10.0" } }, "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ=="],
+ "@nicolo-ribaudo/eslint-scope-5-internals": ["@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1", "", { "dependencies": { "eslint-scope": "5.1.1" } }, "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg=="],
+
"@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
"@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="],
@@ -567,8 +609,14 @@
"@react-native/debugger-frontend": ["@react-native/debugger-frontend@0.81.0", "", {}, "sha512-N/8uL2CGQfwiQRYFUNfmaYxRDSoSeOmFb56rb0PDnP3XbS5+X9ee7X4bdnukNHLGfkRdH7sVjlB8M5zE8XJOhw=="],
+ "@react-native/debugger-shell": ["@react-native/debugger-shell@0.83.0", "", { "dependencies": { "cross-spawn": "^7.0.6", "fb-dotslash": "0.5.8" } }, "sha512-rJJxRRLLsKW+cqd0ALSBoqwL5SQTmwpd5SGl6rq9sY+fInCUKfkLEIc5HWQ0ppqoPyDteQVWbQ3a5VN84aJaNg=="],
+
"@react-native/dev-middleware": ["@react-native/dev-middleware@0.81.0", "", { "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.81.0", "chrome-launcher": "^0.15.2", "chromium-edge-launcher": "^0.2.0", "connect": "^3.6.5", "debug": "^4.4.0", "invariant": "^2.2.4", "nullthrows": "^1.1.1", "open": "^7.0.3", "serve-static": "^1.16.2", "ws": "^6.2.3" } }, "sha512-J/HeC/+VgRyGECPPr9rAbe5S0OL6MCIrvrC/kgNKSME5+ZQLCiTpt3pdAoAMXwXiF9a02Nmido0DnyM1acXTIA=="],
+ "@react-native/eslint-config": ["@react-native/eslint-config@0.83.0", "", { "dependencies": { "@babel/core": "^7.25.2", "@babel/eslint-parser": "^7.25.1", "@react-native/eslint-plugin": "0.83.0", "@typescript-eslint/eslint-plugin": "^8.36.0", "@typescript-eslint/parser": "^8.36.0", "eslint-config-prettier": "^8.5.0", "eslint-plugin-eslint-comments": "^3.2.0", "eslint-plugin-ft-flow": "^2.0.1", "eslint-plugin-jest": "^29.0.1", "eslint-plugin-react": "^7.30.1", "eslint-plugin-react-hooks": "^7.0.1", "eslint-plugin-react-native": "^4.0.0" }, "peerDependencies": { "eslint": ">=8", "prettier": ">=2" } }, "sha512-HTJg5XGQSGkVqeTvO7kOm1a1fNZ0VyZqhaLKAdWNwry+cWLkSnk9uohztnEIIP33FbP0Aybc7JuZIQon9OI3+w=="],
+
+ "@react-native/eslint-plugin": ["@react-native/eslint-plugin@0.83.0", "", {}, "sha512-a0lObGV1/1P6mrekSF+1KpRkdH2fefQ/8fm1kLTUNvR5mae8xXz+U+f+1lsgqqEHtoGHey5Ve5MUkjgj4WnqTQ=="],
+
"@react-native/gradle-plugin": ["@react-native/gradle-plugin@0.81.0", "", {}, "sha512-LGNtPXO1RKLws5ORRb4Q4YULi2qxM4qZRuARtwqM/1f2wyZVggqapoV0OXlaXaz+GiEd2ll3ROE4CcLN6J93jg=="],
"@react-native/js-polyfills": ["@react-native/js-polyfills@0.81.0", "", {}, "sha512-whXZWIogzoGpqdyTjqT89M6DXmlOkWqNpWoVOAwVi8XFCMO+L7WTk604okIgO6gdGZcP1YtFpQf9JusbKrv/XA=="],
@@ -665,6 +713,26 @@
"@types/yargs-parser": ["@types/yargs-parser@21.0.3", "", {}, "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ=="],
+ "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.60.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.60.0", "@typescript-eslint/type-utils": "8.60.0", "@typescript-eslint/utils": "8.60.0", "@typescript-eslint/visitor-keys": "8.60.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.60.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-QYb/sa74/s7OKMbACMjrYnGspj9Hs5YI5aaffSL65UfeBUzVzBJfVo3oWSpbzPurvm7yaCCo2Lk7lVj610HqKw=="],
+
+ "@typescript-eslint/parser": ["@typescript-eslint/parser@8.60.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.60.0", "@typescript-eslint/types": "8.60.0", "@typescript-eslint/typescript-estree": "8.60.0", "@typescript-eslint/visitor-keys": "8.60.0", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-fcqpj/MyK4sxDPcbe7STNPbpQL4RLZOPWuaTmwZYuc+hJKzRf58yRxfhqGpc6PIq9ZyfSBpfHgmUHmHs0KwHwg=="],
+
+ "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.60.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.60.0", "@typescript-eslint/types": "^8.60.0", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-aZu74NNKJeUWqCjDddzdiKaS82dgYgV/vmf+Ui3ZdZejmgfXR/q+pRumgobnQ2cCJTgGTWp4ypiwsuofFubavg=="],
+
+ "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.60.0", "", { "dependencies": { "@typescript-eslint/types": "8.60.0", "@typescript-eslint/visitor-keys": "8.60.0" } }, "sha512-pFzqhllJMs+jghLQWzV00ds39xLzuyqPSev5pd8f4Ir0rtKR3ZLUB4/4dhjOFighWb9larvtfJvqL+4yKDI3Xw=="],
+
+ "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.60.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-BZPR3RGYlAXnly6ymAxfkVn5rCbZzQNou0rxv3GfWZ8cTQp+hhVd73khbGLAd8k1TlAPLISH337M+tAgAnaJDQ=="],
+
+ "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.60.0", "", { "dependencies": { "@typescript-eslint/types": "8.60.0", "@typescript-eslint/typescript-estree": "8.60.0", "@typescript-eslint/utils": "8.60.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-SX46wEUtitCpq7AN38HkUU/+zvUpdKf7ephtWAFgckH8O7PQIyL5gvrhQgBLuEYgLfuKWOVvWVskMbuFHAz5xg=="],
+
+ "@typescript-eslint/types": ["@typescript-eslint/types@8.60.0", "", {}, "sha512-AsE7x2XaAK+CVbeih0Fvbn+r1qHxtpLDJ3XUuFcIinT318T90yHMJC+Zgv+jUuDjQQd06HKwxnDu6sz1IcTilA=="],
+
+ "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.60.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.60.0", "@typescript-eslint/tsconfig-utils": "8.60.0", "@typescript-eslint/types": "8.60.0", "@typescript-eslint/visitor-keys": "8.60.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-3AcZNBGMClm6CXDyo8kYvVGT/sx29sS0oBsIb9oZI2gunA4Vm2M3YHzRLPvsUBBsl+yB5FPtltq7gGH0iTlp9g=="],
+
+ "@typescript-eslint/utils": ["@typescript-eslint/utils@8.60.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.60.0", "@typescript-eslint/types": "8.60.0", "@typescript-eslint/typescript-estree": "8.60.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-HtXuPfrHTyBDkameWpl+vJb1Uevu2tznAyahM1Oc4AENidCLTPiZDWIo4GfcxNdC/RcfGcadzzkqbRG87dUrQA=="],
+
+ "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.60.0", "", { "dependencies": { "@typescript-eslint/types": "8.60.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-9WI52t8ZGLVGrPMBet25yAftqY/n95+zmoUUtJBBQTKDSKUu7OsPTroT2op7U9JatkoRccL0YkWDNMFfC4Sjxg=="],
+
"@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="],
"@unrs/resolver-binding-android-arm-eabi": ["@unrs/resolver-binding-android-arm-eabi@1.11.1", "", { "os": "android", "cpu": "arm" }, "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw=="],
@@ -723,10 +791,14 @@
"acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="],
+ "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="],
+
"agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="],
"aggregate-error": ["aggregate-error@3.1.0", "", { "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" } }, "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA=="],
+ "ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="],
+
"anser": ["anser@1.4.10", "", {}, "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww=="],
"ansi-escapes": ["ansi-escapes@4.3.2", "", { "dependencies": { "type-fest": "^0.21.3" } }, "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ=="],
@@ -743,10 +815,24 @@
"argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
+ "array-buffer-byte-length": ["array-buffer-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw=="],
+
"array-ify": ["array-ify@1.0.0", "", {}, "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng=="],
+ "array-includes": ["array-includes@3.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.0", "es-object-atoms": "^1.1.1", "get-intrinsic": "^1.3.0", "is-string": "^1.1.1", "math-intrinsics": "^1.1.0" } }, "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ=="],
+
"array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="],
+ "array.prototype.findlast": ["array.prototype.findlast@1.2.5", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ=="],
+
+ "array.prototype.flat": ["array.prototype.flat@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg=="],
+
+ "array.prototype.flatmap": ["array.prototype.flatmap@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg=="],
+
+ "array.prototype.tosorted": ["array.prototype.tosorted@1.1.4", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3", "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA=="],
+
+ "arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.4", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ=="],
+
"asap": ["asap@2.0.6", "", {}, "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="],
"assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="],
@@ -755,10 +841,14 @@
"astral-regex": ["astral-regex@1.0.0", "", {}, "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg=="],
+ "async-function": ["async-function@1.0.0", "", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="],
+
"async-limiter": ["async-limiter@1.0.1", "", {}, "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="],
"async-retry": ["async-retry@1.3.3", "", { "dependencies": { "retry": "0.13.1" } }, "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw=="],
+ "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="],
+
"babel-jest": ["babel-jest@29.7.0", "", { "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" }, "peerDependencies": { "@babel/core": "^7.8.0" } }, "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg=="],
"babel-plugin-istanbul": ["babel-plugin-istanbul@6.1.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" } }, "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA=="],
@@ -817,6 +907,8 @@
"c12": ["c12@3.3.3", "", { "dependencies": { "chokidar": "^5.0.0", "confbox": "^0.2.2", "defu": "^6.1.4", "dotenv": "^17.2.3", "exsolve": "^1.0.8", "giget": "^2.0.0", "jiti": "^2.6.1", "ohash": "^2.0.11", "pathe": "^2.0.3", "perfect-debounce": "^2.0.0", "pkg-types": "^2.3.0", "rc9": "^2.1.2" }, "peerDependencies": { "magicast": "*" }, "optionalPeers": ["magicast"] }, "sha512-750hTRvgBy5kcMNPdh95Qo+XUBeGo8C7nsKSmedDmaQI+E0r82DwHeM6vBewDe4rGFbnxoa4V9pw+sPh5+Iz8Q=="],
+ "call-bind": ["call-bind@1.0.9", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "get-intrinsic": "^1.3.0", "set-function-length": "^1.2.2" } }, "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ=="],
+
"call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="],
"call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="],
@@ -939,6 +1031,12 @@
"data-uri-to-buffer": ["data-uri-to-buffer@6.0.2", "", {}, "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw=="],
+ "data-view-buffer": ["data-view-buffer@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ=="],
+
+ "data-view-byte-length": ["data-view-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ=="],
+
+ "data-view-byte-offset": ["data-view-byte-offset@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ=="],
+
"dayjs": ["dayjs@1.11.20", "", {}, "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ=="],
"debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
@@ -949,6 +1047,8 @@
"dedent": ["dedent@0.7.0", "", {}, "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA=="],
+ "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="],
+
"deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="],
"default-browser": ["default-browser@5.5.0", "", { "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" } }, "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw=="],
@@ -957,8 +1057,12 @@
"defaults": ["defaults@1.0.4", "", { "dependencies": { "clone": "^1.0.2" } }, "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A=="],
+ "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="],
+
"define-lazy-prop": ["define-lazy-prop@3.0.0", "", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="],
+ "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="],
+
"defu": ["defu@6.1.7", "", {}, "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ=="],
"degenerator": ["degenerator@5.0.1", "", { "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", "esprima": "^4.0.1" } }, "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ=="],
@@ -979,6 +1083,8 @@
"dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="],
+ "doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="],
+
"dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="],
"domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="],
@@ -1023,12 +1129,22 @@
"errorhandler": ["errorhandler@1.5.2", "", { "dependencies": { "accepts": "~1.3.8", "escape-html": "~1.0.3" } }, "sha512-kNAL7hESndBCrWwS72QyV3IVOTrVmj9D062FV5BQswNL5zEdeRmz/WJFyh6Aj/plvvSOrzddkxW57HgkZcR9Fw=="],
+ "es-abstract": ["es-abstract@1.24.2", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.3.0", "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.19" } }, "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg=="],
+
"es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="],
"es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="],
+ "es-iterator-helpers": ["es-iterator-helpers@1.3.2", "", { "dependencies": { "call-bind": "^1.0.9", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.2", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.1.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.3.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "iterator.prototype": "^1.1.5", "math-intrinsics": "^1.1.0" } }, "sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw=="],
+
"es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="],
+ "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="],
+
+ "es-shim-unscopables": ["es-shim-unscopables@1.1.0", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw=="],
+
+ "es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="],
+
"escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
"escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="],
@@ -1037,8 +1153,38 @@
"escodegen": ["escodegen@2.1.0", "", { "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", "esutils": "^2.0.2" }, "optionalDependencies": { "source-map": "~0.6.1" }, "bin": { "esgenerate": "bin/esgenerate.js", "escodegen": "bin/escodegen.js" } }, "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w=="],
+ "eslint": ["eslint@8.57.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", "@eslint/js": "8.57.1", "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" } }, "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA=="],
+
+ "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="],
+
+ "eslint-plugin-eslint-comments": ["eslint-plugin-eslint-comments@3.2.0", "", { "dependencies": { "escape-string-regexp": "^1.0.5", "ignore": "^5.0.5" }, "peerDependencies": { "eslint": ">=4.19.1" } }, "sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ=="],
+
+ "eslint-plugin-ft-flow": ["eslint-plugin-ft-flow@2.0.3", "", { "dependencies": { "lodash": "^4.17.21", "string-natural-compare": "^3.0.1" }, "peerDependencies": { "@babel/eslint-parser": "^7.12.0", "eslint": "^8.1.0" } }, "sha512-Vbsd/b+LYA99jUbsL6viEUWShFaYQt2YQs3QN3f+aeszOhh2sgdcU0mjzDyD4yyBvMc8qy2uwvBBWfMzEX06tg=="],
+
+ "eslint-plugin-jest": ["eslint-plugin-jest@29.15.2", "", { "dependencies": { "@typescript-eslint/utils": "^8.0.0" }, "peerDependencies": { "@typescript-eslint/eslint-plugin": "^8.0.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "jest": "*", "typescript": ">=4.8.4 <7.0.0" }, "optionalPeers": ["@typescript-eslint/eslint-plugin", "jest", "typescript"] }, "sha512-kEN4r9RZl1xcsb4arGq89LrcVdOUFII/JSCwtTPJyv16mDwmPrcuEQwpxqZHeINvcsd7oK5O/rhdGlxFRaZwvQ=="],
+
+ "eslint-plugin-prettier": ["eslint-plugin-prettier@5.5.5", "", { "dependencies": { "prettier-linter-helpers": "^1.0.1", "synckit": "^0.11.12" }, "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", "prettier": ">=3.0.0" }, "optionalPeers": ["@types/eslint", "eslint-config-prettier"] }, "sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw=="],
+
+ "eslint-plugin-react": ["eslint-plugin-react@7.37.5", "", { "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.3", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.9", "object.fromentries": "^2.0.8", "object.values": "^1.2.1", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", "string.prototype.matchall": "^4.0.12", "string.prototype.repeat": "^1.0.0" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA=="],
+
+ "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@7.1.1", "", { "dependencies": { "@babel/core": "^7.24.4", "@babel/parser": "^7.24.4", "hermes-parser": "^0.25.1", "zod": "^3.25.0 || ^4.0.0", "zod-validation-error": "^3.5.0 || ^4.0.0" }, "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" } }, "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g=="],
+
+ "eslint-plugin-react-native": ["eslint-plugin-react-native@4.1.0", "", { "dependencies": { "eslint-plugin-react-native-globals": "^0.1.1" }, "peerDependencies": { "eslint": "^3.17.0 || ^4 || ^5 || ^6 || ^7 || ^8" } }, "sha512-QLo7rzTBOl43FvVqDdq5Ql9IoElIuTdjrz9SKAXCvULvBoRZ44JGSkx9z4999ZusCsb4rK3gjS8gOGyeYqZv2Q=="],
+
+ "eslint-plugin-react-native-globals": ["eslint-plugin-react-native-globals@0.1.2", "", {}, "sha512-9aEPf1JEpiTjcFAmmyw8eiIXmcNZOqaZyHO77wgm0/dWfT/oxC1SrIq8ET38pMxHYrcB6Uew+TzUVsBeczF88g=="],
+
+ "eslint-scope": ["eslint-scope@7.2.2", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg=="],
+
+ "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
+
+ "espree": ["espree@9.6.1", "", { "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } }, "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ=="],
+
"esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="],
+ "esquery": ["esquery@1.7.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g=="],
+
+ "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="],
+
"estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="],
"esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="],
@@ -1063,20 +1209,28 @@
"fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
+ "fast-diff": ["fast-diff@1.3.0", "", {}, "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw=="],
+
"fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="],
"fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="],
+ "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="],
+
"fast-xml-parser": ["fast-xml-parser@4.5.6", "", { "dependencies": { "strnum": "^1.0.5" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-Yd4vkROfJf8AuJrDIVMVmYfULKmIJszVsMv7Vo71aocsKgFxpdlpSHXSaInvyYfgw2PRuObQSW2GFpVMUjxu9A=="],
"fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="],
+ "fb-dotslash": ["fb-dotslash@0.5.8", "", { "bin": { "dotslash": "bin/dotslash" } }, "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA=="],
+
"fb-watchman": ["fb-watchman@2.0.2", "", { "dependencies": { "bser": "2.1.1" } }, "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA=="],
"fd-package-json": ["fd-package-json@2.0.0", "", { "dependencies": { "walk-up-path": "^4.0.0" } }, "sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ=="],
"fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
+ "file-entry-cache": ["file-entry-cache@6.0.1", "", { "dependencies": { "flat-cache": "^3.0.4" } }, "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg=="],
+
"fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
"filter-obj": ["filter-obj@1.1.0", "", {}, "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ=="],
@@ -1087,8 +1241,14 @@
"find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="],
+ "flat-cache": ["flat-cache@3.2.0", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" } }, "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw=="],
+
+ "flatted": ["flatted@3.4.2", "", {}, "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA=="],
+
"flow-enums-runtime": ["flow-enums-runtime@0.0.6", "", {}, "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw=="],
+ "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="],
+
"foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="],
"fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="],
@@ -1101,6 +1261,12 @@
"function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
+ "function.prototype.name": ["function.prototype.name@1.1.8", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "functions-have-names": "^1.2.3", "hasown": "^2.0.2", "is-callable": "^1.2.7" } }, "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q=="],
+
+ "functions-have-names": ["functions-have-names@1.2.3", "", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="],
+
+ "generator-function": ["generator-function@2.0.1", "", {}, "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g=="],
+
"gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="],
"get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="],
@@ -1115,6 +1281,8 @@
"get-stream": ["get-stream@8.0.1", "", {}, "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA=="],
+ "get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="],
+
"get-uri": ["get-uri@6.0.5", "", { "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", "debug": "^4.3.4" } }, "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg=="],
"giget": ["giget@2.0.0", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.0", "defu": "^6.1.4", "node-fetch-native": "^1.6.6", "nypm": "^0.6.0", "pathe": "^2.0.3" }, "bin": { "giget": "dist/cli.mjs" } }, "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA=="],
@@ -1125,7 +1293,11 @@
"glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="],
- "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
+ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="],
+
+ "globals": ["globals@13.24.0", "", { "dependencies": { "type-fest": "^0.20.2" } }, "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ=="],
+
+ "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="],
"globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="],
@@ -1133,14 +1305,26 @@
"graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
+ "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="],
+
"handlebars": ["handlebars@4.7.9", "", { "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", "source-map": "^0.6.1", "wordwrap": "^1.0.0" }, "optionalDependencies": { "uglify-js": "^3.1.4" }, "bin": { "handlebars": "bin/handlebars" } }, "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ=="],
+ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="],
+
"has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
+ "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="],
+
+ "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="],
+
"has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="],
+ "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="],
+
"hasown": ["hasown@2.0.3", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg=="],
+ "hermes-compiler": ["hermes-compiler@0.14.0", "", {}, "sha512-clxa193o+GYYwykWVFfpHduCATz8fR5jvU7ngXpfKHj+E9hr9vjLNtdLSEe8MUbObvVexV3wcyxQ00xTPIrB1Q=="],
+
"hermes-estree": ["hermes-estree@0.29.1", "", {}, "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ=="],
"hermes-parser": ["hermes-parser@0.29.1", "", { "dependencies": { "hermes-estree": "0.29.1" } }, "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA=="],
@@ -1185,26 +1369,46 @@
"inquirer": ["inquirer@12.11.1", "", { "dependencies": { "@inquirer/ansi": "^1.0.2", "@inquirer/core": "^10.3.2", "@inquirer/prompts": "^7.10.1", "@inquirer/type": "^3.0.10", "mute-stream": "^2.0.0", "run-async": "^4.0.6", "rxjs": "^7.8.2" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-9VF7mrY+3OmsAfjH3yKz/pLbJ5z22E23hENKw3/LNSaA/sAt3v49bDRY+Ygct1xwuKT+U+cBfTzjCPySna69Qw=="],
+ "internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="],
+
"invariant": ["invariant@2.2.4", "", { "dependencies": { "loose-envify": "^1.0.0" } }, "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA=="],
"ip-address": ["ip-address@10.1.1", "", {}, "sha512-1FMu8/N15Ck1BL551Jf42NYIoin2unWjLQ2Fze/DXryJRl5twqtwNHlO39qERGbIOcKYWHdgRryhOC+NG4eaLw=="],
"is-absolute": ["is-absolute@1.0.0", "", { "dependencies": { "is-relative": "^1.0.0", "is-windows": "^1.0.1" } }, "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA=="],
+ "is-array-buffer": ["is-array-buffer@3.0.5", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="],
+
"is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="],
+ "is-async-function": ["is-async-function@2.1.1", "", { "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ=="],
+
+ "is-bigint": ["is-bigint@1.1.0", "", { "dependencies": { "has-bigints": "^1.0.2" } }, "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ=="],
+
+ "is-boolean-object": ["is-boolean-object@1.2.2", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A=="],
+
+ "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="],
+
"is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="],
+ "is-data-view": ["is-data-view@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" } }, "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw=="],
+
+ "is-date-object": ["is-date-object@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg=="],
+
"is-directory": ["is-directory@0.3.1", "", {}, "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw=="],
"is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="],
"is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
+ "is-finalizationregistry": ["is-finalizationregistry@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg=="],
+
"is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
"is-generator-fn": ["is-generator-fn@2.1.0", "", {}, "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ=="],
+ "is-generator-function": ["is-generator-function@1.1.2", "", { "dependencies": { "call-bound": "^1.0.4", "generator-function": "^2.0.0", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA=="],
+
"is-git-dirty": ["is-git-dirty@2.0.2", "", { "dependencies": { "execa": "^4.0.3", "is-git-repository": "^2.0.0" } }, "sha512-U3YCo+GKR/rDsY7r0v/LBICbQwsx859tDQnAT+v0E/zCDeWbQ1TUt1FtyExeyik7VIJlYOLHCIifLdz71HDalg=="],
"is-git-repository": ["is-git-repository@2.0.0", "", { "dependencies": { "execa": "^4.0.3", "is-absolute": "^1.0.0" } }, "sha512-HDO50CG5suIAcmqG4F1buqVXEZRPn+RaXIn9pFKq/947FBo2bCRwK7ZluEVZOy99a4IQyqsjbKEpAiOXCccOHQ=="],
@@ -1215,29 +1419,53 @@
"is-interactive": ["is-interactive@2.0.0", "", {}, "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ=="],
+ "is-map": ["is-map@2.0.3", "", {}, "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="],
+
+ "is-negative-zero": ["is-negative-zero@2.0.3", "", {}, "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw=="],
+
"is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
+ "is-number-object": ["is-number-object@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw=="],
+
"is-obj": ["is-obj@2.0.0", "", {}, "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="],
"is-path-cwd": ["is-path-cwd@2.2.0", "", {}, "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ=="],
"is-path-inside": ["is-path-inside@3.0.3", "", {}, "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ=="],
+ "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="],
+
"is-relative": ["is-relative@1.0.0", "", { "dependencies": { "is-unc-path": "^1.0.0" } }, "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA=="],
+ "is-set": ["is-set@2.0.3", "", {}, "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg=="],
+
+ "is-shared-array-buffer": ["is-shared-array-buffer@1.0.4", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A=="],
+
"is-ssh": ["is-ssh@1.4.1", "", { "dependencies": { "protocols": "^2.0.1" } }, "sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg=="],
"is-stream": ["is-stream@3.0.0", "", {}, "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA=="],
+ "is-string": ["is-string@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA=="],
+
+ "is-symbol": ["is-symbol@1.1.1", "", { "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", "safe-regex-test": "^1.1.0" } }, "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w=="],
+
+ "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="],
+
"is-unc-path": ["is-unc-path@1.0.0", "", { "dependencies": { "unc-path-regex": "^0.1.2" } }, "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ=="],
"is-unicode-supported": ["is-unicode-supported@2.1.0", "", {}, "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ=="],
+ "is-weakmap": ["is-weakmap@2.0.2", "", {}, "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="],
+
+ "is-weakref": ["is-weakref@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew=="],
+
+ "is-weakset": ["is-weakset@2.0.4", "", { "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ=="],
+
"is-windows": ["is-windows@1.0.2", "", {}, "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="],
"is-wsl": ["is-wsl@3.1.1", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw=="],
- "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="],
+ "isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="],
"isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
@@ -1253,6 +1481,8 @@
"istanbul-reports": ["istanbul-reports@3.2.0", "", { "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" } }, "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA=="],
+ "iterator.prototype": ["iterator.prototype@1.1.5", "", { "dependencies": { "define-data-property": "^1.1.4", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "get-proto": "^1.0.0", "has-symbols": "^1.1.0", "set-function-name": "^2.0.2" } }, "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g=="],
+
"jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="],
"jest-changed-files": ["jest-changed-files@30.3.0", "", { "dependencies": { "execa": "^5.1.1", "jest-util": "30.3.0", "p-limit": "^3.1.0" } }, "sha512-B/7Cny6cV5At6M25EWDgf9S617lHivamL8vl6KEpJqkStauzcG4e+WPfDgMMF+H4FVH4A2PLRyvgDJan4441QA=="],
@@ -1317,22 +1547,34 @@
"jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="],
+ "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="],
+
"json-parse-better-errors": ["json-parse-better-errors@1.0.2", "", {}, "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="],
"json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="],
+ "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="],
+
+ "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="],
+
"json-with-bigint": ["json-with-bigint@3.5.8", "", {}, "sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw=="],
"json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="],
"jsonfile": ["jsonfile@6.2.1", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q=="],
+ "jsx-ast-utils": ["jsx-ast-utils@3.3.5", "", { "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", "object.assign": "^4.1.4", "object.values": "^1.1.6" } }, "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ=="],
+
+ "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="],
+
"kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="],
"launch-editor": ["launch-editor@2.13.2", "", { "dependencies": { "picocolors": "^1.1.1", "shell-quote": "^1.8.3" } }, "sha512-4VVDnbOpLXy/s8rdRCSXb+zfMeFR0WlJWpET1iA9CQdlZDfwyLjUuGQzXU4VeOoey6AicSAluWan7Etga6Kcmg=="],
"leven": ["leven@3.1.0", "", {}, "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="],
+ "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="],
+
"lighthouse-logger": ["lighthouse-logger@1.4.2", "", { "dependencies": { "debug": "^2.6.9", "marky": "^1.2.2" } }, "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g=="],
"lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="],
@@ -1463,6 +1705,8 @@
"node-abort-controller": ["node-abort-controller@3.1.1", "", {}, "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ=="],
+ "node-exports-info": ["node-exports-info@1.6.0", "", { "dependencies": { "array.prototype.flatmap": "^1.3.3", "es-errors": "^1.3.0", "object.entries": "^1.1.9", "semver": "^6.3.1" } }, "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw=="],
+
"node-fetch-native": ["node-fetch-native@1.6.7", "", {}, "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="],
"node-int64": ["node-int64@0.4.0", "", {}, "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw=="],
@@ -1485,8 +1729,20 @@
"ob1": ["ob1@0.83.6", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-m/xZYkwcjo6UqLMrUICEB3iHk7Bjt3RSR7KXMi6Y1MO/kGkPhoRmfUDF6KAan3rLAZ7ABRqnQyKUTwaqZgUV4w=="],
+ "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
+
"object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="],
+ "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="],
+
+ "object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="],
+
+ "object.entries": ["object.entries@1.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-object-atoms": "^1.1.1" } }, "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw=="],
+
+ "object.fromentries": ["object.fromentries@2.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0" } }, "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ=="],
+
+ "object.values": ["object.values@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA=="],
+
"ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="],
"on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="],
@@ -1499,10 +1755,14 @@
"open": ["open@10.2.0", "", { "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", "wsl-utils": "^0.1.0" } }, "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA=="],
+ "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="],
+
"ora": ["ora@9.0.0", "", { "dependencies": { "chalk": "^5.6.2", "cli-cursor": "^5.0.0", "cli-spinners": "^3.2.0", "is-interactive": "^2.0.0", "is-unicode-supported": "^2.1.0", "log-symbols": "^7.0.1", "stdin-discarder": "^0.2.2", "string-width": "^8.1.0", "strip-ansi": "^7.1.2" } }, "sha512-m0pg2zscbYgWbqRR6ABga5c3sZdEon7bSgjnlXC64kxtxLOyjRcbbUkLj7HFyy/FTD+P2xdBWu8snGhYI0jc4A=="],
"os-name": ["os-name@6.1.0", "", { "dependencies": { "macos-release": "^3.3.0", "windows-release": "^6.1.0" } }, "sha512-zBd1G8HkewNd2A8oQ8c6BN/f/c9EId7rSUueOLGu28govmUctXmM+3765GwsByv9nYUdrLqHphXlYIc86saYsg=="],
+ "own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="],
+
"p-limit": ["p-limit@7.3.0", "", { "dependencies": { "yocto-queue": "^1.2.1" } }, "sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw=="],
"p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="],
@@ -1571,6 +1831,14 @@
"pngjs": ["pngjs@7.0.0", "", {}, "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow=="],
+ "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="],
+
+ "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="],
+
+ "prettier": ["prettier@3.8.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw=="],
+
+ "prettier-linter-helpers": ["prettier-linter-helpers@1.0.1", "", { "dependencies": { "fast-diff": "^1.1.2" } }, "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg=="],
+
"pretty-format": ["pretty-format@30.3.0", "", { "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", "react-is": "^18.3.1" } }, "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ=="],
"process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="],
@@ -1579,6 +1847,8 @@
"prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="],
+ "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="],
+
"protocols": ["protocols@2.0.2", "", {}, "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ=="],
"proxy-agent": ["proxy-agent@6.5.0", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "http-proxy-agent": "^7.0.1", "https-proxy-agent": "^7.0.6", "lru-cache": "^7.14.1", "pac-proxy-agent": "^7.1.0", "proxy-from-env": "^1.1.0", "socks-proxy-agent": "^8.0.5" } }, "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A=="],
@@ -1623,6 +1893,8 @@
"react-native-nitro-image": ["react-native-nitro-image@workspace:packages/react-native-nitro-image"],
+ "react-native-nitro-image-thumbhash": ["react-native-nitro-image-thumbhash@workspace:packages/react-native-nitro-image-thumbhash"],
+
"react-native-nitro-modules": ["react-native-nitro-modules@0.35.5", "", { "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-aa03UzC5dLg5qFfyBkVK+JGSwHTjmK7jUZzyRz11r1Yk9C/nJTFe59EeHPxxNNTagkiwQTM6p3sySgD/TDRC7Q=="],
"react-native-nitro-web-image": ["react-native-nitro-web-image@workspace:packages/react-native-nitro-web-image"],
@@ -1639,12 +1911,16 @@
"readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="],
+ "reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="],
+
"regenerate": ["regenerate@1.4.2", "", {}, "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="],
"regenerate-unicode-properties": ["regenerate-unicode-properties@10.2.2", "", { "dependencies": { "regenerate": "^1.4.2" } }, "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g=="],
"regenerator-runtime": ["regenerator-runtime@0.13.11", "", {}, "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="],
+ "regexp.prototype.flags": ["regexp.prototype.flags@1.5.4", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="],
+
"regexpu-core": ["regexpu-core@6.4.0", "", { "dependencies": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.2.2", "regjsgen": "^0.8.0", "regjsparser": "^0.13.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.2.1" } }, "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA=="],
"regjsgen": ["regjsgen@0.8.0", "", {}, "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q=="],
@@ -1683,8 +1959,14 @@
"rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="],
+ "safe-array-concat": ["safe-array-concat@1.1.4", "", { "dependencies": { "call-bind": "^1.0.9", "call-bound": "^1.0.4", "get-intrinsic": "^1.3.0", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg=="],
+
"safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
+ "safe-push-apply": ["safe-push-apply@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" } }, "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA=="],
+
+ "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="],
+
"safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
"scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="],
@@ -1699,6 +1981,12 @@
"set-blocking": ["set-blocking@2.0.0", "", {}, "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="],
+ "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="],
+
+ "set-function-name": ["set-function-name@2.0.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2" } }, "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ=="],
+
+ "set-proto": ["set-proto@1.0.0", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0" } }, "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw=="],
+
"setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="],
"sf-symbols-typescript": ["sf-symbols-typescript@2.2.0", "", {}, "sha512-TPbeg0b7ylrswdGCji8FRGFAKuqbpQlLbL8SOle3j1iHSs5Ob5mhvMAxWN2UItOjgALAB5Zp3fmMfj8mbWvXKw=="],
@@ -1761,17 +2049,31 @@
"stdin-discarder": ["stdin-discarder@0.2.2", "", {}, "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ=="],
+ "stop-iteration-iterator": ["stop-iteration-iterator@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "internal-slot": "^1.1.0" } }, "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ=="],
+
"strict-uri-encode": ["strict-uri-encode@2.0.0", "", {}, "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ=="],
"string-length": ["string-length@4.0.2", "", { "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" } }, "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ=="],
+ "string-natural-compare": ["string-natural-compare@3.0.1", "", {}, "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw=="],
+
"string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
"string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
+ "string.prototype.matchall": ["string.prototype.matchall@4.0.12", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "regexp.prototype.flags": "^1.5.3", "set-function-name": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA=="],
+
+ "string.prototype.repeat": ["string.prototype.repeat@1.0.0", "", { "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" } }, "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w=="],
+
+ "string.prototype.trim": ["string.prototype.trim@1.2.10", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-object-atoms": "^1.0.0", "has-property-descriptors": "^1.0.2" } }, "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA=="],
+
+ "string.prototype.trimend": ["string.prototype.trimend@1.0.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ=="],
+
+ "string.prototype.trimstart": ["string.prototype.trimstart@1.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg=="],
+
"string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="],
- "strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="],
+ "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
"strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
@@ -1793,6 +2095,8 @@
"test-exclude": ["test-exclude@6.0.0", "", { "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" } }, "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w=="],
+ "text-table": ["text-table@0.2.0", "", {}, "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="],
+
"throat": ["throat@5.0.0", "", {}, "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA=="],
"through2": ["through2@2.0.5", "", { "dependencies": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" } }, "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ=="],
@@ -1809,22 +2113,36 @@
"toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="],
+ "ts-api-utils": ["ts-api-utils@2.5.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA=="],
+
"ts-morph": ["ts-morph@27.0.2", "", { "dependencies": { "@ts-morph/common": "~0.28.1", "code-block-writer": "^13.0.3" } }, "sha512-fhUhgeljcrdZ+9DZND1De1029PrE+cMkIP7ooqkLRTrRLTqcki2AstsyJm0vRNbTbVCNJ0idGlbBrfqc7/nA8w=="],
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
+ "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="],
+
"type-detect": ["type-detect@4.0.8", "", {}, "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="],
"type-fest": ["type-fest@0.7.1", "", {}, "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg=="],
"type-is": ["type-is@1.6.18", "", { "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="],
+ "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="],
+
+ "typed-array-byte-length": ["typed-array-byte-length@1.0.3", "", { "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.14" } }, "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg=="],
+
+ "typed-array-byte-offset": ["typed-array-byte-offset@1.0.4", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.15", "reflect.getprototypeof": "^1.0.9" } }, "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ=="],
+
+ "typed-array-length": ["typed-array-length@1.0.7", "", { "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "is-typed-array": "^1.1.13", "possible-typed-array-names": "^1.0.0", "reflect.getprototypeof": "^1.0.6" } }, "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg=="],
+
"typedarray": ["typedarray@0.0.6", "", {}, "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="],
"typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="],
"uglify-js": ["uglify-js@3.19.3", "", { "bin": { "uglifyjs": "bin/uglifyjs" } }, "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ=="],
+ "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="],
+
"unc-path-regex": ["unc-path-regex@0.1.2", "", {}, "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg=="],
"undici": ["undici@6.23.0", "", {}, "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g=="],
@@ -1849,6 +2167,8 @@
"update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="],
+ "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="],
+
"url-join": ["url-join@4.0.1", "", {}, "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA=="],
"use-latest-callback": ["use-latest-callback@0.2.6", "", { "peerDependencies": { "react": ">=16.8" } }, "sha512-FvRG9i1HSo0wagmX63Vrm8SnlUU3LMM3WyZkQ76RnslpBrX694AdG4A0zQBx2B3ZifFA0yv/BaEHGBnEax5rZg=="],
@@ -1891,12 +2211,22 @@
"which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
+ "which-boxed-primitive": ["which-boxed-primitive@1.1.1", "", { "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" } }, "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA=="],
+
+ "which-builtin-type": ["which-builtin-type@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.1.0", "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", "which-typed-array": "^1.1.16" } }, "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q=="],
+
+ "which-collection": ["which-collection@1.0.2", "", { "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" } }, "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="],
+
"which-module": ["which-module@2.0.1", "", {}, "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ=="],
+ "which-typed-array": ["which-typed-array@1.1.21", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.9", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-zbRA8cVm6io/d5W8uIe2hblzN76/Wm3v/yiythQvr+dpBWeqhPSWIDNj4zOyHi4zKbMK6DN34Xsr9jPHJERAEw=="],
+
"wildcard-match": ["wildcard-match@5.1.4", "", {}, "sha512-wldeCaczs8XXq7hj+5d/F38JE2r7EXgb6WQDM84RVwxy81T/sxB5e9+uZLK9Q9oNz1mlvjut+QtvgaOQFPVq/g=="],
"windows-release": ["windows-release@6.1.0", "", { "dependencies": { "execa": "^8.0.1" } }, "sha512-1lOb3qdzw6OFmOzoY0nauhLG72TpWtb5qgYPiSh/62rjc1XidBSDio2qw0pwHh17VINF217ebIkZJdFLZFn9SA=="],
+ "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="],
+
"wordwrap": ["wordwrap@1.0.0", "", {}, "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q=="],
"wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
@@ -1931,10 +2261,16 @@
"zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="],
+ "zod-validation-error": ["zod-validation-error@4.0.2", "", { "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ=="],
+
"zustand": ["zustand@5.0.12", "", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-i77ae3aZq4dhMlRhJVCYgMLKuSiZAaUPAct2AksxQ+gOtimhGMdXljRT21P5BNpeT4kXlLIckvkPM029OljD7g=="],
"@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
+ "@babel/eslint-parser/eslint-visitor-keys": ["eslint-visitor-keys@2.1.0", "", {}, "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw=="],
+
+ "@babel/eslint-parser/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
+
"@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="],
"@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
@@ -1955,6 +2291,8 @@
"@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="],
+ "@isaacs/cliui/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="],
+
"@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="],
"@istanbuljs/load-nyc-config/camelcase": ["camelcase@5.3.1", "", {}, "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="],
@@ -2011,6 +2349,8 @@
"@jest/types/@jest/schemas": ["@jest/schemas@29.6.3", "", { "dependencies": { "@sinclair/typebox": "^0.27.8" } }, "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA=="],
+ "@nicolo-ribaudo/eslint-scope-5-internals/eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="],
+
"@react-native-community/cli/commander": ["commander@9.5.0", "", {}, "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="],
"@react-native-community/cli/execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="],
@@ -2049,6 +2389,8 @@
"@react-native/dev-middleware/open": ["open@7.4.2", "", { "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" } }, "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q=="],
+ "@react-native/eslint-config/eslint-config-prettier": ["eslint-config-prettier@8.10.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-/IGJ6+Dka158JnP5n5YFMOszjDWrXggGz1LaK/guZq9vZTmniaKlHcsscvkAhn9y4U+BU3JuUdYvtAMcv30y4A=="],
+
"@react-native/metro-config/metro-config": ["metro-config@0.83.6", "", { "dependencies": { "connect": "^3.6.5", "flow-enums-runtime": "^0.0.6", "jest-validate": "^29.7.0", "metro": "0.83.6", "metro-cache": "0.83.6", "metro-core": "0.83.6", "metro-runtime": "0.83.6", "yaml": "^2.6.1" } }, "sha512-G5622400uNtnAMlppEA5zkFAZltEf7DSGhOu09BkisCxOlVMWfdosD/oPyh4f2YVQsc1MBYyp4w6OzbExTYarg=="],
"@react-navigation/core/react-is": ["react-is@19.2.5", "", {}, "sha512-Dn0t8IQhCmeIT3wu+Apm1/YVsJXsGWi6k4sPdnBIdqMVtHtv0IGi6dcpNpNkNac0zB2uUAqNX3MHzN8c+z2rwQ=="],
@@ -2057,6 +2399,12 @@
"@ts-morph/common/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="],
+ "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="],
+
+ "@typescript-eslint/typescript-estree/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="],
+
+ "@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="],
+
"accepts/negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="],
"ansi-escapes/type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="],
@@ -2083,8 +2431,6 @@
"chromium-edge-launcher/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="],
- "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
-
"compression/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
"connect/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
@@ -2093,12 +2439,28 @@
"escodegen/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
+ "eslint-plugin-eslint-comments/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="],
+
+ "eslint-plugin-react/doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="],
+
+ "eslint-plugin-react/resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="],
+
+ "eslint-plugin-react/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
+
+ "eslint-plugin-react-hooks/hermes-parser": ["hermes-parser@0.25.1", "", { "dependencies": { "hermes-estree": "0.25.1" } }, "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA=="],
+
+ "eslint-plugin-react-hooks/zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="],
+
+ "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
+
"finalhandler/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
"finalhandler/encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="],
"finalhandler/on-finished": ["on-finished@2.3.0", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww=="],
+ "globals/type-fest": ["type-fest@0.20.2", "", {}, "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="],
+
"handlebars/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
"hosted-git-info/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
@@ -2239,6 +2601,8 @@
"nitrogen/zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="],
+ "node-exports-info/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
+
"npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="],
"nypm/citty": ["citty@0.2.2", "", {}, "sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w=="],
@@ -2247,6 +2611,8 @@
"ora/string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="],
+ "ora/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="],
+
"p-locate/p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
"parse5/entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="],
@@ -2261,6 +2627,8 @@
"prompts/kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="],
+ "prop-types/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="],
+
"raw-body/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="],
"react-devtools-core/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="],
@@ -2269,6 +2637,10 @@
"react-native-builder-bob/glob": ["glob@8.1.0", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^5.0.1", "once": "^1.3.0" } }, "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ=="],
+ "react-native-nitro-image-thumbhash/react": ["react@19.2.0", "", {}, "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ=="],
+
+ "react-native-nitro-image-thumbhash/react-native": ["react-native@0.83.0", "", { "dependencies": { "@jest/create-cache-key-function": "^29.7.0", "@react-native/assets-registry": "0.83.0", "@react-native/codegen": "0.83.0", "@react-native/community-cli-plugin": "0.83.0", "@react-native/gradle-plugin": "0.83.0", "@react-native/js-polyfills": "0.83.0", "@react-native/normalize-colors": "0.83.0", "@react-native/virtualized-lists": "0.83.0", "abort-controller": "^3.0.0", "anser": "^1.4.9", "ansi-regex": "^5.0.0", "babel-jest": "^29.7.0", "babel-plugin-syntax-hermes-parser": "0.32.0", "base64-js": "^1.5.1", "commander": "^12.0.0", "flow-enums-runtime": "^0.0.6", "glob": "^7.1.1", "hermes-compiler": "0.14.0", "invariant": "^2.2.4", "jest-environment-node": "^29.7.0", "memoize-one": "^5.0.0", "metro-runtime": "^0.83.3", "metro-source-map": "^0.83.3", "nullthrows": "^1.1.1", "pretty-format": "^29.7.0", "promise": "^8.3.0", "react-devtools-core": "^6.1.5", "react-refresh": "^0.14.0", "regenerator-runtime": "^0.13.2", "scheduler": "0.27.0", "semver": "^7.1.3", "stacktrace-parser": "^0.1.10", "whatwg-fetch": "^3.0.0", "ws": "^7.5.10", "yargs": "^17.6.2" }, "peerDependencies": { "@types/react": "^19.1.1", "react": "^19.2.0" }, "optionalPeers": ["@types/react"], "bin": { "react-native": "cli.js" } }, "sha512-a8wPjGfkktb1+Mjvzkky3d0u6j6zdWAzftZ2LdQtgRgqkMMfgQxD9S+ri3RNlfAFQpuCAOYUIyrNHiVkUQChxA=="],
+
"release-it/semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="],
"release-it/url-join": ["url-join@5.0.0", "", {}, "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA=="],
@@ -2293,16 +2665,8 @@
"stack-utils/escape-string-regexp": ["escape-string-regexp@2.0.0", "", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="],
- "string-length/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
-
- "string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
-
- "string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
-
"string_decoder/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="],
- "strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
-
"terser/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="],
"terser/source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="],
@@ -2313,20 +2677,16 @@
"wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
- "wrap-ansi/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
-
"wrap-ansi-cjs/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
- "wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
-
"write-file-atomic/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
"@inquirer/core/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
- "@inquirer/core/wrap-ansi/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
-
"@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="],
+ "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
+
"@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
"@istanbuljs/load-nyc-config/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="],
@@ -2375,6 +2735,8 @@
"@jest/types/@jest/schemas/@sinclair/typebox": ["@sinclair/typebox@0.27.10", "", {}, "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA=="],
+ "@nicolo-ribaudo/eslint-scope-5-internals/eslint-scope/estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="],
+
"@react-native-community/cli-clean/execa/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="],
"@react-native-community/cli-clean/execa/human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="],
@@ -2427,8 +2789,6 @@
"@react-native-community/cli-doctor/ora/log-symbols": ["log-symbols@4.1.0", "", { "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" } }, "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg=="],
- "@react-native-community/cli-doctor/ora/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
-
"@react-native-community/cli-platform-android/execa/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="],
"@react-native-community/cli-platform-android/execa/human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="],
@@ -2485,8 +2845,6 @@
"@react-native-community/cli-tools/ora/log-symbols": ["log-symbols@4.1.0", "", { "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" } }, "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg=="],
- "@react-native-community/cli-tools/ora/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
-
"@react-native-community/cli/execa/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="],
"@react-native-community/cli/execa/human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="],
@@ -2517,6 +2875,8 @@
"@ts-morph/common/minimatch/brace-expansion": ["brace-expansion@5.0.5", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ=="],
+ "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@5.0.5", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ=="],
+
"ansi-fragments/strip-ansi/ansi-regex": ["ansi-regex@4.1.1", "", {}, "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="],
"babel-plugin-module-resolver/glob/minimatch": ["minimatch@8.0.7", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-V+1uQNdzybxa14e/p00HZnQNNcTjnRJjDxg2V8wtkjFctq4M7hXFws4oekyTP0Jebeq7QYtpFyOeBAjc88zvYg=="],
@@ -2535,6 +2895,10 @@
"errorhandler/accepts/negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="],
+ "eslint-plugin-react-hooks/hermes-parser/hermes-estree": ["hermes-estree@0.25.1", "", {}, "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw=="],
+
+ "eslint-plugin-react/resolve/is-core-module": ["is-core-module@2.16.2", "", { "dependencies": { "hasown": "^2.0.3" } }, "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA=="],
+
"finalhandler/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
"is-git-dirty/execa/get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="],
@@ -2705,8 +3069,6 @@
"metro-config/metro/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="],
- "metro-config/metro/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
-
"metro-config/metro/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="],
"metro-config/metro-core/metro-resolver": ["metro-resolver@0.80.12", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-PR24gYRZnYHM3xT9pg6BdbrGbM/Cu1TcyIFBVlAk7qDAuHkUNQ1nMzWumWs+kwSvtd9eZGzHoucGJpTUEeLZAw=="],
@@ -2719,6 +3081,8 @@
"nitrogen/yargs/yargs-parser": ["yargs-parser@22.0.0", "", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="],
+ "ora/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
+
"p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="],
"pkg-dir/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="],
@@ -2727,6 +3091,28 @@
"react-native-builder-bob/glob/minimatch": ["minimatch@5.1.9", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw=="],
+ "react-native-nitro-image-thumbhash/react-native/@react-native/assets-registry": ["@react-native/assets-registry@0.83.0", "", {}, "sha512-EmGSKDvmnEnBrTK75T+0Syt6gy/HACOTfziw5+392Kr1Bb28Rv26GyOIkvptnT+bb2VDHU0hx9G0vSy5/S3rmQ=="],
+
+ "react-native-nitro-image-thumbhash/react-native/@react-native/codegen": ["@react-native/codegen@0.83.0", "", { "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", "glob": "^7.1.1", "hermes-parser": "0.32.0", "invariant": "^2.2.4", "nullthrows": "^1.1.1", "yargs": "^17.6.2" } }, "sha512-3fvMi/pSJHhikjwMZQplU4Ar9ANoR2GSBxotbkKIMI6iNduh+ln1FTvB2me69FA68aHtVZOO+cO+QpGCcvgaMA=="],
+
+ "react-native-nitro-image-thumbhash/react-native/@react-native/community-cli-plugin": ["@react-native/community-cli-plugin@0.83.0", "", { "dependencies": { "@react-native/dev-middleware": "0.83.0", "debug": "^4.4.0", "invariant": "^2.2.4", "metro": "^0.83.3", "metro-config": "^0.83.3", "metro-core": "^0.83.3", "semver": "^7.1.3" }, "peerDependencies": { "@react-native-community/cli": "*", "@react-native/metro-config": "*" }, "optionalPeers": ["@react-native-community/cli", "@react-native/metro-config"] }, "sha512-bJD5pLURgKY2YK0R6gUsFWHiblSAFt1Xyc2fsyCL8XBnB7kJfVhLAKGItk6j1QZbwm1Io41ekZxBmZdyQqIDrg=="],
+
+ "react-native-nitro-image-thumbhash/react-native/@react-native/gradle-plugin": ["@react-native/gradle-plugin@0.83.0", "", {}, "sha512-BXZRmfsbgPhEPkrRPjk2njA2AzhSelBqhuoklnv3DdLTdxaRjKYW+LW0zpKo1k3qPKj7kG1YGI3miol6l1GB5g=="],
+
+ "react-native-nitro-image-thumbhash/react-native/@react-native/js-polyfills": ["@react-native/js-polyfills@0.83.0", "", {}, "sha512-cVB9BMqlfbQR0v4Wxi5M2yDhZoKiNqWgiEXpp7ChdZIXI0SEnj8WwLwE3bDkyOfF8tCHdytpInXyg/al2O+dLQ=="],
+
+ "react-native-nitro-image-thumbhash/react-native/@react-native/normalize-colors": ["@react-native/normalize-colors@0.83.0", "", {}, "sha512-DG1ELOqQ6RS82R1zEUGTWa/pfSPOf+vwAnQB7Ao1vRuhW/xdd2OPQJyqx5a5QWMYpGrlkCb7ERxEVX6p2QODCA=="],
+
+ "react-native-nitro-image-thumbhash/react-native/@react-native/virtualized-lists": ["@react-native/virtualized-lists@0.83.0", "", { "dependencies": { "invariant": "^2.2.4", "nullthrows": "^1.1.1" }, "peerDependencies": { "@types/react": "^19.2.0", "react": "*", "react-native": "*" }, "optionalPeers": ["@types/react"] }, "sha512-AVnDppwPidQrPrzA4ETr4o9W+40yuijg3EVgFt2hnMldMZkqwPRrgJL2GSreQjCYe1NfM5Yn4Egyy4Kd0yp4Lw=="],
+
+ "react-native-nitro-image-thumbhash/react-native/babel-plugin-syntax-hermes-parser": ["babel-plugin-syntax-hermes-parser@0.32.0", "", { "dependencies": { "hermes-parser": "0.32.0" } }, "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg=="],
+
+ "react-native-nitro-image-thumbhash/react-native/pretty-format": ["pretty-format@29.7.0", "", { "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } }, "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ=="],
+
+ "react-native-nitro-image-thumbhash/react-native/scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="],
+
+ "react-native-nitro-image-thumbhash/react-native/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="],
+
"react-native/pretty-format/@jest/schemas": ["@jest/schemas@29.6.3", "", { "dependencies": { "@sinclair/typebox": "^0.27.8" } }, "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA=="],
"send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
@@ -2735,6 +3121,8 @@
"terser/source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
+ "through2/readable-stream/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="],
+
"through2/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="],
"type-is/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
@@ -2779,6 +3167,8 @@
"@ts-morph/common/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="],
+ "@typescript-eslint/typescript-estree/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="],
+
"babel-plugin-module-resolver/glob/minimatch/brace-expansion": ["brace-expansion@2.1.0", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w=="],
"errorhandler/accepts/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
@@ -2823,8 +3213,6 @@
"jest-validate/pretty-format/@jest/schemas/@sinclair/typebox": ["@sinclair/typebox@0.27.10", "", {}, "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA=="],
- "logkitty/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
-
"logkitty/yargs/cliui/wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="],
"logkitty/yargs/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="],
@@ -2847,10 +3235,14 @@
"metro-config/metro/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
+ "nitrogen/yargs/cliui/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="],
+
"nitrogen/yargs/cliui/wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="],
"nitrogen/yargs/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="],
+ "nitrogen/yargs/string-width/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="],
+
"pkg-dir/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="],
"pkg-up/find-up/locate-path/p-locate": ["p-locate@3.0.0", "", { "dependencies": { "p-limit": "^2.0.0" } }, "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ=="],
@@ -2859,6 +3251,16 @@
"react-native-builder-bob/glob/minimatch/brace-expansion": ["brace-expansion@2.1.0", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w=="],
+ "react-native-nitro-image-thumbhash/react-native/@react-native/codegen/hermes-parser": ["hermes-parser@0.32.0", "", { "dependencies": { "hermes-estree": "0.32.0" } }, "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw=="],
+
+ "react-native-nitro-image-thumbhash/react-native/@react-native/community-cli-plugin/@react-native/dev-middleware": ["@react-native/dev-middleware@0.83.0", "", { "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.83.0", "@react-native/debugger-shell": "0.83.0", "chrome-launcher": "^0.15.2", "chromium-edge-launcher": "^0.2.0", "connect": "^3.6.5", "debug": "^4.4.0", "invariant": "^2.2.4", "nullthrows": "^1.1.1", "open": "^7.0.3", "serve-static": "^1.16.2", "ws": "^7.5.10" } }, "sha512-HWn42tbp0h8RWttua6d6PjseaSr3IdwkaoqVxhiM9kVDY7Ro00eO7tdlVgSzZzhIibdVS2b2C3x+sFoWhag1fA=="],
+
+ "react-native-nitro-image-thumbhash/react-native/@react-native/community-cli-plugin/metro-config": ["metro-config@0.83.6", "", { "dependencies": { "connect": "^3.6.5", "flow-enums-runtime": "^0.0.6", "jest-validate": "^29.7.0", "metro": "0.83.6", "metro-cache": "0.83.6", "metro-core": "0.83.6", "metro-runtime": "0.83.6", "yaml": "^2.6.1" } }, "sha512-G5622400uNtnAMlppEA5zkFAZltEf7DSGhOu09BkisCxOlVMWfdosD/oPyh4f2YVQsc1MBYyp4w6OzbExTYarg=="],
+
+ "react-native-nitro-image-thumbhash/react-native/babel-plugin-syntax-hermes-parser/hermes-parser": ["hermes-parser@0.32.0", "", { "dependencies": { "hermes-estree": "0.32.0" } }, "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw=="],
+
+ "react-native-nitro-image-thumbhash/react-native/pretty-format/@jest/schemas": ["@jest/schemas@29.6.3", "", { "dependencies": { "@sinclair/typebox": "^0.27.8" } }, "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA=="],
+
"react-native/pretty-format/@jest/schemas/@sinclair/typebox": ["@sinclair/typebox@0.27.10", "", {}, "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA=="],
"slice-ansi/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="],
@@ -2883,12 +3285,28 @@
"logkitty/yargs/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="],
+ "nitrogen/yargs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
+
"nitrogen/yargs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
+ "nitrogen/yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
+
"pkg-dir/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="],
"pkg-up/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="],
+ "react-native-nitro-image-thumbhash/react-native/@react-native/codegen/hermes-parser/hermes-estree": ["hermes-estree@0.32.0", "", {}, "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ=="],
+
+ "react-native-nitro-image-thumbhash/react-native/@react-native/community-cli-plugin/@react-native/dev-middleware/@react-native/debugger-frontend": ["@react-native/debugger-frontend@0.83.0", "", {}, "sha512-7XVbkH8nCjLKLe8z5DS37LNP62/QNNya/YuLlVoLfsiB54nR/kNZij5UU7rS0npAZ3WN7LR0anqLlYnzDd0JHA=="],
+
+ "react-native-nitro-image-thumbhash/react-native/@react-native/community-cli-plugin/@react-native/dev-middleware/open": ["open@7.4.2", "", { "dependencies": { "is-docker": "^2.0.0", "is-wsl": "^2.1.1" } }, "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q=="],
+
+ "react-native-nitro-image-thumbhash/react-native/@react-native/community-cli-plugin/metro-config/metro-cache": ["metro-cache@0.83.6", "", { "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", "https-proxy-agent": "^7.0.5", "metro-core": "0.83.6" } }, "sha512-DpvZE32feNkqfZkI4Fic7YI/Kw8QP9wdl1rC4YKPrA77wQbI9vXbxjmfkCT/EGwBTFOPKqvIXo+H3BNe93YyiQ=="],
+
+ "react-native-nitro-image-thumbhash/react-native/babel-plugin-syntax-hermes-parser/hermes-parser/hermes-estree": ["hermes-estree@0.32.0", "", {}, "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ=="],
+
+ "react-native-nitro-image-thumbhash/react-native/pretty-format/@jest/schemas/@sinclair/typebox": ["@sinclair/typebox@0.27.10", "", {}, "sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA=="],
+
"@react-native-community/cli-doctor/ora/cli-cursor/restore-cursor/onetime/mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="],
"@react-native-community/cli-tools/ora/cli-cursor/restore-cursor/onetime/mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="],
@@ -2896,5 +3314,9 @@
"jest-config/babel-jest/@jest/transform/jest-haste-map/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="],
"logkitty/yargs/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="],
+
+ "react-native-nitro-image-thumbhash/react-native/@react-native/community-cli-plugin/@react-native/dev-middleware/open/is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="],
+
+ "react-native-nitro-image-thumbhash/react-native/@react-native/community-cli-plugin/@react-native/dev-middleware/open/is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="],
}
}
diff --git a/example/__tests__/image-loaders.harness.ts b/example/__tests__/image-loaders.harness.ts
index a374047c..4f536f0f 100644
--- a/example/__tests__/image-loaders.harness.ts
+++ b/example/__tests__/image-loaders.harness.ts
@@ -1,6 +1,7 @@
import { Platform } from 'react-native'
import { describe, expect, it } from 'react-native-harness'
import { Images, loadImage } from 'react-native-nitro-image'
+import { ThumbHash } from 'react-native-nitro-image-thumbhash'
import { WebImages } from 'react-native-nitro-web-image'
const RED = { r: 1, g: 0, b: 0, a: 1 }
@@ -96,19 +97,19 @@ describe('Images.loadFromFile', () => {
})
})
-describe('Images.loadFromThumbHash', () => {
+describe('ThumbHash.decode', () => {
it('decodes a ThumbHash buffer back into an Image', () => {
const source = Images.createBlankImage(64, 64, true, BLUE).resize(32, 32)
- const hash = source.toThumbHash()
- const decoded = Images.loadFromThumbHash(hash)
+ const hash = ThumbHash.encode(source)
+ const decoded = ThumbHash.decode(hash)
expect(decoded.width).toBeGreaterThan(0)
expect(decoded.height).toBeGreaterThan(0)
})
it('async variant decodes the ThumbHash buffer', async () => {
const source = Images.createBlankImage(64, 64, true, GREEN).resize(32, 32)
- const hash = await source.toThumbHashAsync()
- const decoded = await Images.loadFromThumbHashAsync(hash)
+ const hash = await ThumbHash.encodeAsync(source)
+ const decoded = await ThumbHash.decodeAsync(hash)
expect(decoded.width).toBeGreaterThan(0)
expect(decoded.height).toBeGreaterThan(0)
})
diff --git a/example/__tests__/image-utils.harness.ts b/example/__tests__/image-utils.harness.ts
index 23d55b3a..7f900040 100644
--- a/example/__tests__/image-utils.harness.ts
+++ b/example/__tests__/image-utils.harness.ts
@@ -3,9 +3,8 @@ import {
Images,
supportsHeicLoading,
supportsHeicWriting,
- thumbHashFromBase64String,
- thumbHashToBase64String,
} from 'react-native-nitro-image'
+import { ThumbHash } from 'react-native-nitro-image-thumbhash'
const expectTemporaryHeicPath = (path: string) => {
expect(path.length).toBeGreaterThan(0)
@@ -58,7 +57,7 @@ describe('ImageUtils - HEIC round-trip', () => {
})
})
-describe('ImageUtils - thumbHash round-trip', () => {
+describe('ThumbHash - round-trip', () => {
it('encodes a small image to a thumbHash and converts to base64', () => {
const image = Images.createBlankImage(64, 64, true, {
r: 0.5,
@@ -67,14 +66,14 @@ describe('ImageUtils - thumbHash round-trip', () => {
a: 1,
})
const small = image.resize(32, 32)
- const hash = small.toThumbHash()
+ const hash = ThumbHash.encode(small)
expect(hash.byteLength).toBeGreaterThan(0)
- const base64 = thumbHashToBase64String(hash)
+ const base64 = ThumbHash.toBase64String(hash)
expect(base64.length).toBeGreaterThan(0)
expect(base64).toMatch(/^[A-Za-z0-9+/=]+$/)
- const restored = thumbHashFromBase64String(base64)
+ const restored = ThumbHash.fromBase64String(base64)
expect(restored.byteLength).toBe(hash.byteLength)
})
@@ -85,8 +84,8 @@ describe('ImageUtils - thumbHash round-trip', () => {
b: 0,
a: 1,
})
- const hash = image.toThumbHash()
- const decoded = Images.loadFromThumbHash(hash)
+ const hash = ThumbHash.encode(image)
+ const decoded = ThumbHash.decode(hash)
expect(decoded.width).toBeGreaterThan(0)
expect(decoded.height).toBeGreaterThan(0)
})
diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock
index d12338c7..ad8353be 100644
--- a/example/ios/Podfile.lock
+++ b/example/ios/Podfile.lock
@@ -3,7 +3,7 @@ PODS:
- DoubleConversion (1.1.6)
- fast_float (8.0.0)
- FBLazyVector (0.81.0)
- - fmt (11.0.2)
+ - fmt (12.1.0)
- glog (0.3.5)
- HarnessUI (1.1.0):
- boost
@@ -78,6 +78,37 @@ PODS:
- ReactCommon/turbomodule/core
- SocketRocket
- Yoga
+ - NitroImageThumbHash (0.0.1):
+ - boost
+ - DoubleConversion
+ - fast_float
+ - fmt
+ - glog
+ - hermes-engine
+ - NitroImage
+ - NitroModules
+ - RCT-Folly
+ - RCT-Folly/Fabric
+ - RCTRequired
+ - RCTTypeSafety
+ - React-callinvoker
+ - React-Core
+ - React-debug
+ - React-Fabric
+ - React-featureflags
+ - React-graphics
+ - React-ImageManager
+ - React-jsi
+ - React-NativeModulesApple
+ - React-RCTFabric
+ - React-renderercss
+ - React-rendererdebug
+ - React-utils
+ - ReactCodegen
+ - ReactCommon/turbomodule/bridging
+ - ReactCommon/turbomodule/core
+ - SocketRocket
+ - Yoga
- NitroModules (0.35.5):
- boost
- DoubleConversion
@@ -143,20 +174,20 @@ PODS:
- boost
- DoubleConversion
- fast_float (= 8.0.0)
- - fmt (= 11.0.2)
+ - fmt (= 12.1.0)
- glog
- RCT-Folly/Default (= 2024.11.18.00)
- RCT-Folly/Default (2024.11.18.00):
- boost
- DoubleConversion
- fast_float (= 8.0.0)
- - fmt (= 11.0.2)
+ - fmt (= 12.1.0)
- glog
- RCT-Folly/Fabric (2024.11.18.00):
- boost
- DoubleConversion
- fast_float (= 8.0.0)
- - fmt (= 11.0.2)
+ - fmt (= 12.1.0)
- glog
- RCTDeprecation (0.81.0)
- RCTRequired (0.81.0)
@@ -2523,6 +2554,7 @@ DEPENDENCIES:
- "HarnessUI (from `../../node_modules/@react-native-harness/ui`)"
- hermes-engine (from `../../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`)
- NitroImage (from `../../node_modules/react-native-nitro-image`)
+ - NitroImageThumbHash (from `../../node_modules/react-native-nitro-image-thumbhash`)
- NitroModules (from `../../node_modules/react-native-nitro-modules`)
- NitroWebImage (from `../../node_modules/react-native-nitro-web-image`)
- RCT-Folly (from `../../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`)
@@ -2623,6 +2655,8 @@ EXTERNAL SOURCES:
:tag: hermes-2025-07-07-RNv0.81.0-e0fc67142ec0763c6b6153ca2bf96df815539782
NitroImage:
:path: "../../node_modules/react-native-nitro-image"
+ NitroImageThumbHash:
+ :path: "../../node_modules/react-native-nitro-image-thumbhash"
NitroModules:
:path: "../../node_modules/react-native-nitro-modules"
NitroWebImage:
@@ -2767,85 +2801,86 @@ SPEC CHECKSUMS:
DoubleConversion: cb417026b2400c8f53ae97020b2be961b59470cb
fast_float: b32c788ed9c6a8c584d114d0047beda9664e7cc6
FBLazyVector: a867936a67af0d09c37935a1b900a1a3c795b6d1
- fmt: a40bb5bd0294ea969aaaba240a927bd33d878cdd
+ fmt: 530618a01105dae0fa3a2f27c81ae11fa8f67eac
glog: 5683914934d5b6e4240e497e0f4a3b42d1854183
- HarnessUI: 89b0197f0c33f741f001a9113d4979f17e8004bf
+ HarnessUI: 01740b858c62c55d42995d4ca459ead036b96c9a
hermes-engine: e7491a2038f2618c8cd444ed411a6deb350a3742
libwebp: 02b23773aedb6ff1fd38cec7a77b81414c6842a8
- NitroImage: 358f7e81941d911eeb27ac37526731eb9672bc19
- NitroModules: 6e73058747e2da022cb4fca5654f39eaf61e3c4f
- NitroWebImage: 2e181d7eae11fad17d689eb054ab803f9d60a5e3
- RCT-Folly: 59ec0ac1f2f39672a0c6e6cecdd39383b764646f
+ NitroImage: cef8d9c91d6d9247ec0569bb68148f7fba717026
+ NitroImageThumbHash: 992d4d9529f1770664b62e79f53e111381653bca
+ NitroModules: ea5dc6c43666f4a75e71e372eaca6d3605856e51
+ NitroWebImage: 3b45bf7868d02a3ea2ba20c9c9f955288384e31a
+ RCT-Folly: b29feb752b08042c62badaef7d453f3bb5e6ae23
RCTDeprecation: 0735ab4f6b3ec93a7f98187b5da74d7916e2cf4c
RCTRequired: 8fcc7801bfc433072287b0f24a662e2816e89d0c
RCTTypeSafety: 2b2be515d6b968bcba7a68c4179d8199bd8c9b58
React: 1000c0e96d8fb9fbdaf13f7d31d0b09db3cbb4ac
React-callinvoker: 7e52661bfaf5d8881a9cee049792627a00001fbe
- React-Core: a9128dd77ec52432727bfbec8c55d17189f6c039
- React-CoreModules: 4597116bd78ae2b183547e3700be0dc9537918e9
- React-cxxreact: e3a02f535cc1f1b547ac1baafe6ac25552352362
+ React-Core: 949b436ddfe76cf47ac96375152de2f3506a8421
+ React-CoreModules: 0f27580d0d82d430fa4f2cf4d970b6ad1120d63a
+ React-cxxreact: 48754f11f47a29ea4800cbdd694c10f874a26b9b
React-debug: 7a23d96f709f437c5e08973d6e06d0a54dd180a1
- React-defaultsnativemodule: f01b6e58a23efe4fc8d74db7dadeea112908f5d5
- React-domnativemodule: 2d9796d40ab675e0f91ae8aae26c796b6e9a7499
- React-Fabric: f4344b3a882292783de9a5404852023b6c4fdd2d
- React-FabricComponents: 7c51eb1619473ae3ed92d8bbf5d5dd3be0c5ef9d
- React-FabricImage: 9e743575e67a9c14242bec3ae0e26663eed641bb
- React-featureflags: 5188951cc2fc81f4d249dc37e8f96dca7ef50e96
- React-featureflagsnativemodule: 0fa7473065377ca4e5651c75614796326ef57aa8
- React-graphics: f65ecd0a8c70f9c7dcdae322851c19b21c83ec27
- React-hermes: 8418dae38a0513aa66aaa0a1b0904e55c4448644
- React-idlecallbacksnativemodule: 540d6f743fcb595b26da8b182b28c878a1176a96
- React-ImageManager: 5f9f1e33611a852d21a63e1de76d211fb04ac935
- React-jserrorhandler: 9c0a7d69cd07c9ae08fab3a61150d526c0174c83
- React-jsi: b711b7a11d77357beb95fa2eabd30c1ae34dcf40
- React-jsiexecutor: 0d1c78e666c5be71ff7c0ff5ea7fb043e5b1f14c
- React-jsinspector: 5fabd9f0be9390d5b5eb5fc88a8965d97e0c14ac
- React-jsinspectorcdp: e78c65e25253999c0efd5e23c99e649e02fd0244
- React-jsinspectornetwork: b02c6f7fe00e12b575a7faea0ed9ec9ddbc1c20f
- React-jsinspectortracing: c6d8da3c8bcd939b8dcfd5113e247d56af932e1b
- React-jsitooling: 4ca9b158d65909590daf6bf30a345b663eb71964
- React-jsitracing: d9e9378d5a3e05febea2164a5d0c5fab06492872
- React-logger: 839abfd18a3fbdf88132824de584b226d0c5cbce
- React-Mapbuffer: bd5b1120c9bbaac6203eb288735e239f04e03009
- React-microtasksnativemodule: 10892b00e612d79436022a11e5bc8bdf468a284f
- react-native-safe-area-context: 0f4986a88ec555aff660503b483d6e4bd6980a9a
- React-NativeModulesApple: 3f9e97a4a90eeec1ceade511f973b277632650bb
+ React-defaultsnativemodule: 569d9222a701ed3dc60a60b2ce066b5bd88da059
+ React-domnativemodule: 34474bda3973bfd0ca2ea9f1b3db20db5d504cc7
+ React-Fabric: 45c3e9b112075451e592f0e008cabd4b82575355
+ React-FabricComponents: a428f23938c27a073baacc069d484b3478df85f3
+ React-FabricImage: 4375129ba8a26e8a7074af1c2468870fb8aab723
+ React-featureflags: ed973a134993f3be204d0b2d385d386603c9a0af
+ React-featureflagsnativemodule: aa3e1dc86bc185344d4875e7cb40cce0bd28de76
+ React-graphics: b5b8709a8216075bb6a5f9e7bb68881212d924ee
+ React-hermes: c543ffa2866304c582bdcb135c184e0f776f0d0b
+ React-idlecallbacksnativemodule: f19c4060b12fffc3ad33ce5de190338751b462ef
+ React-ImageManager: ecaf317aa5dff5eebba178b0813ef998c62547ea
+ React-jserrorhandler: 92eea1ee4f8c56b466b34e0065def59805e5d3a9
+ React-jsi: 7336786a4a14c473d104e6b37df935620d218fcd
+ React-jsiexecutor: 7c750f5b63fbc071d0f0e56e86f1a1589914f7b1
+ React-jsinspector: da5f336c1aa174a05885d061559a92e1d07b8a80
+ React-jsinspectorcdp: 0e807e4c2dc8ae8a07f0a6bfe50377f442079ba3
+ React-jsinspectornetwork: 3399384f2b6b70b287d8b9675452af4cec21dc65
+ React-jsinspectortracing: 030af0e9dca9a4eaa1d0ba258c7bd859fb90f61d
+ React-jsitooling: f8ed67814b17ebb124c48fccdf587ee1e02f16f4
+ React-jsitracing: 5cf6b84d46a4653895e30956a0ce3a315244c10a
+ React-logger: 04ce9229cb57db2c2a8164eaec1105f89da7fb22
+ React-Mapbuffer: e402e7a0535b2213c50727553621480fe8cd8ade
+ React-microtasksnativemodule: a63ce5595016996a9bac1f10c70a7a7fe6506649
+ react-native-safe-area-context: befb5404eb8a16fdc07fa2bebab3568ecabcbb8a
+ React-NativeModulesApple: b3766e1f87b08064ebc459b9e1538da2447ca874
React-oscompat: 34f3d3c06cadcbc470bc4509c717fb9b919eaa8b
- React-perflogger: 95dff8cc9901777360716cbdcb2998849f133a4f
- React-performancetimeline: 2937a27399b52ca8baf46f22c39087f617e626b5
+ React-perflogger: a1edb025fd5d44f61bf09307e248f7608d7b2dcf
+ React-performancetimeline: 1f86dc9782e3fe78727c5fbb3e2178b9fd1aa6fd
React-RCTActionSheet: 550c9c6c2e7dcd85a51954dc08e2f3837a148e7c
- React-RCTAnimation: 0008bfe273566acd3128da13598073383325ac7a
- React-RCTAppDelegate: 8b9452baef5548856a22f4710d4135cf68746cf5
- React-RCTBlob: 60006ab743e5fd807aaf536092f5ce86e87df526
- React-RCTFabric: 8d5d1006b3812c35fd0f37c117ff7bcf6449e20d
- React-RCTFBReactNativeSpec: 3cb4265fa9a4e4f8250ae89feb345edc542731da
- React-RCTImage: f40a2ee0f79c1666e8b81da4ea2d9d1182c94962
- React-RCTLinking: cfe6995bdd8d08d0bb0df12771f4d28fd5fd54ff
- React-RCTNetwork: 565c0cd46313f2cad0e4db70a44958b2842c372b
- React-RCTRuntime: 971a71a42d8979475a380e5179083302e5506cdd
- React-RCTSettings: afcec6060d916e9c0410004ad8419d45f9dbcd36
- React-RCTText: 952f2a1b618d3f3872e7e5a82aefc5e5082c59aa
- React-RCTVibration: 2a7e7497ffefa135c7f0fee8ee10e3505ab5cc61
+ React-RCTAnimation: 19d4bb6d2190983d1354b096b7b65dbd591924da
+ React-RCTAppDelegate: 6c71d16eef920831a312ff363355fc3b99c02a98
+ React-RCTBlob: b81a0cffe1a083bcf9d8aa9f27f4d37864579e90
+ React-RCTFabric: 01005d2fa799bba6e21aae18820498f56fe0be5f
+ React-RCTFBReactNativeSpec: 5adb84a81c4ed7a1f2661835d166e4b2c4320cd4
+ React-RCTImage: 607e5e373fb56d72417464bd82e8046af81ab502
+ React-RCTLinking: 301434c7bf1100458be5a3866326ba33491e3687
+ React-RCTNetwork: a118a47bd123ac96c9877e04f5731a1d6545aba5
+ React-RCTRuntime: 85fdbf469fe8a12c4db6c836731b190efc33d11d
+ React-RCTSettings: 5a5aa2cf9ac40f7a8897cc0f9d945ac803886604
+ React-RCTText: e6e00bee9847a8af1218079b73c8bfed16c75b8d
+ React-RCTVibration: 5a05fa0ef05ee73d074a3314e57586afc969f1ba
React-rendererconsistency: c2cb23365f4a7b511893748fe8cad1830bbae637
- React-renderercss: 621b2b85af14694e93c2bcd63986fb57bcceab2e
- React-rendererdebug: 4ba0769131e20347b900757fcac3c7919b27080c
- React-RuntimeApple: c1a211351c14d35805d45a94094cfb3e5649552c
- React-RuntimeCore: b7c7d8dffa3728a9e9616e0e8b5b6b41037ebcca
- React-runtimeexecutor: e931e48afc888fe459f6ffb481971e23bb34f7ee
- React-RuntimeHermes: 5763230801ee57d9f414818f48e44b874f3ce1be
- React-runtimescheduler: b2e99f9702705fc8c11cf3c51f9911f478ee2210
+ React-renderercss: 0c1472d6572c05e493aee476598c3ed6234b6c33
+ React-rendererdebug: d6335da9730fa5a151537aa976a16d48de6135e2
+ React-RuntimeApple: 5684c2a5d8768e5728a5817c21e5dba798d54c58
+ React-RuntimeCore: 52428a1b48fb3c50ddf4dd5eee494486e4ecffc6
+ React-runtimeexecutor: 1b4e99e5c27d2cb8bdeca9773ff5f1a8eac7709c
+ React-RuntimeHermes: a688639233a3ea44b4f8e4d448f51943d7e00815
+ React-runtimescheduler: b833f0fc8c788329a497e93f55ce30508f56307a
React-timing: 25e8229ad1cf6874e9f0711515213cb2bc322215
- React-utils: 7ea6e4d300c43a763e4e08091413aec962588f93
- ReactAppDependencyProvider: 562d731311d0524a577cf8a01faa97874bacbdfe
- ReactCodegen: 0fc801cfa34581b2acfb9568ef6180042043826a
- ReactCommon: c235ebd26d63fde9a2dfa72cee9f8294b910fee1
- RNFastImage: 5c9c9fed9c076e521b3f509fe79e790418a544e8
- RNScreens: 7179cc1ba31b4e18ed29f10abf20c24a7961cf4c
+ React-utils: 068cec677032ba78ca0700f2dcbe6d08a0939647
+ ReactAppDependencyProvider: c91900fa724baee992f01c05eeb4c9e01a807f78
+ ReactCodegen: c3a2e945d68bcf8839624acaf1b276acbb41e9ba
+ ReactCommon: 116d6ee71679243698620d8cd9a9042541e44aa6
+ RNFastImage: 462a183c4b0b6b26fdfd639e1ed6ba37536c3b87
+ RNScreens: 7f643ee0fd1407dc5085c7795460bd93da113b8f
SDWebImage: a7f831e1a65eb5e285e3fb046a23fcfbf08e696d
SDWebImageWebPCoder: 908b83b6adda48effe7667cd2b7f78c897e5111d
SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748
- Yoga: b01392348aeea02064c21a2762a42893d82b60a7
+ Yoga: 00013dd9cde63a2d98e8002fcc4f5ddb66c10782
PODFILE CHECKSUM: 8c90c25c7a6bc16ec7b3ed7968df16467ab0fc35
-COCOAPODS: 1.15.2
+COCOAPODS: 1.16.2
diff --git a/example/package.json b/example/package.json
index f95aae5e..d1e033b2 100644
--- a/example/package.json
+++ b/example/package.json
@@ -19,6 +19,7 @@
"react-native-fast-image": "^8.6.3",
"react-native-harness": "^1.0.0-alpha.25",
"react-native-nitro-image": "workspace:*",
+ "react-native-nitro-image-thumbhash": "workspace:*",
"react-native-nitro-web-image": "workspace:*",
"react-native-nitro-modules": "0.35.5",
"react-native-safe-area-context": "^5.6.0",
diff --git a/example/src/App.tsx b/example/src/App.tsx
index 2dff6a2c..c444dac9 100644
--- a/example/src/App.tsx
+++ b/example/src/App.tsx
@@ -10,6 +10,7 @@ import { createStaticNavigation } from '@react-navigation/native'
import { EmptyTab } from './EmptyTab'
import { FastImageTab } from './FastImageTab'
import { NitroImageTab } from './NitroImageTab'
+import { ThumbHashTab } from './ThumbHashTab'
const Tabs = createBottomTabNavigator({
detachInactiveScreens: false,
@@ -17,6 +18,7 @@ const Tabs = createBottomTabNavigator({
Empty: EmptyTab,
FastImage: FastImageTab,
NitroImage: NitroImageTab,
+ ThumbHash: ThumbHashTab,
},
})
const Navigation = createStaticNavigation(Tabs)
diff --git a/example/src/ThumbHashTab.tsx b/example/src/ThumbHashTab.tsx
new file mode 100644
index 00000000..50c427dc
--- /dev/null
+++ b/example/src/ThumbHashTab.tsx
@@ -0,0 +1,95 @@
+import { useMemo, useState } from 'react'
+import { ScrollView, StyleSheet, Text, TextInput, View } from 'react-native'
+import { NitroImage, useImage } from 'react-native-nitro-image'
+import { ThumbHash } from 'react-native-nitro-image-thumbhash'
+
+const DEFAULT_URL = 'https://picsum.photos/seed/thumbhash/400'
+
+export function ThumbHashTab() {
+ const [url, setUrl] = useState(DEFAULT_URL)
+ const { image, error } = useImage({ url })
+
+ const encoded = useMemo(() => {
+ if (image == null) return null
+ try {
+ const small = image.resize(100, 100)
+ const hash = ThumbHash.encode(small)
+ const base64 = ThumbHash.toBase64String(hash)
+ const decoded = ThumbHash.decode(hash)
+ return { base64, decoded }
+ } catch (e) {
+ console.warn('ThumbHash encode failed', e)
+ return null
+ }
+ }, [image])
+
+ return (
+
+
+
+ Source
+
+
+ ThumbHash placeholder
+ {encoded != null ? (
+
+ ) : (
+
+ )}
+
+ Base64
+
+ {error != null
+ ? `Error: ${error.message}`
+ : (encoded?.base64 ?? 'Encoding…')}
+
+
+ )
+}
+
+const styles = StyleSheet.create({
+ container: {
+ padding: 16,
+ alignItems: 'stretch',
+ },
+ textInput: {
+ borderWidth: 1,
+ borderRadius: 5,
+ paddingHorizontal: 10,
+ paddingVertical: 8,
+ marginBottom: 16,
+ },
+ label: {
+ fontSize: 14,
+ fontWeight: '600',
+ marginTop: 12,
+ marginBottom: 6,
+ },
+ image: {
+ width: '100%',
+ aspectRatio: 1,
+ backgroundColor: '#eee',
+ borderRadius: 6,
+ },
+ placeholder: {
+ backgroundColor: '#ccc',
+ },
+ hash: {
+ fontFamily: 'Courier',
+ fontSize: 12,
+ padding: 8,
+ backgroundColor: '#f4f4f4',
+ borderRadius: 4,
+ },
+})
diff --git a/package.json b/package.json
index f13dc5c5..67afe1a7 100644
--- a/package.json
+++ b/package.json
@@ -7,11 +7,12 @@
"workspaces": [
"packages/react-native-nitro-image",
"packages/react-native-nitro-web-image",
+ "packages/react-native-nitro-image-thumbhash",
"example"
],
"scripts": {
- "build": "bun run --cwd packages/react-native-nitro-image build && bun run --cwd packages/react-native-nitro-web-image build",
- "specs": "bun run build && bun run --cwd packages/react-native-nitro-image specs && bun run --cwd packages/react-native-nitro-web-image specs",
+ "build": "bun run --cwd packages/react-native-nitro-image build && bun run --cwd packages/react-native-nitro-web-image build && bun run --cwd packages/react-native-nitro-image-thumbhash build",
+ "specs": "bun run build && bun run --cwd packages/react-native-nitro-image specs && bun run --cwd packages/react-native-nitro-web-image specs && bun run --cwd packages/react-native-nitro-image-thumbhash specs",
"bootstrap": "bun i && bun run build && cd example && bundle install && bun pods",
"typecheck": "bun --filter=\"**\" typecheck",
"lint": "biome check --write",
@@ -20,6 +21,7 @@
"release": "./scripts/release.sh",
"image": "bun --cwd packages/react-native-nitro-image",
"web-image": "bun --cwd packages/react-native-nitro-web-image",
+ "thumbhash": "bun --cwd packages/react-native-nitro-image-thumbhash",
"example": "bun --cwd example"
},
"devDependencies": {
@@ -63,6 +65,10 @@
"file": "packages/react-native-nitro-web-image/package.json",
"path": "version"
},
+ {
+ "file": "packages/react-native-nitro-image-thumbhash/package.json",
+ "path": "version"
+ },
{
"file": "example/package.json",
"path": "version"
diff --git a/packages/react-native-nitro-image-thumbhash/.gitignore b/packages/react-native-nitro-image-thumbhash/.gitignore
new file mode 100644
index 00000000..1279851d
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/.gitignore
@@ -0,0 +1,83 @@
+# OSX
+#
+.DS_Store
+
+# XDE
+.expo/
+
+# VSCode
+.vscode/
+jsconfig.json
+
+# Xcode
+#
+build/
+*.pbxuser
+!default.pbxuser
+*.mode1v3
+!default.mode1v3
+*.mode2v3
+!default.mode2v3
+*.perspectivev3
+!default.perspectivev3
+xcuserdata
+*.xccheckout
+*.moved-aside
+DerivedData
+*.hmap
+*.ipa
+*.xcuserstate
+project.xcworkspace
+
+# Android/IJ
+#
+.classpath
+.cxx
+.gradle
+.idea
+.project
+.settings
+local.properties
+android.iml
+
+# Cocoapods
+#
+example/ios/Pods
+
+# Ruby
+example/vendor/
+
+# node.js
+#
+node_modules/
+npm-debug.log
+yarn-debug.log
+yarn-error.log
+
+# BUCK
+buck-out/
+\.buckd/
+android/app/libs
+android/keystores/debug.keystore
+
+# Yarn
+.yarn/*
+!.yarn/patches
+!.yarn/plugins
+!.yarn/releases
+!.yarn/sdks
+!.yarn/versions
+
+# Expo
+.expo/
+
+# Turborepo
+.turbo/
+
+# generated by bob
+lib/
+
+# caches
+.eslintcache
+.cache
+*.tsbuildinfo
diff --git a/packages/react-native-nitro-image-thumbhash/.watchmanconfig b/packages/react-native-nitro-image-thumbhash/.watchmanconfig
new file mode 100644
index 00000000..9e26dfee
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/.watchmanconfig
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/packages/react-native-nitro-image-thumbhash/NitroImageThumbHash.podspec b/packages/react-native-nitro-image-thumbhash/NitroImageThumbHash.podspec
new file mode 100644
index 00000000..127c682d
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/NitroImageThumbHash.podspec
@@ -0,0 +1,32 @@
+require "json"
+
+package = JSON.parse(File.read(File.join(__dir__, "package.json")))
+
+Pod::Spec.new do |s|
+ s.name = "NitroImageThumbHash"
+ s.version = package["version"]
+ s.summary = package["description"]
+ s.homepage = package["homepage"]
+ s.license = package["license"]
+ s.authors = package["author"]
+
+ s.platforms = { :ios => min_ios_version_supported, :visionos => 1.0 }
+ s.source = { :git => "https://github.com/mrousavy/nitro.git", :tag => "#{s.version}" }
+
+ s.source_files = [
+ # Implementation (Swift)
+ "ios/**/*.{swift}",
+ # Autolinking/Registration (Objective-C++)
+ "ios/**/*.{m,mm}",
+ # Implementation (C++ objects)
+ "cpp/**/*.{hpp,cpp}",
+ ]
+
+ load 'nitrogen/generated/ios/NitroImageThumbHash+autolinking.rb'
+ add_nitrogen_files(s)
+
+ s.dependency 'React-jsi'
+ s.dependency 'React-callinvoker'
+ s.dependency 'NitroImage'
+ install_modules_dependencies(s)
+end
diff --git a/packages/react-native-nitro-image-thumbhash/README.md b/packages/react-native-nitro-image-thumbhash/README.md
new file mode 100644
index 00000000..04f2507a
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/README.md
@@ -0,0 +1,38 @@
+# react-native-nitro-template
+
+This is a template for Nitro Modules.
+
+## Usage
+
+Clone this repo, and change all `$$*$$` names according to your `nitro.json` file.
+
+## Contributing
+
+Contribute a change to this template to update it for newer React Native versions.
+
+## Structure
+
+- [`android/`](android): All your `android`-specific implementations.
+ - [`build.gradle`](android/build.gradle): The gradle build file. This contains four important pieces:
+ 1. Standard react-native library boilerplate code
+ 2. Configures Kotlin (`apply plugin: 'org.jetbrains.kotlin.android'`)
+ 3. Adds all Nitrogen files (`apply from: '.../NitroThumbhash+autolinking.gradle'`)
+ 4. Triggers the native C++ build (via CMake/`externalNativeBuild`)
+ - [`CMakeLists.txt`](android/CMakeLists.txt): The CMake build file to build C++ code. This contains four important pieces:
+ 1. Creates a library called `NitroThumbhash` (same as in `nitro.json`)
+ 2. Adds all Nitrogen files (`include(.../NitroThumbhash+autolinking.cmake)`)
+ 3. Adds all custom C++ files (only `HybridTestObjectCpp.cpp`)
+ 4. Adds a `cpp-adapter.cpp` file, which autolinks all C++ HybridObjects (only `HybridTestObjectCpp`)
+ - [`src/main/java/com/margelo/nitro/nitrothumbhash/`](android/src/main/java/com/margelo/nitro/nitrothumbhash/): All Kotlin implementations.
+ - [`NitroThumbhashPackage.kt`](android/src/main/java/com/margelo/nitro/nitrothumbhash/NitroThumbhashPackage.kt): The react-native package. You need this because the react-native CLI only adds libraries if they have a `*Package.kt` file. In here, you can autolink all Kotlin HybridObjects.
+- [`cpp/`](cpp): All your cross-platform implementations. (only `HybridTestObjectCpp.cpp`)
+- [`ios/`](ios): All your iOS-specific implementations.
+- [`nitrogen/`](nitrogen): All files generated by nitrogen. You should commit this folder to git.
+- [`src/`](src): The TypeScript codebase. This defines all HybridObjects and loads them at runtime.
+ - [`specs/`](src/specs): All HybridObject types. Nitrogen will run on all `*.nitro.ts` files.
+- [`nitro.json`](nitro.json): The configuration file for nitrogen. This will define all native namespaces, as well as the library name.
+- [`NitroThumbhash.podspec`](NitroThumbhash.podspec): The iOS podspec build file to build the iOS code. This contains three important pieces:
+ 1. Specifies the Pod's name. This must be identical to the name specified in `nitro.json`.
+ 2. Adds all of your `.swift` or `.cpp` files (implementations).
+ 3. Adds all Nitrogen files (`add_nitrogen_files(s)`)
+- [`package.json`](package.json): The npm package.json file. `react-native-nitro-modules` should be a `peerDependency`.
diff --git a/packages/react-native-nitro-image-thumbhash/android/CMakeLists.txt b/packages/react-native-nitro-image-thumbhash/android/CMakeLists.txt
new file mode 100644
index 00000000..1008a6c2
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/android/CMakeLists.txt
@@ -0,0 +1,31 @@
+project(NitroImageThumbHash)
+cmake_minimum_required(VERSION 3.9.0)
+
+set (PACKAGE_NAME NitroImageThumbHash)
+set (CMAKE_VERBOSE_MAKEFILE ON)
+set (CMAKE_CXX_STANDARD 20)
+
+# Define C++ library and add all sources
+add_library(${PACKAGE_NAME} SHARED
+ src/main/cpp/cpp-adapter.cpp
+)
+
+# Add Nitrogen specs :)
+include(${CMAKE_SOURCE_DIR}/../nitrogen/generated/android/NitroImageThumbHash+autolinking.cmake)
+
+# Set up local includes
+include_directories(
+ "src/main/cpp"
+ "../cpp"
+)
+
+find_library(LOG_LIB log)
+find_package(react-native-nitro-image REQUIRED) # <-- for the HybridImage type
+
+# Link all libraries together
+target_link_libraries(
+ ${PACKAGE_NAME}
+ ${LOG_LIB}
+ android # <-- Android core
+ react-native-nitro-image::NitroImage # <-- NitroImage
+)
diff --git a/packages/react-native-nitro-image-thumbhash/android/build.gradle b/packages/react-native-nitro-image-thumbhash/android/build.gradle
new file mode 100644
index 00000000..e3d76d2f
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/android/build.gradle
@@ -0,0 +1,144 @@
+buildscript {
+ repositories {
+ google()
+ mavenCentral()
+ }
+
+ dependencies {
+ classpath "com.android.tools.build:gradle:9.2.1"
+ }
+}
+
+def reactNativeArchitectures() {
+ def value = rootProject.getProperties().get("reactNativeArchitectures")
+ return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"]
+}
+
+def isNewArchitectureEnabled() {
+ return rootProject.hasProperty("newArchEnabled") && rootProject.getProperty("newArchEnabled") == "true"
+}
+
+apply plugin: "com.android.library"
+apply plugin: 'org.jetbrains.kotlin.android'
+apply from: '../nitrogen/generated/android/NitroImageThumbHash+autolinking.gradle'
+apply from: "./fix-prefab.gradle"
+
+if (isNewArchitectureEnabled()) {
+ apply plugin: "com.facebook.react"
+}
+
+def getExtOrDefault(name) {
+ return rootProject.ext.has(name) ? rootProject.ext.get(name) : project.properties["NitroImageThumbHash_" + name]
+}
+
+def getExtOrIntegerDefault(name) {
+ return rootProject.ext.has(name) ? rootProject.ext.get(name) : (project.properties["NitroImageThumbHash_" + name]).toInteger()
+}
+
+android {
+ namespace "com.margelo.nitro.image.thumbhash"
+
+ ndkVersion getExtOrDefault("ndkVersion")
+ compileSdkVersion getExtOrIntegerDefault("compileSdkVersion")
+
+ defaultConfig {
+ minSdkVersion getExtOrIntegerDefault("minSdkVersion")
+ targetSdkVersion getExtOrIntegerDefault("targetSdkVersion")
+ buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
+
+ externalNativeBuild {
+ cmake {
+ cppFlags "-frtti -fexceptions -Wall -Wextra -fstack-protector-all"
+ arguments "-DANDROID_STL=c++_shared", "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON"
+ abiFilters (*reactNativeArchitectures())
+
+ buildTypes {
+ debug {
+ cppFlags "-O1 -g"
+ }
+ release {
+ cppFlags "-O2"
+ }
+ }
+ }
+ }
+ }
+
+ externalNativeBuild {
+ cmake {
+ path "CMakeLists.txt"
+ }
+ }
+
+ packagingOptions {
+ excludes = [
+ "META-INF",
+ "META-INF/**",
+ "**/libc++_shared.so",
+ "**/libNitroModules.so",
+ "**/libfbjni.so",
+ "**/libjsi.so",
+ "**/libfolly_json.so",
+ "**/libfolly_runtime.so",
+ "**/libglog.so",
+ "**/libhermes.so",
+ "**/libhermes-executor-debug.so",
+ "**/libhermes_executor.so",
+ "**/libreactnative.so",
+ "**/libreactnativejni.so",
+ "**/libturbomodulejsijni.so",
+ "**/libreact_nativemodule_core.so",
+ "**/libjscexecutor.so"
+ ]
+ }
+
+ buildFeatures {
+ buildConfig true
+ prefab true
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ }
+ }
+
+ lintOptions {
+ disable "GradleCompatible"
+ }
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+
+ sourceSets {
+ main {
+ if (isNewArchitectureEnabled()) {
+ java.srcDirs += [
+ // React Codegen files
+ "${project.buildDir}/generated/source/codegen/java"
+ ]
+ }
+ }
+ }
+}
+
+repositories {
+ mavenCentral()
+ google()
+}
+
+
+dependencies {
+ // For < 0.71, this will be from the local maven repo
+ // For > 0.71, this will be replaced by `com.facebook.react:react-android:$version` by react gradle plugin
+ //noinspection GradleDynamicVersion
+ implementation "com.facebook.react:react-native:+"
+
+ // Add a dependency on NitroModules
+ implementation project(":react-native-nitro-modules")
+ // Add a dependency on NitroImage
+ implementation project(":react-native-nitro-image")
+}
+
diff --git a/packages/react-native-nitro-image-thumbhash/android/fix-prefab.gradle b/packages/react-native-nitro-image-thumbhash/android/fix-prefab.gradle
new file mode 100644
index 00000000..d6c010ef
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/android/fix-prefab.gradle
@@ -0,0 +1,51 @@
+tasks.configureEach { task ->
+ // Make sure that we generate our prefab publication file only after having built the native library
+ // so that not a header publication file, but a full configuration publication will be generated, which
+ // will include the .so file
+
+ def prefabConfigurePattern = ~/^prefab(.+)ConfigurePackage$/
+ def matcher = task.name =~ prefabConfigurePattern
+ if (matcher.matches()) {
+ def variantName = matcher[0][1]
+ task.outputs.upToDateWhen { false }
+ task.dependsOn("externalNativeBuild${variantName}")
+ }
+}
+
+afterEvaluate {
+ def abis = reactNativeArchitectures()
+ rootProject.allprojects.each { proj ->
+ if (proj === rootProject) return
+
+ def dependsOnThisLib = proj.configurations.findAll { it.canBeResolved }.any { config ->
+ config.dependencies.any { dep ->
+ dep.group == project.group && dep.name == project.name
+ }
+ }
+ if (!dependsOnThisLib && proj != project) return
+
+ if (!proj.plugins.hasPlugin('com.android.application') && !proj.plugins.hasPlugin('com.android.library')) {
+ return
+ }
+
+ def variants = proj.android.hasProperty('applicationVariants') ? proj.android.applicationVariants : proj.android.libraryVariants
+ // Touch the prefab_config.json files to ensure that in ExternalNativeJsonGenerator.kt we will re-trigger the prefab CLI to
+ // generate a libnameConfig.cmake file that will contain our native library (.so).
+ // See this condition: https://cs.android.com/android-studio/platform/tools/base/+/mirror-goog-studio-main:build-system/gradle-core/src/main/java/com/android/build/gradle/tasks/ExternalNativeJsonGenerator.kt;l=207-219?q=createPrefabBuildSystemGlue
+ variants.all { variant ->
+ def variantName = variant.name
+ abis.each { abi ->
+ def searchDir = new File(proj.projectDir, ".cxx/${variantName}")
+ if (!searchDir.exists()) return
+ def matches = []
+ searchDir.eachDir { randomDir ->
+ def prefabFile = new File(randomDir, "${abi}/prefab_config.json")
+ if (prefabFile.exists()) matches << prefabFile
+ }
+ matches.each { prefabConfig ->
+ prefabConfig.setLastModified(System.currentTimeMillis())
+ }
+ }
+ }
+ }
+}
diff --git a/packages/react-native-nitro-image-thumbhash/android/gradle.properties b/packages/react-native-nitro-image-thumbhash/android/gradle.properties
new file mode 100644
index 00000000..1fa8e060
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/android/gradle.properties
@@ -0,0 +1,5 @@
+NitroThumbhash_kotlinVersion=2.1.20
+NitroThumbhash_minSdkVersion=23
+NitroThumbhash_targetSdkVersion=36
+NitroThumbhash_compileSdkVersion=36
+NitroThumbhash_ndkVersion=27.1.12297006
diff --git a/packages/react-native-nitro-image-thumbhash/android/src/main/AndroidManifest.xml b/packages/react-native-nitro-image-thumbhash/android/src/main/AndroidManifest.xml
new file mode 100644
index 00000000..a2f47b60
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/android/src/main/AndroidManifest.xml
@@ -0,0 +1,2 @@
+
+
diff --git a/packages/react-native-nitro-image-thumbhash/android/src/main/cpp/cpp-adapter.cpp b/packages/react-native-nitro-image-thumbhash/android/src/main/cpp/cpp-adapter.cpp
new file mode 100644
index 00000000..cd688fe2
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/android/src/main/cpp/cpp-adapter.cpp
@@ -0,0 +1,9 @@
+#include
+#include
+#include "NitroImageThumbHashOnLoad.hpp"
+
+JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void*) {
+ return facebook::jni::initialize(vm, []() {
+ margelo::nitro::image::thumbhash::registerAllNatives();
+ });
+}
diff --git a/packages/react-native-nitro-image/android/src/main/java/com/madebyevan/thumbhash/ThumbHash.java b/packages/react-native-nitro-image-thumbhash/android/src/main/java/com/madebyevan/thumbhash/ThumbHash.java
similarity index 100%
rename from packages/react-native-nitro-image/android/src/main/java/com/madebyevan/thumbhash/ThumbHash.java
rename to packages/react-native-nitro-image-thumbhash/android/src/main/java/com/madebyevan/thumbhash/ThumbHash.java
diff --git a/packages/react-native-nitro-image-thumbhash/android/src/main/java/com/margelo/nitro/image/thumbhash/HybridThumbHashFactory.kt b/packages/react-native-nitro-image-thumbhash/android/src/main/java/com/margelo/nitro/image/thumbhash/HybridThumbHashFactory.kt
new file mode 100644
index 00000000..c62128ff
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/android/src/main/java/com/margelo/nitro/image/thumbhash/HybridThumbHashFactory.kt
@@ -0,0 +1,67 @@
+package com.margelo.nitro.image.thumbhash
+
+import android.graphics.Bitmap
+import androidx.annotation.Keep
+import androidx.core.graphics.createBitmap
+import com.facebook.proguard.annotations.DoNotStrip
+import com.madebyevan.thumbhash.ThumbHash
+import com.margelo.nitro.core.ArrayBuffer
+import com.margelo.nitro.core.Promise
+import com.margelo.nitro.image.HybridImage
+import com.margelo.nitro.image.HybridImageSpec
+import com.margelo.nitro.image.extensions.toByteBuffer
+import java.nio.ByteBuffer
+import kotlin.io.encoding.Base64
+import kotlin.io.encoding.ExperimentalEncodingApi
+
+@DoNotStrip
+@Keep
+class HybridThumbHashFactory : HybridThumbHashFactorySpec() {
+ override fun encode(image: HybridImageSpec): ArrayBuffer {
+ val native = image as? HybridImage
+ ?: throw Error("The given image ($image) is not a `HybridImage` and cannot be encoded to a ThumbHash!")
+ val bitmap = native.bitmap
+ if (bitmap.width > 100 || bitmap.height > 100) {
+ throw Error("Cannot encode an Image larger than 100x100 to a ThumbHash. " +
+ "Resize the image to <100 pixels in width and height first, then try again!")
+ }
+ val bitmapBuffer = bitmap.toByteBuffer()
+ val thumbHash = ThumbHash.rgbaToThumbHash(bitmap.width, bitmap.height, bitmapBuffer.array())
+ val buffer = ByteBuffer.wrap(thumbHash)
+ return ArrayBuffer.copy(buffer)
+ }
+
+ override fun encodeAsync(image: HybridImageSpec): Promise {
+ return Promise.async { encode(image) }
+ }
+
+ private fun decode(bytes: ByteArray): HybridImage {
+ val rgba = ThumbHash.thumbHashToRGBA(bytes)
+ val bitmap = createBitmap(rgba.width, rgba.height, Bitmap.Config.ARGB_8888)
+ val buffer = ByteBuffer.wrap(rgba.rgba)
+ bitmap.copyPixelsFromBuffer(buffer)
+ return HybridImage(bitmap)
+ }
+
+ override fun decode(thumbhash: ArrayBuffer): HybridImageSpec {
+ val bytes = thumbhash.toByteArray()
+ return decode(bytes)
+ }
+
+ override fun decodeAsync(thumbhash: ArrayBuffer): Promise {
+ val bytes = thumbhash.toByteArray()
+ return Promise.async { decode(bytes) }
+ }
+
+ @OptIn(ExperimentalEncodingApi::class)
+ override fun toBase64String(thumbhash: ArrayBuffer): String {
+ val buffer = thumbhash.toByteArray()
+ return Base64.encode(buffer)
+ }
+
+ @OptIn(ExperimentalEncodingApi::class)
+ override fun fromBase64String(thumbhashBase64: String): ArrayBuffer {
+ val bytes = Base64.decode(thumbhashBase64)
+ return ArrayBuffer.copy(bytes)
+ }
+}
diff --git a/packages/react-native-nitro-image-thumbhash/android/src/main/java/com/margelo/nitro/image/thumbhash/NitroImageThumbHashPackage.kt b/packages/react-native-nitro-image-thumbhash/android/src/main/java/com/margelo/nitro/image/thumbhash/NitroImageThumbHashPackage.kt
new file mode 100644
index 00000000..f046b34d
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/android/src/main/java/com/margelo/nitro/image/thumbhash/NitroImageThumbHashPackage.kt
@@ -0,0 +1,18 @@
+package com.margelo.nitro.image.thumbhash
+
+import com.facebook.react.bridge.NativeModule
+import com.facebook.react.bridge.ReactApplicationContext
+import com.facebook.react.module.model.ReactModuleInfoProvider
+import com.facebook.react.BaseReactPackage
+
+class NitroImageThumbHashPackage : BaseReactPackage() {
+ override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? = null
+
+ override fun getReactModuleInfoProvider(): ReactModuleInfoProvider = ReactModuleInfoProvider { HashMap() }
+
+ companion object {
+ init {
+ NitroImageThumbHashOnLoad.initializeNative()
+ }
+ }
+}
diff --git a/packages/react-native-nitro-image-thumbhash/babel.config.js b/packages/react-native-nitro-image-thumbhash/babel.config.js
new file mode 100644
index 00000000..3e0218e6
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/babel.config.js
@@ -0,0 +1,3 @@
+module.exports = {
+ presets: ['module:@react-native/babel-preset'],
+}
diff --git a/packages/react-native-nitro-image-thumbhash/ios/Bridge.h b/packages/react-native-nitro-image-thumbhash/ios/Bridge.h
new file mode 100644
index 00000000..79712e72
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/ios/Bridge.h
@@ -0,0 +1,8 @@
+//
+// Bridge.h
+// NitroImageThumbHash
+//
+// Created by Marc Rousavy on 22.07.24.
+//
+
+#pragma once
diff --git a/packages/react-native-nitro-image-thumbhash/ios/HybridThumbHashFactory.swift b/packages/react-native-nitro-image-thumbhash/ios/HybridThumbHashFactory.swift
new file mode 100644
index 00000000..2e5d6445
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/ios/HybridThumbHashFactory.swift
@@ -0,0 +1,59 @@
+import Foundation
+import UIKit
+import NitroModules
+import NitroImage
+
+fileprivate class HybridImage: HybridImageSpec, NativeImage {
+ let uiImage: UIImage
+ init(uiImage: UIImage) {
+ self.uiImage = uiImage
+ super.init()
+ }
+
+ // Without this, we get this error: error: type 'HybridImage' cannot conform to protocol 'HybridImageSpec_protocol'
+ // because it has requirements that cannot be satisfied
+ func saveToFileAsync(path: String, format: ImageFormat, quality: Double?) throws -> Promise { fatalError("stub") }
+ func saveToTemporaryFileAsync(format: ImageFormat, quality: Double?) throws -> Promise { fatalError("stub") }
+}
+
+class HybridThumbHashFactory: HybridThumbHashFactorySpec {
+ func encode(image: any HybridImageSpec) throws -> ArrayBuffer {
+ guard let native = image as? NativeImage else {
+ throw RuntimeError.error(withMessage: "The given image (\(image)) is not a `NativeImage` and cannot be encoded to a ThumbHash!")
+ }
+ let data = imageToThumbHash(image: native.uiImage)
+ return try ArrayBuffer.copy(data: data)
+ }
+
+ func encodeAsync(image: any HybridImageSpec) throws -> Promise {
+ return Promise.async {
+ return try self.encode(image: image)
+ }
+ }
+
+ func decode(thumbhash: ArrayBuffer) throws -> any HybridImageSpec {
+ let data = thumbhash.toData(copyIfNeeded: false)
+ let uiImage = thumbHashToImage(hash: data)
+ return HybridImage(uiImage: uiImage)
+ }
+
+ func decodeAsync(thumbhash: ArrayBuffer) throws -> Promise {
+ let data = thumbhash.toData(copyIfNeeded: true)
+ return Promise.async {
+ let uiImage = thumbHashToImage(hash: data)
+ return HybridImage(uiImage: uiImage)
+ }
+ }
+
+ func toBase64String(thumbhash: ArrayBuffer) throws -> String {
+ let data = thumbhash.toData(copyIfNeeded: false)
+ return data.base64EncodedString()
+ }
+
+ func fromBase64String(thumbhashBase64: String) throws -> ArrayBuffer {
+ guard let data = Data(base64Encoded: thumbhashBase64) else {
+ throw RuntimeError.error(withMessage: "The given ThumbHash (\(thumbhashBase64)) is not a valid Base64 encoded Hash!")
+ }
+ return try ArrayBuffer.copy(data: data)
+ }
+}
diff --git a/packages/react-native-nitro-image/ios/ThumbHash/ThumbHash.swift b/packages/react-native-nitro-image-thumbhash/ios/ThumbHash/ThumbHash.swift
similarity index 100%
rename from packages/react-native-nitro-image/ios/ThumbHash/ThumbHash.swift
rename to packages/react-native-nitro-image-thumbhash/ios/ThumbHash/ThumbHash.swift
diff --git a/packages/react-native-nitro-image-thumbhash/nitro.json b/packages/react-native-nitro-image-thumbhash/nitro.json
new file mode 100644
index 00000000..4ccba95b
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/nitro.json
@@ -0,0 +1,24 @@
+{
+ "$schema": "https://nitro.margelo.com/nitro.schema.json",
+ "cxxNamespace": ["image", "thumbhash"],
+ "ios": {
+ "iosModuleName": "NitroImageThumbHash"
+ },
+ "android": {
+ "androidNamespace": ["image", "thumbhash"],
+ "androidCxxLibName": "NitroImageThumbHash"
+ },
+ "autolinking": {
+ "ThumbHashFactory": {
+ "ios": {
+ "language": "swift",
+ "implementationClassName": "HybridThumbHashFactory"
+ },
+ "android": {
+ "language": "kotlin",
+ "implementationClassName": "HybridThumbHashFactory"
+ }
+ }
+ },
+ "ignorePaths": ["**/node_modules"]
+}
diff --git a/packages/react-native-nitro-image-thumbhash/nitrogen/generated/.gitattributes b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/.gitattributes
new file mode 100644
index 00000000..fb7a0d5a
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/.gitattributes
@@ -0,0 +1 @@
+** linguist-generated=true
diff --git a/packages/react-native-nitro-image-thumbhash/nitrogen/generated/android/NitroImageThumbHash+autolinking.cmake b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/android/NitroImageThumbHash+autolinking.cmake
new file mode 100644
index 00000000..5fdb650f
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/android/NitroImageThumbHash+autolinking.cmake
@@ -0,0 +1,81 @@
+#
+# NitroImageThumbHash+autolinking.cmake
+# This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
+# https://github.com/mrousavy/nitro
+# Copyright © Marc Rousavy @ Margelo
+#
+
+# This is a CMake file that adds all files generated by Nitrogen
+# to the current CMake project.
+#
+# To use it, add this to your CMakeLists.txt:
+# ```cmake
+# include(${CMAKE_SOURCE_DIR}/../nitrogen/generated/android/NitroImageThumbHash+autolinking.cmake)
+# ```
+
+# Define a flag to check if we are building properly
+add_definitions(-DBUILDING_NITROIMAGETHUMBHASH_WITH_GENERATED_CMAKE_PROJECT)
+
+# Enable Raw Props parsing in react-native (for Nitro Views)
+add_definitions(-DRN_SERIALIZABLE_STATE)
+
+# Add all headers that were generated by Nitrogen
+include_directories(
+ "../nitrogen/generated/shared/c++"
+ "../nitrogen/generated/android/c++"
+ "../nitrogen/generated/android/"
+)
+
+# Add all .cpp sources that were generated by Nitrogen
+target_sources(
+ # CMake project name (Android C++ library name)
+ NitroImageThumbHash PRIVATE
+ # Autolinking Setup
+ ../nitrogen/generated/android/NitroImageThumbHashOnLoad.cpp
+ # Shared Nitrogen C++ sources
+ ../nitrogen/generated/shared/c++/HybridThumbHashFactorySpec.cpp
+ # Android-specific Nitrogen C++ sources
+ ../nitrogen/generated/android/c++/JHybridThumbHashFactorySpec.cpp
+)
+
+# From node_modules/react-native/ReactAndroid/cmake-utils/folly-flags.cmake
+# Used in node_modules/react-native/ReactAndroid/cmake-utils/ReactNative-application.cmake
+target_compile_definitions(
+ NitroImageThumbHash PRIVATE
+ -DFOLLY_NO_CONFIG=1
+ -DFOLLY_HAVE_CLOCK_GETTIME=1
+ -DFOLLY_USE_LIBCPP=1
+ -DFOLLY_CFG_NO_COROUTINES=1
+ -DFOLLY_MOBILE=1
+ -DFOLLY_HAVE_RECVMMSG=1
+ -DFOLLY_HAVE_PTHREAD=1
+ # Once we target android-23 above, we can comment
+ # the following line. NDK uses GNU style stderror_r() after API 23.
+ -DFOLLY_HAVE_XSI_STRERROR_R=1
+)
+
+# Add all libraries required by the generated specs
+find_package(fbjni REQUIRED) # <-- Used for communication between Java <-> C++
+find_package(ReactAndroid REQUIRED) # <-- Used to set up React Native bindings (e.g. CallInvoker/TurboModule)
+find_package(react-native-nitro-modules REQUIRED) # <-- Used to create all HybridObjects and use the Nitro core library
+
+# Link all libraries together
+target_link_libraries(
+ NitroImageThumbHash
+ fbjni::fbjni # <-- Facebook C++ JNI helpers
+ ReactAndroid::jsi # <-- RN: JSI
+ react-native-nitro-modules::NitroModules # <-- NitroModules Core :)
+)
+
+# Link react-native (different prefab between RN 0.75 and RN 0.76)
+if(ReactAndroid_VERSION_MINOR GREATER_EQUAL 76)
+ target_link_libraries(
+ NitroImageThumbHash
+ ReactAndroid::reactnative # <-- RN: Native Modules umbrella prefab
+ )
+else()
+ target_link_libraries(
+ NitroImageThumbHash
+ ReactAndroid::react_nativemodule_core # <-- RN: TurboModules Core
+ )
+endif()
diff --git a/packages/react-native-nitro-image-thumbhash/nitrogen/generated/android/NitroImageThumbHash+autolinking.gradle b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/android/NitroImageThumbHash+autolinking.gradle
new file mode 100644
index 00000000..80ca1436
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/android/NitroImageThumbHash+autolinking.gradle
@@ -0,0 +1,27 @@
+///
+/// NitroImageThumbHash+autolinking.gradle
+/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
+/// https://github.com/mrousavy/nitro
+/// Copyright © Marc Rousavy @ Margelo
+///
+
+/// This is a Gradle file that adds all files generated by Nitrogen
+/// to the current Gradle project.
+///
+/// To use it, add this to your build.gradle:
+/// ```gradle
+/// apply from: '../nitrogen/generated/android/NitroImageThumbHash+autolinking.gradle'
+/// ```
+
+logger.warn("[NitroModules] 🔥 NitroImageThumbHash is boosted by nitro!")
+
+android {
+ sourceSets {
+ main {
+ java.srcDirs += [
+ // Nitrogen files
+ "${project.projectDir}/../nitrogen/generated/android/kotlin"
+ ]
+ }
+ }
+}
diff --git a/packages/react-native-nitro-image-thumbhash/nitrogen/generated/android/NitroImageThumbHashOnLoad.cpp b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/android/NitroImageThumbHashOnLoad.cpp
new file mode 100644
index 00000000..702daed0
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/android/NitroImageThumbHashOnLoad.cpp
@@ -0,0 +1,54 @@
+///
+/// NitroImageThumbHashOnLoad.cpp
+/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
+/// https://github.com/mrousavy/nitro
+/// Copyright © Marc Rousavy @ Margelo
+///
+
+#ifndef BUILDING_NITROIMAGETHUMBHASH_WITH_GENERATED_CMAKE_PROJECT
+#error NitroImageThumbHashOnLoad.cpp is not being built with the autogenerated CMakeLists.txt project. Is a different CMakeLists.txt building this?
+#endif
+
+#include "NitroImageThumbHashOnLoad.hpp"
+
+#include
+#include
+#include
+
+#include "JHybridThumbHashFactorySpec.hpp"
+#include
+
+namespace margelo::nitro::image::thumbhash {
+
+int initialize(JavaVM* vm) {
+ return facebook::jni::initialize(vm, []() {
+ ::margelo::nitro::image::thumbhash::registerAllNatives();
+ });
+}
+
+struct JHybridThumbHashFactorySpecImpl: public jni::JavaClass {
+ static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/image/thumbhash/HybridThumbHashFactory;";
+ static std::shared_ptr create() {
+ static const auto constructorFn = javaClassStatic()->getConstructor();
+ jni::local_ref javaPart = javaClassStatic()->newObject(constructorFn);
+ return javaPart->getJHybridThumbHashFactorySpec();
+ }
+};
+
+void registerAllNatives() {
+ using namespace margelo::nitro;
+ using namespace margelo::nitro::image::thumbhash;
+
+ // Register native JNI methods
+ margelo::nitro::image::thumbhash::JHybridThumbHashFactorySpec::CxxPart::registerNatives();
+
+ // Register Nitro Hybrid Objects
+ HybridObjectRegistry::registerHybridObjectConstructor(
+ "ThumbHashFactory",
+ []() -> std::shared_ptr {
+ return JHybridThumbHashFactorySpecImpl::create();
+ }
+ );
+}
+
+} // namespace margelo::nitro::image::thumbhash
diff --git a/packages/react-native-nitro-image-thumbhash/nitrogen/generated/android/NitroImageThumbHashOnLoad.hpp b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/android/NitroImageThumbHashOnLoad.hpp
new file mode 100644
index 00000000..2e4d5a1d
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/android/NitroImageThumbHashOnLoad.hpp
@@ -0,0 +1,34 @@
+///
+/// NitroImageThumbHashOnLoad.hpp
+/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
+/// https://github.com/mrousavy/nitro
+/// Copyright © Marc Rousavy @ Margelo
+///
+
+#include
+#include
+#include
+
+namespace margelo::nitro::image::thumbhash {
+
+ [[deprecated("Use registerNatives() instead.")]]
+ int initialize(JavaVM* vm);
+
+ /**
+ * Register the native (C++) part of NitroImageThumbHash, and autolinks all Hybrid Objects.
+ * Call this in your `JNI_OnLoad` function (probably inside `cpp-adapter.cpp`),
+ * inside a `facebook::jni::initialize(vm, ...)` call.
+ * Example:
+ * ```cpp (cpp-adapter.cpp)
+ * JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void*) {
+ * return facebook::jni::initialize(vm, []() {
+ * // register all NitroImageThumbHash HybridObjects
+ * margelo::nitro::image::thumbhash::registerNatives();
+ * // any other custom registrations go here.
+ * });
+ * }
+ * ```
+ */
+ void registerAllNatives();
+
+} // namespace margelo::nitro::image::thumbhash
diff --git a/packages/react-native-nitro-image-thumbhash/nitrogen/generated/android/c++/JHybridThumbHashFactorySpec.cpp b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/android/c++/JHybridThumbHashFactorySpec.cpp
new file mode 100644
index 00000000..4bad999c
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/android/c++/JHybridThumbHashFactorySpec.cpp
@@ -0,0 +1,108 @@
+///
+/// JHybridThumbHashFactorySpec.cpp
+/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
+/// https://github.com/mrousavy/nitro
+/// Copyright © Marc Rousavy @ Margelo
+///
+
+#include "JHybridThumbHashFactorySpec.hpp"
+
+// Forward declaration of `HybridImageSpec` to properly resolve imports.
+namespace margelo::nitro::image { class HybridImageSpec; }
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+namespace margelo::nitro::image::thumbhash {
+
+ std::shared_ptr JHybridThumbHashFactorySpec::JavaPart::getJHybridThumbHashFactorySpec() {
+ auto hybridObject = JHybridObject::JavaPart::getJHybridObject();
+ auto castHybridObject = std::dynamic_pointer_cast(hybridObject);
+ if (castHybridObject == nullptr) [[unlikely]] {
+ throw std::runtime_error("Failed to downcast JHybridObject to JHybridThumbHashFactorySpec!");
+ }
+ return castHybridObject;
+ }
+
+ jni::local_ref JHybridThumbHashFactorySpec::CxxPart::initHybrid(jni::alias_ref jThis) {
+ return makeCxxInstance(jThis);
+ }
+
+ std::shared_ptr JHybridThumbHashFactorySpec::CxxPart::createHybridObject(const jni::local_ref& javaPart) {
+ auto castJavaPart = jni::dynamic_ref_cast(javaPart);
+ if (castJavaPart == nullptr) [[unlikely]] {
+ throw std::runtime_error("Failed to cast JHybridObject::JavaPart to JHybridThumbHashFactorySpec::JavaPart!");
+ }
+ return std::make_shared(castJavaPart);
+ }
+
+ void JHybridThumbHashFactorySpec::CxxPart::registerNatives() {
+ registerHybrid({
+ makeNativeMethod("initHybrid", JHybridThumbHashFactorySpec::CxxPart::initHybrid),
+ });
+ }
+
+ // Properties
+
+
+ // Methods
+ std::shared_ptr JHybridThumbHashFactorySpec::encode(const std::shared_ptr& image) {
+ static const auto method = _javaPart->javaClassStatic()->getMethod(jni::alias_ref /* image */)>("encode");
+ auto __result = method(_javaPart, std::dynamic_pointer_cast(image)->getJavaPart());
+ return __result->cthis()->getArrayBuffer();
+ }
+ std::shared_ptr>> JHybridThumbHashFactorySpec::encodeAsync(const std::shared_ptr& image) {
+ static const auto method = _javaPart->javaClassStatic()->getMethod(jni::alias_ref /* image */)>("encodeAsync");
+ auto __result = method(_javaPart, std::dynamic_pointer_cast(image)->getJavaPart());
+ return [&]() {
+ auto __promise = Promise>::create();
+ __result->cthis()->addOnResolvedListener([=](const jni::alias_ref& __boxedResult) {
+ auto __result = jni::static_ref_cast(__boxedResult);
+ __promise->resolve(__result->cthis()->getArrayBuffer());
+ });
+ __result->cthis()->addOnRejectedListener([=](const jni::alias_ref& __throwable) {
+ jni::JniException __jniError(__throwable);
+ __promise->reject(std::make_exception_ptr(__jniError));
+ });
+ return __promise;
+ }();
+ }
+ std::shared_ptr JHybridThumbHashFactorySpec::decode(const std::shared_ptr& thumbhash) {
+ static const auto method = _javaPart->javaClassStatic()->getMethod(jni::alias_ref /* thumbhash */)>("decode");
+ auto __result = method(_javaPart, JArrayBuffer::wrap(thumbhash));
+ return __result->getJHybridImageSpec();
+ }
+ std::shared_ptr>> JHybridThumbHashFactorySpec::decodeAsync(const std::shared_ptr& thumbhash) {
+ static const auto method = _javaPart->javaClassStatic()->getMethod(jni::alias_ref /* thumbhash */)>("decodeAsync");
+ auto __result = method(_javaPart, JArrayBuffer::wrap(thumbhash));
+ return [&]() {
+ auto __promise = Promise>::create();
+ __result->cthis()->addOnResolvedListener([=](const jni::alias_ref& __boxedResult) {
+ auto __result = jni::static_ref_cast(__boxedResult);
+ __promise->resolve(__result->getJHybridImageSpec());
+ });
+ __result->cthis()->addOnRejectedListener([=](const jni::alias_ref& __throwable) {
+ jni::JniException __jniError(__throwable);
+ __promise->reject(std::make_exception_ptr(__jniError));
+ });
+ return __promise;
+ }();
+ }
+ std::string JHybridThumbHashFactorySpec::toBase64String(const std::shared_ptr& thumbhash) {
+ static const auto method = _javaPart->javaClassStatic()->getMethod(jni::alias_ref /* thumbhash */)>("toBase64String");
+ auto __result = method(_javaPart, JArrayBuffer::wrap(thumbhash));
+ return __result->toStdString();
+ }
+ std::shared_ptr JHybridThumbHashFactorySpec::fromBase64String(const std::string& thumbhashBase64) {
+ static const auto method = _javaPart->javaClassStatic()->getMethod(jni::alias_ref /* thumbhashBase64 */)>("fromBase64String");
+ auto __result = method(_javaPart, jni::make_jstring(thumbhashBase64));
+ return __result->cthis()->getArrayBuffer();
+ }
+
+} // namespace margelo::nitro::image::thumbhash
diff --git a/packages/react-native-nitro-image-thumbhash/nitrogen/generated/android/c++/JHybridThumbHashFactorySpec.hpp b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/android/c++/JHybridThumbHashFactorySpec.hpp
new file mode 100644
index 00000000..be26db72
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/android/c++/JHybridThumbHashFactorySpec.hpp
@@ -0,0 +1,68 @@
+///
+/// HybridThumbHashFactorySpec.hpp
+/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
+/// https://github.com/mrousavy/nitro
+/// Copyright © Marc Rousavy @ Margelo
+///
+
+#pragma once
+
+#include
+#include
+#include "HybridThumbHashFactorySpec.hpp"
+
+
+
+
+namespace margelo::nitro::image::thumbhash {
+
+ using namespace facebook;
+
+ class JHybridThumbHashFactorySpec: public virtual HybridThumbHashFactorySpec, public virtual JHybridObject {
+ public:
+ struct JavaPart: public jni::JavaClass {
+ static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/image/thumbhash/HybridThumbHashFactorySpec;";
+ std::shared_ptr getJHybridThumbHashFactorySpec();
+ };
+ struct CxxPart: public jni::HybridClass {
+ static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/image/thumbhash/HybridThumbHashFactorySpec$CxxPart;";
+ static jni::local_ref initHybrid(jni::alias_ref jThis);
+ static void registerNatives();
+ using HybridBase::HybridBase;
+ protected:
+ std::shared_ptr createHybridObject(const jni::local_ref& javaPart) override;
+ };
+
+ public:
+ explicit JHybridThumbHashFactorySpec(const jni::local_ref& javaPart):
+ HybridObject(HybridThumbHashFactorySpec::TAG),
+ JHybridObject(javaPart),
+ _javaPart(jni::make_global(javaPart)) {}
+ ~JHybridThumbHashFactorySpec() override {
+ // Hermes GC can destroy JS objects on a non-JNI Thread.
+ jni::ThreadScope::WithClassLoader([&] { _javaPart.reset(); });
+ }
+
+ public:
+ inline const jni::global_ref& getJavaPart() const noexcept {
+ return _javaPart;
+ }
+
+ public:
+ // Properties
+
+
+ public:
+ // Methods
+ std::shared_ptr encode(const std::shared_ptr& image) override;
+ std::shared_ptr>> encodeAsync(const std::shared_ptr& image) override;
+ std::shared_ptr decode(const std::shared_ptr& thumbhash) override;
+ std::shared_ptr>> decodeAsync(const std::shared_ptr& thumbhash) override;
+ std::string toBase64String(const std::shared_ptr& thumbhash) override;
+ std::shared_ptr fromBase64String(const std::string& thumbhashBase64) override;
+
+ private:
+ jni::global_ref _javaPart;
+ };
+
+} // namespace margelo::nitro::image::thumbhash
diff --git a/packages/react-native-nitro-image-thumbhash/nitrogen/generated/android/kotlin/com/margelo/nitro/image/thumbhash/HybridThumbHashFactorySpec.kt b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/android/kotlin/com/margelo/nitro/image/thumbhash/HybridThumbHashFactorySpec.kt
new file mode 100644
index 00000000..2b6ddd18
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/android/kotlin/com/margelo/nitro/image/thumbhash/HybridThumbHashFactorySpec.kt
@@ -0,0 +1,77 @@
+///
+/// HybridThumbHashFactorySpec.kt
+/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
+/// https://github.com/mrousavy/nitro
+/// Copyright © Marc Rousavy @ Margelo
+///
+
+package com.margelo.nitro.image.thumbhash
+
+import androidx.annotation.Keep
+import com.facebook.jni.HybridData
+import com.facebook.proguard.annotations.DoNotStrip
+import com.margelo.nitro.core.ArrayBuffer
+import com.margelo.nitro.image.HybridImageSpec
+import com.margelo.nitro.core.Promise
+import com.margelo.nitro.core.HybridObject
+
+/**
+ * A Kotlin class representing the ThumbHashFactory HybridObject.
+ * Implement this abstract class to create Kotlin-based instances of ThumbHashFactory.
+ */
+@DoNotStrip
+@Keep
+@Suppress(
+ "KotlinJniMissingFunction", "unused",
+ "RedundantSuppression", "RedundantUnitReturnType", "SimpleRedundantLet",
+ "LocalVariableName", "PropertyName", "PrivatePropertyName", "FunctionName"
+)
+abstract class HybridThumbHashFactorySpec: HybridObject() {
+ // Properties
+
+
+ // Methods
+ @DoNotStrip
+ @Keep
+ abstract fun encode(image: com.margelo.nitro.image.HybridImageSpec): ArrayBuffer
+
+ @DoNotStrip
+ @Keep
+ abstract fun encodeAsync(image: com.margelo.nitro.image.HybridImageSpec): Promise
+
+ @DoNotStrip
+ @Keep
+ abstract fun decode(thumbhash: ArrayBuffer): com.margelo.nitro.image.HybridImageSpec
+
+ @DoNotStrip
+ @Keep
+ abstract fun decodeAsync(thumbhash: ArrayBuffer): Promise
+
+ @DoNotStrip
+ @Keep
+ abstract fun toBase64String(thumbhash: ArrayBuffer): String
+
+ @DoNotStrip
+ @Keep
+ abstract fun fromBase64String(thumbhashBase64: String): ArrayBuffer
+
+ // Default implementation of `HybridObject.toString()`
+ override fun toString(): String {
+ return "[HybridObject ThumbHashFactory]"
+ }
+
+ // C++ backing class
+ @DoNotStrip
+ @Keep
+ protected open class CxxPart(javaPart: HybridThumbHashFactorySpec): HybridObject.CxxPart(javaPart) {
+ // C++ JHybridThumbHashFactorySpec::CxxPart::initHybrid(...)
+ external override fun initHybrid(): HybridData
+ }
+ override fun createCxxPart(): CxxPart {
+ return CxxPart(this)
+ }
+
+ companion object {
+ protected const val TAG = "HybridThumbHashFactorySpec"
+ }
+}
diff --git a/packages/react-native-nitro-image-thumbhash/nitrogen/generated/android/kotlin/com/margelo/nitro/image/thumbhash/NitroImageThumbHashOnLoad.kt b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/android/kotlin/com/margelo/nitro/image/thumbhash/NitroImageThumbHashOnLoad.kt
new file mode 100644
index 00000000..a60876d8
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/android/kotlin/com/margelo/nitro/image/thumbhash/NitroImageThumbHashOnLoad.kt
@@ -0,0 +1,35 @@
+///
+/// NitroImageThumbHashOnLoad.kt
+/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
+/// https://github.com/mrousavy/nitro
+/// Copyright © Marc Rousavy @ Margelo
+///
+
+package com.margelo.nitro.image.thumbhash
+
+import android.util.Log
+
+internal class NitroImageThumbHashOnLoad {
+ companion object {
+ private const val TAG = "NitroImageThumbHashOnLoad"
+ private var didLoad = false
+ /**
+ * Initializes the native part of "NitroImageThumbHash".
+ * This method is idempotent and can be called more than once.
+ */
+ @JvmStatic
+ fun initializeNative() {
+ if (didLoad) return
+ try {
+ Log.i(TAG, "Loading NitroImageThumbHash C++ library...")
+ System.loadLibrary("NitroImageThumbHash")
+ Log.i(TAG, "Successfully loaded NitroImageThumbHash C++ library!")
+ didLoad = true
+ } catch (e: Error) {
+ Log.e(TAG, "Failed to load NitroImageThumbHash C++ library! Is it properly installed and linked? " +
+ "Is the name correct? (see `CMakeLists.txt`, at `add_library(...)`)", e)
+ throw e
+ }
+ }
+ }
+}
diff --git a/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/NitroImageThumbHash+autolinking.rb b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/NitroImageThumbHash+autolinking.rb
new file mode 100644
index 00000000..09b28685
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/NitroImageThumbHash+autolinking.rb
@@ -0,0 +1,62 @@
+#
+# NitroImageThumbHash+autolinking.rb
+# This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
+# https://github.com/mrousavy/nitro
+# Copyright © Marc Rousavy @ Margelo
+#
+
+# This is a Ruby script that adds all files generated by Nitrogen
+# to the given podspec.
+#
+# To use it, add this to your .podspec:
+# ```ruby
+# Pod::Spec.new do |spec|
+# # ...
+#
+# # Add all files generated by Nitrogen
+# load 'nitrogen/generated/ios/NitroImageThumbHash+autolinking.rb'
+# add_nitrogen_files(spec)
+# end
+# ```
+
+def add_nitrogen_files(spec)
+ Pod::UI.puts "[NitroModules] 🔥 NitroImageThumbHash is boosted by nitro!"
+
+ spec.dependency "NitroModules"
+
+ current_source_files = Array(spec.attributes_hash['source_files'])
+ spec.source_files = current_source_files + [
+ # Generated cross-platform specs
+ "nitrogen/generated/shared/**/*.{h,hpp,c,cpp,swift}",
+ # Generated bridges for the cross-platform specs
+ "nitrogen/generated/ios/**/*.{h,hpp,c,cpp,mm,swift}",
+ ]
+
+ current_public_header_files = Array(spec.attributes_hash['public_header_files'])
+ spec.public_header_files = current_public_header_files + [
+ # Generated specs
+ "nitrogen/generated/shared/**/*.{h,hpp}",
+ # Swift to C++ bridging helpers
+ "nitrogen/generated/ios/NitroImageThumbHash-Swift-Cxx-Bridge.hpp"
+ ]
+
+ current_private_header_files = Array(spec.attributes_hash['private_header_files'])
+ spec.private_header_files = current_private_header_files + [
+ # iOS specific specs
+ "nitrogen/generated/ios/c++/**/*.{h,hpp}",
+ # Views are framework-specific and should be private
+ "nitrogen/generated/shared/**/views/**/*"
+ ]
+
+ current_pod_target_xcconfig = spec.attributes_hash['pod_target_xcconfig'] || {}
+ spec.pod_target_xcconfig = current_pod_target_xcconfig.merge({
+ # Use C++ 20
+ "CLANG_CXX_LANGUAGE_STANDARD" => "c++20",
+ # Enables C++ <-> Swift interop (by default it's only ObjC)
+ "SWIFT_OBJC_INTEROP_MODE" => "objcxx",
+ # Enables stricter modular headers
+ "DEFINES_MODULE" => "YES",
+ # Disable auto-generated ObjC header for Swift (Static linkage on Xcode 26.4 breaks here)
+ "SWIFT_INSTALL_OBJC_HEADER" => "NO",
+ })
+end
diff --git a/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/NitroImageThumbHash-Swift-Cxx-Bridge.cpp b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/NitroImageThumbHash-Swift-Cxx-Bridge.cpp
new file mode 100644
index 00000000..d5335470
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/NitroImageThumbHash-Swift-Cxx-Bridge.cpp
@@ -0,0 +1,68 @@
+///
+/// NitroImageThumbHash-Swift-Cxx-Bridge.cpp
+/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
+/// https://github.com/mrousavy/nitro
+/// Copyright © Marc Rousavy @ Margelo
+///
+
+#include "NitroImageThumbHash-Swift-Cxx-Bridge.hpp"
+
+// Include C++ implementation defined types
+#include "HybridThumbHashFactorySpecSwift.hpp"
+#include "NitroImageThumbHash-Swift-Cxx-Umbrella.hpp"
+#include
+#include
+
+namespace margelo::nitro::image::thumbhash::bridge::swift {
+
+ // pragma MARK: std::shared_ptr
+ std::shared_ptr create_std__shared_ptr_margelo__nitro__image__HybridImageSpec_(void* NON_NULL swiftUnsafePointer) noexcept {
+ // Implemented in NitroImage
+ return margelo::nitro::image::bridge::swift::create_std__shared_ptr_HybridImageSpec_(swiftUnsafePointer);
+ }
+ void* NON_NULL get_std__shared_ptr_margelo__nitro__image__HybridImageSpec_(std__shared_ptr_margelo__nitro__image__HybridImageSpec_ cppType) {
+ // Implemented in NitroImage
+ return margelo::nitro::image::bridge::swift::get_std__shared_ptr_HybridImageSpec_(cppType);
+ }
+
+ // pragma MARK: std::function& /* result */)>
+ Func_void_std__shared_ptr_ArrayBuffer_ create_Func_void_std__shared_ptr_ArrayBuffer_(void* NON_NULL swiftClosureWrapper) noexcept {
+ auto swiftClosure = NitroImageThumbHash::Func_void_std__shared_ptr_ArrayBuffer_::fromUnsafe(swiftClosureWrapper);
+ return [swiftClosure = std::move(swiftClosure)](const std::shared_ptr& result) mutable -> void {
+ swiftClosure.call(ArrayBufferHolder(result));
+ };
+ }
+
+ // pragma MARK: std::function
+ Func_void_std__exception_ptr create_Func_void_std__exception_ptr(void* NON_NULL swiftClosureWrapper) noexcept {
+ auto swiftClosure = NitroImageThumbHash::Func_void_std__exception_ptr::fromUnsafe(swiftClosureWrapper);
+ return [swiftClosure = std::move(swiftClosure)](const std::exception_ptr& error) mutable -> void {
+ swiftClosure.call(error);
+ };
+ }
+
+ // pragma MARK: std::function& /* result */)>
+ Func_void_std__shared_ptr_margelo__nitro__image__HybridImageSpec_ create_Func_void_std__shared_ptr_margelo__nitro__image__HybridImageSpec_(void* NON_NULL swiftClosureWrapper) noexcept {
+ auto swiftClosure = NitroImageThumbHash::Func_void_std__shared_ptr_margelo__nitro__image__HybridImageSpec_::fromUnsafe(swiftClosureWrapper);
+ return [swiftClosure = std::move(swiftClosure)](const std::shared_ptr& result) mutable -> void {
+ swiftClosure.call(result);
+ };
+ }
+
+ // pragma MARK: std::shared_ptr
+ std::shared_ptr create_std__shared_ptr_HybridThumbHashFactorySpec_(void* NON_NULL swiftUnsafePointer) noexcept {
+ NitroImageThumbHash::HybridThumbHashFactorySpec_cxx swiftPart = NitroImageThumbHash::HybridThumbHashFactorySpec_cxx::fromUnsafe(swiftUnsafePointer);
+ return std::make_shared(swiftPart);
+ }
+ void* NON_NULL get_std__shared_ptr_HybridThumbHashFactorySpec_(std__shared_ptr_HybridThumbHashFactorySpec_ cppType) {
+ std::shared_ptr swiftWrapper = std::dynamic_pointer_cast(cppType);
+ #ifdef NITRO_DEBUG
+ if (swiftWrapper == nullptr) [[unlikely]] {
+ throw std::runtime_error("Class \"HybridThumbHashFactorySpec\" is not implemented in Swift!");
+ }
+ #endif
+ NitroImageThumbHash::HybridThumbHashFactorySpec_cxx& swiftPart = swiftWrapper->getSwiftPart();
+ return swiftPart.toUnsafe();
+ }
+
+} // namespace margelo::nitro::image::thumbhash::bridge::swift
diff --git a/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/NitroImageThumbHash-Swift-Cxx-Bridge.hpp b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/NitroImageThumbHash-Swift-Cxx-Bridge.hpp
new file mode 100644
index 00000000..4117a0b8
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/NitroImageThumbHash-Swift-Cxx-Bridge.hpp
@@ -0,0 +1,202 @@
+///
+/// NitroImageThumbHash-Swift-Cxx-Bridge.hpp
+/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
+/// https://github.com/mrousavy/nitro
+/// Copyright © Marc Rousavy @ Margelo
+///
+
+#pragma once
+
+// Forward declarations of C++ defined types
+// Forward declaration of `ArrayBufferHolder` to properly resolve imports.
+namespace NitroModules { class ArrayBufferHolder; }
+// Forward declaration of `HybridImageSpec` to properly resolve imports.
+namespace margelo::nitro::image { class HybridImageSpec; }
+// Forward declaration of `HybridThumbHashFactorySpec` to properly resolve imports.
+namespace margelo::nitro::image::thumbhash { class HybridThumbHashFactorySpec; }
+
+// Forward declarations of Swift defined types
+// Forward declaration of `HybridImageSpec_cxx` to properly resolve imports.
+namespace NitroImage { class HybridImageSpec_cxx; }
+// Forward declaration of `HybridThumbHashFactorySpec_cxx` to properly resolve imports.
+namespace NitroImageThumbHash { class HybridThumbHashFactorySpec_cxx; }
+
+// Include C++ defined types
+#include "HybridThumbHashFactorySpec.hpp"
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+/**
+ * Contains specialized versions of C++ templated types so they can be accessed from Swift,
+ * as well as helper functions to interact with those C++ types from Swift.
+ */
+namespace margelo::nitro::image::thumbhash::bridge::swift {
+
+ // pragma MARK: std::shared_ptr
+ /**
+ * Specialized version of `std::shared_ptr`.
+ */
+ using std__shared_ptr_margelo__nitro__image__HybridImageSpec_ = std::shared_ptr;
+ std::shared_ptr create_std__shared_ptr_margelo__nitro__image__HybridImageSpec_(void* NON_NULL swiftUnsafePointer) noexcept;
+ void* NON_NULL get_std__shared_ptr_margelo__nitro__image__HybridImageSpec_(std__shared_ptr_margelo__nitro__image__HybridImageSpec_ cppType);
+
+ // pragma MARK: std::weak_ptr
+ using std__weak_ptr_margelo__nitro__image__HybridImageSpec_ = std::weak_ptr;
+ inline std__weak_ptr_margelo__nitro__image__HybridImageSpec_ weakify_std__shared_ptr_margelo__nitro__image__HybridImageSpec_(const std::shared_ptr& strong) noexcept { return strong; }
+
+ // pragma MARK: std::shared_ptr>>
+ /**
+ * Specialized version of `std::shared_ptr>>`.
+ */
+ using std__shared_ptr_Promise_std__shared_ptr_ArrayBuffer___ = std::shared_ptr>>;
+ inline std::shared_ptr>> create_std__shared_ptr_Promise_std__shared_ptr_ArrayBuffer___() noexcept {
+ return Promise>::create();
+ }
+ inline PromiseHolder> wrap_std__shared_ptr_Promise_std__shared_ptr_ArrayBuffer___(std::shared_ptr>> promise) noexcept {
+ return PromiseHolder>(std::move(promise));
+ }
+
+ // pragma MARK: std::function& /* result */)>
+ /**
+ * Specialized version of `std::function&)>`.
+ */
+ using Func_void_std__shared_ptr_ArrayBuffer_ = std::function& /* result */)>;
+ /**
+ * Wrapper class for a `std::function& / * result * /)>`, this can be used from Swift.
+ */
+ class Func_void_std__shared_ptr_ArrayBuffer__Wrapper final {
+ public:
+ explicit Func_void_std__shared_ptr_ArrayBuffer__Wrapper(std::function& /* result */)>&& func): _function(std::make_unique& /* result */)>>(std::move(func))) {}
+ inline void call(ArrayBufferHolder result) const noexcept {
+ _function->operator()(result.getArrayBuffer());
+ }
+ private:
+ std::unique_ptr& /* result */)>> _function;
+ } SWIFT_NONCOPYABLE;
+ Func_void_std__shared_ptr_ArrayBuffer_ create_Func_void_std__shared_ptr_ArrayBuffer_(void* NON_NULL swiftClosureWrapper) noexcept;
+ inline Func_void_std__shared_ptr_ArrayBuffer__Wrapper wrap_Func_void_std__shared_ptr_ArrayBuffer_(Func_void_std__shared_ptr_ArrayBuffer_ value) noexcept {
+ return Func_void_std__shared_ptr_ArrayBuffer__Wrapper(std::move(value));
+ }
+
+ // pragma MARK: std::function
+ /**
+ * Specialized version of `std::function`.
+ */
+ using Func_void_std__exception_ptr = std::function;
+ /**
+ * Wrapper class for a `std::function`, this can be used from Swift.
+ */
+ class Func_void_std__exception_ptr_Wrapper final {
+ public:
+ explicit Func_void_std__exception_ptr_Wrapper(std::function&& func): _function(std::make_unique>(std::move(func))) {}
+ inline void call(std::exception_ptr error) const noexcept {
+ _function->operator()(error);
+ }
+ private:
+ std::unique_ptr> _function;
+ } SWIFT_NONCOPYABLE;
+ Func_void_std__exception_ptr create_Func_void_std__exception_ptr(void* NON_NULL swiftClosureWrapper) noexcept;
+ inline Func_void_std__exception_ptr_Wrapper wrap_Func_void_std__exception_ptr(Func_void_std__exception_ptr value) noexcept {
+ return Func_void_std__exception_ptr_Wrapper(std::move(value));
+ }
+
+ // pragma MARK: std::shared_ptr>>
+ /**
+ * Specialized version of `std::shared_ptr>>`.
+ */
+ using std__shared_ptr_Promise_std__shared_ptr_margelo__nitro__image__HybridImageSpec___ = std::shared_ptr>>;
+ inline std::shared_ptr>> create_std__shared_ptr_Promise_std__shared_ptr_margelo__nitro__image__HybridImageSpec___() noexcept {
+ return Promise>::create();
+ }
+ inline PromiseHolder> wrap_std__shared_ptr_Promise_std__shared_ptr_margelo__nitro__image__HybridImageSpec___(std::shared_ptr>> promise) noexcept {
+ return PromiseHolder>(std::move(promise));
+ }
+
+ // pragma MARK: std::function& /* result */)>
+ /**
+ * Specialized version of `std::function&)>`.
+ */
+ using Func_void_std__shared_ptr_margelo__nitro__image__HybridImageSpec_ = std::function& /* result */)>;
+ /**
+ * Wrapper class for a `std::function& / * result * /)>`, this can be used from Swift.
+ */
+ class Func_void_std__shared_ptr_margelo__nitro__image__HybridImageSpec__Wrapper final {
+ public:
+ explicit Func_void_std__shared_ptr_margelo__nitro__image__HybridImageSpec__Wrapper(std::function& /* result */)>&& func): _function(std::make_unique& /* result */)>>(std::move(func))) {}
+ inline void call(std::shared_ptr result) const noexcept {
+ _function->operator()(result);
+ }
+ private:
+ std::unique_ptr& /* result */)>> _function;
+ } SWIFT_NONCOPYABLE;
+ Func_void_std__shared_ptr_margelo__nitro__image__HybridImageSpec_ create_Func_void_std__shared_ptr_margelo__nitro__image__HybridImageSpec_(void* NON_NULL swiftClosureWrapper) noexcept;
+ inline Func_void_std__shared_ptr_margelo__nitro__image__HybridImageSpec__Wrapper wrap_Func_void_std__shared_ptr_margelo__nitro__image__HybridImageSpec_(Func_void_std__shared_ptr_margelo__nitro__image__HybridImageSpec_ value) noexcept {
+ return Func_void_std__shared_ptr_margelo__nitro__image__HybridImageSpec__Wrapper(std::move(value));
+ }
+
+ // pragma MARK: std::shared_ptr
+ /**
+ * Specialized version of `std::shared_ptr`.
+ */
+ using std__shared_ptr_HybridThumbHashFactorySpec_ = std::shared_ptr;
+ std::shared_ptr create_std__shared_ptr_HybridThumbHashFactorySpec_(void* NON_NULL swiftUnsafePointer) noexcept;
+ void* NON_NULL get_std__shared_ptr_HybridThumbHashFactorySpec_(std__shared_ptr_HybridThumbHashFactorySpec_ cppType);
+
+ // pragma MARK: std::weak_ptr
+ using std__weak_ptr_HybridThumbHashFactorySpec_ = std::weak_ptr;
+ inline std__weak_ptr_HybridThumbHashFactorySpec_ weakify_std__shared_ptr_HybridThumbHashFactorySpec_(const std::shared_ptr& strong) noexcept { return strong; }
+
+ // pragma MARK: Result>
+ using Result_std__shared_ptr_ArrayBuffer__ = Result>;
+ inline Result_std__shared_ptr_ArrayBuffer__ create_Result_std__shared_ptr_ArrayBuffer__(const std::shared_ptr& value) noexcept {
+ return Result>::withValue(value);
+ }
+ inline Result_std__shared_ptr_ArrayBuffer__ create_Result_std__shared_ptr_ArrayBuffer__(const std::exception_ptr& error) noexcept {
+ return Result>::withError(error);
+ }
+
+ // pragma MARK: Result>>>
+ using Result_std__shared_ptr_Promise_std__shared_ptr_ArrayBuffer____ = Result>>>;
+ inline Result_std__shared_ptr_Promise_std__shared_ptr_ArrayBuffer____ create_Result_std__shared_ptr_Promise_std__shared_ptr_ArrayBuffer____(const std::shared_ptr>>& value) noexcept {
+ return Result>>>::withValue(value);
+ }
+ inline Result_std__shared_ptr_Promise_std__shared_ptr_ArrayBuffer____ create_Result_std__shared_ptr_Promise_std__shared_ptr_ArrayBuffer____(const std::exception_ptr& error) noexcept {
+ return Result>>>::withError(error);
+ }
+
+ // pragma MARK: Result>
+ using Result_std__shared_ptr_margelo__nitro__image__HybridImageSpec__ = Result>;
+ inline Result_std__shared_ptr_margelo__nitro__image__HybridImageSpec__ create_Result_std__shared_ptr_margelo__nitro__image__HybridImageSpec__(const std::shared_ptr& value) noexcept {
+ return Result>::withValue(value);
+ }
+ inline Result_std__shared_ptr_margelo__nitro__image__HybridImageSpec__ create_Result_std__shared_ptr_margelo__nitro__image__HybridImageSpec__(const std::exception_ptr& error) noexcept {
+ return Result>::withError(error);
+ }
+
+ // pragma MARK: Result>>>
+ using Result_std__shared_ptr_Promise_std__shared_ptr_margelo__nitro__image__HybridImageSpec____ = Result>>>;
+ inline Result_std__shared_ptr_Promise_std__shared_ptr_margelo__nitro__image__HybridImageSpec____ create_Result_std__shared_ptr_Promise_std__shared_ptr_margelo__nitro__image__HybridImageSpec____(const std::shared_ptr>>& value) noexcept {
+ return Result>>>::withValue(value);
+ }
+ inline Result_std__shared_ptr_Promise_std__shared_ptr_margelo__nitro__image__HybridImageSpec____ create_Result_std__shared_ptr_Promise_std__shared_ptr_margelo__nitro__image__HybridImageSpec____(const std::exception_ptr& error) noexcept {
+ return Result>>>::withError(error);
+ }
+
+ // pragma MARK: Result
+ using Result_std__string_ = Result;
+ inline Result_std__string_ create_Result_std__string_(const std::string& value) noexcept {
+ return Result::withValue(value);
+ }
+ inline Result_std__string_ create_Result_std__string_(const std::exception_ptr& error) noexcept {
+ return Result::withError(error);
+ }
+
+} // namespace margelo::nitro::image::thumbhash::bridge::swift
diff --git a/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/NitroImageThumbHash-Swift-Cxx-Umbrella.hpp b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/NitroImageThumbHash-Swift-Cxx-Umbrella.hpp
new file mode 100644
index 00000000..24fc6db3
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/NitroImageThumbHash-Swift-Cxx-Umbrella.hpp
@@ -0,0 +1,51 @@
+///
+/// NitroImageThumbHash-Swift-Cxx-Umbrella.hpp
+/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
+/// https://github.com/mrousavy/nitro
+/// Copyright © Marc Rousavy @ Margelo
+///
+
+#pragma once
+
+// Forward declarations of C++ defined types
+// Forward declaration of `HybridImageSpec` to properly resolve imports.
+namespace margelo::nitro::image { class HybridImageSpec; }
+// Forward declaration of `HybridThumbHashFactorySpec` to properly resolve imports.
+namespace margelo::nitro::image::thumbhash { class HybridThumbHashFactorySpec; }
+
+// Include C++ defined types
+#include "HybridThumbHashFactorySpec.hpp"
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+// C++ helpers for Swift
+#include "NitroImageThumbHash-Swift-Cxx-Bridge.hpp"
+
+// Common C++ types used in Swift
+#include
+#include
+#include
+#include
+
+// Forward declarations of Swift defined types
+// Forward declaration of `HybridImageSpec_cxx` to properly resolve imports.
+namespace NitroImage { class HybridImageSpec_cxx; }
+// Forward declaration of `HybridThumbHashFactorySpec_cxx` to properly resolve imports.
+namespace NitroImageThumbHash { class HybridThumbHashFactorySpec_cxx; }
+
+// Include Swift defined types
+#if __has_include("NitroImageThumbHash-Swift.h")
+// This header is generated by Xcode/Swift on every app build.
+// If it cannot be found, make sure the Swift module's name (= podspec name) is actually "NitroImageThumbHash".
+#include "NitroImageThumbHash-Swift.h"
+// Same as above, but used when building with frameworks (`use_frameworks`)
+#elif __has_include()
+#include
+#else
+#error NitroImageThumbHash's autogenerated Swift header cannot be found! Make sure the Swift module's name (= podspec name) is actually "NitroImageThumbHash", and try building the app first.
+#endif
diff --git a/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/NitroImageThumbHashAutolinking.mm b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/NitroImageThumbHashAutolinking.mm
new file mode 100644
index 00000000..80f596a5
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/NitroImageThumbHashAutolinking.mm
@@ -0,0 +1,33 @@
+///
+/// NitroImageThumbHashAutolinking.mm
+/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
+/// https://github.com/mrousavy/nitro
+/// Copyright © Marc Rousavy @ Margelo
+///
+
+#import
+#import
+#import "NitroImageThumbHash-Swift-Cxx-Umbrella.hpp"
+#import
+
+#include "HybridThumbHashFactorySpecSwift.hpp"
+
+@interface NitroImageThumbHashAutolinking : NSObject
+@end
+
+@implementation NitroImageThumbHashAutolinking
+
++ (void) load {
+ using namespace margelo::nitro;
+ using namespace margelo::nitro::image::thumbhash;
+
+ HybridObjectRegistry::registerHybridObjectConstructor(
+ "ThumbHashFactory",
+ []() -> std::shared_ptr {
+ std::shared_ptr hybridObject = NitroImageThumbHash::NitroImageThumbHashAutolinking::createThumbHashFactory();
+ return hybridObject;
+ }
+ );
+}
+
+@end
diff --git a/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/NitroImageThumbHashAutolinking.swift b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/NitroImageThumbHashAutolinking.swift
new file mode 100644
index 00000000..df504beb
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/NitroImageThumbHashAutolinking.swift
@@ -0,0 +1,26 @@
+///
+/// NitroImageThumbHashAutolinking.swift
+/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
+/// https://github.com/mrousavy/nitro
+/// Copyright © Marc Rousavy @ Margelo
+///
+
+import NitroModules
+
+// TODO: Use empty enums once Swift supports exporting them as namespaces
+// See: https://github.com/swiftlang/swift/pull/83616
+public final class NitroImageThumbHashAutolinking {
+ public typealias bridge = margelo.nitro.image.thumbhash.bridge.swift
+
+ public static func createThumbHashFactory() -> bridge.std__shared_ptr_HybridThumbHashFactorySpec_ {
+ let hybridObject = HybridThumbHashFactory()
+ return { () -> bridge.std__shared_ptr_HybridThumbHashFactorySpec_ in
+ let __cxxWrapped = hybridObject.getCxxWrapper()
+ return __cxxWrapped.getCxxPart()
+ }()
+ }
+
+ public static func isThumbHashFactoryRecyclable() -> Bool {
+ return HybridThumbHashFactory.self is any RecyclableView.Type
+ }
+}
diff --git a/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/c++/HybridThumbHashFactorySpecSwift.cpp b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/c++/HybridThumbHashFactorySpecSwift.cpp
new file mode 100644
index 00000000..2018deda
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/c++/HybridThumbHashFactorySpecSwift.cpp
@@ -0,0 +1,11 @@
+///
+/// HybridThumbHashFactorySpecSwift.cpp
+/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
+/// https://github.com/mrousavy/nitro
+/// Copyright © Marc Rousavy @ Margelo
+///
+
+#include "HybridThumbHashFactorySpecSwift.hpp"
+
+namespace margelo::nitro::image::thumbhash {
+} // namespace margelo::nitro::image::thumbhash
diff --git a/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/c++/HybridThumbHashFactorySpecSwift.hpp b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/c++/HybridThumbHashFactorySpecSwift.hpp
new file mode 100644
index 00000000..3b087eb3
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/c++/HybridThumbHashFactorySpecSwift.hpp
@@ -0,0 +1,130 @@
+///
+/// HybridThumbHashFactorySpecSwift.hpp
+/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
+/// https://github.com/mrousavy/nitro
+/// Copyright © Marc Rousavy @ Margelo
+///
+
+#pragma once
+
+#include "HybridThumbHashFactorySpec.hpp"
+
+// Forward declaration of `HybridThumbHashFactorySpec_cxx` to properly resolve imports.
+namespace NitroImageThumbHash { class HybridThumbHashFactorySpec_cxx; }
+
+// Forward declaration of `ArrayBufferHolder` to properly resolve imports.
+namespace NitroModules { class ArrayBufferHolder; }
+// Forward declaration of `HybridImageSpec` to properly resolve imports.
+namespace margelo::nitro::image { class HybridImageSpec; }
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "NitroImageThumbHash-Swift-Cxx-Umbrella.hpp"
+
+namespace margelo::nitro::image::thumbhash {
+
+ /**
+ * The C++ part of HybridThumbHashFactorySpec_cxx.swift.
+ *
+ * HybridThumbHashFactorySpecSwift (C++) accesses HybridThumbHashFactorySpec_cxx (Swift), and might
+ * contain some additional bridging code for C++ <> Swift interop.
+ *
+ * Since this obviously introduces an overhead, I hope at some point in
+ * the future, HybridThumbHashFactorySpec_cxx can directly inherit from the C++ class HybridThumbHashFactorySpec
+ * to simplify the whole structure and memory management.
+ */
+ class HybridThumbHashFactorySpecSwift: public virtual HybridThumbHashFactorySpec {
+ public:
+ // Constructor from a Swift instance
+ explicit HybridThumbHashFactorySpecSwift(const NitroImageThumbHash::HybridThumbHashFactorySpec_cxx& swiftPart):
+ HybridObject(HybridThumbHashFactorySpec::TAG),
+ _swiftPart(swiftPart) { }
+
+ public:
+ // Get the Swift part
+ inline NitroImageThumbHash::HybridThumbHashFactorySpec_cxx& getSwiftPart() noexcept {
+ return _swiftPart;
+ }
+
+ public:
+ inline size_t getExternalMemorySize() noexcept override {
+ return _swiftPart.getMemorySize();
+ }
+ bool equals(const std::shared_ptr& other) override {
+ if (auto otherCast = std::dynamic_pointer_cast(other)) {
+ return _swiftPart.equals(otherCast->_swiftPart);
+ }
+ return false;
+ }
+ void dispose() noexcept override {
+ _swiftPart.dispose();
+ }
+ std::string toString() override {
+ return _swiftPart.toString();
+ }
+
+ public:
+ // Properties
+
+
+ public:
+ // Methods
+ inline std::shared_ptr encode(const std::shared_ptr& image) override {
+ auto __result = _swiftPart.encode(image);
+ if (__result.hasError()) [[unlikely]] {
+ std::rethrow_exception(__result.error());
+ }
+ auto __value = std::move(__result.value());
+ return __value;
+ }
+ inline std::shared_ptr>> encodeAsync(const std::shared_ptr& image) override {
+ auto __result = _swiftPart.encodeAsync(image);
+ if (__result.hasError()) [[unlikely]] {
+ std::rethrow_exception(__result.error());
+ }
+ auto __value = std::move(__result.value());
+ return __value;
+ }
+ inline std::shared_ptr decode(const std::shared_ptr& thumbhash) override {
+ auto __result = _swiftPart.decode(ArrayBufferHolder(thumbhash));
+ if (__result.hasError()) [[unlikely]] {
+ std::rethrow_exception(__result.error());
+ }
+ auto __value = std::move(__result.value());
+ return __value;
+ }
+ inline std::shared_ptr>> decodeAsync(const std::shared_ptr& thumbhash) override {
+ auto __result = _swiftPart.decodeAsync(ArrayBufferHolder(thumbhash));
+ if (__result.hasError()) [[unlikely]] {
+ std::rethrow_exception(__result.error());
+ }
+ auto __value = std::move(__result.value());
+ return __value;
+ }
+ inline std::string toBase64String(const std::shared_ptr& thumbhash) override {
+ auto __result = _swiftPart.toBase64String(ArrayBufferHolder(thumbhash));
+ if (__result.hasError()) [[unlikely]] {
+ std::rethrow_exception(__result.error());
+ }
+ auto __value = std::move(__result.value());
+ return __value;
+ }
+ inline std::shared_ptr fromBase64String(const std::string& thumbhashBase64) override {
+ auto __result = _swiftPart.fromBase64String(thumbhashBase64);
+ if (__result.hasError()) [[unlikely]] {
+ std::rethrow_exception(__result.error());
+ }
+ auto __value = std::move(__result.value());
+ return __value;
+ }
+
+ private:
+ NitroImageThumbHash::HybridThumbHashFactorySpec_cxx _swiftPart;
+ };
+
+} // namespace margelo::nitro::image::thumbhash
diff --git a/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift
new file mode 100644
index 00000000..7b846815
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift
@@ -0,0 +1,46 @@
+///
+/// Func_void_std__exception_ptr.swift
+/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
+/// https://github.com/mrousavy/nitro
+/// Copyright © Marc Rousavy @ Margelo
+///
+
+import NitroModules
+
+/**
+ * Wraps a Swift `(_ error: Error) -> Void` as a class.
+ * This class can be used from C++, e.g. to wrap the Swift closure as a `std::function`.
+ */
+public final class Func_void_std__exception_ptr {
+ public typealias bridge = margelo.nitro.image.thumbhash.bridge.swift
+
+ private let closure: (_ error: Error) -> Void
+
+ public init(_ closure: @escaping (_ error: Error) -> Void) {
+ self.closure = closure
+ }
+
+ @inline(__always)
+ public func call(error: std.exception_ptr) -> Void {
+ self.closure(RuntimeError.from(cppError: error))
+ }
+
+ /**
+ * Casts this instance to a retained unsafe raw pointer.
+ * This acquires one additional strong reference on the object!
+ */
+ @inline(__always)
+ public func toUnsafe() -> UnsafeMutableRawPointer {
+ return Unmanaged.passRetained(self).toOpaque()
+ }
+
+ /**
+ * Casts an unsafe pointer to a `Func_void_std__exception_ptr`.
+ * The pointer has to be a retained opaque `Unmanaged`.
+ * This removes one strong reference from the object!
+ */
+ @inline(__always)
+ public static func fromUnsafe(_ pointer: UnsafeMutableRawPointer) -> Func_void_std__exception_ptr {
+ return Unmanaged.fromOpaque(pointer).takeRetainedValue()
+ }
+}
diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_ArrayBuffer_.swift b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_ArrayBuffer_.swift
similarity index 95%
rename from packages/react-native-nitro-image/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_ArrayBuffer_.swift
rename to packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_ArrayBuffer_.swift
index 5871d1b9..4c2fce99 100644
--- a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_ArrayBuffer_.swift
+++ b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_ArrayBuffer_.swift
@@ -12,7 +12,7 @@ import NitroModules
* This class can be used from C++, e.g. to wrap the Swift closure as a `std::function`.
*/
public final class Func_void_std__shared_ptr_ArrayBuffer_ {
- public typealias bridge = margelo.nitro.image.bridge.swift
+ public typealias bridge = margelo.nitro.image.thumbhash.bridge.swift
private let closure: (_ value: ArrayBuffer) -> Void
diff --git a/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_margelo__nitro__image__HybridImageSpec_.swift b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_margelo__nitro__image__HybridImageSpec_.swift
new file mode 100644
index 00000000..169fb531
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/swift/Func_void_std__shared_ptr_margelo__nitro__image__HybridImageSpec_.swift
@@ -0,0 +1,51 @@
+///
+/// Func_void_std__shared_ptr_margelo__nitro__image__HybridImageSpec_.swift
+/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
+/// https://github.com/mrousavy/nitro
+/// Copyright © Marc Rousavy @ Margelo
+///
+
+import NitroImage
+import NitroModules
+
+/**
+ * Wraps a Swift `(_ value: (any HybridImageSpec)) -> Void` as a class.
+ * This class can be used from C++, e.g. to wrap the Swift closure as a `std::function`.
+ */
+public final class Func_void_std__shared_ptr_margelo__nitro__image__HybridImageSpec_ {
+ public typealias bridge = margelo.nitro.image.thumbhash.bridge.swift
+
+ private let closure: (_ value: (any HybridImageSpec)) -> Void
+
+ public init(_ closure: @escaping (_ value: (any HybridImageSpec)) -> Void) {
+ self.closure = closure
+ }
+
+ @inline(__always)
+ public func call(value: bridge.std__shared_ptr_margelo__nitro__image__HybridImageSpec_) -> Void {
+ self.closure({ () -> any HybridImageSpec in
+ let __unsafePointer = bridge.get_std__shared_ptr_margelo__nitro__image__HybridImageSpec_(value)
+ let __instance = HybridImageSpec_cxx.fromUnsafe(__unsafePointer)
+ return __instance.getHybridImageSpec()
+ }())
+ }
+
+ /**
+ * Casts this instance to a retained unsafe raw pointer.
+ * This acquires one additional strong reference on the object!
+ */
+ @inline(__always)
+ public func toUnsafe() -> UnsafeMutableRawPointer {
+ return Unmanaged.passRetained(self).toOpaque()
+ }
+
+ /**
+ * Casts an unsafe pointer to a `Func_void_std__shared_ptr_margelo__nitro__image__HybridImageSpec_`.
+ * The pointer has to be a retained opaque `Unmanaged`.
+ * This removes one strong reference from the object!
+ */
+ @inline(__always)
+ public static func fromUnsafe(_ pointer: UnsafeMutableRawPointer) -> Func_void_std__shared_ptr_margelo__nitro__image__HybridImageSpec_ {
+ return Unmanaged.fromOpaque(pointer).takeRetainedValue()
+ }
+}
diff --git a/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/swift/HybridThumbHashFactorySpec.swift b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/swift/HybridThumbHashFactorySpec.swift
new file mode 100644
index 00000000..2e9d3c2a
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/swift/HybridThumbHashFactorySpec.swift
@@ -0,0 +1,61 @@
+///
+/// HybridThumbHashFactorySpec.swift
+/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
+/// https://github.com/mrousavy/nitro
+/// Copyright © Marc Rousavy @ Margelo
+///
+
+import NitroModules
+import NitroImage
+
+/// See ``HybridThumbHashFactorySpec``
+public protocol HybridThumbHashFactorySpec_protocol: HybridObject {
+ // Properties
+
+
+ // Methods
+ func encode(image: (any HybridImageSpec)) throws -> ArrayBuffer
+ func encodeAsync(image: (any HybridImageSpec)) throws -> Promise
+ func decode(thumbhash: ArrayBuffer) throws -> (any HybridImageSpec)
+ func decodeAsync(thumbhash: ArrayBuffer) throws -> Promise<(any HybridImageSpec)>
+ func toBase64String(thumbhash: ArrayBuffer) throws -> String
+ func fromBase64String(thumbhashBase64: String) throws -> ArrayBuffer
+}
+
+public extension HybridThumbHashFactorySpec_protocol {
+ /// Default implementation of ``HybridObject.toString``
+ func toString() -> String {
+ return "[HybridObject ThumbHashFactory]"
+ }
+}
+
+/// See ``HybridThumbHashFactorySpec``
+open class HybridThumbHashFactorySpec_base {
+ private weak var cxxWrapper: HybridThumbHashFactorySpec_cxx? = nil
+ public init() { }
+ public func getCxxWrapper() -> HybridThumbHashFactorySpec_cxx {
+ #if DEBUG
+ guard self is any HybridThumbHashFactorySpec else {
+ fatalError("`self` is not a `HybridThumbHashFactorySpec`! Did you accidentally inherit from `HybridThumbHashFactorySpec_base` instead of `HybridThumbHashFactorySpec`?")
+ }
+ #endif
+ if let cxxWrapper = self.cxxWrapper {
+ return cxxWrapper
+ } else {
+ let cxxWrapper = HybridThumbHashFactorySpec_cxx(self as! any HybridThumbHashFactorySpec)
+ self.cxxWrapper = cxxWrapper
+ return cxxWrapper
+ }
+ }
+}
+
+/**
+ * A Swift base-protocol representing the ThumbHashFactory HybridObject.
+ * Implement this protocol to create Swift-based instances of ThumbHashFactory.
+ * ```swift
+ * class HybridThumbHashFactory : HybridThumbHashFactorySpec {
+ * // ...
+ * }
+ * ```
+ */
+public typealias HybridThumbHashFactorySpec = HybridThumbHashFactorySpec_protocol & HybridThumbHashFactorySpec_base
diff --git a/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/swift/HybridThumbHashFactorySpec_cxx.swift b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/swift/HybridThumbHashFactorySpec_cxx.swift
new file mode 100644
index 00000000..883a4a85
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/ios/swift/HybridThumbHashFactorySpec_cxx.swift
@@ -0,0 +1,227 @@
+///
+/// HybridThumbHashFactorySpec_cxx.swift
+/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
+/// https://github.com/mrousavy/nitro
+/// Copyright © Marc Rousavy @ Margelo
+///
+
+import NitroModules
+import NitroImage
+
+/**
+ * A class implementation that bridges HybridThumbHashFactorySpec over to C++.
+ * In C++, we cannot use Swift protocols - so we need to wrap it in a class to make it strongly defined.
+ *
+ * Also, some Swift types need to be bridged with special handling:
+ * - Enums need to be wrapped in Structs, otherwise they cannot be accessed bi-directionally (Swift bug: https://github.com/swiftlang/swift/issues/75330)
+ * - Other HybridObjects need to be wrapped/unwrapped from the Swift TCxx wrapper
+ * - Throwing methods need to be wrapped with a Result type, as exceptions cannot be propagated to C++
+ */
+open class HybridThumbHashFactorySpec_cxx {
+ /**
+ * The Swift <> C++ bridge's namespace (`margelo::nitro::image::thumbhash::bridge::swift`)
+ * from `NitroImageThumbHash-Swift-Cxx-Bridge.hpp`.
+ * This contains specialized C++ templates, and C++ helper functions that can be accessed from Swift.
+ */
+ public typealias bridge = margelo.nitro.image.thumbhash.bridge.swift
+
+ /**
+ * Holds an instance of the `HybridThumbHashFactorySpec` Swift protocol.
+ */
+ private var __implementation: any HybridThumbHashFactorySpec
+
+ /**
+ * Holds a weak pointer to the C++ class that wraps the Swift class.
+ */
+ private var __cxxPart: bridge.std__weak_ptr_HybridThumbHashFactorySpec_
+
+ /**
+ * Create a new `HybridThumbHashFactorySpec_cxx` that wraps the given `HybridThumbHashFactorySpec`.
+ * All properties and methods bridge to C++ types.
+ */
+ public init(_ implementation: any HybridThumbHashFactorySpec) {
+ self.__implementation = implementation
+ self.__cxxPart = .init()
+ /* no base class */
+ }
+
+ /**
+ * Get the actual `HybridThumbHashFactorySpec` instance this class wraps.
+ */
+ @inline(__always)
+ public func getHybridThumbHashFactorySpec() -> any HybridThumbHashFactorySpec {
+ return __implementation
+ }
+
+ /**
+ * Casts this instance to a retained unsafe raw pointer.
+ * This acquires one additional strong reference on the object!
+ */
+ public func toUnsafe() -> UnsafeMutableRawPointer {
+ return Unmanaged.passRetained(self).toOpaque()
+ }
+
+ /**
+ * Casts an unsafe pointer to a `HybridThumbHashFactorySpec_cxx`.
+ * The pointer has to be a retained opaque `Unmanaged`.
+ * This removes one strong reference from the object!
+ */
+ public class func fromUnsafe(_ pointer: UnsafeMutableRawPointer) -> HybridThumbHashFactorySpec_cxx {
+ return Unmanaged.fromOpaque(pointer).takeRetainedValue()
+ }
+
+ /**
+ * Gets (or creates) the C++ part of this Hybrid Object.
+ * The C++ part is a `std::shared_ptr`.
+ */
+ public func getCxxPart() -> bridge.std__shared_ptr_HybridThumbHashFactorySpec_ {
+ let cachedCxxPart = self.__cxxPart.lock()
+ if Bool(fromCxx: cachedCxxPart) {
+ return cachedCxxPart
+ } else {
+ let newCxxPart = bridge.create_std__shared_ptr_HybridThumbHashFactorySpec_(self.toUnsafe())
+ __cxxPart = bridge.weakify_std__shared_ptr_HybridThumbHashFactorySpec_(newCxxPart)
+ return newCxxPart
+ }
+ }
+
+
+
+ /**
+ * Get the memory size of the Swift class (plus size of any other allocations)
+ * so the JS VM can properly track it and garbage-collect the JS object if needed.
+ */
+ @inline(__always)
+ public var memorySize: Int {
+ return MemoryHelper.getSizeOf(self.__implementation) + self.__implementation.memorySize
+ }
+
+ /**
+ * Compares this object with the given [other] object for reference equality.
+ */
+ @inline(__always)
+ public func equals(other: HybridThumbHashFactorySpec_cxx) -> Bool {
+ return self.__implementation === other.__implementation
+ }
+
+ /**
+ * Call dispose() on the Swift class.
+ * This _may_ be called manually from JS.
+ */
+ @inline(__always)
+ public func dispose() {
+ self.__implementation.dispose()
+ }
+
+ /**
+ * Call toString() on the Swift class.
+ */
+ @inline(__always)
+ public func toString() -> String {
+ return self.__implementation.toString()
+ }
+
+ // Properties
+
+
+ // Methods
+ @inline(__always)
+ public final func encode(image: bridge.std__shared_ptr_margelo__nitro__image__HybridImageSpec_) -> bridge.Result_std__shared_ptr_ArrayBuffer__ {
+ do {
+ let __result = try self.__implementation.encode(image: { () -> any HybridImageSpec in
+ let __unsafePointer = bridge.get_std__shared_ptr_margelo__nitro__image__HybridImageSpec_(image)
+ let __instance = HybridImageSpec_cxx.fromUnsafe(__unsafePointer)
+ return __instance.getHybridImageSpec()
+ }())
+ let __resultCpp = __result.getArrayBuffer()
+ return bridge.create_Result_std__shared_ptr_ArrayBuffer__(__resultCpp)
+ } catch (let __error) {
+ let __exceptionPtr = __error.toCpp()
+ return bridge.create_Result_std__shared_ptr_ArrayBuffer__(__exceptionPtr)
+ }
+ }
+
+ @inline(__always)
+ public final func encodeAsync(image: bridge.std__shared_ptr_margelo__nitro__image__HybridImageSpec_) -> bridge.Result_std__shared_ptr_Promise_std__shared_ptr_ArrayBuffer____ {
+ do {
+ let __result = try self.__implementation.encodeAsync(image: { () -> any HybridImageSpec in
+ let __unsafePointer = bridge.get_std__shared_ptr_margelo__nitro__image__HybridImageSpec_(image)
+ let __instance = HybridImageSpec_cxx.fromUnsafe(__unsafePointer)
+ return __instance.getHybridImageSpec()
+ }())
+ let __resultCpp = { () -> bridge.std__shared_ptr_Promise_std__shared_ptr_ArrayBuffer___ in
+ let __promise = bridge.create_std__shared_ptr_Promise_std__shared_ptr_ArrayBuffer___()
+ let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_std__shared_ptr_ArrayBuffer___(__promise)
+ __result
+ .then({ __result in __promiseHolder.resolve(__result.getArrayBuffer()) })
+ .catch({ __error in __promiseHolder.reject(__error.toCpp()) })
+ return __promise
+ }()
+ return bridge.create_Result_std__shared_ptr_Promise_std__shared_ptr_ArrayBuffer____(__resultCpp)
+ } catch (let __error) {
+ let __exceptionPtr = __error.toCpp()
+ return bridge.create_Result_std__shared_ptr_Promise_std__shared_ptr_ArrayBuffer____(__exceptionPtr)
+ }
+ }
+
+ @inline(__always)
+ public final func decode(thumbhash: ArrayBuffer) -> bridge.Result_std__shared_ptr_margelo__nitro__image__HybridImageSpec__ {
+ do {
+ let __result = try self.__implementation.decode(thumbhash: thumbhash)
+ let __resultCpp = { () -> bridge.std__shared_ptr_margelo__nitro__image__HybridImageSpec_ in
+ let __cxxWrapped = __result.getCxxWrapper()
+ return __cxxWrapped.getCxxPart()
+ }()
+ return bridge.create_Result_std__shared_ptr_margelo__nitro__image__HybridImageSpec__(__resultCpp)
+ } catch (let __error) {
+ let __exceptionPtr = __error.toCpp()
+ return bridge.create_Result_std__shared_ptr_margelo__nitro__image__HybridImageSpec__(__exceptionPtr)
+ }
+ }
+
+ @inline(__always)
+ public final func decodeAsync(thumbhash: ArrayBuffer) -> bridge.Result_std__shared_ptr_Promise_std__shared_ptr_margelo__nitro__image__HybridImageSpec____ {
+ do {
+ let __result = try self.__implementation.decodeAsync(thumbhash: thumbhash)
+ let __resultCpp = { () -> bridge.std__shared_ptr_Promise_std__shared_ptr_margelo__nitro__image__HybridImageSpec___ in
+ let __promise = bridge.create_std__shared_ptr_Promise_std__shared_ptr_margelo__nitro__image__HybridImageSpec___()
+ let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_std__shared_ptr_margelo__nitro__image__HybridImageSpec___(__promise)
+ __result
+ .then({ __result in __promiseHolder.resolve({ () -> bridge.std__shared_ptr_margelo__nitro__image__HybridImageSpec_ in
+ let __cxxWrapped = __result.getCxxWrapper()
+ return __cxxWrapped.getCxxPart()
+ }()) })
+ .catch({ __error in __promiseHolder.reject(__error.toCpp()) })
+ return __promise
+ }()
+ return bridge.create_Result_std__shared_ptr_Promise_std__shared_ptr_margelo__nitro__image__HybridImageSpec____(__resultCpp)
+ } catch (let __error) {
+ let __exceptionPtr = __error.toCpp()
+ return bridge.create_Result_std__shared_ptr_Promise_std__shared_ptr_margelo__nitro__image__HybridImageSpec____(__exceptionPtr)
+ }
+ }
+
+ @inline(__always)
+ public final func toBase64String(thumbhash: ArrayBuffer) -> bridge.Result_std__string_ {
+ do {
+ let __result = try self.__implementation.toBase64String(thumbhash: thumbhash)
+ let __resultCpp = std.string(__result)
+ return bridge.create_Result_std__string_(__resultCpp)
+ } catch (let __error) {
+ let __exceptionPtr = __error.toCpp()
+ return bridge.create_Result_std__string_(__exceptionPtr)
+ }
+ }
+
+ @inline(__always)
+ public final func fromBase64String(thumbhashBase64: std.string) -> bridge.Result_std__shared_ptr_ArrayBuffer__ {
+ do {
+ let __result = try self.__implementation.fromBase64String(thumbhashBase64: String(thumbhashBase64))
+ let __resultCpp = __result.getArrayBuffer()
+ return bridge.create_Result_std__shared_ptr_ArrayBuffer__(__resultCpp)
+ } catch (let __error) {
+ let __exceptionPtr = __error.toCpp()
+ return bridge.create_Result_std__shared_ptr_ArrayBuffer__(__exceptionPtr)
+ }
+ }
+}
diff --git a/packages/react-native-nitro-image-thumbhash/nitrogen/generated/shared/c++/HybridThumbHashFactorySpec.cpp b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/shared/c++/HybridThumbHashFactorySpec.cpp
new file mode 100644
index 00000000..432eb4c7
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/shared/c++/HybridThumbHashFactorySpec.cpp
@@ -0,0 +1,26 @@
+///
+/// HybridThumbHashFactorySpec.cpp
+/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
+/// https://github.com/mrousavy/nitro
+/// Copyright © Marc Rousavy @ Margelo
+///
+
+#include "HybridThumbHashFactorySpec.hpp"
+
+namespace margelo::nitro::image::thumbhash {
+
+ void HybridThumbHashFactorySpec::loadHybridMethods() {
+ // load base methods/properties
+ HybridObject::loadHybridMethods();
+ // load custom methods/properties
+ registerHybrids(this, [](Prototype& prototype) {
+ prototype.registerHybridMethod("encode", &HybridThumbHashFactorySpec::encode);
+ prototype.registerHybridMethod("encodeAsync", &HybridThumbHashFactorySpec::encodeAsync);
+ prototype.registerHybridMethod("decode", &HybridThumbHashFactorySpec::decode);
+ prototype.registerHybridMethod("decodeAsync", &HybridThumbHashFactorySpec::decodeAsync);
+ prototype.registerHybridMethod("toBase64String", &HybridThumbHashFactorySpec::toBase64String);
+ prototype.registerHybridMethod("fromBase64String", &HybridThumbHashFactorySpec::fromBase64String);
+ });
+ }
+
+} // namespace margelo::nitro::image::thumbhash
diff --git a/packages/react-native-nitro-image-thumbhash/nitrogen/generated/shared/c++/HybridThumbHashFactorySpec.hpp b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/shared/c++/HybridThumbHashFactorySpec.hpp
new file mode 100644
index 00000000..9e28878d
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/nitrogen/generated/shared/c++/HybridThumbHashFactorySpec.hpp
@@ -0,0 +1,72 @@
+///
+/// HybridThumbHashFactorySpec.hpp
+/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
+/// https://github.com/mrousavy/nitro
+/// Copyright © Marc Rousavy @ Margelo
+///
+
+#pragma once
+
+#if __has_include()
+#include
+#else
+#error NitroModules cannot be found! Are you sure you installed NitroModules properly?
+#endif
+
+// Forward declaration of `HybridImageSpec` to properly resolve imports.
+namespace margelo::nitro::image { class HybridImageSpec; }
+
+#include
+#include
+#include
+#include
+#include
+
+namespace margelo::nitro::image::thumbhash {
+
+ using namespace margelo::nitro;
+
+ /**
+ * An abstract base class for `ThumbHashFactory`
+ * Inherit this class to create instances of `HybridThumbHashFactorySpec` in C++.
+ * You must explicitly call `HybridObject`'s constructor yourself, because it is virtual.
+ * @example
+ * ```cpp
+ * class HybridThumbHashFactory: public HybridThumbHashFactorySpec {
+ * public:
+ * HybridThumbHashFactory(...): HybridObject(TAG) { ... }
+ * // ...
+ * };
+ * ```
+ */
+ class HybridThumbHashFactorySpec: public virtual HybridObject {
+ public:
+ // Constructor
+ explicit HybridThumbHashFactorySpec(): HybridObject(TAG) { }
+
+ // Destructor
+ ~HybridThumbHashFactorySpec() override = default;
+
+ public:
+ // Properties
+
+
+ public:
+ // Methods
+ virtual std::shared_ptr encode(const std::shared_ptr& image) = 0;
+ virtual std::shared_ptr>> encodeAsync(const std::shared_ptr& image) = 0;
+ virtual std::shared_ptr decode(const std::shared_ptr& thumbhash) = 0;
+ virtual std::shared_ptr>> decodeAsync(const std::shared_ptr& thumbhash) = 0;
+ virtual std::string toBase64String(const std::shared_ptr& thumbhash) = 0;
+ virtual std::shared_ptr fromBase64String(const std::string& thumbhashBase64) = 0;
+
+ protected:
+ // Hybrid Setup
+ void loadHybridMethods() override;
+
+ protected:
+ // Tag for logging
+ static constexpr auto TAG = "ThumbHashFactory";
+ };
+
+} // namespace margelo::nitro::image::thumbhash
diff --git a/packages/react-native-nitro-image-thumbhash/package.json b/packages/react-native-nitro-image-thumbhash/package.json
new file mode 100644
index 00000000..096725e9
--- /dev/null
+++ b/packages/react-native-nitro-image-thumbhash/package.json
@@ -0,0 +1,124 @@
+{
+ "name": "react-native-nitro-image-thumbhash",
+ "version": "0.0.1",
+ "description": "react-native-nitro-image-thumbhash",
+ "main": "lib/commonjs/index",
+ "module": "lib/module/index",
+ "types": "lib/typescript/index.d.ts",
+ "react-native": "src/index",
+ "source": "src/index",
+ "files": [
+ "src",
+ "react-native.config.js",
+ "lib",
+ "nitrogen",
+ "android/build.gradle",
+ "android/gradle.properties",
+ "android/fix-prefab.gradle",
+ "android/CMakeLists.txt",
+ "android/src",
+ "cpp",
+ "ios/**/*.h",
+ "ios/**/*.m",
+ "ios/**/*.mm",
+ "ios/**/*.cpp",
+ "ios/**/*.swift",
+ "app.plugin.js",
+ "nitro.json",
+ "*.podspec",
+ "README.md"
+ ],
+ "scripts": {
+ "build": "rm -rf tsconfig.tsbuildinfo && rm -rf lib && bun typecheck && bob build",
+ "typecheck": "tsc --noEmit",
+ "clean": "rm -rf android/build node_modules/**/android/build lib",
+ "lint": "eslint \"**/*.{js,ts,tsx}\" --fix",
+ "lint-ci": "eslint \"**/*.{js,ts,tsx}\" -f @jamesacarr/github-actions",
+ "typescript": "tsc",
+ "specs": "tsc --noEmit false && nitrogen --logLevel=\"debug\""
+ },
+ "keywords": [
+ "react-native",
+ "nitro"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/mrousavy/nitro.git"
+ },
+ "author": "Marc Rousavy