@firebase/firestore
Version:
The Cloud Firestore component of the Firebase JS SDK.
1,101 lines (1,085 loc) • 42.2 kB
JavaScript
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var common = require('./common-D8YuAUTW.cjs.js');
require('@firebase/app');
require('@firebase/util');
require('@firebase/webchannel-wrapper/bloom-blob');
require('@firebase/logger');
require('@firebase/webchannel-wrapper/webchannel-blob');
require('re2js');
/**
* @license
* Copyright 2025 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @deprecated use selectablesToObject instead
* @param selectables
*/ function __PRIVATE_selectablesToMap(a) {
return new Map(Object.entries(__PRIVATE_selectablesToObject(a)));
}
function __PRIVATE_selectablesToObject(a) {
const t = {};
for (const n of a) {
let a, i;
if ("string" == typeof n ? (a = n, i = common.e(n)) : n instanceof common.o || n instanceof common.c ? (a = n.alias,
i = n.expr) : common.l(21273, {
selectable: n
}), void 0 !== t[a]) throw new common.s("invalid-argument", `Duplicate alias or field '${a}'`);
t[a] = i;
}
return t;
}
/**
* Converts a value to an Expression, Returning either a Constant, MapFunction,
* ArrayFunction, or the input itself (if it's already an expression).
* If the input is a string, it is assumed to be a field name, and a
* field(value) is returned.
*
* @private
* @internal
* @param value
*/
function __PRIVATE_fieldOrExpression(s) {
if (common.__PRIVATE_isString$1(s)) {
return common.e(s);
}
/**
* Converts a value to an Expression, Returning either a Constant, MapFunction,
* ArrayFunction, or the input itself (if it's already an expression).
*
* @private
* @internal
* @param value
*/
return function __PRIVATE_valueToDefaultExpr(a) {
let e;
if (common.u(a)) return common.i(a);
if (a instanceof common.t) return a;
e = common.p(a) ? common.h(a) : a instanceof Array ? common.b(a) :
/**
* Checks if a value is a Pipeline object.
*
* We use duck typing here to avoid a circular dependency between pipeline.ts and pipeline_util.ts.
*/
function __PRIVATE_isPipeline$1(a) {
return "object" == typeof a && null !== a && "function" == typeof a.toArrayExpression;
}
/**
* @license
* Copyright 2024 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
*
* The Pipeline class provides a flexible and expressive framework for building complex data
* transformation and query pipelines for Firestore.
*
* A pipeline takes data sources, such as Firestore collections or collection groups, and applies
* a series of stages that are chained together. Each stage takes the output from the previous stage
* (or the data source) and produces an output for the next stage (or as the final output of the
* pipeline).
*
* Expressions can be used within each stage to filter and transform data through the stage.
*
* NOTE: The chained stages do not prescribe exactly how Firestore will execute the pipeline.
* Instead, Firestore only guarantees that the result is the same as if the chained stages were
* executed in order.
*
* @example
* ```typescript
* const db: Firestore; // Assumes a valid firestore instance.
*
* // Example 1: Select specific fields and rename 'rating' to 'bookRating'
* const results1 = await execute(db.pipeline()
* .collection("books")
* .select("title", "author", field("rating").as("bookRating")));
*
* // Example 2: Filter documents where 'genre' is "Science Fiction" and 'published' is after 1950
* const results2 = await execute(db.pipeline()
* .collection("books")
* .where(and(field("genre").equal("Science Fiction"), field("published").greaterThan(1950))));
*
* // Example 3: Calculate the average rating of books published after 1980
* const results3 = await execute(db.pipeline()
* .collection("books")
* .where(field("published").greaterThan(1980))
* .aggregate(average(field("rating")).as("averageRating")));
* ```
*/ (a) ? common.d(a) : common.m(a, void 0);
return e;
}(s);
}
let fa = class Pipeline {
/**
* @internal
* @private
* @param _db
* @param userDataReader
* @param _userDataWriter
* @param stages
*/
constructor(
/**
* @internal
* @private
*/
a,
/**
* @internal
* @private
*/
e,
/**
* @internal
* @private
*/
s,
/**
* @internal
* @private
*/
t) {
this._db = a, this.userDataReader = e, this._userDataWriter = s, this.stages = t;
}
_readUserData(a) {
this.stages.forEach((e => {
const s = a.contextWith({
methodName: e._name
});
e._readUserData(s);
}));
}
addFields(a, ...e) {
// Process argument union(s) from method overloads
let s, t;
common.f(a) ? (s = [ a, ...e ], t = {}) : ({fields: s, ...t} = a);
// Convert user land convenience types to internal types
const n = __PRIVATE_selectablesToMap(s), i = new common.w(n, t);
// Create stage object
// Add stage to the pipeline
return this._addStage(i);
}
removeFields(s, ...t) {
// Process argument union(s) from method overloads
const n = common.g(s) || common.__PRIVATE_isString$1(s) ? {} : s, i = (common.g(s) || common.__PRIVATE_isString$1(s) ? [ s, ...t ] : s.fields).map((s => common.__PRIVATE_isString$1(s) ? common.e(s) : s)), r = new common._(i, n);
// Add stage to the pipeline
return this._addStage(r);
}
define(a, ...e) {
// Process argument union(s) from method overloads
const s = common.T(a) ? {} : a, t = __PRIVATE_selectablesToMap(common.T(a) ? [ a, ...e ] : a.variables), n = new common.P(t, s);
return this._addStage(n);
}
/**
* Converts this Pipeline into an expression that evaluates to an array of results.
*
* <p>Result Unwrapping:</p>
* <ul>
* <li>If the items have a single field, their values are unwrapped and returned directly in the array.</li>
* <li>If the items have multiple fields, they are returned as objects in the array</li>
* </ul>
*
* @example
* ```typescript
* // Get a list of reviewers for each book
* db.pipeline().collection("books")
* .define(field("id").as("book_id"))
* .addFields(
* db.pipeline().collection("reviews")
* .where(field("book_id").equal(variable("book_id")))
* .select(field("reviewer"))
* .toArrayExpression()
* .as("reviewers")
* )
* ```
*
* Output:
* ```json
* [
* {
* "id": "1",
* "title": "1984",
* "reviewers": ["Alice", "Bob"]
* }
* ]
* ```
*
* Multiple Fields:
* ```typescript
* // Get a list of reviews (reviewer and rating) for each book
* db.pipeline().collection("books")
* .define(field("id").as("book_id"))
* .addFields(
* db.pipeline().collection("reviews")
* .where(field("book_id").equal(variable("book_id")))
* .select(field("reviewer"), field("rating"))
* .toArrayExpression()
* .as("reviews"))
* ```
*
* Output:
* ```json
* [
* {
* "id": "1",
* "title": "1984",
* "reviews": [
* { "reviewer": "Alice", "rating": 5 },
* { "reviewer": "Bob", "rating": 4 }
* ]
* }
* ]
* ```
*
* @returns An `Expression` representing the execution of this pipeline.
*/ toArrayExpression() {
return new common.x("array", [ __PRIVATE_fieldOrExpression(this) ]);
}
/**
* Converts this Pipeline into an expression that evaluates to a single scalar result.
*
* <p><b>Runtime Validation:</b> The runtime validates that the result set contains zero or one item. If
* zero items, it evaluates to `null`.</p>
*
* <p>Result Unwrapping:</p>
* <ul>
* <li>If the item has a single field, its value is unwrapped and returned directly.</li>
* <li>If the item has multiple fields, they are returned as an object.</li>
* </ul>
*
* @example
* ```typescript
* // Calculate average rating for a restaurant
* db.pipeline().collection("restaurants").addFields(
* db.pipeline().collection("reviews")
* .where(field("restaurant_id").equal(variable("rid")))
* .aggregate(average("rating").as("avg"))
* // Unwraps the single "avg" field to a scalar double
* .toScalarExpression().as("average_rating")
* )
* ```
*
* Output:
* ```json
* {
* "name": "The Burger Joint",
* "average_rating": 4.5
* }
* ```
*
* Multiple Fields:
* ```typescript
* // Calculate average rating AND count for a restaurant
* db.pipeline().collection("restaurants").addFields(
* db.pipeline().collection("reviews")
* .where(field("restaurant_id").equal(variable("rid")))
* .aggregate(
* average("rating").as("avg"),
* count().as("count")
* )
* // Returns an object with "avg" and "count" fields
* .toScalarExpression().as("stats")
* )
* ```
*
* Output:
* ```json
* {
* "name": "The Burger Joint",
* "stats": {
* "avg": 4.5,
* "count": 100
* }
* }
* ```
*
* @returns An `Expression` representing the execution of this pipeline.
*/ toScalarExpression() {
return new common.x("scalar", [ __PRIVATE_fieldOrExpression(this) ]);
}
select(e, ...s) {
// Process argument union(s) from method overloads
const t = common.f(e) || common.__PRIVATE_isString$1(e) ? {} : e, n = __PRIVATE_selectablesToMap(common.f(e) || common.__PRIVATE_isString$1(e) ? [ e, ...s ] : e.selections), i = new common.y(n, t);
// Add stage to the pipeline
return this._addStage(i);
}
where(a) {
// Process argument union(s) from method overloads
const e = common.E(a) ? {} : a, s = common.E(a) ? a : a.condition, t = new common.A(s, e);
// Add stage to the pipeline
return this._addStage(t);
}
offset(a) {
// Process argument union(s) from method overloads
let e, s;
common.__PRIVATE_isNumber$1(a) ? (e = {}, s = a) : (e = a, s = a.offset);
// Create stage object
const t = new common.I(s, e);
// Add stage to the pipeline
return this._addStage(t);
}
limit(a) {
// Process argument union(s) from method overloads
const e = common.__PRIVATE_isNumber$1(a) ? {} : a, s = common.__PRIVATE_isNumber$1(a) ? a : a.limit, t = new common.v(s, e);
// Add stage to the pipeline
return this._addStage(t);
}
distinct(e, ...s) {
// Process argument union(s) from method overloads
const t = common.__PRIVATE_isString$1(e) || common.f(e) ? {} : e, n = __PRIVATE_selectablesToMap(common.__PRIVATE_isString$1(e) || common.f(e) ? [ e, ...s ] : e.groups), i = new common.M(n, t);
// Add stage to the pipeline
return this._addStage(i);
}
aggregate(a, ...e) {
// Process argument union(s) from method overloads
const t = common.O(a) ? {} : a, n = common.O(a) ? [ a, ...e ] : a.accumulators, i = common.O(a) ? [] : a.groups ?? [], r = function __PRIVATE_aliasedAggregateToMap(a) {
return a.reduce(((a, e) => {
if (void 0 !== a.get(e.alias)) throw new common.s("invalid-argument", `Duplicate alias or field '${e.alias}'`);
return a.set(e.alias, e.aggregate), a;
}), new Map);
}
/**
* Converts a value to an Expression, Returning either a Constant, MapFunction,
* ArrayFunction, or the input itself (if it's already an expression).
*
* @private
* @internal
* @param value
*/ (n), o = __PRIVATE_selectablesToMap(i), c = new common.V(o, r, t);
// Add stage to the pipeline
return this._addStage(c);
}
/**
* Performs a vector proximity search on the documents from the previous stage, returning the
* K-nearest documents based on the specified query `vectorValue` and `distanceMeasure`. The
* returned documents will be sorted in order from nearest to furthest from the query `vectorValue`.
*
* @example
* ```typescript
* // Find the 10 most similar books based on the book description.
* const bookDescription = "Lorem ipsum...";
* const queryVector: number[] = ...; // compute embedding of `bookDescription`
*
* firestore.pipeline().collection("books")
* .findNearest({
* field: 'embedding',
* vectorValue: queryVector,
* distanceMeasure: 'euclidean',
* limit: 10, // optional
* distanceField: 'computedDistance' // optional
* });
* ```
*
* @param options - An object that specifies required and optional parameters for the stage.
* @returns A new {@link @firebase/firestore/pipelines#Pipeline} object with this stage appended to the stage list.
*/ findNearest(a) {
// Convert user land convenience types to internal types
const e = common.S(a.field), s = function __PRIVATE_vectorToExpr(a) {
if (a instanceof common.t) return a;
if (a instanceof common.n) return common.i(a);
if (Array.isArray(a)) return common.i(common.r(a));
throw new Error("Unsupported value: " + typeof a);
}(a.vectorValue), o = {
distanceField: a.distanceField ? common.S(a.distanceField) : void 0,
limit: a.limit,
rawOptions: a.rawOptions
}, c = new common.D(s, e, a.distanceMeasure, o);
// Add stage to the pipeline
return this._addStage(c);
}
// TODO(search) link to external documentation citing list of supported
// expressions, when that documentation is created. List is not maintained
// in the SDK because the list will change as the backend enables support.
/**
* Add a search stage to the Pipeline. The search stage supports
* full-text search and geo search expressions.
*
* @remarks
* This must be the first stage of the pipeline. A limited set of expressions are supported in the search stage.
*
* @example
* ```typescript
* // Full-text search example
* firestore.pipeline().collection("restaurants")
* .search({
* query: documentMatches("waffles OR pancakes"),
* sort: [
* score().descending(),
* ],
* addFields: [
* score().as("searchScore"),
* ]
* })
* ```
*
* @example
* ```typescript
* // Geo distance search example
* const queryLocation = new GeoPoint(0, 0);
* db.pipeline().collection('restaurants').search({
* query: field('location').geoDistance(queryLocation).lessThanOrEqual(1000),
* sort: [
* score().descending(),
* ],
* })
* ```
*
* @param options - An object that specifies parameters for the stage.
* @return A new `Pipeline` object with this stage appended to the stage list.
* @beta
*/
search(a) {
// Convert user land convenience types to internal types
const e = a.addFields ? __PRIVATE_selectablesToObject(a.addFields) : void 0, s = common.j(a.query) ? a.query : common.q(a.query), t = common.F(a.sort) ? [ a.sort ] : a.sort, n = {
...a,
addFields: e,
select: undefined,
query: s,
sort: t
}, i = new common.C(n);
// Add stage to the pipeline
return this._addStage(i);
}
sort(a, ...e) {
// Process argument union(s) from method overloads
const s = common.F(a) ? {} : a, t = common.F(a) ? [ a, ...e ] : a.orderings, n = new common.L(t, s);
// Add stage to the pipeline
return this._addStage(n);
}
replaceWith(e) {
// Process argument union(s) from method overloads
const s = common.__PRIVATE_isString$1(e) || common.j(e) ? {} : e, t = __PRIVATE_fieldOrExpression(common.__PRIVATE_isString$1(e) || common.j(e) ? e : e.map), n = new common.$(t, s);
// Add stage to the pipeline
return this._addStage(n);
}
sample(a) {
// Process argument union(s) from method overloads
const e = common.__PRIVATE_isNumber$1(a) ? {} : a;
let s, t;
common.__PRIVATE_isNumber$1(a) ? (s = a, t = "documents") : common.__PRIVATE_isNumber$1(a.documents) ? (s = a.documents, t = "documents") : (s = a.percentage,
t = "percent");
// Create stage object
const n = new common.N(s, t, e);
// Add stage to the pipeline
return this._addStage(n);
}
union(a) {
// Process argument union(s) from method overloads
let e, s;
!function __PRIVATE_isPipeline(a) {
return a instanceof fa;
}
/**
* @license
* Copyright 2024 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* Provides the entry point for defining the data source of a Firestore {@link @firebase/firestore/pipelines#Pipeline}.
*
* Use the methods of this class (e.g., {@link @firebase/firestore/pipelines#PipelineSource.(collection:1)}, {@link @firebase/firestore/pipelines#PipelineSource.(collectionGroup:1)},
* {@link @firebase/firestore/pipelines#PipelineSource.(database:1)}, or {@link @firebase/firestore/pipelines#PipelineSource.(documents:1)}) to specify the initial data
* for your pipeline, such as a collection, a collection group, the entire database, or a set of specific documents.
*/ (a) ? ({other: s, ...e} = a) : (e = {}, s = a);
// Create stage object
const t = new common.U(s, e);
// Add stage to the pipeline
return this._addStage(t);
}
unnest(e, s) {
// Process argument union(s) from method overloads
let t, n, i;
common.f(e) ? (t = {}, n = e, i = s) : ({selectable: n, indexField: i, ...t} = e);
// Convert user land convenience types to internal types
const r = n.alias, o = n.expr;
common.__PRIVATE_isString$1(i) && (t.indexField = common.G(i, "unnest"));
// Create stage object
const c = new common.W(r, o, t);
// Add stage to the pipeline
return this._addStage(c);
}
/**
* Adds a raw stage to the pipeline.
*
* <p>This method provides a flexible way to extend the pipeline's functionality by adding custom
* stages. Each raw stage is defined by a unique `name` and a set of `params` that control its
* behavior.
*
* <p>Example (Assuming there is no 'where' stage available in SDK):
*
* @example
* ```typescript
* // Assume we don't have a built-in 'where' stage
* firestore.pipeline().collection('books')
* .rawStage('where', [field('published').lessThan(1900)]) // Custom 'where' stage
* .select('title', 'author');
* ```
*
* @param name - The unique name of the raw stage to add.
* @param params - A list of parameters to configure the raw stage's behavior.
* @param options - An object of key value pairs that specifies optional parameters for the stage.
* @returns A new {@link @firebase/firestore/pipelines#Pipeline} object with this stage appended to the stage list.
*/ rawStage(a, e, s) {
// Convert user land convenience types to internal types
const n = e.map((a => a instanceof common.t || a instanceof common.k ? a : common.p(a) ? common.B(a) : common.m(a, "rawStage"))), i = new common.K(a, n, s ?? {});
// Create stage object
// Add stage to the pipeline
return this._addStage(i);
}
/**
* @internal
* @private
*/ _toProto(a) {
return {
stages: this.stages.map((e => e._toProto(a)))
};
}
_addStage(a) {
const e = this.stages.map((a => a));
return e.push(a), this.newPipeline(this._db, e);
}
/**
* @internal
* @private
* @param db
* @param userDataReader
* @param userDataWriter
* @param stages
* @protected
*/ newPipeline(a, e) {
return new Pipeline(a, this.userDataReader, this._userDataWriter, e);
}
};
class PipelineSource {
/**
* @internal
* @private
* @param databaseId
* @param userDataReader
* @param _createPipeline
*/
constructor(a, e,
/**
* @internal
* @private
*/
s) {
this.databaseId = a, this.userDataReader = e, this._createPipeline = s;
}
collection(e) {
// Process argument union(s) from method overloads
const s = common.__PRIVATE_isString$1(e) || common.z(e) ? {} : e, t = common.__PRIVATE_isString$1(e) || common.z(e) ? e : e.collection;
// Validate that a user provided reference is for the same Firestore DB
common.z(t) && this._validateReference(t);
// Convert user land convenience types to internal types
const n = common.__PRIVATE_isString$1(t) ? t : t.path, i = new common.H(n, s), r = this.userDataReader.createContext(3 /* UserDataSource.Argument */ , "collection");
// Create stage object
// Add stage to the pipeline
return i._readUserData(r), this._createPipeline([ i ]);
}
collectionGroup(e) {
// Process argument union(s) from method overloads
let s, t;
common.__PRIVATE_isString$1(e) ? (s = e, t = {}) : ({collectionId: s, ...t} = e);
// Create stage object
const n = new common.J(s, t), i = this.userDataReader.createContext(3 /* UserDataSource.Argument */ , "collectionGroup");
// User data must be read in the context of the API method to
// provide contextual errors
// Add stage to the pipeline
return n._readUserData(i), this._createPipeline([ n ]);
}
database(a) {
// Create stage object
const e = new common.Q(
// Process argument union(s) from method overloads
a = a ?? {}), s = this.userDataReader.createContext(3 /* UserDataSource.Argument */ , "database");
// User data must be read in the context of the API method to
// provide contextual errors
// Add stage to the pipeline
return e._readUserData(s), this._createPipeline([ e ]);
}
documents(e) {
// Process argument union(s) from method overloads
let s, t;
Array.isArray(e) ? (t = e, s = {}) : ({docs: t, ...s} = e),
// Validate that all user provided references are for the same Firestore DB
t.filter((a => a instanceof common.X)).forEach((a => this._validateReference(a)));
// Convert user land convenience types to internal types
const n = t.map((e => common.__PRIVATE_isString$1(e) ? e : e.path)), i = new common.Y(n, s), r = this.userDataReader.createContext(3 /* UserDataSource.Argument */ , "documents");
// Create stage object
// Add stage to the pipeline
return i._readUserData(r), this._createPipeline([ i ]);
}
/**
* Convert the given Query into an equivalent Pipeline.
*
* @param query - A Query to be converted into a Pipeline.
*
* @throws `FirestoreError` Thrown if any of the provided DocumentReferences target a different project or database than the pipeline.
*/ createFrom(a) {
return this._createPipeline(common.Z(a._query, a.firestore));
}
_validateReference(a) {
const e = a.firestore._databaseId;
if (!e.isEqual(this.databaseId)) throw new common.s(common.aa.INVALID_ARGUMENT, `Invalid ${a instanceof common.ea ? "CollectionReference" : "DocumentReference"}. The project ID ("${e.projectId}") or the database ("${e.database}") does not match the project ID ("${this.databaseId.projectId}") and database ("${this.databaseId.database}") of the target database of this Pipeline.`);
}
}
function subcollection(e) {
// Process argument union(s) from method overloads
let s, t;
common.__PRIVATE_isString$1(e) ? (s = e, t = {}) : ({path: s, ...t} = e);
// Create stage object
const n = new common.sa(s, t);
return new fa(void 0, void 0, void 0, [ n ]);
}
/**
* @license
* Copyright 2024 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* Represents the results of a Firestore pipeline execution.
*
* A `PipelineSnapshot` contains zero or more {@link @firebase/firestore/pipelines#PipelineResult} objects
* representing the documents returned by a pipeline query. It provides methods
* to iterate over the documents and access metadata about the query results.
*
* @example
* ```typescript
* const snapshot: PipelineSnapshot = await firestore
* .pipeline()
* .collection('myCollection')
* .where(field('value').greaterThan(10))
* .execute();
*
* snapshot.results.forEach(doc => {
* console.log(doc.id, '=>', doc.data());
* });
* ```
*/ class PipelineSnapshot {
constructor(a, e, s) {
this._pipeline = a, this._executionTime = s, this._results = e;
}
/**
* An array of all the results in the `PipelineSnapshot`.
*/ get results() {
return this._results;
}
/**
* The time at which the pipeline producing this result is executed.
*
* @readonly
*
*/ get executionTime() {
if (void 0 === this._executionTime) throw new Error("'executionTime' is expected to exist, but it is undefined");
return this._executionTime;
}
}
/**
*
* A PipelineResult contains data read from a Firestore Pipeline. The data can be extracted with the
* {@link @firebase/firestore/pipelines#PipelineResult.data} or {@link @firebase/firestore/pipelines#PipelineResult.(get:1)} methods.
*
* <p>If the PipelineResult represents a non-document result, `ref` will return a undefined
* value.
*/ class PipelineResult {
/**
* @private
* @internal
*
* @param userDataWriter - The serializer used to encode/decode protobuf.
* @param fields - The fields of the Firestore `Document` Protobuf backing
* this document.
* @param ref - The reference to the document.
* @param createTime - The time when the document was created if the result is a document, undefined otherwise.
* @param updateTime - The time when the document was last updated if the result is a document, undefined otherwise.
* @param metadata
* @param listenOptions
*/
constructor(a, e, s, t, n, i, r) {
this._ref = s, this._userDataWriter = a, this._createTime = t, this._updateTime = n,
this._fields = e, this._metadata = i, this._listenOptions = r;
}
/**
* @private
* @internal
* @param userDataWriter
* @param doc
* @param ref
* @param metadata
* @param listenOptions
*/ static fromDocument(a, e, s, t, n) {
return new PipelineResult(a, e.data, s, e.createTime.toTimestamp(), e.version.toTimestamp(), t, n);
}
/**
* The reference of the document, if it is a document; otherwise `undefined`.
*/ get ref() {
return this._ref;
}
/**
* The ID of the document for which this PipelineResult contains data, if it is a document; otherwise `undefined`.
*
* @readonly
*
*/ get id() {
return this._ref?.id;
}
/**
* The time the document was created. Undefined if this result is not a document.
*
* @readonly
*/ get createTime() {
return this._createTime;
}
/**
* The time the document was last updated (at the time the snapshot was
* generated). Undefined if this result is not a document.
*
* @readonly
*/ get updateTime() {
return this._updateTime;
}
/**
* Retrieves all fields in the result as an object.
*
* @returns An object containing all fields in the document or
* 'undefined' if the document doesn't exist.
*
* @example
* ```
* let p = firestore.pipeline().collection('col');
*
* p.execute().then(results => {
* let data = results[0].data();
* console.log(`Retrieved data: ${JSON.stringify(data)}`);
* });
* ```
*/ data() {
return this._userDataWriter.convertValue(this._fields.value, this._listenOptions?.serverTimestampBehavior);
}
/**
* @internal
* @private
*
* Retrieves all fields in the result as a proto value.
*
* @returns An `Object` containing all fields in the result.
*/ _fieldsProto() {
// Return a cloned value to prevent manipulation of the Snapshot's data
return this._fields.clone().value.mapValue.fields;
}
/**
* Retrieves the field specified by `field`.
*
* @param field - The field path
* (e.g. 'foo' or 'foo.bar') to a specific field.
* @returns The data at the specified field location or `undefined` if no
* such field exists.
*
* @example
* ```
* let p = firestore.pipeline().collection('col');
*
* p.execute().then(results => {
* let field = results[0].get('a.b');
* console.log(`Retrieved field value: ${field}`);
* });
* ```
*/
// We deliberately use `any` in the external API to not impose type-checking
// on end users.
// eslint-disable-next-line @typescript-eslint/no-explicit-any
get(a) {
if (void 0 === this._fields) return;
common.g(a) && (a = a.fieldName);
const e = this._fields.field(common.ta("DocumentSnapshot.get", a));
return null !== e ? this._userDataWriter.convertValue(e, this._listenOptions?.serverTimestampBehavior) : void 0;
}
}
/**
* Test equality of two PipelineResults.
* @param left - First PipelineResult to compare.
* @param right - Second PipelineResult to compare.
*/ function pipelineResultEqual(a, e) {
return a === e || common.na(a._ref, e._ref, common.ia) && common.na(a._fields, e._fields, ((a, e) => a.isEqual(e)));
}
/**
* @license
* Copyright 2024 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/ class Pipeline extends fa {
/**
* @internal
* @private
* @param db
* @param userDataReader
* @param userDataWriter
* @param stages
* @param converter
* @protected
*/
newPipeline(a, e) {
return new Pipeline(a, this.userDataReader, this._userDataWriter, e);
}
}
/**
* @license
* Copyright 2024 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/ function execute(a) {
const e = a instanceof fa ? {
pipeline: a
} : a, {pipeline: t, rawOptions: n, ...i} = e;
if (!t._db) return Promise.reject(new common.s(common.aa.FAILED_PRECONDITION, "This pipeline was created without a database (e.g., as a subcollection pipeline) and cannot be executed directly. It can only be used as part of another pipeline."));
const r = common.ra(t._db, common.da), o = common.oa(r), c = common.la(r).createContext(3 /* UserDataSource.Argument */ , "execute");
t._readUserData(c);
const l = new common.ua(r), u = new common.pa(i, n);
u._readUserData(c);
const p = new common.ma(t, u);
return common.ha(o, p).then((a => {
// Get the execution time from the first result.
// firestoreClientExecutePipeline returns at least one PipelineStreamElement
// even if the returned document set is empty.
const e = a.length > 0 ? a[0].executionTime?.toTimestamp() : void 0, s = a.filter((a => !!a.fields)).map((a => new PipelineResult(l, a.fields, a.key?.path ? new common.X(r, null, a.key) : void 0, a.createTime?.toTimestamp(), a.updateTime?.toTimestamp())));
return new PipelineSnapshot(t, s, e);
}));
}
/**
* @beta
* Creates and returns a new PipelineSource, which allows specifying the source stage of a {@link @firebase/firestore/pipelines#Pipeline}.
*
* @example
* ```typescript
* let myPipeline: Pipeline = firestore.pipeline().collection('books');
* ```
*/
// Augment the Firestore class with the pipeline() factory method
common.da.prototype.pipeline = function() {
const a = common.la(this);
return new PipelineSource(this._databaseId, a, (e => new Pipeline(this, a, new common.ua(this), e)));
};
exports.AggregateFunction = common.k;
exports.AliasedAggregate = common.AliasedAggregate;
exports.AliasedExpression = common.c;
exports.BooleanExpression = common.BooleanExpression;
exports.Expression = common.t;
exports.Field = common.o;
exports.FunctionExpression = common.x;
exports.Ordering = common.Ordering;
exports._internalPipelineToExecutePipelineRequestProto = common._internalPipelineToExecutePipelineRequestProto;
exports.abs = common.abs;
exports.add = common.add;
exports.and = common.and;
exports.array = common.b;
exports.arrayAgg = common.arrayAgg;
exports.arrayAggDistinct = common.arrayAggDistinct;
exports.arrayConcat = common.arrayConcat;
exports.arrayContains = common.arrayContains;
exports.arrayContainsAll = common.arrayContainsAll;
exports.arrayContainsAny = common.arrayContainsAny;
exports.arrayFilter = common.arrayFilter;
exports.arrayFirst = common.arrayFirst;
exports.arrayFirstN = common.arrayFirstN;
exports.arrayGet = common.arrayGet;
exports.arrayIndexOf = common.arrayIndexOf;
exports.arrayIndexOfAll = common.arrayIndexOfAll;
exports.arrayLast = common.arrayLast;
exports.arrayLastIndexOf = common.arrayLastIndexOf;
exports.arrayLastN = common.arrayLastN;
exports.arrayLength = common.arrayLength;
exports.arrayMaximum = common.arrayMaximum;
exports.arrayMaximumN = common.arrayMaximumN;
exports.arrayMinimum = common.arrayMinimum;
exports.arrayMinimumN = common.arrayMinimumN;
exports.arraySlice = common.arraySlice;
exports.arraySum = common.arraySum;
exports.arrayTransform = common.arrayTransform;
exports.arrayTransformWithIndex = common.arrayTransformWithIndex;
exports.ascending = common.ascending;
exports.average = common.average;
exports.byteLength = common.byteLength;
exports.ceil = common.ceil;
exports.charLength = common.charLength;
exports.coalesce = common.coalesce;
exports.collectionId = common.collectionId;
exports.concat = common.concat;
exports.conditional = common.conditional;
exports.constant = common.i;
exports.cosineDistance = common.cosineDistance;
exports.count = common.count;
exports.countAll = common.countAll;
exports.countDistinct = common.countDistinct;
exports.countIf = common.countIf;
exports.currentDocument = common.currentDocument;
exports.currentTimestamp = common.currentTimestamp;
exports.descending = common.descending;
exports.divide = common.divide;
exports.documentId = common.documentId;
exports.documentMatches = common.q;
exports.dotProduct = common.dotProduct;
exports.endsWith = common.endsWith;
exports.equal = common.equal;
exports.equalAny = common.equalAny;
exports.euclideanDistance = common.euclideanDistance;
exports.exists = common.exists;
exports.exp = common.exp;
exports.field = common.e;
exports.first = common.first;
exports.floor = common.floor;
exports.geoDistance = common.geoDistance;
exports.greaterThan = common.greaterThan;
exports.greaterThanOrEqual = common.greaterThanOrEqual;
exports.ifAbsent = common.ifAbsent;
exports.ifError = common.ifError;
exports.ifNull = common.ifNull;
exports.isAbsent = common.isAbsent;
exports.isError = common.isError;
exports.isType = common.isType;
exports.join = common.join;
exports.last = common.last;
exports.length = common.length;
exports.lessThan = common.lessThan;
exports.lessThanOrEqual = common.lessThanOrEqual;
exports.like = common.like;
exports.ln = common.ln;
exports.log = common.log;
exports.log10 = common.log10;
exports.logicalMaximum = common.logicalMaximum;
exports.logicalMinimum = common.logicalMinimum;
exports.ltrim = common.ltrim;
exports.map = common.h;
exports.mapEntries = common.mapEntries;
exports.mapGet = common.mapGet;
exports.mapKeys = common.mapKeys;
exports.mapMerge = common.mapMerge;
exports.mapRemove = common.mapRemove;
exports.mapSet = common.mapSet;
exports.mapValues = common.mapValues;
exports.maximum = common.maximum;
exports.minimum = common.minimum;
exports.mod = common.mod;
exports.multiply = common.multiply;
exports.nor = common.nor;
exports.not = common.not;
exports.notEqual = common.notEqual;
exports.notEqualAny = common.notEqualAny;
exports.or = common.or;
exports.parent = common.parent;
exports.pow = common.pow;
exports.rand = common.rand;
exports.regexContains = common.regexContains;
exports.regexFind = common.regexFind;
exports.regexFindAll = common.regexFindAll;
exports.regexMatch = common.regexMatch;
exports.reverse = common.reverse;
exports.round = common.round;
exports.rtrim = common.rtrim;
exports.score = common.score;
exports.split = common.split;
exports.sqrt = common.sqrt;
exports.startsWith = common.startsWith;
exports.stringConcat = common.stringConcat;
exports.stringContains = common.stringContains;
exports.stringIndexOf = common.stringIndexOf;
exports.stringRepeat = common.stringRepeat;
exports.stringReplaceAll = common.stringReplaceAll;
exports.stringReplaceOne = common.stringReplaceOne;
exports.stringReverse = common.stringReverse;
exports.substring = common.substring;
exports.subtract = common.subtract;
exports.sum = common.sum;
exports.switchOn = common.switchOn;
exports.timestampAdd = common.timestampAdd;
exports.timestampDiff = common.timestampDiff;
exports.timestampExtract = common.timestampExtract;
exports.timestampSubtract = common.timestampSubtract;
exports.timestampToUnixMicros = common.timestampToUnixMicros;
exports.timestampToUnixMillis = common.timestampToUnixMillis;
exports.timestampToUnixSeconds = common.timestampToUnixSeconds;
exports.timestampTruncate = common.timestampTruncate;
exports.toLower = common.toLower;
exports.toUpper = common.toUpper;
exports.trim = common.trim;
exports.trunc = common.trunc;
exports.type = common.type;
exports.unixMicrosToTimestamp = common.unixMicrosToTimestamp;
exports.unixMillisToTimestamp = common.unixMillisToTimestamp;
exports.unixSecondsToTimestamp = common.unixSecondsToTimestamp;
exports.variable = common.variable;
exports.vectorLength = common.vectorLength;
exports.xor = common.xor;
exports.Pipeline = Pipeline;
exports.PipelineResult = PipelineResult;
exports.PipelineSnapshot = PipelineSnapshot;
exports.PipelineSource = PipelineSource;
exports.execute = execute;
exports.pipelineResultEqual = pipelineResultEqual;
exports.subcollection = subcollection;
//# sourceMappingURL=pipelines.cjs.js.map