Repository: microsoft/react-native-test-app
Pull request #829 (2022-03-28 00:14:19)

chore(deps): update dependency prettier to v2.6.1
[![WhiteSource Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [prettier](https://prettier.io) ([source](https://togithub.com/prettier/prettier)) | [`2.6.0` -> `2.6.1`](https://renovatebot.com/diffs/npm/prettier/2.6.0/2.6.1) | [![age](https://badges.renovateapi.com/packages/npm/prettier/2.6.1/age-slim)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://badges.renovateapi.com/packages/npm/prettier/2.6.1/adoption-slim)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://badges.renovateapi.com/packages/npm/prettier/2.6.1/compatibility-slim/2.6.0)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://badges.renovateapi.com/packages/npm/prettier/2.6.1/confidence-slim/2.6.0)](https://docs.renovatebot.com/merge-confidence/) |

---

### Release Notes

<details>
<summary>prettier/prettier</summary>

### [`v2.6.1`](https://togithub.com/prettier/prettier/blob/HEAD/CHANGELOG.md#&#8203;261)

[Compare Source](https://togithub.com/prettier/prettier/compare/2.6.0...2.6.1)

[diff](https://togithub.com/prettier/prettier/compare/2.6.0...2.6.1)

##### Ignore `loglevel` when printing information ([#&#8203;12477](https://togithub.com/prettier/prettier/pull/12477) by [@&#8203;fisker](https://togithub.com/fisker))

<!-- prettier-ignore -->

```bash
```

</details>

---

### Configuration

📅 **Schedule**: "before 3am on Monday" in timezone Europe/Oslo.

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, click this checkbox.

---

This PR has been generated by [WhiteSource Renovate](https://renovate.whitesourcesoftware.com). View repository job log [here](https://app.renovatebot.com/dashboard#github/microsoft/react-native-test-app).


Patch:
diff --git a/.github/actions/setup-toolchain/action.yml b/.github/actions/setup-toolchain/action.yml
index 62fed3e..684d03c 100644
--- a/.github/actions/setup-toolchain/action.yml
+++ b/.github/actions/setup-toolchain/action.yml
@@ -22,7 +22,7 @@ runs:
       uses: microsoft/setup-msbuild@v1.1
     - name: Set up Ruby
       if: ${{ inputs.platform == 'ios' || inputs.platform == 'macos' || inputs.platform == 'node' }}
-      uses: ruby/setup-ruby@v1.99.0
+      uses: ruby/setup-ruby@v1.100.0
       with:
         ruby-version: "3.0"
         bundler: Gemfile.lock
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 1890688..94bda28 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -399,13 +399,18 @@ jobs:
         run: |
           yarn jest
         working-directory: example
-      - name: Install NuGet packages
+      - name: Set up NuGet sources
+        if: ${{ github.event_name == 'schedule' }}
         run: |
-          nuget restore -Source "https://pkgs.dev.azure.com/ms/react-native/_packaging/react-native-public/nuget/v3/index.json;https://api.nuget.org/v3/index.json"
+          nuget sources Add -Name react-native-windows -Source https://pkgs.dev.azure.com/ms/react-native/_packaging/react-native-public/nuget/v3/index.json -ConfigFile NuGet.Config
         working-directory: example/windows
       - name: Build
         run: |
-          ../../scripts/MSBuild.ps1 -Configuration ${{ matrix.configuration }} -Platform ${{ matrix.platform }} Example.sln
+          if ("${{ matrix.configuration }}" -eq "Release") {
+            yarn ci:windows --release --arch ${{ matrix.platform }}
+          } else {
+            yarn ci:windows --arch ${{ matrix.platform }}
+          }
         working-directory: example/windows
       - name: Test
         if: ${{ matrix.platform == 'x64' }}
@@ -438,15 +443,13 @@ jobs:
           if ("${{ matrix.template }}" -eq "all") { yarn install-windows-test-app }
           else { yarn install-windows-test-app --project-directory=. }
         working-directory: template-example
-      - name: Install NuGet packages
-        run: |
-          if ("${{ matrix.template }}" -eq "all") { cd windows }
-          nuget restore
-        working-directory: template-example
       - name: Build
         run: |
-          if ("${{ matrix.template }}" -eq "all") { ../scripts/MSBuild.ps1 windows/TemplateExample.sln }
-          else { ../scripts/MSBuild.ps1 TemplateExample.sln }
+          if ("${{ matrix.template }}" -eq "all") {
+            yarn react-native run-windows --logging --no-packager --no-launch --no-deploy
+          } else {
+            yarn react-native run-windows --logging --no-packager --no-launch --no-deploy --sln TemplateExample.sln
+          }
         working-directory: template-example
     timeout-minutes: 60
   release:
diff --git a/android/gradle.properties b/android/gradle.properties
index 3785375..c409761 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -1,25 +1,35 @@
 # Project-wide Gradle settings.
+
 # IDE (e.g. Android Studio) users:
 # Gradle settings configured through the IDE *will override*
 # any settings specified in this file.
+
 # For more details on how to configure your build environment visit
 # http://www.gradle.org/docs/current/userguide/build_environment.html
-# Specifies the JVM arguments used for the daemon process.
-# The setting is particularly useful for tweaking memory settings.
-org.gradle.jvmargs=-Xmx1536m
-# When configured, Gradle will run in incubating parallel mode.
-# This option should only be used with decoupled projects. More details, visit
-# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
-# org.gradle.parallel=true
+
+# Specifies the JVM arguments used for the Gradle Daemon. The setting is
+# particularly useful for configuring JVM memory settings for build performance.
+# This does not affect the JVM settings for the Gradle client VM.
+# The default is `-Xmx512m -XX:MaxMetaspaceSize=256m`.
+org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
+
+# When configured, Gradle will fork up to org.gradle.workers.max JVMs to execute
+# projects in parallel. To learn more about parallel task execution, see the
+# section on Gradle build performance:
+# https://docs.gradle.org/current/userguide/performance.html#parallel_execution.
+# Default is `false`.
+#org.gradle.parallel=true
+
 # AndroidX package structure to make it clearer which packages are bundled with the
 # Android operating system, and which are packaged with your app's APK
 # https://developer.android.com/topic/libraries/support-library/androidx-rn
 android.useAndroidX=true
 # Automatically convert third-party libraries to use AndroidX
 android.enableJetifier=true
-# Kotlin code style for this project: "official" or "obsolete":
-kotlin.code.style=official
 
 # Failed to transform '/~/bcprov-jdk15on-1.68.jar' using Jetifier.
 # Reason: IllegalArgumentException, message: Unsupported class file major version 59.
 android.jetifier.ignorelist=bcprov-jdk15on
+
+# Kotlin code style for this project: "official" or "obsolete":
+kotlin.code.style=official
diff --git a/example/package.json b/example/package.json
index c343d3b..87bdf19 100644
--- a/example/package.json
+++ b/example/package.json
@@ -8,18 +8,19 @@
     "build:ios": "mkdirp dist && react-native bundle --entry-file index.js --platform ios --dev true --bundle-output dist/main.ios.jsbundle --assets-dest dist",
     "build:macos": "mkdirp dist && react-native bundle --entry-file index.js --platform macos --dev true --bundle-output dist/main.macos.jsbundle --assets-dest dist",
     "build:windows": "mkdirp dist && react-native bundle --entry-file index.js --platform windows --dev true --bundle-output dist/main.windows.bundle --assets-dest dist",
+    "ci:windows": "react-native run-windows --logging --no-packager --no-launch --no-deploy",
     "clean": "yarn workspace react-native-test-app clean",
     "ios": "react-native run-ios",
     "macos": "react-native run-macos --scheme Example",
     "set-react-version": "yarn workspace react-native-test-app set-react-version",
     "start": "react-native start",
-    "windows": "react-native run-windows --sln windows/Example.sln"
+    "windows": "react-native run-windows --no-packager"
   },
   "peerDependencies": {
-    "react": "~16.8.6 || ~16.9.0 || ~16.11.0 || ~16.13.1 || ~17.0.1 || ~17.0.2",
-    "react-native": "^0.0.0-0 || 0.60 - 0.67 || 1000.0.0",
-    "react-native-macos": "^0.0.0-0 || 0.60 - 0.66",
-    "react-native-windows": "^0.0.0-0 || 0.62 - 0.67"
+    "react": "~16.11.0 || ~16.13.1 || ~17.0.1 || ~17.0.2",
+    "react-native": "^0.0.0-0 || 0.62 - 0.68 || 1000.0.0",
+    "react-native-macos": "^0.0.0-0 || 0.62 - 0.66",
+    "react-native-windows": "^0.0.0-0 || 0.62 - 0.68"
   },
   "devDependencies": {
     "@babel/core": "^7.0.0",
diff --git a/example/react-native.config.js b/example/react-native.config.js
index 262d4b8..9b40783 100644
--- a/example/react-native.config.js
+++ b/example/react-native.config.js
@@ -1,24 +1,31 @@
-const fs = require("fs");
-const path = require("path");
-const {
-  androidManifestPath,
-  iosProjectPath,
-  windowsProjectPath,
-} = require("react-native-test-app");
+const project = (() => {
+  const fs = require("fs");
+  const path = require("path");
+  try {
+    const {
+      androidManifestPath,
+      iosProjectPath,
+      windowsProjectPath,
+    } = require("react-native-test-app");
+    return {
+      android: {
+        sourceDir: "android",
+        manifestPath: androidManifestPath(path.join(__dirname, "android")),
+      },
+      ios: {
+        project: iosProjectPath("ios"),
+      },
+      windows: fs.existsSync("windows/Example.sln") && {
+        sourceDir: "windows",
+        solutionFile: "Example.sln",
+        project: windowsProjectPath(path.join(__dirname, "windows")),
+      },
+    };
+  } catch (_) {
+    return undefined;
+  }
+})();
 
 module.exports = {
-  project: {
-    android: {
-      sourceDir: "android",
-      manifestPath: androidManifestPath(path.join(__dirname, "android")),
-    },
-    ios: {
-      project: iosProjectPath("ios"),
-    },
-    windows: fs.existsSync("windows/Example.sln") && {
-      sourceDir: "windows",
-      solutionFile: "Example.sln",
-      project: windowsProjectPath(path.join(__dirname, "windows")),
-    },
-  },
+  ...(project ? { project } : undefined),
 };
diff --git a/package.json b/package.json
index 4ff45b4..80920db 100644
--- a/package.json
+++ b/package.json
@@ -80,9 +80,9 @@
     "@react-native-community/cli-platform-ios": ">=4.10.0",
     "mustache": "^4.0.0",
     "react": "~16.11.0 || ~16.13.1 || ~17.0.1 || ~17.0.2",
-    "react-native": "^0.0.0-0 || 0.62 - 0.67 || 1000.0.0",
+    "react-native": "^0.0.0-0 || 0.62 - 0.68 || 1000.0.0",
     "react-native-macos": "^0.0.0-0 || 0.62 - 0.66",
-    "react-native-windows": "^0.0.0-0 || 0.62 - 0.67"
+    "react-native-windows": "^0.0.0-0 || 0.62 - 0.68"
   },
   "peerDependenciesMeta": {
     "@react-native-community/cli": {
@@ -108,7 +108,7 @@
     "@babel/core": "^7.0.0",
     "@commitlint/cli": "^16.0.0",
     "@commitlint/config-conventional": "^16.0.0",
-    "@microsoft/eslint-plugin-sdl": "^0.1.9",
+    "@microsoft/eslint-plugin-sdl": "^0.2.0",
     "@react-native-community/cli": "^6.0.0",
     "@react-native-community/cli-platform-android": "^6.0.0",
     "@react-native-community/cli-platform-ios": "^6.0.0",
diff --git a/schema.json b/schema.json
index 2820cdc..b615593 100644
--- a/schema.json
+++ b/schema.json
@@ -37,15 +37,15 @@
           "type": "string"
         },
         "bundleRoot": {
-          "description": "Specifies the root of the bundle file name. E.g., if the bundle file is `index.&lt;platform&gt;.bundle`, `index` is the bundle root. Defaults to `index` and `main`.",
+          "description": "Specifies the root of the bundle file name. E.g., if the bundle file is `index.[platform].bundle`, `index` is the bundle root.\n\nDefaults to `index` and `main`.\n\nWhen set, the test app will look for the following files on startup:\n\n- `myRoot.[platform].jsbundle`\n- `myRoot.[platform].bundle`\n- `myRoot.native.jsbundle`\n- `myRoot.native.bundle`\n- `myRoot.jsbundle`\n- `myRoot.bundle`\n\nIntroduced in <a href='//github.com/microsoft/react-native-test-app/releases/tag/0.9.0'>0.9.0</a>.",
           "type": "string"
         },
         "singleApp": {
-          "description": "In single-app mode, the component with the specified slug gets launched automatically, essentially behaving as a normal app. Defaults to multi-app mode.",
+          "description": "In single-app mode, the component with the specified slug gets launched automatically, essentially behaving as a normal app.\n\nDefaults to multi-app mode.\n\nFor more details, see [its dedicated page](Single-app-Mode).\n\nIntroduced in <a href='//github.com/microsoft/react-native-test-app/releases/tag/1.3.0'>1.3.0</a>.",
           "type": "string"
         },
         "components": {
-          "description": "All components that should be accessible from the home screen should be declared under this property. Each component must have `appKey` set, i.e. the name that you passed to `AppRegistry.registerComponent`.",
+          "description": "All components that should be accessible from the home screen should be declared under this property. Each component must have `appKey` set, i.e. the name that you passed to `AppRegistry.registerComponent`.\n\n```javascript\nAppRegistry.registerComponent('Example', () => Example);\n```\n\nFor each entry, you can declare additional (optional) properties:\n\n```javascript\n{\n  \"components\": [\n    {\n      // The app key passed to `AppRegistry.registerComponent()`\n      \"appKey\": \"Example\",\n\n      // [Optional] Name to be displayed on home screen\n      \"displayName\": \"App\",\n\n      // [Optional] Properties that should be passed to your component\n      \"initialProperties\": {},\n\n      // [Optional] The style in which to present your component.\n      // Valid values are: \"modal\"\n      \"presentationStyle\": \"\",\n\n      // [Optional] URL slug that uniquely identifies this component.\n      // Used for deep linking.\n      \"slug\": \"\"\n    }\n  ]\n}\n```\n\n<a name='android-adding-fragments' />\n\n#### [Android] Adding Fragments\n\nOn Android, you can add fragments to the home screen by using their fully qualified class names, e.g. `com.example.app.MyFragment`, as app key:\n\n```javascript\n\"components\": [\n  {\n    \"appKey\": \"com.example.app.MyFragment\",\n    \"displayName\": \"App\"\n  }\n]\n```\n\nIf you need to get the `ReactNativeHost` instance within `MyFragment`, you can request it as a service from the context:\n\n```java\n@Override\n@SuppressLint(\"WrongConstant\")\npublic void onAttach(@NonNull Context context) {\n    super.onAttach(context);\n\n    ReactNativeHost reactNativeHost = (ReactNativeHost)\n        context.getSystemService(\"service:reactNativeHostService\");\n    ReactInstanceManager reactInstanceManager =\n        reactNativeHost.getReactInstanceManager();\n}\n```\n\n<a name='ios-macos-adding-view-controllers' />\n\n#### [iOS, macOS] Adding View Controllers\n\nOn iOS/macOS, you can have native view controllers on the home screen by using their Objective-C names as app key (Swift classes can declare Objective-C names with the <a href='https://docs.swift.org/swift-book/ReferenceManual/Attributes.html#objc'>`@objc`</a> attribute):\n\n```javascript\n\"components\": [\n  {\n    \"appKey\": \"RTAMyViewController\",\n    \"displayName\": \"App\"\n  }\n]\n```\n\nThe view controller must implement an initializer that accepts a `RCTBridge` instance:\n\n```objc\n- (nonnull instancetype)initWithBridge:(nonnull RCTBridge *)bridge;\n```",
           "type": "array",
           "items": { "$ref": "#/$defs/component" }
         }
@@ -80,7 +80,7 @@
   "type": "object",
   "properties": {
     "resources": {
-      "description": "Here you should declare all resources that should be bundled with the app. The property can be a list of paths to resources or an object with platform specific resources using platform names as key. A path must be relative to the path of `app.json`, and can point to both a file or a directory.",
+      "description": "Here you should declare all resources that should be bundled with the app. The property can be a list of paths to resources:\n\n```javascript\n\"resources\": [\n  \"dist/assets\",\n  \"dist/main.jsbundle\"\n]\n```\n\nOr you can declare platform specific resources using platform names as key:\n\n```javascript\n\"resources\": {\n  \"android\": [\n    \"dist/res\",\n    \"dist/main.android.jsbundle\"\n  ],\n  \"ios\": [\n    \"dist/assets\",\n    \"dist/main.ios.jsbundle\"\n  ],\n  \"macos\": [\n    \"dist/assets\",\n    \"dist/main.macos.jsbundle\"\n  ],\n  \"windows\": [\n    \"dist/assets\",\n    \"dist/main.windows.bundle\"\n  ]\n}\n```\n\nA path must be relative to the path of `app.json`, and can point to both a file or a directory.",
       "oneOf": [
         {
           "type": "array",
@@ -119,11 +119,11 @@
       "type": "object",
       "properties": {
         "package": {
-          "description": "Use this property to set the application ID of the APK. The value is set to `applicationId` in `build.gradle`.",
+          "description": "Use this property to set the <a href='https://developer.android.com/studio/build/application-id'>application ID</a> of the APK. The value is set to `applicationId` in `build.gradle`.",
           "type": "string"
         },
         "signingConfigs": {
-          "description": "Use this to set the signing configurations for the app",
+          "description": "Use this to set the <a href='https://developer.android.com/studio/publish/app-signing'>signing configurations</a> for the app.\n\nThe JSON schema follows the Gradle DSL very closely. Below is what one would add for the debug and release flavors:\n\n```javascript\n{\n  \"android\": {\n    \"signingConfigs\": {\n      \"debug\": {                          // optional\n        \"keyAlias\": \"androiddebugkey\",    // defaults to \"androiddebugkey\"\n        \"keyPassword\": \"android\",         // defaults to \"android\n        \"storeFile\": \"debug.keystore\",    // required\n        \"storePassword\": \"android\"        // defaults to \"android\n      },\n      \"release\": {                        // optional\n        \"keyAlias\": \"androiddebugkey\",    // defaults to \"androiddebugkey\"\n        \"keyPassword\": \"android\",         // defaults to \"android\n        \"storeFile\": \"release.keystore\",  // required\n        \"storePassword\": \"android\"        // defaults to \"android\n      }\n    }\n  }\n}\n```\n\nIntroduced in <a href='//github.com/microsoft/react-native-test-app/releases/tag/0.11.0'>0.11.0</a>.",
           "type": "object",
           "properties": {
             "debug": {
@@ -149,15 +149,15 @@
           "type": "string"
         },
         "codeSignEntitlements": {
-          "description": "Specifies the path to a custom Entitlements file. The path should be relative to `app.json`. This is the same as setting `CODE_SIGN_ENTITLEMENTS` in Xcode.",
+          "description": "Specifies the path to a custom <a href='https://developer.apple.com/documentation/bundleresources/entitlements'>Entitlements</a> file. The path should be relative to `app.json`. This is the same as setting `CODE_SIGN_ENTITLEMENTS` in Xcode.\n\nIntroduced in <a href='//github.com/microsoft/react-native-test-app/releases/tag/0.9.7'>0.9.7</a>.",
           "type": "string"
         },
         "codeSignIdentity": {
-          "description": "Sets the code signing identity to use when signing code. This is the same as setting `CODE_SIGN_IDENTITY` in Xcode.",
+          "description": "Sets the <a href='https://developer.apple.com/library/archive/documentation/Security/Conceptual/CodeSigningGuide/Procedures/Procedures.html#//apple_ref/doc/uid/TP40005929-CH4-SW1'>code signing identity</a> to use when signing code. This is the same as setting `CODE_SIGN_IDENTITY` in Xcode.\n\nIntroduced in <a href='//github.com/microsoft/react-native-test-app/releases/tag/0.9.7'>0.9.7</a>.",
           "type": "string"
         },
         "developmentTeam": {
-          "description": "Sets the development team that the app should be assigned to. This is the same as setting `DEVELOPMENT_TEAM` in Xcode.",
+          "description": "Sets the <a href='https://help.apple.com/xcode/mac/current/#/dev23aab79b4'>development team</a> that the app should be assigned to. This is the same as setting `DEVELOPMENT_TEAM` in Xcode.\n\nIntroduced in <a href='//github.com/microsoft/react-native-test-app/releases/tag/0.9.7'>0.9.7</a>.",
           "type": "string"
         },
         "reactNativePath": {
@@ -175,15 +175,15 @@
           "type": "string"
         },
         "codeSignEntitlements": {
-          "description": "Specifies the path to a custom Entitlements file. The path should be relative to `app.json`. This is the same as setting `CODE_SIGN_ENTITLEMENTS` in Xcode.",
+          "description": "Specifies the path to a custom <a href='https://developer.apple.com/documentation/bundleresources/entitlements'>Entitlements</a> file. The path should be relative to `app.json`. This is the same as setting `CODE_SIGN_ENTITLEMENTS` in Xcode.\n\nIntroduced in <a href='//github.com/microsoft/react-native-test-app/releases/tag/0.9.7'>0.9.7</a>.",
           "type": "string"
         },
         "codeSignIdentity": {
-          "description": "Sets the code signing identity to use when signing code. This is the same as setting `CODE_SIGN_IDENTITY` in Xcode.",
+          "description": "Sets the <a href='https://developer.apple.com/library/archive/documentation/Security/Conceptual/CodeSigningGuide/Procedures/Procedures.html#//apple_ref/doc/uid/TP40005929-CH4-SW1'>code signing identity</a> to use when signing code. This is the same as setting `CODE_SIGN_IDENTITY` in Xcode.\n\nIntroduced in <a href='//github.com/microsoft/react-native-test-app/releases/tag/0.9.7'>0.9.7</a>.",
           "type": "string"
         },
         "developmentTeam": {
-          "description": "Sets the development team that the app should be assigned to. This is the same as setting `DEVELOPMENT_TEAM` in Xcode.",
+          "description": "Sets the <a href='https://help.apple.com/xcode/mac/current/#/dev23aab79b4'>development team</a> that the app should be assigned to. This is the same as setting `DEVELOPMENT_TEAM` in Xcode.\n\nIntroduced in <a href='//github.com/microsoft/react-native-test-app/releases/tag/0.9.7'>0.9.7</a>.",
           "type": "string"
         },
         "reactNativePath": {
@@ -197,19 +197,19 @@
       "type": "object",
       "properties": {
         "appxManifest": {
-          "description": "Sets the path to your app package manifest. If none is set, a default manifest will be provided. Changes to this property will not be automatically be picked up; you need to re-run `yarn install-windows-test-app` to update the solution.",
+          "description": "Sets the path to your <a href='https://docs.microsoft.com/en-us/uwp/schemas/appxpackage/appx-package-manifest'>app package manifest</a>. If none is set, a default manifest will be provided. Changes to this property will not be automatically be picked up; you need to re-run `yarn install-windows-test-app` to update the solution.\n\nIntroduced in <a href='//github.com/microsoft/react-native-test-app/releases/tag/0.5.5'>0.5.5</a>.",
           "type": "string"
         },
         "certificateKeyFile": {
-          "description": "The path to the certificate to use. If specified, it will also enable package signing. Changes to this property will not be automatically be picked up; you need to re-run `yarn install-windows-test-app` to update the solution.",
+          "description": "The path to the certificate to use. If specified, it will also enable package signing. Changes to this property will not be automatically be picked up; you need to re-run `yarn install-windows-test-app` to update the solution.\n\nIntroduced in <a href='//github.com/microsoft/react-native-test-app/releases/tag/1.1.0'>1.1.0</a>.",
           "type": "string"
         },
         "certificatePassword": {
-          "description": "The password for the private key in the certificate. Leave unset if no password. Changes to this property will not be automatically be picked up; you need to re-run `yarn install-windows-test-app` to update the solution.",
+          "description": "The password for the private key in the certificate. Leave unset if no password. Changes to this property will not be automatically be picked up; you need to re-run `yarn install-windows-test-app` to update the solution.\n\nIntroduced in <a href='//github.com/microsoft/react-native-test-app/releases/tag/1.1.0'>1.1.0</a>.",
           "type": "string"
         },
         "certificateThumbprint": {
-          "description": "This value must match the thumbprint in the signing certificate, or be unset. Changes to this property will not be automatically be picked up; you need to re-run `yarn install-windows-test-app` to update the solution.",
+          "description": "This value must match the thumbprint in the signing certificate, or be unset. Changes to this property will not be automatically be picked up; you need to re-run `yarn install-windows-test-app` to update the solution.\n\nIntroduced in <a href='//github.com/microsoft/react-native-test-app/releases/tag/1.1.0'>1.1.0</a>.",
           "type": "string"
         }
       }
diff --git a/scripts/configure.js b/scripts/configure.js
index bc55c16..ce73ea6 100755
--- a/scripts/configure.js
+++ b/scripts/configure.js
@@ -282,14 +282,22 @@ function reactNativeConfig({ name, testAppPath, platforms, flatten }) {
     switch (platforms[0]) {
       case "android":
         return join(
-          'const { androidManifestPath } = require("react-native-test-app");',
+          "const project = (() => {",
+          "  try {",
+          '    const { androidManifestPath } = require("react-native-test-app");',
+          "    return {",
+          "      android: {",
+          '        sourceDir: ".",',
+          "        manifestPath: androidManifestPath(__dirname),",
+          "      },",
+          "    };",
+          "  } catch (_) {",
+          "    return undefined;",
+          "  }",
+          "})();",
+          "",
           "module.exports = {",
-          "  project: {",
-          "    android: {",
-          '      sourceDir: ".",',
-          "      manifestPath: androidManifestPath(__dirname),",
-          "    },",
-          "  },",
+          "  ...(project ? { project } : undefined),",
           "};",
           ""
         );
@@ -297,31 +305,46 @@ function reactNativeConfig({ name, testAppPath, platforms, flatten }) {
       case "macos":
       case "ios":
         return join(
-          'const { iosProjectPath } = require("react-native-test-app");',
-          "module.exports = {",
-          "  project: {",
-          "    ios: {",
-          '      project: iosProjectPath("."),',
-          "    }",
+          "const project = (() => {",
+          "  try {",
+          '    const { iosProjectPath } = require("react-native-test-app");',
+          "    return {",
+          "      ios: {",
+          '        project: iosProjectPath("."),',
+          "      },",
+          "    };",
+          "  } catch (_) {",
+          "    return undefined;",
           "  }",
+          "})();",
+          "",
+          "module.exports = {",
+          "  ...(project ? { project } : undefined),",
           "};",
           ""
         );
 
       case "windows":
         return join(
-          'const path = require("path");',
-          'const { windowsProjectPath } = require("react-native-test-app");',
+          "const project = (() => {",
+          '  const path = require("path");',
+          '  const sourceDir = "windows";',
+          "  try {",
+          '    const { windowsProjectPath } = require("react-native-test-app");',
+          "    return {",
+          "      windows: {",
+          "        sourceDir,",
+          `        solutionFile: "${name}.sln",`,
+          "        project: windowsProjectPath(path.join(__dirname, sourceDir)),",
+          "      },",
+          "    };",
+          "  } catch (_) {",
+          "    return undefined;",
+          "  }",
+          "})();",
           "",
-          'const sourceDir = "windows";',
           "module.exports = {",
-          "  project: {",
-          "    windows: {",
-          "      sourceDir,",
-          `      solutionFile: "${name}.sln",`,
-          "      project: windowsProjectPath(path.join(__dirname, sourceDir)),",
-          "    },",
-          "  },",
+          "  ...(project ? { project } : undefined),",
           '  reactNativePath: "node_modules/react-native-windows",',
           "};",
           ""
diff --git a/scripts/generate-manifest-docs.mjs b/scripts/generate-manifest-docs.mjs
new file mode 100755
index 0000000..27c9e0d
--- /dev/null
+++ b/scripts/generate-manifest-docs.mjs
@@ -0,0 +1,83 @@
+#!/usr/bin/env node
+// @ts-check
+
+import { readFileSync } from "fs";
+
+/**
+ * @typedef {{
+ *   description?: string;
+ *   type: "array";
+ *   items: { $ref: string; };
+ * }} SchemaArrayProperty
+ *
+ * @typedef {{
+ *   description?: string;
+ *   type: "string";
+ *   enum?: string[];
+ * }} SchemaStringProperty
+ *
+ * @typedef {{
+ *   description?: string;
+ *   allOf?: { $ref: string; }[];
+ *   type: "object";
+ *   properties: Record<string, SchemaArrayProperty | SchemaObjectProperty | SchemaStringProperty>;
+ * }} SchemaObjectProperty
+ */
+const schema = (() => {
+  const content = readFileSync("schema.json", { encoding: "utf-8" });
+  return JSON.parse(content);
+})();
+
+/**
+ * Renders the specified JSON object schema.
+ * @param {SchemaObjectProperty} definition
+ * @param {string[]} lines
+ * @param {string} scope
+ */
+function render(definition, lines, scope = "") {
+  definition.allOf?.forEach(({ $ref }) => {
+    render(schema.$defs[$ref.replace("#/$defs/", "")], lines, scope);
+  });
+
+  if (!definition.properties) {
+    return;
+  }
+
+  const breadcrumb = (() => {
+    let count = 0;
+    const length = scope.length;
+    for (let i = 0; i < length; ++i) {
+      if (scope.charAt(i) === "/") {
+        count++;
+      }
+    }
+    return ".".repeat(count);
+  })();
+
+  for (const [key, def] of Object.entries(definition.properties)) {
+    const { description, type } = def;
+    if (description) {
+      const anchor =
+        breadcrumb.length < 2
+          ? `<a name="${scope
+              .split("/")
+              .slice(1, 3)
+              .concat([key])
+              .join(".")}" />`
+          : "";
+      lines.push("<tr>");
+      lines.push(`<td valign='baseline'>${anchor}${breadcrumb}${key}</td>`);
+      lines.push(`<td>\n\n${description}\n\n</td>`);
+      lines.push("</tr>");
+    }
+    if (type === "object") {
+      render(def, lines, scope + `/${key}`);
+    }
+  }
+}
+
+const lines = ["<table>"];
+render(schema, lines);
+lines.push("</table>");
+
+console.log(lines.join("\n"));
diff --git a/scripts/set-react-version.js b/scripts/set-react-version.js
index b2ce934..6b061e7 100755
--- a/scripts/set-react-version.js
+++ b/scripts/set-react-version.js
@@ -15,7 +15,6 @@ const pacote = require("pacote");
 const VALID_TAGS = ["canary-macos", "canary-windows", "main", "nightly"];
 const REACT_NATIVE_VERSIONS = {
   "canary-macos": "^0.66",
-  "canary-windows": "^0.67.0-0",
 };
 
 /**
@@ -61,7 +60,7 @@ function fetchReactNativeWindowsCanaryInfoViaNuGet() {
     const { spawn } = require("child_process");
 
     let isResolved = false;
-    const list = spawn("nuget.exe", [
+    const list = spawn(process.env["NUGET_EXE"] || "nuget.exe", [
       "list",
       "Microsoft.ReactNative.Cxx",
       "-Source",
@@ -128,12 +127,13 @@ async function getProfile(v) {
     }
 
     case "canary-windows": {
-      const { version, dependencies, peerDependencies } = process.env["CI"]
-        ? await fetchReactNativeWindowsCanaryInfoViaNuGet()
-        : await fetchPackageInfo("react-native-windows@canary");
+      const { version, dependencies, peerDependencies } =
+        process.env["CI"] || process.env["NUGET_EXE"]
+          ? await fetchReactNativeWindowsCanaryInfoViaNuGet()
+          : await fetchPackageInfo("react-native-windows@canary");
       return {
         ...pickCommonDependencies(dependencies, peerDependencies),
-        "react-native": REACT_NATIVE_VERSIONS[v],
+        "react-native": peerDependencies?.["react-native"] || "^0.0.0-0",
         "react-native-macos": undefined,
         "react-native-windows": version,
       };
diff --git a/yarn.lock b/yarn.lock
index 83a03a2..b6e2daf 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1612,14 +1612,14 @@ __metadata:
   languageName: node
   linkType: hard
 
-"@microsoft/eslint-plugin-sdl@npm:^0.1.9":
-  version: 0.1.9
-  resolution: "@microsoft/eslint-plugin-sdl@npm:0.1.9"
+"@microsoft/eslint-plugin-sdl@npm:^0.2.0":
+  version: 0.2.0
+  resolution: "@microsoft/eslint-plugin-sdl@npm:0.2.0"
   dependencies:
     eslint-plugin-node: 11.1.0
     eslint-plugin-react: 7.24.0
     eslint-plugin-security: 1.4.0
-  checksum: 871f6aa8696b7d1ca5cbbb731a8f86d0d30a1e2f0257be6631755bb189d9aec94ea7f2432912d445585a9df415b10c382196f5117d1f9c34df87fa3f2f17bd26
+  checksum: 44fd7a0d29ebed48fc935d0b0f96394dea4e3a055467b0b53173c76ce44fb33ddf2b5913db6920e92cc5da1974b5c4e7942500f5f22f60f36f8fe1a3b2eae6c6
   languageName: node
   linkType: hard
 
@@ -2956,14 +2956,14 @@ __metadata:
   linkType: hard
 
 "ajv@npm:^8.0.0":
-  version: 8.10.0
-  resolution: "ajv@npm:8.10.0"
+  version: 8.11.0
+  resolution: "ajv@npm:8.11.0"
   dependencies:
     fast-deep-equal: ^3.1.1
     json-schema-traverse: ^1.0.0
     require-from-string: ^2.0.2
     uri-js: ^4.2.2
-  checksum: 3594728ef1e31219ef97bfacb203d0d72db8ad5c35d6d0578e38ee453e4537c2bf927dad144bb84b0c893f661d71b58337d4643e8ee2f2a6e1d63b041c92fe82
+  checksum: 5e0ff226806763be73e93dd7805b634f6f5921e3e90ca04acdf8db81eed9d8d3f0d4c5f1213047f45ebbf8047ffe0c840fa1ef2ec42c3a644899f69aa72b5bef
   languageName: node
   linkType: hard
 
@@ -5145,8 +5145,8 @@ __metadata:
   linkType: hard
 
 "eslint-plugin-jest@npm:^26.0.0":
-  version: 26.1.1
-  resolution: "eslint-plugin-jest@npm:26.1.1"
+  version: 26.1.3
+  resolution: "eslint-plugin-jest@npm:26.1.3"
   dependencies:
     "@typescript-eslint/utils": ^5.10.0
   peerDependencies:
@@ -5157,7 +5157,7 @@ __metadata:
       optional: true
     jest:
       optional: true
-  checksum: efed65bd6b83f15f38e3d8447d0dbbac18c10d6e4c4853c8d0539f5bc8e898cca8136b1e706899b756ea995ed189445b7f15d0fffeb983890608c33e752670d7
+  checksum: f340d25bf1b0a0cc5df43d2d7b0e547eef430994c5bc1514be62a26e3fe0263d795110d9a399bc176e18c18167872f3717f83bca67d273e092fd43498e6ab80e
   languageName: node
   linkType: hard
 
@@ -5281,8 +5281,8 @@ __metadata:
   linkType: hard
 
 "eslint@npm:^8.0.0":
-  version: 8.11.0
-  resolution: "eslint@npm:8.11.0"
+  version: 8.12.0
+  resolution: "eslint@npm:8.12.0"
   dependencies:
     "@eslint/eslintrc": ^1.2.1
     "@humanwhocodes/config-array": ^0.9.2
@@ -5321,7 +5321,7 @@ __metadata:
     v8-compile-cache: ^2.0.3
   bin:
     eslint: bin/eslint.js
-  checksum: a06a2ea37002d6c0a4f462fe31b4411185dc3da7857fafb896eb392ba95a1289cc3538056474b2f44f08012f265bede01a39d46df4ac39ebc6d7be90e2c8f9fa
+  checksum: 111bf9046b7a463049788dd00d7f4cd91e024029982352dff4811ce5dfa8cb1136aa127cd8a7a91508234d3e1b4fb6f638a1f5ef9ea08b1af93a18703a4a8dc1
   languageName: node
   linkType: hard
 
@@ -5414,10 +5414,10 @@ __metadata:
     react-native-test-app: "workspace:."
     react-native-windows: ^0.66.11
   peerDependencies:
-    react: ~16.8.6 || ~16.9.0 || ~16.11.0 || ~16.13.1 || ~17.0.1 || ~17.0.2
-    react-native: ^0.0.0-0 || 0.60 - 0.67 || 1000.0.0
-    react-native-macos: ^0.0.0-0 || 0.60 - 0.66
-    react-native-windows: ^0.0.0-0 || 0.62 - 0.67
+    react: ~16.11.0 || ~16.13.1 || ~17.0.1 || ~17.0.2
+    react-native: ^0.0.0-0 || 0.62 - 0.68 || 1000.0.0
+    react-native-macos: ^0.0.0-0 || 0.62 - 0.66
+    react-native-windows: ^0.0.0-0 || 0.62 - 0.68
   languageName: unknown
   linkType: soft
 
@@ -10304,11 +10304,11 @@ __metadata:
   linkType: hard
 
 "prettier@npm:^2.3.1":
-  version: 2.6.0
-  resolution: "prettier@npm:2.6.0"
+  version: 2.6.1
+  resolution: "prettier@npm:2.6.1"
   bin:
     prettier: bin-prettier.js
-  checksum: 3e527ad62279676778a8404d18174d7ca2365ada4caba6eebbcdd9907d1187afd3bc6ade5b4e5f5d4549bb9fb71e45ca8930d71500017635524f8fc05bc52e93
+  checksum: 78be1f8a3ddfad7c3d8a854b6c8941a3bb1ddfca4225c38d778e0fe1029a55368f71b3bbefff82c689015fbb4d391ec44add957f01308ad2725e01a7c1f37cb6
   languageName: node
   linkType: hard
 
@@ -10546,8 +10546,8 @@ __metadata:
   linkType: hard
 
 "react-native-macos@npm:^0.66.14":
-  version: 0.66.31
-  resolution: "react-native-macos@npm:0.66.31"
+  version: 0.66.38
+  resolution: "react-native-macos@npm:0.66.38"
   dependencies:
     "@jest/create-cache-key-function": ^27.0.1
     "@react-native-community/cli": ^6.0.0
@@ -10584,7 +10584,7 @@ __metadata:
     react: 17.0.2
   bin:
     react-native-macos: cli.js
-  checksum: 996ed8b5ba925074f11afbba98fb0ce2213bdb4ee4a6eec4708f73cd61dc29e37e00cacb80d63606b391a00c66653fa9960c89679d3fb89a4780a55cab624053
+  checksum: 85b7672e70e56b0feba5a1621607eacb13404e4968b10558a752d1862b4108020a9fd97f815ec16133d7daddcb071cb1f2fed4e6f9910c006f686d574821ca7a
   languageName: node
   linkType: hard
 
@@ -10595,7 +10595,7 @@ __metadata:
     "@babel/core": ^7.0.0
     "@commitlint/cli": ^16.0.0
     "@commitlint/config-conventional": ^16.0.0
-    "@microsoft/eslint-plugin-sdl": ^0.1.9
+    "@microsoft/eslint-plugin-sdl": ^0.2.0
     "@react-native-community/cli": ^6.0.0
     "@react-native-community/cli-platform-android": ^6.0.0
     "@react-native-community/cli-platform-ios": ^6.0.0
@@ -10634,9 +10634,9 @@ __metadata:
     "@react-native-community/cli-platform-ios": ">=4.10.0"
     mustache: ^4.0.0
     react: ~16.11.0 || ~16.13.1 || ~17.0.1 || ~17.0.2
-    react-native: ^0.0.0-0 || 0.62 - 0.67 || 1000.0.0
+    react-native: ^0.0.0-0 || 0.62 - 0.68 || 1000.0.0
     react-native-macos: ^0.0.0-0 || 0.62 - 0.66
-    react-native-windows: ^0.0.0-0 || 0.62 - 0.67
+    react-native-windows: ^0.0.0-0 || 0.62 - 0.68
   peerDependenciesMeta:
     "@react-native-community/cli":
       optional: true
@@ -12645,22 +12645,22 @@ resolve@^2.0.0-next.3:
   linkType: hard
 
 "typescript@npm:^4.0.0, typescript@npm:^4.4.3":
-  version: 4.6.2
-  resolution: "typescript@npm:4.6.2"
+  version: 4.6.3
+  resolution: "typescript@npm:4.6.3"
   bin:
     tsc: bin/tsc
     tsserver: bin/tsserver
-  checksum: 8a44ed7e6f6c4cb1ebe8cf236ecda2fb119d84dcf0fbd77e707b2dfea1bbcfc4e366493a143513ce7f57203c75da9d4e20af6fe46de89749366351046be7577c
+  checksum: 255bb26c8cb846ca689dd1c3a56587af4f69055907aa2c154796ea28ee0dea871535b1c78f85a6212c77f2657843a269c3a742d09d81495b97b914bf7920415b
   languageName: node
   linkType: hard
 
 "typescript@patch:typescript@^4.0.0#~builtin<compat/typescript>, typescript@patch:typescript@^4.4.3#~builtin<compat/typescript>":
-  version: 4.6.2
-  resolution: "typescript@patch:typescript@npm%3A4.6.2#~builtin<compat/typescript>::version=4.6.2&hash=493e53"
+  version: 4.6.3
+  resolution: "typescript@patch:typescript@npm%3A4.6.3#~builtin<compat/typescript>::version=4.6.3&hash=493e53"
   bin:
     tsc: bin/tsc
     tsserver: bin/tsserver
-  checksum: efb83260a22ee49d4c8bdc59b3cefe54fdf51d6f563f5c3a35aa3d5e46fb12f3f1d33a36d6f9f64171e567ead1847e99cb612d0a9a74e7d44e16cad9d0bbc937
+  checksum: fe6bdc1afb2f145ddb7b0a3a31f96352209f6a5704d97f038414ea22ff9d8dd42f32cfb6652e30458d7d958d2d4e85de2df11c574899c6f750a6b3c0e90a3a76
   languageName: node
   linkType: hard
 


Test patch:
diff --git a/test/configure/__snapshots__/gatherConfig.test.js.snap b/test/configure/__snapshots__/gatherConfig.test.js.snap
index 0eeeece..86e7058 100644
--- a/test/configure/__snapshots__/gatherConfig.test.js.snap
+++ b/test/configure/__snapshots__/gatherConfig.test.js.snap
@@ -24,13 +24,21 @@ use_test_app!
     "metro.config.js": Object {
       "source": "example/metro.config.js",
     },
-    "react-native.config.js": "const { iosProjectPath } = require(\\"react-native-test-app\\");
-module.exports = {
-  project: {
-    ios: {
-      project: iosProjectPath(\\".\\"),
-    }
+    "react-native.config.js": "const project = (() => {
+  try {
+    const { iosProjectPath } = require(\\"react-native-test-app\\");
+    return {
+      ios: {
+        project: iosProjectPath(\\".\\"),
+      },
+    };
+  } catch (_) {
+    return undefined;
   }
+})();
+
+module.exports = {
+  ...(project ? { project } : undefined),
 };
 ",
   },
@@ -126,29 +134,36 @@ use_test_app!
     "metro.config.js": Object {
       "source": "example/metro.config.js",
     },
-    "react-native.config.js": "const fs = require(\\"fs\\");
-const path = require(\\"path\\");
-const {
-  androidManifestPath,
-  iosProjectPath,
-  windowsProjectPath,
-} = require(\\"react-native-test-app\\");
+    "react-native.config.js": "const project = (() => {
+  const fs = require(\\"fs\\");
+  const path = require(\\"path\\");
+  try {
+    const {
+      androidManifestPath,
+      iosProjectPath,
+      windowsProjectPath,
+    } = require(\\"react-native-test-app\\");
+    return {
+      android: {
+        sourceDir: \\"android\\",
+        manifestPath: androidManifestPath(path.join(__dirname, \\"android\\")),
+      },
+      ios: {
+        project: iosProjectPath(\\"ios\\"),
+      },
+      windows: fs.existsSync(\\"windows/Test.sln\\") && {
+        sourceDir: \\"windows\\",
+        solutionFile: \\"Test.sln\\",
+        project: windowsProjectPath(path.join(__dirname, \\"windows\\")),
+      },
+    };
+  } catch (_) {
+    return undefined;
+  }
+})();
 
 module.exports = {
-  project: {
-    android: {
-      sourceDir: \\"android\\",
-      manifestPath: androidManifestPath(path.join(__dirname, \\"android\\")),
-    },
-    ios: {
-      project: iosProjectPath(\\"ios\\"),
-    },
-    windows: fs.existsSync(\\"windows/Test.sln\\") && {
-      sourceDir: \\"windows\\",
-      solutionFile: \\"Test.sln\\",
-      project: windowsProjectPath(path.join(__dirname, \\"windows\\")),
-    },
-  },
+  ...(project ? { project } : undefined),
 };
 ",
   },
@@ -193,57 +208,71 @@ Object {
     "common/metro.config.js": Object {
       "source": "example/metro.config.js",
     },
-    "common/react-native.config.js": "const fs = require(\\"fs\\");
-const path = require(\\"path\\");
-const {
-  androidManifestPath,
-  iosProjectPath,
-  windowsProjectPath,
-} = require(\\"react-native-test-app\\");
+    "common/react-native.config.js": "const project = (() => {
+  const fs = require(\\"fs\\");
+  const path = require(\\"path\\");
+  try {
+    const {
+      androidManifestPath,
+      iosProjectPath,
+      windowsProjectPath,
+    } = require(\\"react-native-test-app\\");
+    return {
+      android: {
+        sourceDir: \\"android\\",
+        manifestPath: androidManifestPath(path.join(__dirname, \\"android\\")),
+      },
+      ios: {
+        project: iosProjectPath(\\"ios\\"),
+      },
+      windows: fs.existsSync(\\"windows/Test.sln\\") && {
+        sourceDir: \\"windows\\",
+        solutionFile: \\"Test.sln\\",
+        project: windowsProjectPath(path.join(__dirname, \\"windows\\")),
+      },
+    };
+  } catch (_) {
+    return undefined;
+  }
+})();
 
 module.exports = {
-  project: {
-    android: {
-      sourceDir: \\"android\\",
-      manifestPath: androidManifestPath(path.join(__dirname, \\"android\\")),
-    },
-    ios: {
-      project: iosProjectPath(\\"ios\\"),
-    },
-    windows: fs.existsSync(\\"windows/Test.sln\\") && {
-      sourceDir: \\"windows\\",
-      solutionFile: \\"Test.sln\\",
-      project: windowsProjectPath(path.join(__dirname, \\"windows\\")),
-    },
-  },
+  ...(project ? { project } : undefined),
 };
 ",
     "metro.config.js": Object {
       "source": "example/metro.config.js",
     },
-    "react-native.config.js": "const fs = require(\\"fs\\");
-const path = require(\\"path\\");
-const {
-  androidManifestPath,
-  iosProjectPath,
-  windowsProjectPath,
-} = require(\\"react-native-test-app\\");
+    "react-native.config.js": "const project = (() => {
+  const fs = require(\\"fs\\");
+  const path = require(\\"path\\");
+  try {
+    const {
+      androidManifestPath,
+      iosProjectPath,
+      windowsProjectPath,
+    } = require(\\"react-native-test-app\\");
+    return {
+      android: {
+        sourceDir: \\"android\\",
+        manifestPath: androidManifestPath(path.join(__dirname, \\"android\\")),
+      },
+      ios: {
+        project: iosProjectPath(\\"ios\\"),
+      },
+      windows: fs.existsSync(\\"windows/Test.sln\\") && {
+        sourceDir: \\"windows\\",
+        solutionFile: \\"Test.sln\\",
+        project: windowsProjectPath(path.join(__dirname, \\"windows\\")),
+      },
+    };
+  } catch (_) {
+    return undefined;
+  }
+})();
 
 module.exports = {
-  project: {
-    android: {
-      sourceDir: \\"android\\",
-      manifestPath: androidManifestPath(path.join(__dirname, \\"android\\")),
-    },
-    ios: {
-      project: iosProjectPath(\\"ios\\"),
-    },
-    windows: fs.existsSync(\\"windows/Test.sln\\") && {
-      sourceDir: \\"windows\\",
-      solutionFile: \\"Test.sln\\",
-      project: windowsProjectPath(path.join(__dirname, \\"windows\\")),
-    },
-  },
+  ...(project ? { project } : undefined),
 };
 ",
   },
@@ -278,29 +307,36 @@ use_test_app!
     "metro.config.js": Object {
       "source": "example/metro.config.js",
     },
-    "react-native.config.js": "const fs = require(\\"fs\\");
-const path = require(\\"path\\");
-const {
-  androidManifestPath,
-  iosProjectPath,
-  windowsProjectPath,
-} = require(\\"react-native-test-app\\");
+    "react-native.config.js": "const project = (() => {
+  const fs = require(\\"fs\\");
+  const path = require(\\"path\\");
+  try {
+    const {
+      androidManifestPath,
+      iosProjectPath,
+      windowsProjectPath,
+    } = require(\\"react-native-test-app\\");
+    return {
+      android: {
+        sourceDir: \\"android\\",
+        manifestPath: androidManifestPath(path.join(__dirname, \\"android\\")),
+      },
+      ios: {
+        project: iosProjectPath(\\"ios\\"),
+      },
+      windows: fs.existsSync(\\"windows/Test.sln\\") && {
+        sourceDir: \\"windows\\",
+        solutionFile: \\"Test.sln\\",
+        project: windowsProjectPath(path.join(__dirname, \\"windows\\")),
+      },
+    };
+  } catch (_) {
+    return undefined;
+  }
+})();
 
 module.exports = {
-  project: {
-    android: {
-      sourceDir: \\"android\\",
-      manifestPath: androidManifestPath(path.join(__dirname, \\"android\\")),
-    },
-    ios: {
-      project: iosProjectPath(\\"ios\\"),
-    },
-    windows: fs.existsSync(\\"windows/Test.sln\\") && {
-      sourceDir: \\"windows\\",
-      solutionFile: \\"Test.sln\\",
-      project: windowsProjectPath(path.join(__dirname, \\"windows\\")),
-    },
-  },
+  ...(project ? { project } : undefined),
 };
 ",
   },
@@ -405,29 +441,36 @@ use_test_app!
     "metro.config.js": Object {
       "source": "example/metro.config.js",
     },
-    "react-native.config.js": "const fs = require(\\"fs\\");
-const path = require(\\"path\\");
-const {
-  androidManifestPath,
-  iosProjectPath,
-  windowsProjectPath,
-} = require(\\"react-native-test-app\\");
+    "react-native.config.js": "const project = (() => {
+  const fs = require(\\"fs\\");
+  const path = require(\\"path\\");
+  try {
+    const {
+      androidManifestPath,
+      iosProjectPath,
+      windowsProjectPath,
+    } = require(\\"react-native-test-app\\");
+    return {
+      android: {
+        sourceDir: \\"android\\",
+        manifestPath: androidManifestPath(path.join(__dirname, \\"android\\")),
+      },
+      ios: {
+        project: iosProjectPath(\\"ios\\"),
+      },
+      windows: fs.existsSync(\\"windows/Test.sln\\") && {
+        sourceDir: \\"windows\\",
+        solutionFile: \\"Test.sln\\",
+        project: windowsProjectPath(path.join(__dirname, \\"windows\\")),
+      },
+    };
+  } catch (_) {
+    return undefined;
+  }
+})();
 
 module.exports = {
-  project: {
-    android: {
-      sourceDir: \\"android\\",
-      manifestPath: androidManifestPath(path.join(__dirname, \\"android\\")),
-    },
-    ios: {
-      project: iosProjectPath(\\"ios\\"),
-    },
-    windows: fs.existsSync(\\"windows/Test.sln\\") && {
-      sourceDir: \\"windows\\",
-      solutionFile: \\"Test.sln\\",
-      project: windowsProjectPath(path.join(__dirname, \\"windows\\")),
-    },
-  },
+  ...(project ? { project } : undefined),
 };
 ",
     "windows/.gitignore": Object {
@@ -539,29 +582,36 @@ use_test_app!
     "metro.config.js": Object {
       "source": "example/metro.config.js",
     },
-    "react-native.config.js": "const fs = require(\\"fs\\");
-const path = require(\\"path\\");
-const {
-  androidManifestPath,
-  iosProjectPath,
-  windowsProjectPath,
-} = require(\\"react-native-test-app\\");
+    "react-native.config.js": "const project = (() => {
+  const fs = require(\\"fs\\");
+  const path = require(\\"path\\");
+  try {
+    const {
+      androidManifestPath,
+      iosProjectPath,
+      windowsProjectPath,
+    } = require(\\"react-native-test-app\\");
+    return {
+      android: {
+        sourceDir: \\"android\\",
+        manifestPath: androidManifestPath(path.join(__dirname, \\"android\\")),
+      },
+      ios: {
+        project: iosProjectPath(\\"ios\\"),
+      },
+      windows: fs.existsSync(\\"windows/Test.sln\\") && {
+        sourceDir: \\"windows\\",
+        solutionFile: \\"Test.sln\\",
+        project: windowsProjectPath(path.join(__dirname, \\"windows\\")),
+      },
+    };
+  } catch (_) {
+    return undefined;
+  }
+})();
 
 module.exports = {
-  project: {
-    android: {
-      sourceDir: \\"android\\",
-      manifestPath: androidManifestPath(path.join(__dirname, \\"android\\")),
-    },
-    ios: {
-      project: iosProjectPath(\\"ios\\"),
-    },
-    windows: fs.existsSync(\\"windows/Test.sln\\") && {
-      sourceDir: \\"windows\\",
-      solutionFile: \\"Test.sln\\",
-      project: windowsProjectPath(path.join(__dirname, \\"windows\\")),
-    },
-  },
+  ...(project ? { project } : undefined),
 };
 ",
   },
diff --git a/windows/ReactTestApp/ReactInstance.cpp b/windows/ReactTestApp/ReactInstance.cpp
index 869714c..02a491a 100644
--- a/windows/ReactTestApp/ReactInstance.cpp
+++ b/windows/ReactTestApp/ReactInstance.cpp
@@ -141,10 +141,10 @@ void ReactInstance::Reload()
     instanceSettings.UseDeveloperSupport(false);
 #endif
 
-#ifdef REACT_NATIVE_VERSION >= 6300
+#if REACT_NATIVE_VERSION >= 6300
     auto [host, port] = BundlerAddress();
     instanceSettings.SourceBundleHost(host);
-    instanceSettings.SourceBundlePort(port);
+    instanceSettings.SourceBundlePort(static_cast<uint16_t>(port));
 #endif  // REACT_NATIVE_VERSION >= 6300
 
     reactNativeHost_.ReloadInstance();
diff --git a/windows/test-app.js b/windows/test-app.js
index e81d6db..9c3625d 100755
--- a/windows/test-app.js
+++ b/windows/test-app.js
@@ -555,7 +555,12 @@ function generateSolution(destPath, { autolink, useHermes, useNuGet }) {
   const rnWindowsVersion = getPackageVersion(rnWindowsPath);
   const rnWindowsVersionNumber = getVersionNumber(rnWindowsVersion);
   const hermesVersion = useHermes && getHermesVersion(rnWindowsPath);
-  const xamlVersion = rnWindowsVersionNumber < 6700 ? "2.6.0" : "2.7.0";
+  const usePackageReferences =
+    rnWindowsVersionNumber === 0 || rnWindowsVersionNumber >= 6800;
+  const xamlVersion =
+    rnWindowsVersionNumber > 0 && rnWindowsVersionNumber < 6700
+      ? "2.6.0"
+      : "2.7.0";
 
   /** @type {[string, Record<string, string>?][]} */
   const projectFiles = [
@@ -603,7 +608,7 @@ function generateSolution(destPath, { autolink, useHermes, useNuGet }) {
       {
         '<package id="Microsoft.UI.Xaml" version="0.0.0" targetFramework="native"/>':
           nuGetPackage("Microsoft.UI.Xaml", xamlVersion),
-        ...(useNuGet
+        ...(useNuGet && !usePackageReferences
           ? {
               '<!-- package id="Microsoft.ReactNative" version="1000.0.0" targetFramework="native"/ -->':
                 nuGetPackage("Microsoft.ReactNative", rnWindowsVersion),
@@ -611,7 +616,7 @@ function generateSolution(destPath, { autolink, useHermes, useNuGet }) {
                 nuGetPackage("Microsoft.ReactNative.Cxx", rnWindowsVersion),
             }
           : undefined),
-        ...(hermesVersion
+        ...(hermesVersion && !usePackageReferences
           ? {
               '<!-- package id="ReactNative.Hermes.Windows" version="0.0.0" targetFramework="native"/ -->':
                 nuGetPackage("ReactNative.Hermes.Windows", hermesVersion),
@@ -765,9 +770,10 @@ function generateSolution(destPath, { autolink, useHermes, useNuGet }) {
             "NuGet.Config"
           )
         );
-      if (nugetConfigPath) {
+      const nugetConfigDestPath = path.join(destPath, "NuGet.Config");
+      if (nugetConfigPath && !fs.existsSync(nugetConfigDestPath)) {
         fs.writeFile(
-          path.join(destPath, "NuGet.Config"),
+          nugetConfigDestPath,
           mustache.render(
             fs.readFileSync(nugetConfigPath, textFileReadOptions),
             {}