Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
1bdb6f5
refactor: make change authoring workflow generic, use by reference
mikehardy Jun 26, 2026
0f57cde
docs: namespaced API removal design and work queue
mikehardy Jun 26, 2026
de67dc2
refactor(ml): remove deprecated namespace APIs
mikehardy Jun 26, 2026
6eefc2e
refactor(in-app-messaging): remove deprecated namespaced API
mikehardy Jun 26, 2026
a7a722a
refactor(installations): remove deprecated namespaced API
mikehardy Jun 26, 2026
1420881
refactor(messaging): remove deprecated namespaced API
mikehardy Jun 27, 2026
76b8bd2
refactor(app-distribution): remove deprecated namespaced API
mikehardy Jun 27, 2026
b95914c
refactor(functions): remove deprecated namespaced API
mikehardy Jun 27, 2026
7cb53b9
refactor(perf): remove deprecated namespaced API
mikehardy Jun 27, 2026
b350d17
refactor(app-check): remove deprecated namespaced API
mikehardy Jun 27, 2026
318b189
refactor(crashlytics): remove deprecated namespaced API
mikehardy Jun 27, 2026
22815eb
refactor(database): remove deprecated namespaced API
mikehardy Jun 27, 2026
d1f7cd0
refactor(storage): remove deprecated namespaced API
mikehardy Jun 27, 2026
5e8ba98
refactor(remote-config): remove deprecated namespaced API
mikehardy Jun 27, 2026
921e60c
docs: add multi-platform req on review gate in workflow
mikehardy Jun 27, 2026
df76563
docs: refactor / de-dupe / de-conflict okf-bundle
mikehardy Jun 27, 2026
33333a9
refactor(analytics): remove deprecated namespaced API
mikehardy Jun 27, 2026
aa9aeab
docs(testing): add agent command policy and wire OKF
mikehardy Jun 27, 2026
d763211
refactor(auth): remove deprecated namespaced API
mikehardy Jun 27, 2026
885f7a5
refactor(firestore): remove deprecated namespaced API
mikehardy Jun 27, 2026
a32545d
docs: add lint checks to workflow handoff gates
mikehardy Jun 28, 2026
f8c2801
docs(ml,installations,in-app-messaging): document SDK_VERSION export
mikehardy Jun 28, 2026
871e6fe
fix(database): align public types with firebase-js-sdk declarations
mikehardy Jun 28, 2026
9257f4d
refactor(app): expose modular getUtils and FilePath for utils
mikehardy Jun 28, 2026
7db154c
refactor(database): remove internal deprecation proxy plumbing
mikehardy Jun 28, 2026
91f61e7
refactor(app): remove namespaced root and deprecation machinery
mikehardy Jun 28, 2026
01ef911
refactor(phone-number-verification): inline modular entry into index
mikehardy Jun 28, 2026
f3d76ac
docs: update namespace removal work queue for NF completion
mikehardy Jun 28, 2026
c4b3335
test(app-check): cleanup quota exceeded handling
mikehardy Jun 28, 2026
4380637
fix: correct links in skill / single isBoolean import
mikehardy Jun 28, 2026
1410831
fix(app-check): guard missing initializeAppCheck options at runtime
mikehardy Jun 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
11 changes: 7 additions & 4 deletions .agents/skills/ts-js-validation/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,18 +48,20 @@ Set one clear default path so the agent does not choose randomly between options

## Command sequence

Run these root `package.json` scripts in order. **Canonical checklist with pipeline/e2e context:** `okf-bundle/testing/validation-checklist.md` (OKF bundle wins if this skill disagrees).
Run these root `package.json` scripts in order. **Canonical checklist:** [validation-checklist.md](../../../okf-bundle/testing/validation-checklist.md). **Agent allowlist (no improvisation):** [agent-command-policy.md](../../../okf-bundle/testing/agent-command-policy.md). OKF bundle wins if this skill disagrees.

1. `yarn lerna:prepare`
2. `yarn tsc:compile`
3. `yarn tsc:compile:consumer`
4. `yarn reference:api`
5. `yarn tests:jest`
6. `yarn format:js`
7. `yarn compare:types`
5. `yarn lint:js` (use `yarn lint:js --fix` then re-run until clean)
6. `yarn tests:jest`
7. `yarn format:js`
8. `yarn compare:types`

## Gotchas

- **Forbidden:** `yarn workspace … prepare`, `cd packages/<pkg> && yarn prepare/build`, `yarn jet`, `npx jet` — see [agent command policy](../../../okf-bundle/testing/agent-command-policy.md). On failure, fix product code and re-run the **same** canonical command.
- `yarn format:js` writes changes across `packages/**/*.{js,ts,tsx}`. Check the diff after formatting and do not revert user changes.
- Run commands from the repository root so workspace resolution, root `tsconfig.json`, and Jest configuration are consistent.
- `yarn lerna:prepare` may rebuild or refresh package artifacts needed before TypeScript or tests run.
Expand Down Expand Up @@ -106,6 +108,7 @@ Use this template:
- `yarn tsc:compile`: passed | failed | not run
- `yarn tsc:compile:consumer`: passed | failed | not run
- `yarn reference:api`: passed | failed | not run
- `yarn lint:js`: passed | failed | not run
- `yarn tests:jest`: passed | failed | not run
- `yarn format:js`: passed | failed | changed files
- `yarn compare:types`: passed | failed | not run
Expand Down
5 changes: 5 additions & 0 deletions .github/scripts/compare-types/configs/app-check.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,11 @@ const config: PackageConfig = {
},
],
extraInRN: [
{
name: 'SDK_VERSION',
reason:
'RN Firebase package version string exported from the modular entry point. The firebase-js-sdk does not export SDK_VERSION from @firebase/app-check.',
},
{
name: 'AppCheckProvider',
reason:
Expand Down
30 changes: 30 additions & 0 deletions .github/scripts/compare-types/configs/auth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,31 @@ const config: PackageConfig = {
reason:
'RN Firebase extension type: firebase-js-sdk AdditionalUserInfo core fields plus index signature for extra native bridge keys. Use when typing values from getAdditionalUserInfo or UserCredential.additionalUserInfo that may include provider-specific native fields.',
},
{
name: 'SDK_VERSION',
reason:
'RN Firebase package version string exported from the modular entry point. The firebase-js-sdk does not export SDK_VERSION from @firebase/auth.',
},
{
name: 'AuthListenerCallback',
reason:
'RN Firebase exported auth state listener callback type. firebase-js-sdk uses inline callback types on onAuthStateChanged / onIdTokenChanged rather than exporting this alias.',
},
{
name: 'CallbackOrObserver',
reason:
'RN Firebase exported union type for auth listener callbacks and observers. firebase-js-sdk uses inline overloads rather than exporting this helper type.',
},
{
name: 'UpdateProfile',
reason:
'RN Firebase exported profile update options type for updateProfile(). firebase-js-sdk declares the shape inline on updateProfile rather than exporting this alias.',
},
{
name: 'MultiFactor',
reason:
'RN Firebase exported MultiFactor interface type. firebase-js-sdk exposes multi-factor enrollment through the multiFactor() helper without exporting this interface at the package root.',
},
],

differentShape: [
Expand Down Expand Up @@ -219,6 +244,11 @@ const config: PackageConfig = {
reason:
'iOS/Android: generateQrCodeUrl is Promise<string> via native bridge; openInOtpApp is an RN-only helper. Other/All: js-sdk synchronous generateQrCodeUrl is possible when MFA is supported on Other.',
},
{
name: 'User',
reason:
'RN Firebase User optionally exposes multiFactor for native MFA bridge convenience. firebase-js-sdk keeps multi-factor access on the multiFactor(user) helper only.',
},
],
};

Expand Down
23 changes: 6 additions & 17 deletions .github/scripts/compare-types/configs/database.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@ const config: PackageConfig = {
nameMapping: {},
missingInRN: [],
extraInRN: [
{
name: 'SDK_VERSION',
reason:
'RN Firebase package version string exported from the modular entry point. The firebase-js-sdk does not export SDK_VERSION from @firebase/database.',
},
{
name: 'setPersistenceEnabled',
reason:
Expand Down Expand Up @@ -39,23 +44,7 @@ const config: PackageConfig = {
'a standalone `keepSynced()` function.',
},
],
differentShape: [
{
name: 'Database',
reason:
'RN Firebase narrows the public `type` member to the concrete `database` literal, while the firebase-js-sdk declaration leaves it less specific.',
},
{
name: 'DataSnapshot',
reason:
'RN Firebase exposes native snapshot metadata helpers such as `key`, `priority`, and `size` on the public snapshot type.',
},
{
name: 'OnDisconnect',
reason:
'The public method signatures are equivalent, but the generated declaration text differs in union ordering for the priority parameter.',
},
],
differentShape: [],
};

export default config;
5 changes: 5 additions & 0 deletions .github/scripts/compare-types/configs/firestore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,11 @@ const config: PackageConfig = {
// Extra in RN Firebase
// ---------------------------------------------------------------------------
extraInRN: [
{
name: 'SDK_VERSION',
reason:
'RN Firebase package version string exported from the modular entry point. The firebase-js-sdk does not export SDK_VERSION from @firebase/firestore.',
},
{
name: 'FirebaseApp',
reason:
Expand Down
8 changes: 7 additions & 1 deletion .github/scripts/compare-types/configs/installations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,13 @@ import type { PackageConfig } from '../src/types';
const config: PackageConfig = {
nameMapping: {},
missingInRN: [],
extraInRN: [],
extraInRN: [
{
name: 'SDK_VERSION',
reason:
'RN Firebase package version string exported from the modular entry point. The firebase-js-sdk does not export SDK_VERSION from @firebase/installations.',
},
],
differentShape: [],
};

Expand Down
5 changes: 5 additions & 0 deletions .github/scripts/compare-types/configs/perf-config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@ import type { PackageConfig } from '../../src/types';
const config: PackageConfig = {
missingInRN: [],
extraInRN: [
{
name: 'SDK_VERSION',
reason:
'RN Firebase package version string exported from the modular entry point. The firebase-js-sdk does not export SDK_VERSION from @firebase/performance.',
},
{
name: 'HttpMethod',
reason:
Expand Down
20 changes: 20 additions & 0 deletions .github/scripts/compare-types/configs/remote-config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,19 @@ const config: PackageConfig = {
'platform resource file (iOS .plist / Android XML). No equivalent ' +
'exists in the firebase-js-sdk web API.',
},
{
name: 'LastFetchStatus',
reason:
'RN Firebase exports fetch-status string literals as a named const object ' +
'(`SUCCESS`, `FAILURE`, etc.) for modular callers. The firebase-js-sdk does ' +
'not export this helper; web callers compare against string literals directly.',
},
{
name: 'SDK_VERSION',
reason:
'RN Firebase package version string exported from the modular entry point. ' +
'The firebase-js-sdk does not export `SDK_VERSION` from `@firebase/remote-config`.',
},
],
differentShape: [
{
Expand All @@ -89,6 +102,13 @@ const config: PackageConfig = {
'RN Firebase only accepts the optional app instance and does not expose the ' +
'initialization-options surface.',
},
{
name: 'ValueSource',
reason:
'RN Firebase exports value-source string literals as a named const object ' +
'(`REMOTE`, `DEFAULT`, `STATIC`). The firebase-js-sdk exposes `ValueSource` as ' +
'a string-literal type alias instead of a runtime constants object.',
},
],
};

Expand Down
5 changes: 5 additions & 0 deletions .github/scripts/compare-types/configs/storage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,11 @@ const config: PackageConfig = {
// Extra in RN Firebase
// ---------------------------------------------------------------------------
extraInRN: [
{
name: 'SDK_VERSION',
reason:
'RN Firebase package version string exported from the modular entry point. The firebase-js-sdk does not export SDK_VERSION from @firebase/storage.',
},
{
name: 'setMaxOperationRetryTime',
reason:
Expand Down
28 changes: 10 additions & 18 deletions .github/scripts/compare-types/src/registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -107,14 +107,11 @@ export const packages: PackageEntry[] = [
name: 'auth',
firebaseSdkTypesPaths: [requiredFirebaseTypes('auth')],
rnFirebaseModularFiles: [
path.join(rnDist('auth'), 'index.d.ts'),
path.join(rnDist('auth'), 'types', 'auth.d.ts'),
path.join(rnDist('auth'), 'modular.d.ts'),
],
rnFirebaseSupportFiles: [
path.join(rnDist('auth'), 'index.d.ts'),
path.join(rnDist('auth'), 'constants.d.ts'),
path.join(rnDist('auth'), 'namespaced.d.ts'),
path.join(rnDist('auth'), 'types', 'namespaced.d.ts'),
path.join(rnDist('auth'), 'types', 'internal.d.ts'),
path.join(rnDist('auth'), 'ConfirmationResult.d.ts'),
path.join(rnDist('auth'), 'MultiFactorResolver.d.ts'),
Expand Down Expand Up @@ -142,12 +139,11 @@ export const packages: PackageEntry[] = [
name: 'storage',
firebaseSdkTypesPaths: [requiredFirebaseTypes('storage')],
rnFirebaseModularFiles: [
path.join(rnDist('storage'), 'index.d.ts'),
path.join(rnDist('storage'), 'types', 'storage.d.ts'),
path.join(rnDist('storage'), 'modular.d.ts'),
],
rnFirebaseSupportFiles: [
path.join(rnDist('storage'), 'StorageStatics.d.ts'),
path.join(rnDist('storage'), 'types', 'namespaced.d.ts'),
path.join(rnDist('storage'), 'types', 'internal.d.ts'),
],
config: storageConfig,
Expand All @@ -156,12 +152,12 @@ export const packages: PackageEntry[] = [
name: 'remote-config',
firebaseSdkTypesPaths: [requiredFirebaseTypes('remote-config')],
rnFirebaseModularFiles: [
path.join(rnDist('remote-config'), 'index.d.ts'),
path.join(rnDist('remote-config'), 'types', 'remote-config.d.ts'),
path.join(rnDist('remote-config'), 'modular.d.ts'),
],
rnFirebaseSupportFiles: [
path.join(rnDist('remote-config'), 'statics.d.ts'),
path.join(rnDist('remote-config'), 'types', 'namespaced.d.ts'),
path.join(rnDist('remote-config'), 'types', 'internal.d.ts'),
],
config: remoteConfigConfig,
},
Expand Down Expand Up @@ -203,13 +199,12 @@ export const packages: PackageEntry[] = [
name: 'database',
firebaseSdkTypesPaths: [requiredFirebaseTypes('database')],
rnFirebaseModularFiles: [
path.join(rnDist('database'), 'index.d.ts'),
path.join(rnDist('database'), 'types', 'database.d.ts'),
path.join(rnDist('database'), 'modular.d.ts'),
path.join(rnDist('database'), 'modular', 'query.d.ts'),
path.join(rnDist('database'), 'modular', 'transaction.d.ts'),
],
rnFirebaseSupportFiles: [
path.join(rnDist('database'), 'types', 'namespaced.d.ts'),
path.join(rnDist('database'), 'types', 'internal.d.ts'),
path.join(rnDist('database'), 'DatabaseDataSnapshot.d.ts'),
path.join(rnDist('database'), 'DatabaseOnDisconnect.d.ts'),
Expand All @@ -224,8 +219,8 @@ export const packages: PackageEntry[] = [
name: 'app-check',
firebaseSdkTypesPaths: [requiredFirebaseTypes('app-check')],
rnFirebaseModularFiles: [
path.join(rnDist('app-check'), 'index.d.ts'),
path.join(rnDist('app-check'), 'types', 'appcheck.d.ts'),
path.join(rnDist('app-check'), 'modular.d.ts'),
],
rnFirebaseSupportFiles: [
path.join(rnDist('app-check'), 'providers.d.ts'),
Expand All @@ -239,8 +234,8 @@ export const packages: PackageEntry[] = [
requiredFirebaseTypes('installations'),
],
rnFirebaseModularFiles: [
path.join(rnDist('installations'), 'index.d.ts'),
path.join(rnDist('installations'), 'types', 'installations.d.ts'),
path.join(rnDist('installations'), 'modular.d.ts'),
],
rnFirebaseSupportFiles: [path.join(rnDist('installations'), 'types', 'internal.d.ts')],
config: installationsConfig,
Expand All @@ -250,19 +245,16 @@ export const packages: PackageEntry[] = [
firebaseSdkTypesPaths: [requiredFirebaseTypes('firestore')],
rnFirebaseModularFiles: [
path.join(rnDist('firestore'), 'types', 'firestore.d.ts'),
path.join(rnDist('firestore'), 'modular.d.ts'),
path.join(rnDist('firestore'), 'index.d.ts'),
path.join(rnDist('firestore'), 'modular', 'query.d.ts'),
path.join(rnDist('firestore'), 'modular', 'snapshot.d.ts'),
path.join(rnDist('firestore'), 'modular', 'Bytes.d.ts'),
path.join(rnDist('firestore'), 'modular', 'FieldPath.d.ts'),
path.join(rnDist('firestore'), 'modular', 'FieldValue.d.ts'),
path.join(rnDist('firestore'), 'modular', 'GeoPoint.d.ts'),
path.join(rnDist('firestore'), 'modular', 'Timestamp.d.ts'),
path.join(rnDist('firestore'), 'modular', 'VectorValue.d.ts'),
],
rnFirebaseSupportFiles: [
path.join(rnDist('firestore'), 'types', 'namespaced.d.ts'),
path.join(rnDist('firestore'), 'types', 'internal.d.ts'),
path.join(rnDist('firestore'), 'types', 'internal.d.ts'),
path.join(rnDist('firestore'), 'FirestoreAggregate.d.ts'),
path.join(rnDist('firestore'), 'FirestoreFilter.d.ts'),
path.join(rnDist('firestore'), 'FirestoreBlob.d.ts'),
Expand Down Expand Up @@ -300,8 +292,8 @@ export const packages: PackageEntry[] = [
name: 'perf',
firebaseSdkTypesPaths: [requiredFirebaseTypes('performance')],
rnFirebaseModularFiles: [
path.join(rnDist('perf'), 'index.d.ts'),
path.join(rnDist('perf'), 'types', 'perf.d.ts'),
path.join(rnDist('perf'), 'modular.d.ts'),
],
rnFirebaseSupportFiles: [],
config: perfConfig,
Expand Down
3 changes: 3 additions & 0 deletions .spellcheck.dict.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ Analytics
ANR
APIs
APIs.
accessors
APNs
AppAttest
AppCheck
Expand Down Expand Up @@ -221,6 +222,7 @@ src
SSV
stacktrace
substring
subpath
switchOn
SVG
TestLab
Expand Down Expand Up @@ -258,6 +260,7 @@ v22
v23
v24
v25
v26
Ventura
VertexAI
VPN
Expand Down
4 changes: 3 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,14 @@
## Working

- Run from repo root; install once with `yarn`.
- **Agent shell commands:** [agent-command-policy.md](okf-bundle/testing/agent-command-policy.md) only (allowlist). E2e additionally [running-e2e.md § agent rule](okf-bundle/testing/running-e2e.md#agent-rule-read-first).
- Follow local package patterns; check `type-test.ts`, `__tests__/`, and plugin dirs before public API/platform changes.
- Start with `okf-bundle/index.md` for repo-specific implementation/testing/maintenance knowledge.
- **Change authoring:** [change-authoring-workflow.md](okf-bundle/testing/change-authoring-workflow.md) — baseline → unit-focused implementation → area-focused review → commit.
- Use package indexes under `okf-bundle/packages/` for package-specific workflows and active work queues.
- Follow `okf-bundle/documentation-policy.md`: durable knowledge in reference docs; ephemeral state only in explicit work queues; commits are documentation; single-commit PR titles must match the commit subject exactly.
- Testing entry points: `okf-bundle/testing/index.md`; validation requirements: `okf-bundle/testing/validation-checklist.md`.
- Match validation to the **work type** and **validation tier** in OKF ([iteration vocabulary](okf-bundle/testing/iteration-vocabulary.md), package workflows, active work queue gates).
- Match validation to the **work type** and **validation tier** in OKF ([change authoring workflow](okf-bundle/testing/change-authoring-workflow.md); term ids in [iteration vocabulary](okf-bundle/testing/iteration-vocabulary.md)).

## PR instructions

Expand Down
1 change: 1 addition & 0 deletions docs.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
{ "title": "Migration Guide to v23", "href": "/migrating-to-v23" },
{ "title": "Migration Guide to v24", "href": "/migrating-to-v24" },
{ "title": "Migration Guide to v25", "href": "/migrating-to-v25" },
{ "title": "Migration Guide to v26", "href": "/migrating-to-v26" },
{ "title": "TypeScript", "href": "/typescript" },
{ "title": "Platforms", "href": "/platforms" },
{ "title": "FAQs and Tips", "href": "/faqs-and-tips" },
Expand Down
2 changes: 1 addition & 1 deletion docs/migrating-to-v25.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
title: Migrating to v25
description: Migrate to React Native Firebase v25.
previous: /migrating-to-v24
next: /typescript
next: /migrating-to-v26
---

Version 25 completes the TypeScript alignment started in v24. Modular types across multiple packages now match the [firebase-js-sdk](https://firebase.google.com/docs/web/modular-upgrade) modular API as closely as possible. Runtime behavior is largely unchanged; **TypeScript consumers** and apps using the **modular API** are most affected.
Expand Down
Loading
Loading