From 88d6aacbfb50433736551373a927a678cf7e49aa Mon Sep 17 00:00:00 2001 From: bglgwyng Date: Wed, 9 Jul 2025 20:44:32 +0900 Subject: [PATCH 01/15] refactor: migrate from ESLint to Biome for code formatting and linting --- babel.config.js | 4 +- biome.json | 34 ++ bun.lock | 403 +----------------- example/.eslintrc.js | 4 - example/.prettierrc.js | 7 - example/app.json | 4 +- example/babel.config.js | 2 +- example/index.js | 6 +- .../AppIcon.appiconset/Contents.json | 102 ++--- .../Images.xcassets/Contents.json | 8 +- example/metro.config.js | 24 +- example/package.json | 77 ++-- example/src/App.tsx | 29 +- example/src/EmptyTab.tsx | 30 +- example/src/FastImageTab.tsx | 44 +- example/src/NitroImageTab.tsx | 44 +- example/src/createImageURLs.ts | 12 +- example/tsconfig.json | 2 +- nitro.json | 54 ++- .../shared/json/NitroImageViewConfig.json | 16 +- package.json | 12 +- react-native.config.js | 26 +- src/ImageFactory.ts | 26 +- src/ImageUtils.ts | 11 +- src/NitroImage.tsx | 16 +- src/NitroWebImage.tsx | 123 +++--- src/index.ts | 18 +- src/specs/Image.nitro.ts | 112 ++--- src/specs/ImageFactory.nitro.ts | 215 +++++----- src/specs/ImageUtils.nitro.ts | 8 +- src/specs/ImageView.nitro.ts | 20 +- src/useWebImage.ts | 43 +- tsconfig.json | 56 ++- 33 files changed, 620 insertions(+), 972 deletions(-) create mode 100644 biome.json delete mode 100644 example/.eslintrc.js delete mode 100644 example/.prettierrc.js diff --git a/babel.config.js b/babel.config.js index 3e0218e6..30526a88 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,3 +1,3 @@ module.exports = { - presets: ['module:@react-native/babel-preset'], -} + presets: ["module:@react-native/babel-preset"], +}; diff --git a/biome.json b/biome.json new file mode 100644 index 00000000..e6897f50 --- /dev/null +++ b/biome.json @@ -0,0 +1,34 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.1.0/schema.json", + "vcs": { + "enabled": false, + "clientKind": "git", + "useIgnoreFile": false + }, + "files": { + "ignoreUnknown": false + }, + "formatter": { + "enabled": true, + "indentStyle": "tab" + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true + } + }, + "javascript": { + "formatter": { + "quoteStyle": "double" + } + }, + "assist": { + "enabled": true, + "actions": { + "source": { + "organizeImports": "on" + } + } + } +} diff --git a/bun.lock b/bun.lock index e1d16022..9b45a91f 100644 --- a/bun.lock +++ b/bun.lock @@ -4,14 +4,10 @@ "": { "name": "react-native-nitro-image", "devDependencies": { - "@react-native/eslint-config": "0.79.3", + "@biomejs/biome": "2.1.0", "@release-it/conventional-changelog": "^8.0.2", "@types/react": "^19.0.6", - "eslint": "^8.57.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-prettier": "^5.2.1", "nitro-codegen": "*", - "prettier": "^3.3.3", "react": "19.0.0", "react-native": "0.79.3", "react-native-nitro-modules": "^0.26.3", @@ -46,12 +42,9 @@ "@react-native-community/cli-platform-android": "18.0.0", "@react-native-community/cli-platform-ios": "18.0.0", "@react-native/babel-preset": "0.79.3", - "@react-native/eslint-config": "0.79.3", "@react-native/metro-config": "0.79.3", "@react-native/typescript-config": "0.79.3", "@types/react": "^19.0.0", - "eslint": "^8.19.0", - "prettier": "2.8.8", "typescript": "5.0.4", }, }, @@ -65,8 +58,6 @@ "@babel/core": ["@babel/core@7.27.4", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.27.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.27.3", "@babel/helpers": "^7.27.4", "@babel/parser": "^7.27.4", "@babel/template": "^7.27.2", "@babel/traverse": "^7.27.4", "@babel/types": "^7.27.3", "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-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g=="], - "@babel/eslint-parser": ["@babel/eslint-parser@7.27.5", "", { "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-HLkYQfRICudzcOtjGwkPvGc5nF1b4ljLZh1IRDj50lRZ718NAKVgQpIAUX8bfg6u/yuSKY3L7E0YzIV+OxrB8Q=="], - "@babel/generator": ["@babel/generator@7.27.5", "", { "dependencies": { "@babel/parser": "^7.27.5", "@babel/types": "^7.27.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw=="], "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" } }, "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg=="], @@ -293,25 +284,29 @@ "@babel/types": ["@babel/types@7.27.6", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q=="], - "@conventional-changelog/git-client": ["@conventional-changelog/git-client@1.0.1", "", { "dependencies": { "@types/semver": "^7.5.5", "semver": "^7.5.2" }, "peerDependencies": { "conventional-commits-filter": "^5.0.0", "conventional-commits-parser": "^6.0.0" }, "optionalPeers": ["conventional-commits-filter", "conventional-commits-parser"] }, "sha512-PJEqBwAleffCMETaVm/fUgHldzBE35JFk3/9LL6NUA5EXa3qednu+UT6M7E5iBu3zIQZCULYIiZ90fBYHt6xUw=="], + "@biomejs/biome": ["@biomejs/biome@2.1.0", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.1.0", "@biomejs/cli-darwin-x64": "2.1.0", "@biomejs/cli-linux-arm64": "2.1.0", "@biomejs/cli-linux-arm64-musl": "2.1.0", "@biomejs/cli-linux-x64": "2.1.0", "@biomejs/cli-linux-x64-musl": "2.1.0", "@biomejs/cli-win32-arm64": "2.1.0", "@biomejs/cli-win32-x64": "2.1.0" }, "bin": { "biome": "bin/biome" } }, "sha512-K2UDr1dCiaOWegp4yQLMC4Evgl85ze1O7r+WxPeO7cNl0XrIcTshvdQGMDB23c/2afXz6RsOKYfWLErNbBbjmA=="], - "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.7.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw=="], + "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.1.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RDXEUGSCvUx3PKWRt95WRtwH+l01slm7r2zaotDwWERn/RITMcdet21rI5q5cYhL4XJiAvLHG8qyLNSXqIOCwQ=="], - "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], + "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.1.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-epLFRbMjYS/Cu9Kc5gM3wzUExsKj2Z0oxIiuxlI4ZterIqm19yvTOtJoqSec8gjUXOTNvPVoEIfSSXg37yepow=="], - "@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=="], + "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.1.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-HZys1/TeIH5lagwtf9yKSO+gtA+cYMJW22ckDGuKt2xIvPu7VqgTNjJtTdRcetXe0+benlMMo+KFs3xL2b/2QA=="], - "@eslint/js": ["@eslint/js@8.57.1", "", {}, "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q=="], + "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.1.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-J7z6s/M50wt5lhSkivAs2GJHPhiah3hkdg1LipM6wlK6cVC3YeIA/X6pgWBfjEwyfsFlpc3nRM+pQ17DI8FpDQ=="], - "@hapi/hoek": ["@hapi/hoek@9.3.0", "", {}, "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ=="], + "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.1.0", "", { "os": "linux", "cpu": "x64" }, "sha512-nAVAP1ov/zcXMhNq3WCbYZmlU/YTF3ZT+LeXR1CEJnDgunPC/Srp7j1LWlrIx6wxNOCDOFow8fmyfC7c/BKLig=="], - "@hapi/topo": ["@hapi/topo@5.1.0", "", { "dependencies": { "@hapi/hoek": "^9.0.0" } }, "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg=="], + "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.1.0", "", { "os": "linux", "cpu": "x64" }, "sha512-uj8felYcBeXh32kznnKrAQoZ9pLqta/6qvwLJ4AZtUmY6cSUUa5c+VLnFtxMfuhvps/M4D55VGnwSINOEblPQg=="], + + "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.1.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-eGGqGs+8Q34n1zp/rEadFRKjzwFszpZ2+p6B1Dmi7dn1DNEYhNXoRWLcjyca+ZSTrdV7COx0scyjgF9Tg73kBw=="], + + "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.1.0", "", { "os": "win32", "cpu": "x64" }, "sha512-pkp6jucyvE8DJSXXwSKs+Mxx1KXkMJ2d8GbBu4Lf0nAQHl40TZjjp1RuNEo9Z7NNXPQzbLACDtK6/vDalO2WRg=="], - "@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=="], + "@conventional-changelog/git-client": ["@conventional-changelog/git-client@1.0.1", "", { "dependencies": { "@types/semver": "^7.5.5", "semver": "^7.5.2" }, "peerDependencies": { "conventional-commits-filter": "^5.0.0", "conventional-commits-parser": "^6.0.0" }, "optionalPeers": ["conventional-commits-filter", "conventional-commits-parser"] }, "sha512-PJEqBwAleffCMETaVm/fUgHldzBE35JFk3/9LL6NUA5EXa3qednu+UT6M7E5iBu3zIQZCULYIiZ90fBYHt6xUw=="], - "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], + "@hapi/hoek": ["@hapi/hoek@9.3.0", "", {}, "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ=="], - "@humanwhocodes/object-schema": ["@humanwhocodes/object-schema@2.0.3", "", {}, "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA=="], + "@hapi/topo": ["@hapi/topo@5.1.0", "", { "dependencies": { "@hapi/hoek": "^9.0.0" } }, "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg=="], "@hutson/parse-repository-url": ["@hutson/parse-repository-url@5.0.0", "", {}, "sha512-e5+YUKENATs1JgYHMzTr2MW/NDcXGfYFAuOQU8gJgF/kEh4EqKgfGrfLI67bMD4tbhZVlkigz/9YYwWcbOFthg=="], @@ -349,8 +344,6 @@ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], - "@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=="], @@ -381,8 +374,6 @@ "@octokit/types": ["@octokit/types@13.10.0", "", { "dependencies": { "@octokit/openapi-types": "^24.2.0" } }, "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA=="], - "@pkgr/core": ["@pkgr/core@0.2.7", "", {}, "sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg=="], - "@pnpm/config.env-replace": ["@pnpm/config.env-replace@1.1.0", "", {}, "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w=="], "@pnpm/network.ca-file": ["@pnpm/network.ca-file@1.0.2", "", { "dependencies": { "graceful-fs": "4.2.10" } }, "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA=="], @@ -427,10 +418,6 @@ "@react-native/dev-middleware": ["@react-native/dev-middleware@0.79.3", "", { "dependencies": { "@isaacs/ttlcache": "^1.4.1", "@react-native/debugger-frontend": "0.79.3", "chrome-launcher": "^0.15.2", "chromium-edge-launcher": "^0.2.0", "connect": "^3.6.5", "debug": "^2.2.0", "invariant": "^2.2.4", "nullthrows": "^1.1.1", "open": "^7.0.3", "serve-static": "^1.16.2", "ws": "^6.2.3" } }, "sha512-x88+RGOyG71+idQefnQg7wLhzjn/Scs+re1O5vqCkTVzRAc/f7SdHMlbmECUxJPd08FqMcOJr7/X3nsJBrNuuw=="], - "@react-native/eslint-config": ["@react-native/eslint-config@0.79.3", "", { "dependencies": { "@babel/core": "^7.25.2", "@babel/eslint-parser": "^7.25.1", "@react-native/eslint-plugin": "0.79.3", "@typescript-eslint/eslint-plugin": "^7.1.1", "@typescript-eslint/parser": "^7.1.1", "eslint-config-prettier": "^8.5.0", "eslint-plugin-eslint-comments": "^3.2.0", "eslint-plugin-ft-flow": "^2.0.1", "eslint-plugin-jest": "^27.9.0", "eslint-plugin-react": "^7.30.1", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-native": "^4.0.0" }, "peerDependencies": { "eslint": ">=8", "prettier": ">=2" } }, "sha512-pvPXfXFoVfwqGEItIl7emv6bRTpi0NWv4jmb0ZBwSJ7+zM8bRRw7JwxLA+iwrevh0QAqrF66Nu5xl39ysWcavg=="], - - "@react-native/eslint-plugin": ["@react-native/eslint-plugin@0.79.3", "", {}, "sha512-6QZzCsV+Wc+HdOAMMoMqDea3SSzsvBBktGc/cqaLubKGiztTb22d+vtzZGWqCqUEVkhQKdK7qhWAs0kJPEbiXw=="], - "@react-native/gradle-plugin": ["@react-native/gradle-plugin@0.79.3", "", {}, "sha512-imfpZLhNBc9UFSzb/MOy2tNcIBHqVmexh/qdzw83F75BmUtLb/Gs1L2V5gw+WI1r7RqDILbWk7gXB8zUllwd+g=="], "@react-native/js-polyfills": ["@react-native/js-polyfills@0.79.3", "", {}, "sha512-PEBtg6Kox6KahjCAch0UrqCAmHiNLEbp2SblUEoFAQnov4DSxBN9safh+QSVaCiMAwLjvNfXrJyygZz60Dqz3Q=="], @@ -491,8 +478,6 @@ "@types/istanbul-reports": ["@types/istanbul-reports@3.0.4", "", { "dependencies": { "@types/istanbul-lib-report": "*" } }, "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ=="], - "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], - "@types/node": ["@types/node@24.0.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-yZQa2zm87aRVcqDyH5+4Hv9KYgSdgwX1rFnGvpbzMaC7YAljmhBET93TPiTd3ObwTL+gSpIzPKg5BqVxdCvxKg=="], "@types/normalize-package-data": ["@types/normalize-package-data@2.4.4", "", {}, "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA=="], @@ -507,24 +492,6 @@ "@types/yargs-parser": ["@types/yargs-parser@21.0.3", "", {}, "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ=="], - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@7.18.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/type-utils": "7.18.0", "@typescript-eslint/utils": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^1.3.0" }, "peerDependencies": { "@typescript-eslint/parser": "^7.0.0", "eslint": "^8.56.0" } }, "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw=="], - - "@typescript-eslint/parser": ["@typescript-eslint/parser@7.18.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg=="], - - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], - - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@7.18.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "7.18.0", "@typescript-eslint/utils": "7.18.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA=="], - - "@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], - - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], - - "@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], - - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "eslint-visitor-keys": "^3.4.3" } }, "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg=="], - - "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], - "@vscode/sudo-prompt": ["@vscode/sudo-prompt@9.3.1", "", {}, "sha512-9ORTwwS74VaTn38tNbQhsA5U44zkJfcb0BdTSyyG6frP4e8KMtHuTXYmwefe5dpL8XB1aGSIVTaLjD3BbWb5iA=="], "JSONStream": ["JSONStream@1.3.5", "", { "dependencies": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" }, "bin": { "JSONStream": "./bin.js" } }, "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ=="], @@ -537,14 +504,10 @@ "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], - "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], - "add-stream": ["add-stream@1.0.0", "", {}, "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ=="], "agent-base": ["agent-base@7.1.3", "", {}, "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw=="], - "ajv": ["ajv@6.12.6", "", { "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-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], - "anser": ["anser@1.4.10", "", {}, "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww=="], "ansi-align": ["ansi-align@3.0.1", "", { "dependencies": { "string-width": "^4.1.0" } }, "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w=="], @@ -563,40 +526,20 @@ "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=="], "ast-types": ["ast-types@0.13.4", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w=="], "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=="], "atomically": ["atomically@2.0.3", "", { "dependencies": { "stubborn-fs": "^1.2.5", "when-exit": "^2.1.1" } }, "sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw=="], - "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=="], @@ -647,8 +590,6 @@ "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], - "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], - "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=="], @@ -765,12 +706,6 @@ "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.13", "", {}, "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="], "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], @@ -781,8 +716,6 @@ "deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="], - "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.2.1", "", { "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" } }, "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg=="], @@ -791,12 +724,8 @@ "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=="], - "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=="], "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], @@ -805,10 +734,6 @@ "destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="], - "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=="], - "dot-prop": ["dot-prop@9.0.0", "", { "dependencies": { "type-fest": "^4.18.2" } }, "sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ=="], "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], @@ -831,22 +756,12 @@ "errorhandler": ["errorhandler@1.5.1", "", { "dependencies": { "accepts": "~1.3.7", "escape-html": "~1.0.3" } }, "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A=="], - "es-abstract": ["es-abstract@1.24.0", "", { "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-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg=="], - "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.2.1", "", { "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-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.6", "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.4", "safe-array-concat": "^1.1.3" } }, "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w=="], - "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-goat": ["escape-goat@4.0.0", "", {}, "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg=="], @@ -857,38 +772,8 @@ "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.0", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw=="], - - "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@27.9.0", "", { "dependencies": { "@typescript-eslint/utils": "^5.10.0" }, "peerDependencies": { "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0 || ^7.0.0", "eslint": "^7.0.0 || ^8.0.0", "jest": "*" }, "optionalPeers": ["@typescript-eslint/eslint-plugin", "jest"] }, "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug=="], - - "eslint-plugin-prettier": ["eslint-plugin-prettier@5.4.1", "", { "dependencies": { "prettier-linter-helpers": "^1.0.0", "synckit": "^0.11.7" }, "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-9dF+KuU/Ilkq27A8idRP7N2DH8iUR6qXcjF3FR2wETY21PZdBrIjwCau8oboyGj9b7etWmTGEeM8e7oOed6ZWg=="], - - "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@4.6.2", "", { "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" } }, "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ=="], - - "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.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], - - "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=="], @@ -905,22 +790,16 @@ "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.3", "", { "dependencies": { "strnum": "^1.1.1" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig=="], "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], "fb-watchman": ["fb-watchman@2.0.2", "", { "dependencies": { "bser": "2.1.1" } }, "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA=="], - "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=="], @@ -929,14 +808,8 @@ "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.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], - "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=="], - "fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], "fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], @@ -947,10 +820,6 @@ "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=="], - "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=="], @@ -965,8 +834,6 @@ "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.4", "", { "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", "debug": "^4.3.4" } }, "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ=="], "git-raw-commits": ["git-raw-commits@4.0.0", "", { "dependencies": { "dargs": "^8.0.0", "meow": "^12.0.1", "split2": "^4.0.0" }, "bin": { "git-raw-commits": "cli.mjs" } }, "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ=="], @@ -979,13 +846,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@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], "global-directory": ["global-directory@4.0.1", "", { "dependencies": { "ini": "4.1.1" } }, "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q=="], - "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=="], + "globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], "globby": ["globby@14.0.2", "", { "dependencies": { "@sindresorhus/merge-streams": "^2.1.0", "fast-glob": "^3.3.2", "ignore": "^5.2.4", "path-type": "^5.0.0", "slash": "^5.1.0", "unicorn-magic": "^0.1.0" } }, "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw=="], @@ -993,22 +858,12 @@ "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.8", "", { "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-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ=="], - "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.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], "hermes-estree": ["hermes-estree@0.25.1", "", {}, "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw=="], @@ -1045,44 +900,24 @@ "inquirer": ["inquirer@9.3.2", "", { "dependencies": { "@inquirer/figures": "^1.0.3", "ansi-escapes": "^4.3.2", "cli-width": "^4.1.0", "external-editor": "^3.1.0", "mute-stream": "1.0.0", "ora": "^5.4.1", "run-async": "^3.0.0", "rxjs": "^7.8.1", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", "wrap-ansi": "^6.2.0", "yoctocolors-cjs": "^2.1.1" } }, "sha512-+ynEbhWKhyomnaX0n2aLIMSkgSlGB5RrWbNXnEqj6mdaIydu6y40MdBjL38SAB0JcdmOaIaMua1azdjLEr3sdw=="], - "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=="], - "interpret": ["interpret@1.4.0", "", {}, "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA=="], "invariant": ["invariant@2.2.4", "", { "dependencies": { "loose-envify": "^1.0.0" } }, "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA=="], "ip-address": ["ip-address@9.0.5", "", { "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" } }, "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g=="], - "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-function": ["is-generator-function@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ=="], - "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], "is-in-ci": ["is-in-ci@1.0.0", "", { "bin": { "is-in-ci": "cli.js" } }, "sha512-eUuAjybVTHMYWm/U+vBO1sY/JOCgoPCXRxzdju0K+K0BiGW0SChEL1MLC0PoCIR1OlPo5YAp8HuQoUlsWEICwg=="], @@ -1093,50 +928,24 @@ "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-npm": ["is-npm@6.0.0", "", {}, "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ=="], "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-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-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-path-inside": ["is-path-inside@4.0.0", "", {}, "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA=="], "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-text-path": ["is-text-path@2.0.0", "", { "dependencies": { "text-extensions": "^2.0.0" } }, "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw=="], - "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], - "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-wsl": ["is-wsl@3.1.0", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw=="], - "isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], - "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], "issue-parser": ["issue-parser@7.0.1", "", { "dependencies": { "lodash.capitalize": "^4.2.1", "lodash.escaperegexp": "^4.1.2", "lodash.isplainobject": "^4.0.6", "lodash.isstring": "^4.0.1", "lodash.uniqby": "^4.7.0" } }, "sha512-3YZcUUR2Wt1WsapF+S/WiA2WmlW0cWAoPccMqne7AxEBhCdFeTPjfv/Axb8V2gyCgY3nRw+ksZ3xSUX+R47iAg=="], @@ -1145,8 +954,6 @@ "istanbul-lib-instrument": ["istanbul-lib-instrument@5.2.1", "", { "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.2.0", "semver": "^6.3.0" } }, "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg=="], - "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=="], - "jest-environment-node": ["jest-environment-node@29.7.0", "", { "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.7.0", "jest-util": "^29.7.0" } }, "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw=="], "jest-get-type": ["jest-get-type@29.6.3", "", {}, "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw=="], @@ -1177,16 +984,10 @@ "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-stringify-safe": ["json-stringify-safe@5.0.1", "", {}, "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="], "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], @@ -1195,10 +996,6 @@ "jsonparse": ["jsonparse@1.3.1", "", {}, "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg=="], - "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@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="], "ky": ["ky@1.8.1", "", {}, "sha512-7Bp3TpsE+L+TARSnnDpk3xg8Idi8RwSLdj6CMbNWoOARIrGrbuLGusV0dYwbZOm4bB3jHNxSw8Wk/ByDqJEnDw=="], @@ -1209,8 +1006,6 @@ "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=="], @@ -1229,8 +1024,6 @@ "lodash.isstring": ["lodash.isstring@4.0.1", "", {}, "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="], - "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], - "lodash.throttle": ["lodash.throttle@4.1.1", "", {}, "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="], "lodash.uniqby": ["lodash.uniqby@4.7.0", "", {}, "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww=="], @@ -1313,8 +1106,6 @@ "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], - "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], - "negotiator": ["negotiator@0.6.4", "", {}, "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w=="], "neo-async": ["neo-async@2.6.2", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="], @@ -1343,20 +1134,8 @@ "ob1": ["ob1@0.82.4", "", { "dependencies": { "flow-enums-runtime": "^0.0.6" } }, "sha512-n9S8e4l5TvkrequEAMDidl4yXesruWTNTzVkeaHSGywoTOIwTzZzKw7Z670H3eaXDZui5MJXjWGNzYowVZIxCA=="], - "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=="], - "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], "on-headers": ["on-headers@1.0.2", "", {}, "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="], @@ -1367,16 +1146,12 @@ "open": ["open@10.1.0", "", { "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", "is-wsl": "^3.1.0" } }, "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw=="], - "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@8.1.1", "", { "dependencies": { "chalk": "^5.3.0", "cli-cursor": "^5.0.0", "cli-spinners": "^2.9.2", "is-interactive": "^2.0.0", "is-unicode-supported": "^2.0.0", "log-symbols": "^6.0.0", "stdin-discarder": "^0.2.2", "string-width": "^7.2.0", "strip-ansi": "^7.1.0" } }, "sha512-YWielGi1XzG1UTvOaCFaNgEnuhZVMSHYkW/FQ7UX8O26PtlpdM84c0f7wLPlkvx2RfiQmnzd61d/MGxmpQeJPw=="], "os-name": ["os-name@5.1.0", "", { "dependencies": { "macos-release": "^3.1.0", "windows-release": "^5.0.1" } }, "sha512-YEIoAnM6zFmzw3PQ201gCVCIWbXNyKObGlVvpAVvraAeOHnlYVKFssbA/riRX5R40WA6kKrZ7Dr7dWzO3nKSeQ=="], "os-tmpdir": ["os-tmpdir@1.0.2", "", {}, "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g=="], - "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@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], @@ -1417,22 +1192,12 @@ "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], - "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.5.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw=="], - - "prettier-linter-helpers": ["prettier-linter-helpers@1.0.0", "", { "dependencies": { "fast-diff": "^1.1.2" } }, "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w=="], - "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=="], "promise": ["promise@8.3.0", "", { "dependencies": { "asap": "~2.0.6" } }, "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg=="], "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=="], - "proto-list": ["proto-list@1.2.4", "", {}, "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA=="], "protocols": ["protocols@2.0.2", "", {}, "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ=="], @@ -1441,8 +1206,6 @@ "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], - "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], - "pupa": ["pupa@3.1.0", "", { "dependencies": { "escape-goat": "^4.0.0" } }, "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug=="], "qs": ["qs@6.13.0", "", { "dependencies": { "side-channel": "^1.0.6" } }, "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg=="], @@ -1489,16 +1252,12 @@ "rechoir": ["rechoir@0.6.2", "", { "dependencies": { "resolve": "^1.1.6" } }, "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw=="], - "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.0", "", { "dependencies": { "regenerate": "^1.4.2" } }, "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA=="], "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.2.0", "", { "dependencies": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.2.0", "regjsgen": "^0.8.0", "regjsparser": "^0.12.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" } }, "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA=="], "registry-auth-token": ["registry-auth-token@5.1.0", "", { "dependencies": { "@pnpm/npm-conf": "^2.1.0" } }, "sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw=="], @@ -1515,7 +1274,7 @@ "require-main-filename": ["require-main-filename@2.0.0", "", {}, "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="], - "resolve": ["resolve@2.0.0-next.5", "", { "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA=="], + "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], @@ -1535,14 +1294,8 @@ "rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="], - "safe-array-concat": ["safe-array-concat@1.1.3", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q=="], - "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.25.0", "", {}, "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA=="], @@ -1557,12 +1310,6 @@ "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=="], "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], @@ -1625,31 +1372,17 @@ "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-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.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.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], "strip-final-newline": ["strip-final-newline@3.0.0", "", {}, "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw=="], - "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], "strnum": ["strnum@1.1.2", "", {}, "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA=="], @@ -1659,16 +1392,12 @@ "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], - "synckit": ["synckit@0.11.8", "", { "dependencies": { "@pkgr/core": "^0.2.4" } }, "sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A=="], - "terser": ["terser@5.42.0", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.14.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-UYCvU9YQW2f/Vwl+P0GfhxJxbUGLwd+5QrrGgLajzWAtC/23AX0vcise32kkP7Eu0Wu9VlzzHAXkLObgjQfFlQ=="], "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-extensions": ["text-extensions@2.4.0", "", {}, "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g=="], - "text-table": ["text-table@0.2.0", "", {}, "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="], - "throat": ["throat@5.0.0", "", {}, "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA=="], "through": ["through@2.3.8", "", {}, "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="], @@ -1681,38 +1410,22 @@ "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], - "ts-api-utils": ["ts-api-utils@1.4.3", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw=="], - "ts-morph": ["ts-morph@25.0.1", "", { "dependencies": { "@ts-morph/common": "~0.26.0", "code-block-writer": "^13.0.3" } }, "sha512-QJEiTdnz1YjrB3JFhd626gX4rKHDLSjSVMvGGG4v7ONc3RBwa0Eei98G9AT9uNFDMtV54JyuXsFeC+OH0n6bXQ=="], "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "tsutils": ["tsutils@3.21.0", "", { "dependencies": { "tslib": "^1.8.1" }, "peerDependencies": { "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA=="], - - "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=="], - "undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], "unicode-canonical-property-names-ecmascript": ["unicode-canonical-property-names-ecmascript@2.0.1", "", {}, "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg=="], @@ -1735,8 +1448,6 @@ "update-notifier": ["update-notifier@7.3.1", "", { "dependencies": { "boxen": "^8.0.1", "chalk": "^5.3.0", "configstore": "^7.0.0", "is-in-ci": "^1.0.0", "is-installed-globally": "^1.0.0", "is-npm": "^6.0.0", "latest-version": "^9.0.0", "pupa": "^3.1.0", "semver": "^7.6.3", "xdg-basedir": "^5.1.0" } }, "sha512-+dwUY4L35XFYEzE+OAL3sarJdUioVovq+8f7lcIJ7wnmnYQV5UD1Y/lcwaMSyaQ6Bj3JMj1XSTjZbNLHn/19yA=="], - "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], - "url-join": ["url-join@5.0.0", "", {}, "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA=="], "use-latest-callback": ["use-latest-callback@0.2.3", "", { "peerDependencies": { "react": ">=16.8" } }, "sha512-7vI3fBuyRcP91pazVboc4qu+6ZqM8izPWX9k7cRnT8hbD5svslcknsh3S9BUhaK11OmgTV4oWZZVSeQAiV53SQ=="], @@ -1765,24 +1476,14 @@ "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.19", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "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-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw=="], - "widest-line": ["widest-line@5.0.0", "", { "dependencies": { "string-width": "^7.0.0" } }, "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA=="], "wildcard-match": ["wildcard-match@5.1.4", "", {}, "sha512-wldeCaczs8XXq7hj+5d/F38JE2r7EXgb6WQDM84RVwxy81T/sxB5e9+uZLK9Q9oNz1mlvjut+QtvgaOQFPVq/g=="], "windows-release": ["windows-release@5.1.1", "", { "dependencies": { "execa": "^5.1.1" } }, "sha512-NMD00arvqcq2nwqc5Q6KtrSRHK+fVD31erE5FEMahAw5PmVCgD7MUXodq3pdZSUkqA9Cda2iWx6s1XYwiJWRmw=="], - "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], - "wordwrap": ["wordwrap@1.0.0", "", {}, "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q=="], "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=="], @@ -1813,10 +1514,6 @@ "@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=="], @@ -1833,8 +1530,6 @@ "@babel/preset-env/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "@babel/traverse/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], - "@babel/traverse--for-generate-function-map/globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], "@istanbuljs/load-nyc-config/camelcase": ["camelcase@5.3.1", "", {}, "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="], @@ -1845,8 +1540,6 @@ "@istanbuljs/load-nyc-config/resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], - "@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=="], - "@pnpm/network.ca-file/graceful-fs": ["graceful-fs@4.2.10", "", {}, "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="], "@react-native-community/cli/commander": ["commander@9.5.0", "", {}, "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="], @@ -1879,19 +1572,11 @@ "@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.0", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg=="], - "@react-navigation/core/react-is": ["react-is@19.1.0", "", {}, "sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg=="], "@ts-morph/common/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - "@typescript-eslint/typescript-estree/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=="], - - "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - - "NitroImageExample/prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="], - - "NitroImageExample/react-native-nitro-image": ["react-native-nitro-image@file:", { "devDependencies": { "@react-native/eslint-config": "0.79.3", "@release-it/conventional-changelog": "^8.0.2", "@types/react": "^19.0.6", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.2.1", "nitro-codegen": "*", "prettier": "^3.3.3", "react": "19.0.0", "react-native": "0.79.3", "react-native-nitro-modules": "*", "release-it": "^17.10.0", "typescript": "^5.5.4" }, "peerDependencies": { "react": "*", "react-native": "*", "react-native-nitro-modules": "*" } }], + "NitroImageExample/react-native-nitro-image": ["react-native-nitro-image@file:", { "devDependencies": { "@biomejs/biome": "2.1.0", "@release-it/conventional-changelog": "^8.0.2", "@types/react": "^19.0.6", "nitro-codegen": "*", "react": "19.0.0", "react-native": "0.79.3", "react-native-nitro-modules": "^0.26.3", "release-it": "^17.10.0", "typescript": "^5.5.4" }, "peerDependencies": { "react": "*", "react-native": "*", "react-native-nitro-modules": "*" } }], "NitroImageExample/typescript": ["typescript@5.0.4", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw=="], @@ -1933,22 +1618,10 @@ "conventional-recommended-bump/git-semver-tags": ["git-semver-tags@7.0.1", "", { "dependencies": { "meow": "^12.0.1", "semver": "^7.5.2" }, "bin": { "git-semver-tags": "cli.mjs" } }, "sha512-NY0ZHjJzyyNXHTDZmj+GG7PyuAKtMsyWSwh07CR2hOZFa+/yoTsXci/nF2obzL8UDhakFNkD9gNdt/Ed+cxh2Q=="], - "dir-glob/path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], - "dot-prop/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], "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-jest/@typescript-eslint/utils": ["@typescript-eslint/utils@5.62.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/types": "5.62.0", "@typescript-eslint/typescript-estree": "5.62.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ=="], - - "eslint-plugin-react/doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="], - - "eslint-plugin-react/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - - "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=="], @@ -1959,8 +1632,6 @@ "git-semver-tags/meow": ["meow@13.2.0", "", {}, "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA=="], - "globals/type-fest": ["type-fest@0.20.2", "", {}, "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="], - "globby/slash": ["slash@5.1.0", "", {}, "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg=="], "handlebars/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], @@ -1969,8 +1640,6 @@ "inquirer/ora": ["ora@5.4.1", "", { "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", "cli-cursor": "^3.1.0", "cli-spinners": "^2.5.0", "is-interactive": "^1.0.0", "is-unicode-supported": "^0.1.0", "log-symbols": "^4.1.0", "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" } }, "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ=="], - "is-installed-globally/is-path-inside": ["is-path-inside@4.0.0", "", {}, "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA=="], - "istanbul-lib-instrument/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "jest-util/ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="], @@ -2013,12 +1682,8 @@ "pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], - "prop-types/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], - "rc/ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], - "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], - "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=="], "read-pkg/parse-json": ["parse-json@7.1.1", "", { "dependencies": { "@babel/code-frame": "^7.21.4", "error-ex": "^1.3.2", "json-parse-even-better-errors": "^3.0.0", "lines-and-columns": "^2.0.3", "type-fest": "^3.8.0" } }, "sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw=="], @@ -2029,8 +1694,6 @@ "read-pkg-up/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], - "rechoir/resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], - "regjsparser/jsesc": ["jsesc@3.0.2", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g=="], "release-it/chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], @@ -2057,8 +1720,6 @@ "terser/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], - "tsutils/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], - "update-notifier/chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], "widest-line/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], @@ -2071,8 +1732,6 @@ "@istanbuljs/load-nyc-config/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], - "@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=="], @@ -2203,10 +1862,6 @@ "@ts-morph/common/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], - "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], - - "NitroImageExample/react-native-nitro-image/prettier": ["prettier@3.5.3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw=="], - "NitroImageExample/react-native-nitro-image/typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], "ansi-fragments/strip-ansi/ansi-regex": ["ansi-regex@4.1.1", "", {}, "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="], @@ -2229,14 +1884,6 @@ "connect/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], - "eslint-plugin-jest/@typescript-eslint/utils/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@5.62.0", "", { "dependencies": { "@typescript-eslint/types": "5.62.0", "@typescript-eslint/visitor-keys": "5.62.0" } }, "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w=="], - - "eslint-plugin-jest/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@5.62.0", "", {}, "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ=="], - - "eslint-plugin-jest/@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@5.62.0", "", { "dependencies": { "@typescript-eslint/types": "5.62.0", "@typescript-eslint/visitor-keys": "5.62.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "semver": "^7.3.7", "tsutils": "^3.21.0" } }, "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA=="], - - "eslint-plugin-jest/@typescript-eslint/utils/eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="], - "finalhandler/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], "inquirer/ora/cli-cursor": ["cli-cursor@3.1.0", "", { "dependencies": { "restore-cursor": "^3.1.0" } }, "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw=="], @@ -2331,14 +1978,6 @@ "boxen/wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], - "eslint-plugin-jest/@typescript-eslint/utils/@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@5.62.0", "", { "dependencies": { "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" } }, "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw=="], - - "eslint-plugin-jest/@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@5.62.0", "", { "dependencies": { "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" } }, "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw=="], - - "eslint-plugin-jest/@typescript-eslint/utils/@typescript-eslint/typescript-estree/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=="], - - "eslint-plugin-jest/@typescript-eslint/utils/eslint-scope/estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="], - "inquirer/ora/cli-cursor/restore-cursor": ["restore-cursor@3.1.0", "", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA=="], "logkitty/yargs/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], diff --git a/example/.eslintrc.js b/example/.eslintrc.js deleted file mode 100644 index 187894b6..00000000 --- a/example/.eslintrc.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - root: true, - extends: '@react-native', -}; diff --git a/example/.prettierrc.js b/example/.prettierrc.js deleted file mode 100644 index 2b540746..00000000 --- a/example/.prettierrc.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - arrowParens: 'avoid', - bracketSameLine: true, - bracketSpacing: false, - singleQuote: true, - trailingComma: 'all', -}; diff --git a/example/app.json b/example/app.json index b571d357..b501a355 100644 --- a/example/app.json +++ b/example/app.json @@ -1,4 +1,4 @@ { - "name": "NitroImageExample", - "displayName": "NitroImageExample" + "name": "NitroImageExample", + "displayName": "NitroImageExample" } diff --git a/example/babel.config.js b/example/babel.config.js index f7b3da3b..30526a88 100644 --- a/example/babel.config.js +++ b/example/babel.config.js @@ -1,3 +1,3 @@ module.exports = { - presets: ['module:@react-native/babel-preset'], + presets: ["module:@react-native/babel-preset"], }; diff --git a/example/index.js b/example/index.js index 69303b34..11cbe241 100644 --- a/example/index.js +++ b/example/index.js @@ -2,8 +2,8 @@ * @format */ -import {AppRegistry} from 'react-native'; -import App from './src/App'; -import {name as appName} from './app.json'; +import { AppRegistry } from "react-native"; +import { name as appName } from "./app.json"; +import App from "./src/App"; AppRegistry.registerComponent(appName, () => App); diff --git a/example/ios/NitroImageExample/Images.xcassets/AppIcon.appiconset/Contents.json b/example/ios/NitroImageExample/Images.xcassets/AppIcon.appiconset/Contents.json index 81213230..bb8673b9 100644 --- a/example/ios/NitroImageExample/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/example/ios/NitroImageExample/Images.xcassets/AppIcon.appiconset/Contents.json @@ -1,53 +1,53 @@ { - "images" : [ - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "20x20" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "20x20" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "29x29" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "29x29" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "40x40" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "40x40" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "60x60" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "60x60" - }, - { - "idiom" : "ios-marketing", - "scale" : "1x", - "size" : "1024x1024" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } + "images": [ + { + "idiom": "iphone", + "scale": "2x", + "size": "20x20" + }, + { + "idiom": "iphone", + "scale": "3x", + "size": "20x20" + }, + { + "idiom": "iphone", + "scale": "2x", + "size": "29x29" + }, + { + "idiom": "iphone", + "scale": "3x", + "size": "29x29" + }, + { + "idiom": "iphone", + "scale": "2x", + "size": "40x40" + }, + { + "idiom": "iphone", + "scale": "3x", + "size": "40x40" + }, + { + "idiom": "iphone", + "scale": "2x", + "size": "60x60" + }, + { + "idiom": "iphone", + "scale": "3x", + "size": "60x60" + }, + { + "idiom": "ios-marketing", + "scale": "1x", + "size": "1024x1024" + } + ], + "info": { + "author": "xcode", + "version": 1 + } } diff --git a/example/ios/NitroImageExample/Images.xcassets/Contents.json b/example/ios/NitroImageExample/Images.xcassets/Contents.json index 2d92bd53..9a38aea4 100644 --- a/example/ios/NitroImageExample/Images.xcassets/Contents.json +++ b/example/ios/NitroImageExample/Images.xcassets/Contents.json @@ -1,6 +1,6 @@ { - "info" : { - "version" : 1, - "author" : "xcode" - } + "info": { + "version": 1, + "author": "xcode" + } } diff --git a/example/metro.config.js b/example/metro.config.js index da08642c..1356a5d2 100644 --- a/example/metro.config.js +++ b/example/metro.config.js @@ -1,7 +1,7 @@ -const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config'); -const path = require('path'); +const { getDefaultConfig, mergeConfig } = require("@react-native/metro-config"); +const path = require("node:path"); -const root = path.resolve(__dirname, '..'); +const root = path.resolve(__dirname, ".."); /** * Metro configuration @@ -10,16 +10,16 @@ const root = path.resolve(__dirname, '..'); * @type {import('@react-native/metro-config').MetroConfig} */ const config = { - watchFolders: [root], + watchFolders: [root], - transformer: { - getTransformOptions: async () => ({ - transform: { - experimentalImportSupport: false, - inlineRequires: true, - }, - }), - }, + transformer: { + getTransformOptions: async () => ({ + transform: { + experimentalImportSupport: false, + inlineRequires: true, + }, + }), + }, }; module.exports = mergeConfig(getDefaultConfig(__dirname), config); diff --git a/example/package.json b/example/package.json index c3b8736d..3dd548e5 100644 --- a/example/package.json +++ b/example/package.json @@ -1,42 +1,39 @@ { - "name": "NitroImageExample", - "version": "0.0.1", - "private": true, - "scripts": { - "android": "react-native run-android", - "ios": "react-native run-ios", - "lint": "eslint .", - "start": "react-native start --client-logs", - "pods": "bundle install && cd ios && bundle exec pod install" - }, - "dependencies": { - "@react-navigation/bottom-tabs": "^7.3.14", - "@react-navigation/native": "^7.1.10", - "react": "19.0.0", - "react-native": "0.79.3", - "react-native-fast-image": "^8.6.3", - "react-native-nitro-image": "..", - "react-native-nitro-modules": "^0.26.3", - "react-native-safe-area-context": "^5.4.1", - "react-native-screens": "^4.11.1" - }, - "devDependencies": { - "@babel/core": "^7.27.4", - "@babel/preset-env": "^7.27.2", - "@babel/runtime": "^7.27.6", - "@react-native-community/cli": "18.0.0", - "@react-native-community/cli-platform-android": "18.0.0", - "@react-native-community/cli-platform-ios": "18.0.0", - "@react-native/babel-preset": "0.79.3", - "@react-native/eslint-config": "0.79.3", - "@react-native/metro-config": "0.79.3", - "@react-native/typescript-config": "0.79.3", - "@types/react": "^19.0.0", - "eslint": "^8.19.0", - "prettier": "2.8.8", - "typescript": "5.0.4" - }, - "engines": { - "node": ">=18" - } + "name": "NitroImageExample", + "version": "0.0.1", + "private": true, + "scripts": { + "android": "react-native run-android", + "ios": "react-native run-ios", + "lint": "eslint .", + "start": "react-native start --client-logs", + "pods": "bundle install && cd ios && bundle exec pod install" + }, + "dependencies": { + "@react-navigation/bottom-tabs": "^7.3.14", + "@react-navigation/native": "^7.1.10", + "react": "19.0.0", + "react-native": "0.79.3", + "react-native-fast-image": "^8.6.3", + "react-native-nitro-image": "..", + "react-native-nitro-modules": "^0.26.3", + "react-native-safe-area-context": "^5.4.1", + "react-native-screens": "^4.11.1" + }, + "devDependencies": { + "@babel/core": "^7.27.4", + "@babel/preset-env": "^7.27.2", + "@babel/runtime": "^7.27.6", + "@react-native-community/cli": "18.0.0", + "@react-native-community/cli-platform-android": "18.0.0", + "@react-native-community/cli-platform-ios": "18.0.0", + "@react-native/babel-preset": "0.79.3", + "@react-native/metro-config": "0.79.3", + "@react-native/typescript-config": "0.79.3", + "@types/react": "^19.0.0", + "typescript": "5.0.4" + }, + "engines": { + "node": ">=18" + } } diff --git a/example/src/App.tsx b/example/src/App.tsx index e31b43fe..d282931e 100644 --- a/example/src/App.tsx +++ b/example/src/App.tsx @@ -5,28 +5,25 @@ * @format */ -import React from 'react'; -import { createBottomTabNavigator } from '@react-navigation/bottom-tabs'; -import { FastImageTab } from './FastImageTab'; -import { NitroImageTab } from './NitroImageTab'; -import { createStaticNavigation } from '@react-navigation/native'; -import { EmptyTab } from './EmptyTab'; +import { createBottomTabNavigator } from "@react-navigation/bottom-tabs"; +import { createStaticNavigation } from "@react-navigation/native"; +import type React from "react"; +import { EmptyTab } from "./EmptyTab"; +import { FastImageTab } from "./FastImageTab"; +import { NitroImageTab } from "./NitroImageTab"; const Tabs = createBottomTabNavigator({ - detachInactiveScreens: false, - screens: { - Empty: EmptyTab, - FastImage: FastImageTab, - NitroImage: NitroImageTab, - }, + detachInactiveScreens: false, + screens: { + Empty: EmptyTab, + FastImage: FastImageTab, + NitroImage: NitroImageTab, + }, }); const Navigation = createStaticNavigation(Tabs); function App(): React.JSX.Element { - return ( - - ); + return ; } - export default App; diff --git a/example/src/EmptyTab.tsx b/example/src/EmptyTab.tsx index dd9d4a5b..08c1e725 100644 --- a/example/src/EmptyTab.tsx +++ b/example/src/EmptyTab.tsx @@ -1,21 +1,21 @@ -import { StyleSheet, Text, View } from 'react-native'; - +import { StyleSheet, Text, View } from "react-native"; export function EmptyTab() { - return ( - Select a Tab to display the Images List. - ); + return ( + + Select a Tab to display the Images List. + + ); } - const styles = StyleSheet.create({ - container: { - flex: 1, - justifyContent: 'center', - alignItems: 'center', - }, - text: { - fontSize: 18, - fontWeight: '500', - }, + container: { + flex: 1, + justifyContent: "center", + alignItems: "center", + }, + text: { + fontSize: 18, + fontWeight: "500", + }, }); diff --git a/example/src/FastImageTab.tsx b/example/src/FastImageTab.tsx index e72f3be5..aa9f66aa 100644 --- a/example/src/FastImageTab.tsx +++ b/example/src/FastImageTab.tsx @@ -1,29 +1,29 @@ -import { useMemo } from 'react'; -import { FlatList, StyleSheet, Text, View } from 'react-native'; -import { createImageURLs } from './createImageURLs'; -import FastImage from 'react-native-fast-image'; - +import { useMemo } from "react"; +import { FlatList, StyleSheet, Text, View } from "react-native"; +import FastImage from "react-native-fast-image"; +import { createImageURLs } from "./createImageURLs"; export function FastImageTab() { - const imageURLs = useMemo(() => createImageURLs(), []); + const imageURLs = useMemo(() => createImageURLs(), []); - return ( - FastImage Tab - ( - - )} - /> - ); + return ( + + FastImage Tab + ( + + )} + /> + + ); } - const styles = StyleSheet.create({ - image: { - width: '25%', - aspectRatio: 1, - }, + image: { + width: "25%", + aspectRatio: 1, + }, }); diff --git a/example/src/NitroImageTab.tsx b/example/src/NitroImageTab.tsx index 4401787a..aa221c60 100644 --- a/example/src/NitroImageTab.tsx +++ b/example/src/NitroImageTab.tsx @@ -1,33 +1,33 @@ -import React, { useMemo } from 'react'; -import { FlatList, StyleSheet, Text, View } from 'react-native'; -import { NitroImage, useWebImage } from 'react-native-nitro-image'; -import { createImageURLs } from './createImageURLs'; +import React, { useMemo } from "react"; +import { FlatList, StyleSheet, Text, View } from "react-native"; +import { NitroImage, useWebImage } from "react-native-nitro-image"; +import { createImageURLs } from "./createImageURLs"; function AsyncImageImpl({ url }: { url: string }): React.ReactNode { - const image = useWebImage(url); - return ; + const image = useWebImage(url); + return ; } const AsyncImage = React.memo(AsyncImageImpl); export function NitroImageTab() { - const imageURLs = useMemo(() => createImageURLs(), []); + const imageURLs = useMemo(() => createImageURLs(), []); - return ( - NitroImage Tab - ( - - )} - /> - ); + return ( + + NitroImage Tab + } + /> + + ); } const styles = StyleSheet.create({ - image: { - width: '25%', - aspectRatio: 1, - }, + image: { + width: "25%", + aspectRatio: 1, + }, }); diff --git a/example/src/createImageURLs.ts b/example/src/createImageURLs.ts index 409f4b31..0d1fbd06 100644 --- a/example/src/createImageURLs.ts +++ b/example/src/createImageURLs.ts @@ -1,8 +1,10 @@ - const DEFAULT_COUNT = 1000; -export function createImageURLs(count: number = DEFAULT_COUNT, size = 800): string[] { - return [...Array(count).fill(undefined)].map((_, index) => { - return `https://picsum.photos/seed/${index + 1}/${size}`; - }); +export function createImageURLs( + count: number = DEFAULT_COUNT, + size = 800, +): string[] { + return [...Array(count).fill(undefined)].map((_, index) => { + return `https://picsum.photos/seed/${index + 1}/${size}`; + }); } diff --git a/example/tsconfig.json b/example/tsconfig.json index 304ab4e2..c3e54017 100644 --- a/example/tsconfig.json +++ b/example/tsconfig.json @@ -1,3 +1,3 @@ { - "extends": "@react-native/typescript-config/tsconfig.json" + "extends": "@react-native/typescript-config/tsconfig.json" } diff --git a/nitro.json b/nitro.json index f8a1787b..f63a7b73 100644 --- a/nitro.json +++ b/nitro.json @@ -1,32 +1,26 @@ { - "$schema": "https://nitro.margelo.com/nitro.schema.json", - "cxxNamespace": [ - "image" - ], - "ios": { - "iosModuleName": "NitroImage" - }, - "android": { - "androidNamespace": [ - "image" - ], - "androidCxxLibName": "NitroImage" - }, - "autolinking": { - "ImageFactory": { - "swift": "HybridImageFactory", - "kotlin": "HybridImageFactory" - }, - "ImageUtils": { - "swift": "HybridImageUtils", - "kotlin": "HybridImageUtils" - }, - "NitroImageView": { - "swift": "HybridImageView", - "kotlin": "HybridImageView" - } - }, - "ignorePaths": [ - "**/node_modules" - ] + "$schema": "https://nitro.margelo.com/nitro.schema.json", + "cxxNamespace": ["image"], + "ios": { + "iosModuleName": "NitroImage" + }, + "android": { + "androidNamespace": ["image"], + "androidCxxLibName": "NitroImage" + }, + "autolinking": { + "ImageFactory": { + "swift": "HybridImageFactory", + "kotlin": "HybridImageFactory" + }, + "ImageUtils": { + "swift": "HybridImageUtils", + "kotlin": "HybridImageUtils" + }, + "NitroImageView": { + "swift": "HybridImageView", + "kotlin": "HybridImageView" + } + }, + "ignorePaths": ["**/node_modules"] } diff --git a/nitrogen/generated/shared/json/NitroImageViewConfig.json b/nitrogen/generated/shared/json/NitroImageViewConfig.json index a8d904f1..af9a8b71 100644 --- a/nitrogen/generated/shared/json/NitroImageViewConfig.json +++ b/nitrogen/generated/shared/json/NitroImageViewConfig.json @@ -1,10 +1,10 @@ { - "uiViewClassName": "NitroImageView", - "supportsRawText": false, - "bubblingEventTypes": {}, - "directEventTypes": {}, - "validAttributes": { - "image": true, - "hybridRef": true - } + "uiViewClassName": "NitroImageView", + "supportsRawText": false, + "bubblingEventTypes": {}, + "directEventTypes": {}, + "validAttributes": { + "image": true, + "hybridRef": true + } } diff --git a/package.json b/package.json index 08f8cb47..f5e21caa 100644 --- a/package.json +++ b/package.json @@ -33,8 +33,8 @@ "postinstall": "tsc || exit 0;", "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", + "lint": "biome check . --fix", + "lint-ci": "biome check . --fix", "release": "release-it", "typescript": "tsc", "specs": "tsc && nitro-codegen --logLevel=\"debug\"" @@ -57,14 +57,10 @@ "registry": "https://registry.npmjs.org/" }, "devDependencies": { - "@react-native/eslint-config": "0.79.3", + "@biomejs/biome": "2.1.0", "@release-it/conventional-changelog": "^8.0.2", "@types/react": "^19.0.6", - "eslint": "^8.57.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-prettier": "^5.2.1", "nitro-codegen": "*", - "prettier": "^3.3.3", "react": "19.0.0", "react-native": "0.79.3", "react-native-nitro-modules": "^0.26.3", @@ -155,4 +151,4 @@ } } } -} +} \ No newline at end of file diff --git a/react-native.config.js b/react-native.config.js index 3fdf8eaa..58cfa919 100644 --- a/react-native.config.js +++ b/react-native.config.js @@ -1,16 +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: {}, - }, - }, -} + dependency: { + platforms: { + /** + * @type {import('@react-native-community/cli-types').IOSDependencyParams} + */ + ios: {}, + /** + * @type {import('@react-native-community/cli-types').AndroidDependencyParams} + */ + android: {}, + }, + }, +}; diff --git a/src/ImageFactory.ts b/src/ImageFactory.ts index dd68f0aa..c889aa93 100644 --- a/src/ImageFactory.ts +++ b/src/ImageFactory.ts @@ -1,10 +1,10 @@ -import { NitroModules } from 'react-native-nitro-modules' -import type { ImageFactory } from './specs/ImageFactory.nitro' +import { NitroModules } from "react-native-nitro-modules"; +import type { ImageFactory } from "./specs/ImageFactory.nitro"; /** * A factory for loading and creating `Image` instances. */ -const factory = NitroModules.createHybridObject('ImageFactory') +const factory = NitroModules.createHybridObject("ImageFactory"); /** * Asynchronously loads an {@linkcode Image} from the given {@linkcode url}. @@ -13,7 +13,7 @@ const factory = NitroModules.createHybridObject('ImageFactory') * @throws If the network request cannot be made. * @throws If the data at the given {@linkcode url} cannot be parsed as an {@linkcode Image}. */ -export const loadImageFromURLAsync = factory.loadFromURLAsync.bind(factory) +export const loadImageFromURLAsync = factory.loadFromURLAsync.bind(factory); /** * Synchronously loads an {@linkcode Image} from the given {@linkcode filePath}. @@ -21,14 +21,14 @@ export const loadImageFromURLAsync = factory.loadFromURLAsync.bind(factory) * @throws If the {@linkcode filePath} is invalid. * @throws If the data at the given {@linkcode filePath} cannot be parsed as an {@linkcode Image}. */ -export const loadImageFromFile = factory.loadFromFile.bind(factory) +export const loadImageFromFile = factory.loadFromFile.bind(factory); /** * Asynchronously loads an {@linkcode Image} from the given {@linkcode filePath}. * @param filePath The file path of the {@linkcode Image}. Must contain a file extension. * @throws If the {@linkcode filePath} is invalid. * @throws If the data at the given {@linkcode filePath} cannot be parsed as an {@linkcode Image}. */ -export const loadImageFromFileAsync = factory.loadFromFileAsync.bind(factory) +export const loadImageFromFileAsync = factory.loadFromFileAsync.bind(factory); /** * Synchronously loads an {@linkcode Image} from the given resource-/system-name. @@ -36,7 +36,7 @@ export const loadImageFromFileAsync = factory.loadFromFileAsync.bind(factory) * @throws If no {@linkcode Image} exists under the given {@linkcode name}. * @throws If the file under the given {@linkcode name} cannot be parsed as an {@linkcode Image}. */ -export const loadImageFromResources = factory.loadFromResources.bind(factory) +export const loadImageFromResources = factory.loadFromResources.bind(factory); /** * Asynchronously loads an {@linkcode Image} from the given resource-/system-name. * @param name The resource-/system-name of the image to load. @@ -44,7 +44,7 @@ export const loadImageFromResources = factory.loadFromResources.bind(factory) * @throws If the file under the given {@linkcode name} cannot be parsed as an {@linkcode Image}. */ export const loadImageFromResourcesAsync = - factory.loadFromResourcesAsync.bind(factory) + factory.loadFromResourcesAsync.bind(factory); /** * Synchronously loads an {@linkcode Image} from the given symbol name. @@ -53,7 +53,7 @@ export const loadImageFromResourcesAsync = * @throws If no {@linkcode Image} symbol exists under the given {@linkcode symbolName}. * @platform iOS 13 */ -export const loadImageFromSymbol = factory.loadFromSymbol.bind(factory) +export const loadImageFromSymbol = factory.loadFromSymbol.bind(factory); /** * Synchronously convert the given given {@linkcode ArrayBuffer} to an {@linkcode Image}. @@ -61,14 +61,14 @@ export const loadImageFromSymbol = factory.loadFromSymbol.bind(factory) * @throws If the given {@linkcode ArrayBuffer} is not a valid representation of an {@linkcode Image}. */ export const loadImageFromArrayBuffer = - factory.loadFromArrayBuffer.bind(factory) + factory.loadFromArrayBuffer.bind(factory); /** * Asynchronously convert the given given {@linkcode ArrayBuffer} to an {@linkcode Image}. * @param buffer * @throws If the given {@linkcode ArrayBuffer} is not a valid representation of an {@linkcode Image}. */ export const loadImageFromArrayBufferAsync = - factory.loadFromArrayBufferAsync.bind(factory) + factory.loadFromArrayBufferAsync.bind(factory); /** * Synchronously decodes the given {@linkcode thumbhash} to an {@linkcode Image}. @@ -76,7 +76,7 @@ export const loadImageFromArrayBufferAsync = * @throws If the given {@linkcode thumbhash} is not a valid ThumbHash. * @note If your thumbhash is a base64 string, use `thumbHashFromBase64String(...)` */ -export const loadImageFromThumbHash = factory.loadFromThumbHash.bind(factory) +export const loadImageFromThumbHash = factory.loadFromThumbHash.bind(factory); /** * Asynchronously decodes the given {@linkcode thumbhash} to an {@linkcode Image}. @@ -85,4 +85,4 @@ export const loadImageFromThumbHash = factory.loadFromThumbHash.bind(factory) * @note If your thumbhash is a base64 string, use `thumbHashFromBase64String(...)` */ export const loadImageFromThumbHashAsync = - factory.loadFromThumbHashAsync.bind(factory) + factory.loadFromThumbHashAsync.bind(factory); diff --git a/src/ImageUtils.ts b/src/ImageUtils.ts index 22c4fdfd..a393bd1b 100644 --- a/src/ImageUtils.ts +++ b/src/ImageUtils.ts @@ -1,9 +1,10 @@ -import { NitroModules } from 'react-native-nitro-modules' -import type { ImageUtils } from './specs/ImageUtils.nitro' +import { NitroModules } from "react-native-nitro-modules"; +import type { ImageUtils } from "./specs/ImageUtils.nitro"; -const utils = NitroModules.createHybridObject('ImageUtils') +const utils = NitroModules.createHybridObject("ImageUtils"); -export const thumbHashToBase64String = utils.thumbHashToBase64String.bind(utils) +export const thumbHashToBase64String = + utils.thumbHashToBase64String.bind(utils); export const thumbHashFromBase64String = - utils.thumbhashFromBase64String.bind(utils) + utils.thumbhashFromBase64String.bind(utils); diff --git a/src/NitroImage.tsx b/src/NitroImage.tsx index d1642581..3c01adeb 100644 --- a/src/NitroImage.tsx +++ b/src/NitroImage.tsx @@ -1,14 +1,14 @@ -import { getHostComponent } from 'react-native-nitro-modules' +import { getHostComponent } from "react-native-nitro-modules"; +import ViewConfig from "../nitrogen/generated/shared/json/NitroImageViewConfig.json"; import type { - NitroImageViewMethods, - NitroImageViewProps, -} from './specs/ImageView.nitro' -import ViewConfig from '../nitrogen/generated/shared/json/NitroImageViewConfig.json' + NitroImageViewMethods, + NitroImageViewProps, +} from "./specs/ImageView.nitro"; /** * The renderable `` view. */ export const NitroImage = getHostComponent< - NitroImageViewProps, - NitroImageViewMethods ->('NitroImageView', () => ViewConfig) + NitroImageViewProps, + NitroImageViewMethods +>("NitroImageView", () => ViewConfig); diff --git a/src/NitroWebImage.tsx b/src/NitroWebImage.tsx index a4056b4c..25cbd978 100644 --- a/src/NitroWebImage.tsx +++ b/src/NitroWebImage.tsx @@ -1,26 +1,27 @@ -import React, { useMemo } from 'react' -import type { AsyncImageLoadOptions } from './specs/ImageFactory.nitro' -import { useWebImage } from './useWebImage' -import { NitroImage } from './NitroImage' -import type { NitroImageViewProps } from './specs/ImageView.nitro' -import type { Image } from './specs/Image.nitro' -import { loadImageFromThumbHash } from './ImageFactory' -import { thumbHashFromBase64String } from './ImageUtils' +import type React from "react"; +import { useMemo } from "react"; +import { loadImageFromThumbHash } from "./ImageFactory"; +import { thumbHashFromBase64String } from "./ImageUtils"; +import { NitroImage } from "./NitroImage"; +import type { Image } from "./specs/Image.nitro"; +import type { AsyncImageLoadOptions } from "./specs/ImageFactory.nitro"; +import type { NitroImageViewProps } from "./specs/ImageView.nitro"; +import { useWebImage } from "./useWebImage"; interface ImagePlaceholder { - image: Image + image: Image; } interface ThumbHashPlaceholder { - thumbHash: ArrayBuffer | string + thumbHash: ArrayBuffer | string; } interface ViewPlaceholder { - view: React.ReactElement + view: React.ReactElement; } -export interface NitroWebImageProps extends Omit { - url: string - options?: AsyncImageLoadOptions - placeholder?: ImagePlaceholder | ThumbHashPlaceholder | ViewPlaceholder +export interface NitroWebImageProps extends Omit { + url: string; + options?: AsyncImageLoadOptions; + placeholder?: ImagePlaceholder | ThumbHashPlaceholder | ViewPlaceholder; } /** @@ -30,52 +31,52 @@ export interface NitroWebImageProps extends Omit { * As soon as this image is mounted, it will begin loading the image from the given URL. */ export function NitroWebImage({ - url, - options, - placeholder, - ...props + url, + options, + placeholder, + ...props }: NitroWebImageProps) { - const image = useWebImage(url, options) - const placeholderImage = useMemo(() => { - if (placeholder == null) { - // We don't have a placeholder - return undefined - } else if ('image' in placeholder) { - // We have an in-memory Image as a placeholder - return placeholder.image - } else if ('thumbHash' in placeholder) { - // We have a thumbHash as a placeholder - let thumbHash = placeholder.thumbHash - if (typeof thumbHash === 'string') { - // It's a base64 string - convert to ArrayBuffer first - thumbHash = thumbHashFromBase64String(thumbHash) - } - return loadImageFromThumbHash(thumbHash) - } else { - // Unknown placeholder... - return undefined - } - }, [placeholder]) + const image = useWebImage(url, options); + const placeholderImage = useMemo(() => { + if (placeholder == null) { + // We don't have a placeholder + return undefined; + } else if ("image" in placeholder) { + // We have an in-memory Image as a placeholder + return placeholder.image; + } else if ("thumbHash" in placeholder) { + // We have a thumbHash as a placeholder + let thumbHash = placeholder.thumbHash; + if (typeof thumbHash === "string") { + // It's a base64 string - convert to ArrayBuffer first + thumbHash = thumbHashFromBase64String(thumbHash); + } + return loadImageFromThumbHash(thumbHash); + } else { + // Unknown placeholder... + return undefined; + } + }, [placeholder]); - if (image == null) { - // It's still loading - if (placeholder == null) { - // No placeholder was specified by the user - return null - } else if (placeholderImage != null) { - // We have a placeholder image (thumbhash?) - return - } else if ('view' in placeholder) { - // We have a custom view as a placeholder - return placeholder.view - } else { - // This should never be reached - throw new Error( - `An unsupported placeholder was specified! ${placeholder}` - ) - } - } else { - // It finished loading! Lets go - return - } + if (image == null) { + // It's still loading + if (placeholder == null) { + // No placeholder was specified by the user + return null; + } else if (placeholderImage != null) { + // We have a placeholder image (thumbhash?) + return ; + } else if ("view" in placeholder) { + // We have a custom view as a placeholder + return placeholder.view; + } else { + // This should never be reached + throw new Error( + `An unsupported placeholder was specified! ${placeholder}`, + ); + } + } else { + // It finished loading! Lets go + return ; + } } diff --git a/src/index.ts b/src/index.ts index 4626d48c..fdf21595 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,22 +1,20 @@ /** * The core `Image` type from Nitro Image. */ -export type { Image } from './specs/Image.nitro' /** * All the methods to create `Image` types */ -export * from './ImageFactory' - -export { NitroImage } from './NitroImage' -export { NitroWebImage } from './NitroWebImage' - +export * from "./ImageFactory"; /** - * The `useWebImage` hook + * All the utils for Images, like ThumbHash <> String conversion */ -export { useWebImage } from './useWebImage' +export * from "./ImageUtils"; +export { NitroImage } from "./NitroImage"; +export { NitroWebImage } from "./NitroWebImage"; +export type { Image } from "./specs/Image.nitro"; /** - * All the utils for Images, like ThumbHash <> String conversion + * The `useWebImage` hook */ -export * from './ImageUtils' +export { useWebImage } from "./useWebImage"; diff --git a/src/specs/Image.nitro.ts b/src/specs/Image.nitro.ts index 47f3f350..faf385db 100644 --- a/src/specs/Image.nitro.ts +++ b/src/specs/Image.nitro.ts @@ -1,65 +1,65 @@ -import type { HybridObject } from 'react-native-nitro-modules' +import type { HybridObject } from "react-native-nitro-modules"; -export type ImageFormat = 'jpg' | 'png' +export type ImageFormat = "jpg" | "png"; export interface Image - extends HybridObject<{ ios: 'swift'; android: 'kotlin' }> { - readonly width: number - readonly height: number + extends HybridObject<{ ios: "swift"; android: "kotlin" }> { + readonly width: number; + readonly height: number; - /** - * Returns an array buffer containing the raw pixel data of the Image. - * Raw pixel data is always in `ARGB` format; - * ``` - * [ - * A1, R1, G1, B1, - * A2, R2, G2, B2, - * ... - * ] - * ``` - */ - toArrayBuffer(): ArrayBuffer - toArrayBufferAsync(): Promise + /** + * Returns an array buffer containing the raw pixel data of the Image. + * Raw pixel data is always in `ARGB` format; + * ``` + * [ + * A1, R1, G1, B1, + * A2, R2, G2, B2, + * ... + * ] + * ``` + */ + toArrayBuffer(): ArrayBuffer; + toArrayBufferAsync(): Promise; - /** - * Resizes this Image into a new image with the new given {@linkcode width} and {@linkcode height}. - */ - resize(width: number, height: number): Image - resizeAsync(width: number, height: number): Promise + /** + * Resizes this Image into a new image with the new given {@linkcode width} and {@linkcode height}. + */ + resize(width: number, height: number): Image; + resizeAsync(width: number, height: number): Promise; - /** - * Crops this Image into a new image starting from the source image's {@linkcode startX} and {@linkcode startY} coordinates, - * up until the source image's {@linkcode endX} and {@linkcode endY} coordinates. - */ - crop(startX: number, startY: number, endX: number, endY: number): Image - cropAsync( - startX: number, - startY: number, - endX: number, - endY: number - ): Promise + /** + * Crops this Image into a new image starting from the source image's {@linkcode startX} and {@linkcode startY} coordinates, + * up until the source image's {@linkcode endX} and {@linkcode endY} coordinates. + */ + crop(startX: number, startY: number, endX: number, endY: number): Image; + cropAsync( + startX: number, + startY: number, + endX: number, + endY: number, + ): Promise; - /** - * Saves this image in the given {@linkcode ImageFormat} to the given {@linkcode path}. - */ - saveToFileAsync( - path: string, - format: ImageFormat, - quality: number - ): Promise - /** - * Saves this image in the given {@linkcode ImageFormat} to a temporary file, and return it's path. - */ - saveToTemporaryFileAsync( - format: ImageFormat, - quality: number - ): Promise + /** + * Saves this image in the given {@linkcode ImageFormat} to the given {@linkcode path}. + */ + saveToFileAsync( + path: string, + format: ImageFormat, + quality: number, + ): Promise; + /** + * Saves this image in the given {@linkcode ImageFormat} to a temporary file, and return it's path. + */ + saveToTemporaryFileAsync( + format: ImageFormat, + 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. - */ - toThumbHash(): ArrayBuffer - toThumbHashAsync(): 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. + */ + toThumbHash(): ArrayBuffer; + toThumbHashAsync(): Promise; } diff --git a/src/specs/ImageFactory.nitro.ts b/src/specs/ImageFactory.nitro.ts index 6388be82..ba1fb37a 100644 --- a/src/specs/ImageFactory.nitro.ts +++ b/src/specs/ImageFactory.nitro.ts @@ -1,123 +1,126 @@ -import type { HybridObject } from 'react-native-nitro-modules' -import type { Image } from './Image.nitro' +import type { HybridObject } from "react-native-nitro-modules"; +import type { Image } from "./Image.nitro"; -export type AsyncImagePriority = 'low' | 'default' | 'high' +export type AsyncImagePriority = "low" | "default" | "high"; export interface AsyncImageLoadOptions { - /** - * Specifies the priority of the image download. - * @default 'default' - */ - priority?: AsyncImagePriority + /** + * Specifies the priority of the image download. + * @default 'default' + */ + priority?: AsyncImagePriority; - /** - * Forces a cache refresh even if the URL is changed. - * Use this if you cannot make your URLs static. - * @default false - */ - forceRefresh?: boolean + /** + * Forces a cache refresh even if the URL is changed. + * Use this if you cannot make your URLs static. + * @default false + */ + forceRefresh?: boolean; - /** - * Allows the Image download to continue even when the app is backgrounded. - * @default false - */ - continueInBackground?: boolean + /** + * Allows the Image download to continue even when the app is backgrounded. + * @default false + */ + continueInBackground?: boolean; - /** - * Enable to allow untrusted SSL certificates. - * @default false - */ - allowInvalidSSLCertificates?: boolean + /** + * Enable to allow untrusted SSL certificates. + * @default false + */ + allowInvalidSSLCertificates?: boolean; - /** - * Scales down larger images to respect the device's memory constraints (max. 60 MB, or 4096x4096) - * @default false - */ - scaleDownLargeImages?: boolean + /** + * Scales down larger images to respect the device's memory constraints (max. 60 MB, or 4096x4096) + * @default false + */ + scaleDownLargeImages?: boolean; - /** - * By default, cached images are queried from memory **asynchronously** to avoid UI lag. - * If this flag is enabled, images are queried **synchronously** from memory. - * @default false - */ - queryMemoryDataSync?: boolean - /** - * By default, cached images are queried from disk **asynchronously** to avoid UI lag. - * If this flag is enabled, images are queried **synchronously** from disk. - * @default false - */ - queryDiskDataSync?: boolean + /** + * By default, cached images are queried from memory **asynchronously** to avoid UI lag. + * If this flag is enabled, images are queried **synchronously** from memory. + * @default false + */ + queryMemoryDataSync?: boolean; + /** + * By default, cached images are queried from disk **asynchronously** to avoid UI lag. + * If this flag is enabled, images are queried **synchronously** from disk. + * @default false + */ + queryDiskDataSync?: boolean; - /** - * By default, images are decoded from binary data to actual image representations. - * Disabling this might speed up downloads, but could increase memory usage. - * @default true - */ - decodeImage?: boolean + /** + * By default, images are decoded from binary data to actual image representations. + * Disabling this might speed up downloads, but could increase memory usage. + * @default true + */ + decodeImage?: boolean; } export interface ImageFactory - extends HybridObject<{ ios: 'swift'; android: 'kotlin' }> { - /** - * Asynchronously loads an {@linkcode Image} from the given {@linkcode url}. - * @param url The URL of the {@linkcode Image}. Must start with `https://...` - * @throws If the {@linkcode url} is invalid. - * @throws If the network request cannot be made. - * @throws If the data at the given {@linkcode url} cannot be parsed as an {@linkcode Image}. - */ - loadFromURLAsync(url: string, options?: AsyncImageLoadOptions): Promise - /** - * Synchronously loads an {@linkcode Image} from the given {@linkcode filePath}. - * @param filePath The file path of the {@linkcode Image}. Must contain a file extension. - * @throws If the {@linkcode filePath} is invalid. - * @throws If the data at the given {@linkcode filePath} cannot be parsed as an {@linkcode Image}. - */ - loadFromFile(filePath: string): Image - /** - * Asynchronously loads an {@linkcode Image} from the given {@linkcode filePath}. - * @param filePath The file path of the {@linkcode Image}. Must contain a file extension. - * @throws If the {@linkcode filePath} is invalid. - * @throws If the data at the given {@linkcode filePath} cannot be parsed as an {@linkcode Image}. - */ - loadFromFileAsync(filePath: string): Promise + extends HybridObject<{ ios: "swift"; android: "kotlin" }> { + /** + * Asynchronously loads an {@linkcode Image} from the given {@linkcode url}. + * @param url The URL of the {@linkcode Image}. Must start with `https://...` + * @throws If the {@linkcode url} is invalid. + * @throws If the network request cannot be made. + * @throws If the data at the given {@linkcode url} cannot be parsed as an {@linkcode Image}. + */ + loadFromURLAsync( + url: string, + options?: AsyncImageLoadOptions, + ): Promise; + /** + * Synchronously loads an {@linkcode Image} from the given {@linkcode filePath}. + * @param filePath The file path of the {@linkcode Image}. Must contain a file extension. + * @throws If the {@linkcode filePath} is invalid. + * @throws If the data at the given {@linkcode filePath} cannot be parsed as an {@linkcode Image}. + */ + loadFromFile(filePath: string): Image; + /** + * Asynchronously loads an {@linkcode Image} from the given {@linkcode filePath}. + * @param filePath The file path of the {@linkcode Image}. Must contain a file extension. + * @throws If the {@linkcode filePath} is invalid. + * @throws If the data at the given {@linkcode filePath} cannot be parsed as an {@linkcode Image}. + */ + loadFromFileAsync(filePath: string): Promise; - /** - * Synchronously loads an {@linkcode Image} from the given resource-/system-name. - * @param name The resource-/system-name of the image to load. - * @throws If no {@linkcode Image} exists under the given {@linkcode name}. - * @throws If the file under the given {@linkcode name} cannot be parsed as an {@linkcode Image}. - */ - loadFromResources(name: string): Image - /** - * Asynchronously loads an {@linkcode Image} from the given resource-/system-name. - * @param name The resource-/system-name of the image to load. - * @throws If no {@linkcode Image} exists under the given {@linkcode name}. - * @throws If the file under the given {@linkcode name} cannot be parsed as an {@linkcode Image}. - */ - loadFromResourcesAsync(name: string): Promise + /** + * Synchronously loads an {@linkcode Image} from the given resource-/system-name. + * @param name The resource-/system-name of the image to load. + * @throws If no {@linkcode Image} exists under the given {@linkcode name}. + * @throws If the file under the given {@linkcode name} cannot be parsed as an {@linkcode Image}. + */ + loadFromResources(name: string): Image; + /** + * Asynchronously loads an {@linkcode Image} from the given resource-/system-name. + * @param name The resource-/system-name of the image to load. + * @throws If no {@linkcode Image} exists under the given {@linkcode name}. + * @throws If the file under the given {@linkcode name} cannot be parsed as an {@linkcode Image}. + */ + loadFromResourcesAsync(name: string): Promise; - /** - * Synchronously loads an {@linkcode Image} from the given symbol name. - * This is iOS only! - * @param symbolName The symbol name of the image to load. On iOS, this is the SF Symbols Name. - * @throws If no {@linkcode Image} symbol exists under the given {@linkcode symbolName}. - * @platform iOS 13 - */ - loadFromSymbol(symbolName: string): Image + /** + * Synchronously loads an {@linkcode Image} from the given symbol name. + * This is iOS only! + * @param symbolName The symbol name of the image to load. On iOS, this is the SF Symbols Name. + * @throws If no {@linkcode Image} symbol exists under the given {@linkcode symbolName}. + * @platform iOS 13 + */ + loadFromSymbol(symbolName: string): Image; - /** - * Synchronously convert the given given {@linkcode ArrayBuffer} to an {@linkcode Image}. - * @param buffer - * @throws If the given {@linkcode ArrayBuffer} is not a valid representation of an {@linkcode Image}. - */ - loadFromArrayBuffer(buffer: ArrayBuffer): Image - /** - * Asynchronously convert the given given {@linkcode ArrayBuffer} to an {@linkcode Image}. - * @param buffer - * @throws If the given {@linkcode ArrayBuffer} is not a valid representation of an {@linkcode Image}. - */ - loadFromArrayBufferAsync(buffer: ArrayBuffer): Promise + /** + * Synchronously convert the given given {@linkcode ArrayBuffer} to an {@linkcode Image}. + * @param buffer + * @throws If the given {@linkcode ArrayBuffer} is not a valid representation of an {@linkcode Image}. + */ + loadFromArrayBuffer(buffer: ArrayBuffer): Image; + /** + * Asynchronously convert the given given {@linkcode ArrayBuffer} to an {@linkcode Image}. + * @param buffer + * @throws If the given {@linkcode ArrayBuffer} is not a valid representation of an {@linkcode Image}. + */ + loadFromArrayBufferAsync(buffer: ArrayBuffer): Promise; - loadFromThumbHash(thumbhash: ArrayBuffer): Image - loadFromThumbHashAsync(thumbhash: ArrayBuffer): Promise + loadFromThumbHash(thumbhash: ArrayBuffer): Image; + loadFromThumbHashAsync(thumbhash: ArrayBuffer): Promise; } diff --git a/src/specs/ImageUtils.nitro.ts b/src/specs/ImageUtils.nitro.ts index 88a29b09..4f0019c3 100644 --- a/src/specs/ImageUtils.nitro.ts +++ b/src/specs/ImageUtils.nitro.ts @@ -1,7 +1,7 @@ -import type { HybridObject } from 'react-native-nitro-modules' +import type { HybridObject } from "react-native-nitro-modules"; export interface ImageUtils - extends HybridObject<{ ios: 'swift'; android: 'kotlin' }> { - thumbHashToBase64String(thumbhash: ArrayBuffer): string - thumbhashFromBase64String(thumbhashBase64: string): ArrayBuffer + extends HybridObject<{ ios: "swift"; android: "kotlin" }> { + thumbHashToBase64String(thumbhash: ArrayBuffer): string; + thumbhashFromBase64String(thumbhashBase64: string): ArrayBuffer; } diff --git a/src/specs/ImageView.nitro.ts b/src/specs/ImageView.nitro.ts index bfddd951..52364c4a 100644 --- a/src/specs/ImageView.nitro.ts +++ b/src/specs/ImageView.nitro.ts @@ -1,19 +1,19 @@ import type { - HybridView, - HybridViewMethods, - HybridViewProps, -} from 'react-native-nitro-modules' -import type { Image } from './Image.nitro' + HybridView, + HybridViewMethods, + HybridViewProps, +} from "react-native-nitro-modules"; +import type { Image } from "./Image.nitro"; export interface NitroImageViewProps extends HybridViewProps { - image?: Image + image?: Image; } export interface NitroImageViewMethods extends HybridViewMethods { - // no methods + // no methods } export type NitroImageView = HybridView< - NitroImageViewProps, - NitroImageViewMethods -> + NitroImageViewProps, + NitroImageViewMethods +>; diff --git a/src/useWebImage.ts b/src/useWebImage.ts index 06cd6425..a8e652a0 100644 --- a/src/useWebImage.ts +++ b/src/useWebImage.ts @@ -1,31 +1,30 @@ -import { loadImageFromURLAsync } from './ImageFactory' -import type { Image } from './specs/Image.nitro' -import { useEffect, useState } from 'react' -import type { AsyncImageLoadOptions } from './specs/ImageFactory.nitro' +import { useEffect, useState } from "react"; +import { loadImageFromURLAsync } from "./ImageFactory"; +import type { Image } from "./specs/Image.nitro"; +import type { AsyncImageLoadOptions } from "./specs/ImageFactory.nitro"; /** * A convenience hook to load a remote image from the given {@linkcode url}. */ export function useWebImage( - url: string, - options?: AsyncImageLoadOptions + url: string, + options?: AsyncImageLoadOptions, ): Image | undefined { - const [image, setImage] = useState(undefined) + const [image, setImage] = useState(undefined); - useEffect(() => { - const load = async () => { - try { - const i = await loadImageFromURLAsync(url, options) - setImage(i) - } catch (error) { - console.error(`Failed to load image from "${url}"!`, error) - setImage(undefined) - } - } - load() - // `options` is missing from dependencies since it's a reference type that will be constructed each render. - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [url]) + // biome-ignore lint/correctness/useExhaustiveDependencies: `options` is missing from dependencies since it's a reference type that will be constructed each render. + useEffect(() => { + const load = async () => { + try { + const i = await loadImageFromURLAsync(url, options); + setImage(i); + } catch (error) { + console.error(`Failed to load image from "${url}"!`, error); + setImage(undefined); + } + }; + load(); + }, [url]); - return image + return image; } diff --git a/tsconfig.json b/tsconfig.json index d0416023..bc358cde 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,31 +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 - } + "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 + } } From f260a63818a80db9039f3f880d30915531ee76ac Mon Sep 17 00:00:00 2001 From: bglgwyng Date: Wed, 9 Jul 2025 20:45:36 +0900 Subject: [PATCH 02/15] chore: update JSX config and remove unnecessary React imports --- example/src/App.tsx | 1 - src/NitroWebImage.tsx | 1 - tsconfig.json | 2 +- 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/example/src/App.tsx b/example/src/App.tsx index d282931e..c60900ac 100644 --- a/example/src/App.tsx +++ b/example/src/App.tsx @@ -7,7 +7,6 @@ import { createBottomTabNavigator } from "@react-navigation/bottom-tabs"; import { createStaticNavigation } from "@react-navigation/native"; -import type React from "react"; import { EmptyTab } from "./EmptyTab"; import { FastImageTab } from "./FastImageTab"; import { NitroImageTab } from "./NitroImageTab"; diff --git a/src/NitroWebImage.tsx b/src/NitroWebImage.tsx index 25cbd978..a8127825 100644 --- a/src/NitroWebImage.tsx +++ b/src/NitroWebImage.tsx @@ -1,4 +1,3 @@ -import type React from "react"; import { useMemo } from "react"; import { loadImageFromThumbHash } from "./ImageFactory"; import { thumbHashFromBase64String } from "./ImageUtils"; diff --git a/tsconfig.json b/tsconfig.json index bc358cde..d04096e9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,7 +8,7 @@ "allowUnusedLabels": false, "esModuleInterop": true, "forceConsistentCasingInFileNames": true, - "jsx": "react", + "jsx": "react-jsx", "lib": ["esnext"], "module": "esnext", "moduleResolution": "node", From 432ab6f39dcf87ddd08bf758ec89fb99d2073785 Mon Sep 17 00:00:00 2001 From: bglgwyng Date: Wed, 9 Jul 2025 20:45:51 +0900 Subject: [PATCH 03/15] chore: exclude ios and android directories from biome linting --- biome.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/biome.json b/biome.json index e6897f50..9b0c0fb2 100644 --- a/biome.json +++ b/biome.json @@ -6,7 +6,8 @@ "useIgnoreFile": false }, "files": { - "ignoreUnknown": false + "ignoreUnknown": false, + "includes": ["!ios/**", "!android/**"] }, "formatter": { "enabled": true, From 0cec27cd1404da55f298147b1bd409b4331b8f71 Mon Sep 17 00:00:00 2001 From: bglgwyng Date: Sun, 13 Jul 2025 16:25:24 +0900 Subject: [PATCH 04/15] style: fix indentation in NitroImageViewConfig.json from tabs to spaces --- .../shared/json/NitroImageViewConfig.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/nitrogen/generated/shared/json/NitroImageViewConfig.json b/nitrogen/generated/shared/json/NitroImageViewConfig.json index af9a8b71..a8d904f1 100644 --- a/nitrogen/generated/shared/json/NitroImageViewConfig.json +++ b/nitrogen/generated/shared/json/NitroImageViewConfig.json @@ -1,10 +1,10 @@ { - "uiViewClassName": "NitroImageView", - "supportsRawText": false, - "bubblingEventTypes": {}, - "directEventTypes": {}, - "validAttributes": { - "image": true, - "hybridRef": true - } + "uiViewClassName": "NitroImageView", + "supportsRawText": false, + "bubblingEventTypes": {}, + "directEventTypes": {}, + "validAttributes": { + "image": true, + "hybridRef": true + } } From a292daf274117783d3de571731ae7ad4f9dabb55 Mon Sep 17 00:00:00 2001 From: bglgwyng Date: Sun, 13 Jul 2025 16:39:36 +0900 Subject: [PATCH 05/15] chore: upgrade Biome to 2.1.1 --- bun.lock | 38 +++++-- package.json | 306 +++++++++++++++++++++++++-------------------------- 2 files changed, 181 insertions(+), 163 deletions(-) diff --git a/bun.lock b/bun.lock index 9b45a91f..85af9534 100644 --- a/bun.lock +++ b/bun.lock @@ -4,7 +4,7 @@ "": { "name": "react-native-nitro-image", "devDependencies": { - "@biomejs/biome": "2.1.0", + "@biomejs/biome": "2.1.1", "@release-it/conventional-changelog": "^8.0.2", "@types/react": "^19.0.6", "nitro-codegen": "*", @@ -284,23 +284,23 @@ "@babel/types": ["@babel/types@7.27.6", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q=="], - "@biomejs/biome": ["@biomejs/biome@2.1.0", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.1.0", "@biomejs/cli-darwin-x64": "2.1.0", "@biomejs/cli-linux-arm64": "2.1.0", "@biomejs/cli-linux-arm64-musl": "2.1.0", "@biomejs/cli-linux-x64": "2.1.0", "@biomejs/cli-linux-x64-musl": "2.1.0", "@biomejs/cli-win32-arm64": "2.1.0", "@biomejs/cli-win32-x64": "2.1.0" }, "bin": { "biome": "bin/biome" } }, "sha512-K2UDr1dCiaOWegp4yQLMC4Evgl85ze1O7r+WxPeO7cNl0XrIcTshvdQGMDB23c/2afXz6RsOKYfWLErNbBbjmA=="], + "@biomejs/biome": ["@biomejs/biome@2.1.1", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.1.1", "@biomejs/cli-darwin-x64": "2.1.1", "@biomejs/cli-linux-arm64": "2.1.1", "@biomejs/cli-linux-arm64-musl": "2.1.1", "@biomejs/cli-linux-x64": "2.1.1", "@biomejs/cli-linux-x64-musl": "2.1.1", "@biomejs/cli-win32-arm64": "2.1.1", "@biomejs/cli-win32-x64": "2.1.1" }, "bin": { "biome": "bin/biome" } }, "sha512-HFGYkxG714KzG+8tvtXCJ1t1qXQMzgWzfvQaUjxN6UeKv+KvMEuliInnbZLJm6DXFXwqVi6446EGI0sGBLIYng=="], - "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.1.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RDXEUGSCvUx3PKWRt95WRtwH+l01slm7r2zaotDwWERn/RITMcdet21rI5q5cYhL4XJiAvLHG8qyLNSXqIOCwQ=="], + "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.1.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-2Muinu5ok4tWxq4nu5l19el48cwCY/vzvI7Vjbkf3CYIQkjxZLyj0Ad37Jv2OtlXYaLvv+Sfu1hFeXt/JwRRXQ=="], - "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.1.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-epLFRbMjYS/Cu9Kc5gM3wzUExsKj2Z0oxIiuxlI4ZterIqm19yvTOtJoqSec8gjUXOTNvPVoEIfSSXg37yepow=="], + "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.1.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-cC8HM5lrgKQXLAK+6Iz2FrYW5A62pAAX6KAnRlEyLb+Q3+Kr6ur/sSuoIacqlp1yvmjHJqjYfZjPvHWnqxoEIA=="], - "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.1.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-HZys1/TeIH5lagwtf9yKSO+gtA+cYMJW22ckDGuKt2xIvPu7VqgTNjJtTdRcetXe0+benlMMo+KFs3xL2b/2QA=="], + "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.1.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-tw4BEbhAUkWPe4WBr6IX04DJo+2jz5qpPzpW/SWvqMjb9QuHY8+J0M23V8EPY/zWU4IG8Ui0XESapR1CB49Q7g=="], - "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.1.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-J7z6s/M50wt5lhSkivAs2GJHPhiah3hkdg1LipM6wlK6cVC3YeIA/X6pgWBfjEwyfsFlpc3nRM+pQ17DI8FpDQ=="], + "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.1.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-/7FBLnTswu4jgV9ttI3AMIdDGqVEPIZd8I5u2D4tfCoj8rl9dnjrEQbAIDlWhUXdyWlFSz8JypH3swU9h9P+2A=="], - "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.1.0", "", { "os": "linux", "cpu": "x64" }, "sha512-nAVAP1ov/zcXMhNq3WCbYZmlU/YTF3ZT+LeXR1CEJnDgunPC/Srp7j1LWlrIx6wxNOCDOFow8fmyfC7c/BKLig=="], + "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.1.1", "", { "os": "linux", "cpu": "x64" }, "sha512-3WJ1GKjU7NzZb6RTbwLB59v9cTIlzjbiFLDB0z4376TkDqoNYilJaC37IomCr/aXwuU8QKkrYoHrgpSq5ffJ4Q=="], - "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.1.0", "", { "os": "linux", "cpu": "x64" }, "sha512-uj8felYcBeXh32kznnKrAQoZ9pLqta/6qvwLJ4AZtUmY6cSUUa5c+VLnFtxMfuhvps/M4D55VGnwSINOEblPQg=="], + "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.1.1", "", { "os": "linux", "cpu": "x64" }, "sha512-kUu+loNI3OCD2c12cUt7M5yaaSjDnGIksZwKnueubX6c/HWUyi/0mPbTBHR49Me3F0KKjWiKM+ZOjsmC+lUt9g=="], - "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.1.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-eGGqGs+8Q34n1zp/rEadFRKjzwFszpZ2+p6B1Dmi7dn1DNEYhNXoRWLcjyca+ZSTrdV7COx0scyjgF9Tg73kBw=="], + "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.1.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-vEHK0v0oW+E6RUWLoxb2isI3rZo57OX9ZNyyGH701fZPj6Il0Rn1f5DMNyCmyflMwTnIQstEbs7n2BxYSqQx4Q=="], - "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.1.0", "", { "os": "win32", "cpu": "x64" }, "sha512-pkp6jucyvE8DJSXXwSKs+Mxx1KXkMJ2d8GbBu4Lf0nAQHl40TZjjp1RuNEo9Z7NNXPQzbLACDtK6/vDalO2WRg=="], + "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.1.1", "", { "os": "win32", "cpu": "x64" }, "sha512-i2PKdn70kY++KEF/zkQFvQfX1e8SkA8hq4BgC+yE9dZqyLzB/XStY2MvwI3qswlRgnGpgncgqe0QYKVS1blksg=="], "@conventional-changelog/git-client": ["@conventional-changelog/git-client@1.0.1", "", { "dependencies": { "@types/semver": "^7.5.5", "semver": "^7.5.2" }, "peerDependencies": { "conventional-commits-filter": "^5.0.0", "conventional-commits-parser": "^6.0.0" }, "optionalPeers": ["conventional-commits-filter", "conventional-commits-parser"] }, "sha512-PJEqBwAleffCMETaVm/fUgHldzBE35JFk3/9LL6NUA5EXa3qednu+UT6M7E5iBu3zIQZCULYIiZ90fBYHt6xUw=="], @@ -1862,6 +1862,8 @@ "@ts-morph/common/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + "NitroImageExample/react-native-nitro-image/@biomejs/biome": ["@biomejs/biome@2.1.0", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.1.0", "@biomejs/cli-darwin-x64": "2.1.0", "@biomejs/cli-linux-arm64": "2.1.0", "@biomejs/cli-linux-arm64-musl": "2.1.0", "@biomejs/cli-linux-x64": "2.1.0", "@biomejs/cli-linux-x64-musl": "2.1.0", "@biomejs/cli-win32-arm64": "2.1.0", "@biomejs/cli-win32-x64": "2.1.0" }, "bin": { "biome": "bin/biome" } }, "sha512-K2UDr1dCiaOWegp4yQLMC4Evgl85ze1O7r+WxPeO7cNl0XrIcTshvdQGMDB23c/2afXz6RsOKYfWLErNbBbjmA=="], + "NitroImageExample/react-native-nitro-image/typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], "ansi-fragments/strip-ansi/ansi-regex": ["ansi-regex@4.1.1", "", {}, "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="], @@ -1974,6 +1976,22 @@ "@react-native-community/cli/execa/onetime/mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], + "NitroImageExample/react-native-nitro-image/@biomejs/biome/@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.1.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RDXEUGSCvUx3PKWRt95WRtwH+l01slm7r2zaotDwWERn/RITMcdet21rI5q5cYhL4XJiAvLHG8qyLNSXqIOCwQ=="], + + "NitroImageExample/react-native-nitro-image/@biomejs/biome/@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.1.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-epLFRbMjYS/Cu9Kc5gM3wzUExsKj2Z0oxIiuxlI4ZterIqm19yvTOtJoqSec8gjUXOTNvPVoEIfSSXg37yepow=="], + + "NitroImageExample/react-native-nitro-image/@biomejs/biome/@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.1.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-HZys1/TeIH5lagwtf9yKSO+gtA+cYMJW22ckDGuKt2xIvPu7VqgTNjJtTdRcetXe0+benlMMo+KFs3xL2b/2QA=="], + + "NitroImageExample/react-native-nitro-image/@biomejs/biome/@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.1.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-J7z6s/M50wt5lhSkivAs2GJHPhiah3hkdg1LipM6wlK6cVC3YeIA/X6pgWBfjEwyfsFlpc3nRM+pQ17DI8FpDQ=="], + + "NitroImageExample/react-native-nitro-image/@biomejs/biome/@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.1.0", "", { "os": "linux", "cpu": "x64" }, "sha512-nAVAP1ov/zcXMhNq3WCbYZmlU/YTF3ZT+LeXR1CEJnDgunPC/Srp7j1LWlrIx6wxNOCDOFow8fmyfC7c/BKLig=="], + + "NitroImageExample/react-native-nitro-image/@biomejs/biome/@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.1.0", "", { "os": "linux", "cpu": "x64" }, "sha512-uj8felYcBeXh32kznnKrAQoZ9pLqta/6qvwLJ4AZtUmY6cSUUa5c+VLnFtxMfuhvps/M4D55VGnwSINOEblPQg=="], + + "NitroImageExample/react-native-nitro-image/@biomejs/biome/@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.1.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-eGGqGs+8Q34n1zp/rEadFRKjzwFszpZ2+p6B1Dmi7dn1DNEYhNXoRWLcjyca+ZSTrdV7COx0scyjgF9Tg73kBw=="], + + "NitroImageExample/react-native-nitro-image/@biomejs/biome/@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.1.0", "", { "os": "win32", "cpu": "x64" }, "sha512-pkp6jucyvE8DJSXXwSKs+Mxx1KXkMJ2d8GbBu4Lf0nAQHl40TZjjp1RuNEo9Z7NNXPQzbLACDtK6/vDalO2WRg=="], + "boxen/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], "boxen/wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], diff --git a/package.json b/package.json index f5e21caa..f48d697e 100644 --- a/package.json +++ b/package.json @@ -1,154 +1,154 @@ { - "name": "react-native-nitro-image", - "version": "0.4.0", - "description": "react-native-nitro-image", - "main": "lib/index", - "module": "lib/index", - "types": "lib/index.d.ts", - "react-native": "src/index", - "source": "src/index", - "workspaces": [ - "example" - ], - "files": [ - "src", - "react-native.config.js", - "lib", - "nitrogen", - "android/build.gradle", - "android/gradle.properties", - "android/CMakeLists.txt", - "android/src", - "ios/**/*.h", - "ios/**/*.m", - "ios/**/*.mm", - "ios/**/*.cpp", - "ios/**/*.swift", - "app.plugin.js", - "nitro.json", - "*.podspec", - "README.md" - ], - "scripts": { - "postinstall": "tsc || exit 0;", - "typecheck": "tsc --noEmit", - "clean": "rm -rf android/build node_modules/**/android/build lib", - "lint": "biome check . --fix", - "lint-ci": "biome check . --fix", - "release": "release-it", - "typescript": "tsc", - "specs": "tsc && nitro-codegen --logLevel=\"debug\"" - }, - "keywords": [ - "react-native", - "nitro" - ], - "repository": { - "type": "git", - "url": "git+https://github.com/mrousavy/react-native-nitro-image.git" - }, - "author": "Marc Rousavy (https://github.com/mrousavy)", - "license": "MIT", - "bugs": { - "url": "https://github.com/mrousavy/react-native-nitro-image/issues" - }, - "homepage": "https://github.com/mrousavy/react-native-nitro-image#readme", - "publishConfig": { - "registry": "https://registry.npmjs.org/" - }, - "devDependencies": { - "@biomejs/biome": "2.1.0", - "@release-it/conventional-changelog": "^8.0.2", - "@types/react": "^19.0.6", - "nitro-codegen": "*", - "react": "19.0.0", - "react-native": "0.79.3", - "react-native-nitro-modules": "^0.26.3", - "release-it": "^17.10.0", - "typescript": "^5.5.4" - }, - "peerDependencies": { - "react": "*", - "react-native": "*", - "react-native-nitro-modules": "*" - }, - "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 - }, - "release-it": { - "npm": { - "publish": true - }, - "git": { - "commitMessage": "chore: release ${version}", - "tagName": "v${version}", - "requireCleanWorkingDir": true - }, - "github": { - "release": true - }, - "hooks": { - "before:release": "bun i && bun typescript" - }, - "plugins": { - "@release-it/conventional-changelog": { - "preset": { - "name": "conventionalcommits", - "types": [ - { - "type": "feat", - "section": "✨ Features" - }, - { - "type": "perf", - "section": "💨 Performance Improvements" - }, - { - "type": "fix", - "section": "🐛 Bug Fixes" - }, - { - "type": "chore(deps)", - "section": "🛠️ Dependency Upgrades" - }, - { - "type": "docs", - "section": "📚 Documentation" - } - ] - } - } - } - } -} \ No newline at end of file + "name": "react-native-nitro-image", + "version": "0.4.0", + "description": "react-native-nitro-image", + "main": "lib/index", + "module": "lib/index", + "types": "lib/index.d.ts", + "react-native": "src/index", + "source": "src/index", + "workspaces": [ + "example" + ], + "files": [ + "src", + "react-native.config.js", + "lib", + "nitrogen", + "android/build.gradle", + "android/gradle.properties", + "android/CMakeLists.txt", + "android/src", + "ios/**/*.h", + "ios/**/*.m", + "ios/**/*.mm", + "ios/**/*.cpp", + "ios/**/*.swift", + "app.plugin.js", + "nitro.json", + "*.podspec", + "README.md" + ], + "scripts": { + "postinstall": "tsc || exit 0;", + "typecheck": "tsc --noEmit", + "clean": "rm -rf android/build node_modules/**/android/build lib", + "lint": "biome check . --fix", + "lint-ci": "biome lint .", + "release": "release-it", + "typescript": "tsc", + "specs": "tsc && nitro-codegen --logLevel=\"debug\"" + }, + "keywords": [ + "react-native", + "nitro" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/mrousavy/react-native-nitro-image.git" + }, + "author": "Marc Rousavy (https://github.com/mrousavy)", + "license": "MIT", + "bugs": { + "url": "https://github.com/mrousavy/react-native-nitro-image/issues" + }, + "homepage": "https://github.com/mrousavy/react-native-nitro-image#readme", + "publishConfig": { + "registry": "https://registry.npmjs.org/" + }, + "devDependencies": { + "@biomejs/biome": "2.1.1", + "@release-it/conventional-changelog": "^8.0.2", + "@types/react": "^19.0.6", + "nitro-codegen": "*", + "react": "19.0.0", + "react-native": "0.79.3", + "react-native-nitro-modules": "^0.26.3", + "release-it": "^17.10.0", + "typescript": "^5.5.4" + }, + "peerDependencies": { + "react": "*", + "react-native": "*", + "react-native-nitro-modules": "*" + }, + "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 + }, + "release-it": { + "npm": { + "publish": true + }, + "git": { + "commitMessage": "chore: release ${version}", + "tagName": "v${version}", + "requireCleanWorkingDir": true + }, + "github": { + "release": true + }, + "hooks": { + "before:release": "bun i && bun typescript" + }, + "plugins": { + "@release-it/conventional-changelog": { + "preset": { + "name": "conventionalcommits", + "types": [ + { + "type": "feat", + "section": "✨ Features" + }, + { + "type": "perf", + "section": "💨 Performance Improvements" + }, + { + "type": "fix", + "section": "🐛 Bug Fixes" + }, + { + "type": "chore(deps)", + "section": "🛠️ Dependency Upgrades" + }, + { + "type": "docs", + "section": "📚 Documentation" + } + ] + } + } + } + } +} From d38109f3832ca9c35919611927567c6a68e4ce2c Mon Sep 17 00:00:00 2001 From: bglgwyng Date: Sun, 13 Jul 2025 16:40:28 +0900 Subject: [PATCH 06/15] ci: update Biome configuration files --- biome.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/biome.json b/biome.json index 9b0c0fb2..ac781b6f 100644 --- a/biome.json +++ b/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/2.1.0/schema.json", + "$schema": "https://biomejs.dev/schemas/2.1.1/schema.json", "vcs": { "enabled": false, "clientKind": "git", @@ -7,7 +7,7 @@ }, "files": { "ignoreUnknown": false, - "includes": ["!ios/**", "!android/**"] + "includes": ["**", "!**/ios/**", "!**/android/**"] }, "formatter": { "enabled": true, From eedad146703db3b190247e2701cfc758f97bbf04 Mon Sep 17 00:00:00 2001 From: bglgwyng Date: Sun, 13 Jul 2025 16:40:49 +0900 Subject: [PATCH 07/15] style: format NitroImageViewConfig.json indentation with tabs --- .../shared/json/NitroImageViewConfig.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/nitrogen/generated/shared/json/NitroImageViewConfig.json b/nitrogen/generated/shared/json/NitroImageViewConfig.json index a8d904f1..af9a8b71 100644 --- a/nitrogen/generated/shared/json/NitroImageViewConfig.json +++ b/nitrogen/generated/shared/json/NitroImageViewConfig.json @@ -1,10 +1,10 @@ { - "uiViewClassName": "NitroImageView", - "supportsRawText": false, - "bubblingEventTypes": {}, - "directEventTypes": {}, - "validAttributes": { - "image": true, - "hybridRef": true - } + "uiViewClassName": "NitroImageView", + "supportsRawText": false, + "bubblingEventTypes": {}, + "directEventTypes": {}, + "validAttributes": { + "image": true, + "hybridRef": true + } } From 1f5fc665d46f9082447fb2c8f80a181d2443c39e Mon Sep 17 00:00:00 2001 From: bglgwyng Date: Sun, 13 Jul 2025 16:41:19 +0900 Subject: [PATCH 08/15] fix: update lint-ci script to use biome check instead of biome lint --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f48d697e..12488d51 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "typecheck": "tsc --noEmit", "clean": "rm -rf android/build node_modules/**/android/build lib", "lint": "biome check . --fix", - "lint-ci": "biome lint .", + "lint-ci": "biome check .", "release": "release-it", "typescript": "tsc", "specs": "tsc && nitro-codegen --logLevel=\"debug\"" From 7c6b0692b3641f4e883d3f26088f6725f5612ee5 Mon Sep 17 00:00:00 2001 From: bglgwyng Date: Sun, 13 Jul 2025 16:42:35 +0900 Subject: [PATCH 09/15] ci: add GitHub Actions workflow for Biome linting --- .github/workflows/lint.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .github/workflows/lint.yml diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 00000000..92311911 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,28 @@ +name: Lint with Biome + +on: + push: + branches: + - main + pull_request: + branches: + - main + workflow_dispatch: + +jobs: + lint: + name: Run Biome Linter + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + + - name: Install dependencies + run: bun install + + - name: Run Biome + run: bun lint-ci + env: + CI: true From 021d78d8ad6b9b95f0c066130bc1b362d49eead9 Mon Sep 17 00:00:00 2001 From: bglgwyng Date: Sun, 13 Jul 2025 17:10:51 +0900 Subject: [PATCH 10/15] chore: exclude 'lib' directory from biome linting and formatting --- biome.json | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/biome.json b/biome.json index ac781b6f..8674d3d4 100644 --- a/biome.json +++ b/biome.json @@ -7,7 +7,12 @@ }, "files": { "ignoreUnknown": false, - "includes": ["**", "!**/ios/**", "!**/android/**"] + "includes": [ + "**", + "!lib/**", + "!**/ios/**", + "!**/android/**" + ] }, "formatter": { "enabled": true, @@ -32,4 +37,4 @@ } } } -} +} \ No newline at end of file From 5897d19505e484498baadf7fda07c0e7f3c31fb3 Mon Sep 17 00:00:00 2001 From: bglgwyng Date: Sun, 13 Jul 2025 17:11:35 +0900 Subject: [PATCH 11/15] style: format array syntax in biome.json configuration --- biome.json | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/biome.json b/biome.json index 8674d3d4..4d9c41cc 100644 --- a/biome.json +++ b/biome.json @@ -7,12 +7,7 @@ }, "files": { "ignoreUnknown": false, - "includes": [ - "**", - "!lib/**", - "!**/ios/**", - "!**/android/**" - ] + "includes": ["**", "!lib/**", "!**/ios/**", "!**/android/**"] }, "formatter": { "enabled": true, @@ -37,4 +32,4 @@ } } } -} \ No newline at end of file +} From 0884711b6ca2e47d593d56590c1ead6d9d2eb809 Mon Sep 17 00:00:00 2001 From: bglgwyng Date: Tue, 15 Jul 2025 09:58:34 +0900 Subject: [PATCH 12/15] style: convert all indentation from tabs to 4 spaces --- babel.config.js | 2 +- biome.json | 67 ++-- example/app.json | 4 +- example/babel.config.js | 2 +- example/metro.config.js | 18 +- example/package.json | 74 ++--- example/src/App.tsx | 14 +- example/src/EmptyTab.tsx | 30 +- example/src/FastImageTab.tsx | 36 +-- example/src/NitroImageTab.tsx | 36 +-- example/src/createImageURLs.ts | 10 +- example/tsconfig.json | 2 +- nitro.json | 48 +-- .../shared/json/NitroImageViewConfig.json | 16 +- package.json | 304 +++++++++--------- react-native.config.js | 24 +- src/ImageFactory.ts | 8 +- src/ImageUtils.ts | 4 +- src/NitroImage.tsx | 8 +- src/NitroWebImage.tsx | 104 +++--- src/specs/Image.nitro.ts | 108 +++---- src/specs/ImageFactory.nitro.ts | 212 ++++++------ src/specs/ImageUtils.nitro.ts | 6 +- src/specs/ImageView.nitro.ts | 14 +- src/useWebImage.ts | 34 +- tsconfig.json | 54 ++-- 26 files changed, 621 insertions(+), 618 deletions(-) diff --git a/babel.config.js b/babel.config.js index 30526a88..f8228843 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,3 +1,3 @@ module.exports = { - presets: ["module:@react-native/babel-preset"], + presets: ["module:@react-native/babel-preset"], }; diff --git a/biome.json b/biome.json index 4d9c41cc..fc75d2e4 100644 --- a/biome.json +++ b/biome.json @@ -1,35 +1,36 @@ { - "$schema": "https://biomejs.dev/schemas/2.1.1/schema.json", - "vcs": { - "enabled": false, - "clientKind": "git", - "useIgnoreFile": false - }, - "files": { - "ignoreUnknown": false, - "includes": ["**", "!lib/**", "!**/ios/**", "!**/android/**"] - }, - "formatter": { - "enabled": true, - "indentStyle": "tab" - }, - "linter": { - "enabled": true, - "rules": { - "recommended": true - } - }, - "javascript": { - "formatter": { - "quoteStyle": "double" - } - }, - "assist": { - "enabled": true, - "actions": { - "source": { - "organizeImports": "on" - } - } - } + "$schema": "https://biomejs.dev/schemas/2.1.1/schema.json", + "vcs": { + "enabled": false, + "clientKind": "git", + "useIgnoreFile": false + }, + "files": { + "ignoreUnknown": false, + "includes": ["**", "!lib/**", "!**/ios/**", "!**/android/**"] + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 4 + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true + } + }, + "javascript": { + "formatter": { + "quoteStyle": "double" + } + }, + "assist": { + "enabled": true, + "actions": { + "source": { + "organizeImports": "on" + } + } + } } diff --git a/example/app.json b/example/app.json index b501a355..214d4030 100644 --- a/example/app.json +++ b/example/app.json @@ -1,4 +1,4 @@ { - "name": "NitroImageExample", - "displayName": "NitroImageExample" + "name": "NitroImageExample", + "displayName": "NitroImageExample" } diff --git a/example/babel.config.js b/example/babel.config.js index 30526a88..f8228843 100644 --- a/example/babel.config.js +++ b/example/babel.config.js @@ -1,3 +1,3 @@ module.exports = { - presets: ["module:@react-native/babel-preset"], + presets: ["module:@react-native/babel-preset"], }; diff --git a/example/metro.config.js b/example/metro.config.js index 1356a5d2..5df2f5ee 100644 --- a/example/metro.config.js +++ b/example/metro.config.js @@ -10,16 +10,16 @@ const root = path.resolve(__dirname, ".."); * @type {import('@react-native/metro-config').MetroConfig} */ const config = { - watchFolders: [root], + watchFolders: [root], - transformer: { - getTransformOptions: async () => ({ - transform: { - experimentalImportSupport: false, - inlineRequires: true, - }, - }), - }, + transformer: { + getTransformOptions: async () => ({ + transform: { + experimentalImportSupport: false, + inlineRequires: true, + }, + }), + }, }; module.exports = mergeConfig(getDefaultConfig(__dirname), config); diff --git a/example/package.json b/example/package.json index 3dd548e5..8381b74a 100644 --- a/example/package.json +++ b/example/package.json @@ -1,39 +1,39 @@ { - "name": "NitroImageExample", - "version": "0.0.1", - "private": true, - "scripts": { - "android": "react-native run-android", - "ios": "react-native run-ios", - "lint": "eslint .", - "start": "react-native start --client-logs", - "pods": "bundle install && cd ios && bundle exec pod install" - }, - "dependencies": { - "@react-navigation/bottom-tabs": "^7.3.14", - "@react-navigation/native": "^7.1.10", - "react": "19.0.0", - "react-native": "0.79.3", - "react-native-fast-image": "^8.6.3", - "react-native-nitro-image": "..", - "react-native-nitro-modules": "^0.26.3", - "react-native-safe-area-context": "^5.4.1", - "react-native-screens": "^4.11.1" - }, - "devDependencies": { - "@babel/core": "^7.27.4", - "@babel/preset-env": "^7.27.2", - "@babel/runtime": "^7.27.6", - "@react-native-community/cli": "18.0.0", - "@react-native-community/cli-platform-android": "18.0.0", - "@react-native-community/cli-platform-ios": "18.0.0", - "@react-native/babel-preset": "0.79.3", - "@react-native/metro-config": "0.79.3", - "@react-native/typescript-config": "0.79.3", - "@types/react": "^19.0.0", - "typescript": "5.0.4" - }, - "engines": { - "node": ">=18" - } + "name": "NitroImageExample", + "version": "0.0.1", + "private": true, + "scripts": { + "android": "react-native run-android", + "ios": "react-native run-ios", + "lint": "eslint .", + "start": "react-native start --client-logs", + "pods": "bundle install && cd ios && bundle exec pod install" + }, + "dependencies": { + "@react-navigation/bottom-tabs": "^7.3.14", + "@react-navigation/native": "^7.1.10", + "react": "19.0.0", + "react-native": "0.79.3", + "react-native-fast-image": "^8.6.3", + "react-native-nitro-image": "..", + "react-native-nitro-modules": "^0.26.3", + "react-native-safe-area-context": "^5.4.1", + "react-native-screens": "^4.11.1" + }, + "devDependencies": { + "@babel/core": "^7.27.4", + "@babel/preset-env": "^7.27.2", + "@babel/runtime": "^7.27.6", + "@react-native-community/cli": "18.0.0", + "@react-native-community/cli-platform-android": "18.0.0", + "@react-native-community/cli-platform-ios": "18.0.0", + "@react-native/babel-preset": "0.79.3", + "@react-native/metro-config": "0.79.3", + "@react-native/typescript-config": "0.79.3", + "@types/react": "^19.0.0", + "typescript": "5.0.4" + }, + "engines": { + "node": ">=18" + } } diff --git a/example/src/App.tsx b/example/src/App.tsx index c60900ac..3c25ec61 100644 --- a/example/src/App.tsx +++ b/example/src/App.tsx @@ -12,17 +12,17 @@ import { FastImageTab } from "./FastImageTab"; import { NitroImageTab } from "./NitroImageTab"; const Tabs = createBottomTabNavigator({ - detachInactiveScreens: false, - screens: { - Empty: EmptyTab, - FastImage: FastImageTab, - NitroImage: NitroImageTab, - }, + detachInactiveScreens: false, + screens: { + Empty: EmptyTab, + FastImage: FastImageTab, + NitroImage: NitroImageTab, + }, }); const Navigation = createStaticNavigation(Tabs); function App(): React.JSX.Element { - return ; + return ; } export default App; diff --git a/example/src/EmptyTab.tsx b/example/src/EmptyTab.tsx index 08c1e725..3aca1fb4 100644 --- a/example/src/EmptyTab.tsx +++ b/example/src/EmptyTab.tsx @@ -1,21 +1,23 @@ import { StyleSheet, Text, View } from "react-native"; export function EmptyTab() { - return ( - - Select a Tab to display the Images List. - - ); + return ( + + + Select a Tab to display the Images List. + + + ); } const styles = StyleSheet.create({ - container: { - flex: 1, - justifyContent: "center", - alignItems: "center", - }, - text: { - fontSize: 18, - fontWeight: "500", - }, + container: { + flex: 1, + justifyContent: "center", + alignItems: "center", + }, + text: { + fontSize: 18, + fontWeight: "500", + }, }); diff --git a/example/src/FastImageTab.tsx b/example/src/FastImageTab.tsx index aa9f66aa..202ee8dc 100644 --- a/example/src/FastImageTab.tsx +++ b/example/src/FastImageTab.tsx @@ -4,26 +4,26 @@ import FastImage from "react-native-fast-image"; import { createImageURLs } from "./createImageURLs"; export function FastImageTab() { - const imageURLs = useMemo(() => createImageURLs(), []); + const imageURLs = useMemo(() => createImageURLs(), []); - return ( - - FastImage Tab - ( - - )} - /> - - ); + return ( + + FastImage Tab + ( + + )} + /> + + ); } const styles = StyleSheet.create({ - image: { - width: "25%", - aspectRatio: 1, - }, + image: { + width: "25%", + aspectRatio: 1, + }, }); diff --git a/example/src/NitroImageTab.tsx b/example/src/NitroImageTab.tsx index aa221c60..f3533d86 100644 --- a/example/src/NitroImageTab.tsx +++ b/example/src/NitroImageTab.tsx @@ -4,30 +4,30 @@ import { NitroImage, useWebImage } from "react-native-nitro-image"; import { createImageURLs } from "./createImageURLs"; function AsyncImageImpl({ url }: { url: string }): React.ReactNode { - const image = useWebImage(url); - return ; + const image = useWebImage(url); + return ; } const AsyncImage = React.memo(AsyncImageImpl); export function NitroImageTab() { - const imageURLs = useMemo(() => createImageURLs(), []); + const imageURLs = useMemo(() => createImageURLs(), []); - return ( - - NitroImage Tab - } - /> - - ); + return ( + + NitroImage Tab + } + /> + + ); } const styles = StyleSheet.create({ - image: { - width: "25%", - aspectRatio: 1, - }, + image: { + width: "25%", + aspectRatio: 1, + }, }); diff --git a/example/src/createImageURLs.ts b/example/src/createImageURLs.ts index 0d1fbd06..c910e245 100644 --- a/example/src/createImageURLs.ts +++ b/example/src/createImageURLs.ts @@ -1,10 +1,10 @@ const DEFAULT_COUNT = 1000; export function createImageURLs( - count: number = DEFAULT_COUNT, - size = 800, + count: number = DEFAULT_COUNT, + size = 800, ): string[] { - return [...Array(count).fill(undefined)].map((_, index) => { - return `https://picsum.photos/seed/${index + 1}/${size}`; - }); + return [...Array(count).fill(undefined)].map((_, index) => { + return `https://picsum.photos/seed/${index + 1}/${size}`; + }); } diff --git a/example/tsconfig.json b/example/tsconfig.json index c3e54017..9b8d1de4 100644 --- a/example/tsconfig.json +++ b/example/tsconfig.json @@ -1,3 +1,3 @@ { - "extends": "@react-native/typescript-config/tsconfig.json" + "extends": "@react-native/typescript-config/tsconfig.json" } diff --git a/nitro.json b/nitro.json index f63a7b73..5420eaa6 100644 --- a/nitro.json +++ b/nitro.json @@ -1,26 +1,26 @@ { - "$schema": "https://nitro.margelo.com/nitro.schema.json", - "cxxNamespace": ["image"], - "ios": { - "iosModuleName": "NitroImage" - }, - "android": { - "androidNamespace": ["image"], - "androidCxxLibName": "NitroImage" - }, - "autolinking": { - "ImageFactory": { - "swift": "HybridImageFactory", - "kotlin": "HybridImageFactory" - }, - "ImageUtils": { - "swift": "HybridImageUtils", - "kotlin": "HybridImageUtils" - }, - "NitroImageView": { - "swift": "HybridImageView", - "kotlin": "HybridImageView" - } - }, - "ignorePaths": ["**/node_modules"] + "$schema": "https://nitro.margelo.com/nitro.schema.json", + "cxxNamespace": ["image"], + "ios": { + "iosModuleName": "NitroImage" + }, + "android": { + "androidNamespace": ["image"], + "androidCxxLibName": "NitroImage" + }, + "autolinking": { + "ImageFactory": { + "swift": "HybridImageFactory", + "kotlin": "HybridImageFactory" + }, + "ImageUtils": { + "swift": "HybridImageUtils", + "kotlin": "HybridImageUtils" + }, + "NitroImageView": { + "swift": "HybridImageView", + "kotlin": "HybridImageView" + } + }, + "ignorePaths": ["**/node_modules"] } diff --git a/nitrogen/generated/shared/json/NitroImageViewConfig.json b/nitrogen/generated/shared/json/NitroImageViewConfig.json index af9a8b71..19dde08c 100644 --- a/nitrogen/generated/shared/json/NitroImageViewConfig.json +++ b/nitrogen/generated/shared/json/NitroImageViewConfig.json @@ -1,10 +1,10 @@ { - "uiViewClassName": "NitroImageView", - "supportsRawText": false, - "bubblingEventTypes": {}, - "directEventTypes": {}, - "validAttributes": { - "image": true, - "hybridRef": true - } + "uiViewClassName": "NitroImageView", + "supportsRawText": false, + "bubblingEventTypes": {}, + "directEventTypes": {}, + "validAttributes": { + "image": true, + "hybridRef": true + } } diff --git a/package.json b/package.json index 12488d51..1ac0dd3e 100644 --- a/package.json +++ b/package.json @@ -1,154 +1,154 @@ { - "name": "react-native-nitro-image", - "version": "0.4.0", - "description": "react-native-nitro-image", - "main": "lib/index", - "module": "lib/index", - "types": "lib/index.d.ts", - "react-native": "src/index", - "source": "src/index", - "workspaces": [ - "example" - ], - "files": [ - "src", - "react-native.config.js", - "lib", - "nitrogen", - "android/build.gradle", - "android/gradle.properties", - "android/CMakeLists.txt", - "android/src", - "ios/**/*.h", - "ios/**/*.m", - "ios/**/*.mm", - "ios/**/*.cpp", - "ios/**/*.swift", - "app.plugin.js", - "nitro.json", - "*.podspec", - "README.md" - ], - "scripts": { - "postinstall": "tsc || exit 0;", - "typecheck": "tsc --noEmit", - "clean": "rm -rf android/build node_modules/**/android/build lib", - "lint": "biome check . --fix", - "lint-ci": "biome check .", - "release": "release-it", - "typescript": "tsc", - "specs": "tsc && nitro-codegen --logLevel=\"debug\"" - }, - "keywords": [ - "react-native", - "nitro" - ], - "repository": { - "type": "git", - "url": "git+https://github.com/mrousavy/react-native-nitro-image.git" - }, - "author": "Marc Rousavy (https://github.com/mrousavy)", - "license": "MIT", - "bugs": { - "url": "https://github.com/mrousavy/react-native-nitro-image/issues" - }, - "homepage": "https://github.com/mrousavy/react-native-nitro-image#readme", - "publishConfig": { - "registry": "https://registry.npmjs.org/" - }, - "devDependencies": { - "@biomejs/biome": "2.1.1", - "@release-it/conventional-changelog": "^8.0.2", - "@types/react": "^19.0.6", - "nitro-codegen": "*", - "react": "19.0.0", - "react-native": "0.79.3", - "react-native-nitro-modules": "^0.26.3", - "release-it": "^17.10.0", - "typescript": "^5.5.4" - }, - "peerDependencies": { - "react": "*", - "react-native": "*", - "react-native-nitro-modules": "*" - }, - "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 - }, - "release-it": { - "npm": { - "publish": true - }, - "git": { - "commitMessage": "chore: release ${version}", - "tagName": "v${version}", - "requireCleanWorkingDir": true - }, - "github": { - "release": true - }, - "hooks": { - "before:release": "bun i && bun typescript" - }, - "plugins": { - "@release-it/conventional-changelog": { - "preset": { - "name": "conventionalcommits", - "types": [ - { - "type": "feat", - "section": "✨ Features" - }, - { - "type": "perf", - "section": "💨 Performance Improvements" - }, - { - "type": "fix", - "section": "🐛 Bug Fixes" - }, - { - "type": "chore(deps)", - "section": "🛠️ Dependency Upgrades" - }, - { - "type": "docs", - "section": "📚 Documentation" - } - ] - } - } - } - } + "name": "react-native-nitro-image", + "version": "0.4.0", + "description": "react-native-nitro-image", + "main": "lib/index", + "module": "lib/index", + "types": "lib/index.d.ts", + "react-native": "src/index", + "source": "src/index", + "workspaces": [ + "example" + ], + "files": [ + "src", + "react-native.config.js", + "lib", + "nitrogen", + "android/build.gradle", + "android/gradle.properties", + "android/CMakeLists.txt", + "android/src", + "ios/**/*.h", + "ios/**/*.m", + "ios/**/*.mm", + "ios/**/*.cpp", + "ios/**/*.swift", + "app.plugin.js", + "nitro.json", + "*.podspec", + "README.md" + ], + "scripts": { + "postinstall": "tsc || exit 0;", + "typecheck": "tsc --noEmit", + "clean": "rm -rf android/build node_modules/**/android/build lib", + "lint": "biome check . --fix", + "lint-ci": "biome check .", + "release": "release-it", + "typescript": "tsc", + "specs": "tsc && nitro-codegen --logLevel=\"debug\"" + }, + "keywords": [ + "react-native", + "nitro" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/mrousavy/react-native-nitro-image.git" + }, + "author": "Marc Rousavy (https://github.com/mrousavy)", + "license": "MIT", + "bugs": { + "url": "https://github.com/mrousavy/react-native-nitro-image/issues" + }, + "homepage": "https://github.com/mrousavy/react-native-nitro-image#readme", + "publishConfig": { + "registry": "https://registry.npmjs.org/" + }, + "devDependencies": { + "@biomejs/biome": "2.1.1", + "@release-it/conventional-changelog": "^8.0.2", + "@types/react": "^19.0.6", + "nitro-codegen": "*", + "react": "19.0.0", + "react-native": "0.79.3", + "react-native-nitro-modules": "^0.26.3", + "release-it": "^17.10.0", + "typescript": "^5.5.4" + }, + "peerDependencies": { + "react": "*", + "react-native": "*", + "react-native-nitro-modules": "*" + }, + "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 + }, + "release-it": { + "npm": { + "publish": true + }, + "git": { + "commitMessage": "chore: release ${version}", + "tagName": "v${version}", + "requireCleanWorkingDir": true + }, + "github": { + "release": true + }, + "hooks": { + "before:release": "bun i && bun typescript" + }, + "plugins": { + "@release-it/conventional-changelog": { + "preset": { + "name": "conventionalcommits", + "types": [ + { + "type": "feat", + "section": "✨ Features" + }, + { + "type": "perf", + "section": "💨 Performance Improvements" + }, + { + "type": "fix", + "section": "🐛 Bug Fixes" + }, + { + "type": "chore(deps)", + "section": "🛠️ Dependency Upgrades" + }, + { + "type": "docs", + "section": "📚 Documentation" + } + ] + } + } + } + } } diff --git a/react-native.config.js b/react-native.config.js index 58cfa919..13a61e95 100644 --- a/react-native.config.js +++ b/react-native.config.js @@ -1,16 +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: {}, - }, - }, + dependency: { + platforms: { + /** + * @type {import('@react-native-community/cli-types').IOSDependencyParams} + */ + ios: {}, + /** + * @type {import('@react-native-community/cli-types').AndroidDependencyParams} + */ + android: {}, + }, + }, }; diff --git a/src/ImageFactory.ts b/src/ImageFactory.ts index c889aa93..e2bf3f42 100644 --- a/src/ImageFactory.ts +++ b/src/ImageFactory.ts @@ -44,7 +44,7 @@ export const loadImageFromResources = factory.loadFromResources.bind(factory); * @throws If the file under the given {@linkcode name} cannot be parsed as an {@linkcode Image}. */ export const loadImageFromResourcesAsync = - factory.loadFromResourcesAsync.bind(factory); + factory.loadFromResourcesAsync.bind(factory); /** * Synchronously loads an {@linkcode Image} from the given symbol name. @@ -61,14 +61,14 @@ export const loadImageFromSymbol = factory.loadFromSymbol.bind(factory); * @throws If the given {@linkcode ArrayBuffer} is not a valid representation of an {@linkcode Image}. */ export const loadImageFromArrayBuffer = - factory.loadFromArrayBuffer.bind(factory); + factory.loadFromArrayBuffer.bind(factory); /** * Asynchronously convert the given given {@linkcode ArrayBuffer} to an {@linkcode Image}. * @param buffer * @throws If the given {@linkcode ArrayBuffer} is not a valid representation of an {@linkcode Image}. */ export const loadImageFromArrayBufferAsync = - factory.loadFromArrayBufferAsync.bind(factory); + factory.loadFromArrayBufferAsync.bind(factory); /** * Synchronously decodes the given {@linkcode thumbhash} to an {@linkcode Image}. @@ -85,4 +85,4 @@ export const loadImageFromThumbHash = factory.loadFromThumbHash.bind(factory); * @note If your thumbhash is a base64 string, use `thumbHashFromBase64String(...)` */ export const loadImageFromThumbHashAsync = - factory.loadFromThumbHashAsync.bind(factory); + factory.loadFromThumbHashAsync.bind(factory); diff --git a/src/ImageUtils.ts b/src/ImageUtils.ts index a393bd1b..769abd28 100644 --- a/src/ImageUtils.ts +++ b/src/ImageUtils.ts @@ -4,7 +4,7 @@ import type { ImageUtils } from "./specs/ImageUtils.nitro"; const utils = NitroModules.createHybridObject("ImageUtils"); export const thumbHashToBase64String = - utils.thumbHashToBase64String.bind(utils); + utils.thumbHashToBase64String.bind(utils); export const thumbHashFromBase64String = - utils.thumbhashFromBase64String.bind(utils); + utils.thumbhashFromBase64String.bind(utils); diff --git a/src/NitroImage.tsx b/src/NitroImage.tsx index 3c01adeb..3a118eca 100644 --- a/src/NitroImage.tsx +++ b/src/NitroImage.tsx @@ -1,14 +1,14 @@ import { getHostComponent } from "react-native-nitro-modules"; import ViewConfig from "../nitrogen/generated/shared/json/NitroImageViewConfig.json"; import type { - NitroImageViewMethods, - NitroImageViewProps, + NitroImageViewMethods, + NitroImageViewProps, } from "./specs/ImageView.nitro"; /** * The renderable `` view. */ export const NitroImage = getHostComponent< - NitroImageViewProps, - NitroImageViewMethods + NitroImageViewProps, + NitroImageViewMethods >("NitroImageView", () => ViewConfig); diff --git a/src/NitroWebImage.tsx b/src/NitroWebImage.tsx index a8127825..25337c4b 100644 --- a/src/NitroWebImage.tsx +++ b/src/NitroWebImage.tsx @@ -8,19 +8,19 @@ import type { NitroImageViewProps } from "./specs/ImageView.nitro"; import { useWebImage } from "./useWebImage"; interface ImagePlaceholder { - image: Image; + image: Image; } interface ThumbHashPlaceholder { - thumbHash: ArrayBuffer | string; + thumbHash: ArrayBuffer | string; } interface ViewPlaceholder { - view: React.ReactElement; + view: React.ReactElement; } export interface NitroWebImageProps extends Omit { - url: string; - options?: AsyncImageLoadOptions; - placeholder?: ImagePlaceholder | ThumbHashPlaceholder | ViewPlaceholder; + url: string; + options?: AsyncImageLoadOptions; + placeholder?: ImagePlaceholder | ThumbHashPlaceholder | ViewPlaceholder; } /** @@ -30,52 +30,52 @@ export interface NitroWebImageProps extends Omit { * As soon as this image is mounted, it will begin loading the image from the given URL. */ export function NitroWebImage({ - url, - options, - placeholder, - ...props + url, + options, + placeholder, + ...props }: NitroWebImageProps) { - const image = useWebImage(url, options); - const placeholderImage = useMemo(() => { - if (placeholder == null) { - // We don't have a placeholder - return undefined; - } else if ("image" in placeholder) { - // We have an in-memory Image as a placeholder - return placeholder.image; - } else if ("thumbHash" in placeholder) { - // We have a thumbHash as a placeholder - let thumbHash = placeholder.thumbHash; - if (typeof thumbHash === "string") { - // It's a base64 string - convert to ArrayBuffer first - thumbHash = thumbHashFromBase64String(thumbHash); - } - return loadImageFromThumbHash(thumbHash); - } else { - // Unknown placeholder... - return undefined; - } - }, [placeholder]); + const image = useWebImage(url, options); + const placeholderImage = useMemo(() => { + if (placeholder == null) { + // We don't have a placeholder + return undefined; + } else if ("image" in placeholder) { + // We have an in-memory Image as a placeholder + return placeholder.image; + } else if ("thumbHash" in placeholder) { + // We have a thumbHash as a placeholder + let thumbHash = placeholder.thumbHash; + if (typeof thumbHash === "string") { + // It's a base64 string - convert to ArrayBuffer first + thumbHash = thumbHashFromBase64String(thumbHash); + } + return loadImageFromThumbHash(thumbHash); + } else { + // Unknown placeholder... + return undefined; + } + }, [placeholder]); - if (image == null) { - // It's still loading - if (placeholder == null) { - // No placeholder was specified by the user - return null; - } else if (placeholderImage != null) { - // We have a placeholder image (thumbhash?) - return ; - } else if ("view" in placeholder) { - // We have a custom view as a placeholder - return placeholder.view; - } else { - // This should never be reached - throw new Error( - `An unsupported placeholder was specified! ${placeholder}`, - ); - } - } else { - // It finished loading! Lets go - return ; - } + if (image == null) { + // It's still loading + if (placeholder == null) { + // No placeholder was specified by the user + return null; + } else if (placeholderImage != null) { + // We have a placeholder image (thumbhash?) + return ; + } else if ("view" in placeholder) { + // We have a custom view as a placeholder + return placeholder.view; + } else { + // This should never be reached + throw new Error( + `An unsupported placeholder was specified! ${placeholder}`, + ); + } + } else { + // It finished loading! Lets go + return ; + } } diff --git a/src/specs/Image.nitro.ts b/src/specs/Image.nitro.ts index faf385db..d5b0ddf1 100644 --- a/src/specs/Image.nitro.ts +++ b/src/specs/Image.nitro.ts @@ -3,63 +3,63 @@ import type { HybridObject } from "react-native-nitro-modules"; export type ImageFormat = "jpg" | "png"; export interface Image - extends HybridObject<{ ios: "swift"; android: "kotlin" }> { - readonly width: number; - readonly height: number; + extends HybridObject<{ ios: "swift"; android: "kotlin" }> { + readonly width: number; + readonly height: number; - /** - * Returns an array buffer containing the raw pixel data of the Image. - * Raw pixel data is always in `ARGB` format; - * ``` - * [ - * A1, R1, G1, B1, - * A2, R2, G2, B2, - * ... - * ] - * ``` - */ - toArrayBuffer(): ArrayBuffer; - toArrayBufferAsync(): Promise; + /** + * Returns an array buffer containing the raw pixel data of the Image. + * Raw pixel data is always in `ARGB` format; + * ``` + * [ + * A1, R1, G1, B1, + * A2, R2, G2, B2, + * ... + * ] + * ``` + */ + toArrayBuffer(): ArrayBuffer; + toArrayBufferAsync(): Promise; - /** - * Resizes this Image into a new image with the new given {@linkcode width} and {@linkcode height}. - */ - resize(width: number, height: number): Image; - resizeAsync(width: number, height: number): Promise; + /** + * Resizes this Image into a new image with the new given {@linkcode width} and {@linkcode height}. + */ + resize(width: number, height: number): Image; + resizeAsync(width: number, height: number): Promise; - /** - * Crops this Image into a new image starting from the source image's {@linkcode startX} and {@linkcode startY} coordinates, - * up until the source image's {@linkcode endX} and {@linkcode endY} coordinates. - */ - crop(startX: number, startY: number, endX: number, endY: number): Image; - cropAsync( - startX: number, - startY: number, - endX: number, - endY: number, - ): Promise; + /** + * Crops this Image into a new image starting from the source image's {@linkcode startX} and {@linkcode startY} coordinates, + * up until the source image's {@linkcode endX} and {@linkcode endY} coordinates. + */ + crop(startX: number, startY: number, endX: number, endY: number): Image; + cropAsync( + startX: number, + startY: number, + endX: number, + endY: number, + ): Promise; - /** - * Saves this image in the given {@linkcode ImageFormat} to the given {@linkcode path}. - */ - saveToFileAsync( - path: string, - format: ImageFormat, - quality: number, - ): Promise; - /** - * Saves this image in the given {@linkcode ImageFormat} to a temporary file, and return it's path. - */ - saveToTemporaryFileAsync( - format: ImageFormat, - quality: number, - ): Promise; + /** + * Saves this image in the given {@linkcode ImageFormat} to the given {@linkcode path}. + */ + saveToFileAsync( + path: string, + format: ImageFormat, + quality: number, + ): Promise; + /** + * Saves this image in the given {@linkcode ImageFormat} to a temporary file, and return it's path. + */ + saveToTemporaryFileAsync( + format: ImageFormat, + 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. - */ - toThumbHash(): ArrayBuffer; - toThumbHashAsync(): 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. + */ + toThumbHash(): ArrayBuffer; + toThumbHashAsync(): Promise; } diff --git a/src/specs/ImageFactory.nitro.ts b/src/specs/ImageFactory.nitro.ts index ba1fb37a..8dc07050 100644 --- a/src/specs/ImageFactory.nitro.ts +++ b/src/specs/ImageFactory.nitro.ts @@ -4,123 +4,123 @@ import type { Image } from "./Image.nitro"; export type AsyncImagePriority = "low" | "default" | "high"; export interface AsyncImageLoadOptions { - /** - * Specifies the priority of the image download. - * @default 'default' - */ - priority?: AsyncImagePriority; + /** + * Specifies the priority of the image download. + * @default 'default' + */ + priority?: AsyncImagePriority; - /** - * Forces a cache refresh even if the URL is changed. - * Use this if you cannot make your URLs static. - * @default false - */ - forceRefresh?: boolean; + /** + * Forces a cache refresh even if the URL is changed. + * Use this if you cannot make your URLs static. + * @default false + */ + forceRefresh?: boolean; - /** - * Allows the Image download to continue even when the app is backgrounded. - * @default false - */ - continueInBackground?: boolean; + /** + * Allows the Image download to continue even when the app is backgrounded. + * @default false + */ + continueInBackground?: boolean; - /** - * Enable to allow untrusted SSL certificates. - * @default false - */ - allowInvalidSSLCertificates?: boolean; + /** + * Enable to allow untrusted SSL certificates. + * @default false + */ + allowInvalidSSLCertificates?: boolean; - /** - * Scales down larger images to respect the device's memory constraints (max. 60 MB, or 4096x4096) - * @default false - */ - scaleDownLargeImages?: boolean; + /** + * Scales down larger images to respect the device's memory constraints (max. 60 MB, or 4096x4096) + * @default false + */ + scaleDownLargeImages?: boolean; - /** - * By default, cached images are queried from memory **asynchronously** to avoid UI lag. - * If this flag is enabled, images are queried **synchronously** from memory. - * @default false - */ - queryMemoryDataSync?: boolean; - /** - * By default, cached images are queried from disk **asynchronously** to avoid UI lag. - * If this flag is enabled, images are queried **synchronously** from disk. - * @default false - */ - queryDiskDataSync?: boolean; + /** + * By default, cached images are queried from memory **asynchronously** to avoid UI lag. + * If this flag is enabled, images are queried **synchronously** from memory. + * @default false + */ + queryMemoryDataSync?: boolean; + /** + * By default, cached images are queried from disk **asynchronously** to avoid UI lag. + * If this flag is enabled, images are queried **synchronously** from disk. + * @default false + */ + queryDiskDataSync?: boolean; - /** - * By default, images are decoded from binary data to actual image representations. - * Disabling this might speed up downloads, but could increase memory usage. - * @default true - */ - decodeImage?: boolean; + /** + * By default, images are decoded from binary data to actual image representations. + * Disabling this might speed up downloads, but could increase memory usage. + * @default true + */ + decodeImage?: boolean; } export interface ImageFactory - extends HybridObject<{ ios: "swift"; android: "kotlin" }> { - /** - * Asynchronously loads an {@linkcode Image} from the given {@linkcode url}. - * @param url The URL of the {@linkcode Image}. Must start with `https://...` - * @throws If the {@linkcode url} is invalid. - * @throws If the network request cannot be made. - * @throws If the data at the given {@linkcode url} cannot be parsed as an {@linkcode Image}. - */ - loadFromURLAsync( - url: string, - options?: AsyncImageLoadOptions, - ): Promise; - /** - * Synchronously loads an {@linkcode Image} from the given {@linkcode filePath}. - * @param filePath The file path of the {@linkcode Image}. Must contain a file extension. - * @throws If the {@linkcode filePath} is invalid. - * @throws If the data at the given {@linkcode filePath} cannot be parsed as an {@linkcode Image}. - */ - loadFromFile(filePath: string): Image; - /** - * Asynchronously loads an {@linkcode Image} from the given {@linkcode filePath}. - * @param filePath The file path of the {@linkcode Image}. Must contain a file extension. - * @throws If the {@linkcode filePath} is invalid. - * @throws If the data at the given {@linkcode filePath} cannot be parsed as an {@linkcode Image}. - */ - loadFromFileAsync(filePath: string): Promise; + extends HybridObject<{ ios: "swift"; android: "kotlin" }> { + /** + * Asynchronously loads an {@linkcode Image} from the given {@linkcode url}. + * @param url The URL of the {@linkcode Image}. Must start with `https://...` + * @throws If the {@linkcode url} is invalid. + * @throws If the network request cannot be made. + * @throws If the data at the given {@linkcode url} cannot be parsed as an {@linkcode Image}. + */ + loadFromURLAsync( + url: string, + options?: AsyncImageLoadOptions, + ): Promise; + /** + * Synchronously loads an {@linkcode Image} from the given {@linkcode filePath}. + * @param filePath The file path of the {@linkcode Image}. Must contain a file extension. + * @throws If the {@linkcode filePath} is invalid. + * @throws If the data at the given {@linkcode filePath} cannot be parsed as an {@linkcode Image}. + */ + loadFromFile(filePath: string): Image; + /** + * Asynchronously loads an {@linkcode Image} from the given {@linkcode filePath}. + * @param filePath The file path of the {@linkcode Image}. Must contain a file extension. + * @throws If the {@linkcode filePath} is invalid. + * @throws If the data at the given {@linkcode filePath} cannot be parsed as an {@linkcode Image}. + */ + loadFromFileAsync(filePath: string): Promise; - /** - * Synchronously loads an {@linkcode Image} from the given resource-/system-name. - * @param name The resource-/system-name of the image to load. - * @throws If no {@linkcode Image} exists under the given {@linkcode name}. - * @throws If the file under the given {@linkcode name} cannot be parsed as an {@linkcode Image}. - */ - loadFromResources(name: string): Image; - /** - * Asynchronously loads an {@linkcode Image} from the given resource-/system-name. - * @param name The resource-/system-name of the image to load. - * @throws If no {@linkcode Image} exists under the given {@linkcode name}. - * @throws If the file under the given {@linkcode name} cannot be parsed as an {@linkcode Image}. - */ - loadFromResourcesAsync(name: string): Promise; + /** + * Synchronously loads an {@linkcode Image} from the given resource-/system-name. + * @param name The resource-/system-name of the image to load. + * @throws If no {@linkcode Image} exists under the given {@linkcode name}. + * @throws If the file under the given {@linkcode name} cannot be parsed as an {@linkcode Image}. + */ + loadFromResources(name: string): Image; + /** + * Asynchronously loads an {@linkcode Image} from the given resource-/system-name. + * @param name The resource-/system-name of the image to load. + * @throws If no {@linkcode Image} exists under the given {@linkcode name}. + * @throws If the file under the given {@linkcode name} cannot be parsed as an {@linkcode Image}. + */ + loadFromResourcesAsync(name: string): Promise; - /** - * Synchronously loads an {@linkcode Image} from the given symbol name. - * This is iOS only! - * @param symbolName The symbol name of the image to load. On iOS, this is the SF Symbols Name. - * @throws If no {@linkcode Image} symbol exists under the given {@linkcode symbolName}. - * @platform iOS 13 - */ - loadFromSymbol(symbolName: string): Image; + /** + * Synchronously loads an {@linkcode Image} from the given symbol name. + * This is iOS only! + * @param symbolName The symbol name of the image to load. On iOS, this is the SF Symbols Name. + * @throws If no {@linkcode Image} symbol exists under the given {@linkcode symbolName}. + * @platform iOS 13 + */ + loadFromSymbol(symbolName: string): Image; - /** - * Synchronously convert the given given {@linkcode ArrayBuffer} to an {@linkcode Image}. - * @param buffer - * @throws If the given {@linkcode ArrayBuffer} is not a valid representation of an {@linkcode Image}. - */ - loadFromArrayBuffer(buffer: ArrayBuffer): Image; - /** - * Asynchronously convert the given given {@linkcode ArrayBuffer} to an {@linkcode Image}. - * @param buffer - * @throws If the given {@linkcode ArrayBuffer} is not a valid representation of an {@linkcode Image}. - */ - loadFromArrayBufferAsync(buffer: ArrayBuffer): Promise; + /** + * Synchronously convert the given given {@linkcode ArrayBuffer} to an {@linkcode Image}. + * @param buffer + * @throws If the given {@linkcode ArrayBuffer} is not a valid representation of an {@linkcode Image}. + */ + loadFromArrayBuffer(buffer: ArrayBuffer): Image; + /** + * Asynchronously convert the given given {@linkcode ArrayBuffer} to an {@linkcode Image}. + * @param buffer + * @throws If the given {@linkcode ArrayBuffer} is not a valid representation of an {@linkcode Image}. + */ + loadFromArrayBufferAsync(buffer: ArrayBuffer): Promise; - loadFromThumbHash(thumbhash: ArrayBuffer): Image; - loadFromThumbHashAsync(thumbhash: ArrayBuffer): Promise; + loadFromThumbHash(thumbhash: ArrayBuffer): Image; + loadFromThumbHashAsync(thumbhash: ArrayBuffer): Promise; } diff --git a/src/specs/ImageUtils.nitro.ts b/src/specs/ImageUtils.nitro.ts index 4f0019c3..67a6b5db 100644 --- a/src/specs/ImageUtils.nitro.ts +++ b/src/specs/ImageUtils.nitro.ts @@ -1,7 +1,7 @@ import type { HybridObject } from "react-native-nitro-modules"; export interface ImageUtils - extends HybridObject<{ ios: "swift"; android: "kotlin" }> { - thumbHashToBase64String(thumbhash: ArrayBuffer): string; - thumbhashFromBase64String(thumbhashBase64: string): ArrayBuffer; + extends HybridObject<{ ios: "swift"; android: "kotlin" }> { + thumbHashToBase64String(thumbhash: ArrayBuffer): string; + thumbhashFromBase64String(thumbhashBase64: string): ArrayBuffer; } diff --git a/src/specs/ImageView.nitro.ts b/src/specs/ImageView.nitro.ts index 52364c4a..ebc644b8 100644 --- a/src/specs/ImageView.nitro.ts +++ b/src/specs/ImageView.nitro.ts @@ -1,19 +1,19 @@ import type { - HybridView, - HybridViewMethods, - HybridViewProps, + HybridView, + HybridViewMethods, + HybridViewProps, } from "react-native-nitro-modules"; import type { Image } from "./Image.nitro"; export interface NitroImageViewProps extends HybridViewProps { - image?: Image; + image?: Image; } export interface NitroImageViewMethods extends HybridViewMethods { - // no methods + // no methods } export type NitroImageView = HybridView< - NitroImageViewProps, - NitroImageViewMethods + NitroImageViewProps, + NitroImageViewMethods >; diff --git a/src/useWebImage.ts b/src/useWebImage.ts index a8e652a0..7517e616 100644 --- a/src/useWebImage.ts +++ b/src/useWebImage.ts @@ -7,24 +7,24 @@ import type { AsyncImageLoadOptions } from "./specs/ImageFactory.nitro"; * A convenience hook to load a remote image from the given {@linkcode url}. */ export function useWebImage( - url: string, - options?: AsyncImageLoadOptions, + url: string, + options?: AsyncImageLoadOptions, ): Image | undefined { - const [image, setImage] = useState(undefined); + const [image, setImage] = useState(undefined); - // biome-ignore lint/correctness/useExhaustiveDependencies: `options` is missing from dependencies since it's a reference type that will be constructed each render. - useEffect(() => { - const load = async () => { - try { - const i = await loadImageFromURLAsync(url, options); - setImage(i); - } catch (error) { - console.error(`Failed to load image from "${url}"!`, error); - setImage(undefined); - } - }; - load(); - }, [url]); + // biome-ignore lint/correctness/useExhaustiveDependencies: `options` is missing from dependencies since it's a reference type that will be constructed each render. + useEffect(() => { + const load = async () => { + try { + const i = await loadImageFromURLAsync(url, options); + setImage(i); + } catch (error) { + console.error(`Failed to load image from "${url}"!`, error); + setImage(undefined); + } + }; + load(); + }, [url]); - return image; + return image; } diff --git a/tsconfig.json b/tsconfig.json index d04096e9..4022d7ce 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,29 +1,29 @@ { - "include": ["src"], - "compilerOptions": { - "composite": true, - "outDir": "lib", - "rootDir": "src", - "allowUnreachableCode": false, - "allowUnusedLabels": false, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "jsx": "react-jsx", - "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 - } + "include": ["src"], + "compilerOptions": { + "composite": true, + "outDir": "lib", + "rootDir": "src", + "allowUnreachableCode": false, + "allowUnusedLabels": false, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "jsx": "react-jsx", + "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 + } } From 5bcfaf4393901b30602a9f90792a3c2dd30d33ae Mon Sep 17 00:00:00 2001 From: bglgwyng Date: Wed, 16 Jul 2025 00:42:39 +0900 Subject: [PATCH 13/15] chore: exclude nitrogen/generated directory from biome linting --- biome.json | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/biome.json b/biome.json index fc75d2e4..154ffd2d 100644 --- a/biome.json +++ b/biome.json @@ -7,7 +7,13 @@ }, "files": { "ignoreUnknown": false, - "includes": ["**", "!lib/**", "!**/ios/**", "!**/android/**"] + "includes": [ + "**", + "!lib/**", + "!**/ios/**", + "!**/android/**", + "!nitrogen/generated/**" + ] }, "formatter": { "enabled": true, @@ -33,4 +39,4 @@ } } } -} +} \ No newline at end of file From e952f6a5da5caee547919fa9a29cd4c6857da8a2 Mon Sep 17 00:00:00 2001 From: bglgwyng Date: Wed, 16 Jul 2025 00:47:59 +0900 Subject: [PATCH 14/15] style: format --- biome.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/biome.json b/biome.json index 154ffd2d..52676211 100644 --- a/biome.json +++ b/biome.json @@ -39,4 +39,4 @@ } } } -} \ No newline at end of file +} From 417660378ba223b53c8f540dc3f31b6290cd4cac Mon Sep 17 00:00:00 2001 From: bglgwyng Date: Wed, 16 Jul 2025 10:26:05 +0900 Subject: [PATCH 15/15] style: undo lint over nitrogen/generated --- .../shared/json/NitroImageViewConfig.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/nitrogen/generated/shared/json/NitroImageViewConfig.json b/nitrogen/generated/shared/json/NitroImageViewConfig.json index 19dde08c..a8d904f1 100644 --- a/nitrogen/generated/shared/json/NitroImageViewConfig.json +++ b/nitrogen/generated/shared/json/NitroImageViewConfig.json @@ -1,10 +1,10 @@ { - "uiViewClassName": "NitroImageView", - "supportsRawText": false, - "bubblingEventTypes": {}, - "directEventTypes": {}, - "validAttributes": { - "image": true, - "hybridRef": true - } + "uiViewClassName": "NitroImageView", + "supportsRawText": false, + "bubblingEventTypes": {}, + "directEventTypes": {}, + "validAttributes": { + "image": true, + "hybridRef": true + } }