From 5e7b845da7c8eef7ba1358f2f92dff4fa7c87be1 Mon Sep 17 00:00:00 2001 From: Emily Xiong <xiongemi@gmail.com> Date: Sat, 24 Jun 2023 23:34:43 -0400 Subject: [PATCH] feat(react-native): upgrade react-native to 0.72.1 --- .../react-native/executors/build-android.json | 17 +- .../react-native/executors/build-ios.json | 13 +- .../react-native/executors/pod-install.json | 12 +- .../react-native/executors/run-android.json | 12 +- .../react-native/executors/run-ios.json | 9 +- package.json | 3 +- packages/expo/package.json | 5 +- packages/expo/plugins/with-nx-metro.ts | 34 +- packages/expo/src/utils/versions.ts | 20 +- packages/react-native/migrations.json | 72 ++ packages/react-native/package.json | 5 +- .../react-native/plugins/with-nx-metro.ts | 33 +- .../build-android/build-android.impl.ts | 77 +- .../src/executors/build-android/schema.d.ts | 6 +- .../src/executors/build-android/schema.json | 19 +- .../src/executors/build-ios/build-ios.impl.ts | 98 +- .../src/executors/build-ios/schema.d.ts | 2 + .../src/executors/build-ios/schema.json | 11 +- .../src/executors/bundle/bundle.impl.ts | 45 +- .../executors/pod-install/pod-install.impl.ts | 2 +- .../src/executors/pod-install/schema.d.ts | 4 +- .../src/executors/pod-install/schema.json | 12 +- .../executors/run-android/run-android.impl.ts | 67 +- .../src/executors/run-android/schema.json | 14 +- .../src/executors/run-ios/run-ios.impl.ts | 80 +- .../src/executors/run-ios/schema.json | 9 +- .../src/executors/start/start.impl.ts | 77 +- .../src/generators/application/application.ts | 6 - .../application/files/app/.ruby-version | 1 - .../application/files/app/Gemfile.template | 4 +- .../app/android/app/build.gradle.template | 51 +- .../MainActivity.java.template | 7 +- .../res/drawable/rn_edit_text_material.xml | 2 +- .../files/app/android/build.gradle.template | 2 +- .../files/app/android/gradle.properties | 2 +- .../android/gradle/wrapper/gradle-wrapper.jar | Bin 59821 -> 61574 bytes .../gradle/wrapper/gradle-wrapper.properties | 3 +- .../application/files/app/android/gradlew.bat | 15 +- .../files/app/android/gradlew.template | 18 +- .../app/android/settings.gradle.template | 3 +- .../files/app/ios/Podfile.template | 14 +- .../project.pbxproj.template | 8 +- .../ios/__className__/AppDelegate.mm.template | 10 - .../files/app/metro.config.js.template | 67 +- .../generators/application/lib/add-project.ts | 7 + .../react-native/src/generators/init/init.ts | 4 +- .../update-16-5-0/add-depends-on.ts | 46 + .../react-native/src/utils/get-cli-options.ts | 4 +- .../src/utils/pod-install-task.ts | 38 +- packages/react-native/src/utils/versions.ts | 19 +- pnpm-lock.yaml | 919 +++++++++++++----- 51 files changed, 1258 insertions(+), 750 deletions(-) delete mode 100644 packages/react-native/src/generators/application/files/app/.ruby-version create mode 100644 packages/react-native/src/migrations/update-16-5-0/add-depends-on.ts diff --git a/docs/generated/packages/react-native/executors/build-android.json b/docs/generated/packages/react-native/executors/build-android.json index cdac5b307debcd..ac0a322517e40e 100644 --- a/docs/generated/packages/react-native/executors/build-android.json +++ b/docs/generated/packages/react-native/executors/build-android.json @@ -53,8 +53,10 @@ "default": 8081 }, "tasks": { - "type": "array", - "items": { "type": "string" }, + "oneOf": [ + { "type": "array", "items": { "type": "string" } }, + { "type": "string" } + ], "description": "Run custom Gradle tasks. By default it's \"assembleDebug\". Will override passed mode and variant arguments.", "examples": [ "assembleDebug", @@ -71,8 +73,12 @@ "default": false }, "extraParams": { - "type": "string", - "description": "Custom params passed to gradle build command" + "oneOf": [ + { "type": "array", "items": { "type": "string" } }, + { "type": "string" } + ], + "description": "Custom params passed to gradle build command", + "examples": ["-x lint -x test"] }, "interactive": { "type": "boolean", @@ -81,7 +87,8 @@ "sync": { "type": "boolean", "description": "Syncs npm dependencies to `package.json` (for React Native autolink).", - "default": true + "default": true, + "x-deprecated": "Add sync-deps to dependsOn instead" }, "resetCache": { "type": "boolean", diff --git a/docs/generated/packages/react-native/executors/build-ios.json b/docs/generated/packages/react-native/executors/build-ios.json index 9f1d67083d6010..8f0e527ea072d8 100644 --- a/docs/generated/packages/react-native/executors/build-ios.json +++ b/docs/generated/packages/react-native/executors/build-ios.json @@ -11,11 +11,7 @@ "presets": [ { "name": "Build iOS for a simulator", "keys": ["simulator"] }, { "name": "Build iOS for a device", "keys": ["device"] }, - { "name": "Build iOS for a device with udid", "keys": ["udid"] }, - { - "name": "Run `pod install` before building iOS app", - "keys": ["install"] - } + { "name": "Build iOS for a device with udid", "keys": ["udid"] } ], "properties": { "simulator": { @@ -72,17 +68,22 @@ "description": "Explicitly select which scheme and configuration to use before running a build" }, "extraParams": { - "type": "string", + "oneOf": [ + { "type": "array", "items": { "type": "string" } }, + { "type": "string" } + ], "description": "Custom params that will be passed to xcodebuild command." }, "install": { "type": "boolean", "description": "Runs `pod install` for native modules before building iOS app.", + "x-deprecated": "Add pod-install to dependsOn in project.json for this target instead", "default": true }, "sync": { "type": "boolean", "description": "Syncs npm dependencies to `package.json` (for React Native autolink).", + "x-deprecated": "Add sync-deps to dependsOn in project.json for this target instead", "default": true }, "resetCache": { diff --git a/docs/generated/packages/react-native/executors/pod-install.json b/docs/generated/packages/react-native/executors/pod-install.json index da7c4b7f32ed18..2e4f9beae68472 100644 --- a/docs/generated/packages/react-native/executors/pod-install.json +++ b/docs/generated/packages/react-native/executors/pod-install.json @@ -12,9 +12,19 @@ "type": "object", "properties": { "buildFolder": { - "description": "Location for iOS build artifacts. Corresponds to Xcode's \"-derivedDataPath\". Relative to ios directory", + "description": "Location for iOS build artifacts. Corresponds to Xcode's \"-derivedDataPath\". Relative to ios directory.", "type": "string", "default": "./build" + }, + "repoUpdate": { + "description": "Force running `pod repo update` before install.", + "type": "boolean", + "default": false + }, + "deployment": { + "description": "Disallow any changes to the Podfile or the Podfile.lock during installation.", + "type": "boolean", + "default": false } }, "required": ["buildFolder"], diff --git a/docs/generated/packages/react-native/executors/run-android.json b/docs/generated/packages/react-native/executors/run-android.json index 1f64e92ced64d8..cf0a67aa56360a 100644 --- a/docs/generated/packages/react-native/executors/run-android.json +++ b/docs/generated/packages/react-native/executors/run-android.json @@ -77,8 +77,10 @@ "default": 8081 }, "tasks": { - "type": "array", - "items": { "type": "string" }, + "oneOf": [ + { "type": "array", "items": { "type": "string" } }, + { "type": "string" } + ], "description": "Run custom Gradle tasks. By default it's \"assembleDebug\". Will override passed mode and variant arguments.", "examples": [ "assembleDebug", @@ -95,7 +97,10 @@ "default": false }, "extraParams": { - "type": "string", + "oneOf": [ + { "type": "array", "items": { "type": "string" } }, + { "type": "string" } + ], "description": "Custom params passed to gradle build command" }, "interactive": { @@ -105,6 +110,7 @@ "sync": { "type": "boolean", "description": "Syncs npm dependencies to `package.json` (for React Native autolink).", + "x-deprecated": "Add sync-deps to dependsOn for this target in project.json instead", "default": true }, "resetCache": { diff --git a/docs/generated/packages/react-native/executors/run-ios.json b/docs/generated/packages/react-native/executors/run-ios.json index 58f619d5169ac2..70f44ee18a4262 100644 --- a/docs/generated/packages/react-native/executors/run-ios.json +++ b/docs/generated/packages/react-native/executors/run-ios.json @@ -81,17 +81,22 @@ "description": "Explicitly select which scheme and configuration to use before running a build" }, "extraParams": { - "type": "string", + "oneOf": [ + { "type": "array", "items": { "type": "string" } }, + { "type": "string" } + ], "description": "Custom params that will be passed to xcodebuild command." }, "install": { "type": "boolean", "description": "Runs `pod install` for native modules before building iOS app.", - "default": true + "default": true, + "x-deprecated": "Add `pod-install` to dependsOn for this target in project.json instead." }, "sync": { "type": "boolean", "description": "Syncs npm dependencies to `package.json` (for React Native autolink).", + "x-deprecated": "Add `sync-deps` to dependsOn for this target in project.json instead.", "default": true }, "resetCache": { diff --git a/package.json b/package.json index b2bdf833f29cbc..f535c021e71cd4 100644 --- a/package.json +++ b/package.json @@ -204,7 +204,8 @@ "magic-string": "~0.26.2", "markdown-factory": "^0.0.6", "memfs": "^3.0.1", - "metro-resolver": "^0.74.1", + "metro-config": "0.76.5", + "metro-resolver": "0.76.5", "mini-css-extract-plugin": "~2.4.7", "minimatch": "3.0.5", "next-sitemap": "^3.1.10", diff --git a/packages/expo/package.json b/packages/expo/package.json index 50ac01e23aace7..f24e1939cbb3ae 100644 --- a/packages/expo/package.json +++ b/packages/expo/package.json @@ -29,7 +29,8 @@ "chalk": "^4.1.0", "enhanced-resolve": "^5.8.3", "fs-extra": "^11.1.0", - "metro-resolver": "^0.74.1", + "metro-config": "0.76.5", + "metro-resolver": "0.76.5", "node-fetch": "^2.6.7", "tar-fs": "^2.1.1", "tsconfig-paths": "^4.1.2", @@ -43,7 +44,7 @@ "@nx/webpack": "file:../webpack" }, "peerDependencies": { - "expo": "^48.0.19" + "expo": "^49.0.0-beta.4" }, "builders": "./executors.json", "ng-update": { diff --git a/packages/expo/plugins/with-nx-metro.ts b/packages/expo/plugins/with-nx-metro.ts index 81ac08570064c1..943886babbb82d 100644 --- a/packages/expo/plugins/with-nx-metro.ts +++ b/packages/expo/plugins/with-nx-metro.ts @@ -1,4 +1,6 @@ import { workspaceLayout, workspaceRoot } from '@nx/devkit'; +import { mergeConfig } from 'metro-config'; +import type { MetroConfig } from 'metro-config'; import { join } from 'path'; import { existsSync } from 'fs-extra'; @@ -7,35 +9,39 @@ import { getResolveRequest } from './metro-resolver'; interface WithNxOptions { debug?: boolean; extensions?: string[]; + /** + * @deprecated in the metro.config.js, pass in to the getDefaultConfig instead: getDefaultConfig(__dirname) + */ projectRoot?: string; watchFolders?: string[]; } -export function withNxMetro(config: any, opts: WithNxOptions = {}) { +export async function withNxMetro( + userConfig: MetroConfig, + opts: WithNxOptions = {} +) { const extensions = ['', 'ts', 'tsx', 'js', 'jsx', 'json']; if (opts.debug) process.env.NX_REACT_NATIVE_DEBUG = 'true'; if (opts.extensions) extensions.push(...opts.extensions); - config.projectRoot = opts.projectRoot || workspaceRoot; - - // Add support for paths specified by tsconfig - config.resolver = { - ...config.resolver, - resolveRequest: getResolveRequest(extensions), - }; - - let watchFolders = config.watchFolders || []; - watchFolders = watchFolders.concat([ + let watchFolders = [ join(workspaceRoot, 'node_modules'), join(workspaceRoot, workspaceLayout().libsDir), join(workspaceRoot, 'packages'), - ]); + join(workspaceRoot, '.storybook'), + ]; if (opts.watchFolders?.length) { watchFolders = watchFolders.concat(opts.watchFolders); } watchFolders = watchFolders.filter((folder) => existsSync(folder)); - config.watchFolders = watchFolders; - return config; + const nxConfig: MetroConfig = { + resolver: { + resolveRequest: getResolveRequest(extensions), + }, + watchFolders, + }; + + return mergeConfig(userConfig, nxConfig); } diff --git a/packages/expo/src/utils/versions.ts b/packages/expo/src/utils/versions.ts index a494bd29a0ac28..6262fa64a531cc 100644 --- a/packages/expo/src/utils/versions.ts +++ b/packages/expo/src/utils/versions.ts @@ -1,13 +1,13 @@ export const nxVersion = require('../../package.json').version; -export const expoVersion = '48.0.19'; -export const expoMetroConfigVersion = '0.7.1'; -export const expoSplashScreenVersion = '~0.18.2'; -export const expoStatusBarVersion = '~1.4.4'; -export const expoUpdatesVersion = '~0.16.4'; -export const expoCliVersion = '~0.7.3'; // @expo/cli -export const easCliVersion = '~3.13.3'; -export const babelPresetExpoVersion = '~9.3.2'; +export const expoVersion = '49.0.0-beta.4'; +export const expoMetroConfigVersion = '~0.10.6'; +export const expoSplashScreenVersion = '~0.20.3'; +export const expoStatusBarVersion = '~1.6.0'; +export const expoUpdatesVersion = '~0.18.7'; +export const expoCliVersion = '~0.10.7'; // @expo/cli +export const easCliVersion = '~3.15.0'; +export const babelPresetExpoVersion = '~9.5.0'; export const reactVersion = '18.2.0'; export const reactDomVersion = '18.2.0'; @@ -21,8 +21,8 @@ export const reactNativeWebVersion = '~0.18.12'; export const reactNativeSvgTransformerVersion = '1.0.0'; export const reactNativeSvgVersion = '13.4.0'; -export const metroVersion = '0.74.1'; +export const metroVersion = '0.76.5'; export const testingLibraryReactNativeVersion = '12.1.2'; export const testingLibraryJestNativeVersion = '5.4.2'; -export const jestExpoVersion = '~48.0.2'; +export const jestExpoVersion = '~49.0.0'; diff --git a/packages/react-native/migrations.json b/packages/react-native/migrations.json index 2615b50013cf0e..a2c5e5db438402 100644 --- a/packages/react-native/migrations.json +++ b/packages/react-native/migrations.json @@ -89,6 +89,12 @@ "version": "16.1.0-beta.0", "description": "Upgrade @storybook/react-native to 6.5", "implementation": "./src/migrations/update-16-1-0/upgrade-storybook-6-5" + }, + "update-16-5-0-add-dependsOn": { + "cli": "nx", + "version": "16.1.0-beta.0", + "description": "Add dependsOn like ensure-symlink or sync-deps to targets", + "implementation": "./src/migrations/update-16-5-0/add-depends-on" } }, "packageJsonUpdates": { @@ -1348,6 +1354,72 @@ "alwaysAddToPackageJson": false } } + }, + "16.5.0-beta.4": { + "version": "16.5.0-beta.4", + "packages": { + "react-native": { + "version": "0.72.1", + "alwaysAddToPackageJson": false + }, + "@types/react-native": { + "version": "0.72.2", + "alwaysAddToPackageJson": false + }, + "metro": { + "version": "0.76.5", + "alwaysAddToPackageJson": false + }, + "metro-resolver": { + "version": "0.76.5", + "alwaysAddToPackageJson": false + }, + "metro-config": { + "version": "0.76.5", + "alwaysAddToPackageJson": false + }, + "metro-react-native-babel-preset": { + "version": "0.76.5", + "alwaysAddToPackageJson": false + }, + "metro-babel-register": { + "version": "0.76.5", + "alwaysAddToPackageJson": false + }, + "metro-react-native-babel-transformer": { + "version": "0.76.5", + "alwaysAddToPackageJson": false + }, + "@react-native/metro-config": { + "version": "0.72.7", + "alwaysAddToPackageJson": false, + "addToPackageJson": "devDependencies" + }, + "@react-native-community/cli": { + "version": "11.3.3", + "alwaysAddToPackageJson": false + }, + "@react-native-community/cli-platform-android": { + "version": "11.3.3", + "alwaysAddToPackageJson": false + }, + "@react-native-community/cli-platform-ios": { + "version": "11.3.3", + "alwaysAddToPackageJson": false + }, + "@babel/runtime": { + "version": "7.22.6", + "alwaysAddToPackageJson": false + }, + "@react-native-async-storage/async-storage": { + "version": "1.19.0", + "alwaysAddToPackageJson": false + }, + "react-native-safe-area-context": { + "version": "4.6.4", + "alwaysAddToPackageJson": false + } + } } } } diff --git a/packages/react-native/package.json b/packages/react-native/package.json index 0231e5e88d8ef3..b2df964061e338 100644 --- a/packages/react-native/package.json +++ b/packages/react-native/package.json @@ -30,7 +30,8 @@ "fs-extra": "^11.1.0", "glob": "7.1.4", "ignore": "^5.0.4", - "metro-resolver": "^0.74.1", + "metro-config": "0.76.5", + "metro-resolver": "0.76.5", "minimatch": "3.0.5", "node-fetch": "^2.6.7", "tsconfig-paths": "^4.1.2", @@ -43,7 +44,7 @@ "@nx/workspace": "file:../workspace" }, "peerDependencies": { - "react-native": ">= 0.71.0" + "react-native": ">= 0.72.0 < 0.73.0" }, "builders": "./executors.json", "ng-update": { diff --git a/packages/react-native/plugins/with-nx-metro.ts b/packages/react-native/plugins/with-nx-metro.ts index 6bf66f767af324..943886babbb82d 100644 --- a/packages/react-native/plugins/with-nx-metro.ts +++ b/packages/react-native/plugins/with-nx-metro.ts @@ -1,4 +1,6 @@ import { workspaceLayout, workspaceRoot } from '@nx/devkit'; +import { mergeConfig } from 'metro-config'; +import type { MetroConfig } from 'metro-config'; import { join } from 'path'; import { existsSync } from 'fs-extra'; @@ -7,36 +9,39 @@ import { getResolveRequest } from './metro-resolver'; interface WithNxOptions { debug?: boolean; extensions?: string[]; + /** + * @deprecated in the metro.config.js, pass in to the getDefaultConfig instead: getDefaultConfig(__dirname) + */ projectRoot?: string; watchFolders?: string[]; } -export function withNxMetro(config: any, opts: WithNxOptions = {}) { +export async function withNxMetro( + userConfig: MetroConfig, + opts: WithNxOptions = {} +) { const extensions = ['', 'ts', 'tsx', 'js', 'jsx', 'json']; if (opts.debug) process.env.NX_REACT_NATIVE_DEBUG = 'true'; if (opts.extensions) extensions.push(...opts.extensions); - config.projectRoot = opts.projectRoot || workspaceRoot; - - // Add support for paths specified by tsconfig - config.resolver = { - ...config.resolver, - resolveRequest: getResolveRequest(extensions), - }; - - let watchFolders = config.watchFolders || []; - watchFolders = watchFolders.concat([ + let watchFolders = [ join(workspaceRoot, 'node_modules'), join(workspaceRoot, workspaceLayout().libsDir), join(workspaceRoot, 'packages'), join(workspaceRoot, '.storybook'), - ]); + ]; if (opts.watchFolders?.length) { watchFolders = watchFolders.concat(opts.watchFolders); } watchFolders = watchFolders.filter((folder) => existsSync(folder)); - config.watchFolders = watchFolders; - return config; + const nxConfig: MetroConfig = { + resolver: { + resolveRequest: getResolveRequest(extensions), + }, + watchFolders, + }; + + return mergeConfig(userConfig, nxConfig); } diff --git a/packages/react-native/src/executors/build-android/build-android.impl.ts b/packages/react-native/src/executors/build-android/build-android.impl.ts index e6082d2d64f537..e1fefd35e757f8 100644 --- a/packages/react-native/src/executors/build-android/build-android.impl.ts +++ b/packages/react-native/src/executors/build-android/build-android.impl.ts @@ -1,62 +1,36 @@ -import { ExecutorContext, names } from '@nx/devkit'; -import { join } from 'path'; -import { ensureNodeModulesSymlink } from '../../utils/ensure-node-modules-symlink'; +import { ExecutorContext } from '@nx/devkit'; +import { join, resolve as pathResolve } from 'path'; import { ChildProcess, fork } from 'child_process'; import { ReactNativeBuildAndroidOptions } from './schema'; import { chmodAndroidGradlewFiles } from '../../utils/chmod-android-gradle-files'; -import { runCliStart } from '../start/start.impl'; -import { - displayNewlyAddedDepsMessage, - syncDeps, -} from '../sync-deps/sync-deps.impl'; +import startExecutor from '../start/start.impl'; import { getCliOptions } from '../../utils/get-cli-options'; export interface ReactNativeBuildOutput { success: boolean; } -let childProcess: ChildProcess; - export default async function* buildAndroidExecutor( options: ReactNativeBuildAndroidOptions, context: ExecutorContext ): AsyncGenerator<ReactNativeBuildOutput> { const projectRoot = context.projectsConfigurations.projects[context.projectName].root; - ensureNodeModulesSymlink(context.root, projectRoot); - if (options.sync) { - displayNewlyAddedDepsMessage( - context.projectName, - await syncDeps( - context.projectName, - projectRoot, - context.root, - context.projectGraph - ) - ); - } - chmodAndroidGradlewFiles(join(projectRoot, 'android')); - try { - const tasks = [runCliBuild(context.root, projectRoot, options)]; - if (options.packager && options.mode !== 'release') { - tasks.push( - runCliStart(context.root, projectRoot, { - port: options.port, - resetCache: options.resetCache, - interactive: options.interactive, - }) - ); - } - - await Promise.all(tasks); - yield { success: true }; - } finally { - if (childProcess) { - childProcess.kill(); + runCliBuild(context.root, projectRoot, options); + if (options.packager && options.mode !== 'release') { + const startResults = startExecutor(options, context); + for await (const result of startResults) { + if (!result.success) { + return result; + } + yield { + success: true, + }; } } + yield { success: true }; } function runCliBuild( @@ -64,30 +38,37 @@ function runCliBuild( projectRoot: string, options: ReactNativeBuildAndroidOptions ) { - return new Promise((resolve, reject) => { + return new Promise<ChildProcess>((res, reject) => { /** * Call the react native cli with option `--no-packager` * Not passing '--packager' due to cli will launch start command from the project root */ - childProcess = fork( - join(workspaceRoot, './node_modules/react-native/cli.js'), + const childProcess = fork( + require.resolve('react-native/cli.js'), ['build-android', ...createBuildAndroidOptions(options), '--no-packager'], { - cwd: join(workspaceRoot, projectRoot), + stdio: 'inherit', + cwd: pathResolve(workspaceRoot, projectRoot), env: { ...process.env, RCT_METRO_PORT: options.port.toString() }, } ); - // Ensure the child process is killed when the parent exits - process.on('exit', () => childProcess.kill()); - process.on('SIGTERM', () => childProcess.kill()); + /** + * Ensure the child process is killed when the parent exits + */ + const processExitListener = (signal?: number | NodeJS.Signals) => () => + childProcess.kill(signal); + process.on('exit', processExitListener); + process.on('SIGTERM', processExitListener); + process.on('SIGINT', processExitListener); + process.on('SIGQUIT', processExitListener); childProcess.on('error', (err) => { reject(err); }); childProcess.on('exit', (code) => { if (code === 0) { - resolve(code); + res(childProcess); } else { reject(code); } diff --git a/packages/react-native/src/executors/build-android/schema.d.ts b/packages/react-native/src/executors/build-android/schema.d.ts index 24c8d29ce7401f..14f7dc8618662b 100644 --- a/packages/react-native/src/executors/build-android/schema.d.ts +++ b/packages/react-native/src/executors/build-android/schema.d.ts @@ -1,4 +1,5 @@ // options taken from https://github.com/react-native-community/cli/blob/main/packages/cli-platform-android/src/commands/buildAndroid/index.ts +// https://github.com/react-native-community/cli/blob/main/packages/cli-platform-android/README.md#build-android import { ReactNativeStartOptions } from '../start/schema'; @@ -20,10 +21,9 @@ export interface ReactNativeBuildAndroidOptions // react native options mode: string; // default is debug activeArchOnly: boolean; // default is false - port: number; // default is 8081 - tasks?: Array<string>; + tasks?: string | Array<string>; extraParams?: Array<string>; - interactive?: boolean; + interactive: boolean; // nx options packager: boolean; // default is true diff --git a/packages/react-native/src/executors/build-android/schema.json b/packages/react-native/src/executors/build-android/schema.json index 16284032ae8cbd..a9536f6d540fa3 100644 --- a/packages/react-native/src/executors/build-android/schema.json +++ b/packages/react-native/src/executors/build-android/schema.json @@ -59,10 +59,10 @@ "default": 8081 }, "tasks": { - "type": "array", - "items": { - "type": "string" - }, + "oneOf": [ + { "type": "array", "items": { "type": "string" } }, + { "type": "string" } + ], "description": "Run custom Gradle tasks. By default it's \"assembleDebug\". Will override passed mode and variant arguments.", "examples": [ "assembleDebug", @@ -79,8 +79,12 @@ "default": false }, "extraParams": { - "type": "string", - "description": "Custom params passed to gradle build command" + "oneOf": [ + { "type": "array", "items": { "type": "string" } }, + { "type": "string" } + ], + "description": "Custom params passed to gradle build command", + "examples": ["-x lint -x test"] }, "interactive": { "type": "boolean", @@ -89,7 +93,8 @@ "sync": { "type": "boolean", "description": "Syncs npm dependencies to `package.json` (for React Native autolink).", - "default": true + "default": true, + "x-deprecated": "Add sync-deps to dependsOn instead" }, "resetCache": { "type": "boolean", diff --git a/packages/react-native/src/executors/build-ios/build-ios.impl.ts b/packages/react-native/src/executors/build-ios/build-ios.impl.ts index 7b58775717f8b9..15e2957ee2a5dc 100644 --- a/packages/react-native/src/executors/build-ios/build-ios.impl.ts +++ b/packages/react-native/src/executors/build-ios/build-ios.impl.ts @@ -1,25 +1,17 @@ import { ExecutorContext } from '@nx/devkit'; -import { join } from 'path'; +import { resolve as pathResolve } from 'path'; import { ChildProcess, fork } from 'child_process'; import { platform } from 'os'; -import { ensureNodeModulesSymlink } from '../../utils/ensure-node-modules-symlink'; -import { - displayNewlyAddedDepsMessage, - syncDeps, -} from '../sync-deps/sync-deps.impl'; -import { podInstall } from '../../utils/pod-install-task'; import { ReactNativeBuildIosOptions } from './schema'; -import { runCliStart } from '../start/start.impl'; +import startExecutor from '../start/start.impl'; import { getCliOptions } from '../../utils/get-cli-options'; export interface ReactNativeBuildIosOutput { success: boolean; } -let childProcess: ChildProcess; - -export default async function* runIosExecutor( +export default async function* buildIosExecutor( options: ReactNativeBuildIosOptions, context: ExecutorContext ): AsyncGenerator<ReactNativeBuildIosOutput> { @@ -28,77 +20,59 @@ export default async function* runIosExecutor( } const projectRoot = context.projectsConfigurations.projects[context.projectName].root; - ensureNodeModulesSymlink(context.root, projectRoot); - if (options.sync) { - displayNewlyAddedDepsMessage( - context.projectName, - await syncDeps( - context.projectName, - projectRoot, - context.root, - context.projectGraph - ) - ); - } - - if (options.install) { - await podInstall( - join(context.root, projectRoot, 'ios'), - options.buildFolder - ); - } - try { - const tasks = [runCliBuildIOS(context.root, projectRoot, options)]; - if (options.packager && options.mode !== 'Release') { - tasks.push( - runCliStart(context.root, projectRoot, { - port: options.port, - resetCache: options.resetCache, - interactive: options.interactive, - }) - ); + const tasks = [runCliBuildIOS(context.root, projectRoot, options)]; + if (options.packager && options.mode !== 'Release') { + const startResults = startExecutor(options, context); + for await (const result of startResults) { + if (!result.success) { + return result; + } + yield { + success: true, + }; } + } - await Promise.all(tasks); + await Promise.all(tasks); - yield { success: true }; - } finally { - if (childProcess) { - childProcess.kill(); - } - } + yield { success: true }; } function runCliBuildIOS( workspaceRoot: string, projectRoot: string, options: ReactNativeBuildIosOptions -) { - return new Promise((resolve, reject) => { - /** - * Call the react native cli with option `--no-packager` - * Not passing '--packager' due to cli will launch start command from the project root - */ - childProcess = fork( - join(workspaceRoot, './node_modules/react-native/cli.js'), - ['build-ios', ...createBuildIOSOptions(options)], +): Promise<ChildProcess> { + return new Promise<ChildProcess>((resolve, reject) => { + const childProcess = fork( + require.resolve('react-native/cli.js'), + [ + 'build-ios', + ...createBuildIOSOptions(options), + ...(process.env.NX_VERBOSE_LOGGING === 'true' ? ['--verbose'] : []), + ], { - cwd: join(workspaceRoot, projectRoot), + cwd: pathResolve(workspaceRoot, projectRoot), env: { ...process.env, RCT_METRO_PORT: options.port.toString() }, } ); - // Ensure the child process is killed when the parent exits - process.on('exit', () => childProcess.kill()); - process.on('SIGTERM', () => childProcess.kill()); - + /** + * Ensure the child process is killed when the parent exits + */ + const processExitListener = (signal?: number | NodeJS.Signals) => () => + childProcess.kill(signal); + process.on('exit', processExitListener); + process.on('SIGTERM', processExitListener); + process.on('SIGINT', processExitListener); + process.on('SIGQUIT', processExitListener); childProcess.on('error', (err) => { reject(err); }); childProcess.on('exit', (code) => { if (code === 0) { - resolve(code); + resolve(childProcess); } else { reject(code); } diff --git a/packages/react-native/src/executors/build-ios/schema.d.ts b/packages/react-native/src/executors/build-ios/schema.d.ts index df4fac0ecc331a..5ec1a797a0b009 100644 --- a/packages/react-native/src/executors/build-ios/schema.d.ts +++ b/packages/react-native/src/executors/build-ios/schema.d.ts @@ -17,6 +17,8 @@ export interface ReactNativeBuildIosOptions extends ReactNativeStartOptions { // nx options packager: boolean; // default is true + // @deprecated, add to pod-install to dependsOn install: boolean; // default is true + // @deprecated, add to sync-deps to dependsOn sync: boolean; // default is true } diff --git a/packages/react-native/src/executors/build-ios/schema.json b/packages/react-native/src/executors/build-ios/schema.json index a23017767b4113..77653ad8d81b8e 100644 --- a/packages/react-native/src/executors/build-ios/schema.json +++ b/packages/react-native/src/executors/build-ios/schema.json @@ -17,10 +17,6 @@ { "name": "Build iOS for a device with udid", "keys": ["udid"] - }, - { - "name": "Run `pod install` before building iOS app", - "keys": ["install"] } ], "properties": { @@ -78,17 +74,22 @@ "description": "Explicitly select which scheme and configuration to use before running a build" }, "extraParams": { - "type": "string", + "oneOf": [ + { "type": "array", "items": { "type": "string" } }, + { "type": "string" } + ], "description": "Custom params that will be passed to xcodebuild command." }, "install": { "type": "boolean", "description": "Runs `pod install` for native modules before building iOS app.", + "x-deprecated": "Add pod-install to dependsOn in project.json for this target instead", "default": true }, "sync": { "type": "boolean", "description": "Syncs npm dependencies to `package.json` (for React Native autolink).", + "x-deprecated": "Add sync-deps to dependsOn in project.json for this target instead", "default": true }, "resetCache": { diff --git a/packages/react-native/src/executors/bundle/bundle.impl.ts b/packages/react-native/src/executors/bundle/bundle.impl.ts index 42f4a9004465f3..64df66ead0b75f 100644 --- a/packages/react-native/src/executors/bundle/bundle.impl.ts +++ b/packages/react-native/src/executors/bundle/bundle.impl.ts @@ -1,18 +1,14 @@ import { createDirectory } from '@nx/workspace/src/utilities/fileutils'; import { names, ExecutorContext } from '@nx/devkit'; -import { dirname, join } from 'path'; +import { dirname, join, resolve as pathResolve } from 'path'; import { ChildProcess, fork } from 'child_process'; -import { ensureNodeModulesSymlink } from '../../utils/ensure-node-modules-symlink'; - import { ReactNativeBundleOptions } from './schema'; export interface ReactNativeBundleOutput { success: boolean; } -let childProcess: ChildProcess; - export default async function* bundleExecutor( options: ReactNativeBundleOptions, context: ExecutorContext @@ -23,41 +19,44 @@ export default async function* bundleExecutor( options.bundleOutput = join(context.root, options.bundleOutput); createDirectory(dirname(options.bundleOutput)); - ensureNodeModulesSymlink(context.root, projectRoot); - try { - await runCliBuild(context.root, projectRoot, options); - yield { success: true }; - } finally { - if (childProcess) { - childProcess.kill(); - } - } + await runCliBuild(context.root, projectRoot, options); + yield { success: true }; } function runCliBuild( workspaceRoot: string, projectRoot: string, options: ReactNativeBundleOptions -) { - return new Promise((resolve, reject) => { +): Promise<ChildProcess> { + return new Promise<ChildProcess>((resolve, reject) => { const cliOptions = createBundleOptions(options); - childProcess = fork( - join(workspaceRoot, './node_modules/react-native/cli.js'), + const childProcess = fork( + require.resolve('react-native/cli.js'), ['bundle', ...cliOptions], - { cwd: join(workspaceRoot, projectRoot), env: process.env } + { + stdio: 'inherit', + cwd: pathResolve(workspaceRoot, projectRoot), + env: process.env, + } ); - // Ensure the child process is killed when the parent exits - process.on('exit', () => childProcess.kill()); - process.on('SIGTERM', () => childProcess.kill()); + /** + * Ensure the child process is killed when the parent exits + */ + const processExitListener = (signal?: number | NodeJS.Signals) => () => + childProcess.kill(signal); + process.on('exit', processExitListener); + process.on('SIGTERM', processExitListener); + process.on('SIGINT', processExitListener); + process.on('SIGQUIT', processExitListener); childProcess.on('error', (err) => { reject(err); }); childProcess.on('exit', (code) => { if (code === 0) { - resolve(code); + resolve(childProcess); } else { reject(code); } diff --git a/packages/react-native/src/executors/pod-install/pod-install.impl.ts b/packages/react-native/src/executors/pod-install/pod-install.impl.ts index c4a283fca05d4e..8ec0f80cffdb87 100644 --- a/packages/react-native/src/executors/pod-install/pod-install.impl.ts +++ b/packages/react-native/src/executors/pod-install/pod-install.impl.ts @@ -15,7 +15,7 @@ export default async function* podInstall( const projectRoot = context.projectsConfigurations.projects[context.projectName].root; const iosDirectory = join(context.root, projectRoot, 'ios'); - await runPodInstall(iosDirectory, true, options.buildFolder)(); + await runPodInstall(iosDirectory, true, options)(); yield { success: true }; } diff --git a/packages/react-native/src/executors/pod-install/schema.d.ts b/packages/react-native/src/executors/pod-install/schema.d.ts index 11f7664df8e041..41f36baf08d81f 100644 --- a/packages/react-native/src/executors/pod-install/schema.d.ts +++ b/packages/react-native/src/executors/pod-install/schema.d.ts @@ -1,3 +1,5 @@ export interface ReactNativePodInstallOptions { - buildFolder: string; + buildFolder: string; // default is './build' + repoUpdate: boolean; // default is false + deployment: boolean; // default is false } diff --git a/packages/react-native/src/executors/pod-install/schema.json b/packages/react-native/src/executors/pod-install/schema.json index 0cc954d982e9e8..e6e373c4c756fd 100644 --- a/packages/react-native/src/executors/pod-install/schema.json +++ b/packages/react-native/src/executors/pod-install/schema.json @@ -9,9 +9,19 @@ "type": "object", "properties": { "buildFolder": { - "description": "Location for iOS build artifacts. Corresponds to Xcode's \"-derivedDataPath\". Relative to ios directory", + "description": "Location for iOS build artifacts. Corresponds to Xcode's \"-derivedDataPath\". Relative to ios directory.", "type": "string", "default": "./build" + }, + "repoUpdate": { + "description": "Force running `pod repo update` before install.", + "type": "boolean", + "default": false + }, + "deployment": { + "description": "Disallow any changes to the Podfile or the Podfile.lock during installation.", + "type": "boolean", + "default": false } }, "required": ["buildFolder"] diff --git a/packages/react-native/src/executors/run-android/run-android.impl.ts b/packages/react-native/src/executors/run-android/run-android.impl.ts index a73b3c197bbb95..749fdcdc5f7a98 100644 --- a/packages/react-native/src/executors/run-android/run-android.impl.ts +++ b/packages/react-native/src/executors/run-android/run-android.impl.ts @@ -1,14 +1,9 @@ import { ExecutorContext } from '@nx/devkit'; -import { join } from 'path'; +import { join, resolve as pathResolve } from 'path'; import { ChildProcess, fork } from 'child_process'; -import { ensureNodeModulesSymlink } from '../../utils/ensure-node-modules-symlink'; -import { - displayNewlyAddedDepsMessage, - syncDeps, -} from '../sync-deps/sync-deps.impl'; import { ReactNativeRunAndroidOptions } from './schema'; -import { runCliStart } from '../start/start.impl'; +import startExecutor, { runCliStart } from '../start/start.impl'; import { chmodAndroidGradlewFiles } from '../../utils/chmod-android-gradle-files'; import { getCliOptions } from '../../utils/get-cli-options'; @@ -24,72 +19,52 @@ export default async function* runAndroidExecutor( ): AsyncGenerator<ReactNativeRunAndroidOutput> { const projectRoot = context.projectsConfigurations.projects[context.projectName].root; - ensureNodeModulesSymlink(context.root, projectRoot); chmodAndroidGradlewFiles(join(projectRoot, 'android')); - if (options.sync) { - displayNewlyAddedDepsMessage( - context.projectName, - await syncDeps( - context.projectName, - projectRoot, - context.root, - context.projectGraph - ) - ); + await runCliRunAndroid(context.root, projectRoot, options); + if (options.packager && options.mode !== 'Release') { + return startExecutor(options, context); } - try { - const tasks = [runCliRunAndroid(context.root, projectRoot, options)]; - if (options.packager) { - tasks.push( - runCliStart(context.root, projectRoot, { - port: options.port, - resetCache: options.resetCache, - interactive: options.interactive, - }) - ); - } - - await Promise.all(tasks); - - yield { success: true }; - } finally { - if (childProcess) { - childProcess.kill(); - } - } + yield { success: true }; } function runCliRunAndroid( workspaceRoot: string, projectRoot: string, options: ReactNativeRunAndroidOptions -) { - return new Promise((resolve, reject) => { +): Promise<ChildProcess> { + return new Promise<ChildProcess>((resolve, reject) => { /** * Call the react native cli with option `--no-packager` * Not passing '--packager' due to cli will launch start command from the project root */ childProcess = fork( - join(workspaceRoot, './node_modules/react-native/cli.js'), + require.resolve('react-native/cli.js'), ['run-android', ...createRunAndroidOptions(options), '--no-packager'], { - cwd: join(workspaceRoot, projectRoot), + stdio: 'inherit', + cwd: pathResolve(workspaceRoot, projectRoot), env: { ...process.env, RCT_METRO_PORT: options.port.toString() }, } ); - // Ensure the child process is killed when the parent exits - process.on('exit', () => childProcess.kill()); - process.on('SIGTERM', () => childProcess.kill()); + /** + * Ensure the child process is killed when the parent exits + */ + const processExitListener = (signal?: number | NodeJS.Signals) => () => + childProcess.kill(signal); + process.on('exit', processExitListener); + process.on('SIGTERM', processExitListener); + process.on('SIGINT', processExitListener); + process.on('SIGQUIT', processExitListener); childProcess.on('error', (err) => { reject(err); }); childProcess.on('exit', (code) => { if (code === 0) { - resolve(code); + resolve(childProcess); } else { reject(code); } diff --git a/packages/react-native/src/executors/run-android/schema.json b/packages/react-native/src/executors/run-android/schema.json index 41614a3ea66158..1854d664cd999a 100644 --- a/packages/react-native/src/executors/run-android/schema.json +++ b/packages/react-native/src/executors/run-android/schema.json @@ -77,10 +77,10 @@ "default": 8081 }, "tasks": { - "type": "array", - "items": { - "type": "string" - }, + "oneOf": [ + { "type": "array", "items": { "type": "string" } }, + { "type": "string" } + ], "description": "Run custom Gradle tasks. By default it's \"assembleDebug\". Will override passed mode and variant arguments.", "examples": [ "assembleDebug", @@ -97,7 +97,10 @@ "default": false }, "extraParams": { - "type": "string", + "oneOf": [ + { "type": "array", "items": { "type": "string" } }, + { "type": "string" } + ], "description": "Custom params passed to gradle build command" }, "interactive": { @@ -107,6 +110,7 @@ "sync": { "type": "boolean", "description": "Syncs npm dependencies to `package.json` (for React Native autolink).", + "x-deprecated": "Add sync-deps to dependsOn for this target in project.json instead", "default": true }, "resetCache": { diff --git a/packages/react-native/src/executors/run-ios/run-ios.impl.ts b/packages/react-native/src/executors/run-ios/run-ios.impl.ts index 62b4581e7ef755..cf45d3c3866291 100644 --- a/packages/react-native/src/executors/run-ios/run-ios.impl.ts +++ b/packages/react-native/src/executors/run-ios/run-ios.impl.ts @@ -1,24 +1,16 @@ import { ExecutorContext } from '@nx/devkit'; -import { join } from 'path'; +import { resolve as pathResolve } from 'path'; import { ChildProcess, fork } from 'child_process'; import { platform } from 'os'; -import { ensureNodeModulesSymlink } from '../../utils/ensure-node-modules-symlink'; -import { - displayNewlyAddedDepsMessage, - syncDeps, -} from '../sync-deps/sync-deps.impl'; -import { podInstall } from '../../utils/pod-install-task'; -import { ReactNativeRunIosOptions } from './schema'; -import { runCliStart } from '../start/start.impl'; +import startExecutor from '../start/start.impl'; import { getCliOptions } from '../../utils/get-cli-options'; +import { ReactNativeRunIosOptions } from './schema'; export interface ReactNativeRunIosOutput { success: boolean; } -let childProcess: ChildProcess; - export default async function* runIosExecutor( options: ReactNativeRunIosOptions, context: ExecutorContext @@ -28,77 +20,51 @@ export default async function* runIosExecutor( } const projectRoot = context.projectsConfigurations.projects[context.projectName].root; - ensureNodeModulesSymlink(context.root, projectRoot); - if (options.sync) { - displayNewlyAddedDepsMessage( - context.projectName, - await syncDeps( - context.projectName, - projectRoot, - context.root, - context.projectGraph - ) - ); - } - if (options.install) { - await podInstall( - join(context.root, projectRoot, 'ios'), - options.buildFolder - ); + await runCliRunIOS(context.root, projectRoot, options); + if (options.packager && options.mode !== 'Release') { + return startExecutor(options, context); } - try { - const tasks = [runCliRunIOS(context.root, projectRoot, options)]; - if (options.packager && options.mode !== 'Release') { - tasks.push( - runCliStart(context.root, projectRoot, { - port: options.port, - resetCache: options.resetCache, - interactive: options.interactive, - }) - ); - } - - await Promise.all(tasks); - - yield { success: true }; - } finally { - if (childProcess) { - childProcess.kill(); - } - } + yield { success: true }; } function runCliRunIOS( workspaceRoot: string, projectRoot: string, options: ReactNativeRunIosOptions -) { - return new Promise((resolve, reject) => { +): Promise<ChildProcess> { + return new Promise<ChildProcess>((resolve, reject) => { /** * Call the react native cli with option `--no-packager` * Not passing '--packager' due to cli will launch start command from the project root */ - childProcess = fork( - join(workspaceRoot, './node_modules/react-native/cli.js'), + const childProcess = fork( + require.resolve('react-native/cli.js'), ['run-ios', ...createRunIOSOptions(options), '--no-packager'], { - cwd: join(workspaceRoot, projectRoot), + stdio: 'inherit', + cwd: pathResolve(workspaceRoot, projectRoot), env: { ...process.env, RCT_METRO_PORT: options.port.toString() }, } ); - // Ensure the child process is killed when the parent exits - process.on('exit', () => childProcess.kill()); - process.on('SIGTERM', () => childProcess.kill()); + /** + * Ensure the child process is killed when the parent exits + */ + const processExitListener = (signal?: number | NodeJS.Signals) => () => + childProcess.kill(signal); + process.on('exit', processExitListener); + process.on('SIGTERM', processExitListener); + process.on('SIGINT', processExitListener); + process.on('SIGQUIT', processExitListener); childProcess.on('error', (err) => { reject(err); }); childProcess.on('exit', (code) => { if (code === 0) { - resolve(code); + resolve(childProcess); } else { reject(code); } diff --git a/packages/react-native/src/executors/run-ios/schema.json b/packages/react-native/src/executors/run-ios/schema.json index ca1182d5b473af..8759a936091a96 100644 --- a/packages/react-native/src/executors/run-ios/schema.json +++ b/packages/react-native/src/executors/run-ios/schema.json @@ -87,17 +87,22 @@ "description": "Explicitly select which scheme and configuration to use before running a build" }, "extraParams": { - "type": "string", + "oneOf": [ + { "type": "array", "items": { "type": "string" } }, + { "type": "string" } + ], "description": "Custom params that will be passed to xcodebuild command." }, "install": { "type": "boolean", "description": "Runs `pod install` for native modules before building iOS app.", - "default": true + "default": true, + "x-deprecated": "Add `pod-install` to dependsOn for this target in project.json instead." }, "sync": { "type": "boolean", "description": "Syncs npm dependencies to `package.json` (for React Native autolink).", + "x-deprecated": "Add `sync-deps` to dependsOn for this target in project.json instead.", "default": true }, "resetCache": { diff --git a/packages/react-native/src/executors/start/start.impl.ts b/packages/react-native/src/executors/start/start.impl.ts index 8155da595bdeb4..c312a3572099b9 100644 --- a/packages/react-native/src/executors/start/start.impl.ts +++ b/packages/react-native/src/executors/start/start.impl.ts @@ -1,7 +1,7 @@ import * as chalk from 'chalk'; import { ExecutorContext, logger } from '@nx/devkit'; import { ChildProcess, fork } from 'child_process'; -import { join } from 'path'; +import { resolve as pathResolve } from 'path'; import { ensureNodeModulesSymlink } from '../../utils/ensure-node-modules-symlink'; import { isPackagerRunning } from './lib/is-packager-running'; import { ReactNativeStartOptions } from './schema'; @@ -11,8 +11,6 @@ export interface ReactNativeStartOutput { success: boolean; } -let childProcess: ChildProcess; - export default async function* startExecutor( options: ReactNativeStartOptions, context: ExecutorContext @@ -21,27 +19,32 @@ export default async function* startExecutor( context.projectsConfigurations.projects[context.projectName].root; ensureNodeModulesSymlink(context.root, projectRoot); - try { - const baseUrl = `http://localhost:${options.port}`; - const appName = context.projectName; - logger.info(chalk.cyan(`Packager is ready at ${baseUrl}`)); - logger.info( - `Use ${chalk.bold(`nx run-android ${appName}`)} or ${chalk.bold( - `nx run-ios ${appName}` - )} to run the native app.` - ); + const baseUrl = `http://localhost:${options.port}`; + const appName = context.projectName; + logger.info(chalk.cyan(`Packager is ready at ${baseUrl}`)); + logger.info( + `Use ${chalk.bold(`nx run-android ${appName}`)} or ${chalk.bold( + `nx run-ios ${appName}` + )} to run the native app.` + ); + + const startProcess = await runCliStart(context.root, projectRoot, options); - await runCliStart(context.root, projectRoot, options); + yield { + baseUrl, + success: true, + }; - yield { - baseUrl, - success: true, + await new Promise<void>((resolve) => { + const processExitListener = (signal?: number | NodeJS.Signals) => () => { + startProcess.kill(signal); + resolve(); }; - } finally { - if (childProcess) { - childProcess.kill(); - } - } + process.on('exit', processExitListener); + process.on('SIGTERM', processExitListener); + process.on('SIGINT', processExitListener); + process.on('SIGQUIT', processExitListener); + }); } /* @@ -52,7 +55,7 @@ export async function runCliStart( workspaceRoot: string, projectRoot: string, options: ReactNativeStartOptions -): Promise<void> { +): Promise<ChildProcess> { const result = await isPackagerRunning(options.port); if (result === 'running') { logger.info('JS server already running.'); @@ -63,7 +66,7 @@ export async function runCliStart( logger.info('Starting JS server...'); try { - await startAsync(workspaceRoot, projectRoot, options); + return await startAsync(workspaceRoot, projectRoot, options); } catch (error) { logger.error( `Failed to start the packager server. Error details: ${error.message}` @@ -77,24 +80,34 @@ function startAsync( workspaceRoot: string, projectRoot: string, options: ReactNativeStartOptions -): Promise<number> { - return new Promise((resolve, reject) => { - childProcess = fork( - join(workspaceRoot, './node_modules/react-native/cli.js'), +): Promise<ChildProcess> { + return new Promise<ChildProcess>((resolve, reject) => { + const childProcess = fork( + require.resolve('react-native/cli.js'), ['start', ...createStartOptions(options)], - { cwd: join(workspaceRoot, projectRoot), env: process.env } + { + cwd: pathResolve(workspaceRoot, projectRoot), + env: process.env, + stdio: 'pipe', + } ); - // Ensure the child process is killed when the parent exits - process.on('exit', () => childProcess.kill()); - process.on('SIGTERM', () => childProcess.kill()); + childProcess.stdout.on('data', (data) => { + process.stdout.write(data); + if (data.toString().includes('Packager is ready')) { + resolve(childProcess); + } + }); + childProcess.stderr.on('data', (data) => { + process.stderr.write(data); + }); childProcess.on('error', (err) => { reject(err); }); childProcess.on('exit', (code) => { if (code === 0) { - resolve(code); + resolve(childProcess); } else { reject(code); } diff --git a/packages/react-native/src/generators/application/application.ts b/packages/react-native/src/generators/application/application.ts index 2381112bae027e..fa5f0224cc71cd 100644 --- a/packages/react-native/src/generators/application/application.ts +++ b/packages/react-native/src/generators/application/application.ts @@ -7,7 +7,6 @@ import { Tree, } from '@nx/devkit'; -import { runPodInstall } from '../../utils/pod-install-task'; import { runSymlink } from '../../utils/symlink-task'; import { addLinting } from '../../utils/add-linting'; import { addJest } from '../../utils/add-jest'; @@ -48,10 +47,6 @@ export async function reactNativeApplicationGenerator( ); const detoxTask = await addDetox(host, options); const symlinkTask = runSymlink(host.root, options.appProjectRoot); - const podInstallTask = runPodInstall( - joinPathFragments(host.root, options.iosProjectRoot), - options.install - ); const chmodTaskGradlew = chmodAndroidGradlewFilesTask( joinPathFragments(host.root, options.androidProjectRoot) ); @@ -66,7 +61,6 @@ export async function reactNativeApplicationGenerator( jestTask, detoxTask, symlinkTask, - podInstallTask, chmodTaskGradlew ); } diff --git a/packages/react-native/src/generators/application/files/app/.ruby-version b/packages/react-native/src/generators/application/files/app/.ruby-version deleted file mode 100644 index 49cdd668e1c82b..00000000000000 --- a/packages/react-native/src/generators/application/files/app/.ruby-version +++ /dev/null @@ -1 +0,0 @@ -2.7.6 diff --git a/packages/react-native/src/generators/application/files/app/Gemfile.template b/packages/react-native/src/generators/application/files/app/Gemfile.template index 567e59805c4a73..1fa2c2e1abdee6 100644 --- a/packages/react-native/src/generators/application/files/app/Gemfile.template +++ b/packages/react-native/src/generators/application/files/app/Gemfile.template @@ -1,6 +1,6 @@ source 'https://rubygems.org' # You may use http://rbenv.org/ or https://rvm.io/ to install and use this version -ruby File.read(File.join(__dir__, '.ruby-version')).strip +ruby ">= 2.6.10" -gem 'cocoapods', '~> 1.11', '>= 1.11.3' +gem 'cocoapods', '~> 1.12' diff --git a/packages/react-native/src/generators/application/files/app/android/app/build.gradle.template b/packages/react-native/src/generators/application/files/app/android/app/build.gradle.template index 8ce7b1ab639de5..1fc5a2aeb56438 100644 --- a/packages/react-native/src/generators/application/files/app/android/app/build.gradle.template +++ b/packages/react-native/src/generators/application/files/app/android/app/build.gradle.template @@ -1,8 +1,6 @@ apply plugin: "com.android.application" apply plugin: "com.facebook.react" -import com.android.build.OutputFile - /** * This is the configuration block to customize your React Native Android app. * By default you don't need to apply any configuration, just uncomment the lines you need. @@ -13,8 +11,8 @@ react { // root = file("../") // The folder where the react-native NPM package is. Default is ../node_modules/react-native // reactNativeDir = file("../node_modules/react-native") - // The folder where the react-native Codegen package is. Default is ../node_modules/react-native-codegen - // codegenDir = file("../node_modules/react-native-codegen") + // The folder where the react-native Codegen package is. Default is ../node_modules/@react-native/codegen + // codegenDir = file("../node_modules/@react-native/codegen") // The cli.js file which is the React Native CLI entrypoint. Default is ../node_modules/react-native/cli.js // cliFile = file("../node_modules/react-native/cli.js") @@ -53,14 +51,6 @@ react { entryFile = file("../../<%= entryFile %>") } -/** - * Set this to true to create four separate APKs instead of one, - * one for each native architecture. This is useful if you don't - * use App Bundles (https://developer.android.com/guide/app-bundle/) - * and want to have separate APKs to upload to the Play Store. - */ -def enableSeparateBuildPerCPUArchitecture = false - /** * Set this to true to Run Proguard on Release builds to minify the Java bytecode. */ @@ -79,16 +69,6 @@ def enableProguardInReleaseBuilds = false */ def jscFlavor = 'org.webkit:android-jsc:+' -/** - * Private function to get the list of Native Architectures you want to build. - * This reads the value from reactNativeArchitectures in your gradle.properties - * file and works together with the --active-arch-only flag of react-native run-android. - */ -def reactNativeArchitectures() { - def value = project.getProperties().get("reactNativeArchitectures") - return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"] -} - android { ndkVersion rootProject.ext.ndkVersion @@ -106,15 +86,6 @@ android { testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' <% } %> } - - splits { - abi { - reset() - enable enableSeparateBuildPerCPUArchitecture - universalApk false // If true, also generate a universal APK - include (*reactNativeArchitectures()) - } - } signingConfigs { debug { storeFile file('debug.keystore') @@ -138,22 +109,6 @@ android { <% } %> } } - - // applicationVariants are e.g. debug, release - applicationVariants.all { variant -> - variant.outputs.each { output -> - // For each separate APK per architecture, set a unique version code as described here: - // https://developer.android.com/studio/build/configure-apk-splits.html - // Example: versionCode 1 will generate 1001 for armeabi-v7a, 1002 for x86, etc. - def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4] - def abi = output.getFilter(OutputFile.ABI) - if (abi != null) { // null for the universal-debug, universal-release variants - output.versionCodeOverride = - defaultConfig.versionCode * 1000 + versionCodes.get(abi) - } - - } - } } dependencies { @@ -164,8 +119,6 @@ dependencies { // The version of react-native is set by the React Native Gradle Plugin implementation("com.facebook.react:react-android") - implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.0.0") - debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") { exclude group:'com.squareup.okhttp3', module:'okhttp' diff --git a/packages/react-native/src/generators/application/files/app/android/app/src/main/java/com/__lowerCaseName__/MainActivity.java.template b/packages/react-native/src/generators/application/files/app/android/app/src/main/java/com/__lowerCaseName__/MainActivity.java.template index 629bff52ba19fc..981e6233377b76 100644 --- a/packages/react-native/src/generators/application/files/app/android/app/src/main/java/com/__lowerCaseName__/MainActivity.java.template +++ b/packages/react-native/src/generators/application/files/app/android/app/src/main/java/com/__lowerCaseName__/MainActivity.java.template @@ -1,4 +1,4 @@ -package com.<%= lowerCaseName %>; +package com.<%= className %>; import com.facebook.react.ReactActivity; import com.facebook.react.ReactActivityDelegate; @@ -27,9 +27,6 @@ public class MainActivity extends ReactActivity { this, getMainComponentName(), // If you opted-in for the New Architecture, we enable the Fabric Renderer. - DefaultNewArchitectureEntryPoint.getFabricEnabled(), // fabricEnabled - // If you opted-in for the New Architecture, we enable Concurrent React (i.e. React 18). - DefaultNewArchitectureEntryPoint.getConcurrentReactEnabled() // concurrentRootEnabled - ); + DefaultNewArchitectureEntryPoint.getFabricEnabled()); } } diff --git a/packages/react-native/src/generators/application/files/app/android/app/src/main/res/drawable/rn_edit_text_material.xml b/packages/react-native/src/generators/application/files/app/android/app/src/main/res/drawable/rn_edit_text_material.xml index f35d9962026a85..73b37e4d9963e2 100644 --- a/packages/react-native/src/generators/application/files/app/android/app/src/main/res/drawable/rn_edit_text_material.xml +++ b/packages/react-native/src/generators/application/files/app/android/app/src/main/res/drawable/rn_edit_text_material.xml @@ -20,7 +20,7 @@ android:insetBottom="@dimen/abc_edit_text_inset_bottom_material"> <selector> - <!-- + <!-- This file is a copy of abc_edit_text_material (https://bit.ly/3k8fX7I). The item below with state_pressed="false" and state_focused="false" causes a NullPointerException. NullPointerException:tempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)' diff --git a/packages/react-native/src/generators/application/files/app/android/build.gradle.template b/packages/react-native/src/generators/application/files/app/android/build.gradle.template index d00fc8664e1db4..d73116028ca365 100644 --- a/packages/react-native/src/generators/application/files/app/android/build.gradle.template +++ b/packages/react-native/src/generators/application/files/app/android/build.gradle.template @@ -16,7 +16,7 @@ buildscript { mavenCentral() } dependencies { - classpath("com.android.tools.build:gradle:7.3.1") + classpath("com.android.tools.build:gradle") classpath("com.facebook.react:react-native-gradle-plugin") classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion") } diff --git a/packages/react-native/src/generators/application/files/app/android/gradle.properties b/packages/react-native/src/generators/application/files/app/android/gradle.properties index e4af465e8a1857..a3b2fa12490544 100644 --- a/packages/react-native/src/generators/application/files/app/android/gradle.properties +++ b/packages/react-native/src/generators/application/files/app/android/gradle.properties @@ -25,7 +25,7 @@ android.useAndroidX=true android.enableJetifier=true # Version of flipper SDK to use with React Native -FLIPPER_VERSION=0.125.0 +FLIPPER_VERSION=0.182.0 # Use this property to specify which architecture you want to build. # You can also override it from the CLI using diff --git a/packages/react-native/src/generators/application/files/app/android/gradle/wrapper/gradle-wrapper.jar b/packages/react-native/src/generators/application/files/app/android/gradle/wrapper/gradle-wrapper.jar index 41d9927a4d4fb3f96a785543079b8df6723c946b..943f0cbfa754578e88a3dae77fce6e3dea56edbf 100644 GIT binary patch delta 36987 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 delta 35297 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 VBfu2+*qg&~f-ihLS3eum{s(|${^$Sz diff --git a/packages/react-native/src/generators/application/files/app/android/gradle/wrapper/gradle-wrapper.properties b/packages/react-native/src/generators/application/files/app/android/gradle/wrapper/gradle-wrapper.properties index 8fad3f5a98bf4a..6ec1567a0f8831 100644 --- a/packages/react-native/src/generators/application/files/app/android/gradle/wrapper/gradle-wrapper.properties +++ b/packages/react-native/src/generators/application/files/app/android/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.1-all.zip +networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/packages/react-native/src/generators/application/files/app/android/gradlew.bat b/packages/react-native/src/generators/application/files/app/android/gradlew.bat index 107acd32c4e687..93e3f59f135dd2 100644 --- a/packages/react-native/src/generators/application/files/app/android/gradlew.bat +++ b/packages/react-native/src/generators/application/files/app/android/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/packages/react-native/src/generators/application/files/app/android/gradlew.template b/packages/react-native/src/generators/application/files/app/android/gradlew.template index 1b6c787337ffb7..65dcd68d65c82f 100755 --- a/packages/react-native/src/generators/application/files/app/android/gradlew.template +++ b/packages/react-native/src/generators/application/files/app/android/gradlew.template @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,10 +80,10 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' @@ -143,12 +143,16 @@ fi if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -205,6 +209,12 @@ set -- \ org.gradle.wrapper.GradleWrapperMain \ "$@" +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/packages/react-native/src/generators/application/files/app/android/settings.gradle.template b/packages/react-native/src/generators/application/files/app/android/settings.gradle.template index 29e92ff2301799..f63882142348ae 100644 --- a/packages/react-native/src/generators/application/files/app/android/settings.gradle.template +++ b/packages/react-native/src/generators/application/files/app/android/settings.gradle.template @@ -1,5 +1,4 @@ rootProject.name = '<%= className %>' - apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) include ':app' -includeBuild('../node_modules/react-native-gradle-plugin') +includeBuild('../node_modules/@react-native/gradle-plugin') diff --git a/packages/react-native/src/generators/application/files/app/ios/Podfile.template b/packages/react-native/src/generators/application/files/app/ios/Podfile.template index 2d038d0f829a88..66dbc3b75c62dc 100644 --- a/packages/react-native/src/generators/application/files/app/ios/Podfile.template +++ b/packages/react-native/src/generators/application/files/app/ios/Podfile.template @@ -1,5 +1,9 @@ -require_relative '<%= offsetFromRoot %>../node_modules/react-native/scripts/react_native_pods' -require_relative '<%= offsetFromRoot %>../node_modules/@react-native-community/cli-platform-ios/native_modules' +# Resolve react_native_pods.rb with node to allow for hoisting +require Pod::Executable.execute_command('node', ['-p', + 'require.resolve( + "react-native/scripts/react_native_pods.rb", + {paths: [process.argv[1]]}, + )', __dir__]).strip platform :ios, min_ios_version_supported prepare_react_native_project! @@ -30,8 +34,6 @@ target '<%= className %>' do use_react_native!( :path => config[:reactNativePath], # Hermes is now enabled by default. Disable by setting this flag to false. - # Upcoming versions of React Native may rely on get_default_flags(), but - # we make it explicit here to aid in the React Native upgrade process. :hermes_enabled => flags[:hermes_enabled], :fabric_enabled => flags[:fabric_enabled], # Enables Flipper. @@ -49,10 +51,10 @@ target '<%= className %>' do end post_install do |installer| + # https://github.com/facebook/react-native/blob/main/packages/react-native/scripts/react_native_pods.rb#L197-L202 react_native_post_install( installer, - # Set `mac_catalyst_enabled` to `true` in order to apply patches - # necessary for Mac Catalyst builds + config[:reactNativePath], :mac_catalyst_enabled => false ) __apply_Xcode_12_5_M1_post_install_workaround(installer) diff --git a/packages/react-native/src/generators/application/files/app/ios/__className__.xcodeproj/project.pbxproj.template b/packages/react-native/src/generators/application/files/app/ios/__className__.xcodeproj/project.pbxproj.template index e1562dda2444fb..f7e32c049d8f31 100644 --- a/packages/react-native/src/generators/application/files/app/ios/__className__.xcodeproj/project.pbxproj.template +++ b/packages/react-native/src/generators/application/files/app/ios/__className__.xcodeproj/project.pbxproj.template @@ -564,7 +564,7 @@ COPY_PHASE_STRIP = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; - "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -592,12 +592,14 @@ ); MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; + OTHER_CFLAGS = "$(inherited)"; OTHER_CPLUSPLUSFLAGS = ( "$(OTHER_CFLAGS)", "-DFOLLY_NO_CONFIG", "-DFOLLY_MOBILE=1", "-DFOLLY_USE_LIBCPP=1", ); + REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; }; name = Debug; @@ -635,7 +637,7 @@ COPY_PHASE_STRIP = YES; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = i386; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -655,12 +657,14 @@ "\"$(inherited)\"", ); MTL_ENABLE_DEBUG_INFO = NO; + OTHER_CFLAGS = "$(inherited)"; OTHER_CPLUSPLUSFLAGS = ( "$(OTHER_CFLAGS)", "-DFOLLY_NO_CONFIG", "-DFOLLY_MOBILE=1", "-DFOLLY_USE_LIBCPP=1", ); + REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; diff --git a/packages/react-native/src/generators/application/files/app/ios/__className__/AppDelegate.mm.template b/packages/react-native/src/generators/application/files/app/ios/__className__/AppDelegate.mm.template index 7c42f8c5adab6f..c9fa608d40b91e 100644 --- a/packages/react-native/src/generators/application/files/app/ios/__className__/AppDelegate.mm.template +++ b/packages/react-native/src/generators/application/files/app/ios/__className__/AppDelegate.mm.template @@ -23,14 +23,4 @@ #endif } -/// This method controls whether the `concurrentRoot`feature of React18 is turned on or off. -/// -/// @see: https://reactjs.org/blog/2022/03/29/react-v18.html -/// @note: This requires to be rendering on Fabric (i.e. on the New Architecture). -/// @return: `true` if the `concurrentRoot` feature is enabled. Otherwise, it returns `false`. -- (BOOL)concurrentRootEnabled -{ - return true; -} - @end diff --git a/packages/react-native/src/generators/application/files/app/metro.config.js.template b/packages/react-native/src/generators/application/files/app/metro.config.js.template index 6e58334d057dc0..3974d7968078da 100644 --- a/packages/react-native/src/generators/application/files/app/metro.config.js.template +++ b/packages/react-native/src/generators/application/files/app/metro.config.js.template @@ -1,38 +1,35 @@ const { withNxMetro } = require('@nx/react-native'); -const { getDefaultConfig } = require('metro-config'); +const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config'); const exclusionList = require('metro-config/src/defaults/exclusionList'); -module.exports = (async () => { - const { - resolver: { sourceExts, assetExts }, - } = await getDefaultConfig(); - return withNxMetro( - { - transformer: { - getTransformOptions: async () => ({ - transform: { - experimentalImportSupport: false, - inlineRequires: true, - }, - }), - babelTransformerPath: require.resolve('react-native-svg-transformer'), - }, - resolver: { - assetExts: assetExts.filter((ext) => ext !== 'svg'), - sourceExts: [...sourceExts, 'svg'], - blockList: exclusionList([/^(?!.*node_modules).*\/dist\/.*/]), - }, - }, - { - // Change this to true to see debugging info. - // Useful if you have issues resolving modules - debug: false, - // all the file extensions used for imports other than 'ts', 'tsx', 'js', 'jsx', 'json' - extensions: [], - // the project root to start the metro server - projectRoot: __dirname, - // Specify folders to watch, in addition to Nx defaults (workspace libraries and node_modules) - watchFolders: [] - } - ); -})(); +const defaultConfig = getDefaultConfig(__dirname); +const { assetExts, sourceExts } = defaultConfig.resolver; + +/** + * Metro configuration + * https://facebook.github.io/metro/docs/configuration + * + * @type {import('metro-config').MetroConfig} + */ +const customConfig = { + transformer: { + babelTransformerPath: require.resolve('react-native-svg-transformer'), + }, + resolver: { + assetExts: assetExts.filter((ext) => ext !== 'svg'), + sourceExts: [...sourceExts, 'svg'], + blockList: exclusionList([/^(?!.*node_modules).*\/dist\/.*/]), + unstable_enableSymlinks: true, + unstable_enablePackageExports: true, + }, +}; + +module.exports = withNxMetro(mergeConfig(defaultConfig, customConfig), { + // Change this to true to see debugging info. + // Useful if you have issues resolving modules + debug: false, + // all the file extensions used for imports other than 'ts', 'tsx', 'js', 'jsx', 'json' + extensions: [], + // Specify folders to watch, in addition to Nx defaults (workspace libraries and node_modules) + watchFolders: [], +}); diff --git a/packages/react-native/src/generators/application/lib/add-project.ts b/packages/react-native/src/generators/application/lib/add-project.ts index c54c580a98b589..8a3220d16ef46b 100644 --- a/packages/react-native/src/generators/application/lib/add-project.ts +++ b/packages/react-native/src/generators/application/lib/add-project.ts @@ -25,6 +25,7 @@ function getTargets(options: NormalizedSchema) { architect.start = { executor: '@nx/react-native:start', + dependsOn: ['ensure-symlink', 'sync-deps', 'pod-install'], options: { port: 8081, }, @@ -39,11 +40,13 @@ function getTargets(options: NormalizedSchema) { architect['run-ios'] = { executor: '@nx/react-native:run-ios', + dependsOn: ['ensure-symlink', 'sync-deps', 'pod-install'], options: {}, }; architect['bundle-ios'] = { executor: '@nx/react-native:bundle', + dependsOn: ['ensure-symlink'], outputs: ['{options.bundleOutput}'], options: { entryFile: options.entryFile, @@ -54,6 +57,7 @@ function getTargets(options: NormalizedSchema) { architect['run-android'] = { executor: '@nx/react-native:run-android', + dependsOn: ['ensure-symlink', 'sync-deps'], options: {}, }; @@ -63,12 +67,14 @@ function getTargets(options: NormalizedSchema) { `{projectRoot}/android/app/build/outputs/bundle`, `{projectRoot}/android/app/build/outputs/apk`, ], + dependsOn: ['ensure-symlink', 'sync-deps'], options: {}, }; architect['build-ios'] = { executor: '@nx/react-native:build-ios', outputs: ['{projectRoot}/ios/build/Build'], + dependsOn: ['ensure-symlink', 'sync-deps', 'pod-install'], options: {}, }; @@ -79,6 +85,7 @@ function getTargets(options: NormalizedSchema) { architect['bundle-android'] = { executor: '@nx/react-native:bundle', + dependsOn: ['ensure-symlink'], outputs: ['{options.bundleOutput}'], options: { entryFile: options.entryFile, diff --git a/packages/react-native/src/generators/init/init.ts b/packages/react-native/src/generators/init/init.ts index c5a42c9ea49094..1ca0fbf3e4ff9d 100644 --- a/packages/react-native/src/generators/init/init.ts +++ b/packages/react-native/src/generators/init/init.ts @@ -24,6 +24,7 @@ import { reactNativeCommunityCli, reactNativeCommunityCliAndroid, reactNativeCommunityCliIos, + reactNativeMetroConfigVersion, reactNativeSvgTransformerVersion, reactNativeSvgVersion, reactNativeVersion, @@ -90,6 +91,7 @@ export function updateDependencies(host: Tree) { '@types/node': typesNodeVersion, '@types/react': typesReactVersion, '@types/react-native': typesReactNativeVersion, + '@react-native/metro-config': reactNativeMetroConfigVersion, '@react-native-community/cli': reactNativeCommunityCli, '@react-native-community/cli-platform-android': reactNativeCommunityCliAndroid, @@ -98,6 +100,7 @@ export function updateDependencies(host: Tree) { '@testing-library/jest-native': testingLibraryJestNativeVersion, 'jest-react-native': jestReactNativeVersion, metro: metroVersion, + 'metro-config': metroVersion, 'metro-resolver': metroVersion, 'metro-babel-register': metroVersion, 'metro-react-native-babel-preset': metroVersion, @@ -108,7 +111,6 @@ export function updateDependencies(host: Tree) { '@babel/preset-react': babelPresetReactVersion, ...(isPnpm ? { - 'metro-config': metroVersion, // metro-config is used by metro.config.js '@babel/runtime': babelRuntimeVersion, // @babel/runtime is used by react-native-svg } : {}), diff --git a/packages/react-native/src/migrations/update-16-5-0/add-depends-on.ts b/packages/react-native/src/migrations/update-16-5-0/add-depends-on.ts new file mode 100644 index 00000000000000..ba96214e9b9f8a --- /dev/null +++ b/packages/react-native/src/migrations/update-16-5-0/add-depends-on.ts @@ -0,0 +1,46 @@ +import { + Tree, + formatFiles, + getProjects, + updateProjectConfiguration, +} from '@nx/devkit'; + +/** + * This migration adds dependsOn to project.json. + * + */ +export default async function update(tree: Tree) { + const projects = getProjects(tree); + + for (const [name, config] of projects.entries()) { + if (config.targets?.['start']?.executor === '@nx/react-native:start') { + config.targets['start'].dependsOn = [ + 'ensure-symlink', + 'sync-deps', + 'pod-install', + ]; + config.targets['run-ios'].dependsOn = [ + 'ensure-symlink', + 'sync-deps', + 'pod-install', + ]; + config.targets['bundle-ios'].dependsOn = ['ensure-symlink']; + config.targets['run-android'].dependsOn = ['ensure-symlink', 'sync-deps']; + config.targets['build-android'].dependsOn = [ + 'ensure-symlink', + 'sync-deps', + ]; + config.targets['build-ios'].dependsOn = [ + 'ensure-symlink', + 'sync-deps', + 'pod-install', + ]; + config.targets['pod-install'].dependsOn = ['ensure-symlink', 'sync-deps']; + config.targets['bundle-android'].dependsOn = ['ensure-symlink']; + + updateProjectConfiguration(tree, name, config); + } + } + + await formatFiles(tree); +} diff --git a/packages/react-native/src/utils/get-cli-options.ts b/packages/react-native/src/utils/get-cli-options.ts index c2e183c53c7fdf..500a6281f9a9dc 100644 --- a/packages/react-native/src/utils/get-cli-options.ts +++ b/packages/react-native/src/utils/get-cli-options.ts @@ -18,7 +18,9 @@ export function getCliOptions<T>( const cliKey = optionKeysInCamelName.includes(optionKey) ? names(optionKey).propertyName : names(optionKey).fileName; // cli uses kebab case as default - if (typeof optionValue === 'boolean' && optionValue) { + if (Array.isArray(optionValue)) { + acc.push(`--${cliKey}`, optionValue.join(',')); + } else if (typeof optionValue === 'boolean' && optionValue) { // no need to pass in the value when it is true, just the flag name acc.push(`--${cliKey}`); } else { diff --git a/packages/react-native/src/utils/pod-install-task.ts b/packages/react-native/src/utils/pod-install-task.ts index 6b860903bbb2bc..77d317ab2c2ecf 100644 --- a/packages/react-native/src/utils/pod-install-task.ts +++ b/packages/react-native/src/utils/pod-install-task.ts @@ -24,7 +24,15 @@ ${chalk.bold('sudo xcode-select --switch /Applications/Xcode.app')} export function runPodInstall( iosDirectory: string, install: boolean = true, - buildFolder?: string + options: { + buildFolder?: string; + repoUpdate?: boolean; + deployment?: boolean; + } = { + buildFolder: './build', + repoUpdate: false, + deployment: false, + } ): GeneratorCallback { return () => { if (platform() !== 'darwin') { @@ -39,16 +47,32 @@ export function runPodInstall( logger.info(`Running \`pod install\` from "${iosDirectory}"`); - return podInstall(iosDirectory, buildFolder); + return podInstall(iosDirectory, options); }; } -export function podInstall(iosDirectory: string, buildFolder?: string) { +export function podInstall( + iosDirectory: string, + options: { + buildFolder?: string; + repoUpdate?: boolean; + deployment?: boolean; + } = { + buildFolder: './build', + repoUpdate: false, + deployment: false, + } +) { try { - execSync('pod install', { - cwd: iosDirectory, - stdio: 'inherit', - }); + execSync( + `pod install ${options ? '--repo-update' : ''} ${ + options.deployment ? '--deployment' : '' + }`, + { + cwd: iosDirectory, + stdio: 'inherit', + } + ); } catch (e) { logger.error(podInstallErrorMessage); throw e; diff --git a/packages/react-native/src/utils/versions.ts b/packages/react-native/src/utils/versions.ts index d69407002fa498..a11d4e9829d2be 100644 --- a/packages/react-native/src/utils/versions.ts +++ b/packages/react-native/src/utils/versions.ts @@ -1,15 +1,16 @@ export const nxVersion = require('../../package.json').version; -export const reactNativeVersion = '0.71.10'; -export const typesReactNativeVersion = '0.71.7'; +export const reactNativeVersion = '0.72.1'; +export const typesReactNativeVersion = '0.72.2'; export const typesNodeVersion = '18.14.4'; -export const metroVersion = '0.74.1'; +export const metroVersion = '0.76.5'; +export const reactNativeMetroConfigVersion = '0.72.7'; -export const reactNativeCommunityCli = '10.2.2'; -export const reactNativeCommunityCliIos = '10.2.1'; -export const reactNativeCommunityCliAndroid = '10.2.0'; +export const reactNativeCommunityCli = '11.3.3'; +export const reactNativeCommunityCliIos = '11.3.3'; +export const reactNativeCommunityCliAndroid = '11.3.3'; export const reactVersion = '18.2.0'; export const reactDomVersion = '18.2.0'; @@ -24,7 +25,7 @@ export const jestReactNativeVersion = '18.0.0'; export const reactNativeSvgTransformerVersion = '1.0.0'; export const reactNativeSvgVersion = '13.9.0'; -export const babelRuntimeVersion = '7.21.0'; +export const babelRuntimeVersion = '7.22.6'; -export const reactNativeAsyncStorageVersion = '1.18.2'; -export const reactNativeSafeAreaContextVersion = '4.5.3'; +export const reactNativeAsyncStorageVersion = '1.19.0'; +export const reactNativeSafeAreaContextVersion = '4.6.4'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a32cb17e36dd51..8b3b6957671417 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,9 +1,5 @@ lockfileVersion: '6.0' -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - overrides: minimist: ^1.2.6 underscore: ^1.12.1 @@ -682,9 +678,12 @@ devDependencies: memfs: specifier: ^3.0.1 version: 3.4.7 + metro-config: + specifier: 0.76.5 + version: 0.76.5 metro-resolver: - specifier: ^0.74.1 - version: 0.74.1 + specifier: 0.76.5 + version: 0.76.5 mini-css-extract-plugin: specifier: ~2.4.7 version: 2.4.7(webpack@5.88.0) @@ -1527,7 +1526,7 @@ packages: resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.18.6 + '@babel/highlight': 7.22.5 /@babel/code-frame@7.22.5: resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==} @@ -1535,14 +1534,9 @@ packages: dependencies: '@babel/highlight': 7.22.5 - /@babel/compat-data@7.21.4: - resolution: {integrity: sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==} - engines: {node: '>=6.9.0'} - /@babel/compat-data@7.22.5: resolution: {integrity: sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==} engines: {node: '>=6.9.0'} - dev: true /@babel/core@7.19.0: resolution: {integrity: sha512-reM4+U7B9ss148rh2n1Qs9ASS+w94irYXga7c2jaQv9RVzpS7Mv1a9rnYYwuDa45G+DkORt9g6An2k/V4d9LbQ==} @@ -1657,7 +1651,7 @@ packages: resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.4 + '@babel/types': 7.22.5 dev: true /@babel/helper-annotate-as-pure@7.22.5: @@ -1680,7 +1674,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/compat-data': 7.21.4 + '@babel/compat-data': 7.22.5 '@babel/core': 7.19.0 '@babel/helper-validator-option': 7.22.5 browserslist: 4.21.7 @@ -1743,63 +1737,6 @@ packages: semver: 6.3.0 dev: true - /@babel/helper-create-class-features-plugin@7.21.4(@babel/core@7.19.0): - resolution: {integrity: sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.19.0 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-member-expression-to-functions': 7.22.5 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-create-class-features-plugin@7.21.4(@babel/core@7.21.4): - resolution: {integrity: sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-member-expression-to-functions': 7.22.5 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-create-class-features-plugin@7.21.4(@babel/core@7.22.5): - resolution: {integrity: sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.22.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 - '@babel/helper-member-expression-to-functions': 7.22.5 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.5 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helper-create-class-features-plugin@7.22.5(@babel/core@7.19.0): resolution: {integrity: sha512-xkb58MyOYIslxu3gKmVXmjTtUPvBU4odYzbiIQbWwLKIHCsx6UGZGX6F1IznMFVnDdirseUZopzN+ZRt8Xb33Q==} engines: {node: '>=6.9.0'} @@ -1943,21 +1880,10 @@ packages: - supports-color dev: true - /@babel/helper-environment-visitor@7.18.9: - resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} - engines: {node: '>=6.9.0'} - /@babel/helper-environment-visitor@7.22.5: resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} engines: {node: '>=6.9.0'} - /@babel/helper-function-name@7.21.0: - resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.5 - '@babel/types': 7.22.5 - /@babel/helper-function-name@7.22.5: resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} engines: {node: '>=6.9.0'} @@ -1965,12 +1891,6 @@ packages: '@babel/template': 7.22.5 '@babel/types': 7.22.5 - /@babel/helper-hoist-variables@7.18.6: - resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} @@ -1988,7 +1908,7 @@ packages: resolution: {integrity: sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.21.4 + '@babel/types': 7.22.5 dev: true /@babel/helper-module-imports@7.22.5: @@ -2001,11 +1921,11 @@ packages: resolution: {integrity: sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-environment-visitor': 7.22.5 '@babel/helper-module-imports': 7.22.5 - '@babel/helper-simple-access': 7.20.2 + '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.5 - '@babel/helper-validator-identifier': 7.19.1 + '@babel/helper-validator-identifier': 7.22.5 '@babel/template': 7.22.5 '@babel/traverse': 7.22.5 '@babel/types': 7.22.5 @@ -2119,18 +2039,11 @@ packages: - supports-color dev: true - /@babel/helper-simple-access@7.20.2: - resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.22.5 - /@babel/helper-simple-access@7.22.5: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.22.5 - dev: true /@babel/helper-skip-transparent-expression-wrappers@7.22.5: resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} @@ -2145,18 +2058,10 @@ packages: dependencies: '@babel/types': 7.22.5 - /@babel/helper-string-parser@7.19.4: - resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} - engines: {node: '>=6.9.0'} - /@babel/helper-string-parser@7.22.5: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-identifier@7.19.1: - resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} - engines: {node: '>=6.9.0'} - /@babel/helper-validator-identifier@7.22.5: resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} engines: {node: '>=6.9.0'} @@ -2203,14 +2108,6 @@ packages: - supports-color dev: true - /@babel/highlight@7.18.6: - resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.5 - chalk: 2.4.2 - js-tokens: 4.0.0 - /@babel/highlight@7.22.5: resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} engines: {node: '>=6.9.0'} @@ -2398,6 +2295,17 @@ packages: '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.21.4) dev: true + /@babel/plugin-proposal-export-default-from@7.22.5(@babel/core@7.22.5): + resolution: {integrity: sha512-UCe1X/hplyv6A5g2WnQ90tnHRvYL29dabCWww92lO7VdfMVTVReBTRrhiMrKQejHD9oVkdnRdwYuzUZkBVQisg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-export-default-from': 7.22.5(@babel/core@7.22.5) + dev: true + /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.21.4): resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} engines: {node: '>=6.9.0'} @@ -2442,6 +2350,17 @@ packages: '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.21.4) dev: true + /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.22.5): + resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.5) + dev: true + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} @@ -2453,6 +2372,17 @@ packages: '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.21.4) dev: true + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.22.5): + resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.5) + dev: true + /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.21.4): resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} engines: {node: '>=6.9.0'} @@ -2467,6 +2397,20 @@ packages: '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.21.4) dev: true + /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.22.5): + resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.22.5 + '@babel/core': 7.22.5 + '@babel/helper-compilation-targets': 7.22.5(@babel/core@7.22.5) + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.5) + '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.5) + dev: true + /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} engines: {node: '>=6.9.0'} @@ -2478,6 +2422,17 @@ packages: '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.21.4) dev: true + /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.22.5): + resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.5) + dev: true + /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.21.4): resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} engines: {node: '>=6.9.0'} @@ -2490,6 +2445,18 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.21.4) dev: true + /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.22.5): + resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.5) + dev: true + /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.21.4): resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} @@ -2688,6 +2655,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-export-default-from@7.22.5(@babel/core@7.22.5): + resolution: {integrity: sha512-ODAqWWXB/yReh/jVQDag/3/tl6lgBueQkk/TcfW/59Oykm4c8a55XloX0CTk2k2VJiFWMgHby9xNX29IbCv9dQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.21.4): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: @@ -2716,6 +2693,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-flow@7.18.6(@babel/core@7.22.5): + resolution: {integrity: sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-import-assertions@7.22.5(@babel/core@7.21.4): resolution: {integrity: sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==} engines: {node: '>=6.9.0'} @@ -3392,6 +3379,17 @@ packages: '@babel/plugin-syntax-flow': 7.18.6(@babel/core@7.19.0) dev: true + /@babel/plugin-transform-flow-strip-types@7.21.0(@babel/core@7.22.5): + resolution: {integrity: sha512-FlFA2Mj87a6sDkW4gfGrQQqwY/dLlBAyJa2dJEZ+FHXUVHBflO2wyKvg+OOEzXfrKYIa4HWl0mgmbCzt0cMb7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-flow': 7.18.6(@babel/core@7.22.5) + dev: true + /@babel/plugin-transform-for-of@7.22.5(@babel/core@7.21.4): resolution: {integrity: sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==} engines: {node: '>=6.9.0'} @@ -3832,7 +3830,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.19.0 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-transform-react-display-name@7.18.6(@babel/core@7.21.4): @@ -3842,7 +3840,17 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-react-display-name@7.18.6(@babel/core@7.22.5): + resolution: {integrity: sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-transform-react-jsx-development@7.18.6(@babel/core@7.19.0): @@ -3865,6 +3873,26 @@ packages: '@babel/plugin-transform-react-jsx': 7.21.0(@babel/core@7.21.4) dev: true + /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.22.5): + resolution: {integrity: sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.22.5): + resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-react-jsx@7.21.0(@babel/core@7.19.0): resolution: {integrity: sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg==} engines: {node: '>=6.9.0'} @@ -3872,11 +3900,11 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.19.0 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-module-imports': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.19.0) - '@babel/types': 7.21.4 + '@babel/types': 7.22.5 dev: true /@babel/plugin-transform-react-jsx@7.21.0(@babel/core@7.21.4): @@ -3886,11 +3914,11 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-module-imports': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.21.4) - '@babel/types': 7.21.4 + '@babel/types': 7.22.5 dev: true /@babel/plugin-transform-react-jsx@7.21.0(@babel/core@7.22.5): @@ -3900,11 +3928,11 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.5 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-module-imports': 7.21.4 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.22.5) - '@babel/types': 7.21.4 + '@babel/types': 7.22.5 dev: true /@babel/plugin-transform-react-pure-annotations@7.18.6(@babel/core@7.19.0): @@ -3914,8 +3942,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.19.0 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-transform-react-pure-annotations@7.18.6(@babel/core@7.21.4): @@ -3925,8 +3953,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-transform-regenerator@7.22.5(@babel/core@7.21.4): @@ -4114,9 +4142,9 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.19.0 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.19.0) - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.5(@babel/core@7.19.0) + '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-typescript': 7.20.0(@babel/core@7.19.0) transitivePeerDependencies: - supports-color @@ -4129,9 +4157,9 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.4 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.21.4) - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.5(@babel/core@7.21.4) + '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-typescript': 7.20.0(@babel/core@7.21.4) transitivePeerDependencies: - supports-color @@ -4144,9 +4172,9 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.22.5 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.21.4(@babel/core@7.22.5) - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.5(@babel/core@7.22.5) + '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-typescript': 7.20.0(@babel/core@7.22.5) transitivePeerDependencies: - supports-color @@ -4554,9 +4582,9 @@ packages: dependencies: '@babel/code-frame': 7.22.5 '@babel/generator': 7.22.5 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.21.0 - '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.5 '@babel/parser': 7.22.5 '@babel/types': 7.22.5 @@ -4585,19 +4613,10 @@ packages: /@babel/types@7.21.4: resolution: {integrity: sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.19.4 - '@babel/helper-validator-identifier': 7.19.1 - to-fast-properties: 2.0.0 - - /@babel/types@7.22.4: - resolution: {integrity: sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA==} - engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.22.5 '@babel/helper-validator-identifier': 7.22.5 to-fast-properties: 2.0.0 - dev: true /@babel/types@7.22.5: resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} @@ -5578,7 +5597,7 @@ packages: '@types/node': 18.16.9 ansi-escapes: 4.3.2 chalk: 4.1.2 - ci-info: 3.5.0 + ci-info: 3.8.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.4.3 @@ -5805,7 +5824,6 @@ packages: dependencies: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.18 - dev: true /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} @@ -6888,42 +6906,6 @@ packages: - typescript dev: true - /@nrwl/js@15.8.0(@swc-node/register@1.5.4)(@swc/core@1.3.51)(nx@15.8.0)(prettier@2.7.1)(typescript@5.1.3): - resolution: {integrity: sha512-l2Q7oFpzx6ul7G0nKpMkrvnIEaOY+X8fc2g2Db5WqpnnBdfkrtWXZPg/O4DQ1p9O6BXrZ+Q2AK9bfgnliiwyEg==} - dependencies: - '@babel/core': 7.22.5 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.5) - '@babel/plugin-proposal-decorators': 7.21.0(@babel/core@7.22.5) - '@babel/plugin-transform-runtime': 7.22.5(@babel/core@7.22.5) - '@babel/preset-env': 7.22.5(@babel/core@7.22.5) - '@babel/preset-typescript': 7.21.4(@babel/core@7.22.5) - '@babel/runtime': 7.22.5 - '@nrwl/devkit': 15.8.0(nx@15.8.0)(typescript@5.1.3) - '@nrwl/workspace': 15.8.0(@swc-node/register@1.5.4)(@swc/core@1.3.51)(eslint@8.15.0)(prettier@2.7.1)(typescript@5.1.3) - '@phenomnomnominal/tsquery': 4.1.1(typescript@5.1.3) - babel-plugin-const-enum: 1.2.0(@babel/core@7.22.5) - babel-plugin-macros: 2.8.0 - babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.22.5) - chalk: 4.1.2 - fast-glob: 3.2.7 - fs-extra: 11.1.1 - ignore: 5.2.0 - js-tokens: 4.0.0 - minimatch: 3.0.5 - source-map-support: 0.5.19 - tree-kill: 1.2.2 - tslib: 2.5.3 - transitivePeerDependencies: - - '@babel/traverse' - - '@swc-node/register' - - '@swc/core' - - debug - - nx - - prettier - - supports-color - - typescript - dev: true - /@nrwl/js@16.5.0-beta.2(@swc-node/register@1.5.4)(@swc/core@1.3.51)(nx@16.5.0-beta.2)(typescript@5.1.3)(verdaccio@5.15.4): resolution: {integrity: sha512-Ll1xkSrRa/oRabJa0d83xIquzNwwPHpCwv3mj1JmNM7wOGYOK/OpbUlmjZaZQj/He5+iRuKKDLRc1v0sePLy0Q==} dependencies: @@ -6948,7 +6930,7 @@ packages: optional: true dependencies: '@nrwl/devkit': 15.8.0(nx@15.8.0)(typescript@5.1.3) - '@nrwl/js': 15.8.0(@swc-node/register@1.5.4)(@swc/core@1.3.51)(nx@15.8.0)(prettier@2.7.1)(typescript@5.1.3) + '@nrwl/js': 15.8.0(@swc-node/register@1.5.4)(@swc/core@1.3.51)(eslint@8.15.0)(nx@16.5.0-beta.2)(prettier@2.7.1)(typescript@5.1.3) '@phenomnomnominal/tsquery': 4.1.1(typescript@5.1.3) eslint: 8.15.0 tmp: 0.2.1 @@ -11335,10 +11317,6 @@ packages: event-target-shim: 5.0.1 dev: true - /absolute-path@0.0.0: - resolution: {integrity: sha512-HQiug4c+/s3WOvEnDRxXVmNtSG5s2gJM9r19BTcqjp7BWcE48PB+Y2G6jE65kqI0LpsQeMZygt/b60Gi4KxGyA==} - dev: true - /accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -12097,7 +12075,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.21.4 + '@babel/compat-data': 7.22.5 '@babel/core': 7.19.0 '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.19.0) semver: 6.3.0 @@ -12110,7 +12088,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.21.4 + '@babel/compat-data': 7.22.5 '@babel/core': 7.21.4 '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.21.4) semver: 6.3.0 @@ -12227,10 +12205,22 @@ packages: resolution: {integrity: sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==} dev: true + /babel-plugin-syntax-trailing-function-commas@7.0.0-beta.0: + resolution: {integrity: sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==} + dev: true + /babel-plugin-transform-async-to-promises@0.8.18: resolution: {integrity: sha512-WpOrF76nUHijnNn10eBGOHZmXQC8JYRME9rOLxStOga7Av2VO53ehVFvVNImMksVtQuL2/7ZNxEgxnx7oo/3Hw==} dev: true + /babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.22.5): + resolution: {integrity: sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==} + dependencies: + '@babel/plugin-syntax-flow': 7.18.6(@babel/core@7.22.5) + transitivePeerDependencies: + - '@babel/core' + dev: true + /babel-plugin-transform-typescript-metadata@0.3.2(@babel/core@7.22.5): resolution: {integrity: sha512-mWEvCQTgXQf48yDqgN7CH50waTyYBeP2Lpqx4nNWab9sxEpdXVeKgfj1qYI2/TgUPQtNFZ85i3PemRtnXVYYJg==} peerDependencies: @@ -12304,6 +12294,43 @@ packages: '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.5) dev: true + /babel-preset-fbjs@3.4.0(@babel/core@7.22.5): + resolution: {integrity: sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.5 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.5) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.22.5) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.5) + '@babel/plugin-syntax-flow': 7.18.6(@babel/core@7.22.5) + '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.22.5) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.5) + '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-block-scoped-functions': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-block-scoping': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-classes': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-destructuring': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-flow-strip-types': 7.21.0(@babel/core@7.22.5) + '@babel/plugin-transform-for-of': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-member-expression-literals': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-object-super': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-property-literals': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-react-display-name': 7.18.6(@babel/core@7.22.5) + '@babel/plugin-transform-react-jsx': 7.21.0(@babel/core@7.22.5) + '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-template-literals': 7.22.5(@babel/core@7.22.5) + babel-plugin-syntax-trailing-function-commas: 7.0.0-beta.0 + transitivePeerDependencies: + - supports-color + dev: true + /babel-preset-jest@29.5.0(@babel/core@7.19.0): resolution: {integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -12674,7 +12701,6 @@ packages: /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true /buffer-indexof-polyfill@1.0.2: resolution: {integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==} @@ -12843,6 +12869,25 @@ packages: resolution: {integrity: sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw==} dev: false + /caller-callsite@2.0.0: + resolution: {integrity: sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==} + engines: {node: '>=4'} + dependencies: + callsites: 2.0.0 + dev: true + + /caller-path@2.0.0: + resolution: {integrity: sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==} + engines: {node: '>=4'} + dependencies: + caller-callsite: 2.0.0 + dev: true + + /callsites@2.0.0: + resolution: {integrity: sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==} + engines: {node: '>=4'} + dev: true + /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -13245,9 +13290,12 @@ packages: engines: {node: '>=14'} dev: true + /commander@2.13.0: + resolution: {integrity: sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==} + dev: true + /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - dev: true /commander@4.1.1: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} @@ -13710,6 +13758,16 @@ packages: engines: {node: '>= 0.4.0'} dev: true + /cosmiconfig@5.2.1: + resolution: {integrity: sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==} + engines: {node: '>=4'} + dependencies: + import-fresh: 2.0.0 + is-directory: 0.3.1 + js-yaml: 3.14.1 + parse-json: 4.0.0 + dev: true + /cosmiconfig@6.0.0: resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==} engines: {node: '>=8'} @@ -14517,6 +14575,10 @@ packages: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} dev: true + /denodeify@1.2.1: + resolution: {integrity: sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==} + dev: true + /depcheck@1.4.3: resolution: {integrity: sha512-vy8xe1tlLFu7t4jFyoirMmOR7x7N601ubU9Gkifyr9z8rjBFtEdWHDBMqXyk6OkK+94NXutzddVXJuo0JlUQKQ==} engines: {node: '>=10'} @@ -16206,7 +16268,7 @@ packages: fs-extra: 10.1.0 memfs: 3.5.0 minimatch: 3.0.5 - node-abort-controller: 3.0.1 + node-abort-controller: 3.1.1 schema-utils: 3.2.0 semver: 7.5.3 tapable: 2.2.1 @@ -16976,6 +17038,16 @@ packages: resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} dev: true + /hermes-estree@0.8.0: + resolution: {integrity: sha512-W6JDAOLZ5pMPMjEiQGLCXSSV7pIBEgRR5zGkxgmzGSXHOxqV5dC/M1Zevqpbm9TZDE5tu358qZf8Vkzmsc+u7Q==} + dev: true + + /hermes-parser@0.8.0: + resolution: {integrity: sha512-yZKalg1fTYG5eOiToLUaw69rQfZq/fi+/NtEXRU7N87K/XobNRhRWorh80oSge2lWUiZfTgUvRJH+XgZWrhoqA==} + dependencies: + hermes-estree: 0.8.0 + dev: true + /hey-listen@1.0.8: resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} dev: false @@ -17374,6 +17446,14 @@ packages: requiresBuild: true optional: true + /image-size@1.0.2: + resolution: {integrity: sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + queue: 6.0.2 + dev: true + /immer@9.0.16: resolution: {integrity: sha512-qenGE7CstVm1NrHQbMh8YaSzTZTFNP3zPqr3YU0S0UY441j4bJTg4A2Hh5KAhwgaiU6ZZ1Ar6y/2f4TblnMReQ==} dev: true @@ -17393,6 +17473,14 @@ packages: import-from: 3.0.0 dev: true + /import-fresh@2.0.0: + resolution: {integrity: sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==} + engines: {node: '>=4'} + dependencies: + caller-path: 2.0.0 + resolve-from: 3.0.0 + dev: true + /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -17667,6 +17755,11 @@ packages: resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} dev: false + /is-directory@0.3.1: + resolution: {integrity: sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==} + engines: {node: '>=0.10.0'} + dev: true + /is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} @@ -17983,7 +18076,7 @@ packages: engines: {node: '>=8'} dependencies: '@babel/core': 7.22.5 - '@babel/parser': 7.21.4 + '@babel/parser': 7.22.5 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 semver: 6.3.0 @@ -18267,7 +18360,7 @@ packages: resolution: {integrity: sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/code-frame': 7.21.4 + '@babel/code-frame': 7.22.5 '@jest/types': 29.5.0 '@types/stack-utils': 2.0.1 chalk: 4.1.2 @@ -18299,6 +18392,11 @@ packages: jest-resolve: 29.5.0 dev: true + /jest-regex-util@27.5.1: + resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true + /jest-regex-util@29.4.3: resolution: {integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -18419,6 +18517,18 @@ packages: - supports-color dev: true + /jest-util@27.5.1: + resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 18.16.9 + chalk: 4.1.2 + ci-info: 3.8.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: true + /jest-util@29.5.0: resolution: {integrity: sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -18526,6 +18636,10 @@ packages: resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} dev: true + /jsc-safe-url@0.2.4: + resolution: {integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==} + dev: true + /jsdom@16.7.0: resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} engines: {node: '>=10'} @@ -19370,6 +19484,10 @@ packages: resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} dev: true + /lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} + dev: true + /lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} dev: true @@ -19738,10 +19856,296 @@ packages: engines: {node: '>= 0.6'} dev: true - /metro-resolver@0.74.1: - resolution: {integrity: sha512-1Ju7bvUnmy1lmsYwhujWsP4qxBVfVF7CkKiUCRolUbyZzGgymyVGXVN5yEnbXXNHgBAOlr4+2KKYjoXzhXBo4g==} + /metro-babel-transformer@0.76.5: + resolution: {integrity: sha512-KmsMXY6VHjPLRQLwTITjLo//7ih8Ts39HPF2zODkaYav/ZLNq0QP7eGuW54dvk/sZiL9le1kaBwTN4BWQI1VZQ==} + engines: {node: '>=16'} + dependencies: + '@babel/core': 7.22.5 + hermes-parser: 0.8.0 + metro-source-map: 0.76.5 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /metro-cache-key@0.76.5: + resolution: {integrity: sha512-QERX6ejYMt4BPr0ZMf7adnrOivmFSUbCim9FlU6cAeWUib+pV5P/Ph3KicWnOzJpbQz93+tHHG7vcsP6OrvLMw==} + engines: {node: '>=16'} + dev: true + + /metro-cache@0.76.5: + resolution: {integrity: sha512-8XalhoMNWDK6bi41oqxIpecTYRt4WsmtoHdqshgJIYshJ6qov0NuDw0pOfnS8rgMNHxPpuWyXc7NyKERqVRzaw==} + engines: {node: '>=16'} + dependencies: + metro-core: 0.76.5 + rimraf: 3.0.2 + dev: true + + /metro-config@0.76.5: + resolution: {integrity: sha512-SCMVIDOtm8s3H62E9z2IcY4Q9GVMqDurbiJS3PHrWgTZjwZFaL59lrW4W6DvzvFZHa9bbxKric5TFtwvVuyOCg==} + engines: {node: '>=16'} + dependencies: + cosmiconfig: 5.2.1 + jest-validate: 29.5.0 + metro: 0.76.5 + metro-cache: 0.76.5 + metro-core: 0.76.5 + metro-runtime: 0.76.5 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: true + + /metro-core@0.76.5: + resolution: {integrity: sha512-yJvIe8a3sAG92U7+E7Bw6m4lae9RB180fp9iQZFBqY437Ilv4nE6PR8EWB6d8c4yt9fXIL1Hc+KyQv7OPFx/rQ==} + engines: {node: '>=16'} + dependencies: + lodash.throttle: 4.1.1 + metro-resolver: 0.76.5 + dev: true + + /metro-file-map@0.76.5: + resolution: {integrity: sha512-9VS7zsec7BpTb+0v1DObOXso6XU/7oVBObQWp0EWBQpFcU1iF1lit2nnLQh2AyGCnSr8JVnuUe8gXhNH6xtPMg==} + engines: {node: '>=16'} + dependencies: + anymatch: 3.1.3 + debug: 2.6.9 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + invariant: 2.2.4 + jest-regex-util: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 + micromatch: 4.0.5 + node-abort-controller: 3.1.1 + nullthrows: 1.1.1 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.2 + transitivePeerDependencies: + - supports-color + dev: true + + /metro-inspector-proxy@0.76.5: + resolution: {integrity: sha512-leqwei1qNMKOEbhqlQ37K+7OIp1JRgvS5qERO+J0ZTg7ZeJTaBHSFU7FnCeRHB9Tu7/FSfypY2PxjydZDwvUEQ==} + engines: {node: '>=16'} + hasBin: true + dependencies: + connect: 3.6.6 + debug: 2.6.9 + node-fetch: 2.6.7 + ws: 7.5.9 + yargs: 17.7.2 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: true + + /metro-minify-terser@0.76.5: + resolution: {integrity: sha512-zizTXqlHcG7PArB5hfz1Djz/oCaOaTSXTZDNp8Y9K2FmmfLU3dU2eoDbNNiCnm5QdDtFIndLMXdqqe6omTfp4g==} + engines: {node: '>=16'} + dependencies: + terser: 5.18.0 + dev: true + + /metro-minify-uglify@0.76.5: + resolution: {integrity: sha512-JZNO5eK8r625/cheWSl+y7n0RlHLt03iSMgXPAxirH8BiFqPzs7h+c57r4AvSs793VXcF7L3sI1sAOj+nRqTeg==} + engines: {node: '>=16'} + dependencies: + uglify-es: 3.3.9 + dev: true + + /metro-react-native-babel-preset@0.76.5(@babel/core@7.22.5): + resolution: {integrity: sha512-IlVKeTon5fef77rQ6WreSmrabmbc3dEsLwr/sL80fYjobjsD8FRCnOlbaJdgUf2SMJmSIoawgjh5Yeebv+gJzg==} + engines: {node: '>=16'} + peerDependencies: + '@babel/core': '*' + dependencies: + '@babel/core': 7.22.5 + '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.22.5) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.5) + '@babel/plugin-proposal-export-default-from': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.22.5) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.22.5) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.22.5) + '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.22.5) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.22.5) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.5) + '@babel/plugin-syntax-export-default-from': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-syntax-flow': 7.18.6(@babel/core@7.22.5) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.5) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.5) + '@babel/plugin-transform-arrow-functions': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-async-to-generator': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-block-scoping': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-classes': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-computed-properties': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-destructuring': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-flow-strip-types': 7.21.0(@babel/core@7.22.5) + '@babel/plugin-transform-function-name': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-literals': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-modules-commonjs': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-parameters': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-react-display-name': 7.18.6(@babel/core@7.22.5) + '@babel/plugin-transform-react-jsx': 7.21.0(@babel/core@7.22.5) + '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-runtime': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-shorthand-properties': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-spread': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-sticky-regex': 7.22.5(@babel/core@7.22.5) + '@babel/plugin-transform-typescript': 7.21.3(@babel/core@7.22.5) + '@babel/plugin-transform-unicode-regex': 7.22.5(@babel/core@7.22.5) + '@babel/template': 7.22.5 + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.22.5) + react-refresh: 0.4.3 + transitivePeerDependencies: + - supports-color + dev: true + + /metro-resolver@0.76.5: + resolution: {integrity: sha512-QNsbDdf0xL1HefP6fhh1g3umqiX1qWEuCiBaTFroYRqM7u7RATt8mCu4n/FwSYhATuUUujHTIb2EduuQPbSGRQ==} + engines: {node: '>=16'} + dev: true + + /metro-runtime@0.76.5: + resolution: {integrity: sha512-1JAf9/v/NDHLhoTfiJ0n25G6dRkX7mjTkaMJ6UUXIyfIuSucoK5yAuOBx8OveNIekoLRjmyvSmyN5ojEeRmpvQ==} + engines: {node: '>=16'} + dependencies: + '@babel/runtime': 7.22.5 + react-refresh: 0.4.3 + dev: true + + /metro-source-map@0.76.5: + resolution: {integrity: sha512-1EhYPcoftONlvnOzgos7daE8hsJKOgSN3nD3Xf/yaY1F0aLeGeuWfpiNLLeFDNyUhfObHSuNxNhDQF/x1GFEbw==} + engines: {node: '>=16'} + dependencies: + '@babel/traverse': 7.22.5 + '@babel/types': 7.22.5 + invariant: 2.2.4 + metro-symbolicate: 0.76.5 + nullthrows: 1.1.1 + ob1: 0.76.5 + source-map: 0.5.7 + vlq: 1.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /metro-symbolicate@0.76.5: + resolution: {integrity: sha512-7iftzh6G6HO4UDBmjsi2Yu4d6IkApv6Kg+jmBvkTjCXr8HwnKKum89gMg/FRMix+Rhhut0dnMpz6mAbtKTU9JQ==} + engines: {node: '>=16'} + hasBin: true + dependencies: + invariant: 2.2.4 + metro-source-map: 0.76.5 + nullthrows: 1.1.1 + source-map: 0.5.7 + through2: 2.0.5 + vlq: 1.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /metro-transform-plugins@0.76.5: + resolution: {integrity: sha512-7pJ24aRuvzdQYpX/eOyodr4fnwVJP5ArNLBE1d0DOU9sQxsGplOORDTGAqw2L01+UgaSJiiwEoFMw7Z91HAS+Q==} + engines: {node: '>=16'} + dependencies: + '@babel/core': 7.22.5 + '@babel/generator': 7.22.5 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.5 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /metro-transform-worker@0.76.5: + resolution: {integrity: sha512-xN6Kb06o9u5A7M1bbl7oPfQFmt4Kmi3CMXp5j9OcK37AFc+u6YXH8x/6e9b3Cq50rlBYuCXDOOYAWI5/tYNt2w==} + engines: {node: '>=16'} + dependencies: + '@babel/core': 7.22.5 + '@babel/generator': 7.22.5 + '@babel/parser': 7.22.5 + '@babel/types': 7.22.5 + babel-preset-fbjs: 3.4.0(@babel/core@7.22.5) + metro: 0.76.5 + metro-babel-transformer: 0.76.5 + metro-cache: 0.76.5 + metro-cache-key: 0.76.5 + metro-source-map: 0.76.5 + metro-transform-plugins: 0.76.5 + nullthrows: 1.1.1 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: true + + /metro@0.76.5: + resolution: {integrity: sha512-aEQiqNFibfx4ajUXm7Xatsv43r/UQ0xE53T3XqgZBzsxhF235tf1cl8t0giawi0RbLtDS+Fu4kg2bVBKDYFy7A==} + engines: {node: '>=16'} + hasBin: true dependencies: - absolute-path: 0.0.0 + '@babel/code-frame': 7.22.5 + '@babel/core': 7.22.5 + '@babel/generator': 7.22.5 + '@babel/parser': 7.22.5 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.5 + '@babel/types': 7.22.5 + accepts: 1.3.8 + async: 3.2.4 + chalk: 4.1.2 + ci-info: 2.0.0 + connect: 3.6.6 + debug: 2.6.9 + denodeify: 1.2.1 + error-stack-parser: 2.1.4 + graceful-fs: 4.2.11 + hermes-parser: 0.8.0 + image-size: 1.0.2 + invariant: 2.2.4 + jest-worker: 27.5.1 + jsc-safe-url: 0.2.4 + lodash.throttle: 4.1.1 + metro-babel-transformer: 0.76.5 + metro-cache: 0.76.5 + metro-cache-key: 0.76.5 + metro-config: 0.76.5 + metro-core: 0.76.5 + metro-file-map: 0.76.5 + metro-inspector-proxy: 0.76.5 + metro-minify-terser: 0.76.5 + metro-minify-uglify: 0.76.5 + metro-react-native-babel-preset: 0.76.5(@babel/core@7.22.5) + metro-resolver: 0.76.5 + metro-runtime: 0.76.5 + metro-source-map: 0.76.5 + metro-symbolicate: 0.76.5 + metro-transform-plugins: 0.76.5 + metro-transform-worker: 0.76.5 + mime-types: 2.1.35 + node-fetch: 2.6.7 + nullthrows: 1.1.1 + rimraf: 3.0.2 + serialize-error: 2.1.0 + source-map: 0.5.7 + strip-ansi: 6.0.1 + throat: 5.0.0 + ws: 7.5.9 + yargs: 17.7.2 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate dev: true /micromatch@4.0.5: @@ -20296,6 +20700,10 @@ packages: resolution: {integrity: sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw==} dev: true + /node-abort-controller@3.1.1: + resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + dev: true + /node-addon-api@3.2.1: resolution: {integrity: sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==} @@ -20628,6 +21036,10 @@ packages: boolbase: 1.0.0 dev: true + /nullthrows@1.1.1: + resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + dev: true + /nwsapi@2.2.2: resolution: {integrity: sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==} dev: true @@ -20850,6 +21262,11 @@ packages: resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} dev: true + /ob1@0.76.5: + resolution: {integrity: sha512-HoxZXMXNuY/eIXGoX7gx1C4O3eB4kJJMola6KoFaMm7PGGg39+AnhbgMASYVmSvP2lwU3545NyiR63g8J9PW3w==} + engines: {node: '>=16'} + dev: true + /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -23033,6 +23450,12 @@ packages: /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + /queue@6.0.2: + resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==} + dependencies: + inherits: 2.0.4 + dev: true + /quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} dev: true @@ -23224,6 +23647,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /react-refresh@0.4.3: + resolution: {integrity: sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==} + engines: {node: '>=0.10.0'} + dev: true + /react-router-dom@6.11.2(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-JNbKtAeh1VSJQnH6RvBDNhxNwemRj7KxCzc5jb7zvDSKRnPWIFj9pO+eXqjM69gQJ0r46hSz1x4l9y0651DKWw==} engines: {node: '>=14'} @@ -23672,6 +24100,11 @@ packages: resolve-from: 5.0.0 dev: true + /resolve-from@3.0.0: + resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} + engines: {node: '>=4'} + dev: true + /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -24020,7 +24453,6 @@ packages: chokidar: 3.5.3 immutable: 4.1.0 source-map-js: 1.0.2 - dev: true /sax@1.2.4: resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} @@ -24241,6 +24673,11 @@ packages: - supports-color dev: true + /serialize-error@2.1.0: + resolution: {integrity: sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==} + engines: {node: '>=0.10.0'} + dev: true + /serialize-javascript@6.0.1: resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} dependencies: @@ -24617,6 +25054,10 @@ packages: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 + + /source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} dev: true /source-map@0.6.1: @@ -25467,7 +25908,6 @@ packages: acorn: 8.8.2 commander: 2.20.3 source-map-support: 0.5.21 - dev: true /terser@5.18.0: resolution: {integrity: sha512-pdL757Ig5a0I+owA42l6tIuEycRuM7FPY4n62h44mRLRfnOxJkkOHd6i89dOpwZlpF6JXBwaAHF6yWzFrt+QyA==} @@ -25518,6 +25958,10 @@ packages: any-promise: 1.3.0 dev: false + /throat@5.0.0: + resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} + dev: true + /throttleit@1.0.0: resolution: {integrity: sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==} dev: true @@ -26081,6 +26525,16 @@ packages: resolution: {integrity: sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==} dev: false + /uglify-es@3.3.9: + resolution: {integrity: sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==} + engines: {node: '>=0.8.0'} + deprecated: support for ECMAScript is superseded by `uglify-js` as of v3.13.0 + hasBin: true + dependencies: + commander: 2.13.0 + source-map: 0.6.1 + dev: true + /uglify-js@3.17.4: resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} engines: {node: '>=0.8.0'} @@ -26554,7 +27008,7 @@ packages: mlly: 1.2.0 pathe: 1.1.0 picocolors: 1.0.0 - vite: 4.3.9(@types/node@18.16.9)(less@4.1.3)(sass@1.55.0)(stylus@0.59.0) + vite: 4.3.9(@types/node@18.16.9)(less@4.1.3)(sass@1.63.2)(stylus@0.59.0)(terser@5.17.7) transitivePeerDependencies: - '@types/node' - less @@ -26600,42 +27054,6 @@ packages: optionalDependencies: fsevents: 2.3.2 - /vite@4.3.9(@types/node@18.16.9)(less@4.1.3)(sass@1.55.0)(stylus@0.59.0): - resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 18.16.9 - esbuild: 0.17.19 - less: 4.1.3 - postcss: 8.4.24 - rollup: 3.21.0 - sass: 1.55.0 - stylus: 0.59.0 - optionalDependencies: - fsevents: 2.3.2 - dev: false - /vite@4.3.9(@types/node@18.16.9)(less@4.1.3)(sass@1.63.2)(stylus@0.59.0)(terser@5.17.7): resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==} engines: {node: ^14.18.0 || >=16.0.0} @@ -26671,7 +27089,6 @@ packages: terser: 5.17.7 optionalDependencies: fsevents: 2.3.2 - dev: true /vitest@0.32.0(less@4.1.3)(sass@1.55.0)(stylus@0.59.0): resolution: {integrity: sha512-SW83o629gCqnV3BqBnTxhB10DAwzwEx3z+rqYZESehUB+eWsJxwcBQx7CKy0otuGMJTYh7qCVuUX23HkftGl/Q==} @@ -26738,6 +27155,10 @@ packages: - terser dev: false + /vlq@1.0.1: + resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} + dev: true + /vscode-oniguruma@1.7.0: resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} dev: true @@ -27648,3 +28069,7 @@ packages: dependencies: tslib: 2.5.3 dev: true + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false