From 0c190b14c0013826bc3ffff800dde4e4ae2157fc Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Fri, 10 Apr 2026 12:25:30 +0200 Subject: [PATCH 01/15] feat(metro): add metro-plugin-rock for ROCKjs integration RNEF has been renamed to Rock (ROCKjs). This adds a new @module-federation/metro-plugin-rock package targeting @rock-js/tools and @rock-js/config, while keeping metro-plugin-rnef published for backward compatibility with a deprecation notice. --- .changeset/config.json | 1 + AGENTS.md | 4 +- packages/metro-plugin-rnef/README.md | 2 + packages/metro-plugin-rnef/package.json | 2 +- packages/metro-plugin-rnef/tsconfig.json | 3 +- packages/metro-plugin-rock/LICENSE | 21 ++ packages/metro-plugin-rock/README.md | 96 ++++++ packages/metro-plugin-rock/package.json | 53 ++++ packages/metro-plugin-rock/rslib.config.ts | 13 + packages/metro-plugin-rock/src/index.ts | 4 + packages/metro-plugin-rock/src/plugin.ts | 78 +++++ .../metro-plugin-rock/tsconfig.build.json | 10 + packages/metro-plugin-rock/tsconfig.json | 8 + pnpm-lock.yaml | 273 ++++++------------ 14 files changed, 385 insertions(+), 183 deletions(-) create mode 100644 packages/metro-plugin-rock/LICENSE create mode 100644 packages/metro-plugin-rock/README.md create mode 100644 packages/metro-plugin-rock/package.json create mode 100644 packages/metro-plugin-rock/rslib.config.ts create mode 100644 packages/metro-plugin-rock/src/index.ts create mode 100644 packages/metro-plugin-rock/src/plugin.ts create mode 100644 packages/metro-plugin-rock/tsconfig.build.json create mode 100644 packages/metro-plugin-rock/tsconfig.json diff --git a/.changeset/config.json b/.changeset/config.json index ca299bd137c..4ac43a2b741 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -34,6 +34,7 @@ "@module-federation/treeshake-frontend", "@module-federation/metro", "@module-federation/metro-plugin-rnef", + "@module-federation/metro-plugin-rock", "@module-federation/metro-plugin-rnc-cli" ] ], diff --git a/AGENTS.md b/AGENTS.md index c708b95bb1c..6308311818c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -152,13 +152,13 @@ pnpm run build:packages - Metro tests: ```bash -pnpm exec turbo run test --filter=@module-federation/metro --filter=@module-federation/metro-plugin-rnef --filter=@module-federation/metro-plugin-rnc-cli +pnpm exec turbo run test --filter=@module-federation/metro --filter=@module-federation/metro-plugin-rnef --filter=@module-federation/metro-plugin-rock --filter=@module-federation/metro-plugin-rnc-cli ``` - Metro lint: ```bash -pnpm exec turbo run lint --filter=@module-federation/metro --filter=@module-federation/metro-plugin-rnef --filter=@module-federation/metro-plugin-rnc-cli +pnpm exec turbo run lint --filter=@module-federation/metro --filter=@module-federation/metro-plugin-rnef --filter=@module-federation/metro-plugin-rock --filter=@module-federation/metro-plugin-rnc-cli ``` ### E2E Parity via Local CI Runner diff --git a/packages/metro-plugin-rnef/README.md b/packages/metro-plugin-rnef/README.md index 35b74379c13..ec68c8391f3 100644 --- a/packages/metro-plugin-rnef/README.md +++ b/packages/metro-plugin-rnef/README.md @@ -1,5 +1,7 @@ # @module-federation/metro-plugin-rnef +> **Deprecated:** RNEF has been renamed to [Rock](https://rockjs.dev). Please use [`@module-federation/metro-plugin-rock`](https://www.npmjs.com/package/@module-federation/metro-plugin-rock) instead. This package will continue to be published for backward compatibility but will not receive new features. + Module Federation for React Native Enterprise Framework (RNEF) using Metro bundler. This plugin integrates the `@module-federation/metro` package with RNEF, providing commands to bundle Module Federation host and remotes. ## Installation diff --git a/packages/metro-plugin-rnef/package.json b/packages/metro-plugin-rnef/package.json index 1aed47ea534..b4bcd768b92 100644 --- a/packages/metro-plugin-rnef/package.json +++ b/packages/metro-plugin-rnef/package.json @@ -1,7 +1,7 @@ { "name": "@module-federation/metro-plugin-rnef", "version": "2.3.1", - "description": "Metro Module Federation plugin for React Native Enterprise Framework (RNEF)", + "description": "Metro Module Federation plugin for React Native Enterprise Framework (RNEF). Deprecated: use @module-federation/metro-plugin-rock instead.", "keywords": [ "rnef", "module-federation", diff --git a/packages/metro-plugin-rnef/tsconfig.json b/packages/metro-plugin-rnef/tsconfig.json index 798324680dc..eff912bc399 100644 --- a/packages/metro-plugin-rnef/tsconfig.json +++ b/packages/metro-plugin-rnef/tsconfig.json @@ -2,6 +2,7 @@ "extends": "../../tsconfig.base.json", "include": ["src"], "compilerOptions": { - "rootDir": "src" + "rootDir": "src", + "moduleResolution": "bundler" } } diff --git a/packages/metro-plugin-rock/LICENSE b/packages/metro-plugin-rock/LICENSE new file mode 100644 index 00000000000..3c35d705035 --- /dev/null +++ b/packages/metro-plugin-rock/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Jakub Romanczyk and Zephyr Cloud + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/metro-plugin-rock/README.md b/packages/metro-plugin-rock/README.md new file mode 100644 index 00000000000..c5e4768570d --- /dev/null +++ b/packages/metro-plugin-rock/README.md @@ -0,0 +1,96 @@ +# @module-federation/metro-plugin-rock + +Module Federation for [Rock](https://rockjs.dev) (formerly RNEF) using Metro bundler. This plugin integrates the `@module-federation/metro` package with Rock, providing commands to bundle Module Federation host and remotes. + +## Installation + +1. First, ensure you have [Rock](https://rockjs.dev) set up in your project. + +2. Install the plugin: + +```bash +npm install --save-dev @module-federation/metro-plugin-rock +``` + +3. Add the plugin to your Rock configuration (typically in `rock.config.mjs`): + +```typescript +import { pluginMetro } from '@rock-js/plugin-metro'; +import moduleFederation from '@module-federation/metro-plugin-rock'; + +/** @type {import('@rock-js/config').Config} */ +export default { + bundler: pluginMetro(), + plugins: [moduleFederation()], +}; +``` + +## Usage + +### Bundle a Module Federation Host + +```bash +# Bundle for iOS +rock bundle-mf-host --entry-file index.js --platform ios + +# Bundle for Android +rock bundle-mf-host --entry-file index.js --platform android +``` + +### Bundle a Module Federation Remote + +```bash +# Bundle for iOS +rock bundle-mf-remote --platform ios + +# Bundle for Android +rock bundle-mf-remote --platform android +``` + +### Available Options + +#### `bundle-mf-host` + +- `--entry-file `: Path to the root JavaScript entry file +- `--platform `: Target platform (default: "ios") - Either "ios" or "android" +- `--transformer `: Specify a custom transformer +- `--dev [boolean]`: If false, warnings are disabled and the bundle is minified (default: true) +- `--minify [boolean]`: Allows overriding whether bundle is minified. This defaults to false if dev is true, and true if dev is false. Disabling minification can be useful for speeding up production builds for testing purposes. +- `--bundle-output `: File path where to store the resulting bundle +- `--bundle-encoding `: Encoding the bundle should be written in (default: "utf8") +- `--resolver-option `: Custom resolver options (key=value format, URL-encoded, can be specified multiple times) +- `--sourcemap-output `: File name where to store the sourcemap file for resulting bundle, ex. /tmp/groups.map +- `--sourcemap-sources-root `: Path to make sourcemap's sources entries relative to, ex. /root/dir +- `--sourcemap-use-absolute-path`: Report SourceMapURL using its full path (default: false) +- `--max-workers `: Specifies the maximum number of workers the worker-pool will spawn for transforming files. This defaults to the number of the cores available on your machine. +- `--assets-dest `: Directory name where to store assets referenced in the bundle +- `--reset-cache`: Removes cached files (default: false) +- `--read-global-cache`: Try to fetch transformed JS code from the global cache, if configured (default: false) +- `--config `: Path to the CLI configuration file + +#### `bundle-mf-remote` + +- `--platform `: Target platform (default: "ios") - Either "ios" or "android" +- `--dev [boolean]`: If false, warnings are disabled and the bundle is minified (default: true) +- `--minify [boolean]`: Allows overriding whether bundle is minified. This defaults to false if dev is true, and true if dev is false. Disabling minification can be useful for speeding up production builds for testing purposes. +- `--bundle-encoding `: Encoding the bundle should be written in (default: "utf8") +- `--max-workers `: Specifies the maximum number of workers the worker-pool will spawn for transforming files. This defaults to the number of the cores available on your machine. +- `--bundle-output `: File path where to store the resulting bundle +- `--sourcemap-output `: File name where to store the sourcemap file for resulting bundle, ex. /tmp/groups.map +- `--sourcemap-sources-root `: Path to make sourcemap's sources entries relative to, ex. /root/dir +- `--sourcemap-use-absolute-path`: Report SourceMapURL using its full path (default: false) +- `--assets-dest `: Directory name where to store assets referenced in the bundle +- `--asset-catalog-dest [string]`: Path where to create an iOS Asset Catalog for images +- `--reset-cache`: Removes cached files (default: false) +- `--config `: Path to the CLI configuration file + +## Migrating from RNEF + +If you're migrating from `@module-federation/metro-plugin-rnef`, update your imports: + +```diff +-import moduleFederation from '@module-federation/metro-plugin-rnef'; ++import moduleFederation from '@module-federation/metro-plugin-rock'; +``` + +And update your config file from `rnef.config.mjs` to `rock.config.mjs` as per the [Rock migration guide](https://rockjs.dev). diff --git a/packages/metro-plugin-rock/package.json b/packages/metro-plugin-rock/package.json new file mode 100644 index 00000000000..b3fc6ca7d39 --- /dev/null +++ b/packages/metro-plugin-rock/package.json @@ -0,0 +1,53 @@ +{ + "name": "@module-federation/metro-plugin-rock", + "version": "2.3.1", + "description": "Metro Module Federation plugin for Rock", + "keywords": [ + "rock", + "rockjs", + "module-federation", + "metro", + "react-native" + ], + "type": "module", + "license": "MIT", + "author": "Jakub Romańczyk (https://github.com/jbroma)", + "publishConfig": { + "access": "public", + "registry": "https://registry.npmjs.org/" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/module-federation/core.git", + "directory": "packages/metro-plugin-rock" + }, + "files": [ + "dist/" + ], + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + "types": "./dist/index.d.ts", + "require": "./dist/index.cjs", + "default": "./dist/index.js" + }, + "scripts": { + "build": "rslib build", + "typecheck": "tsc --noEmit", + "lint": "ESLINT_USE_FLAT_CONFIG=false pnpm exec eslint --ignore-pattern node_modules \"**/*.{js,ts}\"" + }, + "peerDependencies": { + "@module-federation/metro": "workspace:*", + "@rock-js/tools": "^0.13.0" + }, + "devDependencies": { + "@module-federation/metro": "workspace:*", + "@rock-js/config": "^0.13.0", + "@rock-js/tools": "^0.13.0", + "@rslib/core": "^0.10.0", + "@typescript-eslint/eslint-plugin": "8.54.0", + "@typescript-eslint/parser": "8.54.0", + "@types/node": "^20.0.0", + "typescript": "^5.8.3" + } +} diff --git a/packages/metro-plugin-rock/rslib.config.ts b/packages/metro-plugin-rock/rslib.config.ts new file mode 100644 index 00000000000..42a04669edc --- /dev/null +++ b/packages/metro-plugin-rock/rslib.config.ts @@ -0,0 +1,13 @@ +import { pluginPublint } from 'rsbuild-plugin-publint'; +import { defineConfig } from '@rslib/core'; + +export default defineConfig({ + plugins: [pluginPublint()], + lib: [ + { format: 'esm', syntax: 'es2021', bundle: false, dts: { bundle: false } }, + { format: 'cjs', syntax: 'es2021', bundle: false }, + ], + source: { + tsconfigPath: './tsconfig.build.json', + }, +}); diff --git a/packages/metro-plugin-rock/src/index.ts b/packages/metro-plugin-rock/src/index.ts new file mode 100644 index 00000000000..3bde1f1a0ec --- /dev/null +++ b/packages/metro-plugin-rock/src/index.ts @@ -0,0 +1,4 @@ +import { pluginMetroModuleFederation } from './plugin.js'; + +export { pluginMetroModuleFederation }; +export default pluginMetroModuleFederation; diff --git a/packages/metro-plugin-rock/src/plugin.ts b/packages/metro-plugin-rock/src/plugin.ts new file mode 100644 index 00000000000..c3722240778 --- /dev/null +++ b/packages/metro-plugin-rock/src/plugin.ts @@ -0,0 +1,78 @@ +import commands from '@module-federation/metro/commands'; +import type { + BundleFederatedHostArgs, + BundleFederatedRemoteArgs, +} from '@module-federation/metro/commands'; +import type { PluginApi, PluginOutput } from '@rock-js/config'; +import { color, logger, outro } from '@rock-js/tools'; + +interface PluginConfig { + platforms?: Record; +} + +export const pluginMetroModuleFederation = + (pluginConfig: PluginConfig = {}) => + (api: PluginApi): PluginOutput => { + // Register the bundle-mf-host command + api.registerCommand({ + name: 'bundle-mf-host', + description: 'Bundles a Module Federation host', + action: async (args: BundleFederatedHostArgs) => { + const commandConfig = { + root: api.getProjectRoot(), + platforms: api.getPlatforms(), + reactNativePath: api.getReactNativePath(), + ...pluginConfig, + }; + + logger.info( + `Bundling Module Federation host for platform ${color.cyan( + args.platform, + )}`, + ); + + await commands.bundleFederatedHost([], commandConfig, args); + logger.info('Bundle artifacts available at ...'); + outro('Success 🎉.'); + }, + options: [ + ...commands.bundleFederatedHostOptions, + { + name: '--config-cmd [string]', + description: + '[Internal] A hack for Xcode build script pointing to wrong bundle command that recognizes this flag. Do not use.', + }, + ], + }); + + // Register the bundle-mf-remote command + api.registerCommand({ + name: 'bundle-mf-remote', + description: + 'Bundles a Module Federation remote, including its container entry and all exposed modules for consumption by host applications', + action: async (args: BundleFederatedRemoteArgs) => { + const commandConfig = { + root: api.getProjectRoot(), + platforms: api.getPlatforms(), + reactNativePath: api.getReactNativePath(), + ...pluginConfig, + }; + + logger.info( + `Bundling Module Federation remote for platform ${color.cyan( + args.platform, + )}`, + ); + + await commands.bundleFederatedRemote([], commandConfig, args); + logger.info('Bundle artifacts available at ...'); + outro('Success 🎉.'); + }, + options: commands.bundleFederatedRemoteOptions, + }); + + return { + name: '@module-federation/metro-plugin-rock', + description: 'Rock plugin for Module Federation with Metro', + }; + }; diff --git a/packages/metro-plugin-rock/tsconfig.build.json b/packages/metro-plugin-rock/tsconfig.build.json new file mode 100644 index 00000000000..67c581e8070 --- /dev/null +++ b/packages/metro-plugin-rock/tsconfig.build.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "dist", + "sourceMap": false, + "declarationMap": false, + "moduleResolution": "bundler" + } +} diff --git a/packages/metro-plugin-rock/tsconfig.json b/packages/metro-plugin-rock/tsconfig.json new file mode 100644 index 00000000000..eff912bc399 --- /dev/null +++ b/packages/metro-plugin-rock/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.base.json", + "include": ["src"], + "compilerOptions": { + "rootDir": "src", + "moduleResolution": "bundler" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a32f9cca622..ec2725f837d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -3522,7 +3522,7 @@ importers: version: 0.80.0(@babel/core@7.29.0)(@react-native-community/cli@19.1.2(typescript@5.9.3))(@types/react@19.2.14)(react@19.1.0) ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.17))(@types/node@20.19.5)(typescript@5.9.3) + version: 10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.19))(@types/node@20.19.5)(typescript@5.9.3) typescript: specifier: ^5.8.3 version: 5.9.3 @@ -3566,6 +3566,33 @@ importers: specifier: ^5.8.3 version: 5.9.3 + packages/metro-plugin-rock: + devDependencies: + '@module-federation/metro': + specifier: workspace:* + version: link:../metro-core + '@rock-js/config': + specifier: ^0.13.0 + version: 0.13.0 + '@rock-js/tools': + specifier: ^0.13.0 + version: 0.13.0 + '@rslib/core': + specifier: ^0.10.0 + version: 0.10.6(@microsoft/api-extractor@7.57.7(@types/node@20.19.5))(typescript@5.9.3) + '@types/node': + specifier: ^20.0.0 + version: 20.19.5 + '@typescript-eslint/eslint-plugin': + specifier: 8.54.0 + version: 8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': + specifier: 8.54.0 + version: 8.54.0(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + typescript: + specifier: ^5.8.3 + version: 5.9.3 + packages/modernjs: dependencies: '@modern-js/utils': @@ -4598,56 +4625,48 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@ast-grep/napi-linux-arm64-gnu@0.37.0': resolution: {integrity: sha512-L7Sj0lXy8X+BqSMgr1LB8cCoWk0rericdeu+dC8/c8zpsav5Oo2IQKY1PmiZ7H8IHoFBbURLf8iklY9wsD+cyA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@ast-grep/napi-linux-arm64-musl@0.35.0': resolution: {integrity: sha512-1EcvHPwyWpCL/96LuItBYGfeI5FaMTRvL+dHbO/hL5q1npqbb5qn+ppJwtNOjTPz8tayvgggxVk9T4C2O7taYA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@ast-grep/napi-linux-arm64-musl@0.37.0': resolution: {integrity: sha512-LF9sAvYy6es/OdyJDO3RwkX3I82Vkfsng1sqUBcoWC1jVb1wX5YVzHtpQox9JrEhGl+bNp7FYxB4Qba9OdA5GA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@ast-grep/napi-linux-x64-gnu@0.35.0': resolution: {integrity: sha512-FDzNdlqmQnsiWXhnLxusw5AOfEcEM+5xtmrnAf3SBRFr86JyWD9qsynnFYC2pnP9hlMfifNH2TTmMpyGJW49Xw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@ast-grep/napi-linux-x64-gnu@0.37.0': resolution: {integrity: sha512-TViz5/klqre6aSmJzswEIjApnGjJzstG/SE8VDWsrftMBMYt2PTu3MeluZVwzSqDao8doT/P+6U11dU05UOgxw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@ast-grep/napi-linux-x64-musl@0.35.0': resolution: {integrity: sha512-wlmndjfBafT8u5p4DBnoRQyoCSGNuVSz7rT3TqhvlHcPzUouRWMn95epU9B1LNLyjXvr9xHeRjSktyCN28w57Q==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@ast-grep/napi-linux-x64-musl@0.37.0': resolution: {integrity: sha512-/BcCH33S9E3ovOAEoxYngUNXgb+JLg991sdyiNP2bSoYd30a9RHrG7CYwW6fMgua3ijQ474eV6cq9yZO1bCpXg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@ast-grep/napi-win32-arm64-msvc@0.35.0': resolution: {integrity: sha512-gkhJeYc4rrZLX2icLxalPikTLMR57DuIYLwLr9g+StHYXIsGHrbfrE6Nnbdd8Izfs34ArFCrcwdaMrGlvOPSeg==} @@ -5499,28 +5518,24 @@ packages: engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - libc: [musl] '@biomejs/cli-linux-arm64@2.4.7': resolution: {integrity: sha512-om6FugwmibzfP/6ALj5WRDVSND4H2G9X0nkI1HZpp2ySf9lW2j0X68oQSaHEnls6666oy4KDsc5RFjT4m0kV0w==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - libc: [glibc] '@biomejs/cli-linux-x64-musl@2.4.7': resolution: {integrity: sha512-00kx4YrBMU8374zd2wHuRV5wseh0rom5HqRND+vDldJPrWwQw+mzd/d8byI9hPx926CG+vWzq6AeiT7Yi5y59g==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - libc: [musl] '@biomejs/cli-linux-x64@2.4.7': resolution: {integrity: sha512-bV8/uo2Tj+gumnk4sUdkerWyCPRabaZdv88IpbmDWARQQoA/Q0YaqPz1a+LSEDIL7OfrnPi9Hq1Llz4ZIGyIQQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - libc: [glibc] '@biomejs/cli-win32-arm64@2.4.7': resolution: {integrity: sha512-hOUHBMlFCvDhu3WCq6vaBoG0dp0LkWxSEnEEsxxXvOa9TfT6ZBnbh72A/xBM7CBYB7WgwqboetzFEVDnMxelyw==} @@ -5639,9 +5654,15 @@ packages: '@clack/core@0.4.2': resolution: {integrity: sha512-NYQfcEy8MWIxrT5Fj8nIVchfRFA26yYKJcvBS7WlUIlw2OmQOY9DhGGXMovyI5J5PpxrCPGkgUi207EBrjpBvg==} + '@clack/core@0.5.0': + resolution: {integrity: sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow==} + '@clack/prompts@0.10.1': resolution: {integrity: sha512-Q0T02vx8ZM9XSv9/Yde0jTmmBQufZhPJfYAg2XrrrxWWaZgq1rr8nU8Hv710BQ1dhoP8rtY7YUdpGej2Qza/cw==} + '@clack/prompts@0.11.0': + resolution: {integrity: sha512-pMN5FcrEw9hUkZA4f+zLlzivQSeQf5dRGJjSUbvVYDLvpKCdQx5OaknvKzgbtXOizhP+SJJJjqEbOe55uKKfAw==} + '@clack/prompts@0.8.2': resolution: {integrity: sha512-6b9Ab2UiZwJYA9iMyboYyW9yJvAO9V753ZhS+DHKEjZRKAxPPOb7MXXu84lsPFG+vZt6FRFniZ8rXi+zCIw4yQ==} @@ -7109,105 +7130,89 @@ packages: resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-ppc64@1.2.4': resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-riscv64@1.2.4': resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} cpu: [riscv64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-s390x@1.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-x64@1.2.4': resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] - libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.2.4': resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] - libc: [musl] '@img/sharp-linux-arm64@0.34.5': resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - libc: [glibc] '@img/sharp-linux-arm@0.34.5': resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - libc: [glibc] '@img/sharp-linux-ppc64@0.34.5': resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] - libc: [glibc] '@img/sharp-linux-riscv64@0.34.5': resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [riscv64] os: [linux] - libc: [glibc] '@img/sharp-linux-s390x@0.34.5': resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - libc: [glibc] '@img/sharp-linux-x64@0.34.5': resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - libc: [glibc] '@img/sharp-linuxmusl-arm64@0.34.5': resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - libc: [musl] '@img/sharp-linuxmusl-x64@0.34.5': resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - libc: [musl] '@img/sharp-wasm32@0.34.5': resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} @@ -8479,49 +8484,42 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@napi-rs/nice-linux-arm64-musl@1.1.1': resolution: {integrity: sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@napi-rs/nice-linux-ppc64-gnu@1.1.1': resolution: {integrity: sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg==} engines: {node: '>= 10'} cpu: [ppc64] os: [linux] - libc: [glibc] '@napi-rs/nice-linux-riscv64-gnu@1.1.1': resolution: {integrity: sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw==} engines: {node: '>= 10'} cpu: [riscv64] os: [linux] - libc: [glibc] '@napi-rs/nice-linux-s390x-gnu@1.1.1': resolution: {integrity: sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ==} engines: {node: '>= 10'} cpu: [s390x] os: [linux] - libc: [glibc] '@napi-rs/nice-linux-x64-gnu@1.1.1': resolution: {integrity: sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@napi-rs/nice-linux-x64-musl@1.1.1': resolution: {integrity: sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@napi-rs/nice-openharmony-arm64@1.1.1': resolution: {integrity: sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ==} @@ -8604,56 +8602,48 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@next/swc-linux-arm64-gnu@16.1.5': resolution: {integrity: sha512-qNIb42o3C02ccIeSeKjacF3HXotGsxh/FMk/rSRmCzOVMtoWH88odn2uZqF8RLsSUWHcAqTgYmPD3pZ03L9ZAA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@next/swc-linux-arm64-musl@14.2.33': resolution: {integrity: sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@next/swc-linux-arm64-musl@16.1.5': resolution: {integrity: sha512-U+kBxGUY1xMAzDTXmuVMfhaWUZQAwzRaHJ/I6ihtR5SbTVUEaDRiEU9YMjy1obBWpdOBuk1bcm+tsmifYSygfw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@next/swc-linux-x64-gnu@14.2.33': resolution: {integrity: sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@next/swc-linux-x64-gnu@16.1.5': resolution: {integrity: sha512-gq2UtoCpN7Ke/7tKaU7i/1L7eFLfhMbXjNghSv0MVGF1dmuoaPeEVDvkDuO/9LVa44h5gqpWeJ4mRRznjDv7LA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@next/swc-linux-x64-musl@14.2.33': resolution: {integrity: sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@next/swc-linux-x64-musl@16.1.5': resolution: {integrity: sha512-bQWSE729PbXT6mMklWLf8dotislPle2L70E9q6iwETYEOt092GDn0c+TTNj26AjmeceSsC4ndyGsK5nKqHYXjQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@next/swc-win32-arm64-msvc@14.2.33': resolution: {integrity: sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==} @@ -8757,25 +8747,21 @@ packages: resolution: {integrity: sha512-mPji9PzleWPvXpmFDKaXpTymRgZkk/hW8JHGhvEZpKHHXMYgTGWC+BqOEM2A4dYC4bu4fi9RrteL7aouRRWJoQ==} cpu: [arm64] os: [linux] - libc: [glibc] '@nx/nx-linux-arm64-musl@22.5.4': resolution: {integrity: sha512-hF/HvEhbCjcFpTgY7RbP1tUTbp0M1adZq4ckyW8mwhDWQ/MDsc8FnOHwCO3Bzy9ZeJM0zQUES6/m0Onz8geaEA==} cpu: [arm64] os: [linux] - libc: [musl] '@nx/nx-linux-x64-gnu@22.5.4': resolution: {integrity: sha512-1+vicSYEOtc7CNMoRCjo59no4gFe8w2nGIT127wk1yeW3EJzRVNlOA7Deu10NUUbzLeOvHc8EFOaU7clT+F7XQ==} cpu: [x64] os: [linux] - libc: [glibc] '@nx/nx-linux-x64-musl@22.5.4': resolution: {integrity: sha512-/KjndxVB14yU0SJOhqADHOWoTy4Y45h5RjW3cxcXlPSJZz7ar1FnlLne1rWMMMUttepc8ku+3T//SGKi2eu+Nw==} cpu: [x64] os: [linux] - libc: [musl] '@nx/nx-win32-arm64-msvc@22.5.4': resolution: {integrity: sha512-CrYt9FwhjOI6ZNy/G6YHLJmZuXCFJ24BCxugPXiZ7knDx7eGrr7owGgfht4SSiK3KCX40CvWCBJfqR4ZSgaSUA==} @@ -8852,37 +8838,31 @@ packages: resolution: {integrity: sha512-u2ndfeEUrW898eXM+qPxIN8TvTPjI90NDQBRgaxxkOfNw3xaotloeiZGz5+Yzlfxgvxr9DY9FdYkqhUhSnGhOw==} cpu: [arm64] os: [linux] - libc: [glibc] '@oxc-resolver/binding-linux-arm64-musl@5.3.0': resolution: {integrity: sha512-TzbjmFkcnESGuVItQ2diKacX8vu5G0bH3BHmIlmY4OSRLyoAlrJFwGKAHmh6C9+Amfcjo2rx8vdm7swzmsGC6Q==} cpu: [arm64] os: [linux] - libc: [musl] '@oxc-resolver/binding-linux-riscv64-gnu@5.3.0': resolution: {integrity: sha512-NH3pjAqh8nuN29iRuRfTY42Vn03ctoR9VE8llfoUKUfhHUjFHYOXK5VSkhjj1usG8AeuesvqrQnLptCRQVTi/Q==} cpu: [riscv64] os: [linux] - libc: [glibc] '@oxc-resolver/binding-linux-s390x-gnu@5.3.0': resolution: {integrity: sha512-tuZtkK9sJYh2MC2uhol1M/8IMTB6ZQ5jmqP2+k5XNXnOb/im94Y5uV/u2lXwVyIuKHZZHtr+0d1HrOiNahoKpw==} cpu: [s390x] os: [linux] - libc: [glibc] '@oxc-resolver/binding-linux-x64-gnu@5.3.0': resolution: {integrity: sha512-VzhPYmZCtoES/ThcPdGSmMop7JlwgqtSvlgtKCW15ByV2JKyl8kHAHnPSBfpIooXb0ehFnRdxFtL9qtAEWy01g==} cpu: [x64] os: [linux] - libc: [glibc] '@oxc-resolver/binding-linux-x64-musl@5.3.0': resolution: {integrity: sha512-Hi39cWzul24rGljN4Vf1lxjXzQdCrdxO5oCT7KJP4ndSlqIUODJnfnMAP1YhcnIRvNvk+5E6sZtnEmFUd/4d8Q==} cpu: [x64] os: [linux] - libc: [musl] '@oxc-resolver/binding-wasm32-wasi@5.3.0': resolution: {integrity: sha512-ddujvHhP3chmHnSXRlkPVUeYj4/B7eLZwL4yUid+df3WCbVh6DgoT9RmllZn21AhxgKtMdekDdyVJYKFd8tl4A==} @@ -8932,42 +8912,36 @@ packages: engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - libc: [glibc] '@parcel/watcher-linux-arm-musl@2.5.6': resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - libc: [musl] '@parcel/watcher-linux-arm64-glibc@2.5.6': resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - libc: [glibc] '@parcel/watcher-linux-arm64-musl@2.5.6': resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - libc: [musl] '@parcel/watcher-linux-x64-glibc@2.5.6': resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - libc: [glibc] '@parcel/watcher-linux-x64-musl@2.5.6': resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - libc: [musl] '@parcel/watcher-win32-arm64@2.5.6': resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} @@ -10742,6 +10716,15 @@ packages: '@rnef/tools@0.7.28': resolution: {integrity: sha512-a4MumqUhmCRTdBZZHMHWR6dvy2JwNCHYYmBY2Jif9aj9F7pBrYfqMDCkwbVSZkYqu5vgBHAKzdRH8vCzKWLflw==} + '@rock-js/config@0.13.0': + resolution: {integrity: sha512-yzmk0R+agdVVWkVXKR1lfATpNQyI1snIUIVYgjcsm4LvTIsxunruhFxpWW+fxhlP4hqnJ91IzhE1/HExgF187w==} + + '@rock-js/provider-github@0.13.0': + resolution: {integrity: sha512-D38pEsgnr2GOlbOT/9Fey9zYyUej5aF7keRWBOSCvPpGMA4xLmdjUdXuvikv+fWFkN3i0xo1mglncxIOOBrbWA==} + + '@rock-js/tools@0.13.0': + resolution: {integrity: sha512-HtBP+sD2iyiXbZwlAC7aXKUfLHM5Gj5PBa+v3bpDtvvqXkE8MbIq2XjLvsRo0wY/RR0kJjBAH198qr0owbY8Fw==} + '@rolldown/binding-android-arm64@1.0.0-rc.3': resolution: {integrity: sha512-0T1k9FinuBZ/t7rZ8jN6OpUKPnUjNdYHoj/cESWrQ3ZraAJ4OMm6z7QjSfCxqj8mOp9kTKc1zHK3kGz5vMu+nQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -10807,70 +10790,60 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - libc: [glibc] '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.9': resolution: {integrity: sha512-2x9O2JbSPxpxMDhP9Z74mahAStibTlrBMW0520+epJH5sac7/LwZW5Bmg/E6CXuEF53JJFW509uP+lSedaUNxg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - libc: [glibc] '@rolldown/binding-linux-arm64-musl@1.0.0-rc.3': resolution: {integrity: sha512-Z03/wrqau9Bicfgb3Dbs6SYTHliELk2PM2LpG2nFd+cGupTMF5kanLEcj2vuuJLLhptNyS61rtk7SOZ+lPsTUA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - libc: [musl] '@rolldown/binding-linux-arm64-musl@1.0.0-rc.9': resolution: {integrity: sha512-JA1QRW31ogheAIRhIg9tjMfsYbglXXYGNPLdPEYrwFxdbkQCAzvpSCSHCDWNl4hTtrol8WeboCSEpjdZK8qrCg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - libc: [musl] '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.9': resolution: {integrity: sha512-aOKU9dJheda8Kj8Y3w9gnt9QFOO+qKPAl8SWd7JPHP+Cu0EuDAE5wokQubLzIDQWg2myXq2XhTpOVS07qqvT+w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] - libc: [glibc] '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.9': resolution: {integrity: sha512-OalO94fqj7IWRn3VdXWty75jC5dk4C197AWEuMhIpvVv2lw9fiPhud0+bW2ctCxb3YoBZor71QHbY+9/WToadA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] - libc: [glibc] '@rolldown/binding-linux-x64-gnu@1.0.0-rc.3': resolution: {integrity: sha512-iSXXZsQp08CSilff/DCTFZHSVEpEwdicV3W8idHyrByrcsRDVh9sGC3sev6d8BygSGj3vt8GvUKBPCoyMA4tgQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - libc: [glibc] '@rolldown/binding-linux-x64-gnu@1.0.0-rc.9': resolution: {integrity: sha512-cVEl1vZtBsBZna3YMjGXNvnYYrOJ7RzuWvZU0ffvJUexWkukMaDuGhUXn0rjnV0ptzGVkvc+vW9Yqy6h8YX4pg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - libc: [glibc] '@rolldown/binding-linux-x64-musl@1.0.0-rc.3': resolution: {integrity: sha512-qaj+MFudtdCv9xZo9znFvkgoajLdc+vwf0Kz5N44g+LU5XMe+IsACgn3UG7uTRlCCvhMAGXm1XlpEA5bZBrOcw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - libc: [musl] '@rolldown/binding-linux-x64-musl@1.0.0-rc.9': resolution: {integrity: sha512-UzYnKCIIc4heAKgI4PZ3dfBGUZefGCJ1TPDuLHoCzgrMYPb5Rv6TLFuYtyM4rWyHM7hymNdsg5ik2C+UD9VDbA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - libc: [musl] '@rolldown/binding-openharmony-arm64@1.0.0-rc.3': resolution: {integrity: sha512-U662UnMETyjT65gFmG9ma+XziENrs7BBnENi/27swZPYagubfHRirXHG2oMl+pEax2WvO7Kb9gHZmMakpYqBHQ==} @@ -11054,79 +11027,66 @@ packages: resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==} cpu: [arm] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.59.0': resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==} cpu: [arm] os: [linux] - libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.59.0': resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==} cpu: [arm64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.59.0': resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==} cpu: [arm64] os: [linux] - libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.59.0': resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==} cpu: [loong64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.59.0': resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==} cpu: [loong64] os: [linux] - libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.59.0': resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==} cpu: [ppc64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.59.0': resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==} cpu: [ppc64] os: [linux] - libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.59.0': resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==} cpu: [riscv64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.59.0': resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==} cpu: [riscv64] os: [linux] - libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.59.0': resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==} cpu: [s390x] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.59.0': resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==} cpu: [x64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-musl@4.59.0': resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==} cpu: [x64] os: [linux] - libc: [musl] '@rollup/rollup-openbsd-x64@4.59.0': resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==} @@ -11564,265 +11524,221 @@ packages: resolution: {integrity: sha512-/24UytJXrK+7CsucDb30GCKYIJ8nG6ceqbJyOtsJv9zeArNLHkxrYGSyjHJIpQfwVN17BPP4RNOi+yIZ3ZgDyA==} cpu: [arm64] os: [linux] - libc: [glibc] '@rspack/binding-linux-arm64-gnu@1.0.14': resolution: {integrity: sha512-JogYtL3VQS9wJ3p3FNhDqinm7avrMsdwz4erP7YCjD7idob93GYAE7dPrHUzSNVnCBYXRaHJYZHDQs7lKVcYZw==} cpu: [arm64] os: [linux] - libc: [glibc] '@rspack/binding-linux-arm64-gnu@1.3.11': resolution: {integrity: sha512-NIOaIfYUmJs1XL4lbGVtcMm1KlA/6ZR6oAbs2ekofKXtJYAFQgnLTf7ZFmIwVjS0mP78BmeSNcIM6pd2w5id4w==} cpu: [arm64] os: [linux] - libc: [glibc] '@rspack/binding-linux-arm64-gnu@1.3.15': resolution: {integrity: sha512-D/YjYk9snKvYm1Elotq8/GsEipB4ZJWVv/V8cZ+ohhFNOPzygENi6JfyI06TryBTQiN0/JDZqt/S9RaWBWnMqw==} cpu: [arm64] os: [linux] - libc: [glibc] '@rspack/binding-linux-arm64-gnu@1.3.9': resolution: {integrity: sha512-pBKnS2Fbn9cDtWe1KcD1qRjQlJwQhP9pFW2KpxdjE7qXbaO11IHtem6dLZwdpNqbDn9QgyfdVGXBDvBaP1tGwA==} cpu: [arm64] os: [linux] - libc: [glibc] '@rspack/binding-linux-arm64-gnu@1.4.11': resolution: {integrity: sha512-ms6uwECUIcu+6e82C5HJhRMHnfsI+l33v7XQezntzRPN0+sG3EpikEoT7SGbgt4vDwaWLR7wS20suN4qd5r3GA==} cpu: [arm64] os: [linux] - libc: [glibc] '@rspack/binding-linux-arm64-gnu@1.5.8': resolution: {integrity: sha512-UAWCsOnpkvy8eAVRo0uipbHXDhnoDq5zmqWTMhpga0/a3yzCp2e+fnjZb/qnFNYb5MeL0O1mwMOYgn1M3oHILQ==} cpu: [arm64] os: [linux] - libc: [glibc] '@rspack/binding-linux-arm64-gnu@1.6.0-beta.1': resolution: {integrity: sha512-UyUoh5RXHTWCktqPVnqoc5rwlWyLkWqGu6ga+iyJHDxdxlrHFfwJnTSnCd4y8cRadf7CrmjHElxE61GU3WCYhw==} cpu: [arm64] os: [linux] - libc: [glibc] '@rspack/binding-linux-arm64-gnu@1.6.8': resolution: {integrity: sha512-fvZX6xZPvBT8qipSpvkKMX5M7yd2BSpZNCZXcefw6gA3uC7LI3gu+er0LrDXY1PtPzVuHTyDx+abwWpagV3PiQ==} cpu: [arm64] os: [linux] - libc: [glibc] '@rspack/binding-linux-arm64-gnu@1.7.9': resolution: {integrity: sha512-qhUGI/uVfvLmKWts4QkVHGL8yfUyJkblZs+OFD5Upa2y676EOsbQgWsCwX4xGB6Tv+TOzFP0SLh/UfO8ZfdE+w==} cpu: [arm64] os: [linux] - libc: [glibc] '@rspack/binding-linux-arm64-gnu@2.0.0-beta.0': resolution: {integrity: sha512-nTtYtklRZD4sb2RIFCF9YS8tZ/MjpqIBKVS3YIvdXcfHUdVfmQHTZGtwEuZGg6AxTC5L1hcvkYmTXCG0ok7auw==} cpu: [arm64] os: [linux] - libc: [glibc] '@rspack/binding-linux-arm64-musl@0.7.5': resolution: {integrity: sha512-6RcxG42mLM01Pa6UYycACu/Nu9qusghAPUJumb8b8x5TRIDEtklYC5Ck6Rmagm+8E0ucMude2E/D4rMdIFcS3A==} cpu: [arm64] os: [linux] - libc: [musl] '@rspack/binding-linux-arm64-musl@1.0.14': resolution: {integrity: sha512-qgybhxI/nnoa8CUz7zKTC0Oh37NZt9uRxsSV7+ZYrfxqbrVCoNVuutPpY724uUHy1M6W34kVEm1uT1N4Ka5cZg==} cpu: [arm64] os: [linux] - libc: [musl] '@rspack/binding-linux-arm64-musl@1.3.11': resolution: {integrity: sha512-CRRAQ379uzA2QfD9HHNtxuuqzGksUapMVcTLY5NIXWfvHLUJShdlSJQv3UQcqgAJNrMY7Ex1PnoQs1jZgUiqZA==} cpu: [arm64] os: [linux] - libc: [musl] '@rspack/binding-linux-arm64-musl@1.3.15': resolution: {integrity: sha512-lJbBsPMOiR0hYPCSM42yp7QiZjfo0ALtX7ws2wURpsQp3BMfRVAmXU3Ixpo2XCRtG1zj8crHaCmAWOJTS0smsA==} cpu: [arm64] os: [linux] - libc: [musl] '@rspack/binding-linux-arm64-musl@1.3.9': resolution: {integrity: sha512-0B+iiINW0qOEkBE9exsRcdmcHtYIWAoJGnXrz9tUiiewRxX0Cmm0MjD2HAVUAggJZo+9IN8RGz5PopCjJ/dn1g==} cpu: [arm64] os: [linux] - libc: [musl] '@rspack/binding-linux-arm64-musl@1.4.11': resolution: {integrity: sha512-9evq0DOdxMN/H8VM8ZmyY9NSuBgILNVV6ydBfVPMHPx4r1E7JZGpWeKDegZcS5Erw3sS9kVSIxyX78L5PDzzKw==} cpu: [arm64] os: [linux] - libc: [musl] '@rspack/binding-linux-arm64-musl@1.5.8': resolution: {integrity: sha512-GnSvGT4GjokPSD45cTtE+g7LgghuxSP1MRmvd+Vp/I8pnxTVSTsebRod4TAqyiv+l11nuS8yqNveK9qiOkBLWw==} cpu: [arm64] os: [linux] - libc: [musl] '@rspack/binding-linux-arm64-musl@1.6.0-beta.1': resolution: {integrity: sha512-JAXVKHQieN4Ruvs7MstvsPUtRBSAROqJ0abCh4rXdV+FzncKp/ZkdfjQploDhBWtWfU8rPvIjaxeZcPfHMI5/A==} cpu: [arm64] os: [linux] - libc: [musl] '@rspack/binding-linux-arm64-musl@1.6.8': resolution: {integrity: sha512-++XMKcMNrt59HcFBLnRaJcn70k3X0GwkAegZBVpel8xYIAgvoXT5+L8P1ExId/yTFxqedaz8DbcxQnNmMozviw==} cpu: [arm64] os: [linux] - libc: [musl] '@rspack/binding-linux-arm64-musl@1.7.9': resolution: {integrity: sha512-VjfmR1hgO9n3L6MaE5KG+DXSrrLVqHHOkVcOtS2LMq3bjMTwbBywY7ycymcLnX5KJsol8d3ZGYep6IfSOt3lFA==} cpu: [arm64] os: [linux] - libc: [musl] '@rspack/binding-linux-arm64-musl@2.0.0-beta.0': resolution: {integrity: sha512-S2fshx0Rf7/XYwoMLaqFsVg4y+VAfHzubrczy8AW5xIs6UNC3eRLVTgShLerUPtF6SG+v6NQxQ9JI3vOo2qPOA==} cpu: [arm64] os: [linux] - libc: [musl] '@rspack/binding-linux-x64-gnu@0.7.5': resolution: {integrity: sha512-R0Lu4CJN2nWMW7WzPBuCIju80cQPpcaqwKJDj/quwQySpJJZ6c5qGwB8mntqjxIzZDrNH6u0OkpiUTbvWZj8ww==} cpu: [x64] os: [linux] - libc: [glibc] '@rspack/binding-linux-x64-gnu@1.0.14': resolution: {integrity: sha512-5vzaDRw3/sGKo3ax/1cU3/cxqNjajwlt2LU288vXNe1/n8oe/pcDfYcTugpOe/A1DqzadanudJszLpFcKsaFtQ==} cpu: [x64] os: [linux] - libc: [glibc] '@rspack/binding-linux-x64-gnu@1.3.11': resolution: {integrity: sha512-k3OyvLneX2ZeL8z/OzPojpImqy6PgqKJD+NtOvcr/TgbgADHZ3xQttf6B2X+qnZMAgOZ+RTeTkOFrvsg9AEKmA==} cpu: [x64] os: [linux] - libc: [glibc] '@rspack/binding-linux-x64-gnu@1.3.15': resolution: {integrity: sha512-qGB8ucHklrzNg6lsAS36VrBsCbOw0acgpQNqTE5cuHWrp1Pu3GFTRiFEogenxEmzoRbohMZt0Ev5grivrcgKBQ==} cpu: [x64] os: [linux] - libc: [glibc] '@rspack/binding-linux-x64-gnu@1.3.9': resolution: {integrity: sha512-82izGJw/qxJ4xaHJy/A4MF7aTRT9tE6VlWoWM4rJmqRszfujN/w54xJRie9jkt041TPvJWGNpYD4Hjpt0/n/oA==} cpu: [x64] os: [linux] - libc: [glibc] '@rspack/binding-linux-x64-gnu@1.4.11': resolution: {integrity: sha512-bHYFLxPPYBOSaHdQbEoCYGMQ1gOrEWj7Mro/DLfSHZi1a0okcQ2Q1y0i1DczReim3ZhLGNrK7k1IpFXCRbAobQ==} cpu: [x64] os: [linux] - libc: [glibc] '@rspack/binding-linux-x64-gnu@1.5.8': resolution: {integrity: sha512-XLxh5n/pzUfxsugz/8rVBv+Tx2nqEM+9rharK69kfooDsQNKyz7PANllBQ/v4svJ+W0BRHnDL4qXSGdteZeEjA==} cpu: [x64] os: [linux] - libc: [glibc] '@rspack/binding-linux-x64-gnu@1.6.0-beta.1': resolution: {integrity: sha512-LqAos71CJS5/V4knX9T7T68oGz0XPRZ2IJmI3jEByRlNcyZdxYeQ7Dw09JO9Y5Xj0T+0cudOeL2MxHcD3gTF/w==} cpu: [x64] os: [linux] - libc: [glibc] '@rspack/binding-linux-x64-gnu@1.6.8': resolution: {integrity: sha512-tv3BWkTE1TndfX+DsE1rSTg8fBevCxujNZ3MlfZ22Wfy9x1FMXTJlWG8VIOXmaaJ1wUHzv8S7cE2YUUJ2LuiCg==} cpu: [x64] os: [linux] - libc: [glibc] '@rspack/binding-linux-x64-gnu@1.7.9': resolution: {integrity: sha512-0kldV+3WTs/VYDWzxJ7K40hCW26IHtnk8xPK3whKoo1649rgeXXa0EdsU5P7hG8Ef5SWQjHHHZ/fuHYSO3Y6HA==} cpu: [x64] os: [linux] - libc: [glibc] '@rspack/binding-linux-x64-gnu@2.0.0-beta.0': resolution: {integrity: sha512-yx5Fk1gl7lfkvqcjolNLCNeduIs6C2alMsQ/kZ1pLeP5MPquVOYNqs6EcDPIp+fUjo3lZYtnJBiZKK+QosbzYg==} cpu: [x64] os: [linux] - libc: [glibc] '@rspack/binding-linux-x64-musl@0.7.5': resolution: {integrity: sha512-dDgi/ThikMy1m4llxPeEXDCA2I8F8ezFS/eCPLZGU2/J1b4ALwDjuRsMmo+VXSlFCKgIt98V6h1woeg7nu96yg==} cpu: [x64] os: [linux] - libc: [musl] '@rspack/binding-linux-x64-musl@1.0.14': resolution: {integrity: sha512-4U6QD9xVS1eGme52DuJr6Fg/KdcUfJ+iKwH49Up460dZ/fLvGylnVGA+V0mzPlKi8gfy7NwFuYXZdu3Pwi1YYg==} cpu: [x64] os: [linux] - libc: [musl] '@rspack/binding-linux-x64-musl@1.3.11': resolution: {integrity: sha512-2agcELyyQ95jWGCW0YWD0TvAcN40yUjmxn9NXQBLHPX5Eb07NaHXairMsvV9vqQsPsq0nxxfd9Wsow18Y5r/Hw==} cpu: [x64] os: [linux] - libc: [musl] '@rspack/binding-linux-x64-musl@1.3.15': resolution: {integrity: sha512-qRn6e40fLQP+N2rQD8GAj/h4DakeTIho32VxTIaHRVuzw68ZD7VmKkwn55ssN370ejmey35ZdoNFNE12RBrMZA==} cpu: [x64] os: [linux] - libc: [musl] '@rspack/binding-linux-x64-musl@1.3.9': resolution: {integrity: sha512-V9nDg63iPI6Z7kM11UPV5kBdOdLXPIu3IgI2ObON5Rd4KEZr7RLo/Q4HKzj0IH27Zwl5qeBJdx69zZdu66eOqg==} cpu: [x64] os: [linux] - libc: [musl] '@rspack/binding-linux-x64-musl@1.4.11': resolution: {integrity: sha512-wrm4E7q2k4+cwT6Uhp6hIQ3eUe/YoaUttj6j5TqHYZX6YeLrNPtD9+ne6lQQ17BV8wmm6NZsmoFIJ5xIptpRhQ==} cpu: [x64] os: [linux] - libc: [musl] '@rspack/binding-linux-x64-musl@1.5.8': resolution: {integrity: sha512-gE0+MZmwF+01p9/svpEESkzkLpBkVUG2o03YMpwXYC/maeRRhWvF8BJ7R3i/Ls/jFGSE87dKX5NbRLVzqksq/w==} cpu: [x64] os: [linux] - libc: [musl] '@rspack/binding-linux-x64-musl@1.6.0-beta.1': resolution: {integrity: sha512-E4dRMzIHYaoYkgmDTFLrgnGtdspbAuVbLfaPF9AWW5YkQn52obGAgbbNb1wi1JJ5f29nTBoLauYCucEO5IGFvA==} cpu: [x64] os: [linux] - libc: [musl] '@rspack/binding-linux-x64-musl@1.6.8': resolution: {integrity: sha512-DCGgZ5/in1O3FjHWqXnDsncRy+48cMhfuUAAUyl0yDj1NpsZu9pP+xfGLvGcQTiYrVl7IH9Aojf1eShP/77WGA==} cpu: [x64] os: [linux] - libc: [musl] '@rspack/binding-linux-x64-musl@1.7.9': resolution: {integrity: sha512-Gi4872cFtc2d83FKATR6Qcf2VBa/tFCqffI/IwRRl6Hx5FulEBqx+tH7gAuRVF693vrbXNxK+FQ+k4iEsEJxrw==} cpu: [x64] os: [linux] - libc: [musl] '@rspack/binding-linux-x64-musl@2.0.0-beta.0': resolution: {integrity: sha512-sBX4b2W0PgehlAVT224k0Q6GaH6t9HP+hBNDrbX/g6d0hfxZN56gm5NfOTOD1Rien4v7OBEejJ3/uFbm1WjwYQ==} cpu: [x64] os: [linux] - libc: [musl] '@rspack/binding-wasm32-wasi@1.4.11': resolution: {integrity: sha512-hiYxHZjaZ17wQtXyLCK0IdtOvMWreGVTiGsaHCxyeT+SldDG+r16bXNjmlqfZsjlfl1mkAqKz1dg+mMX28OTqw==} @@ -12783,84 +12699,72 @@ packages: engines: {node: '>=10'} cpu: [arm64] os: [linux] - libc: [glibc] '@swc/core-linux-arm64-gnu@1.15.8': resolution: {integrity: sha512-o+1y5u6k2FfPYbTRUPvurwzNt5qd0NTumCTFscCNuBksycloXY16J8L+SMW5QRX59n4Hp9EmFa3vpvNHRVv1+Q==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - libc: [glibc] '@swc/core-linux-arm64-gnu@1.7.26': resolution: {integrity: sha512-YKevOV7abpjcAzXrhsl+W48Z9mZvgoVs2eP5nY+uoMAdP2b3GxC0Df1Co0I90o2lkzO4jYBpTMcZlmUXLdXn+Q==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - libc: [glibc] '@swc/core-linux-arm64-musl@1.15.10': resolution: {integrity: sha512-4uAHO3nbfbrTcmO/9YcVweTQdx5fN3l7ewwl5AEK4yoC4wXmoBTEPHAVdKNe4r9+xrTgd4BgyPsy0409OjjlMw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - libc: [musl] '@swc/core-linux-arm64-musl@1.15.8': resolution: {integrity: sha512-koiCqL09EwOP1S2RShCI7NbsQuG6r2brTqUYE7pV7kZm9O17wZ0LSz22m6gVibpwEnw8jI3IE1yYsQTVpluALw==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - libc: [musl] '@swc/core-linux-arm64-musl@1.7.26': resolution: {integrity: sha512-3w8iZICMkQQON0uIcvz7+Q1MPOW6hJ4O5ETjA0LSP/tuKqx30hIniCGOgPDnv3UTMruLUnQbtBwVCZTBKR3Rkg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - libc: [musl] '@swc/core-linux-x64-gnu@1.15.10': resolution: {integrity: sha512-W0h9ONNw1pVIA0cN7wtboOSTl4Jk3tHq+w2cMPQudu9/+3xoCxpFb9ZdehwCAk29IsvdWzGzY6P7dDVTyFwoqg==} engines: {node: '>=10'} cpu: [x64] os: [linux] - libc: [glibc] '@swc/core-linux-x64-gnu@1.15.8': resolution: {integrity: sha512-4p6lOMU3bC+Vd5ARtKJ/FxpIC5G8v3XLoPEZ5s7mLR8h7411HWC/LmTXDHcrSXRC55zvAVia1eldy6zDLz8iFQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] - libc: [glibc] '@swc/core-linux-x64-gnu@1.7.26': resolution: {integrity: sha512-c+pp9Zkk2lqb06bNGkR2Looxrs7FtGDMA4/aHjZcCqATgp348hOKH5WPvNLBl+yPrISuWjbKDVn3NgAvfvpH4w==} engines: {node: '>=10'} cpu: [x64] os: [linux] - libc: [glibc] '@swc/core-linux-x64-musl@1.15.10': resolution: {integrity: sha512-XQNZlLZB62S8nAbw7pqoqwy91Ldy2RpaMRqdRN3T+tAg6Xg6FywXRKCsLh6IQOadr4p1+lGnqM/Wn35z5a/0Vw==} engines: {node: '>=10'} cpu: [x64] os: [linux] - libc: [musl] '@swc/core-linux-x64-musl@1.15.8': resolution: {integrity: sha512-z3XBnbrZAL+6xDGAhJoN4lOueIxC/8rGrJ9tg+fEaeqLEuAtHSW2QHDHxDwkxZMjuF/pZ6MUTjHjbp8wLbuRLA==} engines: {node: '>=10'} cpu: [x64] os: [linux] - libc: [musl] '@swc/core-linux-x64-musl@1.7.26': resolution: {integrity: sha512-PgtyfHBF6xG87dUSSdTJHwZ3/8vWZfNIXQV2GlwEpslrOkGqy+WaiiyE7Of7z9AvDILfBBBcJvJ/r8u980wAfQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] - libc: [musl] '@swc/core-win32-arm64-msvc@1.15.10': resolution: {integrity: sha512-qnAGrRv5Nj/DATxAmCnJQRXXQqnJwR0trxLndhoHoxGci9MuguNIjWahS0gw8YZFjgTinbTxOwzatkoySihnmw==} @@ -13978,49 +13882,41 @@ packages: resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} cpu: [arm64] os: [linux] - libc: [glibc] '@unrs/resolver-binding-linux-arm64-musl@1.11.1': resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} cpu: [arm64] os: [linux] - libc: [musl] '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} cpu: [ppc64] os: [linux] - libc: [glibc] '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} cpu: [riscv64] os: [linux] - libc: [glibc] '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} cpu: [riscv64] os: [linux] - libc: [musl] '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} cpu: [s390x] os: [linux] - libc: [glibc] '@unrs/resolver-binding-linux-x64-gnu@1.11.1': resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} cpu: [x64] os: [linux] - libc: [glibc] '@unrs/resolver-binding-linux-x64-musl@1.11.1': resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} cpu: [x64] os: [linux] - libc: [musl] '@unrs/resolver-binding-wasm32-wasi@1.11.1': resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} @@ -18171,6 +18067,10 @@ packages: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} + fs-fingerprint@0.11.0: + resolution: {integrity: sha512-EpEtmn1T9bLxxf+506gVdpehs6pAIFAM6UCDtT9/J7tfLXg8FPn+3jmuVnMjjRFshJohR2lb2TZGwuZAhIOcKg==} + engines: {node: '>=20.0.0'} + fs-minipass@1.2.7: resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==} @@ -23891,56 +23791,48 @@ packages: engines: {node: '>=14.0.0'} cpu: [arm64] os: [linux] - libc: glibc sass-embedded-linux-arm@1.98.0: resolution: {integrity: sha512-03baQZCxVyEp8v1NWBRlzGYrmVT/LK7ZrHlF1piscGiGxwfdxoLXVuxsylx3qn/dD/4i/rh7Bzk7reK1br9jvQ==} engines: {node: '>=14.0.0'} cpu: [arm] os: [linux] - libc: glibc sass-embedded-linux-musl-arm64@1.98.0: resolution: {integrity: sha512-LeqNxQA8y4opjhe68CcFvMzCSrBuJqYVFbwElEj9bagHXQHTp9xVPJRn6VcrC+0VLEDq13HVXMv7RslIuU0zmA==} engines: {node: '>=14.0.0'} cpu: [arm64] os: [linux] - libc: musl sass-embedded-linux-musl-arm@1.98.0: resolution: {integrity: sha512-OBkjTDPYR4hSaueOGIM6FDpl9nt/VZwbSRpbNu9/eEJcxE8G/vynRugW8KRZmCFjPy8j/jkGBvvS+k9iOqKV3g==} engines: {node: '>=14.0.0'} cpu: [arm] os: [linux] - libc: musl sass-embedded-linux-musl-riscv64@1.98.0: resolution: {integrity: sha512-7w6hSuOHKt8FZsmjRb3iGSxEzM87fO9+M8nt5JIQYMhHTj5C+JY/vcske0v715HCVj5e1xyTnbGXf8FcASeAIw==} engines: {node: '>=14.0.0'} cpu: [riscv64] os: [linux] - libc: musl sass-embedded-linux-musl-x64@1.98.0: resolution: {integrity: sha512-QikNyDEJOVqPmxyCFkci8ZdCwEssdItfjQFJB+D+Uy5HFqcS5Lv3d3GxWNX/h1dSb23RPyQdQc267ok5SbEyJw==} engines: {node: '>=14.0.0'} cpu: [x64] os: [linux] - libc: musl sass-embedded-linux-riscv64@1.98.0: resolution: {integrity: sha512-E7fNytc/v4xFBQKzgzBddV/jretA4ULAPO6XmtBiQu4zZBdBozuSxsQLe2+XXeb0X4S2GIl72V7IPABdqke/vA==} engines: {node: '>=14.0.0'} cpu: [riscv64] os: [linux] - libc: glibc sass-embedded-linux-x64@1.98.0: resolution: {integrity: sha512-VsvP0t/uw00mMNPv3vwyYKUrFbqzxQHnRMO+bHdAMjvLw4NFf6mscpym9Bzf+NXwi1ZNKnB6DtXjmcpcvqFqYg==} engines: {node: '>=14.0.0'} cpu: [x64] os: [linux] - libc: glibc sass-embedded-unknown-all@1.98.0: resolution: {integrity: sha512-C4MMzcAo3oEDQnW7L8SBgB9F2Fq5qHPnaYTZRMOH3Mp/7kM4OooBInXpCiiFjLnjY95hzP4KyctVx0uYR6MYlQ==} @@ -28244,12 +28136,23 @@ snapshots: picocolors: 1.1.1 sisteransi: 1.0.5 + '@clack/core@0.5.0': + dependencies: + picocolors: 1.1.1 + sisteransi: 1.0.5 + '@clack/prompts@0.10.1': dependencies: '@clack/core': 0.4.2 picocolors: 1.1.1 sisteransi: 1.0.5 + '@clack/prompts@0.11.0': + dependencies: + '@clack/core': 0.5.0 + picocolors: 1.1.1 + sisteransi: 1.0.5 + '@clack/prompts@0.8.2': dependencies: '@clack/core': 0.3.5 @@ -35921,6 +35824,33 @@ snapshots: transitivePeerDependencies: - supports-color + '@rock-js/config@0.13.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@rock-js/provider-github': 0.13.0 + '@rock-js/tools': 0.13.0 + joi: 17.13.3 + tslib: 2.8.1 + + '@rock-js/provider-github@0.13.0': + dependencies: + '@rock-js/tools': 0.13.0 + ts-regex-builder: 1.8.2 + tslib: 2.8.1 + + '@rock-js/tools@0.13.0': + dependencies: + '@clack/prompts': 0.11.0 + adm-zip: 0.5.16 + appdirsjs: 1.2.7 + fs-fingerprint: 0.11.0 + is-unicode-supported: 2.1.0 + nano-spawn: 0.2.1 + picocolors: 1.1.1 + string-argv: 0.3.2 + tar: 7.5.11 + tslib: 2.8.1 + '@rolldown/binding-android-arm64@1.0.0-rc.3': optional: true @@ -39822,8 +39752,8 @@ snapshots: '@typescript-eslint/project-service@8.54.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.54.0(typescript@5.9.3) - '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/tsconfig-utils': 8.57.1(typescript@5.9.3) + '@typescript-eslint/types': 8.57.1 debug: 4.4.3(supports-color@8.1.1) typescript: 5.9.3 transitivePeerDependencies: @@ -39831,8 +39761,8 @@ snapshots: '@typescript-eslint/project-service@8.56.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.56.1(typescript@5.9.3) - '@typescript-eslint/types': 8.56.1 + '@typescript-eslint/tsconfig-utils': 8.57.1(typescript@5.9.3) + '@typescript-eslint/types': 8.57.1 debug: 4.4.3(supports-color@8.1.1) typescript: 5.9.3 transitivePeerDependencies: @@ -46257,6 +46187,11 @@ snapshots: jsonfile: 6.2.0 universalify: 2.0.1 + fs-fingerprint@0.11.0: + dependencies: + p-limit: 7.2.0 + tinyglobby: 0.2.15 + fs-minipass@1.2.7: dependencies: minipass: 2.9.0 @@ -56721,26 +56656,6 @@ snapshots: optionalDependencies: '@swc/core': 1.7.26(@swc/helpers@0.5.13) - ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.17))(@types/node@20.19.5)(typescript@5.9.3): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.12 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 20.19.5 - acorn: 8.16.0 - acorn-walk: 8.3.5 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.4 - make-error: 1.3.6 - typescript: 5.9.3 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - optionalDependencies: - '@swc/core': 1.15.10(@swc/helpers@0.5.17) - ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.17))(@types/node@22.19.15)(typescript@5.6.3): dependencies: '@cspotcode/source-map-support': 0.8.1 From c7326fec0b1181380e716ddf1366c6743471b4cd Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Fri, 10 Apr 2026 13:06:44 +0200 Subject: [PATCH 02/15] refactor(metro): migrate example apps and CI from RNEF to ROCKjs Migrate all three metro example apps (host, mini, nested-mini) from @rnef/* packages to @rock-js/* (v0.13.0). Update native build files, e2e scripts, and CI workflow to use Rock tooling and actions v3. --- .github/workflows/e2e-metro.yml | 28 +- apps/metro-example-host/.gitignore | 3 +- apps/metro-example-host/Gemfile.lock | 30 +- .../android/app/build.gradle | 2 +- .../android/settings.gradle | 2 +- .../MFExampleHost.xcodeproj/project.pbxproj | 2 +- apps/metro-example-host/ios/Podfile | 2 +- apps/metro-example-host/ios/Podfile.lock | 4 +- apps/metro-example-host/package.json | 20 +- .../{rnef.config.mjs => rock.config.mjs} | 10 +- apps/metro-example-mini/.gitignore | 3 +- apps/metro-example-mini/Gemfile.lock | 30 +- .../android/app/build.gradle | 2 +- .../android/settings.gradle | 2 +- apps/metro-example-mini/ios/Podfile | 2 +- apps/metro-example-mini/ios/Podfile.lock | 4 +- .../ios/mini.xcodeproj/project.pbxproj | 2 +- apps/metro-example-mini/package.json | 20 +- .../{rnef.config.mjs => rock.config.mjs} | 10 +- apps/metro-example-nested-mini/.gitignore | 3 +- apps/metro-example-nested-mini/Gemfile.lock | 15 +- .../android/app/build.gradle | 2 +- .../android/settings.gradle | 2 +- apps/metro-example-nested-mini/ios/Podfile | 2 +- .../ios/Podfile.lock | 4 +- .../ios/mini.xcodeproj/project.pbxproj | 2 +- apps/metro-example-nested-mini/package.json | 20 +- .../{rnef.config.mjs => rock.config.mjs} | 10 +- pnpm-lock.yaml | 670 ++++++++++++------ tools/scripts/run-metro-e2e.mjs | 22 +- 30 files changed, 602 insertions(+), 328 deletions(-) rename apps/metro-example-host/{rnef.config.mjs => rock.config.mjs} (56%) rename apps/metro-example-mini/{rnef.config.mjs => rock.config.mjs} (56%) rename apps/metro-example-nested-mini/{rnef.config.mjs => rock.config.mjs} (56%) diff --git a/.github/workflows/e2e-metro.yml b/.github/workflows/e2e-metro.yml index 597e89b9ff6..8d72b4fee97 100644 --- a/.github/workflows/e2e-metro.yml +++ b/.github/workflows/e2e-metro.yml @@ -121,15 +121,15 @@ jobs: echo "${HOME}/.maestro/bin" >> "$GITHUB_PATH" shell: bash - - name: Configure RNEF cache auth + - name: Configure Rock cache auth shell: bash run: | - RNEF_PATH="apps/metro-${{ env.METRO_APP_NAME }}/.rnef/cache" - mkdir -p "$RNEF_PATH" - echo "{\"githubToken\": \"${{ secrets.GITHUB_TOKEN }}\"}" > "$RNEF_PATH/project.json" + ROCK_PATH="apps/metro-${{ env.METRO_APP_NAME }}/.rock/cache" + mkdir -p "$ROCK_PATH" + echo "{\"githubToken\": \"${{ secrets.GITHUB_TOKEN }}\"}" > "$ROCK_PATH/project.json" - - name: Build Metro Android app (RNEF action) - uses: callstackincubator/android@v1 + - name: Build Metro Android app (Rock action) + uses: callstackincubator/android@v3 with: github-token: ${{ secrets.GITHUB_TOKEN }} comment-bot: false @@ -152,7 +152,7 @@ jobs: disable-animations: true emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none script: | - node tools/scripts/run-metro-e2e.mjs --platform=android --appName=${{ env.METRO_APP_NAME }} --skip-rnef-cache-auth + node tools/scripts/run-metro-e2e.mjs --platform=android --appName=${{ env.METRO_APP_NAME }} --skip-rock-cache-auth - name: Upload Android Maestro logs on failure if: failure() @@ -221,15 +221,15 @@ jobs: echo "${HOME}/.maestro/bin" >> "$GITHUB_PATH" shell: bash - - name: Configure RNEF cache auth + - name: Configure Rock cache auth shell: bash run: | - RNEF_PATH="apps/metro-${{ env.METRO_APP_NAME }}/.rnef/cache" - mkdir -p "$RNEF_PATH" - echo "{\"githubToken\": \"${{ secrets.GITHUB_TOKEN }}\"}" > "$RNEF_PATH/project.json" + ROCK_PATH="apps/metro-${{ env.METRO_APP_NAME }}/.rock/cache" + mkdir -p "$ROCK_PATH" + echo "{\"githubToken\": \"${{ secrets.GITHUB_TOKEN }}\"}" > "$ROCK_PATH/project.json" - - name: Build Metro iOS app (RNEF action) - uses: callstackincubator/ios@v1 + - name: Build Metro iOS app (Rock action) + uses: callstackincubator/ios@v3 with: github-token: ${{ secrets.GITHUB_TOKEN }} comment-bot: false @@ -241,7 +241,7 @@ jobs: - name: Run Metro iOS E2E tests env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: node tools/scripts/run-metro-e2e.mjs --platform=ios --appName=${{ env.METRO_APP_NAME }} --skip-rnef-cache-auth + run: node tools/scripts/run-metro-e2e.mjs --platform=ios --appName=${{ env.METRO_APP_NAME }} --skip-rock-cache-auth shell: bash - name: Upload iOS Maestro logs on failure diff --git a/apps/metro-example-host/.gitignore b/apps/metro-example-host/.gitignore index 4ea16da8b4a..0d6dd737b32 100644 --- a/apps/metro-example-host/.gitignore +++ b/apps/metro-example-host/.gitignore @@ -77,5 +77,6 @@ yarn-error.log # build artifacts dist/ -# RNEF +# Rock +.rock .rnef diff --git a/apps/metro-example-host/Gemfile.lock b/apps/metro-example-host/Gemfile.lock index 37bf8d9dbe2..c4c92d212c9 100644 --- a/apps/metro-example-host/Gemfile.lock +++ b/apps/metro-example-host/Gemfile.lock @@ -2,19 +2,20 @@ GEM remote: https://rubygems.org/ specs: CFPropertyList (3.0.9) - activesupport (7.2.3.1) + activesupport (7.1.6) base64 benchmark (>= 0.3) bigdecimal - concurrent-ruby (~> 1.0, >= 1.3.1) + concurrent-ruby (~> 1.0, >= 1.0.2) connection_pool (>= 2.2.5) drb i18n (>= 1.6, < 2) logger (>= 1.4.2) - minitest (>= 5.1, < 6) + minitest (>= 5.1) + mutex_m securerandom (>= 0.3) - tzinfo (~> 2.0, >= 2.0.5) - addressable (2.8.8) + tzinfo (~> 2.0) + addressable (2.9.0) public_suffix (>= 2.0.2, < 8.0) algoliasearch (1.27.5) httpclient (~> 2.8, >= 2.8.3) @@ -22,7 +23,7 @@ GEM atomos (0.1.3) base64 (0.3.0) benchmark (0.5.0) - bigdecimal (4.0.1) + bigdecimal (4.1.1) claide (1.1.0) cocoapods (1.15.2) addressable (~> 2.8) @@ -63,12 +64,13 @@ GEM cocoapods-try (1.2.0) colored2 (3.1.2) concurrent-ruby (1.3.3) - connection_pool (3.0.2) + connection_pool (2.5.5) drb (2.2.3) escape (0.0.4) - ethon (0.15.0) + ethon (0.18.0) ffi (>= 1.15.0) - ffi (1.17.3) + logger + ffi (1.17.4) fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) @@ -76,9 +78,9 @@ GEM mutex_m i18n (1.14.8) concurrent-ruby (~> 1.0) - json (2.18.1) + json (2.19.3) logger (1.7.0) - minitest (5.27.0) + minitest (5.26.1) molinillo (0.8.0) mutex_m (0.3.0) nanaimo (0.3.0) @@ -87,9 +89,9 @@ GEM public_suffix (4.0.7) rexml (3.4.4) ruby-macho (2.5.1) - securerandom (0.4.1) - typhoeus (1.5.0) - ethon (>= 0.9.0, < 0.16.0) + securerandom (0.3.2) + typhoeus (1.6.0) + ethon (>= 0.18.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) xcodeproj (1.25.1) diff --git a/apps/metro-example-host/android/app/build.gradle b/apps/metro-example-host/android/app/build.gradle index f8eac47f2dc..62a6fbb9555 100644 --- a/apps/metro-example-host/android/app/build.gradle +++ b/apps/metro-example-host/android/app/build.gradle @@ -15,7 +15,7 @@ react { // The folder where the react-native Codegen package is. Default is ../../node_modules/@react-native/codegen codegenDir = file("../../../../node_modules/@react-native/codegen") // The cli.js file which is the React Native CLI entrypoint. Default is ../../node_modules/react-native/cli.js - cliFile = file("../../node_modules/@rnef/cli/dist/src/bin.js") + cliFile = file("../../node_modules/rock/dist/src/bin.js") /* Variants */ // The list of variants to that are debuggable. For those we're going to diff --git a/apps/metro-example-host/android/settings.gradle b/apps/metro-example-host/android/settings.gradle index 8d38b5abb6e..961118a98b2 100644 --- a/apps/metro-example-host/android/settings.gradle +++ b/apps/metro-example-host/android/settings.gradle @@ -1,6 +1,6 @@ pluginManagement { includeBuild("../node_modules/@react-native/gradle-plugin") } plugins { id("com.facebook.react.settings") } -extensions.configure(com.facebook.react.ReactSettingsExtension){ ex -> ex.autolinkLibrariesFromCommand(['npx', 'rnef', 'config', '-p', 'android']) } +extensions.configure(com.facebook.react.ReactSettingsExtension){ ex -> ex.autolinkLibrariesFromCommand(['npx', 'rock', 'config', '-p', 'android']) } rootProject.name = "MFExampleHost" include ':app' includeBuild('../node_modules/@react-native/gradle-plugin') diff --git a/apps/metro-example-host/ios/MFExampleHost.xcodeproj/project.pbxproj b/apps/metro-example-host/ios/MFExampleHost.xcodeproj/project.pbxproj index 5402edaaa7d..9f351e1330e 100644 --- a/apps/metro-example-host/ios/MFExampleHost.xcodeproj/project.pbxproj +++ b/apps/metro-example-host/ios/MFExampleHost.xcodeproj/project.pbxproj @@ -181,7 +181,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "set -e\nif [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\nsource \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\nsource \"$PODS_ROOT/../.xcode.env.local\"\nfi\nexport BUNDLE_COMMAND=\"bundle-mf-host\"\nexport CONFIG_CMD=\"dummy-workaround-value\"\nexport CLI_PATH=\"$(\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('@rnef/cli/package.json')) + '/dist/src/bin.js'\")\"\nWITH_ENVIRONMENT=\"$REACT_NATIVE_PATH/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"$REACT_NATIVE_PATH/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; + shellScript = "set -e\nif [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\nsource \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\nsource \"$PODS_ROOT/../.xcode.env.local\"\nfi\nexport BUNDLE_COMMAND=\"bundle-mf-host\"\nexport CONFIG_CMD=\"dummy-workaround-value\"\nexport CLI_PATH=\"$(\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('rock/package.json')) + '/dist/src/bin.js'\")\"\nWITH_ENVIRONMENT=\"$REACT_NATIVE_PATH/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"$REACT_NATIVE_PATH/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; }; 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; diff --git a/apps/metro-example-host/ios/Podfile b/apps/metro-example-host/ios/Podfile index 16b4df67d93..ed9ba5d996a 100644 --- a/apps/metro-example-host/ios/Podfile +++ b/apps/metro-example-host/ios/Podfile @@ -15,7 +15,7 @@ if linkage != nil end target 'MFExampleHost' do - config = use_native_modules!(['npx', 'rnef', 'config', '-p', 'ios']) + config = use_native_modules!(['npx', 'rock', 'config', '-p', 'ios']) use_react_native!( :path => config[:reactNativePath], diff --git a/apps/metro-example-host/ios/Podfile.lock b/apps/metro-example-host/ios/Podfile.lock index 2371e98e88d..c4688f20586 100644 --- a/apps/metro-example-host/ios/Podfile.lock +++ b/apps/metro-example-host/ios/Podfile.lock @@ -2422,11 +2422,11 @@ SPEC CHECKSUMS: React-timing: a275a1c2e6112dba17f8f7dd496d439213bbea0d React-utils: 449a6e1fd53886510e284e80bdbb1b1c6db29452 ReactAppDependencyProvider: 3267432b637c9b38e86961b287f784ee1b08dde0 - ReactCodegen: 2539080349c02b1edbf525d0a392df99f984f34b + ReactCodegen: 7b0bacf7557bfaf82e2ea8a24903b7e0e15d4840 ReactCommon: b028d09a66e60ebd83ca59d8cc9a1216360db147 SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 Yoga: 395b5d614cd7cbbfd76b05d01bd67230a6ad004e -PODFILE CHECKSUM: d7ddd7fd39d49e0dd5d1205cb5dc83483092e5fb +PODFILE CHECKSUM: f7c15fdb9b5b2df0ae134c62754cc4c92ec20ff0 COCOAPODS: 1.15.2 diff --git a/apps/metro-example-host/package.json b/apps/metro-example-host/package.json index 571c33127f9..7d68c7f10ca 100644 --- a/apps/metro-example-host/package.json +++ b/apps/metro-example-host/package.json @@ -3,13 +3,13 @@ "version": "0.0.1", "private": true, "scripts": { - "android": "rnef run:android", - "ios": "rnef run:ios", - "android:release": "rnef run:android --variant 'Release'", - "ios:release": "rnef run:ios --configuration 'Release' --destination=\"simulator\"", + "android": "rock run:android", + "ios": "rock run:ios", + "android:release": "rock run:android --variant 'Release'", + "ios:release": "rock run:ios --configuration 'Release' --destination=\"simulator\"", "lint": "ESLINT_USE_FLAT_CONFIG=false eslint .", "dev": "nodemon --config ../../nodemon.json --exec NODE_OPTIONS='--conditions=dev' pnpm start", - "start": "rnef start --reset-cache --client-logs", + "start": "rock start --reset-cache --client-logs", "pods": "(cd ios && bundle install && (bundle exec pod install || bundle exec pod update))", "test": "jest", "adbreverse": "pnpm --filter example-mini --filter example-nested-mini run adbreverse", @@ -30,17 +30,17 @@ "@babel/preset-env": "^7.25.3", "@babel/runtime": "^7.25.0", "@module-federation/metro": "workspace:*", - "@module-federation/metro-plugin-rnef": "workspace:*", + "@module-federation/metro-plugin-rock": "workspace:*", "@module-federation/runtime": "workspace:*", "@react-native/babel-preset": "0.80.0", "@react-native/eslint-config": "0.80.0", "@react-native/gradle-plugin": "0.80.0", "@react-native/metro-config": "0.80.0", "@react-native/typescript-config": "0.80.0", - "@rnef/cli": "^0.7.25", - "@rnef/platform-android": "^0.7.25", - "@rnef/platform-ios": "^0.7.25", - "@rnef/plugin-metro": "^0.7.25", + "rock": "^0.13.0", + "@rock-js/platform-android": "^0.13.0", + "@rock-js/platform-ios": "^0.13.0", + "@rock-js/plugin-metro": "^0.13.0", "@types/jest": "^29.5.13", "@types/lodash": "^4", "@types/react": "^19.1.0", diff --git a/apps/metro-example-host/rnef.config.mjs b/apps/metro-example-host/rock.config.mjs similarity index 56% rename from apps/metro-example-host/rnef.config.mjs rename to apps/metro-example-host/rock.config.mjs index d0d538260e3..08cd95befab 100644 --- a/apps/metro-example-host/rnef.config.mjs +++ b/apps/metro-example-host/rock.config.mjs @@ -1,10 +1,10 @@ -import {pluginMetroModuleFederation} from '@module-federation/metro-plugin-rnef'; -import {platformAndroid} from '@rnef/platform-android'; +import {pluginMetroModuleFederation} from '@module-federation/metro-plugin-rock'; +import {platformAndroid} from '@rock-js/platform-android'; // @ts-check -import {platformIOS} from '@rnef/platform-ios'; -import {pluginMetro} from '@rnef/plugin-metro'; +import {platformIOS} from '@rock-js/platform-ios'; +import {pluginMetro} from '@rock-js/plugin-metro'; -/** @type {import('@rnef/config').Config} */ +/** @type {import('rock').Config} */ export default { bundler: pluginMetro(), platforms: { diff --git a/apps/metro-example-mini/.gitignore b/apps/metro-example-mini/.gitignore index 0a551b47138..3195290ee75 100644 --- a/apps/metro-example-mini/.gitignore +++ b/apps/metro-example-mini/.gitignore @@ -77,5 +77,6 @@ yarn-error.log # build artifacts dist/ -# RNEF +# Rock +.rock .rnef \ No newline at end of file diff --git a/apps/metro-example-mini/Gemfile.lock b/apps/metro-example-mini/Gemfile.lock index 37bf8d9dbe2..c4c92d212c9 100644 --- a/apps/metro-example-mini/Gemfile.lock +++ b/apps/metro-example-mini/Gemfile.lock @@ -2,19 +2,20 @@ GEM remote: https://rubygems.org/ specs: CFPropertyList (3.0.9) - activesupport (7.2.3.1) + activesupport (7.1.6) base64 benchmark (>= 0.3) bigdecimal - concurrent-ruby (~> 1.0, >= 1.3.1) + concurrent-ruby (~> 1.0, >= 1.0.2) connection_pool (>= 2.2.5) drb i18n (>= 1.6, < 2) logger (>= 1.4.2) - minitest (>= 5.1, < 6) + minitest (>= 5.1) + mutex_m securerandom (>= 0.3) - tzinfo (~> 2.0, >= 2.0.5) - addressable (2.8.8) + tzinfo (~> 2.0) + addressable (2.9.0) public_suffix (>= 2.0.2, < 8.0) algoliasearch (1.27.5) httpclient (~> 2.8, >= 2.8.3) @@ -22,7 +23,7 @@ GEM atomos (0.1.3) base64 (0.3.0) benchmark (0.5.0) - bigdecimal (4.0.1) + bigdecimal (4.1.1) claide (1.1.0) cocoapods (1.15.2) addressable (~> 2.8) @@ -63,12 +64,13 @@ GEM cocoapods-try (1.2.0) colored2 (3.1.2) concurrent-ruby (1.3.3) - connection_pool (3.0.2) + connection_pool (2.5.5) drb (2.2.3) escape (0.0.4) - ethon (0.15.0) + ethon (0.18.0) ffi (>= 1.15.0) - ffi (1.17.3) + logger + ffi (1.17.4) fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) @@ -76,9 +78,9 @@ GEM mutex_m i18n (1.14.8) concurrent-ruby (~> 1.0) - json (2.18.1) + json (2.19.3) logger (1.7.0) - minitest (5.27.0) + minitest (5.26.1) molinillo (0.8.0) mutex_m (0.3.0) nanaimo (0.3.0) @@ -87,9 +89,9 @@ GEM public_suffix (4.0.7) rexml (3.4.4) ruby-macho (2.5.1) - securerandom (0.4.1) - typhoeus (1.5.0) - ethon (>= 0.9.0, < 0.16.0) + securerandom (0.3.2) + typhoeus (1.6.0) + ethon (>= 0.18.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) xcodeproj (1.25.1) diff --git a/apps/metro-example-mini/android/app/build.gradle b/apps/metro-example-mini/android/app/build.gradle index 59a3f53278d..8cc518335be 100644 --- a/apps/metro-example-mini/android/app/build.gradle +++ b/apps/metro-example-mini/android/app/build.gradle @@ -15,7 +15,7 @@ react { // The folder where the react-native Codegen package is. Default is ../../node_modules/@react-native/codegen codegenDir = file("../../../../node_modules/@react-native/codegen") // The cli.js file which is the React Native CLI entrypoint. Default is ../../node_modules/react-native/cli.js - cliFile = file("../../node_modules/@rnef/cli/dist/src/bin.js") + cliFile = file("../../node_modules/rock/dist/src/bin.js") /* Variants */ // The list of variants to that are debuggable. For those we're going to diff --git a/apps/metro-example-mini/android/settings.gradle b/apps/metro-example-mini/android/settings.gradle index 076181847a5..f4def3c495c 100644 --- a/apps/metro-example-mini/android/settings.gradle +++ b/apps/metro-example-mini/android/settings.gradle @@ -1,6 +1,6 @@ pluginManagement { includeBuild("../node_modules/@react-native/gradle-plugin") } plugins { id("com.facebook.react.settings") } -extensions.configure(com.facebook.react.ReactSettingsExtension){ ex -> ex.autolinkLibrariesFromCommand(['npx', 'rnef', 'config', '-p', 'android']) } +extensions.configure(com.facebook.react.ReactSettingsExtension){ ex -> ex.autolinkLibrariesFromCommand(['npx', 'rock', 'config', '-p', 'android']) } rootProject.name = 'mini' include ':app' includeBuild('../node_modules/@react-native/gradle-plugin') diff --git a/apps/metro-example-mini/ios/Podfile b/apps/metro-example-mini/ios/Podfile index 3d1b5c16c36..7a5704eeacc 100644 --- a/apps/metro-example-mini/ios/Podfile +++ b/apps/metro-example-mini/ios/Podfile @@ -15,7 +15,7 @@ if linkage != nil end target 'mini' do - config = use_native_modules!(['npx', 'rnef', 'config', '-p', 'ios']) + config = use_native_modules!(['npx', 'rock', 'config', '-p', 'ios']) use_react_native!( :path => config[:reactNativePath], diff --git a/apps/metro-example-mini/ios/Podfile.lock b/apps/metro-example-mini/ios/Podfile.lock index 779df101702..34a475281d8 100644 --- a/apps/metro-example-mini/ios/Podfile.lock +++ b/apps/metro-example-mini/ios/Podfile.lock @@ -2422,11 +2422,11 @@ SPEC CHECKSUMS: React-timing: a275a1c2e6112dba17f8f7dd496d439213bbea0d React-utils: 449a6e1fd53886510e284e80bdbb1b1c6db29452 ReactAppDependencyProvider: 3267432b637c9b38e86961b287f784ee1b08dde0 - ReactCodegen: d308d08c58717331dcf82d0129efa8b73e28a64c + ReactCodegen: 7b0bacf7557bfaf82e2ea8a24903b7e0e15d4840 ReactCommon: b028d09a66e60ebd83ca59d8cc9a1216360db147 SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 Yoga: 395b5d614cd7cbbfd76b05d01bd67230a6ad004e -PODFILE CHECKSUM: a8134080201cda3c42e54a89f48d0930861e3c58 +PODFILE CHECKSUM: 0bef6bcbae4cfd995527daffb014d1e226ab15f8 COCOAPODS: 1.15.2 diff --git a/apps/metro-example-mini/ios/mini.xcodeproj/project.pbxproj b/apps/metro-example-mini/ios/mini.xcodeproj/project.pbxproj index c45a5d01507..69e62a4b646 100644 --- a/apps/metro-example-mini/ios/mini.xcodeproj/project.pbxproj +++ b/apps/metro-example-mini/ios/mini.xcodeproj/project.pbxproj @@ -181,7 +181,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "set -e\nif [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\nsource \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\nsource \"$PODS_ROOT/../.xcode.env.local\"\nfi\nexport BUNDLE_COMMAND=\"bundle-mf-host\"\nexport CONFIG_CMD=\"dummy-workaround-value\"\nexport CLI_PATH=\"$(\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('@rnef/cli/package.json')) + '/dist/src/bin.js'\")\"\nWITH_ENVIRONMENT=\"$REACT_NATIVE_PATH/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"$REACT_NATIVE_PATH/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; + shellScript = "set -e\nif [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\nsource \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\nsource \"$PODS_ROOT/../.xcode.env.local\"\nfi\nexport BUNDLE_COMMAND=\"bundle-mf-host\"\nexport CONFIG_CMD=\"dummy-workaround-value\"\nexport CLI_PATH=\"$(\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('rock/package.json')) + '/dist/src/bin.js'\")\"\nWITH_ENVIRONMENT=\"$REACT_NATIVE_PATH/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"$REACT_NATIVE_PATH/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; }; 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; diff --git a/apps/metro-example-mini/package.json b/apps/metro-example-mini/package.json index cc2f197ec59..2e0b797469c 100644 --- a/apps/metro-example-mini/package.json +++ b/apps/metro-example-mini/package.json @@ -3,15 +3,15 @@ "version": "0.0.1", "private": true, "scripts": { - "android": "rnef run:android", - "ios": "rnef run:ios", + "android": "rock run:android", + "ios": "rock run:ios", "lint": "ESLINT_USE_FLAT_CONFIG=false eslint .", "dev": "nodemon --config ../../nodemon.json --exec NODE_OPTIONS='--conditions=dev' pnpm start", - "start": "rnef start --port 8082", + "start": "rock start --port 8082", "test": "jest", "pods": "(cd ios && bundle install && (bundle exec pod install || bundle exec pod update))", - "build:ios": "rnef bundle-mf-remote --platform ios --dev false", - "build:android": "rnef bundle-mf-remote --platform android --dev false", + "build:ios": "rock bundle-mf-remote --platform ios --dev false", + "build:android": "rock bundle-mf-remote --platform android --dev false", "build:rnc:ios": "react-native bundle-mf-remote --platform ios --dev false", "build:rnc:android": "react-native bundle-mf-remote --platform android --dev false", "serve:ios": "serve dist/ios -p 8082", @@ -28,17 +28,17 @@ "@babel/preset-env": "^7.25.3", "@babel/runtime": "^7.25.0", "@module-federation/metro": "workspace:*", - "@module-federation/metro-plugin-rnef": "workspace:*", + "@module-federation/metro-plugin-rock": "workspace:*", "@module-federation/runtime": "workspace:*", "@react-native-community/cli": "^19.1.0", "@react-native/babel-preset": "0.80.0", "@react-native/eslint-config": "0.80.0", "@react-native/metro-config": "0.80.0", "@react-native/typescript-config": "0.80.0", - "@rnef/cli": "^0.7.25", - "@rnef/platform-android": "^0.7.25", - "@rnef/platform-ios": "^0.7.25", - "@rnef/plugin-metro": "^0.7.25", + "rock": "^0.13.0", + "@rock-js/platform-android": "^0.13.0", + "@rock-js/platform-ios": "^0.13.0", + "@rock-js/plugin-metro": "^0.13.0", "@types/jest": "^29.5.13", "@types/lodash": "^4", "@types/react": "^19.1.0", diff --git a/apps/metro-example-mini/rnef.config.mjs b/apps/metro-example-mini/rock.config.mjs similarity index 56% rename from apps/metro-example-mini/rnef.config.mjs rename to apps/metro-example-mini/rock.config.mjs index d0d538260e3..08cd95befab 100644 --- a/apps/metro-example-mini/rnef.config.mjs +++ b/apps/metro-example-mini/rock.config.mjs @@ -1,10 +1,10 @@ -import {pluginMetroModuleFederation} from '@module-federation/metro-plugin-rnef'; -import {platformAndroid} from '@rnef/platform-android'; +import {pluginMetroModuleFederation} from '@module-federation/metro-plugin-rock'; +import {platformAndroid} from '@rock-js/platform-android'; // @ts-check -import {platformIOS} from '@rnef/platform-ios'; -import {pluginMetro} from '@rnef/plugin-metro'; +import {platformIOS} from '@rock-js/platform-ios'; +import {pluginMetro} from '@rock-js/plugin-metro'; -/** @type {import('@rnef/config').Config} */ +/** @type {import('rock').Config} */ export default { bundler: pluginMetro(), platforms: { diff --git a/apps/metro-example-nested-mini/.gitignore b/apps/metro-example-nested-mini/.gitignore index 4ea16da8b4a..0d6dd737b32 100644 --- a/apps/metro-example-nested-mini/.gitignore +++ b/apps/metro-example-nested-mini/.gitignore @@ -77,5 +77,6 @@ yarn-error.log # build artifacts dist/ -# RNEF +# Rock +.rock .rnef diff --git a/apps/metro-example-nested-mini/Gemfile.lock b/apps/metro-example-nested-mini/Gemfile.lock index 6f58f7d9b75..c4c92d212c9 100644 --- a/apps/metro-example-nested-mini/Gemfile.lock +++ b/apps/metro-example-nested-mini/Gemfile.lock @@ -15,7 +15,7 @@ GEM mutex_m securerandom (>= 0.3) tzinfo (~> 2.0) - addressable (2.8.8) + addressable (2.9.0) public_suffix (>= 2.0.2, < 8.0) algoliasearch (1.27.5) httpclient (~> 2.8, >= 2.8.3) @@ -23,7 +23,7 @@ GEM atomos (0.1.3) base64 (0.3.0) benchmark (0.5.0) - bigdecimal (4.0.1) + bigdecimal (4.1.1) claide (1.1.0) cocoapods (1.15.2) addressable (~> 2.8) @@ -67,9 +67,10 @@ GEM connection_pool (2.5.5) drb (2.2.3) escape (0.0.4) - ethon (0.15.0) + ethon (0.18.0) ffi (>= 1.15.0) - ffi (1.17.3) + logger + ffi (1.17.4) fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) @@ -77,7 +78,7 @@ GEM mutex_m i18n (1.14.8) concurrent-ruby (~> 1.0) - json (2.18.1) + json (2.19.3) logger (1.7.0) minitest (5.26.1) molinillo (0.8.0) @@ -89,8 +90,8 @@ GEM rexml (3.4.4) ruby-macho (2.5.1) securerandom (0.3.2) - typhoeus (1.5.0) - ethon (>= 0.9.0, < 0.16.0) + typhoeus (1.6.0) + ethon (>= 0.18.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) xcodeproj (1.25.1) diff --git a/apps/metro-example-nested-mini/android/app/build.gradle b/apps/metro-example-nested-mini/android/app/build.gradle index 59a3f53278d..8cc518335be 100644 --- a/apps/metro-example-nested-mini/android/app/build.gradle +++ b/apps/metro-example-nested-mini/android/app/build.gradle @@ -15,7 +15,7 @@ react { // The folder where the react-native Codegen package is. Default is ../../node_modules/@react-native/codegen codegenDir = file("../../../../node_modules/@react-native/codegen") // The cli.js file which is the React Native CLI entrypoint. Default is ../../node_modules/react-native/cli.js - cliFile = file("../../node_modules/@rnef/cli/dist/src/bin.js") + cliFile = file("../../node_modules/rock/dist/src/bin.js") /* Variants */ // The list of variants to that are debuggable. For those we're going to diff --git a/apps/metro-example-nested-mini/android/settings.gradle b/apps/metro-example-nested-mini/android/settings.gradle index 076181847a5..f4def3c495c 100644 --- a/apps/metro-example-nested-mini/android/settings.gradle +++ b/apps/metro-example-nested-mini/android/settings.gradle @@ -1,6 +1,6 @@ pluginManagement { includeBuild("../node_modules/@react-native/gradle-plugin") } plugins { id("com.facebook.react.settings") } -extensions.configure(com.facebook.react.ReactSettingsExtension){ ex -> ex.autolinkLibrariesFromCommand(['npx', 'rnef', 'config', '-p', 'android']) } +extensions.configure(com.facebook.react.ReactSettingsExtension){ ex -> ex.autolinkLibrariesFromCommand(['npx', 'rock', 'config', '-p', 'android']) } rootProject.name = 'mini' include ':app' includeBuild('../node_modules/@react-native/gradle-plugin') diff --git a/apps/metro-example-nested-mini/ios/Podfile b/apps/metro-example-nested-mini/ios/Podfile index 3d1b5c16c36..7a5704eeacc 100644 --- a/apps/metro-example-nested-mini/ios/Podfile +++ b/apps/metro-example-nested-mini/ios/Podfile @@ -15,7 +15,7 @@ if linkage != nil end target 'mini' do - config = use_native_modules!(['npx', 'rnef', 'config', '-p', 'ios']) + config = use_native_modules!(['npx', 'rock', 'config', '-p', 'ios']) use_react_native!( :path => config[:reactNativePath], diff --git a/apps/metro-example-nested-mini/ios/Podfile.lock b/apps/metro-example-nested-mini/ios/Podfile.lock index 779df101702..34a475281d8 100644 --- a/apps/metro-example-nested-mini/ios/Podfile.lock +++ b/apps/metro-example-nested-mini/ios/Podfile.lock @@ -2422,11 +2422,11 @@ SPEC CHECKSUMS: React-timing: a275a1c2e6112dba17f8f7dd496d439213bbea0d React-utils: 449a6e1fd53886510e284e80bdbb1b1c6db29452 ReactAppDependencyProvider: 3267432b637c9b38e86961b287f784ee1b08dde0 - ReactCodegen: d308d08c58717331dcf82d0129efa8b73e28a64c + ReactCodegen: 7b0bacf7557bfaf82e2ea8a24903b7e0e15d4840 ReactCommon: b028d09a66e60ebd83ca59d8cc9a1216360db147 SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 Yoga: 395b5d614cd7cbbfd76b05d01bd67230a6ad004e -PODFILE CHECKSUM: a8134080201cda3c42e54a89f48d0930861e3c58 +PODFILE CHECKSUM: 0bef6bcbae4cfd995527daffb014d1e226ab15f8 COCOAPODS: 1.15.2 diff --git a/apps/metro-example-nested-mini/ios/mini.xcodeproj/project.pbxproj b/apps/metro-example-nested-mini/ios/mini.xcodeproj/project.pbxproj index c45a5d01507..69e62a4b646 100644 --- a/apps/metro-example-nested-mini/ios/mini.xcodeproj/project.pbxproj +++ b/apps/metro-example-nested-mini/ios/mini.xcodeproj/project.pbxproj @@ -181,7 +181,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "set -e\nif [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\nsource \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\nsource \"$PODS_ROOT/../.xcode.env.local\"\nfi\nexport BUNDLE_COMMAND=\"bundle-mf-host\"\nexport CONFIG_CMD=\"dummy-workaround-value\"\nexport CLI_PATH=\"$(\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('@rnef/cli/package.json')) + '/dist/src/bin.js'\")\"\nWITH_ENVIRONMENT=\"$REACT_NATIVE_PATH/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"$REACT_NATIVE_PATH/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; + shellScript = "set -e\nif [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\nsource \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\nsource \"$PODS_ROOT/../.xcode.env.local\"\nfi\nexport BUNDLE_COMMAND=\"bundle-mf-host\"\nexport CONFIG_CMD=\"dummy-workaround-value\"\nexport CLI_PATH=\"$(\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('rock/package.json')) + '/dist/src/bin.js'\")\"\nWITH_ENVIRONMENT=\"$REACT_NATIVE_PATH/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"$REACT_NATIVE_PATH/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; }; 00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; diff --git a/apps/metro-example-nested-mini/package.json b/apps/metro-example-nested-mini/package.json index decad36d320..e15c8f4ddaf 100644 --- a/apps/metro-example-nested-mini/package.json +++ b/apps/metro-example-nested-mini/package.json @@ -3,15 +3,15 @@ "version": "0.0.1", "private": true, "scripts": { - "android": "rnef run:android", - "ios": "rnef run:ios", + "android": "rock run:android", + "ios": "rock run:ios", "lint": "ESLINT_USE_FLAT_CONFIG=false eslint .", "dev": "nodemon --config ../../nodemon.json --exec NODE_OPTIONS='--conditions=dev' pnpm start", - "start": "rnef start --port 8083", + "start": "rock start --port 8083", "test": "jest", "pods": "(cd ios && bundle install && (bundle exec pod install || bundle exec pod update))", - "build:ios": "rnef bundle-mf-remote --platform ios --dev false", - "build:android": "rnef bundle-mf-remote --platform android --dev false", + "build:ios": "rock bundle-mf-remote --platform ios --dev false", + "build:android": "rock bundle-mf-remote --platform android --dev false", "build:rnc:ios": "react-native bundle-mf-remote --platform ios --dev false", "build:rnc:android": "react-native bundle-mf-remote --platform android --dev false", "serve:ios": "serve dist/ios -p 8083", @@ -28,16 +28,16 @@ "@babel/preset-env": "^7.25.3", "@babel/runtime": "^7.25.0", "@module-federation/metro": "workspace:*", - "@module-federation/metro-plugin-rnef": "workspace:*", + "@module-federation/metro-plugin-rock": "workspace:*", "@module-federation/runtime": "workspace:*", "@react-native/babel-preset": "0.80.0", "@react-native/eslint-config": "0.80.0", "@react-native/metro-config": "0.80.0", "@react-native/typescript-config": "0.80.0", - "@rnef/cli": "^0.7.25", - "@rnef/platform-android": "^0.7.25", - "@rnef/platform-ios": "^0.7.25", - "@rnef/plugin-metro": "^0.7.25", + "rock": "^0.13.0", + "@rock-js/platform-android": "^0.13.0", + "@rock-js/platform-ios": "^0.13.0", + "@rock-js/plugin-metro": "^0.13.0", "@types/jest": "^29.5.13", "@types/lodash": "^4", "@types/react": "^19.1.0", diff --git a/apps/metro-example-nested-mini/rnef.config.mjs b/apps/metro-example-nested-mini/rock.config.mjs similarity index 56% rename from apps/metro-example-nested-mini/rnef.config.mjs rename to apps/metro-example-nested-mini/rock.config.mjs index d0d538260e3..08cd95befab 100644 --- a/apps/metro-example-nested-mini/rnef.config.mjs +++ b/apps/metro-example-nested-mini/rock.config.mjs @@ -1,10 +1,10 @@ -import {pluginMetroModuleFederation} from '@module-federation/metro-plugin-rnef'; -import {platformAndroid} from '@rnef/platform-android'; +import {pluginMetroModuleFederation} from '@module-federation/metro-plugin-rock'; +import {platformAndroid} from '@rock-js/platform-android'; // @ts-check -import {platformIOS} from '@rnef/platform-ios'; -import {pluginMetro} from '@rnef/plugin-metro'; +import {platformIOS} from '@rock-js/platform-ios'; +import {pluginMetro} from '@rock-js/plugin-metro'; -/** @type {import('@rnef/config').Config} */ +/** @type {import('rock').Config} */ export default { bundler: pluginMetro(), platforms: { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ec2725f837d..f8b41a6c6f1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -848,9 +848,9 @@ importers: '@module-federation/metro': specifier: workspace:* version: link:../../packages/metro-core - '@module-federation/metro-plugin-rnef': + '@module-federation/metro-plugin-rock': specifier: workspace:* - version: link:../../packages/metro-plugin-rnef + version: link:../../packages/metro-plugin-rock '@module-federation/runtime': specifier: workspace:* version: link:../../packages/runtime @@ -869,18 +869,15 @@ importers: '@react-native/typescript-config': specifier: 0.80.0 version: 0.80.0 - '@rnef/cli': - specifier: ^0.7.25 - version: 0.7.28(typescript@5.0.4) - '@rnef/platform-android': - specifier: ^0.7.25 - version: 0.7.28 - '@rnef/platform-ios': - specifier: ^0.7.25 - version: 0.7.28(typescript@5.0.4) - '@rnef/plugin-metro': - specifier: ^0.7.25 - version: 0.7.28(@react-native/community-cli-plugin@0.80.0(@react-native-community/cli@19.1.2(typescript@5.0.4))) + '@rock-js/platform-android': + specifier: ^0.13.0 + version: 0.13.0 + '@rock-js/platform-ios': + specifier: ^0.13.0 + version: 0.13.0(typescript@5.0.4) + '@rock-js/plugin-metro': + specifier: ^0.13.0 + version: 0.13.0 '@types/jest': specifier: ^29.5.13 version: 29.5.13 @@ -908,6 +905,9 @@ importers: react-test-renderer: specifier: 19.1.0 version: 19.1.0(react@19.1.0) + rock: + specifier: ^0.13.0 + version: 0.13.0(typescript@5.0.4) typescript: specifier: 5.0.4 version: 5.0.4 @@ -936,9 +936,9 @@ importers: '@module-federation/metro': specifier: workspace:* version: link:../../packages/metro-core - '@module-federation/metro-plugin-rnef': + '@module-federation/metro-plugin-rock': specifier: workspace:* - version: link:../../packages/metro-plugin-rnef + version: link:../../packages/metro-plugin-rock '@module-federation/runtime': specifier: workspace:* version: link:../../packages/runtime @@ -957,18 +957,15 @@ importers: '@react-native/typescript-config': specifier: 0.80.0 version: 0.80.0 - '@rnef/cli': - specifier: ^0.7.25 - version: 0.7.28(typescript@5.0.4) - '@rnef/platform-android': - specifier: ^0.7.25 - version: 0.7.28 - '@rnef/platform-ios': - specifier: ^0.7.25 - version: 0.7.28(typescript@5.0.4) - '@rnef/plugin-metro': - specifier: ^0.7.25 - version: 0.7.28(@react-native/community-cli-plugin@0.80.0(@react-native-community/cli@19.1.2(typescript@5.0.4))) + '@rock-js/platform-android': + specifier: ^0.13.0 + version: 0.13.0 + '@rock-js/platform-ios': + specifier: ^0.13.0 + version: 0.13.0(typescript@5.0.4) + '@rock-js/plugin-metro': + specifier: ^0.13.0 + version: 0.13.0 '@types/jest': specifier: ^29.5.13 version: 29.5.13 @@ -996,6 +993,9 @@ importers: react-test-renderer: specifier: 19.1.0 version: 19.1.0(react@19.1.0) + rock: + specifier: ^0.13.0 + version: 0.13.0(typescript@5.0.4) serve: specifier: ^14.2.4 version: 14.2.5 @@ -1027,9 +1027,9 @@ importers: '@module-federation/metro': specifier: workspace:* version: link:../../packages/metro-core - '@module-federation/metro-plugin-rnef': + '@module-federation/metro-plugin-rock': specifier: workspace:* - version: link:../../packages/metro-plugin-rnef + version: link:../../packages/metro-plugin-rock '@module-federation/runtime': specifier: workspace:* version: link:../../packages/runtime @@ -1045,18 +1045,15 @@ importers: '@react-native/typescript-config': specifier: 0.80.0 version: 0.80.0 - '@rnef/cli': - specifier: ^0.7.25 - version: 0.7.28(typescript@5.0.4) - '@rnef/platform-android': - specifier: ^0.7.25 - version: 0.7.28 - '@rnef/platform-ios': - specifier: ^0.7.25 - version: 0.7.28(typescript@5.0.4) - '@rnef/plugin-metro': - specifier: ^0.7.25 - version: 0.7.28(@react-native/community-cli-plugin@0.80.0(@react-native-community/cli@19.1.2(typescript@5.0.4))) + '@rock-js/platform-android': + specifier: ^0.13.0 + version: 0.13.0 + '@rock-js/platform-ios': + specifier: ^0.13.0 + version: 0.13.0(typescript@5.0.4) + '@rock-js/plugin-metro': + specifier: ^0.13.0 + version: 0.13.0 '@types/jest': specifier: ^29.5.13 version: 29.5.13 @@ -1084,6 +1081,9 @@ importers: react-test-renderer: specifier: 19.1.0 version: 19.1.0(react@19.1.0) + rock: + specifier: ^0.13.0 + version: 0.13.0(typescript@5.0.4) serve: specifier: ^14.2.4 version: 14.2.5 @@ -3522,7 +3522,7 @@ importers: version: 0.80.0(@babel/core@7.29.0)(@react-native-community/cli@19.1.2(typescript@5.9.3))(@types/react@19.2.14)(react@19.1.0) ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.19))(@types/node@20.19.5)(typescript@5.9.3) + version: 10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.17))(@types/node@20.19.5)(typescript@5.9.3) typescript: specifier: ^5.8.3 version: 5.9.3 @@ -4106,7 +4106,7 @@ importers: version: 22.5.4(@babel/traverse@7.29.0)(@swc-node/register@1.10.10(@swc/core@1.7.26(@swc/helpers@0.5.13))(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.10(@swc/helpers@0.5.19))(@swc/helpers@0.5.19)(esbuild@0.25.0)(nx@22.5.4(@swc-node/register@1.10.10(@swc/core@1.7.26(@swc/helpers@0.5.13))(@swc/types@0.1.25)(typescript@5.9.3))(@swc/core@1.15.10(@swc/helpers@0.5.19)))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)(vue-tsc@2.2.12(typescript@5.9.3))(webpack-cli@5.1.4) '@rsbuild/core': specifier: 2.0.0-beta.2 - version: 2.0.0-beta.2(@module-federation/runtime-tools@2.2.2(node-fetch@2.7.0(encoding@0.1.13)))(core-js@3.49.0) + version: 2.0.0-beta.2(@module-federation/runtime-tools@0.21.6)(core-js@3.49.0) '@storybook/core': specifier: ^8.4.6 version: 8.6.14(prettier@3.8.1)(storybook@8.6.17(prettier@3.8.1)) @@ -10492,24 +10492,24 @@ packages: '@react-native-community/cli-clean@19.1.2': resolution: {integrity: sha512-LI/bTLtosbDyHtIs+HxlmHp+5Nbjz+IIEEqrBO2tUeA+ENX01YEnIgGIv4z7giNWkHSiqywjdOyYNqg27ydy2g==} - '@react-native-community/cli-config-android@18.0.1': - resolution: {integrity: sha512-1wzmGLfS7qgzm0ZfwX/f6Lat/af8/UYdjwtb3ap6RfKNclvIoap0wN6uBeiANmLfk0/BhoG8K1vKtIPwlU/V1A==} - '@react-native-community/cli-config-android@19.1.2': resolution: {integrity: sha512-IIhzhDUmT53RT45Qrxc/OfvkTD4U7IrfkfoIdKmBT6O0X0QaoegK4OE6aAuc86D2GXlD5rbVcPMSuN4TY8Hmlw==} - '@react-native-community/cli-config-apple@18.0.1': - resolution: {integrity: sha512-ybr1ZrOSd/Z+oCJ1qVSKVQauvneObTu3VjvYPhhrme7tUUSaYmd3iikaWonbKk5rVp+2WqOFR6Cy7XqVfwwG8A==} + '@react-native-community/cli-config-android@20.1.3': + resolution: {integrity: sha512-DNHDP+OWLyhKShGciBqPcxhxfp1Z/7GQcb4F+TGyCeKQAr+JdnUjRXN3X+YCU/v+g2kbYYyRJKlGabzkVvdrAw==} '@react-native-community/cli-config-apple@19.1.2': resolution: {integrity: sha512-91upuYMLgEtJE6foWQFgGDpT3ZDTc5bX6rMY5cJMqiAE5svgh1q0kbbpRuv/ptBYzcxLplL7wZWpA77TlJdm9A==} - '@react-native-community/cli-config@18.0.1': - resolution: {integrity: sha512-O4DDJVMx+DYfwEgF/6lB4hoI9sVjrYW6AlLqeJY/D2XH2e4yqK/Pr3SAi4sOMgvjvYZKzLHqIQVxx54v+LyMQA==} + '@react-native-community/cli-config-apple@20.1.3': + resolution: {integrity: sha512-QX9B83nAfCPs0KiaYz61kAEHWr9sttooxzRzNdQwvZTwnsIpvWOT9GvMMj/19OeXiQzMJBzZX0Pgt6+spiUsDQ==} '@react-native-community/cli-config@19.1.2': resolution: {integrity: sha512-o0cc6R6r9nY9MiLFeLIN797fBLWwKW9cee/NCm6nBBzPk/paro6HEbcXE02xnVzMb+nhQPrbPOzp3qE7WhtwRA==} + '@react-native-community/cli-config@20.1.3': + resolution: {integrity: sha512-n73nW0cG92oNF0r994pPqm0DjAShOm3F8LSffDYhJqNAno+h/csmv/37iL4NtSpmKIO8xqsG3uVTXz9X/hzNaQ==} + '@react-native-community/cli-doctor@19.1.2': resolution: {integrity: sha512-uUV/1QrWA1Cx7dqkTCcarqfya/7gBmKXd9BzVCEl6bzAn1jd1Q5UaZ+DmZgAoLVKlbAjpPTJTfqjD44aqUdjyA==} @@ -10522,24 +10522,24 @@ packages: '@react-native-community/cli-platform-ios@19.1.2': resolution: {integrity: sha512-rmLZjwpI+mV3bbd6FgR6yM/ekFNr4QM/Dgzmatkh8k94B5uGtw5Me4EKlY+MrqR3lIyjzqWtLoefcJxA1c9d2w==} - '@react-native-community/cli-server-api@18.0.1': - resolution: {integrity: sha512-ZRy2IjEM4ljP05bZcnXho0sCxVGI/9SkWkLuzXl+cRu/4I8vLRleihn2GJCopg82QHLLrajUCHhpDKE8NJWcRw==} - '@react-native-community/cli-server-api@19.1.2': resolution: {integrity: sha512-K6UIvtw6VtcKxCX+rJ5mKQYiqcSSRKODPQ2nbIeIxjjO5nDjDriGkFC/ypHHk38oZuJYOLbOySqnnCNkdEI4uQ==} - '@react-native-community/cli-tools@18.0.1': - resolution: {integrity: sha512-WxWFXwfYhHR2eYiB4lkHZVC/PmIkRWeVHBQKmn0h1mecr3GrHYO4BzW1jpD5Xt6XZ9jojQ9wE5xrCqXjiMSAIQ==} + '@react-native-community/cli-server-api@20.1.3': + resolution: {integrity: sha512-hsNsdUKZDd2T99OuNuiXz4VuvLa1UN0zcxefmPjXQgI0byrBLzzDr+o7p03sKuODSzKi2h+BMnUxiS07HACQLA==} '@react-native-community/cli-tools@19.1.2': resolution: {integrity: sha512-AsDuZu/7R/QX+vGpJIRK97v24X+zqkmwA9/uLRguLTHM175nUxb/byXmAKWuZylG2FAikVvf7EqV8MFGbwM7Wg==} - '@react-native-community/cli-types@18.0.1': - resolution: {integrity: sha512-pGxr/TSP9Xiw2+9TUn3OWLdcuI4+PJozPsCYZVTGWJ96X6Pv7YX/rNy4emIDkaWaFZ7IWgWXUA725KhEINSf3Q==} + '@react-native-community/cli-tools@20.1.3': + resolution: {integrity: sha512-EAn0vPCMxtHhfWk2UwLmSUfPfLUnFgC7NjiVJVTKJyVk5qGnkPfoT8te/1IUXFTysUB0F0RIi+NgDB4usFOLeA==} '@react-native-community/cli-types@19.1.2': resolution: {integrity: sha512-Ze6fi6jE+JPvMlISWbZ/eCPOkRuuEs1SX4rJGWOXPcDzEVF6gs1ePsAjdzQ3RJYRMqQ49vo6iGiOZs//z5kuVw==} + '@react-native-community/cli-types@20.1.3': + resolution: {integrity: sha512-IdAcegf0pH1hVraxWTG1ACLkYC0LDQfqtaEf42ESyLIF3Xap70JzL/9tAlxw7lSCPZPFWhrcgU0TBc4SkC/ecw==} + '@react-native-community/cli@19.1.2': resolution: {integrity: sha512-b28TLqODMgQRx6f4gbHoHYpnKyFbWzJkIk3+Ggpad/at493KfGQ+WvKg1sts/st8mxzmbk0T6lCc/9A3QoFKkQ==} engines: {node: '>=18'} @@ -10574,18 +10574,10 @@ packages: '@react-native-community/cli': optional: true - '@react-native/debugger-frontend@0.79.7': - resolution: {integrity: sha512-91JVlhR6hDuJXcWTpCwcdEPlUQf+TckNG8BYfR4UkUOaZ87XahJv4EyWBeyfd8lwB/mh6nDJqbR6UiXwt5kbog==} - engines: {node: '>=18'} - '@react-native/debugger-frontend@0.80.0': resolution: {integrity: sha512-lpu9Z3xtKUaKFvEcm5HSgo1KGfkDa/W3oZHn22Zy0WQ9MiOu2/ar1txgd1wjkoNiK/NethKcRdCN7mqnc6y2mA==} engines: {node: '>=18'} - '@react-native/dev-middleware@0.79.7': - resolution: {integrity: sha512-KHGPa7xwnKKWrzMnV1cHc8J56co4tFevmRvbjEbUCqkGS0s/l8ZxAGMR222/6YxZV3Eg1J3ywKQ8nHzTsTz5jw==} - engines: {node: '>=18'} - '@react-native/dev-middleware@0.80.0': resolution: {integrity: sha512-lLyTnJ687A5jF3fn8yR/undlCis3FG+N/apQ+Q0Lcl+GV6FsZs0U5H28YmL6lZtjOj4TLek6uGPMPmZasHx7cQ==} engines: {node: '>=18'} @@ -10689,27 +10681,9 @@ packages: resolution: {integrity: sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==} engines: {node: '>=14.0.0'} - '@rnef/cli@0.7.28': - resolution: {integrity: sha512-9qc2L1m+RZB3+hsbfFxtqOP3En4klAB5k9flPv9F4rlPNUvg+54Z9DyEZsVL+n29BFFZz8tkVDoX6vifE6Gbig==} - hasBin: true - '@rnef/config@0.7.28': resolution: {integrity: sha512-7AdbAYbP4qgWxR4WmxXo+s+QrWj2DK8fejnGStRx0kN7oJNB7Qn3bvciUtNiBB5YuObxwt3ruMAlspbSA3spZQ==} - '@rnef/platform-android@0.7.28': - resolution: {integrity: sha512-QP8pocAPSvVrewnU+VN3MdYMPaonrFY3wyh9dFGe4QFOGNd/OYRHnIt5reHkthv+zmCY7MjsNoOz33C3O/qsjw==} - - '@rnef/platform-apple-helpers@0.7.28': - resolution: {integrity: sha512-isbYgnmkI0FOuDQ9mREQiUegNSJAd/wAdgk/f0T9EsK62WqQn/Z3nTB3tpn/P47dDHtDItUbngxsbahyl8k2Rg==} - - '@rnef/platform-ios@0.7.28': - resolution: {integrity: sha512-3NgIvMSvq/MD3wUFmz6IvKyhiVLVfBS0+YfjbGvamp0XsxGrvBlVRYnXzbiilOea0X+innm+l1G3Nwu+HeweqQ==} - - '@rnef/plugin-metro@0.7.28': - resolution: {integrity: sha512-GoWIBf0sW+0ExmBnvKOxenRyhC/542a5GXp0FlUA+D5fVu6K96MEy5BeeE1vsC8Quh4Fhhn2gBJMhNJ7j4STIQ==} - peerDependencies: - '@react-native/community-cli-plugin': '*' - '@rnef/provider-github@0.7.28': resolution: {integrity: sha512-VuFOMBmbUdeSKbtRS1y7gqfX5u54aYuArxaL0Pz8lKHRwulK1AdDt3k+J7yoTjkQwGcNPwzJlTFZLXVSXZMpWw==} @@ -10719,6 +10693,18 @@ packages: '@rock-js/config@0.13.0': resolution: {integrity: sha512-yzmk0R+agdVVWkVXKR1lfATpNQyI1snIUIVYgjcsm4LvTIsxunruhFxpWW+fxhlP4hqnJ91IzhE1/HExgF187w==} + '@rock-js/platform-android@0.13.0': + resolution: {integrity: sha512-+HEy78Yxpx+iBQaCq5NE+cvNehko5FjKARnIfCDKmFekGXAgX9HEtkOhQPmtSxEhAE0a32T4n33quI8pitck2g==} + + '@rock-js/platform-apple-helpers@0.13.0': + resolution: {integrity: sha512-QDYNdmyVE4QsKpDP9KauQO+GIwo9vstb/tF9ZkTjSpg1jl8tebVHrTO8eFc8OKlZK4JQHEyuHL7NAPdbDrqnGg==} + + '@rock-js/platform-ios@0.13.0': + resolution: {integrity: sha512-56pZ0RM0vEbhAJ+ugcbF/4CQYZg6er+CQI4DPtVgbYxdySO2Dcq2SbNUnEG6cqFS+5hOlkYJXT6BGVUEcHhhuQ==} + + '@rock-js/plugin-metro@0.13.0': + resolution: {integrity: sha512-LH3BCIAU4ZugUFHyAujKjuWeULxmtQ2KraO+knQTmLrLmd2yzgmbPG0a2jwb21CxgFUR1MjzG8AB65dOjI7dJQ==} + '@rock-js/provider-github@0.13.0': resolution: {integrity: sha512-D38pEsgnr2GOlbOT/9Fey9zYyUej5aF7keRWBOSCvPpGMA4xLmdjUdXuvikv+fWFkN3i0xo1mglncxIOOBrbWA==} @@ -17727,10 +17713,17 @@ packages: fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fast-xml-builder@1.1.4: + resolution: {integrity: sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==} + fast-xml-parser@4.5.4: resolution: {integrity: sha512-jE8ugADnYOBsu1uaoayVl1tVKAMNOXyjwvv2U6udEA2ORBhDooJDWoGxTkhd4Qn4yh59JVVt/pKXtjPwx9OguQ==} hasBin: true + fast-xml-parser@5.5.11: + resolution: {integrity: sha512-QL0eb0YbSTVWF6tTf1+LEMSgtCEjBYPpnAjoLC8SscESlAjXEIRJ7cHtLG0pLeDFaZLa4VKZLArtA/60ZS7vyA==} + hasBin: true + fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} @@ -18518,6 +18511,9 @@ packages: hermes-estree@0.29.1: resolution: {integrity: sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==} + hermes-estree@0.33.3: + resolution: {integrity: sha512-6kzYZHCk8Fy1Uc+t3HGYyJn3OL4aeqKLTyina4UFtWl8I0kSL7OmKThaiX+Uh2f8nGw3mo4Ifxg0M5Zk3/Oeqg==} + hermes-parser@0.25.1: resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} @@ -18527,6 +18523,9 @@ packages: hermes-parser@0.29.1: resolution: {integrity: sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==} + hermes-parser@0.33.3: + resolution: {integrity: sha512-Yg3HgaG4CqgyowtYjX/FsnPAuZdHOqSMtnbpylbptsQ9nwwSKsy6uRWcGO5RK0EqiX12q8HvDWKgeAVajRO5DA==} + history@4.10.1: resolution: {integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==} @@ -20255,60 +20254,118 @@ packages: resolution: {integrity: sha512-W/scFDnwJXSccJYnOFdGiYr9srhbHPdxX9TvvACOFsIXdLilh3XuxQl/wXW6jEJfgIb0jTvoTlwwrqvuwymr6Q==} engines: {node: '>=18.18'} + metro-babel-transformer@0.83.5: + resolution: {integrity: sha512-d9FfmgUEVejTiSb7bkQeLRGl6aeno2UpuPm3bo3rCYwxewj03ymvOn8s8vnS4fBqAPQ+cE9iQM40wh7nGXR+eA==} + engines: {node: '>=20.19.4'} + metro-cache-key@0.82.5: resolution: {integrity: sha512-qpVmPbDJuRLrT4kcGlUouyqLGssJnbTllVtvIgXfR7ZuzMKf0mGS+8WzcqzNK8+kCyakombQWR0uDd8qhWGJcA==} engines: {node: '>=18.18'} + metro-cache-key@0.83.5: + resolution: {integrity: sha512-Ycl8PBajB7bhbAI7Rt0xEyiF8oJ0RWX8EKkolV1KfCUlC++V/GStMSGpPLwnnBZXZWkCC5edBPzv1Hz1Yi0Euw==} + engines: {node: '>=20.19.4'} + metro-cache@0.82.5: resolution: {integrity: sha512-AwHV9607xZpedu1NQcjUkua8v7HfOTKfftl6Vc9OGr/jbpiJX6Gpy8E/V9jo/U9UuVYX2PqSUcVNZmu+LTm71Q==} engines: {node: '>=18.18'} + metro-cache@0.83.5: + resolution: {integrity: sha512-oH+s4U+IfZyg8J42bne2Skc90rcuESIYf86dYittcdWQtPfcaFXWpByPyTuWk3rR1Zz3Eh5HOrcVImfEhhJLng==} + engines: {node: '>=20.19.4'} + metro-config@0.82.5: resolution: {integrity: sha512-/r83VqE55l0WsBf8IhNmc/3z71y2zIPe5kRSuqA5tY/SL/ULzlHUJEMd1szztd0G45JozLwjvrhAzhDPJ/Qo/g==} engines: {node: '>=18.18'} + metro-config@0.83.5: + resolution: {integrity: sha512-JQ/PAASXH7yczgV6OCUSRhZYME+NU8NYjI2RcaG5ga4QfQ3T/XdiLzpSb3awWZYlDCcQb36l4Vl7i0Zw7/Tf9w==} + engines: {node: '>=20.19.4'} + metro-core@0.82.5: resolution: {integrity: sha512-OJL18VbSw2RgtBm1f2P3J5kb892LCVJqMvslXxuxjAPex8OH7Eb8RBfgEo7VZSjgb/LOf4jhC4UFk5l5tAOHHA==} engines: {node: '>=18.18'} + metro-core@0.83.5: + resolution: {integrity: sha512-YcVcLCrf0ed4mdLa82Qob0VxYqfhmlRxUS8+TO4gosZo/gLwSvtdeOjc/Vt0pe/lvMNrBap9LlmvZM8FIsMgJQ==} + engines: {node: '>=20.19.4'} + metro-file-map@0.82.5: resolution: {integrity: sha512-vpMDxkGIB+MTN8Af5hvSAanc6zXQipsAUO+XUx3PCQieKUfLwdoa8qaZ1WAQYRpaU+CJ8vhBcxtzzo3d9IsCIQ==} engines: {node: '>=18.18'} + metro-file-map@0.83.5: + resolution: {integrity: sha512-ZEt8s3a1cnYbn40nyCD+CsZdYSlwtFh2kFym4lo+uvfM+UMMH+r/BsrC6rbNClSrt+B7rU9T+Te/sh/NL8ZZKQ==} + engines: {node: '>=20.19.4'} + metro-minify-terser@0.82.5: resolution: {integrity: sha512-v6Nx7A4We6PqPu/ta1oGTqJ4Usz0P7c+3XNeBxW9kp8zayS3lHUKR0sY0wsCHInxZlNAEICx791x+uXytFUuwg==} engines: {node: '>=18.18'} + metro-minify-terser@0.83.5: + resolution: {integrity: sha512-Toe4Md1wS1PBqbvB0cFxBzKEVyyuYTUb0sgifAZh/mSvLH84qA1NAWik9sISWatzvfWf3rOGoUoO5E3f193a3Q==} + engines: {node: '>=20.19.4'} + metro-resolver@0.82.5: resolution: {integrity: sha512-kFowLnWACt3bEsuVsaRNgwplT8U7kETnaFHaZePlARz4Fg8tZtmRDUmjaD68CGAwc0rwdwNCkWizLYpnyVcs2g==} engines: {node: '>=18.18'} + metro-resolver@0.83.5: + resolution: {integrity: sha512-7p3GtzVUpbAweJeCcUJihJeOQl1bDuimO5ueo1K0BUpUtR41q5EilbQ3klt16UTPPMpA+tISWBtsrqU556mY1A==} + engines: {node: '>=20.19.4'} + metro-runtime@0.82.5: resolution: {integrity: sha512-rQZDoCUf7k4Broyw3Ixxlq5ieIPiR1ULONdpcYpbJQ6yQ5GGEyYjtkztGD+OhHlw81LCR2SUAoPvtTus2WDK5g==} engines: {node: '>=18.18'} + metro-runtime@0.83.5: + resolution: {integrity: sha512-f+b3ue9AWTVlZe2Xrki6TAoFtKIqw30jwfk7GQ1rDUBQaE0ZQ+NkiMEtb9uwH7uAjJ87U7Tdx1Jg1OJqUfEVlA==} + engines: {node: '>=20.19.4'} + metro-source-map@0.82.5: resolution: {integrity: sha512-wH+awTOQJVkbhn2SKyaw+0cd+RVSCZ3sHVgyqJFQXIee/yLs3dZqKjjeKKhhVeudgjXo7aE/vSu/zVfcQEcUfw==} engines: {node: '>=18.18'} + metro-source-map@0.83.5: + resolution: {integrity: sha512-VT9bb2KO2/4tWY9Z2yeZqTUao7CicKAOps9LUg2aQzsz+04QyuXL3qgf1cLUVRjA/D6G5u1RJAlN1w9VNHtODQ==} + engines: {node: '>=20.19.4'} + metro-symbolicate@0.82.5: resolution: {integrity: sha512-1u+07gzrvYDJ/oNXuOG1EXSvXZka/0JSW1q2EYBWerVKMOhvv9JzDGyzmuV7hHbF2Hg3T3S2uiM36sLz1qKsiw==} engines: {node: '>=18.18'} hasBin: true + metro-symbolicate@0.83.5: + resolution: {integrity: sha512-EMIkrjNRz/hF+p0RDdxoE60+dkaTLPN3vaaGkFmX5lvFdO6HPfHA/Ywznzkev+za0VhPQ5KSdz49/MALBRteHA==} + engines: {node: '>=20.19.4'} + hasBin: true + metro-transform-plugins@0.82.5: resolution: {integrity: sha512-57Bqf3rgq9nPqLrT2d9kf/2WVieTFqsQ6qWHpEng5naIUtc/Iiw9+0bfLLWSAw0GH40iJ4yMjFcFJDtNSYynMA==} engines: {node: '>=18.18'} + metro-transform-plugins@0.83.5: + resolution: {integrity: sha512-KxYKzZL+lt3Os5H2nx7YkbkWVduLZL5kPrE/Yq+Prm/DE1VLhpfnO6HtPs8vimYFKOa58ncl60GpoX0h7Wm0Vw==} + engines: {node: '>=20.19.4'} + metro-transform-worker@0.82.5: resolution: {integrity: sha512-mx0grhAX7xe+XUQH6qoHHlWedI8fhSpDGsfga7CpkO9Lk9W+aPitNtJWNGrW8PfjKEWbT9Uz9O50dkI8bJqigw==} engines: {node: '>=18.18'} + metro-transform-worker@0.83.5: + resolution: {integrity: sha512-8N4pjkNXc6ytlP9oAM6MwqkvUepNSW39LKYl9NjUMpRDazBQ7oBpQDc8Sz4aI8jnH6AGhF7s1m/ayxkN1t04yA==} + engines: {node: '>=20.19.4'} + metro@0.82.5: resolution: {integrity: sha512-8oAXxL7do8QckID/WZEKaIFuQJFUTLzfVcC48ghkHhNK2RGuQq8Xvf4AVd+TUA0SZtX0q8TGNXZ/eba1ckeGCg==} engines: {node: '>=18.18'} hasBin: true + metro@0.83.5: + resolution: {integrity: sha512-BgsXevY1MBac/3ZYv/RfNFf/4iuW9X7f4H8ZNkiH+r667HD9sVujxcmu4jvEzGCAm4/WyKdZCuyhAcyhTHOucQ==} + engines: {node: '>=20.19.4'} + hasBin: true + micro@9.3.5-canary.3: resolution: {integrity: sha512-viYIo9PefV+w9dvoIBh1gI44Mvx1BOk67B4BpC2QK77qdY0xZF0Q+vWLt/BII6cLkIc8rLmSIcJaB/OrXXKe1g==} engines: {node: '>= 8.0.0'} @@ -20976,6 +21033,10 @@ packages: resolution: {integrity: sha512-QyQQ6e66f+Ut/qUVjEce0E/wux5nAGLXYZDn1jr15JWstHsCH3l6VVrg8NKDptW9NEiBXKOJeGF/ydxeSDF3IQ==} engines: {node: '>=18.18'} + ob1@0.83.5: + resolution: {integrity: sha512-vNKPYC8L5ycVANANpF/S+WZHpfnRWKx/F3AYP4QMn6ZJTh+l2HOrId0clNkEmua58NB9vmI9Qh7YOoV/4folYg==} + engines: {node: '>=20.19.4'} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -21313,6 +21374,10 @@ packages: resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + path-expression-matcher@1.5.0: + resolution: {integrity: sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==} + engines: {node: '>=14.0.0'} + path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} @@ -23540,6 +23605,10 @@ packages: resolution: {integrity: sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA==} engines: {node: '>= 0.8'} + rock@0.13.0: + resolution: {integrity: sha512-UbUIfENbQtkQfGZyviZzXB9tPcTCWwAqJ8ZhwOXH9PJKp2ivGC7fTcumZS/Ls58pICBmwTO/kWgZLkzD+7jKtQ==} + hasBin: true + rolldown-plugin-dts@0.22.5: resolution: {integrity: sha512-M/HXfM4cboo+jONx9Z0X+CUf3B5tCi7ni+kR5fUW50Fp9AlZk0oVLesibGWgCXDKFp5lpgQ9yhKoImUFjl3VZw==} engines: {node: '>=20.19.0'} @@ -24463,6 +24532,9 @@ packages: strict-event-emitter@0.4.6: resolution: {integrity: sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg==} + strict-url-sanitise@0.0.1: + resolution: {integrity: sha512-nuFtF539K8jZg3FjaWH/L8eocCR6gegz5RDOsaWxfdbF5Jqr2VXWxZayjTwUzsWJDC91k2EbnJXp6FuWW+Z4hg==} + string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -24592,6 +24664,9 @@ packages: strnum@1.1.2: resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} + strnum@2.2.3: + resolution: {integrity: sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg==} + strtok3@10.3.4: resolution: {integrity: sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==} engines: {node: '>=18'} @@ -35166,13 +35241,6 @@ snapshots: execa: 5.1.1 fast-glob: 3.3.3 - '@react-native-community/cli-config-android@18.0.1': - dependencies: - '@react-native-community/cli-tools': 18.0.1 - chalk: 4.1.2 - fast-glob: 3.3.3 - fast-xml-parser: 4.5.4 - '@react-native-community/cli-config-android@19.1.2': dependencies: '@react-native-community/cli-tools': 19.1.2 @@ -35180,12 +35248,12 @@ snapshots: fast-glob: 3.3.3 fast-xml-parser: 4.5.4 - '@react-native-community/cli-config-apple@18.0.1': + '@react-native-community/cli-config-android@20.1.3': dependencies: - '@react-native-community/cli-tools': 18.0.1 - chalk: 4.1.2 - execa: 5.1.1 + '@react-native-community/cli-tools': 20.1.3 fast-glob: 3.3.3 + fast-xml-parser: 5.5.11 + picocolors: 1.1.1 '@react-native-community/cli-config-apple@19.1.2': dependencies: @@ -35194,16 +35262,12 @@ snapshots: execa: 5.1.1 fast-glob: 3.3.3 - '@react-native-community/cli-config@18.0.1(typescript@5.0.4)': + '@react-native-community/cli-config-apple@20.1.3': dependencies: - '@react-native-community/cli-tools': 18.0.1 - chalk: 4.1.2 - cosmiconfig: 9.0.1(typescript@5.0.4) - deepmerge: 4.3.1 + '@react-native-community/cli-tools': 20.1.3 + execa: 5.1.1 fast-glob: 3.3.3 - joi: 17.13.3 - transitivePeerDependencies: - - typescript + picocolors: 1.1.1 '@react-native-community/cli-config@19.1.2(typescript@5.0.4)': dependencies: @@ -35228,6 +35292,17 @@ snapshots: - typescript optional: true + '@react-native-community/cli-config@20.1.3(typescript@5.0.4)': + dependencies: + '@react-native-community/cli-tools': 20.1.3 + cosmiconfig: 9.0.1(typescript@5.0.4) + deepmerge: 4.3.1 + fast-glob: 3.3.3 + joi: 17.13.3 + picocolors: 1.1.1 + transitivePeerDependencies: + - typescript + '@react-native-community/cli-doctor@19.1.2(typescript@5.0.4)': dependencies: '@react-native-community/cli-config': 19.1.2(typescript@5.0.4) @@ -35289,9 +35364,9 @@ snapshots: dependencies: '@react-native-community/cli-platform-apple': 19.1.2 - '@react-native-community/cli-server-api@18.0.1': + '@react-native-community/cli-server-api@19.1.2': dependencies: - '@react-native-community/cli-tools': 18.0.1 + '@react-native-community/cli-tools': 19.1.2 body-parser: 1.20.4 compression: 1.8.1 connect: 3.7.0 @@ -35306,24 +35381,25 @@ snapshots: - supports-color - utf-8-validate - '@react-native-community/cli-server-api@19.1.2': + '@react-native-community/cli-server-api@20.1.3': dependencies: - '@react-native-community/cli-tools': 19.1.2 - body-parser: 1.20.4 + '@react-native-community/cli-tools': 20.1.3 + body-parser: 2.2.2 compression: 1.8.1 connect: 3.7.0 errorhandler: 1.5.2 nocache: 3.0.4 open: 6.4.0 - pretty-format: 26.6.2 + pretty-format: 29.7.0 serve-static: 1.16.3 + strict-url-sanitise: 0.0.1 ws: 6.2.3 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@react-native-community/cli-tools@18.0.1': + '@react-native-community/cli-tools@19.1.2': dependencies: '@vscode/sudo-prompt': 9.3.2 appdirsjs: 1.2.7 @@ -35336,24 +35412,24 @@ snapshots: prompts: 2.4.2 semver: 7.6.3 - '@react-native-community/cli-tools@19.1.2': + '@react-native-community/cli-tools@20.1.3': dependencies: '@vscode/sudo-prompt': 9.3.2 appdirsjs: 1.2.7 - chalk: 4.1.2 execa: 5.1.1 find-up: 5.0.0 launch-editor: 2.13.1 mime: 2.6.0 ora: 5.4.1 + picocolors: 1.1.1 prompts: 2.4.2 semver: 7.6.3 - '@react-native-community/cli-types@18.0.1': + '@react-native-community/cli-types@19.1.2': dependencies: joi: 17.13.3 - '@react-native-community/cli-types@19.1.2': + '@react-native-community/cli-types@20.1.3': dependencies: joi: 17.13.3 @@ -35507,28 +35583,8 @@ snapshots: - supports-color - utf-8-validate - '@react-native/debugger-frontend@0.79.7': {} - '@react-native/debugger-frontend@0.80.0': {} - '@react-native/dev-middleware@0.79.7': - dependencies: - '@isaacs/ttlcache': 1.4.1 - '@react-native/debugger-frontend': 0.79.7 - chrome-launcher: 0.15.2 - chromium-edge-launcher: 0.2.0 - connect: 3.7.0 - debug: 2.6.9 - invariant: 2.2.4 - nullthrows: 1.1.1 - open: 7.4.2 - serve-static: 1.16.3 - ws: 6.2.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - '@react-native/dev-middleware@0.80.0': dependencies: '@isaacs/ttlcache': 1.4.1 @@ -35726,19 +35782,6 @@ snapshots: '@remix-run/router@1.23.2': {} - '@rnef/cli@0.7.28(typescript@5.0.4)': - dependencies: - '@react-native-community/cli-config': 18.0.1(typescript@5.0.4) - '@rnef/config': 0.7.28 - '@rnef/tools': 0.7.28 - adm-zip: 0.5.16 - commander: 12.1.0 - tar: 7.5.11 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - - typescript - '@rnef/config@0.7.28': dependencies: '@babel/code-frame': 7.29.0 @@ -35749,56 +35792,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@rnef/platform-android@0.7.28': - dependencies: - '@react-native-community/cli-config-android': 18.0.1 - '@rnef/tools': 0.7.28 - adm-zip: 0.5.16 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - - '@rnef/platform-apple-helpers@0.7.28(typescript@5.0.4)': - dependencies: - '@react-native-community/cli-config': 18.0.1(typescript@5.0.4) - '@react-native-community/cli-config-apple': 18.0.1 - '@rnef/tools': 0.7.28 - '@types/adm-zip': 0.5.8 - adm-zip: 0.5.16 - fast-glob: 3.3.3 - fast-xml-parser: 4.5.4 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - - typescript - - '@rnef/platform-ios@0.7.28(typescript@5.0.4)': - dependencies: - '@react-native-community/cli-config-apple': 18.0.1 - '@react-native-community/cli-types': 18.0.1 - '@rnef/platform-apple-helpers': 0.7.28(typescript@5.0.4) - '@rnef/tools': 0.7.28 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - - typescript - - '@rnef/plugin-metro@0.7.28(@react-native/community-cli-plugin@0.80.0(@react-native-community/cli@19.1.2(typescript@5.0.4)))': - dependencies: - '@react-native-community/cli-server-api': 18.0.1 - '@react-native/community-cli-plugin': 0.80.0(@react-native-community/cli@19.1.2(typescript@5.0.4)) - '@react-native/dev-middleware': 0.79.7 - '@rnef/tools': 0.7.28 - metro: 0.82.5 - metro-config: 0.82.5 - metro-core: 0.82.5 - metro-resolver: 0.82.5 - tslib: 2.8.1 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - '@rnef/provider-github@0.7.28': dependencies: '@rnef/tools': 0.7.28 @@ -35832,6 +35825,47 @@ snapshots: joi: 17.13.3 tslib: 2.8.1 + '@rock-js/platform-android@0.13.0': + dependencies: + '@react-native-community/cli-config-android': 20.1.3 + '@rock-js/tools': 0.13.0 + tslib: 2.8.1 + + '@rock-js/platform-apple-helpers@0.13.0(typescript@5.0.4)': + dependencies: + '@react-native-community/cli-config': 20.1.3(typescript@5.0.4) + '@react-native-community/cli-config-apple': 20.1.3 + '@rock-js/tools': 0.13.0 + adm-zip: 0.5.16 + fast-xml-parser: 4.5.4 + tslib: 2.8.1 + transitivePeerDependencies: + - typescript + + '@rock-js/platform-ios@0.13.0(typescript@5.0.4)': + dependencies: + '@react-native-community/cli-config-apple': 20.1.3 + '@react-native-community/cli-types': 20.1.3 + '@rock-js/platform-apple-helpers': 0.13.0(typescript@5.0.4) + '@rock-js/tools': 0.13.0 + tslib: 2.8.1 + transitivePeerDependencies: + - typescript + + '@rock-js/plugin-metro@0.13.0': + dependencies: + '@react-native-community/cli-server-api': 20.1.3 + '@rock-js/tools': 0.13.0 + metro: 0.83.5 + metro-config: 0.83.5 + metro-core: 0.83.5 + metro-resolver: 0.83.5 + tslib: 2.8.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + '@rock-js/provider-github@0.13.0': dependencies: '@rock-js/tools': 0.13.0 @@ -36156,9 +36190,9 @@ snapshots: core-js: 3.47.0 jiti: 2.6.1 - '@rsbuild/core@2.0.0-beta.2(@module-federation/runtime-tools@2.2.2(node-fetch@2.7.0(encoding@0.1.13)))(core-js@3.49.0)': + '@rsbuild/core@2.0.0-beta.2(@module-federation/runtime-tools@0.21.6)(core-js@3.49.0)': dependencies: - '@rspack/core': 2.0.0-beta.0(@module-federation/runtime-tools@2.2.2(node-fetch@2.7.0(encoding@0.1.13)))(@swc/helpers@0.5.19) + '@rspack/core': 2.0.0-beta.0(@module-federation/runtime-tools@0.21.6)(@swc/helpers@0.5.19) '@swc/helpers': 0.5.19 jiti: 2.6.1 optionalDependencies: @@ -37418,12 +37452,12 @@ snapshots: optionalDependencies: '@swc/helpers': 0.5.19 - '@rspack/core@2.0.0-beta.0(@module-federation/runtime-tools@2.2.2(node-fetch@2.7.0(encoding@0.1.13)))(@swc/helpers@0.5.19)': + '@rspack/core@2.0.0-beta.0(@module-federation/runtime-tools@0.21.6)(@swc/helpers@0.5.19)': dependencies: '@rspack/binding': 2.0.0-beta.0 '@rspack/lite-tapable': 1.1.0 optionalDependencies: - '@module-federation/runtime-tools': 2.2.2(node-fetch@2.7.0(encoding@0.1.13)) + '@module-federation/runtime-tools': 0.21.6 '@swc/helpers': 0.5.19 '@rspack/core@2.0.0-beta.0(@module-federation/runtime-tools@2.3.1(node-fetch@3.3.0))(@swc/helpers@0.5.17)': @@ -45797,10 +45831,20 @@ snapshots: fast-uri@3.1.0: {} + fast-xml-builder@1.1.4: + dependencies: + path-expression-matcher: 1.5.0 + fast-xml-parser@4.5.4: dependencies: strnum: 1.1.2 + fast-xml-parser@5.5.11: + dependencies: + fast-xml-builder: 1.1.4 + path-expression-matcher: 1.5.0 + strnum: 2.2.3 + fastest-levenshtein@1.0.16: {} fastq@1.20.1: @@ -46815,6 +46859,8 @@ snapshots: hermes-estree@0.29.1: {} + hermes-estree@0.33.3: {} + hermes-parser@0.25.1: dependencies: hermes-estree: 0.25.1 @@ -46827,6 +46873,10 @@ snapshots: dependencies: hermes-estree: 0.29.1 + hermes-parser@0.33.3: + dependencies: + hermes-estree: 0.33.3 + history@4.10.1: dependencies: '@babel/runtime': 7.28.2 @@ -49213,10 +49263,23 @@ snapshots: transitivePeerDependencies: - supports-color + metro-babel-transformer@0.83.5: + dependencies: + '@babel/core': 7.29.0 + flow-enums-runtime: 0.0.6 + hermes-parser: 0.33.3 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + metro-cache-key@0.82.5: dependencies: flow-enums-runtime: 0.0.6 + metro-cache-key@0.83.5: + dependencies: + flow-enums-runtime: 0.0.6 + metro-cache@0.82.5: dependencies: exponential-backoff: 3.1.3 @@ -49226,6 +49289,15 @@ snapshots: transitivePeerDependencies: - supports-color + metro-cache@0.83.5: + dependencies: + exponential-backoff: 3.1.3 + flow-enums-runtime: 0.0.6 + https-proxy-agent: 7.0.6 + metro-core: 0.83.5 + transitivePeerDependencies: + - supports-color + metro-config@0.82.5: dependencies: connect: 3.7.0 @@ -49241,12 +49313,33 @@ snapshots: - supports-color - utf-8-validate + metro-config@0.83.5: + dependencies: + connect: 3.7.0 + flow-enums-runtime: 0.0.6 + jest-validate: 29.7.0 + metro: 0.83.5 + metro-cache: 0.83.5 + metro-core: 0.83.5 + metro-runtime: 0.83.5 + yaml: 2.8.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + metro-core@0.82.5: dependencies: flow-enums-runtime: 0.0.6 lodash.throttle: 4.1.1 metro-resolver: 0.82.5 + metro-core@0.83.5: + dependencies: + flow-enums-runtime: 0.0.6 + lodash.throttle: 4.1.1 + metro-resolver: 0.83.5 + metro-file-map@0.82.5: dependencies: debug: 4.4.3(supports-color@8.1.1) @@ -49261,20 +49354,48 @@ snapshots: transitivePeerDependencies: - supports-color + metro-file-map@0.83.5: + dependencies: + debug: 4.4.3(supports-color@8.1.1) + fb-watchman: 2.0.2 + flow-enums-runtime: 0.0.6 + graceful-fs: 4.2.11 + invariant: 2.2.4 + jest-worker: 29.7.0 + micromatch: 4.0.8 + nullthrows: 1.1.1 + walker: 1.0.8 + transitivePeerDependencies: + - supports-color + metro-minify-terser@0.82.5: dependencies: flow-enums-runtime: 0.0.6 terser: 5.46.1 + metro-minify-terser@0.83.5: + dependencies: + flow-enums-runtime: 0.0.6 + terser: 5.46.1 + metro-resolver@0.82.5: dependencies: flow-enums-runtime: 0.0.6 + metro-resolver@0.83.5: + dependencies: + flow-enums-runtime: 0.0.6 + metro-runtime@0.82.5: dependencies: '@babel/runtime': 7.28.2 flow-enums-runtime: 0.0.6 + metro-runtime@0.83.5: + dependencies: + '@babel/runtime': 7.28.2 + flow-enums-runtime: 0.0.6 + metro-source-map@0.82.5: dependencies: '@babel/traverse': 7.29.0 @@ -49290,6 +49411,20 @@ snapshots: transitivePeerDependencies: - supports-color + metro-source-map@0.83.5: + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + flow-enums-runtime: 0.0.6 + invariant: 2.2.4 + metro-symbolicate: 0.83.5 + nullthrows: 1.1.1 + ob1: 0.83.5 + source-map: 0.5.7 + vlq: 1.0.1 + transitivePeerDependencies: + - supports-color + metro-symbolicate@0.82.5: dependencies: flow-enums-runtime: 0.0.6 @@ -49301,6 +49436,17 @@ snapshots: transitivePeerDependencies: - supports-color + metro-symbolicate@0.83.5: + dependencies: + flow-enums-runtime: 0.0.6 + invariant: 2.2.4 + metro-source-map: 0.83.5 + nullthrows: 1.1.1 + source-map: 0.5.7 + vlq: 1.0.1 + transitivePeerDependencies: + - supports-color + metro-transform-plugins@0.82.5: dependencies: '@babel/core': 7.29.0 @@ -49312,6 +49458,17 @@ snapshots: transitivePeerDependencies: - supports-color + metro-transform-plugins@0.83.5: + dependencies: + '@babel/core': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + flow-enums-runtime: 0.0.6 + nullthrows: 1.1.1 + transitivePeerDependencies: + - supports-color + metro-transform-worker@0.82.5: dependencies: '@babel/core': 7.29.0 @@ -49332,6 +49489,26 @@ snapshots: - supports-color - utf-8-validate + metro-transform-worker@0.83.5: + dependencies: + '@babel/core': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/parser': 7.29.2 + '@babel/types': 7.29.0 + flow-enums-runtime: 0.0.6 + metro: 0.83.5 + metro-babel-transformer: 0.83.5 + metro-cache: 0.83.5 + metro-cache-key: 0.83.5 + metro-minify-terser: 0.83.5 + metro-source-map: 0.83.5 + metro-transform-plugins: 0.83.5 + nullthrows: 1.1.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + metro@0.82.5: dependencies: '@babel/code-frame': 7.29.0 @@ -49379,6 +49556,53 @@ snapshots: - supports-color - utf-8-validate + metro@0.83.5: + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/core': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/parser': 7.29.2 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + accepts: 2.0.0 + chalk: 4.1.2 + ci-info: 2.0.0 + connect: 3.7.0 + debug: 4.4.3(supports-color@8.1.1) + error-stack-parser: 2.1.4 + flow-enums-runtime: 0.0.6 + graceful-fs: 4.2.11 + hermes-parser: 0.33.3 + image-size: 1.2.1 + invariant: 2.2.4 + jest-worker: 29.7.0 + jsc-safe-url: 0.2.4 + lodash.throttle: 4.1.1 + metro-babel-transformer: 0.83.5 + metro-cache: 0.83.5 + metro-cache-key: 0.83.5 + metro-config: 0.83.5 + metro-core: 0.83.5 + metro-file-map: 0.83.5 + metro-resolver: 0.83.5 + metro-runtime: 0.83.5 + metro-source-map: 0.83.5 + metro-symbolicate: 0.83.5 + metro-transform-plugins: 0.83.5 + metro-transform-worker: 0.83.5 + mime-types: 3.0.2 + nullthrows: 1.1.1 + serialize-error: 2.1.0 + source-map: 0.5.7 + throat: 5.0.0 + ws: 7.5.10 + yargs: 17.7.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + micro@9.3.5-canary.3: dependencies: arg: 4.1.0 @@ -50364,6 +50588,10 @@ snapshots: dependencies: flow-enums-runtime: 0.0.6 + ob1@0.83.5: + dependencies: + flow-enums-runtime: 0.0.6 + object-assign@4.1.1: {} object-copy@0.1.0: @@ -50520,7 +50748,7 @@ snapshots: bl: 4.1.0 chalk: 4.1.2 cli-cursor: 3.1.0 - cli-spinners: 2.6.1 + cli-spinners: 2.9.2 is-interactive: 1.0.0 log-symbols: 4.1.0 strip-ansi: 6.0.1 @@ -50733,6 +50961,8 @@ snapshots: path-exists@5.0.0: {} + path-expression-matcher@1.5.0: {} + path-is-absolute@1.0.1: {} path-is-inside@1.0.2: {} @@ -54361,6 +54591,18 @@ snapshots: hash-base: 3.1.2 inherits: 2.0.4 + rock@0.13.0(typescript@5.0.4): + dependencies: + '@react-native-community/cli-config': 20.1.3(typescript@5.0.4) + '@rock-js/config': 0.13.0 + '@rock-js/tools': 0.13.0 + adm-zip: 0.5.16 + commander: 12.1.0 + tar: 7.5.11 + tslib: 2.8.1 + transitivePeerDependencies: + - typescript + rolldown-plugin-dts@0.22.5(rolldown@1.0.0-rc.3)(typescript@5.9.3)(vue-tsc@2.2.12(typescript@5.9.3)): dependencies: '@babel/generator': 8.0.0-rc.2 @@ -55487,6 +55729,8 @@ snapshots: strict-event-emitter@0.4.6: {} + strict-url-sanitise@0.0.1: {} + string-argv@0.3.2: {} string-convert@0.2.1: {} @@ -55634,6 +55878,8 @@ snapshots: strnum@1.1.2: {} + strnum@2.2.3: {} + strtok3@10.3.4: dependencies: '@tokenizer/token': 0.3.0 @@ -56656,6 +56902,26 @@ snapshots: optionalDependencies: '@swc/core': 1.7.26(@swc/helpers@0.5.13) + ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.17))(@types/node@20.19.5)(typescript@5.9.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.12 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.19.5 + acorn: 8.16.0 + acorn-walk: 8.3.5 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.4 + make-error: 1.3.6 + typescript: 5.9.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optionalDependencies: + '@swc/core': 1.15.10(@swc/helpers@0.5.17) + ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.17))(@types/node@22.19.15)(typescript@5.6.3): dependencies: '@cspotcode/source-map-support': 0.8.1 diff --git a/tools/scripts/run-metro-e2e.mjs b/tools/scripts/run-metro-e2e.mjs index e52409145e3..b37c067df5b 100644 --- a/tools/scripts/run-metro-e2e.mjs +++ b/tools/scripts/run-metro-e2e.mjs @@ -48,7 +48,7 @@ async function main() { `[metro-e2e] Starting ${options.platform} e2e for "${options.appName}"`, ); - await configureRnefCacheAuth(options); + await configureRockCacheAuth(options); await runCommand('pnpm', [ '--filter', @@ -142,14 +142,14 @@ function parseArgs(argv) { const result = { platform: null, appName: null, - skipRnefCacheAuth: false, + skipRockCacheAuth: false, skipOnMissingPrereqs: false, }; for (let i = 0; i < argv.length; i += 1) { const arg = argv[i]; - if (arg === '--skip-rnef-cache-auth') { - result.skipRnefCacheAuth = true; + if (arg === '--skip-rock-cache-auth') { + result.skipRockCacheAuth = true; continue; } if (arg === '--skip-on-missing-prereqs') { @@ -247,24 +247,24 @@ async function hasWritableMaestroHome() { } } -async function configureRnefCacheAuth(options) { - if (options.skipRnefCacheAuth) { - console.log('[metro-e2e] Skipping RNEF cache auth configuration.'); +async function configureRockCacheAuth(options) { + if (options.skipRockCacheAuth) { + console.log('[metro-e2e] Skipping Rock cache auth configuration.'); return; } const githubToken = process.env.GITHUB_TOKEN?.trim(); if (!githubToken) { console.log( - '[metro-e2e] GITHUB_TOKEN not set; skipping RNEF cache auth configuration.', + '[metro-e2e] GITHUB_TOKEN not set; skipping Rock cache auth configuration.', ); return; } - const rnefPath = join('apps', `metro-${options.appName}`, '.rnef', 'cache'); - await mkdir(rnefPath, { recursive: true }); + const rockPath = join('apps', `metro-${options.appName}`, '.rock', 'cache'); + await mkdir(rockPath, { recursive: true }); await writeFile( - join(rnefPath, 'project.json'), + join(rockPath, 'project.json'), JSON.stringify({ githubToken }), 'utf8', ); From e2c85809a2190d6afddb0827fac209fa4192119a Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Fri, 10 Apr 2026 13:08:40 +0200 Subject: [PATCH 03/15] chore: add changeset for metro-plugin-rock --- .changeset/add-metro-plugin-rock.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/add-metro-plugin-rock.md diff --git a/.changeset/add-metro-plugin-rock.md b/.changeset/add-metro-plugin-rock.md new file mode 100644 index 00000000000..7b0a3849cf0 --- /dev/null +++ b/.changeset/add-metro-plugin-rock.md @@ -0,0 +1,6 @@ +--- +'@module-federation/metro-plugin-rock': minor +'@module-federation/metro-plugin-rnef': patch +--- + +feat(metro): add metro-plugin-rock for Rock integration and deprecate metro-plugin-rnef From 3893b00409a0ede4bac94f23caf62d92b0c39c84 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Fri, 10 Apr 2026 13:09:13 +0200 Subject: [PATCH 04/15] chore: split changeset into separate rock and rnef entries --- .changeset/add-metro-plugin-rock.md | 3 +-- .changeset/deprecate-metro-plugin-rnef.md | 5 +++++ 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 .changeset/deprecate-metro-plugin-rnef.md diff --git a/.changeset/add-metro-plugin-rock.md b/.changeset/add-metro-plugin-rock.md index 7b0a3849cf0..0c442997fe5 100644 --- a/.changeset/add-metro-plugin-rock.md +++ b/.changeset/add-metro-plugin-rock.md @@ -1,6 +1,5 @@ --- '@module-federation/metro-plugin-rock': minor -'@module-federation/metro-plugin-rnef': patch --- -feat(metro): add metro-plugin-rock for Rock integration and deprecate metro-plugin-rnef +feat(metro): add metro-plugin-rock for Rock integration diff --git a/.changeset/deprecate-metro-plugin-rnef.md b/.changeset/deprecate-metro-plugin-rnef.md new file mode 100644 index 00000000000..295921c0526 --- /dev/null +++ b/.changeset/deprecate-metro-plugin-rnef.md @@ -0,0 +1,5 @@ +--- +'@module-federation/metro-plugin-rnef': patch +--- + +chore(metro): deprecate metro-plugin-rnef in favor of metro-plugin-rock From c7f6b010f1bad9bb78376e6052e18cdb1567c6bc Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Fri, 10 Apr 2026 13:11:43 +0200 Subject: [PATCH 05/15] docs(metro): update website docs for Rock integration --- .../en/guide/build-plugins/plugins-metro.mdx | 23 +++++++++++-------- .../zh/guide/build-plugins/plugins-metro.mdx | 23 +++++++++++-------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/apps/website-new/docs/en/guide/build-plugins/plugins-metro.mdx b/apps/website-new/docs/en/guide/build-plugins/plugins-metro.mdx index 66384774d7d..283602aa09c 100644 --- a/apps/website-new/docs/en/guide/build-plugins/plugins-metro.mdx +++ b/apps/website-new/docs/en/guide/build-plugins/plugins-metro.mdx @@ -19,7 +19,8 @@ The React Native Module Federation ecosystem consists of several packages: - `@module-federation/metro` - Core integration with Metro to enable Module Federation - `@module-federation/metro-plugin-rnc-cli` - React Native CLI integration -- `@module-federation/metro-plugin-rnef` - React Native Enterprise Framework integration +- `@module-federation/metro-plugin-rock` - [Rock](https://www.rockjs.dev/) integration +- `@module-federation/metro-plugin-rnef` - RNEF integration (deprecated, use `metro-plugin-rock` instead) ## Installation @@ -32,8 +33,8 @@ pnpm add @module-federation/metro # If your project is using React Native CLI pnpm add @module-federation/metro-plugin-rnc-cli -# If your project is using React Native Enterprise Framework (RNEF) -pnpm add @module-federation/metro-plugin-rnef +# If your project is using Rock (formerly RNEF) +pnpm add @module-federation/metro-plugin-rock ``` ## Configuration @@ -199,17 +200,17 @@ Both commands support all the same options as the standard `react-native bundle` > **Note**: These commands are provided by the `@module-federation/metro-plugin-rnc-cli` package. -## React Native Enterprise Framework (RNEF) Integration +## Rock Integration -For projects using [React Native Enterprise Framework (RNEF)](https://github.com/callstack/react-native-enterprise-framework), add the Module Federation plugin to your `rnef.config.mjs`: +For projects using [Rock](https://www.rockjs.dev/) (formerly RNEF), add the Module Federation plugin to your `rock.config.mjs`: ```javascript -import { pluginMetroModuleFederation } from '@module-federation/metro-plugin-rnef'; -import { platformAndroid } from '@rnef/platform-android'; -import { platformIOS } from '@rnef/platform-ios'; -import { pluginMetro } from '@rnef/plugin-metro'; +import { pluginMetroModuleFederation } from '@module-federation/metro-plugin-rock'; +import { platformAndroid } from '@rock-js/platform-android'; +import { platformIOS } from '@rock-js/platform-ios'; +import { pluginMetro } from '@rock-js/plugin-metro'; -/** @type {import('@rnef/config').Config} */ +/** @type {import('rock').Config} */ export default { bundler: pluginMetro(), platforms: { @@ -220,6 +221,8 @@ export default { }; ``` +> **Note**: If you are migrating from RNEF, replace `@module-federation/metro-plugin-rnef` with `@module-federation/metro-plugin-rock` and rename `rnef.config.mjs` to `rock.config.mjs`. See the [metro-plugin-rock README](https://www.npmjs.com/package/@module-federation/metro-plugin-rock) for full migration details. + ## API Reference ### `withModuleFederation(metroConfig, federationConfig, options?)` diff --git a/apps/website-new/docs/zh/guide/build-plugins/plugins-metro.mdx b/apps/website-new/docs/zh/guide/build-plugins/plugins-metro.mdx index d1402f60529..f4a8f84c1b6 100644 --- a/apps/website-new/docs/zh/guide/build-plugins/plugins-metro.mdx +++ b/apps/website-new/docs/zh/guide/build-plugins/plugins-metro.mdx @@ -19,7 +19,8 @@ React Native 模块联邦生态系统由以下几个包组成: - `@module-federation/metro` - 与 Metro 的核心集成,用于启用模块联邦 - `@module-federation/metro-plugin-rnc-cli` - React Native CLI 集成 -- `@module-federation/metro-plugin-rnef` - React Native Enterprise Framework 集成 +- `@module-federation/metro-plugin-rock` - [Rock](https://www.rockjs.dev/) 集成 +- `@module-federation/metro-plugin-rnef` - RNEF 集成(已弃用,请使用 `metro-plugin-rock`) ## 安装 @@ -32,8 +33,8 @@ pnpm add @module-federation/metro # 如果项目使用 React Native CLI pnpm add @module-federation/metro-plugin-rnc-cli -# 如果项目使用 React Native Enterprise Framework (RNEF) -pnpm add @module-federation/metro-plugin-rnef +# 如果项目使用 Rock(原 RNEF) +pnpm add @module-federation/metro-plugin-rock ``` ## 配置 @@ -201,17 +202,17 @@ react-native bundle-mf-remote --platform android > **注意**:这些命令由 `@module-federation/metro-plugin-rnc-cli` 包提供。 -## React Native Enterprise Framework (RNEF) 集成 +## Rock 集成 -如果项目使用 [React Native Enterprise Framework (RNEF)](https://github.com/callstack/react-native-enterprise-framework),请在 `rnef.config.mjs` 中添加模块联邦插件: +如果项目使用 [Rock](https://www.rockjs.dev/)(原 RNEF),请在 `rock.config.mjs` 中添加模块联邦插件: ```javascript -import { pluginMetroModuleFederation } from '@module-federation/metro-plugin-rnef'; -import { platformAndroid } from '@rnef/platform-android'; -import { platformIOS } from '@rnef/platform-ios'; -import { pluginMetro } from '@rnef/plugin-metro'; +import { pluginMetroModuleFederation } from '@module-federation/metro-plugin-rock'; +import { platformAndroid } from '@rock-js/platform-android'; +import { platformIOS } from '@rock-js/platform-ios'; +import { pluginMetro } from '@rock-js/plugin-metro'; -/** @type {import('@rnef/config').Config} */ +/** @type {import('rock').Config} */ export default { bundler: pluginMetro(), platforms: { @@ -222,6 +223,8 @@ export default { }; ``` +> **注意**:如果你正在从 RNEF 迁移,请将 `@module-federation/metro-plugin-rnef` 替换为 `@module-federation/metro-plugin-rock`,并将 `rnef.config.mjs` 重命名为 `rock.config.mjs`。详细迁移指南请参阅 [metro-plugin-rock README](https://www.npmjs.com/package/@module-federation/metro-plugin-rock)。 + ## API 参考 ### `withModuleFederation(metroConfig, federationConfig, options?)` From c4895bb71c0b6dfea463796e97edf584b9cefcf2 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Fri, 10 Apr 2026 13:38:48 +0200 Subject: [PATCH 06/15] fix(metro): use providerGitHub() instead of deprecated shorthand The 'github-actions' shorthand for remoteCacheProvider emits a deprecation warning with ANSI codes that corrupts $GITHUB_ENV inside the Rock CI actions, breaking both Android and iOS e2e jobs. --- apps/metro-example-host/package.json | 1 + apps/metro-example-host/rock.config.mjs | 5 +- apps/metro-example-mini/package.json | 1 + apps/metro-example-mini/rock.config.mjs | 5 +- apps/metro-example-nested-mini/package.json | 1 + .../metro-example-nested-mini/rock.config.mjs | 5 +- pnpm-lock.yaml | 66 +++++++++++-------- 7 files changed, 53 insertions(+), 31 deletions(-) diff --git a/apps/metro-example-host/package.json b/apps/metro-example-host/package.json index 7d68c7f10ca..6a1484fb6e1 100644 --- a/apps/metro-example-host/package.json +++ b/apps/metro-example-host/package.json @@ -41,6 +41,7 @@ "@rock-js/platform-android": "^0.13.0", "@rock-js/platform-ios": "^0.13.0", "@rock-js/plugin-metro": "^0.13.0", + "@rock-js/provider-github": "^0.13.0", "@types/jest": "^29.5.13", "@types/lodash": "^4", "@types/react": "^19.1.0", diff --git a/apps/metro-example-host/rock.config.mjs b/apps/metro-example-host/rock.config.mjs index 08cd95befab..ffa746881e5 100644 --- a/apps/metro-example-host/rock.config.mjs +++ b/apps/metro-example-host/rock.config.mjs @@ -1,9 +1,12 @@ import {pluginMetroModuleFederation} from '@module-federation/metro-plugin-rock'; import {platformAndroid} from '@rock-js/platform-android'; +import {providerGitHub} from '@rock-js/provider-github'; // @ts-check import {platformIOS} from '@rock-js/platform-ios'; import {pluginMetro} from '@rock-js/plugin-metro'; +const [owner, repository] = (process.env.GITHUB_REPOSITORY ?? '/').split('/'); + /** @type {import('rock').Config} */ export default { bundler: pluginMetro(), @@ -11,6 +14,6 @@ export default { ios: platformIOS(), android: platformAndroid(), }, - remoteCacheProvider: 'github-actions', + remoteCacheProvider: providerGitHub({owner, repository}), plugins: [pluginMetroModuleFederation()], }; diff --git a/apps/metro-example-mini/package.json b/apps/metro-example-mini/package.json index 2e0b797469c..84152f736d6 100644 --- a/apps/metro-example-mini/package.json +++ b/apps/metro-example-mini/package.json @@ -39,6 +39,7 @@ "@rock-js/platform-android": "^0.13.0", "@rock-js/platform-ios": "^0.13.0", "@rock-js/plugin-metro": "^0.13.0", + "@rock-js/provider-github": "^0.13.0", "@types/jest": "^29.5.13", "@types/lodash": "^4", "@types/react": "^19.1.0", diff --git a/apps/metro-example-mini/rock.config.mjs b/apps/metro-example-mini/rock.config.mjs index 08cd95befab..ffa746881e5 100644 --- a/apps/metro-example-mini/rock.config.mjs +++ b/apps/metro-example-mini/rock.config.mjs @@ -1,9 +1,12 @@ import {pluginMetroModuleFederation} from '@module-federation/metro-plugin-rock'; import {platformAndroid} from '@rock-js/platform-android'; +import {providerGitHub} from '@rock-js/provider-github'; // @ts-check import {platformIOS} from '@rock-js/platform-ios'; import {pluginMetro} from '@rock-js/plugin-metro'; +const [owner, repository] = (process.env.GITHUB_REPOSITORY ?? '/').split('/'); + /** @type {import('rock').Config} */ export default { bundler: pluginMetro(), @@ -11,6 +14,6 @@ export default { ios: platformIOS(), android: platformAndroid(), }, - remoteCacheProvider: 'github-actions', + remoteCacheProvider: providerGitHub({owner, repository}), plugins: [pluginMetroModuleFederation()], }; diff --git a/apps/metro-example-nested-mini/package.json b/apps/metro-example-nested-mini/package.json index e15c8f4ddaf..d39c7f1b36c 100644 --- a/apps/metro-example-nested-mini/package.json +++ b/apps/metro-example-nested-mini/package.json @@ -38,6 +38,7 @@ "@rock-js/platform-android": "^0.13.0", "@rock-js/platform-ios": "^0.13.0", "@rock-js/plugin-metro": "^0.13.0", + "@rock-js/provider-github": "^0.13.0", "@types/jest": "^29.5.13", "@types/lodash": "^4", "@types/react": "^19.1.0", diff --git a/apps/metro-example-nested-mini/rock.config.mjs b/apps/metro-example-nested-mini/rock.config.mjs index 08cd95befab..ffa746881e5 100644 --- a/apps/metro-example-nested-mini/rock.config.mjs +++ b/apps/metro-example-nested-mini/rock.config.mjs @@ -1,9 +1,12 @@ import {pluginMetroModuleFederation} from '@module-federation/metro-plugin-rock'; import {platformAndroid} from '@rock-js/platform-android'; +import {providerGitHub} from '@rock-js/provider-github'; // @ts-check import {platformIOS} from '@rock-js/platform-ios'; import {pluginMetro} from '@rock-js/plugin-metro'; +const [owner, repository] = (process.env.GITHUB_REPOSITORY ?? '/').split('/'); + /** @type {import('rock').Config} */ export default { bundler: pluginMetro(), @@ -11,6 +14,6 @@ export default { ios: platformIOS(), android: platformAndroid(), }, - remoteCacheProvider: 'github-actions', + remoteCacheProvider: providerGitHub({owner, repository}), plugins: [pluginMetroModuleFederation()], }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f8b41a6c6f1..b713fb65ee9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -878,6 +878,9 @@ importers: '@rock-js/plugin-metro': specifier: ^0.13.0 version: 0.13.0 + '@rock-js/provider-github': + specifier: ^0.13.0 + version: 0.13.0 '@types/jest': specifier: ^29.5.13 version: 29.5.13 @@ -966,6 +969,9 @@ importers: '@rock-js/plugin-metro': specifier: ^0.13.0 version: 0.13.0 + '@rock-js/provider-github': + specifier: ^0.13.0 + version: 0.13.0 '@types/jest': specifier: ^29.5.13 version: 29.5.13 @@ -1054,6 +1060,9 @@ importers: '@rock-js/plugin-metro': specifier: ^0.13.0 version: 0.13.0 + '@rock-js/provider-github': + specifier: ^0.13.0 + version: 0.13.0 '@types/jest': specifier: ^29.5.13 version: 29.5.13 @@ -4299,7 +4308,7 @@ importers: version: 2.6.0 tailwindcss-animate: specifier: 1.0.7 - version: 1.0.7(tailwindcss@3.4.16(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.17))(@types/node@22.19.15)(typescript@5.6.3))) + version: 1.0.7(tailwindcss@3.4.16(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.19))(@types/node@22.19.15)(typescript@5.6.3))) vaul: specifier: 1.1.2 version: 1.1.2(@types/react-dom@18.3.7(@types/react@18.3.28))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -4363,7 +4372,7 @@ importers: version: 8.4.49 tailwindcss: specifier: v3.4.16 - version: 3.4.16(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.17))(@types/node@22.19.15)(typescript@5.6.3)) + version: 3.4.16(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.19))(@types/node@22.19.15)(typescript@5.6.3)) typescript: specifier: ~5.6.2 version: 5.6.3 @@ -4424,7 +4433,7 @@ importers: version: 13.1.3 ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.19))(@types/node@20.19.5)(typescript@5.9.3) + version: 10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.17))(@types/node@20.19.5)(typescript@5.9.3) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -51325,29 +51334,29 @@ snapshots: postcss: 8.4.49 ts-node: 10.9.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@20.19.5)(typescript@5.9.3) - postcss-load-config@4.0.2(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.17))(@types/node@22.19.15)(typescript@5.6.3)): + postcss-load-config@4.0.2(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.19))(@types/node@20.19.5)(typescript@5.4.5)): dependencies: lilconfig: 3.1.3 yaml: 2.8.2 optionalDependencies: postcss: 8.4.49 - ts-node: 10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.17))(@types/node@22.19.15)(typescript@5.6.3) + ts-node: 10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.19))(@types/node@20.19.5)(typescript@5.4.5) - postcss-load-config@4.0.2(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.19))(@types/node@20.19.5)(typescript@5.4.5)): + postcss-load-config@4.0.2(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.19))(@types/node@20.19.5)(typescript@5.9.3)): dependencies: lilconfig: 3.1.3 yaml: 2.8.2 optionalDependencies: postcss: 8.4.49 - ts-node: 10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.19))(@types/node@20.19.5)(typescript@5.4.5) + ts-node: 10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.19))(@types/node@20.19.5)(typescript@5.9.3) - postcss-load-config@4.0.2(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.19))(@types/node@20.19.5)(typescript@5.9.3)): + postcss-load-config@4.0.2(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.19))(@types/node@22.19.15)(typescript@5.6.3)): dependencies: lilconfig: 3.1.3 yaml: 2.8.2 optionalDependencies: postcss: 8.4.49 - ts-node: 10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.19))(@types/node@20.19.5)(typescript@5.9.3) + ts-node: 10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.19))(@types/node@22.19.15)(typescript@5.6.3) postcss-load-config@4.0.2(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.19))(@types/node@22.19.15)(typescript@5.9.3)): dependencies: @@ -56146,9 +56155,9 @@ snapshots: tailwind-merge@2.6.0: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.16(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.17))(@types/node@22.19.15)(typescript@5.6.3))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.16(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.19))(@types/node@22.19.15)(typescript@5.6.3))): dependencies: - tailwindcss: 3.4.16(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.17))(@types/node@22.19.15)(typescript@5.6.3)) + tailwindcss: 3.4.16(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.19))(@types/node@22.19.15)(typescript@5.6.3)) tailwindcss@3.4.13(ts-node@10.9.1(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@20.19.5)(typescript@5.9.3)): dependencies: @@ -56231,7 +56240,7 @@ snapshots: transitivePeerDependencies: - ts-node - tailwindcss@3.4.16(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.17))(@types/node@22.19.15)(typescript@5.6.3)): + tailwindcss@3.4.16(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.19))(@types/node@22.19.15)(typescript@5.6.3)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -56250,7 +56259,7 @@ snapshots: postcss: 8.4.49 postcss-import: 15.1.0(postcss@8.4.49) postcss-js: 4.1.0(postcss@8.4.49) - postcss-load-config: 4.0.2(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.17))(@types/node@22.19.15)(typescript@5.6.3)) + postcss-load-config: 4.0.2(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.19))(@types/node@22.19.15)(typescript@5.6.3)) postcss-nested: 6.2.0(postcss@8.4.49) postcss-selector-parser: 6.1.2 resolve: 1.22.8 @@ -56922,7 +56931,7 @@ snapshots: optionalDependencies: '@swc/core': 1.15.10(@swc/helpers@0.5.17) - ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.17))(@types/node@22.19.15)(typescript@5.6.3): + ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.17))(@types/node@22.19.15)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 @@ -56936,35 +56945,35 @@ snapshots: create-require: 1.1.1 diff: 4.0.4 make-error: 1.3.6 - typescript: 5.6.3 + typescript: 5.9.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: '@swc/core': 1.15.10(@swc/helpers@0.5.17) optional: true - ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.17))(@types/node@22.19.15)(typescript@5.9.3): + ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.19))(@types/node@20.19.5)(typescript@5.0.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.19.15 + '@types/node': 20.19.5 acorn: 8.16.0 acorn-walk: 8.3.5 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.4 make-error: 1.3.6 - typescript: 5.9.3 + typescript: 5.0.4 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.15.10(@swc/helpers@0.5.17) + '@swc/core': 1.15.10(@swc/helpers@0.5.19) optional: true - ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.19))(@types/node@20.19.5)(typescript@5.0.4): + ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.19))(@types/node@20.19.5)(typescript@5.4.5): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 @@ -56978,14 +56987,14 @@ snapshots: create-require: 1.1.1 diff: 4.0.4 make-error: 1.3.6 - typescript: 5.0.4 + typescript: 5.4.5 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: '@swc/core': 1.15.10(@swc/helpers@0.5.19) optional: true - ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.19))(@types/node@20.19.5)(typescript@5.4.5): + ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.19))(@types/node@20.19.5)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 @@ -56999,34 +57008,35 @@ snapshots: create-require: 1.1.1 diff: 4.0.4 make-error: 1.3.6 - typescript: 5.4.5 + typescript: 5.9.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: '@swc/core': 1.15.10(@swc/helpers@0.5.19) optional: true - ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.19))(@types/node@20.19.5)(typescript@5.9.3): + ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.19))(@types/node@22.19.15)(typescript@5.0.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.19.5 + '@types/node': 22.19.15 acorn: 8.16.0 acorn-walk: 8.3.5 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.4 make-error: 1.3.6 - typescript: 5.9.3 + typescript: 5.0.4 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: '@swc/core': 1.15.10(@swc/helpers@0.5.19) + optional: true - ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.19))(@types/node@22.19.15)(typescript@5.0.4): + ts-node@10.9.2(@swc/core@1.15.10(@swc/helpers@0.5.19))(@types/node@22.19.15)(typescript@5.6.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 @@ -57040,7 +57050,7 @@ snapshots: create-require: 1.1.1 diff: 4.0.4 make-error: 1.3.6 - typescript: 5.0.4 + typescript: 5.6.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: From bdea246de4e139090f95a9666ab373aa86b29b9f Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Fri, 10 Apr 2026 16:04:16 +0200 Subject: [PATCH 07/15] fix(metro): use local Rock actions with working-directory fix Fork callstackincubator/{android,ios}@v3 into .github/actions/ with working-directory propagated to all composite steps. The upstream actions miss it on cache-related steps, causing rock.config.mjs lookup failures when the app is not at the repo root. Also switch rock.config.mjs to use providerGitHub() (non-deprecated) from @rock-js/provider-github and add NO_COLOR=1 to e2e jobs. --- .github/actions/rock-android/action.yml | 328 ++++++++++++ .github/actions/rock-ios/action.yml | 491 ++++++++++++++++++ .github/workflows/e2e-metro.yml | 6 +- apps/metro-example-host/rock.config.mjs | 8 +- apps/metro-example-mini/rock.config.mjs | 8 +- .../metro-example-nested-mini/rock.config.mjs | 8 +- 6 files changed, 832 insertions(+), 17 deletions(-) create mode 100644 .github/actions/rock-android/action.yml create mode 100644 .github/actions/rock-ios/action.yml diff --git a/.github/actions/rock-android/action.yml b/.github/actions/rock-android/action.yml new file mode 100644 index 00000000000..aa8c5ae65a3 --- /dev/null +++ b/.github/actions/rock-android/action.yml @@ -0,0 +1,328 @@ +name: 'Rock Remote Build - Android' +description: 'Local fork of callstackincubator/android@v3 with working-directory fix' + +inputs: + github-token: + description: 'GitHub Token' + required: true + working-directory: + description: 'Working directory for the build command' + required: false + default: '.' + validate-gradle-wrapper: + description: 'Whether to validate the Gradle wrapper' + required: false + default: true + setup-java: + description: 'Whether to run actions/setup-java action' + required: false + default: true + variant: + description: 'Build variant' + required: false + default: 'debug' + rock-build-extra-params: + description: 'Extra parameters to pass to "rock build:android"' + required: false + sign: + description: 'Whether to sign the build with release keystore' + required: false + re-sign: + description: Re-sign the app bundle with new JS bundle + required: false + keystore-base64: + description: 'Base64 version of the release keystore' + required: false + keystore-file: + description: 'Path to the keystore file' + required: false + keystore-store-file: + description: 'Keystore store file name' + required: false + keystore-store-password: + description: 'Keystore store password' + required: false + keystore-key-alias: + description: 'Keystore key alias' + required: false + keystore-key-password: + description: 'Keystore key password' + required: false + keystore-path: + description: 'Path within the Android source directory where the keystore should be placed' + required: false + default: 'release.keystore' + comment-bot: + description: 'Whether to send a comment under PR with the link to the generated build' + required: false + default: true + +outputs: + artifact-url: + description: 'URL of the relevant Android build artifact (could be cached)' + value: ${{ steps.upload-artifact.outputs.artifact-url || env.ARTIFACT_URL }} + artifact-id: + description: 'ID of the relevant Android build artifact (could be cached)' + value: ${{ steps.upload-artifact.outputs.artifact-id || env.ARTIFACT_ID }} + +runs: + using: 'composite' + steps: + - name: Validate Inputs + run: | + if [ "${{ inputs.sign }}" == "true" ]; then + if [ -z "${{ inputs.keystore-file }}" ] && [ -z "${{ inputs.keystore-base64 }}" ]; then + echo "Either 'keystore-file' or 'keystore-base64' is required for signed builds." + exit 1 + fi + if [ -n "${{ inputs.keystore-file }}" ] && [ ! -f "${{ inputs.keystore-file }}" ]; then + echo "Keystore file '${{ inputs.keystore-file }}' does not exist." + exit 1 + fi + if [ -z "${{ inputs.keystore-store-file }}" ]; then + echo " Input 'keystore-store-file' is required for signed builds." + exit 1 + fi + if [ -z "${{ inputs.keystore-store-password }}" ]; then + echo "Input 'keystore-store-password' is required for signed builds." + exit 1 + fi + if [ -z "${{ inputs.keystore-key-alias }}" ]; then + echo "Input 'keystore-key-alias' is required for signed builds." + exit 1 + fi + if [ -z "${{ inputs.keystore-key-password }}" ]; then + echo "Input 'keystore-key-password' is required for signed builds." + exit 1 + fi + fi + shell: bash + + - name: Native Fingerprint + id: fingerprint + run: | + FINGERPRINT_OUTPUT=$(npx rock fingerprint -p android --raw) || (echo "$FINGERPRINT_OUTPUT" && exit 1) + echo "FINGERPRINT=$FINGERPRINT_OUTPUT" >> $GITHUB_ENV + shell: bash + working-directory: ${{ inputs.working-directory }} + + - name: Get Provider Name + run: | + PROVIDER_NAME=$(npx rock remote-cache get-provider-name) || (echo "$PROVIDER_NAME" && exit 1) + echo "PROVIDER_NAME=$PROVIDER_NAME" >> $GITHUB_ENV + shell: bash + working-directory: ${{ inputs.working-directory }} + + - name: Populate GitHub Token in Cache + if: ${{ env.PROVIDER_NAME == 'GitHub' }} + run: | + mkdir -p .rock/cache + echo "{\"githubToken\": \"${{ inputs.github-token }}\"}" > .rock/cache/project.json + shell: bash + working-directory: ${{ inputs.working-directory }} + + - name: Check if PR-related artifact exists + if: ${{ github.event_name == 'pull_request' && inputs.re-sign == 'true' }} + run: | + ARTIFACT_TRAITS="${{ inputs.variant }},${{ github.event.pull_request.number}}" + echo "ARTIFACT_TRAITS=$ARTIFACT_TRAITS" >> $GITHUB_ENV + OUTPUT=$(npx rock remote-cache list -p android --traits "${ARTIFACT_TRAITS}" --json) || (echo "$OUTPUT" && exit 1) + if [ "$OUTPUT" ]; then + echo "ARTIFACT_URL=$(echo "$OUTPUT" | jq -r '.url')" >> $GITHUB_ENV + echo "ARTIFACT_ID=$(echo "$OUTPUT" | jq -r '.id')" >> $GITHUB_ENV + echo "ARTIFACT_NAME=$(echo "$OUTPUT" | jq -r '.name')" >> $GITHUB_ENV + fi + shell: bash + working-directory: ${{ inputs.working-directory }} + + - name: Check if regular artifact exists + if: ${{ !env.ARTIFACT_NAME }} + run: | + ARTIFACT_TRAITS="${{ inputs.variant }}" + echo "ARTIFACT_TRAITS=$ARTIFACT_TRAITS" >> $GITHUB_ENV + OUTPUT=$(npx rock remote-cache list -p android --traits "${ARTIFACT_TRAITS}" --json) || (echo "$OUTPUT" && exit 1) + if [ "$OUTPUT" ]; then + echo "ARTIFACT_URL=$(echo "$OUTPUT" | jq -r '.url')" >> $GITHUB_ENV + echo "ARTIFACT_ID=$(echo "$OUTPUT" | jq -r '.id')" >> $GITHUB_ENV + echo "ARTIFACT_NAME=$(echo "$OUTPUT" | jq -r '.name')" >> $GITHUB_ENV + fi + shell: bash + working-directory: ${{ inputs.working-directory }} + + - name: Set Artifact Name (if not set) + if: ${{ !env.ARTIFACT_NAME }} + run: | + ARTIFACT_TRAITS_HYPHENATED=$(echo "$ARTIFACT_TRAITS" | tr ',' '-') + ARTIFACT_TRAITS_HYPHENATED_FINGERPRINT="${ARTIFACT_TRAITS_HYPHENATED}-${FINGERPRINT}" + echo "ARTIFACT_NAME=rock-android-${ARTIFACT_TRAITS_HYPHENATED_FINGERPRINT}" >> $GITHUB_ENV + shell: bash + + - name: Install Java + if: ${{ inputs.setup-java == 'true' && !env.ARTIFACT_URL }} + uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4.7.1 + with: + java-version: 17 + distribution: adopt + cache: gradle + + - name: Validate Gradle wrapper + if: ${{ inputs.validate-gradle-wrapper == 'true' && !env.ARTIFACT_URL }} + uses: gradle/actions/wrapper-validation@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1 + + - name: Create local gradle.properties + if: ${{ !env.ARTIFACT_URL && inputs.sign }} + run: | + mkdir -p $HOME/.gradle + touch $HOME/.gradle/gradle.properties + echo "android.injected.signing.store.file=${{ inputs.keystore-store-file }}" >> $HOME/.gradle/gradle.properties + echo "android.injected.signing.store.password=${{ inputs.keystore-store-password }}" >> $HOME/.gradle/gradle.properties + echo "android.injected.signing.key.alias=${{ inputs.keystore-key-alias }}" >> $HOME/.gradle/gradle.properties + echo "android.injected.signing.key.password=${{ inputs.keystore-key-password }}" >> $HOME/.gradle/gradle.properties + echo "ROCK_UPLOAD_STORE_FILE=${{ inputs.keystore-store-file }}" >> $HOME/.gradle/gradle.properties + echo "ROCK_UPLOAD_STORE_PASSWORD=${{ inputs.keystore-store-password }}" >> $HOME/.gradle/gradle.properties + echo "ROCK_UPLOAD_KEY_ALIAS=${{ inputs.keystore-key-alias }}" >> $HOME/.gradle/gradle.properties + echo "ROCK_UPLOAD_KEY_PASSWORD=${{ inputs.keystore-key-password }}" >> $HOME/.gradle/gradle.properties + shell: bash + + - name: Determine Android sourceDir and appName + if: ${{ !env.ARTIFACT_URL }} + run: | + JSON_OUTPUT=$(npx rock config -p android) || (echo "$JSON_OUTPUT" && exit 1) + echo "$JSON_OUTPUT" | jq -r '.project' + ANDROID_SOURCE_DIR=$(echo "$JSON_OUTPUT" | jq -r '.project.android.sourceDir') + APP_NAME=$(echo "$JSON_OUTPUT" | jq -r '.project.android.appName') + echo "ANDROID_SOURCE_DIR=$ANDROID_SOURCE_DIR" >> $GITHUB_ENV + echo "APP_NAME=$APP_NAME" >> $GITHUB_ENV + shell: bash + working-directory: ${{ inputs.working-directory }} + + - name: Decode and store keystore file + if: ${{ !env.ARTIFACT_URL && inputs.sign }} + run: | + if [ -n "$APP_NAME" ]; then + KEYSTORE_TARGET_PATH="$ANDROID_SOURCE_DIR/$APP_NAME/${{ inputs.keystore-path }}" + else + KEYSTORE_TARGET_PATH="$ANDROID_SOURCE_DIR/${{ inputs.keystore-path }}" + fi + echo "Keystore target path before normalizing: $KEYSTORE_TARGET_PATH" + KEYSTORE_TARGET_PATH=$(realpath -m "$KEYSTORE_TARGET_PATH") + echo "Keystore target path after normalizing: $KEYSTORE_TARGET_PATH" + mkdir -p "$(dirname "$KEYSTORE_TARGET_PATH")" || { + echo "Failed to create keystore directory: $(dirname "$KEYSTORE_TARGET_PATH")" + exit 1 + } + if [ -n "${{ inputs.keystore-file }}" ]; then + cp "${{ inputs.keystore-file }}" "$KEYSTORE_TARGET_PATH" + echo "Successfully copied keystore file to target path: $KEYSTORE_TARGET_PATH" + else + echo "${{ inputs.keystore-base64 }}" | base64 --decode > "$KEYSTORE_TARGET_PATH" + echo "Successfully copied keystore base64 to target path: $KEYSTORE_TARGET_PATH" + fi + shell: bash + working-directory: ${{ inputs.working-directory }} + + - name: Build Android + if: ${{ !env.ARTIFACT_URL }} + run: | + npx rock build:android \ + --variant "${{ inputs.variant }}" \ + ${{ inputs.rock-build-extra-params }} + shell: bash + working-directory: ${{ inputs.working-directory }} + + - name: Find Build Artifact + if: ${{ !env.ARTIFACT_URL }} + run: | + APK_PATH=$(find $ANDROID_SOURCE_DIR/$APP_NAME/build/outputs -name '*.apk' | head -1 ) + echo APK_PATH $APK_PATH + echo "ARTIFACT_PATH=$APK_PATH" >> $GITHUB_ENV + shell: bash + working-directory: ${{ inputs.working-directory }} + + - name: Download and Unpack APK + if: ${{ env.ARTIFACT_URL && inputs.re-sign == 'true' }} + run: | + DOWNLOAD_OUTPUT=$(npx rock remote-cache download --name ${{ env.ARTIFACT_NAME }} --json) || (echo "$DOWNLOAD_OUTPUT" && exit 1) + APK_PATH=$(echo "$DOWNLOAD_OUTPUT" | jq -r '.path') + echo "ARTIFACT_PATH=$APK_PATH" >> $GITHUB_ENV + shell: bash + working-directory: ${{ inputs.working-directory }} + + - name: Re-sign APK + if: ${{ env.ARTIFACT_URL && inputs.re-sign == 'true' }} + run: | + npx rock sign:android ${{ env.ARTIFACT_PATH }} \ + --build-jsbundle + shell: bash + working-directory: ${{ inputs.working-directory }} + + - name: Update Artifact Name for re-signed builds + if: ${{ env.ARTIFACT_URL && inputs.re-sign == 'true' }} + run: | + if [ "${{ github.event_name }}" = "pull_request" ]; then + IDENTIFIER="${{ github.event.pull_request.number }}" + else + IDENTIFIER=$(echo "$GITHUB_SHA" | cut -c1-7) + fi + ARTIFACT_TRAITS="${{ inputs.variant }},${IDENTIFIER}" + ARTIFACT_TRAITS_HYPHENATED=$(echo "$ARTIFACT_TRAITS" | tr ',' '-') + ARTIFACT_TRAITS_HYPHENATED_FINGERPRINT="${ARTIFACT_TRAITS_HYPHENATED}-${FINGERPRINT}" + echo "ARTIFACT_NAME=rock-android-${ARTIFACT_TRAITS_HYPHENATED_FINGERPRINT}" >> $GITHUB_ENV + echo "ARTIFACT_TRAITS=$ARTIFACT_TRAITS" >> $GITHUB_ENV + shell: bash + + - name: Find artifact URL again before uploading + run: | + OUTPUT=$(npx rock remote-cache list --name ${{ env.ARTIFACT_NAME }} --json) || (echo "$OUTPUT" && exit 1) + if [ -z "$OUTPUT" ]; then + echo "No artifact found" + else + echo "ARTIFACT_URL=$(echo "$OUTPUT" | jq -r '.url')" >> $GITHUB_ENV + echo "ARTIFACT_ID=$(echo "$OUTPUT" | jq -r '.id')" >> $GITHUB_ENV + fi + shell: bash + working-directory: ${{ inputs.working-directory }} + + - name: Upload Artifact to GitHub + id: upload-artifact + if: ${{ env.PROVIDER_NAME == 'GitHub' && (!env.ARTIFACT_URL || inputs.re-sign == 'true') }} + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + with: + name: ${{ env.ARTIFACT_NAME }} + path: ${{ env.ARTIFACT_PATH }} + if-no-files-found: error + + - name: Upload Artifact to Remote Cache for re-signed builds + if: ${{ env.PROVIDER_NAME != 'GitHub' && inputs.re-sign == 'true' }} + run: | + OUTPUT=$(npx rock remote-cache upload --name ${{ env.ARTIFACT_NAME }} --binary-path ${{ env.ARTIFACT_PATH }} --json --verbose) || (echo "$OUTPUT" && exit 1) + echo "ARTIFACT_URL=$(echo "$OUTPUT" | jq -r '.url')" >> $GITHUB_ENV + shell: bash + working-directory: ${{ inputs.working-directory }} + + - name: Upload Artifact to Remote Cache for regular builds + if: ${{ env.PROVIDER_NAME != 'GitHub' && inputs.re-sign != 'true' && !env.ARTIFACT_URL }} + run: | + OUTPUT=$(npx rock remote-cache upload --name ${{ env.ARTIFACT_NAME }} --json --verbose) || (echo "$OUTPUT" && exit 1) + echo "ARTIFACT_URL=$(echo "$OUTPUT" | jq -r '.url')" >> $GITHUB_ENV + shell: bash + working-directory: ${{ inputs.working-directory }} + + - name: Delete Old Re-Signed Artifacts + if: ${{ env.ARTIFACT_URL && inputs.re-sign == 'true' && github.event_name == 'pull_request' }} + run: | + npx rock remote-cache delete --name ${{ env.ARTIFACT_NAME }} --all-but-latest --json + shell: bash + working-directory: ${{ inputs.working-directory }} + + - name: Clean Up Keystore and gradle properties (signed builds only) + if: ${{ !env.ARTIFACT_URL && inputs.sign }} + run: | + rm $HOME/.gradle/gradle.properties + if [ -n "$APP_NAME" ]; then + rm "$ANDROID_SOURCE_DIR/$APP_NAME/${{ inputs.keystore-path }}" + else + rm "$ANDROID_SOURCE_DIR/${{ inputs.keystore-path }}" + fi + shell: bash + working-directory: ${{ inputs.working-directory }} diff --git a/.github/actions/rock-ios/action.yml b/.github/actions/rock-ios/action.yml new file mode 100644 index 00000000000..b6c94ddf844 --- /dev/null +++ b/.github/actions/rock-ios/action.yml @@ -0,0 +1,491 @@ +name: 'Rock Remote Build - iOS' +description: 'Local fork of callstackincubator/ios@v3 with working-directory fix' + +inputs: + github-token: + description: GitHub Token + required: true + working-directory: + description: 'Working directory for the build command' + required: false + default: '.' + destination: + description: 'Destination to build to: "simulator" or "device". Using "device" runs "rock build:ios --archive" and code signing settings (certificate file/base64, provisioning profile file/base64, certificate password, keychain password) are required.' + required: true + default: 'simulator' + scheme: + description: Xcode scheme + required: true + configuration: + description: Xcode configuration + required: true + re-sign: + description: Re-sign IPA with new JS bundle. No signing is done for APP bundle (destination == simulator). + required: false + ad-hoc: + description: 'Upload the IPA for ad-hoc distribution to easily install on provisioned devices' + required: false + default: false + certificate-file: + description: '[Device Builds] Path to P12 file containing Apple certificate (incl. private key)' + required: false + certificate-base64: + description: '[Device Builds] Base64 encoded P12 file containing Apple certificate (incl. private key)' + required: false + certificate-password: + description: '[Device Builds] Password for the P12 file containing the Apple certificate' + required: false + provisioning-profile-file: + description: '[Device Builds] Path to Apple provisioning profile (*.mobileprovision)' + required: false + provisioning-profile-base64: + description: '[Device Builds] Base64 encoded Apple provisioning profile (*.mobileprovision)' + required: false + provisioning-profile-name: + description: '[Device Builds] Name of the Apple provisioning profile (without .mobileprovision extension)' + required: false + keychain-password: + description: '[Device Builds] Password that will protect temporary keychain used for signing (can be a random string)' + required: false + provisioning-profiles: + description: '[Device Builds] JSON array of provisioning profiles' + required: false + rock-build-extra-params: + description: 'Extra parameters to pass to "rock build:ios"' + required: false + comment-bot: + description: 'Whether to send a comment under PR with the link to the generated build' + required: false + default: true + +outputs: + artifact-url: + description: 'URL of the relevant iOS build artifact (could be cached)' + value: ${{ steps.upload-artifact.outputs.artifact-url || env.ARTIFACT_URL }} + artifact-id: + description: 'ID of the relevant iOS build artifact (could be cached)' + value: ${{ steps.upload-artifact.outputs.artifact-id || env.ARTIFACT_ID }} + +runs: + using: 'composite' + steps: + - name: Validate inputs + run: | + if [ "${{ inputs.destination }}" != "simulator" ] && [ "${{ inputs.destination }}" != "device" ]; then + echo "Invalid input 'destination': '${{ inputs.destination }}'. Allowed values: 'simulator' or 'device'." + exit 1 + fi + + if [ "${{ inputs.destination }}" == "device" ]; then + if [ -n "${{ inputs.certificate-file }}" ] && [ -n "${{ inputs.certificate-base64 }}" ]; then + echo "Cannot specify both 'certificate-file' and 'certificate-base64'. Use one or the other." + exit 1 + fi + + if [ -z "${{ inputs.certificate-file }}" ] && [ -z "${{ inputs.certificate-base64 }}" ]; then + echo "Either 'certificate-file' or 'certificate-base64' is required for device builds." + exit 1 + fi + + if [ -n "${{ inputs.certificate-file }}" ]; then + if [ ! -f "${{ inputs.certificate-file }}" ]; then + echo "Certificate file not found: '${{ inputs.certificate-file }}'" + exit 1 + fi + fi + + PROVISIONING_PROFILES='${{ inputs.provisioning-profiles }}' + if [ -z "$PROVISIONING_PROFILES" ]; then + if [ -n "${{ inputs.provisioning-profile-file }}" ] && [ -n "${{ inputs.provisioning-profile-base64 }}" ]; then + echo "Cannot specify both 'provisioning-profile-file' and 'provisioning-profile-base64'. Use one or the other." + exit 1 + fi + + if [ -z "${{ inputs.provisioning-profile-file }}" ] && [ -z "${{ inputs.provisioning-profile-base64 }}" ]; then + echo "Either 'provisioning-profile-file' or 'provisioning-profile-base64' is required for device builds when not using 'provisioning-profiles'." + exit 1 + fi + + if [ -n "${{ inputs.provisioning-profile-file }}" ]; then + if [ ! -f "${{ inputs.provisioning-profile-file }}" ]; then + echo "Provisioning profile file not found: '${{ inputs.provisioning-profile-file }}'" + exit 1 + fi + fi + fi + + if [ -z "${{ inputs.provisioning-profile-name }}" ] && [ -z "$PROVISIONING_PROFILES" ]; then + echo "Either 'provisioning-profile-name' or 'provisioning-profiles' is required for device builds." + exit 1 + fi + + if [ -n "${{ inputs.provisioning-profile-name }}" ] && [ -n "$PROVISIONING_PROFILES" ]; then + echo "Cannot specify both 'provisioning-profile-name' and 'provisioning-profiles'. Use one or the other." + exit 1 + fi + + if [ -n "$PROVISIONING_PROFILES" ]; then + while IFS= read -r profile; do + name="$(echo "$profile" | jq -r '.name')" + file_path="$(echo "$profile" | jq -r '.file // empty')" + base64_content="$(echo "$profile" | jq -r '.base64 // empty')" + + if [ -z "$name" ]; then + echo "Provisioning profile missing 'name' field" + exit 1 + fi + + if [ -n "$file_path" ] && [ -n "$base64_content" ]; then + printf "Cannot specify both 'file' and 'base64' for profile: %s\n" "$name" + exit 1 + fi + + if [ -z "$file_path" ] && [ -z "$base64_content" ]; then + printf "Either 'file' or 'base64' is required for profile: %s\n" "$name" + exit 1 + fi + + if [ -n "$file_path" ] && [ ! -f "$file_path" ]; then + printf "Provisioning profile file not found: %s\n" "$file_path" + exit 1 + fi + done < <(echo "$PROVISIONING_PROFILES" | jq -c '.[]') + fi + fi + shell: bash + + - name: Native Fingerprint + id: fingerprint + run: | + FINGERPRINT_OUTPUT=$(npx rock fingerprint -p ios --raw) || (echo "$FINGERPRINT_OUTPUT" && exit 1) + echo "FINGERPRINT=$FINGERPRINT_OUTPUT" >> $GITHUB_ENV + shell: bash + working-directory: ${{ inputs.working-directory }} + + - name: Get Provider Name + run: | + PROVIDER_NAME=$(npx rock remote-cache get-provider-name) || (echo "$PROVIDER_NAME" && exit 1) + echo "PROVIDER_NAME=$PROVIDER_NAME" >> $GITHUB_ENV + shell: bash + working-directory: ${{ inputs.working-directory }} + + - name: Populate GitHub Token in Cache + if: ${{ env.PROVIDER_NAME == 'GitHub' }} + run: | + mkdir -p .rock/cache + echo "{\"githubToken\": \"${{ inputs.github-token }}\"}" > .rock/cache/project.json + shell: bash + working-directory: ${{ inputs.working-directory }} + + - name: Check if PR-related artifact exists + if: ${{ github.event_name == 'pull_request' && inputs.re-sign == 'true' }} + run: | + ARTIFACT_TRAITS="${{ inputs.destination }},${{ inputs.configuration }},${{ github.event.pull_request.number}}" + echo "ARTIFACT_TRAITS=$ARTIFACT_TRAITS" >> $GITHUB_ENV + + OUTPUT=$(npx rock remote-cache list -p ios --traits "${ARTIFACT_TRAITS}" --json) || (echo "$OUTPUT" && exit 1) + if [ "$OUTPUT" ]; then + echo "ARTIFACT_URL=$(echo "$OUTPUT" | jq -r '.url')" >> $GITHUB_ENV + echo "ARTIFACT_ID=$(echo "$OUTPUT" | jq -r '.id')" >> $GITHUB_ENV + echo "ARTIFACT_NAME=$(echo "$OUTPUT" | jq -r '.name')" >> $GITHUB_ENV + fi + shell: bash + working-directory: ${{ inputs.working-directory }} + + - name: Check if regular artifact exists + if: ${{ !env.ARTIFACT_NAME }} + run: | + ARTIFACT_TRAITS="${{ inputs.destination }},${{ inputs.configuration }}" + echo "ARTIFACT_TRAITS=$ARTIFACT_TRAITS" >> $GITHUB_ENV + + OUTPUT=$(npx rock remote-cache list -p ios --traits "${ARTIFACT_TRAITS}" --json) || (echo "$OUTPUT" && exit 1) + if [ "$OUTPUT" ]; then + echo "ARTIFACT_URL=$(echo "$OUTPUT" | jq -r '.url')" >> $GITHUB_ENV + echo "ARTIFACT_ID=$(echo "$OUTPUT" | jq -r '.id')" >> $GITHUB_ENV + echo "ARTIFACT_NAME=$(echo "$OUTPUT" | jq -r '.name')" >> $GITHUB_ENV + fi + shell: bash + working-directory: ${{ inputs.working-directory }} + + - name: Set Artifact Name (if not set) + if: ${{ !env.ARTIFACT_NAME }} + run: | + ARTIFACT_TRAITS_HYPHENATED=$(echo "$ARTIFACT_TRAITS" | tr ',' '-') + ARTIFACT_TRAITS_HYPHENATED_FINGERPRINT="${ARTIFACT_TRAITS_HYPHENATED}-${FINGERPRINT}" + echo "ARTIFACT_NAME=rock-ios-${ARTIFACT_TRAITS_HYPHENATED_FINGERPRINT}" >> $GITHUB_ENV + shell: bash + + - name: Set Provisioning Profile Path + run: | + echo "PROFILE_DIR=$HOME/Library/MobileDevice/Provisioning Profiles" >> $GITHUB_ENV + shell: bash + + - name: Setup Code Signing (device builds only) + if: ${{ inputs.re-sign == 'true' && inputs.destination == 'device' || (!env.ARTIFACT_URL && inputs.destination == 'device') }} + run: | + PROVISIONING_PROFILES='${{ inputs.provisioning-profiles }}' + + KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db + + KEYCHAIN_PASSWORD="${{ inputs.keychain-password }}" + if [ -z "$KEYCHAIN_PASSWORD" ]; then + KEYCHAIN_PASSWORD=$(openssl rand -base64 32) + fi + + security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH + security set-keychain-settings -lut 21600 $KEYCHAIN_PATH + security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH + + CERTIFICATE_PATH=$RUNNER_TEMP/certificate.p12 + + if [ -n "${{ inputs.certificate-file }}" ]; then + cp "${{ inputs.certificate-file }}" "$CERTIFICATE_PATH" + else + echo -n "${{ inputs.certificate-base64 }}" | base64 --decode -o "$CERTIFICATE_PATH" + fi + + if [ -n "${{ inputs.certificate-password }}" ]; then + SECURITY_IMPORT_ERROR=$(security import "$CERTIFICATE_PATH" -P "${{ inputs.certificate-password }}" -A -t cert -f pkcs12 -k "$KEYCHAIN_PATH" 2>&1) + if [ $? -ne 0 ]; then + echo "Certificate import failed with provided password." + echo "Error output from 'security import':" + echo "$SECURITY_IMPORT_ERROR" + exit 1 + fi + else + SECURITY_IMPORT_ERROR=$(security import "$CERTIFICATE_PATH" -A -t cert -f pkcs12 -k "$KEYCHAIN_PATH" 2>&1) + SECURITY_IMPORT_EXIT_CODE=$? + if [ $SECURITY_IMPORT_EXIT_CODE -ne 0 ]; then + echo "Certificate import failed. If this P12 file requires a password, please provide 'certificate-password' input." + echo "Error output from 'security import':" + echo "$SECURITY_IMPORT_ERROR" + exit 1 + fi + fi + + security set-key-partition-list -S apple-tool:,apple: -k "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH" >/dev/null + security list-keychain -d user -s "$KEYCHAIN_PATH" >/dev/null + + IDENTITY=$(security find-identity -v -p codesigning "$KEYCHAIN_PATH" | grep -oE '([0-9A-F]{40})' | head -n 1) + echo "Using signing identity (SHA-1): ${IDENTITY:0:8}…" + echo "IDENTITY=$IDENTITY" >> "$GITHUB_ENV" + + PROFILE_DIR="$HOME/Library/MobileDevice/Provisioning Profiles" + mkdir -p "$PROFILE_DIR" + + if [ -n "${{ inputs.provisioning-profile-name }}" ]; then + PROFILE_PATH="$PROFILE_DIR/${{ inputs.provisioning-profile-name }}.mobileprovision" + + if [ -n "${{ inputs.provisioning-profile-file }}" ]; then + cp "${{ inputs.provisioning-profile-file }}" "$PROFILE_PATH" + else + echo -n "${{ inputs.provisioning-profile-base64 }}" | base64 --decode -o "$PROFILE_PATH" + fi + fi + + if [ -n "$PROVISIONING_PROFILES" ]; then + while IFS= read -r profile; do + name="$(echo "$profile" | jq -r '.name')" + file_path="$(echo "$profile" | jq -r '.file // empty')" + base64_content="$(echo "$profile" | jq -r '.base64 // empty')" + + ADDITIONAL_PROFILE_PATH="$PROFILE_DIR/${name}.mobileprovision" + + if [ -n "$file_path" ]; then + cp "$file_path" "$ADDITIONAL_PROFILE_PATH" + else + echo -n "$base64_content" | base64 --decode -o "$ADDITIONAL_PROFILE_PATH" + fi + + printf "Installed provisioning profile: %s\n" "$name" + done < <(echo "$PROVISIONING_PROFILES" | jq -c '.[]') + fi + shell: bash + + - name: Determine iOS sourceDir + if: ${{ !env.ARTIFACT_URL }} + run: | + JSON_OUTPUT=$(npx rock config -p ios) || (echo "$JSON_OUTPUT" && exit 1) + echo "$JSON_OUTPUT" | jq -r '.project' + IOS_SOURCE_DIR=$(echo "$JSON_OUTPUT" | jq -r '.project.ios.sourceDir') + echo "IOS_SOURCE_DIR=$IOS_SOURCE_DIR" >> $GITHUB_ENV + shell: bash + working-directory: ${{ inputs.working-directory }} + + - name: Build iOS + if: ${{ !env.ARTIFACT_URL }} + run: | + npx rock build:ios \ + ${{ inputs.destination == 'device' && '--archive' || '' }} \ + --scheme "${{ inputs.scheme }}" \ + --configuration "${{ inputs.configuration }}" \ + --build-folder build \ + --destination ${{ inputs.destination }} \ + --verbose \ + ${{ inputs.rock-build-extra-params }} + shell: bash + working-directory: ${{ inputs.working-directory }} + + - name: Find Build Artifact + if: ${{ !env.ARTIFACT_URL }} + run: | + if [ "${{ inputs.destination }}" == "device" ]; then + IPA_PATH=$(find .rock/cache/ios/export -maxdepth 1 -name '*.ipa' -type f | head -1) + echo IPA_PATH $IPA_PATH + echo "ARTIFACT_PATH=$IPA_PATH" >> $GITHUB_ENV + else + APP_PATH=$(find $IOS_SOURCE_DIR/build -name '*.app' -type d | head -1 ) + APP_DIR=$(dirname "$APP_PATH") + APP_BASENAME=$(basename "$APP_PATH") + + ARTIFACT_PATH="$APP_DIR/app.tar.gz" + tar -C "$APP_DIR" -czvf "$ARTIFACT_PATH" "$APP_BASENAME" + + echo "ARTIFACT_PATH=$ARTIFACT_PATH" >> $GITHUB_ENV + fi + shell: bash + working-directory: ${{ inputs.working-directory }} + + - name: Download and Unpack IPA + if: ${{ env.ARTIFACT_URL && inputs.destination == 'device' && inputs.re-sign == 'true' }} + run: | + DOWNLOAD_OUTPUT=$(npx rock remote-cache download --name ${{ env.ARTIFACT_NAME }} --json) || (echo "$DOWNLOAD_OUTPUT" && exit 1) + IPA_PATH=$(echo "$DOWNLOAD_OUTPUT" | jq -r '.path') + echo "ARTIFACT_PATH=$IPA_PATH" >> $GITHUB_ENV + shell: bash + working-directory: ${{ inputs.working-directory }} + + - name: Download and Unpack APP + if: ${{ env.ARTIFACT_URL && inputs.destination == 'simulator' && inputs.re-sign == 'true' }} + run: | + DOWNLOAD_OUTPUT=$(npx rock remote-cache download --name ${{ env.ARTIFACT_NAME }} --json) || (echo "$DOWNLOAD_OUTPUT" && exit 1) + APP_PATH=$(echo "$DOWNLOAD_OUTPUT" | jq -r '.path') + APP_DIR=$(dirname "$APP_PATH") + APP_BASENAME=$(basename "$APP_PATH") + + tar -C "$APP_DIR" -xzf "$APP_PATH" + EXTRACTED_APP=$(find "$APP_DIR" -name "*.app" -type d | head -1) + + echo "ARTIFACT_PATH=$APP_PATH" >> $GITHUB_ENV + echo "ARTIFACT_TAR_PATH=$EXTRACTED_APP" >> $GITHUB_ENV + shell: bash + working-directory: ${{ inputs.working-directory }} + + - name: Re-sign IPA + if: ${{ env.ARTIFACT_URL && inputs.destination == 'device' && inputs.re-sign == 'true' }} + run: | + npx rock sign:ios "${{ env.ARTIFACT_PATH }}" \ + --build-jsbundle \ + --identity ${{ env.IDENTITY }} + shell: bash + working-directory: ${{ inputs.working-directory }} + + - name: Re-bundle APP + if: ${{ env.ARTIFACT_URL && inputs.destination == 'simulator' && inputs.re-sign == 'true' }} + run: | + npx rock sign:ios "${{ env.ARTIFACT_TAR_PATH }}" \ + --build-jsbundle \ + --app + shell: bash + working-directory: ${{ inputs.working-directory }} + + - name: Update Artifact Name for re-signed builds + if: ${{ env.ARTIFACT_URL && inputs.re-sign == 'true' }} + run: | + if [ "${{ github.event_name }}" = "pull_request" ]; then + IDENTIFIER="${{ github.event.pull_request.number }}" + else + IDENTIFIER=$(echo "$GITHUB_SHA" | cut -c1-7) + fi + ARTIFACT_TRAITS="${{ inputs.destination }},${{ inputs.configuration }},${IDENTIFIER}" + ARTIFACT_TRAITS_HYPHENATED=$(echo "$ARTIFACT_TRAITS" | tr ',' '-') + ARTIFACT_TRAITS_HYPHENATED_FINGERPRINT="${ARTIFACT_TRAITS_HYPHENATED}-${FINGERPRINT}" + echo "ARTIFACT_NAME=rock-ios-${ARTIFACT_TRAITS_HYPHENATED_FINGERPRINT}" >> $GITHUB_ENV + echo "ARTIFACT_TRAITS=$ARTIFACT_TRAITS" >> $GITHUB_ENV + shell: bash + + - name: Find artifact URL again before uploading + run: | + OUTPUT=$(npx rock remote-cache list --name ${{ env.ARTIFACT_NAME }} --json) || (echo "$OUTPUT" && exit 1) + if [ -z "$OUTPUT" ]; then + echo "No artifact found" + else + echo "ARTIFACT_URL=$(echo "$OUTPUT" | jq -r '.url')" >> $GITHUB_ENV + echo "ARTIFACT_ID=$(echo "$OUTPUT" | jq -r '.id')" >> $GITHUB_ENV + fi + shell: bash + working-directory: ${{ inputs.working-directory }} + + - name: Upload Artifact to GitHub + id: upload-artifact + if: ${{ env.PROVIDER_NAME == 'GitHub' && (!env.ARTIFACT_URL || inputs.re-sign == 'true') }} + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + with: + name: ${{ env.ARTIFACT_NAME }} + path: ${{ env.ARTIFACT_PATH }} + if-no-files-found: error + + - name: Upload Artifact to Remote Cache for re-signed builds + if: ${{ env.PROVIDER_NAME != 'GitHub' && inputs.re-sign == 'true' }} + run: | + OUTPUT=$(npx rock remote-cache upload --name ${{ env.ARTIFACT_NAME }} --binary-path ${{ env.ARTIFACT_PATH }} --json) || (echo "$OUTPUT" && exit 1) + echo "ARTIFACT_URL=$(echo "$OUTPUT" | jq -r '.url')" >> $GITHUB_ENV + shell: bash + working-directory: ${{ inputs.working-directory }} + + - name: Upload Artifact to Remote Cache for regular builds + if: ${{ env.PROVIDER_NAME != 'GitHub' && inputs.re-sign != 'true' && !env.ARTIFACT_URL }} + run: | + OUTPUT=$(npx rock remote-cache upload --name ${{ env.ARTIFACT_NAME }} --json) || (echo "$OUTPUT" && exit 1) + echo "ARTIFACT_URL=$(echo "$OUTPUT" | jq -r '.url')" >> $GITHUB_ENV + shell: bash + working-directory: ${{ inputs.working-directory }} + + - name: Upload for Ad-hoc distribution + if: ${{ env.PROVIDER_NAME != 'GitHub' && inputs.ad-hoc == 'true' }} + run: | + OUTPUT=$(npx rock remote-cache upload --name ${{ env.ARTIFACT_NAME }} --binary-path ${{ env.ARTIFACT_PATH }} --json --ad-hoc) || (echo "$OUTPUT" && exit 1) + echo "ARTIFACT_URL=$(echo "$OUTPUT" | jq -r '.url')" >> $GITHUB_ENV + shell: bash + working-directory: ${{ inputs.working-directory }} + + - name: Delete Old Re-Signed Artifacts + if: ${{ env.ARTIFACT_URL && inputs.re-sign == 'true' && github.event_name == 'pull_request' }} + run: | + npx rock remote-cache delete --name ${{ env.ARTIFACT_NAME }} --all-but-latest --json + shell: bash + working-directory: ${{ inputs.working-directory }} + + - name: Clean Up Code Signing (device builds only) + if: ${{ inputs.re-sign == 'true' && inputs.destination == 'device' || (!env.ARTIFACT_URL && inputs.destination == 'device') }} + run: | + PROVISIONING_PROFILES='${{ inputs.provisioning-profiles }}' + + KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db + security delete-keychain "$KEYCHAIN_PATH" + + CERTIFICATE_PATH=$RUNNER_TEMP/certificate.p12 + rm "$CERTIFICATE_PATH" + + if [ -n "${{ inputs.provisioning-profile-name }}" ]; then + PROFILE_DIR="$HOME/Library/MobileDevice/Provisioning Profiles" + PROFILE_PATH="$PROFILE_DIR/${{ inputs.provisioning-profile-name }}.mobileprovision" + rm "$PROFILE_PATH" + fi + + if [ -n "$PROVISIONING_PROFILES" ]; then + PROFILE_DIR="$HOME/Library/MobileDevice/Provisioning Profiles" + while IFS= read -r profile; do + name="$(echo "$profile" | jq -r '.name')" + PROFILE_PATH="$PROFILE_DIR/${name}.mobileprovision" + rm "$PROFILE_PATH" + printf "Cleaned up provisioning profile: %s\n" "$name" + done < <(echo "$PROVISIONING_PROFILES" | jq -c '.[]') + fi + shell: bash + + - name: Cleanup Cache + run: | + rm -rf .rock/cache/project.json + shell: bash + working-directory: ${{ inputs.working-directory }} diff --git a/.github/workflows/e2e-metro.yml b/.github/workflows/e2e-metro.yml index 8d72b4fee97..d60d77e02e2 100644 --- a/.github/workflows/e2e-metro.yml +++ b/.github/workflows/e2e-metro.yml @@ -63,6 +63,7 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 60 env: + NO_COLOR: 1 ANDROID_EMULATOR_API_LEVEL: 28 ANDROID_EMULATOR_TARGET: default ANDROID_EMULATOR_ARCH: x86_64 @@ -129,7 +130,7 @@ jobs: echo "{\"githubToken\": \"${{ secrets.GITHUB_TOKEN }}\"}" > "$ROCK_PATH/project.json" - name: Build Metro Android app (Rock action) - uses: callstackincubator/android@v3 + uses: ./.github/actions/rock-android with: github-token: ${{ secrets.GITHUB_TOKEN }} comment-bot: false @@ -167,6 +168,7 @@ jobs: runs-on: macos-latest timeout-minutes: 60 env: + NO_COLOR: 1 RUBY_VERSION: 2.7.6 MAESTRO_VERSION: 1.39.13 MAESTRO_DRIVER_STARTUP_TIMEOUT: 600000 @@ -229,7 +231,7 @@ jobs: echo "{\"githubToken\": \"${{ secrets.GITHUB_TOKEN }}\"}" > "$ROCK_PATH/project.json" - name: Build Metro iOS app (Rock action) - uses: callstackincubator/ios@v3 + uses: ./.github/actions/rock-ios with: github-token: ${{ secrets.GITHUB_TOKEN }} comment-bot: false diff --git a/apps/metro-example-host/rock.config.mjs b/apps/metro-example-host/rock.config.mjs index ffa746881e5..e02f21becd6 100644 --- a/apps/metro-example-host/rock.config.mjs +++ b/apps/metro-example-host/rock.config.mjs @@ -1,11 +1,9 @@ +// @ts-check import {pluginMetroModuleFederation} from '@module-federation/metro-plugin-rock'; import {platformAndroid} from '@rock-js/platform-android'; -import {providerGitHub} from '@rock-js/provider-github'; -// @ts-check import {platformIOS} from '@rock-js/platform-ios'; import {pluginMetro} from '@rock-js/plugin-metro'; - -const [owner, repository] = (process.env.GITHUB_REPOSITORY ?? '/').split('/'); +import {providerGitHub} from '@rock-js/provider-github'; /** @type {import('rock').Config} */ export default { @@ -14,6 +12,6 @@ export default { ios: platformIOS(), android: platformAndroid(), }, - remoteCacheProvider: providerGitHub({owner, repository}), + remoteCacheProvider: providerGitHub(), plugins: [pluginMetroModuleFederation()], }; diff --git a/apps/metro-example-mini/rock.config.mjs b/apps/metro-example-mini/rock.config.mjs index ffa746881e5..e02f21becd6 100644 --- a/apps/metro-example-mini/rock.config.mjs +++ b/apps/metro-example-mini/rock.config.mjs @@ -1,11 +1,9 @@ +// @ts-check import {pluginMetroModuleFederation} from '@module-federation/metro-plugin-rock'; import {platformAndroid} from '@rock-js/platform-android'; -import {providerGitHub} from '@rock-js/provider-github'; -// @ts-check import {platformIOS} from '@rock-js/platform-ios'; import {pluginMetro} from '@rock-js/plugin-metro'; - -const [owner, repository] = (process.env.GITHUB_REPOSITORY ?? '/').split('/'); +import {providerGitHub} from '@rock-js/provider-github'; /** @type {import('rock').Config} */ export default { @@ -14,6 +12,6 @@ export default { ios: platformIOS(), android: platformAndroid(), }, - remoteCacheProvider: providerGitHub({owner, repository}), + remoteCacheProvider: providerGitHub(), plugins: [pluginMetroModuleFederation()], }; diff --git a/apps/metro-example-nested-mini/rock.config.mjs b/apps/metro-example-nested-mini/rock.config.mjs index ffa746881e5..e02f21becd6 100644 --- a/apps/metro-example-nested-mini/rock.config.mjs +++ b/apps/metro-example-nested-mini/rock.config.mjs @@ -1,11 +1,9 @@ +// @ts-check import {pluginMetroModuleFederation} from '@module-federation/metro-plugin-rock'; import {platformAndroid} from '@rock-js/platform-android'; -import {providerGitHub} from '@rock-js/provider-github'; -// @ts-check import {platformIOS} from '@rock-js/platform-ios'; import {pluginMetro} from '@rock-js/plugin-metro'; - -const [owner, repository] = (process.env.GITHUB_REPOSITORY ?? '/').split('/'); +import {providerGitHub} from '@rock-js/provider-github'; /** @type {import('rock').Config} */ export default { @@ -14,6 +12,6 @@ export default { ios: platformIOS(), android: platformAndroid(), }, - remoteCacheProvider: providerGitHub({owner, repository}), + remoteCacheProvider: providerGitHub(), plugins: [pluginMetroModuleFederation()], }; From be653ec82197cc84a10f5fef10da4bfd34a8f61c Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Fri, 10 Apr 2026 20:34:39 +0200 Subject: [PATCH 08/15] ci: retrigger e2e From 77e0537e2e60db2a66d1d89d0f179bba29f6ceb2 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Mon, 13 Apr 2026 14:57:08 +0200 Subject: [PATCH 09/15] chore(metro): revert to upstream Rock actions with TODO for working-directory fix Remove local action forks and reference upstream PRs: - callstackincubator/android#25 - callstackincubator/ios#27 --- .github/actions/rock-android/action.yml | 328 ---------------- .github/actions/rock-ios/action.yml | 491 ------------------------ .github/workflows/e2e-metro.yml | 8 +- 3 files changed, 6 insertions(+), 821 deletions(-) delete mode 100644 .github/actions/rock-android/action.yml delete mode 100644 .github/actions/rock-ios/action.yml diff --git a/.github/actions/rock-android/action.yml b/.github/actions/rock-android/action.yml deleted file mode 100644 index aa8c5ae65a3..00000000000 --- a/.github/actions/rock-android/action.yml +++ /dev/null @@ -1,328 +0,0 @@ -name: 'Rock Remote Build - Android' -description: 'Local fork of callstackincubator/android@v3 with working-directory fix' - -inputs: - github-token: - description: 'GitHub Token' - required: true - working-directory: - description: 'Working directory for the build command' - required: false - default: '.' - validate-gradle-wrapper: - description: 'Whether to validate the Gradle wrapper' - required: false - default: true - setup-java: - description: 'Whether to run actions/setup-java action' - required: false - default: true - variant: - description: 'Build variant' - required: false - default: 'debug' - rock-build-extra-params: - description: 'Extra parameters to pass to "rock build:android"' - required: false - sign: - description: 'Whether to sign the build with release keystore' - required: false - re-sign: - description: Re-sign the app bundle with new JS bundle - required: false - keystore-base64: - description: 'Base64 version of the release keystore' - required: false - keystore-file: - description: 'Path to the keystore file' - required: false - keystore-store-file: - description: 'Keystore store file name' - required: false - keystore-store-password: - description: 'Keystore store password' - required: false - keystore-key-alias: - description: 'Keystore key alias' - required: false - keystore-key-password: - description: 'Keystore key password' - required: false - keystore-path: - description: 'Path within the Android source directory where the keystore should be placed' - required: false - default: 'release.keystore' - comment-bot: - description: 'Whether to send a comment under PR with the link to the generated build' - required: false - default: true - -outputs: - artifact-url: - description: 'URL of the relevant Android build artifact (could be cached)' - value: ${{ steps.upload-artifact.outputs.artifact-url || env.ARTIFACT_URL }} - artifact-id: - description: 'ID of the relevant Android build artifact (could be cached)' - value: ${{ steps.upload-artifact.outputs.artifact-id || env.ARTIFACT_ID }} - -runs: - using: 'composite' - steps: - - name: Validate Inputs - run: | - if [ "${{ inputs.sign }}" == "true" ]; then - if [ -z "${{ inputs.keystore-file }}" ] && [ -z "${{ inputs.keystore-base64 }}" ]; then - echo "Either 'keystore-file' or 'keystore-base64' is required for signed builds." - exit 1 - fi - if [ -n "${{ inputs.keystore-file }}" ] && [ ! -f "${{ inputs.keystore-file }}" ]; then - echo "Keystore file '${{ inputs.keystore-file }}' does not exist." - exit 1 - fi - if [ -z "${{ inputs.keystore-store-file }}" ]; then - echo " Input 'keystore-store-file' is required for signed builds." - exit 1 - fi - if [ -z "${{ inputs.keystore-store-password }}" ]; then - echo "Input 'keystore-store-password' is required for signed builds." - exit 1 - fi - if [ -z "${{ inputs.keystore-key-alias }}" ]; then - echo "Input 'keystore-key-alias' is required for signed builds." - exit 1 - fi - if [ -z "${{ inputs.keystore-key-password }}" ]; then - echo "Input 'keystore-key-password' is required for signed builds." - exit 1 - fi - fi - shell: bash - - - name: Native Fingerprint - id: fingerprint - run: | - FINGERPRINT_OUTPUT=$(npx rock fingerprint -p android --raw) || (echo "$FINGERPRINT_OUTPUT" && exit 1) - echo "FINGERPRINT=$FINGERPRINT_OUTPUT" >> $GITHUB_ENV - shell: bash - working-directory: ${{ inputs.working-directory }} - - - name: Get Provider Name - run: | - PROVIDER_NAME=$(npx rock remote-cache get-provider-name) || (echo "$PROVIDER_NAME" && exit 1) - echo "PROVIDER_NAME=$PROVIDER_NAME" >> $GITHUB_ENV - shell: bash - working-directory: ${{ inputs.working-directory }} - - - name: Populate GitHub Token in Cache - if: ${{ env.PROVIDER_NAME == 'GitHub' }} - run: | - mkdir -p .rock/cache - echo "{\"githubToken\": \"${{ inputs.github-token }}\"}" > .rock/cache/project.json - shell: bash - working-directory: ${{ inputs.working-directory }} - - - name: Check if PR-related artifact exists - if: ${{ github.event_name == 'pull_request' && inputs.re-sign == 'true' }} - run: | - ARTIFACT_TRAITS="${{ inputs.variant }},${{ github.event.pull_request.number}}" - echo "ARTIFACT_TRAITS=$ARTIFACT_TRAITS" >> $GITHUB_ENV - OUTPUT=$(npx rock remote-cache list -p android --traits "${ARTIFACT_TRAITS}" --json) || (echo "$OUTPUT" && exit 1) - if [ "$OUTPUT" ]; then - echo "ARTIFACT_URL=$(echo "$OUTPUT" | jq -r '.url')" >> $GITHUB_ENV - echo "ARTIFACT_ID=$(echo "$OUTPUT" | jq -r '.id')" >> $GITHUB_ENV - echo "ARTIFACT_NAME=$(echo "$OUTPUT" | jq -r '.name')" >> $GITHUB_ENV - fi - shell: bash - working-directory: ${{ inputs.working-directory }} - - - name: Check if regular artifact exists - if: ${{ !env.ARTIFACT_NAME }} - run: | - ARTIFACT_TRAITS="${{ inputs.variant }}" - echo "ARTIFACT_TRAITS=$ARTIFACT_TRAITS" >> $GITHUB_ENV - OUTPUT=$(npx rock remote-cache list -p android --traits "${ARTIFACT_TRAITS}" --json) || (echo "$OUTPUT" && exit 1) - if [ "$OUTPUT" ]; then - echo "ARTIFACT_URL=$(echo "$OUTPUT" | jq -r '.url')" >> $GITHUB_ENV - echo "ARTIFACT_ID=$(echo "$OUTPUT" | jq -r '.id')" >> $GITHUB_ENV - echo "ARTIFACT_NAME=$(echo "$OUTPUT" | jq -r '.name')" >> $GITHUB_ENV - fi - shell: bash - working-directory: ${{ inputs.working-directory }} - - - name: Set Artifact Name (if not set) - if: ${{ !env.ARTIFACT_NAME }} - run: | - ARTIFACT_TRAITS_HYPHENATED=$(echo "$ARTIFACT_TRAITS" | tr ',' '-') - ARTIFACT_TRAITS_HYPHENATED_FINGERPRINT="${ARTIFACT_TRAITS_HYPHENATED}-${FINGERPRINT}" - echo "ARTIFACT_NAME=rock-android-${ARTIFACT_TRAITS_HYPHENATED_FINGERPRINT}" >> $GITHUB_ENV - shell: bash - - - name: Install Java - if: ${{ inputs.setup-java == 'true' && !env.ARTIFACT_URL }} - uses: actions/setup-java@c5195efecf7bdfc987ee8bae7a71cb8b11521c00 # v4.7.1 - with: - java-version: 17 - distribution: adopt - cache: gradle - - - name: Validate Gradle wrapper - if: ${{ inputs.validate-gradle-wrapper == 'true' && !env.ARTIFACT_URL }} - uses: gradle/actions/wrapper-validation@ac638b010cf58a27ee6c972d7336334ccaf61c96 # v4.4.1 - - - name: Create local gradle.properties - if: ${{ !env.ARTIFACT_URL && inputs.sign }} - run: | - mkdir -p $HOME/.gradle - touch $HOME/.gradle/gradle.properties - echo "android.injected.signing.store.file=${{ inputs.keystore-store-file }}" >> $HOME/.gradle/gradle.properties - echo "android.injected.signing.store.password=${{ inputs.keystore-store-password }}" >> $HOME/.gradle/gradle.properties - echo "android.injected.signing.key.alias=${{ inputs.keystore-key-alias }}" >> $HOME/.gradle/gradle.properties - echo "android.injected.signing.key.password=${{ inputs.keystore-key-password }}" >> $HOME/.gradle/gradle.properties - echo "ROCK_UPLOAD_STORE_FILE=${{ inputs.keystore-store-file }}" >> $HOME/.gradle/gradle.properties - echo "ROCK_UPLOAD_STORE_PASSWORD=${{ inputs.keystore-store-password }}" >> $HOME/.gradle/gradle.properties - echo "ROCK_UPLOAD_KEY_ALIAS=${{ inputs.keystore-key-alias }}" >> $HOME/.gradle/gradle.properties - echo "ROCK_UPLOAD_KEY_PASSWORD=${{ inputs.keystore-key-password }}" >> $HOME/.gradle/gradle.properties - shell: bash - - - name: Determine Android sourceDir and appName - if: ${{ !env.ARTIFACT_URL }} - run: | - JSON_OUTPUT=$(npx rock config -p android) || (echo "$JSON_OUTPUT" && exit 1) - echo "$JSON_OUTPUT" | jq -r '.project' - ANDROID_SOURCE_DIR=$(echo "$JSON_OUTPUT" | jq -r '.project.android.sourceDir') - APP_NAME=$(echo "$JSON_OUTPUT" | jq -r '.project.android.appName') - echo "ANDROID_SOURCE_DIR=$ANDROID_SOURCE_DIR" >> $GITHUB_ENV - echo "APP_NAME=$APP_NAME" >> $GITHUB_ENV - shell: bash - working-directory: ${{ inputs.working-directory }} - - - name: Decode and store keystore file - if: ${{ !env.ARTIFACT_URL && inputs.sign }} - run: | - if [ -n "$APP_NAME" ]; then - KEYSTORE_TARGET_PATH="$ANDROID_SOURCE_DIR/$APP_NAME/${{ inputs.keystore-path }}" - else - KEYSTORE_TARGET_PATH="$ANDROID_SOURCE_DIR/${{ inputs.keystore-path }}" - fi - echo "Keystore target path before normalizing: $KEYSTORE_TARGET_PATH" - KEYSTORE_TARGET_PATH=$(realpath -m "$KEYSTORE_TARGET_PATH") - echo "Keystore target path after normalizing: $KEYSTORE_TARGET_PATH" - mkdir -p "$(dirname "$KEYSTORE_TARGET_PATH")" || { - echo "Failed to create keystore directory: $(dirname "$KEYSTORE_TARGET_PATH")" - exit 1 - } - if [ -n "${{ inputs.keystore-file }}" ]; then - cp "${{ inputs.keystore-file }}" "$KEYSTORE_TARGET_PATH" - echo "Successfully copied keystore file to target path: $KEYSTORE_TARGET_PATH" - else - echo "${{ inputs.keystore-base64 }}" | base64 --decode > "$KEYSTORE_TARGET_PATH" - echo "Successfully copied keystore base64 to target path: $KEYSTORE_TARGET_PATH" - fi - shell: bash - working-directory: ${{ inputs.working-directory }} - - - name: Build Android - if: ${{ !env.ARTIFACT_URL }} - run: | - npx rock build:android \ - --variant "${{ inputs.variant }}" \ - ${{ inputs.rock-build-extra-params }} - shell: bash - working-directory: ${{ inputs.working-directory }} - - - name: Find Build Artifact - if: ${{ !env.ARTIFACT_URL }} - run: | - APK_PATH=$(find $ANDROID_SOURCE_DIR/$APP_NAME/build/outputs -name '*.apk' | head -1 ) - echo APK_PATH $APK_PATH - echo "ARTIFACT_PATH=$APK_PATH" >> $GITHUB_ENV - shell: bash - working-directory: ${{ inputs.working-directory }} - - - name: Download and Unpack APK - if: ${{ env.ARTIFACT_URL && inputs.re-sign == 'true' }} - run: | - DOWNLOAD_OUTPUT=$(npx rock remote-cache download --name ${{ env.ARTIFACT_NAME }} --json) || (echo "$DOWNLOAD_OUTPUT" && exit 1) - APK_PATH=$(echo "$DOWNLOAD_OUTPUT" | jq -r '.path') - echo "ARTIFACT_PATH=$APK_PATH" >> $GITHUB_ENV - shell: bash - working-directory: ${{ inputs.working-directory }} - - - name: Re-sign APK - if: ${{ env.ARTIFACT_URL && inputs.re-sign == 'true' }} - run: | - npx rock sign:android ${{ env.ARTIFACT_PATH }} \ - --build-jsbundle - shell: bash - working-directory: ${{ inputs.working-directory }} - - - name: Update Artifact Name for re-signed builds - if: ${{ env.ARTIFACT_URL && inputs.re-sign == 'true' }} - run: | - if [ "${{ github.event_name }}" = "pull_request" ]; then - IDENTIFIER="${{ github.event.pull_request.number }}" - else - IDENTIFIER=$(echo "$GITHUB_SHA" | cut -c1-7) - fi - ARTIFACT_TRAITS="${{ inputs.variant }},${IDENTIFIER}" - ARTIFACT_TRAITS_HYPHENATED=$(echo "$ARTIFACT_TRAITS" | tr ',' '-') - ARTIFACT_TRAITS_HYPHENATED_FINGERPRINT="${ARTIFACT_TRAITS_HYPHENATED}-${FINGERPRINT}" - echo "ARTIFACT_NAME=rock-android-${ARTIFACT_TRAITS_HYPHENATED_FINGERPRINT}" >> $GITHUB_ENV - echo "ARTIFACT_TRAITS=$ARTIFACT_TRAITS" >> $GITHUB_ENV - shell: bash - - - name: Find artifact URL again before uploading - run: | - OUTPUT=$(npx rock remote-cache list --name ${{ env.ARTIFACT_NAME }} --json) || (echo "$OUTPUT" && exit 1) - if [ -z "$OUTPUT" ]; then - echo "No artifact found" - else - echo "ARTIFACT_URL=$(echo "$OUTPUT" | jq -r '.url')" >> $GITHUB_ENV - echo "ARTIFACT_ID=$(echo "$OUTPUT" | jq -r '.id')" >> $GITHUB_ENV - fi - shell: bash - working-directory: ${{ inputs.working-directory }} - - - name: Upload Artifact to GitHub - id: upload-artifact - if: ${{ env.PROVIDER_NAME == 'GitHub' && (!env.ARTIFACT_URL || inputs.re-sign == 'true') }} - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 - with: - name: ${{ env.ARTIFACT_NAME }} - path: ${{ env.ARTIFACT_PATH }} - if-no-files-found: error - - - name: Upload Artifact to Remote Cache for re-signed builds - if: ${{ env.PROVIDER_NAME != 'GitHub' && inputs.re-sign == 'true' }} - run: | - OUTPUT=$(npx rock remote-cache upload --name ${{ env.ARTIFACT_NAME }} --binary-path ${{ env.ARTIFACT_PATH }} --json --verbose) || (echo "$OUTPUT" && exit 1) - echo "ARTIFACT_URL=$(echo "$OUTPUT" | jq -r '.url')" >> $GITHUB_ENV - shell: bash - working-directory: ${{ inputs.working-directory }} - - - name: Upload Artifact to Remote Cache for regular builds - if: ${{ env.PROVIDER_NAME != 'GitHub' && inputs.re-sign != 'true' && !env.ARTIFACT_URL }} - run: | - OUTPUT=$(npx rock remote-cache upload --name ${{ env.ARTIFACT_NAME }} --json --verbose) || (echo "$OUTPUT" && exit 1) - echo "ARTIFACT_URL=$(echo "$OUTPUT" | jq -r '.url')" >> $GITHUB_ENV - shell: bash - working-directory: ${{ inputs.working-directory }} - - - name: Delete Old Re-Signed Artifacts - if: ${{ env.ARTIFACT_URL && inputs.re-sign == 'true' && github.event_name == 'pull_request' }} - run: | - npx rock remote-cache delete --name ${{ env.ARTIFACT_NAME }} --all-but-latest --json - shell: bash - working-directory: ${{ inputs.working-directory }} - - - name: Clean Up Keystore and gradle properties (signed builds only) - if: ${{ !env.ARTIFACT_URL && inputs.sign }} - run: | - rm $HOME/.gradle/gradle.properties - if [ -n "$APP_NAME" ]; then - rm "$ANDROID_SOURCE_DIR/$APP_NAME/${{ inputs.keystore-path }}" - else - rm "$ANDROID_SOURCE_DIR/${{ inputs.keystore-path }}" - fi - shell: bash - working-directory: ${{ inputs.working-directory }} diff --git a/.github/actions/rock-ios/action.yml b/.github/actions/rock-ios/action.yml deleted file mode 100644 index b6c94ddf844..00000000000 --- a/.github/actions/rock-ios/action.yml +++ /dev/null @@ -1,491 +0,0 @@ -name: 'Rock Remote Build - iOS' -description: 'Local fork of callstackincubator/ios@v3 with working-directory fix' - -inputs: - github-token: - description: GitHub Token - required: true - working-directory: - description: 'Working directory for the build command' - required: false - default: '.' - destination: - description: 'Destination to build to: "simulator" or "device". Using "device" runs "rock build:ios --archive" and code signing settings (certificate file/base64, provisioning profile file/base64, certificate password, keychain password) are required.' - required: true - default: 'simulator' - scheme: - description: Xcode scheme - required: true - configuration: - description: Xcode configuration - required: true - re-sign: - description: Re-sign IPA with new JS bundle. No signing is done for APP bundle (destination == simulator). - required: false - ad-hoc: - description: 'Upload the IPA for ad-hoc distribution to easily install on provisioned devices' - required: false - default: false - certificate-file: - description: '[Device Builds] Path to P12 file containing Apple certificate (incl. private key)' - required: false - certificate-base64: - description: '[Device Builds] Base64 encoded P12 file containing Apple certificate (incl. private key)' - required: false - certificate-password: - description: '[Device Builds] Password for the P12 file containing the Apple certificate' - required: false - provisioning-profile-file: - description: '[Device Builds] Path to Apple provisioning profile (*.mobileprovision)' - required: false - provisioning-profile-base64: - description: '[Device Builds] Base64 encoded Apple provisioning profile (*.mobileprovision)' - required: false - provisioning-profile-name: - description: '[Device Builds] Name of the Apple provisioning profile (without .mobileprovision extension)' - required: false - keychain-password: - description: '[Device Builds] Password that will protect temporary keychain used for signing (can be a random string)' - required: false - provisioning-profiles: - description: '[Device Builds] JSON array of provisioning profiles' - required: false - rock-build-extra-params: - description: 'Extra parameters to pass to "rock build:ios"' - required: false - comment-bot: - description: 'Whether to send a comment under PR with the link to the generated build' - required: false - default: true - -outputs: - artifact-url: - description: 'URL of the relevant iOS build artifact (could be cached)' - value: ${{ steps.upload-artifact.outputs.artifact-url || env.ARTIFACT_URL }} - artifact-id: - description: 'ID of the relevant iOS build artifact (could be cached)' - value: ${{ steps.upload-artifact.outputs.artifact-id || env.ARTIFACT_ID }} - -runs: - using: 'composite' - steps: - - name: Validate inputs - run: | - if [ "${{ inputs.destination }}" != "simulator" ] && [ "${{ inputs.destination }}" != "device" ]; then - echo "Invalid input 'destination': '${{ inputs.destination }}'. Allowed values: 'simulator' or 'device'." - exit 1 - fi - - if [ "${{ inputs.destination }}" == "device" ]; then - if [ -n "${{ inputs.certificate-file }}" ] && [ -n "${{ inputs.certificate-base64 }}" ]; then - echo "Cannot specify both 'certificate-file' and 'certificate-base64'. Use one or the other." - exit 1 - fi - - if [ -z "${{ inputs.certificate-file }}" ] && [ -z "${{ inputs.certificate-base64 }}" ]; then - echo "Either 'certificate-file' or 'certificate-base64' is required for device builds." - exit 1 - fi - - if [ -n "${{ inputs.certificate-file }}" ]; then - if [ ! -f "${{ inputs.certificate-file }}" ]; then - echo "Certificate file not found: '${{ inputs.certificate-file }}'" - exit 1 - fi - fi - - PROVISIONING_PROFILES='${{ inputs.provisioning-profiles }}' - if [ -z "$PROVISIONING_PROFILES" ]; then - if [ -n "${{ inputs.provisioning-profile-file }}" ] && [ -n "${{ inputs.provisioning-profile-base64 }}" ]; then - echo "Cannot specify both 'provisioning-profile-file' and 'provisioning-profile-base64'. Use one or the other." - exit 1 - fi - - if [ -z "${{ inputs.provisioning-profile-file }}" ] && [ -z "${{ inputs.provisioning-profile-base64 }}" ]; then - echo "Either 'provisioning-profile-file' or 'provisioning-profile-base64' is required for device builds when not using 'provisioning-profiles'." - exit 1 - fi - - if [ -n "${{ inputs.provisioning-profile-file }}" ]; then - if [ ! -f "${{ inputs.provisioning-profile-file }}" ]; then - echo "Provisioning profile file not found: '${{ inputs.provisioning-profile-file }}'" - exit 1 - fi - fi - fi - - if [ -z "${{ inputs.provisioning-profile-name }}" ] && [ -z "$PROVISIONING_PROFILES" ]; then - echo "Either 'provisioning-profile-name' or 'provisioning-profiles' is required for device builds." - exit 1 - fi - - if [ -n "${{ inputs.provisioning-profile-name }}" ] && [ -n "$PROVISIONING_PROFILES" ]; then - echo "Cannot specify both 'provisioning-profile-name' and 'provisioning-profiles'. Use one or the other." - exit 1 - fi - - if [ -n "$PROVISIONING_PROFILES" ]; then - while IFS= read -r profile; do - name="$(echo "$profile" | jq -r '.name')" - file_path="$(echo "$profile" | jq -r '.file // empty')" - base64_content="$(echo "$profile" | jq -r '.base64 // empty')" - - if [ -z "$name" ]; then - echo "Provisioning profile missing 'name' field" - exit 1 - fi - - if [ -n "$file_path" ] && [ -n "$base64_content" ]; then - printf "Cannot specify both 'file' and 'base64' for profile: %s\n" "$name" - exit 1 - fi - - if [ -z "$file_path" ] && [ -z "$base64_content" ]; then - printf "Either 'file' or 'base64' is required for profile: %s\n" "$name" - exit 1 - fi - - if [ -n "$file_path" ] && [ ! -f "$file_path" ]; then - printf "Provisioning profile file not found: %s\n" "$file_path" - exit 1 - fi - done < <(echo "$PROVISIONING_PROFILES" | jq -c '.[]') - fi - fi - shell: bash - - - name: Native Fingerprint - id: fingerprint - run: | - FINGERPRINT_OUTPUT=$(npx rock fingerprint -p ios --raw) || (echo "$FINGERPRINT_OUTPUT" && exit 1) - echo "FINGERPRINT=$FINGERPRINT_OUTPUT" >> $GITHUB_ENV - shell: bash - working-directory: ${{ inputs.working-directory }} - - - name: Get Provider Name - run: | - PROVIDER_NAME=$(npx rock remote-cache get-provider-name) || (echo "$PROVIDER_NAME" && exit 1) - echo "PROVIDER_NAME=$PROVIDER_NAME" >> $GITHUB_ENV - shell: bash - working-directory: ${{ inputs.working-directory }} - - - name: Populate GitHub Token in Cache - if: ${{ env.PROVIDER_NAME == 'GitHub' }} - run: | - mkdir -p .rock/cache - echo "{\"githubToken\": \"${{ inputs.github-token }}\"}" > .rock/cache/project.json - shell: bash - working-directory: ${{ inputs.working-directory }} - - - name: Check if PR-related artifact exists - if: ${{ github.event_name == 'pull_request' && inputs.re-sign == 'true' }} - run: | - ARTIFACT_TRAITS="${{ inputs.destination }},${{ inputs.configuration }},${{ github.event.pull_request.number}}" - echo "ARTIFACT_TRAITS=$ARTIFACT_TRAITS" >> $GITHUB_ENV - - OUTPUT=$(npx rock remote-cache list -p ios --traits "${ARTIFACT_TRAITS}" --json) || (echo "$OUTPUT" && exit 1) - if [ "$OUTPUT" ]; then - echo "ARTIFACT_URL=$(echo "$OUTPUT" | jq -r '.url')" >> $GITHUB_ENV - echo "ARTIFACT_ID=$(echo "$OUTPUT" | jq -r '.id')" >> $GITHUB_ENV - echo "ARTIFACT_NAME=$(echo "$OUTPUT" | jq -r '.name')" >> $GITHUB_ENV - fi - shell: bash - working-directory: ${{ inputs.working-directory }} - - - name: Check if regular artifact exists - if: ${{ !env.ARTIFACT_NAME }} - run: | - ARTIFACT_TRAITS="${{ inputs.destination }},${{ inputs.configuration }}" - echo "ARTIFACT_TRAITS=$ARTIFACT_TRAITS" >> $GITHUB_ENV - - OUTPUT=$(npx rock remote-cache list -p ios --traits "${ARTIFACT_TRAITS}" --json) || (echo "$OUTPUT" && exit 1) - if [ "$OUTPUT" ]; then - echo "ARTIFACT_URL=$(echo "$OUTPUT" | jq -r '.url')" >> $GITHUB_ENV - echo "ARTIFACT_ID=$(echo "$OUTPUT" | jq -r '.id')" >> $GITHUB_ENV - echo "ARTIFACT_NAME=$(echo "$OUTPUT" | jq -r '.name')" >> $GITHUB_ENV - fi - shell: bash - working-directory: ${{ inputs.working-directory }} - - - name: Set Artifact Name (if not set) - if: ${{ !env.ARTIFACT_NAME }} - run: | - ARTIFACT_TRAITS_HYPHENATED=$(echo "$ARTIFACT_TRAITS" | tr ',' '-') - ARTIFACT_TRAITS_HYPHENATED_FINGERPRINT="${ARTIFACT_TRAITS_HYPHENATED}-${FINGERPRINT}" - echo "ARTIFACT_NAME=rock-ios-${ARTIFACT_TRAITS_HYPHENATED_FINGERPRINT}" >> $GITHUB_ENV - shell: bash - - - name: Set Provisioning Profile Path - run: | - echo "PROFILE_DIR=$HOME/Library/MobileDevice/Provisioning Profiles" >> $GITHUB_ENV - shell: bash - - - name: Setup Code Signing (device builds only) - if: ${{ inputs.re-sign == 'true' && inputs.destination == 'device' || (!env.ARTIFACT_URL && inputs.destination == 'device') }} - run: | - PROVISIONING_PROFILES='${{ inputs.provisioning-profiles }}' - - KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db - - KEYCHAIN_PASSWORD="${{ inputs.keychain-password }}" - if [ -z "$KEYCHAIN_PASSWORD" ]; then - KEYCHAIN_PASSWORD=$(openssl rand -base64 32) - fi - - security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH - security set-keychain-settings -lut 21600 $KEYCHAIN_PATH - security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH - - CERTIFICATE_PATH=$RUNNER_TEMP/certificate.p12 - - if [ -n "${{ inputs.certificate-file }}" ]; then - cp "${{ inputs.certificate-file }}" "$CERTIFICATE_PATH" - else - echo -n "${{ inputs.certificate-base64 }}" | base64 --decode -o "$CERTIFICATE_PATH" - fi - - if [ -n "${{ inputs.certificate-password }}" ]; then - SECURITY_IMPORT_ERROR=$(security import "$CERTIFICATE_PATH" -P "${{ inputs.certificate-password }}" -A -t cert -f pkcs12 -k "$KEYCHAIN_PATH" 2>&1) - if [ $? -ne 0 ]; then - echo "Certificate import failed with provided password." - echo "Error output from 'security import':" - echo "$SECURITY_IMPORT_ERROR" - exit 1 - fi - else - SECURITY_IMPORT_ERROR=$(security import "$CERTIFICATE_PATH" -A -t cert -f pkcs12 -k "$KEYCHAIN_PATH" 2>&1) - SECURITY_IMPORT_EXIT_CODE=$? - if [ $SECURITY_IMPORT_EXIT_CODE -ne 0 ]; then - echo "Certificate import failed. If this P12 file requires a password, please provide 'certificate-password' input." - echo "Error output from 'security import':" - echo "$SECURITY_IMPORT_ERROR" - exit 1 - fi - fi - - security set-key-partition-list -S apple-tool:,apple: -k "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH" >/dev/null - security list-keychain -d user -s "$KEYCHAIN_PATH" >/dev/null - - IDENTITY=$(security find-identity -v -p codesigning "$KEYCHAIN_PATH" | grep -oE '([0-9A-F]{40})' | head -n 1) - echo "Using signing identity (SHA-1): ${IDENTITY:0:8}…" - echo "IDENTITY=$IDENTITY" >> "$GITHUB_ENV" - - PROFILE_DIR="$HOME/Library/MobileDevice/Provisioning Profiles" - mkdir -p "$PROFILE_DIR" - - if [ -n "${{ inputs.provisioning-profile-name }}" ]; then - PROFILE_PATH="$PROFILE_DIR/${{ inputs.provisioning-profile-name }}.mobileprovision" - - if [ -n "${{ inputs.provisioning-profile-file }}" ]; then - cp "${{ inputs.provisioning-profile-file }}" "$PROFILE_PATH" - else - echo -n "${{ inputs.provisioning-profile-base64 }}" | base64 --decode -o "$PROFILE_PATH" - fi - fi - - if [ -n "$PROVISIONING_PROFILES" ]; then - while IFS= read -r profile; do - name="$(echo "$profile" | jq -r '.name')" - file_path="$(echo "$profile" | jq -r '.file // empty')" - base64_content="$(echo "$profile" | jq -r '.base64 // empty')" - - ADDITIONAL_PROFILE_PATH="$PROFILE_DIR/${name}.mobileprovision" - - if [ -n "$file_path" ]; then - cp "$file_path" "$ADDITIONAL_PROFILE_PATH" - else - echo -n "$base64_content" | base64 --decode -o "$ADDITIONAL_PROFILE_PATH" - fi - - printf "Installed provisioning profile: %s\n" "$name" - done < <(echo "$PROVISIONING_PROFILES" | jq -c '.[]') - fi - shell: bash - - - name: Determine iOS sourceDir - if: ${{ !env.ARTIFACT_URL }} - run: | - JSON_OUTPUT=$(npx rock config -p ios) || (echo "$JSON_OUTPUT" && exit 1) - echo "$JSON_OUTPUT" | jq -r '.project' - IOS_SOURCE_DIR=$(echo "$JSON_OUTPUT" | jq -r '.project.ios.sourceDir') - echo "IOS_SOURCE_DIR=$IOS_SOURCE_DIR" >> $GITHUB_ENV - shell: bash - working-directory: ${{ inputs.working-directory }} - - - name: Build iOS - if: ${{ !env.ARTIFACT_URL }} - run: | - npx rock build:ios \ - ${{ inputs.destination == 'device' && '--archive' || '' }} \ - --scheme "${{ inputs.scheme }}" \ - --configuration "${{ inputs.configuration }}" \ - --build-folder build \ - --destination ${{ inputs.destination }} \ - --verbose \ - ${{ inputs.rock-build-extra-params }} - shell: bash - working-directory: ${{ inputs.working-directory }} - - - name: Find Build Artifact - if: ${{ !env.ARTIFACT_URL }} - run: | - if [ "${{ inputs.destination }}" == "device" ]; then - IPA_PATH=$(find .rock/cache/ios/export -maxdepth 1 -name '*.ipa' -type f | head -1) - echo IPA_PATH $IPA_PATH - echo "ARTIFACT_PATH=$IPA_PATH" >> $GITHUB_ENV - else - APP_PATH=$(find $IOS_SOURCE_DIR/build -name '*.app' -type d | head -1 ) - APP_DIR=$(dirname "$APP_PATH") - APP_BASENAME=$(basename "$APP_PATH") - - ARTIFACT_PATH="$APP_DIR/app.tar.gz" - tar -C "$APP_DIR" -czvf "$ARTIFACT_PATH" "$APP_BASENAME" - - echo "ARTIFACT_PATH=$ARTIFACT_PATH" >> $GITHUB_ENV - fi - shell: bash - working-directory: ${{ inputs.working-directory }} - - - name: Download and Unpack IPA - if: ${{ env.ARTIFACT_URL && inputs.destination == 'device' && inputs.re-sign == 'true' }} - run: | - DOWNLOAD_OUTPUT=$(npx rock remote-cache download --name ${{ env.ARTIFACT_NAME }} --json) || (echo "$DOWNLOAD_OUTPUT" && exit 1) - IPA_PATH=$(echo "$DOWNLOAD_OUTPUT" | jq -r '.path') - echo "ARTIFACT_PATH=$IPA_PATH" >> $GITHUB_ENV - shell: bash - working-directory: ${{ inputs.working-directory }} - - - name: Download and Unpack APP - if: ${{ env.ARTIFACT_URL && inputs.destination == 'simulator' && inputs.re-sign == 'true' }} - run: | - DOWNLOAD_OUTPUT=$(npx rock remote-cache download --name ${{ env.ARTIFACT_NAME }} --json) || (echo "$DOWNLOAD_OUTPUT" && exit 1) - APP_PATH=$(echo "$DOWNLOAD_OUTPUT" | jq -r '.path') - APP_DIR=$(dirname "$APP_PATH") - APP_BASENAME=$(basename "$APP_PATH") - - tar -C "$APP_DIR" -xzf "$APP_PATH" - EXTRACTED_APP=$(find "$APP_DIR" -name "*.app" -type d | head -1) - - echo "ARTIFACT_PATH=$APP_PATH" >> $GITHUB_ENV - echo "ARTIFACT_TAR_PATH=$EXTRACTED_APP" >> $GITHUB_ENV - shell: bash - working-directory: ${{ inputs.working-directory }} - - - name: Re-sign IPA - if: ${{ env.ARTIFACT_URL && inputs.destination == 'device' && inputs.re-sign == 'true' }} - run: | - npx rock sign:ios "${{ env.ARTIFACT_PATH }}" \ - --build-jsbundle \ - --identity ${{ env.IDENTITY }} - shell: bash - working-directory: ${{ inputs.working-directory }} - - - name: Re-bundle APP - if: ${{ env.ARTIFACT_URL && inputs.destination == 'simulator' && inputs.re-sign == 'true' }} - run: | - npx rock sign:ios "${{ env.ARTIFACT_TAR_PATH }}" \ - --build-jsbundle \ - --app - shell: bash - working-directory: ${{ inputs.working-directory }} - - - name: Update Artifact Name for re-signed builds - if: ${{ env.ARTIFACT_URL && inputs.re-sign == 'true' }} - run: | - if [ "${{ github.event_name }}" = "pull_request" ]; then - IDENTIFIER="${{ github.event.pull_request.number }}" - else - IDENTIFIER=$(echo "$GITHUB_SHA" | cut -c1-7) - fi - ARTIFACT_TRAITS="${{ inputs.destination }},${{ inputs.configuration }},${IDENTIFIER}" - ARTIFACT_TRAITS_HYPHENATED=$(echo "$ARTIFACT_TRAITS" | tr ',' '-') - ARTIFACT_TRAITS_HYPHENATED_FINGERPRINT="${ARTIFACT_TRAITS_HYPHENATED}-${FINGERPRINT}" - echo "ARTIFACT_NAME=rock-ios-${ARTIFACT_TRAITS_HYPHENATED_FINGERPRINT}" >> $GITHUB_ENV - echo "ARTIFACT_TRAITS=$ARTIFACT_TRAITS" >> $GITHUB_ENV - shell: bash - - - name: Find artifact URL again before uploading - run: | - OUTPUT=$(npx rock remote-cache list --name ${{ env.ARTIFACT_NAME }} --json) || (echo "$OUTPUT" && exit 1) - if [ -z "$OUTPUT" ]; then - echo "No artifact found" - else - echo "ARTIFACT_URL=$(echo "$OUTPUT" | jq -r '.url')" >> $GITHUB_ENV - echo "ARTIFACT_ID=$(echo "$OUTPUT" | jq -r '.id')" >> $GITHUB_ENV - fi - shell: bash - working-directory: ${{ inputs.working-directory }} - - - name: Upload Artifact to GitHub - id: upload-artifact - if: ${{ env.PROVIDER_NAME == 'GitHub' && (!env.ARTIFACT_URL || inputs.re-sign == 'true') }} - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 - with: - name: ${{ env.ARTIFACT_NAME }} - path: ${{ env.ARTIFACT_PATH }} - if-no-files-found: error - - - name: Upload Artifact to Remote Cache for re-signed builds - if: ${{ env.PROVIDER_NAME != 'GitHub' && inputs.re-sign == 'true' }} - run: | - OUTPUT=$(npx rock remote-cache upload --name ${{ env.ARTIFACT_NAME }} --binary-path ${{ env.ARTIFACT_PATH }} --json) || (echo "$OUTPUT" && exit 1) - echo "ARTIFACT_URL=$(echo "$OUTPUT" | jq -r '.url')" >> $GITHUB_ENV - shell: bash - working-directory: ${{ inputs.working-directory }} - - - name: Upload Artifact to Remote Cache for regular builds - if: ${{ env.PROVIDER_NAME != 'GitHub' && inputs.re-sign != 'true' && !env.ARTIFACT_URL }} - run: | - OUTPUT=$(npx rock remote-cache upload --name ${{ env.ARTIFACT_NAME }} --json) || (echo "$OUTPUT" && exit 1) - echo "ARTIFACT_URL=$(echo "$OUTPUT" | jq -r '.url')" >> $GITHUB_ENV - shell: bash - working-directory: ${{ inputs.working-directory }} - - - name: Upload for Ad-hoc distribution - if: ${{ env.PROVIDER_NAME != 'GitHub' && inputs.ad-hoc == 'true' }} - run: | - OUTPUT=$(npx rock remote-cache upload --name ${{ env.ARTIFACT_NAME }} --binary-path ${{ env.ARTIFACT_PATH }} --json --ad-hoc) || (echo "$OUTPUT" && exit 1) - echo "ARTIFACT_URL=$(echo "$OUTPUT" | jq -r '.url')" >> $GITHUB_ENV - shell: bash - working-directory: ${{ inputs.working-directory }} - - - name: Delete Old Re-Signed Artifacts - if: ${{ env.ARTIFACT_URL && inputs.re-sign == 'true' && github.event_name == 'pull_request' }} - run: | - npx rock remote-cache delete --name ${{ env.ARTIFACT_NAME }} --all-but-latest --json - shell: bash - working-directory: ${{ inputs.working-directory }} - - - name: Clean Up Code Signing (device builds only) - if: ${{ inputs.re-sign == 'true' && inputs.destination == 'device' || (!env.ARTIFACT_URL && inputs.destination == 'device') }} - run: | - PROVISIONING_PROFILES='${{ inputs.provisioning-profiles }}' - - KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db - security delete-keychain "$KEYCHAIN_PATH" - - CERTIFICATE_PATH=$RUNNER_TEMP/certificate.p12 - rm "$CERTIFICATE_PATH" - - if [ -n "${{ inputs.provisioning-profile-name }}" ]; then - PROFILE_DIR="$HOME/Library/MobileDevice/Provisioning Profiles" - PROFILE_PATH="$PROFILE_DIR/${{ inputs.provisioning-profile-name }}.mobileprovision" - rm "$PROFILE_PATH" - fi - - if [ -n "$PROVISIONING_PROFILES" ]; then - PROFILE_DIR="$HOME/Library/MobileDevice/Provisioning Profiles" - while IFS= read -r profile; do - name="$(echo "$profile" | jq -r '.name')" - PROFILE_PATH="$PROFILE_DIR/${name}.mobileprovision" - rm "$PROFILE_PATH" - printf "Cleaned up provisioning profile: %s\n" "$name" - done < <(echo "$PROVISIONING_PROFILES" | jq -c '.[]') - fi - shell: bash - - - name: Cleanup Cache - run: | - rm -rf .rock/cache/project.json - shell: bash - working-directory: ${{ inputs.working-directory }} diff --git a/.github/workflows/e2e-metro.yml b/.github/workflows/e2e-metro.yml index d60d77e02e2..54113e45798 100644 --- a/.github/workflows/e2e-metro.yml +++ b/.github/workflows/e2e-metro.yml @@ -129,8 +129,10 @@ jobs: mkdir -p "$ROCK_PATH" echo "{\"githubToken\": \"${{ secrets.GITHUB_TOKEN }}\"}" > "$ROCK_PATH/project.json" + # TODO: working-directory not propagated to all steps in upstream action + # https://github.com/callstackincubator/android/pull/25 - name: Build Metro Android app (Rock action) - uses: ./.github/actions/rock-android + uses: callstackincubator/android@v3 with: github-token: ${{ secrets.GITHUB_TOKEN }} comment-bot: false @@ -230,8 +232,10 @@ jobs: mkdir -p "$ROCK_PATH" echo "{\"githubToken\": \"${{ secrets.GITHUB_TOKEN }}\"}" > "$ROCK_PATH/project.json" + # TODO: working-directory not propagated to all steps in upstream action + # https://github.com/callstackincubator/ios/pull/27 - name: Build Metro iOS app (Rock action) - uses: ./.github/actions/rock-ios + uses: callstackincubator/ios@v3 with: github-token: ${{ secrets.GITHUB_TOKEN }} comment-bot: false From 0351c8fc89787f4322a6ec409b65cf3c3d976bc9 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Mon, 13 Apr 2026 15:36:51 +0200 Subject: [PATCH 10/15] fix(metro): pin Rock actions to commits with working-directory fix Pin callstackincubator/android to 599c4a7 (PR #25) and callstackincubator/ios to a5f0126 (PR #27) which propagate working-directory to all composite steps. --- .github/workflows/e2e-metro.yml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/workflows/e2e-metro.yml b/.github/workflows/e2e-metro.yml index 54113e45798..b1d3f2fb416 100644 --- a/.github/workflows/e2e-metro.yml +++ b/.github/workflows/e2e-metro.yml @@ -129,10 +129,8 @@ jobs: mkdir -p "$ROCK_PATH" echo "{\"githubToken\": \"${{ secrets.GITHUB_TOKEN }}\"}" > "$ROCK_PATH/project.json" - # TODO: working-directory not propagated to all steps in upstream action - # https://github.com/callstackincubator/android/pull/25 - name: Build Metro Android app (Rock action) - uses: callstackincubator/android@v3 + uses: callstackincubator/android@599c4a7 # v3 + working-directory fix (callstackincubator/android#25) with: github-token: ${{ secrets.GITHUB_TOKEN }} comment-bot: false @@ -232,10 +230,8 @@ jobs: mkdir -p "$ROCK_PATH" echo "{\"githubToken\": \"${{ secrets.GITHUB_TOKEN }}\"}" > "$ROCK_PATH/project.json" - # TODO: working-directory not propagated to all steps in upstream action - # https://github.com/callstackincubator/ios/pull/27 - name: Build Metro iOS app (Rock action) - uses: callstackincubator/ios@v3 + uses: callstackincubator/ios@a5f0126 # v3 + working-directory fix (callstackincubator/ios#27) with: github-token: ${{ secrets.GITHUB_TOKEN }} comment-bot: false From 3123aef1f657b773365d8197abbb6510a11f7f91 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Mon, 13 Apr 2026 15:53:20 +0200 Subject: [PATCH 11/15] chore(metro): pin Rock actions to v3 commits --- .github/workflows/e2e-metro.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/e2e-metro.yml b/.github/workflows/e2e-metro.yml index b1d3f2fb416..9a6f05b1789 100644 --- a/.github/workflows/e2e-metro.yml +++ b/.github/workflows/e2e-metro.yml @@ -130,7 +130,7 @@ jobs: echo "{\"githubToken\": \"${{ secrets.GITHUB_TOKEN }}\"}" > "$ROCK_PATH/project.json" - name: Build Metro Android app (Rock action) - uses: callstackincubator/android@599c4a7 # v3 + working-directory fix (callstackincubator/android#25) + uses: callstackincubator/android@599c4a7 # v3 with: github-token: ${{ secrets.GITHUB_TOKEN }} comment-bot: false @@ -231,7 +231,7 @@ jobs: echo "{\"githubToken\": \"${{ secrets.GITHUB_TOKEN }}\"}" > "$ROCK_PATH/project.json" - name: Build Metro iOS app (Rock action) - uses: callstackincubator/ios@a5f0126 # v3 + working-directory fix (callstackincubator/ios#27) + uses: callstackincubator/ios@a5f0126 # v3 with: github-token: ${{ secrets.GITHUB_TOKEN }} comment-bot: false From f309828f7b9b7c7f40694e5ada5d83135a948bf8 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Mon, 13 Apr 2026 16:19:43 +0200 Subject: [PATCH 12/15] fix(metro): use full SHA for pinned Rock actions --- .github/workflows/e2e-metro.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/e2e-metro.yml b/.github/workflows/e2e-metro.yml index 9a6f05b1789..71bdf64570c 100644 --- a/.github/workflows/e2e-metro.yml +++ b/.github/workflows/e2e-metro.yml @@ -130,7 +130,7 @@ jobs: echo "{\"githubToken\": \"${{ secrets.GITHUB_TOKEN }}\"}" > "$ROCK_PATH/project.json" - name: Build Metro Android app (Rock action) - uses: callstackincubator/android@599c4a7 # v3 + uses: callstackincubator/android@599c4a7f0f78cbb1b3fdcd3aea220ee9fbb7e973 # v3 with: github-token: ${{ secrets.GITHUB_TOKEN }} comment-bot: false @@ -231,7 +231,7 @@ jobs: echo "{\"githubToken\": \"${{ secrets.GITHUB_TOKEN }}\"}" > "$ROCK_PATH/project.json" - name: Build Metro iOS app (Rock action) - uses: callstackincubator/ios@a5f0126 # v3 + uses: callstackincubator/ios@a5f0126bfe03817e2951b29111d75fbd352de0a7 # v3 with: github-token: ${{ secrets.GITHUB_TOKEN }} comment-bot: false From 1d5c81b4a3965c3b7a56285e8164945905276a0a Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Mon, 13 Apr 2026 19:01:43 +0200 Subject: [PATCH 13/15] ci: retrigger e2e From c5cfb762b5914e64559e5742f77ab2ca58e916db Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Mon, 13 Apr 2026 19:47:29 +0200 Subject: [PATCH 14/15] fix(metro): setup Java without Gradle cache to prevent Android e2e hang --- .github/workflows/e2e-metro.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/e2e-metro.yml b/.github/workflows/e2e-metro.yml index 71bdf64570c..0cf322feb30 100644 --- a/.github/workflows/e2e-metro.yml +++ b/.github/workflows/e2e-metro.yml @@ -122,6 +122,12 @@ jobs: echo "${HOME}/.maestro/bin" >> "$GITHUB_PATH" shell: bash + - name: Set up Java 17 + uses: actions/setup-java@v4 + with: + java-version: 17 + distribution: adopt + - name: Configure Rock cache auth shell: bash run: | @@ -135,6 +141,7 @@ jobs: github-token: ${{ secrets.GITHUB_TOKEN }} comment-bot: false variant: 'Release' + setup-java: false working-directory: './apps/metro-${{ env.METRO_APP_NAME }}' - name: Run Metro Android E2E tests From 150ea0e4468f8672c2edb686d9cc0b24d2bcac4c Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Mon, 13 Apr 2026 21:26:19 +0200 Subject: [PATCH 15/15] ci: retrigger e2e