diff --git a/.changeset/eight-cows-push.md b/.changeset/eight-cows-push.md new file mode 100644 index 00000000000..cb549259387 --- /dev/null +++ b/.changeset/eight-cows-push.md @@ -0,0 +1,5 @@ +--- +"@firebase/firestore": patch +--- + +Fix Proto loading for Vercel/Next.js. diff --git a/packages/firestore/rollup.config.js b/packages/firestore/rollup.config.js index 6e0638284cb..ab20bf7a96f 100644 --- a/packages/firestore/rollup.config.js +++ b/packages/firestore/rollup.config.js @@ -23,6 +23,7 @@ import replace from 'rollup-plugin-replace'; import { terser } from 'rollup-plugin-terser'; import typescriptPlugin from 'rollup-plugin-typescript2'; import tmp from 'tmp'; +import { basename } from 'path'; import typescript from 'typescript'; import { generateBuildTargetReplaceConfig } from '../../scripts/build/rollup_replace_build_target'; @@ -31,16 +32,34 @@ import pkg from './package.json'; const util = require('./rollup.shared'); -// Customize how import.meta.url is polyfilled in cjs nodejs build. We use it to be able to use require() in esm. -// It only generates the nodejs version of the polyfill, as opposed to the default polyfill which -// supports both browser and nodejs. The browser support is unnecessary and doesn't work well with Jest. See https://github.com/firebase/firebase-js-sdk/issues/5687 -function importMetaUrlPolyfillPlugin() { +// Customize how import.meta.url is polyfilled in cjs nodejs build. We use it to +// be able to use require() in esm. It only generates the nodejs version of the +// polyfill, as opposed to the default polyfill which supports both browser and +// nodejs. The browser support doesn't work well with Jest. +// See https://github.com/firebase/firebase-js-sdk/issues/5687 +// Although this is a cjs Node build and shouldn't require the browser option, +// Vercel apps using this break on deployment, but work in local development. +// See https://github.com/firebase/firebase-js-sdk/issues/5823 +function importMetaUrlPolyfillPlugin(filename) { return { name: 'import-meta-url-current-module', resolveImportMeta(property, { moduleId }) { if (property === 'url') { - // copied from rollup output - return `new (require('url').URL)('file:' + __filename).href`; + // Added a check for Jest (see issue 5687 linked above) + // See https://jestjs.io/docs/environment-variables - apparently + // these are not always both set. + const JEST_CHECK = + `typeof process !== 'undefined' && process.env !== undefined` + + ` && (process.env.JEST_WORKER_ID !== undefined || ` + + `process.env.NODE_ENV === 'test')`; + // Copied from rollup output + return ( + `((typeof document === 'undefined' || (${JEST_CHECK})) ?` + + ` new (require('url').URL)` + + `('file:' + __filename).href : (document.currentScript && ` + + `document.currentScript.src || new URL('${filename}', ` + + `document.baseURI).href))` + ); } return null; } @@ -124,7 +143,7 @@ const allBuilds = [ plugins: [ ...util.es2017ToEs5Plugins(/* mangled= */ false), replace(generateBuildTargetReplaceConfig('cjs', 2017)), - importMetaUrlPolyfillPlugin() + importMetaUrlPolyfillPlugin(basename(pkg.main)) ], external: util.resolveNodeExterns, treeshake: {