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 (https://github.com/mrousavy)", + "license": "MIT", + "bugs": { + "url": "https://github.com/mrousavy/nitro/issues" + }, + "homepage": "https://github.com/mrousavy/nitro#readme", + "publishConfig": { + "registry": "https://registry.npmjs.org/" + }, + "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-modules": "*", + "react-native-nitro-image": "*" + }, + "react-native-builder-bob": { + "source": "src", + "output": "lib", + "targets": [ + "commonjs", + "module", + [ + "typescript", + { + "project": "tsconfig.build.json" + } + ] + ] + }, + "eslintConfig": { + "root": true, + "extends": [ + "@react-native", + "prettier" + ], + "plugins": [ + "prettier" + ], + "rules": { + "prettier/prettier": [ + "warn", + { + "quoteProps": "consistent", + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "es5", + "useTabs": false + } + ] + } + }, + "eslintIgnore": [ + "node_modules/", + "lib/" + ], + "prettier": { + "quoteProps": "consistent", + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "es5", + "useTabs": false, + "semi": false + } +} diff --git a/packages/react-native-nitro-image-thumbhash/react-native.config.js b/packages/react-native-nitro-image-thumbhash/react-native.config.js new file mode 100644 index 00000000..3fdf8eaa --- /dev/null +++ b/packages/react-native-nitro-image-thumbhash/react-native.config.js @@ -0,0 +1,16 @@ +// https://github.com/react-native-community/cli/blob/main/docs/dependencies.md + +module.exports = { + dependency: { + platforms: { + /** + * @type {import('@react-native-community/cli-types').IOSDependencyParams} + */ + ios: {}, + /** + * @type {import('@react-native-community/cli-types').AndroidDependencyParams} + */ + android: {}, + }, + }, +} diff --git a/packages/react-native-nitro-image-thumbhash/src/index.ts b/packages/react-native-nitro-image-thumbhash/src/index.ts new file mode 100644 index 00000000..87fcfde6 --- /dev/null +++ b/packages/react-native-nitro-image-thumbhash/src/index.ts @@ -0,0 +1,5 @@ +import { NitroModules } from 'react-native-nitro-modules' +import type { ThumbHashFactory } from './specs/ThumbHashFactory.nitro' + +export const ThumbHash = + NitroModules.createHybridObject('ThumbHashFactory') diff --git a/packages/react-native-nitro-image-thumbhash/src/specs/ThumbHashFactory.nitro.ts b/packages/react-native-nitro-image-thumbhash/src/specs/ThumbHashFactory.nitro.ts new file mode 100644 index 00000000..0d651c66 --- /dev/null +++ b/packages/react-native-nitro-image-thumbhash/src/specs/ThumbHashFactory.nitro.ts @@ -0,0 +1,49 @@ +import type { Image } from 'react-native-nitro-image' +import type { HybridObject } from 'react-native-nitro-modules' + +/** + * ThumbHashes are a compact (~25 byte) binary placeholder representation of an + * Image, designed by Evan Wallace. See https://evanw.github.io/thumbhash/. + * + * Use {@linkcode encode} to produce a ThumbHash from an existing {@linkcode Image}, + * and {@linkcode decode} to reconstruct a low-resolution {@linkcode Image} from a + * previously stored ThumbHash. {@linkcode toBase64String} / + * {@linkcode fromBase64String} convert between the binary {@linkcode ArrayBuffer} + * representation and a portable Base64 `string`. + */ +export interface ThumbHashFactory + extends HybridObject<{ ios: 'swift'; android: 'kotlin' }> { + /** + * Encodes the given {@linkcode Image} into a ThumbHash. + * + * To keep this efficient, {@linkcode Image.resize} the source down to <100x100 + * pixels before encoding. + * + * @example + * ```ts + * const small = image.resize(100, 100) + * const hash = ThumbHashes.encode(small) + * ``` + */ + encode(image: Image): ArrayBuffer + encodeAsync(image: Image): Promise + + /** + * Decodes the given ThumbHash {@linkcode ArrayBuffer} back into a low-resolution + * {@linkcode Image}. + * + * @throws If the given {@linkcode thumbhash} is not a valid ThumbHash. + */ + decode(thumbhash: ArrayBuffer): Image + decodeAsync(thumbhash: ArrayBuffer): Promise + + /** + * Converts the given ThumbHash {@linkcode ArrayBuffer} to a Base64-encoded `string`. + */ + toBase64String(thumbhash: ArrayBuffer): string + + /** + * Converts the given Base64-encoded ThumbHash `string` to an {@linkcode ArrayBuffer}. + */ + fromBase64String(thumbhashBase64: string): ArrayBuffer +} diff --git a/packages/react-native-nitro-image-thumbhash/tsconfig.build.json b/packages/react-native-nitro-image-thumbhash/tsconfig.build.json new file mode 100644 index 00000000..9cc88c28 --- /dev/null +++ b/packages/react-native-nitro-image-thumbhash/tsconfig.build.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "include": ["src"], + "compilerOptions": { + "rootDir": "src" + } +} diff --git a/packages/react-native-nitro-image-thumbhash/tsconfig.json b/packages/react-native-nitro-image-thumbhash/tsconfig.json new file mode 100644 index 00000000..e30dc47a --- /dev/null +++ b/packages/react-native-nitro-image-thumbhash/tsconfig.json @@ -0,0 +1,29 @@ +{ + "include": ["src"], + "compilerOptions": { + "composite": true, + "outDir": "lib", + "rootDir": "src", + "allowUnreachableCode": false, + "allowUnusedLabels": false, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "jsx": "react", + "lib": ["esnext"], + "module": "esnext", + "moduleResolution": "node", + "noEmit": false, + "noFallthroughCasesInSwitch": true, + "noImplicitReturns": true, + "noImplicitUseStrict": false, + "noStrictGenericChecks": false, + "noUncheckedIndexedAccess": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true, + "target": "esnext", + "verbatimModuleSyntax": true + } +} diff --git a/packages/react-native-nitro-image/android/src/main/java/com/margelo/nitro/image/HybridImage.kt b/packages/react-native-nitro-image/android/src/main/java/com/margelo/nitro/image/HybridImage.kt index f1cb9e6d..4cd0198d 100644 --- a/packages/react-native-nitro-image/android/src/main/java/com/margelo/nitro/image/HybridImage.kt +++ b/packages/react-native-nitro-image/android/src/main/java/com/margelo/nitro/image/HybridImage.kt @@ -9,7 +9,6 @@ import androidx.annotation.Keep import androidx.core.graphics.createBitmap import androidx.core.graphics.scale 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.extensions.compressInMemory @@ -174,23 +173,6 @@ class HybridImage: HybridImageSpec { } } - override fun toThumbHash(): ArrayBuffer { - if (width > 100 || 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 toThumbHashAsync(): Promise { - return Promise.async { toThumbHash() } - } - override fun renderInto(image: HybridImageSpec, x: Double, y: Double, width: Double, height: Double): HybridImageSpec { val newImage = image as? HybridImage ?: throw Error("The image ($image) is not a `HybridImage`!") diff --git a/packages/react-native-nitro-image/android/src/main/java/com/margelo/nitro/image/HybridImageFactory.kt b/packages/react-native-nitro-image/android/src/main/java/com/margelo/nitro/image/HybridImageFactory.kt index eff90f55..83130fb0 100644 --- a/packages/react-native-nitro-image/android/src/main/java/com/margelo/nitro/image/HybridImageFactory.kt +++ b/packages/react-native-nitro-image/android/src/main/java/com/margelo/nitro/image/HybridImageFactory.kt @@ -7,14 +7,12 @@ import android.graphics.Canvas import androidx.annotation.Keep import androidx.core.graphics.createBitmap import com.facebook.common.internal.DoNotStrip -import com.madebyevan.thumbhash.ThumbHash import com.margelo.nitro.NitroModules import com.margelo.nitro.core.ArrayBuffer import com.margelo.nitro.core.Promise import com.margelo.nitro.image.extensions.bitmapFromRawPixelData import com.margelo.nitro.image.extensions.toBitmapColor import com.margelo.nitro.image.extensions.toFilePath -import java.nio.ByteBuffer @DoNotStrip @Keep @@ -104,23 +102,4 @@ class HybridImageFactory: HybridImageFactorySpec() { return Promise.async { loadFromFile(filePath) } } - private fun loadFromThumbHash(thumbHashBytes: ByteArray): HybridImage { - val rgba = ThumbHash.thumbHashToRGBA(thumbHashBytes) - - 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 loadFromThumbHash(thumbhash: ArrayBuffer): HybridImageSpec { - val bytes = thumbhash.toByteArray() - return loadFromThumbHash(bytes) - } - - override fun loadFromThumbHashAsync(thumbhash: ArrayBuffer): Promise { - // We need to copy before jumping Threads - val bytes = thumbhash.toByteArray() - return Promise.async { loadFromThumbHash(bytes) } - } } diff --git a/packages/react-native-nitro-image/android/src/main/java/com/margelo/nitro/image/HybridImageUtils.kt b/packages/react-native-nitro-image/android/src/main/java/com/margelo/nitro/image/HybridImageUtils.kt index 6d3c7b01..d543403c 100644 --- a/packages/react-native-nitro-image/android/src/main/java/com/margelo/nitro/image/HybridImageUtils.kt +++ b/packages/react-native-nitro-image/android/src/main/java/com/margelo/nitro/image/HybridImageUtils.kt @@ -4,8 +4,6 @@ import android.os.Build import androidx.annotation.Keep import com.facebook.common.internal.DoNotStrip import com.margelo.nitro.core.ArrayBuffer -import kotlin.io.encoding.Base64 -import kotlin.io.encoding.ExperimentalEncodingApi @DoNotStrip @Keep @@ -21,18 +19,4 @@ class HybridImageUtils: HybridImageUtilsSpec() { // Android does not support saving HEIF data yet return false } - - - @OptIn(ExperimentalEncodingApi::class) - override fun thumbHashToBase64String(thumbhash: ArrayBuffer): String { - val buffer = thumbhash.toByteArray() - val base64 = Base64.encode(buffer) - return base64 - } - - @OptIn(ExperimentalEncodingApi::class) - override fun thumbhashFromBase64String(thumbhashBase64: String): ArrayBuffer { - val bytes = Base64.decode(thumbhashBase64) - return ArrayBuffer.copy(bytes) - } } diff --git a/packages/react-native-nitro-image/ios/HybridImageFactory.swift b/packages/react-native-nitro-image/ios/HybridImageFactory.swift index 2aa4e282..402dbab9 100644 --- a/packages/react-native-nitro-image/ios/HybridImageFactory.swift +++ b/packages/react-native-nitro-image/ios/HybridImageFactory.swift @@ -117,18 +117,4 @@ class HybridImageFactory: HybridImageFactorySpec { return HybridImage(uiImage: uiImage) } } - - - func loadFromThumbHash(thumbhash: ArrayBuffer) throws -> any HybridImageSpec { - let data = thumbhash.toData(copyIfNeeded: false) - let uiImage = thumbHashToImage(hash: data) - return HybridImage(uiImage: uiImage) - } - func loadFromThumbHashAsync(thumbhash: ArrayBuffer) throws -> Promise { - let data = thumbhash.toData(copyIfNeeded: true) - return Promise.async { - let uiImage = thumbHashToImage(hash: data) - return HybridImage(uiImage: uiImage) - } - } } diff --git a/packages/react-native-nitro-image/ios/HybridImageUtils.swift b/packages/react-native-nitro-image/ios/HybridImageUtils.swift index 2dbcacc0..245fba02 100644 --- a/packages/react-native-nitro-image/ios/HybridImageUtils.swift +++ b/packages/react-native-nitro-image/ios/HybridImageUtils.swift @@ -23,16 +23,4 @@ class HybridImageUtils: HybridImageUtilsSpec { return false } } - - func thumbHashToBase64String(thumbhash: ArrayBuffer) throws -> String { - let data = thumbhash.toData(copyIfNeeded: false) - return data.base64EncodedString() - } - - func thumbhashFromBase64String(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/Public/NativeImage.swift b/packages/react-native-nitro-image/ios/Public/NativeImage.swift index 9cf2ac85..b4cd1000 100644 --- a/packages/react-native-nitro-image/ios/Public/NativeImage.swift +++ b/packages/react-native-nitro-image/ios/Public/NativeImage.swift @@ -176,17 +176,6 @@ public extension NativeImage { } } - func toThumbHash() throws -> ArrayBuffer { - let thumbHash = imageToThumbHash(image: uiImage) - return try ArrayBuffer.copy(data: thumbHash) - } - - func toThumbHashAsync() -> Promise { - return Promise.async { - return try self.toThumbHash() - } - } - func renderInto(image newImage: any HybridImageSpec, x: Double, y: Double, width: Double, height: Double) throws -> any HybridImageSpec { guard let newImage = newImage as? NativeImage else { throw RuntimeError.error(withMessage: "The given image (\(newImage)) is not a `NativeImage`!") diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageFactorySpec.cpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageFactorySpec.cpp index 1892d76d..7385b2aa 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageFactorySpec.cpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageFactorySpec.cpp @@ -183,26 +183,5 @@ namespace margelo::nitro::image { return __promise; }(); } - std::shared_ptr JHybridImageFactorySpec::loadFromThumbHash(const std::shared_ptr& thumbhash) { - static const auto method = _javaPart->javaClassStatic()->getMethod(jni::alias_ref /* thumbhash */)>("loadFromThumbHash"); - auto __result = method(_javaPart, JArrayBuffer::wrap(thumbhash)); - return __result->getJHybridImageSpec(); - } - std::shared_ptr>> JHybridImageFactorySpec::loadFromThumbHashAsync(const std::shared_ptr& thumbhash) { - static const auto method = _javaPart->javaClassStatic()->getMethod(jni::alias_ref /* thumbhash */)>("loadFromThumbHashAsync"); - 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; - }(); - } } // namespace margelo::nitro::image diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageFactorySpec.hpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageFactorySpec.hpp index 3b4d3fe4..3e8d7936 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageFactorySpec.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageFactorySpec.hpp @@ -65,8 +65,6 @@ namespace margelo::nitro::image { std::shared_ptr>> loadFromRawPixelDataAsync(const RawPixelData& data, std::optional allowGpu) override; std::shared_ptr loadFromEncodedImageData(const EncodedImageData& data) override; std::shared_ptr>> loadFromEncodedImageDataAsync(const EncodedImageData& data) override; - std::shared_ptr loadFromThumbHash(const std::shared_ptr& thumbhash) override; - std::shared_ptr>> loadFromThumbHashAsync(const std::shared_ptr& thumbhash) override; private: jni::global_ref _javaPart; diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageSpec.cpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageSpec.cpp index 9bec1805..0a83c965 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageSpec.cpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageSpec.cpp @@ -236,27 +236,6 @@ namespace margelo::nitro::image { return __promise; }(); } - std::shared_ptr JHybridImageSpec::toThumbHash() { - static const auto method = _javaPart->javaClassStatic()->getMethod()>("toThumbHash"); - auto __result = method(_javaPart); - return __result->cthis()->getArrayBuffer(); - } - std::shared_ptr>> JHybridImageSpec::toThumbHashAsync() { - static const auto method = _javaPart->javaClassStatic()->getMethod()>("toThumbHashAsync"); - auto __result = method(_javaPart); - 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 JHybridImageSpec::renderInto(const std::shared_ptr& image, double x, double y, double width, double height) { static const auto method = _javaPart->javaClassStatic()->getMethod(jni::alias_ref /* image */, double /* x */, double /* y */, double /* width */, double /* height */)>("renderInto"); auto __result = method(_javaPart, std::dynamic_pointer_cast(image)->getJavaPart(), x, y, width, height); diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageSpec.hpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageSpec.hpp index 88e7488a..97225350 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageSpec.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageSpec.hpp @@ -69,8 +69,6 @@ namespace margelo::nitro::image { std::shared_ptr>> mirrorHorizontallyAsync() override; std::shared_ptr> saveToFileAsync(const std::string& path, ImageFormat format, std::optional quality) override; std::shared_ptr> saveToTemporaryFileAsync(ImageFormat format, std::optional quality) override; - std::shared_ptr toThumbHash() override; - std::shared_ptr>> toThumbHashAsync() override; std::shared_ptr renderInto(const std::shared_ptr& image, double x, double y, double width, double height) override; std::shared_ptr>> renderIntoAsync(const std::shared_ptr& image, double x, double y, double width, double height) override; diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageUtilsSpec.cpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageUtilsSpec.cpp index 8a54eb9e..3e356e69 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageUtilsSpec.cpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageUtilsSpec.cpp @@ -9,9 +9,7 @@ -#include -#include -#include + namespace margelo::nitro::image { @@ -55,15 +53,6 @@ namespace margelo::nitro::image { } // Methods - std::string JHybridImageUtilsSpec::thumbHashToBase64String(const std::shared_ptr& thumbhash) { - static const auto method = _javaPart->javaClassStatic()->getMethod(jni::alias_ref /* thumbhash */)>("thumbHashToBase64String"); - auto __result = method(_javaPart, JArrayBuffer::wrap(thumbhash)); - return __result->toStdString(); - } - std::shared_ptr JHybridImageUtilsSpec::thumbhashFromBase64String(const std::string& thumbhashBase64) { - static const auto method = _javaPart->javaClassStatic()->getMethod(jni::alias_ref /* thumbhashBase64 */)>("thumbhashFromBase64String"); - auto __result = method(_javaPart, jni::make_jstring(thumbhashBase64)); - return __result->cthis()->getArrayBuffer(); - } + } // namespace margelo::nitro::image diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageUtilsSpec.hpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageUtilsSpec.hpp index 39265a4a..197b8e02 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageUtilsSpec.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageUtilsSpec.hpp @@ -55,8 +55,7 @@ namespace margelo::nitro::image { public: // Methods - std::string thumbHashToBase64String(const std::shared_ptr& thumbhash) override; - std::shared_ptr thumbhashFromBase64String(const std::string& thumbhashBase64) override; + private: jni::global_ref _javaPart; diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridImageFactorySpec.kt b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridImageFactorySpec.kt index 88a85f10..d7902cdc 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridImageFactorySpec.kt +++ b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridImageFactorySpec.kt @@ -11,7 +11,6 @@ import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip import com.margelo.nitro.core.Promise -import com.margelo.nitro.core.ArrayBuffer import com.margelo.nitro.core.HybridObject /** @@ -73,14 +72,6 @@ abstract class HybridImageFactorySpec: HybridObject() { @DoNotStrip @Keep abstract fun loadFromEncodedImageDataAsync(data: EncodedImageData): Promise - - @DoNotStrip - @Keep - abstract fun loadFromThumbHash(thumbhash: ArrayBuffer): HybridImageSpec - - @DoNotStrip - @Keep - abstract fun loadFromThumbHashAsync(thumbhash: ArrayBuffer): Promise // Default implementation of `HybridObject.toString()` override fun toString(): String { diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridImageSpec.kt b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridImageSpec.kt index 44cd62a5..e0001547 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridImageSpec.kt +++ b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridImageSpec.kt @@ -11,7 +11,6 @@ import androidx.annotation.Keep import com.facebook.jni.HybridData import com.facebook.proguard.annotations.DoNotStrip import com.margelo.nitro.core.Promise -import com.margelo.nitro.core.ArrayBuffer import com.margelo.nitro.core.HybridObject /** @@ -92,14 +91,6 @@ abstract class HybridImageSpec: HybridObject() { @Keep abstract fun saveToTemporaryFileAsync(format: ImageFormat, quality: Double?): Promise - @DoNotStrip - @Keep - abstract fun toThumbHash(): ArrayBuffer - - @DoNotStrip - @Keep - abstract fun toThumbHashAsync(): Promise - @DoNotStrip @Keep abstract fun renderInto(image: HybridImageSpec, x: Double, y: Double, width: Double, height: Double): HybridImageSpec diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridImageUtilsSpec.kt b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridImageUtilsSpec.kt index b14be8d8..86680096 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridImageUtilsSpec.kt +++ b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridImageUtilsSpec.kt @@ -10,7 +10,6 @@ package com.margelo.nitro.image 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.core.HybridObject /** @@ -35,13 +34,7 @@ abstract class HybridImageUtilsSpec: HybridObject() { abstract val supportsHeicWriting: Boolean // Methods - @DoNotStrip - @Keep - abstract fun thumbHashToBase64String(thumbhash: ArrayBuffer): String - @DoNotStrip - @Keep - abstract fun thumbhashFromBase64String(thumbhashBase64: String): ArrayBuffer // Default implementation of `HybridObject.toString()` override fun toString(): String { diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/NitroImage-Swift-Cxx-Bridge.cpp b/packages/react-native-nitro-image/nitrogen/generated/ios/NitroImage-Swift-Cxx-Bridge.cpp index fa0199d5..8d34ec8e 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/NitroImage-Swift-Cxx-Bridge.cpp +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/NitroImage-Swift-Cxx-Bridge.cpp @@ -83,14 +83,6 @@ namespace margelo::nitro::image::bridge::swift { }; } - // 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 = NitroImage::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::shared_ptr std::shared_ptr create_std__shared_ptr_HybridImageFactorySpec_(void* NON_NULL swiftUnsafePointer) noexcept { NitroImage::HybridImageFactorySpec_cxx swiftPart = NitroImage::HybridImageFactorySpec_cxx::fromUnsafe(swiftUnsafePointer); diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/NitroImage-Swift-Cxx-Bridge.hpp b/packages/react-native-nitro-image/nitrogen/generated/ios/NitroImage-Swift-Cxx-Bridge.hpp index 9b216f61..181b02d7 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/NitroImage-Swift-Cxx-Bridge.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/NitroImage-Swift-Cxx-Bridge.hpp @@ -314,40 +314,6 @@ namespace margelo::nitro::image::bridge::swift { return Func_void_std__string_Wrapper(std::move(value)); } - // 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: Result using Result_RawPixelData_ = Result; inline Result_RawPixelData_ create_Result_RawPixelData_(const RawPixelData& value) noexcept { @@ -420,24 +386,6 @@ namespace margelo::nitro::image::bridge::swift { return Result>>::withError(error); } - // 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: std::optional /** * Specialized version of `std::optional`. @@ -531,15 +479,6 @@ namespace margelo::nitro::image::bridge::swift { using std__weak_ptr_HybridImageUtilsSpec_ = std::weak_ptr; inline std__weak_ptr_HybridImageUtilsSpec_ weakify_std__shared_ptr_HybridImageUtilsSpec_(const std::shared_ptr& strong) noexcept { return strong; } - // 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); - } - // pragma MARK: std::variant, std::shared_ptr> /** * Wrapper struct for `std::variant, std::shared_ptr>`. diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/c++/HybridImageFactorySpecSwift.hpp b/packages/react-native-nitro-image/nitrogen/generated/ios/c++/HybridImageFactorySpecSwift.hpp index 5a2f94da..d8893f16 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/c++/HybridImageFactorySpecSwift.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/c++/HybridImageFactorySpecSwift.hpp @@ -178,22 +178,6 @@ namespace margelo::nitro::image { auto __value = std::move(__result.value()); return __value; } - inline std::shared_ptr loadFromThumbHash(const std::shared_ptr& thumbhash) override { - auto __result = _swiftPart.loadFromThumbHash(ArrayBufferHolder(thumbhash)); - if (__result.hasError()) [[unlikely]] { - std::rethrow_exception(__result.error()); - } - auto __value = std::move(__result.value()); - return __value; - } - inline std::shared_ptr>> loadFromThumbHashAsync(const std::shared_ptr& thumbhash) override { - auto __result = _swiftPart.loadFromThumbHashAsync(ArrayBufferHolder(thumbhash)); - if (__result.hasError()) [[unlikely]] { - std::rethrow_exception(__result.error()); - } - auto __value = std::move(__result.value()); - return __value; - } private: NitroImage::HybridImageFactorySpec_cxx _swiftPart; diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/c++/HybridImageSpecSwift.hpp b/packages/react-native-nitro-image/nitrogen/generated/ios/c++/HybridImageSpecSwift.hpp index 665ca254..b671300d 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/c++/HybridImageSpecSwift.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/c++/HybridImageSpecSwift.hpp @@ -204,22 +204,6 @@ namespace margelo::nitro::image { auto __value = std::move(__result.value()); return __value; } - inline std::shared_ptr toThumbHash() override { - auto __result = _swiftPart.toThumbHash(); - if (__result.hasError()) [[unlikely]] { - std::rethrow_exception(__result.error()); - } - auto __value = std::move(__result.value()); - return __value; - } - inline std::shared_ptr>> toThumbHashAsync() override { - auto __result = _swiftPart.toThumbHashAsync(); - if (__result.hasError()) [[unlikely]] { - std::rethrow_exception(__result.error()); - } - auto __value = std::move(__result.value()); - return __value; - } inline std::shared_ptr renderInto(const std::shared_ptr& image, double x, double y, double width, double height) override { auto __result = _swiftPart.renderInto(image, std::forward(x), std::forward(y), std::forward(width), std::forward(height)); if (__result.hasError()) [[unlikely]] { diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/c++/HybridImageUtilsSpecSwift.hpp b/packages/react-native-nitro-image/nitrogen/generated/ios/c++/HybridImageUtilsSpecSwift.hpp index 09c5afda..a3927772 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/c++/HybridImageUtilsSpecSwift.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/c++/HybridImageUtilsSpecSwift.hpp @@ -12,12 +12,9 @@ // Forward declaration of `HybridImageUtilsSpec_cxx` to properly resolve imports. namespace NitroImage { class HybridImageUtilsSpec_cxx; } -// Forward declaration of `ArrayBufferHolder` to properly resolve imports. -namespace NitroModules { class ArrayBufferHolder; } -#include -#include -#include + + #include "NitroImage-Swift-Cxx-Umbrella.hpp" @@ -74,22 +71,7 @@ namespace margelo::nitro::image { public: // Methods - inline std::string thumbHashToBase64String(const std::shared_ptr& thumbhash) override { - auto __result = _swiftPart.thumbHashToBase64String(ArrayBufferHolder(thumbhash)); - if (__result.hasError()) [[unlikely]] { - std::rethrow_exception(__result.error()); - } - auto __value = std::move(__result.value()); - return __value; - } - inline std::shared_ptr thumbhashFromBase64String(const std::string& thumbhashBase64) override { - auto __result = _swiftPart.thumbhashFromBase64String(thumbhashBase64); - if (__result.hasError()) [[unlikely]] { - std::rethrow_exception(__result.error()); - } - auto __value = std::move(__result.value()); - return __value; - } + private: NitroImage::HybridImageUtilsSpec_cxx _swiftPart; diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageFactorySpec.swift b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageFactorySpec.swift index 369342e8..49fe9580 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageFactorySpec.swift +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageFactorySpec.swift @@ -24,8 +24,6 @@ public protocol HybridImageFactorySpec_protocol: HybridObject { func loadFromRawPixelDataAsync(data: RawPixelData, allowGpu: Bool?) throws -> Promise<(any HybridImageSpec)> func loadFromEncodedImageData(data: EncodedImageData) throws -> (any HybridImageSpec) func loadFromEncodedImageDataAsync(data: EncodedImageData) throws -> Promise<(any HybridImageSpec)> - func loadFromThumbHash(thumbhash: ArrayBuffer) throws -> (any HybridImageSpec) - func loadFromThumbHashAsync(thumbhash: ArrayBuffer) throws -> Promise<(any HybridImageSpec)> } public extension HybridImageFactorySpec_protocol { diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageFactorySpec_cxx.swift b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageFactorySpec_cxx.swift index 699e9cfd..0c1fa58d 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageFactorySpec_cxx.swift +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageFactorySpec_cxx.swift @@ -337,41 +337,4 @@ open class HybridImageFactorySpec_cxx { return bridge.create_Result_std__shared_ptr_Promise_std__shared_ptr_HybridImageSpec____(__exceptionPtr) } } - - @inline(__always) - public final func loadFromThumbHash(thumbhash: ArrayBuffer) -> bridge.Result_std__shared_ptr_HybridImageSpec__ { - do { - let __result = try self.__implementation.loadFromThumbHash(thumbhash: thumbhash) - let __resultCpp = { () -> bridge.std__shared_ptr_HybridImageSpec_ in - let __cxxWrapped = __result.getCxxWrapper() - return __cxxWrapped.getCxxPart() - }() - return bridge.create_Result_std__shared_ptr_HybridImageSpec__(__resultCpp) - } catch (let __error) { - let __exceptionPtr = __error.toCpp() - return bridge.create_Result_std__shared_ptr_HybridImageSpec__(__exceptionPtr) - } - } - - @inline(__always) - public final func loadFromThumbHashAsync(thumbhash: ArrayBuffer) -> bridge.Result_std__shared_ptr_Promise_std__shared_ptr_HybridImageSpec____ { - do { - let __result = try self.__implementation.loadFromThumbHashAsync(thumbhash: thumbhash) - let __resultCpp = { () -> bridge.std__shared_ptr_Promise_std__shared_ptr_HybridImageSpec___ in - let __promise = bridge.create_std__shared_ptr_Promise_std__shared_ptr_HybridImageSpec___() - let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_std__shared_ptr_HybridImageSpec___(__promise) - __result - .then({ __result in __promiseHolder.resolve({ () -> bridge.std__shared_ptr_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_HybridImageSpec____(__resultCpp) - } catch (let __error) { - let __exceptionPtr = __error.toCpp() - return bridge.create_Result_std__shared_ptr_Promise_std__shared_ptr_HybridImageSpec____(__exceptionPtr) - } - } } diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageSpec.swift b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageSpec.swift index 68c06f12..35c4ff5f 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageSpec.swift +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageSpec.swift @@ -28,8 +28,6 @@ public protocol HybridImageSpec_protocol: HybridObject { func mirrorHorizontallyAsync() throws -> Promise<(any HybridImageSpec)> func saveToFileAsync(path: String, format: ImageFormat, quality: Double?) throws -> Promise func saveToTemporaryFileAsync(format: ImageFormat, quality: Double?) throws -> Promise - func toThumbHash() throws -> ArrayBuffer - func toThumbHashAsync() throws -> Promise func renderInto(image: (any HybridImageSpec), x: Double, y: Double, width: Double, height: Double) throws -> (any HybridImageSpec) func renderIntoAsync(image: (any HybridImageSpec), x: Double, y: Double, width: Double, height: Double) throws -> Promise<(any HybridImageSpec)> } diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageSpec_cxx.swift b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageSpec_cxx.swift index 363ce376..de84b428 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageSpec_cxx.swift +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageSpec_cxx.swift @@ -440,37 +440,6 @@ open class HybridImageSpec_cxx { } } - @inline(__always) - public final func toThumbHash() -> bridge.Result_std__shared_ptr_ArrayBuffer__ { - do { - let __result = try self.__implementation.toThumbHash() - 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 toThumbHashAsync() -> bridge.Result_std__shared_ptr_Promise_std__shared_ptr_ArrayBuffer____ { - do { - let __result = try self.__implementation.toThumbHashAsync() - 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 renderInto(image: bridge.std__shared_ptr_HybridImageSpec_, x: Double, y: Double, width: Double, height: Double) -> bridge.Result_std__shared_ptr_HybridImageSpec__ { do { diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageUtilsSpec.swift b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageUtilsSpec.swift index ae871700..25b1a9c9 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageUtilsSpec.swift +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageUtilsSpec.swift @@ -14,8 +14,7 @@ public protocol HybridImageUtilsSpec_protocol: HybridObject { var supportsHeicWriting: Bool { get } // Methods - func thumbHashToBase64String(thumbhash: ArrayBuffer) throws -> String - func thumbhashFromBase64String(thumbhashBase64: String) throws -> ArrayBuffer + } public extension HybridImageUtilsSpec_protocol { diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageUtilsSpec_cxx.swift b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageUtilsSpec_cxx.swift index 8056fcd6..036f2ca8 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageUtilsSpec_cxx.swift +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageUtilsSpec_cxx.swift @@ -136,27 +136,5 @@ open class HybridImageUtilsSpec_cxx { } // Methods - @inline(__always) - public final func thumbHashToBase64String(thumbhash: ArrayBuffer) -> bridge.Result_std__string_ { - do { - let __result = try self.__implementation.thumbHashToBase64String(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 thumbhashFromBase64String(thumbhashBase64: std.string) -> bridge.Result_std__shared_ptr_ArrayBuffer__ { - do { - let __result = try self.__implementation.thumbhashFromBase64String(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/nitrogen/generated/shared/c++/HybridImageFactorySpec.cpp b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridImageFactorySpec.cpp index 945d8bc5..33bdbbad 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridImageFactorySpec.cpp +++ b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridImageFactorySpec.cpp @@ -25,8 +25,6 @@ namespace margelo::nitro::image { prototype.registerHybridMethod("loadFromRawPixelDataAsync", &HybridImageFactorySpec::loadFromRawPixelDataAsync); prototype.registerHybridMethod("loadFromEncodedImageData", &HybridImageFactorySpec::loadFromEncodedImageData); prototype.registerHybridMethod("loadFromEncodedImageDataAsync", &HybridImageFactorySpec::loadFromEncodedImageDataAsync); - prototype.registerHybridMethod("loadFromThumbHash", &HybridImageFactorySpec::loadFromThumbHash); - prototype.registerHybridMethod("loadFromThumbHashAsync", &HybridImageFactorySpec::loadFromThumbHashAsync); }); } diff --git a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridImageFactorySpec.hpp b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridImageFactorySpec.hpp index 1794f2ff..b8e8dbf5 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridImageFactorySpec.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridImageFactorySpec.hpp @@ -30,7 +30,6 @@ namespace margelo::nitro::image { struct EncodedImageData; } #include #include "RawPixelData.hpp" #include "EncodedImageData.hpp" -#include namespace margelo::nitro::image { @@ -74,8 +73,6 @@ namespace margelo::nitro::image { virtual std::shared_ptr>> loadFromRawPixelDataAsync(const RawPixelData& data, std::optional allowGpu) = 0; virtual std::shared_ptr loadFromEncodedImageData(const EncodedImageData& data) = 0; virtual std::shared_ptr>> loadFromEncodedImageDataAsync(const EncodedImageData& data) = 0; - virtual std::shared_ptr loadFromThumbHash(const std::shared_ptr& thumbhash) = 0; - virtual std::shared_ptr>> loadFromThumbHashAsync(const std::shared_ptr& thumbhash) = 0; protected: // Hybrid Setup diff --git a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridImageSpec.cpp b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridImageSpec.cpp index 8a8f95e6..f2bbb8de 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridImageSpec.cpp +++ b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridImageSpec.cpp @@ -30,8 +30,6 @@ namespace margelo::nitro::image { prototype.registerHybridMethod("mirrorHorizontallyAsync", &HybridImageSpec::mirrorHorizontallyAsync); prototype.registerHybridMethod("saveToFileAsync", &HybridImageSpec::saveToFileAsync); prototype.registerHybridMethod("saveToTemporaryFileAsync", &HybridImageSpec::saveToTemporaryFileAsync); - prototype.registerHybridMethod("toThumbHash", &HybridImageSpec::toThumbHash); - prototype.registerHybridMethod("toThumbHashAsync", &HybridImageSpec::toThumbHashAsync); prototype.registerHybridMethod("renderInto", &HybridImageSpec::renderInto); prototype.registerHybridMethod("renderIntoAsync", &HybridImageSpec::renderIntoAsync); }); diff --git a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridImageSpec.hpp b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridImageSpec.hpp index 954f77d6..988192cf 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridImageSpec.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridImageSpec.hpp @@ -30,7 +30,6 @@ namespace margelo::nitro::image { class HybridImageSpec; } #include #include "HybridImageSpec.hpp" #include -#include namespace margelo::nitro::image { @@ -78,8 +77,6 @@ namespace margelo::nitro::image { virtual std::shared_ptr>> mirrorHorizontallyAsync() = 0; virtual std::shared_ptr> saveToFileAsync(const std::string& path, ImageFormat format, std::optional quality) = 0; virtual std::shared_ptr> saveToTemporaryFileAsync(ImageFormat format, std::optional quality) = 0; - virtual std::shared_ptr toThumbHash() = 0; - virtual std::shared_ptr>> toThumbHashAsync() = 0; virtual std::shared_ptr renderInto(const std::shared_ptr& image, double x, double y, double width, double height) = 0; virtual std::shared_ptr>> renderIntoAsync(const std::shared_ptr& image, double x, double y, double width, double height) = 0; diff --git a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridImageUtilsSpec.cpp b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridImageUtilsSpec.cpp index a19d924e..6d545b89 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridImageUtilsSpec.cpp +++ b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridImageUtilsSpec.cpp @@ -16,8 +16,6 @@ namespace margelo::nitro::image { registerHybrids(this, [](Prototype& prototype) { prototype.registerHybridGetter("supportsHeicLoading", &HybridImageUtilsSpec::getSupportsHeicLoading); prototype.registerHybridGetter("supportsHeicWriting", &HybridImageUtilsSpec::getSupportsHeicWriting); - prototype.registerHybridMethod("thumbHashToBase64String", &HybridImageUtilsSpec::thumbHashToBase64String); - prototype.registerHybridMethod("thumbhashFromBase64String", &HybridImageUtilsSpec::thumbhashFromBase64String); }); } diff --git a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridImageUtilsSpec.hpp b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridImageUtilsSpec.hpp index c1c7eb34..ce0a4d0c 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridImageUtilsSpec.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridImageUtilsSpec.hpp @@ -15,8 +15,7 @@ -#include -#include + namespace margelo::nitro::image { @@ -50,8 +49,7 @@ namespace margelo::nitro::image { public: // Methods - virtual std::string thumbHashToBase64String(const std::shared_ptr& thumbhash) = 0; - virtual std::shared_ptr thumbhashFromBase64String(const std::string& thumbhashBase64) = 0; + protected: // Hybrid Setup diff --git a/packages/react-native-nitro-image/src/ImageUtils.ts b/packages/react-native-nitro-image/src/ImageUtils.ts index 5280e1a3..8ba00f13 100644 --- a/packages/react-native-nitro-image/src/ImageUtils.ts +++ b/packages/react-native-nitro-image/src/ImageUtils.ts @@ -13,8 +13,3 @@ export const supportsHeicLoading = utils.supportsHeicLoading * in `HEIC` format. */ export const supportsHeicWriting = utils.supportsHeicWriting - -export const thumbHashToBase64String = utils.thumbHashToBase64String.bind(utils) - -export const thumbHashFromBase64String = - utils.thumbhashFromBase64String.bind(utils) diff --git a/packages/react-native-nitro-image/src/specs/Image.nitro.ts b/packages/react-native-nitro-image/src/specs/Image.nitro.ts index 6f205c36..dc037cb4 100644 --- a/packages/react-native-nitro-image/src/specs/Image.nitro.ts +++ b/packages/react-native-nitro-image/src/specs/Image.nitro.ts @@ -201,19 +201,6 @@ export interface Image quality?: number, ): Promise - /** - * Encodes this Image into a ThumbHash. - * To convert the returned ThumbHash to a string, use `thumbHashToBase64String(...)`. - * @note To keep this efficient, {@linkcode resize} this image to a small size (<100x100) first. - * @example - * ```ts - * const small = image.resize(100, 100) - * const thumbHash = small.toThumbHash() - * ``` - */ - toThumbHash(): ArrayBuffer - toThumbHashAsync(): Promise - /** * Renders the given {@linkcode Image} into a copy of this {@linkcode Image}, * at the given {@linkcode x} and {@linkcode y} position, scaled to the diff --git a/packages/react-native-nitro-image/src/specs/ImageFactory.nitro.ts b/packages/react-native-nitro-image/src/specs/ImageFactory.nitro.ts index 17e6f91d..3b2fafea 100644 --- a/packages/react-native-nitro-image/src/specs/ImageFactory.nitro.ts +++ b/packages/react-native-nitro-image/src/specs/ImageFactory.nitro.ts @@ -118,13 +118,4 @@ export interface ImageFactory * @throws If the given {@linkcode EncodedImageData} is not a valid representation of an {@linkcode Image}. */ loadFromEncodedImageDataAsync(data: EncodedImageData): Promise - - /** - * Synchronously decodes the given {@linkcode thumbhash} (and {@linkcode ArrayBuffer}) - * into an {@linkcode Image}. - * @param buffer The ArrayBuffer carrying the ThumbHash's data - * @throws If the given {@linkcode thumbhash} is not a valid ThumbHash. - */ - loadFromThumbHash(thumbhash: ArrayBuffer): Image - loadFromThumbHashAsync(thumbhash: ArrayBuffer): Promise } diff --git a/packages/react-native-nitro-image/src/specs/ImageUtils.nitro.ts b/packages/react-native-nitro-image/src/specs/ImageUtils.nitro.ts index 186aaeab..e77dd36a 100644 --- a/packages/react-native-nitro-image/src/specs/ImageUtils.nitro.ts +++ b/packages/react-native-nitro-image/src/specs/ImageUtils.nitro.ts @@ -12,13 +12,4 @@ export interface ImageUtils * in `HEIC` format. */ readonly supportsHeicWriting: boolean - - /** - * Converts the given ThumbHash {@linkcode ArrayBuffer} to a `string`. - */ - thumbHashToBase64String(thumbhash: ArrayBuffer): string - /** - * Converts the given ThumbHash `string` to an {@linkcode ArrayBuffer}. - */ - thumbhashFromBase64String(thumbhashBase64: string): ArrayBuffer }