Skip to content

feat(firestore, web): Web implementation for Pipeline APIs#18100

Merged
SelaseKay merged 28 commits intofirestore-pipelines-dart-api-v2from
firestore-pipelines-web
Mar 26, 2026
Merged

feat(firestore, web): Web implementation for Pipeline APIs#18100
SelaseKay merged 28 commits intofirestore-pipelines-dart-api-v2from
firestore-pipelines-web

Conversation

@SelaseKay
Copy link
Copy Markdown
Contributor

Description

Replace this paragraph with a description of what this PR is doing. If you're modifying existing behavior, describe the existing behavior, how this PR is changing it, and what motivated the change.

Related Issues

Replace this paragraph with a list of issues related to this PR from the issue database. Indicate, which of these issues are resolved or fixed by this PR. Note that you'll have to prefix the issue numbers with flutter/flutter#.

Checklist

Before you create this PR confirm that it meets all requirements listed below by checking the relevant checkboxes ([x]).
This will ensure a smooth and quick review process. Updating the pubspec.yaml and changelogs is not required.

  • I read the Contributor Guide and followed the process outlined there for submitting PRs.
  • My PR includes unit or integration tests for all changed/updated/fixed behaviors (See Contributor Guide).
  • All existing and new tests are passing.
  • I updated/added relevant documentation (doc comments with ///).
  • The analyzer (melos run analyze) does not report any problems on my PR.
  • I read and followed the Flutter Style Guide.
  • I signed the CLA.
  • I am willing to follow-up on review comments in a timely manner.

Breaking Change

Does your PR require plugin users to manually update their apps to accommodate your change?

  • Yes, this is a breaking change.
  • No, this is not a breaking change.

@gemini-code-assist
Copy link
Copy Markdown
Contributor

Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

.toUpper();
case 'trim':
return (_expr(argsMap, _kExpression) as interop.ExpressionJsImpl)
.toLower();
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

case 'trim':
  return (_expr(argsMap, _kExpression) as interop.ExpressionJsImpl)
      .toLower();  // BUG: should be .trim()

Copy-paste bug. This will silently produce wrong results — a trim() call will lowercase the string instead of trimming whitespace.

Comment on lines +217 to +227
const firestoreServiceName = 'firestore';

if (service.name == firestoreServiceName) {
// Inject the Firestore Pipelines script. This bundle supports both
// Pipeline operations (Enterprise edition) and standard Firestore queries.
return injectSrcScript(
'https://www.gstatic.com/firebasejs/$version/firebase-firestore-pipelines.js',
'firebase_$firestoreServiceName',
);
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

We need to add a TODO or something? is it normal to inject it this way? Will it be supported in the normal bundle?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

https://www.gstatic.com/firebasejs/$version/firebase-firestore-pipelines.js bundle has support for both standard queries and Pipeline Operations. The previous bundle had support for only standard queries.

/// Converts Dart serialized pipeline expressions/stage args into JS pipeline
/// types by calling the pipelines interop API (field, constant, equal, and,
/// ascending, etc.) that mirrors the Firebase JS SDK.
class PipelineExpressionParserWeb {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Are we missing those?

  • negate
  • as_boolean
  • to_string_with_format
  • bit_and, bit_or, bit_xor, bit_not, bit_left_shift, bit_right_shift
  • document_id_from_ref
  • array_reverse
  • array_slice
  • distance
  • timestamp_diff
  • map_from_pairs

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Besides array_reverse, document_id_from_ref, and as_boolean the others are not supported on Web

return pipeline.union(otherPipeline);
default:
// Ignore unknown stages
return pipeline;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

default:
  // Ignore unknown stages
  return pipeline;

If a stage type is unrecognized, it's silently skipped. This could produce subtly wrong query results that are extremely hard to debug. This should throw an error instead, like:

default:
  throw FirebaseException(
    plugin: 'cloud_firestore',
    message: 'Unknown pipeline stage: ${stage['stage']}',
  );

Comment on lines +80 to +84
interop.PipelineResultJsImpl jsResult) {
final d = jsResult.data();
return d != null
? Map<String, dynamic>.from(dartify(d) as Map<Object?, Object?>)
: null;
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

If dartify(d) returns null even when d is non-null (e.g. a JS object that can't be converted), the as Map<Object?, Object?> cast will throw. The version in firestore.dart handles this more safely:

final parsed = dartify(d);
return parsed != null ? Map<String, dynamic>.from(parsed as Map<Object?, Object?>) : null;

@SelaseKay SelaseKay marked this pull request as ready for review March 26, 2026 15:33
@SelaseKay SelaseKay merged commit d6a945e into firestore-pipelines-dart-api-v2 Mar 26, 2026
26 of 30 checks passed
@SelaseKay SelaseKay deleted the firestore-pipelines-web branch March 26, 2026 15:33
SelaseKay added a commit that referenced this pull request Apr 10, 2026
* feat(firestore): introduce pipeline functionality (Dart API)

* fix

* fix: restore unrelated regressions in settings, changelog, pubspec and exports

Made-with: Cursor

* fix

* chore: fix formatting

* chore: add pipeline stages tests nd fix bugs

* chore: remove unnecessary parentheses in pipeline stage tests

* test: add aggregate stage serialization tests for pipeline stages

* test: add unit tests for pipeline expressions, ordering, sampling, and snapshot handling

* chore: improve formatting and readability in pipeline test files

* chore: update docs for PipelineSnapshot and PipelineResult

* chore: fix ci

* test: add serialization tests for arrayContainsAll and related expressions in pipeline expressions

* feat: add arrayContainsAll expressions for enhanced array handling in pipeline expressions

* refactor: remove PipelineFilter

* fix: update arrayConcat method to accept Object? and convert to Expression

* chore: remove unsupported expressions

* chore: add timestamp unit validation and enhance timestamp expression methods

* refactor: rename replace methods to stringReplaceAll

* refactor: update test for stringReplaceAll serialization

* chore: fix ci

* chore: fix ci

* docs: add documentation with examples for pipeline functions

* chore: add pipeline_example Flutter project and integration tests

* refactor: improve code formatting and add new execute options tests

* fix ci

* chore: add pipeline e2e test workflow and script for cloud_firestore

* refactor: remove commented-out button for stringReplaceAll in pipeline example

* chore: update e2e tests pipeline to include additional branches for triggering

* chore: add test comment in pipeline example for clarity

* chore: rename e2e pipeline and add iOS testing steps with Firebase configuration

* test ci

* chore: add workflow_dispatch trigger to e2e tests pipeline

* chore: remove Firebase options condition from e2e tests pipeline jobs

* chore: update e2e tests pipeline to run on macOS and implement flutter drive for integration tests

* chore: update cloud_firestore dependency to use local path in pipeline example

* chore: add dependency overrides for local development in cloud_firestore pipeline example

* chore: update analysis options and refactor integration tests

* refactor: improve formatting

* fix ci

* chore: remove Linux pipeline example files and associated configurations

* chore: refine e2e tests pipeline triggers and enhance iOS project setup for Swift Package Manager

* chore: add branch trigger for firestore-pipelines-ios in e2e tests pipeline

* chore: update minimum target version for iOS to 15

* chore: add iOS and macOS paths to e2e tests pipeline triggers

* refactor: improve code formatting in pipeline integration tests

* chore: add branch triggers for Android and Web in e2e tests pipeline

* fix formatting

* trigger CI

* chore: add more expression tests

* chore: add more tests

* fix ci

* chore: include web package in e2e tests pipeline

* chore: remove support for mapFromPairs(not supported on sdks)

* chore: remove support for arraySlice(not supported on SDKs)

* chore: remove arraySlice and _ArraySliceExpression due to SDK incompatibility

* feat(firestore, android): Android implementation for Pipeline APIs (#18098)

* feat(firestore): Android implementation for Pipeline APIs

* refactor: improve handling of timestamps and array expressions in pipeline

* chore: add support for more Expression functions in Android

* chore: remove unsupported 'replace' expression from Android Firestore pipeline API

* chore: enhance PipelineParser to support execute options for Firestore pipelines

* chore: remove commented-out button for stringReplaceAll in pipeline example

* trigger CI

* trigger CI

* trigger CI

* refactor: enhance expression parsing logic in ExpressionParsers

* feat(firestore, web): Web implementation for Pipeline APIs (#18100)

* feat(firestore): Web implementation for Pipeline APIs

* chore: fix ci

* chore: inject firestore pipelines script for web

* chore: add comments for Firestore Pipelines script injection in web implementation

* refactor: remove unecessary comment

* chore: add support for missing Expressions and fix bugs

* chore: fix ci

* feat: enhance pipeline expression handling with new expressions and error handling

* refactor: rename 'replace' case to 'string_replace_all' in pipeline expression parser

* chore: update Pipeline execution to accept options for index mode

* fix: resolve failing mapGet test on web

* fix: correctly parse 'not' expression arguments

* trigger CI

* fix tests

* fix tests

* fix: update type casting for boolean expression in PipelineExpressionParserWeb

* fix ci

* feat(firestore, iOS): iOS implementation for Pipeline APIs (#18099)

* feat(firestore): iOS implementation for Pipeline APIs

* fix: conditionally import FIRPipelineBridge.h for iOS

* chore: add macOS support for FLTPipelineParser by linking to iOS implementation

* fix: conditionally include FIRPipelineBridge.h for macOS support in FLTPipelineParser

* chore: add support for missing Expression function

* refactor: clean up formatting in FLTPipelineParser.m for improved readability

* chore: enhance FLTPipelineParser with support for array and map expressions, ensuring proper argument handling

* chore: implement conditional expression and current timestamp handling in FLTPipelineParser

* chore: add 'find_nearest' stage support in FLTPipelineParser with validation for vector_field, vector_value, and distance_measure

* chore: introduce FLTFirebaseFirestoreErrorCodePipelineParse for improved error handling in pipeline parsing

* trigger CI

* fix: update header inclusion logic for FirebaseFirestore in FLTPipelineParser.m

* trigger CI

* chore: enhance FLTPipelineParser with new expression handling

* chore: update e2e tests pipeline to ignore specific paths for pull requests and pushes

* chore: add new aggregate functions and expression methods

* fix: update end-to-end test to conditionally skip based on platform

* chore: fix ci

* chore: fix ci

* feat: add new pipeline expressions for regex, string manipulation, and aggregation

* fix ci

* fix: add conditional import for FIRVectorValue to FLTPipelineParser.m

* fix: update argument passing in PipelineExpressionParserWeb for type expression

* refactor: update type handling in pipeline expressions to use enum Type for better clarity and consistency

* fix ci
SelaseKay added a commit that referenced this pull request Apr 13, 2026
* feat(firestore): introduce pipeline functionality (Dart API) (#18096)

* feat(firestore): introduce pipeline functionality (Dart API)

* fix

* fix: restore unrelated regressions in settings, changelog, pubspec and exports

Made-with: Cursor

* fix

* chore: fix formatting

* chore: add pipeline stages tests nd fix bugs

* chore: remove unnecessary parentheses in pipeline stage tests

* test: add aggregate stage serialization tests for pipeline stages

* test: add unit tests for pipeline expressions, ordering, sampling, and snapshot handling

* chore: improve formatting and readability in pipeline test files

* chore: update docs for PipelineSnapshot and PipelineResult

* chore: fix ci

* test: add serialization tests for arrayContainsAll and related expressions in pipeline expressions

* feat: add arrayContainsAll expressions for enhanced array handling in pipeline expressions

* refactor: remove PipelineFilter

* fix: update arrayConcat method to accept Object? and convert to Expression

* chore: remove unsupported expressions

* chore: add timestamp unit validation and enhance timestamp expression methods

* refactor: rename replace methods to stringReplaceAll

* refactor: update test for stringReplaceAll serialization

* chore: fix ci

* chore: fix ci

* docs: add documentation with examples for pipeline functions

* chore: add pipeline_example Flutter project and integration tests

* refactor: improve code formatting and add new execute options tests

* fix ci

* chore: add pipeline e2e test workflow and script for cloud_firestore

* refactor: remove commented-out button for stringReplaceAll in pipeline example

* chore: update e2e tests pipeline to include additional branches for triggering

* chore: add test comment in pipeline example for clarity

* chore: rename e2e pipeline and add iOS testing steps with Firebase configuration

* test ci

* chore: add workflow_dispatch trigger to e2e tests pipeline

* chore: remove Firebase options condition from e2e tests pipeline jobs

* chore: update e2e tests pipeline to run on macOS and implement flutter drive for integration tests

* chore: update cloud_firestore dependency to use local path in pipeline example

* chore: add dependency overrides for local development in cloud_firestore pipeline example

* chore: update analysis options and refactor integration tests

* refactor: improve formatting

* fix ci

* chore: remove Linux pipeline example files and associated configurations

* chore: refine e2e tests pipeline triggers and enhance iOS project setup for Swift Package Manager

* chore: add branch trigger for firestore-pipelines-ios in e2e tests pipeline

* chore: update minimum target version for iOS to 15

* chore: add iOS and macOS paths to e2e tests pipeline triggers

* refactor: improve code formatting in pipeline integration tests

* chore: add branch triggers for Android and Web in e2e tests pipeline

* fix formatting

* trigger CI

* chore: add more expression tests

* chore: add more tests

* fix ci

* chore: include web package in e2e tests pipeline

* chore: remove support for mapFromPairs(not supported on sdks)

* chore: remove support for arraySlice(not supported on SDKs)

* chore: remove arraySlice and _ArraySliceExpression due to SDK incompatibility

* feat(firestore, android): Android implementation for Pipeline APIs (#18098)

* feat(firestore): Android implementation for Pipeline APIs

* refactor: improve handling of timestamps and array expressions in pipeline

* chore: add support for more Expression functions in Android

* chore: remove unsupported 'replace' expression from Android Firestore pipeline API

* chore: enhance PipelineParser to support execute options for Firestore pipelines

* chore: remove commented-out button for stringReplaceAll in pipeline example

* trigger CI

* trigger CI

* trigger CI

* refactor: enhance expression parsing logic in ExpressionParsers

* feat(firestore, web): Web implementation for Pipeline APIs (#18100)

* feat(firestore): Web implementation for Pipeline APIs

* chore: fix ci

* chore: inject firestore pipelines script for web

* chore: add comments for Firestore Pipelines script injection in web implementation

* refactor: remove unecessary comment

* chore: add support for missing Expressions and fix bugs

* chore: fix ci

* feat: enhance pipeline expression handling with new expressions and error handling

* refactor: rename 'replace' case to 'string_replace_all' in pipeline expression parser

* chore: update Pipeline execution to accept options for index mode

* fix: resolve failing mapGet test on web

* fix: correctly parse 'not' expression arguments

* trigger CI

* fix tests

* fix tests

* fix: update type casting for boolean expression in PipelineExpressionParserWeb

* fix ci

* feat(firestore, iOS): iOS implementation for Pipeline APIs (#18099)

* feat(firestore): iOS implementation for Pipeline APIs

* fix: conditionally import FIRPipelineBridge.h for iOS

* chore: add macOS support for FLTPipelineParser by linking to iOS implementation

* fix: conditionally include FIRPipelineBridge.h for macOS support in FLTPipelineParser

* chore: add support for missing Expression function

* refactor: clean up formatting in FLTPipelineParser.m for improved readability

* chore: enhance FLTPipelineParser with support for array and map expressions, ensuring proper argument handling

* chore: implement conditional expression and current timestamp handling in FLTPipelineParser

* chore: add 'find_nearest' stage support in FLTPipelineParser with validation for vector_field, vector_value, and distance_measure

* chore: introduce FLTFirebaseFirestoreErrorCodePipelineParse for improved error handling in pipeline parsing

* trigger CI

* fix: update header inclusion logic for FirebaseFirestore in FLTPipelineParser.m

* trigger CI

* chore: enhance FLTPipelineParser with new expression handling

* chore: update e2e tests pipeline to ignore specific paths for pull requests and pushes

* chore: add new aggregate functions and expression methods

* fix: update end-to-end test to conditionally skip based on platform

* chore: fix ci

* chore: fix ci

* feat: add new pipeline expressions for regex, string manipulation, and aggregation

* fix ci

* fix: add conditional import for FIRVectorValue to FLTPipelineParser.m

* fix: update argument passing in PipelineExpressionParserWeb for type expression

* refactor: update type handling in pipeline expressions to use enum Type for better clarity and consistency

* fix ci

* chore: remove unused branch triggers from e2e tests pipeline

* chore: add permissions section to e2e tests pipeline for content access

* chore: enhance FLTPipelineParser to support options in FIRFunctionExprBridge initializations

* chore: update Firebase SDK version to 12.11.0 in cloud_firestore Package.swift

* refactor: streamline FIRFunctionExprBridge initializations in FLTPipelineParser by removing unnecessary options parameter

* refactor: unify FIRFunctionExprBridge initialization logic in FLTPipelineParser to enhance compatibility across Firebase SDK versions

* chore: trigger CI
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.

3 participants