Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
3241025
docs: new architecture migration work queue
mikehardy Jun 25, 2026
29c5bb5
feat(app)!: migrate app modules to TurboModules incl general migratio…
mikehardy Jun 30, 2026
7fac171
test(app): add app module type comparison config
mikehardy Jun 30, 2026
e68b394
feat(firestore)!: migrate firestore to TurboModules
mikehardy Jun 30, 2026
6b2a776
fix(app, android): handle possible null external storage directory
mikehardy Jun 30, 2026
a77e79a
feat(installations)!: migrate installations to TurboModules
mikehardy Jul 1, 2026
0db2013
feat(perf)!: migrate perf to TurboModules
mikehardy Jul 1, 2026
5663b6c
feat(in-app-messaging)!: migrate in-app-messaging to TurboModules
mikehardy Jul 1, 2026
f41faa6
feat(app-distribution)!: migrate app-distribution to TurboModules
mikehardy Jul 1, 2026
475bda4
feat(ml)!: migrate ml to TurboModules
mikehardy Jul 1, 2026
512e94a
feat(app-check)!: migrate app-check to TurboModules
mikehardy Jul 1, 2026
aa99c13
feat(remote-config)!: migrate remote-config to TurboModules
mikehardy Jul 1, 2026
48c2b21
feat(analytics)!: migrate analytics to TurboModules
mikehardy Jul 1, 2026
d5abe60
feat(crashlytics)!: migrate crashlytics to TurboModules
mikehardy Jul 1, 2026
2aa7c7e
feat(storage)!: migrate storage to TurboModules
mikehardy Jul 1, 2026
b31a134
docs(new-architecture): close Phase 3 work queue gates
mikehardy Jul 1, 2026
d712ea9
refactor(app): unify single-host TurboModule composite creation
mikehardy Jul 2, 2026
e120396
perf(app): reduce TurboModule resolver overhead
mikehardy Jul 2, 2026
99fce74
refactor(app): extract shared TurboModule contract-test helper
mikehardy Jul 2, 2026
8b38c44
test: snapshot committed harness defaults
mikehardy Jul 2, 2026
fbaa13d
chore(compare-types): register remaining migrated packages
mikehardy Jul 2, 2026
bfcac32
fix: add codegen verify and spec-native parity tests
mikehardy Jul 2, 2026
7d584e2
docs(new-architecture): record P4a defer messaging events to Phase C
mikehardy Jul 2, 2026
979e0b9
feat(messaging)!: migrate messaging to TurboModules
mikehardy Jul 2, 2026
a533f04
style(lint): lint pass on all newly converted new architecture files
mikehardy Jul 2, 2026
6ef0f47
feat(database)!: migrate database to TurboModules
mikehardy Jul 3, 2026
5101331
feat(auth)!: migrate auth to TurboModules
mikehardy Jul 3, 2026
fa2a157
feat(phone-number-verification)!: migrate phone-number-verification t…
mikehardy Jul 3, 2026
97dc541
test(android): cold boot emulator for reliable test runs
mikehardy Jul 3, 2026
5b3cdf4
refactor: cleanup legacy arch native module fallback
mikehardy Jul 3, 2026
4b1a22d
docs: document all API gaps / platform divergence / migration items
mikehardy Jul 3, 2026
30ab214
refactor(app): return sync parity for registerVersion
mikehardy Jul 3, 2026
ee884f9
refactor(auth): return sync parity for auth parsers
mikehardy Jul 3, 2026
fe459fc
refactor(perf): return sync parity for metric controls
mikehardy Jul 3, 2026
4c8edad
refactor(database): return sync parity for connection controls
mikehardy Jul 3, 2026
034c274
docs(new-arch): queue Phase S2 gap analysis and compare-types hints
mikehardy Jul 3, 2026
ae5976c
fix: resolve CI lint and spec-native parity failures
mikehardy Jul 3, 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
  •  
  •  
  •  
148 changes: 148 additions & 0 deletions .github/scripts/compare-types/configs/analytics.ts

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion .github/scripts/compare-types/configs/app-check.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,8 @@ const config: PackageConfig = {
{
name: 'initializeAppCheck',
reason:
'RN Firebase returns `Promise<AppCheck>` because App Check initialization crosses the native bridge, whereas the firebase-js-sdk returns `AppCheck` synchronously.',
'RN Firebase returns `Promise<AppCheck>` whereas the firebase-js-sdk returns `AppCheck` synchronously. ' +
'Phase S hint: **Promise that could maybe sync-void+queue** after provider/refresh state is installed synchronously (see PS-S2-gap).',
},
{
name: 'AppCheckOptions',
Expand Down
31 changes: 31 additions & 0 deletions .github/scripts/compare-types/configs/app-distribution.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/**
* Known differences between the firebase-js-sdk public API and
* the @react-native-firebase/app-distribution modular API.
*
* Each entry must have a `name` and a `reason`. Undocumented drift fails CI.
*/

import type { PackageConfig } from '../src/types';

const config: PackageConfig = {
nameMapping: {},

missingInRN: [
],

extraInRN: [
{ name: 'getAppDistribution', reason: 'RN Firebase export for the native app-distribution module. The firebase-js-sdk does not ship a modular public API for this product.' },
{ name: 'isTesterSignedIn', reason: 'RN Firebase export for the native app-distribution module. The firebase-js-sdk does not ship a modular public API for this product.' },
{ name: 'signInTester', reason: 'RN Firebase export for the native app-distribution module. The firebase-js-sdk does not ship a modular public API for this product.' },
{ name: 'checkForUpdate', reason: 'RN Firebase export for the native app-distribution module. The firebase-js-sdk does not ship a modular public API for this product.' },
{ name: 'signOutTester', reason: 'RN Firebase export for the native app-distribution module. The firebase-js-sdk does not ship a modular public API for this product.' },
{ 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-distribution.' },
{ name: 'AppDistribution', reason: 'RN Firebase export for the native app-distribution module. The firebase-js-sdk does not ship a modular public API for this product.' },
{ name: 'AppDistributionRelease', reason: 'RN Firebase export for the native app-distribution module. The firebase-js-sdk does not ship a modular public API for this product.' },
],

differentShape: [
],
};

export default config;
144 changes: 144 additions & 0 deletions .github/scripts/compare-types/configs/app.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
/**
* Known differences between firebase-js-sdk @firebase/app and
* @react-native-firebase/app modular API.
*
* Each entry must have a `name` and a `reason`. Any undocumented
* difference or stale entry will fail `yarn compare:types`.
*/

import type { PackageConfig } from '../src/types';

const config: PackageConfig = {
nameMapping: {},

missingInRN: [
{
name: 'initializeServerApp',
reason:
'firebase-js-sdk server-side rendering entry point. Not applicable to React Native.',
},
{
name: 'FirebaseAppSettings',
reason:
'Settings type for firebase-js-sdk `FirebaseServerApp`. RN Firebase has no server-app API.',
},
{
name: 'FirebaseError',
reason:
'firebase-js-sdk base error class. RN Firebase uses `ReactNativeFirebase.NativeFirebaseError` from the native bridge instead.',
},
{
name: 'FirebaseOptions',
reason:
'firebase-js-sdk options interface. RN Firebase uses `ReactNativeFirebase.FirebaseAppOptions` (extends the same fields with RN-specific optional keys).',
},
{
name: 'FirebaseServerApp',
reason:
'firebase-js-sdk server-side app instance type. Not applicable to React Native.',
},
{
name: 'FirebaseServerAppSettings',
reason:
'Settings type for firebase-js-sdk server apps. Not applicable to React Native.',
},
],

extraInRN: [
{
name: 'setReactNativeAsyncStorage',
reason:
'RN Firebase-specific hook to wire `@react-native-async-storage/async-storage` into the firebase-js-sdk Other/Hermes persistence path.',
},
{
name: 'metaGetAll',
reason:
'RN Firebase native bridge helper — reads all entries from the native Firebase metadata store.',
},
{
name: 'jsonGetAll',
reason:
'RN Firebase native bridge helper — reads all entries from the native JSON config store.',
},
{
name: 'preferencesClearAll',
reason:
'RN Firebase native bridge helper — clears native shared preferences used by Firebase.',
},
{
name: 'preferencesGetAll',
reason:
'RN Firebase native bridge helper — reads all native shared preference entries.',
},
{
name: 'preferencesSetBool',
reason:
'RN Firebase native bridge helper — sets a native boolean preference.',
},
{
name: 'preferencesSetString',
reason:
'RN Firebase native bridge helper — sets a native string preference.',
},
{
name: 'getUtils',
reason:
'RN Firebase entry point for the native Utils module (Play Services, file paths, etc.). No firebase-js-sdk modular equivalent.',
},
{
name: 'FilePath',
reason:
'RN Firebase native device file-path constants for Storage and similar file-based APIs.',
},
{
name: 'LogCallbackParams',
reason:
'RN Firebase log-handler callback payload type exported for modular `setLogLevel` wiring.',
},
{
name: 'LogCallback',
reason:
'RN Firebase log-handler callback type exported for modular logging configuration.',
},
{
name: 'LogOptions',
reason:
'RN Firebase log-handler options type exported for modular logging configuration.',
},
],

differentShape: [
{
name: 'deleteApp',
reason:
'Parameter type is `ReactNativeFirebase.FirebaseApp` instead of firebase-js-sdk `FirebaseApp`. Runtime behavior matches.',
},
{
name: 'getApp',
reason:
'Return type is `ReactNativeFirebase.FirebaseApp` instead of firebase-js-sdk `FirebaseApp`. Runtime behavior matches.',
},
{
name: 'getApps',
reason:
'Return type is `ReactNativeFirebase.FirebaseApp[]` instead of firebase-js-sdk `FirebaseApp[]`. Runtime behavior matches.',
},
{
name: 'initializeApp',
reason:
'Returns `Promise<ReactNativeFirebase.FirebaseApp>` because initialization crosses the native bridge. Accepts `ReactNativeFirebase.FirebaseAppOptions` and optional `ReactNativeFirebase.FirebaseAppConfig` (name / auth domain) instead of firebase-js-sdk `(FirebaseOptions, string)` only.',
},
{
name: 'setLogLevel',
reason:
'Parameter type is `ReactNativeFirebase.LogLevelString` instead of firebase-js-sdk `LogLevelString`. Accepted values match (`debug`, `verbose`, `info`, `warn`, `error`, `silent`).',
},
{
name: 'FirebaseApp',
reason:
'RN Firebase exports the `ReactNativeFirebase.FirebaseApp` class/interface from shared app declarations instead of re-exporting firebase-js-sdk `FirebaseApp`.',
},
],
};

export default config;
8 changes: 1 addition & 7 deletions .github/scripts/compare-types/configs/auth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -204,11 +204,6 @@ const config: PackageConfig = {
reason:
'RN Firebase modular UserCredential includes optional enumerable additionalUserInfo (firebase-js-sdk core fields plus preserved native bridge keys). firebase-js-sdk keeps additionalUserInfo off the public UserCredential interface — use getAdditionalUserInfo there.',
},
{
name: 'isSignInWithEmailLink',
reason:
'iOS/Android: Promise<boolean> via native bridge. Other/All: not aligned yet; firebase-js-sdk synchronous boolean is possible on Other/Hermes and Other/Web.',
},
{
name: 'linkWithRedirect',
reason:
Expand Down Expand Up @@ -241,8 +236,7 @@ const config: PackageConfig = {
},
{
name: 'TotpSecret',
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.',
reason: 'RN Firebase extension: openInOtpApp is an RN-only helper.',
},
{
name: 'User',
Expand Down
39 changes: 39 additions & 0 deletions .github/scripts/compare-types/configs/crashlytics.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/**
* Known differences between the firebase-js-sdk public API and
* the @react-native-firebase/crashlytics modular API.
*
* Each entry must have a `name` and a `reason`. Undocumented drift fails CI.
*/

import type { PackageConfig } from '../src/types';

const config: PackageConfig = {
nameMapping: {},

missingInRN: [
],

extraInRN: [
{ name: 'getCrashlytics', reason: 'RN Firebase export for the native crashlytics module. The firebase-js-sdk does not ship a modular public API for this product.' },
{ name: 'checkForUnsentReports', reason: 'RN Firebase export for the native crashlytics module. The firebase-js-sdk does not ship a modular public API for this product.' },
{ name: 'deleteUnsentReports', reason: 'RN Firebase export for the native crashlytics module. The firebase-js-sdk does not ship a modular public API for this product.' },
{ name: 'didCrashOnPreviousExecution', reason: 'RN Firebase export for the native crashlytics module. The firebase-js-sdk does not ship a modular public API for this product.' },
{ name: 'crash', reason: 'RN Firebase export for the native crashlytics module. The firebase-js-sdk does not ship a modular public API for this product.' },
{ name: 'log', reason: 'RN Firebase export for the native crashlytics module. The firebase-js-sdk does not ship a modular public API for this product.' },
{ name: 'recordError', reason: 'RN Firebase export for the native crashlytics module. The firebase-js-sdk does not ship a modular public API for this product.' },
{ name: 'sendUnsentReports', reason: 'RN Firebase export for the native crashlytics module. The firebase-js-sdk does not ship a modular public API for this product.' },
{ name: 'setUserId', reason: 'RN Firebase export for the native crashlytics module. The firebase-js-sdk does not ship a modular public API for this product.' },
{ name: 'setAttribute', reason: 'RN Firebase export for the native crashlytics module. The firebase-js-sdk does not ship a modular public API for this product.' },
{ name: 'setAttributes', reason: 'RN Firebase export for the native crashlytics module. The firebase-js-sdk does not ship a modular public API for this product.' },
{ name: 'setCrashlyticsCollectionEnabled', reason: 'RN Firebase export for the native crashlytics module. The firebase-js-sdk does not ship a modular public API for this product.' },
{ 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/crashlytics.' },
{ name: 'Crashlytics', reason: 'RN Firebase export for the native crashlytics module. The firebase-js-sdk does not ship a modular public API for this product.' },
{ name: 'Statics', reason: 'RN Firebase export for the native crashlytics module. The firebase-js-sdk does not ship a modular public API for this product.' },
{ name: 'FirebaseApp', reason: 'RN Firebase export for the native crashlytics module. The firebase-js-sdk does not ship a modular public API for this product.' },
],

differentShape: [
],
};

export default config;
2 changes: 2 additions & 0 deletions .github/scripts/compare-types/configs/empty-sdk.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
// Intentionally empty — RN-only Firebase products have no firebase-js-sdk modular API to compare.
export {};
11 changes: 5 additions & 6 deletions .github/scripts/compare-types/configs/firestore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -273,26 +273,25 @@ const config: PackageConfig = {
name: 'deleteAllPersistentCacheIndexes',
reason:
'Returns `Promise<void>` in RN Firebase vs `void` in the firebase-js-sdk. ' +
'The RN implementation is async because it delegates to the native module.',
'Phase S hint: **keep-async: deferred persistent-cache IO** (web void schedules disk/index work; see PS-S2-gap).',
},
{
name: 'disablePersistentCacheIndexAutoCreation',
reason:
'Returns `Promise<void>` in RN Firebase vs `void` in the firebase-js-sdk. ' +
'The RN implementation is async because it delegates to the native module.',
'Phase S hint: **keep-async: deferred persistent-cache IO** (see PS-S2-gap).',
},
{
name: 'enablePersistentCacheIndexAutoCreation',
reason:
'Returns `Promise<void>` in RN Firebase vs `void` in the firebase-js-sdk. ' +
'The RN implementation is async because it delegates to the native module.',
'Phase S hint: **keep-async: deferred persistent-cache IO** (see PS-S2-gap).',
},
{
name: 'initializeFirestore',
reason:
'Returns `Promise<Firestore>` in RN Firebase vs `Firestore` in the ' +
'firebase-js-sdk. The RN implementation is async because it initialises ' +
'the native Firestore module.',
'Returns `Promise<Firestore>` in RN Firebase vs `Firestore` in the firebase-js-sdk. ' +
'Phase S hint: **Promise that could maybe sync-void+gate** (in-memory settings visible before return; see PS-S2-gap).',
},
{
name: 'onSnapshotsInSync',
Expand Down
34 changes: 34 additions & 0 deletions .github/scripts/compare-types/configs/functions.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/**
* Known differences between the firebase-js-sdk public API and
* the @react-native-firebase/functions modular API.
*
* Each entry must have a `name` and a `reason`. Undocumented drift fails CI.
*/

import type { PackageConfig } from '../src/types';

const config: PackageConfig = {
nameMapping: {
httpsCallableFromURL: 'httpsCallableFromUrl',
},

missingInRN: [
{ name: 'FunctionsError', reason: 'RN Firebase surfaces callable failures through the `HttpsError` class instead of the firebase-js-sdk `FunctionsError` export.' },
{ name: 'FunctionsErrorCodeCore', reason: 'Internal firebase-js-sdk error-code helper not re-exported by RN Firebase. Callable errors use `HttpsErrorCode` constants instead.' },
],

extraInRN: [
{ name: 'HttpsErrorCode', reason: 'RN Firebase exposes callable error code constants as a standalone export. The firebase-js-sdk surfaces these through the `FunctionsErrorCode` enum instead.' },
{ 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/functions.' },
{ name: 'HttpsError', reason: 'RN Firebase re-exports the callable `HttpsError` class from its modular entry point for ergonomic imports.' },
{ name: 'FunctionsStatics', reason: 'RN Firebase statics namespace type used by the legacy namespaced API surface. Not part of the firebase-js-sdk modular public API.' },
{ name: 'FirebaseApp', reason: 'RN Firebase re-exports `FirebaseApp` from the modular entry point for convenience.' },
],

differentShape: [
{ name: 'Functions', reason: 'RN Firebase extends the Functions service interface with native region/custom-domain helpers and uses async callable factories.' },
{ name: 'FunctionsErrorCode', reason: 'RN Firebase `FunctionsErrorCode` enum includes additional native bridge error codes beyond the firebase-js-sdk set.' },
],
};

export default config;
31 changes: 31 additions & 0 deletions .github/scripts/compare-types/configs/in-app-messaging.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/**
* Known differences between the firebase-js-sdk public API and
* the @react-native-firebase/in-app-messaging modular API.
*
* Each entry must have a `name` and a `reason`. Undocumented drift fails CI.
*/

import type { PackageConfig } from '../src/types';

const config: PackageConfig = {
nameMapping: {},

missingInRN: [
],

extraInRN: [
{ name: 'getInAppMessaging', reason: 'RN Firebase export for the native in-app-messaging module. The firebase-js-sdk does not ship a modular public API for this product.' },
{ name: 'isMessagesDisplaySuppressed', reason: 'RN Firebase export for the native in-app-messaging module. The firebase-js-sdk does not ship a modular public API for this product.' },
{ name: 'setMessagesDisplaySuppressed', reason: 'RN Firebase export for the native in-app-messaging module. The firebase-js-sdk does not ship a modular public API for this product.' },
{ name: 'isAutomaticDataCollectionEnabled', reason: 'RN Firebase export for the native in-app-messaging module. The firebase-js-sdk does not ship a modular public API for this product.' },
{ name: 'setAutomaticDataCollectionEnabled', reason: 'RN Firebase export for the native in-app-messaging module. The firebase-js-sdk does not ship a modular public API for this product.' },
{ name: 'triggerEvent', reason: 'RN Firebase export for the native in-app-messaging module. The firebase-js-sdk does not ship a modular public API for this product.' },
{ 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/in-app-messaging.' },
{ name: 'InAppMessaging', reason: 'RN Firebase export for the native in-app-messaging module. The firebase-js-sdk does not ship a modular public API for this product.' },
],

differentShape: [
],
};

export default config;
Loading
Loading