Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e447e9aea7 | ||
|
|
2dc20c5dc7 | ||
|
|
554dbce652 |
@@ -9,3 +9,12 @@ end_of_line = lf
|
||||
insert_final_newline = true
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
[*.gradle]
|
||||
indent_size = 4
|
||||
|
||||
[*.kts]
|
||||
indent_size = 4
|
||||
|
||||
[BUCK]
|
||||
indent_size = 4
|
||||
|
||||
@@ -13,6 +13,7 @@ packages/*/dist
|
||||
packages/*/types_generated
|
||||
packages/debugger-frontend/dist/**/*
|
||||
packages/react-native-codegen/lib
|
||||
tools/eslint/rules/sort-imports.js
|
||||
**/Pods/*
|
||||
**/*.macos.js
|
||||
**/*.windows.js
|
||||
|
||||
@@ -4,18 +4,21 @@
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @noflow
|
||||
* @format
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
const path = require('node:path');
|
||||
|
||||
require('eslint-plugin-lint').load(path.join(__dirname, 'tools/eslint/rules'));
|
||||
|
||||
module.exports = {
|
||||
root: true,
|
||||
|
||||
extends: ['@react-native'],
|
||||
|
||||
plugins: ['@react-native/monorepo', '@react-native/specs'],
|
||||
plugins: ['@react-native/eslint-plugin-specs', 'lint'],
|
||||
|
||||
overrides: [
|
||||
// overriding the JS config from @react-native/eslint-config to ensure
|
||||
@@ -24,23 +27,19 @@ module.exports = {
|
||||
files: ['*.js', '*.js.flow', '*.jsx'],
|
||||
parser: 'hermes-eslint',
|
||||
rules: {
|
||||
'@react-native/monorepo/sort-imports': 'warn',
|
||||
'eslint-comments/no-unlimited-disable': 'off',
|
||||
'ft-flow/require-valid-file-annotation': ['error', 'always'],
|
||||
'no-extra-boolean-cast': 'off',
|
||||
'no-void': 'off',
|
||||
// These rules are not required with hermes-eslint
|
||||
'ft-flow/define-flow-type': 'off',
|
||||
'ft-flow/use-flow-type': 'off',
|
||||
'ft-flow/define-flow-type': 0,
|
||||
'ft-flow/use-flow-type': 0,
|
||||
'lint/sort-imports': 1,
|
||||
// Flow handles these checks for us, so they aren't required
|
||||
'no-undef': 'off',
|
||||
'no-unreachable': 'off',
|
||||
'no-undef': 0,
|
||||
'no-unreachable': 0,
|
||||
},
|
||||
},
|
||||
{
|
||||
files: ['*.js', '*.jsx', '*.ts', '*.tsx'],
|
||||
rules: {
|
||||
'@react-native/no-deep-imports': 'off',
|
||||
'@react-native/no-deep-imports': 0,
|
||||
},
|
||||
},
|
||||
{
|
||||
@@ -51,7 +50,7 @@ module.exports = {
|
||||
],
|
||||
parser: 'hermes-eslint',
|
||||
rules: {
|
||||
'@react-native/monorepo/no-commonjs-exports': 'warn',
|
||||
'lint/no-commonjs-exports': 1,
|
||||
},
|
||||
},
|
||||
{
|
||||
@@ -61,17 +60,19 @@ module.exports = {
|
||||
{
|
||||
files: ['package.json'],
|
||||
rules: {
|
||||
'@react-native/monorepo/react-native-manifest': 'error',
|
||||
'lint/react-native-manifest': 2,
|
||||
},
|
||||
},
|
||||
{
|
||||
files: ['flow-typed/**/*.js', 'packages/react-native/flow/**/*'],
|
||||
files: [
|
||||
'flow-typed/**/*.js',
|
||||
'packages/react-native/src/types/*.js.flow',
|
||||
],
|
||||
rules: {
|
||||
'@react-native/monorepo/valid-flow-typed-signature': 'error',
|
||||
'ft-flow/require-valid-file-annotation': 'off',
|
||||
'no-shadow': 'off',
|
||||
'no-unused-vars': 'off',
|
||||
quotes: 'off',
|
||||
'lint/valid-flow-typed-signature': 2,
|
||||
'no-shadow': 0,
|
||||
'no-unused-vars': 0,
|
||||
quotes: 0,
|
||||
},
|
||||
},
|
||||
{
|
||||
@@ -80,14 +81,14 @@ module.exports = {
|
||||
'packages/react-native/src/**/*.js',
|
||||
],
|
||||
rules: {
|
||||
'@react-native/monorepo/no-haste-imports': 'error',
|
||||
'@react-native/monorepo/no-react-default-imports': 'error',
|
||||
'@react-native/monorepo/no-react-named-type-imports': 'error',
|
||||
'@react-native/monorepo/no-react-native-imports': 'error',
|
||||
'@react-native/monorepo/no-react-node-imports': 'error',
|
||||
'@react-native/monorepo/require-extends-error': 'error',
|
||||
'@react-native/platform-colors': 'error',
|
||||
'@react-native/specs/react-native-modules': 'error',
|
||||
'@react-native/platform-colors': 2,
|
||||
'@react-native/specs/react-native-modules': 2,
|
||||
'lint/no-haste-imports': 2,
|
||||
'lint/no-react-native-imports': 2,
|
||||
'lint/require-extends-error': 2,
|
||||
'lint/no-react-node-imports': 2,
|
||||
'lint/no-react-default-imports': 2,
|
||||
'lint/no-react-named-type-imports': 2,
|
||||
},
|
||||
},
|
||||
{
|
||||
@@ -141,7 +142,7 @@ module.exports = {
|
||||
{
|
||||
files: ['**/__tests__/**'],
|
||||
rules: {
|
||||
'@react-native/monorepo/no-react-native-imports': 'off',
|
||||
'lint/no-react-native-imports': 'off',
|
||||
},
|
||||
},
|
||||
],
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
<PROJECT_ROOT>/packages/react-native-codegen/e2e/__test_fixtures__/modules/NativeEnumTurboModule.js
|
||||
|
||||
; Ignore the Dangerfile
|
||||
<PROJECT_ROOT>/private/react-native-bots/dangerfile.js
|
||||
<PROJECT_ROOT>/packages/react-native-bots/dangerfile.js
|
||||
|
||||
; Ignore "BUCK" generated dirs
|
||||
<PROJECT_ROOT>/\.buckd/
|
||||
@@ -27,7 +27,7 @@
|
||||
<PROJECT_ROOT>/packages/.*/dist
|
||||
|
||||
; helloworld
|
||||
<PROJECT_ROOT>/private/helloworld/ios/Pods/
|
||||
<PROJECT_ROOT>/packages/helloworld/ios/Pods/
|
||||
|
||||
; Ignore rn-tester Pods
|
||||
<PROJECT_ROOT>/packages/rn-tester/Pods/
|
||||
@@ -44,12 +44,11 @@
|
||||
flow-typed/
|
||||
packages/react-native/interface.js
|
||||
packages/react-native/flow/
|
||||
packages/react-native/src/types/
|
||||
|
||||
[options]
|
||||
enums=true
|
||||
experimental.pattern_matching=true
|
||||
casting_syntax=both
|
||||
component_syntax=true
|
||||
|
||||
emoji=true
|
||||
|
||||
@@ -71,8 +70,6 @@ module.name_mapper='^react-native/\(.*\)$' -> '<PROJECT_ROOT>/packages/react-nat
|
||||
module.name_mapper='^@react-native/dev-middleware$' -> '<PROJECT_ROOT>/packages/dev-middleware'
|
||||
module.name_mapper='^@?[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\|xml\)$' -> '<PROJECT_ROOT>/packages/react-native/Libraries/Image/RelativeImageStub'
|
||||
|
||||
module.system.haste.module_ref_prefix=m#
|
||||
|
||||
react.runtime=automatic
|
||||
|
||||
suppress_type=$FlowIssue
|
||||
@@ -104,4 +101,4 @@ untyped-import
|
||||
untyped-type-import
|
||||
|
||||
[version]
|
||||
^0.275.0
|
||||
^0.271.0
|
||||
|
||||
@@ -83,7 +83,7 @@ body:
|
||||
path: /bin/zsh
|
||||
Binaries:
|
||||
Node: ...
|
||||
version: 22.14.0
|
||||
version: 18.14.0
|
||||
...
|
||||
render: text
|
||||
validations:
|
||||
|
||||
@@ -62,7 +62,7 @@ body:
|
||||
path: /bin/zsh
|
||||
Binaries:
|
||||
Node: ...
|
||||
version: 22.14.0
|
||||
version: 18.14.0
|
||||
...
|
||||
render: text
|
||||
validations:
|
||||
|
||||
@@ -95,7 +95,7 @@ body:
|
||||
path: /bin/zsh
|
||||
Binaries:
|
||||
Node: ...
|
||||
version: 22.14.0
|
||||
version: 18.14.0
|
||||
...
|
||||
render: text
|
||||
validations:
|
||||
|
||||
@@ -87,12 +87,12 @@ runs:
|
||||
uses: actions/upload-artifact@v4.3.4
|
||||
with:
|
||||
name: rntester-debug
|
||||
path: packages/rn-tester/android/app/build/outputs/apk/debug/
|
||||
path: packages/rn-tester/android/app/build/outputs/apk/hermes/debug/
|
||||
compression-level: 0
|
||||
- name: Upload RNTester APK - hermes-release
|
||||
if: ${{ always() }}
|
||||
uses: actions/upload-artifact@v4.3.4
|
||||
with:
|
||||
name: rntester-release
|
||||
path: packages/rn-tester/android/app/build/outputs/apk/release/
|
||||
path: packages/rn-tester/android/app/build/outputs/apk/hermes/release/
|
||||
compression-level: 0
|
||||
|
||||
@@ -14,23 +14,23 @@ runs:
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: hermes-workspace
|
||||
path: 'C:\tmp\hermes'
|
||||
path: 'D:\tmp\hermes'
|
||||
- name: Set up workspace
|
||||
shell: powershell
|
||||
run: |
|
||||
mkdir -p C:\tmp\hermes\osx-bin
|
||||
mkdir -p D:\tmp\hermes\osx-bin
|
||||
mkdir -p .\packages\react-native\sdks\hermes
|
||||
cp -r -Force C:\tmp\hermes\hermes\* .\packages\react-native\sdks\hermes\.
|
||||
cp -r -Force D:\tmp\hermes\hermes\* .\packages\react-native\sdks\hermes\.
|
||||
cp -r -Force .\packages\react-native\sdks\hermes-engine\utils\* .\packages\react-native\sdks\hermes\.
|
||||
- name: Windows cache
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
key: v3-hermes-${{ github.job }}-windows-${{ inputs.hermes-version }}-${{ inputs.react-native-version }}
|
||||
key: v2-hermes-${{ github.job }}-windows-${{ inputs.hermes-version }}-${{ inputs.react-native-version }}
|
||||
path: |
|
||||
C:\tmp\hermes\win64-bin\
|
||||
C:\tmp\hermes\hermes\icu\
|
||||
C:\tmp\hermes\hermes\deps\
|
||||
C:\tmp\hermes\hermes\build_release\
|
||||
D:\tmp\hermes\win64-bin\
|
||||
D:\tmp\hermes\hermes\icu\
|
||||
D:\tmp\hermes\hermes\deps\
|
||||
D:\tmp\hermes\hermes\build_release\
|
||||
- name: setup-msbuild
|
||||
uses: microsoft/setup-msbuild@v1.3.2
|
||||
- name: Set up workspace
|
||||
@@ -63,7 +63,7 @@ runs:
|
||||
$Env:PATH += ";$Env:CMAKE_DIR;$Env:MSBUILD_DIR"
|
||||
$Env:ICU_ROOT = "$Env:HERMES_WS_DIR\icu"
|
||||
|
||||
cmake -S hermes -B build_release -G 'Visual Studio 17 2022' -Ax64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=True -DHERMES_ENABLE_WIN10_ICU_FALLBACK=OFF
|
||||
cmake -S hermes -B build_release -G 'Visual Studio 16 2019' -Ax64 -DCMAKE_BUILD_TYPE=Release -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=True -DHERMES_ENABLE_WIN10_ICU_FALLBACK=OFF
|
||||
if (-not $?) { throw "Failed to configure Hermes" }
|
||||
echo "Running windows build..."
|
||||
cd build_release
|
||||
@@ -83,4 +83,4 @@ runs:
|
||||
uses: actions/upload-artifact@v4.3.4
|
||||
with:
|
||||
name: hermes-win64-bin
|
||||
path: C:\tmp\hermes\win64-bin\
|
||||
path: D:\tmp\hermes\win64-bin\
|
||||
|
||||
@@ -107,12 +107,6 @@ runs:
|
||||
pattern: ReactNativeDependencies*
|
||||
path: ./packages/react-native/ReactAndroid/external-artifacts/artifacts
|
||||
merge-multiple: true
|
||||
- name: Download ReactCore artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
pattern: ReactCore*
|
||||
path: ./packages/react-native/ReactAndroid/external-artifacts/artifacts
|
||||
merge-multiple: true
|
||||
- name: Print Artifacts Directory
|
||||
shell: bash
|
||||
run: ls -lR ./packages/react-native/ReactAndroid/external-artifacts/artifacts/
|
||||
@@ -129,7 +123,7 @@ runs:
|
||||
run: yarn build
|
||||
- name: Build types
|
||||
shell: bash
|
||||
run: yarn build-types --skip-snapshot
|
||||
run: yarn build-types
|
||||
# Continue with publish steps
|
||||
- name: Set npm credentials
|
||||
if: ${{ inputs.release-type == 'release' ||
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
name: diff-js-api-breaking-changes
|
||||
description: Check for breaking changes in the public React Native JS API
|
||||
runs:
|
||||
using: composite
|
||||
steps:
|
||||
- name: Fetch snapshot from PR head
|
||||
shell: bash
|
||||
env:
|
||||
SCRATCH_DIR: ${{ runner.temp }}/diff-js-api-breaking-changes
|
||||
run: |
|
||||
mkdir $SCRATCH_DIR
|
||||
git fetch --depth=1 origin ${{ github.event.pull_request.head.sha }}
|
||||
git show ${{ github.event.pull_request.head.sha }}:packages/react-native/ReactNativeApi.d.ts > $SCRATCH_DIR/ReactNativeApi-after.d.ts \
|
||||
|| echo "" > $SCRATCH_DIR/ReactNativeApi.d.ts
|
||||
- name: Run breaking change detection
|
||||
shell: bash
|
||||
env:
|
||||
SCRATCH_DIR: ${{ runner.temp }}/diff-js-api-breaking-changes
|
||||
run: |
|
||||
node ./scripts/js-api/diff-api-snapshot \
|
||||
${{ github.workspace }}/packages/react-native/ReactNativeApi.d.ts \
|
||||
$SCRATCH_DIR/ReactNativeApi-after.d.ts \
|
||||
> $SCRATCH_DIR/output.json
|
||||
@@ -4,7 +4,7 @@ inputs:
|
||||
node-version:
|
||||
description: "The node.js version to use"
|
||||
required: false
|
||||
default: "22"
|
||||
default: "20"
|
||||
github-token:
|
||||
description: "The GitHub token used by pull-bot"
|
||||
required: true
|
||||
@@ -26,12 +26,15 @@ runs:
|
||||
- name: Lint code
|
||||
shell: bash
|
||||
run: ./.github/workflow-scripts/exec_swallow_error.sh yarn lint --format junit -o ./reports/junit/eslint/results.xml
|
||||
- name: Lint java
|
||||
shell: bash
|
||||
run: ./.github/workflow-scripts/exec_swallow_error.sh yarn lint-java --check
|
||||
- name: Lint file structure
|
||||
shell: bash
|
||||
run: ./.github/workflow-scripts/lint_files.sh
|
||||
- name: Verify not committing repo after running build
|
||||
shell: bash
|
||||
run: yarn run build --validate
|
||||
run: yarn run build --check
|
||||
- name: Run flowcheck
|
||||
shell: bash
|
||||
run: yarn flow-check
|
||||
@@ -47,9 +50,6 @@ runs:
|
||||
- name: Lint markdown
|
||||
shell: bash
|
||||
run: yarn run lint-markdown
|
||||
- name: Build types
|
||||
- name: Validate typegen
|
||||
shell: bash
|
||||
run: yarn build-types --skip-snapshot
|
||||
- name: Run typescript check of generated types
|
||||
shell: bash
|
||||
run: yarn test-generated-typescript
|
||||
run: yarn build-types
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
name: Maestro E2E Android
|
||||
description: Runs E2E Tests on Android using Maestro
|
||||
description: Runs E2E Tests on iOS using Maestro
|
||||
inputs:
|
||||
app-path:
|
||||
required: true
|
||||
@@ -22,6 +22,10 @@ inputs:
|
||||
required: false
|
||||
default: "."
|
||||
description: The directory from which metro should be started
|
||||
architecture:
|
||||
required: false
|
||||
default: "NewArch"
|
||||
description: The react native architecture to test
|
||||
|
||||
runs:
|
||||
using: composite
|
||||
@@ -72,7 +76,7 @@ runs:
|
||||
uses: actions/upload-artifact@v4.3.4
|
||||
if: always()
|
||||
with:
|
||||
name: e2e_android_${{ steps.normalize-app-id.outputs.app-id }}_report_${{ inputs.flavor }}_NewArch
|
||||
name: e2e_android_${{ steps.normalize-app-id.outputs.app-id }}_report_${{ inputs.flavor }}_${{ inputs.architecture }}
|
||||
path: |
|
||||
report.xml
|
||||
screen.mp4
|
||||
@@ -80,5 +84,5 @@ runs:
|
||||
if: steps.run-tests.outcome == 'failure'
|
||||
uses: actions/upload-artifact@v4.3.4
|
||||
with:
|
||||
name: maestro-logs-android-${{ steps.normalize-app-id.outputs.app-id }}-${{ inputs.flavor }}-NewArch
|
||||
name: maestro-logs-android-${{ steps.normalize-app-id.outputs.app-id }}-${{ inputs.flavor }}-${{ inputs.architecture }}
|
||||
path: /tmp/MaestroLogs
|
||||
|
||||
@@ -18,6 +18,10 @@ inputs:
|
||||
required: false
|
||||
default: "."
|
||||
description: The directory from which metro should be started
|
||||
architecture:
|
||||
required: false
|
||||
default: "NewArch"
|
||||
description: The react native architecture to test
|
||||
|
||||
runs:
|
||||
using: composite
|
||||
@@ -66,7 +70,7 @@ runs:
|
||||
if: always()
|
||||
uses: actions/upload-artifact@v4.3.4
|
||||
with:
|
||||
name: e2e_ios_${{ inputs.app-id }}_report_${{ inputs.flavor }}_NewArch
|
||||
name: e2e_ios_${{ inputs.app-id }}_report_${{ inputs.flavor }}_${{ inputs.architecture }}
|
||||
path: |
|
||||
video_record_1.mov
|
||||
video_record_2.mov
|
||||
@@ -78,5 +82,5 @@ runs:
|
||||
if: failure() && steps.run-tests.outcome == 'failure'
|
||||
uses: actions/upload-artifact@v4.3.4
|
||||
with:
|
||||
name: maestro-logs-${{ inputs.app-id }}-${{ inputs.flavor }}-NewArch
|
||||
name: maestro-logs-${{ inputs.app-id }}-${{ inputs.flavor }}-${{ inputs.architecture }}
|
||||
path: /tmp/MaestroLogs
|
||||
|
||||
@@ -4,7 +4,7 @@ inputs:
|
||||
node-version:
|
||||
description: 'The node.js version to use'
|
||||
required: false
|
||||
default: '22.14.0'
|
||||
default: '20'
|
||||
runs:
|
||||
using: "composite"
|
||||
steps:
|
||||
|
||||
@@ -7,6 +7,9 @@ inputs:
|
||||
flavor:
|
||||
description: The flavor that is going to be built
|
||||
default: Debug
|
||||
architecture:
|
||||
description: The architecture that is going to be built
|
||||
default: NewArch
|
||||
use-frameworks:
|
||||
description: Whether we are bulding with DynamicFrameworks or StaticLibraries
|
||||
default: StaticLibraries
|
||||
@@ -24,9 +27,9 @@ runs:
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: packages/rn-tester/Podfile.lock
|
||||
key: v13-podfilelock-${{ github.job }}-NewArch-${{ inputs.flavor }}-${{ inputs.use-frameworks }}-${{ inputs.ruby-version }}-${{ hashfiles('packages/rn-tester/Podfile') }}-${{ inputs.hermes-version }}
|
||||
key: v13-podfilelock-${{ github.job }}-${{ inputs.architecture }}-${{ inputs.flavor }}-${{ inputs.use-frameworks }}-${{ inputs.ruby-version }}-${{ hashfiles('packages/rn-tester/Podfile') }}-${{ inputs.hermes-version }}
|
||||
- name: Cache cocoapods
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: packages/rn-tester/Pods
|
||||
key: v15-cocoapods-${{ github.job }}-NewArch-${{ inputs.flavor }}-${{ inputs.use-frameworks }}-${{ inputs.ruby-version }}-${{ hashfiles('packages/rn-tester/Podfile.lock') }}-${{ hashfiles('packages/rn-tester/Podfile') }}-${{ inputs.hermes-version}}
|
||||
key: v15-cocoapods-${{ github.job }}-${{ inputs.architecture }}-${{ inputs.flavor }}-${{ inputs.use-frameworks }}-${{ inputs.ruby-version }}-${{ hashfiles('packages/rn-tester/Podfile.lock') }}-${{ hashfiles('packages/rn-tester/Podfile') }}-${{ inputs.hermes-version}}
|
||||
|
||||
@@ -4,6 +4,9 @@ inputs:
|
||||
use-frameworks:
|
||||
description: The dependency building and linking strategy to use. Must be one of "StaticLibraries", "DynamicFrameworks"
|
||||
default: StaticLibraries
|
||||
architecture:
|
||||
description: The React Native architecture to Test. RNTester has always Fabric enabled, but we want to run integration test with the old arch setup. Must be one of "OldArch" or "NewArch"
|
||||
default: OldArch
|
||||
ruby-version:
|
||||
description: The version of ruby that must be used
|
||||
default: 2.6.10
|
||||
@@ -48,20 +51,16 @@ runs:
|
||||
- name: Print third-party folder
|
||||
shell: bash
|
||||
run: ls -lR /tmp/third-party
|
||||
- name: Download React Native Prebuilds
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: ReactCore${{ inputs.flavor }}.xcframework.tar.gz
|
||||
path: /tmp/ReactCore
|
||||
- name: Print ReactCore folder
|
||||
shell: bash
|
||||
run: ls -lR /tmp/ReactCore
|
||||
- name: Install iOS dependencies - Configuration ${{ inputs.flavor }};
|
||||
- name: Install iOS dependencies - Configuration ${{ inputs.flavor }}; New Architecture ${{ inputs.architecture }}
|
||||
shell: bash
|
||||
run: |
|
||||
cd private/helloworld
|
||||
cd packages/helloworld
|
||||
args=()
|
||||
|
||||
if [[ ${{ inputs.architecture }} == "OldArch" ]]; then
|
||||
args+=(--arch old)
|
||||
fi
|
||||
|
||||
if [[ ${{ inputs.use-frameworks }} == "DynamicFrameworks" ]]; then
|
||||
args+=(--frameworks dynamic)
|
||||
fi
|
||||
@@ -78,23 +77,16 @@ runs:
|
||||
fi
|
||||
|
||||
BUILD_TYPE="${{ inputs.flavor }}"
|
||||
TARBALL_FILENAME=$(node ../../packages/react-native/scripts/hermes/get-tarball-name.js --buildType "$BUILD_TYPE")
|
||||
TARBALL_FILENAME=$(node ../react-native/scripts/hermes/get-tarball-name.js --buildType "$BUILD_TYPE")
|
||||
export HERMES_ENGINE_TARBALL_PATH="$HERMES_WS_DIR/hermes-runtime-darwin/$TARBALL_FILENAME"
|
||||
export RCT_USE_LOCAL_RN_DEP="/tmp/third-party/ReactNativeDependencies${{ inputs.flavor }}.xcframework.tar.gz"
|
||||
export RCT_TESTONLY_RNCORE_TARBALL_PATH="/tmp/ReactCore/ReactCore${{ inputs.flavor }}.xcframework.tar.gz"
|
||||
|
||||
yarn bootstrap ios "${args[@]}" | cat
|
||||
|
||||
- name: Run Helloworld tests
|
||||
- name: Build HelloWorld project
|
||||
shell: bash
|
||||
run: |
|
||||
cd private/helloworld
|
||||
yarn test
|
||||
|
||||
- name: Build HelloWorld project
|
||||
shell: bash
|
||||
run: |
|
||||
cd private/helloworld
|
||||
cd packages/helloworld
|
||||
|
||||
args=()
|
||||
if [[ ${{ inputs.flavor }} == "Release" ]]; then
|
||||
|
||||
@@ -4,6 +4,9 @@ inputs:
|
||||
use-frameworks:
|
||||
description: The dependency building and linking strategy to use. Must be one of "StaticLibraries", "DynamicFrameworks"
|
||||
default: StaticLibraries
|
||||
architecture:
|
||||
description: The React Native architecture to Test. RNTester has always Fabric enabled, but we want to run integration test with the old arch setup
|
||||
default: NewArch
|
||||
ruby-version:
|
||||
description: The version of ruby that must be used
|
||||
default: 2.6.10
|
||||
@@ -94,18 +97,11 @@ runs:
|
||||
- name: Print third-party folder
|
||||
shell: bash
|
||||
run: ls -lR /tmp/third-party
|
||||
- name: Download React Native Prebuilds
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: ReactCore${{ inputs.flavor }}.xcframework.tar.gz
|
||||
path: /tmp/ReactCore
|
||||
- name: Print ReactCore folder
|
||||
shell: bash
|
||||
run: ls -lR /tmp/ReactCore
|
||||
- name: Setup xcode build cache
|
||||
uses: ./.github/actions/setup-xcode-build-cache
|
||||
with:
|
||||
hermes-version: ${{ inputs.hermes-version }}
|
||||
architecture: ${{ inputs.architecture }}
|
||||
use-frameworks: ${{ inputs.use-frameworks }}
|
||||
flavor: ${{ inputs.flavor }}
|
||||
ruby-version: ${{ inputs.ruby-version }}
|
||||
@@ -113,13 +109,16 @@ runs:
|
||||
shell: bash
|
||||
run: |
|
||||
export HERMES_ENGINE_TARBALL_PATH=$HERMES_ENGINE_TARBALL_PATH
|
||||
export RCT_USE_LOCAL_RN_DEP="/tmp/third-party/ReactNativeDependencies${{ inputs.flavor }}.xcframework.tar.gz"
|
||||
export RCT_TESTONLY_RNCORE_TARBALL_PATH="/tmp/ReactCore/ReactCore${{ inputs.flavor }}.xcframework.tar.gz"
|
||||
|
||||
if [[ ${{ inputs.use-frameworks }} == "DynamicFrameworks" ]]; then
|
||||
export USE_FRAMEWORKS=dynamic
|
||||
fi
|
||||
|
||||
if [[ ${{ inputs.architecture }} == "OldArch" ]]; then
|
||||
export RCT_NEW_ARCH_ENABLED=0
|
||||
fi
|
||||
|
||||
export RCT_USE_LOCAL_RN_DEP="/tmp/third-party/ReactNativeDependencies${{ inputs.flavor }}.xcframework.tar.gz"
|
||||
cd packages/rn-tester
|
||||
|
||||
bundle install
|
||||
@@ -163,7 +162,7 @@ runs:
|
||||
if: ${{ inputs.use-frameworks == 'StaticLibraries' && inputs.ruby-version == '2.6.10' }} # This is needed to avoid conflicts with the artifacts
|
||||
uses: actions/upload-artifact@v4.3.4
|
||||
with:
|
||||
name: RNTesterApp-NewArch-${{ inputs.flavor }}
|
||||
name: RNTesterApp-${{ inputs.architecture }}-${{ inputs.flavor }}
|
||||
path: ${{ env.app-path }}
|
||||
- name: Store test results
|
||||
if: ${{ inputs.run-unit-tests == 'true' }}
|
||||
|
||||
@@ -4,7 +4,7 @@ inputs:
|
||||
node-version:
|
||||
description: "The node.js version to use"
|
||||
required: false
|
||||
default: "22"
|
||||
default: "20"
|
||||
runs:
|
||||
using: composite
|
||||
steps:
|
||||
|
||||
@@ -2,8 +2,6 @@ name: yarn-install
|
||||
runs:
|
||||
using: composite
|
||||
steps:
|
||||
- name: Setup node.js
|
||||
uses: ./.github/actions/setup-node
|
||||
- name: Install dependencies
|
||||
shell: bash
|
||||
run: |
|
||||
|
||||
@@ -38,7 +38,7 @@ describe('#verifyArtifactsAreOnMaven', () => {
|
||||
|
||||
expect(mockSleep).toHaveBeenCalledTimes(1);
|
||||
expect(mockFetch).toHaveBeenCalledWith(
|
||||
'https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/0.78.1/react-native-artifacts-0.78.1.pom',
|
||||
'https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/0.78.1',
|
||||
);
|
||||
});
|
||||
|
||||
@@ -55,7 +55,7 @@ describe('#verifyArtifactsAreOnMaven', () => {
|
||||
|
||||
expect(mockSleep).toHaveBeenCalledTimes(1);
|
||||
expect(mockFetch).toHaveBeenCalledWith(
|
||||
'https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/0.78.1/react-native-artifacts-0.78.1.pom',
|
||||
'https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/0.78.1',
|
||||
);
|
||||
});
|
||||
|
||||
@@ -67,7 +67,7 @@ describe('#verifyArtifactsAreOnMaven', () => {
|
||||
|
||||
expect(mockSleep).toHaveBeenCalledTimes(0);
|
||||
expect(mockFetch).toHaveBeenCalledWith(
|
||||
'https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/0.78.1/react-native-artifacts-0.78.1.pom',
|
||||
'https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/0.78.1',
|
||||
);
|
||||
});
|
||||
|
||||
@@ -81,7 +81,7 @@ describe('#verifyArtifactsAreOnMaven', () => {
|
||||
expect(mockSleep).toHaveBeenCalledTimes(90);
|
||||
expect(mockExit).toHaveBeenCalledWith(1);
|
||||
expect(mockFetch).toHaveBeenCalledWith(
|
||||
'https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/0.78.1/react-native-artifacts-0.78.1.pom',
|
||||
'https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/0.78.1',
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -4,16 +4,12 @@
|
||||
# This source code is licensed under the MIT license found in the
|
||||
# LICENSE file in the root directory of this source tree.
|
||||
|
||||
export GITHUB_OWNER=-facebook
|
||||
export GITHUB_REPO=-react-native
|
||||
GITHUB_OWNER=-facebook
|
||||
GITHUB_REPO=-react-native
|
||||
export GITHUB_OWNER
|
||||
export GITHUB_REPO
|
||||
|
||||
{
|
||||
echo eslint
|
||||
npm run lint --silent -- --format=json
|
||||
|
||||
echo flow
|
||||
npm run flow-check --silent --json
|
||||
} | node private/react-native-bots/code-analysis-bot.js
|
||||
cat <(echo eslint; npm run lint --silent -- --format=json; echo flow; npm run flow-check --silent --json; echo google-java-format; node scripts/lint-java.js --diff) | node packages/react-native-bots/code-analysis-bot.js
|
||||
|
||||
STATUS=$?
|
||||
if [ $STATUS == 0 ]; then
|
||||
@@ -21,4 +17,3 @@ if [ $STATUS == 0 ]; then
|
||||
else
|
||||
echo "Code analysis failed, error status $STATUS."
|
||||
fi
|
||||
exit $STATUS
|
||||
|
||||
@@ -13,14 +13,13 @@ const SLEEP_S = 60; // 1 minute
|
||||
const MAX_RETRIES = 90; // 90 attempts. Waiting between attempt: 1 min. Total time: 90 min.
|
||||
const ARTIFACT_URL =
|
||||
'https://repo1.maven.org/maven2/com/facebook/react/react-native-artifacts/';
|
||||
const ARTIFACT_NAME = 'react-native-artifacts-';
|
||||
|
||||
async function verifyArtifactsAreOnMaven(version, retries = MAX_RETRIES) {
|
||||
if (version.startsWith('v')) {
|
||||
version = version.substring(1);
|
||||
}
|
||||
|
||||
const artifactUrl = `${ARTIFACT_URL}${version}/${ARTIFACT_NAME}${version}.pom`;
|
||||
const artifactUrl = `${ARTIFACT_URL}${version}`;
|
||||
for (let currentAttempt = 1; currentAttempt <= retries; currentAttempt++) {
|
||||
const response = await fetch(artifactUrl);
|
||||
|
||||
|
||||
@@ -18,10 +18,6 @@ jobs:
|
||||
run: |
|
||||
git config --local user.email "bot@reactnative.dev"
|
||||
git config --local user.name "React Native Bot"
|
||||
- name: Setup xcode
|
||||
uses: ./.github/actions/setup-xcode
|
||||
with:
|
||||
xcode-version: '16.2.0'
|
||||
- name: Extract branch name
|
||||
run: |
|
||||
TAG="${{ github.ref_name }}";
|
||||
|
||||
@@ -14,7 +14,7 @@ jobs:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Setup Node.js
|
||||
uses: ./.github/actions/setup-node
|
||||
- name: Use Node.js 18
|
||||
uses: actions/setup-node@v4
|
||||
- name: Trim the cache
|
||||
run: node scripts/clean-gha-cache.js
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# This jobs runs every day 2 hours after the nightly job and its purpose is to report
|
||||
# a failure in case the nightly failed to be published. We are going to hook this to an internal automation.
|
||||
name: Check Nightlies
|
||||
name: Check Nigthlies
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
|
||||
@@ -18,14 +18,10 @@ jobs:
|
||||
if: github.repository == 'facebook/react-native'
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Setup Node.js
|
||||
uses: ./.github/actions/setup-node
|
||||
- name: Run yarn install
|
||||
uses: ./.github/actions/yarn-install
|
||||
- name: Run diff-js-api-breaking-changes
|
||||
uses: ./.github/actions/diff-js-api-breaking-changes
|
||||
- name: Danger
|
||||
run: yarn danger ci --use-github-checks --failOnErrors
|
||||
working-directory: private/react-native-bots
|
||||
working-directory: packages/react-native-bots
|
||||
env:
|
||||
DANGER_GITHUB_API_TOKEN: ${{ secrets.REACT_NATIVE_BOT_GITHUB_TOKEN }}
|
||||
|
||||
@@ -17,7 +17,9 @@ jobs:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Set up Node.js
|
||||
uses: ./.github/actions/setup-node
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '20'
|
||||
- name: Install dependencies
|
||||
uses: ./.github/actions/yarn-install
|
||||
- name: Extract next oncall
|
||||
|
||||
@@ -101,14 +101,9 @@ jobs:
|
||||
flavor: ${{ matrix.flavor }}
|
||||
|
||||
prebuild_apple_dependencies:
|
||||
uses: ./.github/workflows/prebuild-ios-dependencies.yml
|
||||
uses: ./.github/workflows/prebuild-ios.yml
|
||||
secrets: inherit
|
||||
|
||||
prebuild_react_native_core:
|
||||
uses: ./.github/workflows/prebuild-ios-core.yml
|
||||
secrets: inherit
|
||||
needs: [prebuild_apple_dependencies, build_hermes_macos]
|
||||
|
||||
build_hermesc_linux:
|
||||
runs-on: ubuntu-latest
|
||||
needs: prepare_hermes_workspace
|
||||
@@ -125,12 +120,12 @@ jobs:
|
||||
react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
||||
|
||||
build_hermesc_windows:
|
||||
runs-on: windows-2025
|
||||
runs-on: windows-2019
|
||||
needs: prepare_hermes_workspace
|
||||
env:
|
||||
HERMES_WS_DIR: 'C:\tmp\hermes'
|
||||
HERMES_TARBALL_ARTIFACTS_DIR: 'C:\tmp\hermes\hermes-runtime-darwin'
|
||||
HERMES_OSXBIN_ARTIFACTS_DIR: 'C:\tmp\hermes\osx-bin'
|
||||
HERMES_WS_DIR: 'D:\tmp\hermes'
|
||||
HERMES_TARBALL_ARTIFACTS_DIR: 'D:\tmp\hermes\hermes-runtime-darwin'
|
||||
HERMES_OSXBIN_ARTIFACTS_DIR: 'D:\tmp\hermes\osx-bin'
|
||||
ICU_URL: "https://github.com/unicode-org/icu/releases/download/release-64-2/icu4c-64_2-Win64-MSVC2017.zip"
|
||||
MSBUILD_DIR: 'C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin'
|
||||
CMAKE_DIR: 'C:\Program Files\CMake\bin'
|
||||
@@ -175,7 +170,6 @@ jobs:
|
||||
build_hermesc_windows,
|
||||
build_android,
|
||||
prebuild_apple_dependencies,
|
||||
prebuild_react_native_core,
|
||||
]
|
||||
container:
|
||||
image: reactnativecommunity/react-native-android:latest
|
||||
|
||||
@@ -1,212 +0,0 @@
|
||||
name: Prebuild iOS Dependencies
|
||||
|
||||
on:
|
||||
workflow_call: # this directive allow us to call this workflow from other workflows
|
||||
|
||||
|
||||
jobs:
|
||||
build-rn-slice:
|
||||
runs-on: macos-14
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
flavor: ['Debug', 'Release']
|
||||
slice: [
|
||||
'ios',
|
||||
'ios-simulator',
|
||||
'mac-catalyst',
|
||||
]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Restore cache if present
|
||||
id: restore-ios-slice
|
||||
uses: actions/cache/restore@v4
|
||||
with:
|
||||
key: v3-ios-core-${{ matrix.slice }}-${{ matrix.flavor }}-${{ hashFiles('packages/react-native/Package.swift', 'packages/react-native/scripts/ios-prebuild/setup.js', 'packages/react-native/React/**/*', 'packages/react-native/ReactCommon/**/*', 'packages/react-native/Libraries/**/*') }}
|
||||
path: packages/react-native/
|
||||
- name: Setup node.js
|
||||
if: steps.restore-ios-slice.outputs.cache-hit != 'true'
|
||||
uses: ./.github/actions/setup-node
|
||||
- name: Setup xcode
|
||||
if: steps.restore-ios-slice.outputs.cache-hit != 'true'
|
||||
uses: ./.github/actions/setup-xcode
|
||||
with:
|
||||
xcode-version: '16.2.0'
|
||||
- name: Yarn Install
|
||||
if: steps.restore-ios-slice.outputs.cache-hit != 'true'
|
||||
uses: ./.github/actions/yarn-install
|
||||
- name: Download Hermes
|
||||
if: steps.restore-ios-slice.outputs.cache-hit != 'true'
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: hermes-darwin-bin-${{ matrix.flavor }}
|
||||
path: /tmp/hermes/hermes-runtime-darwin
|
||||
- name: Extract Hermes
|
||||
if: steps.restore-ios-slice.outputs.cache-hit != 'true'
|
||||
shell: bash
|
||||
run: |
|
||||
HERMES_TARBALL_ARTIFACTS_DIR=/tmp/hermes/hermes-runtime-darwin
|
||||
if [ ! -d $HERMES_TARBALL_ARTIFACTS_DIR ]; then
|
||||
echo "Hermes tarball artifacts dir not present ($HERMES_TARBALL_ARTIFACTS_DIR)."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
TARBALL_FILENAME=$(node ./packages/react-native/scripts/hermes/get-tarball-name.js --buildType "${{ matrix.flavor }}")
|
||||
TARBALL_PATH=$HERMES_TARBALL_ARTIFACTS_DIR/$TARBALL_FILENAME
|
||||
|
||||
echo "Looking for $TARBALL_FILENAME in $HERMES_TARBALL_ARTIFACTS_DIR"
|
||||
echo "$TARBALL_PATH"
|
||||
|
||||
if [ ! -f $TARBALL_PATH ]; then
|
||||
echo "Hermes tarball not present ($TARBALL_PATH). Build Hermes from source."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "Found Hermes tarball at $TARBALL_PATH"
|
||||
echo "HERMES_ENGINE_TARBALL_PATH=$TARBALL_PATH" >> $GITHUB_ENV
|
||||
- name: Download ReactNativeDependencies
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: ReactNativeDependencies${{ matrix.flavor }}.xcframework.tar.gz
|
||||
path: /tmp/third-party/
|
||||
- name: Extract ReactNativeDependencies
|
||||
if: steps.restore-ios-slice.outputs.cache-hit != 'true'
|
||||
shell: bash
|
||||
run: |
|
||||
# Extract ReactNativeDependencies
|
||||
tar -xzf /tmp/third-party/ReactNativeDependencies${{ matrix.flavor }}.xcframework.tar.gz -C /tmp/third-party/
|
||||
|
||||
# Create destination folder
|
||||
mkdir -p packages/react-native/third-party/
|
||||
|
||||
# Move the XCFramework in the destination directory
|
||||
mv /tmp/third-party/packages/react-native/third-party/ReactNativeDependencies.xcframework packages/react-native/third-party/ReactNativeDependencies.xcframework
|
||||
|
||||
VERSION=$(jq -r '.version' packages/react-native/package.json)
|
||||
echo "$VERSION-${{matrix.flavor}}" > "packages/react-native/third-party/version.txt"
|
||||
cat "packages/react-native/third-party/version.txt"
|
||||
# Check destination directory
|
||||
ls -lR packages/react-native/third-party/
|
||||
- name: Setup the workspace
|
||||
if: steps.restore-ios-slice.outputs.cache-hit != 'true'
|
||||
shell: bash
|
||||
run: |
|
||||
cd packages/react-native
|
||||
node scripts/ios-prebuild.js -s -f "${{ matrix.flavor }}"
|
||||
- name: Build React Native
|
||||
if: steps.restore-ios-slice.outputs.cache-hit != 'true'
|
||||
shell: bash
|
||||
run: |
|
||||
# This is going to be replaced by a CLI script
|
||||
cd packages/react-native
|
||||
node scripts/ios-prebuild -b -f "${{ matrix.flavor }}" -p "${{ matrix.slice }}"
|
||||
- name: Upload headers
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: prebuild-ios-core-headers-${{ matrix.flavor }}-${{ matrix.slice }}
|
||||
path:
|
||||
packages/react-native/.build/headers
|
||||
- name: Upload artifacts
|
||||
uses: actions/upload-artifact@v4.3.4
|
||||
with:
|
||||
name: prebuild-ios-core-slice-${{ matrix.flavor }}-${{ matrix.slice }}
|
||||
path: |
|
||||
packages/react-native/.build/output/spm/${{ matrix.flavor }}/Build/Products
|
||||
- name: Save Cache
|
||||
uses: actions/cache/save@v4
|
||||
if: ${{ github.ref == 'refs/heads/main' }} # To avoid that the cache explode
|
||||
with:
|
||||
key: v3-ios-core-${{ matrix.slice }}-${{ matrix.flavor }}-${{ hashFiles('packages/react-native/Package.swift', 'packages/react-native/scripts/ios-prebuild/setup.js', 'packages/react-native/React/**/*', 'packages/react-native/ReactCommon/**/*', 'packages/react-native/Libraries/**/*') }}
|
||||
path: |
|
||||
packages/react-native/.build/output/spm/${{ matrix.flavor }}/Build/Products
|
||||
packages/react-native/.build/headers
|
||||
|
||||
compose-xcframework:
|
||||
runs-on: macos-14
|
||||
needs: [build-rn-slice]
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
flavor: ['Debug', 'Release']
|
||||
env:
|
||||
REACT_ORG_CODE_SIGNING_P12_CERT: ${{ secrets.REACT_ORG_CODE_SIGNING_P12_CERT }}
|
||||
REACT_ORG_CODE_SIGNING_P12_CERT_PWD: ${{ secrets.REACT_ORG_CODE_SIGNING_P12_CERT_PWD }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Restore cache if present
|
||||
id: restore-ios-xcframework
|
||||
uses: actions/cache/restore@v4
|
||||
with:
|
||||
path: packages/react-native/.build/output/xcframeworks
|
||||
key: v2-ios-core-xcframework-${{ matrix.flavor }}-${{ hashFiles('packages/react-native/Package.swift', 'packages/react-native/scripts/ios-prebuild/setup.js', 'packages/react-native/React/**/*', 'packages/react-native/ReactCommon/**/*', 'packages/react-native/Libraries/**/*') }}
|
||||
- name: Setup node.js
|
||||
if: steps.restore-ios-xcframework.outputs.cache-hit != 'true'
|
||||
uses: ./.github/actions/setup-node
|
||||
- name: Setup xcode
|
||||
if: steps.restore-ios-xcframework.outputs.cache-hit != 'true'
|
||||
uses: ./.github/actions/setup-xcode
|
||||
with:
|
||||
xcode-version: '16.2.0'
|
||||
- name: Yarn Install
|
||||
if: steps.restore-ios-xcframework.outputs.cache-hit != 'true'
|
||||
uses: ./.github/actions/yarn-install
|
||||
- name: Download slice artifacts
|
||||
if: steps.restore-ios-xcframework.outputs.cache-hit != 'true'
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
pattern: prebuild-ios-core-slice-${{ matrix.flavor }}-*
|
||||
path: packages/react-native/.build/output/spm/${{ matrix.flavor }}/Build/Products
|
||||
merge-multiple: true
|
||||
- name: Download headers
|
||||
if: steps.restore-ios-xcframework.outputs.cache-hit != 'true'
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
pattern: prebuild-ios-core-headers-${{ matrix.flavor }}-*
|
||||
path: packages/react-native/.build/headers
|
||||
merge-multiple: true
|
||||
- name: Setup Keychain
|
||||
if: ${{ steps.restore-ios-xcframework.outputs.cache-hit != 'true' && env.REACT_ORG_CODE_SIGNING_P12_CERT != '' }}
|
||||
uses: apple-actions/import-codesign-certs@v3 # https://github.com/marketplace/actions/import-code-signing-certificates
|
||||
with:
|
||||
p12-file-base64: ${{ secrets.REACT_ORG_CODE_SIGNING_P12_CERT }}
|
||||
p12-password: ${{ secrets.REACT_ORG_CODE_SIGNING_P12_CERT_PWD }}
|
||||
- name: Create XCFramework
|
||||
if: ${{ steps.restore-ios-xcframework.outputs.cache-hit != 'true' && env.REACT_ORG_CODE_SIGNING_P12_CERT == '' }}
|
||||
run: |
|
||||
cd packages/react-native
|
||||
node scripts/ios-prebuild -c -f "${{ matrix.flavor }}"
|
||||
- name: Create and Sign XCFramework
|
||||
if: ${{ steps.restore-ios-xcframework.outputs.cache-hit != 'true' && env.REACT_ORG_CODE_SIGNING_P12_CERT != '' }}
|
||||
run: |
|
||||
cd packages/react-native
|
||||
node scripts/ios-prebuild -c -f "${{ matrix.flavor }}" -i "React Org"
|
||||
- name: Compress and Rename XCFramework
|
||||
if: steps.restore-ios-xcframework.outputs.cache-hit != 'true'
|
||||
run: |
|
||||
cd packages/react-native/.build/output/xcframeworks/${{matrix.flavor}}
|
||||
tar -cz -f ../ReactCore${{matrix.flavor}}.xcframework.tar.gz React.xcframework
|
||||
- name: Compress and Rename dSYM
|
||||
if: steps.restore-ios-xcframework.outputs.cache-hit != 'true'
|
||||
run: |
|
||||
cd packages/react-native/.build/output/xcframeworks/${{matrix.flavor}}/Symbols
|
||||
tar -cz -f ../../ReactCore${{ matrix.flavor }}.framework.dSYM.tar.gz .
|
||||
- name: Upload XCFramework Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ReactCore${{ matrix.flavor }}.xcframework.tar.gz
|
||||
path: packages/react-native/.build/output/xcframeworks/ReactCore${{matrix.flavor}}.xcframework.tar.gz
|
||||
- name: Upload dSYM Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ReactCore${{ matrix.flavor }}.framework.dSYM.tar.gz
|
||||
path: packages/react-native/.build/output/xcframeworks/ReactCore${{matrix.flavor}}.framework.dSYM.tar.gz
|
||||
- name: Save cache if present
|
||||
if: ${{ github.ref == 'refs/heads/main' }} # To avoid that the cache explode
|
||||
uses: actions/cache/save@v4
|
||||
with:
|
||||
path: |
|
||||
packages/react-native/.build/output/xcframeworks/ReactCore${{matrix.flavor}}.xcframework.tar.gz
|
||||
packages/react-native/.build/output/xcframeworks/ReactCore${{matrix.flavor}}.framework.dSYM.tar.gz
|
||||
key: v2-ios-core-xcframework-${{ matrix.flavor }}-${{ hashFiles('packages/react-native/Package.swift', 'packages/react-native/scripts/ios-prebuild/setup.js', 'packages/react-native/React/**/*', 'packages/react-native/ReactCommon/**/*', 'packages/react-native/Libraries/**/*') }}
|
||||
@@ -1,4 +1,4 @@
|
||||
name: Prebuild iOS Dependencies
|
||||
name: Prebuild iOS
|
||||
|
||||
on:
|
||||
workflow_call: # this directive allow us to call this workflow from other workflows
|
||||
@@ -21,7 +21,7 @@ jobs:
|
||||
- name: Build packages
|
||||
run: yarn build
|
||||
- name: Build types
|
||||
run: yarn build-types --skip-snapshot
|
||||
run: yarn build-types
|
||||
- name: Set NPM auth token
|
||||
run: echo "//registry.npmjs.org/:_authToken=$GHA_NPM_TOKEN" > ~/.npmrc
|
||||
- name: Find and publish all bumped packages
|
||||
|
||||
@@ -96,16 +96,10 @@ jobs:
|
||||
hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }}
|
||||
react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
||||
flavor: ${{ matrix.flavor }}
|
||||
|
||||
prebuild_apple_dependencies:
|
||||
uses: ./.github/workflows/prebuild-ios-dependencies.yml
|
||||
uses: ./.github/workflows/prebuild-ios.yml
|
||||
secrets: inherit
|
||||
|
||||
prebuild_react_native_core:
|
||||
uses: ./.github/workflows/prebuild-ios-core.yml
|
||||
secrets: inherit
|
||||
needs: [prebuild_apple_dependencies, build_hermes_macos]
|
||||
|
||||
build_hermesc_linux:
|
||||
runs-on: ubuntu-latest
|
||||
needs: prepare_hermes_workspace
|
||||
@@ -122,12 +116,12 @@ jobs:
|
||||
react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
||||
|
||||
build_hermesc_windows:
|
||||
runs-on: windows-2025
|
||||
runs-on: windows-2019
|
||||
needs: prepare_hermes_workspace
|
||||
env:
|
||||
HERMES_WS_DIR: 'C:\tmp\hermes'
|
||||
HERMES_TARBALL_ARTIFACTS_DIR: 'C:\tmp\hermes\hermes-runtime-darwin'
|
||||
HERMES_OSXBIN_ARTIFACTS_DIR: 'C:\tmp\hermes\osx-bin'
|
||||
HERMES_WS_DIR: 'D:\tmp\hermes'
|
||||
HERMES_TARBALL_ARTIFACTS_DIR: 'D:\tmp\hermes\hermes-runtime-darwin'
|
||||
HERMES_OSXBIN_ARTIFACTS_DIR: 'D:\tmp\hermes\osx-bin'
|
||||
ICU_URL: "https://github.com/unicode-org/icu/releases/download/release-64-2/icu4c-64_2-Win64-MSVC2017.zip"
|
||||
MSBUILD_DIR: 'C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin'
|
||||
CMAKE_DIR: 'C:\Program Files\CMake\bin'
|
||||
@@ -140,6 +134,27 @@ jobs:
|
||||
hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }}
|
||||
react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
||||
|
||||
build_android:
|
||||
runs-on: 8-core-ubuntu
|
||||
needs: [set_release_type]
|
||||
container:
|
||||
image: reactnativecommunity/react-native-android:latest
|
||||
env:
|
||||
TERM: "dumb"
|
||||
GRADLE_OPTS: "-Dorg.gradle.daemon=false"
|
||||
ORG_GRADLE_PROJECT_SIGNING_PWD: ${{ secrets.ORG_GRADLE_PROJECT_SIGNING_PWD }}
|
||||
ORG_GRADLE_PROJECT_SIGNING_KEY: ${{ secrets.ORG_GRADLE_PROJECT_SIGNING_KEY }}
|
||||
ORG_GRADLE_PROJECT_SONATYPE_USERNAME: ${{ secrets.ORG_GRADLE_PROJECT_SONATYPE_USERNAME }}
|
||||
ORG_GRADLE_PROJECT_SONATYPE_PASSWORD: ${{ secrets.ORG_GRADLE_PROJECT_SONATYPE_PASSWORD }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Build Android
|
||||
uses: ./.github/actions/build-android
|
||||
with:
|
||||
release-type: ${{ needs.set_release_type.outputs.RELEASE_TYPE }}
|
||||
gradle-cache-encryption-key: ${{ secrets.GRADLE_CACHE_ENCRYPTION_KEY }}
|
||||
|
||||
build_npm_package:
|
||||
runs-on: 8-core-ubuntu
|
||||
needs:
|
||||
@@ -149,8 +164,8 @@ jobs:
|
||||
build_hermes_macos,
|
||||
build_hermesc_linux,
|
||||
build_hermesc_windows,
|
||||
build_android,
|
||||
prebuild_apple_dependencies,
|
||||
prebuild_react_native_core,
|
||||
]
|
||||
container:
|
||||
image: reactnativecommunity/react-native-android:latest
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
name: Retry workflow
|
||||
# Based on https://stackoverflow.com/a/78314483
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
run_id:
|
||||
required: true
|
||||
jobs:
|
||||
rerun:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: rerun ${{ inputs.run_id }}
|
||||
env:
|
||||
GH_REPO: ${{ github.repository }}
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
gh run watch ${{ inputs.run_id }} > /dev/null 2>&1
|
||||
gh run rerun ${{ inputs.run_id }} --failed
|
||||
@@ -14,8 +14,8 @@ jobs:
|
||||
with:
|
||||
repo-token: ${{ secrets.REACT_NATIVE_BOT_GITHUB_TOKEN }}
|
||||
days-before-stale: 180
|
||||
stale-issue-message: 'This issue is stale because it has been open for 180 days with no activity. It will be closed in 7 days unless you comment on it or remove the "Stale" label.'
|
||||
stale-pr-message: 'This PR is stale because it has been open for 180 days with no activity. It will be closed in 7 days unless you comment on it or remove the "Stale" label.'
|
||||
stale-issue-message: 'This issue is stale because it has been open 180 days with no activity. Remove stale label or comment or this will be closed in 7 days.'
|
||||
stale-pr-message: 'This PR is stale because it has been open 180 days with no activity. Remove stale label or comment or this will be closed in 7 days.'
|
||||
close-issue-message: 'This issue was closed because it has been stalled for 7 days with no activity.'
|
||||
close-pr-message: 'This PR was closed because it has been stalled for 7 days with no activity.'
|
||||
exempt-issue-labels: 'Help Wanted :octocat:, Good first issue, Never gets stale, Issue: Author Provided Repro'
|
||||
|
||||
@@ -117,18 +117,13 @@ jobs:
|
||||
flavor: ${{ matrix.flavor }}
|
||||
|
||||
prebuild_apple_dependencies:
|
||||
uses: ./.github/workflows/prebuild-ios-dependencies.yml
|
||||
uses: ./.github/workflows/prebuild-ios.yml
|
||||
secrets: inherit
|
||||
|
||||
prebuild_react_native_core:
|
||||
uses: ./.github/workflows/prebuild-ios-core.yml
|
||||
secrets: inherit
|
||||
needs: [prebuild_apple_dependencies, build_hermes_macos]
|
||||
|
||||
test_ios_rntester_ruby_3_2_0:
|
||||
runs-on: macos-14
|
||||
needs:
|
||||
[build_apple_slices_hermes, prepare_hermes_workspace, build_hermes_macos, prebuild_apple_dependencies, prebuild_react_native_core]
|
||||
[build_apple_slices_hermes, prepare_hermes_workspace, build_hermes_macos, prebuild_apple_dependencies]
|
||||
env:
|
||||
HERMES_WS_DIR: /tmp/hermes
|
||||
HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin
|
||||
@@ -141,12 +136,31 @@ jobs:
|
||||
ruby-version: "3.2.0"
|
||||
hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }}
|
||||
react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
||||
flavor: Debug
|
||||
|
||||
test_ios_rntester_dynamic_frameworks:
|
||||
runs-on: macos-14
|
||||
needs:
|
||||
[build_apple_slices_hermes, prepare_hermes_workspace, build_hermes_macos, prebuild_apple_dependencies]
|
||||
env:
|
||||
HERMES_WS_DIR: /tmp/hermes
|
||||
HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin
|
||||
continue-on-error: true
|
||||
strategy:
|
||||
fail-fast: false
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Run it
|
||||
uses: ./.github/actions/test-ios-rntester
|
||||
with:
|
||||
use-frameworks: DynamicFrameworks
|
||||
hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }}
|
||||
react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
||||
|
||||
test_ios_rntester:
|
||||
runs-on: macos-14-large
|
||||
needs:
|
||||
[build_apple_slices_hermes, prepare_hermes_workspace, build_hermes_macos, prebuild_apple_dependencies, prebuild_react_native_core]
|
||||
[build_apple_slices_hermes, prepare_hermes_workspace, build_hermes_macos, prebuild_apple_dependencies]
|
||||
env:
|
||||
HERMES_WS_DIR: /tmp/hermes
|
||||
HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin
|
||||
@@ -154,15 +168,20 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
architecture: [NewArch, OldArch]
|
||||
flavor: [Debug, Release]
|
||||
frameworks: [StaticLibraries, DynamicFrameworks]
|
||||
exclude: # We don't want to test the Old Arch in Release for E2E
|
||||
- architecture: OldArch
|
||||
flavor: Release
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Run it
|
||||
uses: ./.github/actions/test-ios-rntester
|
||||
with:
|
||||
use-frameworks: ${{ matrix.frameworks }}
|
||||
architecture: ${{ matrix.architecture }}
|
||||
run-unit-tests: "false"
|
||||
use-frameworks: StaticLibraries
|
||||
hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }}
|
||||
react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
||||
flavor: ${{ matrix.flavor }}
|
||||
@@ -175,19 +194,19 @@ jobs:
|
||||
env:
|
||||
HERMES_WS_DIR: /tmp/hermes
|
||||
HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin
|
||||
continue-on-error: true
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
architecture: [NewArch]
|
||||
flavor: [Debug, Release]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Setup Node.js
|
||||
uses: ./.github/actions/setup-node
|
||||
- name: Download App
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: RNTesterApp-NewArch-${{ matrix.flavor }}
|
||||
name: RNTesterApp-${{ matrix.architecture }}-${{ matrix.flavor }}
|
||||
path: /tmp/RNTesterBuild/RNTester.app
|
||||
- name: Check downloaded folder content
|
||||
run: ls -lR /tmp/RNTesterBuild
|
||||
@@ -208,10 +227,12 @@ jobs:
|
||||
env:
|
||||
HERMES_WS_DIR: /tmp/hermes
|
||||
HERMES_TARBALL_ARTIFACTS_DIR: /tmp/hermes/hermes-runtime-darwin
|
||||
continue-on-error: true
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
flavor: [Debug, Release]
|
||||
architecture: [OldArch, NewArch]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
@@ -245,14 +266,6 @@ jobs:
|
||||
- name: Print third-party folder
|
||||
shell: bash
|
||||
run: ls -lR /tmp/third-party
|
||||
- name: Download React Native Prebuilds
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: ReactCore${{ matrix.flavor }}.xcframework.tar.gz
|
||||
path: /tmp/ReactCore
|
||||
- name: Print ReactCore folder
|
||||
shell: bash
|
||||
run: ls -lR /tmp/ReactCore
|
||||
- name: Prepare artifacts
|
||||
run: |
|
||||
REACT_NATIVE_PKG=$(find /tmp/react-native-tmp -type f -name "*.tgz")
|
||||
@@ -273,9 +286,12 @@ jobs:
|
||||
cd /tmp/RNTestProject/ios
|
||||
bundle install
|
||||
NEW_ARCH_ENABLED=1
|
||||
if [[ ${{ matrix.architecture }} == "OldArch" ]]; then
|
||||
echo "Disable the New Architecture"
|
||||
NEW_ARCH_ENABLED=0
|
||||
fi
|
||||
|
||||
export RCT_USE_LOCAL_RN_DEP=/tmp/third-party/ReactNativeDependencies${{ matrix.flavor }}.xcframework.tar.gz
|
||||
export RCT_TESTONLY_RNCORE_TARBALL_PATH="/tmp/ReactCore/ReactCore${{ matrix.flavor }}.xcframework.tar.gz"
|
||||
HERMES_ENGINE_TARBALL_PATH=$HERMES_PATH RCT_NEW_ARCH_ENABLED=$NEW_ARCH_ENABLED bundle exec pod install
|
||||
|
||||
xcodebuild \
|
||||
@@ -293,15 +309,18 @@ jobs:
|
||||
maestro-flow: ./scripts/e2e/.maestro/
|
||||
flavor: ${{ matrix.flavor }}
|
||||
working-directory: /tmp/RNTestProject
|
||||
architecture: ${{ matrix.architecture }}
|
||||
|
||||
test_e2e_android_templateapp:
|
||||
if: ${{ github.ref == 'refs/heads/main' || contains(github.ref, 'stable') || inputs.run-e2e-tests }}
|
||||
runs-on: 4-core-ubuntu
|
||||
needs: build_npm_package
|
||||
continue-on-error: true
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
flavor: [debug, release]
|
||||
architecture: [OldArch, NewArch]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
@@ -347,6 +366,11 @@ jobs:
|
||||
cd /tmp/RNTestProject
|
||||
echo "react.internal.mavenLocalRepo=$MAVEN_LOCAL" >> android/gradle.properties
|
||||
|
||||
if [[ ${{matrix.architecture}} == "OldArch" ]]; then
|
||||
echo "Disabling the New Architecture"
|
||||
sed -i 's/newArchEnabled=true/newArchEnabled=false/' android/gradle.properties
|
||||
fi
|
||||
|
||||
# Build
|
||||
cd android
|
||||
CAPITALIZED_FLAVOR=$(echo "${{ matrix.flavor }}" | awk '{print toupper(substr($0, 1, 1)) substr($0, 2)}')
|
||||
@@ -362,6 +386,7 @@ jobs:
|
||||
install-java: 'false'
|
||||
flavor: ${{ matrix.flavor }}
|
||||
working-directory: /tmp/RNTestProject
|
||||
architecture: ${{ matrix.architecture }}
|
||||
|
||||
build_hermesc_linux:
|
||||
runs-on: ubuntu-latest
|
||||
@@ -379,12 +404,12 @@ jobs:
|
||||
react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
||||
|
||||
build_hermesc_windows:
|
||||
runs-on: windows-2025
|
||||
runs-on: windows-2019
|
||||
needs: prepare_hermes_workspace
|
||||
env:
|
||||
HERMES_WS_DIR: 'C:\tmp\hermes'
|
||||
HERMES_TARBALL_ARTIFACTS_DIR: 'C:\tmp\hermes\hermes-runtime-darwin'
|
||||
HERMES_OSXBIN_ARTIFACTS_DIR: 'C:\tmp\hermes\osx-bin'
|
||||
HERMES_WS_DIR: 'D:\tmp\hermes'
|
||||
HERMES_TARBALL_ARTIFACTS_DIR: 'D:\tmp\hermes\hermes-runtime-darwin'
|
||||
HERMES_OSXBIN_ARTIFACTS_DIR: 'D:\tmp\hermes\osx-bin'
|
||||
ICU_URL: "https://github.com/unicode-org/icu/releases/download/release-64-2/icu4c-64_2-Win64-MSVC2017.zip"
|
||||
MSBUILD_DIR: 'C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin'
|
||||
CMAKE_DIR: 'C:\Program Files\CMake\bin'
|
||||
@@ -436,14 +461,14 @@ jobs:
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: rntester-${{ matrix.flavor }}
|
||||
path: ./packages/rn-tester/android/app/build/outputs/apk/${{ matrix.flavor }}/
|
||||
path: ./packages/rn-tester/android/app/build/outputs/apk/hermes/${{ matrix.flavor }}/
|
||||
- name: Print folder structure
|
||||
run: ls -lR ./packages/rn-tester/android/app/build/outputs/apk/${{ matrix.flavor }}/
|
||||
run: ls -lR ./packages/rn-tester/android/app/build/outputs/apk/hermes/${{ matrix.flavor }}/
|
||||
- name: Run E2E Tests
|
||||
uses: ./.github/actions/maestro-android
|
||||
timeout-minutes: 60
|
||||
with:
|
||||
app-path: ./packages/rn-tester/android/app/build/outputs/apk/${{ matrix.flavor }}/app-x86-${{ matrix.flavor }}.apk
|
||||
app-path: ./packages/rn-tester/android/app/build/outputs/apk/hermes/${{ matrix.flavor }}/app-hermes-x86-${{ matrix.flavor }}.apk
|
||||
app-id: com.facebook.react.uiapp
|
||||
maestro-flow: ./packages/rn-tester/.maestro
|
||||
flavor: ${{ matrix.flavor }}
|
||||
@@ -459,7 +484,6 @@ jobs:
|
||||
build_hermesc_windows,
|
||||
build_android,
|
||||
prebuild_apple_dependencies,
|
||||
prebuild_react_native_core,
|
||||
]
|
||||
container:
|
||||
image: reactnativecommunity/react-native-android:latest
|
||||
@@ -496,6 +520,7 @@ jobs:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
flavor: [Debug, Release]
|
||||
architecture: [NewArch, OldArch]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
@@ -520,11 +545,14 @@ jobs:
|
||||
- name: Prepare the Helloworld application
|
||||
shell: bash
|
||||
run: node ./scripts/e2e/init-project-e2e.js --useHelloWorld --pathToLocalReactNative "$GITHUB_WORKSPACE/build/$(cat build/react-native-package-version)"
|
||||
- name: Build the Helloworld application for ${{ matrix.flavor }} with Architecture set to New Architecture.
|
||||
- name: Build the Helloworld application for ${{ matrix.flavor }} with Architecture set to ${{ matrix.architecture }}.
|
||||
shell: bash
|
||||
run: |
|
||||
cd private/helloworld/android
|
||||
cd packages/helloworld/android
|
||||
args=()
|
||||
if [[ ${{ matrix.architecture }} == "OldArch" ]]; then
|
||||
args+=(--arch old)
|
||||
fi
|
||||
if [[ ${{ matrix.flavor }} == "Release" ]]; then
|
||||
args+=(--prod)
|
||||
fi
|
||||
@@ -532,13 +560,13 @@ jobs:
|
||||
- name: Upload artifact
|
||||
uses: actions/upload-artifact@v4.3.4
|
||||
with:
|
||||
name: helloworld-apk-${{ matrix.flavor }}-NewArch-hermes
|
||||
path: ./private/helloworld/android/app/build/outputs/apk/
|
||||
name: helloworld-apk-${{ matrix.flavor }}-${{ matrix.architecture }}-hermes
|
||||
path: ./packages/helloworld/android/app/build/outputs/apk/
|
||||
compression-level: 0
|
||||
|
||||
test_ios_helloworld_with_ruby_3_2_0:
|
||||
runs-on: macos-14
|
||||
needs: [prepare_hermes_workspace, build_hermes_macos, prebuild_apple_dependencies, prebuild_react_native_core] # prepare_hermes_workspace must be there because we need its reference to retrieve a couple of outputs
|
||||
needs: [prepare_hermes_workspace, build_hermes_macos, prebuild_apple_dependencies] # prepare_hermes_workspace must be there because we need its reference to retrieve a couple of outputs
|
||||
env:
|
||||
PROJECT_NAME: iOSTemplateProject
|
||||
HERMES_WS_DIR: /tmp/hermes
|
||||
@@ -549,13 +577,14 @@ jobs:
|
||||
- uses: ./.github/actions/test-ios-helloworld
|
||||
with:
|
||||
ruby-version: 3.2.0
|
||||
architecture: NewArch
|
||||
flavor: Debug
|
||||
hermes-version: ${{ needs.prepare_hermes_workspace.outputs.hermes-version }}
|
||||
react-native-version: ${{ needs.prepare_hermes_workspace.outputs.react-native-version }}
|
||||
|
||||
test_ios_helloworld:
|
||||
runs-on: macos-14
|
||||
needs: [prepare_hermes_workspace, build_hermes_macos, prebuild_apple_dependencies, prebuild_react_native_core] # prepare_hermes_workspace must be there because we need its reference to retrieve a couple of outputs
|
||||
needs: [prepare_hermes_workspace, build_hermes_macos, prebuild_apple_dependencies] # prepare_hermes_workspace must be there because we need its reference to retrieve a couple of outputs
|
||||
strategy:
|
||||
matrix:
|
||||
flavor: [Debug, Release]
|
||||
@@ -583,7 +612,7 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
node-version: ["24", "22", "20"]
|
||||
node-version: ["22", "20", "18"]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
@@ -599,47 +628,7 @@ jobs:
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Run all the linters
|
||||
- name: Run all the Linters
|
||||
uses: ./.github/actions/lint
|
||||
with:
|
||||
github-token: ${{ env.GH_TOKEN }}
|
||||
|
||||
# This job should help with the E2E flakyness.
|
||||
# In case E2E tests fails, it launches a new retry-workflow workflow, passing the current run_id as input.
|
||||
# The retry-workflow reruns only the failed jobs of the current test-all workflow using
|
||||
# ```
|
||||
# gh run rerun ${{ inputs.run_id }} --failed
|
||||
# ```
|
||||
# From https://stackoverflow.com/a/78314483 it seems like that adding the extra workflow
|
||||
# rather then calling directly this command should improve stability of this solution.
|
||||
# This is exactly the same as rerunning failed tests from the GH UI, but automated.
|
||||
rerun-failed-jobs:
|
||||
runs-on: ubuntu-latest
|
||||
needs: [test_e2e_ios_rntester, test_e2e_android_rntester, test_e2e_ios_templateapp, test_e2e_android_templateapp]
|
||||
if: always()
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Rerun failed jobs in the current workflow
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
run: |
|
||||
SHOULD_RETRY=${{fromJSON(github.run_attempt) < 3}}
|
||||
if [[ $SHOULD_RETRY == "false" ]]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
RNTESTER_ANDROID_FAILED=${{ needs.test_e2e_android_rntester.result == 'failure' }}
|
||||
TEMPLATE_ANDROID_FAILED=${{ needs.test_e2e_android_templateapp.result == 'failure' }}
|
||||
RNTESTER_IOS_FAILED=${{ needs.test_e2e_ios_rntester.result == 'failure' }}
|
||||
TEMPLATE_IOS_FAILED=${{ needs.test_e2e_ios_templateapp.result == 'failure' }}
|
||||
|
||||
echo "RNTESTER_ANDROID_FAILED: $RNTESTER_ANDROID_FAILED"
|
||||
echo "TEMPLATE_ANDROID_FAILED: $TEMPLATE_ANDROID_FAILED"
|
||||
echo "RNTESTER_IOS_FAILED: $RNTESTER_IOS_FAILED"
|
||||
echo "TEMPLATE_IOS_FAILED: $TEMPLATE_IOS_FAILED"
|
||||
|
||||
if [[ $RNTESTER_ANDROID_FAILED == "true" || $TEMPLATE_ANDROID_FAILED == "true" || $RNTESTER_IOS_FAILED == "true" || $TEMPLATE_IOS_FAILED == "true" ]]; then
|
||||
echo "Rerunning failed jobs in the current workflow"
|
||||
gh workflow run retry-workflow.yml -F run_id=${{ github.run_id }}
|
||||
fi
|
||||
|
||||
@@ -58,8 +58,6 @@ jobs:
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Set up Node.js
|
||||
uses: ./.github/actions/setup-node
|
||||
- name: Test ${{ matrix.library }}
|
||||
id: run-test
|
||||
uses: ./.github/actions/test-library-on-nightly
|
||||
|
||||
@@ -40,8 +40,8 @@ project.xcworkspace
|
||||
/packages/react-native/ReactAndroid/external-artifacts/artifacts/
|
||||
/packages/react-native/ReactAndroid/hermes-engine/build/
|
||||
/packages/react-native/ReactAndroid/hermes-engine/.cxx/
|
||||
/private/helloworld/android/app/build/
|
||||
/private/helloworld/android/build/
|
||||
/packages/helloworld/android/app/build/
|
||||
/packages/helloworld/android/build/
|
||||
/packages/react-native-popup-menu-android/android/build/
|
||||
/packages/react-native-test-library/android/build/
|
||||
|
||||
@@ -108,23 +108,17 @@ package-lock.json
|
||||
|
||||
# Ruby Gems (Bundler)
|
||||
/packages/react-native/vendor
|
||||
/private/helloworld/vendor
|
||||
/packages/helloworld/vendor
|
||||
.ruby-version
|
||||
/**/.ruby-version
|
||||
vendor/
|
||||
|
||||
# iOS / CocoaPods
|
||||
/private/helloworld/ios/build/
|
||||
/private/helloworld/ios/Pods/
|
||||
/private/helloworld/ios/Podfile.lock
|
||||
/packages/rn-tester/bin/
|
||||
/packages/rn-tester/cache/
|
||||
/packages/rn-tester/extensions/
|
||||
/packages/rn-tester/gems/
|
||||
/packages/rn-tester/specifications/
|
||||
/packages/helloworld/ios/build/
|
||||
/packages/helloworld/ios/Pods/
|
||||
/packages/helloworld/ios/Podfile.lock
|
||||
/packages/rn-tester/Gemfile.lock
|
||||
/packages/**/RCTLegacyInteropComponents.mm
|
||||
/packages/sourcemap.ios.map
|
||||
|
||||
# Ignore RNTester specific Pods, but keep the __offline_mirrors__ here.
|
||||
/packages/rn-tester/Pods/*
|
||||
@@ -133,17 +127,17 @@ vendor/
|
||||
|
||||
# Swift Package build folder
|
||||
/packages/react-native/.build
|
||||
/packages/react-native/.swiftpm
|
||||
|
||||
# @react-native/codegen
|
||||
/packages/react-native/React/FBReactNativeSpec/
|
||||
/packages/react-native-codegen/lib
|
||||
/packages/react-native-codegen/tmp/
|
||||
/packages/react-native/ReactCommon/react/renderer/components/rncore/
|
||||
/packages/rn-tester/NativeModuleExample/ScreenshotManagerSpec*
|
||||
/**/RCTThirdPartyFabricComponentsProvider.*
|
||||
|
||||
# @react-native/codegen-typescript-test
|
||||
/private/react-native-codegen-typescript-test/lib
|
||||
/packages/react-native-codegen-typescript-test/lib
|
||||
|
||||
# Additional SDKs
|
||||
/packages/react-native/sdks/download
|
||||
@@ -170,11 +164,8 @@ fix_*.patch
|
||||
.metro-health-check*
|
||||
|
||||
# Jest Integration
|
||||
/private/react-native-fantom/build/
|
||||
/private/react-native-fantom/tester/build/
|
||||
/packages/react-native-fantom/build/
|
||||
/packages/react-native-fantom/tester/build/
|
||||
|
||||
# [Experimental] Generated TS type definitions
|
||||
/packages/**/types_generated/
|
||||
|
||||
/packages/debugger-shell/build/
|
||||
/packages/*/dist/
|
||||
|
||||
@@ -90,7 +90,7 @@ TODO: Explain the different components of React Native at a high level.
|
||||
- Jest
|
||||
- ESLint
|
||||
- Integration / E2E
|
||||
- [Fantom](../private/react-native-fantom/__docs__/README.md)
|
||||
- [Fantom](../packages/react-native-fantom/__docs__/README.md)
|
||||
- Tooling
|
||||
- React Native DevTools
|
||||
|
||||
|
||||
@@ -13,7 +13,6 @@ plugins {
|
||||
alias(libs.plugins.kotlin.android) apply false
|
||||
alias(libs.plugins.binary.compatibility.validator) apply true
|
||||
alias(libs.plugins.android.test) apply false
|
||||
alias(libs.plugins.ktfmt) apply true
|
||||
}
|
||||
|
||||
val reactAndroidProperties = java.util.Properties()
|
||||
@@ -56,8 +55,6 @@ nexusPublishing {
|
||||
sonatype {
|
||||
username.set(sonatypeUsername)
|
||||
password.set(sonatypePassword)
|
||||
nexusUrl.set(uri("https://ossrh-staging-api.central.sonatype.com/service/local/"))
|
||||
snapshotRepositoryUrl.set(uri("https://central.sonatype.com/repository/maven-snapshots/"))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -125,36 +122,9 @@ if (project.findProperty("react.internal.useHermesNightly")?.toString()?.toBoole
|
||||
configurations.all {
|
||||
resolutionStrategy.dependencySubstitution {
|
||||
substitute(project(":packages:react-native:ReactAndroid:hermes-engine"))
|
||||
.using(module("com.facebook.react:hermes-android:0.+"))
|
||||
.using(module("com.facebook.react:hermes-android:0.0.0-+"))
|
||||
.because("Users opted to use hermes from nightly")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ktfmt {
|
||||
blockIndent.set(2)
|
||||
continuationIndent.set(4)
|
||||
maxWidth.set(100)
|
||||
removeUnusedImports.set(false)
|
||||
manageTrailingCommas.set(false)
|
||||
}
|
||||
|
||||
// Configure ktfmt tasks to include gradle-plugin
|
||||
listOf("ktfmtCheck", "ktfmtFormat").forEach { taskName ->
|
||||
tasks.named(taskName) { dependsOn(gradle.includedBuild("gradle-plugin").task(":$taskName")) }
|
||||
}
|
||||
|
||||
allprojects {
|
||||
// Apply exclusions for specific files that should not be formatted
|
||||
val excludePatterns =
|
||||
listOf(
|
||||
"**/build/**",
|
||||
"**/hermes-engine/**",
|
||||
"**/internal/featureflags/**",
|
||||
"**/systeminfo/ReactNativeVersion.kt")
|
||||
listOf(
|
||||
com.ncorti.ktfmt.gradle.tasks.KtfmtCheckTask::class,
|
||||
com.ncorti.ktfmt.gradle.tasks.KtfmtFormatTask::class)
|
||||
.forEach { tasks.withType(it) { exclude(excludePatterns) } }
|
||||
}
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @flow
|
||||
* @format
|
||||
*/
|
||||
|
||||
@@ -3229,73 +3228,6 @@ declare module 'util' {
|
||||
isWebAssemblyCompiledModule: (value: mixed) => boolean,
|
||||
...
|
||||
};
|
||||
|
||||
declare type BackgroundColors =
|
||||
| 'bgBlack'
|
||||
| 'bgBlackBright'
|
||||
| 'bgBlue'
|
||||
| 'bgBlueBright'
|
||||
| 'bgCyan'
|
||||
| 'bgCyanBright'
|
||||
| 'bgGray'
|
||||
| 'bgGreen'
|
||||
| 'bgGreenBright'
|
||||
| 'bgGrey'
|
||||
| 'bgMagenta'
|
||||
| 'bgMagentaBright'
|
||||
| 'bgRed'
|
||||
| 'bgRedBright'
|
||||
| 'bgWhite'
|
||||
| 'bgWhiteBright'
|
||||
| 'bgYellow'
|
||||
| 'bgYellowBright';
|
||||
|
||||
declare type ForegroundColors =
|
||||
| 'black'
|
||||
| 'blackBright'
|
||||
| 'blue'
|
||||
| 'blueBright'
|
||||
| 'cyan'
|
||||
| 'cyanBright'
|
||||
| 'gray'
|
||||
| 'green'
|
||||
| 'greenBright'
|
||||
| 'grey'
|
||||
| 'magenta'
|
||||
| 'magentaBright'
|
||||
| 'red'
|
||||
| 'redBright'
|
||||
| 'white'
|
||||
| 'whiteBright'
|
||||
| 'yellow'
|
||||
| 'yellowBright';
|
||||
|
||||
declare type Modifiers =
|
||||
| 'blink'
|
||||
| 'bold'
|
||||
| 'dim'
|
||||
| 'doubleunderline'
|
||||
| 'framed'
|
||||
| 'hidden'
|
||||
| 'inverse'
|
||||
| 'italic'
|
||||
| 'overlined'
|
||||
| 'reset'
|
||||
| 'strikethrough'
|
||||
| 'underline';
|
||||
|
||||
declare function styleText(
|
||||
format:
|
||||
| ForegroundColors
|
||||
| BackgroundColors
|
||||
| Modifiers
|
||||
| $ReadOnlyArray<ForegroundColors | BackgroundColors | Modifiers>,
|
||||
text: string,
|
||||
options?: $ReadOnly<{
|
||||
stream?: ?stream$Stream,
|
||||
validStream?: ?boolean,
|
||||
}>,
|
||||
): string;
|
||||
}
|
||||
|
||||
type vm$ScriptOptions = {
|
||||
|
||||
@@ -8,6 +8,6 @@
|
||||
* @format
|
||||
*/
|
||||
|
||||
declare module '@tsconfig/node22/tsconfig.json' {
|
||||
declare module '@tsconfig/node18/tsconfig.json' {
|
||||
declare module.exports: any;
|
||||
}
|
||||
@@ -0,0 +1,230 @@
|
||||
/**
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @flow
|
||||
* @format
|
||||
*/
|
||||
|
||||
// flow-typed signature: 79cfa6bcaa67fdb60f10d320da0470fc
|
||||
// flow-typed version: 6cecea2e51/chalk_v4.x.x/flow_>=v0.104.x
|
||||
|
||||
// From: https://github.com/chalk/chalk/blob/master/index.d.ts
|
||||
|
||||
declare module 'chalk' {
|
||||
declare type ForegroundColor =
|
||||
| 'black'
|
||||
| 'red'
|
||||
| 'green'
|
||||
| 'yellow'
|
||||
| 'blue'
|
||||
| 'magenta'
|
||||
| 'cyan'
|
||||
| 'white'
|
||||
| 'gray'
|
||||
| 'grey'
|
||||
| 'blackBright'
|
||||
| 'redBright'
|
||||
| 'greenBright'
|
||||
| 'yellowBright'
|
||||
| 'blueBright'
|
||||
| 'magentaBright'
|
||||
| 'cyanBright'
|
||||
| 'whiteBright';
|
||||
|
||||
declare type BackgroundColor =
|
||||
| 'bgBlack'
|
||||
| 'bgRed'
|
||||
| 'bgGreen'
|
||||
| 'bgYellow'
|
||||
| 'bgBlue'
|
||||
| 'bgMagenta'
|
||||
| 'bgCyan'
|
||||
| 'bgWhite'
|
||||
| 'bgGray'
|
||||
| 'bgGrey'
|
||||
| 'bgBlackBright'
|
||||
| 'bgRedBright'
|
||||
| 'bgGreenBright'
|
||||
| 'bgYellowBright'
|
||||
| 'bgBlueBright'
|
||||
| 'bgMagentaBright'
|
||||
| 'bgCyanBright'
|
||||
| 'bgWhiteBright';
|
||||
|
||||
declare type Color = ForegroundColor | BackgroundColor;
|
||||
|
||||
declare type Modifiers =
|
||||
| 'reset'
|
||||
| 'bold'
|
||||
| 'dim'
|
||||
| 'italic'
|
||||
| 'underline'
|
||||
| 'inverse'
|
||||
| 'hidden'
|
||||
| 'strikethrough'
|
||||
| 'visible';
|
||||
|
||||
declare type TemplateStringsArray = $ReadOnlyArray<string>;
|
||||
|
||||
declare type Level = $Values<{
|
||||
None: 0,
|
||||
Basic: 1,
|
||||
Ansi256: 2,
|
||||
TrueColor: 3,
|
||||
...
|
||||
}>;
|
||||
|
||||
declare type ChalkOptions = {|
|
||||
level?: Level,
|
||||
|};
|
||||
|
||||
declare type ColorSupport = {|
|
||||
level: Level,
|
||||
hasBasic: boolean,
|
||||
has256: boolean,
|
||||
has16m: boolean,
|
||||
|};
|
||||
|
||||
declare class Instance implements Chalk {
|
||||
constructor(options?: ChalkOptions): this;
|
||||
|
||||
(...text: string[]): string;
|
||||
(text: TemplateStringsArray, ...placeholders: string[]): string;
|
||||
Instance: typeof Instance;
|
||||
level: Level;
|
||||
rgb(r: number, g: number, b: number): Chalk;
|
||||
hsl(h: number, s: number, l: number): Chalk;
|
||||
hsv(h: number, s: number, v: number): Chalk;
|
||||
hwb(h: number, w: number, b: number): Chalk;
|
||||
bgHex(color: string): Chalk;
|
||||
bgKeyword(color: string): Chalk;
|
||||
bgRgb(r: number, g: number, b: number): Chalk;
|
||||
bgHsl(h: number, s: number, l: number): Chalk;
|
||||
bgHsv(h: number, s: number, v: number): Chalk;
|
||||
bgHwb(h: number, w: number, b: number): Chalk;
|
||||
hex(color: string): Chalk;
|
||||
keyword(color: string): Chalk;
|
||||
|
||||
+reset: Chalk;
|
||||
+bold: Chalk;
|
||||
+dim: Chalk;
|
||||
+italic: Chalk;
|
||||
+underline: Chalk;
|
||||
+inverse: Chalk;
|
||||
+hidden: Chalk;
|
||||
+strikethrough: Chalk;
|
||||
|
||||
+visible: Chalk;
|
||||
|
||||
+black: Chalk;
|
||||
+red: Chalk;
|
||||
+green: Chalk;
|
||||
+yellow: Chalk;
|
||||
+blue: Chalk;
|
||||
+magenta: Chalk;
|
||||
+cyan: Chalk;
|
||||
+white: Chalk;
|
||||
+gray: Chalk;
|
||||
+grey: Chalk;
|
||||
+blackBright: Chalk;
|
||||
+redBright: Chalk;
|
||||
+greenBright: Chalk;
|
||||
+yellowBright: Chalk;
|
||||
+blueBright: Chalk;
|
||||
+magentaBright: Chalk;
|
||||
+cyanBright: Chalk;
|
||||
+whiteBright: Chalk;
|
||||
|
||||
+bgBlack: Chalk;
|
||||
+bgRed: Chalk;
|
||||
+bgGreen: Chalk;
|
||||
+bgYellow: Chalk;
|
||||
+bgBlue: Chalk;
|
||||
+bgMagenta: Chalk;
|
||||
+bgCyan: Chalk;
|
||||
+bgWhite: Chalk;
|
||||
+bgBlackBright: Chalk;
|
||||
+bgRedBright: Chalk;
|
||||
+bgGreenBright: Chalk;
|
||||
+bgYellowBright: Chalk;
|
||||
+bgBlueBright: Chalk;
|
||||
+bgMagentaBright: Chalk;
|
||||
+bgCyanBright: Chalk;
|
||||
+bgWhiteBright: Chalk;
|
||||
|
||||
supportsColor: ColorSupport;
|
||||
}
|
||||
|
||||
declare interface Chalk {
|
||||
(...text: string[]): string;
|
||||
(text: TemplateStringsArray, ...placeholders: string[]): string;
|
||||
Instance: typeof Instance;
|
||||
level: Level;
|
||||
rgb(r: number, g: number, b: number): Chalk;
|
||||
hsl(h: number, s: number, l: number): Chalk;
|
||||
hsv(h: number, s: number, v: number): Chalk;
|
||||
hwb(h: number, w: number, b: number): Chalk;
|
||||
bgHex(color: string): Chalk;
|
||||
bgKeyword(color: string): Chalk;
|
||||
bgRgb(r: number, g: number, b: number): Chalk;
|
||||
bgHsl(h: number, s: number, l: number): Chalk;
|
||||
bgHsv(h: number, s: number, v: number): Chalk;
|
||||
bgHwb(h: number, w: number, b: number): Chalk;
|
||||
hex(color: string): Chalk;
|
||||
keyword(color: string): Chalk;
|
||||
|
||||
+reset: Chalk;
|
||||
+bold: Chalk;
|
||||
+dim: Chalk;
|
||||
+italic: Chalk;
|
||||
+underline: Chalk;
|
||||
+inverse: Chalk;
|
||||
+hidden: Chalk;
|
||||
+strikethrough: Chalk;
|
||||
|
||||
+visible: Chalk;
|
||||
|
||||
+black: Chalk;
|
||||
+red: Chalk;
|
||||
+green: Chalk;
|
||||
+yellow: Chalk;
|
||||
+blue: Chalk;
|
||||
+magenta: Chalk;
|
||||
+cyan: Chalk;
|
||||
+white: Chalk;
|
||||
+gray: Chalk;
|
||||
+grey: Chalk;
|
||||
+blackBright: Chalk;
|
||||
+redBright: Chalk;
|
||||
+greenBright: Chalk;
|
||||
+yellowBright: Chalk;
|
||||
+blueBright: Chalk;
|
||||
+magentaBright: Chalk;
|
||||
+cyanBright: Chalk;
|
||||
+whiteBright: Chalk;
|
||||
|
||||
+bgBlack: Chalk;
|
||||
+bgRed: Chalk;
|
||||
+bgGreen: Chalk;
|
||||
+bgYellow: Chalk;
|
||||
+bgBlue: Chalk;
|
||||
+bgMagenta: Chalk;
|
||||
+bgCyan: Chalk;
|
||||
+bgWhite: Chalk;
|
||||
+bgBlackBright: Chalk;
|
||||
+bgRedBright: Chalk;
|
||||
+bgGreenBright: Chalk;
|
||||
+bgYellowBright: Chalk;
|
||||
+bgBlueBright: Chalk;
|
||||
+bgMagentaBright: Chalk;
|
||||
+bgCyanBright: Chalk;
|
||||
+bgWhiteBright: Chalk;
|
||||
|
||||
supportsColor: ColorSupport;
|
||||
}
|
||||
|
||||
declare module.exports: Chalk;
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @flow strict
|
||||
* @format
|
||||
*/
|
||||
|
||||
declare module 'cross-spawn' {
|
||||
import * as child_process from 'child_process';
|
||||
|
||||
type spawn = typeof child_process.spawn & {
|
||||
spawn: spawn,
|
||||
sync: typeof child_process.spawnSync,
|
||||
};
|
||||
|
||||
declare module.exports: spawn;
|
||||
}
|
||||
@@ -1,149 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
||||
*
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @flow strict-local
|
||||
* @format
|
||||
*/
|
||||
|
||||
declare module '@electron/packager' {
|
||||
declare export type AsarOptions = $FlowFixMe;
|
||||
|
||||
declare export type ElectronDownloadRequestOptions = $FlowFixMe;
|
||||
|
||||
declare export type TargetDefinition = {
|
||||
arch: TargetArch,
|
||||
platform: TargetPlatform,
|
||||
};
|
||||
|
||||
declare export type FinalizePackageTargetsHookFunction = (
|
||||
targets: TargetDefinition[],
|
||||
callback: HookFunctionErrorCallback,
|
||||
) => void;
|
||||
|
||||
declare export type HookFunction = (
|
||||
buildPath: string,
|
||||
electronVersion: string,
|
||||
platform: TargetPlatform,
|
||||
arch: TargetArch,
|
||||
callback: HookFunctionErrorCallback,
|
||||
) => void;
|
||||
|
||||
declare export type IgnoreFunction = (path: string) => boolean;
|
||||
|
||||
declare export type HookFunctionErrorCallback = (err?: Error | null) => void;
|
||||
|
||||
declare export interface MacOSProtocol {
|
||||
name: string;
|
||||
schemes: string[];
|
||||
}
|
||||
|
||||
declare export type NotaryToolCredentials = $FlowFixMe;
|
||||
|
||||
declare export type OsxSignOptions = $FlowFixMe;
|
||||
|
||||
declare export type OsxUniversalOptions = $FlowFixMe;
|
||||
|
||||
declare export type Win32MetadataOptions = $ReadOnly<{
|
||||
CompanyName?: string,
|
||||
FileDescription?: string,
|
||||
OriginalFilename?: string,
|
||||
ProductName?: string,
|
||||
InternalName?: string,
|
||||
'requested-execution-level'?:
|
||||
| 'asInvoker'
|
||||
| 'highestAvailable'
|
||||
| 'requireAdministrator',
|
||||
'application-manifest'?: string,
|
||||
}>;
|
||||
|
||||
declare export type WindowsSignOptions = $FlowFixMe;
|
||||
|
||||
declare export type OfficialArch =
|
||||
| 'ia32'
|
||||
| 'x64'
|
||||
| 'armv7l'
|
||||
| 'arm64'
|
||||
| 'mips64el'
|
||||
| 'universal';
|
||||
|
||||
declare export type OfficialPlatform = 'linux' | 'win32' | 'darwin' | 'mas';
|
||||
|
||||
declare export type TargetArch = OfficialArch | string;
|
||||
|
||||
declare export type TargetPlatform = OfficialPlatform | string;
|
||||
|
||||
declare export type ArchOption = TargetArch | 'all';
|
||||
|
||||
declare export type PlatformOption = TargetPlatform | 'all';
|
||||
|
||||
declare export interface Options {
|
||||
dir: string;
|
||||
afterAsar?: HookFunction[];
|
||||
afterComplete?: HookFunction[];
|
||||
afterCopy?: HookFunction[];
|
||||
afterCopyExtraResources?: HookFunction[];
|
||||
afterExtract?: HookFunction[];
|
||||
afterFinalizePackageTargets?: FinalizePackageTargetsHookFunction[];
|
||||
afterInitialize?: HookFunction[];
|
||||
afterPrune?: HookFunction[];
|
||||
all?: boolean;
|
||||
appBundleId?: string;
|
||||
appCategoryType?: string;
|
||||
appCopyright?: string;
|
||||
appVersion?: string;
|
||||
arch?: ArchOption | ArchOption[];
|
||||
asar?: boolean | AsarOptions;
|
||||
beforeAsar?: HookFunction[];
|
||||
beforeCopy?: HookFunction[];
|
||||
beforeCopyExtraResources?: HookFunction[];
|
||||
buildVersion?: string;
|
||||
darwinDarkModeSupport?: boolean;
|
||||
derefSymlinks?: boolean;
|
||||
download?: ElectronDownloadRequestOptions;
|
||||
electronVersion?: string;
|
||||
electronZipDir?: string;
|
||||
executableName?: string;
|
||||
extendHelperInfo?:
|
||||
| string
|
||||
| {
|
||||
[property: string]: any,
|
||||
};
|
||||
extendInfo?:
|
||||
| string
|
||||
| {
|
||||
[property: string]: any,
|
||||
};
|
||||
extraResource?: string | string[];
|
||||
helperBundleId?: string;
|
||||
icon?: string;
|
||||
ignore?: RegExp | (string | RegExp)[] | IgnoreFunction;
|
||||
junk?: boolean;
|
||||
name?: string;
|
||||
osxNotarize?: NotaryToolCredentials;
|
||||
osxSign?: true | OsxSignOptions;
|
||||
osxUniversal?: OsxUniversalOptions;
|
||||
out?: string;
|
||||
overwrite?: boolean;
|
||||
platform?: TargetPlatform | 'all' | Array<TargetPlatform | 'all'>;
|
||||
prebuiltAsar?: string;
|
||||
protocols?: MacOSProtocol[];
|
||||
prune?: boolean;
|
||||
quiet?: boolean;
|
||||
tmpdir?: string | false;
|
||||
usageDescription?: {
|
||||
[property: string]: string,
|
||||
};
|
||||
win32metadata?: Win32MetadataOptions;
|
||||
windowsSign?: true | WindowsSignOptions;
|
||||
}
|
||||
|
||||
declare function packager(options: Options): Promise<string[]>;
|
||||
|
||||
declare module.exports: typeof packager & {
|
||||
packager: typeof packager,
|
||||
default: typeof packager,
|
||||
};
|
||||
}
|
||||
@@ -4,7 +4,6 @@
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @flow
|
||||
* @format
|
||||
*/
|
||||
|
||||
@@ -854,10 +853,6 @@ type JestObjectType = {
|
||||
* Returns the number of fake timers still left to run.
|
||||
*/
|
||||
getTimerCount(): number,
|
||||
/**
|
||||
* Returns the time in ms of the current clock.
|
||||
*/
|
||||
now(): number,
|
||||
/**
|
||||
* Set the current system time used by fake timers.
|
||||
* Simulates a user changing the system clock while your program is running.
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/**
|
||||
* (c) Meta Platforms, Inc. and affiliates. Confidential and proprietary.
|
||||
*
|
||||
* @flow strict
|
||||
* @format
|
||||
* @flow strict
|
||||
*/
|
||||
|
||||
declare module 'signedsource' {
|
||||
|
||||
@@ -48,11 +48,6 @@ declare module 'typescript' {
|
||||
file: SourceFile,
|
||||
start?: number,
|
||||
): $ReadOnly<{line: number, character: number}>,
|
||||
convertCompilerOptionsFromJson(
|
||||
jsonOptions: any,
|
||||
basePath: string,
|
||||
configFileName?: string,
|
||||
): {options: Object, errors: Diagnostic[]},
|
||||
ModuleResolutionKind: typeof ModuleResolutionKind,
|
||||
...
|
||||
};
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
|
||||
@@ -4,19 +4,16 @@
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @flow strict
|
||||
* @format
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
// $FlowFixMe[cannot-resolve-module]
|
||||
// $FlowFixMe[untyped-import]
|
||||
const {defaults} = require('jest-config');
|
||||
|
||||
const PODS_LOCATIONS = [
|
||||
'packages/rn-tester/Pods',
|
||||
'private/helloworld/ios/Pods',
|
||||
'packages/helloworld/ios/Pods',
|
||||
];
|
||||
|
||||
module.exports = {
|
||||
@@ -42,21 +39,18 @@ module.exports = {
|
||||
'<rootDir>/packages/react-native/Libraries/Renderer',
|
||||
'<rootDir>/packages/react-native/sdks/hermes/',
|
||||
...PODS_LOCATIONS,
|
||||
] /*:: as $ReadOnlyArray<string> */,
|
||||
],
|
||||
transformIgnorePatterns: ['node_modules/(?!@react-native/)'],
|
||||
haste: {
|
||||
defaultPlatform: 'ios',
|
||||
platforms: ['ios', 'android'],
|
||||
},
|
||||
moduleFileExtensions: [
|
||||
'fb.js',
|
||||
...defaults.moduleFileExtensions,
|
||||
] /*:: as $ReadOnlyArray<string> */,
|
||||
moduleFileExtensions: ['fb.js'].concat(defaults.moduleFileExtensions),
|
||||
modulePathIgnorePatterns: [
|
||||
'scripts/.*/__fixtures__/',
|
||||
'<rootDir>/packages/react-native/sdks/hermes/',
|
||||
...PODS_LOCATIONS,
|
||||
] /*:: as $ReadOnlyArray<string> */,
|
||||
],
|
||||
unmockedModulePathPatterns: [
|
||||
'node_modules/react/',
|
||||
'packages/react-native/Libraries/Renderer',
|
||||
|
||||
@@ -4,15 +4,15 @@
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @flow
|
||||
* @format
|
||||
* @flow
|
||||
*/
|
||||
|
||||
/* eslint-env node */
|
||||
|
||||
'use strict';
|
||||
|
||||
// eslint-disable-next-line @react-native/monorepo/sort-imports
|
||||
// eslint-disable-next-line lint/sort-imports
|
||||
const {
|
||||
transformFromAstSync: babelTransformFromAstSync,
|
||||
transformSync: babelTransformSync,
|
||||
@@ -32,7 +32,7 @@ if (process.env.FBSOURCE_ENV === '1') {
|
||||
require('@fb-tools/babel-register');
|
||||
} else {
|
||||
// Register Babel to allow local packages to be loaded from source
|
||||
require('../scripts/shared/babelRegister').registerForMonorepo();
|
||||
require('../scripts/babel-register').registerForMonorepo();
|
||||
}
|
||||
|
||||
const transformer = require('@react-native/metro-babel-transformer');
|
||||
@@ -59,9 +59,6 @@ const babelPluginPreventBabelRegister = [
|
||||
|
||||
module.exports = {
|
||||
process(src /*: string */, file /*: string */) /*: {code: string, ...} */ {
|
||||
if (file.endsWith('.json')) {
|
||||
return {code: src};
|
||||
}
|
||||
if (nodeFiles.test(file)) {
|
||||
// node specific transforms only
|
||||
return babelTransformSync(src, {
|
||||
|
||||
@@ -8,21 +8,18 @@
|
||||
"android": "yarn --cwd packages/rn-tester android",
|
||||
"build-android": "./gradlew :packages:react-native:ReactAndroid:build",
|
||||
"build": "node ./scripts/build/build.js",
|
||||
"build-types": "node ./scripts/js-api/build-types",
|
||||
"build-types": "node ./scripts/build-types",
|
||||
"clang-format": "clang-format -i --glob=*/**/*.{h,cpp,m,mm}",
|
||||
"clean": "node ./scripts/build/clean.js",
|
||||
"cxx-api-build": "node ./scripts/cxx-api/public-api.js",
|
||||
"flow-check": "flow check",
|
||||
"flow": "flow",
|
||||
"format-check": "prettier --list-different \"./**/*.{js,md,yml,ts,tsx}\"",
|
||||
"format": "npm run prettier && npm run clang-format",
|
||||
"featureflags": "yarn --cwd packages/react-native featureflags",
|
||||
"js-api-diff": "node ./scripts/js-api/diff-api-snapshot",
|
||||
"lint-ci": "./.github/workflow-scripts/analyze_code.sh && yarn shellcheck",
|
||||
"lint-kotlin-check": "./gradlew ktfmtCheck",
|
||||
"lint-kotlin": "./gradlew ktfmtFormat",
|
||||
"lint-java": "node ./scripts/lint-java.js",
|
||||
"lint-markdown": "markdownlint-cli2 2>&1",
|
||||
"lint": "eslint --max-warnings 0 .",
|
||||
"lint": "eslint .",
|
||||
"prettier": "prettier --write \"./**/*.{js,md,yml,ts,tsx}\"",
|
||||
"print-packages": "node ./scripts/monorepo/print",
|
||||
"shellcheck": "./.github/workflow-scripts/analyze_scripts.sh",
|
||||
@@ -30,20 +27,19 @@
|
||||
"set-version": "node ./scripts/releases/set-version.js",
|
||||
"test-android": "./gradlew :packages:react-native:ReactAndroid:test",
|
||||
"test-ci": "jest --maxWorkers=2 --ci --reporters=\"default\" --reporters=\"jest-junit\"",
|
||||
"test-release-local-clean": "node ./scripts/release-testing/test-release-local-clean.js",
|
||||
"test-release-local": "node ./scripts/release-testing/test-release-local.js",
|
||||
"test-e2e-local-clean": "node ./scripts/release-testing/test-e2e-local-clean.js",
|
||||
"test-e2e-local": "node ./scripts/release-testing/test-e2e-local.js",
|
||||
"test-ios": "./scripts/objc-test.sh test",
|
||||
"test-typescript": "tsc -p packages/react-native/types/tsconfig.json",
|
||||
"test-generated-typescript": "tsc -p packages/react-native/types_generated/tsconfig.test.json",
|
||||
"test-typescript": "tsc -p packages/react-native/types/tsconfig.test.json",
|
||||
"test": "jest",
|
||||
"fantom": "./scripts/fantom.sh",
|
||||
"fantom": "JS_DIR='..' yarn jest --config packages/react-native-fantom/config/jest.config.js",
|
||||
"trigger-react-native-release": "node ./scripts/releases-local/trigger-react-native-release.js",
|
||||
"update-lock": "npx yarn-deduplicate"
|
||||
},
|
||||
"workspaces": [
|
||||
"packages/*",
|
||||
"private/*",
|
||||
"!private/helloworld"
|
||||
"tools/*",
|
||||
"!packages/helloworld"
|
||||
],
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.25.2",
|
||||
@@ -53,19 +49,18 @@
|
||||
"@babel/plugin-transform-regenerator": "^7.24.7",
|
||||
"@babel/preset-env": "^7.25.3",
|
||||
"@babel/preset-flow": "^7.24.7",
|
||||
"@electron/packager": "^18.3.6",
|
||||
"@jest/create-cache-key-function": "^29.7.0",
|
||||
"@microsoft/api-extractor": "^7.52.2",
|
||||
"@react-native/metro-babel-transformer": "0.81.0-main",
|
||||
"@react-native/metro-config": "0.81.0-main",
|
||||
"@tsconfig/node22": "22.0.2",
|
||||
"@types/react": "^19.1.0",
|
||||
"@typescript-eslint/parser": "^8.36.0",
|
||||
"@react-native/metro-babel-transformer": "0.80.0-main",
|
||||
"@react-native/metro-config": "0.80.0-main",
|
||||
"@tsconfig/node18": "1.0.1",
|
||||
"@types/react": "^19.0.0",
|
||||
"@typescript-eslint/parser": "^7.1.1",
|
||||
"ansi-styles": "^4.2.1",
|
||||
"babel-plugin-minify-dead-code-elimination": "^0.5.2",
|
||||
"babel-plugin-syntax-hermes-parser": "0.29.1",
|
||||
"babel-plugin-syntax-hermes-parser": "0.28.1",
|
||||
"babel-plugin-transform-define": "^2.1.4",
|
||||
"babel-plugin-transform-flow-enums": "^0.0.2",
|
||||
"chalk": "^4.0.0",
|
||||
"clang-format": "^1.8.0",
|
||||
"connect": "^3.6.5",
|
||||
"debug": "^4.4.0",
|
||||
@@ -77,16 +72,17 @@
|
||||
"eslint-plugin-ft-flow": "^2.0.1",
|
||||
"eslint-plugin-jest": "^27.9.0",
|
||||
"eslint-plugin-jsx-a11y": "^6.6.0",
|
||||
"eslint-plugin-lint": "^1.0.0",
|
||||
"eslint-plugin-react": "^7.30.1",
|
||||
"eslint-plugin-react-hooks": "^5.2.0",
|
||||
"eslint-plugin-react-native": "^4.0.0",
|
||||
"eslint-plugin-redundant-undefined": "^0.4.0",
|
||||
"eslint-plugin-relay": "^1.8.3",
|
||||
"flow-api-translator": "0.29.1",
|
||||
"flow-bin": "^0.275.0",
|
||||
"flow-api-translator": "0.28.1",
|
||||
"flow-bin": "^0.271.0",
|
||||
"glob": "^7.1.1",
|
||||
"hermes-eslint": "0.29.1",
|
||||
"hermes-transform": "0.29.1",
|
||||
"ini": "^5.0.0",
|
||||
"hermes-eslint": "0.28.1",
|
||||
"hermes-transform": "0.28.1",
|
||||
"inquirer": "^7.1.0",
|
||||
"jest": "^29.7.0",
|
||||
"jest-config": "^29.7.0",
|
||||
@@ -95,27 +91,25 @@
|
||||
"jest-snapshot": "^29.7.0",
|
||||
"markdownlint-cli2": "^0.17.2",
|
||||
"markdownlint-rule-relative-links": "^3.0.0",
|
||||
"memfs": "^4.7.7",
|
||||
"metro-babel-register": "^0.83.0",
|
||||
"metro-transform-plugins": "^0.83.0",
|
||||
"metro-babel-register": "^0.82.3",
|
||||
"metro-memory-fs": "^0.82.3",
|
||||
"metro-transform-plugins": "^0.82.3",
|
||||
"micromatch": "^4.0.4",
|
||||
"node-fetch": "^2.2.0",
|
||||
"nullthrows": "^1.1.1",
|
||||
"prettier": "2.8.8",
|
||||
"prettier-plugin-hermes-parser": "0.29.1",
|
||||
"prettier-plugin-hermes-parser": "0.28.1",
|
||||
"react": "19.1.0",
|
||||
"react-test-renderer": "19.1.0",
|
||||
"rimraf": "^3.0.2",
|
||||
"shelljs": "^0.8.5",
|
||||
"signedsource": "^1.0.0",
|
||||
"supports-color": "^7.1.0",
|
||||
"temp-dir": "^2.0.0",
|
||||
"tinybench": "^3.1.0",
|
||||
"typescript": "5.8.3",
|
||||
"typescript": "5.0.4",
|
||||
"ws": "^6.2.3"
|
||||
},
|
||||
"resolutions": {
|
||||
"eslint-plugin-react-hooks": "6.1.0-canary-12bc60f5-20250613",
|
||||
"react-is": "19.1.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@react-native/assets-registry",
|
||||
"version": "0.81.0-main",
|
||||
"version": "0.80.0-main",
|
||||
"description": "Asset support code for React Native.",
|
||||
"license": "MIT",
|
||||
"repository": {
|
||||
@@ -17,7 +17,7 @@
|
||||
],
|
||||
"bugs": "https://github.com/facebook/react-native/issues",
|
||||
"engines": {
|
||||
"node": ">= 20.19.4"
|
||||
"node": ">=18"
|
||||
},
|
||||
"files": [
|
||||
"path-support.js",
|
||||
|
||||
@@ -40,5 +40,5 @@ function getAssetByID(assetId /*: number */) /*: PackagerAsset */ {
|
||||
return assets[assetId - 1];
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @react-native/monorepo/no-commonjs-exports
|
||||
// eslint-disable-next-line lint/no-commonjs-exports
|
||||
module.exports = {registerAsset, getAssetByID};
|
||||
|
||||
@@ -4,27 +4,23 @@
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @flow strict-local
|
||||
* @format
|
||||
*/
|
||||
|
||||
import failures from '../__test_fixtures__/failures.js';
|
||||
import fixtures from '../__test_fixtures__/fixtures.js';
|
||||
import {transformSync} from '@babel/core';
|
||||
'use strict';
|
||||
|
||||
const transform = (fixture /*: string */, filename /*: string */) =>
|
||||
transformSync(fixture, {
|
||||
const failures = require('../__test_fixtures__/failures.js');
|
||||
const fixtures = require('../__test_fixtures__/fixtures.js');
|
||||
const {transform: babelTransform} = require('@babel/core');
|
||||
|
||||
const transform = (fixture, filename) =>
|
||||
babelTransform(fixture, {
|
||||
babelrc: false,
|
||||
browserslistConfigFile: false,
|
||||
cwd: '/',
|
||||
filename,
|
||||
filename: filename,
|
||||
highlightCode: false,
|
||||
plugins: [
|
||||
// $FlowFixMe[untyped-import]
|
||||
require('@babel/plugin-syntax-flow'),
|
||||
// $FlowFixMe[untyped-import]
|
||||
require('../index'),
|
||||
],
|
||||
plugins: [require('@babel/plugin-syntax-flow'), require('../index')],
|
||||
}).code;
|
||||
|
||||
describe('Babel plugin inline view configs', () => {
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @noflow
|
||||
* @format
|
||||
*/
|
||||
|
||||
@@ -24,19 +23,16 @@ try {
|
||||
} catch (e) {
|
||||
// Fallback to lib when source doesn't exit (e.g. when installed as a dev dependency)
|
||||
FlowParser =
|
||||
// $FlowIgnore[cannot-resolve-module]
|
||||
require('@react-native/codegen/lib/parsers/flow/parser').FlowParser;
|
||||
TypeScriptParser =
|
||||
// $FlowIgnore[cannot-resolve-module]
|
||||
require('@react-native/codegen/lib/parsers/typescript/parser').TypeScriptParser;
|
||||
// $FlowIgnore[cannot-resolve-module]
|
||||
RNCodegen = require('@react-native/codegen/lib/generators/RNCodegen');
|
||||
}
|
||||
|
||||
const flowParser = new FlowParser();
|
||||
const typeScriptParser = new TypeScriptParser();
|
||||
|
||||
function parseFile(filename /*: string */, code /*: string */) {
|
||||
function parseFile(filename, code) {
|
||||
if (filename.endsWith('js')) {
|
||||
return flowParser.parseString(code);
|
||||
}
|
||||
@@ -50,7 +46,7 @@ function parseFile(filename /*: string */, code /*: string */) {
|
||||
);
|
||||
}
|
||||
|
||||
function generateViewConfig(filename /*: string */, code /*: string */) {
|
||||
function generateViewConfig(filename, code) {
|
||||
const schema = parseFile(filename, code);
|
||||
|
||||
const libraryName = basename(filename).replace(
|
||||
@@ -58,8 +54,8 @@ function generateViewConfig(filename /*: string */, code /*: string */) {
|
||||
'',
|
||||
);
|
||||
return RNCodegen.generateViewConfig({
|
||||
libraryName,
|
||||
schema,
|
||||
libraryName,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@react-native/babel-plugin-codegen",
|
||||
"version": "0.81.0-main",
|
||||
"version": "0.80.0-main",
|
||||
"description": "Babel plugin to generate native module and view manager code for React Native.",
|
||||
"license": "MIT",
|
||||
"repository": {
|
||||
@@ -19,14 +19,14 @@
|
||||
],
|
||||
"bugs": "https://github.com/facebook/react-native/issues",
|
||||
"engines": {
|
||||
"node": ">= 20.19.4"
|
||||
"node": ">=18"
|
||||
},
|
||||
"files": [
|
||||
"index.js"
|
||||
],
|
||||
"dependencies": {
|
||||
"@babel/traverse": "^7.25.3",
|
||||
"@react-native/codegen": "0.81.0-main"
|
||||
"@react-native/codegen": "0.80.0-main"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.25.2"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@react-native/community-cli-plugin",
|
||||
"version": "0.81.0-main",
|
||||
"version": "0.80.0-main",
|
||||
"description": "Core CLI commands for React Native",
|
||||
"keywords": [
|
||||
"react-native",
|
||||
@@ -22,20 +22,20 @@
|
||||
"dist"
|
||||
],
|
||||
"dependencies": {
|
||||
"@react-native/dev-middleware": "0.81.0-main",
|
||||
"@react-native/dev-middleware": "0.80.0-main",
|
||||
"chalk": "^4.0.0",
|
||||
"debug": "^4.4.0",
|
||||
"invariant": "^2.2.4",
|
||||
"metro": "^0.83.0",
|
||||
"metro-config": "^0.83.0",
|
||||
"metro-core": "^0.83.0",
|
||||
"metro": "^0.82.3",
|
||||
"metro-config": "^0.82.3",
|
||||
"metro-core": "^0.82.3",
|
||||
"semver": "^7.1.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"metro-resolver": "^0.83.0"
|
||||
"metro-resolver": "^0.82.3"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@react-native-community/cli": "*",
|
||||
"@react-native/metro-config": "*"
|
||||
"@react-native-community/cli": "*"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@react-native-community/cli": {
|
||||
@@ -43,6 +43,6 @@
|
||||
}
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 20.19.4"
|
||||
"node": ">=18"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,11 +4,10 @@
|
||||
* This source code is licensed under the MIT license found in the
|
||||
* LICENSE file in the root directory of this source tree.
|
||||
*
|
||||
* @flow strict-local
|
||||
* @format
|
||||
*/
|
||||
|
||||
function sign(source: string): string {
|
||||
function sign(source) {
|
||||
return source;
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
* @format
|
||||
*/
|
||||
|
||||
import type {AssetData} from 'metro';
|
||||
import type {AssetData} from 'metro/src/Assets';
|
||||
|
||||
import assetPathUtils from './assetPathUtils';
|
||||
import fs from 'fs';
|
||||
|
||||
@@ -9,16 +9,18 @@
|
||||
*/
|
||||
|
||||
import type {Config} from '@react-native-community/cli-types';
|
||||
import type {RunBuildOptions} from 'metro';
|
||||
import type {ConfigT} from 'metro-config';
|
||||
import type {RequestOptions} from 'metro/src/shared/types.flow';
|
||||
|
||||
import loadMetroConfig from '../../utils/loadMetroConfig';
|
||||
import parseKeyValueParamArray from '../../utils/parseKeyValueParamArray';
|
||||
import saveAssets from './saveAssets';
|
||||
import chalk from 'chalk';
|
||||
import {promises as fs} from 'fs';
|
||||
import {runBuild} from 'metro';
|
||||
import Server from 'metro/src/Server';
|
||||
import metroBundle from 'metro/src/shared/output/bundle';
|
||||
import metroRamBundle from 'metro/src/shared/output/RamBundle';
|
||||
import path from 'path';
|
||||
import {styleText} from 'util';
|
||||
|
||||
export type BundleCommandArgs = {
|
||||
assetsDest?: string,
|
||||
@@ -38,7 +40,7 @@ export type BundleCommandArgs = {
|
||||
sourcemapSourcesRoot?: string,
|
||||
sourcemapUseAbsolutePath: boolean,
|
||||
verbose: boolean,
|
||||
unstableTransformProfile: 'hermes-stable' | 'hermes-canary' | 'default',
|
||||
unstableTransformProfile: string,
|
||||
indexedRamBundle?: boolean,
|
||||
resolverOption?: Array<string>,
|
||||
};
|
||||
@@ -47,7 +49,7 @@ async function buildBundle(
|
||||
_argv: Array<string>,
|
||||
ctx: Config,
|
||||
args: BundleCommandArgs,
|
||||
bundleImpl?: RunBuildOptions['output'],
|
||||
bundleImpl: typeof metroBundle | typeof metroRamBundle = metroBundle,
|
||||
): Promise<void> {
|
||||
const config = await loadMetroConfig(ctx, {
|
||||
maxWorkers: args.maxWorkers,
|
||||
@@ -61,7 +63,7 @@ async function buildBundle(
|
||||
async function buildBundleWithConfig(
|
||||
args: BundleCommandArgs,
|
||||
config: ConfigT,
|
||||
bundleImpl?: RunBuildOptions['output'],
|
||||
bundleImpl: typeof metroBundle | typeof metroRamBundle = metroBundle,
|
||||
): Promise<void> {
|
||||
const customResolverOptions = parseKeyValueParamArray(
|
||||
args.resolverOption ?? [],
|
||||
@@ -69,14 +71,14 @@ async function buildBundleWithConfig(
|
||||
|
||||
if (config.resolver.platforms.indexOf(args.platform) === -1) {
|
||||
console.error(
|
||||
`${styleText('red', 'error')}: Invalid platform ${
|
||||
args.platform ? `"${styleText('bold', args.platform)}" ` : ''
|
||||
`${chalk.red('error')}: Invalid platform ${
|
||||
args.platform ? `"${chalk.bold(args.platform)}" ` : ''
|
||||
}selected.`,
|
||||
);
|
||||
|
||||
console.info(
|
||||
`Available platforms are: ${config.resolver.platforms
|
||||
.map(x => `"${styleText('bold', x)}"`)
|
||||
.map(x => `"${chalk.bold(x)}"`)
|
||||
.join(
|
||||
', ',
|
||||
)}. If you are trying to bundle for an out-of-tree platform, it may not be installed.`,
|
||||
@@ -94,48 +96,52 @@ async function buildBundleWithConfig(
|
||||
sourceMapUrl = path.basename(sourceMapUrl);
|
||||
}
|
||||
|
||||
const runBuildOptions: RunBuildOptions = {
|
||||
assets: args.assetsDest != null,
|
||||
bundleOut: args.bundleOutput,
|
||||
customResolverOptions,
|
||||
dev: args.dev,
|
||||
entry: args.entryFile,
|
||||
minify: args.minify !== undefined ? args.minify : !args.dev,
|
||||
output: bundleImpl,
|
||||
platform: args.platform,
|
||||
sourceMap: args.sourcemapOutput != null,
|
||||
sourceMapOut: args.sourcemapOutput,
|
||||
// $FlowIgnore[prop-missing]
|
||||
const requestOpts: RequestOptions & {...} = {
|
||||
entryFile: args.entryFile,
|
||||
sourceMapUrl,
|
||||
dev: args.dev,
|
||||
minify: args.minify !== undefined ? args.minify : !args.dev,
|
||||
platform: args.platform,
|
||||
// $FlowFixMe[incompatible-type] Remove suppression after Metro 0.82.3
|
||||
unstable_transformProfile: args.unstableTransformProfile,
|
||||
customResolverOptions,
|
||||
};
|
||||
const server = new Server(config);
|
||||
|
||||
// Ensure destination directory exists before running the build
|
||||
await fs.mkdir(path.dirname(args.bundleOutput), {
|
||||
recursive: true,
|
||||
mode: 0o755,
|
||||
});
|
||||
try {
|
||||
const bundle = await bundleImpl.build(server, requestOpts);
|
||||
|
||||
const result = await runBuild(config, runBuildOptions);
|
||||
// Ensure destination directory exists before saving the bundle
|
||||
await fs.mkdir(path.dirname(args.bundleOutput), {
|
||||
recursive: true,
|
||||
mode: 0o755,
|
||||
});
|
||||
|
||||
if (args.assetsDest == null) {
|
||||
console.warn('Warning: Assets destination folder is not set, skipping...');
|
||||
return;
|
||||
// $FlowIgnore[class-object-subtyping]
|
||||
// $FlowIgnore[incompatible-call]
|
||||
// $FlowIgnore[prop-missing]
|
||||
// $FlowIgnore[incompatible-exact]
|
||||
await bundleImpl.save(bundle, args, console.info);
|
||||
|
||||
// Save the assets of the bundle
|
||||
// $FlowFixMe[prop-missing] Remove suppression after Metro 0.82.3
|
||||
const outputAssets = await server.getAssets({
|
||||
...Server.DEFAULT_BUNDLE_OPTIONS,
|
||||
...requestOpts,
|
||||
bundleType: 'todo',
|
||||
});
|
||||
|
||||
// When we're done saving bundle output and the assets, we're done.
|
||||
return await saveAssets(
|
||||
outputAssets,
|
||||
args.platform,
|
||||
args.assetsDest,
|
||||
args.assetCatalogDest,
|
||||
);
|
||||
} finally {
|
||||
await server.end();
|
||||
}
|
||||
|
||||
// Save the assets of the bundle
|
||||
if (result.assets == null) {
|
||||
throw new Error("Assets missing from Metro's runBuild result");
|
||||
}
|
||||
|
||||
const outputAssets = result.assets;
|
||||
|
||||
// When we're done saving bundle output and the assets, we're done.
|
||||
await saveAssets(
|
||||
outputAssets,
|
||||
args.platform,
|
||||
args.assetsDest,
|
||||
args.assetCatalogDest,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
* @format
|
||||
*/
|
||||
|
||||
import type {AssetData} from 'metro';
|
||||
import type {AssetData} from 'metro/src/Assets';
|
||||
|
||||
import assetPathUtils from './assetPathUtils';
|
||||
import fs from 'fs';
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
* @format
|
||||
*/
|
||||
|
||||
import type {AssetData} from 'metro';
|
||||
import type {AssetData} from 'metro/src/Assets';
|
||||
|
||||
import {
|
||||
cleanAssetCatalog,
|
||||
@@ -20,9 +20,9 @@ import createKeepFileAsync from './createKeepFileAsync';
|
||||
import filterPlatformAssetScales from './filterPlatformAssetScales';
|
||||
import getAssetDestPathAndroid from './getAssetDestPathAndroid';
|
||||
import getAssetDestPathIOS from './getAssetDestPathIOS';
|
||||
import chalk from 'chalk';
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
import {styleText} from 'util';
|
||||
|
||||
type CopiedFiles = {
|
||||
[src: string]: string,
|
||||
@@ -65,7 +65,7 @@ async function saveAssets(
|
||||
const catalogDir = path.join(assetCatalogDest, 'RNAssets.xcassets');
|
||||
if (!fs.existsSync(catalogDir)) {
|
||||
console.error(
|
||||
`${styleText('red', 'error')}: Could not find asset catalog 'RNAssets.xcassets' in ${assetCatalogDest}. Make sure to create it if it does not exist.`,
|
||||
`${chalk.red('error')}: Could not find asset catalog 'RNAssets.xcassets' in ${assetCatalogDest}. Make sure to create it if it does not exist.`,
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
import type {TerminalReporter} from 'metro';
|
||||
|
||||
import {styleText} from 'util';
|
||||
import chalk from 'chalk';
|
||||
|
||||
type PageDescription = $ReadOnly<{
|
||||
id: string,
|
||||
@@ -92,6 +92,7 @@ export default class OpenDebuggerKeyboardHandler {
|
||||
this.#clearTerminalMenu();
|
||||
} else if (targets.length === 1) {
|
||||
const target = targets[0];
|
||||
// eslint-disable-next-line no-void
|
||||
void this.#tryOpenDebuggerForTarget(target);
|
||||
} else {
|
||||
this.#targetsShownForSelection = targets;
|
||||
@@ -108,7 +109,7 @@ export default class OpenDebuggerKeyboardHandler {
|
||||
.slice(0, 9)
|
||||
.map(
|
||||
({title}, i) =>
|
||||
`${styleText(['white', 'inverse'], ` ${i + 1} `)} - "${title}"`,
|
||||
`${chalk.white.inverse(` ${i + 1} `)} - "${title}"`,
|
||||
)
|
||||
.join('\n ')}`,
|
||||
);
|
||||
@@ -134,6 +135,7 @@ export default class OpenDebuggerKeyboardHandler {
|
||||
targetIndex < this.#targetsShownForSelection.length
|
||||
) {
|
||||
const target = this.#targetsShownForSelection[targetIndex];
|
||||
// eslint-disable-next-line no-void
|
||||
void this.#tryOpenDebuggerForTarget(target);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -11,10 +11,10 @@
|
||||
import type {TerminalReporter} from 'metro';
|
||||
|
||||
import OpenDebuggerKeyboardHandler from './OpenDebuggerKeyboardHandler';
|
||||
import chalk from 'chalk';
|
||||
import invariant from 'invariant';
|
||||
import readline from 'readline';
|
||||
import {ReadStream} from 'tty';
|
||||
import {styleText} from 'util';
|
||||
|
||||
const CTRL_C = '\u0003';
|
||||
const CTRL_D = '\u0004';
|
||||
@@ -95,6 +95,7 @@ export default function attachKeyHandlers({
|
||||
messageSocket.broadcast('devMenu', null);
|
||||
break;
|
||||
case 'j':
|
||||
// eslint-disable-next-line no-void
|
||||
void openDebuggerKeyboardHandler.handleOpenDebugger();
|
||||
break;
|
||||
case CTRL_C:
|
||||
@@ -117,9 +118,9 @@ export default function attachKeyHandlers({
|
||||
level: 'info',
|
||||
data: `Key commands available:
|
||||
|
||||
${styleText(['bold', 'inverse'], ' r ')} - reload app(s)
|
||||
${styleText(['bold', 'inverse'], ' d ')} - open Dev Menu
|
||||
${styleText(['bold', 'inverse'], ' j ')} - open DevTools
|
||||
${chalk.bold.inverse(' r ')} - reload app(s)
|
||||
${chalk.bold.inverse(' d ')} - open Dev Menu
|
||||
${chalk.bold.inverse(' j ')} - open DevTools
|
||||
`,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
*/
|
||||
|
||||
import type {Server} from 'connect';
|
||||
import type {TerminalReportableEvent} from 'metro';
|
||||
import type {TerminalReportableEvent} from 'metro/src/lib/TerminalReporter';
|
||||
|
||||
import {typeof createDevServerMiddleware as CreateDevServerMiddleware} from '@react-native-community/cli-server-api';
|
||||
|
||||
|
||||
@@ -9,7 +9,9 @@
|
||||
*/
|
||||
|
||||
import type {Config} from '@react-native-community/cli-types';
|
||||
import type {Reporter, TerminalReportableEvent, TerminalReporter} from 'metro';
|
||||
import type {TerminalReporter} from 'metro';
|
||||
import type {Reporter} from 'metro/src/lib/reporting';
|
||||
import type {TerminalReportableEvent} from 'metro/src/lib/TerminalReporter';
|
||||
|
||||
import createDevMiddlewareLogger from '../../utils/createDevMiddlewareLogger';
|
||||
import isDevServerRunning from '../../utils/isDevServerRunning';
|
||||
@@ -18,11 +20,11 @@ import * as version from '../../utils/version';
|
||||
import attachKeyHandlers from './attachKeyHandlers';
|
||||
import {createDevServerMiddleware} from './middleware';
|
||||
import {createDevMiddleware} from '@react-native/dev-middleware';
|
||||
import chalk from 'chalk';
|
||||
import Metro from 'metro';
|
||||
import {Terminal} from 'metro-core';
|
||||
import path from 'path';
|
||||
import url from 'url';
|
||||
import {styleText} from 'util';
|
||||
|
||||
export type StartCommandArgs = {
|
||||
assetPlugins?: string[],
|
||||
@@ -68,10 +70,7 @@ async function runServer(
|
||||
const devServerUrl = url.format({protocol, hostname, port});
|
||||
|
||||
console.info(
|
||||
styleText(
|
||||
'blue',
|
||||
`\nWelcome to React Native v${cliConfig.reactNativeVersion}`,
|
||||
),
|
||||
chalk.blue(`\nWelcome to React Native v${cliConfig.reactNativeVersion}`),
|
||||
);
|
||||
|
||||
const serverStatus = await isDevServerRunning(devServerUrl, projectRoot);
|
||||
@@ -83,7 +82,7 @@ async function runServer(
|
||||
return;
|
||||
} else if (serverStatus === 'port_taken') {
|
||||
console.error(
|
||||
`${styleText('red', 'error')}: Another process is running on port ${port}. Please terminate this ` +
|
||||
`${chalk.red('error')}: Another process is running on port ${port}. Please terminate this ` +
|
||||
'process and try again, or use another port with "--port".',
|
||||
);
|
||||
return;
|
||||
@@ -134,7 +133,7 @@ async function runServer(
|
||||
terminalReporter.update({
|
||||
type: 'unstable_server_log',
|
||||
level: 'info',
|
||||
data: `Dev server ready. ${styleText('dim', 'Press Ctrl+C to exit.')}`,
|
||||
data: `Dev server ready. ${chalk.dim('Press Ctrl+C to exit.')}`,
|
||||
});
|
||||
attachKeyHandlers({
|
||||
devServerUrl,
|
||||
@@ -147,7 +146,7 @@ async function runServer(
|
||||
// $FlowIgnore[cannot-write] Assigning to readonly property
|
||||
metroConfig.reporter = reporter;
|
||||
|
||||
await Metro.runServer(metroConfig, {
|
||||
const serverInstance = await Metro.runServer(metroConfig, {
|
||||
host: args.host,
|
||||
secure: args.https,
|
||||
secureCert: args.cert,
|
||||
@@ -161,6 +160,18 @@ async function runServer(
|
||||
|
||||
reportEvent = eventsSocketEndpoint.reportEvent;
|
||||
|
||||
// In Node 8, the default keep-alive for an HTTP connection is 5 seconds. In
|
||||
// early versions of Node 8, this was implemented in a buggy way which caused
|
||||
// some HTTP responses (like those containing large JS bundles) to be
|
||||
// terminated early.
|
||||
//
|
||||
// As a workaround, arbitrarily increase the keep-alive from 5 to 30 seconds,
|
||||
// which should be enough to send even the largest of JS bundles.
|
||||
//
|
||||
// For more info: https://github.com/nodejs/node/issues/13391
|
||||
//
|
||||
serverInstance.keepAliveTimeout = 30000;
|
||||
|
||||
await version.logIfUpdateAvailable(cliConfig, terminalReporter);
|
||||
}
|
||||
|
||||
@@ -168,7 +179,7 @@ function getReporterImpl(
|
||||
customLogReporterPath?: string,
|
||||
): Class<TerminalReporter> {
|
||||
if (customLogReporterPath == null) {
|
||||
return require('metro').TerminalReporter;
|
||||
return require('metro/src/lib/TerminalReporter');
|
||||
}
|
||||
try {
|
||||
// First we let require resolve it, so we can require packages in node_modules
|
||||
|
||||
@@ -13,7 +13,7 @@ export type * from './index.flow';
|
||||
*/
|
||||
|
||||
if (!process.env.BUILD_EXCLUDE_BABEL_REGISTER) {
|
||||
require('../../../scripts/shared/babelRegister').registerForMonorepo();
|
||||
require('../../../scripts/babel-register').registerForMonorepo();
|
||||
}
|
||||
|
||||
module.exports = require('./index.flow');
|
||||
|
||||
@@ -13,7 +13,7 @@ import type {ConfigT, InputConfigT, YargArguments} from 'metro-config';
|
||||
|
||||
import {CLIError} from './errors';
|
||||
import {reactNativePlatformResolver} from './metroPlatformResolver';
|
||||
import {loadConfig, resolveConfig} from 'metro-config';
|
||||
import {loadConfig, mergeConfig, resolveConfig} from 'metro-config';
|
||||
import path from 'path';
|
||||
|
||||
const debug = require('debug')('ReactNative:CommunityCliPlugin');
|
||||
@@ -30,7 +30,7 @@ export type ConfigLoadingContext = $ReadOnly<{
|
||||
/**
|
||||
* Get the config options to override based on RN CLI inputs.
|
||||
*/
|
||||
function getCommunityCliDefaultConfig(
|
||||
function getOverrideConfig(
|
||||
ctx: ConfigLoadingContext,
|
||||
config: ConfigT,
|
||||
): InputConfigT {
|
||||
@@ -85,31 +85,6 @@ export default async function loadMetroConfig(
|
||||
ctx: ConfigLoadingContext,
|
||||
options: YargArguments = {},
|
||||
): Promise<ConfigT> {
|
||||
let RNMetroConfig = null;
|
||||
try {
|
||||
RNMetroConfig = require('@react-native/metro-config');
|
||||
} catch (e) {
|
||||
throw new Error(
|
||||
"Cannot resolve `@react-native/metro-config`. Ensure it is listed in your project's `devDependencies`.",
|
||||
);
|
||||
}
|
||||
|
||||
// Get the RN defaults before our customisations
|
||||
const defaultConfig = RNMetroConfig.getDefaultConfig(ctx.root);
|
||||
// Unflag the config as being loaded - it must be loaded again in userland.
|
||||
global.__REACT_NATIVE_METRO_CONFIG_LOADED = false;
|
||||
|
||||
// Add our defaults to `@react-native/metro-config` before the user config
|
||||
// loads them.
|
||||
if (typeof RNMetroConfig.setFrameworkDefaults !== 'function') {
|
||||
throw new Error(
|
||||
'`@react-native/metro-config` does not have the expected API. Ensure it matches your React Native version.',
|
||||
);
|
||||
}
|
||||
RNMetroConfig.setFrameworkDefaults(
|
||||
getCommunityCliDefaultConfig(ctx, defaultConfig),
|
||||
);
|
||||
|
||||
const cwd = ctx.root;
|
||||
const projectConfig = await resolveConfig(options.config, cwd);
|
||||
|
||||
@@ -133,8 +108,13 @@ This warning will be removed in future (https://github.com/facebook/metro/issues
|
||||
console.warn(line);
|
||||
}
|
||||
}
|
||||
return loadConfig({
|
||||
|
||||
const config = await loadConfig({
|
||||
cwd,
|
||||
...options,
|
||||
});
|
||||
|
||||
const overrideConfig = getOverrideConfig(ctx, config);
|
||||
|
||||
return mergeConfig(config, overrideConfig);
|
||||
}
|
||||
|
||||
@@ -11,8 +11,8 @@
|
||||
import type {Config} from '@react-native-community/cli-types';
|
||||
import type {TerminalReporter} from 'metro';
|
||||
|
||||
import chalk from 'chalk';
|
||||
import semver from 'semver';
|
||||
import {styleText} from 'util';
|
||||
|
||||
const debug = require('debug')('ReactNative:CommunityCliPlugin');
|
||||
|
||||
@@ -81,8 +81,8 @@ export async function logIfUpdateAvailable(
|
||||
type: 'unstable_server_log',
|
||||
level: 'info',
|
||||
data: `React Native v${newVersion.stable} is now available (your project is running on v${currentVersion}).
|
||||
Changelog: ${styleText(['dim', 'underline'], newVersion?.changelogUrl ?? 'none')}
|
||||
Diff: ${styleText(['dim', 'underline'], newVersion?.diffUrl ?? 'none')}
|
||||
Changelog: ${chalk.dim.underline(newVersion?.changelogUrl ?? 'none')}
|
||||
Diff: ${chalk.dim.underline(newVersion?.diffUrl ?? 'none')}
|
||||
`,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@react-native/core-cli-utils",
|
||||
"version": "0.81.0-main",
|
||||
"version": "0.80.0-main",
|
||||
"description": "React Native CLI library for Frameworks to build on",
|
||||
"license": "MIT",
|
||||
"main": "./src/index.flow.js",
|
||||
@@ -21,7 +21,7 @@
|
||||
],
|
||||
"bugs": "https://github.com/facebook/react-native/issues",
|
||||
"engines": {
|
||||
"node": ">= 20.19.4"
|
||||
"node": ">=18"
|
||||
},
|
||||
"files": [
|
||||
"dist"
|
||||
|
||||
@@ -13,7 +13,7 @@ export type * from './index.flow';
|
||||
*/
|
||||
|
||||
if (process.env.BUILD_EXCLUDE_BABEL_REGISTER == null) {
|
||||
require('../../../scripts/shared/babelRegister').registerForMonorepo();
|
||||
require('../../../scripts/babel-register').registerForMonorepo();
|
||||
}
|
||||
|
||||
module.exports = require('./index.flow');
|
||||
|
||||
@@ -76,8 +76,9 @@ function getNodePackagePath(packageName: string): string {
|
||||
}
|
||||
|
||||
function metro(...args: $ReadOnlyArray<string>): ExecaPromise {
|
||||
log(`🚇 metro ${args.join(' ')} `);
|
||||
return execa('npx', ['--offline', 'metro', ...args]);
|
||||
const metroPath = getNodePackagePath(path.join('metro', 'src', 'cli.js'));
|
||||
log(`🚇 ${metroPath} ${args.join(' ')} `);
|
||||
return execa('node', [metroPath, ...args]);
|
||||
}
|
||||
|
||||
export const tasks = {
|
||||
|
||||
@@ -125,7 +125,7 @@ export const tasks = {
|
||||
}),
|
||||
),
|
||||
installDependencies: task(FIFTH, 'Install CocoaPods dependencies', () => {
|
||||
const env: {[string]: string | void} = {
|
||||
const env = {
|
||||
RCT_NEW_ARCH_ENABLED: options.newArchitecture ? '1' : '0',
|
||||
USE_FRAMEWORKS: options.frameworks,
|
||||
USE_HERMES: options.hermes ? '1' : '0',
|
||||
|
||||
@@ -13,7 +13,7 @@ export type * from './version.flow';
|
||||
*/
|
||||
|
||||
if (process.env.BUILD_EXCLUDE_BABEL_REGISTER == null) {
|
||||
require('../../../../scripts/shared/babelRegister').registerForMonorepo();
|
||||
require('../../../../scripts/babel-register').registerForMonorepo();
|
||||
}
|
||||
|
||||
module.exports = require('./version.flow');
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
@generated SignedSource<<e2d97b04634bf3b566f33d455f38658f>>
|
||||
Git revision: 8dc0d5b365e6b4600b78e5a7381aa861d8c1c81e
|
||||
@generated SignedSource<<ba4f37938152dbd5e51f71b66f617759>>
|
||||
Git revision: f5506e62112464952f4ca3f19878a18cdebc7d77
|
||||
Built with --nohooks: false
|
||||
Is local checkout: false
|
||||
Remote URL: https://github.com/facebook/react-native-devtools-frontend
|
||||
|
||||
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none"><path fill="#000" d="M4.062 17 3 15.938 5.438 13.5H4V12h4v4H6.5v-1.438zm11.876 0L13.5 14.562V16H12v-4h4v1.5h-1.438L17 15.938zM4 8V6.5h1.438L3 4.062 4.062 3 6.5 5.438V4H8v4zm8 0V4h1.5v1.438L15.938 3 17 4.062 14.562 6.5H16V8z"/></svg>
|
||||
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M4.062 17 3 15.938 5.438 13.5H4V12h4v4H6.5v-1.438L4.062 17Zm11.876 0L13.5 14.562V16H12v-4h4v1.5h-1.438L17 15.938 15.938 17ZM4 8V6.5h1.438L3 4.062 4.062 3 6.5 5.438V4H8v4H4Zm8 0V4h1.5v1.438L15.938 3 17 4.062 14.562 6.5H16V8h-4Z" fill="#000"/></svg>
|
||||
|
Before Width: | Height: | Size: 307 B After Width: | Height: | Size: 331 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none"><path fill="#000" d="m10 18-3.5-3.5 1.062-1.062 1.688 1.687V10.75H4.875l1.687 1.688L5.5 13.5 2 10l3.5-3.5 1.062 1.062L4.875 9.25H9.25V4.875L7.562 6.562 6.5 5.5 10 2l3.5 3.5-1.062 1.062-1.688-1.687V9.25h4.375l-1.687-1.688L14.5 6.5 18 10l-3.5 3.5-1.062-1.062 1.687-1.688H10.75v4.375l1.688-1.687L13.5 14.5z"/></svg>
|
||||
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="m10 18-3.5-3.5 1.062-1.062 1.688 1.687V10.75H4.875l1.687 1.688L5.5 13.5 2 10l3.5-3.5 1.062 1.062L4.875 9.25H9.25V4.875L7.562 6.562 6.5 5.5 10 2l3.5 3.5-1.062 1.062-1.688-1.687V9.25h4.375l-1.687-1.688L14.5 6.5 18 10l-3.5 3.5-1.062-1.062 1.687-1.688H10.75v4.375l1.688-1.687L13.5 14.5 10 18Z" fill="#000"/></svg>
|
||||
|
Before Width: | Height: | Size: 387 B After Width: | Height: | Size: 393 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none"><path fill="#000" d="m8 16.25-1.062-1.062 1.291-1.292q-2.73-.292-4.479-1.396T2 10q0-1.667 2.333-2.833T10 6t5.667 1.167Q18 8.333 18 10q0 1.25-1.365 2.26-1.364 1.011-3.635 1.448v-1.541q1.5-.356 2.5-.969 1-.615 1-1.198 0-.958-2.021-1.729T10 7.5q-2.438 0-4.469.781Q3.5 9.061 3.5 10q0 .708 1.344 1.417 1.344.708 3.135.937l-1.041-1.042L8 10.25l3 3z"/></svg>
|
||||
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="m8 16.25-1.062-1.062 1.291-1.292c-1.82-.195-3.312-.66-4.479-1.396C2.583 11.764 2 10.93 2 10c0-1.111.778-2.056 2.333-2.833C5.889 6.389 7.778 6 10 6s4.111.389 5.667 1.167C17.222 7.944 18 8.889 18 10c0 .833-.455 1.587-1.365 2.26-.91.674-2.121 1.157-3.635 1.448v-1.541c1-.237 1.833-.56 2.5-.969.667-.41 1-.81 1-1.198 0-.639-.674-1.215-2.021-1.729S11.639 7.5 10 7.5c-1.625 0-3.115.26-4.469.781C4.177 8.801 3.5 9.375 3.5 10c0 .472.448.944 1.344 1.417.896.472 1.941.784 3.135.937l-1.041-1.042L8 10.25l3 3-3 3Z" fill="#000"/></svg>
|
||||
|
Before Width: | Height: | Size: 426 B After Width: | Height: | Size: 607 B |
@@ -1,4 +1,4 @@
|
||||
// Copyright 2025 The Chromium Authors. All rights reserved.
|
||||
// Copyright 2024 The Chromium Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
const sheet = new CSSStyleSheet();
|
||||
@@ -25,12 +25,12 @@ style.setProperty('--image-file-react_native/welcomeIcon', 'url(\"' + new URL('.
|
||||
style.setProperty('--image-file-toolbarResizerVertical', 'url(\"' + new URL('./toolbarResizerVertical.png', import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-touchCursor_2x', 'url(\"' + new URL('./touchCursor_2x.png', import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-touchCursor', 'url(\"' + new URL('./touchCursor.png', import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-whatsnew', 'url(\"' + new URL('./whatsnew.avif', import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-3d-center', 'url(\"' + new URL(new URL('3d-center.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-3d-pan', 'url(\"' + new URL(new URL('3d-pan.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-3d-rotate', 'url(\"' + new URL(new URL('3d-rotate.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-accelerometer-back', 'url(\"' + new URL(new URL('accelerometer-back.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-accelerometer-front', 'url(\"' + new URL(new URL('accelerometer-front.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-account-tree', 'url(\"' + new URL(new URL('account-tree.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-align-content-center', 'url(\"' + new URL(new URL('align-content-center.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-align-content-end', 'url(\"' + new URL(new URL('align-content-end.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-align-content-space-around', 'url(\"' + new URL(new URL('align-content-space-around.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
@@ -47,15 +47,11 @@ style.setProperty('--image-file-align-self-center', 'url(\"' + new URL(new URL('
|
||||
style.setProperty('--image-file-align-self-end', 'url(\"' + new URL(new URL('align-self-end.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-align-self-start', 'url(\"' + new URL(new URL('align-self-start.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-align-self-stretch', 'url(\"' + new URL(new URL('align-self-stretch.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-animation', 'url(\"' + new URL(new URL('animation.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-arrow-back', 'url(\"' + new URL(new URL('arrow-back.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-arrow-collapse', 'url(\"' + new URL(new URL('arrow-collapse.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-arrow-down', 'url(\"' + new URL(new URL('arrow-down.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-arrow-drop-down-dark', 'url(\"' + new URL(new URL('arrow-drop-down-dark.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-arrow-drop-down-light', 'url(\"' + new URL(new URL('arrow-drop-down-light.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-arrow-drop-down', 'url(\"' + new URL(new URL('arrow-drop-down.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-arrow-forward', 'url(\"' + new URL(new URL('arrow-forward.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-arrow-right-circle', 'url(\"' + new URL(new URL('arrow-right-circle.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-arrow-up-down-circle', 'url(\"' + new URL(new URL('arrow-up-down-circle.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-arrow-up-down', 'url(\"' + new URL(new URL('arrow-up-down.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-arrow-up', 'url(\"' + new URL(new URL('arrow-up.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
@@ -68,14 +64,10 @@ style.setProperty('--image-file-brackets', 'url(\"' + new URL(new URL('brackets.
|
||||
style.setProperty('--image-file-breakpoint-circle', 'url(\"' + new URL(new URL('breakpoint-circle.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-breakpoint-crossed-filled', 'url(\"' + new URL(new URL('breakpoint-crossed-filled.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-breakpoint-crossed', 'url(\"' + new URL(new URL('breakpoint-crossed.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-brush-2', 'url(\"' + new URL(new URL('brush-2.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-brush-filled', 'url(\"' + new URL(new URL('brush-filled.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-brush', 'url(\"' + new URL(new URL('brush.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-bug', 'url(\"' + new URL(new URL('bug.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-bundle', 'url(\"' + new URL(new URL('bundle.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-button-magic', 'url(\"' + new URL(new URL('button-magic.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-calendar-today', 'url(\"' + new URL(new URL('calendar-today.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-center-focus-weak', 'url(\"' + new URL(new URL('center-focus-weak.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-check-circle', 'url(\"' + new URL(new URL('check-circle.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-check-double', 'url(\"' + new URL(new URL('check-double.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-checker', 'url(\"' + new URL(new URL('checker.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
@@ -86,7 +78,6 @@ style.setProperty('--image-file-chevron-left-dot', 'url(\"' + new URL(new URL('c
|
||||
style.setProperty('--image-file-chevron-left', 'url(\"' + new URL(new URL('chevron-left.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-chevron-right', 'url(\"' + new URL(new URL('chevron-right.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-chevron-up', 'url(\"' + new URL(new URL('chevron-up.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-class', 'url(\"' + new URL(new URL('class.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-clear-list', 'url(\"' + new URL(new URL('clear-list.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-clear', 'url(\"' + new URL(new URL('clear.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-cloud', 'url(\"' + new URL(new URL('cloud.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
@@ -95,13 +86,10 @@ style.setProperty('--image-file-code', 'url(\"' + new URL(new URL('code.svg', im
|
||||
style.setProperty('--image-file-colon', 'url(\"' + new URL(new URL('colon.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-color-picker-filled', 'url(\"' + new URL(new URL('color-picker-filled.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-color-picker', 'url(\"' + new URL(new URL('color-picker.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-compress', 'url(\"' + new URL(new URL('compress.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-console-conditional-breakpoint', 'url(\"' + new URL(new URL('console-conditional-breakpoint.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-console-logpoint', 'url(\"' + new URL(new URL('console-logpoint.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-cookie', 'url(\"' + new URL(new URL('cookie.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-cookie_off', 'url(\"' + new URL(new URL('cookie_off.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-copy', 'url(\"' + new URL(new URL('copy.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-corporate-fare', 'url(\"' + new URL(new URL('corporate-fare.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-credit-card', 'url(\"' + new URL(new URL('credit-card.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-cross-circle-filled', 'url(\"' + new URL(new URL('cross-circle-filled.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-cross-circle', 'url(\"' + new URL(new URL('cross-circle.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
@@ -111,17 +99,13 @@ style.setProperty('--image-file-database', 'url(\"' + new URL(new URL('database.
|
||||
style.setProperty('--image-file-deployed', 'url(\"' + new URL(new URL('deployed.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-device-fold', 'url(\"' + new URL(new URL('device-fold.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-devices', 'url(\"' + new URL(new URL('devices.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-devtools-thumbnail', 'url(\"' + new URL(new URL('devtools-thumbnail.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-devtools-tips', 'url(\"' + new URL(new URL('devtools-tips.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-devtools', 'url(\"' + new URL(new URL('devtools.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-difference', 'url(\"' + new URL(new URL('difference.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-dock-bottom', 'url(\"' + new URL(new URL('dock-bottom.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-dock-left', 'url(\"' + new URL(new URL('dock-left.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-dock-right', 'url(\"' + new URL(new URL('dock-right.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-dock-window', 'url(\"' + new URL(new URL('dock-window.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-document', 'url(\"' + new URL(new URL('document.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-dog-paw', 'url(\"' + new URL(new URL('dog-paw.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-domain', 'url(\"' + new URL(new URL('domain.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-dots-horizontal', 'url(\"' + new URL(new URL('dots-horizontal.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-dots-vertical', 'url(\"' + new URL(new URL('dots-vertical.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-download', 'url(\"' + new URL(new URL('download.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
@@ -161,17 +145,10 @@ style.setProperty('--image-file-frame', 'url(\"' + new URL(new URL('frame.svg',
|
||||
style.setProperty('--image-file-gear-filled', 'url(\"' + new URL(new URL('gear-filled.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-gear', 'url(\"' + new URL(new URL('gear.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-gears', 'url(\"' + new URL(new URL('gears.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-global', 'url(\"' + new URL(new URL('global.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-google', 'url(\"' + new URL(new URL('google.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-goto-filled', 'url(\"' + new URL(new URL('goto-filled.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-grid-on', 'url(\"' + new URL(new URL('grid-on.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-group', 'url(\"' + new URL(new URL('group.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-heap-snapshot', 'url(\"' + new URL(new URL('heap-snapshot.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-heap-snapshots', 'url(\"' + new URL(new URL('heap-snapshots.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-help', 'url(\"' + new URL(new URL('help.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-history', 'url(\"' + new URL(new URL('history.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-home', 'url(\"' + new URL(new URL('home.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-hover', 'url(\"' + new URL(new URL('hover.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-iframe-crossed', 'url(\"' + new URL(new URL('iframe-crossed.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-iframe', 'url(\"' + new URL(new URL('iframe.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-import', 'url(\"' + new URL(new URL('import.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
@@ -193,17 +170,14 @@ style.setProperty('--image-file-justify-items-end', 'url(\"' + new URL(new URL('
|
||||
style.setProperty('--image-file-justify-items-start', 'url(\"' + new URL(new URL('justify-items-start.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-justify-items-stretch', 'url(\"' + new URL(new URL('justify-items-stretch.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-keyboard-arrow-right', 'url(\"' + new URL(new URL('keyboard-arrow-right.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-keyboard-full', 'url(\"' + new URL(new URL('keyboard-full.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-keyboard-pen', 'url(\"' + new URL(new URL('keyboard-pen.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-keyboard', 'url(\"' + new URL(new URL('keyboard.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-label', 'url(\"' + new URL(new URL('label.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-large-arrow-right-filled', 'url(\"' + new URL(new URL('large-arrow-right-filled.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-layers-filled', 'url(\"' + new URL(new URL('layers-filled.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-layers', 'url(\"' + new URL(new URL('layers.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-left-panel-close', 'url(\"' + new URL(new URL('left-panel-close.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-left-panel-open', 'url(\"' + new URL(new URL('left-panel-open.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-lightbulb-spark', 'url(\"' + new URL(new URL('lightbulb-spark.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-lightbulb', 'url(\"' + new URL(new URL('lightbulb.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-lighthouse_logo', 'url(\"' + new URL(new URL('lighthouse_logo.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-list', 'url(\"' + new URL(new URL('list.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-location-on', 'url(\"' + new URL(new URL('location-on.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
@@ -215,27 +189,15 @@ style.setProperty('--image-file-minus', 'url(\"' + new URL(new URL('minus.svg',
|
||||
style.setProperty('--image-file-mop', 'url(\"' + new URL(new URL('mop.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-mouse', 'url(\"' + new URL(new URL('mouse.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-network-settings', 'url(\"' + new URL(new URL('network-settings.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-node-stack-icon', 'url(\"' + new URL(new URL('node-stack-icon.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-open-externally', 'url(\"' + new URL(new URL('open-externally.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-override', 'url(\"' + new URL(new URL('override.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-palette', 'url(\"' + new URL(new URL('palette.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-pause-circle', 'url(\"' + new URL(new URL('pause-circle.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-pause', 'url(\"' + new URL(new URL('pause.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-pen-spark', 'url(\"' + new URL(new URL('pen-spark.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-performance-panel-delete-annotation', 'url(\"' + new URL(new URL('performance-panel-delete-annotation.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-performance-panel-diagram', 'url(\"' + new URL(new URL('performance-panel-diagram.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-performance-panel-entry-label', 'url(\"' + new URL(new URL('performance-panel-entry-label.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-performance-panel-time-range', 'url(\"' + new URL(new URL('performance-panel-time-range.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-performance', 'url(\"' + new URL(new URL('performance.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-person', 'url(\"' + new URL(new URL('person.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-photo-camera', 'url(\"' + new URL(new URL('photo-camera.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-play', 'url(\"' + new URL(new URL('play.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-plus', 'url(\"' + new URL(new URL('plus.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-policy', 'url(\"' + new URL(new URL('policy.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-popup', 'url(\"' + new URL(new URL('popup.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-preview_feature_video_thumbnail', 'url(\"' + new URL(new URL('preview_feature_video_thumbnail.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-profile', 'url(\"' + new URL(new URL('profile.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-psychiatry', 'url(\"' + new URL(new URL('psychiatry.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-record-start', 'url(\"' + new URL(new URL('record-start.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-record-stop', 'url(\"' + new URL(new URL('record-stop.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-redo', 'url(\"' + new URL(new URL('redo.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
@@ -258,9 +220,9 @@ style.setProperty('--image-file-select-element', 'url(\"' + new URL(new URL('sel
|
||||
style.setProperty('--image-file-send', 'url(\"' + new URL(new URL('send.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-shadow', 'url(\"' + new URL(new URL('shadow.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-small-status-dot', 'url(\"' + new URL(new URL('small-status-dot.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-smart-assistant', 'url(\"' + new URL(new URL('smart-assistant.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-snippet', 'url(\"' + new URL(new URL('snippet.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-spark-info', 'url(\"' + new URL(new URL('spark-info.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-spark', 'url(\"' + new URL(new URL('spark.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-star', 'url(\"' + new URL(new URL('star.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-step-into', 'url(\"' + new URL(new URL('step-into.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-step-out', 'url(\"' + new URL(new URL('step-out.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
@@ -270,12 +232,8 @@ style.setProperty('--image-file-stop', 'url(\"' + new URL(new URL('stop.svg', im
|
||||
style.setProperty('--image-file-symbol', 'url(\"' + new URL(new URL('symbol.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-sync', 'url(\"' + new URL(new URL('sync.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-table', 'url(\"' + new URL(new URL('table.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-terminal', 'url(\"' + new URL(new URL('terminal.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-thumb-down-filled', 'url(\"' + new URL(new URL('thumb-down-filled.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-thumb-down', 'url(\"' + new URL(new URL('thumb-down.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-thumb-up-filled', 'url(\"' + new URL(new URL('thumb-up-filled.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-thumb-up', 'url(\"' + new URL(new URL('thumb-up.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-tonality', 'url(\"' + new URL(new URL('tonality.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-top-panel-close', 'url(\"' + new URL(new URL('top-panel-close.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-top-panel-open', 'url(\"' + new URL(new URL('top-panel-open.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-touch-app', 'url(\"' + new URL(new URL('touch-app.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
@@ -284,12 +242,10 @@ style.setProperty('--image-file-triangle-down', 'url(\"' + new URL(new URL('tria
|
||||
style.setProperty('--image-file-triangle-left', 'url(\"' + new URL(new URL('triangle-left.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-triangle-right', 'url(\"' + new URL(new URL('triangle-right.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-triangle-up', 'url(\"' + new URL(new URL('triangle-up.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-tune', 'url(\"' + new URL(new URL('tune.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-undo', 'url(\"' + new URL(new URL('undo.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-warning-filled', 'url(\"' + new URL(new URL('warning-filled.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-warning', 'url(\"' + new URL(new URL('warning.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-watch', 'url(\"' + new URL(new URL('watch.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-whatsnew', 'url(\"' + new URL(new URL('whatsnew.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-width', 'url(\"' + new URL(new URL('width.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
style.setProperty('--image-file-zoom-in', 'url(\"' + new URL(new URL('zoom-in.svg', import.meta.url).href, import.meta.url).toString() + '\")');
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="770" height="1580"><path d="M766 366v100" style="fill:none;stroke:#f80;stroke-width:9" transform="matrix(-1 0 0 1 770.5 0)"/><path d="M766 768V568" style="fill:none;stroke:#888;stroke-width:9" transform="matrix(-1 0 0 1 770.5 0)"/><g style="fill-rule:evenodd" transform="matrix(-1 0 0 1 770.5 0)"><rect width="767" height="1580" rx="80" ry="80" style="fill:#222"/></g><g style="fill:#fff;fill-rule:evenodd" transform="matrix(-1 0 0 1 770.5 0)"><rect width="220" height="15" x="273.5" y="1526" rx="5" ry="5" style="fill-opacity:.13332998"/><path d="M70.363 6.95C28.333 5.754 4.808 47.982 4.838 83.222l1.194 1424.49c.026 30.952 32.038 68.279 64.634 68.216l622.086-1.194c30.873-.06 68.216-37.263 68.216-64.634V76.057c0-31.282-24.689-66.72-63.137-70.302C456.898 4.61 269.722 6.95 70.363 6.95" style="fill-opacity:.86667002"/></g></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="770" height="1580"><path style="fill:none;stroke:#f80;stroke-width:9" d="M766 366v100" transform="matrix(-1 0 0 1 770.5 0)"/><path style="fill:none;stroke:#888;stroke-width:9" d="M766 768V568" transform="matrix(-1 0 0 1 770.5 0)"/><g style="fill-rule:evenodd" transform="matrix(-1 0 0 1 770.5 0)"><rect style="fill:#222" width="767" height="1580" ry="80" rx="80"/></g><g style="fill:#fff;fill-rule:evenodd" transform="matrix(-1 0 0 1 770.5 0)"><rect style="fill-opacity:.13332998" x="273.5" y="1526" width="220" height="15" ry="5" rx="5"/><path style="fill-opacity:.86667002" d="M70.363 6.95C28.333 5.754 4.808 47.982 4.838 83.222l1.194 1424.49c.026 30.952 32.038 68.279 64.634 68.216l622.086-1.194c30.873-.06 68.216-37.263 68.216-64.634V76.057c0-31.282-24.689-66.72-63.137-70.302C456.898 4.61 269.722 6.95 70.363 6.95Z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 878 B After Width: | Height: | Size: 879 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="770" height="1580"><path fill="none" stroke="#f80" stroke-width="9" d="M766 366v100"/><path fill="none" stroke="#888" stroke-width="9" d="M766 768V568"/><g fill-rule="evenodd"><rect width="767" height="1580" fill="#222" rx="80" ry="80"/><rect width="80" height="18" x="343.5" y="80" fill="#fff" fill-opacity=".133" rx="5" ry="5"/><circle cx="459" cy="76.25" r="15" fill="#00f" fill-opacity=".267"/><circle cx="297.25" cy="74" r="17.5" fill="#00f" fill-opacity=".267"/></g><g fill="#fff" fill-rule="evenodd"><rect width="50" height="25" x="358.5" y="34" fill-opacity=".133" rx="10" ry="10"/><rect width="220" height="15" x="273.5" y="1526" fill-opacity=".133" rx="5" ry="5"/><path fill-opacity=".867" d="M83.5 38c-27.7 0-50 22.3-50 50v1360c0 16.62 13.38 30 30 30h640c16.62 0 30-13.38 30-30V88c0-27.7-22.3-50-50-50h-140c-19.39 0-35 15.61-35 35v4c0 24.93-20.07 45-45 45h-160c-24.93 0-45-20.07-45-45v-4c0-19.39-15.61-35-35-35h-70z"/></g></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="1580" width="770"><path d="M766 366v100" stroke="#f80" stroke-width="9" fill="none"/><path d="M766 768V568" stroke="#888" stroke-width="9" fill="none"/><g fill-rule="evenodd"><rect rx="80" ry="80" height="1580" width="767" fill="#222"/><rect fill-opacity=".133" rx="5" ry="5" height="18" width="80" y="80" x="343.5" fill="#fff"/><circle cx="459" fill-opacity=".267" cy="76.25" r="15" fill="#00f"/><circle cx="297.25" fill-opacity=".267" cy="74" r="17.5" fill="#00f"/></g><g fill-rule="evenodd" fill="#fff"><rect fill-opacity=".133" rx="10" ry="10" height="25" width="50" y="34" x="358.5"/><rect fill-opacity=".133" rx="5" ry="5" height="15" width="220" y="1526" x="273.5"/><path d="M83.5 38c-27.7 0-50 22.3-50 50v1360c0 16.62 13.38 30 30 30h640c16.62 0 30-13.38 30-30V88c0-27.7-22.3-50-50-50h-140c-19.39 0-35 15.61-35 35v4c0 24.93-20.07 45-45 45h-160c-24.93 0-45-20.07-45-45v-4c0-19.39-15.61-35-35-35h-70z" fill-opacity=".867"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 986 B After Width: | Height: | Size: 986 B |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="#5f6368" viewBox="0 -960 960 960"><path d="M624-144v-108H444v-384H336v108H96v-288h240v108h288v-108h240v288H624v-108H516v312h108v-108h240v288zM168-744v144zm528 384v144zm0-384v144zm0 144h96v-144h-96zm0 384h96v-144h-96zM168-600h96v-144h-96z"/></svg>
|
||||
|
Before Width: | Height: | Size: 315 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none"><path fill="#000" fill-rule="evenodd" d="M18 10.75H2v-1.5h16z" clip-rule="evenodd"/><path fill="#000" d="M6 4h8v3H6zM6 13h8v3H6z"/></svg>
|
||||
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M18 10.75H2v-1.5h16v1.5Z" fill="#000"/><path d="M6 4h8v3H6V4ZM6 13h8v3H6v-3Z" fill="#000"/></svg>
|
||||
|
Before Width: | Height: | Size: 212 B After Width: | Height: | Size: 221 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none"><path fill="#000" fill-rule="evenodd" d="M18 18H2v-1.5h16z" clip-rule="evenodd"/><path fill="#000" d="M6 6h8v3H6zM6 11h8v3H6z"/></svg>
|
||||
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M18 18H2v-1.5h16V18Z" fill="#000"/><path d="M6 6h8v3H6V6ZM6 11h8v3H6v-3Z" fill="#000"/></svg>
|
||||
|
Before Width: | Height: | Size: 209 B After Width: | Height: | Size: 217 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none"><path fill="#000" fill-rule="evenodd" d="M18 18H2v-1.5h16zM18 3.5H2V2h16z" clip-rule="evenodd"/><path fill="#000" d="M6 5h8v3H6zM6 12h8v3H6z"/></svg>
|
||||
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M18 18H2v-1.5h16V18ZM18 3.5H2V2h16v1.5Z" fill="#000"/><path d="M6 5h8v3H6V5ZM6 12h8v3H6v-3Z" fill="#000"/></svg>
|
||||
|
Before Width: | Height: | Size: 224 B After Width: | Height: | Size: 236 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none"><path fill="#000" d="M14 3.5h4V2H2v1.5h4v3h8zM2 18h16v-1.5h-4v-3H6v3H2z"/></svg>
|
||||
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M14 3.5h4V2H2v1.5h4v3h8v-3ZM2 18h16v-1.5h-4v-3H6v3H2V18Z" fill="#000"/></svg>
|
||||
|
Before Width: | Height: | Size: 155 B After Width: | Height: | Size: 161 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none"><path fill="#000" fill-rule="evenodd" d="M18 18H2v-1.5h16zM18 3.5H2V2h16z" clip-rule="evenodd"/><path fill="#000" d="M6 6h8v3H6zM6 11h8v3H6z"/></svg>
|
||||
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M18 18H2v-1.5h16V18ZM18 3.5H2V2h16v1.5Z" fill="#000"/><path d="M6 6h8v3H6V6ZM6 11h8v3H6v-3Z" fill="#000"/></svg>
|
||||
|
Before Width: | Height: | Size: 224 B After Width: | Height: | Size: 236 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none"><path fill="#000" fill-rule="evenodd" d="M18 3.5H2V2h16z" clip-rule="evenodd"/><path fill="#000" d="M6 6h8v3H6zM6 11h8v3H6z"/></svg>
|
||||
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M18 3.5H2V2h16v1.5Z" fill="#000"/><path d="M6 6h8v3H6V6ZM6 11h8v3H6v-3Z" fill="#000"/></svg>
|
||||
|
Before Width: | Height: | Size: 207 B After Width: | Height: | Size: 216 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none"><path fill="#000" d="M2 3.5h4V9h8V3.5h4V2H2zM2 18h16v-1.5h-4V11H6v5.5H2z"/></svg>
|
||||
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.5h4V9h8V3.5h4V2H2v1.5ZM2 18h16v-1.5h-4V11H6v5.5H2V18Z" fill="#000"/></svg>
|
||||
|
Before Width: | Height: | Size: 156 B After Width: | Height: | Size: 163 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none"><path fill="#000" fill-rule="evenodd" d="m9.104 4-3.75 10h1.729L8 11.438h4.042L12.916 14h1.73l-3.75-10zm2.396 6H8.521l1.437-4.146h.084z" clip-rule="evenodd"/><path fill="#000" d="M18 16.5H2V18h16z"/></svg>
|
||||
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="m9.104 4-3.75 10h1.729L8 11.438h4.042L12.916 14h1.73l-3.75-10H9.104Zm2.396 6H8.521l1.437-4.146h.084L11.5 10Z" fill="#000"/><path d="M18 16.5H2V18h16v-1.5Z" fill="#000"/></svg>
|
||||
|
Before Width: | Height: | Size: 280 B After Width: | Height: | Size: 299 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none"><path fill="#000" fill-rule="evenodd" d="M18 10.75H2v-1.5h16z" clip-rule="evenodd"/><path fill="#000" d="M9 3v14H6V3zM15 6v8h-3V6z"/></svg>
|
||||
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M18 10.75H2v-1.5h16v1.5Z" fill="#000"/><path d="M9 3v14H6V3h3ZM15 6v8h-3V6h3Z" fill="#000"/></svg>
|
||||
|
Before Width: | Height: | Size: 214 B After Width: | Height: | Size: 222 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none"><path fill="#000" d="M2 16.5h16V18H2zM6 15V4h3v11zM11 8v7h3V8z"/></svg>
|
||||
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M2 16.5h16V18H2v-1.5ZM6 15V4h3v11H6ZM11 8v7h3V8h-3Z" fill="#000"/></svg>
|
||||
|
Before Width: | Height: | Size: 146 B After Width: | Height: | Size: 156 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none"><path fill="#000" d="M2 3.5h16V2H2zM6 5v11h3V5zM11 12V5h3v7z"/></svg>
|
||||
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.5h16V2H2v1.5ZM6 5v11h3V5H6ZM11 12V5h3v7h-3Z" fill="#000"/></svg>
|
||||
|
Before Width: | Height: | Size: 144 B After Width: | Height: | Size: 153 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none"><path fill="#000" d="M18 16.5H2V18h16zM18 2H2v1.5h16zM6 15V5h3v10zM11 5v10h3V5z"/></svg>
|
||||
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M18 16.5H2V18h16v-1.5ZM18 2H2v1.5h16V2ZM6 15V5h3v10H6ZM11 5v10h3V5h-3Z" fill="#000"/></svg>
|
||||
|
Before Width: | Height: | Size: 163 B After Width: | Height: | Size: 175 B |
@@ -1 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="none"><path fill="#000" d="M11.5 9.25V3h-3v6.25H2v1.5h6.5V17h3v-6.25H18v-1.5z"/></svg>
|
||||
<svg width="20" height="20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M11.5 9.25V3h-3v6.25H2v1.5h6.5V17h3v-6.25H18v-1.5h-6.5Z" fill="#000"/></svg>
|
||||
|
Before Width: | Height: | Size: 155 B After Width: | Height: | Size: 160 B |