diff --git a/.changeset/fluffy-windows-relax.md b/.changeset/fluffy-windows-relax.md new file mode 100644 index 000000000..a4cbc7f0a --- /dev/null +++ b/.changeset/fluffy-windows-relax.md @@ -0,0 +1,6 @@ +--- +'rock': patch +'rock-docs': patch +--- + +website: update wording to emphasize Rock's strengths diff --git a/README.md b/README.md index 83b3a55d1..021fd6246 100644 --- a/README.md +++ b/README.md @@ -4,54 +4,46 @@

- 🪨 Rock is a cross-platform React Native app development and build toolchain built for modularity, build reuse, and incremental adoption. It integrates seamlessly with your existing infrastructure, giving you complete control without vendor lock-in. + 🪨 Rock is a modular toolkit for teams building React Native apps. It helps improve build times and developer experience while fitting into your existing workflows and infrastructure.

--- -## React Native at scale is challenging +## Key Features -Enterprise apps aren't built overnight. As maintainers of the Community CLI and partners to enterprise teams, we've seen the real challenges: high build times, difficulty adopting new third-party cloud services, and high barriers to introducing React Native into existing iOS and Android apps. +**☁️ Remote Build Cache** +Save up to 96% of build time by reusing native artifacts (APK, AAB, APP, IPA) across machines and CI. Use built‑in integrations for GitHub, S3, and R2 or bring your own storage. -Rock simplifies native build setup and reuse. In most React Native codebases, only about 10% of code changes affect the native iOS/Android files. Yet most teams rebuild their native apps constantly—on every commit, PR, or merge to main—when it's completely unnecessary. +**🔗 Brownfield ready** +Add React Native to existing iOS and Android apps using Rock Brownfield. -Rock leverages this insight by providing intelligent caching in your cloud infrastructure, seamlessly integrated through its CLI. This allows you to skip up to 90% of unnecessary native builds. +**🔌 Modular & Extensible** +A plugin‑driven architecture that lets you customize platforms, bundlers, cache providers, and more. -## Features +**🖥️ Cross‑platform‑ready** +iOS and Android by default; designed to extend to TVs, macOS, and Windows (coming soon). -**🖥️ Brand New CLI** -A familiar CLI experience with end-to-end development and build workflows. Migrate in seconds with `npm create rock`. - -**☁️ Reusable Cloud Builds** -Reliable caching of native artifacts (APK, IPA) that you can store wherever you prefer, or use our out-of-the-box integrations with GitHub, S3, and R2. - -**🔧 GitHub Actions** -Complete logic for downloading, uploading, and building native artifacts for iOS (APP, IPA) and Android (APK, AAB). - -**🔗 Plug-and-Play Brownfield** -Package your React Native app as a framework and integrate it into your iOS and Android apps just like any other library. - -**📦 Bundler Flexibility** -Rock supports both Metro and Re.Pack for JavaScript bundling. With Re.Pack, you can build Super Apps and Mobile Microfrontends. - -**🔌 Extensible Plugin System** -Built with modularity in mind, Rock allows you to extend its capabilities through plugins that integrate with both the CLI and native templates. +**⚡ Easy Community CLI Migration** +A familiar CLI that helps you develop, run, and build your app. Migrate from Community CLI in minutes. ## Installation -Rock is designed for incremental adoption. Whether you're just starting with React Native in your iOS or Android app, or want to migrate from the React Native Community CLI, you can do it step-by-step without having to figure everything out at once. +Choose your path based on your current situation: -### Migrating an existing Community CLI project +### Creating a new project -To migrate an existing project, open a terminal in your project root and run: +> **Consider Expo First** +> For **new projects**, we recommend starting with [Expo](https://expo.dev) for the best developer experience and similar remote caching capabilities. Rock is designed for teams who have outgrown the Community CLI. + +To create a fresh React Native app with Rock, open a terminal and run: ```shell npm create rock ``` -### Creating a new project +### Migrating an existing Community CLI project -To create a fresh React Native app with Rock, open a terminal and run: +To migrate an existing project, open a terminal in your project root and run: ```shell npm create rock diff --git a/packages/cli/README.md b/packages/cli/README.md index da049364e..0d5693d11 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -1,57 +1,49 @@ - Rock + Rock

- 🪨 Rock is a cross-platform React Native app development and build toolchain built for modularity, build reuse, and incremental adoption. It integrates seamlessly with your existing infrastructure, giving you complete control without vendor lock-in. + 🪨 Rock is a modular toolkit for teams building React Native apps. It helps improve build times and developer experience while fitting into your existing workflows and infrastructure.

--- -## React Native at scale is challenging +## Key Features -Enterprise apps aren't built overnight. As maintainers of the Community CLI and partners to enterprise teams, we've seen the real challenges: high build times, difficulty adopting new third-party cloud services, and high barriers to introducing React Native into existing iOS and Android apps. +**☁️ Remote Build Cache** +Save up to 96% of build time by reusing native artifacts (APK, AAB, APP, IPA) across machines and CI. Use built‑in integrations for GitHub, S3, and R2 or bring your own storage. -Rock simplifies native build setup and reuse. In most React Native codebases, only about 10% of code changes affect the native iOS/Android files. Yet most teams rebuild their native apps constantly—on every commit, PR, or merge to main—when it's completely unnecessary. +**🔗 Brownfield ready** +Add React Native to existing iOS and Android apps using Rock Brownfield. -Rock leverages this insight by providing intelligent caching in your cloud infrastructure, seamlessly integrated through its CLI. This allows you to skip up to 90% of unnecessary native builds. +**🔌 Modular & Extensible** +A plugin‑driven architecture that lets you customize platforms, bundlers, cache providers, and more. -## Features +**🖥️ Cross‑platform‑ready** +iOS and Android by default; designed to extend to TVs, macOS, and Windows (coming soon). -**🖥️ Brand New CLI** -A familiar CLI experience with end-to-end development and build workflows. Migrate in seconds with `npm create rock`. - -**☁️ Reusable Cloud Builds** -Reliable caching of native artifacts (APK, IPA) that you can store wherever you prefer, or use our out-of-the-box integrations with GitHub, S3, and R2. - -**🔧 GitHub Actions** -Complete logic for downloading, uploading, and building native artifacts for iOS (APP, IPA) and Android (APK, AAB). - -**🔗 Plug-and-Play Brownfield** -Package your React Native app as a framework and integrate it into your iOS and Android apps just like any other library. - -**📦 Bundler Flexibility** -Rock supports both Metro and Re.Pack for JavaScript bundling. With Re.Pack, you can build Super Apps and Mobile Microfrontends. - -**🔌 Extensible Plugin System** -Built with modularity in mind, Rock allows you to extend its capabilities through plugins that integrate with both the CLI and native templates. +**⚡ Easy Community CLI Migration** +A familiar CLI that helps you develop, run, and build your app. Migrate from Community CLI in minutes. ## Installation -Rock is designed for incremental adoption. Whether you're just starting with React Native in your iOS or Android app, or want to migrate from the React Native Community CLI, you can do it step-by-step without having to figure everything out at once. +Choose your path based on your current situation: -### Migrating an existing Community CLI project +### Creating a new project -To migrate an existing project, open a terminal in your project root and run: +> [!TIP] +> For **new projects**, we recommend starting with [Expo](https://expo.dev) for the best developer experience and similar remote caching capabilities. Rock is designed for teams who have outgrown the Community CLI. + +To create a fresh React Native app with Rock, open a terminal and run: ```shell npm create rock ``` -### Creating a new project +### Migrating an existing Community CLI project -To create a fresh React Native app with Rock, open a terminal and run: +To migrate an existing project, open a terminal in your project root and run: ```shell npm create rock diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6202451b5..f2a14f32b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,13 +26,13 @@ importers: version: 20.19.17 '@typescript-eslint/eslint-plugin': specifier: ^8.39.0 - version: 8.39.0(@typescript-eslint/parser@8.39.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + version: 8.39.0(@typescript-eslint/parser@8.39.0(eslint@9.33.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.6.1))(typescript@5.9.2) '@typescript-eslint/parser': specifier: ^8.39.0 - version: 8.39.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + version: 8.39.0(eslint@9.33.0(jiti@2.6.1))(typescript@5.9.2) '@typescript-eslint/utils': specifier: ^8.39.0 - version: 8.39.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + version: 8.39.0(eslint@9.33.0(jiti@2.6.1))(typescript@5.9.2) '@vitest/coverage-v8': specifier: ^3.2.4 version: 3.2.4(vitest@3.2.4) @@ -41,13 +41,13 @@ importers: version: 3.2.4(vitest@3.2.4) eslint: specifier: ^9.33.0 - version: 9.33.0(jiti@2.5.1) + version: 9.33.0(jiti@2.6.1) eslint-config-prettier: specifier: ^9.1.2 - version: 9.1.2(eslint@9.33.0(jiti@2.5.1)) + version: 9.1.2(eslint@9.33.0(jiti@2.6.1)) eslint-plugin-simple-import-sort: specifier: ^12.1.1 - version: 12.1.1(eslint@9.33.0(jiti@2.5.1)) + version: 12.1.1(eslint@9.33.0(jiti@2.6.1)) fast-glob: specifier: ^3.3.3 version: 3.3.3 @@ -62,13 +62,13 @@ importers: version: 5.9.2 typescript-eslint: specifier: ^8.39.0 - version: 8.39.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + version: 8.39.0(eslint@9.33.0(jiti@2.6.1))(typescript@5.9.2) verdaccio: specifier: ^6.1.6 version: 6.1.6(typanion@3.14.0) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(@vitest/ui@3.2.4)(jiti@2.5.1)(sass-embedded@1.85.1)(terser@5.43.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(@vitest/ui@3.2.4)(jiti@2.6.1)(sass-embedded@1.85.1)(terser@5.43.1) packages/cli: dependencies: @@ -431,11 +431,11 @@ importers: website: dependencies: '@callstack/rspress-preset': - specifier: ~0.4.2 - version: 0.4.2(@rsbuild/core@1.5.4)(@rspress/core@2.0.0-beta.32(@types/react@19.1.9))(react@19.1.1) + specifier: ~0.4.3 + version: 0.4.3(@rsbuild/core@1.5.13)(@rspress/core@2.0.0-beta.34(@types/react@19.1.9))(react@19.1.1) '@rspress/core': - specifier: 2.0.0-beta.32 - version: 2.0.0-beta.32(@types/react@19.1.9) + specifier: 2.0.0-beta.34 + version: 2.0.0-beta.34(@types/react@19.1.9) devDependencies: '@types/node': specifier: ^20.18.0 @@ -1159,13 +1159,13 @@ packages: webpack: optional: true - '@callstack/rspress-preset@0.4.2': - resolution: {integrity: sha512-8Vh/XGNDowOH34ja8jExyoLFLydRe+kIShwqScMWI93mcMnDfVbbbKhcdhnM0ww0ywkplqx22NYAR/DnAIAAqw==} + '@callstack/rspress-preset@0.4.3': + resolution: {integrity: sha512-yEzcAv/NmHTz/niCXAo9y5Z9p7JXzR1vcOzccrQj7HDXhza8ZyizAVTIs2HVcBObIqResR9uYOJGq2Ia/vqY0Q==} peerDependencies: '@rspress/core': 2.0.0-beta.32 - '@callstack/rspress-theme@0.4.2': - resolution: {integrity: sha512-2eJQOUm/hYwg7QF72OJuvmG8MYZ24lEs2HjaJ+dejDslmis0NmQHbgz6FzEGNGmP0qEU7XgebAwiLTH5KzKB/w==} + '@callstack/rspress-theme@0.4.3': + resolution: {integrity: sha512-w8BkpTsDakudmqmEnuyWeEBRSzQtBnwmXiX3t1aVxbyFcB8UeYCUCxfIMcDQzGLppS1W+03OLcifd/37ADoJ3Q==} peerDependencies: '@rspress/core': ^2.0.0-beta.32 react: ^19.0.0 @@ -1242,12 +1242,21 @@ packages: '@emnapi/core@1.4.5': resolution: {integrity: sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==} + '@emnapi/core@1.5.0': + resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==} + '@emnapi/runtime@1.4.5': resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} + '@emnapi/runtime@1.5.0': + resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==} + '@emnapi/wasi-threads@1.0.4': resolution: {integrity: sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==} + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + '@esbuild/aix-ppc64@0.25.8': resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==} engines: {node: '>=18'} @@ -1588,11 +1597,6 @@ packages: '@mdx-js/mdx@3.1.1': resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} - '@mdx-js/react@2.3.0': - resolution: {integrity: sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==} - peerDependencies: - react: '>=16' - '@mdx-js/react@3.1.1': resolution: {integrity: sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==} peerDependencies: @@ -1638,6 +1642,9 @@ packages: '@napi-rs/wasm-runtime@1.0.3': resolution: {integrity: sha512-rZxtMsLwjdXkMUGC3WwsPwLNVqVqnTJT6MNIB6e+5fhMcSCPP0AOsNWuMQ5mdCq6HNjs/ZeWAEchpqeprqBD2Q==} + '@napi-rs/wasm-runtime@1.0.5': + resolution: {integrity: sha512-TBr9Cf9onSAS2LQ2+QHx6XcC6h9+RIzJgbqG3++9TUZSH204AwEy5jg3BTQ0VATsyoGj4ee49tN/y6rvaOOtcg==} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1869,6 +1876,11 @@ packages: cpu: [x64] os: [win32] + '@rsbuild/core@1.5.13': + resolution: {integrity: sha512-P+TCvZCVpBYZ3GDdnzR/tZKicE41khJIqIRlJYnEc9dwUfX1/eqRf8lA8yrsbB5iZbSfj1iOoH1N25cCQ3hhuA==} + engines: {node: '>=18.12.0'} + hasBin: true + '@rsbuild/core@1.5.4': resolution: {integrity: sha512-iRzq4hEXawL4MVkPKhfGMJxS45XIfwkweAZXEHeaboq6vxbpg0dLRgkbaIuuFyF9hCwI0y3ant/xVXOqDghJNw==} engines: {node: '>=18.12.0'} @@ -1902,6 +1914,11 @@ packages: cpu: [arm64] os: [darwin] + '@rspack/binding-darwin-arm64@1.5.8': + resolution: {integrity: sha512-spJfpOSN3f7V90ic45/ET2NKB2ujAViCNmqb0iGurMNQtFRq+7Kd+jvVKKGXKBHBbsQrFhidSWbbqy2PBPGK8g==} + cpu: [arm64] + os: [darwin] + '@rspack/binding-darwin-x64@1.4.11': resolution: {integrity: sha512-YIV8Wzy+JY0SoSsVtN4wxFXOjzxxVPnVXNswrrfqVUTPr9jqGOFYUWCGpbt8lcCgfuBFm6zN8HpOsKm1xUNsVA==} cpu: [x64] @@ -1912,6 +1929,11 @@ packages: cpu: [x64] os: [darwin] + '@rspack/binding-darwin-x64@1.5.8': + resolution: {integrity: sha512-YFOzeL1IBknBcri8vjUp43dfUBylCeQnD+9O9p0wZmLAw7DtpN5JEOe2AkGo8kdTqJjYKI+cczJPKIw6lu1LWw==} + cpu: [x64] + os: [darwin] + '@rspack/binding-linux-arm64-gnu@1.4.11': resolution: {integrity: sha512-ms6uwECUIcu+6e82C5HJhRMHnfsI+l33v7XQezntzRPN0+sG3EpikEoT7SGbgt4vDwaWLR7wS20suN4qd5r3GA==} cpu: [arm64] @@ -1922,6 +1944,11 @@ packages: cpu: [arm64] os: [linux] + '@rspack/binding-linux-arm64-gnu@1.5.8': + resolution: {integrity: sha512-UAWCsOnpkvy8eAVRo0uipbHXDhnoDq5zmqWTMhpga0/a3yzCp2e+fnjZb/qnFNYb5MeL0O1mwMOYgn1M3oHILQ==} + cpu: [arm64] + os: [linux] + '@rspack/binding-linux-arm64-musl@1.4.11': resolution: {integrity: sha512-9evq0DOdxMN/H8VM8ZmyY9NSuBgILNVV6ydBfVPMHPx4r1E7JZGpWeKDegZcS5Erw3sS9kVSIxyX78L5PDzzKw==} cpu: [arm64] @@ -1932,6 +1959,11 @@ packages: cpu: [arm64] os: [linux] + '@rspack/binding-linux-arm64-musl@1.5.8': + resolution: {integrity: sha512-GnSvGT4GjokPSD45cTtE+g7LgghuxSP1MRmvd+Vp/I8pnxTVSTsebRod4TAqyiv+l11nuS8yqNveK9qiOkBLWw==} + cpu: [arm64] + os: [linux] + '@rspack/binding-linux-x64-gnu@1.4.11': resolution: {integrity: sha512-bHYFLxPPYBOSaHdQbEoCYGMQ1gOrEWj7Mro/DLfSHZi1a0okcQ2Q1y0i1DczReim3ZhLGNrK7k1IpFXCRbAobQ==} cpu: [x64] @@ -1942,6 +1974,11 @@ packages: cpu: [x64] os: [linux] + '@rspack/binding-linux-x64-gnu@1.5.8': + resolution: {integrity: sha512-XLxh5n/pzUfxsugz/8rVBv+Tx2nqEM+9rharK69kfooDsQNKyz7PANllBQ/v4svJ+W0BRHnDL4qXSGdteZeEjA==} + cpu: [x64] + os: [linux] + '@rspack/binding-linux-x64-musl@1.4.11': resolution: {integrity: sha512-wrm4E7q2k4+cwT6Uhp6hIQ3eUe/YoaUttj6j5TqHYZX6YeLrNPtD9+ne6lQQ17BV8wmm6NZsmoFIJ5xIptpRhQ==} cpu: [x64] @@ -1952,6 +1989,11 @@ packages: cpu: [x64] os: [linux] + '@rspack/binding-linux-x64-musl@1.5.8': + resolution: {integrity: sha512-gE0+MZmwF+01p9/svpEESkzkLpBkVUG2o03YMpwXYC/maeRRhWvF8BJ7R3i/Ls/jFGSE87dKX5NbRLVzqksq/w==} + cpu: [x64] + os: [linux] + '@rspack/binding-wasm32-wasi@1.4.11': resolution: {integrity: sha512-hiYxHZjaZ17wQtXyLCK0IdtOvMWreGVTiGsaHCxyeT+SldDG+r16bXNjmlqfZsjlfl1mkAqKz1dg+mMX28OTqw==} cpu: [wasm32] @@ -1960,6 +2002,10 @@ packages: resolution: {integrity: sha512-cuVbGr1b4q0Z6AtEraI3becZraPMMgZtZPRaIsVLeDXCmxup/maSAR3T6UaGf4Q2SNcFfjw4neGz5UJxPK8uvA==} cpu: [wasm32] + '@rspack/binding-wasm32-wasi@1.5.8': + resolution: {integrity: sha512-cfg3niNHeJuxuml1Vy9VvaJrI/5TakzoaZvKX2g5S24wfzR50Eyy4JAsZ+L2voWQQp1yMJbmPYPmnTCTxdJQBQ==} + cpu: [wasm32] + '@rspack/binding-win32-arm64-msvc@1.4.11': resolution: {integrity: sha512-+HF/mnjmTr8PC1dccRt1bkrD2tPDGeqvXC1BBLYd/Klq1VbtIcnrhfmvQM6KaXbiLcY9VWKzcZPOTmnyZ8TaHQ==} cpu: [arm64] @@ -1970,6 +2016,11 @@ packages: cpu: [arm64] os: [win32] + '@rspack/binding-win32-arm64-msvc@1.5.8': + resolution: {integrity: sha512-7i3ZTHFXKfU/9Jm9XhpMkrdkxO7lfeYMNVEGkuU5dyBfRMQj69dRgPL7zJwc2plXiqu9LUOl+TwDNTjap7Q36g==} + cpu: [arm64] + os: [win32] + '@rspack/binding-win32-ia32-msvc@1.4.11': resolution: {integrity: sha512-EU2fQGwrRfwFd/tcOInlD0jy6gNQE4Q3Ayj0Is+cX77sbhPPyyOz0kZDEaQ4qaN2VU8w4Hu/rrD7c0GAKLFvCw==} cpu: [ia32] @@ -1980,6 +2031,11 @@ packages: cpu: [ia32] os: [win32] + '@rspack/binding-win32-ia32-msvc@1.5.8': + resolution: {integrity: sha512-7ZPPWO11J+soea1+mnfaPpQt7GIodBM7A86dx6PbXgVEoZmetcWPrCF2NBfXxQWOKJ9L3RYltC4z+ZyXRgMOrw==} + cpu: [ia32] + os: [win32] + '@rspack/binding-win32-x64-msvc@1.4.11': resolution: {integrity: sha512-1Nc5ZzWqfvE+iJc47qtHFzYYnHsC3awavXrCo74GdGip1vxtksM3G30BlvAQHHVtEmULotWqPbjZpflw/Xk9Ag==} cpu: [x64] @@ -1990,12 +2046,20 @@ packages: cpu: [x64] os: [win32] + '@rspack/binding-win32-x64-msvc@1.5.8': + resolution: {integrity: sha512-N/zXQgzIxME3YUzXT8qnyzxjqcnXudWOeDh8CAG9zqTCnCiy16SFfQ/cQgEoLlD9geQntV6jx2GbDDI5kpDGMQ==} + cpu: [x64] + os: [win32] + '@rspack/binding@1.4.11': resolution: {integrity: sha512-maGl/zRwnl0QVwkBCkgjn5PH20L9HdlRIdkYhEsfTepy5x2QZ0ti/0T49djjTJQrqb+S1i6wWQymMMMMMsxx6Q==} '@rspack/binding@1.5.2': resolution: {integrity: sha512-NKiBcsxmAzFDYRnK2ZHWbTtDFVT5/704eK4OfpgsDXPMkaMnBKijMKNgP5pbe18X4rUlz+8HnGm4+Xllo9EESw==} + '@rspack/binding@1.5.8': + resolution: {integrity: sha512-/91CzhRl9r5BIQCgGsS7jA6MDbw1I2BQpbfcUUdkdKl2P79K3Zo/Mw/TvKzS86catwLaUQEgkGRmYawOfPg7ow==} + '@rspack/core@1.4.11': resolution: {integrity: sha512-JtKnL6p7Kc/YgWQJF3Woo4OccbgKGyT/4187W4dyex8BMkdQcbqCNIdi6dFk02hwQzxpOOxRSBI4hlGRbz7oYQ==} engines: {node: '>=16.0.0'} @@ -2014,6 +2078,15 @@ packages: '@swc/helpers': optional: true + '@rspack/core@1.5.8': + resolution: {integrity: sha512-sUd2LfiDhqYVfvknuoz0+/c+wSpn693xotnG5g1CSWKZArbtwiYzBIVnNlcHGmuoBRsnj/TkSq8dTQ7gwfBroQ==} + engines: {node: '>=18.12.0'} + peerDependencies: + '@swc/helpers': '>=0.5.1' + peerDependenciesMeta: + '@swc/helpers': + optional: true + '@rspack/lite-tapable@1.0.1': resolution: {integrity: sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==} engines: {node: '>=16.0.0'} @@ -2035,8 +2108,8 @@ packages: webpack-hot-middleware: optional: true - '@rspress/core@2.0.0-beta.32': - resolution: {integrity: sha512-gShXFSpULNEFjSz+reOWKauUlCBi74PR3R/ej6NpiLnIY5iz7FJuOYuDOajzK2rWxkDkFo3Jqh1tZn5jCrtpJw==} + '@rspress/core@2.0.0-beta.34': + resolution: {integrity: sha512-iTxHYPXsCYoc4I/CxOfylc7nOZutFH9bOUXrQcWxvrQT0bEpSc008xhIQIYqdgrBpGyWx/DU/5SJCwMd19YzlQ==} engines: {node: '>=18.0.0'} hasBin: true @@ -2104,15 +2177,15 @@ packages: peerDependencies: '@rspress/core': ^2.0.0-beta.32 - '@rspress/runtime@2.0.0-beta.32': - resolution: {integrity: sha512-gIxn8JxiZRtEfLsoJoJlfvpOxQBVctDMJfEHc0RMYcqz7YTmlosHdmJi9NICykTLeUP/PaubPuvGdBMPSymGtg==} + '@rspress/runtime@2.0.0-beta.34': + resolution: {integrity: sha512-tz6J2bQCRscCGrDVOTF4XTb5RmTlpQK6DGFwv+N98z34ya4JYZ/xOpC4EGvDCTvVGI+AqFIsZz0Ra8Z2oX0zdg==} engines: {node: '>=18.0.0'} - '@rspress/shared@2.0.0-beta.32': - resolution: {integrity: sha512-OhiiIWBtFe29MYh71i9HG0QlUyiAc/LyoGqHOCy1EJfX6hLljydc04WAifz0PcaCbTRh96yiWVPE3ieOqS35Uw==} + '@rspress/shared@2.0.0-beta.34': + resolution: {integrity: sha512-kFvrJIF7ftQFFzQyJiTwkxmdoVXwSeBoEsAQDmOJ2WZJwXvtzkvFbJJjdzC21N3qNyYOqHlx+jGzZowYjZuBhA==} - '@rspress/theme-default@2.0.0-beta.32': - resolution: {integrity: sha512-+8RDQJDzkRrSfbAB5ORxwVZoS55rp/pE2DkbLkZd4DlFcCdfGkkuNc6mR2n8SpmMB8T04odfVCkR06ihgv8RVw==} + '@rspress/theme-default@2.0.0-beta.34': + resolution: {integrity: sha512-ZnW9oWEA3+lH0nh71bOOncLDiosZRutRXlXSnkjSMJGacBjGITFQc+ECc1E11+tcpIIt0NiWikx7/PeXXjBmAA==} engines: {node: '>=18.0.0'} '@selderee/plugin-htmlparser2@0.11.0': @@ -2381,6 +2454,9 @@ packages: '@tybys/wasm-util@0.10.0': resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@types/adm-zip@0.5.7': resolution: {integrity: sha512-DNEs/QvmyRLurdQPChqq0Md4zGvPwHerAJYWk9l2jCbD1VPpnzRJorOdiq4zsw09NFbYnhfsoEhWtxIzXpn2yw==} @@ -2557,8 +2633,8 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@unhead/react@2.0.14': - resolution: {integrity: sha512-LHIhXyJUztRO5kFAXO4SG3RB0a/Uz3zMrX/LHo0Wp2z0KQ4jXq2dLSpM3Jxjrjm5eLO4tTvOGhU65EBgj/4ZFg==} + '@unhead/react@2.0.17': + resolution: {integrity: sha512-Mg8yDWUMf2eH8uZQ7vHvVaeV/HBqEzO/ThYf2VQKvfy1ZuiynFoGp8UNnC1sCA6Efbg4sPPX33BlCqdnr6vJcg==} peerDependencies: react: '>=18.3.1' @@ -4335,6 +4411,10 @@ packages: resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} hasBin: true + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + joi@17.13.3: resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==} @@ -5438,9 +5518,6 @@ packages: remark-gfm@4.0.1: resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} - remark-mdx@3.1.0: - resolution: {integrity: sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==} - remark-mdx@3.1.1: resolution: {integrity: sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==} @@ -6173,8 +6250,8 @@ packages: undici-types@7.10.0: resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} - unhead@2.0.14: - resolution: {integrity: sha512-dRP6OCqtShhMVZQe1F4wdt/WsYl2MskxKK+cvfSo0lQnrPJ4oAUQEkxRg7pPP+vJENabhlir31HwAyHUv7wfMg==} + unhead@2.0.17: + resolution: {integrity: sha512-xX3PCtxaE80khRZobyWCVxeFF88/Tg9eJDcJWY9us727nsTC7C449B8BUfVBmiF2+3LjPcmqeoB2iuMs0U4oJQ==} unicode-canonical-property-names-ecmascript@2.0.1: resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} @@ -7782,14 +7859,14 @@ snapshots: - supports-color - utf-8-validate - '@callstack/rspress-preset@0.4.2(@rsbuild/core@1.5.4)(@rspress/core@2.0.0-beta.32(@types/react@19.1.9))(react@19.1.1)': + '@callstack/rspress-preset@0.4.3(@rsbuild/core@1.5.13)(@rspress/core@2.0.0-beta.34(@types/react@19.1.9))(react@19.1.1)': dependencies: - '@callstack/rspress-theme': 0.4.2(@rspress/core@2.0.0-beta.32(@types/react@19.1.9))(react@19.1.1) - '@rspress/core': 2.0.0-beta.32(@types/react@19.1.9) - '@rspress/plugin-llms': 2.0.0-beta.32(@rspress/core@2.0.0-beta.32(@types/react@19.1.9)) - '@rspress/plugin-sitemap': 2.0.0-beta.32(@rspress/core@2.0.0-beta.32(@types/react@19.1.9)) + '@callstack/rspress-theme': 0.4.3(@rspress/core@2.0.0-beta.34(@types/react@19.1.9))(react@19.1.1) + '@rspress/core': 2.0.0-beta.34(@types/react@19.1.9) + '@rspress/plugin-llms': 2.0.0-beta.32(@rspress/core@2.0.0-beta.34(@types/react@19.1.9)) + '@rspress/plugin-sitemap': 2.0.0-beta.32(@rspress/core@2.0.0-beta.34(@types/react@19.1.9)) '@vercel/analytics': 1.5.0(react@19.1.1) - rsbuild-plugin-open-graph: 1.1.0(@rsbuild/core@1.5.4) + rsbuild-plugin-open-graph: 1.1.0(@rsbuild/core@1.5.13) zod: 3.25.76 transitivePeerDependencies: - '@remix-run/react' @@ -7802,9 +7879,9 @@ snapshots: - vue - vue-router - '@callstack/rspress-theme@0.4.2(@rspress/core@2.0.0-beta.32(@types/react@19.1.9))(react@19.1.1)': + '@callstack/rspress-theme@0.4.3(@rspress/core@2.0.0-beta.34(@types/react@19.1.9))(react@19.1.1)': dependencies: - '@rspress/core': 2.0.0-beta.32(@types/react@19.1.9) + '@rspress/core': 2.0.0-beta.34(@types/react@19.1.9) react: 19.1.1 '@changesets/apply-release-plan@7.0.12': @@ -7989,16 +8066,32 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/core@1.5.0': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.4.5': dependencies: tslib: 2.8.1 optional: true + '@emnapi/runtime@1.5.0': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/wasi-threads@1.0.4': dependencies: tslib: 2.8.1 optional: true + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + '@esbuild/aix-ppc64@0.25.8': optional: true @@ -8077,9 +8170,9 @@ snapshots: '@esbuild/win32-x64@0.25.8': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@9.33.0(jiti@2.5.1))': + '@eslint-community/eslint-utils@4.7.0(eslint@9.33.0(jiti@2.6.1))': dependencies: - eslint: 9.33.0(jiti@2.5.1) + eslint: 9.33.0(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -8336,7 +8429,7 @@ snapshots: recma-jsx: 1.0.0(acorn@8.15.0) recma-stringify: 1.0.0 rehype-recma: 1.0.0 - remark-mdx: 3.1.0 + remark-mdx: 3.1.1 remark-parse: 11.0.0 remark-rehype: 11.1.2 source-map: 0.7.6 @@ -8348,12 +8441,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@mdx-js/react@2.3.0(react@19.1.1)': - dependencies: - '@types/mdx': 2.0.13 - '@types/react': 19.1.9 - react: 19.1.1 - '@mdx-js/react@3.1.1(@types/react@19.1.9)(react@19.1.1)': dependencies: '@types/mdx': 2.0.13 @@ -8417,6 +8504,13 @@ snapshots: '@tybys/wasm-util': 0.10.0 optional: true + '@napi-rs/wasm-runtime@1.0.5': + dependencies: + '@emnapi/core': 1.5.0 + '@emnapi/runtime': 1.5.0 + '@tybys/wasm-util': 0.10.1 + optional: true + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -8744,6 +8838,14 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.46.2': optional: true + '@rsbuild/core@1.5.13': + dependencies: + '@rspack/core': 1.5.8(@swc/helpers@0.5.17) + '@rspack/lite-tapable': 1.0.1 + '@swc/helpers': 0.5.17 + core-js: 3.45.1 + jiti: 2.6.1 + '@rsbuild/core@1.5.4': dependencies: '@rspack/core': 1.5.2(@swc/helpers@0.5.17) @@ -8752,9 +8854,9 @@ snapshots: core-js: 3.45.1 jiti: 2.5.1 - '@rsbuild/plugin-react@1.4.0(@rsbuild/core@1.5.4)': + '@rsbuild/plugin-react@1.4.0(@rsbuild/core@1.5.13)': dependencies: - '@rsbuild/core': 1.5.4 + '@rsbuild/core': 1.5.13 '@rspack/plugin-react-refresh': 1.5.1(react-refresh@0.17.0) react-refresh: 0.17.0 transitivePeerDependencies: @@ -8776,36 +8878,54 @@ snapshots: '@rspack/binding-darwin-arm64@1.5.2': optional: true + '@rspack/binding-darwin-arm64@1.5.8': + optional: true + '@rspack/binding-darwin-x64@1.4.11': optional: true '@rspack/binding-darwin-x64@1.5.2': optional: true + '@rspack/binding-darwin-x64@1.5.8': + optional: true + '@rspack/binding-linux-arm64-gnu@1.4.11': optional: true '@rspack/binding-linux-arm64-gnu@1.5.2': optional: true + '@rspack/binding-linux-arm64-gnu@1.5.8': + optional: true + '@rspack/binding-linux-arm64-musl@1.4.11': optional: true '@rspack/binding-linux-arm64-musl@1.5.2': optional: true + '@rspack/binding-linux-arm64-musl@1.5.8': + optional: true + '@rspack/binding-linux-x64-gnu@1.4.11': optional: true '@rspack/binding-linux-x64-gnu@1.5.2': optional: true + '@rspack/binding-linux-x64-gnu@1.5.8': + optional: true + '@rspack/binding-linux-x64-musl@1.4.11': optional: true '@rspack/binding-linux-x64-musl@1.5.2': optional: true + '@rspack/binding-linux-x64-musl@1.5.8': + optional: true + '@rspack/binding-wasm32-wasi@1.4.11': dependencies: '@napi-rs/wasm-runtime': 1.0.3 @@ -8816,24 +8936,38 @@ snapshots: '@napi-rs/wasm-runtime': 1.0.3 optional: true + '@rspack/binding-wasm32-wasi@1.5.8': + dependencies: + '@napi-rs/wasm-runtime': 1.0.5 + optional: true + '@rspack/binding-win32-arm64-msvc@1.4.11': optional: true '@rspack/binding-win32-arm64-msvc@1.5.2': optional: true + '@rspack/binding-win32-arm64-msvc@1.5.8': + optional: true + '@rspack/binding-win32-ia32-msvc@1.4.11': optional: true '@rspack/binding-win32-ia32-msvc@1.5.2': optional: true + '@rspack/binding-win32-ia32-msvc@1.5.8': + optional: true + '@rspack/binding-win32-x64-msvc@1.4.11': optional: true '@rspack/binding-win32-x64-msvc@1.5.2': optional: true + '@rspack/binding-win32-x64-msvc@1.5.8': + optional: true + '@rspack/binding@1.4.11': optionalDependencies: '@rspack/binding-darwin-arm64': 1.4.11 @@ -8860,6 +8994,19 @@ snapshots: '@rspack/binding-win32-ia32-msvc': 1.5.2 '@rspack/binding-win32-x64-msvc': 1.5.2 + '@rspack/binding@1.5.8': + optionalDependencies: + '@rspack/binding-darwin-arm64': 1.5.8 + '@rspack/binding-darwin-x64': 1.5.8 + '@rspack/binding-linux-arm64-gnu': 1.5.8 + '@rspack/binding-linux-arm64-musl': 1.5.8 + '@rspack/binding-linux-x64-gnu': 1.5.8 + '@rspack/binding-linux-x64-musl': 1.5.8 + '@rspack/binding-wasm32-wasi': 1.5.8 + '@rspack/binding-win32-arm64-msvc': 1.5.8 + '@rspack/binding-win32-ia32-msvc': 1.5.8 + '@rspack/binding-win32-x64-msvc': 1.5.8 + '@rspack/core@1.4.11(@swc/helpers@0.5.17)': dependencies: '@module-federation/runtime-tools': 0.17.1 @@ -8876,6 +9023,14 @@ snapshots: optionalDependencies: '@swc/helpers': 0.5.17 + '@rspack/core@1.5.8(@swc/helpers@0.5.17)': + dependencies: + '@module-federation/runtime-tools': 0.18.0 + '@rspack/binding': 1.5.8 + '@rspack/lite-tapable': 1.0.1 + optionalDependencies: + '@swc/helpers': 0.5.17 + '@rspack/lite-tapable@1.0.1': {} '@rspack/plugin-react-refresh@1.0.0(react-refresh@0.14.2)': @@ -8891,22 +9046,21 @@ snapshots: html-entities: 2.6.0 react-refresh: 0.17.0 - '@rspress/core@2.0.0-beta.32(@types/react@19.1.9)': + '@rspress/core@2.0.0-beta.34(@types/react@19.1.9)': dependencies: '@mdx-js/mdx': 3.1.1 '@mdx-js/react': 3.1.1(@types/react@19.1.9)(react@19.1.1) - '@rsbuild/core': 1.5.4 - '@rsbuild/plugin-react': 1.4.0(@rsbuild/core@1.5.4) + '@rsbuild/core': 1.5.13 + '@rsbuild/plugin-react': 1.4.0(@rsbuild/core@1.5.13) '@rspress/mdx-rs': 0.6.6 - '@rspress/runtime': 2.0.0-beta.32 - '@rspress/shared': 2.0.0-beta.32 - '@rspress/theme-default': 2.0.0-beta.32 + '@rspress/runtime': 2.0.0-beta.34 + '@rspress/shared': 2.0.0-beta.34 + '@rspress/theme-default': 2.0.0-beta.34(@types/react@19.1.9) '@shikijs/rehype': 3.12.2 '@types/unist': 3.0.3 - '@unhead/react': 2.0.14(react@19.1.1) + '@unhead/react': 2.0.17(react@19.1.1) cac: 6.7.14 chokidar: 3.6.0 - enhanced-resolve: 5.18.3 github-slugger: 2.0.0 hast-util-heading-rank: 3.0.0 html-to-text: 9.0.5 @@ -8967,9 +9121,9 @@ snapshots: '@rspress/mdx-rs-win32-arm64-msvc': 0.6.6 '@rspress/mdx-rs-win32-x64-msvc': 0.6.6 - '@rspress/plugin-llms@2.0.0-beta.32(@rspress/core@2.0.0-beta.32(@types/react@19.1.9))': + '@rspress/plugin-llms@2.0.0-beta.32(@rspress/core@2.0.0-beta.34(@types/react@19.1.9))': dependencies: - '@rspress/core': 2.0.0-beta.32(@types/react@19.1.9) + '@rspress/core': 2.0.0-beta.34(@types/react@19.1.9) remark-mdx: 3.1.1 remark-parse: 11.0.0 remark-stringify: 11.0.0 @@ -8978,32 +9132,32 @@ snapshots: transitivePeerDependencies: - supports-color - '@rspress/plugin-sitemap@2.0.0-beta.32(@rspress/core@2.0.0-beta.32(@types/react@19.1.9))': + '@rspress/plugin-sitemap@2.0.0-beta.32(@rspress/core@2.0.0-beta.34(@types/react@19.1.9))': dependencies: - '@rspress/core': 2.0.0-beta.32(@types/react@19.1.9) + '@rspress/core': 2.0.0-beta.34(@types/react@19.1.9) - '@rspress/runtime@2.0.0-beta.32': + '@rspress/runtime@2.0.0-beta.34': dependencies: - '@rspress/shared': 2.0.0-beta.32 - '@unhead/react': 2.0.14(react@19.1.1) + '@rspress/shared': 2.0.0-beta.34 + '@unhead/react': 2.0.17(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) react-router-dom: 6.30.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@rspress/shared@2.0.0-beta.32': + '@rspress/shared@2.0.0-beta.34': dependencies: - '@rsbuild/core': 1.5.4 + '@rsbuild/core': 1.5.13 '@shikijs/rehype': 3.12.2 gray-matter: 4.0.3 lodash-es: 4.17.21 unified: 11.0.5 - '@rspress/theme-default@2.0.0-beta.32': + '@rspress/theme-default@2.0.0-beta.34(@types/react@19.1.9)': dependencies: - '@mdx-js/react': 2.3.0(react@19.1.1) - '@rspress/runtime': 2.0.0-beta.32 - '@rspress/shared': 2.0.0-beta.32 - '@unhead/react': 2.0.14(react@19.1.1) + '@mdx-js/react': 3.1.1(@types/react@19.1.9)(react@19.1.1) + '@rspress/runtime': 2.0.0-beta.34 + '@rspress/shared': 2.0.0-beta.34 + '@unhead/react': 2.0.17(react@19.1.1) body-scroll-lock: 4.0.0-beta.0 copy-to-clipboard: 3.3.3 flexsearch: 0.7.43 @@ -9015,6 +9169,7 @@ snapshots: react-dom: 19.1.1(react@19.1.1) shiki: 3.12.2 transitivePeerDependencies: + - '@types/react' - supports-color '@selderee/plugin-htmlparser2@0.11.0': @@ -9429,6 +9584,11 @@ snapshots: tslib: 2.8.1 optional: true + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + '@types/adm-zip@0.5.7': dependencies: '@types/node': 24.2.1 @@ -9558,15 +9718,15 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.39.0(@typescript-eslint/parser@8.39.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@8.39.0(@typescript-eslint/parser@8.39.0(eslint@9.33.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.6.1))(typescript@5.9.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.39.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/parser': 8.39.0(eslint@9.33.0(jiti@2.6.1))(typescript@5.9.2) '@typescript-eslint/scope-manager': 8.39.0 - '@typescript-eslint/type-utils': 8.39.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/utils': 8.39.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/type-utils': 8.39.0(eslint@9.33.0(jiti@2.6.1))(typescript@5.9.2) + '@typescript-eslint/utils': 8.39.0(eslint@9.33.0(jiti@2.6.1))(typescript@5.9.2) '@typescript-eslint/visitor-keys': 8.39.0 - eslint: 9.33.0(jiti@2.5.1) + eslint: 9.33.0(jiti@2.6.1) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -9575,14 +9735,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.39.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/parser@8.39.0(eslint@9.33.0(jiti@2.6.1))(typescript@5.9.2)': dependencies: '@typescript-eslint/scope-manager': 8.39.0 '@typescript-eslint/types': 8.39.0 '@typescript-eslint/typescript-estree': 8.39.0(typescript@5.9.2) '@typescript-eslint/visitor-keys': 8.39.0 debug: 4.4.1 - eslint: 9.33.0(jiti@2.5.1) + eslint: 9.33.0(jiti@2.6.1) typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -9605,13 +9765,13 @@ snapshots: dependencies: typescript: 5.9.2 - '@typescript-eslint/type-utils@8.39.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/type-utils@8.39.0(eslint@9.33.0(jiti@2.6.1))(typescript@5.9.2)': dependencies: '@typescript-eslint/types': 8.39.0 '@typescript-eslint/typescript-estree': 8.39.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.39.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/utils': 8.39.0(eslint@9.33.0(jiti@2.6.1))(typescript@5.9.2) debug: 4.4.1 - eslint: 9.33.0(jiti@2.5.1) + eslint: 9.33.0(jiti@2.6.1) ts-api-utils: 2.1.0(typescript@5.9.2) typescript: 5.9.2 transitivePeerDependencies: @@ -9635,13 +9795,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.39.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/utils@8.39.0(eslint@9.33.0(jiti@2.6.1))(typescript@5.9.2)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.39.0 '@typescript-eslint/types': 8.39.0 '@typescript-eslint/typescript-estree': 8.39.0(typescript@5.9.2) - eslint: 9.33.0(jiti@2.5.1) + eslint: 9.33.0(jiti@2.6.1) typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -9653,10 +9813,10 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@unhead/react@2.0.14(react@19.1.1)': + '@unhead/react@2.0.17(react@19.1.1)': dependencies: react: 19.1.1 - unhead: 2.0.14 + unhead: 2.0.17 '@vercel/analytics@1.5.0(react@19.1.1)': optionalDependencies: @@ -9821,7 +9981,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(@vitest/ui@3.2.4)(jiti@2.5.1)(sass-embedded@1.85.1)(terser@5.43.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(@vitest/ui@3.2.4)(jiti@2.6.1)(sass-embedded@1.85.1)(terser@5.43.1) transitivePeerDependencies: - supports-color @@ -9833,13 +9993,13 @@ snapshots: chai: 5.2.1 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.1.1(@types/node@20.19.17)(jiti@2.5.1)(sass-embedded@1.85.1)(terser@5.43.1))': + '@vitest/mocker@3.2.4(vite@7.1.1(@types/node@20.19.17)(jiti@2.6.1)(sass-embedded@1.85.1)(terser@5.43.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 7.1.1(@types/node@20.19.17)(jiti@2.5.1)(sass-embedded@1.85.1)(terser@5.43.1) + vite: 7.1.1(@types/node@20.19.17)(jiti@2.6.1)(sass-embedded@1.85.1)(terser@5.43.1) '@vitest/pretty-format@3.2.4': dependencies: @@ -9870,7 +10030,7 @@ snapshots: sirv: 3.0.1 tinyglobby: 0.2.14 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(@vitest/ui@3.2.4)(jiti@2.5.1)(sass-embedded@1.85.1)(terser@5.43.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(@vitest/ui@3.2.4)(jiti@2.6.1)(sass-embedded@1.85.1)(terser@5.43.1) '@vitest/utils@3.2.4': dependencies: @@ -10760,13 +10920,13 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-config-prettier@9.1.2(eslint@9.33.0(jiti@2.5.1)): + eslint-config-prettier@9.1.2(eslint@9.33.0(jiti@2.6.1)): dependencies: - eslint: 9.33.0(jiti@2.5.1) + eslint: 9.33.0(jiti@2.6.1) - eslint-plugin-simple-import-sort@12.1.1(eslint@9.33.0(jiti@2.5.1)): + eslint-plugin-simple-import-sort@12.1.1(eslint@9.33.0(jiti@2.6.1)): dependencies: - eslint: 9.33.0(jiti@2.5.1) + eslint: 9.33.0(jiti@2.6.1) eslint-scope@5.1.1: dependencies: @@ -10782,9 +10942,9 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.33.0(jiti@2.5.1): + eslint@9.33.0(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.5.1)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 '@eslint/config-helpers': 0.3.1 @@ -10820,7 +10980,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.5.1 + jiti: 2.6.1 transitivePeerDependencies: - supports-color @@ -11762,6 +11922,8 @@ snapshots: jiti@2.5.1: {} + jiti@2.6.1: {} + joi@17.13.3: dependencies: '@hapi/hoek': 9.3.0 @@ -13339,13 +13501,6 @@ snapshots: transitivePeerDependencies: - supports-color - remark-mdx@3.1.0: - dependencies: - mdast-util-mdx: 3.0.0 - micromark-extension-mdxjs: 3.0.0 - transitivePeerDependencies: - - supports-color - remark-mdx@3.1.1: dependencies: mdast-util-mdx: 3.0.0 @@ -13447,9 +13602,9 @@ snapshots: optionalDependencies: typescript: 5.9.2 - rsbuild-plugin-open-graph@1.1.0(@rsbuild/core@1.5.4): + rsbuild-plugin-open-graph@1.1.0(@rsbuild/core@1.5.13): optionalDependencies: - '@rsbuild/core': 1.5.4 + '@rsbuild/core': 1.5.13 run-applescript@7.0.0: {} @@ -14035,13 +14190,13 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 - typescript-eslint@8.39.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2): + typescript-eslint@8.39.0(eslint@9.33.0(jiti@2.6.1))(typescript@5.9.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.39.0(@typescript-eslint/parser@8.39.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/parser': 8.39.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/eslint-plugin': 8.39.0(@typescript-eslint/parser@8.39.0(eslint@9.33.0(jiti@2.6.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.6.1))(typescript@5.9.2) + '@typescript-eslint/parser': 8.39.0(eslint@9.33.0(jiti@2.6.1))(typescript@5.9.2) '@typescript-eslint/typescript-estree': 8.39.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.39.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) - eslint: 9.33.0(jiti@2.5.1) + '@typescript-eslint/utils': 8.39.0(eslint@9.33.0(jiti@2.6.1))(typescript@5.9.2) + eslint: 9.33.0(jiti@2.6.1) typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -14055,7 +14210,7 @@ snapshots: undici-types@7.10.0: {} - unhead@2.0.14: + unhead@2.0.17: dependencies: hookable: 5.5.3 @@ -14229,13 +14384,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@3.2.4(@types/node@20.19.17)(jiti@2.5.1)(sass-embedded@1.85.1)(terser@5.43.1): + vite-node@3.2.4(@types/node@20.19.17)(jiti@2.6.1)(sass-embedded@1.85.1)(terser@5.43.1): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.1(@types/node@20.19.17)(jiti@2.5.1)(sass-embedded@1.85.1)(terser@5.43.1) + vite: 7.1.1(@types/node@20.19.17)(jiti@2.6.1)(sass-embedded@1.85.1)(terser@5.43.1) transitivePeerDependencies: - '@types/node' - jiti @@ -14250,7 +14405,7 @@ snapshots: - tsx - yaml - vite@7.1.1(@types/node@20.19.17)(jiti@2.5.1)(sass-embedded@1.85.1)(terser@5.43.1): + vite@7.1.1(@types/node@20.19.17)(jiti@2.6.1)(sass-embedded@1.85.1)(terser@5.43.1): dependencies: esbuild: 0.25.8 fdir: 6.4.6(picomatch@4.0.3) @@ -14261,15 +14416,15 @@ snapshots: optionalDependencies: '@types/node': 20.19.17 fsevents: 2.3.3 - jiti: 2.5.1 + jiti: 2.6.1 sass-embedded: 1.85.1 terser: 5.43.1 - vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(@vitest/ui@3.2.4)(jiti@2.5.1)(sass-embedded@1.85.1)(terser@5.43.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@20.19.17)(@vitest/ui@3.2.4)(jiti@2.6.1)(sass-embedded@1.85.1)(terser@5.43.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.1(@types/node@20.19.17)(jiti@2.5.1)(sass-embedded@1.85.1)(terser@5.43.1)) + '@vitest/mocker': 3.2.4(vite@7.1.1(@types/node@20.19.17)(jiti@2.6.1)(sass-embedded@1.85.1)(terser@5.43.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -14287,8 +14442,8 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.1(@types/node@20.19.17)(jiti@2.5.1)(sass-embedded@1.85.1)(terser@5.43.1) - vite-node: 3.2.4(@types/node@20.19.17)(jiti@2.5.1)(sass-embedded@1.85.1)(terser@5.43.1) + vite: 7.1.1(@types/node@20.19.17)(jiti@2.6.1)(sass-embedded@1.85.1)(terser@5.43.1) + vite-node: 3.2.4(@types/node@20.19.17)(jiti@2.6.1)(sass-embedded@1.85.1)(terser@5.43.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 diff --git a/website/package.json b/website/package.json index b281ee70c..6adf3d8b3 100644 --- a/website/package.json +++ b/website/package.json @@ -8,8 +8,8 @@ "preview": "rspress preview" }, "dependencies": { - "@rspress/core": "2.0.0-beta.32", - "@callstack/rspress-preset": "~0.4.2" + "@rspress/core": "2.0.0-beta.34", + "@callstack/rspress-preset": "~0.4.3" }, "devDependencies": { "@types/node": "^20.18.0", diff --git a/website/rspress.config.ts b/website/rspress.config.ts index 6d617fd84..0d43f6996 100644 --- a/website/rspress.config.ts +++ b/website/rspress.config.ts @@ -11,8 +11,7 @@ export default withCallstackPreset( context: __dirname, docs: { title: 'Rock', - description: - 'Easy to adopt. Simple to scale. Built for flexibility from day one', + description: 'Easy to adopt. Simple to scale. Ship everywhere.', editUrl: 'https://github.com/callstack/rock/edit/main/website/src', icon: '/logo.svg', logoLight: '/logo-light.svg', diff --git a/website/src/_nav.json b/website/src/_nav.json index fdd664f87..467b9f213 100644 --- a/website/src/_nav.json +++ b/website/src/_nav.json @@ -1,7 +1,7 @@ [ { "text": "Docs", - "link": "/docs/getting-started/index", + "link": "/docs/introduction", "activeMatch": "^/docs/" } ] diff --git a/website/src/docs/_meta.json b/website/src/docs/_meta.json index dc4f6fb40..ee3cd024b 100644 --- a/website/src/docs/_meta.json +++ b/website/src/docs/_meta.json @@ -1,32 +1,32 @@ [ { - "type": "dir", - "name": "getting-started", - "label": "Getting Started" + "type": "file", + "name": "introduction", + "label": "Introduction" }, { "type": "file", - "name": "cli", - "label": "CLI" + "name": "prior-art", + "label": "Prior Art" }, { "type": "file", - "name": "configuration", - "label": "Configuration" + "name": "getting-started", + "label": "Getting Started" }, { "type": "dir", - "name": "github-actions", - "label": "GitHub Actions" + "name": "cli", + "label": "CLI" }, { "type": "dir", - "name": "brownfield", - "label": "Integration with Native Apps" + "name": "remote-cache", + "label": "Remote Cache" }, { - "type": "file", - "name": "acknowledgements", - "label": "Acknowledgements" + "type": "dir", + "name": "brownfield", + "label": "Integration with Native Apps" } ] diff --git a/website/src/docs/acknowledgements.md b/website/src/docs/acknowledgements.md deleted file mode 100644 index d49146db3..000000000 --- a/website/src/docs/acknowledgements.md +++ /dev/null @@ -1,19 +0,0 @@ -# Acknowledgements - -Rock wouldn’t exist without the work that came before it. We want to thank the teams who pushed forward ideas in React Native builds and developer tooling. Ideas that shaped how we think about speed, reliability, and what a truly modern build system should be. - -## RNX Kit - -The [@rnx-kit/build](https://github.com/microsoft/rnx-kit/blob/7bf2194df8d5b7978602139cad24db656c3c962d/incubator/build/README.md#L4) command was the initial inspiration for Rock’s remote build system. Our original idea was to enable React Native projects to build in the cloud and cache their results. As we learned, `rnx-kit` explored a different approach to scheduling builds, which led us down a separate path based on fingerprints. - -## Expo Fingerprint - -Expo’s work on [`@expo/fingerprint`](https://github.com/expo/expo/tree/4991b5e35ad90ef9e022ebd2854f4bf5d88dc50d/packages/%40expo/fingerprint) was foundational for Rock. It introduced the concept of tying a project’s native sources to a unique hash that identifies the resulting binary. That idea directly paved the way for Rock’s remote (and local) build cache, something that [Expo CLI also supports](https://docs.expo.dev/guides/cache-builds-remotely/). - -## React Native Community CLI - -The [React Native Community CLI](https://github.com/react-native-community/cli) has been a major source of inspiration for Rock’s design, especially since Rock’s founding team also spent years maintaining the CLI. Its configuration system, modular architecture, and clear run/build commands demonstrated what powerful yet extensible tooling could look like. Particularly for projects that need to support non-standard configurations and multiple platforms. - -## React Native Brownfield - -Callstack’s [React Native Brownfield](https://github.com/callstack/react-native-brownfield) project allowed us to deliver a holistic developer experience for native apps that adopt React Native incrementally. Together with packaging approach Callstack pioneered, it's foundational for Rock's Brownfield support. diff --git a/website/src/docs/brownfield/ios.mdx b/website/src/docs/brownfield/ios.mdx index 8f35d04e1..b220bbbda 100644 --- a/website/src/docs/brownfield/ios.mdx +++ b/website/src/docs/brownfield/ios.mdx @@ -157,8 +157,8 @@ error: underlying Objective-C module 'ReactBrownfield' not found // Add `window` property required by React Native window = UIWindow(frame: UIScreen.main.bounds) - // Create VC that calls your module by name - let reactNativeVC = ReactNativeViewController(moduleName: "Enterprise") + // Create VC that calls your module by name registered by `AppRegistry.registerComponent` of your React Native app + let reactNativeVC = ReactNativeViewController(moduleName: "ReactNativeApp") // Display the view as full window or anyhow you need window?.rootViewController = reactNativeVC diff --git a/website/src/docs/cli/_meta.json b/website/src/docs/cli/_meta.json new file mode 100644 index 000000000..da985a013 --- /dev/null +++ b/website/src/docs/cli/_meta.json @@ -0,0 +1 @@ +["introduction", "migrating-from-community-cli"] diff --git a/website/src/docs/cli.md b/website/src/docs/cli/introduction.md similarity index 92% rename from website/src/docs/cli.md rename to website/src/docs/cli/introduction.md index bc2cb7c0b..ddcf1cdb7 100644 --- a/website/src/docs/cli.md +++ b/website/src/docs/cli/introduction.md @@ -1,7 +1,11 @@ -# `rock` CLI +# Introduction The Rock CLI is a command-line tool that helps you develop, build, and run React Native applications. +We've created a new CLI from scratch with a focus on seamless migration from the Community CLI. Most projects can get started with our CLI in under 10 minutes. + +At its core is a modular configuration system that lets you customize capabilities through plugins and replaceable build chain components: bundlers, platforms, remote cache providers, and other helpers available as npm packages. + Basic usage: ```shell title="Terminal" @@ -10,6 +14,57 @@ npx rock [command] [options] ![](/cli.png) +## Key Features + +The CLI handles all essential build and deployment tasks: + +- Building and running APK/APP files on devices and simulators +- Creating builds for different variants and configurations +- Generating signed IPA and AAB archives for app stores +- Re-signing archives with fresh JS bundles +- Generating native project hashes for caching + +## Command Changes from Community CLI + +We've updated command names: + +- `run-android` → `run:android` +- `build-android` → `build:android` +- `run-ios` → `run:ios` +- `build-ios` → `build:ios` + +## Flag Changes + +We've standardized flag naming across platforms: + +Android: + +- `--mode` → `--variant` +- `--appId` → `--app-id` +- `--appIdSuffix` → `--app-id-suffix` + +iOS: + +- `--mode` → `--configuration` +- `--buildFolder` → `--build-folder` + +## Removed Flags + +We've simplified the interface by removing redundant flags: + +- `--interactive`/`-i` – CLI now prompts for input when needed +- `--list-devices` – Device selection is now automatic when no devices are connected + +## Remote Cache + +The CLI integrates with Rock's Remote Cache system to speed up builds by reusing cached native artifacts. When available, the CLI will automatically download and use cached builds (APK/AAB/APP/IPA) instead of rebuilding from scratch. + +Learn more about [Remote Cache & GitHub Actions](/docs/remote-cache/introduction). + +## Local Cache + +Regardless of the remote cache provider you use, the CLI will also cache builds (APK/AAB/APP/IPA) in your local cache (`.rock/` directory). If a cached build is found, it will be used instead of rebuilding from scratch. + ## Global Options The following options are available for all commands: @@ -166,7 +221,7 @@ The `run:ios` command runs your iOS app on a simulator or device. It follows thi 1. Build locally if `--local` flag is set 1. Otherwise, try to use a cached build from cache (in `.rock` folder) -The build cache is populated either by a local build or when downloaded frome remote storage with [`remoteCacheProvider`](./configuration.md#remote-cache-configuration). +The build cache is populated either by a local build or when downloaded frome remote storage with [`remoteCacheProvider`](../configuration.md#remote-cache-configuration). `run:ios` extends the functionality of `build:ios` with additional runtime options. @@ -205,7 +260,7 @@ The `build:android` command builds your Android app for emulators, devices, or d 1. Build locally if `--local` flag is set 1. Otherwise, try to use a cached build from cache (in `.rock` folder) -The build cache is populated either by a local build or when downloaded frome remote storage with [`remoteCacheProvider`](./configuration.md#remote-cache-configuration). +The build cache is populated either by a local build or when downloaded frome remote storage with [`remoteCacheProvider`](../configuration.md#remote-cache-configuration). | Option | Description | | :----------------------- | :-------------------------------------- | diff --git a/website/src/docs/getting-started/migrating-from-community-cli.mdx b/website/src/docs/cli/migrating-from-community-cli.mdx similarity index 99% rename from website/src/docs/getting-started/migrating-from-community-cli.mdx rename to website/src/docs/cli/migrating-from-community-cli.mdx index c11f717e6..edbe2ab12 100644 --- a/website/src/docs/getting-started/migrating-from-community-cli.mdx +++ b/website/src/docs/cli/migrating-from-community-cli.mdx @@ -172,4 +172,4 @@ If you prefer to do it manually or encounter any issues, follow the steps below. github-token: ${{ secrets.GITHUB_TOKEN }} ``` - For more setup options see [GitHub Actions configuration](../github-actions/configuration.md) + For more setup options see [GitHub Actions configuration](../remote-cache/configuration.md) diff --git a/website/src/docs/configuration.md b/website/src/docs/configuration.md index dd04dd9d7..a3586557b 100644 --- a/website/src/docs/configuration.md +++ b/website/src/docs/configuration.md @@ -512,7 +512,7 @@ async upload({ artifactName, uploadArtifactName }) { This `index.html` file will display an ad-hoc distribution web portal, allowing developers and testers to install apps on their provisioned devices by simply clicking "Install App". - Learn more about ad-hoc distribution and how it works with `remote-cache upload --ad-hoc` command [here](./cli#ad-hoc-distribution). + Learn more about ad-hoc distribution and how it works with `remote-cache upload --ad-hoc` command [here](./cli/introduction#ad-hoc-distribution). | Ad-hoc distribution web portal | Ad-hoc distribution web portal | | ------------------------------------ | ------------------------------------- | diff --git a/website/src/docs/getting-started.mdx b/website/src/docs/getting-started.mdx new file mode 100644 index 000000000..d4d53ccb4 --- /dev/null +++ b/website/src/docs/getting-started.mdx @@ -0,0 +1,62 @@ +import { PackageManagerTabs } from '@theme'; + +# Getting Started + +Choose your path based on your current situation: + +## New React Native Project + +:::info Consider Expo First +For **new projects**, we recommend starting with [Expo](https://expo.dev) for the best developer experience and similar remote caching capabilities. Use [this template](https://github.com/nkzw-tech/expo-app-template) for sensible defaults. Rock is designed for teams who have outgrown the Community CLI. +::: + +To create a new React Native project with Rock: + + + +The command will ask you to pick your preferred bundler and platforms. + +## Migrate from Community CLI + +If you have an existing React Native project using Community CLI: + + + +This will automatically detect your existing project and guide you through the migration process. + +:::warning Automatic Migration Issues? +If automatic migration doesn't work for your project, check the [detailed migration guide](/docs/cli/migrating-from-community-cli) for manual instructions. +::: + +## Add to Existing Native Project + +For iOS/Android teams wanting to add React Native to existing apps, see our [Brownfield documentation](/docs/brownfield/intro) for step-by-step instructions. + +## Usage + +Now that you have Rock configured, you should be able to use Metro's or Re.Pack's development server and bundle your application. + +### Running development server + +When developing your application, you'll need to run a dev server that will use a bundler like Metro or Re.Pack to bundle your JS and later serve it to an app running on a device or simulator. + +To start the development server, run: + + + +### Running the iOS app + +To build and run your app on an iOS simulator or device, run the `run:ios` command: + + + +### Running the Android app + +To build and run your app on an Android emulator or device, run the `run:android` command: + + + +## Next Steps + +- Learn about [CLI commands and features](/docs/cli/introduction) +- Set up [Remote Cache](/docs/remote-cache/introduction) diff --git a/website/src/docs/getting-started/_meta.json b/website/src/docs/getting-started/_meta.json deleted file mode 100644 index 4d727f155..000000000 --- a/website/src/docs/getting-started/_meta.json +++ /dev/null @@ -1 +0,0 @@ -["introduction", "migrating-from-community-cli", "index"] diff --git a/website/src/docs/getting-started/index.mdx b/website/src/docs/getting-started/index.mdx deleted file mode 100644 index a1d97038f..000000000 --- a/website/src/docs/getting-started/index.mdx +++ /dev/null @@ -1,45 +0,0 @@ -import { PackageManagerTabs } from '@theme'; - -# Quick start - -## Pre-requisites - -If you're already familiar with JavaScript, React and React Native, then you'll be able to get moving quickly! Otherwise, it's highly recommended to get yourself familiar with these topic and then come back here: - -- [React Native documentation](https://reactnative.dev/) - -## Installation - -To create a new React Native project with Rock, or migrate from React Native Community CLI, run: - - - -The command will ask you to pick your preferred bundler and platforms. - -:::warning Migrating from React Native Community CLI -In case you want to adopt Rock in existing project (which is a typical scenario), and automatic migrating with `npm create rock` didn't work, please check the [Migrating from Community CLI](/docs/getting-started/migrating-from-community-cli) page for manual instructions. -::: - -## Usage - -Now that you have Rock configured, you should be able to use Metro's or Re.Pack's development server and bundle your application. - -### Running development server - -When developing your application, you'll need to run a dev server that will use a bundler like Metro or Re.Pack to bundle your JS and later serve it to an app running on a device or simulator. - -To start the development server, run: - - - -### Running the iOS app - -To build and run your app on an iOS simulator or device, run the `run:ios` command: - - - -### Running the Android app - -To build and run your app on an Android emulator or device, run the `run:android` command: - - diff --git a/website/src/docs/getting-started/introduction.md b/website/src/docs/getting-started/introduction.md deleted file mode 100644 index ea7e65591..000000000 --- a/website/src/docs/getting-started/introduction.md +++ /dev/null @@ -1,131 +0,0 @@ -# Introduction - -Rock is a toolkit designed to accelerate React Native app development for enterprise teams. It provides a CLI and Remote Cache system to make your team's development workflow more efficient. - -:::info OK I want to try it! -If you feel like skipping this intro section and try it out in existing Community CLI project, head over to [Quick start](/docs/getting-started/index). -::: - -## Why We Exist - -On a daily basis at [Callstack](https://callstack.com/), we're serving clients that usually have large teams, building complex apps for years, accumulating tech debt, becoming slower and slower to iterate, where time is wasted on waiting for builds and onboarding web engineers into intricacies of mobile platforms. According to the [React Native Framework RFC](https://github.com/react-native-community/discussions-and-proposals/pull/759), almost all of these companies are building their own frameworks based on the Community CLI—they just don't open source them to make them available for everyone, and for good reasons. - -As maintainers of the Community CLI, we have quite the exposure to how this tool is used (and misused) in various projects. When we evaluated how our clients use it and what our developers are challenged with, we noticed that these companies encounter similar challenges that they address uniquely: - -- High build times with no reuse across CI jobs and dev team -- Months just to integrate a third-party cloud vendor -- A mixed tech stack that makes adding React Native quite a challenge - -We also have clients who: - -- Ship their products to 10+ platforms -- Have brownfield setups, embedding React Native in their native apps - -Using anything other than the Community CLI is not an option for them currently. - -**We exist to serve all these needs.** - -## Our Principles - -We build the framework with a clear focus: to serve large teams and complex apps. These projects require flexibility, the ability to host everything on their own, deploy to as many platforms as possible, and decrease onboarding time. That's why our engineering design choices focus on: - -- **Modular design**—add your supported platforms and plugins, and integrate existing tools; you can build around our framework -- **Self-hosting**—use your own infrastructure without relying on third-party cloud vendors; whether you're using GitHub Actions or Amazon S3 and BitBucket, we got you covered. -- **Incremental adoption**—easily migrate from Community CLI or an existing native app. - -## The CLI - -We've created a new CLI from scratch with a focus on seamless migration from the Community CLI. Most projects can replace their local build and run experience with our CLI in under 10 minutes. - -Its core part is modular configuration mechanism allowing for customizing the capabilities to your needs through a system of plugins and replaceable parts of the build chain, such as: bundler, platforms, remote cache provider, or helpers exposed through variety of npm packages. - -:::info Developer Experience -For the best DX we focus on our CLI to be entrypoint to that system. In the future we imagine you can interact with it through other tools, like Shopify's Tophat, AI agent, or a custom CLI you already have and control. -::: - -### Key Features - -The CLI handles all essential build and deployment tasks: - -- Building and running APK/APP files on devices and simulators -- Creating builds for different variants and configurations -- Generating signed IPA and AAB archives for app stores -- Re-signing archives with fresh JS bundles -- Generating native project hashes for caching - -### Command Changes from Community CLI - -We've updated command names: - -- `run-android` → `run:android` -- `build-android` → `build:android` -- `run-ios` → `run:ios` -- `build-ios` → `build:ios` - -For a complete list of new commands, visit the [CLI page](/docs/cli/index). - -### Flag Changes - -We've standardized flag naming across platforms: - -Android: - -- `--mode` → `--variant` -- `--appId` → `--app-id` -- `--appIdSuffix` → `--app-id-suffix` - -iOS: - -- `--mode` → `--configuration` -- `--buildFolder` → `--build-folder` - -### Removed Flags - -We've simplified the interface by removing redundant flags: - -- `--interactive`/`-i` – CLI now prompts for input when needed -- `--list-devices` – Device selection is now automatic when no devices are connected - -## The Remote Cache - -The Remote Cache is an optional but powerful feature that speeds up your development workflow. It acts as a centralized storage for native app builds that can be retrieved either manually or through our CLI. The cache can be hosted on various platforms: - -- GitHub Actions -- Amazon S3 -- Cloudflare R2 -- Custom providers - -:::note -Out of the box we support storing artifacts on GitHub Actions and we're working on more providers. -::: - -### How It Works - -1. For each build, we calculate a unique hash (fingerprint) that represents your project's native state -2. This hash remains stable across builds unless you: - - Modify native files - - Change dependencies with native code - - Update scripts in package.json -3. When you make JavaScript-only changes, the hash stays the same -4. The CLI checks for matching builds in: - - Local cache (`.rock/` directory) - - Remote storage - - Falls back to local build if no match is found - -![How CLI works with remote cache](/cli-remote-cache.png) - -### GitHub Actions Integration - -We provide a set of reusable GitHub Actions that handle: - -- Build hash calculation -- iOS/Android builds for: - - Developers (simulator/emulator builds – APK, APP) - - Testers (device builds – APK, IPA) -- Artifact management (upload/download) -- Code signing: - - iOS: certificates and provisioning profiles (IPA) - - Android: keystore (AAB) -- Automatic re-signing of builds with fresh JS bundles on PR updates - -Learn more about [GitHub Actions configuration](/docs/github-actions/configuration). diff --git a/website/src/docs/introduction.md b/website/src/docs/introduction.md new file mode 100644 index 000000000..6a98930c5 --- /dev/null +++ b/website/src/docs/introduction.md @@ -0,0 +1,42 @@ +# Introduction + +Rock is a modular toolkit for teams building React Native apps. It helps improve build times and developer experience while fitting into your existing workflows and infrastructure. + +:::tip Ready to get started? +Choose your path: [Getting Started →](/docs/getting-started) +::: + +## Who should use Rock + +Rock is built for two kinds of teams: + +- **Existing React Native teams using Community CLI** who want to improve build times and developer experience while fitting into your existing workflows and infrastructure. +- **iOS/Android native teams** planning to incorporate React Native without disrupting existing workflows: Rock Brownfield lets you add your whole React Native app like any other dependency. + +:::info New to React Native and building app from scratch? +For **new projects that aren't brownfield**, consider starting with [Expo](https://expo.dev) for the best developer experience and similar remote caching capabilities. We recommend using [this template](https://github.com/nkzw-tech/expo-app-template) for sensible defaults. Rock is designed for teams who have outgrown the Community CLI. +::: + +Both types of teams will benefit from Rock's cross‑platform reach: iOS and Android by default, with a flexible architecture that extends to TVs, macOS, Windows, and HarmonyOS (coming soon). + +## Why We Exist + +At [Callstack](https://callstack.com/), we work with large teams building complex React Native apps. As maintainers of the Community CLI, we have quite the exposure to how this tool is used in various projects. These teams face similar challenges: + +- **Build times** – No reuse of builds across CI jobs and development teams +- **Infrastructure control** – Need to host everything on their own infrastructure +- **Platform diversity** – Shipping to 10+ platforms beyond iOS and Android +- **Brownfield integration** – Embedding React Native in existing native apps +- **Tech stack complexity** – Adding React Native to mixed technology environments + +According to the [React Native Framework RFC](https://github.com/react-native-community/discussions-and-proposals/pull/759), many companies build custom frameworks on top of Community CLI to address these needs, but most keep them internal. + +**Rock exists to provide a modular, production-ready solution that serves these needs out of the box.** + +## Our Principles + +Rock is built on three core principles: + +- **Modular design** — add your supported platforms and plugins, and integrate existing tools; you can build around our framework +- **Self-hosting** — use your own infrastructure; whether you're using GitHub Actions or Amazon S3 and BitBucket, we got you covered +- **Incremental adoption** — easily migrate from Community CLI or add to an existing native app, at your own pace diff --git a/website/src/docs/prior-art.md b/website/src/docs/prior-art.md new file mode 100644 index 000000000..01d38efe8 --- /dev/null +++ b/website/src/docs/prior-art.md @@ -0,0 +1,19 @@ +# Prior Art + +Rock wouldn’t exist without the work that came before it. We want to thank the teams who pushed forward ideas in React Native builds and developer tooling. Ideas that shaped how we think about speed, reliability, and what a truly modern build system should be. + +## Expo Fingerprint and Remote Cache + +Expo's [`@expo/fingerprint`](https://github.com/expo/expo/tree/4991b5e35ad90ef9e022ebd2854f4bf5d88dc50d/packages/%40expo/fingerprint) introduced the concept of tying a project's native sources to a unique hash that identifies the resulting binary. Rock's remote and local build cache builds on this idea. Expo's [Fingerprint and Remote Cache implementation with GitHub Actions](https://expo.dev/blog/expo-fingerprint-github-actions) shows how this works in CI/CD pipelines. + +## RNX Kit + +[RNX Kit](https://github.com/microsoft/rnx-kit) is Microsoft's collection of React Native tooling that includes dependency management, native builds, and better bundling. Their approach to purpose-built tools that address the complexity of React Native engineering and the fast-changing ecosystem influenced our thinking about comprehensive developer tooling. + +## Expo CLI + +[Expo CLI](https://docs.expo.dev/more/expo-cli/) provide cloud builds and local development tools. We like their developer experience and how they make everything work together, bringing often complex packages and libraries together seamlessly. + +## React Native Community CLI + +The [React Native Community CLI](https://github.com/react-native-community/cli) influenced Rock's design, especially since Rock's founding team maintained the CLI. Its configuration system, modular architecture, and run/build commands inform Rock's approach to extensible tooling that supports non-standard configurations and multiple platforms. diff --git a/website/src/docs/github-actions/_meta.json b/website/src/docs/remote-cache/_meta.json similarity index 75% rename from website/src/docs/github-actions/_meta.json rename to website/src/docs/remote-cache/_meta.json index 74cfef0c0..0fd108cda 100644 --- a/website/src/docs/github-actions/_meta.json +++ b/website/src/docs/remote-cache/_meta.json @@ -1,4 +1,9 @@ [ + { + "name": "introduction", + "type": "file", + "label": "Introduction" + }, { "name": "configuration", "type": "file", diff --git a/website/src/docs/github-actions/android.md b/website/src/docs/remote-cache/android.md similarity index 100% rename from website/src/docs/github-actions/android.md rename to website/src/docs/remote-cache/android.md diff --git a/website/src/docs/github-actions/configuration.md b/website/src/docs/remote-cache/configuration.md similarity index 100% rename from website/src/docs/github-actions/configuration.md rename to website/src/docs/remote-cache/configuration.md diff --git a/website/src/docs/remote-cache/introduction.md b/website/src/docs/remote-cache/introduction.md new file mode 100644 index 000000000..c00550596 --- /dev/null +++ b/website/src/docs/remote-cache/introduction.md @@ -0,0 +1,37 @@ +# Remote Cache + +Remote Cache is a feature that speeds up your development workflow by centralizing storage for native app builds. These builds can be retrieved either manually or through our CLI, dramatically reducing build times across your team. + +## What is Remote Cache? + +The Remote Cache acts as a centralized storage for native app builds that can be hosted on various platforms: + +- GitHub Actions +- Amazon S3 +- Cloudflare R2 +- Custom providers + +## Ready-to-Use Actions + +Rock ships with ready-to-use GitHub Actions: + +- [`callstackincubator/ios`](https://github.com/callstackincubator/ios) - iOS builds and caching +- [`callstackincubator/android`](https://github.com/callstackincubator/android) - Android builds and caching + +These actions automatically store native artifacts that can be reused across CI jobs and your local development environment through the Rock CLI. + +## How It Works + +1. For each build, we calculate a unique hash (fingerprint) that represents your project's native state +2. This hash remains stable across builds unless you: + - Modify native files + - Change dependencies with native code + - Update scripts in package.json +3. When you make JavaScript-only changes, the hash stays the same +4. The CLI checks for matching builds in: + - Local cache (`.rock/` directory) + - Remote storage + - Falls back to local build if no match is found + +![How CLI works with remote cache](/cli-remote-cache.png) + diff --git a/website/src/docs/github-actions/ios.md b/website/src/docs/remote-cache/ios.md similarity index 100% rename from website/src/docs/github-actions/ios.md rename to website/src/docs/remote-cache/ios.md diff --git a/website/src/index.md b/website/src/index.md index 54b6f1363..571a808ad 100644 --- a/website/src/index.md +++ b/website/src/index.md @@ -7,32 +7,32 @@ hero: light: /logo-light.svg dark: /logo-dark.svg alt: Rock logo - name: React Native framework for Enterprise scale - tagline: Easy to adopt. Simple to scale. Built for flexibility from day one + name: Build faster, ship everywhere + tagline: Rock is a modular toolkit for teams building React Native apps. It helps improve build times and developer experience while fitting into your existing workflows and infrastructure. actions: - theme: brand text: Learn more - link: /docs/getting-started/introduction + link: /docs/introduction - theme: alt - text: Quick start - link: /docs/getting-started/index + text: Get Started + link: /docs/getting-started features: - - title: Brand New CLI - details: A familiar CLI experience with end-to-end development, and build workflows. Get started in minutes - icon: - - title: Reusable Cloud Builds - details: Reliable caching of native artifacts (APK, IPA) which you can store where you like, or use our out-of-the-box integrations with GitHub, S3, and R2 + - title: Remote build cache + details: Save up to 96% of build time by reusing native artifacts (APK, AAB, APP, IPA) across machines and CI. Use built‑in integrations for GitHub, S3, and R2 or bring your own storage. icon: - - title: GitHub Action - details: All the logic for downloading, uploading and building native build artifacts for iOS (APP, IPA) and Android (APK, AAB) - icon: - - title: Plug-n-Play Brownfield - details: Package your React Native app as a framework and add to your iOS and Android apps as you would any other library + - title: Brownfield ready + details: Add React Native to existing iOS and Android apps using Rock Brownfield and use it as any other library. icon: - - title: Bundler of Choice - details: Rock supports both Metro and Re.Pack to bundle JS. With Re.Pack you can build Super Apps and Mobile Microfrontends - icon: - - title: Plugins - details: Built in a modular way, Rock allows you to extend its capabilities via plugins that integrate with CLI and native templates + - title: Modular & extensible + details: A plugin‑driven architecture that lets you customize platforms, bundlers, cache providers, and more. icon: + - title: Cross‑platform ready + details: iOS and Android by default; designed to extend to TVs, macOS, and Windows (coming soon). + icon: + - title: Easy Community CLI migration + details: A familiar CLI that helps you develop, run, and build your app. Integrates with Remote Build Cache. Migrate from Community CLI in minutes. + icon: + - title: Bundler of choice + details: Rock supports both Metro and Re.Pack to bundle JS. With Re.Pack you can build Super Apps and Mobile Microfrontends. + icon: --- diff --git a/website/src/public/cli.png b/website/src/public/cli.png index c5e16eb07..1635adf88 100644 Binary files a/website/src/public/cli.png and b/website/src/public/cli.png differ diff --git a/website/src/public/github.svg b/website/src/public/github.svg deleted file mode 100644 index 9b6a99b16..000000000 --- a/website/src/public/github.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/website/src/public/layout-columns.svg b/website/src/public/layout-columns.svg new file mode 100644 index 000000000..51294af99 --- /dev/null +++ b/website/src/public/layout-columns.svg @@ -0,0 +1,3 @@ + + + diff --git a/website/theme/fonts/alliance-no-2-medium.ttf b/website/theme/fonts/alliance-no-2-medium.ttf deleted file mode 100644 index 27a762cef..000000000 Binary files a/website/theme/fonts/alliance-no-2-medium.ttf and /dev/null differ diff --git a/website/theme/fonts/alliance-no-2-regular.ttf b/website/theme/fonts/alliance-no-2-regular.ttf deleted file mode 100644 index 0cb436a80..000000000 Binary files a/website/theme/fonts/alliance-no-2-regular.ttf and /dev/null differ diff --git a/website/theme/styles.css b/website/theme/styles.css index 75a6d071c..e69de29bb 100644 --- a/website/theme/styles.css +++ b/website/theme/styles.css @@ -1,15 +0,0 @@ -@font-face { - font-family: 'Alliance No. 2'; - font-style: normal; - font-weight: 400; - font-display: block; - src: url('./fonts/alliance-no-2-regular.ttf') format('truetype'); -} - -@font-face { - font-family: 'Alliance No. 2'; - font-style: normal; - font-weight: 500; - font-display: block; - src: url('./fonts/alliance-no-2-medium.ttf') format('truetype'); -}