From 9bf1141b218a1805491591aa630ab1c7bca9f94a Mon Sep 17 00:00:00 2001 From: Chris Herman Date: Mon, 16 Sep 2024 15:35:43 -0400 Subject: [PATCH 01/15] feat(router): ENG-5727 add router implementation --- .../plugins/plugin-example/.eslintrc.js | 6 - .../plugins/plugin-example/__tests__/index.ts | 11 - .../plugins/plugin-example/tsconfig.json | 6 - .../plugin-monorepo/__tests__/index.ts | 36 + .../package.json | 7 +- .../src/index.ts | 46 +- .../yarn.lock | 728 +++++++++--------- apps/example/flagship-code.config.ts | 2 +- apps/example/index.js | 21 +- apps/example/metro.config.js | 5 +- apps/example/package.json | 25 +- apps/example/src/assets/index.ts | 8 + apps/example/src/assets/tabAccount.png | Bin 0 -> 377 bytes apps/example/src/assets/tabAccount@2x.png | Bin 0 -> 671 bytes apps/example/src/assets/tabAccount@3x.png | Bin 0 -> 928 bytes apps/example/src/assets/tabBag.png | Bin 0 -> 322 bytes apps/example/src/assets/tabBag@2x.png | Bin 0 -> 532 bytes apps/example/src/assets/tabBag@3x.png | Bin 0 -> 777 bytes apps/example/src/assets/tabHome.png | Bin 0 -> 265 bytes apps/example/src/assets/tabHome@2x.png | Bin 0 -> 448 bytes apps/example/src/assets/tabHome@3x.png | Bin 0 -> 591 bytes apps/example/src/assets/tabShop.png | Bin 0 -> 372 bytes apps/example/src/assets/tabShop@2x.png | Bin 0 -> 635 bytes apps/example/src/assets/tabShop@3x.png | Bin 0 -> 898 bytes .../src/components/HelloWorldModal.tsx | 46 ++ apps/example/src/index.tsx | 121 +++ apps/example/src/routes/account.settings.tsx | 20 + apps/example/src/routes/account.tsx | 20 + .../src/routes/cart.discount.$discount.ts | 7 + apps/example/src/routes/cart.tsx | 40 + apps/example/src/routes/home.tsx | 46 ++ apps/example/src/routes/shop.tsx | 40 + babel.config.json | 1 + packages/app-router/package.json | 6 +- packages/app-router/src/context.tsx | 49 ++ packages/app-router/src/hooks.tsx | 620 +++++++++++++++ packages/app-router/src/index.ts | 3 + packages/app-router/src/router.tsx | 325 ++++++++ packages/app-router/src/types.ts | 282 +++++++ packages/app-router/tsconfig.json | 2 +- yarn.lock | 65 +- 41 files changed, 2093 insertions(+), 501 deletions(-) delete mode 100644 apps/example/coderc/plugins/plugin-example/.eslintrc.js delete mode 100644 apps/example/coderc/plugins/plugin-example/__tests__/index.ts delete mode 100644 apps/example/coderc/plugins/plugin-example/tsconfig.json create mode 100644 apps/example/coderc/plugins/plugin-monorepo/__tests__/index.ts rename apps/example/coderc/plugins/{plugin-example => plugin-monorepo}/package.json (70%) rename apps/example/coderc/plugins/{plugin-example => plugin-monorepo}/src/index.ts (50%) rename apps/example/coderc/plugins/{plugin-example => plugin-monorepo}/yarn.lock (83%) create mode 100644 apps/example/src/assets/index.ts create mode 100644 apps/example/src/assets/tabAccount.png create mode 100644 apps/example/src/assets/tabAccount@2x.png create mode 100644 apps/example/src/assets/tabAccount@3x.png create mode 100644 apps/example/src/assets/tabBag.png create mode 100644 apps/example/src/assets/tabBag@2x.png create mode 100644 apps/example/src/assets/tabBag@3x.png create mode 100644 apps/example/src/assets/tabHome.png create mode 100644 apps/example/src/assets/tabHome@2x.png create mode 100644 apps/example/src/assets/tabHome@3x.png create mode 100644 apps/example/src/assets/tabShop.png create mode 100644 apps/example/src/assets/tabShop@2x.png create mode 100644 apps/example/src/assets/tabShop@3x.png create mode 100644 apps/example/src/components/HelloWorldModal.tsx create mode 100644 apps/example/src/index.tsx create mode 100644 apps/example/src/routes/account.settings.tsx create mode 100644 apps/example/src/routes/account.tsx create mode 100644 apps/example/src/routes/cart.discount.$discount.ts create mode 100644 apps/example/src/routes/cart.tsx create mode 100644 apps/example/src/routes/home.tsx create mode 100644 apps/example/src/routes/shop.tsx create mode 100644 babel.config.json create mode 100644 packages/app-router/src/context.tsx create mode 100644 packages/app-router/src/hooks.tsx create mode 100644 packages/app-router/src/router.tsx create mode 100644 packages/app-router/src/types.ts diff --git a/apps/example/coderc/plugins/plugin-example/.eslintrc.js b/apps/example/coderc/plugins/plugin-example/.eslintrc.js deleted file mode 100644 index 763b97ca35..0000000000 --- a/apps/example/coderc/plugins/plugin-example/.eslintrc.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - parserOptions: { - requireConfigFile: false, - }, - extends: ['../../../.eslintrc.js'], -}; diff --git a/apps/example/coderc/plugins/plugin-example/__tests__/index.ts b/apps/example/coderc/plugins/plugin-example/__tests__/index.ts deleted file mode 100644 index d782c83557..0000000000 --- a/apps/example/coderc/plugins/plugin-example/__tests__/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * @jest-environment-options {"requireTemplate": true} - */ - -/// - -describe('plugin-example', () => { - it('ios', async () => {}); - - it('android', async () => {}); -}); diff --git a/apps/example/coderc/plugins/plugin-example/tsconfig.json b/apps/example/coderc/plugins/plugin-example/tsconfig.json deleted file mode 100644 index d71c264e52..0000000000 --- a/apps/example/coderc/plugins/plugin-example/tsconfig.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "@repo/typescript-config/base.json", - "compilerOptions": { - "noEmit": true - } -} diff --git a/apps/example/coderc/plugins/plugin-monorepo/__tests__/index.ts b/apps/example/coderc/plugins/plugin-monorepo/__tests__/index.ts new file mode 100644 index 0000000000..ab9a601892 --- /dev/null +++ b/apps/example/coderc/plugins/plugin-monorepo/__tests__/index.ts @@ -0,0 +1,36 @@ +/** + * @jest-environment-options {"requireTemplate": true} + */ + +/// + +import {fs, path} from '@brandingbrand/code-cli-kit'; +import plugin from '../src'; + +describe('plugin', () => { + it('ios', async () => { + await plugin.ios?.({} as any, {} as any); + + const pbxProj = await fs.readFile(path.ios.projectPbxProj, 'utf-8'); + + expect(pbxProj).toContain( + '${REACT_NATIVE_PATH}/scripts/xcode/with-environment.sh', + ); + }); + + it('android', async () => { + await plugin.android?.({} as any, {} as any); + + const appBuildGradle = await fs.readFile( + path.android.appBuildGradle, + 'utf-8', + ); + const settingsGradle = await fs.readFile( + path.project.resolve('android', 'settings.gradle'), + 'utf-8', + ); + + expect(appBuildGradle).toContain('../../../node_modules'); + expect(settingsGradle).toContain('../../../node_modules'); + }); +}); diff --git a/apps/example/coderc/plugins/plugin-example/package.json b/apps/example/coderc/plugins/plugin-monorepo/package.json similarity index 70% rename from apps/example/coderc/plugins/plugin-example/package.json rename to apps/example/coderc/plugins/plugin-monorepo/package.json index 5f437f1f6f..ca826dffbb 100644 --- a/apps/example/coderc/plugins/plugin-example/package.json +++ b/apps/example/coderc/plugins/plugin-monorepo/package.json @@ -1,5 +1,5 @@ { - "name": "@brandingbrand/code-plugin-example", + "name": "plugin-monorepo", "version": "0.0.0", "license": "UNLICENSED", "private": true, @@ -13,8 +13,7 @@ }, "types": "src/index.ts", "devDependencies": { - "eslint": "^8.56.0", - "jest": "^29.2.1", - "typescript": "4.8.4" + "eslint": "^8.0.0", + "jest": "^29.0.0" } } diff --git a/apps/example/coderc/plugins/plugin-example/src/index.ts b/apps/example/coderc/plugins/plugin-monorepo/src/index.ts similarity index 50% rename from apps/example/coderc/plugins/plugin-example/src/index.ts rename to apps/example/coderc/plugins/plugin-monorepo/src/index.ts index 3256b8b1d6..7d9f0791a7 100644 --- a/apps/example/coderc/plugins/plugin-example/src/index.ts +++ b/apps/example/coderc/plugins/plugin-monorepo/src/index.ts @@ -3,7 +3,12 @@ * @module Plugin */ -import {definePlugin} from '@brandingbrand/code-cli-kit'; +import { + definePlugin, + path, + string, + withUTF8, +} from '@brandingbrand/code-cli-kit'; /** * Defines a plugin with functions for both iOS and Android platforms. @@ -18,7 +23,15 @@ export default definePlugin({ * @param {Object} _options - The options object for iOS. * @returns {Promise} A promise that resolves when the process completes. */ - ios: async function (_build: object, _options: object): Promise {}, + ios: async function (_build: object, _options: object): Promise { + await withUTF8(path.ios.projectPbxProj, content => { + return string.replace( + content, + /(..\/)+?node_modules\/react-native/gm, + '${REACT_NATIVE_PATH}', + ); + }); + }, /** * Function to be executed for Android platform. @@ -26,5 +39,32 @@ export default definePlugin({ * @param {Object} _options - The options object for Android. * @returns {Promise} A promise that resolves when the process completes. */ - android: async function (_build: object, _options: object): Promise {}, + android: async function (_build: object, _options: object): Promise { + await withUTF8( + path.project.resolve('android', 'settings.gradle'), + content => { + return string.replace( + content, + /(..\/)+?(node_modules)/gm, + '../../../$2', + ); + }, + ); + + await withUTF8(path.android.appBuildGradle, content => { + content = string.replace( + content, + /(react\s+{\n(\s+))/gm, + '$1reactNativeDir = file("../../../../node_modules/react-native")\n$2', + ); + + content = string.replace( + content, + /(..\/)+?(node_modules\/@react-native-community)/gm, + '../../../../$2', + ); + + return content; + }); + }, }); diff --git a/apps/example/coderc/plugins/plugin-example/yarn.lock b/apps/example/coderc/plugins/plugin-monorepo/yarn.lock similarity index 83% rename from apps/example/coderc/plugins/plugin-example/yarn.lock rename to apps/example/coderc/plugins/plugin-monorepo/yarn.lock index 9d9966ce98..b8a3e85767 100644 --- a/apps/example/coderc/plugins/plugin-example/yarn.lock +++ b/apps/example/coderc/plugins/plugin-monorepo/yarn.lock @@ -2,168 +2,139 @@ # yarn lockfile v1 -"@aashutoshrathi/word-wrap@^1.2.3": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" - integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== - "@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" - integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" + integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== dependencies: - "@babel/highlight" "^7.23.4" - chalk "^2.4.2" + "@babel/highlight" "^7.24.7" + picocolors "^1.0.0" -"@babel/compat-data@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" - integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== +"@babel/compat-data@^7.25.2": + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.4.tgz#7d2a80ce229890edcf4cc259d4d696cb4dae2fcb" + integrity sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ== -"@babel/core@^7.11.6", "@babel/core@^7.12.3": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.9.tgz#b028820718000f267870822fec434820e9b1e4d1" - integrity sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw== +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77" + integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.6" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.23.9" - "@babel/parser" "^7.23.9" - "@babel/template" "^7.23.9" - "@babel/traverse" "^7.23.9" - "@babel/types" "^7.23.9" + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.25.0" + "@babel/helper-compilation-targets" "^7.25.2" + "@babel/helper-module-transforms" "^7.25.2" + "@babel/helpers" "^7.25.0" + "@babel/parser" "^7.25.0" + "@babel/template" "^7.25.0" + "@babel/traverse" "^7.25.2" + "@babel/types" "^7.25.2" 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.23.6", "@babel/generator@^7.7.2": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e" - integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw== +"@babel/generator@^7.25.0", "@babel/generator@^7.25.6", "@babel/generator@^7.7.2": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.6.tgz#0df1ad8cb32fe4d2b01d8bf437f153d19342a87c" + integrity sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw== dependencies: - "@babel/types" "^7.23.6" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" + "@babel/types" "^7.25.6" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" -"@babel/helper-compilation-targets@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" - integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== +"@babel/helper-compilation-targets@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz#e1d9410a90974a3a5a66e84ff55ef62e3c02d06c" + integrity sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw== dependencies: - "@babel/compat-data" "^7.23.5" - "@babel/helper-validator-option" "^7.23.5" - browserslist "^4.22.2" + "@babel/compat-data" "^7.25.2" + "@babel/helper-validator-option" "^7.24.8" + browserslist "^4.23.1" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-environment-visitor@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== - -"@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" - integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== - dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-module-imports@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" - integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== - dependencies: - "@babel/types" "^7.22.15" - -"@babel/helper-module-transforms@^7.23.3": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" - integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.20" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== - -"@babel/helper-simple-access@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" - integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-split-export-declaration@^7.22.6": - version "7.22.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" - integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-string-parser@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" - integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== - -"@babel/helper-validator-identifier@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" - integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== - -"@babel/helper-validator-option@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" - integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== - -"@babel/helpers@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.9.tgz#c3e20bbe7f7a7e10cb9b178384b4affdf5995c7d" - integrity sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ== - dependencies: - "@babel/template" "^7.23.9" - "@babel/traverse" "^7.23.9" - "@babel/types" "^7.23.9" - -"@babel/highlight@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" - integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== - dependencies: - "@babel/helper-validator-identifier" "^7.22.20" +"@babel/helper-module-imports@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" + integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-module-transforms@^7.25.2": + version "7.25.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz#ee713c29768100f2776edf04d4eb23b8d27a66e6" + integrity sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ== + dependencies: + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-simple-access" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" + "@babel/traverse" "^7.25.2" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.24.8", "@babel/helper-plugin-utils@^7.8.0": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz#94ee67e8ec0e5d44ea7baeb51e571bd26af07878" + integrity sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg== + +"@babel/helper-simple-access@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" + integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-string-parser@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" + integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== + +"@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== + +"@babel/helper-validator-option@^7.24.8": + version "7.24.8" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" + integrity sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q== + +"@babel/helpers@^7.25.0": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.6.tgz#57ee60141829ba2e102f30711ffe3afab357cc60" + integrity sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q== + dependencies: + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.6" + +"@babel/highlight@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" + integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.7" chalk "^2.4.2" js-tokens "^4.0.0" + picocolors "^1.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.9.tgz#7b903b6149b0f8fa7ad564af646c4c38a77fc44b" - integrity sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.0", "@babel/parser@^7.25.6": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f" + integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q== + dependencies: + "@babel/types" "^7.25.6" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -179,14 +150,28 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.8.3": +"@babel/plugin-syntax-class-properties@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-syntax-import-meta@^7.8.3": +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-import-attributes@^7.24.7": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz#6d4c78f042db0e82fd6436cd65fec5dc78ad2bde" + integrity sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" + +"@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== @@ -201,13 +186,13 @@ "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-jsx@^7.7.2": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz#8f2e4f8a9b5f9aa16067e142c1ac9cd9f810f473" - integrity sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz#39a1fa4a7e3d3d7f34e2acc6be585b718d30e02d" + integrity sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ== dependencies: - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== @@ -221,7 +206,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-numeric-separator@^7.8.3": +"@babel/plugin-syntax-numeric-separator@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== @@ -249,7 +234,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-top-level-await@^7.8.3": +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== @@ -257,44 +249,41 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - version "7.23.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz#24f460c85dbbc983cd2b9c4994178bcc01df958f" - integrity sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/template@^7.22.15", "@babel/template@^7.23.9", "@babel/template@^7.3.3": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.23.9.tgz#f881d0487cba2828d3259dcb9ef5005a9731011a" - integrity sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA== - dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/parser" "^7.23.9" - "@babel/types" "^7.23.9" - -"@babel/traverse@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.9.tgz#2f9d6aead6b564669394c5ce0f9302bb65b9d950" - integrity sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg== - dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.6" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.9" - "@babel/types" "^7.23.9" + version "7.25.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz#04db9ce5a9043d9c635e75ae7969a2cd50ca97ff" + integrity sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg== + dependencies: + "@babel/helper-plugin-utils" "^7.24.8" + +"@babel/template@^7.25.0", "@babel/template@^7.3.3": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.0.tgz#e733dc3134b4fede528c15bc95e89cb98c52592a" + integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/parser" "^7.25.0" + "@babel/types" "^7.25.0" + +"@babel/traverse@^7.24.7", "@babel/traverse@^7.25.2": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.6.tgz#04fad980e444f182ecf1520504941940a90fea41" + integrity sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.25.6" + "@babel/parser" "^7.25.6" + "@babel/template" "^7.25.0" + "@babel/types" "^7.25.6" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6", "@babel/types@^7.23.9", "@babel/types@^7.3.3": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.9.tgz#1dd7b59a9a2b5c87f8b41e52770b5ecbf492e002" - integrity sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.25.0", "@babel/types@^7.25.2", "@babel/types@^7.25.6", "@babel/types@^7.3.3": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6" + integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw== dependencies: - "@babel/helper-string-parser" "^7.23.4" - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-string-parser" "^7.24.8" + "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -310,9 +299,9 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.6.1": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" - integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + version "4.11.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.1.tgz#a547badfc719eb3e5f4b556325e542fbe9d7a18f" + integrity sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q== "@eslint/eslintrc@^2.1.4": version "2.1.4" @@ -329,17 +318,17 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.56.0": - version "8.56.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b" - integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A== +"@eslint/js@8.57.1": + version "8.57.1" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" + integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== -"@humanwhocodes/config-array@^0.11.13": - version "0.11.14" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" - integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== +"@humanwhocodes/config-array@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" + integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== dependencies: - "@humanwhocodes/object-schema" "^2.0.2" + "@humanwhocodes/object-schema" "^2.0.3" debug "^4.3.1" minimatch "^3.0.5" @@ -348,10 +337,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz#d9fae00a2d5cb40f92cfe64b47ad749fbc38f917" - integrity sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw== +"@humanwhocodes/object-schema@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" @@ -364,7 +353,7 @@ js-yaml "^3.13.1" resolve-from "^5.0.0" -"@istanbuljs/schema@^0.1.2": +"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": version "0.1.3" resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== @@ -561,34 +550,34 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== dependencies: - "@jridgewell/set-array" "^1.0.1" + "@jridgewell/set-array" "^1.2.1" "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/trace-mapping" "^0.3.24" "@jridgewell/resolve-uri@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.22" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz#72a621e5de59f5f1ef792d0793a82ee20f645e4c" - integrity sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw== +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" @@ -660,9 +649,9 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.5.tgz#7b7502be0aa80cc4ef22978846b983edaafcd4dd" - integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== + version "7.20.6" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" + integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== dependencies: "@babel/types" "^7.20.7" @@ -693,11 +682,11 @@ "@types/istanbul-lib-report" "*" "@types/node@*": - version "20.11.17" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.17.tgz#cdd642d0e62ef3a861f88ddbc2b61e32578a9292" - integrity sha512-QmgQZGWu1Yw9TDyAP9ZzpFJKynYNeOvwMJmaxABfieQoVoiVOS6MN1WSpqpRcbeA5+RW82kraAVxCCJg+780Qw== + version "22.6.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.6.0.tgz#b604c9a628760221905c1b272fd6aee661f45042" + integrity sha512-QyR8d5bmq+eR72TwQDfujwShHMcIrWIYsaQFtXRE58MHPTEKUNxjxvl0yS0qPMds5xbSDWtp7ZpvGFtd7dfMdQ== dependencies: - undici-types "~5.26.4" + undici-types "~6.19.2" "@types/stack-utils@^2.0.0": version "2.0.3" @@ -710,9 +699,9 @@ integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yargs@^17.0.8": - version "17.0.32" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229" - integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog== + version "17.0.33" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" + integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== dependencies: "@types/yargs-parser" "*" @@ -727,9 +716,9 @@ acorn-jsx@^5.3.2: integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn@^8.9.0: - version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" - integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== + version "8.12.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" + integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== ajv@^6.12.4: version "6.12.6" @@ -827,22 +816,25 @@ babel-plugin-jest-hoist@^29.6.3: "@types/babel__traverse" "^7.0.6" babel-preset-current-node-syntax@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" - integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + version "1.1.0" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30" + integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-import-attributes" "^7.24.7" + "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" babel-preset-jest@^29.6.3: version "29.6.3" @@ -865,22 +857,22 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== +braces@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" -browserslist@^4.22.2: - version "4.22.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.3.tgz#299d11b7e947a6b843981392721169e27d60c5a6" - integrity sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A== +browserslist@^4.23.1: + version "4.23.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.3.tgz#debb029d3c93ebc97ffbc8d9cbb03403e227c800" + integrity sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA== dependencies: - caniuse-lite "^1.0.30001580" - electron-to-chromium "^1.4.648" - node-releases "^2.0.14" - update-browserslist-db "^1.0.13" + caniuse-lite "^1.0.30001646" + electron-to-chromium "^1.5.4" + node-releases "^2.0.18" + update-browserslist-db "^1.1.0" bser@2.1.1: version "2.1.1" @@ -909,10 +901,10 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001580: - version "1.0.30001587" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001587.tgz#a0bce920155fa56a1885a69c74e1163fc34b4881" - integrity sha512-HMFNotUmLXn71BQxg8cijvqxnIAofforZOwGsxyXJ0qugTdspUF4sPSJ2vhgprHCB996tIDzEq1ubumPDV8ULA== +caniuse-lite@^1.0.30001646: + version "1.0.30001663" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001663.tgz#1529a723505e429fdfd49532e9fc42273ba7fed7" + integrity sha512-o9C3X27GLKbLeTYZ6HBOLU1tsAcBZsLis28wrVzddShCS16RujjHp9GDHKZqrB3meE0YjhawvMFsGb/igqiPzA== chalk@^2.4.2: version "2.4.2" @@ -942,9 +934,9 @@ ci-info@^3.2.0: integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cjs-module-lexer@^1.0.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" - integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== + version "1.4.1" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170" + integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== cliui@^8.0.1: version "8.0.1" @@ -1022,16 +1014,16 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3: which "^2.0.1" debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + version "4.3.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== dependencies: - ms "2.1.2" + ms "^2.1.3" dedent@^1.0.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" - integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== + version "1.5.3" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" + integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== deep-is@^0.1.3: version "0.1.4" @@ -1060,10 +1052,10 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -electron-to-chromium@^1.4.648: - version "1.4.668" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.668.tgz#5cfed14f3240cdc70a359a49790cb295b1f097f1" - integrity sha512-ZOBocMYCehr9W31+GpMclR+KBaDZOoAEabLdhpZ8oU1JFDwIaFY0UDbpXVEUFc0BIP2O2Qn3rkfCjQmMR4T/bQ== +electron-to-chromium@^1.5.4: + version "1.5.27" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.27.tgz#5203ce5d6054857d84ba84d3681cbe59132ade78" + integrity sha512-o37j1vZqCoEgBuWWXLHQgTN/KDKe7zwpiY5CPeq2RvUqOyJw9xnrULzZAEVQ5p4h+zjMk7hgtOoPdnLxr7m/jw== emittery@^0.13.1: version "0.13.1" @@ -1082,10 +1074,10 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -escalade@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== +escalade@^3.1.1, escalade@^3.1.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-string-regexp@^1.0.5: version "1.0.5" @@ -1115,16 +1107,16 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@^8.56.0: - version "8.56.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.56.0.tgz#4957ce8da409dc0809f99ab07a1b94832ab74b15" - integrity sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ== +eslint@^8.0.0: + version "8.57.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" + integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.6.1" "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.56.0" - "@humanwhocodes/config-array" "^0.11.13" + "@eslint/js" "8.57.1" + "@humanwhocodes/config-array" "^0.13.0" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" "@ungap/structured-clone" "^1.2.0" @@ -1174,9 +1166,9 @@ esprima@^4.0.0: integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" @@ -1264,10 +1256,10 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" @@ -1297,9 +1289,9 @@ flat-cache@^3.0.4: rimraf "^3.0.2" flatted@^3.2.9: - version "3.2.9" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" - integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== fs.realpath@^1.0.0: version "1.0.0" @@ -1387,10 +1379,10 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -hasown@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.1.tgz#26f48f039de2c0f8d3356c223fb8d50253519faa" - integrity sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA== +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" @@ -1405,9 +1397,9 @@ human-signals@^2.1.0: integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== ignore@^5.2.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== import-fresh@^3.2.1: version "3.3.0" @@ -1418,9 +1410,9 @@ import-fresh@^3.2.1: resolve-from "^4.0.0" import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + version "3.2.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" + integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== dependencies: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" @@ -1449,11 +1441,11 @@ is-arrayish@^0.2.1: integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-core-module@^2.13.0: - version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + version "2.15.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== dependencies: - hasown "^2.0.0" + hasown "^2.0.2" is-extglob@^2.1.1: version "2.1.1" @@ -1514,13 +1506,13 @@ istanbul-lib-instrument@^5.0.4: semver "^6.3.0" istanbul-lib-instrument@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.1.tgz#71e87707e8041428732518c6fb5211761753fbdf" - integrity sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA== + version "6.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" + integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" + "@babel/core" "^7.23.9" + "@babel/parser" "^7.23.9" + "@istanbuljs/schema" "^0.1.3" istanbul-lib-coverage "^3.2.0" semver "^7.5.4" @@ -1543,9 +1535,9 @@ istanbul-lib-source-maps@^4.0.0: source-map "^0.6.1" istanbul-reports@^3.1.3: - version "3.1.6" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a" - integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== + version "3.1.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" + integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" @@ -1898,7 +1890,7 @@ jest-worker@^29.7.0: merge-stream "^2.0.0" supports-color "^8.0.0" -jest@^29.2.1: +jest@^29.0.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== @@ -2014,13 +2006,6 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - make-dir@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" @@ -2041,11 +2026,11 @@ merge-stream@^2.0.0: integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: - braces "^3.0.2" + braces "^3.0.3" picomatch "^2.3.1" mimic-fn@^2.1.0: @@ -2060,10 +2045,10 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== natural-compare@^1.4.0: version "1.4.0" @@ -2075,10 +2060,10 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-releases@^2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" - integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== +node-releases@^2.0.18: + version "2.0.18" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" + integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== normalize-path@^3.0.0: version "3.0.0" @@ -2107,16 +2092,16 @@ onetime@^5.1.2: mimic-fn "^2.1.0" optionator@^0.9.3: - version "0.9.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" - integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: - "@aashutoshrathi/word-wrap" "^1.2.3" deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" + word-wrap "^1.2.5" p-limit@^2.2.0: version "2.3.0" @@ -2188,10 +2173,10 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.0.0, picocolors@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59" + integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw== picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" @@ -2238,9 +2223,9 @@ punycode@^2.1.0: integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== pure-rand@^6.0.0: - version "6.0.4" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.4.tgz#50b737f6a925468679bff00ad20eade53f37d5c7" - integrity sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA== + version "6.1.0" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" + integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== queue-microtask@^1.2.2: version "1.2.3" @@ -2248,9 +2233,9 @@ queue-microtask@^1.2.2: integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== react-is@^18.0.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== require-directory@^2.1.1: version "2.1.1" @@ -2313,11 +2298,9 @@ semver@^6.3.0, semver@^6.3.1: integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.5.3, semver@^7.5.4: - version "7.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== - dependencies: - lru-cache "^6.0.0" + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== shebang-command@^2.0.0: version "2.0.0" @@ -2489,23 +2472,18 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -typescript@4.8.4: - version "4.8.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" - integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== - -update-browserslist-db@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" - integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== +update-browserslist-db@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e" + integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" + escalade "^3.1.2" + picocolors "^1.0.1" uri-js@^4.2.2: version "4.4.1" @@ -2515,9 +2493,9 @@ uri-js@^4.2.2: punycode "^2.1.0" v8-to-istanbul@^9.0.1: - version "9.2.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz#2ed7644a245cddd83d4e087b9b33b3e62dfd10ad" - integrity sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA== + version "9.3.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" + integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== dependencies: "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" @@ -2537,6 +2515,11 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +word-wrap@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -2569,11 +2552,6 @@ yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" diff --git a/apps/example/flagship-code.config.ts b/apps/example/flagship-code.config.ts index 0505538a95..58dc968ef3 100644 --- a/apps/example/flagship-code.config.ts +++ b/apps/example/flagship-code.config.ts @@ -30,6 +30,6 @@ export default defineConfig({ '@brandingbrand/code-plugin-app-icon', '@brandingbrand/code-plugin-permissions', '@brandingbrand/code-plugin-splash-screen', - '@brandingbrand/code-plugin-example', + 'plugin-monorepo', ], }); diff --git a/apps/example/index.js b/apps/example/index.js index 8ea0520f43..d7a5e751db 100644 --- a/apps/example/index.js +++ b/apps/example/index.js @@ -1,20 +1 @@ -import {Navigation} from 'react-native-navigation'; -import App from './App'; - -Navigation.registerComponent('com.myApp.WelcomeScreen', () => App); - -Navigation.events().registerAppLaunchedListener(() => { - Navigation.setRoot({ - root: { - stack: { - children: [ - { - component: { - name: 'com.myApp.WelcomeScreen', - }, - }, - ], - }, - }, - }); -}); +import './src'; diff --git a/apps/example/metro.config.js b/apps/example/metro.config.js index 45424bbb38..50c85c47ef 100644 --- a/apps/example/metro.config.js +++ b/apps/example/metro.config.js @@ -8,7 +8,10 @@ const {getDefaultConfig, mergeConfig} = require('@react-native/metro-config'); * @type {import('metro-config').MetroConfig} */ const config = { - watchFolders: [path.resolve(__dirname, '../../node_modules')], + watchFolders: [ + path.resolve(__dirname, '../../node_modules'), + path.resolve(__dirname, '../../packages'), + ], }; module.exports = mergeConfig(getDefaultConfig(__dirname), config); diff --git a/apps/example/package.json b/apps/example/package.json index b2ed337f9c..c813cab555 100644 --- a/apps/example/package.json +++ b/apps/example/package.json @@ -4,14 +4,6 @@ "license": "MIT", "private": true, "main": "index.js", - "workspaces": { - "nohoist": [ - "**/react", - "**/react/**", - "**/react-native", - "**/react-native/**" - ] - }, "scripts": { "android": "react-native run-android", "ios": "react-native run-ios", @@ -20,6 +12,7 @@ "start": "react-native start" }, "dependencies": { + "@brandingbrand/code-app-router": "*", "@brandingbrand/fsapp": "12.0.0-alpha.20", "@brandingbrand/react-native-app-restart": "0.4.0", "@react-native-async-storage/async-storage": ">=1.23.1", @@ -34,15 +27,14 @@ "@babel/core": "^7.20.0", "@babel/preset-env": "^7.20.0", "@babel/runtime": "^7.20.0", - "@brandingbrand/code-cli": "13.1.0", - "@brandingbrand/code-cli-kit": "13.1.0", + "@brandingbrand/code-cli": "*", + "@brandingbrand/code-cli-kit": "*", "@brandingbrand/code-jest-config": "*", - "@brandingbrand/code-plugin-app-icon": "2.0.1", - "@brandingbrand/code-plugin-asset": "2.0.1", - "@brandingbrand/code-plugin-example": "link:./coderc/plugins/plugin-example", - "@brandingbrand/code-plugin-native-navigation": "2.1.0", - "@brandingbrand/code-plugin-permissions": "2.0.2", - "@brandingbrand/code-plugin-splash-screen": "2.1.0", + "@brandingbrand/code-plugin-app-icon": "*", + "@brandingbrand/code-plugin-asset": "*", + "@brandingbrand/code-plugin-native-navigation": "*", + "@brandingbrand/code-plugin-permissions": "*", + "@brandingbrand/code-plugin-splash-screen": "*", "@react-native/babel-preset": "0.73.21", "@react-native/eslint-config": "0.73.2", "@react-native/metro-config": "0.73.5", @@ -53,6 +45,7 @@ "babel-jest": "^29.6.3", "eslint": "^8.19.0", "jest": "^29.2.1", + "plugin-monorepo": "link:coderc/plugins/plugin-monorepo", "prettier": "2.8.8", "react-native-bootsplash": "^5.4.0", "react-test-renderer": "18.2.0", diff --git a/apps/example/src/assets/index.ts b/apps/example/src/assets/index.ts new file mode 100644 index 0000000000..b69fa3d583 --- /dev/null +++ b/apps/example/src/assets/index.ts @@ -0,0 +1,8 @@ +import {ImageRequireSource} from 'react-native'; + +export default { + account: require('./tabAccount.png') as ImageRequireSource, + bag: require('./tabBag.png') as ImageRequireSource, + home: require('./tabHome.png') as ImageRequireSource, + shop: require('./tabShop.png') as ImageRequireSource, +}; diff --git a/apps/example/src/assets/tabAccount.png b/apps/example/src/assets/tabAccount.png new file mode 100644 index 0000000000000000000000000000000000000000..908c48aecd6f383bf59d31aa75f9e73841c80a13 GIT binary patch literal 377 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoCO|{#S9GG!XV7ZFl!D-1!HlL zyA#8@b22Z19F}xPUq=Rpjs4tz5?O(Ae4Z|jAr*{or@R$B=pfJ*@5cD@K&b<}AG_58 zW~&K8Qyf@VD1PHfD9`IxDA!Ye9DZ+R`lpS%x6j^vm!UT+$mvWc^F+bR7Y>9q z^iOi#e#GsbZ-<_t3vZNA=E-V5tHb?4M{Xuwmb>lzR{xt_VbP7UR;5M4JzU&VUuxI| z1|1Ro$7OoP>}SoM#>|F%t$n-B+$dy;?XdOP&;R6~(gu+;KfgTLrFA1t#E3oW!O=-h zjC=m8?|ioI!335t&Uu_g6=G|ZeAguM&9>zJHZwQb#p9sQs=x0w+RwWPrLDN&$@Ne+ zWvZ8t(4##nVk_3MGIc%T%IlDj>HPbn>$~LzgWUELDt97n%%j7ZqCMN({$G*}a<_Os U`)v7NU`R1|y85}Sb4q9e02}j?#{d8T literal 0 HcmV?d00001 diff --git a/apps/example/src/assets/tabAccount@2x.png b/apps/example/src/assets/tabAccount@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a3d27d1a6864cba677cdbb6e9796548e24e29069 GIT binary patch literal 671 zcmV;Q0$}}#P)mP@1H1v<0FS^1WCPfs*#I^mOaPsrFhRRP+X>1BU}5Q;8k)wjzxADkY(7g9Q!_vbS5&fegKq|*J^AEKY9QF002ovPDHLk FV1h?9EIoE&HRmDD zHOEbw#L?L5ae=9#Q^PeHN_K^LzzrI^M@t$ryfp4G!)!&ONPFR{rc2}51s?f|Kg^nS zJu811c#m`Da!`d^D&zc;M3HfdtM0vv8NMGRxE!Le3!re1Spjz>Mv43Gy^AK%sYii- z^|U;a*eqXRk9~Zpr=`2b^h(4|QiSD?)FZX8NDNvLSH6HL|Eu`qjQ zw@)u7n~R&~@7{?ac|lOd@ts}a&GSqqK|+RDn-|m`_ffHHgMx(GTn=gnc4BSj#?(bF zaga39f7mwC8y3($NjEQJn<-Xu2Wq_Nu5;8A_{@&|2eXQC&69-d7<}tx-$iyEQ6~ITm6r zDd;;&zDW_7eQ9+iVYXou{k5srK;QD8u5#9dXHCED3&L&ZL#C$H`J^Clo1}8`pv)y?lUL?F`549`ono-1yB0$QXSt}33&zc!kq)10SEoWtdOwA9{#`y;Kc|Sgo z`QFC3E||bn2YolrOVZ)Dajx-5s>zcIdm1#FZxjCa0y}=MNb{FBZ8@ATwsn6ik+O|e z|CBZ;=%mjvqsuZS#H!kUvJ5IRnM@{=$z(E_bNB~y_}0^Fwh{{f0000z*!-Ar*{or{3mmau9IU4`~qH5vHIT*rXf5 zshYuljH`uj1JgFQl126c_WmEq?9g8xZ7gT*aFvy#IV{)~uSeCbp_s z1%a>Fgz^@;Z#p;OcyAm}<;iOs<^SzlBx0MxA1IhrcS1PvpmYEHE9cB61nRz)oG7(C zQz1NYXS3UqWmill1h8AnP7$87vCh@qx8QAdL{{9a2R{NMllx`0<&Ez+^lx&TUkCIe NgQu&X%Q~loCIAuwc2fWV literal 0 HcmV?d00001 diff --git a/apps/example/src/assets/tabBag@2x.png b/apps/example/src/assets/tabBag@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..809d7a0993bb810e90a76d03f7020f4f71b29c57 GIT binary patch literal 532 zcmV+v0_**WP)BnrYx5UjgmH#2ov^r!GE| zgnHQFX%tK8!ZiT0)jRP>QN2k_N!puv8!PmBb!CrwF7K{@Lazz~lQm-c|p@FPM`7r0%x~oV6sL=zZhMzQ0000Wn^#~rJ8#EiV8>HEw8zh?~8zh+^+#ue-5fkGM;#r9az$Pr?-QkXB zn-&BC`XnSE2!bF8f*=SSvKZ{oV0VK(54PFb%l5P1gC(3PS9lM^W)Hi<8BwyPWXGn_ z9=3C5O*z4GqWr{5uu7RF_Pga^ml&7bSp?}8;}ib7$DDuFoEyxPOSA`PYVHa%gx_~0 zS@0j@vYZtO;|xe>XHosfQSL=wa2%Fwd_P!5JL~OS;unrUj{rSE4xc-#4C1UIhtHjD zfKG}F*if$K3w-enx@>*JDub5rM}h%X0rI%~H@Rqs$e@ze7nNPJ@2_`!zps7vKfI(8 z46q8&Pd0u;KlrhKz<@)Pm}Z@$g&*5(iDmR7vvGm}76DpdoIzentoBQUMS$v5_7b2% zf)c9?BGxcioGGY}uf7jiXHd`V!44l1lvo6aOMFiS!ww%zq+Sc}6t=Wc4@L2TH~G86 zpKYzspB2UrAiL6~4f+YDK56ek^&YIJf)TYJ2@13U^0Gjz;l8M(-ZFzcC>X(gNl>5- z5SRE2KV&vmNqv;qf#DMGsjJA9tee!kaN+|@E}o{uyzRkiO!j1&0D0*mPGQnrw923i ze`GdJ5TXf?mqz^*<_-K-_%7a)f)QLqy6oynB|It^q4rT)V!R>lvAhWKP29kj2FU9k ztVX>j(_|2l;g`(DBB{5?pi?NZLV^HkfV@jQp_Y1WiFxTFPQm><>aL#T^Az4!ruCXg z>LnS(CDXHl5#*yt>Lmg4z6YzxY@E=DG=m7wH)ulDUHpo6yh{Ak8@sB-q9j0E;yv%f zcF`>L+7df8noCUbB6-OgFG1Qg{=TeJb%kU*_#Z)e8&FFkB%tgTe~ HDWM4f`wm>V literal 0 HcmV?d00001 diff --git a/apps/example/src/assets/tabHome@2x.png b/apps/example/src/assets/tabHome@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6b1c93ce308fe7422f1c439c5b1b21e1c65513f9 GIT binary patch literal 448 zcmV;x0YCnUP)O` z#4r#jKa@Fcr0<+C$09+an>`N ztif>{$8ns?BBXds@sZ+`;;U1f5ED}@^xN<@o)BRv-hVtOzr@6P64(5ly7mnM4z#N0 zd`n*pp?r+C`CO$Q)!q^j%BODr1syW^9BHyqR6b*fPMgFSz3G_8@9y{~&cF*rC7|B#Oqr0H0y?#P8 qPaB#IFRWcAqPqxi9LI4SXDHvfVa8_l&Mxu*0000r#uLGw8m5>s2sYL1^=|Juv>A=3lGCcjlVAQphhhN5qkxP z&B^?!u+uRT_G(9ks5B=KvDZM$R&NXh?A185)&n|7*lQqm#@G`G*sF0kJq;ZO0vp#C zMQqSQ!d}ZFl(HufuvaJ)ae;w=y@o;&7bv$^LpPj*D<}IK*At8NcIpWo`eMDM2-R>- z%Iy{ChI8--I1h@?Wr1!uC*}4U=$@Q| z;>~Mlhx4F#^E$fWoRr&3Ih;Gi_KNBP-l2T+2D;(AqWEn}LpPlB;={7GlIiJahI8Ze zMP&(!;oLZ^tHfGKpcl@;VRQ24$UQ|2biz5`^Z$aAYc)X;4UKSqyW4o~GFI8-B%PXY zZoE##Y9+7-Nhv d#u#Hh&I=!0sx;citK|Ry002ovPDHLkV1i__4deg- literal 0 HcmV?d00001 diff --git a/apps/example/src/assets/tabShop.png b/apps/example/src/assets/tabShop.png new file mode 100644 index 0000000000000000000000000000000000000000..8b12c9f2b8a89fddd75ce808c5862a410d18b102 GIT binary patch literal 372 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjoCO|{#S9GG!XV7ZFl!D-1!HlL zyA#8@b22Z19F}xPUq=Rpjs4tz5?O(AoSrU@Ar*{or#$3sG7xB;f9$`NlX-yphP(%C zk62!@9AeqjsJue>0NXCcyAJLj^lXK61h_cW)M`$8Gnc=eT5j3USnoVpZ;8*83EP%L z-fas!%6O`>TzRi&`lU9J$?t?7-)Y#QwAS<3&F;?6YgBf6c-`{;xK!k{p%A|Zf2Z^o zmxH$!N_}#QI2|S2J?nwpo(EqJZ}oWmd)b@+b3_(OZaa74UwSMfpIG&TQ&z3=F)3}+ zHrTSCzcb0zF5`xpx!{6DC-)T}IGpO?9&kYd3ft{Rx7g|yozgD_a5Aye%qwV0)+jEP)L z!Y~lVKYb3+5wZceL7c$n1k?%C39J*q2G$AC2?`T{6UYX*f#z(^qzGvWX(`YA-uqsm zfA4aay99_tB9X{{<_ztVD2X7~|GT&q{YF zonq1dDXNY7h(n(H)5Jo+?(8OjNHh5aU`P+FjjBt>?Dju6-$k$sRbb0$NNixgVhW3w_L$ zZqXe2UW&t3w7;Ziz8|2bwuV_+2>3zwEnw2ndrcK`KVTcfksxxV7yK>BG*`&b6xBhv zL=PIIfLUVOqNo%wlhhVRE<=wHD0fwy9-E@`8Omr#7)Jzp2pK6*8Y-~8+>)~)D%sH> zr#O{HI8msZcfKbM4L8LxP80!?N)jhZhIaPaok97}{UX#Vw{xgd+g&{pi9{li3g3>F Vu{?m!Yv%v}002ovPDHLkV1fV-5|jV{ literal 0 HcmV?d00001 diff --git a/apps/example/src/assets/tabShop@3x.png b/apps/example/src/assets/tabShop@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..41c51370b7af406f6e93ee829dcd0a5febea4b50 GIT binary patch literal 898 zcmV-|1AY97P) z(?Af$KN$W`I$)_F=^#o4qyw7@5-NzOAfbYo27n5XDm+3!hRZiFt#jy|2HJY zZjG&tJ+-vV*bEbgU?23UhpjMxqhgTQC2Z8xVd;E@mC_$e|ElHnSYoa(K$4=F zyRH$4Q*_S_S?yXJId$ix@B?kR_6$96kr?NR6S%>l&T^45TcFzLcg26c;1?jHk=t;N z-BOQ=IrhuX2lXhu#{p1p^eu*kP|ZmxB8Q_z)-1;u9(m7opnG;kMo+KA+2g)LNxC-| zs76mnWE5qHlm#}8yhB)6Rx%ewDKqXx$_6F~PbTg^cQ_9(5e8WyFA<(c@!hFff8}s& z+p$=E{3XvBt5}owJ;DGG+{R+Ew@5I4l1#d`p{>L?dI;@#i;2)yVjQ9$(QYhOj=$vZ zlBf%{ZMfv1u0@t~5Mdl-9?aoDh+Ztm#!1H*CyJzl9^pW!ZeI2x7YNUp_#Wl7M~d-! zGCA3|Mx+p`Wk5)oEim3N#|c^P-yjTx>WfJbF$uyqc7X#J$xCDutuUV3UgbsvW z7bDn_ed(Ab?1Z{+5>z9Gi`+pc%Lx9~#pY-(3;B$s8LIO?D+Ivjx)_tzj^T$O^ykL+ zb;np2D@oB@`CJso=Wru|?ZQd?m&4;4{aCR4wrzFchvkapgKQ4~c{6h(=e Yf2kaZByXn}sQ>@~07*qoM6N<$f@rXmg8%>k literal 0 HcmV?d00001 diff --git a/apps/example/src/components/HelloWorldModal.tsx b/apps/example/src/components/HelloWorldModal.tsx new file mode 100644 index 0000000000..991a9efd08 --- /dev/null +++ b/apps/example/src/components/HelloWorldModal.tsx @@ -0,0 +1,46 @@ +import {View, Text, TouchableOpacity, StyleSheet} from 'react-native'; +import React from 'react'; +import {useModal} from '@brandingbrand/code-app-router'; + +const HelloWorldModal = () => { + const {resolve} = useModal(); + + async function onPress() { + resolve('blah'); + } + + return ( + + HelloWorldModal + + Close Modal + + + ); +}; + +const styles = StyleSheet.create({ + container: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + gap: 30, + }, + button: { + backgroundColor: 'black', + paddingHorizontal: 20, + paddingVertical: 10, + borderRadius: 20, + }, + text: { + color: 'white', + }, +}); + +HelloWorldModal.options = { + topBar: { + visible: false, + }, +}; + +export default HelloWorldModal; diff --git a/apps/example/src/index.tsx b/apps/example/src/index.tsx new file mode 100644 index 0000000000..a7f2fa784b --- /dev/null +++ b/apps/example/src/index.tsx @@ -0,0 +1,121 @@ +import {register} from '@brandingbrand/code-app-router'; + +import assets from './assets'; +import HelloWorldModal from './components/HelloWorldModal'; + +register({ + routes: [ + { + type: 'bottomtab', + stackId: 'HOME_STACK', + name: 'home', + Component: require('./routes/home').default, + path: '/home', + options: { + topBar: { + visible: false, + }, + bottomTab: { + icon: assets.home, + iconColor: 'grey', + selectedIconColor: 'black', + textColor: 'grey', + selectedTextColor: 'black', + text: 'Home', + }, + }, + children: [], + }, + { + type: 'bottomtab', + stackId: 'SHOP_STACK', + name: 'shop', + Component: require('./routes/shop').default, + path: '/shop', + options: { + topBar: { + visible: false, + }, + bottomTab: { + icon: assets.shop, + iconColor: 'grey', + selectedIconColor: 'black', + textColor: 'grey', + selectedTextColor: 'black', + text: 'Shop', + }, + }, + children: [], + }, + { + type: 'bottomtab', + stackId: 'CART_STACK', + name: 'cart', + Component: require('./routes/cart').default, + path: '/cart', + options: { + topBar: { + visible: false, + }, + bottomTab: { + icon: assets.bag, + iconColor: 'grey', + selectedIconColor: 'black', + textColor: 'grey', + selectedTextColor: 'black', + text: 'Cart', + }, + }, + children: [ + { + type: 'action', + name: 'applyDiscount', + path: '/cart/discount/:discount', + action: require('./routes/cart.discount.$discount').default, + guards: [ + async function (to, from, next) { + console.log('to1:', to); + console.log('from1:', from); + console.log('next:', next); + + await next.showModal(HelloWorldModal, {}, {}); + }, + async function (to, from, next) { + console.log('to2:', to); + console.log('from2:', from); + console.log('next:', next); + }, + ], + }, + ], + }, + { + type: 'bottomtab', + stackId: 'ACCOUNT_STACK', + name: 'account', + Component: require('./routes/account').default, + path: '/account', + options: { + topBar: { + visible: false, + }, + bottomTab: { + icon: assets.account, + iconColor: 'grey', + selectedIconColor: 'black', + textColor: 'grey', + selectedTextColor: 'black', + text: 'Account', + }, + }, + children: [ + { + type: 'component', + name: 'AccountSettings', + path: '/account/settings', + Component: require('./routes/account.settings').default, + }, + ], + }, + ], +}); diff --git a/apps/example/src/routes/account.settings.tsx b/apps/example/src/routes/account.settings.tsx new file mode 100644 index 0000000000..96f012f476 --- /dev/null +++ b/apps/example/src/routes/account.settings.tsx @@ -0,0 +1,20 @@ +import React from 'react'; +import {StyleSheet, Text, View} from 'react-native'; + +function Account() { + return ( + + /account/settings + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + }, +}); + +export default Account; diff --git a/apps/example/src/routes/account.tsx b/apps/example/src/routes/account.tsx new file mode 100644 index 0000000000..46af31e6c3 --- /dev/null +++ b/apps/example/src/routes/account.tsx @@ -0,0 +1,20 @@ +import React from 'react'; +import {StyleSheet, Text, View} from 'react-native'; + +function Account() { + return ( + + /account + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + }, +}); + +export default Account; diff --git a/apps/example/src/routes/cart.discount.$discount.ts b/apps/example/src/routes/cart.discount.$discount.ts new file mode 100644 index 0000000000..135ef3511b --- /dev/null +++ b/apps/example/src/routes/cart.discount.$discount.ts @@ -0,0 +1,7 @@ +import {Alert} from 'react-native'; + +function applyDiscount(...args: any) { + Alert.alert('Apply Discount', JSON.stringify(args)); +} + +export default applyDiscount; diff --git a/apps/example/src/routes/cart.tsx b/apps/example/src/routes/cart.tsx new file mode 100644 index 0000000000..c39da9c3e9 --- /dev/null +++ b/apps/example/src/routes/cart.tsx @@ -0,0 +1,40 @@ +import {useNavigator} from '@brandingbrand/code-app-router'; +import React from 'react'; +import {StyleSheet, Text, TouchableOpacity, View} from 'react-native'; + +function Cart() { + const navigator = useNavigator(); + + function onPress() { + navigator.open('/cart/discount/abc12345?foo=bar'); + } + + return ( + + /cart + + Apply Discount + + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + gap: 30, + }, + button: { + backgroundColor: 'black', + paddingHorizontal: 20, + paddingVertical: 10, + borderRadius: 20, + }, + text: { + color: 'white', + }, +}); + +export default Cart; diff --git a/apps/example/src/routes/home.tsx b/apps/example/src/routes/home.tsx new file mode 100644 index 0000000000..c88e58f80b --- /dev/null +++ b/apps/example/src/routes/home.tsx @@ -0,0 +1,46 @@ +import {useLinking, useNavigator} from '@brandingbrand/code-app-router'; +import React from 'react'; +import {Alert, StyleSheet, Text, TouchableOpacity, View} from 'react-native'; +import HelloWorldModal from '../components/HelloWorldModal'; + +function Home() { + useLinking(); + const {showModal} = useNavigator(); + + async function onPress() { + try { + const res = await showModal<{}, string>(HelloWorldModal, {}); + + Alert.alert('Result', res); + } catch (e) {} + } + + return ( + + /home + + Show Modal + + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + gap: 30, + }, + button: { + backgroundColor: 'black', + paddingHorizontal: 20, + paddingVertical: 10, + borderRadius: 20, + }, + text: { + color: 'white', + }, +}); + +export default Home; diff --git a/apps/example/src/routes/shop.tsx b/apps/example/src/routes/shop.tsx new file mode 100644 index 0000000000..ae8a932912 --- /dev/null +++ b/apps/example/src/routes/shop.tsx @@ -0,0 +1,40 @@ +import {useNavigator} from '@brandingbrand/code-app-router'; +import React from 'react'; +import {StyleSheet, Text, TouchableOpacity, View} from 'react-native'; + +function Account() { + const navigator = useNavigator(); + + function onPress() { + navigator.open('/account/settings'); + } + + return ( + + /shop + + Account Settings + + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + gap: 30, + }, + button: { + backgroundColor: 'black', + paddingHorizontal: 20, + paddingVertical: 10, + borderRadius: 20, + }, + text: { + color: 'white', + }, +}); + +export default Account; diff --git a/babel.config.json b/babel.config.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/babel.config.json @@ -0,0 +1 @@ +{} diff --git a/packages/app-router/package.json b/packages/app-router/package.json index 13390cbe3c..8046d02037 100644 --- a/packages/app-router/package.json +++ b/packages/app-router/package.json @@ -12,9 +12,8 @@ }, "types": "src/index.ts", "dependencies": { - "parse-url": "^9.2.0", "path-to-regexp": "^7.1.0", - "react-native-url-polyfill": "^2.0.0" + "url-parse": "^1.5.10" }, "peerDependencies": { "react": "*", @@ -25,8 +24,7 @@ "@repo/eslint-config": "*", "@repo/typescript-config": "*", "@types/eslint": "^8.56.1", - "eslint": "^8.56.0", - "tsup": "^8.0.1", + "@types/url-parse": "^1.4.11", "typescript": "^5.3.3", "react": "18.2.0", "react-native": "^0.73.9", diff --git a/packages/app-router/src/context.tsx b/packages/app-router/src/context.tsx new file mode 100644 index 0000000000..9cd01ecb50 --- /dev/null +++ b/packages/app-router/src/context.tsx @@ -0,0 +1,49 @@ +import React from 'react'; + +import {ModalData, RouteMatch} from './types'; + +/** + * React context to provide a unique component identifier. + * + * @type {React.Context} + */ +export const ComponentIdContext = React.createContext(null); + +// Assign a display name to the ComponentIdContext for easier debugging in development +// eslint-disable-next-line no-undef +if (__DEV__) { + ComponentIdContext.displayName = 'ComponentIdContext'; +} + +/** + * React context to provide routing information, such as the matched route, URL, and associated data. + * + * @type {React.Context} + */ +export const RouteContext = React.createContext(null); + +// Assign a display name to the RouteContext for easier debugging in development +// eslint-disable-next-line no-undef +if (__DEV__) { + RouteContext.displayName = 'RouteContext'; +} + +/** + * Context for managing modal data and actions, such as resolve and reject. + * + * This context is designed to be used with modal components that require dynamic + * data types. The `ModalData` type is parameterized with `unknown` to allow any + * type of data to be passed and returned, ensuring type safety and flexibility. + * + * @type {React.Context | null>} + */ +export const ModalContext = React.createContext | null>(null); + +// Assign a display name to the ModalContext for easier debugging in development +// eslint-disable-next-line no-undef +if (__DEV__) { + ModalContext.displayName = 'ModalContext'; +} diff --git a/packages/app-router/src/hooks.tsx b/packages/app-router/src/hooks.tsx new file mode 100644 index 0000000000..1c2ad07e52 --- /dev/null +++ b/packages/app-router/src/hooks.tsx @@ -0,0 +1,620 @@ +import {match} from 'path-to-regexp'; +import {useContext, useEffect} from 'react'; +import {Layout, Navigation, Options} from 'react-native-navigation'; +import {Linking} from 'react-native'; +// eslint-disable-next-line import/no-duplicates +import urlParse from 'url-parse'; +// eslint-disable-next-line import/no-duplicates +import type URLParse from 'url-parse'; + +import {ComponentIdContext, ModalContext, RouteContext} from './context'; +import {ActionRoute, Guard} from './types'; + +/** + * Counter used for generating unique IDs. + * + * This variable keeps track of the last assigned ID and is incremented + * each time a new ID is generated. It ensures that each generated ID + * is unique within the current session or application lifecycle. + * + * @type {number} + * @default 0 + */ +let idCounter = 0; + +/** + * Custom hook to access the Router context. + * + * @returns {RouterContextType} The current router state from the RouterContext. + * @throws Will throw an error if the hook is used outside of a RouterContext.Provider. + */ +export function useRoute() { + const state = useContext(RouteContext); + + if (!state) { + throw new Error( + 'useRoute must be used inside a AppRouterURLContext.Provider', + ); + } + + return state; +} + +/** + * Hook to interact with a modal's state within the context of a `ModalContext.Provider`. + * Provides access to the modal's data and functions to resolve or reject the modal. + * + * @template T - The type of the data passed to the modal. + * @template U - The type of the result returned when the modal is resolved. + * + * @throws {Error} If the hook is used outside of a `ModalContext.Provider`. + * + * @returns {Object} An object containing the modal's data, a `resolve` function to return a result, and a `reject` function to close the modal without returning a result. + * + * @example + * ```typescript + * // Using useModal in a component + * const { data, resolve, reject } = useModal(); + * + * // Access the data passed to the modal + * console.log(data); + * + * // Resolve the modal with a result + * const handleConfirm = () => { + * resolve({ success: true }); + * }; + * + * // Reject the modal without returning a result + * const handleCancel = () => { + * reject(); + * }; + * ``` + */ +export function useModal() { + // Access the current modal state from the ModalContext + const state = useContext(ModalContext); + + // Get the unique component ID of the modal + const componentId = useComponentId(); + + // Ensure the hook is used within a ModalContext.Provider + if (!state) { + throw new Error('useModal must be used inside a ModalContext.Provider'); + } + + return { + // The data passed to the modal, cast to the type T + data: state.data as T, + + // A function to resolve the modal with a result of type U + resolve: state.resolve(componentId) as (result: U) => void, + + // A function to reject the modal, closing it without returning a result + reject: state.reject(componentId) as () => void, + }; +} + +/** + * Custom hook to access the Component ID context. + * + * @returns {ComponentIdContextType} The current component ID from the ComponentIdContext. + * @throws Will throw an error if the hook is used outside of a ComponentIdContext.Provider. + */ +export function useComponentId() { + const state = useContext(ComponentIdContext); + + if (!state) { + throw new Error( + 'useAppRouterURLContext must be used inside a ComponentIdContext.Provider', + ); + } + + return state; +} + +/** + * Custom hook to retrieve URL parameters matched by the route's path. + * + * @returns {Record} An object containing the matched URL parameters. + * @throws Will throw an error if no matches are found for the path parameters. + */ +export function usePathParams() { + const route = useRoute(); + + if (!route.url) return {}; + + // Match the current URL pathname against the router's path pattern + try { + const {pathname} = urlParse(route.url, true); + const matches = match(route.path)(pathname); + + if (!matches) { + throw new Error('no matches for path params'); + } + + // Return the matched parameters + return matches.params; + } catch (e) { + return {}; + } +} + +/** + * Custom hook to retrieve search parameters from the URL. + * + * @returns {Record} An object containing key-value pairs of search parameters. + */ +export function useQueryParams() { + const route = useRoute(); + + if (!route.url) return {}; + + const {query} = urlParse(route.url, true); + + return query; +} + +/** + * Custom hook to retrieve the router data. + * + * @returns {RouterDataType} The current router data. + */ +export function useRouteData(): T { + const route = useRoute(); + + return route.data as T; +} + +/** + * Custom hook to provide navigation functions for managing the component stack. + * + * This hook relies on `react-native-navigation` to navigate between screens. It includes methods + * to push new screens onto the stack, pop screens off the stack, and set the root of the stack. + * + * @returns {object} An object containing navigation methods: `push`, `pop`, `popToRoot`, `popTo`, `setStackRoot`, and `showModal`. + */ +export function useNavigator() { + const componentId = useComponentId(); + const route = useRoute(); + + /** + * Executes a series of guards to determine if navigation should be redirected or canceled. + * + * @param toPath - The destination path for navigation. + * @param fromPath - The current path from which navigation is happening. If not provided, it defaults to `undefined`. + * @param guards - An optional array of guard functions to be executed. Each guard is invoked with the destination path, current path, and control functions. + * + * @returns A promise that resolves to the redirect path if a guard calls `redirect`, or `undefined` if no redirection is needed. + */ + async function runGuards( + toPath: string, + fromPath?: string | null, + guards?: Guard[], + ): Promise { + // If no guards are provided, exit early + if (!guards) return; + + let redirectPath: string | false | undefined; + + /** + * Cancels the navigation process by throwing an error. + * This will halt the execution of the guards and propagate the error. + */ + function cancel() { + redirectPath = false; + } + + /** + * Sets the redirect path if navigation needs to be redirected. + * + * @param path - The path to redirect to. + */ + function redirect(path: string) { + redirectPath = path; + } + + // Execute each guard in the order they are provided + for (const guard of guards) { + // If a redirect has been set, exit early and return the redirect path + if (redirectPath !== undefined) { + return redirectPath; + } + + try { + // Call the guard function with the parsed paths and control functions + await guard( + urlParse(toPath, true), + fromPath ? urlParse(fromPath, true) : undefined, + {cancel, redirect, showModal}, + ); + } catch (e) { + // TODO: Implement error handling logic if needed + console.error(e); // Optional: Log error for debugging purposes + } + } + + // Return the redirect path if set, otherwise return `undefined` + return redirectPath; + } + + /** + * Converts a URL path or full URL string to a `URL` object. + * + * If the input string does not contain a protocol, it prepends the default `bundleId` + * and converts it into a complete URL. If a protocol exists, it directly converts the + * input into a `URL` object. + * + * @param pathOrUrl - The URL path or full URL string to be converted. + * @returns A `URL` object representing the complete URL. + * + * @example + * ```typescript + * const url1 = createAppURL('/path/to/resource'); + * console.log(url1.toString()); // Outputs: app://path/to/resource + * + * const url2 = createAppURL('https://example.com/resource'); + * console.log(url2.toString()); // Outputs: https://example.com/resource + * ``` + */ + function createAppURL(pathOrUrl: string): URLParse { + // Check if the input string contains a protocol using a regular expression. + const hasProtocol = /^[a-zA-Z][a-zA-Z\d+\-.]*:/.test(pathOrUrl); + + // Convert the resulting string into a URL object and return it. + return urlParse(pathOrUrl, true); + } + + /** + * Determines if a given route is associated with a bottom tab. + * + * @param {Route} route - The route to check. + * @returns {boolean} True if the route is associated with a bottom tab, otherwise false. + * + * @example + * const route = { name: 'Home', Component: HomeComponent, options: { bottomTab: { text: 'Home' } } }; + * const isTab = isBottomTab(route); + * console.log(isTab); // true + */ + function isBottomTab(route: any): boolean { + if (route.options?.bottomTab) { + return true; + } + + return false; + } + + /** + * Gets the index of a bottom tab for a given route. + * + * @param {Route} route - The route for which to get the bottom tab index. + * @param {Route[]} routes - The array of all routes. + * @returns {number} The index of the bottom tab. + * + * @example + * const routes = [ + * { name: 'Home', Component: HomeComponent, options: { bottomTab: { text: 'Home' } } }, + * { name: 'Profile', Component: ProfileComponent, options: { bottomTab: { text: 'Profile' } } }, + * ]; + * const index = getBottomTabIndex(routes[1], routes); + * console.log(index); // 1 + */ + function getBottomTabIndex(route: any, routes: any[]): number { + const index = routes + .filter(it => isBottomTab(it)) + .reduce((acc, curr, index) => { + if (curr.name === route.name) { + return index; + } + return acc; + }, 0); + + return index; + } + + /** + * Opens a route based on the given path. If the route is associated with a bottom tab, + * it pops to the root tab, otherwise, it pushes the new route. + * + * @param {string} path - The path to navigate to. + * @param {Object} [passProps={}] - Optional properties to pass to the route. + * @param {Options} [options] - Optional navigation options. + * + * @example + * open('/profile', { userId: 123 }, { animated: true }); + * + * @example + * open('/home'); + */ + async function open(path: string, passProps = {}, options?: Options) { + const url = createAppURL(path); + const matchedRoute = route.routes.find(it => { + return match(it.path)(url.pathname); + }); + + if (!matchedRoute) return; + + try { + const redirect = await runGuards( + url.href, + route.url ? urlParse(route.url, true).href : null, + matchedRoute.guards, + ); + + if (redirect) { + await open(redirect); + // Break out of function since we are redirecting + return; + } + + if (redirect === false) { + // Break out of function since cancel was executed + return; + } + } catch (e) { + // Break out of function due to side-effect throwing error from a guard + return; + } + + const res = match(matchedRoute.path)(url.pathname); + const {query} = urlParse(url.href, true); + + // Perform any associated action with the matched route + try { + if (matchedRoute.type === 'action') { + (matchedRoute as unknown as ActionRoute).action( + url.href, + res ? res.params : {}, + query, + ); + } + } catch (e) { + // handle error (e.g., log it) + } + + // If there's no associated component, return + if (!matchedRoute.hasComponent) return; + + // If the route is a bottom tab, pop to root + if (isBottomTab(matchedRoute)) { + return popToRoot({ + ...options, + bottomTabs: { + currentTabIndex: getBottomTabIndex(matchedRoute, route.routes), + }, + }); + } + + // Otherwise, push the new route + return push(path, passProps, options); + } + + /** + * Push a new screen onto the navigation stack. + * + * @param {string} path - The path or route name to navigate to. + * @param {object} [passProps={}] - Optional props to pass to the new screen. + * @param {Options} [options] - Optional navigation options for customizing the transition. + */ + async function push(path: string, passProps = {}, options?: Options) { + const matchedRoute = route.routes.find(it => { + return match(it.path)(path); + }); + + if (!matchedRoute) return; + + if (matchedRoute.stackId) { + Navigation.mergeOptions(componentId, { + bottomTabs: { + currentTabId: matchedRoute.stackId, + }, + }); + } + + return Navigation.push(matchedRoute.stackId ?? componentId, { + component: { + name: matchedRoute.name, + passProps: { + ...passProps, + APP_ROUTER_URL: path, // Inject the URL path as a special prop + }, + options, + }, + }); + } + + /** + * Pop the current screen off the navigation stack, returning to the previous screen. + * + * @param {Options} [mergeOptions] - Optional navigation options for customizing the transition. + */ + function pop(mergeOptions?: Options) { + return Navigation.pop(componentId, mergeOptions); + } + + /** + * Pop all screens off the stack and return to the root screen. + * + * @param {Options} [mergeOptions] - Optional navigation options for customizing the transition. + */ + function popToRoot(mergeOptions?: Options) { + return Navigation.popToRoot(componentId, mergeOptions); + } + + /** + * Pop to a specific screen in the stack. + * + * @param {Options} [mergeOptions] - Optional navigation options for customizing the transition. + */ + function popTo(mergeOptions?: Options) { + return Navigation.popTo(componentId, mergeOptions); + } + + /** + * Set a new root for the stack, replacing all existing screens. + * + * @param {Layout | Layout[]} layout - The new layout or stack of layouts to set as the root. + */ + function setStackRoot(layout: Layout | Layout[]) { + return Navigation.setStackRoot(componentId, layout); + } + + /** + * Displays a modal with the specified component and data, and returns a promise + * that resolves when the modal is dismissed. + * + * @template T - The type of data passed to the modal. + * @template U - The type of data returned when the modal is resolved. + * + * @param Component - The React component to render inside the modal. + * @param data - The data to pass to the modal component. + * @param options - Additional options for displaying the modal. + * + * @returns A promise that resolves with the data returned from the modal when it's dismissed. + * + * @example + * ```typescript + * const result = await showModal(MyComponent, { prop1: 'value' }, { modalOptions: true }); + * console.log('Modal result:', result); + * ``` + */ + async function showModal( + Component: React.ComponentType, + data: T, + options: Options = {}, + ): Promise { + // Generate a unique name for the modal component. + const name = `Modal_${idCounter}`; + idCounter++; + + // Register the modal component with React Native Navigation. + Navigation.registerComponent( + name, + () => props => { + const {componentId, resolve, reject, ...passProps} = props; + + return ( + + + + + + ); + }, + () => Component, + ); + + // Return a promise that resolves or rejects based on modal dismissal. + return new Promise((res, rej) => { + // Define the resolve function that dismisses the modal and resolves the promise. + function resolve(componentId: string) { + return (data: U) => { + res(data); + + Navigation.dismissModal(componentId); + }; + } + + // Define the reject function that dismisses the modal and rejects the promise. + function reject(componentId: string) { + return () => { + rej(); + + Navigation.dismissModal(componentId); + }; + } + + // Show the modal using React Native Navigation with the provided options. + Navigation.showModal({ + stack: { + children: [ + { + component: { + name, + passProps: { + ...data, + resolve, + reject, + }, + options: { + ...((Component as any).options ?? {}), + ...options, + }, + }, + }, + ], + }, + }); + }); + } + + return { + open, + push, + pop, + popToRoot, + popTo, + setStackRoot, + showModal, + }; +} + +/** + * A custom hook that manages deep linking by listening for URL changes + * and navigating accordingly using a navigator. + * + * @example + * function App() { + * useLinking(); + * + * return ; + * } + * + * // This hook will automatically handle incoming deep links and navigate + * // based on the URL, such as `yourapp://path?query=param`. + */ +export function useLinking() { + const navigator = useNavigator(); + + /** + * Handles the URL passed from deep linking and navigates to the correct screen. + * + * @param {Object} params - Parameters object. + * @param {string | null} params.url - The URL to be processed. + * + * @example + * callback({ url: 'yourapp://profile?user=123' }); + */ + function callback({url}: {url: string | null}) { + if (!url) return; + + try { + const {pathname, query} = urlParse(url, true); + + // Navigates to the parsed URL's pathname and search params + navigator.open(pathname + query); + } catch (e) { + // Handle the error (e.g., log it) + } + } + + useEffect(() => { + // Check the initial URL when the app is launched + (async function () { + try { + const url = await Linking.getInitialURL(); + + callback({url}); + } catch (e) { + // Handle the error (e.g., log it) + } + })(); + + // Listen for any URL events and handle them with the callback + const subscription = Linking.addEventListener('url', callback); + + // Cleanup the event listener when the component unmounts + return () => { + subscription.remove(); + }; + }, []); +} diff --git a/packages/app-router/src/index.ts b/packages/app-router/src/index.ts index e69de29bb2..796ce4dea6 100644 --- a/packages/app-router/src/index.ts +++ b/packages/app-router/src/index.ts @@ -0,0 +1,3 @@ +export * from './hooks'; +export * from './router'; +export * from './types'; diff --git a/packages/app-router/src/router.tsx b/packages/app-router/src/router.tsx new file mode 100644 index 0000000000..0d0977f434 --- /dev/null +++ b/packages/app-router/src/router.tsx @@ -0,0 +1,325 @@ +import {LayoutRoot, LayoutStack, Navigation} from 'react-native-navigation'; +import {Fragment} from 'react'; + +import {ComponentIdContext, RouteContext} from './context'; +import { + BottomTabRoute, + ComponentRoute, + IndexRoute, + RouteChildWithoutChildren, + Router, +} from './types'; + +/** + * Creates the initial layout object for the application. + * + * @returns {LayoutRoot} The initial layout object. + * + * @example + * const initialLayout = createInitialLayout(); + * console.log(initialLayout); // { root: {} } + */ +function createInitialLayout(): LayoutRoot { + return {root: {}}; +} + +/** + * Flattens a nested array of route objects into a flat array while preserving the `stackId` + * of parent routes and associating it with their child routes. + * + * @param {(RootRouteObject | RouteObject)[]} routes - The array of route objects to flatten. + * The array can contain both `RootRouteObject` and `RouteObject`, which may have children. + * + * @param {string} [parentStackId] - An optional `stackId` passed from a parent route. If present, + * the `stackId` will be assigned to child routes unless the child route explicitly defines its own `stackId`. + * + * @returns {Omit[]} A flat array of route objects without the `children` property, + * each with the appropriate `stackId` inherited from parent routes when necessary. + * + * @remarks + * This function works recursively, ensuring that any nested routes are flattened into a single-level array. + * The `stackId` is passed down the route hierarchy, so that child routes inherit the `stackId` from their parent + * if they don't define their own. Routes are represented without their `children` property after flattening. + * + * @example + * const routes: RouteObject[] = [ + * { + * name: 'Home', + * path: '/', + * Component: HomeComponent, + * children: [ + * { + * name: 'Profile', + * path: '/profile', + * Component: ProfileComponent, + * stackId: 'mainStack', + * }, + * ], + * }, + * ]; + * + * const flattened = flatten(routes); + * + * // Output: + * // [ + * // { name: 'Home', path: '/', Component: HomeComponent }, + * // { name: 'Profile', path: '/profile', Component: ProfileComponent, stackId: 'mainStack' } + * // ] + */ +function flatten( + routes: IndexRoute[], + parentStackId?: string, +): RouteChildWithoutChildren[] { + return routes.flatMap(route => { + // Extract children and the rest of the route properties + const {children, ...routeProps} = route as any; + + // Determine the stackId to pass to child routes + const currentStackId = + (routeProps as BottomTabRoute).stackId || parentStackId; + + // Create the flattened current route without children + const flattenedRoute = {...routeProps, stackId: currentStackId}; + + // Recursively flatten child routes + const flattenedChildren = flatten(children || [], currentStackId); + + return [flattenedRoute, ...flattenedChildren]; + }); +} + +/** + * Sets the root layout for the application and registers the app launch listener. + * + * @param {LayoutRoot} layout - The current layout object. + * @param {Route[]} routes - Array of route definitions. + * @param {Function} [onAppLaunched] - Optional callback to be called after the app is launched. + * + * @example + * setRootLayout(layout, routes, async () => { + * console.log('App launched'); + * }); + */ +function setRootLayout( + layout: LayoutRoot, + routes: RouteChildWithoutChildren[], + onAppLaunched?: () => Promise, +): void { + // If no layout has been defined, set a default stack layout with the first route + if (!Object.keys(layout.root).length) { + layout.root = { + stack: { + children: [ + { + component: { + name: routes[0]?.name!, + }, + }, + ], + }, + }; + } + + // Register the app launched listener to set the root layout + Navigation.events().registerAppLaunchedListener(async () => { + try { + await onAppLaunched?.(); + } catch { + // handle the error (e.g., log it) + } + + Navigation.setRoot(layout); + }); +} + +/** + * Adds a bottom tab to the root layout. + * + * @param {LayoutRoot} layout - The current layout object. + * @param {string} routeName - The name of the route associated with the bottom tab. + * @param {any} bottomTab - The bottom tab configuration. + * + * @example + * addBottomTabToLayout(layout, 'HomeScreen', { text: 'Home' }); + */ +function addBottomTabToLayout( + layout: LayoutRoot, + routeName: string, + bottomTab: any, + stackId?: string, +) { + const tab: LayoutStack = { + id: stackId, + children: [ + { + component: { + name: routeName, + }, + }, + ], + options: { + bottomTab, + }, + }; + + // Update the layout to include the new bottom tab + layout.root = { + bottomTabs: { + children: [...(layout.root.bottomTabs?.children ?? []), {stack: tab}], + }, + }; +} + +/** + * Renders the component for a given route. + * + * @param {Route} route - The route definition. + * @param {any} props - The properties passed to the component. + * @param {React.ComponentType} Provider - The React component to be used as a provider. + * @param {Record} routeMap - A map of route paths to route names. + * @param {React.ComponentType} ErrorBoundary - The component to be used as an error boundary. + * @returns {JSX.Element} The rendered component wrapped in the necessary providers. + * + * @example + * const renderedComponent = renderComponent( + * { path: '/home', name: 'HomeScreen', Component: HomeComponent }, + * { componentId: 'component1', __flagship_app_router_url: 'https://example.com' }, + * MyCustomProvider, + * routeMap, + * MyErrorBoundary + * ); + */ +function renderComponent( + route: ComponentRoute, + props: any, + Provider: React.ComponentType, + ErrorBoundary: React.ComponentType, + routes: RouteChildWithoutChildren[], +) { + const {componentId, APP_ROUTER_URL, ...data} = props; + + // Ensure Component is defined (safeguard against potential undefined) + const Component = route.Component!; + + /** + * Sanitizes the routes by removing `Component` and `ErrorBoundary` from the context. + * This is done to make the context lighter, as we only need to know whether a component + * exists, not store the entire component itself. + * + * @param routes - The array of route objects to sanitize. + * @returns A new array of route objects with `Component` and `ErrorBoundary` removed, + * and an additional `hasComponent` property indicating if a component was present. + */ + const sanitizedRoutes = routes.map(route => { + const {Component, ErrorBoundary, ...passRoute} = route as any; + + return { + ...passRoute, + hasComponent: !!Component, + }; + }); + + // Render the component wrapped with ErrorBoundary, Provider, RouterContext, and ComponentIdContext + return ( + + + + + + + + + + ); +} + +/** + * Registers a single route with the navigation system. + * + * @param {Route} route - The route definition. + * @param {LayoutRoot} layout - The current layout object. + * @param {Record} routeMap - A map of route paths to route names. + * @param {React.ComponentType} Provider - The React component to be used as a provider. + * + * @example + * registerRoute( + * { path: '/home', name: 'HomeScreen', Component: HomeComponent }, + * layout, + * routeMap, + * MyCustomProvider + * ); + */ +function registerRoute( + route: RouteChildWithoutChildren, + layout: LayoutRoot, + Provider: React.ComponentType, + routes: RouteChildWithoutChildren[], +): void { + const {bottomTab, ...passOptions} = (route as any).options ?? {}; + const {ErrorBoundary = Fragment, Component} = route as any; + + if (!Component) return; + + // Attach options to the component + (Component as any).options = passOptions; + + // Register the component with react-native-navigation + Navigation.registerComponent( + route.name, + () => props => + renderComponent( + route as ComponentRoute, + props, + Provider, + ErrorBoundary, + routes, + ), + () => Component, + ); + + // If the route has a bottomTab option, add it to the layout + if (bottomTab) { + addBottomTabToLayout(layout, route.name, bottomTab, route.stackId); + } +} + +/** + * Registers routes and sets the root layout for the application. + * + * @param {AppRouter} appRouter - The router configuration for the app. + * @param {Route[]} appRouter.routes - Array of route definitions. + * @param {Function} [appRouter.onAppLaunched] - Optional callback to be called after the app is launched. + * @param {React.ComponentType} [appRouter.Provider=Fragment] - Optional React component to be used as a provider. + * + * @example + * register({ + * routes: [ + * { path: '/home', name: 'HomeScreen', Component: HomeComponent }, + * { path: '/profile', name: 'ProfileScreen', Component: ProfileComponent, options: { bottomTab: { text: 'Profile' } } } + * ], + * onAppLaunched: async () => { + * console.log('App launched'); + * }, + * Provider: MyCustomProvider, + * }); + */ +function register({onAppLaunched, routes, Provider = Fragment}: Router) { + const layout = createInitialLayout(); + + const flattenedRoutes = flatten(routes); + + flattenedRoutes.forEach(route => + registerRoute(route, layout, Provider, flattenedRoutes), + ); + + setRootLayout(layout, flattenedRoutes, onAppLaunched); +} + +export {register}; diff --git a/packages/app-router/src/types.ts b/packages/app-router/src/types.ts new file mode 100644 index 0000000000..5cb9f86985 --- /dev/null +++ b/packages/app-router/src/types.ts @@ -0,0 +1,282 @@ +import {Options, OptionsBottomTab} from 'react-native-navigation'; +import URLParse from 'url-parse'; + +/** + * Represents the main router configuration object. + */ +export type Router = { + /** + * Array of routes to be registered with the router. + * + * These routes define the various paths and navigation options + * for the application. + */ + routes: IndexRoute[]; + + /** + * Optional provider component that wraps the application. + * + * If provided, this component will be used to wrap the entire app, + * useful for providing context or global state. + */ + Provider?: React.ComponentType; + + /** + * Optional callback that is executed when the app is launched. + * + * This function can perform initialization tasks like setting up + * resources, loading configurations, etc. It returns a promise that + * resolves when the app is fully ready. + */ + onAppLaunched?: () => Promise; +}; + +/** + * Provides control flow for guarding navigation. + * + * This object is passed to the `Guard` function to handle navigation + * actions such as canceling the navigation, redirecting to a different + * path, or displaying a modal. + */ +export type Next = { + /** + * Cancels the current navigation process. + */ + cancel: () => void; + + /** + * Redirects the user to a different path. + * + * @param path - The target URL or path to redirect to. + */ + redirect: (path: string) => void; + + /** + * Displays a modal component. + * + * @template T - The type of data to pass to the modal. + * @template U - The type of data the modal resolves to. + * + * @param Component - The React component to display as a modal. + * @param data - The data to pass to the modal component. + * @param options - Navigation options for configuring the modal display. + * @returns A promise that resolves when the modal is dismissed. + */ + showModal: ( + Component: React.ComponentType, + data: T, + options: Options, + ) => Promise; +}; + +/** + * Represents a guard function that handles navigation logic. + * + * Guards are invoked before navigating to a route, allowing for + * tasks like authentication checks, data fetching, or route validation. + * + * @param to - The target URL being navigated to. + * @param from - The previous URL being navigated from, or undefined if none. + * @param next - The `Next` object providing control over the navigation. + * @returns A promise that resolves when the guard completes its task. + */ +export type Guard = ( + to: URLParse, + from: URLParse | undefined, + next: Next, +) => Promise; + +/** + * Base type for route definitions, shared across different route types. + */ +export type RouteBase = { + /** + * The URL path associated with this route. + */ + path: string; + + /** + * + */ + name: string; + + /** + * Optional array of guard functions to be executed before navigating to this route. + */ + guards?: Guard[]; + + /** + * Optional nested child routes that extend the functionality of this route. + */ + children?: RouteChild[]; +}; + +/** + * Represents a route that is part of a bottom tab navigation. + */ +export type BottomTabRoute = RouteBase & { + /** + * A constant identifying this route as a bottom tab. + */ + type: 'bottomtab'; + + /** + * Navigation options specific to this route, excluding `bottomTab` options. + */ + options: Omit & {bottomTab: OptionsBottomTab}; + + /** + * The name of this route, used for identifying and navigating to the route. + */ + name: string; + + /** + * The React component to render when this route is active. + */ + Component: React.ComponentType; + + /** + * Optional error boundary component to handle any errors in the `Component`. + */ + ErrorBoundary?: React.ComponentClass; + + /** + * Identifier for the navigation stack associated with this route. + * + * Used to distinguish between different stacks in the bottom tab navigation. + */ + stackId: string; +}; + +/** + * Represents a route that triggers an action instead of rendering a component. + */ +export type ActionRoute = RouteBase & { + /** + * A constant identifying this route as an action route. + */ + type: 'action'; + + /** + * A function that performs an action when the route is navigated to. + * + * @param url - The full URL being navigated to. + * @param pathParams - Parameters parsed from the path. + * @param queryParams - Parameters parsed from the query string. + * @returns A promise that resolves when the action is completed. + */ + action: ( + url: string, + pathParams: object, + queryParams: object, + ) => Promise; +}; + +/** + * Represents a route that renders a React component. + */ +export type ComponentRoute = RouteBase & { + /** + * A constant identifying this route as a component route. + */ + type: 'component'; + + /** + * Optional navigation options specific to this route. + */ + options?: Options; + + /** + * The name of this route, used for identifying and navigating to the route. + */ + name: string; + + /** + * The React component to render when this route is active. + */ + Component: React.ComponentType; + + /** + * Optional error boundary component to handle any errors in the `Component`. + */ + ErrorBoundary?: React.ComponentClass; +}; + +/** + * Represents a top-level route that can either be a bottom tab, action, or component route. + * + * `IndexRoute` excludes child routes from `ActionRoute` and `ComponentRoute`, making it + * suitable for defining the main navigation structure. + */ +export type IndexRoute = + | BottomTabRoute + | Omit + | Omit; + +/** + * Represents a child route, either an action or component route. + */ +export type RouteChild = ActionRoute | ComponentRoute; + +/** + * Represents a child route, either an action or component route without children. + */ +export type RouteChildWithoutChildren = {stackId?: string} & ( + | Omit + | Omit +); + +/** + * Represents the data structure for a modal component. + * @template T The type of data passed to the modal. + * @template U The type of result returned by the modal. + */ +export type ModalData = { + /** + * A function that returns another function to resolve the modal with a result. + * @param componentId The unique identifier of the modal component. + * @returns A function that takes a result and returns it. + */ + resolve: (componentId: string) => (result: U) => U; + + /** + * A function that returns another function to reject or close the modal without a result. + * @param componentId The unique identifier of the modal component. + * @returns A function that closes the modal without returning a result. + */ + reject: (componentId: string) => () => void; + + /** + * The data passed to the modal component. + */ + data: T; +}; + +export type RouteMatch = { + /** + * The name of the route, used for registration with React Native Navigation + */ + name: string; + + /** + * The path pattern associated with the route + */ + path: string; + + /** + * Type representing the URL object + */ + url: string | null; + + /** + * Type representing any data associated with the router + */ + data: unknown; + + /** + * Array of routes to be registered with the router + */ + routes: (Omit & { + hasComponent: boolean; + })[]; +}; diff --git a/packages/app-router/tsconfig.json b/packages/app-router/tsconfig.json index 673a17f4ff..da1c3d144c 100644 --- a/packages/app-router/tsconfig.json +++ b/packages/app-router/tsconfig.json @@ -1,3 +1,3 @@ { - "extends": "@repo/typescript-config/base.json", + "extends": "@repo/typescript-config/react-library.json", } diff --git a/yarn.lock b/yarn.lock index d703f4b187..f8c88b8b1c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1520,10 +1520,6 @@ rxjs "^7.5.2" tslib "^2.0.0" -"@brandingbrand/code-plugin-example@link:./apps/example/coderc/plugins/plugin-example": - version "0.0.0" - uid "" - "@brandingbrand/engagement-utils@12.0.0-alpha.20": version "12.0.0-alpha.20" resolved "https://registry.yarnpkg.com/@brandingbrand/engagement-utils/-/engagement-utils-12.0.0-alpha.20.tgz#bda9959864da175bda5502bf43a44b8a41eda537" @@ -3730,11 +3726,6 @@ resolved "https://registry.yarnpkg.com/@types/npmcli__package-json/-/npmcli__package-json-4.0.4.tgz#ef3f42f4d2d235da744bb3f02dd23a2608c8ea37" integrity sha512-6QjlFUSHBmZJWuC08bz1ZCx6tm4t+7+OJXAdvM6tL2pI7n6Bh5SIp/YxQvnOLFf8MzCXs2ijyFgrzaiu1UFBGA== -"@types/parse-path@^7.0.0": - version "7.0.3" - resolved "https://registry.yarnpkg.com/@types/parse-path/-/parse-path-7.0.3.tgz#cec2da2834ab58eb2eb579122d9a1fc13bd7ef36" - integrity sha512-LriObC2+KYZD3FzCrgWGv/qufdUy4eXrxcLgQMfYXgPbLIecKIsVBaQgUPmxSSLcjmYbDTQbMgr6qr6l/eb7Bg== - "@types/parse5@^6.0.0": version "6.0.3" resolved "https://registry.yarnpkg.com/@types/parse5/-/parse5-6.0.3.tgz#705bb349e789efa06f43f128cef51240753424cb" @@ -3823,6 +3814,11 @@ resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.10.tgz#04ffa7f406ab628f7f7e97ca23e290cd8ab15efc" integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== +"@types/url-parse@^1.4.11": + version "1.4.11" + resolved "https://registry.yarnpkg.com/@types/url-parse/-/url-parse-1.4.11.tgz#01f8faa7b8bfd438e5f5efb8337a74513a15602b" + integrity sha512-FKvKIqRaykZtd4n47LbK/W/5fhQQ1X7cxxzG9A48h0BGN+S04NH7ervcCjM8tyR0lyGru83FAHSmw2ObgKoESg== + "@types/yargs-parser@*": version "21.0.3" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" @@ -4826,7 +4822,7 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@^5.4.3, buffer@^5.5.0: +buffer@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -10626,21 +10622,6 @@ parse-ms@^4.0.0: resolved "https://registry.yarnpkg.com/parse-ms/-/parse-ms-4.0.0.tgz#c0c058edd47c2a590151a718990533fd62803df4" integrity sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw== -parse-path@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/parse-path/-/parse-path-7.0.0.tgz#605a2d58d0a749c8594405d8cc3a2bf76d16099b" - integrity sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog== - dependencies: - protocols "^2.0.0" - -parse-url@^9.2.0: - version "9.2.0" - resolved "https://registry.yarnpkg.com/parse-url/-/parse-url-9.2.0.tgz#d75da32b3bbade66e4eb0763fb4851d27526b97b" - integrity sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ== - dependencies: - "@types/parse-path" "^7.0.0" - parse-path "^7.0.0" - parse5@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" @@ -10798,6 +10779,10 @@ plist@^3.0.1, plist@^3.0.5: base64-js "^1.5.1" xmlbuilder "^15.1.1" +"plugin-monorepo@link:apps/example/coderc/plugins/plugin-monorepo": + version "0.0.0" + uid "" + postcss-load-config@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" @@ -10991,11 +10976,6 @@ property-information@^6.0.0: resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.4.1.tgz#de8b79a7415fd2107dfbe65758bb2cc9dfcf60ac" integrity sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w== -protocols@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/protocols/-/protocols-2.0.1.tgz#8f155da3fc0f32644e83c5782c8e8212ccf70a86" - integrity sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q== - proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -11017,7 +10997,7 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -punycode@^2.1.0, punycode@^2.1.1: +punycode@^2.1.0: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== @@ -11214,13 +11194,6 @@ react-native-sensitive-info@5.5.8: resolved "https://registry.yarnpkg.com/react-native-sensitive-info/-/react-native-sensitive-info-5.5.8.tgz#6ebb67eed83d1c2867bd435630ef2c41eef204ed" integrity sha512-p99oaEW4QG1RdUNrkvd/c6Qdm856dQw/Rk81f9fA6Y3DlPs6ADNdU+jbPuTz3CcOUJwuKBDNenX6LR9KfmGFEg== -react-native-url-polyfill@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/react-native-url-polyfill/-/react-native-url-polyfill-2.0.0.tgz#db714520a2985cff1d50ab2e66279b9f91ffd589" - integrity sha512-My330Do7/DvKnEvwQc0WdcBnFPploYKp9CYlefDXzIdEaA+PAhDYllkvGeEroEzvc4Kzzj2O4yVdz8v6fjRvhA== - dependencies: - whatwg-url-without-unicode "8.0.0-3" - react-native-web-modal@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/react-native-web-modal/-/react-native-web-modal-1.0.1.tgz#d0e1d5fa020c88edb9258409054bec73a7726ea1" @@ -13431,7 +13404,7 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -url-parse@^1.4.3: +url-parse@^1.4.3, url-parse@^1.5.10: version "1.5.10" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== @@ -13703,25 +13676,11 @@ webidl-conversions@^4.0.2: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== -webidl-conversions@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" - integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== - whatwg-fetch@^3.0.0: version "3.6.20" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz#580ce6d791facec91d37c72890995a0b48d31c70" integrity sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg== -whatwg-url-without-unicode@8.0.0-3: - version "8.0.0-3" - resolved "https://registry.yarnpkg.com/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz#ab6df4bf6caaa6c85a59f6e82c026151d4bb376b" - integrity sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig== - dependencies: - buffer "^5.4.3" - punycode "^2.1.1" - webidl-conversions "^5.0.0" - whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" From fa1df7ea14cc0a2a5a319ff031bca47b3a8f2df1 Mon Sep 17 00:00:00 2001 From: Chris Herman Date: Tue, 24 Sep 2024 17:39:57 -0400 Subject: [PATCH 02/15] fix: cleanup dependencies --- apps/example/package.json | 8 +- packages/app-router/package.json | 2 +- packages/cli/src/actions/env.ts | 4 +- yarn.lock | 753 ++----------------------------- 4 files changed, 32 insertions(+), 735 deletions(-) diff --git a/apps/example/package.json b/apps/example/package.json index c813cab555..0389a57723 100644 --- a/apps/example/package.json +++ b/apps/example/package.json @@ -13,15 +13,9 @@ }, "dependencies": { "@brandingbrand/code-app-router": "*", - "@brandingbrand/fsapp": "12.0.0-alpha.20", - "@brandingbrand/react-native-app-restart": "0.4.0", - "@react-native-async-storage/async-storage": ">=1.23.1", "react": "18.2.0", "react-native": "0.73.9", - "react-native-device-info": "10.12.0", - "react-native-navigation": "^7.40.1", - "react-native-permissions": "4.1.1", - "react-native-sensitive-info": "5.5.8" + "react-native-navigation": "^7.40.1" }, "devDependencies": { "@babel/core": "^7.20.0", diff --git a/packages/app-router/package.json b/packages/app-router/package.json index 8046d02037..fa2788b334 100644 --- a/packages/app-router/package.json +++ b/packages/app-router/package.json @@ -12,7 +12,7 @@ }, "types": "src/index.ts", "dependencies": { - "path-to-regexp": "^7.1.0", + "path-to-regexp": "^8.1.0", "url-parse": "^1.5.10" }, "peerDependencies": { diff --git a/packages/cli/src/actions/env.ts b/packages/cli/src/actions/env.ts index c74aca4acd..dc9b5e1325 100644 --- a/packages/cli/src/actions/env.ts +++ b/packages/cli/src/actions/env.ts @@ -30,9 +30,11 @@ export default defineAction(async () => { // If the dependency is not found, throw a warning if (index === -1) { - throw Error( + logger.debug( "Missing Configuration: Unable to locate the '@brandingbrand/fsapp' dependency. Please note that the absence of this dependency will prevent you from leveraging the benefits of multi-tenant typed environments.", ); + + return; } // Resolve the environment directory path based on the configuration diff --git a/yarn.lock b/yarn.lock index f8c88b8b1c..c52215d116 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,16 +7,6 @@ resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== -"@adobe/react-native-acpanalytics@^1.2.6": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@adobe/react-native-acpanalytics/-/react-native-acpanalytics-1.3.0.tgz#c4b4da58b469ec6dab9817ce99a8a6232df73ad9" - integrity sha512-cG9Rer1Q4WYABVGK+5EltykB57hglME53LrweHU14A2RQr9MABRe0fUtsupfEYWHgNmcK7YfHMVYhlmH8qa/aQ== - -"@adobe/react-native-acpcore@^1.2.5": - version "1.5.1" - resolved "https://registry.yarnpkg.com/@adobe/react-native-acpcore/-/react-native-acpcore-1.5.1.tgz#4d337d9bc515d21035716f9e99f48bfa1ba239e7" - integrity sha512-ldpdanpYL0cFJ4pTYM46ke3AAamuoX6R8aJeAZFX7tKFzTzTry3XUVkY1JVLVJaotX2tet+qq9HFW6L8HhIdUg== - "@alcalzone/ansi-tokenize@^0.1.3": version "0.1.3" resolved "https://registry.yarnpkg.com/@alcalzone/ansi-tokenize/-/ansi-tokenize-0.1.3.tgz#9f89839561325a8e9a0c32360b8d17e48489993f" @@ -1424,7 +1414,7 @@ resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.13", "@babel/runtime@^7.15.4", "@babel/runtime@^7.20.0", "@babel/runtime@^7.7.7", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.20.0", "@babel/runtime@^7.8.4": version "7.23.9" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.9.tgz#47791a15e4603bb5f905bc0753801cf21d6345f7" integrity sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw== @@ -1511,180 +1501,6 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@brandingbrand/cargo-hold@12.0.0-alpha.20": - version "12.0.0-alpha.20" - resolved "https://registry.yarnpkg.com/@brandingbrand/cargo-hold/-/cargo-hold-12.0.0-alpha.20.tgz#19f3a40a9c91fe1e3d957559f8337c8da380f078" - integrity sha512-F5LjUG02DVS3pp1TYDwDK5pL2PFd7OmaU7Te1Hc0bXLpVr81BfxbsiK6a7nqCfH7RRM2/f7A5tYTBiy/Jhfgqw== - dependencies: - fast-deep-equal "^3.1.3" - rxjs "^7.5.2" - tslib "^2.0.0" - -"@brandingbrand/engagement-utils@12.0.0-alpha.20": - version "12.0.0-alpha.20" - resolved "https://registry.yarnpkg.com/@brandingbrand/engagement-utils/-/engagement-utils-12.0.0-alpha.20.tgz#bda9959864da175bda5502bf43a44b8a41eda537" - integrity sha512-GXIEeAZ9ZsemzymQumMqI+EAebEd17VZ0yl5vn2PJCOhye6zHf8MvF6icHaJUy864Kzdq6/DJiuejm6j46GbEw== - -"@brandingbrand/fsapp@12.0.0-alpha.20": - version "12.0.0-alpha.20" - resolved "https://registry.yarnpkg.com/@brandingbrand/fsapp/-/fsapp-12.0.0-alpha.20.tgz#053af70b8184a18f1a15cfa9aaacdb40da340929" - integrity sha512-LdGi9YM7QDlcU047tMDc7JXplvTNzQ3hYdzvHJPFzYwMR75hmCx6UaIBzj3XqrCIVnjCBMq1Yz43Z+Y1Bjb8jg== - dependencies: - "@adobe/react-native-acpanalytics" "^1.2.6" - "@adobe/react-native-acpcore" "^1.2.5" - "@brandingbrand/cargo-hold" "12.0.0-alpha.20" - "@brandingbrand/engagement-utils" "12.0.0-alpha.20" - "@brandingbrand/fscommerce" "12.0.0-alpha.20" - "@brandingbrand/fsengage" "12.0.0-alpha.20" - "@brandingbrand/fsenv" "12.0.0-alpha.20" - "@brandingbrand/fslinker" "12.0.0-alpha.20" - "@brandingbrand/fsnetwork" "12.0.0-alpha.20" - "@brandingbrand/react-cargo-hold" "12.0.0-alpha.20" - "@brandingbrand/react-linker" "12.0.0-alpha.20" - "@brandingbrand/react-native-google-analytics" "^2.2.0" - "@brandingbrand/standard-object" "12.0.0-alpha.20" - "@brandingbrand/standard-types" "12.0.0-alpha.20" - "@brandingbrand/types-location" "12.0.0-alpha.20" - "@leanplum/react-native-sdk" "1.3.0" - "@loadable/component" "^5.14.1" - autobind-decorator "^2.4.0" - axios "0.24.0" - cookie-parser "^1.4.5" - decimal.js "^10.0.1" - express "^4.17.1" - fast-deep-equal "^3.1.3" - fs-extra "^10.0.0" - history "^4.10.1" - lodash-es "^4.17.10" - observable-hooks "^4.2.0" - path-to-regexp "^1.7.0" - qs "^6.9.7" - react-dom "18.1.0" - react-helmet "^6.1.0" - react-native-cookies "^3.3.0" - react-native-localize "^2.2.4" - react-native-web-modal "^1.0.1" - react-redux "^7.0.0" - react-router "^5.2.1" - react-router-dom "^5.3.0" - redux "^4.0.5" - redux-immutable-state-invariant "^2.1.0" - redux-logger "^3.0.6" - redux-thunk "^2.2.0" - reflect-metadata "^0.1.13" - rxjs "^7.5.2" - ts-toolbelt "^9.6.0" - tslib "^2.0.0" - url-parse "^1.4.3" - -"@brandingbrand/fscommerce@12.0.0-alpha.20": - version "12.0.0-alpha.20" - resolved "https://registry.yarnpkg.com/@brandingbrand/fscommerce/-/fscommerce-12.0.0-alpha.20.tgz#e7cf99e36f0f2c4c0825990ad1cf89d75e8a5f27" - integrity sha512-DUuS/PTw8Q/8+QCLmO+kB0ehNSJCNQpKeKrVunkcNy8L5fbZeIZM4T+JqzaymyjXAo/mbYS8lJs1Lo8PdPGESA== - dependencies: - decimal.js "^10.0.1" - lodash-es "^4.17.10" - tslib "^2.0.0" - -"@brandingbrand/fsengage@12.0.0-alpha.20": - version "12.0.0-alpha.20" - resolved "https://registry.yarnpkg.com/@brandingbrand/fsengage/-/fsengage-12.0.0-alpha.20.tgz#d1b5856f26d34f20b013efced2c8d9f7b1f0ffcb" - integrity sha512-K8b/8x8WdxIRvwdUN/ZKrYXOKa5jSxvM/tqjoG7eiuY00WLTEtWGUnCQp2tV/bD2sHffnUqBzyTJlVTmFLqREw== - dependencies: - "@adobe/react-native-acpanalytics" "^1.2.6" - "@adobe/react-native-acpcore" "^1.2.5" - "@brandingbrand/fslinker" "12.0.0-alpha.20" - "@brandingbrand/fsnetwork" "12.0.0-alpha.20" - "@brandingbrand/react-native-google-analytics" "^2.2.0" - "@brandingbrand/types-location" "12.0.0-alpha.20" - "@leanplum/react-native-sdk" "1.3.0" - axios "0.24.0" - decimal.js "^10.0.1" - reflect-metadata "^0.1.13" - tslib "^2.0.0" - url-parse "^1.4.3" - -"@brandingbrand/fsenv@12.0.0-alpha.20": - version "12.0.0-alpha.20" - resolved "https://registry.yarnpkg.com/@brandingbrand/fsenv/-/fsenv-12.0.0-alpha.20.tgz#2d28289092a06b33e247e7d8a294caed2a399e99" - integrity sha512-u1Z/GdBK4LT8u4mG396l8Mr23w4AfIFFk6h4dMmNF9CQCLf+5vTnAzSufbXBqKynrcBOmegydd7TZUuzP+EbuQ== - dependencies: - "@brandingbrand/standard-object" "12.0.0-alpha.20" - ts-toolbelt "^9.6.0" - tslib "^2.0.0" - -"@brandingbrand/fslinker@12.0.0-alpha.20": - version "12.0.0-alpha.20" - resolved "https://registry.yarnpkg.com/@brandingbrand/fslinker/-/fslinker-12.0.0-alpha.20.tgz#64d48047b8481ae9527bf9e8753ac28cfac60696" - integrity sha512-cKg21AVMdpGsqBLdeMZVPzBpijyKEss5Spm7ewuuGHxXbSslFyG1tIvNFpvJ5j/RPYA0Ezx65ffPhWHjDH0FCA== - dependencies: - reflect-metadata "^0.1.13" - tslib "^2.0.0" - -"@brandingbrand/fsnetwork@12.0.0-alpha.20": - version "12.0.0-alpha.20" - resolved "https://registry.yarnpkg.com/@brandingbrand/fsnetwork/-/fsnetwork-12.0.0-alpha.20.tgz#8f4aafd29f66f4b44cfd9bf06b42fcd174980216" - integrity sha512-zT31qkTNe0Fh91rqlS5LEtPp3XdXnqejG08fhALiuh8fZcz/JK69IgrlYi4XXyct+T6oxHdzGYU4VJJhoUUG8Q== - dependencies: - "@brandingbrand/fslinker" "12.0.0-alpha.20" - axios "0.24.0" - reflect-metadata "^0.1.13" - tslib "^2.0.0" - -"@brandingbrand/react-cargo-hold@12.0.0-alpha.20": - version "12.0.0-alpha.20" - resolved "https://registry.yarnpkg.com/@brandingbrand/react-cargo-hold/-/react-cargo-hold-12.0.0-alpha.20.tgz#dc22f6e89402ae64f45728275effe3b83083799c" - integrity sha512-N4ThTI1uKKeJWUEoWEwZK2ZfZeYtk0Sotm//tzHy+F8x28UTg1OFSOEKo7swvGpjqlQu/T9LAoqFh/YynLnrKg== - dependencies: - "@brandingbrand/cargo-hold" "12.0.0-alpha.20" - "@brandingbrand/fslinker" "12.0.0-alpha.20" - "@brandingbrand/react-linker" "12.0.0-alpha.20" - fast-deep-equal "^3.1.3" - reflect-metadata "^0.1.13" - rxjs "^7.5.2" - tslib "^2.0.0" - -"@brandingbrand/react-linker@12.0.0-alpha.20": - version "12.0.0-alpha.20" - resolved "https://registry.yarnpkg.com/@brandingbrand/react-linker/-/react-linker-12.0.0-alpha.20.tgz#db94163ac4dcf8db5e931a225756e0222850beb8" - integrity sha512-7wUSME+rLFHhMfZCvkudEFveofZTwhI1QIKvpk3a8YC5N8lpkvwzWhN/h9/BZVpaV9RDpJ67SYeoVPvOj8FNMA== - dependencies: - "@brandingbrand/fslinker" "12.0.0-alpha.20" - reflect-metadata "^0.1.13" - tslib "^2.0.0" - -"@brandingbrand/react-native-app-restart@0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@brandingbrand/react-native-app-restart/-/react-native-app-restart-0.4.0.tgz#f8fee4991dedcaaf7d8623b73061901317756ef3" - integrity sha512-4KbGl6+ZGzeZu7/i+Q8gz1pm91va4HHoVJQzAB9I/gRL8MdAfWURt01fDqL5uqV36AVN/Ymhv1i4EPsG8rYVYw== - -"@brandingbrand/react-native-google-analytics@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@brandingbrand/react-native-google-analytics/-/react-native-google-analytics-2.2.0.tgz#2b4892cbe93424e0e9d9705398f0de514e413c47" - integrity sha512-+iUxUulpgg9/huac8QsmJIhbDkdJcXm3bfr5ILsekjTfYEiM4Qcx2zFU8CH/bYWp8hWcQKwh1YRbnB98sVFzFQ== - -"@brandingbrand/standard-object@12.0.0-alpha.20": - version "12.0.0-alpha.20" - resolved "https://registry.yarnpkg.com/@brandingbrand/standard-object/-/standard-object-12.0.0-alpha.20.tgz#a3784023de44dca2a6792e31148034d424813dc7" - integrity sha512-lqMPd14NaVnLPkRAOs9bfvylEu8Xdb5U6m3vY5TD4yxRP40CD3ntc7ibchz9vfuyIJaDgLofvL2vJvblGMChKg== - dependencies: - ts-toolbelt "^9.6.0" - tslib "^2.0.0" - -"@brandingbrand/standard-types@12.0.0-alpha.20": - version "12.0.0-alpha.20" - resolved "https://registry.yarnpkg.com/@brandingbrand/standard-types/-/standard-types-12.0.0-alpha.20.tgz#5dd87f4c95507e31957521ddfa7f69811d92f984" - integrity sha512-PENonGVSQ/ljqdIJQw3Z0fyNudiej4Lqjv9F073mW72NoHbus1KMiYLSQXGo20wjDRRkAVJUjdYKEuLUXLEaMw== - dependencies: - tslib "^2.0.0" - -"@brandingbrand/types-location@12.0.0-alpha.20": - version "12.0.0-alpha.20" - resolved "https://registry.yarnpkg.com/@brandingbrand/types-location/-/types-location-12.0.0-alpha.20.tgz#e78cf90835b4acc589a92257ae432523bb8d87fa" - integrity sha512-/4t21eA60izvaATKZb1/W+NYzFVgnE6SJ3CO1wBssEQ9ooLmmeG7SXFwBHvaAsKYnLbm8c5qYcrX47ZPyhGUnw== - dependencies: - tslib "^2.0.0" - "@changesets/apply-release-plan@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@changesets/apply-release-plan/-/apply-release-plan-7.0.0.tgz#ce3c3dfc5720550a5d592b54ad2f411f816ec5ff" @@ -2290,27 +2106,6 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.56.0.tgz#ef20350fec605a7f7035a01764731b2de0f3782b" integrity sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A== -"@expo/config-plugins@^4.0.6": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-4.1.5.tgz#9d357d2cda9c095e511b51583ede8a3b76174068" - integrity sha512-RVvU40RtZt12HavuDAe+LDIq9lHj7sheOfMEHdmpJ/uTA8pgvkbc56XF6JHQD+yRr6+uhhb+JnAasGq49dsQbw== - dependencies: - "@expo/config-types" "^45.0.0" - "@expo/json-file" "8.2.36" - "@expo/plist" "0.0.18" - "@expo/sdk-runtime-versions" "^1.0.0" - "@react-native/normalize-color" "^2.0.0" - chalk "^4.1.2" - debug "^4.3.1" - find-up "~5.0.0" - getenv "^1.0.0" - glob "7.1.6" - resolve-from "^5.0.0" - semver "^7.3.5" - slash "^3.0.0" - xcode "^3.0.1" - xml2js "0.4.23" - "@expo/config-plugins@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-7.8.4.tgz#533b5d536c1dc8b5544d64878b51bda28f2e1a1f" @@ -2334,11 +2129,6 @@ xcode "^3.0.1" xml2js "0.6.0" -"@expo/config-types@^45.0.0": - version "45.0.0" - resolved "https://registry.yarnpkg.com/@expo/config-types/-/config-types-45.0.0.tgz#963c2fdce8fbcbd003758b92ed8a25375f437ef6" - integrity sha512-/QGhhLWyaGautgEyU50UJr5YqKJix5t77ePTwreOVAhmZH+ff3nrrtYTTnccx+qF08ZNQmfAyYMCD3rQfzpiJA== - "@expo/config-types@^50.0.0-alpha.1": version "50.0.0" resolved "https://registry.yarnpkg.com/@expo/config-types/-/config-types-50.0.0.tgz#b534d3ec997ec60f8af24f6ad56244c8afc71a0b" @@ -2357,15 +2147,6 @@ p-limit "^3.1.0" resolve-from "^5.0.0" -"@expo/json-file@8.2.36": - version "8.2.36" - resolved "https://registry.yarnpkg.com/@expo/json-file/-/json-file-8.2.36.tgz#62a505cb7f30a34d097386476794680a3f7385ff" - integrity sha512-tOZfTiIFA5KmMpdW9KF7bc6CFiGjb0xnbieJhTGlHrLL+ps2G0OkqmuZ3pFEXBOMnJYUVpnSy++52LFxvpa5ZQ== - dependencies: - "@babel/code-frame" "~7.10.4" - json5 "^1.0.1" - write-file-atomic "^2.3.0" - "@expo/json-file@~8.3.0": version "8.3.0" resolved "https://registry.yarnpkg.com/@expo/json-file/-/json-file-8.3.0.tgz#fc84af77b532a4e9bfb5beafd0e3b7f692b6bd7e" @@ -2375,15 +2156,6 @@ json5 "^2.2.2" write-file-atomic "^2.3.0" -"@expo/plist@0.0.18": - version "0.0.18" - resolved "https://registry.yarnpkg.com/@expo/plist/-/plist-0.0.18.tgz#9abcde78df703a88f6d9fa1a557ee2f045d178b0" - integrity sha512-+48gRqUiz65R21CZ/IXa7RNBXgAI/uPSdvJqoN9x1hfL44DNbUoWHgHiEXTx7XelcATpDwNTz6sHLfy0iNqf+w== - dependencies: - "@xmldom/xmldom" "~0.7.0" - base64-js "^1.2.3" - xmlbuilder "^14.0.0" - "@expo/plist@^0.1.0": version "0.1.0" resolved "https://registry.yarnpkg.com/@expo/plist/-/plist-0.1.0.tgz#eabc95f951d14e10c87fd0443ee01d567371f058" @@ -2809,22 +2581,6 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@leanplum/react-native-sdk@1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@leanplum/react-native-sdk/-/react-native-sdk-1.3.0.tgz#b2524e58de8e4e1eb76150ecfb730749772d8a02" - integrity sha512-ErHL52OLkXapUYjNDPbwlKdExIWij/5Adzy/zmDldyZA27sRnceWw91w/iO1BuLxysQefyauJFDBuFG+GZn/gg== - dependencies: - "@expo/config-plugins" "^4.0.6" - -"@loadable/component@^5.14.1": - version "5.16.3" - resolved "https://registry.yarnpkg.com/@loadable/component/-/component-5.16.3.tgz#3fc96d48defd8ff47aa624b8ce7f70248943e102" - integrity sha512-2mVvHs2988oVX2/zM0y6nYhJ4rTVHhkhRnpupBA0Rjl5tS8op9uSR4u5SLVfMLxzpspr2UiIBQD+wEuMsuq4Dg== - dependencies: - "@babel/runtime" "^7.7.7" - hoist-non-react-statics "^3.3.1" - react-is "^16.12.0" - "@manypkg/find-root@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@manypkg/find-root/-/find-root-1.1.0.tgz#a62d8ed1cd7e7d4c11d9d52a8397460b5d4ad29f" @@ -2974,13 +2730,6 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@react-native-async-storage/async-storage@>=1.23.1": - version "1.24.0" - resolved "https://registry.yarnpkg.com/@react-native-async-storage/async-storage/-/async-storage-1.24.0.tgz#888efbc62a26f7d9464b32f4d3027b7f2771999b" - integrity sha512-W4/vbwUOYOjco0x3toB8QCr7EjIP6nE9G7o8PMguvvjYT5Awg09lyV4enACRx4s++PPulBiBSjL0KTFx2u0Z/g== - dependencies: - merge-options "^3.0.4" - "@react-native-community/cli-clean@12.3.7": version "12.3.7" resolved "https://registry.yarnpkg.com/@react-native-community/cli-clean/-/cli-clean-12.3.7.tgz#303ddf1c930918a8bdc4cc58fe0ac2dd05603cd5" @@ -3618,14 +3367,6 @@ dependencies: "@types/unist" "*" -"@types/hoist-non-react-statics@^3.3.0": - version "3.3.5" - resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz#dab7867ef789d87e2b4b0003c9d65c49cc44a494" - integrity sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg== - dependencies: - "@types/react" "*" - hoist-non-react-statics "^3.3.0" - "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.6" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" @@ -3741,16 +3482,6 @@ resolved "https://registry.yarnpkg.com/@types/react-native-asset/-/react-native-asset-2.0.2.tgz#d11aa5fdfffed109c3d747b2d4bc1510134e1ff0" integrity sha512-L4Am0zR+TqVaiY7E5xIkf1zgpvtrV6cwqhTUpD7JE4RVyQJMKXC0chx0V4891kDo9XHJr1HEtOM+f9xngNFpPQ== -"@types/react-redux@^7.1.20": - version "7.1.33" - resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.33.tgz#53c5564f03f1ded90904e3c90f77e4bd4dc20b15" - integrity sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg== - dependencies: - "@types/hoist-non-react-statics" "^3.3.0" - "@types/react" "*" - hoist-non-react-statics "^3.3.0" - redux "^4.0.0" - "@types/react-test-renderer@^18.0.0": version "18.0.7" resolved "https://registry.yarnpkg.com/@types/react-test-renderer/-/react-test-renderer-18.0.7.tgz#2cfe657adb3688cdf543995eceb2e062b5a68728" @@ -4098,7 +3829,7 @@ resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== -"@xmldom/xmldom@~0.7.0", "@xmldom/xmldom@~0.7.7": +"@xmldom/xmldom@~0.7.7": version "0.7.13" resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.7.13.tgz#ff34942667a4e19a9f4a0996a76814daac364cf3" integrity sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g== @@ -4110,7 +3841,7 @@ abort-controller@^3.0.0: dependencies: event-target-shim "^5.0.0" -accepts@^1.3.7, accepts@~1.3.5, accepts@~1.3.7, accepts@~1.3.8: +accepts@^1.3.7, accepts@~1.3.5, accepts@~1.3.7: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== @@ -4290,11 +4021,6 @@ array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1: call-bind "^1.0.5" is-array-buffer "^3.0.4" -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - array-includes@^3.1.6, array-includes@^3.1.7: version "3.1.7" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" @@ -4519,23 +4245,11 @@ auto-bind@^5.0.1: resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-5.0.1.tgz#50d8e63ea5a1dddcb5e5e36451c1a8266ffbb2ae" integrity sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg== -autobind-decorator@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/autobind-decorator/-/autobind-decorator-2.4.0.tgz#ea9e1c98708cf3b5b356f7cf9f10f265ff18239c" - integrity sha512-OGYhWUO72V6DafbF8PM8rm3EPbfuyMZcJhtm5/n26IDwO18pohE4eNazLoCGhPiXOCD0gEGmrbU3849QvM8bbw== - available-typed-arrays@^1.0.5, available-typed-arrays@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz#ac812d8ce5a6b976d738e1c45f08d0b00bc7d725" integrity sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg== -axios@0.24.0: - version "0.24.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.24.0.tgz#804e6fa1e4b9c5288501dd9dff56a7a0940d20d6" - integrity sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA== - dependencies: - follow-redirects "^1.14.4" - axobject-query@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-4.0.0.tgz#04a4c90dce33cc5d606c76d6216e3b250ff70dab" @@ -4713,24 +4427,6 @@ bl@^5.0.0: inherits "^2.0.4" readable-stream "^3.4.0" -body-parser@1.20.2: - version "1.20.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" - integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== - dependencies: - bytes "3.1.2" - content-type "~1.0.5" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.11.0" - raw-body "2.5.2" - type-is "~1.6.18" - unpipe "1.0.0" - boolbase@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" @@ -4850,11 +4546,6 @@ bytes@3.0.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - cac@^6.7.12: version "6.7.14" resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" @@ -5282,18 +4973,6 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4, content-type@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - convert-source-map@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" @@ -5304,25 +4983,7 @@ convert-to-spaces@^2.0.1: resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz#61a6c98f8aa626c16b296b862a91412a33bceb6b" integrity sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ== -cookie-parser@^1.4.5: - version "1.4.6" - resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.4.6.tgz#3ac3a7d35a7a03bbc7e365073a26074824214594" - integrity sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA== - dependencies: - cookie "0.4.1" - cookie-signature "1.0.6" - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" - integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== - -cookie@0.6.0, cookie@^0.6.0: +cookie@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== @@ -5487,11 +5148,6 @@ decamelize@^1.1.0, decamelize@^1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== -decimal.js@^10.0.1: - version "10.4.3" - resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" - integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== - decode-named-character-reference@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz#daabac9690874c394c81e4162a0304b35d824f0e" @@ -5511,11 +5167,6 @@ dedent@^1.0.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== -deep-diff@^0.3.5: - version "0.3.8" - resolved "https://registry.yarnpkg.com/deep-diff/-/deep-diff-0.3.8.tgz#c01de63efb0eec9798801d40c7e0dae25b582c84" - integrity sha512-yVn6RZmHiGnxRKR9sJb3iVV2XTF1Ghh2DiWRZ3dMnGc43yUdWWF/kX6lQyk3+P84iprfWKU/8zFTrlkvtFm1ug== - deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" @@ -6468,43 +6119,6 @@ expect@^29.0.0, expect@^29.7.0: jest-message-util "^29.7.0" jest-util "^29.7.0" -express@^4.17.1: - version "4.19.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" - integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.2" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.6.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.2.0" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.7" - qs "6.11.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - expressive-code@^0.32.3: version "0.32.3" resolved "https://registry.yarnpkg.com/expressive-code/-/expressive-code-0.32.3.tgz#d40d7d46129b0e5d473775af21a704078ad96ad8" @@ -6646,19 +6260,6 @@ finalhandler@1.1.2: statuses "~1.5.0" unpipe "~1.0.0" -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - find-cache-dir@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" @@ -6733,11 +6334,6 @@ flow-parser@^0.206.0: resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.206.0.tgz#f4f794f8026535278393308e01ea72f31000bfef" integrity sha512-HVzoK3r6Vsg+lKvlIZzaWNBVai+FXTX1wdYhz/wVlH13tb/gOdLXmlTqy6odmTBhT5UoWUbq0k8263Qhr9d88w== -follow-redirects@^1.14.4: - version "1.15.6" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" - integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== - for-each@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -6768,11 +6364,6 @@ format-package@^7.0.0: sort-scripts "^1.0.1" yargs "^17.3.1" -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - fp-ts@^2.16.2: version "2.16.2" resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-2.16.2.tgz#7faa90f6fc2e8cf84c711d2c4e606afe2be9e342" @@ -7426,19 +7017,7 @@ hermes-profile-transformer@^0.0.6: dependencies: source-map "^0.7.3" -history@^4.10.1, history@^4.9.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" - integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== - dependencies: - "@babel/runtime" "^7.1.2" - loose-envify "^1.2.0" - resolve-pathname "^3.0.0" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - value-equal "^1.0.1" - -hoist-non-react-statics@3.x.x, hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: +hoist-non-react-statics@3.x.x: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== @@ -7518,7 +7097,7 @@ husky@>=7: resolved "https://registry.yarnpkg.com/husky/-/husky-9.0.11.tgz#fc91df4c756050de41b3e478b2158b87c1e79af9" integrity sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw== -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: +iconv-lite@^0.4.24, iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -7676,7 +7255,7 @@ internal-slot@^1.0.5, internal-slot@^1.0.7: hasown "^2.0.0" side-channel "^1.0.4" -invariant@^2.1.0, invariant@^2.2.4: +invariant@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== @@ -7688,11 +7267,6 @@ io-ts@^2.2.21: resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-2.2.21.tgz#4ef754176f7082a1099d04c7d5c4ea53267c530a" integrity sha512-zz2Z69v9ZIC3mMLYWIeoUcwWD6f+O7yP92FMVVaXEOSZH1jnVBmET/urd/uoarD1WGBY4rCj8TAyMPzsGNzMFQ== -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - is-alphabetical@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz#01072053ea7c1036df3c7d19a6daaec7f19e789b" @@ -7930,11 +7504,6 @@ is-plain-obj@^1.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== -is-plain-obj@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - is-plain-obj@^4.0.0, is-plain-obj@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" @@ -8093,11 +7662,6 @@ is-wsl@^3.0.0: dependencies: is-inside-container "^1.0.0" -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" @@ -8684,12 +8248,7 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json-stringify-safe@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== - -json5@^1.0.1, json5@^1.0.2: +json5@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== @@ -8855,11 +8414,6 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash-es@^4.17.10: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" - integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== - lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" @@ -8936,7 +8490,7 @@ longest-streak@^3.0.0: resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-3.1.0.tgz#62fa67cd958742a1574af9f39866364102d90cd4" integrity sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g== -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -9276,11 +8830,6 @@ mdast-util-to-string@^4.0.0: dependencies: "@types/mdast" "^4.0.0" -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - memoize-one@^5.0.0: version "5.2.1" resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" @@ -9310,18 +8859,6 @@ merge-anything@5.1.7: dependencies: is-what "^4.1.8" -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== - -merge-options@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/merge-options/-/merge-options-3.0.4.tgz#84709c2aa2a4b24c1981f66c179fe5565cc6dbb7" - integrity sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ== - dependencies: - is-plain-obj "^2.1.0" - merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" @@ -9332,11 +8869,6 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -methods@~1.1.2: - version "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.80.9: version "0.80.9" resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.80.9.tgz#7051ba377b7d2140abd23f4846bbbb1e81fea99b" @@ -9919,7 +9451,7 @@ mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.27, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.27, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -10360,11 +9892,6 @@ object.values@^1.1.6, object.values@^1.1.7: define-properties "^1.2.0" es-abstract "^1.22.1" -observable-hooks@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/observable-hooks/-/observable-hooks-4.2.3.tgz#69e3353caafd7887ad9030bd440b053304e8d2d1" - integrity sha512-d6fYTIU+9sg1V+CT0GhgoE/ntjIqcy9DGaYGE6ELGVP4ojaWIEsaLvL/05hLOM+AL7aySN4DCTLvj6dDF9T8XA== - on-finished@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" @@ -10695,27 +10222,15 @@ path-scurry@^1.11.1: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - -path-to-regexp@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== - dependencies: - isarray "0.0.1" - path-to-regexp@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.1.tgz#d54934d6798eb9e5ef14e7af7962c945906918e5" integrity sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw== -path-to-regexp@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-7.2.0.tgz#3d9cc9d46527e2ce2ef7b2cf696aad3cd1ae4f2b" - integrity sha512-0W4AcUxPpFlcS8ql8ZEmFwaI0X5WshUVAFdXe3PBurrt18DK8bvSS+UKHvJUAfGILco/nTtc/E4LcPNfVysfwQ== +path-to-regexp@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-8.1.0.tgz#4d687606ed0be8ed512ba802eb94d620cb1a86f0" + integrity sha512-Bqn3vc8CMHty6zuD+tG23s6v2kwxslHEhTj4eYaVKGIEB+YX/2wd0/rgXLFD9G9id9KCtbVy/3ZgmvZjpa0UdQ== path-type@^4.0.0: version "4.0.0" @@ -10962,7 +10477,7 @@ prompts@^2.0.1, prompts@^2.4.2: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@15.x.x, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@15.x.x, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -10976,14 +10491,6 @@ property-information@^6.0.0: resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.4.1.tgz#de8b79a7415fd2107dfbe65758bb2cc9dfcf60ac" integrity sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w== -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -11007,20 +10514,6 @@ pure-rand@^6.0.0: resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.4.tgz#50b737f6a925468679bff00ad20eade53f37d5c7" integrity sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA== -qs@6.11.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" - -qs@^6.9.7: - version "6.11.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" - integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== - dependencies: - side-channel "^1.0.4" - querystringify@^2.1.1: version "2.2.0" resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" @@ -11053,16 +10546,6 @@ range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" - integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -11086,40 +10569,17 @@ react-devtools-core@^4.27.7: shell-quote "^1.6.1" ws "^7" -react-dom@18.1.0: - version "18.1.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.1.0.tgz#7f6dd84b706408adde05e1df575b3a024d7e8a2f" - integrity sha512-fU1Txz7Budmvamp7bshe4Zi32d0ll7ect+ccxNu9FlObT605GOEB8BfO4tmRJ39R5Zj831VCpvQ05QPBW5yb+w== - dependencies: - loose-envify "^1.1.0" - scheduler "^0.22.0" - -react-fast-compare@^3.1.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49" - integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== - -react-helmet@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/react-helmet/-/react-helmet-6.1.0.tgz#a750d5165cb13cf213e44747502652e794468726" - integrity sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw== - dependencies: - object-assign "^4.1.1" - prop-types "^15.7.2" - react-fast-compare "^3.1.1" - react-side-effect "^2.1.0" - -react-is@^16.12.0, react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - "react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0, react-is@^18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== -react-is@^17.0.1, react-is@^17.0.2: +react-is@^16.13.1, react-is@^16.7.0: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^17.0.1: version "17.0.2" resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== @@ -11156,23 +10616,6 @@ react-native-bootsplash@5.4.0, react-native-bootsplash@^5.4.0: ts-dedent "^2.2.0" xml-formatter "^3.6.0" -react-native-cookies@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/react-native-cookies/-/react-native-cookies-3.3.0.tgz#527f65eb2d8a7a000107706bb11beb57f511e701" - integrity sha512-GobKo8Kvyuif6ROj6rDAjQJpCSLazcZl6AgZb1z7ldB9FrMtetQzXvIehS0QcwbpnXWyJzXJaY0yrlDjFz+NaA== - dependencies: - invariant "^2.1.0" - -react-native-device-info@10.12.0: - version "10.12.0" - resolved "https://registry.yarnpkg.com/react-native-device-info/-/react-native-device-info-10.12.0.tgz#be4e71cbcc9a05e8643b1a419a4450d4cef9bbcc" - integrity sha512-gnBkjyZNEqRd+5BNrdzuvmlraHTCH/to2x0Gp9rtDt0O9xWWW1MTYohUVWX9A0Ad2HVYcGanDCIvjWp4ngMZFg== - -react-native-localize@^2.2.4: - version "2.2.6" - resolved "https://registry.yarnpkg.com/react-native-localize/-/react-native-localize-2.2.6.tgz#484f8c700bc629f230066e819265f80f6dd3ef58" - integrity sha512-EZETlC1ZlW/4g6xfsNCwAkAw5BDL2A6zk/08JjFR/GRGxYuKRD7iP1hHn1+h6DEu+xROjPpoNeXfMER2vkTVIQ== - react-native-navigation@^7.40.1: version "7.40.1" resolved "https://registry.yarnpkg.com/react-native-navigation/-/react-native-navigation-7.40.1.tgz#774a3cf5e6a98c9847519f3f427c487dd2ea5c3b" @@ -11184,21 +10627,11 @@ react-native-navigation@^7.40.1: react-lifecycles-compat "2.0.0" tslib "1.9.3" -react-native-permissions@4.1.1, react-native-permissions@^4.1.1: +react-native-permissions@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/react-native-permissions/-/react-native-permissions-4.1.1.tgz#6c185f9ec45069fa14cf8992bed6b67fc8981478" integrity sha512-wdIHMwmDZ6pRVsgAgF7mn/pJEuJd5wJDGENqvFDJs2lW4BSZeN++ZFsA6FgOqUs/2276Oj7rslQgVaxdOsi6yw== -react-native-sensitive-info@5.5.8: - version "5.5.8" - resolved "https://registry.yarnpkg.com/react-native-sensitive-info/-/react-native-sensitive-info-5.5.8.tgz#6ebb67eed83d1c2867bd435630ef2c41eef204ed" - integrity sha512-p99oaEW4QG1RdUNrkvd/c6Qdm856dQw/Rk81f9fA6Y3DlPs6ADNdU+jbPuTz3CcOUJwuKBDNenX6LR9KfmGFEg== - -react-native-web-modal@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/react-native-web-modal/-/react-native-web-modal-1.0.1.tgz#d0e1d5fa020c88edb9258409054bec73a7726ea1" - integrity sha512-dFb6EAsayRQxS7GLsXVJn1G44xvU6/3cemoKx1Wgfiu/9DlPcqR30xCloJ3OBuwyoM+FTkWaoeK3JiibYzcCqA== - react-native@0.73.9, react-native@^0.73.9: version "0.73.9" resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.73.9.tgz#a10a2ad16a6087c22d704ae47e29efbd64fcccb3" @@ -11251,51 +10684,11 @@ react-reconciler@^0.29.0: loose-envify "^1.1.0" scheduler "^0.23.0" -react-redux@^7.0.0: - version "7.2.9" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.9.tgz#09488fbb9416a4efe3735b7235055442b042481d" - integrity sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ== - dependencies: - "@babel/runtime" "^7.15.4" - "@types/react-redux" "^7.1.20" - hoist-non-react-statics "^3.3.2" - loose-envify "^1.4.0" - prop-types "^15.7.2" - react-is "^17.0.2" - react-refresh@^0.14.0: version "0.14.2" resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== -react-router-dom@^5.3.0: - version "5.3.4" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.4.tgz#2ed62ffd88cae6db134445f4a0c0ae8b91d2e5e6" - integrity sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ== - dependencies: - "@babel/runtime" "^7.12.13" - history "^4.9.0" - loose-envify "^1.3.1" - prop-types "^15.6.2" - react-router "5.3.4" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - -react-router@5.3.4, react-router@^5.2.1: - version "5.3.4" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.3.4.tgz#8ca252d70fcc37841e31473c7a151cf777887bb5" - integrity sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA== - dependencies: - "@babel/runtime" "^7.12.13" - history "^4.9.0" - hoist-non-react-statics "^3.1.0" - loose-envify "^1.3.1" - path-to-regexp "^1.7.0" - prop-types "^15.6.2" - react-is "^16.6.0" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - react-shallow-renderer@^16.15.0: version "16.15.0" resolved "https://registry.yarnpkg.com/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz#48fb2cf9b23d23cde96708fe5273a7d3446f4457" @@ -11304,11 +10697,6 @@ react-shallow-renderer@^16.15.0: object-assign "^4.1.1" react-is "^16.12.0 || ^17.0.0 || ^18.0.0" -react-side-effect@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-2.1.2.tgz#dc6345b9e8f9906dc2eeb68700b615e0b4fe752a" - integrity sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw== - react-test-renderer@18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-18.2.0.tgz#1dd912bd908ff26da5b9fca4fd1c489b9523d37e" @@ -11428,38 +10816,6 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" -redux-immutable-state-invariant@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/redux-immutable-state-invariant/-/redux-immutable-state-invariant-2.1.0.tgz#308fd3cc7415a0e7f11f51ec997b6379c7055ce1" - integrity sha512-3czbDKs35FwiBRsx/3KabUk5zSOoTXC+cgVofGkpBNv3jQcqIe5JrHcF5AmVt7B/4hyJ8MijBIpCJ8cife6yJg== - dependencies: - invariant "^2.1.0" - json-stringify-safe "^5.0.1" - -redux-logger@^3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/redux-logger/-/redux-logger-3.0.6.tgz#f7555966f3098f3c88604c449cf0baf5778274bf" - integrity sha512-JoCIok7bg/XpqA1JqCqXFypuqBbQzGQySrhFzewB7ThcnysTO30l4VCst86AuB9T9tuT03MAA56Jw2PNhRSNCg== - dependencies: - deep-diff "^0.3.5" - -redux-thunk@^2.2.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.4.2.tgz#b9d05d11994b99f7a91ea223e8b04cf0afa5ef3b" - integrity sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q== - -redux@^4.0.0, redux@^4.0.5: - version "4.2.1" - resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.1.tgz#c08f4306826c49b5e9dc901dee0452ea8fce6197" - integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== - dependencies: - "@babel/runtime" "^7.9.2" - -reflect-metadata@^0.1.13: - version "0.1.14" - resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.14.tgz#24cf721fe60677146bb77eeb0e1f9dece3d65859" - integrity sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A== - reflect.getprototypeof@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz#e0bd28b597518f16edaf9c0e292c631eb13e0674" @@ -11703,11 +11059,6 @@ resolve-from@^5.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve-pathname@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" - integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== - resolve-pkg-maps@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" @@ -11880,13 +11231,6 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@^7.5.2: - version "7.8.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" - integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== - dependencies: - tslib "^2.1.0" - safe-array-concat@^1.0.1, safe-array-concat@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.0.tgz#8d0cae9cb806d6d1c06e08ab13d847293ebe0692" @@ -11902,7 +11246,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@~5.2.0: +safe-buffer@^5.0.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -11933,13 +11277,6 @@ scheduler@0.24.0-canary-efb381bbf-20230505: dependencies: loose-envify "^1.1.0" -scheduler@^0.22.0: - version "0.22.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.22.0.tgz#83a5d63594edf074add9a7198b1bae76c3db01b8" - integrity sha512-6QAm1BgQI88NPYymgGQLCZgvep4FyePDWFpXVK+zNSUgHwlqpJy8VEh8Et0KxTACS4VWwMousBElAZOH9nkkoQ== - dependencies: - loose-envify "^1.1.0" - scheduler@^0.23.0: version "0.23.0" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" @@ -12013,7 +11350,7 @@ serialize-error@^2.1.0: resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a" integrity sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw== -serve-static@1.15.0, serve-static@^1.13.1: +serve-static@^1.13.1: version "1.15.0" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== @@ -12805,21 +12142,11 @@ through2@^2.0.1: readable-stream "~2.3.6" xtend "~4.0.1" -tiny-invariant@^1.0.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" - integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== - tiny-invariant@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== -tiny-warning@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" - integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== - tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -12910,11 +12237,6 @@ ts-jest@^29.1.2: semver "^7.5.3" yargs-parser "^21.0.1" -ts-toolbelt@^9.6.0: - version "9.6.0" - resolved "https://registry.yarnpkg.com/ts-toolbelt/-/ts-toolbelt-9.6.0.tgz#50a25426cfed500d4a09bd1b3afb6f28879edfd5" - integrity sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w== - tsconfck@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/tsconfck/-/tsconfck-3.0.1.tgz#803ca0ed8f2f2075639e4061238f04b99ba85e85" @@ -12940,7 +12262,7 @@ tslib@^1.8.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0: +tslib@^2.0.1, tslib@^2.0.3: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== @@ -13101,14 +12423,6 @@ type-fest@^4.6.0, type-fest@^4.7.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.10.3.tgz#ff01cb0a1209f59583d61e1312de9715e7ea4874" integrity sha512-JLXyjizi072smKGGcZiAJDCNweT8J+AuRxmPZ1aG7TERg4ijx9REl8CNhbr36RV4qXqL1gO1FF9HL8OkVmmrsA== -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - typed-array-buffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.1.tgz#0608ffe6bca71bf15a45bff0ca2604107a1325f5" @@ -13376,7 +12690,7 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== -unpipe@1.0.0, unpipe@~1.0.0: +unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== @@ -13404,7 +12718,7 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -url-parse@^1.4.3, url-parse@^1.5.10: +url-parse@^1.5.10: version "1.5.10" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== @@ -13454,11 +12768,6 @@ validate-npm-package-name@^5.0.0: resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz#a316573e9b49f3ccd90dbb6eb52b3f06c6d604e8" integrity sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ== -value-equal@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" - integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== - vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -13951,14 +13260,6 @@ xml-parser-xo@^4.1.0: resolved "https://registry.yarnpkg.com/xml-parser-xo/-/xml-parser-xo-4.1.1.tgz#7434d990f442e06ed96286c813c02e921f14fc50" integrity sha512-Ggf2y90+Y6e9IK5hoPuembVHJ03PhDSdhldEmgzbihzu9k0XBo0sfcFxaSi4W1PlUSSI1ok+MJ0JCXUn+U4Ilw== -xml2js@0.4.23: - version "0.4.23" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.23.tgz#a0c69516752421eb2ac758ee4d4ccf58843eac66" - integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== - dependencies: - sax ">=0.6.0" - xmlbuilder "~11.0.0" - xml2js@0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.6.0.tgz#07afc447a97d2bd6507a1f76eeadddb09f7a8282" From 37e63da5dc6e5a0a2f015b967aa6a27337ce20ce Mon Sep 17 00:00:00 2001 From: Chris Herman Date: Mon, 4 Nov 2024 09:58:57 -0500 Subject: [PATCH 03/15] docs: add README.md --- packages/app-router/README.md | 221 ++++++++++++++++++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 packages/app-router/README.md diff --git a/packages/app-router/README.md b/packages/app-router/README.md new file mode 100644 index 0000000000..1b667a42fd --- /dev/null +++ b/packages/app-router/README.md @@ -0,0 +1,221 @@ +# Code App Router + +**Code App Router** is a powerful, flexible routing and navigation library for React Native applications. Built on top of [React Native Navigation](https://github.com/wix/react-native-navigation), it simplifies route and modal management, supports bottom tabs, nested stacks, and provides easy access to URL-based navigation. This library also offers robust TypeScript support with custom route types, guards, and an intuitive API for deep linking and dynamic navigation. + +## Table of Contents + +- [Installation](#installation) +- [Getting Started](#getting-started) +- [API Overview](#api-overview) +- [Components](#components) + - [App Router](#app-router) + - [Route Types](#route-types) +- [Hooks](#hooks) + - [useRoute](#useroute) + - [useNavigator](#usenavigator) + - [useModal](#usemodal) +- [Advanced Features](#advanced-features) + - [Route Guards](#route-guards) + - [Deep Linking with useLinking](#deep-linking-with-uselinking) +- [Examples](#examples) + +--- + +## Installation + +```bash +yarn add @brandingbrand/code-app-router +``` + +Ensure you have `react-native-navigation`, `react` and `react-native` installed as peer dependencies. + +```bash +yarn add react react-native react-native-navigation +``` + +## Getting Started + +After installing, you can integrate Code App Router by setting up routes and configuring the navigation provider. + +### Step 1: Define Your Routes + +Define your routes using the provided route types (`BottomTabRoute`, `ComponentRoute`, `ActionRoute`). + +```typescript +import HomeScreen from './screens/HomeScreen'; +import ProfileScreen from './screens/ProfileScreen'; +import {Route} from '@brandingbrand/code-app-router'; + +const routes: Route[] = [ + { + name: 'Home', + path: '/', + Component: HomeScreen, + type: 'bottomtab', + options: { + bottomTab: {text: 'Home'}, + }, + stackId: 'mainStack', + }, + { + name: 'Profile', + path: '/profile', + Component: ProfileScreen, + type: 'component', + }, +]; +``` + +### Step 2: Register Routes and Initialize the App Router + +```typescript +import {register} from '@brandingbrand/code-app-router'; +import routes from './routes'; + +register({ + routes, + onAppLaunched: async () => { + console.log('App launched'); + }, + Provider: MyCustomProvider, // Optional +}); +``` + +### Step 3: Use Navigation Hooks + +The library provides hooks like `useNavigator`, `useRoute`, and `useModal` for simplified navigation management. + +```typescript +import {useNavigator, useRoute} from '@brandingbrand/code-app-router'; + +function MyComponent() { + const navigator = useNavigator(); + const route = useRoute(); + + const goToProfile = () => navigator.push('/profile'); +} +``` + +## API Overview + +### `register({ routes, onAppLaunched, Provider })` + +Registers routes and configures the root layout of the application. + +- **`routes`**: Array of route definitions. +- **`onAppLaunched`** (optional): Callback invoked when the app is launched. +- **`Provider`** (optional): React component to wrap the entire app, useful for providing context or global state. + +--- + +## Components + +### App Router + +`AppRouter` is a central configuration object that manages routes, guards, navigation options, and modal handling. + +### Route Types + +- **BottomTabRoute**: Represents a route that is part of a bottom tab navigation. Requires `options.bottomTab` for tab configuration. +- **ComponentRoute**: A route that renders a React component. +- **ActionRoute**: A route that performs an action instead of rendering a component. + +## Hooks + +### `useRoute` + +Provides access to the current route context, including matched route data and URL parameters. + +```typescript +const route = useRoute(); +console.log(route.path); // Access the current path +``` + +### `useNavigator` + +Provides navigation methods (`open`, `push`, `pop`, etc.) to manage the navigation stack. + +```typescript +const navigator = useNavigator(); +navigator.push('/profile'); +``` + +### `useModal` + +A hook for managing modal state within the context of `ModalContext.Provider`. Returns data, `resolve`, and `reject` functions to manage modal flow. + +```typescript +const {data, resolve, reject} = useModal(); +``` + +--- + +## Advanced Features + +### Route Guards + +Guards are asynchronous functions that can control navigation by redirecting or canceling based on conditions like authentication or data fetching. + +```typescript +const authGuard = async (to, from, {cancel, redirect}) => { + if (!isUserAuthenticated()) { + redirect('/login'); + } +}; + +const routes = [ + { + path: '/profile', + name: 'Profile', + Component: ProfileScreen, + guards: [authGuard], + }, +]; +``` + +### Deep Linking with `useLinking` + +Automatically handles incoming deep links and navigates to the appropriate screen. + +```typescript +import {useLinking} from '@brandingbrand/code-app-router'; + +function App() { + useLinking(); // Sets up deep linking +} +``` + +--- + +## Examples + +### Open a New Screen + +```typescript +function HomeScreen() { + const navigator = useNavigator(); + + const goToSettings = () => { + navigator.push('/settings'); + }; + + return ( +