From e50b4d359671f5971fadfe0beabfe29b0df668e8 Mon Sep 17 00:00:00 2001 From: Tyler Dixon Date: Mon, 3 Aug 2026 15:04:17 -0700 Subject: [PATCH] fix(types): use explicit .js extensions in relative imports The emitted .d.ts inherited source's extensionless relative specifiers (`from './useObservable'`, and `from '.'` in two files), which node16 and nodenext resolution reject. Consumers on those settings hit resolution errors reading our declarations, while the runtime bundles were fine, so nothing in the build surfaced it. `moduleResolution: bundler` accepts both forms in source, so this is a no-op for the build and for bundler consumers. Verified with @arethetypeswrong/cli against the packed build, with no ignore rules: before node16 (from ESM) internal resolution error after node16 (from ESM) pass node16 (from CJS) still reports "no types" on this branch; that is the missing `types` export condition, fixed separately in #766. With both changes applied, all four resolution modes pass with no suppression. Fixes #769. --- src/SuspenseSubject.ts | 2 +- src/auth.tsx | 4 ++-- src/database.tsx | 2 +- src/firestore.tsx | 4 ++-- src/functions.tsx | 4 ++-- src/index.ts | 22 +++++++++++----------- src/remote-config.tsx | 4 ++-- src/sdk.tsx | 6 +++--- src/storage.tsx | 4 ++-- src/useObservable.ts | 6 +++--- 10 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/SuspenseSubject.ts b/src/SuspenseSubject.ts index 0c52b9b5..5b7ef884 100644 --- a/src/SuspenseSubject.ts +++ b/src/SuspenseSubject.ts @@ -1,6 +1,6 @@ import { empty, Observable, Subject, Subscriber, Subscription } from 'rxjs'; import { catchError, shareReplay, tap } from 'rxjs/operators'; -import { ObservableStatus } from './useObservable'; +import { ObservableStatus } from './useObservable.js'; export class SuspenseSubject extends Subject { private _value: T | undefined; diff --git a/src/auth.tsx b/src/auth.tsx index 9fba1a46..6e74d6c5 100644 --- a/src/auth.tsx +++ b/src/auth.tsx @@ -1,9 +1,9 @@ import * as React from 'react'; import { user } from 'rxfire/auth'; -import { preloadObservable, ReactFireOptions, useAuth, useObservable, ObservableStatus, ReactFireError } from './'; +import { preloadObservable, ReactFireOptions, useAuth, useObservable, ObservableStatus, ReactFireError } from './index.js'; import { from, of, defer } from 'rxjs'; import { map, switchMap } from 'rxjs/operators'; -import { useSuspenseEnabledFromConfigAndContext } from './firebaseApp'; +import { useSuspenseEnabledFromConfigAndContext } from './firebaseApp.js'; import type { Auth, User, IdTokenResult } from 'firebase/auth'; type Claims = IdTokenResult['claims']; diff --git a/src/database.tsx b/src/database.tsx index 3cfa9224..5c5f998c 100644 --- a/src/database.tsx +++ b/src/database.tsx @@ -1,5 +1,5 @@ import { list, object, QueryChange, listVal, objectVal } from 'rxfire/database'; -import { ReactFireOptions, useObservable, checkIdField, ObservableStatus, ReactFireGlobals } from './'; +import { ReactFireOptions, useObservable, checkIdField, ObservableStatus, ReactFireGlobals } from './index.js'; import type { Query as DatabaseQuery, DatabaseReference } from 'firebase/database'; diff --git a/src/firestore.tsx b/src/firestore.tsx index d5efa8bd..ed504f97 100644 --- a/src/firestore.tsx +++ b/src/firestore.tsx @@ -1,6 +1,6 @@ import { collectionData, doc, docData, fromRef } from 'rxfire/firestore'; -import { ReactFireOptions, useObservable, checkIdField, ReactFireGlobals } from './'; -import { preloadObservable, ObservableStatus } from './useObservable'; +import { ReactFireOptions, useObservable, checkIdField, ReactFireGlobals } from './index.js'; +import { preloadObservable, ObservableStatus } from './useObservable.js'; import { first } from 'rxjs/operators'; import { Query as FirestoreQuery, QuerySnapshot, DocumentReference, queryEqual, DocumentData, DocumentSnapshot } from 'firebase/firestore'; diff --git a/src/functions.tsx b/src/functions.tsx index e9f1f34b..d30be15b 100644 --- a/src/functions.tsx +++ b/src/functions.tsx @@ -1,7 +1,7 @@ import { httpsCallable as rxHttpsCallable } from 'rxfire/functions'; import { defer } from 'rxjs'; -import { ReactFireOptions, useObservable, ObservableStatus } from './'; -import { useFunctions } from '.'; +import { ReactFireOptions, useObservable, ObservableStatus } from './index.js'; +import { useFunctions } from './index.js'; import type { HttpsCallableOptions } from 'firebase/functions'; diff --git a/src/index.ts b/src/index.ts index ab60a1fe..028a4a62 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,4 @@ -import { SuspenseSubject } from './SuspenseSubject'; +import { SuspenseSubject } from './SuspenseSubject.js'; import type { Query as FirestoreQuery } from 'firebase/firestore'; import type { Query as DatabaseQuery } from 'firebase/database'; @@ -48,13 +48,13 @@ export function checkIdField(options: ReactFireOptions) { return checkOptions(options, 'idField'); } -export * from './auth'; -export * from './database'; -export * from './firebaseApp'; -export * from './firestore'; -export * from './functions'; -export * from './performance'; -export * from './remote-config'; -export * from './storage'; -export * from './useObservable'; -export * from './sdk'; +export * from './auth.js'; +export * from './database.js'; +export * from './firebaseApp.js'; +export * from './firestore.js'; +export * from './functions.js'; +export * from './performance.js'; +export * from './remote-config.js'; +export * from './storage.js'; +export * from './useObservable.js'; +export * from './sdk.js'; diff --git a/src/remote-config.tsx b/src/remote-config.tsx index 97376fb8..83b398a0 100644 --- a/src/remote-config.tsx +++ b/src/remote-config.tsx @@ -1,5 +1,5 @@ -import { useRemoteConfig } from './'; -import { useObservable, ObservableStatus } from './useObservable'; +import { useRemoteConfig } from './index.js'; +import { useObservable, ObservableStatus } from './useObservable.js'; import { getValue, getString, getBoolean, getNumber, getAll, AllParameters } from 'rxfire/remote-config'; import { Observable } from 'rxjs'; diff --git a/src/sdk.tsx b/src/sdk.tsx index ee66ffff..c3238604 100644 --- a/src/sdk.tsx +++ b/src/sdk.tsx @@ -9,11 +9,11 @@ import type { Functions } from 'firebase/functions'; import type { FirebasePerformance } from 'firebase/performance'; import type { FirebaseStorage } from 'firebase/storage'; import type { RemoteConfig } from 'firebase/remote-config'; -import { useFirebaseApp } from './firebaseApp'; +import { useFirebaseApp } from './firebaseApp.js'; import { FirebaseApp } from 'firebase/app'; -import { ObservableStatus, useObservable } from './useObservable'; +import { ObservableStatus, useObservable } from './useObservable.js'; import { from } from 'rxjs'; -import { ReactFireOptions } from '.'; +import { ReactFireOptions } from './index.js'; export const AppCheckSdkContext = React.createContext(undefined); export const AuthSdkContext = React.createContext(undefined); diff --git a/src/storage.tsx b/src/storage.tsx index 92f27a51..6bb1ccb3 100644 --- a/src/storage.tsx +++ b/src/storage.tsx @@ -1,8 +1,8 @@ import * as React from 'react'; import { getDownloadURL, fromTask } from 'rxfire/storage'; import { defer } from 'rxjs'; -import { ReactFireOptions, useObservable, ObservableStatus, useStorage } from './'; -import { useSuspenseEnabledFromConfigAndContext } from './firebaseApp'; +import { ReactFireOptions, useObservable, ObservableStatus, useStorage } from './index.js'; +import { useSuspenseEnabledFromConfigAndContext } from './firebaseApp.js'; import { ref } from 'firebase/storage'; import type { UploadTask, UploadTaskSnapshot, StorageReference, FirebaseStorage } from 'firebase/storage'; diff --git a/src/useObservable.ts b/src/useObservable.ts index 9e6173a8..f66a5522 100644 --- a/src/useObservable.ts +++ b/src/useObservable.ts @@ -1,9 +1,9 @@ import * as React from 'react'; import { useSyncExternalStore } from 'use-sync-external-store/shim'; import { Observable } from 'rxjs'; -import { SuspenseSubject } from './SuspenseSubject'; -import { useSuspenseEnabledFromConfigAndContext } from './firebaseApp'; -import { ReactFireGlobals, ReactFireOptions } from './'; +import { SuspenseSubject } from './SuspenseSubject.js'; +import { useSuspenseEnabledFromConfigAndContext } from './firebaseApp.js'; +import { ReactFireGlobals, ReactFireOptions } from './index.js'; const DEFAULT_TIMEOUT = 30_000;