Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
7bbee0e
add core-types package to separate types from implementations
JasonVMo Feb 10, 2026
0b12594
move types to core-types package from config
JasonVMo Feb 10, 2026
d10dd71
consume the config types from the core-types package
JasonVMo Feb 10, 2026
6752fdf
consume types from @rnx-kit/core-types package
JasonVMo Feb 10, 2026
0408a2c
update README.md for core-types package
JasonVMo Feb 10, 2026
b5f0f68
docs(changeset): Move core configuration, manifest, and platform type…
JasonVMo Feb 10, 2026
185f6b2
update readme files from changed packages
JasonVMo Feb 11, 2026
fa5e37b
split core-types into bundle-types, config-types, and node-types
JasonVMo Feb 11, 2026
9437f72
docs(changeset):
JasonVMo Feb 11, 2026
b70708a
docs(changeset): Split out types for bundling, kit configuration, and…
JasonVMo Feb 11, 2026
af49925
update readme files for packages
JasonVMo Feb 11, 2026
3bc1271
formatting changes for README.md files
JasonVMo Feb 11, 2026
a60d6af
fix metadata inconsistency
JasonVMo Feb 11, 2026
df62c24
add test files to knip files for tools-typescript
JasonVMo Feb 11, 2026
216fecb
remove auto-readme generation from tools-node and tools-react-native …
JasonVMo Feb 12, 2026
dd3859b
rename type packages and split plugin types into separate package
JasonVMo Feb 12, 2026
757de7f
docs(changeset): Create dedicated type packages for rnx-kit configura…
JasonVMo Feb 12, 2026
a60387b
remove some stray files and references from renaming and splitting
JasonVMo Feb 12, 2026
e1f72ba
remove redundant comment
JasonVMo Feb 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .changeset/breezy-poets-join.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
"@rnx-kit/types-bundle-plugin-options": major
"@rnx-kit/types-bundle-config": major
"@rnx-kit/types-kit-config": major
"@rnx-kit/types-node": major
---

Create dedicated type packages for rnx-kit configuration and core node types
17 changes: 17 additions & 0 deletions .changeset/curly-pans-camp.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
---
"@rnx-kit/metro-plugin-cyclic-dependencies-detector": patch
"@rnx-kit/metro-plugin-duplicates-checker": patch
"@rnx-kit/metro-serializer-esbuild": patch
"@rnx-kit/metro-plugin-typescript": patch
"@rnx-kit/tools-react-native": patch
"@rnx-kit/tools-typescript": patch
"@rnx-kit/lint-lockfile": patch
"@rnx-kit/tools-packages": patch
"@rnx-kit/align-deps": patch
"@rnx-kit/tools-node": patch
"@rnx-kit/config": patch
"@rnx-kit/cli": patch
---

Split out types for bundling, kit configuration, and package manifests into
dedicated packages"
2 changes: 2 additions & 0 deletions .changeset/lucky-peas-cheer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
---
---
108 changes: 108 additions & 0 deletions CLAUDE.md
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be a separate PR. Let's not scope creep.

Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
# CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

## Project Overview

`rnx-kit` is a monorepo of React Native tooling created by Microsoft. It provides battle-tested tools for dependency management, Metro bundling enhancements, TypeScript integration, and cross-platform development (iOS, Android, macOS, Windows).

## Repository Structure

- **`packages/`** - Stable, published packages (e.g., `@rnx-kit/cli`, `@rnx-kit/align-deps`, `@rnx-kit/metro-*`)
- **`incubator/`** - Experimental packages (marked with `"experimental": true` in package.json)
- **`scripts/`** - Internal build tooling (`rnx-kit-scripts` CLI)
- **`docsite/`** - Documentation website (separate Yarn workspace)

## Build System

Uses **Nx** for task orchestration with **Yarn Berry** workspaces.

### Key Commands (Repository Root)

```sh
yarn # Install dependencies
yarn build # Build all packages
yarn build-scope <pkg> # Build specific package with dependencies (e.g., yarn build-scope @rnx-kit/cli)
yarn test # Build and test all packages
yarn lint # Lint all packages
yarn format # Format all packages with Prettier
yarn clean # Clean build artifacts (git clean)
```

### Package-Level Commands

```sh
yarn build # Build current package only
yarn build --dependencies # Build current package and its dependencies
yarn test # Run tests (Jest or Node test runner)
yarn lint # Lint current package
yarn format # Format current package
```

### Running Tests

- Most packages use Jest with `@rnx-kit/jest-preset`
- Run specific test: `yarn test path/to/file.test.ts` (from package directory)
- Tests are in `test/` directories with `.test.ts` extension

### CI Commands

```sh
yarn build:ci # Build affected packages
yarn bundle:ci # Bundle affected packages
yarn change:check # Verify change files exist for modified packages
```

## Package Conventions

- Each package uses `rnx-kit-scripts` for build/test/lint commands
- TypeScript source in `src/`, compiled output in `lib/`
- Standard dev dependencies: `@rnx-kit/eslint-config`, `@rnx-kit/jest-preset`, `@rnx-kit/scripts`, `@rnx-kit/tsconfig`
- Entry point typically at `src/index.ts`

## Creating New Packages

```sh
yarn new-package <name> # Creates in packages/
yarn new-package <name> --experimental # Creates in incubator/
```

Uses `packages/template` as baseline.

## Change Management

Uses [Changesets](https://github.com/atlassian/changesets) for versioning:

```sh
yarn change # Create change file for PR
```

One change file per feature/fix; no need for multiple entries when addressing PR feedback.

## Key Packages

- **`@rnx-kit/cli`** - Main CLI (`rnx-cli`) integrating all tools
- **`@rnx-kit/align-deps`** - Dependency version alignment across repos
- **`@rnx-kit/metro-*`** - Metro bundler plugins (TypeScript, tree-shaking, duplicate detection)
- **`@rnx-kit/tools-*`** - Platform-specific utilities (android, apple, node, react-native)
- **`@rnx-kit/config`** - Configuration loading from `package.json` `rnx-kit` field

## Dependency Alignment

The repo uses `align-deps` to maintain consistent dependency versions. Run from root:

```sh
yarn rnx-align-deps --write # Fix misaligned dependencies
```

## Platform-Specific Notes

- **Test apps**: `packages/test-app` (iOS/Android), `packages/test-app-macos`, `packages/test-app-windows`
- Native builds require platform toolchains (Xcode, Android Studio, Visual Studio)
- Pod installation: `yarn install-pods` from test-app directories

## Code Style

- Prettier for formatting, ESLint for linting
- Run `yarn format` and `yarn lint` before committing
- Configuration in `.github/prettierrc.json` and `packages/eslint-config/`
1 change: 1 addition & 0 deletions incubator/lint-lockfile/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
"dependencies": {
"@rnx-kit/config": "^0.7.4",
"@rnx-kit/tools-workspaces": "^0.2.3",
"@rnx-kit/types-kit-config": "^0.0.1",
"js-yaml": "^4.1.1"
},
"devDependencies": {
Expand Down
2 changes: 1 addition & 1 deletion incubator/lint-lockfile/src/rules/noDuplicates.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { NoDuplicatesRuleOptions as Options } from "@rnx-kit/config/lint.types";
import type { NoDuplicatesRuleOptions as Options } from "@rnx-kit/types-kit-config";
import type { Rule } from "../types.ts";

type PackageCount = Record<string, number | undefined>;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { NoWorkspacePackageFromNpmRuleOptions as Options } from "@rnx-kit/config/lint.types";
import type { NoWorkspacePackageFromNpmRuleOptions as Options } from "@rnx-kit/types-kit-config";
import type { Rule } from "../types.ts";

export function noWorkspacePackageFromNpmRule(
Expand Down
5 changes: 4 additions & 1 deletion incubator/tools-typescript/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,13 +43,16 @@
"@rnx-kit/tools-node": "^3.0.3",
"@rnx-kit/tools-packages": "^0.1.1",
"@rnx-kit/tools-react-native": "^2.3.2",
"@rnx-kit/types-bundle-config": "^0.0.1",
"@rnx-kit/typescript-service": "^2.0.0"
},
"devDependencies": {
"@rnx-kit/eslint-config": "*",
"@rnx-kit/jest-preset": "*",
"@rnx-kit/scripts": "*",
"@rnx-kit/tsconfig": "*"
"@rnx-kit/tsconfig": "*",
"@rnx-kit/types-kit-config": "^0.0.1",
"@rnx-kit/types-node": "^0.0.1"
Comment on lines +54 to +55
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For dev dependencies, we should use * for now until we figure out a way to use workspace:*

Suggested change
"@rnx-kit/types-kit-config": "^0.0.1",
"@rnx-kit/types-node": "^0.0.1"
"@rnx-kit/types-kit-config": "*",
"@rnx-kit/types-node": "*"

},
"peerDependencies": {
"typescript": ">=4.7.0"
Expand Down
2 changes: 1 addition & 1 deletion incubator/tools-typescript/src/build.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { findPackageInfo } from "@rnx-kit/tools-packages";
import type { AllPlatforms } from "@rnx-kit/tools-react-native";
import type { AllPlatforms } from "@rnx-kit/types-bundle-config";
import ts from "typescript";
import { loadPackagePlatformInfo } from "./platforms.ts";
import { createReporter } from "./reporter.ts";
Expand Down
6 changes: 2 additions & 4 deletions incubator/tools-typescript/src/platforms.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
import {
getKitConfigFromPackageManifest,
type KitConfig,
} from "@rnx-kit/config";
import { getKitConfigFromPackageManifest } from "@rnx-kit/config";
import type { PackageInfo } from "@rnx-kit/tools-packages";
import {
getAvailablePlatforms,
platformExtensions,
} from "@rnx-kit/tools-react-native";
import type { KitConfig } from "@rnx-kit/types-kit-config";
import path from "node:path";
import type ts from "typescript";
import type {
Expand Down
2 changes: 1 addition & 1 deletion incubator/tools-typescript/src/types.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { AllPlatforms } from "@rnx-kit/tools-react-native/platform";
import type { AllPlatforms } from "@rnx-kit/types-bundle-config";
import type ts from "typescript";

/**
Expand Down
4 changes: 2 additions & 2 deletions incubator/tools-typescript/test/platforms.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { KitConfig } from "@rnx-kit/config";
import type { PackageManifest } from "@rnx-kit/tools-node";
import type { PackageInfo } from "@rnx-kit/tools-packages";
import type { KitConfig } from "@rnx-kit/types-kit-config";
import type { PackageManifest } from "@rnx-kit/types-node";
import type ts from "typescript";
import {
isBestMatch,
Expand Down
6 changes: 6 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,12 @@
]
},
"incubator/react-native-test-app-msal": {},
"incubator/tools-typescript": {
"entry": [
"src/index.ts",
"test/**/*.test.ts"
]
},
"incubator/yarn-plugin-dynamic-extensions": {
"entry": [
"*.js"
Expand Down
4 changes: 4 additions & 0 deletions packages/align-deps/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@
"update-profile": "node --no-warnings --conditions=typescript scripts/update-profile.ts",
"update-readme": "node --no-warnings --conditions=typescript scripts/update-readme.ts"
},
"dependencies": {
"@rnx-kit/types-kit-config": "^0.0.1",
"@rnx-kit/types-node": "^0.0.1"
},
"devDependencies": {
"@octokit/core": "^7.0.0",
"@octokit/plugin-rest-endpoint-methods": "^17.0.0",
Expand Down
4 changes: 2 additions & 2 deletions packages/align-deps/src/capabilities.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type { Capability } from "@rnx-kit/config";
import { warn } from "@rnx-kit/console";
import { keysOf } from "@rnx-kit/tools-language/properties";
import type { PackageManifest } from "@rnx-kit/tools-node/package";
import type { Capability } from "@rnx-kit/types-kit-config";
import type { PackageManifest } from "@rnx-kit/types-node";
import type { MetaPackage, Package, Preset, Profile } from "./types.ts";

type ResolvedDependencies = {
Expand Down
4 changes: 2 additions & 2 deletions packages/align-deps/src/commands/initialize.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type { KitType } from "@rnx-kit/config";
import { error } from "@rnx-kit/console";
import type { PackageManifest } from "@rnx-kit/tools-node/package";
import { readPackage } from "@rnx-kit/tools-node/package";
import type { KitType } from "@rnx-kit/types-kit-config";
import type { PackageManifest } from "@rnx-kit/types-node";
import * as path from "node:path";
import semverMinVersion from "semver/ranges/min-version.js";
import { capabilitiesFor } from "../capabilities.ts";
Expand Down
8 changes: 4 additions & 4 deletions packages/align-deps/src/commands/setVersion.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { keysOf } from "@rnx-kit/tools-language/properties";
import type { PackageManifest } from "@rnx-kit/tools-node/package";
import type { PackageManifest } from "@rnx-kit/types-node";
import * as nodefs from "node:fs";
import prompts from "prompts";
import semverCoerce from "semver/functions/coerce.js";
Expand All @@ -9,7 +9,7 @@ import { isError } from "../errors.ts";
import { isString, modifyManifest } from "../helpers.ts";
import { preset as defaultPreset } from "../presets/microsoft/react-native.ts";
import type {
AlignDepsConfig,
AlignDepsOptions,
Command,
LegacyCheckConfig,
Options,
Expand Down Expand Up @@ -89,7 +89,7 @@ function setRequirement(requirements: string[], versionRange: string): void {
}

function updateRequirements(
{ requirements }: AlignDepsConfig["alignDeps"],
{ requirements }: AlignDepsOptions["alignDeps"],
prodVersion: string,
devVersion = prodVersion
): void {
Expand All @@ -109,7 +109,7 @@ function updateRequirements(
* @returns Updated package manifest
*/
function setVersion(
config: AlignDepsConfig | LegacyCheckConfig,
config: AlignDepsOptions | LegacyCheckConfig,
targetVersion: string,
supportedVersions: string[]
): PackageManifest {
Expand Down
10 changes: 5 additions & 5 deletions packages/align-deps/src/commands/vigilant.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type { Capability, KitConfig } from "@rnx-kit/config";
import { error, warn } from "@rnx-kit/console";
import { keysOf } from "@rnx-kit/tools-language/properties";
import type { PackageManifest } from "@rnx-kit/tools-node/package";
import type { Capability, KitConfig } from "@rnx-kit/types-kit-config";
import type { PackageManifest } from "@rnx-kit/types-node";
import * as nodefs from "node:fs";
import * as path from "node:path";
import semverSubset from "semver/ranges/subset.js";
Expand All @@ -15,7 +15,7 @@ import { dependencySections, modifyManifest } from "../helpers.ts";
import { updateDependencies } from "../manifest.ts";
import { ensurePreset, filterPreset, mergePresets } from "../preset.ts";
import type {
AlignDepsConfig,
AlignDepsOptions,
Changes,
ErrorCode,
ManifestProfile,
Expand Down Expand Up @@ -84,7 +84,7 @@ function resolveUnmanagedCapabilities(
*/
export function buildManifestProfile(
manifestPath: string,
{ kitType, alignDeps }: AlignDepsConfig
{ kitType, alignDeps }: AlignDepsOptions
): ManifestProfile {
const mergedPresets = mergePresets(
alignDeps.presets,
Expand Down Expand Up @@ -291,7 +291,7 @@ export function inspect(
export function checkPackageManifestUnconfigured(
manifestPath: string,
options: Options,
config: AlignDepsConfig,
config: AlignDepsOptions,
logError = error,
/** @internal */ fs = nodefs
): ErrorCode {
Expand Down
10 changes: 5 additions & 5 deletions packages/align-deps/src/compatibility/config.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import type { KitConfig } from "@rnx-kit/config";
import { warn } from "@rnx-kit/console";
import type { KitConfig } from "@rnx-kit/types-kit-config";
import { defaultConfig } from "../config.ts";
import { dropPatchFromVersion, modifyManifest } from "../helpers.ts";
import type { AlignDepsConfig, LegacyCheckConfig, Options } from "../types.ts";
import type { AlignDepsOptions, LegacyCheckConfig, Options } from "../types.ts";

const legacyKeys = [
"capabilities",
Expand Down Expand Up @@ -31,7 +31,7 @@ export function transformConfig({
manifest,
reactNativeDevVersion,
reactNativeVersion,
}: LegacyCheckConfig): AlignDepsConfig {
}: LegacyCheckConfig): AlignDepsOptions {
const devVersion = dropPatchFromVersion(
reactNativeDevVersion || reactNativeVersion
);
Expand Down Expand Up @@ -68,10 +68,10 @@ export function transformConfig({
* @returns The config in the new schema
*/
export function migrateConfig(
config: AlignDepsConfig | LegacyCheckConfig,
config: AlignDepsOptions | LegacyCheckConfig,
manifestPath: string,
{ migrateConfig }: Options
): AlignDepsConfig {
): AlignDepsOptions {
if ("alignDeps" in config) {
const oldKeys = findLegacyConfigKeys(config);
if (oldKeys.length > 0) {
Expand Down
10 changes: 5 additions & 5 deletions packages/align-deps/src/config.ts
Original file line number Diff line number Diff line change
@@ -1,26 +1,26 @@
import type { Capability, KitConfig } from "@rnx-kit/config";
import {
getKitCapabilities,
getKitConfigFromPackageManifest,
} from "@rnx-kit/config";
import { error, warn } from "@rnx-kit/console";
import type { PackageManifest } from "@rnx-kit/tools-node/package";
import { readPackage } from "@rnx-kit/tools-node/package";
import type { Capability, KitConfig } from "@rnx-kit/types-kit-config";
import type { PackageManifest } from "@rnx-kit/types-node";
import * as nodefs from "node:fs";
import * as path from "node:path";
import { findBadPackages } from "./findBadPackages.ts";
import type {
AlignDepsConfig,
AlignDepsOptions,
ErrorCode,
LegacyCheckConfig,
Options,
} from "./types.ts";

export type ConfigResult = AlignDepsConfig | LegacyCheckConfig | ErrorCode;
export type ConfigResult = AlignDepsOptions | LegacyCheckConfig | ErrorCode;

const ILLEGAL_CAPABILITIES = ["__proto__", "constructor", "prototype"];

export const defaultConfig: AlignDepsConfig["alignDeps"] = {
export const defaultConfig: AlignDepsOptions["alignDeps"] = {
presets: ["microsoft/react-native"],
requirements: [],
capabilities: [],
Expand Down
Loading
Loading