package.json exports should include "browser" for @firebase/firestore
[REQUIRED] Describe your environment
- Operating System version: MacOs BigSur 11.6
- Browser version: Chrome Version 102.0.5005.115 (Official Build) (x86_64)
- Firebase SDK version: 9.8.4
- Firebase Product: firestore
[REQUIRED] Describe the problem
the import { getFirestore} from 'firebase/firestore/lite' (and firebase/firestore) will result in a following error:
Uncaught TypeError: Cannot read properties of undefined (reading 'stringify') which point to the index.esm2017.js:27 file.
I'm trying to use Firestore with Svelte (v.3.0.0) with Typescript and Rollup config. In my rollup.config.js I have:
...
resolve({
browser: true,
dedupe: ['svelte'],
})
...
I believe this is due to incorrect export configuration and mainly them missing the "browser" diist destination.
When you add the following line to node_modules/@firebase/firestore/package.json everything works and the build does not crash for the import:
...
"exports": {
".": {
"types": "./dist/index.d.ts",
"node": {
"require": "./dist/index.node.cjs.js",
"import": "./dist/index.node.mjs"
},
"react-native": "./dist/index.rn.js",
"esm5": "./dist/index.esm5.js",
"default": "./dist/index.esm2017.js"
},
"./lite": {
"types": "./dist/lite/index.d.ts",
"node": {
"require": "./dist/lite/index.node.cjs.js",
"import": "./dist/lite/index.node.mjs"
},
"react-native": "./dist/index.rn.js",
"esm5": "./dist/index.esm5.js",
"browser": "./dist/lite/index.browser.esm2017.js", // <-- added this
"default": "./dist/index.esm2017.js"
},
"./package.json": "./package.json"
},
...
Steps to reproduce:
Clone / create a new Svelte app with Typescript:
npx degit sveltejs/template firebase-test
cd firebase-test
node scripts/setupTypeScript.js
npm i firebase -D
Add the browser: true option to resolve in rollup.config.js
Start dev server:
npm run dev
When you open your browser with the default served local env http://localhost:8080
You'll see the issue.
Modify the above package.json to include "browser" exports.
restart your dev server with:
npm run dev
No errors in web console.
Relevant Code:
In your App.svelte just import the getFirestore from firebase/firestore/lite
<script lang="ts">
import { getFirestore } from 'firebase/firestore/lite';
// some other code
</script>
Hi @jbalidiong Thanks for the fix. The firestore/lite import paths are now working, but not the ones from firebase/firestore.
If I do something like
import { onSnapshot } from 'firebase/firestore'
I still get the same error.
@hsubox76, do you have any thoughts on this follow up question? It doesn't look related to your fix in #6418
It's not the same problem as before. The other fix was because the firestore/lite exports field was pointing to the firestore bundle, which I guess causes this problem when loaded. Pointing to the firestore/lite bundle avoided importing the problem bundle. Deliberately going back to importing the firestore bundle causes the same error which makes sense, because that was the same file being imported before, which the "firestore/lite" path was mistakenly pointing to.
The actual error is puzzling because it seems like it doesn't recognize JSON.stringify(), but it occurs in both dist/index.esm2017.js (where it seems to break?) and dist/lite/index.browser.esm2017.js (which seems to work?) I'll try to reproduce it locally with the information given in the original report.
I can't reproduce this error. I've followed the instructions above and put this in App.svelte:
<script lang="ts">
import { initializeApp } from 'firebase/app';
import { getFirestore, doc, onSnapshot } from 'firebase/firestore';
const fireApp = initializeApp({
apiKey: "AIzaSyB3BYpqf_FrZ2WQidSh9Ml04kuXJp3fvVk",
authDomain: "chholland-test.firebaseapp.com",
databaseURL: "https://chholland-test.firebaseio.com",
projectId: "chholland-test",
storageBucket: "chholland-test.appspot.com",
messagingSenderId: "91336787373",
appId: "1:91336787373:web:a3dffe45ec797267",
measurementId: "G-RV2DRJVZ88",
});
const ref = doc(getFirestore(app), "testCollection", "docWithSubCol");
onSnapshot(ref, (snap) => console.log(snap.data()));
export let name: string;
</script>
Everything seems to work fine, it's fetching and displaying the data. I haven't touched any of the other files in the template. Is there anything else I should be doing?
@aalakoski, can you provide a minimal reproducible example? Or otherwise, can you review the attempt to reproduce in the previous comment?
Hey @aalakoski. We need more information to resolve this issue but there hasn't been an update in 5 weekdays. I'm marking the issue as stale and if there are no new updates in the next 5 days I will close it automatically.
If you have more information that will help us get to the bottom of this, just add a comment!
Since there haven't been any recent updates here, I am going to close this issue.
@aalakoski if you're still experiencing this problem and want to continue the discussion just leave a comment here and we are happy to re-open this.