diff --git a/jest.config.json b/jest.config.json index f32fc8f..02d4c2a 100644 --- a/jest.config.json +++ b/jest.config.json @@ -3,5 +3,5 @@ "transform": { "^.+\\.tsx?$": "ts-jest" }, - "testRegex": "__tests__/.*spec\\.ts$" + "testRegex": "__tests__/.*spec\\.tsx?$" } diff --git a/migration-guide.md b/migration-guide.md index c468265..d86649f 100644 --- a/migration-guide.md +++ b/migration-guide.md @@ -1,4 +1,53 @@ -## Migrating from 2.x.x +# Migrating to 4.x.x + +## 🚨 Breaking Changes + +### `useAppColorScheme()` Initialization + +_NB: If you were not using dark mode, or were only observing the device's color scheme +(which is the default and most common), you can ignore this section._ + +The mechanism for opting-out of listening to device color scheme changes in order to +_control color scheme manually_ from your app has changed in `v4.0.0`. First, +`useAppColorScheme()` no longer takes a second parameter for initialization: + +```diff +-const [colorScheme, ...] = useAppColorScheme(tw, `light`); ++const [colorScheme, ...] = useAppColorScheme(tw); +``` + +This means that `useAppColorScheme()` is now safe to use multiple times in your app, +anywhere you need to read or modify the app color scheme. As part of this change the +**initialization has moved** to `useDeviceContext()` (which should only ever be called +once, at the root of the app): + +```diff +useDeviceContext(tw, { +- withDeviceColorScheme: false, ++ observeDeviceColorSchemeChanges: false, ++ initialColorScheme: "light", +}); +``` + +The value for `initialColorScheme` can be `"light"`, `"dark"`, or `"device"`. `device` +means initialize to the _current_ color scheme of the device one time before the app +assumes control. + +_Please note:_ there was a bug in `v3.x.x` when omitting the optional initialization param +(now removed) passed to `useAppColorScheme()` that caused the color scheme to not be +correctly initialized when the device was in **dark mode**. Version `4.x.x` fixes this +issue, but the bugfix can result in an observable difference in your app's initialization +for users whose devices are set to dark mode. If you want to replicate the former behavior +before the bug was fixed, you should explicitly pass `"light"` for `initialColorScheme` +when calling `useDeviceContext()`. + +## 💃 New Features + +The main `tw` object now exposes a `.memoBuster` string property, which can be useful for +resolving some simple memoization re-render failure issues. See +[here for more](./readme.md#memo-buster). + +# Migrating to 3.x.x **Color renames**. In line with the [upgrade guide](https://tailwindcss.com/docs/upgrade-guide#removed-color-aliases), @@ -18,7 +67,7 @@ feature that would help your development, please and include any libraries / hooks that could help someone in the community put a PR together. -## Migrating from 1.x.x +# Migrating to 2.x.x **1.** During the rewrite, the package name on npm was changed to `twrnc`. To remove the old library and install v2, run: diff --git a/package-lock.json b/package-lock.json index 35549f8..9bc6d5c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,8 +14,9 @@ "devDependencies": { "@babel/preset-typescript": "^7.23.3", "@types/jest": "^29.5.11", - "@types/react": "^18.2.45", - "@types/react-native": "^0.72.8", + "@types/react": "^18.2.55", + "@types/react-native": "^0.73.0", + "@types/react-test-renderer": "^18.0.7", "@types/tailwindcss": "^3.1.0", "@typescript-eslint/eslint-plugin": "^6.15.0", "@typescript-eslint/parser": "^6.15.0", @@ -26,8 +27,9 @@ "jest": "^29.7.0", "metro-react-native-babel-preset": "^0.66.2", "prettier": "^3.1.1", - "react": "^17.0.2", - "react-native": "^0.73.1", + "react": "^18.2.0", + "react-native": "^0.73.4", + "react-test-renderer": "^18.2.0", "ts-jest": "^29.1.1", "typescript": "^5.3.3" }, @@ -1104,21 +1106,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", - "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-block-scoping": { "version": "7.15.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz", @@ -1272,21 +1259,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", - "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-modules-commonjs": { "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", @@ -1335,22 +1307,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", - "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-parameters": { "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", @@ -1400,21 +1356,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", - "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-react-display-name": { "version": "7.15.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.15.1.tgz", @@ -1655,15 +1596,15 @@ } }, "node_modules/@babel/register": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.22.15.tgz", - "integrity": "sha512-V3Q3EqoQdn65RCgTLwauZaTfd1ShhwPmbBv+1dkZV/HpCGMKVyn6oFcRlI7RaKqiDQjX2Qd3AuoEguBgdjIKlg==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.23.7.tgz", + "integrity": "sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ==", "dev": true, "dependencies": { "clone-deep": "^4.0.1", "find-cache-dir": "^2.0.0", "make-dir": "^2.1.0", - "pirates": "^4.0.5", + "pirates": "^4.0.6", "source-map-support": "^0.5.16" }, "engines": { @@ -2408,20 +2349,20 @@ } }, "node_modules/@react-native-community/cli": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-12.3.0.tgz", - "integrity": "sha512-XeQohi2E+S2+MMSz97QcEZ/bWpi8sfKiQg35XuYeJkc32Til2g0b97jRpn0/+fV0BInHoG1CQYWwHA7opMsrHg==", - "dev": true, - "dependencies": { - "@react-native-community/cli-clean": "12.3.0", - "@react-native-community/cli-config": "12.3.0", - "@react-native-community/cli-debugger-ui": "12.3.0", - "@react-native-community/cli-doctor": "12.3.0", - "@react-native-community/cli-hermes": "12.3.0", - "@react-native-community/cli-plugin-metro": "12.3.0", - "@react-native-community/cli-server-api": "12.3.0", - "@react-native-community/cli-tools": "12.3.0", - "@react-native-community/cli-types": "12.3.0", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-12.3.2.tgz", + "integrity": "sha512-WgoUWwLDcf/G1Su2COUUVs3RzAwnV/vUTdISSpAUGgSc57mPabaAoUctKTnfYEhCnE3j02k3VtaVPwCAFRO3TQ==", + "dev": true, + "dependencies": { + "@react-native-community/cli-clean": "12.3.2", + "@react-native-community/cli-config": "12.3.2", + "@react-native-community/cli-debugger-ui": "12.3.2", + "@react-native-community/cli-doctor": "12.3.2", + "@react-native-community/cli-hermes": "12.3.2", + "@react-native-community/cli-plugin-metro": "12.3.2", + "@react-native-community/cli-server-api": "12.3.2", + "@react-native-community/cli-tools": "12.3.2", + "@react-native-community/cli-types": "12.3.2", "chalk": "^4.1.2", "commander": "^9.4.1", "deepmerge": "^4.3.0", @@ -2440,23 +2381,23 @@ } }, "node_modules/@react-native-community/cli-clean": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-12.3.0.tgz", - "integrity": "sha512-iAgLCOWYRGh9ukr+eVQnhkV/OqN3V2EGd/in33Ggn/Mj4uO6+oUncXFwB+yjlyaUNz6FfjudhIz09yYGSF+9sg==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-12.3.2.tgz", + "integrity": "sha512-90k2hCX0ddSFPT7EN7h5SZj0XZPXP0+y/++v262hssoey3nhurwF57NGWN0XAR0o9BSW7+mBfeInfabzDraO6A==", "dev": true, "dependencies": { - "@react-native-community/cli-tools": "12.3.0", + "@react-native-community/cli-tools": "12.3.2", "chalk": "^4.1.2", "execa": "^5.0.0" } }, "node_modules/@react-native-community/cli-config": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-12.3.0.tgz", - "integrity": "sha512-BrTn5ndFD9uOxO8kxBQ32EpbtOvAsQExGPI7SokdI4Zlve70FziLtTq91LTlTUgMq1InVZn/jJb3VIDk6BTInQ==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-12.3.2.tgz", + "integrity": "sha512-UUCzDjQgvAVL/57rL7eOuFUhd+d+6qfM7V8uOegQFeFEmSmvUUDLYoXpBa5vAK9JgQtSqMBJ1Shmwao+/oElxQ==", "dev": true, "dependencies": { - "@react-native-community/cli-tools": "12.3.0", + "@react-native-community/cli-tools": "12.3.2", "chalk": "^4.1.2", "cosmiconfig": "^5.1.0", "deepmerge": "^4.3.0", @@ -2465,24 +2406,24 @@ } }, "node_modules/@react-native-community/cli-debugger-ui": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-12.3.0.tgz", - "integrity": "sha512-w3b0iwjQlk47GhZWHaeTG8kKH09NCMUJO729xSdMBXE8rlbm4kHpKbxQY9qKb6NlfWSJN4noGY+FkNZS2rRwnQ==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-12.3.2.tgz", + "integrity": "sha512-nSWQUL+51J682DlfcC1bjkUbQbGvHCC25jpqTwHIjmmVjYCX1uHuhPSqQKgPNdvtfOkrkACxczd7kVMmetxY2Q==", "dev": true, "dependencies": { "serve-static": "^1.13.1" } }, "node_modules/@react-native-community/cli-doctor": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-12.3.0.tgz", - "integrity": "sha512-BPCwNNesoQMkKsxB08Ayy6URgGQ8Kndv6mMhIvJSNdST3J1+x3ehBHXzG9B9Vfi+DrTKRb8lmEl/b/7VkDlPkA==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-12.3.2.tgz", + "integrity": "sha512-GrAabdY4qtBX49knHFvEAdLtCjkmndjTeqhYO6BhsbAeKOtspcLT/0WRgdLIaKODRa61ADNB3K5Zm4dU0QrZOg==", "dev": true, "dependencies": { - "@react-native-community/cli-config": "12.3.0", - "@react-native-community/cli-platform-android": "12.3.0", - "@react-native-community/cli-platform-ios": "12.3.0", - "@react-native-community/cli-tools": "12.3.0", + "@react-native-community/cli-config": "12.3.2", + "@react-native-community/cli-platform-android": "12.3.2", + "@react-native-community/cli-platform-ios": "12.3.2", + "@react-native-community/cli-tools": "12.3.2", "chalk": "^4.1.2", "command-exists": "^1.2.8", "deepmerge": "^4.3.0", @@ -2499,25 +2440,25 @@ } }, "node_modules/@react-native-community/cli-hermes": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-12.3.0.tgz", - "integrity": "sha512-G6FxpeZBO4AimKZwtWR3dpXRqTvsmEqlIkkxgwthdzn3LbVjDVIXKpVYU9PkR5cnT+KuAUxO0WwthrJ6Nmrrlg==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-12.3.2.tgz", + "integrity": "sha512-SL6F9O8ghp4ESBFH2YAPLtIN39jdnvGBKnK4FGKpDCjtB3DnUmDsGFlH46S+GGt5M6VzfG2eeKEOKf3pZ6jUzA==", "dev": true, "dependencies": { - "@react-native-community/cli-platform-android": "12.3.0", - "@react-native-community/cli-tools": "12.3.0", + "@react-native-community/cli-platform-android": "12.3.2", + "@react-native-community/cli-tools": "12.3.2", "chalk": "^4.1.2", "hermes-profile-transformer": "^0.0.6", "ip": "^1.1.5" } }, "node_modules/@react-native-community/cli-platform-android": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-12.3.0.tgz", - "integrity": "sha512-VU1NZw63+GLU2TnyQ919bEMThpHQ/oMFju9MCfrd3pyPJz4Sn+vc3NfnTDUVA5Z5yfLijFOkHIHr4vo/C9bjnw==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-12.3.2.tgz", + "integrity": "sha512-MZ5nO8yi/N+Fj2i9BJcJ9C/ez+9/Ir7lQt49DWRo9YDmzye66mYLr/P2l/qxsixllbbDi7BXrlLpxaEhMrDopg==", "dev": true, "dependencies": { - "@react-native-community/cli-tools": "12.3.0", + "@react-native-community/cli-tools": "12.3.2", "chalk": "^4.1.2", "execa": "^5.0.0", "fast-xml-parser": "^4.2.4", @@ -2526,12 +2467,12 @@ } }, "node_modules/@react-native-community/cli-platform-ios": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-12.3.0.tgz", - "integrity": "sha512-H95Sgt3wT7L8V75V0syFJDtv4YgqK5zbu69ko4yrXGv8dv2EBi6qZP0VMmkqXDamoPm9/U7tDTdbcf26ctnLfg==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-12.3.2.tgz", + "integrity": "sha512-OcWEAbkev1IL6SUiQnM6DQdsvfsKZhRZtoBNSj9MfdmwotVZSOEZJ+IjZ1FR9ChvMWayO9ns/o8LgoQxr1ZXeg==", "dev": true, "dependencies": { - "@react-native-community/cli-tools": "12.3.0", + "@react-native-community/cli-tools": "12.3.2", "chalk": "^4.1.2", "execa": "^5.0.0", "fast-xml-parser": "^4.0.12", @@ -2540,19 +2481,19 @@ } }, "node_modules/@react-native-community/cli-plugin-metro": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-12.3.0.tgz", - "integrity": "sha512-tYNHIYnNmxrBcsqbE2dAnLMzlKI3Cp1p1xUgTrNaOMsGPDN1epzNfa34n6Nps3iwKElSL7Js91CzYNqgTalucA==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-12.3.2.tgz", + "integrity": "sha512-FpFBwu+d2E7KRhYPTkKvQsWb2/JKsJv+t1tcqgQkn+oByhp+qGyXBobFB8/R3yYvRRDCSDhS+atWTJzk9TjM8g==", "dev": true }, "node_modules/@react-native-community/cli-server-api": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-12.3.0.tgz", - "integrity": "sha512-Rode8NrdyByC+lBKHHn+/W8Zu0c+DajJvLmOWbe2WY/ECvnwcd9MHHbu92hlT2EQaJ9LbLhGrSbQE3cQy9EOCw==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-12.3.2.tgz", + "integrity": "sha512-iwa7EO9XFA/OjI5pPLLpI/6mFVqv8L73kNck3CNOJIUCCveGXBKK0VMyOkXaf/BYnihgQrXh+x5cxbDbggr7+Q==", "dev": true, "dependencies": { - "@react-native-community/cli-debugger-ui": "12.3.0", - "@react-native-community/cli-tools": "12.3.0", + "@react-native-community/cli-debugger-ui": "12.3.2", + "@react-native-community/cli-tools": "12.3.2", "compression": "^1.7.1", "connect": "^3.6.5", "errorhandler": "^1.5.1", @@ -2563,9 +2504,9 @@ } }, "node_modules/@react-native-community/cli-tools": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-12.3.0.tgz", - "integrity": "sha512-2GafnCr8D88VdClwnm9KZfkEb+lzVoFdr/7ybqhdeYM0Vnt/tr2N+fM1EQzwI1DpzXiBzTYemw8GjRq+Utcz2Q==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-12.3.2.tgz", + "integrity": "sha512-nDH7vuEicHI2TI0jac/DjT3fr977iWXRdgVAqPZFFczlbs7A8GQvEdGnZ1G8dqRUmg+kptw0e4hwczAOG89JzQ==", "dev": true, "dependencies": { "appdirsjs": "^1.2.4", @@ -2642,9 +2583,9 @@ } }, "node_modules/@react-native-community/cli-types": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-12.3.0.tgz", - "integrity": "sha512-MgOkmrXH4zsGxhte4YqKL7d+N8ZNEd3w1wo56MZlhu5WabwCJh87wYpU5T8vyfujFLYOFuFK5jjlcbs8F4/WDw==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-12.3.2.tgz", + "integrity": "sha512-9D0UEFqLW8JmS16mjHJxUJWX8E+zJddrHILSH8AJHZ0NNHv4u2DXKdb0wFLMobFxGNxPT+VSOjc60fGvXzWHog==", "dev": true, "dependencies": { "joi": "^17.2.1" @@ -2660,21 +2601,21 @@ } }, "node_modules/@react-native/babel-plugin-codegen": { - "version": "0.74.0", - "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.74.0.tgz", - "integrity": "sha512-xAM/eVSb5LBkKue3bDZgt76bdsGGzKeF/iEzUNbDTwRQrB3Q5GoceGNM/zVlF+z1xGAkr3jhL+ZyITZGSoIlgw==", + "version": "0.73.4", + "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.73.4.tgz", + "integrity": "sha512-XzRd8MJGo4Zc5KsphDHBYJzS1ryOHg8I2gOZDAUCGcwLFhdyGu1zBNDJYH2GFyDrInn9TzAbRIf3d4O+eltXQQ==", "dev": true, "dependencies": { - "@react-native/codegen": "*" + "@react-native/codegen": "0.73.3" }, "engines": { "node": ">=18" } }, "node_modules/@react-native/babel-preset": { - "version": "0.74.0", - "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.74.0.tgz", - "integrity": "sha512-k+1aaYQeLn+GBmGA5Qs3NKI8uzhLvRRMML+pB/+43ZL6DvCklbuJ5KO5oqRRpF3KZ2t/VKUqqSichpXfFrXGjg==", + "version": "0.73.21", + "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.73.21.tgz", + "integrity": "sha512-WlFttNnySKQMeujN09fRmrdWqh46QyJluM5jdtDNrkl/2Hx6N4XeDUGhABvConeK95OidVO7sFFf7sNebVXogA==", "dev": true, "dependencies": { "@babel/core": "^7.20.0", @@ -2716,7 +2657,7 @@ "@babel/plugin-transform-typescript": "^7.5.0", "@babel/plugin-transform-unicode-regex": "^7.0.0", "@babel/template": "^7.0.0", - "@react-native/babel-plugin-codegen": "*", + "@react-native/babel-plugin-codegen": "0.73.4", "babel-plugin-transform-flow-enums": "^0.0.2", "react-refresh": "^0.14.0" }, @@ -2737,9 +2678,9 @@ } }, "node_modules/@react-native/codegen": { - "version": "0.73.2", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.73.2.tgz", - "integrity": "sha512-lfy8S7umhE3QLQG5ViC4wg5N1Z+E6RnaeIw8w1voroQsXXGPB72IBozh8dAHR3+ceTxIU0KX3A8OpJI8e1+HpQ==", + "version": "0.73.3", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.73.3.tgz", + "integrity": "sha512-sxslCAAb8kM06vGy9Jyh4TtvjhcP36k/rvj2QE2Jdhdm61KvfafCATSIsOfc0QvnduWFcpXUPvAVyYwuv7PYDg==", "dev": true, "dependencies": { "@babel/parser": "^7.20.0", @@ -2758,20 +2699,20 @@ } }, "node_modules/@react-native/community-cli-plugin": { - "version": "0.73.11", - "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.73.11.tgz", - "integrity": "sha512-s0bprwljKS1Al8wOKathDDmRyF+70CcNE2G/aqZ7+L0NoOE0Uxxx/5P2BxlM2Mfht7O33B4SeMNiPdE/FqIubQ==", + "version": "0.73.16", + "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.73.16.tgz", + "integrity": "sha512-eNH3v3qJJF6f0n/Dck90qfC9gVOR4coAXMTdYECO33GfgjTi+73vf/SBqlXw9HICH/RNZYGPM3wca4FRF7TYeQ==", "dev": true, "dependencies": { - "@react-native-community/cli-server-api": "12.3.0", - "@react-native-community/cli-tools": "12.3.0", - "@react-native/dev-middleware": "^0.73.6", - "@react-native/metro-babel-transformer": "^0.73.12", + "@react-native-community/cli-server-api": "12.3.2", + "@react-native-community/cli-tools": "12.3.2", + "@react-native/dev-middleware": "0.73.7", + "@react-native/metro-babel-transformer": "0.73.15", "chalk": "^4.0.0", "execa": "^5.1.1", - "metro": "^0.80.0", - "metro-config": "^0.80.0", - "metro-core": "^0.80.0", + "metro": "^0.80.3", + "metro-config": "^0.80.3", + "metro-core": "^0.80.3", "node-fetch": "^2.2.0", "readline": "^1.3.0" }, @@ -2789,13 +2730,13 @@ } }, "node_modules/@react-native/dev-middleware": { - "version": "0.73.6", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.73.6.tgz", - "integrity": "sha512-9SD7gIso+hO1Jy1Y/Glbd+JWQwyH7Xjnwebtkxdm5TMB51LQPjaGtMcwEigbIZyAtvoaDGmhWmudwbKpDlS+gA==", + "version": "0.73.7", + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.73.7.tgz", + "integrity": "sha512-BZXpn+qKp/dNdr4+TkZxXDttfx8YobDh8MFHsMk9usouLm22pKgFIPkGBV0X8Do4LBkFNPGtrnsKkWk/yuUXKg==", "dev": true, "dependencies": { "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "^0.73.3", + "@react-native/debugger-frontend": "0.73.3", "chrome-launcher": "^0.15.2", "chromium-edge-launcher": "^1.0.0", "connect": "^3.6.5", @@ -2859,14 +2800,13 @@ } }, "node_modules/@react-native/metro-babel-transformer": { - "version": "0.73.12", - "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.73.12.tgz", - "integrity": "sha512-VmxN5aaoOprzDzUR+8c3XYhG0FoMOO6n0ToylCW6EeZCuf5RTY7HWVOhacabGoB1mHrWzJ0wWEsqX+eD4iFxoA==", + "version": "0.73.15", + "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.73.15.tgz", + "integrity": "sha512-LlkSGaXCz+xdxc9819plmpsl4P4gZndoFtpjN3GMBIu6f7TBV0GVbyJAU4GE8fuAWPVSVL5ArOcdkWKSbI1klw==", "dev": true, "dependencies": { "@babel/core": "^7.20.0", - "@react-native/babel-preset": "*", - "babel-preset-fbjs": "^3.4.0", + "@react-native/babel-preset": "0.73.21", "hermes-parser": "0.15.0", "nullthrows": "^1.1.1" }, @@ -2883,23 +2823,10 @@ "integrity": "sha512-bRBcb2T+I88aG74LMVHaKms2p/T8aQd8+BZ7LuuzXlRfog1bMWWn/C5i0HVuvW4RPtXQYgIlGiXVDy9Ir1So/w==", "dev": true }, - "node_modules/@react-native/virtualized-lists": { - "version": "0.72.8", - "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.72.8.tgz", - "integrity": "sha512-J3Q4Bkuo99k7mu+jPS9gSUSgq+lLRSI/+ahXNwV92XgJ/8UgOTxu2LPwhJnBk/sQKxq7E8WkZBnBiozukQMqrw==", - "dev": true, - "dependencies": { - "invariant": "^2.2.4", - "nullthrows": "^1.1.1" - }, - "peerDependencies": { - "react-native": "*" - } - }, "node_modules/@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", "dev": true, "dependencies": { "@hapi/hoek": "^9.0.0" @@ -3082,9 +3009,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.2.45", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.45.tgz", - "integrity": "sha512-TtAxCNrlrBp8GoeEp1npd5g+d/OejJHFxS3OWmrPBMFaVQMSN0OFySozJio5BHxTuTeug00AVXVAjfDSfk+lUg==", + "version": "18.2.55", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.55.tgz", + "integrity": "sha512-Y2Tz5P4yz23brwm2d7jNon39qoAtMMmalOQv6+fEFt1mT+FcM3D841wDpoUvFXhaYenuROCy3FZYqdTjM7qVyA==", "dev": true, "dependencies": { "@types/prop-types": "*", @@ -3093,12 +3020,21 @@ } }, "node_modules/@types/react-native": { - "version": "0.72.8", - "resolved": "https://registry.npmjs.org/@types/react-native/-/react-native-0.72.8.tgz", - "integrity": "sha512-St6xA7+EoHN5mEYfdWnfYt0e8u6k2FR0P9s2arYgakQGFgU1f9FlPrIEcj0X24pLCF5c5i3WVuLCUdiCYHmOoA==", + "version": "0.73.0", + "resolved": "https://registry.npmjs.org/@types/react-native/-/react-native-0.73.0.tgz", + "integrity": "sha512-6ZRPQrYM72qYKGWidEttRe6M5DZBEV5F+MHMHqd4TTYx0tfkcdrUFGdef6CCxY0jXU7wldvd/zA/b0A/kTeJmA==", + "deprecated": "This is a stub types definition. react-native provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "react-native": "*" + } + }, + "node_modules/@types/react-test-renderer": { + "version": "18.0.7", + "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-18.0.7.tgz", + "integrity": "sha512-1+ANPOWc6rB3IkSnElhjv6VLlKg2dSv/OWClUyZimbLsQyBn8Js9Vtdsi3UICJ2rIQ3k2la06dkB+C92QfhKmg==", "dev": true, "dependencies": { - "@react-native/virtualized-lists": "^0.72.4", "@types/react": "*" } }, @@ -3791,12 +3727,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-plugin-syntax-trailing-function-commas": { - "version": "7.0.0-beta.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz", - "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==", - "dev": true - }, "node_modules/babel-plugin-transform-flow-enums": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz", @@ -3829,44 +3759,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/babel-preset-fbjs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz", - "integrity": "sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==", - "dev": true, - "dependencies": { - "@babel/plugin-proposal-class-properties": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.0.0", - "@babel/plugin-syntax-class-properties": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-block-scoped-functions": "^7.0.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.0.0", - "@babel/plugin-transform-flow-strip-types": "^7.0.0", - "@babel/plugin-transform-for-of": "^7.0.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-member-expression-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-object-super": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-property-literals": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-template-literals": "^7.0.0", - "babel-plugin-syntax-trailing-function-commas": "^7.0.0-beta.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, "node_modules/babel-preset-jest": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", @@ -4784,9 +4676,9 @@ } }, "node_modules/envinfo": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", - "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==", + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.1.tgz", + "integrity": "sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg==", "dev": true, "bin": { "envinfo": "dist/cli.js" @@ -5432,9 +5324,9 @@ "dev": true }, "node_modules/fast-xml-parser": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.2.tgz", - "integrity": "sha512-rmrXUXwbJedoXkStenj1kkljNF7ugn5ZjR9FJcwmCfcCbtOMDghPajbc+Tck6vE6F5XsDmx+Pr2le9fw8+pXBg==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.4.tgz", + "integrity": "sha512-utnwm92SyozgA3hhH2I8qldf2lBqm6qHOICawRNRFu1qMe3+oqr+GcXjGqTmXTMGE5T4eC03kr/rlh5C1IRdZA==", "dev": true, "funding": [ { @@ -6037,9 +5929,9 @@ } }, "node_modules/image-size": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", - "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", + "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", "dev": true, "dependencies": { "queue": "6.0.2" @@ -6048,7 +5940,7 @@ "image-size": "bin/image-size.js" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.x" } }, "node_modules/import-fresh": { @@ -7524,14 +7416,14 @@ } }, "node_modules/joi": { - "version": "17.11.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz", - "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==", + "version": "17.12.1", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.1.tgz", + "integrity": "sha512-vtxmq+Lsc5SlfqotnfVjlViWfOL9nt/avKNbKYizwf6gsCfq9NYY/ceYRMFD8XDdrjJ9abJyScWmhmIiy+XRtQ==", "dev": true, "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", "@sideway/formula": "^3.0.1", "@sideway/pinpoint": "^2.0.0" } @@ -7991,9 +7883,9 @@ } }, "node_modules/metro": { - "version": "0.80.2", - "resolved": "https://registry.npmjs.org/metro/-/metro-0.80.2.tgz", - "integrity": "sha512-iavBVpr3v4YD2XWUsL7peq/lUquX5KTH+dKc5Rw13XnDHDfoRgcMOmQjSn3xcFxP0R9P4uABML8YegAekoqjQg==", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.80.5.tgz", + "integrity": "sha512-OE/CGbOgbi8BlTN1QqJgKOBaC27dS0JBQw473JcivrpgVnqIsluROA7AavEaTVUrB9wPUZvoNVDROn5uiM2jfw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.0.0", @@ -8011,25 +7903,24 @@ "denodeify": "^1.2.1", "error-stack-parser": "^2.0.6", "graceful-fs": "^4.2.4", - "hermes-parser": "0.18.0", + "hermes-parser": "0.18.2", "image-size": "^1.0.2", "invariant": "^2.2.4", "jest-worker": "^29.6.3", "jsc-safe-url": "^0.2.2", "lodash.throttle": "^4.1.1", - "metro-babel-transformer": "0.80.2", - "metro-cache": "0.80.2", - "metro-cache-key": "0.80.2", - "metro-config": "0.80.2", - "metro-core": "0.80.2", - "metro-file-map": "0.80.2", - "metro-minify-terser": "0.80.2", - "metro-resolver": "0.80.2", - "metro-runtime": "0.80.2", - "metro-source-map": "0.80.2", - "metro-symbolicate": "0.80.2", - "metro-transform-plugins": "0.80.2", - "metro-transform-worker": "0.80.2", + "metro-babel-transformer": "0.80.5", + "metro-cache": "0.80.5", + "metro-cache-key": "0.80.5", + "metro-config": "0.80.5", + "metro-core": "0.80.5", + "metro-file-map": "0.80.5", + "metro-resolver": "0.80.5", + "metro-runtime": "0.80.5", + "metro-source-map": "0.80.5", + "metro-symbolicate": "0.80.5", + "metro-transform-plugins": "0.80.5", + "metro-transform-worker": "0.80.5", "mime-types": "^2.1.27", "node-fetch": "^2.2.0", "nullthrows": "^1.1.1", @@ -8049,13 +7940,13 @@ } }, "node_modules/metro-babel-transformer": { - "version": "0.80.2", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.80.2.tgz", - "integrity": "sha512-QR+HCD5rswoLVMZOU95dda0XmrT3dDnm+pq+ql/Q6RCDBY0BUS7Z1l1mN9jq/MRBy2QOW+IKKgSMTIC9Khtbpw==", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.80.5.tgz", + "integrity": "sha512-sxH6hcWCorhTbk4kaShCWsadzu99WBL4Nvq4m/sDTbp32//iGuxtAnUK+ZV+6IEygr2u9Z0/4XoZ8Sbcl71MpA==", "dev": true, "dependencies": { "@babel/core": "^7.20.0", - "hermes-parser": "0.18.0", + "hermes-parser": "0.18.2", "nullthrows": "^1.1.1" }, "engines": { @@ -8063,27 +7954,27 @@ } }, "node_modules/metro-babel-transformer/node_modules/hermes-estree": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.18.0.tgz", - "integrity": "sha512-WaIudIVKo5QWFqz1ta53HqSDuVxYST/MUuP9X7dqUpbHse3E2gzJq/7hEtgx84hh2XSNWN1AhYho3ThOA85uCA==", + "version": "0.18.2", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.18.2.tgz", + "integrity": "sha512-KoLsoWXJ5o81nit1wSyEZnWUGy9cBna9iYMZBR7skKh7okYAYKqQ9/OczwpMHn/cH0hKDyblulGsJ7FknlfVxQ==", "dev": true }, "node_modules/metro-babel-transformer/node_modules/hermes-parser": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.18.0.tgz", - "integrity": "sha512-DIIM6vsy30BU5hNkOXh6MR2r4ZAxVhbfyTnmfo/rqUf3KySlNWn9fWiOcpuGAdDN2o5sdPCpu6cep3a23d1Klw==", + "version": "0.18.2", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.18.2.tgz", + "integrity": "sha512-1eQfvib+VPpgBZ2zYKQhpuOjw1tH+Emuib6QmjkJWJMhyjM8xnXMvA+76o9LhF0zOAJDZgPfQhg43cyXEyl5Ew==", "dev": true, "dependencies": { - "hermes-estree": "0.18.0" + "hermes-estree": "0.18.2" } }, "node_modules/metro-cache": { - "version": "0.80.2", - "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.80.2.tgz", - "integrity": "sha512-ELz2GcXLDyT5w4awaL+6bb3X6Eg6RS5CcQ5CcXAgCCFqBwRuTBHkztK1rLyp7IX76Xb2wlz7781T9H4CCtxD5w==", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.80.5.tgz", + "integrity": "sha512-2u+dQ4PZwmC7eZo9uMBNhQQMig9f+w4QWBZwXCdVy/RYOHM0eObgGdMEOwODo73uxie82T9lWzxr3aZOZ+Nqtw==", "dev": true, "dependencies": { - "metro-core": "0.80.2", + "metro-core": "0.80.5", "rimraf": "^3.0.2" }, "engines": { @@ -8091,49 +7982,49 @@ } }, "node_modules/metro-cache-key": { - "version": "0.80.2", - "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.80.2.tgz", - "integrity": "sha512-ldNEFiq9COBZSZOBgyHvil4dtIWZsJahbByGDh6f5jPrkj9cBih1rGeo9ix+MLl7aVh2cA3hHQjyponQsfXcnQ==", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.80.5.tgz", + "integrity": "sha512-fr3QLZUarsB3tRbVcmr34kCBsTHk0Sh9JXGvBY/w3b2lbre+Lq5gtgLyFElHPecGF7o4z1eK9r3ubxtScHWcbA==", "dev": true, "engines": { "node": ">=18" } }, "node_modules/metro-config": { - "version": "0.80.2", - "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.80.2.tgz", - "integrity": "sha512-3U7S3uakSwUyXp3E0V2mhLT+82EzIeBuOFav4mKNIq9dl9AW62x5o5e8q3bmyHwDWg+RZ8jIBkAURKrhS/eALw==", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.80.5.tgz", + "integrity": "sha512-elqo/lwvF+VjZ1OPyvmW/9hSiGlmcqu+rQvDKw5F5WMX48ZC+ySTD1WcaD7e97pkgAlJHVYqZ98FCjRAYOAFRQ==", "dev": true, "dependencies": { "connect": "^3.6.5", "cosmiconfig": "^5.0.5", "jest-validate": "^29.6.3", - "metro": "0.80.2", - "metro-cache": "0.80.2", - "metro-core": "0.80.2", - "metro-runtime": "0.80.2" + "metro": "0.80.5", + "metro-cache": "0.80.5", + "metro-core": "0.80.5", + "metro-runtime": "0.80.5" }, "engines": { "node": ">=18" } }, "node_modules/metro-core": { - "version": "0.80.2", - "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.80.2.tgz", - "integrity": "sha512-RL1iHZlR+3tvrJIBE/W6YlwW7OH1ckcgCCEr7bxEqUTNRiraK2zTv2jJ4b7VS/Xftdzvungk8ls3FNem5MFrIw==", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.80.5.tgz", + "integrity": "sha512-vkLuaBhnZxTVpaZO8ZJVEHzjaqSXpOdpAiztSZ+NDaYM6jEFgle3/XIbLW91jTSf2+T8Pj5yB1G7KuOX+BcVwg==", "dev": true, "dependencies": { "lodash.throttle": "^4.1.1", - "metro-resolver": "0.80.2" + "metro-resolver": "0.80.5" }, "engines": { "node": ">=18" } }, "node_modules/metro-file-map": { - "version": "0.80.2", - "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.80.2.tgz", - "integrity": "sha512-/GiFdE5nhtvviDPANH9j3SE6VG4j2DaaKia+0gzyVYwP+6Kjc2oADj6FCGFOXDdCizqeqASUSgEsp+06D8+tXw==", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.80.5.tgz", + "integrity": "sha512-bKCvJ05drjq6QhQxnDUt3I8x7bTcHo3IIKVobEr14BK++nmxFGn/BmFLRzVBlghM6an3gqwpNEYxS5qNc+VKcg==", "dev": true, "dependencies": { "anymatch": "^3.0.3", @@ -8170,9 +8061,9 @@ "dev": true }, "node_modules/metro-minify-terser": { - "version": "0.80.2", - "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.80.2.tgz", - "integrity": "sha512-+0lN1uJsFKke+RaZVZE3vxD8vVuGDiH/roiUzTIktof2rBtBmXJAx+TYjy1SZQN48eHot9CaAXZ6MfiSVJiPew==", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.80.5.tgz", + "integrity": "sha512-S7oZLLcab6YXUT6jYFX/ZDMN7Fq6xBGGAG8liMFU1UljX6cTcEC2u+UIafYgCLrdVexp/+ClxrIetVPZ5LtL/g==", "dev": true, "dependencies": { "terser": "^5.15.0" @@ -8233,18 +8124,18 @@ } }, "node_modules/metro-resolver": { - "version": "0.80.2", - "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.80.2.tgz", - "integrity": "sha512-0OmCsmlcBQWkJXx0YoYRTS+ArRT888WcgmgjwoJVQm+xdMRKuu67ihyF8EOpeVgOzbeo0IxVjkNmbJWOfficjA==", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.80.5.tgz", + "integrity": "sha512-haJ/Hveio3zv/Fr4eXVdKzjUeHHDogYok7OpRqPSXGhTXisNXB+sLN7CpcUrCddFRUDLnVaqQOYwhYsFndgUwA==", "dev": true, "engines": { "node": ">=18" } }, "node_modules/metro-runtime": { - "version": "0.80.2", - "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.80.2.tgz", - "integrity": "sha512-ruIlSEVnmJGbLnZIGf8/ra+qoD1Knft0R+5laUpp/KEGkD+GEr4XgP+5j5Uuq3v36qDLFTj1KXfQP5JVoeM8zw==", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.80.5.tgz", + "integrity": "sha512-L0syTWJUdWzfUmKgkScr6fSBVTh6QDr8eKEkRtn40OBd8LPagrJGySBboWSgbyn9eIb4ayW3Y347HxgXBSAjmg==", "dev": true, "dependencies": { "@babel/runtime": "^7.0.0" @@ -8254,17 +8145,17 @@ } }, "node_modules/metro-source-map": { - "version": "0.80.2", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.80.2.tgz", - "integrity": "sha512-fM6RwYCJrwfqVk8Z1ApvJ3+Zz7fso38AszmAXqFDXziOC0AfmMCv/W9FosE9BY+y5QJ7YcvW0RIYLQhpCn+V9w==", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.80.5.tgz", + "integrity": "sha512-DwSF4l03mKPNqCtyQ6K23I43qzU1BViAXnuH81eYWdHglP+sDlPpY+/7rUahXEo6qXEHXfAJgVoo1sirbXbmsQ==", "dev": true, "dependencies": { "@babel/traverse": "^7.20.0", "@babel/types": "^7.20.0", "invariant": "^2.2.4", - "metro-symbolicate": "0.80.2", + "metro-symbolicate": "0.80.5", "nullthrows": "^1.1.1", - "ob1": "0.80.2", + "ob1": "0.80.5", "source-map": "^0.5.6", "vlq": "^1.0.0" }, @@ -8282,13 +8173,13 @@ } }, "node_modules/metro-symbolicate": { - "version": "0.80.2", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.80.2.tgz", - "integrity": "sha512-G/gJbl/XRGlgjAQSmZ5Rtym//7MSaE2Bj+28BBVqF6fse5y2kw9J7weNDfLjRfKDNaMUoC4mjc6TYjW7gPuGng==", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.80.5.tgz", + "integrity": "sha512-IsM4mTYvmo9JvIqwEkCZ5+YeDVPST78Q17ZgljfLdHLSpIivOHp9oVoiwQ/YGbLx0xRHRIS/tKiXueWBnj3UWA==", "dev": true, "dependencies": { "invariant": "^2.2.4", - "metro-source-map": "0.80.2", + "metro-source-map": "0.80.5", "nullthrows": "^1.1.1", "source-map": "^0.5.6", "through2": "^2.0.1", @@ -8311,9 +8202,9 @@ } }, "node_modules/metro-transform-plugins": { - "version": "0.80.2", - "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.80.2.tgz", - "integrity": "sha512-edokA2lPM3zzJRa55ze2mzVHCUNeJs4CPPrntdVOnf2WkEO/snV4RIgQDVkxFgPc8nI4iLB8cwZZQvdvH3v8gA==", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.80.5.tgz", + "integrity": "sha512-7IdlTqK/k5+qE3RvIU5QdCJUPk4tHWEqgVuYZu8exeW+s6qOJ66hGIJjXY/P7ccucqF+D4nsbAAW5unkoUdS6g==", "dev": true, "dependencies": { "@babel/core": "^7.20.0", @@ -8327,21 +8218,22 @@ } }, "node_modules/metro-transform-worker": { - "version": "0.80.2", - "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.80.2.tgz", - "integrity": "sha512-QtAntH+8AA06PDpXqM6/N42cvgw665TXp9mKKwrYL/d4lVemNNJte0CJ71KO4MmYQ5UvSDonwbTlOXJOnR8m6w==", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.80.5.tgz", + "integrity": "sha512-Q1oM7hfP+RBgAtzRFBDjPhArELUJF8iRCZ8OidqCpYzQJVGuJZ7InSnIf3hn1JyqiUQwv2f1LXBO78i2rAjzyA==", "dev": true, "dependencies": { "@babel/core": "^7.20.0", "@babel/generator": "^7.20.0", "@babel/parser": "^7.20.0", "@babel/types": "^7.20.0", - "metro": "0.80.2", - "metro-babel-transformer": "0.80.2", - "metro-cache": "0.80.2", - "metro-cache-key": "0.80.2", - "metro-source-map": "0.80.2", - "metro-transform-plugins": "0.80.2", + "metro": "0.80.5", + "metro-babel-transformer": "0.80.5", + "metro-cache": "0.80.5", + "metro-cache-key": "0.80.5", + "metro-minify-terser": "0.80.5", + "metro-source-map": "0.80.5", + "metro-transform-plugins": "0.80.5", "nullthrows": "^1.1.1" }, "engines": { @@ -8364,18 +8256,18 @@ } }, "node_modules/metro/node_modules/hermes-estree": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.18.0.tgz", - "integrity": "sha512-WaIudIVKo5QWFqz1ta53HqSDuVxYST/MUuP9X7dqUpbHse3E2gzJq/7hEtgx84hh2XSNWN1AhYho3ThOA85uCA==", + "version": "0.18.2", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.18.2.tgz", + "integrity": "sha512-KoLsoWXJ5o81nit1wSyEZnWUGy9cBna9iYMZBR7skKh7okYAYKqQ9/OczwpMHn/cH0hKDyblulGsJ7FknlfVxQ==", "dev": true }, "node_modules/metro/node_modules/hermes-parser": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.18.0.tgz", - "integrity": "sha512-DIIM6vsy30BU5hNkOXh6MR2r4ZAxVhbfyTnmfo/rqUf3KySlNWn9fWiOcpuGAdDN2o5sdPCpu6cep3a23d1Klw==", + "version": "0.18.2", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.18.2.tgz", + "integrity": "sha512-1eQfvib+VPpgBZ2zYKQhpuOjw1tH+Emuib6QmjkJWJMhyjM8xnXMvA+76o9LhF0zOAJDZgPfQhg43cyXEyl5Ew==", "dev": true, "dependencies": { - "hermes-estree": "0.18.0" + "hermes-estree": "0.18.2" } }, "node_modules/metro/node_modules/ms": { @@ -8644,9 +8536,9 @@ "dev": true }, "node_modules/ob1": { - "version": "0.80.2", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.80.2.tgz", - "integrity": "sha512-dF78RVxoZjzSTfOWiZh6iaRtTrKyMhTiDtr/nDJOIN5hKj0pNjY7z/NueYCUH4EDgFmabv4r+WEihSu+qCI7Mg==", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.80.5.tgz", + "integrity": "sha512-zYDMnnNrFi/1Tqh0vo3PE4p97Tpl9/4MP2k2ECvkbLOZzQuAYZJLTUYVLZb7hJhbhjT+JJxAwBGS8iu5hCSd1w==", "dev": true, "engines": { "node": ">=18" @@ -9387,13 +9279,12 @@ } }, "node_modules/react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", "dev": true, "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" }, "engines": { "node": ">=0.10.0" @@ -9416,26 +9307,27 @@ "dev": true }, "node_modules/react-native": { - "version": "0.73.1", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.73.1.tgz", - "integrity": "sha512-nLl9O2yKRh1nMXwsk4SUiD0ddd19RqlKgNU9AU8bTK/zD2xwnVOG56YK1/22SN67niWyoeG83vVg1eTk+S6ReA==", + "version": "0.73.4", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.73.4.tgz", + "integrity": "sha512-VtS+Yr6OOTIuJGDECIYWzNU8QpJjASQYvMtfa/Hvm/2/h5GdB6W9H9TOmh13x07Lj4AOhNMx3XSsz6TdrO4jIg==", "dev": true, "dependencies": { "@jest/create-cache-key-function": "^29.6.3", - "@react-native-community/cli": "12.3.0", - "@react-native-community/cli-platform-android": "12.3.0", - "@react-native-community/cli-platform-ios": "12.3.0", - "@react-native/assets-registry": "^0.73.1", - "@react-native/codegen": "^0.73.2", - "@react-native/community-cli-plugin": "0.73.11", - "@react-native/gradle-plugin": "^0.73.4", - "@react-native/js-polyfills": "^0.73.1", - "@react-native/normalize-colors": "^0.73.2", - "@react-native/virtualized-lists": "^0.73.4", + "@react-native-community/cli": "12.3.2", + "@react-native-community/cli-platform-android": "12.3.2", + "@react-native-community/cli-platform-ios": "12.3.2", + "@react-native/assets-registry": "0.73.1", + "@react-native/codegen": "0.73.3", + "@react-native/community-cli-plugin": "0.73.16", + "@react-native/gradle-plugin": "0.73.4", + "@react-native/js-polyfills": "0.73.1", + "@react-native/normalize-colors": "0.73.2", + "@react-native/virtualized-lists": "0.73.4", "abort-controller": "^3.0.0", "anser": "^1.4.9", "ansi-regex": "^5.0.0", "base64-js": "^1.5.1", + "chalk": "^4.0.0", "deprecated-react-native-prop-types": "^5.0.0", "event-target-shim": "^5.0.1", "flow-enums-runtime": "^0.0.6", @@ -9443,8 +9335,8 @@ "jest-environment-node": "^29.6.3", "jsc-android": "^250231.0.0", "memoize-one": "^5.0.0", - "metro-runtime": "^0.80.0", - "metro-source-map": "^0.80.0", + "metro-runtime": "^0.80.3", + "metro-source-map": "^0.80.3", "mkdirp": "^0.5.1", "nullthrows": "^1.1.1", "pretty-format": "^26.5.2", @@ -9525,6 +9417,35 @@ "react": "^16.0.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/react-test-renderer": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-18.2.0.tgz", + "integrity": "sha512-JWD+aQ0lh2gvh4NM3bBM42Kx+XybOxCpgYK7F8ugAlpaTSnWsX+39Z4XkOykGZAHrjwwTZT3x3KxswVWxHPUqA==", + "dev": true, + "dependencies": { + "react-is": "^18.2.0", + "react-shallow-renderer": "^16.15.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-test-renderer/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/react-test-renderer/node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dev": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -10590,9 +10511,9 @@ } }, "node_modules/terser": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz", - "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", + "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -12106,15 +12027,6 @@ "@babel/helper-remap-async-to-generator": "^7.22.20" } }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", - "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, "@babel/plugin-transform-block-scoping": { "version": "7.15.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz", @@ -12213,15 +12125,6 @@ "@babel/helper-plugin-utils": "^7.14.5" } }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", - "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, "@babel/plugin-transform-modules-commonjs": { "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", @@ -12252,16 +12155,6 @@ "@babel/helper-plugin-utils": "^7.14.5" } }, - "@babel/plugin-transform-object-super": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", - "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20" - } - }, "@babel/plugin-transform-parameters": { "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", @@ -12293,15 +12186,6 @@ "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, - "@babel/plugin-transform-property-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", - "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, "@babel/plugin-transform-react-display-name": { "version": "7.15.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.15.1.tgz", @@ -12457,15 +12341,15 @@ } }, "@babel/register": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.22.15.tgz", - "integrity": "sha512-V3Q3EqoQdn65RCgTLwauZaTfd1ShhwPmbBv+1dkZV/HpCGMKVyn6oFcRlI7RaKqiDQjX2Qd3AuoEguBgdjIKlg==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.23.7.tgz", + "integrity": "sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ==", "dev": true, "requires": { "clone-deep": "^4.0.1", "find-cache-dir": "^2.0.0", "make-dir": "^2.1.0", - "pirates": "^4.0.5", + "pirates": "^4.0.6", "source-map-support": "^0.5.16" } }, @@ -13048,20 +12932,20 @@ } }, "@react-native-community/cli": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-12.3.0.tgz", - "integrity": "sha512-XeQohi2E+S2+MMSz97QcEZ/bWpi8sfKiQg35XuYeJkc32Til2g0b97jRpn0/+fV0BInHoG1CQYWwHA7opMsrHg==", - "dev": true, - "requires": { - "@react-native-community/cli-clean": "12.3.0", - "@react-native-community/cli-config": "12.3.0", - "@react-native-community/cli-debugger-ui": "12.3.0", - "@react-native-community/cli-doctor": "12.3.0", - "@react-native-community/cli-hermes": "12.3.0", - "@react-native-community/cli-plugin-metro": "12.3.0", - "@react-native-community/cli-server-api": "12.3.0", - "@react-native-community/cli-tools": "12.3.0", - "@react-native-community/cli-types": "12.3.0", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-12.3.2.tgz", + "integrity": "sha512-WgoUWwLDcf/G1Su2COUUVs3RzAwnV/vUTdISSpAUGgSc57mPabaAoUctKTnfYEhCnE3j02k3VtaVPwCAFRO3TQ==", + "dev": true, + "requires": { + "@react-native-community/cli-clean": "12.3.2", + "@react-native-community/cli-config": "12.3.2", + "@react-native-community/cli-debugger-ui": "12.3.2", + "@react-native-community/cli-doctor": "12.3.2", + "@react-native-community/cli-hermes": "12.3.2", + "@react-native-community/cli-plugin-metro": "12.3.2", + "@react-native-community/cli-server-api": "12.3.2", + "@react-native-community/cli-tools": "12.3.2", + "@react-native-community/cli-types": "12.3.2", "chalk": "^4.1.2", "commander": "^9.4.1", "deepmerge": "^4.3.0", @@ -13074,23 +12958,23 @@ } }, "@react-native-community/cli-clean": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-12.3.0.tgz", - "integrity": "sha512-iAgLCOWYRGh9ukr+eVQnhkV/OqN3V2EGd/in33Ggn/Mj4uO6+oUncXFwB+yjlyaUNz6FfjudhIz09yYGSF+9sg==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-12.3.2.tgz", + "integrity": "sha512-90k2hCX0ddSFPT7EN7h5SZj0XZPXP0+y/++v262hssoey3nhurwF57NGWN0XAR0o9BSW7+mBfeInfabzDraO6A==", "dev": true, "requires": { - "@react-native-community/cli-tools": "12.3.0", + "@react-native-community/cli-tools": "12.3.2", "chalk": "^4.1.2", "execa": "^5.0.0" } }, "@react-native-community/cli-config": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-12.3.0.tgz", - "integrity": "sha512-BrTn5ndFD9uOxO8kxBQ32EpbtOvAsQExGPI7SokdI4Zlve70FziLtTq91LTlTUgMq1InVZn/jJb3VIDk6BTInQ==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-12.3.2.tgz", + "integrity": "sha512-UUCzDjQgvAVL/57rL7eOuFUhd+d+6qfM7V8uOegQFeFEmSmvUUDLYoXpBa5vAK9JgQtSqMBJ1Shmwao+/oElxQ==", "dev": true, "requires": { - "@react-native-community/cli-tools": "12.3.0", + "@react-native-community/cli-tools": "12.3.2", "chalk": "^4.1.2", "cosmiconfig": "^5.1.0", "deepmerge": "^4.3.0", @@ -13099,24 +12983,24 @@ } }, "@react-native-community/cli-debugger-ui": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-12.3.0.tgz", - "integrity": "sha512-w3b0iwjQlk47GhZWHaeTG8kKH09NCMUJO729xSdMBXE8rlbm4kHpKbxQY9qKb6NlfWSJN4noGY+FkNZS2rRwnQ==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-12.3.2.tgz", + "integrity": "sha512-nSWQUL+51J682DlfcC1bjkUbQbGvHCC25jpqTwHIjmmVjYCX1uHuhPSqQKgPNdvtfOkrkACxczd7kVMmetxY2Q==", "dev": true, "requires": { "serve-static": "^1.13.1" } }, "@react-native-community/cli-doctor": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-12.3.0.tgz", - "integrity": "sha512-BPCwNNesoQMkKsxB08Ayy6URgGQ8Kndv6mMhIvJSNdST3J1+x3ehBHXzG9B9Vfi+DrTKRb8lmEl/b/7VkDlPkA==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-12.3.2.tgz", + "integrity": "sha512-GrAabdY4qtBX49knHFvEAdLtCjkmndjTeqhYO6BhsbAeKOtspcLT/0WRgdLIaKODRa61ADNB3K5Zm4dU0QrZOg==", "dev": true, "requires": { - "@react-native-community/cli-config": "12.3.0", - "@react-native-community/cli-platform-android": "12.3.0", - "@react-native-community/cli-platform-ios": "12.3.0", - "@react-native-community/cli-tools": "12.3.0", + "@react-native-community/cli-config": "12.3.2", + "@react-native-community/cli-platform-android": "12.3.2", + "@react-native-community/cli-platform-ios": "12.3.2", + "@react-native-community/cli-tools": "12.3.2", "chalk": "^4.1.2", "command-exists": "^1.2.8", "deepmerge": "^4.3.0", @@ -13133,25 +13017,25 @@ } }, "@react-native-community/cli-hermes": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-12.3.0.tgz", - "integrity": "sha512-G6FxpeZBO4AimKZwtWR3dpXRqTvsmEqlIkkxgwthdzn3LbVjDVIXKpVYU9PkR5cnT+KuAUxO0WwthrJ6Nmrrlg==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-12.3.2.tgz", + "integrity": "sha512-SL6F9O8ghp4ESBFH2YAPLtIN39jdnvGBKnK4FGKpDCjtB3DnUmDsGFlH46S+GGt5M6VzfG2eeKEOKf3pZ6jUzA==", "dev": true, "requires": { - "@react-native-community/cli-platform-android": "12.3.0", - "@react-native-community/cli-tools": "12.3.0", + "@react-native-community/cli-platform-android": "12.3.2", + "@react-native-community/cli-tools": "12.3.2", "chalk": "^4.1.2", "hermes-profile-transformer": "^0.0.6", "ip": "^1.1.5" } }, "@react-native-community/cli-platform-android": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-12.3.0.tgz", - "integrity": "sha512-VU1NZw63+GLU2TnyQ919bEMThpHQ/oMFju9MCfrd3pyPJz4Sn+vc3NfnTDUVA5Z5yfLijFOkHIHr4vo/C9bjnw==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-12.3.2.tgz", + "integrity": "sha512-MZ5nO8yi/N+Fj2i9BJcJ9C/ez+9/Ir7lQt49DWRo9YDmzye66mYLr/P2l/qxsixllbbDi7BXrlLpxaEhMrDopg==", "dev": true, "requires": { - "@react-native-community/cli-tools": "12.3.0", + "@react-native-community/cli-tools": "12.3.2", "chalk": "^4.1.2", "execa": "^5.0.0", "fast-xml-parser": "^4.2.4", @@ -13160,12 +13044,12 @@ } }, "@react-native-community/cli-platform-ios": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-12.3.0.tgz", - "integrity": "sha512-H95Sgt3wT7L8V75V0syFJDtv4YgqK5zbu69ko4yrXGv8dv2EBi6qZP0VMmkqXDamoPm9/U7tDTdbcf26ctnLfg==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-12.3.2.tgz", + "integrity": "sha512-OcWEAbkev1IL6SUiQnM6DQdsvfsKZhRZtoBNSj9MfdmwotVZSOEZJ+IjZ1FR9ChvMWayO9ns/o8LgoQxr1ZXeg==", "dev": true, "requires": { - "@react-native-community/cli-tools": "12.3.0", + "@react-native-community/cli-tools": "12.3.2", "chalk": "^4.1.2", "execa": "^5.0.0", "fast-xml-parser": "^4.0.12", @@ -13174,19 +13058,19 @@ } }, "@react-native-community/cli-plugin-metro": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-12.3.0.tgz", - "integrity": "sha512-tYNHIYnNmxrBcsqbE2dAnLMzlKI3Cp1p1xUgTrNaOMsGPDN1epzNfa34n6Nps3iwKElSL7Js91CzYNqgTalucA==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-12.3.2.tgz", + "integrity": "sha512-FpFBwu+d2E7KRhYPTkKvQsWb2/JKsJv+t1tcqgQkn+oByhp+qGyXBobFB8/R3yYvRRDCSDhS+atWTJzk9TjM8g==", "dev": true }, "@react-native-community/cli-server-api": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-12.3.0.tgz", - "integrity": "sha512-Rode8NrdyByC+lBKHHn+/W8Zu0c+DajJvLmOWbe2WY/ECvnwcd9MHHbu92hlT2EQaJ9LbLhGrSbQE3cQy9EOCw==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-12.3.2.tgz", + "integrity": "sha512-iwa7EO9XFA/OjI5pPLLpI/6mFVqv8L73kNck3CNOJIUCCveGXBKK0VMyOkXaf/BYnihgQrXh+x5cxbDbggr7+Q==", "dev": true, "requires": { - "@react-native-community/cli-debugger-ui": "12.3.0", - "@react-native-community/cli-tools": "12.3.0", + "@react-native-community/cli-debugger-ui": "12.3.2", + "@react-native-community/cli-tools": "12.3.2", "compression": "^1.7.1", "connect": "^3.6.5", "errorhandler": "^1.5.1", @@ -13197,9 +13081,9 @@ } }, "@react-native-community/cli-tools": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-12.3.0.tgz", - "integrity": "sha512-2GafnCr8D88VdClwnm9KZfkEb+lzVoFdr/7ybqhdeYM0Vnt/tr2N+fM1EQzwI1DpzXiBzTYemw8GjRq+Utcz2Q==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-12.3.2.tgz", + "integrity": "sha512-nDH7vuEicHI2TI0jac/DjT3fr977iWXRdgVAqPZFFczlbs7A8GQvEdGnZ1G8dqRUmg+kptw0e4hwczAOG89JzQ==", "dev": true, "requires": { "appdirsjs": "^1.2.4", @@ -13254,9 +13138,9 @@ } }, "@react-native-community/cli-types": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-12.3.0.tgz", - "integrity": "sha512-MgOkmrXH4zsGxhte4YqKL7d+N8ZNEd3w1wo56MZlhu5WabwCJh87wYpU5T8vyfujFLYOFuFK5jjlcbs8F4/WDw==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-12.3.2.tgz", + "integrity": "sha512-9D0UEFqLW8JmS16mjHJxUJWX8E+zJddrHILSH8AJHZ0NNHv4u2DXKdb0wFLMobFxGNxPT+VSOjc60fGvXzWHog==", "dev": true, "requires": { "joi": "^17.2.1" @@ -13269,18 +13153,18 @@ "dev": true }, "@react-native/babel-plugin-codegen": { - "version": "0.74.0", - "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.74.0.tgz", - "integrity": "sha512-xAM/eVSb5LBkKue3bDZgt76bdsGGzKeF/iEzUNbDTwRQrB3Q5GoceGNM/zVlF+z1xGAkr3jhL+ZyITZGSoIlgw==", + "version": "0.73.4", + "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.73.4.tgz", + "integrity": "sha512-XzRd8MJGo4Zc5KsphDHBYJzS1ryOHg8I2gOZDAUCGcwLFhdyGu1zBNDJYH2GFyDrInn9TzAbRIf3d4O+eltXQQ==", "dev": true, "requires": { - "@react-native/codegen": "*" + "@react-native/codegen": "0.73.3" } }, "@react-native/babel-preset": { - "version": "0.74.0", - "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.74.0.tgz", - "integrity": "sha512-k+1aaYQeLn+GBmGA5Qs3NKI8uzhLvRRMML+pB/+43ZL6DvCklbuJ5KO5oqRRpF3KZ2t/VKUqqSichpXfFrXGjg==", + "version": "0.73.21", + "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.73.21.tgz", + "integrity": "sha512-WlFttNnySKQMeujN09fRmrdWqh46QyJluM5jdtDNrkl/2Hx6N4XeDUGhABvConeK95OidVO7sFFf7sNebVXogA==", "dev": true, "requires": { "@babel/core": "^7.20.0", @@ -13322,7 +13206,7 @@ "@babel/plugin-transform-typescript": "^7.5.0", "@babel/plugin-transform-unicode-regex": "^7.0.0", "@babel/template": "^7.0.0", - "@react-native/babel-plugin-codegen": "*", + "@react-native/babel-plugin-codegen": "0.73.4", "babel-plugin-transform-flow-enums": "^0.0.2", "react-refresh": "^0.14.0" }, @@ -13336,9 +13220,9 @@ } }, "@react-native/codegen": { - "version": "0.73.2", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.73.2.tgz", - "integrity": "sha512-lfy8S7umhE3QLQG5ViC4wg5N1Z+E6RnaeIw8w1voroQsXXGPB72IBozh8dAHR3+ceTxIU0KX3A8OpJI8e1+HpQ==", + "version": "0.73.3", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.73.3.tgz", + "integrity": "sha512-sxslCAAb8kM06vGy9Jyh4TtvjhcP36k/rvj2QE2Jdhdm61KvfafCATSIsOfc0QvnduWFcpXUPvAVyYwuv7PYDg==", "dev": true, "requires": { "@babel/parser": "^7.20.0", @@ -13351,20 +13235,20 @@ } }, "@react-native/community-cli-plugin": { - "version": "0.73.11", - "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.73.11.tgz", - "integrity": "sha512-s0bprwljKS1Al8wOKathDDmRyF+70CcNE2G/aqZ7+L0NoOE0Uxxx/5P2BxlM2Mfht7O33B4SeMNiPdE/FqIubQ==", + "version": "0.73.16", + "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.73.16.tgz", + "integrity": "sha512-eNH3v3qJJF6f0n/Dck90qfC9gVOR4coAXMTdYECO33GfgjTi+73vf/SBqlXw9HICH/RNZYGPM3wca4FRF7TYeQ==", "dev": true, "requires": { - "@react-native-community/cli-server-api": "12.3.0", - "@react-native-community/cli-tools": "12.3.0", - "@react-native/dev-middleware": "^0.73.6", - "@react-native/metro-babel-transformer": "^0.73.12", + "@react-native-community/cli-server-api": "12.3.2", + "@react-native-community/cli-tools": "12.3.2", + "@react-native/dev-middleware": "0.73.7", + "@react-native/metro-babel-transformer": "0.73.15", "chalk": "^4.0.0", "execa": "^5.1.1", - "metro": "^0.80.0", - "metro-config": "^0.80.0", - "metro-core": "^0.80.0", + "metro": "^0.80.3", + "metro-config": "^0.80.3", + "metro-core": "^0.80.3", "node-fetch": "^2.2.0", "readline": "^1.3.0" } @@ -13376,13 +13260,13 @@ "dev": true }, "@react-native/dev-middleware": { - "version": "0.73.6", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.73.6.tgz", - "integrity": "sha512-9SD7gIso+hO1Jy1Y/Glbd+JWQwyH7Xjnwebtkxdm5TMB51LQPjaGtMcwEigbIZyAtvoaDGmhWmudwbKpDlS+gA==", + "version": "0.73.7", + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.73.7.tgz", + "integrity": "sha512-BZXpn+qKp/dNdr4+TkZxXDttfx8YobDh8MFHsMk9usouLm22pKgFIPkGBV0X8Do4LBkFNPGtrnsKkWk/yuUXKg==", "dev": true, "requires": { "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "^0.73.3", + "@react-native/debugger-frontend": "0.73.3", "chrome-launcher": "^0.15.2", "chromium-edge-launcher": "^1.0.0", "connect": "^3.6.5", @@ -13433,14 +13317,13 @@ "dev": true }, "@react-native/metro-babel-transformer": { - "version": "0.73.12", - "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.73.12.tgz", - "integrity": "sha512-VmxN5aaoOprzDzUR+8c3XYhG0FoMOO6n0ToylCW6EeZCuf5RTY7HWVOhacabGoB1mHrWzJ0wWEsqX+eD4iFxoA==", + "version": "0.73.15", + "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.73.15.tgz", + "integrity": "sha512-LlkSGaXCz+xdxc9819plmpsl4P4gZndoFtpjN3GMBIu6f7TBV0GVbyJAU4GE8fuAWPVSVL5ArOcdkWKSbI1klw==", "dev": true, "requires": { "@babel/core": "^7.20.0", - "@react-native/babel-preset": "*", - "babel-preset-fbjs": "^3.4.0", + "@react-native/babel-preset": "0.73.21", "hermes-parser": "0.15.0", "nullthrows": "^1.1.1" } @@ -13451,20 +13334,10 @@ "integrity": "sha512-bRBcb2T+I88aG74LMVHaKms2p/T8aQd8+BZ7LuuzXlRfog1bMWWn/C5i0HVuvW4RPtXQYgIlGiXVDy9Ir1So/w==", "dev": true }, - "@react-native/virtualized-lists": { - "version": "0.72.8", - "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.72.8.tgz", - "integrity": "sha512-J3Q4Bkuo99k7mu+jPS9gSUSgq+lLRSI/+ahXNwV92XgJ/8UgOTxu2LPwhJnBk/sQKxq7E8WkZBnBiozukQMqrw==", - "dev": true, - "requires": { - "invariant": "^2.2.4", - "nullthrows": "^1.1.1" - } - }, "@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", "dev": true, "requires": { "@hapi/hoek": "^9.0.0" @@ -13640,9 +13513,9 @@ "dev": true }, "@types/react": { - "version": "18.2.45", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.45.tgz", - "integrity": "sha512-TtAxCNrlrBp8GoeEp1npd5g+d/OejJHFxS3OWmrPBMFaVQMSN0OFySozJio5BHxTuTeug00AVXVAjfDSfk+lUg==", + "version": "18.2.55", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.55.tgz", + "integrity": "sha512-Y2Tz5P4yz23brwm2d7jNon39qoAtMMmalOQv6+fEFt1mT+FcM3D841wDpoUvFXhaYenuROCy3FZYqdTjM7qVyA==", "dev": true, "requires": { "@types/prop-types": "*", @@ -13651,12 +13524,20 @@ } }, "@types/react-native": { - "version": "0.72.8", - "resolved": "https://registry.npmjs.org/@types/react-native/-/react-native-0.72.8.tgz", - "integrity": "sha512-St6xA7+EoHN5mEYfdWnfYt0e8u6k2FR0P9s2arYgakQGFgU1f9FlPrIEcj0X24pLCF5c5i3WVuLCUdiCYHmOoA==", + "version": "0.73.0", + "resolved": "https://registry.npmjs.org/@types/react-native/-/react-native-0.73.0.tgz", + "integrity": "sha512-6ZRPQrYM72qYKGWidEttRe6M5DZBEV5F+MHMHqd4TTYx0tfkcdrUFGdef6CCxY0jXU7wldvd/zA/b0A/kTeJmA==", + "dev": true, + "requires": { + "react-native": "*" + } + }, + "@types/react-test-renderer": { + "version": "18.0.7", + "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-18.0.7.tgz", + "integrity": "sha512-1+ANPOWc6rB3IkSnElhjv6VLlKg2dSv/OWClUyZimbLsQyBn8Js9Vtdsi3UICJ2rIQ3k2la06dkB+C92QfhKmg==", "dev": true, "requires": { - "@react-native/virtualized-lists": "^0.72.4", "@types/react": "*" } }, @@ -14145,12 +14026,6 @@ "@babel/helper-define-polyfill-provider": "^0.2.2" } }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "7.0.0-beta.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz", - "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==", - "dev": true - }, "babel-plugin-transform-flow-enums": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz", @@ -14180,41 +14055,6 @@ "@babel/plugin-syntax-top-level-await": "^7.8.3" } }, - "babel-preset-fbjs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz", - "integrity": "sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==", - "dev": true, - "requires": { - "@babel/plugin-proposal-class-properties": "^7.0.0", - "@babel/plugin-proposal-object-rest-spread": "^7.0.0", - "@babel/plugin-syntax-class-properties": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "@babel/plugin-transform-arrow-functions": "^7.0.0", - "@babel/plugin-transform-block-scoped-functions": "^7.0.0", - "@babel/plugin-transform-block-scoping": "^7.0.0", - "@babel/plugin-transform-classes": "^7.0.0", - "@babel/plugin-transform-computed-properties": "^7.0.0", - "@babel/plugin-transform-destructuring": "^7.0.0", - "@babel/plugin-transform-flow-strip-types": "^7.0.0", - "@babel/plugin-transform-for-of": "^7.0.0", - "@babel/plugin-transform-function-name": "^7.0.0", - "@babel/plugin-transform-literals": "^7.0.0", - "@babel/plugin-transform-member-expression-literals": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-object-super": "^7.0.0", - "@babel/plugin-transform-parameters": "^7.0.0", - "@babel/plugin-transform-property-literals": "^7.0.0", - "@babel/plugin-transform-react-display-name": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0", - "@babel/plugin-transform-spread": "^7.0.0", - "@babel/plugin-transform-template-literals": "^7.0.0", - "babel-plugin-syntax-trailing-function-commas": "^7.0.0-beta.0" - } - }, "babel-preset-jest": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", @@ -14879,9 +14719,9 @@ "dev": true }, "envinfo": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", - "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==", + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.1.tgz", + "integrity": "sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg==", "dev": true }, "error-ex": { @@ -15373,9 +15213,9 @@ "dev": true }, "fast-xml-parser": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.2.tgz", - "integrity": "sha512-rmrXUXwbJedoXkStenj1kkljNF7ugn5ZjR9FJcwmCfcCbtOMDghPajbc+Tck6vE6F5XsDmx+Pr2le9fw8+pXBg==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.3.4.tgz", + "integrity": "sha512-utnwm92SyozgA3hhH2I8qldf2lBqm6qHOICawRNRFu1qMe3+oqr+GcXjGqTmXTMGE5T4eC03kr/rlh5C1IRdZA==", "dev": true, "requires": { "strnum": "^1.0.5" @@ -15806,9 +15646,9 @@ "dev": true }, "image-size": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", - "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", + "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", "dev": true, "requires": { "queue": "6.0.2" @@ -16907,14 +16747,14 @@ "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==" }, "joi": { - "version": "17.11.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz", - "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==", + "version": "17.12.1", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.1.tgz", + "integrity": "sha512-vtxmq+Lsc5SlfqotnfVjlViWfOL9nt/avKNbKYizwf6gsCfq9NYY/ceYRMFD8XDdrjJ9abJyScWmhmIiy+XRtQ==", "dev": true, "requires": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", "@sideway/formula": "^3.0.1", "@sideway/pinpoint": "^2.0.0" } @@ -17302,9 +17142,9 @@ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" }, "metro": { - "version": "0.80.2", - "resolved": "https://registry.npmjs.org/metro/-/metro-0.80.2.tgz", - "integrity": "sha512-iavBVpr3v4YD2XWUsL7peq/lUquX5KTH+dKc5Rw13XnDHDfoRgcMOmQjSn3xcFxP0R9P4uABML8YegAekoqjQg==", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.80.5.tgz", + "integrity": "sha512-OE/CGbOgbi8BlTN1QqJgKOBaC27dS0JBQw473JcivrpgVnqIsluROA7AavEaTVUrB9wPUZvoNVDROn5uiM2jfw==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -17322,25 +17162,24 @@ "denodeify": "^1.2.1", "error-stack-parser": "^2.0.6", "graceful-fs": "^4.2.4", - "hermes-parser": "0.18.0", + "hermes-parser": "0.18.2", "image-size": "^1.0.2", "invariant": "^2.2.4", "jest-worker": "^29.6.3", "jsc-safe-url": "^0.2.2", "lodash.throttle": "^4.1.1", - "metro-babel-transformer": "0.80.2", - "metro-cache": "0.80.2", - "metro-cache-key": "0.80.2", - "metro-config": "0.80.2", - "metro-core": "0.80.2", - "metro-file-map": "0.80.2", - "metro-minify-terser": "0.80.2", - "metro-resolver": "0.80.2", - "metro-runtime": "0.80.2", - "metro-source-map": "0.80.2", - "metro-symbolicate": "0.80.2", - "metro-transform-plugins": "0.80.2", - "metro-transform-worker": "0.80.2", + "metro-babel-transformer": "0.80.5", + "metro-cache": "0.80.5", + "metro-cache-key": "0.80.5", + "metro-config": "0.80.5", + "metro-core": "0.80.5", + "metro-file-map": "0.80.5", + "metro-resolver": "0.80.5", + "metro-runtime": "0.80.5", + "metro-source-map": "0.80.5", + "metro-symbolicate": "0.80.5", + "metro-transform-plugins": "0.80.5", + "metro-transform-worker": "0.80.5", "mime-types": "^2.1.27", "node-fetch": "^2.2.0", "nullthrows": "^1.1.1", @@ -17369,18 +17208,18 @@ } }, "hermes-estree": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.18.0.tgz", - "integrity": "sha512-WaIudIVKo5QWFqz1ta53HqSDuVxYST/MUuP9X7dqUpbHse3E2gzJq/7hEtgx84hh2XSNWN1AhYho3ThOA85uCA==", + "version": "0.18.2", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.18.2.tgz", + "integrity": "sha512-KoLsoWXJ5o81nit1wSyEZnWUGy9cBna9iYMZBR7skKh7okYAYKqQ9/OczwpMHn/cH0hKDyblulGsJ7FknlfVxQ==", "dev": true }, "hermes-parser": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.18.0.tgz", - "integrity": "sha512-DIIM6vsy30BU5hNkOXh6MR2r4ZAxVhbfyTnmfo/rqUf3KySlNWn9fWiOcpuGAdDN2o5sdPCpu6cep3a23d1Klw==", + "version": "0.18.2", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.18.2.tgz", + "integrity": "sha512-1eQfvib+VPpgBZ2zYKQhpuOjw1tH+Emuib6QmjkJWJMhyjM8xnXMvA+76o9LhF0zOAJDZgPfQhg43cyXEyl5Ew==", "dev": true, "requires": { - "hermes-estree": "0.18.0" + "hermes-estree": "0.18.2" } }, "ms": { @@ -17407,78 +17246,78 @@ } }, "metro-babel-transformer": { - "version": "0.80.2", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.80.2.tgz", - "integrity": "sha512-QR+HCD5rswoLVMZOU95dda0XmrT3dDnm+pq+ql/Q6RCDBY0BUS7Z1l1mN9jq/MRBy2QOW+IKKgSMTIC9Khtbpw==", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.80.5.tgz", + "integrity": "sha512-sxH6hcWCorhTbk4kaShCWsadzu99WBL4Nvq4m/sDTbp32//iGuxtAnUK+ZV+6IEygr2u9Z0/4XoZ8Sbcl71MpA==", "dev": true, "requires": { "@babel/core": "^7.20.0", - "hermes-parser": "0.18.0", + "hermes-parser": "0.18.2", "nullthrows": "^1.1.1" }, "dependencies": { "hermes-estree": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.18.0.tgz", - "integrity": "sha512-WaIudIVKo5QWFqz1ta53HqSDuVxYST/MUuP9X7dqUpbHse3E2gzJq/7hEtgx84hh2XSNWN1AhYho3ThOA85uCA==", + "version": "0.18.2", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.18.2.tgz", + "integrity": "sha512-KoLsoWXJ5o81nit1wSyEZnWUGy9cBna9iYMZBR7skKh7okYAYKqQ9/OczwpMHn/cH0hKDyblulGsJ7FknlfVxQ==", "dev": true }, "hermes-parser": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.18.0.tgz", - "integrity": "sha512-DIIM6vsy30BU5hNkOXh6MR2r4ZAxVhbfyTnmfo/rqUf3KySlNWn9fWiOcpuGAdDN2o5sdPCpu6cep3a23d1Klw==", + "version": "0.18.2", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.18.2.tgz", + "integrity": "sha512-1eQfvib+VPpgBZ2zYKQhpuOjw1tH+Emuib6QmjkJWJMhyjM8xnXMvA+76o9LhF0zOAJDZgPfQhg43cyXEyl5Ew==", "dev": true, "requires": { - "hermes-estree": "0.18.0" + "hermes-estree": "0.18.2" } } } }, "metro-cache": { - "version": "0.80.2", - "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.80.2.tgz", - "integrity": "sha512-ELz2GcXLDyT5w4awaL+6bb3X6Eg6RS5CcQ5CcXAgCCFqBwRuTBHkztK1rLyp7IX76Xb2wlz7781T9H4CCtxD5w==", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.80.5.tgz", + "integrity": "sha512-2u+dQ4PZwmC7eZo9uMBNhQQMig9f+w4QWBZwXCdVy/RYOHM0eObgGdMEOwODo73uxie82T9lWzxr3aZOZ+Nqtw==", "dev": true, "requires": { - "metro-core": "0.80.2", + "metro-core": "0.80.5", "rimraf": "^3.0.2" } }, "metro-cache-key": { - "version": "0.80.2", - "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.80.2.tgz", - "integrity": "sha512-ldNEFiq9COBZSZOBgyHvil4dtIWZsJahbByGDh6f5jPrkj9cBih1rGeo9ix+MLl7aVh2cA3hHQjyponQsfXcnQ==", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.80.5.tgz", + "integrity": "sha512-fr3QLZUarsB3tRbVcmr34kCBsTHk0Sh9JXGvBY/w3b2lbre+Lq5gtgLyFElHPecGF7o4z1eK9r3ubxtScHWcbA==", "dev": true }, "metro-config": { - "version": "0.80.2", - "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.80.2.tgz", - "integrity": "sha512-3U7S3uakSwUyXp3E0V2mhLT+82EzIeBuOFav4mKNIq9dl9AW62x5o5e8q3bmyHwDWg+RZ8jIBkAURKrhS/eALw==", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.80.5.tgz", + "integrity": "sha512-elqo/lwvF+VjZ1OPyvmW/9hSiGlmcqu+rQvDKw5F5WMX48ZC+ySTD1WcaD7e97pkgAlJHVYqZ98FCjRAYOAFRQ==", "dev": true, "requires": { "connect": "^3.6.5", "cosmiconfig": "^5.0.5", "jest-validate": "^29.6.3", - "metro": "0.80.2", - "metro-cache": "0.80.2", - "metro-core": "0.80.2", - "metro-runtime": "0.80.2" + "metro": "0.80.5", + "metro-cache": "0.80.5", + "metro-core": "0.80.5", + "metro-runtime": "0.80.5" } }, "metro-core": { - "version": "0.80.2", - "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.80.2.tgz", - "integrity": "sha512-RL1iHZlR+3tvrJIBE/W6YlwW7OH1ckcgCCEr7bxEqUTNRiraK2zTv2jJ4b7VS/Xftdzvungk8ls3FNem5MFrIw==", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.80.5.tgz", + "integrity": "sha512-vkLuaBhnZxTVpaZO8ZJVEHzjaqSXpOdpAiztSZ+NDaYM6jEFgle3/XIbLW91jTSf2+T8Pj5yB1G7KuOX+BcVwg==", "dev": true, "requires": { "lodash.throttle": "^4.1.1", - "metro-resolver": "0.80.2" + "metro-resolver": "0.80.5" } }, "metro-file-map": { - "version": "0.80.2", - "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.80.2.tgz", - "integrity": "sha512-/GiFdE5nhtvviDPANH9j3SE6VG4j2DaaKia+0gzyVYwP+6Kjc2oADj6FCGFOXDdCizqeqASUSgEsp+06D8+tXw==", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.80.5.tgz", + "integrity": "sha512-bKCvJ05drjq6QhQxnDUt3I8x7bTcHo3IIKVobEr14BK++nmxFGn/BmFLRzVBlghM6an3gqwpNEYxS5qNc+VKcg==", "dev": true, "requires": { "anymatch": "^3.0.3", @@ -17512,9 +17351,9 @@ } }, "metro-minify-terser": { - "version": "0.80.2", - "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.80.2.tgz", - "integrity": "sha512-+0lN1uJsFKke+RaZVZE3vxD8vVuGDiH/roiUzTIktof2rBtBmXJAx+TYjy1SZQN48eHot9CaAXZ6MfiSVJiPew==", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.80.5.tgz", + "integrity": "sha512-S7oZLLcab6YXUT6jYFX/ZDMN7Fq6xBGGAG8liMFU1UljX6cTcEC2u+UIafYgCLrdVexp/+ClxrIetVPZ5LtL/g==", "dev": true, "requires": { "terser": "^5.15.0" @@ -17569,32 +17408,32 @@ } }, "metro-resolver": { - "version": "0.80.2", - "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.80.2.tgz", - "integrity": "sha512-0OmCsmlcBQWkJXx0YoYRTS+ArRT888WcgmgjwoJVQm+xdMRKuu67ihyF8EOpeVgOzbeo0IxVjkNmbJWOfficjA==", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.80.5.tgz", + "integrity": "sha512-haJ/Hveio3zv/Fr4eXVdKzjUeHHDogYok7OpRqPSXGhTXisNXB+sLN7CpcUrCddFRUDLnVaqQOYwhYsFndgUwA==", "dev": true }, "metro-runtime": { - "version": "0.80.2", - "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.80.2.tgz", - "integrity": "sha512-ruIlSEVnmJGbLnZIGf8/ra+qoD1Knft0R+5laUpp/KEGkD+GEr4XgP+5j5Uuq3v36qDLFTj1KXfQP5JVoeM8zw==", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.80.5.tgz", + "integrity": "sha512-L0syTWJUdWzfUmKgkScr6fSBVTh6QDr8eKEkRtn40OBd8LPagrJGySBboWSgbyn9eIb4ayW3Y347HxgXBSAjmg==", "dev": true, "requires": { "@babel/runtime": "^7.0.0" } }, "metro-source-map": { - "version": "0.80.2", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.80.2.tgz", - "integrity": "sha512-fM6RwYCJrwfqVk8Z1ApvJ3+Zz7fso38AszmAXqFDXziOC0AfmMCv/W9FosE9BY+y5QJ7YcvW0RIYLQhpCn+V9w==", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.80.5.tgz", + "integrity": "sha512-DwSF4l03mKPNqCtyQ6K23I43qzU1BViAXnuH81eYWdHglP+sDlPpY+/7rUahXEo6qXEHXfAJgVoo1sirbXbmsQ==", "dev": true, "requires": { "@babel/traverse": "^7.20.0", "@babel/types": "^7.20.0", "invariant": "^2.2.4", - "metro-symbolicate": "0.80.2", + "metro-symbolicate": "0.80.5", "nullthrows": "^1.1.1", - "ob1": "0.80.2", + "ob1": "0.80.5", "source-map": "^0.5.6", "vlq": "^1.0.0" }, @@ -17608,13 +17447,13 @@ } }, "metro-symbolicate": { - "version": "0.80.2", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.80.2.tgz", - "integrity": "sha512-G/gJbl/XRGlgjAQSmZ5Rtym//7MSaE2Bj+28BBVqF6fse5y2kw9J7weNDfLjRfKDNaMUoC4mjc6TYjW7gPuGng==", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.80.5.tgz", + "integrity": "sha512-IsM4mTYvmo9JvIqwEkCZ5+YeDVPST78Q17ZgljfLdHLSpIivOHp9oVoiwQ/YGbLx0xRHRIS/tKiXueWBnj3UWA==", "dev": true, "requires": { "invariant": "^2.2.4", - "metro-source-map": "0.80.2", + "metro-source-map": "0.80.5", "nullthrows": "^1.1.1", "source-map": "^0.5.6", "through2": "^2.0.1", @@ -17630,9 +17469,9 @@ } }, "metro-transform-plugins": { - "version": "0.80.2", - "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.80.2.tgz", - "integrity": "sha512-edokA2lPM3zzJRa55ze2mzVHCUNeJs4CPPrntdVOnf2WkEO/snV4RIgQDVkxFgPc8nI4iLB8cwZZQvdvH3v8gA==", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.80.5.tgz", + "integrity": "sha512-7IdlTqK/k5+qE3RvIU5QdCJUPk4tHWEqgVuYZu8exeW+s6qOJ66hGIJjXY/P7ccucqF+D4nsbAAW5unkoUdS6g==", "dev": true, "requires": { "@babel/core": "^7.20.0", @@ -17643,21 +17482,22 @@ } }, "metro-transform-worker": { - "version": "0.80.2", - "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.80.2.tgz", - "integrity": "sha512-QtAntH+8AA06PDpXqM6/N42cvgw665TXp9mKKwrYL/d4lVemNNJte0CJ71KO4MmYQ5UvSDonwbTlOXJOnR8m6w==", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.80.5.tgz", + "integrity": "sha512-Q1oM7hfP+RBgAtzRFBDjPhArELUJF8iRCZ8OidqCpYzQJVGuJZ7InSnIf3hn1JyqiUQwv2f1LXBO78i2rAjzyA==", "dev": true, "requires": { "@babel/core": "^7.20.0", "@babel/generator": "^7.20.0", "@babel/parser": "^7.20.0", "@babel/types": "^7.20.0", - "metro": "0.80.2", - "metro-babel-transformer": "0.80.2", - "metro-cache": "0.80.2", - "metro-cache-key": "0.80.2", - "metro-source-map": "0.80.2", - "metro-transform-plugins": "0.80.2", + "metro": "0.80.5", + "metro-babel-transformer": "0.80.5", + "metro-cache": "0.80.5", + "metro-cache-key": "0.80.5", + "metro-minify-terser": "0.80.5", + "metro-source-map": "0.80.5", + "metro-transform-plugins": "0.80.5", "nullthrows": "^1.1.1" } }, @@ -17828,9 +17668,9 @@ "dev": true }, "ob1": { - "version": "0.80.2", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.80.2.tgz", - "integrity": "sha512-dF78RVxoZjzSTfOWiZh6iaRtTrKyMhTiDtr/nDJOIN5hKj0pNjY7z/NueYCUH4EDgFmabv4r+WEihSu+qCI7Mg==", + "version": "0.80.5", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.80.5.tgz", + "integrity": "sha512-zYDMnnNrFi/1Tqh0vo3PE4p97Tpl9/4MP2k2ECvkbLOZzQuAYZJLTUYVLZb7hJhbhjT+JJxAwBGS8iu5hCSd1w==", "dev": true }, "object-assign": { @@ -18334,13 +18174,12 @@ "dev": true }, "react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", "dev": true, "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" } }, "react-devtools-core": { @@ -18360,26 +18199,27 @@ "dev": true }, "react-native": { - "version": "0.73.1", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.73.1.tgz", - "integrity": "sha512-nLl9O2yKRh1nMXwsk4SUiD0ddd19RqlKgNU9AU8bTK/zD2xwnVOG56YK1/22SN67niWyoeG83vVg1eTk+S6ReA==", + "version": "0.73.4", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.73.4.tgz", + "integrity": "sha512-VtS+Yr6OOTIuJGDECIYWzNU8QpJjASQYvMtfa/Hvm/2/h5GdB6W9H9TOmh13x07Lj4AOhNMx3XSsz6TdrO4jIg==", "dev": true, "requires": { "@jest/create-cache-key-function": "^29.6.3", - "@react-native-community/cli": "12.3.0", - "@react-native-community/cli-platform-android": "12.3.0", - "@react-native-community/cli-platform-ios": "12.3.0", - "@react-native/assets-registry": "^0.73.1", - "@react-native/codegen": "^0.73.2", - "@react-native/community-cli-plugin": "0.73.11", - "@react-native/gradle-plugin": "^0.73.4", - "@react-native/js-polyfills": "^0.73.1", - "@react-native/normalize-colors": "^0.73.2", - "@react-native/virtualized-lists": "^0.73.4", + "@react-native-community/cli": "12.3.2", + "@react-native-community/cli-platform-android": "12.3.2", + "@react-native-community/cli-platform-ios": "12.3.2", + "@react-native/assets-registry": "0.73.1", + "@react-native/codegen": "0.73.3", + "@react-native/community-cli-plugin": "0.73.16", + "@react-native/gradle-plugin": "0.73.4", + "@react-native/js-polyfills": "0.73.1", + "@react-native/normalize-colors": "0.73.2", + "@react-native/virtualized-lists": "0.73.4", "abort-controller": "^3.0.0", "anser": "^1.4.9", "ansi-regex": "^5.0.0", "base64-js": "^1.5.1", + "chalk": "^4.0.0", "deprecated-react-native-prop-types": "^5.0.0", "event-target-shim": "^5.0.1", "flow-enums-runtime": "^0.0.6", @@ -18387,8 +18227,8 @@ "jest-environment-node": "^29.6.3", "jsc-android": "^250231.0.0", "memoize-one": "^5.0.0", - "metro-runtime": "^0.80.0", - "metro-source-map": "^0.80.0", + "metro-runtime": "^0.80.3", + "metro-source-map": "^0.80.3", "mkdirp": "^0.5.1", "nullthrows": "^1.1.1", "pretty-format": "^26.5.2", @@ -18447,6 +18287,34 @@ "react-is": "^16.12.0 || ^17.0.0 || ^18.0.0" } }, + "react-test-renderer": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-18.2.0.tgz", + "integrity": "sha512-JWD+aQ0lh2gvh4NM3bBM42Kx+XybOxCpgYK7F8ugAlpaTSnWsX+39Z4XkOykGZAHrjwwTZT3x3KxswVWxHPUqA==", + "dev": true, + "requires": { + "react-is": "^18.2.0", + "react-shallow-renderer": "^16.15.0", + "scheduler": "^0.23.0" + }, + "dependencies": { + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0" + } + } + } + }, "read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -19274,9 +19142,9 @@ "dev": true }, "terser": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz", - "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", + "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", "dev": true, "requires": { "@jridgewell/source-map": "^0.3.3", diff --git a/package.json b/package.json index 54a174a..2a5303e 100644 --- a/package.json +++ b/package.json @@ -51,8 +51,9 @@ "devDependencies": { "@babel/preset-typescript": "^7.23.3", "@types/jest": "^29.5.11", - "@types/react": "^18.2.45", - "@types/react-native": "^0.72.8", + "@types/react": "^18.2.55", + "@types/react-native": "^0.73.0", + "@types/react-test-renderer": "^18.0.7", "@types/tailwindcss": "^3.1.0", "@typescript-eslint/eslint-plugin": "^6.15.0", "@typescript-eslint/parser": "^6.15.0", @@ -63,8 +64,9 @@ "jest": "^29.7.0", "metro-react-native-babel-preset": "^0.66.2", "prettier": "^3.1.1", - "react": "^17.0.2", - "react-native": "^0.73.1", + "react": "^18.2.0", + "react-native": "^0.73.4", + "react-test-renderer": "^18.2.0", "ts-jest": "^29.1.1", "typescript": "^5.3.3" }, diff --git a/readme.md b/readme.md index fcdd497..4b06d81 100644 --- a/readme.md +++ b/readme.md @@ -54,6 +54,7 @@ const MyComponent = () => ( - [RN-Only Additions](#rn-only-additions) - [JIT-style Arbitrary Values](#jit-style-arbitrary-values) - [VS Code Intellisense](#vs-code-intellisense) +- [Memo-Busting](#memo-busting) - [Migrating from previous versions](#migrating-from-previous-versions) - [Prior Art](#prior-art) @@ -241,15 +242,19 @@ you'll need to configure things slightly differently: import { useDeviceContext, useAppColorScheme } from 'twrnc'; export default function App() { - // 1️⃣ opt OUT of listening to DEVICE color scheme events - useDeviceContext(tw, { withDeviceColorScheme: false }); - - // 2️⃣ use the `useAppColorScheme` hook to get a reference to the current color - // scheme, with some functions to modify it (triggering re-renders) when you need to + useDeviceContext(tw, { + // 1️⃣ opt OUT of listening to DEVICE color scheme events + observeDeviceColorSchemeChanges: false + // 2️⃣ and supply an initial color scheme + initialColorScheme: `light`, // 'light' | 'dark' | 'device' + }); + + // 3️⃣ use the `useAppColorScheme` hook anywhere to get a reference to the current + // colorscheme, with functions to modify it (triggering re-renders) when you need const [colorScheme, toggleColorScheme, setColorScheme] = useAppColorScheme(tw); return ( - {/* 3️⃣ use one of the setter functions, like `toggleColorScheme` in your app */} + {/* 4️⃣ use one of the setter functions, like `toggleColorScheme` in your app */} Switch Color Scheme @@ -257,10 +262,6 @@ export default function App() { } ``` -`useAppColorScheme()` accepts an optional second argument of an _initial value for the -color scheme._ If not supplied, it will be initialized to the current system setting at -the time the function is called. - ## Customizing Breakpoints You can **customize the breakpoints** in the same way as a @@ -453,6 +454,26 @@ for VS Code. More detailed instructions, including how to add snippets, are available [here](https://github.com/jaredh159/tailwind-react-native-classnames/discussions/124). +## Memo Busting + +If you're using device-context prefixes (like `dark:`, and `md:`), _memoized_ components +can cause problems by preventing re-renders when the color scheme or window size changes. +You may not be memoizing explicitly yourself as many third-party librarys (like +`react-navigation`) memoizes its own components. + +In order to help with this problem, `twrnc` exposes a `.memoBuster` property on the `tw` +object. This string property is meant to passed as a `key` prop to break memoization +boundaries. It is stable (preventing re-renders) until something in the device context +changes, at which point it deterministically updates: + +```tsx + +``` + +> This is not a perfect solution for **all** memoization issues. For caveats and more +> context, see +> [#112](https://github.com/jaredh159/tailwind-react-native-classnames/issues/112). + ## Migrating from Previous Versions See [migration-guide.md](/migration-guide.md). diff --git a/src/__tests__/color-scheme.spec.tsx b/src/__tests__/color-scheme.spec.tsx new file mode 100644 index 0000000..115180a --- /dev/null +++ b/src/__tests__/color-scheme.spec.tsx @@ -0,0 +1,61 @@ +import renderer from 'react-test-renderer'; +import rn from 'react-native'; +import { describe, it, expect } from '@jest/globals'; +import React from 'react'; +import type { TailwindFn } from '../'; +import { create, useDeviceContext, useAppColorScheme } from '../'; + +jest.mock(`react-native`, () => ({ + Platform: { OS: `ios` }, + useColorScheme: () => `light`, + useWindowDimensions: () => ({ width: 320, height: 640, fontScale: 1, scale: 2 }), +})); + +const Test: React.FC<{ tw: TailwindFn; initial: 'light' | 'dark' | 'device' }> = ({ + tw, + initial, +}) => { + useDeviceContext(tw, { + observeDeviceColorSchemeChanges: false, + initialColorScheme: initial, + }); + const [colorScheme] = useAppColorScheme(tw); + return ( + <> + {String(colorScheme)} + {tw.prefixMatch(`dark`) ? `match:dark` : `no-match:dark`} + + ); +}; + +describe(`useAppColorScheme()`, () => { + it(`should initialize to ambient color scheme, if no initializer`, () => { + rn.useColorScheme = () => `dark`; + + let component = renderer.create(); + expect(component.toJSON()).toEqual([`dark`, `match:dark`]); + + rn.useColorScheme = () => `light`; + component = renderer.create(); + expect(component.toJSON()).toEqual([`light`, `no-match:dark`]); + + rn.useColorScheme = () => null; + component = renderer.create(); + expect(component.toJSON()).toEqual([`null`, `no-match:dark`]); + + rn.useColorScheme = () => undefined; + component = renderer.create(); + expect(component.toJSON()).toEqual([`undefined`, `no-match:dark`]); + }); + + it(`should initialize to explicitly passed color scheme when initializer provided`, () => { + rn.useColorScheme = () => `dark`; + + let component = renderer.create(); + expect(component.toJSON()).toEqual([`light`, `no-match:dark`]); + + rn.useColorScheme = () => `light`; + component = renderer.create(); + expect(component.toJSON()).toEqual([`dark`, `match:dark`]); + }); +}); diff --git a/src/__tests__/memo-buster.spec.tsx b/src/__tests__/memo-buster.spec.tsx new file mode 100644 index 0000000..140d2a4 --- /dev/null +++ b/src/__tests__/memo-buster.spec.tsx @@ -0,0 +1,71 @@ +import TestRenderer from 'react-test-renderer'; +import { TouchableOpacity, Text } from 'react-native'; +import { describe, it, expect } from '@jest/globals'; +import React from 'react'; +import { create, useDeviceContext, useAppColorScheme } from '../'; + +describe(`memo busting`, () => { + let tw = create(); + beforeEach(() => (tw = create())); + + const MemoComponent: React.FC = React.memo(() => ( + <>{tw.prefixMatch(`dark`) ? `memo:match:dark` : `memo:no-match:dark`} + )); + + const Component: React.FC<{ initial: 'light' | 'dark' | 'device' }> = ({ initial }) => { + useDeviceContext(tw, { + observeDeviceColorSchemeChanges: false, + initialColorScheme: initial, + }); + const [, toggleColorScheme] = useAppColorScheme(tw); + return ( + <> + toggleColorScheme()}> + toggle scheme + + {tw.prefixMatch(`dark`) ? `match:dark` : `no-match:dark`} + + + + ); + }; + + it(`breaks memoization properly, starting "light"`, () => { + const renderer = TestRenderer.create(); + expect(assertArray(renderer.toJSON()).slice(1)).toEqual([ + `no-match:dark`, + `memo:no-match:dark`, + `memo:no-match:dark`, + ]); + TestRenderer.act(() => { + renderer.root.findByType(TouchableOpacity).props.onPress(); + }); + expect(assertArray(renderer.toJSON()).slice(1)).toEqual([ + `match:dark`, + `memo:no-match:dark`, // <-- memo not busted + `memo:match:dark`, // <-- memo busted + ]); + }); + + it(`breaks memoization properly, starting "dark"`, () => { + const renderer = TestRenderer.create(); + expect(assertArray(renderer.toJSON()).slice(1)).toEqual([ + `match:dark`, + `memo:match:dark`, + `memo:match:dark`, + ]); + TestRenderer.act(() => { + renderer.root.findByType(TouchableOpacity).props.onPress(); + }); + expect(assertArray(renderer.toJSON()).slice(1)).toEqual([ + `no-match:dark`, + `memo:match:dark`, // <-- memo not busted + `memo:no-match:dark`, // <-- memo busted + ]); + }); +}); + +function assertArray(value: T | T[]): T[] { + if (!Array.isArray(value)) throw new Error(`expected array, got ${value}`); + return value; +} diff --git a/src/create.ts b/src/create.ts index e3e2a8b..6e1aa56 100644 --- a/src/create.ts +++ b/src/create.ts @@ -40,10 +40,10 @@ export function create(customConfig: TwConfig, platform: Platform): TailwindFn { function deriveCacheGroup(): string { return ( [ + device.colorScheme === `dark` ? `dark` : false, device.windowDimensions ? `w${device.windowDimensions.width}` : false, device.windowDimensions ? `h${device.windowDimensions.height}` : false, device.fontScale ? `fs${device.fontScale}` : false, - device.colorScheme === `dark` ? `dark` : false, device.pixelDensity === 2 ? `retina` : false, ] .filter(Boolean) @@ -51,12 +51,28 @@ export function create(customConfig: TwConfig, platform: Platform): TailwindFn { ); } + // eslint-disable-next-line @typescript-eslint/explicit-function-return-type + const tailwindFn = (strings: TemplateStringsArray, ...values: (string | number)[]) => { + let str = ``; + strings.forEach((string, i) => { + str += string + (values[i] ?? ``); + }); + return style(str); + }; + const contextCaches: Record = {}; let cache = new Cache(); + tailwindFn.memoBuster = ``; configureCache(); + // get back to cjs + // probably need to implement the check for if isset + // in order to not be a breaking change + // also, in this branch, add _unstableUpdateContext func + function configureCache(): void { const cacheGroup = deriveCacheGroup(); + tailwindFn.memoBuster = `twrnc-memobuster-key--${cacheGroup}`; const existing = contextCaches[cacheGroup]; if (existing) { cache = existing; @@ -159,15 +175,6 @@ export function create(customConfig: TwConfig, platform: Platform): TailwindFn { : undefined; } - // eslint-disable-next-line @typescript-eslint/explicit-function-return-type - const tailwindFn = (strings: TemplateStringsArray, ...values: (string | number)[]) => { - let str = ``; - strings.forEach((string, i) => { - str += string + (values[i] ?? ``); - }); - return style(str); - }; - tailwindFn.style = style; tailwindFn.color = color; @@ -204,6 +211,23 @@ export function create(customConfig: TwConfig, platform: Platform): TailwindFn { configureCache(); }; + tailwindFn.getColorScheme = () => device.colorScheme; + + tailwindFn.updateDeviceContext = ( + window: { width: number; height: number }, + fontScale: number, + pixelDensity: 1 | 2, + colorScheme: RnColorScheme | 'skip', + ) => { + device.windowDimensions = window; + device.fontScale = fontScale; + device.pixelDensity = pixelDensity; + if (colorScheme !== `skip`) { + device.colorScheme = colorScheme; + } + configureCache(); + }; + return tailwindFn; } diff --git a/src/hooks.ts b/src/hooks.ts index dc4b4fd..5e007ba 100644 --- a/src/hooks.ts +++ b/src/hooks.ts @@ -1,36 +1,41 @@ import { useState } from 'react'; -import { useColorScheme, useWindowDimensions, Appearance } from 'react-native'; +import { useColorScheme, useWindowDimensions } from 'react-native'; import type { TailwindFn, RnColorScheme } from './types'; -type Options = { - withDeviceColorScheme: boolean; +type AppOptions = { + observeDeviceColorSchemeChanges: false; + initialColorScheme: 'device' | 'light' | 'dark'; }; -export function useDeviceContext( - tw: TailwindFn, - opts: Options = { withDeviceColorScheme: true }, -): void { +export function useDeviceContext(tw: TailwindFn, appOptions?: AppOptions): void { + const deviceColorScheme = useColorScheme(); + useState(() => { + // (mis?)use `useState` initializer fn to initialize appColorScheme only ONCE + if (appOptions) { + const initial = appOptions.initialColorScheme; + tw.setColorScheme(initial === `device` ? deviceColorScheme : initial); + if (`withDeviceColorScheme` in appOptions) { + console.error(MIGRATION_ERR); // eslint-disable-line no-console + } + } + }); const window = useWindowDimensions(); - tw.setWindowDimensions(window); - tw.setFontScale(window.fontScale); - tw.setPixelDensity(window.scale === 1 ? 1 : 2); - const colorScheme = useColorScheme(); - if (opts.withDeviceColorScheme) { - tw.setColorScheme(colorScheme); - } + tw.updateDeviceContext( + window, + window.fontScale, + window.scale === 1 ? 1 : 2, + appOptions ? `skip` : deviceColorScheme, + ); } export function useAppColorScheme( tw: TailwindFn, - initialValue?: RnColorScheme, ): [ colorScheme: RnColorScheme, toggleColorScheme: () => void, setColorScheme: (colorScheme: RnColorScheme) => void, ] { - const [colorScheme, setColorScheme] = useState( - initialValue ?? Appearance.getColorScheme(), - ); + const [colorScheme, setColorScheme] = useState(tw.getColorScheme()); return [ colorScheme, () => { @@ -44,3 +49,5 @@ export function useAppColorScheme( }, ]; } + +const MIGRATION_ERR = `\`withDeviceColorScheme\` has been changed to \`observeDeviceColorSchemeChanges\` in twrnc@4.0.0 -- see migration-guide.md for more details`; diff --git a/src/types.ts b/src/types.ts index b474121..86be1a0 100644 --- a/src/types.ts +++ b/src/types.ts @@ -5,10 +5,39 @@ export interface TailwindFn { style: (...inputs: ClassInput[]) => Style; color: (color: string) => string | undefined; prefixMatch: (...prefixes: string[]) => boolean; + memoBuster: string; + + // NB: @see https://www.typescriptlang.org/tsconfig#stripInternal + + /** + * @internal + */ setWindowDimensions: (dimensions: { width: number; height: number }) => unknown; + /** + * @internal + */ setFontScale: (fontScale: number) => unknown; + /** + * @internal + */ setPixelDensity: (pixelDensity: 1 | 2) => unknown; + /** + * @internal + */ setColorScheme: (colorScheme: RnColorScheme) => unknown; + /** + * @internal + */ + getColorScheme: () => RnColorScheme; + /** + * @internal + */ + updateDeviceContext: ( + dimensions: { width: number; height: number }, + fontScale: number, + pixelDensity: 1 | 2, + colorScheme: RnColorScheme | 'skip', + ) => unknown; } export type ClassInput = diff --git a/tsconfig.json b/tsconfig.json index 30fe818..18f9982 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,7 +10,9 @@ "lib": ["ES2019"], "target": "ES2019", "declaration": true, - "moduleResolution": "node" + "moduleResolution": "node", + "jsx": "react", + "stripInternal": true }, "exclude": ["./dist", "**/*.spec.ts"] }