diff --git a/example/package.json b/example/package.json index 9b9011fa..9ab5bfce 100644 --- a/example/package.json +++ b/example/package.json @@ -13,21 +13,37 @@ }, "dependencies": { "crypto-browserify": "^3.12.1", - "expo": "^53.0.8", - "expo-splash-screen": "~0.30.8", + "expo": "^53.0.10", + "expo-splash-screen": "~0.30.9", "expo-status-bar": "~2.2.3", "react": "19.0.0", "react-dom": "19.0.0", - "react-native": "0.79.2", - "react-native-paper": "^5.14.0", - "react-native-safe-area-context": "^5.4.0", + "react-native": "0.79.3", + "react-native-paper": "^5.14.5", + "react-native-safe-area-context": "^5.4.1", "react-native-web": "~0.20.0", "stream-browserify": "^3.0.0" }, "devDependencies": { - "@babel/core": "^7.27.1", + "@babel/core": "^7.27.4", "@expo/webpack-config": "^19.0.1", "babel-loader": "^10.0.0", "babel-plugin-module-resolver": "^5.0.2" + }, + "expo": { + "doctor": { + "reactNativeDirectoryCheck": { + "exclude": [ + "jwt-decode" + ], + "listUnknownPackages": false + } + }, + "install": { + "exclude": [ + "react-native", + "react-native-safe-area-context" + ] + } } } diff --git a/example/yarn.lock b/example/yarn.lock index feb0cf0c..b68de37e 100644 --- a/example/yarn.lock +++ b/example/yarn.lock @@ -32,48 +32,48 @@ picocolors "^1.1.1" "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.27.2": - version "7.27.2" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.27.2.tgz#4183f9e642fd84e74e3eea7ffa93a412e3b102c9" - integrity sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ== + version "7.27.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.27.5.tgz#7d0658ec1a8420fc866d1df1b03bea0e79934c82" + integrity sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg== -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.20.0", "@babel/core@^7.20.2", "@babel/core@^7.25.2", "@babel/core@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.27.1.tgz#89de51e86bd12246003e3524704c49541b16c3e6" - integrity sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ== +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.20.0", "@babel/core@^7.20.2", "@babel/core@^7.25.2", "@babel/core@^7.27.4": + version "7.27.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.27.4.tgz#cc1fc55d0ce140a1828d1dd2a2eba285adbfb3ce" + integrity sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.27.1" - "@babel/helper-compilation-targets" "^7.27.1" - "@babel/helper-module-transforms" "^7.27.1" - "@babel/helpers" "^7.27.1" - "@babel/parser" "^7.27.1" - "@babel/template" "^7.27.1" - "@babel/traverse" "^7.27.1" - "@babel/types" "^7.27.1" + "@babel/generator" "^7.27.3" + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-module-transforms" "^7.27.3" + "@babel/helpers" "^7.27.4" + "@babel/parser" "^7.27.4" + "@babel/template" "^7.27.2" + "@babel/traverse" "^7.27.4" + "@babel/types" "^7.27.3" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.20.5", "@babel/generator@^7.25.0", "@babel/generator@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.27.1.tgz#862d4fad858f7208edd487c28b58144036b76230" - integrity sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w== +"@babel/generator@^7.20.5", "@babel/generator@^7.25.0", "@babel/generator@^7.27.3": + version "7.27.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.27.5.tgz#3eb01866b345ba261b04911020cbe22dd4be8c8c" + integrity sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw== dependencies: - "@babel/parser" "^7.27.1" - "@babel/types" "^7.27.1" + "@babel/parser" "^7.27.5" + "@babel/types" "^7.27.3" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" "@babel/helper-annotate-as-pure@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz#4345d81a9a46a6486e24d069469f13e60445c05d" - integrity sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow== + version "7.27.3" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz#f31fd86b915fc4daf1f3ac6976c59be7084ed9c5" + integrity sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg== dependencies: - "@babel/types" "^7.27.1" + "@babel/types" "^7.27.3" "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.27.1", "@babel/helper-compilation-targets@^7.27.2": version "7.27.2" @@ -135,14 +135,14 @@ "@babel/traverse" "^7.27.1" "@babel/types" "^7.27.1" -"@babel/helper-module-transforms@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz#e1663b8b71d2de948da5c4fb2a20ca4f3ec27a6f" - integrity sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g== +"@babel/helper-module-transforms@^7.27.1", "@babel/helper-module-transforms@^7.27.3": + version "7.27.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz#db0bbcfba5802f9ef7870705a7ef8788508ede02" + integrity sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg== dependencies: "@babel/helper-module-imports" "^7.27.1" "@babel/helper-validator-identifier" "^7.27.1" - "@babel/traverse" "^7.27.1" + "@babel/traverse" "^7.27.3" "@babel/helper-optimise-call-expression@^7.27.1": version "7.27.1" @@ -206,13 +206,13 @@ "@babel/traverse" "^7.27.1" "@babel/types" "^7.27.1" -"@babel/helpers@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.27.1.tgz#ffc27013038607cdba3288e692c3611c06a18aa4" - integrity sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ== +"@babel/helpers@^7.27.4": + version "7.27.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.27.6.tgz#6456fed15b2cb669d2d1fabe84b66b34991d812c" + integrity sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug== dependencies: - "@babel/template" "^7.27.1" - "@babel/types" "^7.27.1" + "@babel/template" "^7.27.2" + "@babel/types" "^7.27.6" "@babel/highlight@^7.10.4": version "7.25.9" @@ -224,12 +224,12 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.0", "@babel/parser@^7.20.7", "@babel/parser@^7.25.3", "@babel/parser@^7.27.1", "@babel/parser@^7.27.2": - version "7.27.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.27.2.tgz#577518bedb17a2ce4212afd052e01f7df0941127" - integrity sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.0", "@babel/parser@^7.20.7", "@babel/parser@^7.25.3", "@babel/parser@^7.27.2", "@babel/parser@^7.27.4", "@babel/parser@^7.27.5": + version "7.27.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.27.5.tgz#ed22f871f110aa285a6fd934a0efed621d118826" + integrity sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg== dependencies: - "@babel/types" "^7.27.1" + "@babel/types" "^7.27.3" "@babel/plugin-proposal-decorators@^7.12.9": version "7.27.1" @@ -420,9 +420,9 @@ "@babel/helper-remap-async-to-generator" "^7.27.1" "@babel/plugin-transform-block-scoping@^7.25.0": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.1.tgz#bc0dbe8ac6de5602981ba58ef68c6df8ef9bfbb3" - integrity sha512-QEcFlMl9nGTgh1rn2nIeU5bkfb9BAjaQcWbiP4LvKxUot52ABcTkpcyJ7f2Q2U2RuQ84BNLgts3jRme2dTx6Fw== + version "7.27.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.5.tgz#98c37485d815533623d992fd149af3e7b3140157" + integrity sha512-JF6uE2s67f0y2RZcm2kpAUEbD50vH62TyWVebxwHAlbSdM49VqPz8t4a1uIjp4NIOIZ4xzLfjY5emt/RCyC7TQ== dependencies: "@babel/helper-plugin-utils" "^7.27.1" @@ -454,10 +454,10 @@ "@babel/helper-plugin-utils" "^7.27.1" "@babel/template" "^7.27.1" -"@babel/plugin-transform-destructuring@^7.24.8", "@babel/plugin-transform-destructuring@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.1.tgz#d5916ef7089cb254df0418ae524533c1b72ba656" - integrity sha512-ttDCqhfvpE9emVkXbPD8vyxxh4TWYACVybGkDj+oReOGwnp066ITEivDlLwe0b1R0+evJ13IXQuLNB5w1fhC5Q== +"@babel/plugin-transform-destructuring@^7.24.8", "@babel/plugin-transform-destructuring@^7.27.3": + version "7.27.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.3.tgz#3cc8299ed798d9a909f8d66ddeb40849ec32e3b0" + integrity sha512-s4Jrok82JpiaIprtY2nHsYmrThKvvwgHwjgd7UMiYhZaN0asdXNLr0y+NjTfkA7SyQE5i2Fb7eawUOZmLvyqOA== dependencies: "@babel/helper-plugin-utils" "^7.27.1" @@ -538,13 +538,13 @@ "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-object-rest-spread@^7.24.7": - version "7.27.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.2.tgz#67f9ab822347aa2bcee91e8996763da79bdea973" - integrity sha512-AIUHD7xJ1mCrj3uPozvtngY3s0xpv7Nu7DoUSnzNY6Xam1Cy4rUznR//pvMHOhQ4AvbCexhbqXCtpxGHOGOO6g== + version "7.27.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.3.tgz#ce130aa73fef828bc3e3e835f9bc6144be3eb1c0" + integrity sha512-7ZZtznF9g4l2JCImCo5LNKFHB5eXnN39lLtLY5Tg+VkR0jwOt7TBciMckuiQIOIW7L5tkQOCh3bVGYeXgMx52Q== dependencies: "@babel/helper-compilation-targets" "^7.27.2" "@babel/helper-plugin-utils" "^7.27.1" - "@babel/plugin-transform-destructuring" "^7.27.1" + "@babel/plugin-transform-destructuring" "^7.27.3" "@babel/plugin-transform-parameters" "^7.27.1" "@babel/plugin-transform-optional-catch-binding@^7.24.7": @@ -634,16 +634,16 @@ "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-regenerator@^7.24.7": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.1.tgz#0a471df9213416e44cd66bf67176b66f65768401" - integrity sha512-B19lbbL7PMrKr52BNPjCqg1IyNUIjTcxKj8uX9zHO+PmWN93s19NDr/f69mIkEp2x9nmDJ08a7lgHaTTzvW7mw== + version "7.27.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.5.tgz#0c01f4e0e4cced15f68ee14b9c76dac9813850c7" + integrity sha512-uhB8yHerfe3MWnuLAhEbeQ4afVoqv8BQsPqrTv7e/jZ9y00kJL6l9a/f4OWaKxotmjzewfEyXE1vgDJenkQ2/Q== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-runtime@^7.24.7": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.27.1.tgz#f9fbf71949a209eb26b3e60375b1d956937b8be9" - integrity sha512-TqGF3desVsTcp3WrJGj4HfKokfCXCLcHpt4PJF0D8/iT6LPd9RS82Upw3KPeyr6B22Lfd3DO8MVrmp0oRkUDdw== + version "7.27.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.27.4.tgz#dee5c5db6543313d1ae1b4b1ec122ff1e77352b9" + integrity sha512-D68nR5zxU64EUzV8i7T3R5XP0Xhrou/amNnddsRQssx6GrTLdZl1rLxyjtVZBd+v/NVX4AbTPOB5aU8thAZV1A== dependencies: "@babel/helper-module-imports" "^7.27.1" "@babel/helper-plugin-utils" "^7.27.1" @@ -717,11 +717,11 @@ "@babel/plugin-transform-typescript" "^7.27.1" "@babel/runtime@^7.18.6", "@babel/runtime@^7.20.0", "@babel/runtime@^7.25.0": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.1.tgz#9fce313d12c9a77507f264de74626e87fd0dc541" - integrity sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog== + version "7.27.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.6.tgz#ec4070a04d76bae8ddbb10770ba55714a417b7c6" + integrity sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q== -"@babel/template@^7.25.0", "@babel/template@^7.27.1", "@babel/template@^7.3.3": +"@babel/template@^7.25.0", "@babel/template@^7.27.1", "@babel/template@^7.27.2", "@babel/template@^7.3.3": version "7.27.2" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d" integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== @@ -731,35 +731,35 @@ "@babel/types" "^7.27.1" "@babel/traverse--for-generate-function-map@npm:@babel/traverse@^7.25.3": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.27.1.tgz#4db772902b133bbddd1c4f7a7ee47761c1b9f291" - integrity sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg== + version "7.27.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.27.4.tgz#b0045ac7023c8472c3d35effd7cc9ebd638da6ea" + integrity sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA== dependencies: "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.27.1" - "@babel/parser" "^7.27.1" - "@babel/template" "^7.27.1" - "@babel/types" "^7.27.1" + "@babel/generator" "^7.27.3" + "@babel/parser" "^7.27.4" + "@babel/template" "^7.27.2" + "@babel/types" "^7.27.3" debug "^4.3.1" globals "^11.1.0" -"@babel/traverse@^7.25.3", "@babel/traverse@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.27.1.tgz#4db772902b133bbddd1c4f7a7ee47761c1b9f291" - integrity sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg== +"@babel/traverse@^7.25.3", "@babel/traverse@^7.27.1", "@babel/traverse@^7.27.3", "@babel/traverse@^7.27.4": + version "7.27.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.27.4.tgz#b0045ac7023c8472c3d35effd7cc9ebd638da6ea" + integrity sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA== dependencies: "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.27.1" - "@babel/parser" "^7.27.1" - "@babel/template" "^7.27.1" - "@babel/types" "^7.27.1" + "@babel/generator" "^7.27.3" + "@babel/parser" "^7.27.4" + "@babel/template" "^7.27.2" + "@babel/types" "^7.27.3" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.0", "@babel/types@^7.20.7", "@babel/types@^7.25.2", "@babel/types@^7.27.1", "@babel/types@^7.3.3": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.27.1.tgz#9defc53c16fc899e46941fc6901a9eea1c9d8560" - integrity sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q== +"@babel/types@^7.0.0", "@babel/types@^7.20.0", "@babel/types@^7.20.7", "@babel/types@^7.25.2", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.27.6", "@babel/types@^7.3.3": + version "7.27.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.27.6.tgz#a434ca7add514d4e646c80f7375c0aa2befc5535" + integrity sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q== dependencies: "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.27.1" @@ -772,15 +772,15 @@ deepmerge "^3.2.0" hoist-non-react-statics "^3.3.0" -"@expo/cli@0.24.12": - version "0.24.12" - resolved "https://registry.yarnpkg.com/@expo/cli/-/cli-0.24.12.tgz#815911d8cb0f769ffe5d09225ee0b6d9c4c01ab4" - integrity sha512-MHCIq5jE6uWG26z7SQjUGxXrggxrooKqaGLTz2Vktr5NPkqRc0HBRKi3Rzd4zH5Y902/p18itTQBgvYOrMHt/g== +"@expo/cli@0.24.14": + version "0.24.14" + resolved "https://registry.yarnpkg.com/@expo/cli/-/cli-0.24.14.tgz#af2e7ea5a08e3574e868cb0ec2110e68d32672e0" + integrity sha512-o+QYyfIBhSRTgaywKTLJhm2Fg5PrSeUVCXS+uQySamgoMjLNhHa8QwE64mW/FmJr5hZLiqUEQxb60FK4JcyqXg== dependencies: "@0no-co/graphql.web" "^1.0.8" "@babel/runtime" "^7.20.0" "@expo/code-signing-certificates" "^0.0.5" - "@expo/config" "~11.0.9" + "@expo/config" "~11.0.10" "@expo/config-plugins" "~10.0.2" "@expo/devcert" "^1.1.2" "@expo/env" "~1.0.5" @@ -794,7 +794,7 @@ "@expo/spawn-async" "^1.7.2" "@expo/ws-tunnel" "^1.0.1" "@expo/xcpretty" "^4.3.0" - "@react-native/dev-middleware" "0.79.2" + "@react-native/dev-middleware" "0.79.3" "@urql/core" "^5.0.6" "@urql/exchange-retry" "^1.3.0" accepts "^1.3.8" @@ -809,9 +809,9 @@ debug "^4.3.4" env-editor "^0.4.1" freeport-async "^2.0.0" - getenv "^1.0.0" + getenv "^2.0.0" glob "^10.4.2" - lan-network "^0.1.4" + lan-network "^0.1.6" minimatch "^9.0.0" node-forge "^1.3.1" npm-package-arg "^11.0.0" @@ -872,10 +872,10 @@ resolved "https://registry.yarnpkg.com/@expo/config-types/-/config-types-53.0.4.tgz#fe64fac734531ae883d18529b32586c23ffb1ceb" integrity sha512-0s+9vFx83WIToEr0Iwy4CcmiUXa5BgwBmEjylBB2eojX5XAMm9mJvw9KpjAb8m7zq2G0Q6bRbeufkzgbipuNQg== -"@expo/config@~11.0.9": - version "11.0.9" - resolved "https://registry.yarnpkg.com/@expo/config/-/config-11.0.9.tgz#0c8d02a1b2b4f9170f81b59cf99a6c57fe4e0e0a" - integrity sha512-Rm2nnuwvPFBPmK0qlzx1DyGFcDq1KgahvdnYRuCYGDwOxUrf+cqYnj/K7cHijC1sBpp8fw550NVKMoLCsOodjw== +"@expo/config@~11.0.10", "@expo/config@~11.0.9": + version "11.0.10" + resolved "https://registry.yarnpkg.com/@expo/config/-/config-11.0.10.tgz#559d9425a4e0de4fab96ccac01ff40f5cebbc04b" + integrity sha512-8S8Krr/c5lnl0eF03tA2UGY9rGBhZcbWKz2UWw5dpL/+zstwUmog8oyuuC8aRcn7GiTQLlbBkxcMeT8sOGlhbA== dependencies: "@babel/code-frame" "~7.10.4" "@expo/config-plugins" "~10.0.2" @@ -1021,7 +1021,7 @@ base64-js "^1.2.3" xmlbuilder "^15.1.1" -"@expo/prebuild-config@^9.0.5", "@expo/prebuild-config@^9.0.6": +"@expo/prebuild-config@^9.0.6": version "9.0.6" resolved "https://registry.yarnpkg.com/@expo/prebuild-config/-/prebuild-config-9.0.6.tgz#f634e7b8f9ebebeaf2e7d2f2be46926c23834d2b" integrity sha512-HDTdlMkTQZ95rd6EpvuLM+xkZV03yGLc38FqI37qKFLJtUN1WnYVaWsuXKoljd1OrVEVsHe6CfqKwaPZ52D56Q== @@ -1290,23 +1290,23 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@react-native/assets-registry@0.79.2": - version "0.79.2" - resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.79.2.tgz#731963e664c8543f5b277e56c058bde612b69f50" - integrity sha512-5h2Z7/+/HL/0h88s0JHOdRCW4CXMCJoROxqzHqxdrjGL6EBD1DdaB4ZqkCOEVSW4Vjhir5Qb97C8i/MPWEYPtg== +"@react-native/assets-registry@0.79.3": + version "0.79.3" + resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.79.3.tgz#022218d55a5d9d221a6d176987ab0b35c10d388b" + integrity sha512-Vy8DQXCJ21YSAiHxrNBz35VqVlZPpRYm50xRTWRf660JwHuJkFQG8cUkrLzm7AUriqUXxwpkQHcY+b0ibw9ejQ== -"@react-native/babel-plugin-codegen@0.79.2": - version "0.79.2" - resolved "https://registry.yarnpkg.com/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.79.2.tgz#f3f86766a01487aaaa623ec62514af4c84400953" - integrity sha512-d+NB7Uosn2ZWd4O4+7ZkB6q1a+0z2opD/4+Bzhk/Tv6fc5FrSftK2Noqxvo3/bhbdGFVPxf0yvLE8et4W17x/Q== +"@react-native/babel-plugin-codegen@0.79.3": + version "0.79.3" + resolved "https://registry.yarnpkg.com/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.79.3.tgz#acad4acaead398a8c8bcdecbe44040aa0c2dc2d7" + integrity sha512-Zb8F4bSEKKZfms5n1MQ0o5mudDcpAINkKiFuFTU0PErYGjY3kZ+JeIP+gS6KCXsckxCfMEKQwqKicP/4DWgsZQ== dependencies: "@babel/traverse" "^7.25.3" - "@react-native/codegen" "0.79.2" + "@react-native/codegen" "0.79.3" -"@react-native/babel-preset@0.79.2": - version "0.79.2" - resolved "https://registry.yarnpkg.com/@react-native/babel-preset/-/babel-preset-0.79.2.tgz#5a683a6efeea357a326f70c84a881be2bafbeae3" - integrity sha512-/HNu869oUq4FUXizpiNWrIhucsYZqu0/0spudJEzk9SEKar0EjVDP7zkg/sKK+KccNypDQGW7nFXT8onzvQ3og== +"@react-native/babel-preset@0.79.3": + version "0.79.3" + resolved "https://registry.yarnpkg.com/@react-native/babel-preset/-/babel-preset-0.79.3.tgz#8ad6c149cd488fbc18d62983119bdcbfc15ff651" + integrity sha512-VHGNP02bDD2Ul1my0pLVwe/0dsEBHxR343ySpgnkCNEEm9C1ANQIL2wvnJrHZPcqfAkWfFQ8Ln3t+6fdm4A/Dg== dependencies: "@babel/core" "^7.25.2" "@babel/plugin-proposal-export-default-from" "^7.24.7" @@ -1349,15 +1349,15 @@ "@babel/plugin-transform-typescript" "^7.25.2" "@babel/plugin-transform-unicode-regex" "^7.24.7" "@babel/template" "^7.25.0" - "@react-native/babel-plugin-codegen" "0.79.2" + "@react-native/babel-plugin-codegen" "0.79.3" babel-plugin-syntax-hermes-parser "0.25.1" babel-plugin-transform-flow-enums "^0.0.2" react-refresh "^0.14.0" -"@react-native/codegen@0.79.2": - version "0.79.2" - resolved "https://registry.yarnpkg.com/@react-native/codegen/-/codegen-0.79.2.tgz#75270d8162e78c02b0272396a3c6942e39e8703d" - integrity sha512-8JTlGLuLi1p8Jx2N/enwwEd7/2CfrqJpv90Cp77QLRX3VHF2hdyavRIxAmXMwN95k+Me7CUuPtqn2X3IBXOWYg== +"@react-native/codegen@0.79.3": + version "0.79.3" + resolved "https://registry.yarnpkg.com/@react-native/codegen/-/codegen-0.79.3.tgz#49689132718c81a3b25426769bc6fd8fd2a0469f" + integrity sha512-CZejXqKch/a5/s/MO5T8mkAgvzCXgsTkQtpCF15kWR9HN8T+16k0CsN7TXAxXycltoxiE3XRglOrZNEa/TiZUQ== dependencies: glob "^7.1.1" hermes-parser "0.25.1" @@ -1365,12 +1365,12 @@ nullthrows "^1.1.1" yargs "^17.6.2" -"@react-native/community-cli-plugin@0.79.2": - version "0.79.2" - resolved "https://registry.yarnpkg.com/@react-native/community-cli-plugin/-/community-cli-plugin-0.79.2.tgz#d3a0efbdfb554cf3a7e9bfb27865a7caeeeaa1b3" - integrity sha512-E+YEY2dL+68HyR2iahsZdyBKBUi9QyPyaN9vsnda1jNgCjNpSPk2yAF5cXsho+zKK5ZQna3JSeE1Kbi2IfGJbw== +"@react-native/community-cli-plugin@0.79.3": + version "0.79.3" + resolved "https://registry.yarnpkg.com/@react-native/community-cli-plugin/-/community-cli-plugin-0.79.3.tgz#84821d3401074e036ba05b8b6ca1ee122cb43e29" + integrity sha512-N/+p4HQqN4yK6IRzn7OgMvUIcrmEWkecglk1q5nj+AzNpfIOzB+mqR20SYmnPfeXF+mZzYCzRANb3KiM+WsSDA== dependencies: - "@react-native/dev-middleware" "0.79.2" + "@react-native/dev-middleware" "0.79.3" chalk "^4.0.0" debug "^2.2.0" invariant "^2.2.4" @@ -1379,18 +1379,18 @@ metro-core "^0.82.0" semver "^7.1.3" -"@react-native/debugger-frontend@0.79.2": - version "0.79.2" - resolved "https://registry.yarnpkg.com/@react-native/debugger-frontend/-/debugger-frontend-0.79.2.tgz#1377de6d9cabe5455bf332e06408167da5f60c19" - integrity sha512-cGmC7X6kju76DopSBNc+PRAEetbd7TWF9J9o84hOp/xL3ahxR2kuxJy0oJX8Eg8oehhGGEXTuMKHzNa3rDBeSg== +"@react-native/debugger-frontend@0.79.3": + version "0.79.3" + resolved "https://registry.yarnpkg.com/@react-native/debugger-frontend/-/debugger-frontend-0.79.3.tgz#9cb57d8e88c22552194ab5f6f257605b151bc5b3" + integrity sha512-ImNDuEeKH6lEsLXms3ZsgIrNF94jymfuhPcVY5L0trzaYNo9ZFE9Ni2/18E1IbfXxdeIHrCSBJlWD6CTm7wu5A== -"@react-native/dev-middleware@0.79.2": - version "0.79.2" - resolved "https://registry.yarnpkg.com/@react-native/dev-middleware/-/dev-middleware-0.79.2.tgz#f09f1a75b4cd0b56dfd82a07bf41157a9c45619c" - integrity sha512-9q4CpkklsAs1L0Bw8XYCoqqyBSrfRALGEw4/r0EkR38Y/6fVfNfdsjSns0pTLO6h0VpxswK34L/hm4uK3MoLHw== +"@react-native/dev-middleware@0.79.3": + version "0.79.3" + resolved "https://registry.yarnpkg.com/@react-native/dev-middleware/-/dev-middleware-0.79.3.tgz#3e315ef7516ebad60a4202b4094d84fedecb4064" + integrity sha512-x88+RGOyG71+idQefnQg7wLhzjn/Scs+re1O5vqCkTVzRAc/f7SdHMlbmECUxJPd08FqMcOJr7/X3nsJBrNuuw== dependencies: "@isaacs/ttlcache" "^1.4.1" - "@react-native/debugger-frontend" "0.79.2" + "@react-native/debugger-frontend" "0.79.3" chrome-launcher "^0.15.2" chromium-edge-launcher "^0.2.0" connect "^3.6.5" @@ -1401,30 +1401,35 @@ serve-static "^1.16.2" ws "^6.2.3" -"@react-native/gradle-plugin@0.79.2": - version "0.79.2" - resolved "https://registry.yarnpkg.com/@react-native/gradle-plugin/-/gradle-plugin-0.79.2.tgz#d41d4e2c63baf688a2b47652c6260f2a2f1ec091" - integrity sha512-6MJFemrwR0bOT0QM+2BxX9k3/pvZQNmJ3Js5pF/6owsA0cUDiCO57otiEU8Fz+UywWEzn1FoQfOfQ8vt2GYmoA== +"@react-native/gradle-plugin@0.79.3": + version "0.79.3" + resolved "https://registry.yarnpkg.com/@react-native/gradle-plugin/-/gradle-plugin-0.79.3.tgz#69ba47ac406ccdb3b3829f311bd7c27e6fad7ebc" + integrity sha512-imfpZLhNBc9UFSzb/MOy2tNcIBHqVmexh/qdzw83F75BmUtLb/Gs1L2V5gw+WI1r7RqDILbWk7gXB8zUllwd+g== -"@react-native/js-polyfills@0.79.2": - version "0.79.2" - resolved "https://registry.yarnpkg.com/@react-native/js-polyfills/-/js-polyfills-0.79.2.tgz#15eb4da0fe9e8d61d2980d08fd06b5f49e133b0f" - integrity sha512-IaY87Ckd4GTPMkO1/Fe8fC1IgIx3vc3q9Tyt/6qS3Mtk9nC0x9q4kSR5t+HHq0/MuvGtu8HpdxXGy5wLaM+zUw== +"@react-native/js-polyfills@0.79.3": + version "0.79.3" + resolved "https://registry.yarnpkg.com/@react-native/js-polyfills/-/js-polyfills-0.79.3.tgz#bf5614363f118c6bdf2f773c578e603c88d0425c" + integrity sha512-PEBtg6Kox6KahjCAch0UrqCAmHiNLEbp2SblUEoFAQnov4DSxBN9safh+QSVaCiMAwLjvNfXrJyygZz60Dqz3Q== "@react-native/normalize-colors@0.79.2": version "0.79.2" resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.79.2.tgz#9ab70ca257c7411e4ab74cf7f91332c27d39cc6f" integrity sha512-+b+GNrupWrWw1okHnEENz63j7NSMqhKeFMOyzYLBwKcprG8fqJQhDIGXfizKdxeIa5NnGSAevKL1Ev1zJ56X8w== +"@react-native/normalize-colors@0.79.3": + version "0.79.3" + resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.79.3.tgz#e491937436a2c287707e24263308c818a66eb447" + integrity sha512-T75NIQPRFCj6DFMxtcVMJTZR+3vHXaUMSd15t+CkJpc5LnyX91GVaPxpRSAdjFh7m3Yppl5MpdjV/fntImheYQ== + "@react-native/normalize-colors@^0.74.1": version "0.74.89" resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.74.89.tgz#b8ac17d1bbccd3ef9a1f921665d04d42cff85976" integrity sha512-qoMMXddVKVhZ8PA1AbUCk83trpd6N+1nF2A6k1i6LsQObyS92fELuk8kU/lQs6M7BsMHwqyLCpQJ1uFgNvIQXg== -"@react-native/virtualized-lists@0.79.2": - version "0.79.2" - resolved "https://registry.yarnpkg.com/@react-native/virtualized-lists/-/virtualized-lists-0.79.2.tgz#ed5a419a30b7ddec978b7816ff698a9d85507e15" - integrity sha512-9G6ROJeP+rdw9Bvr5ruOlag11ET7j1z/En1riFFNo6W3xZvJY+alCuH1ttm12y9+zBm4n8jwCk4lGhjYaV4dKw== +"@react-native/virtualized-lists@0.79.3": + version "0.79.3" + resolved "https://registry.yarnpkg.com/@react-native/virtualized-lists/-/virtualized-lists-0.79.3.tgz#4a2799017cd3795f519422f48b3c0bbc4739a245" + integrity sha512-/0rRozkn+iIHya2vnnvprDgT7QkfI54FLrACAN3BLP7MRlfOIGOrZsXpRLndnLBVnjNzkcre84i1RecjoXnwIA== dependencies: invariant "^2.2.4" nullthrows "^1.1.1" @@ -1533,9 +1538,9 @@ "@types/json-schema" "*" "@types/estree@*", "@types/estree@^1.0.6": - version "1.0.7" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.7.tgz#4158d3105276773d5b7695cd4834b1722e4f37a8" - integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ== + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" + integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^5.0.0": version "5.0.6" @@ -1558,18 +1563,18 @@ "@types/send" "*" "@types/express@*": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.1.tgz#138d741c6e5db8cc273bec5285cd6e9d0779fc9f" - integrity sha512-UZUw8vjpWFXuDnjFTh7/5c2TWDlQqeXHi6hcN7F2XSVT5P+WmUnnbFS3KA6Jnc6IsEqI2qCVu2bK0R0J4A8ZQQ== + version "5.0.2" + resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.2.tgz#7be9e337a5745d6b43ef5b0c352dad94a7f0c256" + integrity sha512-BtjL3ZwbCQriyb0DGw+Rt12qAXPiBTPs815lsUvtt1Grk0vLRMZNMUZ741d5rjk+UQOxfDiBZ3dxpX00vSkK3g== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "^5.0.0" "@types/serve-static" "*" "@types/express@^4.17.13": - version "4.17.21" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" - integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== + version "4.17.22" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.22.tgz#14cfcf120f7eb56ebb8ca77b7fa9a14d21de7c96" + integrity sha512-eZUmSnhRX9YRSkplpz0N+k6NljUUn5l3EWZIKZvYzhvMphEuNiyyy1viH/ejgt66JWgALwC/gtSUAeQKtSwW/w== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "^4.17.33" @@ -1650,16 +1655,16 @@ "@types/node" "*" "@types/node@*": - version "22.15.15" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.15.15.tgz#8877c05c18e552e738438e477d7ba22c5d73a57c" - integrity sha512-R5muMcZob3/Jjchn5LcO8jdKwSCbzqmPB6ruBxMcf9kbxtniZHP327s6C37iOfuw8mbKK3cAQa7sEl7afLrQ8A== + version "22.15.30" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.15.30.tgz#3a20431783e28dd0b0326f84ab386a2ec81d921d" + integrity sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA== dependencies: undici-types "~6.21.0" "@types/qs@*": - version "6.9.18" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.18.tgz#877292caa91f7c1b213032b34626505b746624c2" - integrity sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA== + version "6.14.0" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.14.0.tgz#d8b60cecf62f2db0fb68e5e006077b9178b85de5" + integrity sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ== "@types/range-parser@*": version "1.2.7" @@ -1898,7 +1903,7 @@ accepts@^1.3.7, accepts@^1.3.8, accepts@~1.3.4, accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" -acorn@^8.14.0, acorn@^8.8.2: +acorn@^8.14.0: version "8.14.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.1.tgz#721d5dc10f7d5b5609a891773d47731796935dfb" integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== @@ -2205,10 +2210,10 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" -babel-preset-expo@~13.1.11: - version "13.1.11" - resolved "https://registry.yarnpkg.com/babel-preset-expo/-/babel-preset-expo-13.1.11.tgz#de81e6a621c9f40dcb1e0bf5f1fe111f82c10496" - integrity sha512-jigWjvhRVdm9UTPJ1wjLYJ0OJvD5vLZ8YYkEknEl6+9S1JWORO/y3xtHr/hNj5n34nOilZqdXrmNFcqKc8YTsg== +babel-preset-expo@~13.2.0: + version "13.2.0" + resolved "https://registry.yarnpkg.com/babel-preset-expo/-/babel-preset-expo-13.2.0.tgz#d4540009d07242e3c3d63184b7a34efda95e8e64" + integrity sha512-oNUeUZPMNRPmx/2jaKJLSQFP/MFI1M91vP+Gp+j8/FPl9p/ps603DNwCaRdcT/Vj3FfREdlIwRio1qDCjY0oAA== dependencies: "@babel/helper-module-imports" "^7.25.9" "@babel/plugin-proposal-decorators" "^7.12.9" @@ -2224,7 +2229,7 @@ babel-preset-expo@~13.1.11: "@babel/plugin-transform-runtime" "^7.24.7" "@babel/preset-react" "^7.22.15" "@babel/preset-typescript" "^7.23.0" - "@react-native/babel-preset" "0.79.2" + "@react-native/babel-preset" "0.79.3" babel-plugin-react-native-web "~0.19.13" babel-plugin-syntax-hermes-parser "^0.25.1" babel-plugin-transform-flow-enums "^0.0.2" @@ -2423,12 +2428,12 @@ browserify-sign@^4.2.3: safe-buffer "^5.2.1" browserslist@^4.0.0, browserslist@^4.21.4, browserslist@^4.24.0, browserslist@^4.24.4: - version "4.24.5" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.5.tgz#aa0f5b8560fe81fde84c6dcb38f759bafba0e11b" - integrity sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw== + version "4.25.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.25.0.tgz#986aa9c6d87916885da2b50d8eb577ac8d133b2c" + integrity sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA== dependencies: - caniuse-lite "^1.0.30001716" - electron-to-chromium "^1.5.149" + caniuse-lite "^1.0.30001718" + electron-to-chromium "^1.5.160" node-releases "^2.0.19" update-browserslist-db "^1.1.3" @@ -2525,10 +2530,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001716: - version "1.0.30001717" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001717.tgz#5d9fec5ce09796a1893013825510678928aca129" - integrity sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001718: + version "1.0.30001721" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001721.tgz#36b90cd96901f8c98dd6698bf5c8af7d4c6872d7" + integrity sha512-cOuvmUVtKrtEaoKiO0rSc29jcjwMwX5tOHDy4MgVFEWiUXj4uBMJkwI8MDySkgXidpMiHUcviogAvFi4pA2hDQ== chalk@^2.0.1, chalk@^2.4.2: version "2.4.2" @@ -3055,9 +3060,9 @@ debug@2.6.9, debug@^2.2.0, debug@^2.6.9: ms "2.0.0" debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" - integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== + version "4.4.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b" + integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== dependencies: ms "^2.1.3" @@ -3252,10 +3257,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.5.149: - version "1.5.150" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.150.tgz#3120bf34453a7a82cb4d9335df20680b2bb40649" - integrity sha512-rOOkP2ZUMx1yL4fCxXQKDHQ8ZXwisb2OycOQVKHgvB3ZI4CvehOd4y2tfnnLDieJ3Zs1RL1Dlp3cMkyIn7nnXA== +electron-to-chromium@^1.5.160: + version "1.5.165" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.165.tgz#477b0957e42f071905a86f7c905a9848f95d2bdb" + integrity sha512-naiMx1Z6Nb2TxPU6fiFrUrDTjyPMLdTtaOd2oLmG8zVSg2hCWGkhPyxwk+qRmZ1ytwVqUv0u7ZcDA5+ALhaUtw== elliptic@^6.5.3, elliptic@^6.5.5: version "6.6.1" @@ -3468,10 +3473,10 @@ expo-constants@~17.1.5, expo-constants@~17.1.6: "@expo/config" "~11.0.9" "@expo/env" "~1.0.5" -expo-file-system@~18.1.9: - version "18.1.9" - resolved "https://registry.yarnpkg.com/expo-file-system/-/expo-file-system-18.1.9.tgz#0fa1f6bd491ef820abfb00dd9d5fac9c2dc7c4b0" - integrity sha512-2i8IpaXpLVSI/dmT6TBfvRkl1+YkbWI07NCsQX1Myh33AF8xaJ4jv3Hz6WK1JArqDagCmrQUB2mW9SYnWYqLHg== +expo-file-system@~18.1.10: + version "18.1.10" + resolved "https://registry.yarnpkg.com/expo-file-system/-/expo-file-system-18.1.10.tgz#22f3bcc2c9a7edcd6bba5ece3c90a8467fda47be" + integrity sha512-SyaWg+HitScLuyEeSG9gMSDT0hIxbM9jiZjSBP9l9zMnwZjmQwsusE6+7qGiddxJzdOhTP4YGUfvEzeeS0YL3Q== expo-font@~13.3.1: version "13.3.1" @@ -3498,10 +3503,10 @@ expo-modules-autolinking@2.1.10: require-from-string "^2.0.2" resolve-from "^5.0.0" -expo-modules-core@2.3.12: - version "2.3.12" - resolved "https://registry.yarnpkg.com/expo-modules-core/-/expo-modules-core-2.3.12.tgz#1c06402564c02b32f192adfe6946e671d8a95e79" - integrity sha512-bOm83mskw1S7xuDX50DlLdx68u0doQ6BZHSU2qTv8P1/5QYeAae3pCgFLq2hoptUNeMF7W+68ShJFTOHAe68BQ== +expo-modules-core@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/expo-modules-core/-/expo-modules-core-2.4.0.tgz#3081d62fadff913090cc5abfe46d9ec6b0e75789" + integrity sha512-Ko5eHBdvuMykjw9P9C9PF54/wBSsGOxaOjx92I5BwgKvEmUwN3UrXFV4CXzlLVbLfSYUQaLcB220xmPfgvT7Fg== dependencies: invariant "^2.2.4" @@ -3515,12 +3520,12 @@ expo-pwa@0.0.127: commander "2.20.0" update-check "1.5.3" -expo-splash-screen@~0.30.8: - version "0.30.8" - resolved "https://registry.yarnpkg.com/expo-splash-screen/-/expo-splash-screen-0.30.8.tgz#2e960ccff053bc8ace85eb56f7d6745e4ddfc6b6" - integrity sha512-2eh+uA543brfeG5HILXmtNKA7E2/pfywKzNumzy3Ef6OtDjYy6zJUGNSbhnZRbVEjUZo3/QNRs0JRBfY80okZg== +expo-splash-screen@~0.30.9: + version "0.30.9" + resolved "https://registry.yarnpkg.com/expo-splash-screen/-/expo-splash-screen-0.30.9.tgz#8f2a86b3b802ea46065fc761ed60e77e81bdb84c" + integrity sha512-curHUaZxUTZ2dWvz32ao3xPv5mJr1LBqn5V8xm/IULAehB9RGCn8iKiROMN1PYebSG+56vPMuJmBm9P+ayvJpA== dependencies: - "@expo/prebuild-config" "^9.0.5" + "@expo/prebuild-config" "^9.0.6" expo-status-bar@~2.2.3: version "2.2.3" @@ -3530,26 +3535,26 @@ expo-status-bar@~2.2.3: react-native-edge-to-edge "1.6.0" react-native-is-edge-to-edge "^1.1.6" -expo@^53.0.8: - version "53.0.8" - resolved "https://registry.yarnpkg.com/expo/-/expo-53.0.8.tgz#281915262e4694103bfdd04816ade84d945af808" - integrity sha512-5CQWayZFDKif++HwfI6ysRNfePYH3MOEZw5edQStQyoL2MehzlasZoICSYHzqptMdMFSt2RTM5Tqgn8L4wYmVg== +expo@^53.0.10: + version "53.0.10" + resolved "https://registry.yarnpkg.com/expo/-/expo-53.0.10.tgz#be5ec2e7fc2c9c6fdace7521a15be43f410c22e3" + integrity sha512-rN3HcQOeum4i+4Fq1+wBuTWbUjHZqTE7YgGGioOtY2WnhYt+4OSrTlxjRjp13AtkLuKSKkh34gkdFMlUepKlXA== dependencies: "@babel/runtime" "^7.20.0" - "@expo/cli" "0.24.12" - "@expo/config" "~11.0.9" + "@expo/cli" "0.24.14" + "@expo/config" "~11.0.10" "@expo/config-plugins" "~10.0.2" "@expo/fingerprint" "0.12.4" "@expo/metro-config" "0.20.14" "@expo/vector-icons" "^14.0.0" - babel-preset-expo "~13.1.11" + babel-preset-expo "~13.2.0" expo-asset "~11.1.5" expo-constants "~17.1.6" - expo-file-system "~18.1.9" + expo-file-system "~18.1.10" expo-font "~13.3.1" expo-keep-awake "~14.1.4" expo-modules-autolinking "2.1.10" - expo-modules-core "2.3.12" + expo-modules-core "2.4.0" react-native-edge-to-edge "1.6.0" whatwg-url-without-unicode "8.0.0-3" @@ -3865,6 +3870,11 @@ getenv@^1.0.0: resolved "https://registry.yarnpkg.com/getenv/-/getenv-1.0.0.tgz#874f2e7544fbca53c7a4738f37de8605c3fcfc31" integrity sha512-7yetJWqbS9sbn0vIfliPsFgoXMKn/YMF+Wuiog97x+urnSRRRZ7xB+uVkwGKzRgq9CDFfMQnE9ruL5DHv9c6Xg== +getenv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/getenv/-/getenv-2.0.0.tgz#b1698c7b0f29588f4577d06c42c73a5b475c69e0" + integrity sha512-VilgtJj/ALgGY77fiLam5iD336eSWi96Q15JSAG1zi8NRBysm3LXKdGnHb4m5cuyxvOLQQKWpBZAT6ni4FI2iQ== + glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -4588,10 +4598,10 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -lan-network@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/lan-network/-/lan-network-0.1.5.tgz#e781889b7bd4dbedd9126fff3ceddd809a83c3ff" - integrity sha512-CV3k7l8jW0Z1b+G41tB7JInVyJEKQzh/YPl2v9uXpZMusp0aa+rh3OqG77xWuX7+eVBa8PsdTuMznTAssF4qwg== +lan-network@^0.1.6: + version "0.1.7" + resolved "https://registry.yarnpkg.com/lan-network/-/lan-network-0.1.7.tgz#9fcb9967c6d951f10b2f9a9ffabe4a312d63f69d" + integrity sha512-mnIlAEMu4OyEvUNdzco9xpuB9YVcPkQec+QsgycBCtPZvEqWPCDPfbAE4OJMdBBWpZWtpCn1xw9jJYlwjWI5zQ== launch-editor@^2.6.0: version "2.10.0" @@ -4873,60 +4883,60 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== -metro-babel-transformer@0.82.3: - version "0.82.3" - resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.82.3.tgz#e3b8102d165f4ce769e3d2f22ab0b0ad2d941dcc" - integrity sha512-eC0f1MSA8rg7VoNDCYMIAIe5AEgYBskh5W8rIa4RGRdmEOsGlXbAV0AWMYoA7NlIALW/S9b10AcdIwD3n1e50w== +metro-babel-transformer@0.82.4: + version "0.82.4" + resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.82.4.tgz#1ac029add8f75d0048c54efc266c0a78791f52b2" + integrity sha512-4juJahGRb1gmNbQq48lNinB6WFNfb6m0BQqi/RQibEltNiqTCxew/dBspI2EWA4xVCd3mQWGfw0TML4KurQZnQ== dependencies: "@babel/core" "^7.25.2" flow-enums-runtime "^0.0.6" hermes-parser "0.28.1" nullthrows "^1.1.1" -metro-cache-key@0.82.3: - version "0.82.3" - resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.82.3.tgz#71b5d6b682515026ac09dfbae223ebe8d4fd3a7b" - integrity sha512-dDLTUOJ7YYqGog9kR55InchwnkkHuxBXD765J3hQVWWPCy6xO9uZXZYGX1Y/tIMV8U7Ho1Sve0V13n5rFajrRQ== +metro-cache-key@0.82.4: + version "0.82.4" + resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.82.4.tgz#21f850008fa2570a51e3958574ea5a791574752e" + integrity sha512-2JCTqcpF+f2OghOpe/+x+JywfzDkrHdAqinPFWmK2ezNAU/qX0jBFaTETogPibFivxZJil37w9Yp6syX8rFUng== dependencies: flow-enums-runtime "^0.0.6" -metro-cache@0.82.3: - version "0.82.3" - resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.82.3.tgz#4ba5010cb0e9b033b907ba829cf596c0c70f579c" - integrity sha512-9zKhicA5GENROeP+iXku1NrI8FegtwEg3iPXHGixkm1Yppkbwsy/3lSHSiJZoT6GkZmxUDjN6sQ5QQ+/p72Msw== +metro-cache@0.82.4: + version "0.82.4" + resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.82.4.tgz#f44557f8b33f5d7b7ba4ccba2880c111e9884329" + integrity sha512-vX0ylSMGtORKiZ4G8uP6fgfPdDiCWvLZUGZ5zIblSGylOX6JYhvExl0Zg4UA9pix/SSQu5Pnp9vdODMFsNIxhw== dependencies: exponential-backoff "^3.1.1" flow-enums-runtime "^0.0.6" https-proxy-agent "^7.0.5" - metro-core "0.82.3" + metro-core "0.82.4" -metro-config@0.82.3, metro-config@^0.82.0: - version "0.82.3" - resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.82.3.tgz#29d74425ebe255b4da46f2886d82191f88af1c49" - integrity sha512-GRG9sBkPvrGXD/Wu3RdEDuWg5NDixF9t0c6Zz9kZ9Aa/aQY+m85JgaCI5HYEV+UzVC/IUFFSpJiMfzQRicppLw== +metro-config@0.82.4, metro-config@^0.82.0: + version "0.82.4" + resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.82.4.tgz#d42fa8b6a4d53493c34d217bbc6c13ee4817355c" + integrity sha512-Ki3Wumr3hKHGDS7RrHsygmmRNc/PCJrvkLn0+BWWxmbOmOcMMJDSmSI+WRlT8jd5VPZFxIi4wg+sAt5yBXAK0g== dependencies: connect "^3.6.5" cosmiconfig "^5.0.5" flow-enums-runtime "^0.0.6" jest-validate "^29.7.0" - metro "0.82.3" - metro-cache "0.82.3" - metro-core "0.82.3" - metro-runtime "0.82.3" + metro "0.82.4" + metro-cache "0.82.4" + metro-core "0.82.4" + metro-runtime "0.82.4" -metro-core@0.82.3, metro-core@^0.82.0: - version "0.82.3" - resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.82.3.tgz#749b0916c60f164f05c99e7382917665fe01b287" - integrity sha512-JQZDdXo3hyLl1pqVT4IKEwcBK+3f11qFXeCjQ1hjVpjMwQLOqSM02J7NC/4DNSBt+qWBxWj6R5Jphcc7+9AEWw== +metro-core@0.82.4, metro-core@^0.82.0: + version "0.82.4" + resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.82.4.tgz#f7f498929ac066dafe704c3598a990eeb2acdc8c" + integrity sha512-Xo4ozbxPg2vfgJGCgXZ8sVhC2M0lhTqD+tsKO2q9aelq/dCjnnSb26xZKcQO80CQOQUL7e3QWB7pLFGPjZm31A== dependencies: flow-enums-runtime "^0.0.6" lodash.throttle "^4.1.1" - metro-resolver "0.82.3" + metro-resolver "0.82.4" -metro-file-map@0.82.3: - version "0.82.3" - resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.82.3.tgz#868677ea55df2cf6491d9de34416e1498bd8f80a" - integrity sha512-o4wtloAge85MZl85F87FT59R/4tn5GvCvLfYcnzzDB20o2YX9AMxZqswrGMaei/GbD/Win5FrLF/Iq8oetcByA== +metro-file-map@0.82.4: + version "0.82.4" + resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.82.4.tgz#186d737088433dd290c5974d9d96d7e62d36e4f9" + integrity sha512-eO7HD1O3aeNsbEe6NBZvx1lLJUrxgyATjnDmb7bm4eyF6yWOQot9XVtxTDLNifECuvsZ4jzRiTInrbmIHkTdGA== dependencies: debug "^4.4.0" fb-watchman "^2.0.0" @@ -4938,61 +4948,61 @@ metro-file-map@0.82.3: nullthrows "^1.1.1" walker "^1.0.7" -metro-minify-terser@0.82.3: - version "0.82.3" - resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.82.3.tgz#7b90f892ef0abccc58c69ae480d3032c6f0bbe86" - integrity sha512-/3FasOULfHq1P0KPNFy5y28Th5oknPSwEbt9JELVBMAPhUnLqQkCLr4M+RQzKG3aEQN1/mEqenWApFCkk6Nm/Q== +metro-minify-terser@0.82.4: + version "0.82.4" + resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.82.4.tgz#3750c14e7a25eba591f6c75eed995f6751030618" + integrity sha512-W79Mi6BUwWVaM8Mc5XepcqkG+TSsCyyo//dmTsgYfJcsmReQorRFodil3bbJInETvjzdnS1mCsUo9pllNjT1Hg== dependencies: flow-enums-runtime "^0.0.6" terser "^5.15.0" -metro-resolver@0.82.3: - version "0.82.3" - resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.82.3.tgz#6ba7dfe9b8c57b1332a3747bb6d013006d8968f6" - integrity sha512-pdib7UrOM04j/RjWmaqmjjWRiuCbpA8BdUSuXzvBaK0QlNzHkRRDv6kiOGxgQ+UgG+KdbPcJktsW9olqiDhf9w== +metro-resolver@0.82.4: + version "0.82.4" + resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.82.4.tgz#936a2300fa577183a1e0e6f7cc405e52f9276f0e" + integrity sha512-uWoHzOBGQTPT5PjippB8rRT3iI9CTgFA9tRiLMzrseA5o7YAlgvfTdY9vFk2qyk3lW3aQfFKWkmqENryPRpu+Q== dependencies: flow-enums-runtime "^0.0.6" -metro-runtime@0.82.3, metro-runtime@^0.82.0: - version "0.82.3" - resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.82.3.tgz#fe793cf9e976256bd450f3da7845fd704f5254bf" - integrity sha512-J4SrUUsBy9ire8I2sFuXN5MzPmuBHlx1bjvAjdoo1ecpH2mtS3ubRqVnMotBxuK5+GhrbW0mtg5/46PVXy26cw== +metro-runtime@0.82.4, metro-runtime@^0.82.0: + version "0.82.4" + resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.82.4.tgz#70e0b871683fdb594f2a7c03403b6350deca086b" + integrity sha512-vVyFO7H+eLXRV2E7YAUYA7aMGBECGagqxmFvC2hmErS7oq90BbPVENfAHbUWq1vWH+MRiivoRxdxlN8gBoF/dw== dependencies: "@babel/runtime" "^7.25.0" flow-enums-runtime "^0.0.6" -metro-source-map@0.82.3, metro-source-map@^0.82.0: - version "0.82.3" - resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.82.3.tgz#e5d243473b057f70e1090ce9cc769cd72deec40c" - integrity sha512-gz7wfjz23rit6ePQ7NKE9x+VOWGKm54vli4wbphR9W+3y0bh6Ad7T0BGH9DUzRAnOnOorewrVEqFmT24mia5sg== +metro-source-map@0.82.4, metro-source-map@^0.82.0: + version "0.82.4" + resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.82.4.tgz#ddd9bdf3a5864ee8f0b296ed11e46bdc2de321ac" + integrity sha512-9jzDQJ0FPas1FuQFtwmBHsez2BfhFNufMowbOMeG3ZaFvzeziE8A0aJwILDS3U+V5039ssCQFiQeqDgENWvquA== dependencies: "@babel/traverse" "^7.25.3" "@babel/traverse--for-generate-function-map" "npm:@babel/traverse@^7.25.3" "@babel/types" "^7.25.2" flow-enums-runtime "^0.0.6" invariant "^2.2.4" - metro-symbolicate "0.82.3" + metro-symbolicate "0.82.4" nullthrows "^1.1.1" - ob1 "0.82.3" + ob1 "0.82.4" source-map "^0.5.6" vlq "^1.0.0" -metro-symbolicate@0.82.3: - version "0.82.3" - resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.82.3.tgz#50c5a645727fad9f0eaef1856298ddf267d35a0b" - integrity sha512-WZKhR+QGbwkOLWP1z58Y7BFWUqLVDEEPsSQ5UI5+OWQDAwdtsPU9+sSNoJtD5qRU9qrB2XewQE3lJ2EQRRFJew== +metro-symbolicate@0.82.4: + version "0.82.4" + resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.82.4.tgz#76603b0ec2ad8fe5f174aa76485cc46228547a91" + integrity sha512-LwEwAtdsx7z8rYjxjpLWxuFa2U0J6TS6ljlQM4WAATKa4uzV8unmnRuN2iNBWTmRqgNR77mzmI2vhwD4QSCo+w== dependencies: flow-enums-runtime "^0.0.6" invariant "^2.2.4" - metro-source-map "0.82.3" + metro-source-map "0.82.4" nullthrows "^1.1.1" source-map "^0.5.6" vlq "^1.0.0" -metro-transform-plugins@0.82.3: - version "0.82.3" - resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.82.3.tgz#41379fabc036c95229e948fbf68abc7f757adfa2" - integrity sha512-s1gVrkhczwMbxZLRSLCJ16K/4Sqx5IhO4sWlL6j0jlIEs1/Drn3JrkUUdQTtgmJS8SBpxmmB66cw7wnz751dVg== +metro-transform-plugins@0.82.4: + version "0.82.4" + resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.82.4.tgz#9d3bb855126e0a63ac2ccf012ed2bc7829209e8c" + integrity sha512-NoWQRPHupVpnDgYguiEcm7YwDhnqW02iWWQjO2O8NsNP09rEMSq99nPjARWfukN7+KDh6YjLvTIN20mj3dk9kw== dependencies: "@babel/core" "^7.25.2" "@babel/generator" "^7.25.0" @@ -5001,29 +5011,29 @@ metro-transform-plugins@0.82.3: flow-enums-runtime "^0.0.6" nullthrows "^1.1.1" -metro-transform-worker@0.82.3: - version "0.82.3" - resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.82.3.tgz#fadb4ff2694079dadd19e449dda4b8ff47545c78" - integrity sha512-z5Y7nYlSlLAEhjFi73uEJh69G5IC6HFZmXFcrxnY+JNlsjT2r0GgsDF4WaQGtarAIt5NP88V8983/PedwNfEcw== +metro-transform-worker@0.82.4: + version "0.82.4" + resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.82.4.tgz#cf7db4ef89301ab6658f7a0988fd030e28f86b28" + integrity sha512-kPI7Ad/tdAnI9PY4T+2H0cdgGeSWWdiPRKuytI806UcN4VhFL6OmYa19/4abYVYF+Cd2jo57CDuwbaxRfmXDhw== dependencies: "@babel/core" "^7.25.2" "@babel/generator" "^7.25.0" "@babel/parser" "^7.25.3" "@babel/types" "^7.25.2" flow-enums-runtime "^0.0.6" - metro "0.82.3" - metro-babel-transformer "0.82.3" - metro-cache "0.82.3" - metro-cache-key "0.82.3" - metro-minify-terser "0.82.3" - metro-source-map "0.82.3" - metro-transform-plugins "0.82.3" + metro "0.82.4" + metro-babel-transformer "0.82.4" + metro-cache "0.82.4" + metro-cache-key "0.82.4" + metro-minify-terser "0.82.4" + metro-source-map "0.82.4" + metro-transform-plugins "0.82.4" nullthrows "^1.1.1" -metro@0.82.3, metro@^0.82.0: - version "0.82.3" - resolved "https://registry.yarnpkg.com/metro/-/metro-0.82.3.tgz#d25137f05faceb32783b41bbe3698d4903e74792" - integrity sha512-EfSLtuUmfsGk3znJ+zoN8cRLniQo3W1wyA+nJMfpTLdENfbbPnGRTwmKhzRcJIUh9jgkrrF4oRQ5shLtQ2DsUw== +metro@0.82.4, metro@^0.82.0: + version "0.82.4" + resolved "https://registry.yarnpkg.com/metro/-/metro-0.82.4.tgz#e4fb4552f1387610b0b2873ed07d4cd59754d636" + integrity sha512-/gFmw3ux9CPG5WUmygY35hpyno28zi/7OUn6+OFfbweA8l0B+PPqXXLr0/T6cf5nclCcH0d22o+02fICaShVxw== dependencies: "@babel/code-frame" "^7.24.7" "@babel/core" "^7.25.2" @@ -5046,18 +5056,18 @@ metro@0.82.3, metro@^0.82.0: jest-worker "^29.7.0" jsc-safe-url "^0.2.2" lodash.throttle "^4.1.1" - metro-babel-transformer "0.82.3" - metro-cache "0.82.3" - metro-cache-key "0.82.3" - metro-config "0.82.3" - metro-core "0.82.3" - metro-file-map "0.82.3" - metro-resolver "0.82.3" - metro-runtime "0.82.3" - metro-source-map "0.82.3" - metro-symbolicate "0.82.3" - metro-transform-plugins "0.82.3" - metro-transform-worker "0.82.3" + metro-babel-transformer "0.82.4" + metro-cache "0.82.4" + metro-cache-key "0.82.4" + metro-config "0.82.4" + metro-core "0.82.4" + metro-file-map "0.82.4" + metro-resolver "0.82.4" + metro-runtime "0.82.4" + metro-source-map "0.82.4" + metro-symbolicate "0.82.4" + metro-transform-plugins "0.82.4" + metro-transform-worker "0.82.4" mime-types "^2.1.27" nullthrows "^1.1.1" serialize-error "^2.1.0" @@ -5217,7 +5227,7 @@ mz@^2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nanoid@^3.3.7, nanoid@^3.3.8: +nanoid@^3.3.11, nanoid@^3.3.7: version "3.3.11" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== @@ -5324,10 +5334,10 @@ nullthrows@^1.1.1: resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== -ob1@0.82.3: - version "0.82.3" - resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.82.3.tgz#89ed7314eaaf1578f128cd56adc7d5653bb4792a" - integrity sha512-8/SeymYlPMVODpCATHqm+X8eiuvD1GsKVa11n688V4GGgjrM3CRvrbtrYBs4t89LJDkv5CwGYPdqayuY0DmTTA== +ob1@0.82.4: + version "0.82.4" + resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.82.4.tgz#60f04f61b8ab96e1f818eb856b35c97bbef44726" + integrity sha512-n9S8e4l5TvkrequEAMDidl4yXesruWTNTzVkeaHSGywoTOIwTzZzKw7Z670H3eaXDZui5MJXjWGNzYowVZIxCA== dependencies: flow-enums-runtime "^0.0.6" @@ -5902,11 +5912,11 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== postcss@^8.3.5, postcss@^8.4.33: - version "8.5.3" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb" - integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A== + version "8.5.4" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.4.tgz#d61014ac00e11d5f58458ed7247d899bd65f99c0" + integrity sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w== dependencies: - nanoid "^3.3.8" + nanoid "^3.3.11" picocolors "^1.1.1" source-map-js "^1.2.1" @@ -6102,19 +6112,19 @@ react-native-is-edge-to-edge@^1.1.6: resolved "https://registry.yarnpkg.com/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.1.7.tgz#28947688f9fafd584e73a4f935ea9603bd9b1939" integrity sha512-EH6i7E8epJGIcu7KpfXYXiV2JFIYITtq+rVS8uEb+92naMRBdxhTuS8Wn2Q7j9sqyO0B+Xbaaf9VdipIAmGW4w== -react-native-paper@^5.14.0: - version "5.14.0" - resolved "https://registry.yarnpkg.com/react-native-paper/-/react-native-paper-5.14.0.tgz#d9828d9694b8ae01c985d49081e59857ef95e120" - integrity sha512-lKqIerPMBHuFYVeKqQV6uyMQ3HPEQps3a1TUv3QqkuNQeCSUzoKDmOMFR7gW8E7a7ay6px166ngYO1Sgy9HsVg== +react-native-paper@^5.14.5: + version "5.14.5" + resolved "https://registry.yarnpkg.com/react-native-paper/-/react-native-paper-5.14.5.tgz#7995a2f8171c8355c1cb55c81a6d2074a7dd5abb" + integrity sha512-eaIH5bUQjJ/mYm4AkI6caaiyc7BcHDwX6CqNDi6RIxfxfWxROsHpll1oBuwn/cFvknvA8uEAkqLk/vzVihI3AQ== dependencies: "@callstack/react-theme-provider" "^3.0.9" color "^3.1.2" use-latest-callback "^0.2.3" -react-native-safe-area-context@^5.4.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-5.4.0.tgz#04b51940408c114f75628a12a93569d30c525454" - integrity sha512-JaEThVyJcLhA+vU0NU8bZ0a1ih6GiF4faZ+ArZLqpYbL6j7R3caRqj+mE3lEtKCuHgwjLg3bCxLL1GPUJZVqUA== +react-native-safe-area-context@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-5.4.1.tgz#6d04eac20f99622fa13895fa7ae96199f1ecf800" + integrity sha512-x+g3NblZ9jof8y+XkVvaGlpMrSlixhrJJ33BRzhTAKUKctQVecO1heSXmzxc5UdjvGYBKS6kPZVUw2b8NxHcPg== react-native-web@~0.20.0: version "0.20.0" @@ -6130,19 +6140,19 @@ react-native-web@~0.20.0: postcss-value-parser "^4.2.0" styleq "^0.1.3" -react-native@0.79.2: - version "0.79.2" - resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.79.2.tgz#f1a53099701c1736d09e441eb79f97cfc90dd202" - integrity sha512-AnGzb56JvU5YCL7cAwg10+ewDquzvmgrMddiBM0GAWLwQM/6DJfGd2ZKrMuKKehHerpDDZgG+EY64gk3x3dEkw== +react-native@0.79.3: + version "0.79.3" + resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.79.3.tgz#16580ca202016c75e3c61116fcfe3b30f6d762fc" + integrity sha512-EzH1+9gzdyEo9zdP6u7Sh3Jtf5EOMwzy+TK65JysdlgAzfEVfq4mNeXcAZ6SmD+CW6M7ARJbvXLyTD0l2S5rpg== dependencies: "@jest/create-cache-key-function" "^29.7.0" - "@react-native/assets-registry" "0.79.2" - "@react-native/codegen" "0.79.2" - "@react-native/community-cli-plugin" "0.79.2" - "@react-native/gradle-plugin" "0.79.2" - "@react-native/js-polyfills" "0.79.2" - "@react-native/normalize-colors" "0.79.2" - "@react-native/virtualized-lists" "0.79.2" + "@react-native/assets-registry" "0.79.3" + "@react-native/codegen" "0.79.3" + "@react-native/community-cli-plugin" "0.79.3" + "@react-native/gradle-plugin" "0.79.3" + "@react-native/js-polyfills" "0.79.3" + "@react-native/normalize-colors" "0.79.3" + "@react-native/virtualized-lists" "0.79.3" abort-controller "^3.0.0" anser "^1.4.9" ansi-regex "^5.0.0" @@ -6468,9 +6478,9 @@ semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.1.3, semver@^7.3.5, semver@^7.5.4, semver@^7.6.0: - version "7.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" - integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== + version "7.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" + integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== semver@~7.5.4: version "7.5.4" @@ -6600,9 +6610,9 @@ shebang-regex@^3.0.0: integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shell-quote@^1.6.1, shell-quote@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.2.tgz#d2d83e057959d53ec261311e9e9b8f51dcb2934a" - integrity sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA== + version "1.8.3" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.3.tgz#55e40ef33cf5c689902353a3d8cd1a6725f08b4b" + integrity sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw== side-channel-list@^1.0.0: version "1.0.0" @@ -6974,9 +6984,9 @@ svgo@^2.7.0: stable "^0.1.8" tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + version "2.2.2" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.2.tgz#ab4984340d30cb9989a490032f086dbb8b56d872" + integrity sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg== tar@^7.4.3: version "7.4.3" @@ -7029,12 +7039,12 @@ terser-webpack-plugin@^5.3.0, terser-webpack-plugin@^5.3.11: terser "^5.31.1" terser@^5.10.0, terser@^5.15.0, terser@^5.31.1: - version "5.39.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.39.0.tgz#0e82033ed57b3ddf1f96708d123cca717d86ca3a" - integrity sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw== + version "5.41.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.41.0.tgz#11646bba11eff72d506fbafbd0086f57173141e1" + integrity sha512-H406eLPXpZbAX14+B8psIuvIr8+3c+2hkuYzpMkoE0ij+NdsVATbA78vb8neA/eqrj7rywa2pIkdmWRsXW6wmw== dependencies: "@jridgewell/source-map" "^0.3.3" - acorn "^8.8.2" + acorn "^8.14.0" commander "^2.20.0" source-map-support "~0.5.20" @@ -7142,9 +7152,9 @@ undici-types@~6.21.0: integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== undici@^6.18.2: - version "6.21.2" - resolved "https://registry.yarnpkg.com/undici/-/undici-6.21.2.tgz#49c5884e8f9039c65a89ee9018ef3c8e2f1f4928" - integrity sha512-uROZWze0R0itiAKVPsYhFov9LxrPMHLMEQFszeI2gCN6bnIIZ8twzBCJcN2LJrBBLfrP0t1FW0g+JmKVl8Vk1g== + version "6.21.3" + resolved "https://registry.yarnpkg.com/undici/-/undici-6.21.3.tgz#185752ad92c3d0efe7a7d1f6854a50f83b552d7a" + integrity sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw== unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.1" @@ -7274,9 +7284,9 @@ walker@^1.0.7, walker@^1.0.8: makeerror "1.0.12" watchpack@^2.4.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.2.tgz#2feeaed67412e7c33184e5a79ca738fbd38564da" - integrity sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw== + version "2.4.4" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.4.tgz#473bda72f0850453da6425081ea46fc0d7602947" + integrity sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" @@ -7369,14 +7379,14 @@ webpack-sources@^2.2.0: source-map "^0.6.1" webpack-sources@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" - integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + version "3.3.2" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.3.2.tgz#0ab55ab0b380ce53c45ca40cb7b33bab3149ea85" + integrity sha512-ykKKus8lqlgXX/1WjudpIEjqsafjOTcOJqxnAbMLAu/KCsDCJ6GBtvscewvTkrn24HsnvFwrSCbenFrhtcCsAA== webpack@^5.64.4: - version "5.99.8" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.99.8.tgz#dd31a020b7c092d30c4c6d9a4edb95809e7f5946" - integrity sha512-lQ3CPiSTpfOnrEGeXDwoq5hIGzSjmwD72GdfVzF7CQAI7t47rJG9eDWvcEkEn3CUQymAElVvDg3YNTlCYj+qUQ== + version "5.99.9" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.99.9.tgz#d7de799ec17d0cce3c83b70744b4aedb537d8247" + integrity sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg== dependencies: "@types/eslint-scope" "^3.7.7" "@types/estree" "^1.0.6" diff --git a/package.json b/package.json index 55518c58..ce2dc34a 100644 --- a/package.json +++ b/package.json @@ -164,7 +164,8 @@ [ "typescript", { - "project": "tsconfig.build.json" + "project": "tsconfig.build.json", + "tsc": "./node_modules/.bin/tsc" } ] ] diff --git a/src/Date/Calendar.tsx b/src/Date/Calendar.tsx index 4a3d6a00..d333c762 100644 --- a/src/Date/Calendar.tsx +++ b/src/Date/Calendar.tsx @@ -16,6 +16,7 @@ import Color from 'color' import { useTheme } from 'react-native-paper' import { darkenBy, lightenBy, useLatest } from '../shared/utils' import { sharedStyles } from '../shared/styles' +import { defaultStartYear, defaultEndYear } from './dateUtils' export type ModeType = 'single' | 'range' | 'multiple' @@ -174,10 +175,12 @@ function Calendar( return ( ( )} renderHeader={({ onPrev, onNext }) => ( @@ -216,8 +221,8 @@ function Calendar( selectedYear={selectedYear} selectingYear={selectingYear} onPressYear={onPressYear} - startYear={startYear || 1800} - endYear={endYear || 2200} + startYear={startYear || defaultStartYear} + endYear={endYear || defaultEndYear} /> ) : null} diff --git a/src/Date/DatePickerInput.tsx b/src/Date/DatePickerInput.tsx index 179c56e5..1a781144 100644 --- a/src/Date/DatePickerInput.tsx +++ b/src/Date/DatePickerInput.tsx @@ -5,6 +5,7 @@ import type { DatePickerInputProps } from './DatePickerInput.shared' import DatePickerInputWithoutModal from './DatePickerInputWithoutModal' import { Platform, StyleProp, ViewStyle } from 'react-native' import { forwardRef, useCallback, useState } from 'react' +import { defaultStartYear, defaultEndYear } from './dateUtils' function DatePickerInput( { @@ -78,8 +79,8 @@ function DatePickerInput( saveLabel={saveLabel} saveLabelDisabled={saveLabelDisabled ?? false} uppercase={uppercase} - startYear={startYear ?? 1800} - endYear={endYear ?? 2200} + startYear={startYear ?? defaultStartYear} + endYear={endYear ?? defaultEndYear} inputEnabled={inputEnabled} disableStatusBarPadding={disableStatusBarPadding ?? false} animationType={animationType} diff --git a/src/Date/Month.tsx b/src/Date/Month.tsx index 968c0654..1724d7b3 100644 --- a/src/Date/Month.tsx +++ b/src/Date/Month.tsx @@ -11,18 +11,18 @@ import Day, { EmptyDay } from './Day' import { addMonths, areDatesOnSameDay, - beginOffset, daySize, - DisableWeekDaysType, estimatedMonthHeight, - getDaysInMonth, getFirstDayOfMonth, getGridCount, getRealIndex, - gridCounts, + getStartAtIndex, + getTotalMonths, + createGridCounts, + DisableWeekDaysType, + getDaysInMonth, isDateBetween, showWeekDay, - startAtIndex, useRangeChecker, } from './dateUtils' import { getCalendarHeaderHeight } from './CalendarHeader' @@ -51,6 +51,8 @@ interface BaseMonthProps { roundness: number validRange?: ValidRangeType startWeekOnMonday: boolean + startYear?: number + endYear?: number // some of these should be required in final implementation startDate?: CalendarDate endDate?: CalendarDate @@ -76,29 +78,31 @@ interface MonthMultiProps extends BaseMonthProps { function Month(props: MonthSingleProps | MonthRangeProps | MonthMultiProps) { const { - index, + locale, mode, - date, - dates, - startDate, - endDate, + index, onPressYear, selectingYear, onPressDate, - scrollMode, primaryColor, selectColor, roundness, - disableWeekDays, - locale, validRange, + disableWeekDays, + scrollMode, + startDate, + endDate, + date, + dates, startWeekOnMonday, + startYear, + endYear, } = props const isHorizontal = scrollMode === 'horizontal' const theme = useTheme() const textColorOnPrimary = useTextColorOnPrimary() - const realIndex = getRealIndex(index) + const realIndex = getRealIndex(index, startYear, endYear) const { isDisabled, isWithinValidRange } = useRangeChecker(validRange) const { monthName, month, year } = useMemo(() => { @@ -118,129 +122,131 @@ function Month(props: MonthSingleProps | MonthRangeProps | MonthMultiProps) { const dayOfWeek = getFirstDayOfMonth({ year, month, startWeekOnMonday }) const emptyDays = dayOfWeek - return monthGrid(index, startWeekOnMonday).map(({ days, weekGrid }) => { - return { - weekIndex: weekGrid, - generatedDays: days.map((_, dayIndex) => { - const isFirstWeek = weekGrid === 0 - const realDayIndex = emptyDays - dayIndex - const beforeWeekDay = isFirstWeek && realDayIndex > 0 - const dayOfMonth = weekGrid * 7 + dayIndex - emptyDays + 1 - const afterWeekDay = dayOfMonth > daysInMonth - - const day = new Date(year, month, dayOfMonth) - const isToday = areDatesOnSameDay(day, today) - - let inRange = false - let disabled = isDisabled(day) - let selected = false - - let leftCrop = dayOfMonth === 1 - let rightCrop = dayOfMonth === daysInMonth - - const isFirstDayOfMonth = dayOfMonth === 1 - const isLastDayOfMonth = dayOfMonth === daysInMonth - - if (mode === 'range') { - const selectedStartDay = areDatesOnSameDay(day, startDate) - const selectedEndDay = areDatesOnSameDay(day, endDate) - selected = selectedStartDay || selectedEndDay - inRange = isDateBetween(day, { - startDate, - endDate, - }) - if (selectedStartDay) { - leftCrop = true - } - if (selectedEndDay) { - rightCrop = true - } - if (dayIndex === 0 && !selectedStartDay) { - leftCrop = false - } - - if (dayIndex === 6 && !selectedEndDay) { - rightCrop = false - } - - if ( - (isFirstDayOfMonth && selectedEndDay) || - (isLastDayOfMonth && selectedStartDay) - ) { - inRange = false - } - } else if (mode === 'multiple') { - const safeDates = dates || [] - selected = safeDates.some((d) => areDatesOnSameDay(day, d)) - - const yesterday = new Date(year, month, dayOfMonth - 1) - const tomorrow = new Date(year, month, dayOfMonth + 1) - - const yesterdaySelected = safeDates.some((d) => - areDatesOnSameDay(d, yesterday) - ) - const tomorrowSelected = safeDates.some((d) => - areDatesOnSameDay(d, tomorrow) - ) - - if (selected) { - if (tomorrowSelected && yesterdaySelected) { - inRange = true - } - if (tomorrowSelected && !yesterdaySelected) { - inRange = true + return monthGrid(index, startWeekOnMonday, startYear, endYear).map( + ({ days, weekGrid }) => { + return { + weekIndex: weekGrid, + generatedDays: days.map((_, dayIndex) => { + const isFirstWeek = weekGrid === 0 + const realDayIndex = emptyDays - dayIndex + const beforeWeekDay = isFirstWeek && realDayIndex > 0 + const dayOfMonth = weekGrid * 7 + dayIndex - emptyDays + 1 + const afterWeekDay = dayOfMonth > daysInMonth + + const day = new Date(year, month, dayOfMonth) + const isToday = areDatesOnSameDay(day, today) + + let inRange = false + let disabled = isDisabled(day) + let selected = false + + let leftCrop = dayOfMonth === 1 + let rightCrop = dayOfMonth === daysInMonth + + const isFirstDayOfMonth = dayOfMonth === 1 + const isLastDayOfMonth = dayOfMonth === daysInMonth + + if (mode === 'range') { + const selectedStartDay = areDatesOnSameDay(day, startDate) + const selectedEndDay = areDatesOnSameDay(day, endDate) + selected = selectedStartDay || selectedEndDay + inRange = isDateBetween(day, { + startDate, + endDate, + }) + if (selectedStartDay) { leftCrop = true } - - if (yesterdaySelected && !tomorrowSelected) { - inRange = true + if (selectedEndDay) { rightCrop = true } + if (dayIndex === 0 && !selectedStartDay) { + leftCrop = false + } - if (isFirstDayOfMonth && !tomorrowSelected) { - inRange = false + if (dayIndex === 6 && !selectedEndDay) { + rightCrop = false } - if (isLastDayOfMonth && !yesterdaySelected) { + if ( + (isFirstDayOfMonth && selectedEndDay) || + (isLastDayOfMonth && selectedStartDay) + ) { inRange = false } + } else if (mode === 'multiple') { + const safeDates = dates || [] + selected = safeDates.some((d) => areDatesOnSameDay(day, d)) + + const yesterday = new Date(year, month, dayOfMonth - 1) + const tomorrow = new Date(year, month, dayOfMonth + 1) + + const yesterdaySelected = safeDates.some((d) => + areDatesOnSameDay(d, yesterday) + ) + const tomorrowSelected = safeDates.some((d) => + areDatesOnSameDay(d, tomorrow) + ) - if (inRange && !leftCrop && !rightCrop) { - selected = false + if (selected) { + if (tomorrowSelected && yesterdaySelected) { + inRange = true + } + if (tomorrowSelected && !yesterdaySelected) { + inRange = true + leftCrop = true + } + + if (yesterdaySelected && !tomorrowSelected) { + inRange = true + rightCrop = true + } + + if (isFirstDayOfMonth && !tomorrowSelected) { + inRange = false + } + + if (isLastDayOfMonth && !yesterdaySelected) { + inRange = false + } + + if (inRange && !leftCrop && !rightCrop) { + selected = false + } } + } else if (mode === 'single') { + selected = areDatesOnSameDay(day, date) + } + + const isWithinOptionalValidRange = isWithinValidRange(day) + + if (inRange && !disabled) { + disabled = false } - } else if (mode === 'single') { - selected = areDatesOnSameDay(day, date) - } - - const isWithinOptionalValidRange = isWithinValidRange(day) - - if (inRange && !disabled) { - disabled = false - } - - if (!isWithinOptionalValidRange) { - disabled = true - } - - return { - beforeWeekDay, - afterWeekDay, - year, - month, - dayOfMonth, - dayIndex, - mode, - selected, - inRange, - leftCrop, - rightCrop, - isToday, - disabled, - } - }), + + if (!isWithinOptionalValidRange) { + disabled = true + } + + return { + beforeWeekDay, + afterWeekDay, + year, + month, + dayOfMonth, + dayIndex, + mode, + selected, + inRange, + leftCrop, + rightCrop, + isToday, + disabled, + } + }), + } } - }) + ) }, [ year, month, @@ -253,6 +259,8 @@ function Month(props: MonthSingleProps | MonthRangeProps | MonthMultiProps) { dates, date, startWeekOnMonday, + startYear, + endYear, ]) let textFont = theme?.isV3 @@ -269,7 +277,15 @@ function Month(props: MonthSingleProps | MonthRangeProps | MonthMultiProps) { return ( { - return Array(getGridCount(index, startWeekOnMonday)) +const monthGrid = ( + index: number, + startWeekOnMonday: boolean, + startYear?: number, + endYear?: number +) => { + return Array(getGridCount(index, startWeekOnMonday, startYear, endYear)) .fill(null) .map((_, weekGrid) => { const days = Array(7).fill(null) @@ -407,28 +428,45 @@ const monthGrid = (index: number, startWeekOnMonday: boolean) => { }) } -function getIndexCount(index: number): number { - if (index > startAtIndex) { - return index - startAtIndex +function getIndexCount( + index: number, + startYear?: number, + endYear?: number +): number { + const dynamicStartAtIndex = getStartAtIndex(startYear, endYear) + if (index > dynamicStartAtIndex) { + return index - dynamicStartAtIndex } - return -(startAtIndex - index) + return -(dynamicStartAtIndex - index) } -function weeksOffset(index: number, startWeekOnMonday: boolean): number { - if (index === startAtIndex) { +function weeksOffset( + index: number, + startWeekOnMonday: boolean, + startYear?: number, + endYear?: number +): number { + const dynamicStartAtIndex = getStartAtIndex(startYear, endYear) + const dynamicGridCounts = createGridCounts(getTotalMonths(startYear, endYear)) + + if (index === dynamicStartAtIndex) { return 0 } let off = 0 - if (index > startAtIndex) { - for (let i = 0; i < index - startAtIndex; i++) { - const cIndex = startAtIndex + i - off += gridCounts[cIndex] || getGridCount(cIndex, startWeekOnMonday) + if (index > dynamicStartAtIndex) { + for (let i = 0; i < index - dynamicStartAtIndex; i++) { + const cIndex = dynamicStartAtIndex + i + off += + dynamicGridCounts[cIndex] || + getGridCount(cIndex, startWeekOnMonday, startYear, endYear) } } else { - for (let i = 0; i < startAtIndex - index; i++) { - const cIndex = startAtIndex - i - 1 - off -= gridCounts[cIndex] || getGridCount(cIndex, startWeekOnMonday) + for (let i = 0; i < dynamicStartAtIndex - index; i++) { + const cIndex = dynamicStartAtIndex - i - 1 + off -= + dynamicGridCounts[cIndex] || + getGridCount(cIndex, startWeekOnMonday, startYear, endYear) } } return off @@ -436,19 +474,33 @@ function weeksOffset(index: number, startWeekOnMonday: boolean): number { export function getIndexFromHorizontalOffset( offset: number, - width: number + width: number, + startYear?: number, + endYear?: number ): number { - return startAtIndex + Math.floor(offset / width) + const dynamicStartAtIndex = getStartAtIndex(startYear, endYear) + return dynamicStartAtIndex + Math.floor(offset / width) } export function getIndexFromVerticalOffset( offset: number, - startWeekOnMonday: boolean + startWeekOnMonday: boolean, + startYear?: number, + endYear?: number ): number { - let estimatedIndex = startAtIndex + Math.ceil(offset / estimatedMonthHeight) + const dynamicStartAtIndex = getStartAtIndex(startYear, endYear) + const dynamicBeginOffset = estimatedMonthHeight * dynamicStartAtIndex + let estimatedIndex = + dynamicStartAtIndex + Math.ceil(offset / estimatedMonthHeight) - const realOffset = getVerticalMonthsOffset(estimatedIndex, startWeekOnMonday) - const difference = (realOffset - beginOffset - offset) / estimatedMonthHeight + const realOffset = getVerticalMonthsOffset( + estimatedIndex, + startWeekOnMonday, + startYear, + endYear + ) + const difference = + (realOffset - dynamicBeginOffset - offset) / estimatedMonthHeight if (difference >= 1 || difference <= -1) { estimatedIndex -= Math.floor(difference) } @@ -464,23 +516,29 @@ export function getHorizontalMonthOffset(index: number, width: number) { export function getVerticalMonthsOffset( index: number, - startWeekOnMonday: boolean + startWeekOnMonday: boolean, + startYear?: number, + endYear?: number ) { - const count = getIndexCount(index) - const ob = weeksOffset(index, startWeekOnMonday) + const count = getIndexCount(index, startYear, endYear) + const ob = weeksOffset(index, startWeekOnMonday, startYear, endYear) const monthsHeight = weekSize * ob const c = monthsHeight + count * (dayNamesHeight + montHeaderHeight) + const dynamicBeginOffset = + estimatedMonthHeight * getStartAtIndex(startYear, endYear) - return (c || 0) + beginOffset + return (c || 0) + dynamicBeginOffset } export function getMonthHeight( scrollMode: 'horizontal' | 'vertical', index: number, - startWeekOnMonday: boolean + startWeekOnMonday: boolean, + startYear?: number, + endYear?: number ): number { const calendarHeight = getCalendarHeaderHeight(scrollMode) - const gc = getGridCount(index, startWeekOnMonday) + const gc = getGridCount(index, startWeekOnMonday, startYear, endYear) const currentMonthHeight = weekSize * gc const extraHeight = diff --git a/src/Date/Swiper.native.tsx b/src/Date/Swiper.native.tsx index a5bd7c99..2fa6f699 100644 --- a/src/Date/Swiper.native.tsx +++ b/src/Date/Swiper.native.tsx @@ -13,8 +13,12 @@ import { montHeaderHeight, } from './Month' -import { SwiperProps, useYearChange } from './SwiperUtils' -import { beginOffset, estimatedMonthHeight, totalMonths } from './dateUtils' +import { SwiperProps, useYearChange, isIndexWithinRange } from './SwiperUtils' +import { + estimatedMonthHeight, + getTotalMonths, + getBeginOffset, +} from './dateUtils' import AutoSizer from './AutoSizer' import { memo, useCallback, useRef, useState } from 'react' import { sharedStyles } from '../shared/styles' @@ -49,6 +53,8 @@ function SwiperInner({ width, height, startWeekOnMonday, + startYear, + endYear, }: SwiperProps & { width: number; height: number }) { const idx = useRef(initialIndex) const isHorizontal = scrollMode === 'horizontal' @@ -60,6 +66,10 @@ function SwiperInner({ const scrollTo = useCallback( (index: number, animated: boolean) => { + if (!isIndexWithinRange(index, startYear, endYear)) { + return + } + idx.current = index setVisibleIndexes(getVisibleArray(index, { isHorizontal, height })) @@ -68,7 +78,12 @@ function SwiperInner({ } const offset = isHorizontal ? getHorizontalMonthOffset(index, width) - : getVerticalMonthsOffset(index, startWeekOnMonday) - montHeaderHeight + : getVerticalMonthsOffset( + index, + startWeekOnMonday, + startYear, + endYear + ) - montHeaderHeight if (isHorizontal) { parentRef.current.scrollTo({ @@ -84,16 +99,30 @@ function SwiperInner({ }) } }, - [parentRef, isHorizontal, width, height, startWeekOnMonday] + [ + parentRef, + isHorizontal, + width, + height, + startWeekOnMonday, + startYear, + endYear, + ] ) const onPrev = useCallback(() => { - scrollTo(idx.current - 1, true) - }, [scrollTo, idx]) + const newIndex = idx.current - 1 + if (isIndexWithinRange(newIndex, startYear, endYear)) { + scrollTo(newIndex, true) + } + }, [scrollTo, idx, startYear, endYear]) const onNext = useCallback(() => { - scrollTo(idx.current + 1, true) - }, [scrollTo, idx]) + const newIndex = idx.current + 1 + if (isIndexWithinRange(newIndex, startYear, endYear)) { + scrollTo(newIndex, true) + } + }, [scrollTo, idx, startYear, endYear]) const scrollToInitial = useCallback(() => { scrollTo(idx.current, false) @@ -103,23 +132,30 @@ function SwiperInner({ (e: NativeSyntheticEvent) => { const contentOffset = e.nativeEvent.contentOffset const viewSize = e.nativeEvent.layoutMeasurement + const dynamicBeginOffset = getBeginOffset(startYear, endYear) const newIndex = isHorizontal ? Math.round(contentOffset.x / viewSize.width) : getIndexFromVerticalOffset( - contentOffset.y - beginOffset, - startWeekOnMonday + contentOffset.y - dynamicBeginOffset, + startWeekOnMonday, + startYear, + endYear ) if (newIndex === 0) { return } + if (!isIndexWithinRange(newIndex, startYear, endYear)) { + return + } + if (idx.current !== newIndex) { idx.current = newIndex setVisibleIndexes(getVisibleArray(newIndex, { isHorizontal, height })) } }, - [idx, height, isHorizontal, startWeekOnMonday] + [idx, height, isHorizontal, startWeekOnMonday, startYear, endYear] ) const renderProps = { @@ -130,13 +166,15 @@ function SwiperInner({ useYearChange( (newIndex) => { - if (newIndex) { + if (newIndex && isIndexWithinRange(newIndex, startYear, endYear)) { scrollTo(newIndex, false) } }, { selectedYear, currentIndexRef: idx, + startYear, + endYear, } ) @@ -162,8 +200,10 @@ function SwiperInner({ { height: isHorizontal ? height - : estimatedMonthHeight * totalMonths, - width: isHorizontal ? width * totalMonths : width, + : estimatedMonthHeight * getTotalMonths(startYear, endYear), + width: isHorizontal + ? width * getTotalMonths(startYear, endYear) + : width, }, ]} > @@ -177,7 +217,9 @@ function SwiperInner({ ? 0 : getVerticalMonthsOffset( visibleIndexes[vi], - startWeekOnMonday + startWeekOnMonday, + startYear, + endYear ), left: isHorizontal ? getHorizontalMonthOffset(visibleIndexes[vi], width) @@ -191,7 +233,9 @@ function SwiperInner({ : getMonthHeight( scrollMode, visibleIndexes[vi], - startWeekOnMonday + startWeekOnMonday, + startYear, + endYear ), }} > diff --git a/src/Date/Swiper.tsx b/src/Date/Swiper.tsx index f2677c0d..4f77f964 100644 --- a/src/Date/Swiper.tsx +++ b/src/Date/Swiper.tsx @@ -7,7 +7,14 @@ import { } from './Month' import { beginOffset, estimatedMonthHeight, totalMonths } from './dateUtils' import { useLatest } from '../shared/utils' -import { RenderProps, SwiperProps, useYearChange } from './SwiperUtils' +import { + RenderProps, + SwiperProps, + useYearChange, + isIndexWithinRange, + getMinIndex, + getMaxIndex, +} from './SwiperUtils' import AutoSizer from './AutoSizer' import { memo, @@ -31,18 +38,34 @@ function Swiper({ selectedYear, initialIndex, startWeekOnMonday, + startYear, + endYear, }: SwiperProps) { const isHorizontal = scrollMode === 'horizontal' const [index, setIndex] = useState(initialIndex) const onPrev = useCallback(() => { - setIndex((prev) => prev - 1) - }, [setIndex]) + setIndex((prev) => { + const newIndex = prev - 1 + // Check if the new index is within allowed range + if (isIndexWithinRange(newIndex, startYear, endYear)) { + return newIndex + } + return prev // Don't change if outside range + }) + }, [setIndex, startYear, endYear]) const onNext = useCallback(() => { - setIndex((prev) => prev + 1) - }, [setIndex]) + setIndex((prev) => { + const newIndex = prev + 1 + // Check if the new index is within allowed range + if (isIndexWithinRange(newIndex, startYear, endYear)) { + return newIndex + } + return prev // Don't change if outside range + }) + }, [setIndex, startYear, endYear]) const renderProps = { index, @@ -52,13 +75,15 @@ function Swiper({ const indexRef = useLatest(index) useYearChange( (newIndex) => { - if (newIndex) { + if (newIndex && isIndexWithinRange(newIndex, startYear, endYear)) { setIndex(newIndex) } }, { selectedYear, currentIndexRef: indexRef, + startYear, + endYear, } ) @@ -79,6 +104,8 @@ function Swiper({ estimatedHeight={estimatedMonthHeight} renderItem={renderItem} startWeekOnMonday={startWeekOnMonday} + startYear={startYear} + endYear={endYear} /> )} @@ -97,6 +124,8 @@ function VerticalScroller({ estimatedHeight, renderItem, startWeekOnMonday, + startYear, + endYear, }: { renderItem: (renderProps: RenderProps) => any width: number @@ -104,12 +133,26 @@ function VerticalScroller({ initialIndex: number estimatedHeight: number startWeekOnMonday: boolean + startYear?: number + endYear?: number }) { + // Ensure initial index is within allowed range + const constrainedInitialIndex = isIndexWithinRange( + initialIndex, + startYear, + endYear + ) + ? initialIndex + : Math.max( + Math.min(initialIndex, getMaxIndex(endYear)), + getMinIndex(startYear) + ) + const [visibleIndexes, setVisibleIndexes] = useState( - visibleArray(initialIndex) + visibleArray(constrainedInitialIndex) ) - const idx = useRef(initialIndex) + const idx = useRef(constrainedInitialIndex) const parentRef = useRef(null) useIsomorphicLayoutEffect(() => { @@ -137,12 +180,17 @@ function VerticalScroller({ const offset = top - beginOffset const index = getIndexFromVerticalOffset(offset, startWeekOnMonday) + // Check if the new index is within allowed range + if (!isIndexWithinRange(index, startYear, endYear)) { + return + } + if (idx.current !== index) { idx.current = index setVisibleIndexesThrottled(visibleArray(index)) } }, - [setVisibleIndexesThrottled, startWeekOnMonday] + [setVisibleIndexesThrottled, startWeekOnMonday, startYear, endYear] ) return ( diff --git a/src/Date/SwiperUtils.ts b/src/Date/SwiperUtils.ts index 0de050b3..cb111703 100644 --- a/src/Date/SwiperUtils.ts +++ b/src/Date/SwiperUtils.ts @@ -4,8 +4,10 @@ import { addMonths, differenceInMonths, getRealIndex, - startAtIndex, + getStartAtIndex, + getTotalMonths, } from './dateUtils' +import { defaultStartYear, defaultEndYear } from './dateUtils' export type RenderProps = { index: number @@ -21,6 +23,50 @@ export type SwiperProps = { renderFooter?: (renderProps: RenderProps) => any selectedYear: number | undefined startWeekOnMonday: boolean + startYear?: number + endYear?: number +} + +// Helper function to get the minimum allowed index based on startYear +export function getMinIndex(startYear?: number, endYear?: number): number { + if (!startYear) return 0 + + const today = new Date() + const startDate = new Date(startYear, 0, 1) // January 1st of startYear + const months = differenceInMonths(today, startDate) + const dynamicStartAtIndex = getStartAtIndex(startYear, endYear) + const minIndex = dynamicStartAtIndex + months + const totalMonths = getTotalMonths(startYear, endYear) + + // Allow any valid index within the dynamic range, no hard minimum + return Math.max(0, Math.min(minIndex, totalMonths - 1)) +} + +// Helper function to get the maximum allowed index based on endYear +export function getMaxIndex(startYear?: number, endYear?: number): number { + const dynamicStartAtIndex = getStartAtIndex(startYear, endYear) + const totalMonths = getTotalMonths(startYear, endYear) + + if (!endYear) return totalMonths - 1 + + const today = new Date() + const endDate = new Date(endYear, 11, 31) // December 31st of endYear + const months = differenceInMonths(today, endDate) + const maxIndex = dynamicStartAtIndex + months + + // Allow any valid index within the dynamic range + return Math.max(0, Math.min(maxIndex, totalMonths - 1)) +} + +// Helper function to check if an index is within allowed range +export function isIndexWithinRange( + index: number, + startYear?: number, + endYear?: number +): boolean { + const minIndex = getMinIndex(startYear || defaultStartYear, endYear) + const maxIndex = getMaxIndex(startYear, endYear || defaultEndYear) + return index >= minIndex && index <= maxIndex } export function useYearChange( @@ -28,25 +74,36 @@ export function useYearChange( { selectedYear, currentIndexRef, + startYear, + endYear, }: { currentIndexRef: MutableRefObject selectedYear: number | undefined + startYear?: number + endYear?: number } ) { const onChangeRef = useLatest(onChange) useEffect(() => { if (selectedYear) { const currentIndex = currentIndexRef.current || 0 - const currentDate = addMonths(new Date(), getRealIndex(currentIndex)) + const currentDate = addMonths( + new Date(), + getRealIndex(currentIndex, startYear, endYear) + ) currentDate.setFullYear(selectedYear) const today = new Date() const months = differenceInMonths(today, currentDate) + const dynamicStartAtIndex = getStartAtIndex(startYear, endYear) + const totalMonths = getTotalMonths(startYear, endYear) - const newIndex = startAtIndex + months - if (currentIndex !== newIndex) { - onChangeRef.current(newIndex) + const newIndex = dynamicStartAtIndex + months + // Ensure the new index is within valid bounds + const boundedIndex = Math.max(0, Math.min(newIndex, totalMonths - 1)) + if (currentIndex !== boundedIndex) { + onChangeRef.current(boundedIndex) } } - }, [currentIndexRef, onChangeRef, selectedYear]) + }, [currentIndexRef, onChangeRef, selectedYear, startYear, endYear]) } diff --git a/src/Date/YearPicker.tsx b/src/Date/YearPicker.tsx index da135671..ca8c87c3 100644 --- a/src/Date/YearPicker.tsx +++ b/src/Date/YearPicker.tsx @@ -3,6 +3,7 @@ import { MD2Theme, Text, TouchableRipple, useTheme } from 'react-native-paper' import { range } from '../shared/utils' import { memo, useEffect, useRef } from 'react' import { sharedStyles } from '../shared/styles' +import { defaultStartYear, defaultEndYear } from './dateUtils' const ITEM_HEIGHT = 62 @@ -23,8 +24,8 @@ export default function YearPicker({ const flatList = useRef | null>(null) const years = range( - isNaN(startYear) ? 1800 : startYear, - isNaN(endYear) ? 2200 : endYear + isNaN(startYear) ? defaultStartYear : startYear, + isNaN(endYear) ? defaultEndYear : endYear ) // scroll to selected year @@ -149,5 +150,4 @@ const styles = StyleSheet.create({ fontSize: 16, }, }) - const Year = memo(YearPure) diff --git a/src/Date/dateUtils.tsx b/src/Date/dateUtils.tsx index 53568894..32886927 100644 --- a/src/Date/dateUtils.tsx +++ b/src/Date/dateUtils.tsx @@ -170,19 +170,61 @@ export function isLeapYear({ year }: { year: number }) { export const daySize = 46 export const estimatedMonthHeight = 360 -export const startAtIndex = 1200 +export const defaultStartYear = 1800 +export const defaultEndYear = 2200 + +// Dynamic calculation functions to replace fixed constants +export function getStartAtIndex(startYear?: number, _endYear?: number): number { + const start = startYear || 1800 + const today = new Date() + const currentYear = today.getFullYear() + + // Calculate months from start year to current year + const monthsFromStart = (currentYear - start) * 12 + today.getMonth() + + // Ensure we have enough buffer for the range + return Math.max(monthsFromStart, 0) +} + +export function getTotalMonths(startYear?: number, endYear?: number): number { + const start = startYear || 1800 + const end = endYear || 2200 + return (end - start + 1) * 12 +} + +export function getBeginOffset(startYear?: number, endYear?: number): number { + return estimatedMonthHeight * getStartAtIndex(startYear, endYear) +} + +// Keep the old constants for backward compatibility but make them dynamic +export const startAtIndex = 2800 export const totalMonths = startAtIndex * 2 export const beginOffset = estimatedMonthHeight * startAtIndex + +// Create a dynamic grid counts array +export function createGridCounts(count: number): Array { + return new Array(count) +} + export const gridCounts = new Array(totalMonths) -export function getGridCount(index: number, startWeekOnMonday: boolean) { - const cHeight = gridCounts[index] +export function getGridCount( + index: number, + startWeekOnMonday: boolean, + startYear?: number, + endYear?: number +) { + const dynamicGridCounts = createGridCounts(getTotalMonths(startYear, endYear)) + const cHeight = dynamicGridCounts[index] if (cHeight) { return cHeight } - const monthDate = addMonths(new Date(), getRealIndex(index)) + const monthDate = addMonths( + new Date(), + getRealIndex(index, startYear, endYear) + ) const h = getGridCountForDate(monthDate, startWeekOnMonday) - gridCounts[index] = h + dynamicGridCounts[index] = h return h } @@ -194,19 +236,28 @@ export function getGridCountForDate(date: Date, startWeekOnMonday: boolean) { return Math.ceil((daysInMonth + dayOfWeek) / 7) } -export function getRealIndex(index: number) { - return index - startAtIndex +export function getRealIndex( + index: number, + startYear?: number, + endYear?: number +) { + return index - getStartAtIndex(startYear, endYear) } -export function getInitialIndex(date: Date | undefined) { +export function getInitialIndex( + date: Date | undefined, + startYear?: number, + endYear?: number +) { + const dynamicStartAtIndex = getStartAtIndex(startYear, endYear) if (!date) { - return startAtIndex + return dynamicStartAtIndex } const today = new Date() const months = differenceInMonths(today, date) - return startAtIndex + months + return dynamicStartAtIndex + months } export function useInputFormatter({ locale }: { locale: string | undefined }) { diff --git a/src/__tests__/Date/YearPicker.test.tsx b/src/__tests__/Date/YearPicker.test.tsx index e91e30c7..1158a922 100644 --- a/src/__tests__/Date/YearPicker.test.tsx +++ b/src/__tests__/Date/YearPicker.test.tsx @@ -1,15 +1,15 @@ import { render } from '@testing-library/react-native' import YearPicker from '../../Date/YearPicker' +import { defaultEndYear, defaultStartYear } from '../../Date/dateUtils' -it('renders YearPicker', () => { - const { toJSON } = render( +it('renders', () => { + render( null} - startYear={1800} - endYear={2200} + startYear={defaultStartYear} + endYear={defaultEndYear} /> ) - expect(toJSON()).toMatchSnapshot() }) diff --git a/src/__tests__/Date/__snapshots__/CalendarEdit.test.tsx.snap b/src/__tests__/Date/__snapshots__/CalendarEdit.test.tsx.snap index 6e7deb37..ef3df8c2 100644 --- a/src/__tests__/Date/__snapshots__/CalendarEdit.test.tsx.snap +++ b/src/__tests__/Date/__snapshots__/CalendarEdit.test.tsx.snap @@ -265,7 +265,7 @@ exports[`renders CalendarEdit 1`] = ` } testID="text-input-flat" underlineColorAndroid="transparent" - value="05/23/2025" + value="06/06/2025" withModal={false} /> diff --git a/src/__tests__/Date/__snapshots__/DatePickerInput.test.tsx.snap b/src/__tests__/Date/__snapshots__/DatePickerInput.test.tsx.snap index 647c1628..496dad89 100644 --- a/src/__tests__/Date/__snapshots__/DatePickerInput.test.tsx.snap +++ b/src/__tests__/Date/__snapshots__/DatePickerInput.test.tsx.snap @@ -258,7 +258,7 @@ exports[`renders DatePickerInput 1`] = ` } testID="text-input-flat" underlineColorAndroid="transparent" - value="05/23/2025" + value="06/06/2025" /> diff --git a/src/__tests__/Date/__snapshots__/YearPicker.test.tsx.snap b/src/__tests__/Date/__snapshots__/YearPicker.test.tsx.snap deleted file mode 100644 index c7bc8d92..00000000 --- a/src/__tests__/Date/__snapshots__/YearPicker.test.tsx.snap +++ /dev/null @@ -1,3788 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`renders YearPicker 1`] = ` - - - - - - - - - - 1800 - - - - - - - - - 1801 - - - - - - - - - 1802 - - - - - - - - - - - - - 1803 - - - - - - - - - 1804 - - - - - - - - - 1805 - - - - - - - - - - - - - 1806 - - - - - - - - - 1807 - - - - - - - - - 1808 - - - - - - - - - - - - - 1809 - - - - - - - - - 1810 - - - - - - - - - 1811 - - - - - - - - - - - - - 1812 - - - - - - - - - 1813 - - - - - - - - - 1814 - - - - - - - - - - - - - 1815 - - - - - - - - - 1816 - - - - - - - - - 1817 - - - - - - - - - - - - - 1818 - - - - - - - - - 1819 - - - - - - - - - 1820 - - - - - - - - - - - - - 1821 - - - - - - - - - 1822 - - - - - - - - - 1823 - - - - - - - - - - - - - 1824 - - - - - - - - - 1825 - - - - - - - - - 1826 - - - - - - - - - - - - - 1827 - - - - - - - - - 1828 - - - - - - - - - 1829 - - - - - - - - - - -`;