Skip to content

Feat(Firestore) JSON serialization of types to improve SSR support. #8926

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 16 commits into from
Jun 23, 2025

Conversation

DellaBitta
Copy link
Contributor

@DellaBitta DellaBitta commented Apr 15, 2025

Discussion

Support the ability to resume onSnapshot listeners in the CSR phase based on serialized DataSnapshots and QuerySnapshots built in the SSR phase. Allow Firestore result types to be serialized with toJSON and then deserialized with fromJSON methods on the objects.

DocumentSnapshot and QuerySnapshot deserialization methods will be standalone, tree-shakable functions dataSnapshotFromJSON and querySnapshotFromJSON.

Testing

Integration Tests.
Unit Tests.
Locally tested with Next.JS.

Will add to our Next.js End to End test suite when the change has been staged.

API Changes

Approved go/fs-js-json-serialization.

DellaBitta and others added 3 commits April 1, 2025 15:23
…ure branch (#8872)

Merge the initial bundler implementation into the Firestore Result Serialization feature branch.
Implementation includes the ability to invoke `toJSON()` on `QuerySnapshot` and `DocumentSnapshot` instances.
…8896)

Pull request to add onSnapshot listeners support for bundles to the Firestore SSR serialization feature branch.

This change adds a series of onSnapshot overloads that match the existing onSnapshot variants (observer, individual callback functions, etc) but accepts a bundle instead of a QuerySnapshot or a DocumentSnapshot.

The toJSON methods of `QuerySnapshot` and `DocumentSnapshot` have also been updated to explicitly name the fields in the object return type.

Fixed an issue in the bundle builder where the bundleName for `DocumentSnapshots` didn't match the `ResourcePath` of the document, which is needed when reconstituting the `DocumentReference` in `onSnapshot`.

Finally, I cleaned up the text wrapping for the `onSnapshot` reference doc comments so they take up fewer lines of source code.
Copy link

changeset-bot bot commented Apr 15, 2025

⚠️ No Changeset found

Latest commit: 67cd379

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@google-oss-bot
Copy link
Contributor

google-oss-bot commented Apr 15, 2025

Size Report 1

Affected Products

  • @firebase/firestore

    TypeBase (13e6cce)Merge (3503366)Diff
    browser385 kB395 kB+9.29 kB (+2.4%)
    main596 kB615 kB+19.5 kB (+3.3%)
    module385 kB395 kB+9.29 kB (+2.4%)
    react-native386 kB395 kB+9.29 kB (+2.4%)
  • @firebase/firestore-lite

    TypeBase (13e6cce)Merge (3503366)Diff
    browser114 kB117 kB+2.56 kB (+2.2%)
    main157 kB160 kB+2.92 kB (+1.9%)
    module114 kB117 kB+2.56 kB (+2.2%)
    react-native114 kB117 kB+2.56 kB (+2.2%)
  • bundle

    15 size changes

    TypeBase (13e6cce)Merge (3503366)Diff
    firestore (CSI Auto Indexing Disable and Delete)280 kB290 kB+10.3 kB (+3.7%)
    firestore (CSI Auto Indexing Enable)280 kB290 kB+10.3 kB (+3.7%)
    firestore (Persistence)311 kB321 kB+10.3 kB (+3.3%)
    firestore (Query Cursors)256 kB260 kB+3.71 kB (+1.4%)
    firestore (Query)254 kB258 kB+3.71 kB (+1.5%)
    firestore (Read data once)242 kB247 kB+5.63 kB (+2.3%)
    firestore (Read Write w Persistence)336 kB341 kB+5.50 kB (+1.6%)
    firestore (Realtime updates)244 kB248 kB+3.83 kB (+1.6%)
    firestore (Transaction)221 kB226 kB+5.50 kB (+2.5%)
    firestore (Write data)220 kB228 kB+7.12 kB (+3.2%)
    firestore-lite (Query Cursors)109 kB111 kB+2.03 kB (+1.9%)
    firestore-lite (Query)105 kB107 kB+2.03 kB (+1.9%)
    firestore-lite (Read data once)80.6 kB82.8 kB+2.16 kB (+2.7%)
    firestore-lite (Transaction)106 kB108 kB+2.03 kB (+1.9%)
    firestore-lite (Write data)90.2 kB92.3 kB+2.03 kB (+2.2%)

  • firebase

    TypeBase (13e6cce)Merge (3503366)Diff
    firebase-compat.js802 kB806 kB+3.61 kB (+0.4%)
    firebase-firestore-compat.js347 kB351 kB+3.60 kB (+1.0%)
    firebase-firestore-lite.js137 kB140 kB+2.56 kB (+1.9%)
    firebase-firestore.js449 kB458 kB+9.26 kB (+2.1%)

Test Logs

  1. https://storage.googleapis.com/firebase-sdk-metric-reports/JU8yIx7tIn.html

@google-oss-bot
Copy link
Contributor

google-oss-bot commented Apr 15, 2025

Size Analysis Report 1

This report is too large (1,176,362 characters) to be displayed here in a GitHub comment. Please use the below link to see the full report on Google Cloud Storage.

Test Logs

  1. https://storage.googleapis.com/firebase-sdk-metric-reports/yd6aEBMMWd.html

@DellaBitta DellaBitta changed the title [Feat] WIP Firestore Snapshot serialization [Feat] WIP FS SSR serialization Apr 15, 2025
DellaBitta and others added 6 commits April 24, 2025 15:59
commit 05338d8
Author: DellaBitta <[email protected]>
Date:   Thu Apr 24 15:58:18 2025 -0400

    test fixes

commit 28c6da9
Author: DellaBitta <[email protected]>
Date:   Thu Apr 24 15:39:22 2025 -0400

    update vector_value

commit 0aa81ce
Author: DellaBitta <[email protected]>
Date:   Thu Apr 24 15:39:11 2025 -0400

    update reference

commit e20bac9
Author: DellaBitta <[email protected]>
Date:   Thu Apr 24 15:24:50 2025 -0400

    update timestamp

commit 05b29c4
Author: DellaBitta <[email protected]>
Date:   Thu Apr 24 15:24:39 2025 -0400

    update geopoint

commit 4cf66f2
Author: DellaBitta <[email protected]>
Date:   Thu Apr 24 15:16:15 2025 -0400

    convert DocumentReference to new JSON validator.

commit 00a2423
Author: DellaBitta <[email protected]>
Date:   Thu Apr 24 13:44:27 2025 -0400

    format fix.

commit 09eb5cf
Author: DellaBitta <[email protected]>
Date:   Thu Apr 24 13:43:13 2025 -0400

    Bytes prototype.

commit b753f49
Author: DellaBitta <[email protected]>
Date:   Thu Apr 24 13:26:41 2025 -0400

    Linter doesn't like it, but API extractor does

commit 775cc69
Author: DellaBitta <[email protected]>
Date:   Thu Apr 17 13:13:52 2025 -0400

    lower case types

commit 188c86f
Author: DellaBitta <[email protected]>
Date:   Thu Apr 17 10:41:58 2025 -0400

    DocumentReference unit and integration tests

commit 44d8045
Author: DellaBitta <[email protected]>
Date:   Wed Apr 16 20:39:55 2025 -0400

    map Timestamp fields to DbTimestamp fields

commit f305182
Author: DellaBitta <[email protected]>
Date:   Wed Apr 16 15:54:23 2025 -0400

    DocumentReference impl

commit 05a49aa
Author: DellaBitta <[email protected]>
Date:   Wed Apr 16 11:14:00 2025 -0400

    Timestamp, GeoPoint, VectorValue

commit 1652e8b
Author: DellaBitta <[email protected]>
Date:   Tue Apr 15 17:33:51 2025 -0400

    format

commit 8a081e1
Author: DellaBitta <[email protected]>
Date:   Tue Apr 15 17:26:09 2025 -0400

    Bytes and VectorValue to/from JSON

commit 2a07791
Author: DellaBitta <[email protected]>
Date:   Tue Apr 15 14:07:25 2025 -0400

    Bytes
Add a methods to parse bundles synchronously to extract single `DocumentSnapshots` or `QuerySnapshots` containing documents. Hook the new bundle parser up the `documentSnapshotFromJSON` and `querySnapshotFromJSON`.

### Testing

Local testing with Next.js app.
Added unit tests and integration tests.

### API Changes
go/fs-js-json-serialization
To reduce bundle size on clients, the `toJSON` methods of `DocumentSnapshot` and `QuerySnapshot` will not create bundles.

### Testing

Updated the integration and unit tests to test `fromJSON` functionality in node environments only.

I did attempt to create pre-packaged bundles so that we can test in browser still, but unforunately the bundle includes the project name, and the project that we test against varies depending on the profile of tests that were running (prod, local, etc). If these don't match then an error is thrown.

### API Changes

N/A
@DellaBitta DellaBitta changed the title [Feat] WIP FS SSR serialization [Feat] FS SSR serialization Jun 16, 2025
@DellaBitta DellaBitta marked this pull request as ready for review June 16, 2025 13:02
@DellaBitta DellaBitta requested review from a team as code owners June 16, 2025 13:02
Copy link
Contributor

@hsubox76 hsubox76 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Deferring to Firestore team for Firestore complexities but LG from my end minus some nits.

@DellaBitta DellaBitta requested a review from hsubox76 June 18, 2025 14:28
@DellaBitta DellaBitta changed the title [Feat] FS SSR serialization [Feat] Firestore SSR serialization Jun 18, 2025
Copy link
Contributor

@MarkDuckworth MarkDuckworth left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. I left a few questions, but nothing that should block, unless you want it to

* NOTE: Although an `onCompletion` callback can be provided, it will never be called because the
* snapshot stream is never-ending.
*
* @param firestore - The {@link Firestore} instance to enable persistence for.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this comment is wrong.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not related to enabling persistence

Copy link
Contributor Author

@DellaBitta DellaBitta Jun 20, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done. Changed it to:

* @param firestore - The {@link Firestore} instance to enable the listener for.

* NOTE: Although an `onCompletion` callback can be provided, it will never be called because the
* snapshot stream is never-ending.
*
* @param firestore - The {@link Firestore} instance to enable persistence for.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

throw new FirestoreError(
Code.FAILED_PRECONDITION,
'QuerySnapshot.toJSON() attempted to serialize a document with pending writes. ' +
'Await waitForPendingWrites() before invoking toJSON().'
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm wondering if we should put this statement in the TSDoc for this method. Might be a nice to have.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

);
}

// Create an internal Query object from the named query in the budnle.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

typo in bundle

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed, thanks!

return new Timestamp(json.seconds, json.nanoseconds);
}
throw new FirestoreError(
Code.INTERNAL,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did this switch from InvalidArgument to Internal? Should it be InvalidArgument?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm probably not remembering correctly.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated it to InvalidParameter for all new fromJSON implementations.


/**
* Validates the JSON object based on the provided schema, and narrows the type to the provided
* JSON schaem.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

typo

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed.

@DellaBitta DellaBitta requested a review from MarkDuckworth June 20, 2025 19:30
@DellaBitta DellaBitta changed the title [Feat] Firestore SSR serialization Feat(Firestore) serialization of types to improve SSR support. Jun 23, 2025
@DellaBitta DellaBitta changed the title Feat(Firestore) serialization of types to improve SSR support. Feat(Firestore) JSON serialization of types to improve SSR support. Jun 23, 2025
@DellaBitta DellaBitta merged commit 7ae5b12 into main Jun 23, 2025
68 of 69 checks passed
@DellaBitta DellaBitta deleted the ddb-firestore-result-serialization branch June 23, 2025 18:57
@DellaBitta DellaBitta restored the ddb-firestore-result-serialization branch June 23, 2025 18:58
DellaBitta added a commit that referenced this pull request Jun 23, 2025
Add the missing changset for PR #8926.
MarkDuckworth added a commit that referenced this pull request Jun 26, 2025
* Version Packages (#8635)

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>

* Wait for service worker registration to become active before any operations (#8661)

* Clear fetch abort timeout (#8663)

* Clear fetch abort timeout

* Add timeout constant and bring back minimum timeout value

* Support streaming streaming responses for callable functions. (#8609)

The new .stream() API allows the client to consume streaming responses from the WIP streaming callable functions in Firebase Functions Node.js SDK.

When client makes a request to the callable function w/ header Accept: text/event-stream, the callable function responds with response chunks in Server-Sent Event format.

The sdk changes here abstracts over the wire-protocol by parsing the response chunks and returning an instance of a AsyncIterable to consume to data:

import { getFunctions, httpsCallable } from "firebase/functions";

const functions = getFunctions();
const generateText = httpsCallable(functions, 'generateText');
const resp = await generateText.stream(
  { text: 'What is your favorite Firebase service and why?' },
  { signal: AbortSignal.timeout(60_000) },
);
try {
  for await (const message of resp.stream) {
     console.log(message); // prints "foo", "bar"
  }
  console.log(await resp.data) // prints "foo bar"
} catch (e) {
  // FirebaseError(code='cancelled', message='Request was cancelled.');
  console.error(e)
}

* Fixed issue where multiple calls to connectDataConnectEmulator causes an exception (#8664)

* Convert e2e unit tests to use Jest (#8666)

* Add ts-node dep - needed to read jest.config.ts (#8670)

* Use ubuntu-latest for Firefox CI tests (#8671)

* Version Packages (#8672)

Version Packages for release v11.1.0

* Disable TOC array indentation (#8637)

* Disable TOC array indentation

* add function streaming toc docs

* Fix: sort document reference by long type id (#8673)

* Set e2e test workflow to poll npm to check the version is available (#8684)

* fix regex to include non-numeric (#8692)

* feat(rc): Add custom signals support (#8602)

Add support for custom signal targeting in Remote Config. Using this feature, developers can set custom signals (key/value pairs) in their apps and use them for building custom targeting conditions in their templates.

Design doc (internal): [go/rc-custom-targeting-dd](http://goto.google.com/rc-custom-targeting-dd)
API Proposal (internal): [go/remote-config-custom-targeting-signals-api-review](https://goto.google.com/remote-config-custom-targeting-signals-api-review)

* Replace uuidv4 generator with `crypto.randomUUID()` (#8600)

* Replace uuidv4 generator with `crypto.randomUUID()`

The uuidv4 generator in util used `Math.random()`, which does not provide strong uniqueness guarantees
(https://www.bocoup.com/blog/random-numbers).

The places where the uuidv4 generator were used didn't require strong
uniqueness guarantees (nothing security related), but I think it's good
to move away from this from util in case we try to use it in the future.

A better built-in alternative is `crypto.randomUUID()`, which does provide strong
uniqueness guarantees. Since this is a more modern JS built-in, it's
only [defined in secure
contexts](https://blog.mozilla.org/security/2018/01/15/secure-contexts-everywhere/).
Is this something we're concerned about? Are there any App Check users
with apps running in non-secure environments?

* Update API reports

* Add changeset

* Add comment about availability restricted to secure contexts

---------

Co-authored-by: dlarocque <[email protected]>

* Update CODEOWNERS for Auth (#8694)

* Update GitHub Artifact Actions to v4 (#8128)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Updated FDC to include promise instead of promiselike (#8667)

* Update actions/setup-node action to v4 (#8186)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update actions/github-script action to v7 (#8154)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update actions/checkout action to v4 (#8153)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Use versions instead of commits in vertexai responses actions scripts (#8702)

* Add FDC Integration Tests (#8703)

* Upgrade two more `download-artifact` v3 actions to v4  in Firestore workflow (#8706)

There were a pair of `download-artifact` GitHub actions that were still set to `v3` instead of `v4`. The `v3` actions were unable to find the build archive in the test-changed-firestore workflow. This PR upgrades those to `v4` actions.

* Version Packages (#8705) v11.2.0

Release v11.2.0
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>

* chore(deps): replace dependency npm-run-all with npm-run-all2 5.0.0 (#8112)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Add App Check token to FirebaseServerApp (#8651)

 FirebaseServerApp now accepts an optional App Check token at initialization. The product SDKs will look for this token, and if it's present, the SDKs will use this value in lieu of calling getToken on App Check.

This change affects the following SDKs: Auth, Cloud Functions, Data Connect, Firestore, Realtime Database, Vertex AI

* Update rollup-plugin-terser dep (#8709)

* chore(deps): update actions/github-script action to v7 (#8711)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Fireperf web vitals (#8644)

* Add support for capturing web vitals metrics in Firebase performance for Web (Largest Contentful Paint, Interaction to Next Paint, Cumulative Layout Shift)
* Modifies export to use sendBeacon instead of fetch API, and shifts the upload time to the first time the page is hidden or unloaded.

* Update a lot of dependencies (#8716)

* chore(config): migrate config renovate.json (#8723)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update actions/setup-node action to v4 (#8712)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* chore(deps): update dependency firebase-tools to v13 [security] (#8607)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Have renovate ignore karma-webpack (#8725)

* Workflow CI: Update CHROME_VALIDATED_VERSION for Auth tests (#8722)

Update our CI's logged `CHROME_VALIDATED_VERSION` to the currently tested version. We haven't updated it in a while.

Keeping this up to date should reduce support burden later.

* chore(deps): update dependency @rollup/plugin-json to v6 (#8727)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update dev dependency firebase-tools

13.6.0 -> 13.29.2

* Discard earliest heartbeat once there are 30 heartbeats (#8724)

* Delete earliest heartbeats only once there are 30 heartbeats

* Add changeset

* Use max heartbeat const in tests

* Fix test name in all caps

* Fix test names

* Formatting

* Fix negative offset of reconnect delay (#8718) (#8719)

RTDB Fix negative offset of reconnect delay. Fixes #8718.

* Swap Performance's owner from jposuna to visumickey (#8737)

* Give `check-version` job pull request write permissions (#8743)

* Add pull_request write permissions

* fix typo

* Skip flaky auth recaptcha test (#8753)

* Update dependencies in packages and repo-scripts (#8729)

* Add ActionCodeSettings.linkDomain and deprecate ActionCodeSettings.dynamicLinkDomain (#8738)

* Add linkDomain field to ActionCodeSettings (#8428)

* Add linkDomain field to ActionCodeSettings

* Update API reports

* Update error message for ERROR_INVALID_HOSTING_LINK_DOMAIN to include that default hosting domains cannot be used.

* Use constants for test values

---------

Co-authored-by: NhienLam <[email protected]>

* FDL Deprecation & Hosting link Integration Test (#8603)

* Implement Integration test for passwordless email sign-in via firebase-hosting links.

* Add license to new test file created' did not match any files

* Remove unwanted _

* Add support for setting custom hosting link domain in test app (#8614)

* Add afterEach method and apply formatting to the hosting links integration test (#8615)

* Mark ActionCodeSettings.dynamicLinkDomain as deprecated

* Add changeset

* Update API reports

* Address review comments

* Fix changeset

* Update refdocs and address review comments

* Update deprecated comment

* Add FDL deprecation FAQ link

* Fix linkDomain link in refdocs

---------

Co-authored-by: NhienLam <[email protected]>
Co-authored-by: mansisampat <[email protected]>

* FIX: sort strings in UTF-8 encoded byte order (#8691)

* Added more granular tracking for web frameworks

* fix "TextEncoder undefined" issue in some platforms (#8765)

* Version Packages (#8766)

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>

* Adds a "firebase" changeset to release PR as needed (#8770)

* Use Node's `TextEncoder` in E2E JSDOM Environment (#8783)

* Update Firebase index.d.ts type definition file reference (#8543)

Signed-off-by: Emmanuel Ferdman <[email protected]>

* Revert the UTF-8 encoding in string sorting (#8782)

* Version Packages (#8786)

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>

* Emulator Idempotency: Firestore (#8780)

Update `connectFirestoreEmulator` to support its invocation more than once. If the Firestore instance is already in use, and `connectFirestoreEmulator` is invoked with the same configuration, then the invocation will now succeed instead of assert.

The implementation takes the Data Connect implementation as inspiration. Data Connect stores the parameters passed to `connectDataConnectEmulator` on the instance of Data Connect itself, so that they can be quickly checked to see if subsequent invocations match. This PR implements a similar storage and compare process with the optional `emulatorOptions` parameter (host and port are already stored).

This PR unlocks support for SSR frameworks which render the page numerous times with the same instances of Firestore. Before this PR customers were required to guard against calling `connectFirestoreEmulator` in their SSR logic, which added to code complexity. Now the Firebase SDK does that guarding logic so that our users' apps don't have to.

* Emulator Idempotency: Database (#8769)

Update the `connectDatabaseEmulator` function to support its invocation more than once. If the Database instance is already in use, and `connectDatabaseEmulator` is invoked with the same configuration, then the invocation will now succeed instead of assert.

This unlocks support for web frameworks which may render the page numerous times with the same instances of RTDB. Before this PR customers needed to add extra code to guard against calling `connectDatabaseEmulator` in their SSR logic. Now we do that guarding logic on their behalf which should simplify our customer's apps.

Fixes #6824.

* SSR related improvements for RC client SDK. (#8699)

SSR related improvements for RC client SDK.

* Exposes an initialFetchResponse arg that pre-hydrates the client SDK state
* Adds an argument that allows setting an alternate template ID to fetch from
* Splits storage impls into a simple in-memory version that can be run in SSR contexts
* Adds some basic tests for the API functions, which were previously untested

* Emulator Idempotency: Auth (#8750)

Update the `connectAuthEmulator` function to support its invocation more than once. If the Auth instance is already in use, and `connectAuthEmulator` is invoked with the same configuration, then the invocation will now succeed instead of assert.

This unlocks support for web frameworks which may render the page numerous times with the same instances of auth. Before this PR customers needed to add extra code to guard against calling `connectAuthEmulator` in their SSR logic. Now we do that guarding logic on their behalf which should simplify our customer's apps.

Fixes #6824.

* Upgrade dependencies (#8781)

* first batch

* @rollup/plugin-node-resolve 13 -> 16

* Publish VertexAI API's tagged with `@beta` (#8788)

* Filter empty text parts when streaming (#8736)

* Filter empty text parts when streaming

* Add changeset

* Remove unused filterEmptyTextParts()

* Move logic into a function

* final

* dont throw if mock response file isn't found

* update responses version to 6

* Only ignore empty text parts in the aggregated response.

* review fixes

* Throw in `aggregateResponses` if `newPart` has no properties

* Change API Documenter (BETA) annotation to (Public Preview) (#8789)

* Change (BETA) annotation to (Public Preview)

* format

* Minor bump

* Create VertexAI Node CJS and ESM bundles (#8728)

* Create Node CJS and ESM bundles

* Add changeset

* Run formatter

* register version with node

* Catch errors in debug token exchange logic (#8792)

* Throw error if mock response file not found (#8739)

* Fix vectorvalue docs (#8453)

* Fix vectorvalue docs

* Use @link vector

* Fix vector link with code tag

* Re-enable auth redirect tests (#8803)

* Re-enable redirect tests

* Fix lint

* Add Image Generation support using Imagen (#8683)

* WIP

* Introduce VertexAIModel base class, add documentation, and respond to other comments

* Generate devsite docs

* revert dataconnect change

* formatting

* WIP

* Introduce VertexAIModel base class, add documentation, and respond to other comments

* Generate devsite docs

* revert dataconnect change

* formatting

* Fix ImagenRequestConfig comment

* Improve tests

* Formatting

* Add ImagenGenerationResponse

* Formatting

* Update to match API changes

* fixes

* format

* Update API reports

* add changeset

* update

* format

* Update API reports

* remove public docs

* Nest imageFormat in outputOptions

* remove unecessary console.log

* Log warning if compressionQuality outside of range

* format

* Imagen Documentation (#8776)

* Revert "remove public docs"

This reverts commit f095563.

* update docs

* update docs

* format

* minor fixes

* format

* mark all APIs beta instead of public

* review fixes

* format

* Replace (BETA) with (Public Preview) in docs

* fix links

* another pass

* format

* review fixes

* Cleanup

* update changeset

---------

Co-authored-by: dlarocque <[email protected]>

* Add support for token-based usage metrics.  (#8757)

* Add support for token-based usage metrics.

Token measurement is broken down by modaliy, with separate counters for image, audio, etc.

Tests are in version 6.*, so this change also includes bumping update_responses.sh

* Use right name for unspecified enum

* Update API reports

* Make promptTokensDetails an array

* Update API reports

* Add missing documentation

* Add changeset entry

* Fix formatting errors

* Update API reports

* Add missing refdoc

* Update API reports

* Use correct formatting for Modality documentation.

* Update API reports

* Update docs

* Update packages/vertexai/src/types/enums.ts

Co-authored-by: rachelsaunders <[email protected]>

* Update md files

* Revert changes to api-extractor.json

---------

Co-authored-by: rachelsaunders <[email protected]>

* Add Vertex and DataConnect E2E smoke tests (#8805)

* Update dev script dependency @changesets/types to v6 (#8806)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Bump cross-spawn from 7.0.3 to 7.0.6 in /e2e (#8645)

Bumps [cross-spawn](https://github.com/moxystudio/node-cross-spawn) from 7.0.3 to 7.0.6.
- [Changelog](https://github.com/moxystudio/node-cross-spawn/blob/master/CHANGELOG.md)
- [Commits](moxystudio/node-cross-spawn@v7.0.3...v7.0.6)

---
updated-dependencies:
- dependency-name: cross-spawn
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Revert "Bump cross-spawn from 7.0.3 to 7.0.6 in /e2e (#8645)" (#8811)

This reverts commit 117279e.

* App Hosting JS SDK autoinit (#8483)

Adds a `postinstall` step to `@firebase/util` which hardcodes autoinit defaults into `@firebase/util/dist/postinstall.(m)js` for both CJS and ESM variants [go/firestack-autoinit](http://goto.google.com/firestack-autoinit). 

Hardcoding is important since environment variable substitution doesn't dive into a developer's `node_modules` folder. This gives us a framework agnostic way to inject configuration and is a more robust solution than the _experimental_ autoinit methods provided by Web Frameworks [go/firebase-api-client-autoinit](https://goto.google.com/firebase-api-client-autoinit). Once this lands, we'll backport to Hosting and Functions and aim to deprecate the other autoinit methods.

* Added non-null properties to database.ThenableReference (#8800)

* Version Packages (#8794)

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>

* DataConnect: Update requests to point to v1 backend endpoints instead of v1beta (#8820)

* update API requests to point to v1 instead of v1beta

* update changelog

* Remove auto-commit API report workflow (#8808)

* Add missing `BlockReason` and `FinishReason` enum values (#8741)

* Convert enum comments to JSDoc comments (#8742)

* Add `systemInstruction`, `tools`, and `generationConfig` to `CountTokensRequest` (#8827)

* Update yarn.lock in e2e (#8831)

* Fix transport service retry logic condition (Fixes #8813) (#8814)

Modify the retry mechanism to stop when remaining tries is less than or equal to zero, improving the robustness of the retry handling.

Fixes #8813

* Give `check-changeset` job pull request write permissions (#8833)

* Fix: sort strings in UTF-8 encoded byte order with lazy encoding (#8787)

* fix golden files test (#8843)

* fix golden files test

* update responses version

---------

Co-authored-by: David Motsonashvili <[email protected]>

* Surface all App Check errors in public getToken() method (#8842)

* Grant Create PR workflow pull-request write perms. (#8846)

Our staging release workflow failed to create a Version Packages PR. Grant the PR creation workflow `pull-request` `write` permissions.

* Grant Create PR content write permissions. (#8848)

Our staging release workflow failed to merge branch. Grant the PR creation workflow `content` `write` permissions to fix this.

* Version Packages (#8849) - v11.5.0

Release version 11.5.0.

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Deprecate `GroundingAttribution` (#8832)

* Stream full logs of test-all firestore job (#8851)

* Set github actions to use commit hashes (#8852)

* Implement Partial Errors for FDC (#8821)

* Add `X-Firebase-AppId` header to VertexAI requests (#8809)

* Update dependency webpack to v5.94.0 [SECURITY] (#8734)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* Update dependency express to v4.20.0 [SECURITY] (#8759)

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>

* karma.base.js: replace "BROWSER" with "BROWSERS" in log messages, to reflect the actual name of the environment variable (see #8491) (#8875)

* Auth cookie persistence (#8839)

Adding `Persistence.COOKIE` a new persistence method backed by cookies. The `browserCookiePersistence` implementation is designed to be used in conjunction with middleware that ensures both your front and backend authentication state remains synchronized.

* firestore: fix `undefined` document snapshot data after "clear site data" (#8871)

* Use base browsers variable in Firestore karma config (#8876)

* [chore] Update some dependencies (#8868)

* Version Packages (#8878)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Fix 'window is not defined' error when calling clearIndexedDbPersistence

* Fix Data Connect Types (#8898)

* test(vertexai): update mock responses to v8 (#8904)

* Fix: display WebChannel error message (#8907)

* test(vertexai): add `backendName` param to mock response getters (#8906)

`backendName` can be either `googleAI` or `vertexAI`. This can be passed
to `getMockResponse` or `getMockResponseStreaming` to specify whether
the mock response lookup should be done in the set of vertexAI or
googleAI mock files.

Modified the `convert-mocks.ts` script to read mock responses from the
'developerapi' directory, and add an export to the generated file for
the new lookup object with those mock responses.

* fix: remove `null` value inclusion from `!=` and `not-in` filter results (#8915)

* Add assertion IDs that will be included in production log statements for fail and hardAsserts (#8313)

* docs(vertexai): remove HTML `<code>` tags (#8900)

We wrap links that reference public APIs with `<code>` tags so that they
can be rendered as code in devsite. Unfortunately, VSCode's hover
feature can not render these links at all.

Since there are no other alternatives for creating code-formatted links,
we should remove the problematic HTML `<code>` tags.

* test(vertexai): update developerapi mock response dir to googleai (#8921)

* Fix languageCode parameter in action_code_url (#8912)

* Fix languageCode parameter in action_code_url

* Add changeset

* test(vertexai): update mock responses to v10 (#8959)

* Version Packages (#8956)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Improve the integration test coverage for online vs offline comparisons. (#8975)

* Improve the integration test coverage for online vs offline comparisons.

* prettier.

* Add missing cases.

* fix(vertexai): add missing quote to chat role error message (#8979)

* Auto Enable SSL for Firebase Studio (#8980)

* Add support for running the emulators in Cloud Workstation (#8968)

* Add Cookie Support For Firebase Studio (#8986)

* Fix Auth Port for Firebase Studio (#8998)

* Change automaticDataCollectionEnabled to default to true. (#8999)

* Version Packages (#8997)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Roll back #8999 (#9007)

* Revert "Change automaticDataCollectionEnabled to default to true. (#8999)"

This reverts commit 3789b5a.

* Revert #8999 - backend is not ready

* Version Packages (#9008)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* fix(vertexai): pass `GenerativeModel`'s `BaseParams` to `ChatSession` (#8972)

startChat wasn't passing GenerativeModel's BaseParams to ChatSession.
So, if a model had a generationConfig, it would never be passed to ChatSession.

* feat(vertexai): Gemini multimodal output (#8922)

Adds new ResponseModality enum that allows users to specify which modalities should be included in a response.
Since we provide a text() accessor, a similar inlineDataParts() accessor was added to return all InlineDataPart[] in the first candidate.

* test: Clean up vscode launch file and add vertexai debug config (#9000)

* Fix encoding of CSI keys in Safari (#8993)

* Restore #8999 (#9010)

* Revert "Roll back #8999 (#9007)"

This reverts commit 51e7b48.

* Changeset

* feat(ai): Migrate to `AI` and add GoogleAI support (#8931)

* Add Emulator Overlay (#8977)

* Rename `@firebase/vertexai` package to `@firebase/ai` (#9011)

* Add Emulator Overlay (#8977) (#9031)

Co-authored-by: Maneesh Tewani <[email protected]>

* add temporary release branch (#9032)

* Allow custom branch for release (#9033)

* add temporary release branch

* restore Vertex token for temp publish (#9036)

* Version Packages (manual PR) (#9034)

* Fixed scroll behavior (#9043)

* Version Packages (manual PR) (#9044)

* Remove redundant changeset

* Update e2e tests to reflect AI package and new API (#9017)

* Version Packages (#9016)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Revert "Fixed scroll behavior (#8977)" (#9053)

* Revert "Fixed scroll behavior (#9043)"

This reverts commit 9bcd1ea.

* Revert "Add Emulator Overlay (#8977) (#9031)"

This reverts commit 8593fa0.

* Undid revert of util

* Create dirty-crews-cross.md

* Removed unnecessary markdown file

* Updated to only show banner when calling connect*Emulator (#9055)

* Version Packages (#9054)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* Close webchannel instances on terminate (#9041)

Explicitly close any unclosed WebChannel instances on Firestore#terminate()

* Reorder reporters to prevent log message duplication in CI (#9040)

* docs(ai): Fix 'occured' typo in error codes (#9021)

* feat(ai): Add `HarmBlockThreshold.OFF` (#9050)

* feat(ai): Schema `title`, `maximum`, `minimum`, and `propertyOrdering` (#9047)

* feat(ai): Add support for `minItems` and `maxItems` to `Schema` (#9026)

* Build out e2e subdirectories (#9065)

* Added test project to fdc (#8924)

* Version Packages (#9073)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

Release version 11.9.0.

* test(ai): add integration tests (#8853)

* Update issue template to rename VertexAI > AI (#9074)

* ci: Fix Firefox error and streamline cross-browser tests (#9015)

* Fixed issue where requestSts wasn't including the Studio cookie in it (#9075)

* Fix issue where we ping an endpoint that hasn't been implemented (#9059)

* Updated firebase auth changeset (#9088)

* build(all): Version Packages v11.9.1 (#9089)

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

v11.9.1 release.

* test(ai): Upgrade mock responses to v14 (#9091)

* Feat/google3 typings support (#9085)

* fix(ai): Add deprecation tag to `totalBillableCharacters` (#9090)

* test(ai): Add `gemini-2.5-flash` to integration tests (#9110)

Added gemini-2.5-flash to our integration tests now that it's publicly available.

The token counts differ slightly between 2.0-flash and 2.5-flash so I introduced conditionals when checking token counts.

* firestore: minor refactor of listener registration of "versionchange" indexedb events (#9087)

* Fixed issue where storage wasn't passing cookies when using firebase Studio (#9111)

* fix: Add "react-native" entry point to @firebase/app (#9112)

* Feat(Firestore) JSON serialization of types to improve SSR support. (#8926)

Support the ability to resume `onSnapshot` listeners in the CSR phase based on serialized `DataSnapshot`s and `QuerySnapshot`s built in the SSR phase. Allow Firestore result types to be serialized with `toJSON` and then deserialized with `fromJSON` methods on the objects.

`DocumentSnapshot` and `QuerySnapshot` deserialization methods will be standalone, tree-shakable functions `dataSnapshotFromJSON` and `querySnapshotFromJSON`.

* chore(Firestore) add changeset for PR #8926 (#9115)

Add the missing changset for PR #8926.

* Build fixes

* yarn.lock

* formatting

---------

Signed-off-by: Emmanuel Ferdman <[email protected]>
Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: Google Open Source Bot <[email protected]>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: Christina Holland <[email protected]>
Co-authored-by: Daniel La Rocque <[email protected]>
Co-authored-by: Daniel Lee <[email protected]>
Co-authored-by: Maneesh Tewani <[email protected]>
Co-authored-by: DellaBitta <[email protected]>
Co-authored-by: Mila <[email protected]>
Co-authored-by: Ashish Kothari <[email protected]>
Co-authored-by: dlarocque <[email protected]>
Co-authored-by: Nhien (Ricky) Lam <[email protected]>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: DellaBitta <[email protected]>
Co-authored-by: Bryan Atkinson <[email protected]>
Co-authored-by: Alexander <[email protected]>
Co-authored-by: jposuna <[email protected]>
Co-authored-by: NhienLam <[email protected]>
Co-authored-by: mansisampat <[email protected]>
Co-authored-by: Stephen Rosa <[email protected]>
Co-authored-by: Emmanuel Ferdman <[email protected]>
Co-authored-by: Kevin Elko <[email protected]>
Co-authored-by: Rodrigo Lazo <[email protected]>
Co-authored-by: rachelsaunders <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: James Daniels <[email protected]>
Co-authored-by: Rich Hodgkins <[email protected]>
Co-authored-by: Leo <[email protected]>
Co-authored-by: David Motsonashvili <[email protected]>
Co-authored-by: David Motsonashvili <[email protected]>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Denver Coneybeare <[email protected]>
Co-authored-by: Pavan Shankar <[email protected]>
Co-authored-by: Ehsan <[email protected]>
Co-authored-by: eranc-google <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants