* Update to RN 0.73

* Change files

* RN 73 requires node 18

* Add 72 profile

* Update wdio/appium etc to get it running on node 18

* fix

* fix

* Update podfile locks

* fix

* fix

* fix

* see if building fixes resolution of focus-zone by e2e tests

* Try specifying reports dir with full path

* Try debug level reporting to identify error creating logs

* try enabling more logs

* alternate way to specify logfile.

* downgrade @wdio/appium-service to move before https://github.com/webdriverio/webdriverio/pull/12095

* Test no-packager

* yarn init-test-app  (With cleanup)

* Try install Java18

* fix

* fix

* Android E2E fixes

* fix?

* fix

* fix

* Add more logging for E2E android test failure

* more logs

* more log

* Use actual scroll region, to avoid OS swipe gestures

* Increase android time out to navigate to page

* fix

* remove extra try/catch and logging

* Fix windows build

* test windows PR without node install

---------

Co-authored-by: Saad Najmi <sanajmi@microsoft.com>
This commit is contained in:
Andrew Coates 2024-04-11 10:32:42 -07:00 коммит произвёл GitHub
Родитель 4c79e3ea54
Коммит 6164473627
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: B5690EEEBB952194
200 изменённых файлов: 7514 добавлений и 4452 удалений

Просмотреть файл

@ -162,7 +162,7 @@ jobs:
- bash: |
echo "yarn $(platform)"
yarn $(platform) --simulator "$(ios_simulator)"
yarn $(platform) --simulator "$(ios_simulator)" --no-packager
workingDirectory: apps/fluent-tester
displayName: 'yarn $(platform)'
@ -175,7 +175,7 @@ jobs:
pool:
name: rnw-pool-4
demands:
- ImageOverride -equals rnw-img-vs2022
- ImageOverride -equals rnw-img-vs2022-node18
timeoutInMinutes: 60 # how long to run the job before automatically cancelling
cancelTimeoutInMinutes: 5 # how much time to give 'run always even if cancelled tasks' before killing them

Просмотреть файл

@ -7,7 +7,7 @@ steps:
tasks: 'assembleDebug'
gradleOptions: '-Xmx2g'
javaHomeOption: 'JDKVersion'
jdkVersionOption: '1.11'
jdkVersionOption: '1.17'
workingDirectory: apps/fluent-tester/android
- script: |

Просмотреть файл

@ -4,3 +4,7 @@ steps:
- script: |
yarn build-tools
displayName: "yarn build-tools"
- script: |
yarn build
displayName: "yarn build"

Просмотреть файл

@ -1,9 +1,9 @@
# This template install dependencies, builds, and bundles this repo
steps:
- task: NodeTool@0
inputs:
versionSource: 'fromFile'
versionFilePath: '.node-version'
# - task: NodeTool@0
# inputs:
# versionSource: 'fromFile'
# versionFilePath: '.node-version'
- task: NuGetToolInstaller@0
inputs:

Просмотреть файл

@ -1 +1 @@
16
18

7
apps/E2E/global.d.ts поставляемый Normal file
Просмотреть файл

@ -0,0 +1,7 @@
import type {BrowserCommands} from 'webdriverio'
declare global {
const browser: BrowserCommands;
const driver: BrowserCommands.Driver;
const $: BrowserCommands.$;
}

Просмотреть файл

@ -23,9 +23,9 @@
],
"dependencies": {
"react": "18.2.0",
"react-native": "^0.72.0",
"react-native-macos": "^0.72.0",
"react-native-windows": "^0.72.0"
"react-native": "^0.73.0",
"react-native-macos": "^0.73.0",
"react-native-windows": "^0.73.0"
},
"devDependencies": {
"@babel/core": "^7.8.0",
@ -33,26 +33,27 @@
"@fluentui-react-native/eslint-config-rules": "workspace:*",
"@fluentui-react-native/focus-zone": "workspace:*",
"@fluentui-react-native/scripts": "workspace:*",
"@react-native/metro-config": "^0.72.0",
"@react-native/babel-preset": "^0.73.0",
"@react-native/metro-babel-transformer": "^0.73.0",
"@react-native/metro-config": "^0.73.0",
"@rnx-kit/metro-config": "^1.3.1",
"@types/jasmine": "3.10.3",
"@types/jasmine": "5.1.4",
"@types/react": "^18.2.0",
"@wdio/appium-service": "7.30.0",
"@wdio/cli": "7.30.1",
"@wdio/jasmine-framework": "7.26.0",
"@wdio/local-runner": "7.30.1",
"@wdio/spec-reporter": "7.29.1",
"appium": "^2.0.0",
"appium-mac2-driver": "^1.8.2",
"appium-uiautomator2-driver": "^2.29.0",
"appium-windows-driver": "^2.12.0",
"appium-xcuitest-driver": "^5.6.0",
"metro-config": "^0.76.5",
"metro-react-native-babel-preset": "^0.76.5",
"@wdio/appium-service": "8.29.1",
"@wdio/cli": "8.35.1",
"@wdio/jasmine-framework": "8.35.1",
"@wdio/local-runner": "8.35.1",
"@wdio/spec-reporter": "8.32.4",
"appium": "^2.5.1",
"appium-mac2-driver": "^1.12.0",
"appium-uiautomator2-driver": "^3.0.5",
"appium-windows-driver": "^2.12.18",
"appium-xcuitest-driver": "^7.9.1",
"metro-config": "^0.80.0",
"rimraf": "^5.0.1",
"ts-node": "^8.10.1",
"ts-node": "^10.7.0",
"typescript": "4.9.4",
"webdriverio": "7.30.1"
"webdriverio": "8.35.1"
},
"installConfig": {
"hoistingLimits": "dependencies"
@ -64,10 +65,12 @@
"microsoft/react-native"
],
"requirements": [
"react-native@0.72"
"react-native@0.73"
],
"capabilities": [
"core",
"core-macos",
"core-windows",
"react",
"metro-config",
"babel-preset-react-native"

Просмотреть файл

@ -93,14 +93,13 @@ export abstract class BasePage {
* Some components' E2E tests check only if the test page loads correctly or not. Others
* (majority), perform UI manipulation tests on UI components on the test page. In these scenarios, these UI components have their
* own section on the test page (by default, it's hidden so partners don't see it). This method opens up that testing section.
*/
*/
async enableE2ETesterMode(): Promise<boolean | void> {
const e2eSwitch = await this._e2eSwitch;
await browser.waitUntil(async () => await e2eSwitch.isDisplayed() && await e2eSwitch.isEnabled(),
{
await browser.waitUntil(async () => (await e2eSwitch.isDisplayed()) && (await e2eSwitch.isEnabled()), {
timeout: 15000,
timeoutMsg: 'The E2E Switch should be enabled and visible before we interact with it'
})
timeoutMsg: 'The E2E Switch should be enabled and visible before we interact with it',
});
switch (this.platform) {
// Usually, we use .isSelected() to see if a control (our switch) is checked true or false, but the process is
@ -139,7 +138,7 @@ export abstract class BasePage {
const el = await element;
try {
await browser.waitUntil(async () => expectedValue === await el.getAttribute(attribute));
await browser.waitUntil(async () => expectedValue === (await el.getAttribute(attribute)));
} catch {
const actualValue = await el.getAttribute(attribute);
switch (this.platform) {
@ -181,7 +180,7 @@ export abstract class BasePage {
* - Escape out of a menu: MenuPageObject.sendKeys(MenuPageObject.item1, [KEY_ESCAPE])
*/
async sendKeys(element: Promise<WebdriverIO.Element>, keys: Keys[]): Promise<void> {
await (await element).addValue(keys);
await (await element).addValue(keys.join());
}
/** Short-hand method for PageObjects to get an element attribute during testing, with attribute being type-enforced. */
@ -192,7 +191,7 @@ export abstract class BasePage {
/* Scrolls until the desired test page's button is displayed. We use the scroll viewer UI element as the point to start scrolling.
* We use a negative number as the Y-coordinate because that enables us to scroll downwards */
async mobileScrollToComponentButton(): Promise<void> {
if (await (await this._pageButton).isDisplayed()) {
if (this.platform !== 'android' && (await (await this._pageButton).isDisplayed())) {
return;
}
@ -213,8 +212,52 @@ export abstract class BasePage {
);
break;
}
// UiScrollable seems to continuously scroll the wrong direction on android in the current appium / appium-uiautomator2-driver version
// So Instead we use this rather overly complex method of scrolling the items into view. On future appium updates we should see if
// we can return to using the simpler and probably more reliable UiScrollable method below.
case 'android': {
await browser.waitUntil(
async () => {
let needsScroll = true;
let scrollLoc = { x: 8, y: 170 };
let scrollSize = { width: 1264, height: 574 };
const scroller = await By(TESTPAGE_BUTTONS_SCROLLVIEWER);
scrollLoc = await scroller.getLocation();
scrollSize = await scroller.getSize();
const pageButton = await this._pageButton;
const isPageButtonDisplayed = await pageButton.isDisplayed();
if (isPageButtonDisplayed) {
// Verify that the button is fully on screen
const buttonLoc = await pageButton.getLocation();
const buttonSize = await pageButton.getSize();
needsScroll = scrollLoc.y + scrollSize.height <= buttonLoc.y + buttonSize.height;
}
if (needsScroll) {
await driver.execute('mobile: scrollGesture', {
direction: 'down',
left: scrollLoc.x + scrollSize.width * 0.2,
width: scrollSize.width - scrollSize.width * 0.4,
top: scrollLoc.y + scrollSize.height * 0.2,
height: scrollSize.height - scrollSize.height * 0.4,
percent: 0.6,
speed: 1000,
});
return false;
}
return true;
},
{
timeout: this.waitForUiEvent,
timeoutMsg: errorMsg,
},
);
break;
}
default:
case 'android':
/* 'mobile: scroll' which is used for iOS, does not support direction option on Android.
* Instead, we use the UiScrollable class to scroll down to the desired view based on its 'description' (accessibilityLabel).
* The first selector tells which container to scroll in, and the other selector tells which component to scroll to. */
@ -235,7 +278,11 @@ export abstract class BasePage {
/** Waits for the tester app to load by checking if the startup page loads. If the app doesn't load before the timeout, it causes the test to fail. */
async waitForInitialPageToDisplay(): Promise<boolean | void> {
return await this.waitForCondition(async () => await (await this._initialPage).isDisplayed(), this.ERRORMESSAGE_APPLOAD, BOOT_APP_TIMEOUT);
return await this.waitForCondition(
async () => await (await this._initialPage).isDisplayed(),
this.ERRORMESSAGE_APPLOAD,
BOOT_APP_TIMEOUT,
);
}
/* Scrolls to the specified or primary UI test element until it is displayed. */
@ -311,7 +358,12 @@ export abstract class BasePage {
/* A method that allows the caller to pass in a condition. A wrapper for waitUntil(). Once testing becomes more extensive,
* this will allow cleaner code within all the Page Objects. */
async waitForCondition(condition: () => Promise<boolean>, errorMsg?: string, timeout?: number, interval?: number): Promise<boolean | void> {
async waitForCondition(
condition: () => Promise<boolean>,
errorMsg?: string,
timeout?: number,
interval?: number,
): Promise<boolean | void> {
return await browser.waitUntil(async () => await condition(), {
timeout: timeout ?? this.waitForUiEvent,
timeoutMsg: errorMsg ?? 'Error. Please see /errorShots and logs for more information.',

Просмотреть файл

@ -8,7 +8,7 @@
"*": ["*", "*.win32", "./*"],
"src/*": ["./src/*", "src"]
},
"types": ["webdriverio/async", "@wdio/jasmine-framework", "node", "@types/jasmine"]
"types": ["./global", "webdriverio", "@wdio/jasmine-framework", "node", "@types/jasmine"]
},
"include": ["src"]
}

Просмотреть файл

@ -17,6 +17,10 @@ exports.config = {
'appium:appPackage': 'com.microsoft.reacttestapp',
'appium:appActivity': 'MainActivity',
'appium:automationName': 'uiautomator2',
// These two capabilities disable the normal onscreen keyboard.
// The onscreen keyboard has a very complex representation that makes the appium code respond very slow.
'appium:resetKeyboard': true,
'appium:unicodeKeyboard': true,
},
],

Просмотреть файл

@ -1,7 +1,14 @@
buildscript {
def androidTestAppDir = "../../../node_modules/react-native-test-app/android"
apply(from: "${androidTestAppDir}/dependencies.gradle")
apply(from: "${androidTestAppDir}/test-app-util.gradle")
apply(from: {
def searchDir = rootDir.toPath()
do {
def p = searchDir.resolve("node_modules/react-native-test-app/android/dependencies.gradle")
if (p.toFile().exists()) {
return p.toRealPath().toString()
}
} while (searchDir = searchDir.getParent())
throw new GradleException("Could not find `react-native-test-app`");
}())
repositories {
mavenCentral()
@ -10,7 +17,7 @@ buildscript {
dependencies {
getReactNativeDependencies().each { dependency ->
classpath(dependency)
classpath(dependency)
}
}
}
@ -19,7 +26,16 @@ allprojects {
repositories {
maven {
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
url("${rootDir}/../../../node_modules/react-native/android")
url({
def searchDir = rootDir.toPath()
do {
def p = searchDir.resolve("node_modules/react-native/android")
if (p.toFile().exists()) {
return p.toRealPath().toString()
}
} while (searchDir = searchDir.getParent())
throw new GradleException("Could not find `react-native`");
}())
}
mavenCentral()
google()

Просмотреть файл

@ -26,13 +26,28 @@ org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryEr
android.useAndroidX=true
# Automatically convert third-party libraries to use AndroidX
android.enableJetifier=true
# Jetifier randomly fails on these libraries
android.jetifier.ignorelist=hermes-android
# Version of Flipper to use with React Native. Default value is whatever React
# Native defaults to. To disable Flipper, set it to `false`.
#FLIPPER_VERSION=0.125.0
# Use this property to specify which architecture you want to build.
# You can also override it from the CLI using
# ./gradlew <task> -PreactNativeArchitectures=x86_64
reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64
# Enable Fabric at runtime.
#USE_FABRIC=1
# Use this property to enable support to the new architecture.
# This will allow you to use TurboModules and the Fabric render in
# your application. You should enable this flag either if you want
# to write custom TurboModules/Fabric components OR use libraries that
# are providing them.
# Note that this is incompatible with web debugging.
#newArchEnabled=true
#bridgelessEnabled=true
# Uncomment the line below if building react-native from source
#ANDROID_NDK_VERSION=21.4.7075529
# Uncomment the line below to build React Native from source.
#react.buildFromSource=true
# Version of Android NDK to build against.
#ANDROID_NDK_VERSION=26.1.10909125
# Version of Kotlin to build against.
#KOTLIN_VERSION=1.8.22

Двоичные данные
apps/fluent-tester/android/gradle/wrapper/gradle-wrapper.jar поставляемый

Двоичный файл не отображается.

Просмотреть файл

@ -1,5 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

41
apps/fluent-tester/android/gradlew поставляемый
Просмотреть файл

@ -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,13 +80,11 @@ 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##*/}
# 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"'
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
@ -133,22 +131,29 @@ location of your Java installation."
fi
else
JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
if ! command -v java >/dev/null 2>&1
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
fi
# Increase the maximum file descriptors if we can.
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=SC2039,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=SC2039,SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
@ -193,11 +198,15 @@ if "$cygwin" || "$msys" ; then
done
fi
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded.
# 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"'
# Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
@ -205,6 +214,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.

35
apps/fluent-tester/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,13 +41,13 @@ 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.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
echo. 1>&2
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
@ -56,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
echo. 1>&2
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
@ -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

Просмотреть файл

@ -1,12 +1,21 @@
pluginManagement {
repositories {
gradlePluginPortal()
mavenLocal()
mavenCentral()
google()
}
}
rootProject.name = "FluentTester"
apply(from: "../../../node_modules/react-native-test-app/test-app.gradle")
apply(from: {
def searchDir = rootDir.toPath()
do {
def p = searchDir.resolve("node_modules/react-native-test-app/test-app.gradle")
if (p.toFile().exists()) {
return p.toRealPath().toString()
}
} while (searchDir = searchDir.getParent())
throw new GradleException("Could not find `react-native-test-app`");
}())
applyTestAppSettings(settings)

Просмотреть файл

@ -1,3 +1,3 @@
module.exports = {
presets: [['module:metro-react-native-babel-preset', { runtime: 'classic' }]],
presets: [['module:@react-native/babel-preset', { runtime: 'classic' }]],
};

Просмотреть файл

@ -1,9 +1,13 @@
'use strict';
import { AppRegistry } from 'react-native';
import { AppRegistry, LogBox } from 'react-native';
import { FluentTesterApp } from './src/FluentTesterApp';
// When selecting a test page, the test page button might be under the yellowbox,
//so we have to ensure that no yellowboxes are shown on boot that could affect test selection
LogBox.ignoreLogs([/.*deprecated.*/, /.*Platform is not supported.*/])
AppRegistry.registerComponent('FluentTester', () => FluentTesterApp);
export default FluentTesterApp;

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -88,10 +88,10 @@
"@react-native-picker/picker": "^2.7.0",
"@warren-ms/react-native-icons": "^0.0.13",
"react": "18.2.0",
"react-native": "^0.72.0",
"react-native-macos": "^0.72.0",
"react-native-svg": "^13.14.0",
"react-native-windows": "^0.72.0",
"react-native": "^0.73.0",
"react-native-macos": "^0.73.0",
"react-native-svg": "^14.0.0",
"react-native-windows": "^0.73.0",
"tslib": "^2.3.1"
},
"devDependencies": {
@ -100,22 +100,23 @@
"@fluentui-react-native/eslint-config-rules": "workspace:*",
"@fluentui-react-native/focus-zone": "workspace:*",
"@fluentui-react-native/scripts": "workspace:*",
"@react-native/metro-config": "^0.72.0",
"@react-native/babel-preset": "^0.73.0",
"@react-native/metro-babel-transformer": "^0.73.0",
"@react-native/metro-config": "^0.73.0",
"@rnx-kit/cli": "^0.16.2",
"@rnx-kit/metro-config": "^1.3.1",
"@types/jasmine": "3.10.3",
"@wdio/cli": "7.30.1",
"@wdio/jasmine-framework": "7.26.0",
"@types/jasmine": "5.1.4",
"@wdio/cli": "8.35.1",
"@wdio/jasmine-framework": "8.35.1",
"flow-bin": "^0.113.0",
"metro-config": "^0.76.5",
"metro-react-native-babel-preset": "^0.76.5",
"metro-config": "^0.80.0",
"react-native-svg-transformer": "^1.0.0",
"react-native-test-app": "^3.4.7",
"react-test-renderer": "18.2.0",
"webdriverio": "7.30.1"
"webdriverio": "8.35.1"
},
"peerDependencies": {
"@office-iss/react-native-win32": "^0.72.0"
"@office-iss/react-native-win32": "^0.73.0"
},
"jest": {
"preset": "react-native"
@ -174,7 +175,7 @@
"@fluentui-react-native/scripts/align-deps-preset.js"
],
"requirements": [
"react-native@0.72"
"react-native@0.73"
],
"capabilities": [
"core-android",

Просмотреть файл

@ -31,7 +31,7 @@ export const E2EButtonTest: React.FunctionComponent = () => {
setKeyDetected('');
}, [buttonPressed]);
const keyPressProps: Omit<IViewWin32Props, 'accessibilityRole' | 'role' | 'onBlur' | 'onFocus'> = {
const keyPressProps: Omit<IViewWin32Props, 'accessibilityRole' | 'role' | 'onBlur' | 'onFocus' | 'onMouseLeave' | 'onMouseEnter'> = {
keyDownEvents: [{ key: 'a' }],
onKeyDown: (args) => {
if (args.nativeEvent.key === 'a') {

Просмотреть файл

@ -8,7 +8,7 @@
"*": ["*", "*.win32", "./*"],
"src/*": ["./src/*", "src"]
},
"types": ["webdriverio/async", "@wdio/jasmine-framework", "node", "@types/jasmine"]
"types": ["../E2E/global", "webdriverio", "@wdio/jasmine-framework", "node", "@types/jasmine"]
},
"include": ["src"]
}

1
apps/fluent-tester/windows/.gitignore поставляемый
Просмотреть файл

@ -6,7 +6,6 @@
*.sln.docstates
# Build results
ARM/
ARM64/
AppPackages/
[Bb]in/

Просмотреть файл

@ -1,3 +1,3 @@
module.exports = {
presets: ['module:metro-react-native-babel-preset']
presets: ['module:@react-native/babel-preset'],
};

Просмотреть файл

@ -32,25 +32,26 @@
"dependencies": {
"@fluentui-react-native/tester": "workspace:*",
"react": "18.2.0",
"react-native": "^0.72.0",
"react-native-svg": "^13.14.0",
"react-native": "^0.73.0",
"react-native-svg": "^14.0.0",
"tslib": "^2.3.1"
},
"devDependencies": {
"@fluentui-react-native/eslint-config-rules": "workspace:*",
"@fluentui-react-native/scripts": "workspace:*",
"@office-iss/react-native-win32": "^0.72.0",
"@office-iss/react-native-win32": "^0.73.0",
"@office-iss/rex-win32": "0.72.25-devmain.16.0.17327.15000",
"@react-native/metro-config": "^0.72.0",
"@react-native/babel-preset": "^0.73.0",
"@react-native/metro-babel-transformer": "^0.73.0",
"@react-native/metro-config": "^0.73.0",
"@rnx-kit/cli": "^0.16.2",
"@rnx-kit/metro-config": "^1.3.1",
"@types/react": "^18.2.0",
"metro-config": "^0.76.5",
"metro-react-native-babel-preset": "^0.76.5",
"metro-config": "^0.80.0",
"react-native-svg-transformer": "^1.0.0",
"react-test-renderer": "18.2.0",
"rimraf": "^5.0.1",
"ts-node": "^8.10.1",
"ts-node": "^10.7.0",
"typescript": "4.9.4"
},
"jest": {
@ -91,7 +92,7 @@
"microsoft/react-native"
],
"requirements": [
"react-native@0.72"
"react-native@0.73"
],
"capabilities": [
"babel-preset-react-native",
@ -104,7 +105,7 @@
}
},
"peerDependencies": {
"@office-iss/react-native-win32": "^0.72.0"
"@office-iss/react-native-win32": "^0.73.0"
},
"peerDependenciesMeta": {
"@office-iss/react-native-win32": {

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui/react-native",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/adapters",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/android-theme",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/apple-theme",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/avatar",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/badge",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/button",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/callout",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/checkbox",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/chip",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/composition",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/contextual-menu",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/default-theme",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/dependency-profiles",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/divider",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/drawer",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/dropdown",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/e2e-testing",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/experimental-activity-indicator",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/experimental-appearance-additions",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/experimental-avatar",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/experimental-checkbox",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/experimental-expander",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/experimental-menu-button",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/experimental-native-date-picker",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/experimental-native-font-metrics",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/experimental-shadow",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/experimental-shimmer",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/focus-trap-zone",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/focus-zone",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/framework",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/icon",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/input",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/interactive-hooks",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/link",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/menu",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/menu-button",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/merge-props",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/notification",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/overflow",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/persona",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/persona-coin",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/popover",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/pressable",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/radio-group",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/separator",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/spinner",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/stack",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/styling-utils",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/switch",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/tablist",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/tester",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/tester-win32",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/text",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/theme",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/theme-tokens",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/theme-types",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/themed-stylesheet",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/theming-utils",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/tokens",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/tooltip",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/use-slot",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/use-slots",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/use-styling",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/use-tokens",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/vibrancy-view",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@fluentui-react-native/win32-theme",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@uifabricshared/foundation-composable",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@uifabricshared/foundation-compose",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@uifabricshared/foundation-settings",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@uifabricshared/foundation-tokens",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@uifabricshared/theme-registry",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Просмотреть файл

@ -0,0 +1,7 @@
{
"type": "minor",
"comment": "Update to RN 0.73",
"packageName": "@uifabricshared/themed-settings",
"email": "30809111+acoates-ms@users.noreply.github.com",
"dependentChangeType": "patch"
}

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше