map • Lines: 1{"version":3,"file":"pipelines.node.mjs","sources":["../../src/lite-api/pipeline-result.ts","../../src/util/pipeline_util.ts","../../src/lite-api/pipeline.ts","../../src/lite-api/pipeline-source.ts","../../src/api/pipeline.ts","../../src/api/pipeline_impl.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { RealtimePipeline } from '../api/realtime_pipeline';\nimport { SnapshotMetadata } from '../api/snapshot';\nimport { ListenOptions } from '../core/event_manager';\nimport { Document } from '../model/document';\nimport { ObjectValue } from '../model/object_value';\nimport { firestoreV1ApiClientInterfaces } from '../protos/firestore_proto_api';\nimport { isOptionalEqual } from '../util/misc';\n\nimport { Field, isField } from './expressions';\nimport { FieldPath } from './field_path';\nimport { Pipeline } from './pipeline';\nimport { DocumentData, DocumentReference, refEqual } from './reference';\nimport { Timestamp } from './timestamp';\nimport { fieldPathFromArgument } from './user_data_reader';\nimport { AbstractUserDataWriter } from './user_data_writer';\n\n/**\n * Represents the results of a Firestore pipeline execution.\n *\n * A `PipelineSnapshot` contains zero or more {@link @firebase/firestore/pipelines#PipelineResult} objects\n * representing the documents returned by a pipeline query. It provides methods\n * to iterate over the documents and access metadata about the query results.\n *\n * @example\n * ```typescript\n * const snapshot: PipelineSnapshot = await firestore\n * .pipeline()\n * .collection('myCollection')\n * .where(field('value').greaterThan(10))\n * .execute();\n *\n * snapshot.results.forEach(doc => {\n * console.log(doc.id, '=>', doc.data());\n * });\n * ```\n */\nexport class PipelineSnapshot {\n private readonly _pipeline: Pipeline;\n private readonly _executionTime: Timestamp | undefined;\n private readonly _results: PipelineResult[];\n constructor(\n pipeline: Pipeline,\n results: PipelineResult[],\n executionTime?: Timestamp\n ) {\n this._pipeline = pipeline;\n this._executionTime = executionTime;\n this._results = results;\n }\n\n /**\n * An array of all the results in the `PipelineSnapshot`.\n */\n get results(): PipelineResult[] {\n return this._results;\n }\n\n /**\n * The time at which the pipeline producing this result is executed.\n *\n * @readonly\n *\n */\n get executionTime(): Timestamp {\n if (this._executionTime === undefined) {\n throw new Error(\n \"'executionTime' is expected to exist, but it is undefined\"\n );\n }\n return this._executionTime;\n }\n}\n\n/**\n *\n * A PipelineResult contains data read from a Firestore Pipeline. The data can be extracted with the\n * {@link @firebase/firestore/pipelines#PipelineResult.data} or {@link @firebase/firestore/pipelines#PipelineResult.(get:1)} methods.\n *\n * <p>If the PipelineResult represents a non-document result, `ref` will return a undefined\n * value.\n */\nexport class PipelineResult<AppModelType = DocumentData> {\n private readonly _userDataWriter: AbstractUserDataWriter;\n\n private readonly _createTime: Timestamp | undefined;\n private readonly _updateTime: Timestamp | undefined;\n\n readonly _metadata: SnapshotMetadata | undefined;\n readonly _listenOptions: ListenOptions | undefined;\n\n /**\n * @internal\n * @private\n */\n readonly _ref: DocumentReference | undefined;\n\n /**\n * @internal\n * @private\n */\n readonly _fields: ObjectValue;\n\n /**\n * @private\n * @internal\n *\n * @param userDataWriter - The serializer used to encode/decode protobuf.\n * @param fields - The fields of the Firestore `Document` Protobuf backing\n * this document.\n * @param ref - The reference to the document.\n * @param createTime - The time when the document was created if the result is a document, undefined otherwise.\n * @param updateTime - The time when the document was last updated if the result is a document, undefined otherwise.\n * @param metadata\n * @param listenOptions\n */\n constructor(\n userDataWriter: AbstractUserDataWriter,\n fields: ObjectValue,\n ref?: DocumentReference,\n createTime?: Timestamp,\n updateTime?: Timestamp,\n metadata?: SnapshotMetadata,\n listenOptions?: ListenOptions\n ) {\n this._ref = ref;\n this._userDataWriter = userDataWriter;\n this._createTime = createTime;\n this._updateTime = updateTime;\n this._fields = fields;\n this._metadata = metadata;\n this._listenOptions = listenOptions;\n }\n\n /**\n * @private\n * @internal\n * @param userDataWriter\n * @param doc\n * @param ref\n * @param metadata\n * @param listenOptions\n */\n static fromDocument(\n userDataWriter: AbstractUserDataWriter,\n doc: Document,\n ref?: DocumentReference,\n metadata?: SnapshotMetadata,\n listenOptions?: ListenOptions\n ): PipelineResult {\n return new PipelineResult(\n userDataWriter,\n doc.data,\n ref,\n doc.createTime.toTimestamp(),\n doc.version.toTimestamp(),\n metadata,\n listenOptions\n );\n }\n\n /**\n * The reference of the document, if it is a document; otherwise `undefined`.\n */\n get ref(): DocumentReference | undefined {\n return this._ref;\n }\n\n /**\n * The ID of the document for which this PipelineResult contains data, if it is a document; otherwise `undefined`.\n *\n * @readonly\n *\n */\n get id(): string | undefined {\n return this._ref?.id;\n }\n\n /**\n * The time the document was created. Undefined if this result is not a document.\n *\n * @readonly\n */\n get createTime(): Timestamp | undefined {\n return this._createTime;\n }\n\n /**\n * The time the document was last updated (at the time the snapshot was\n * generated). Undefined if this result is not a document.\n *\n * @readonly\n */\n get updateTime(): Timestamp | undefined {\n return this._updateTime;\n }\n\n /**\n * Retrieves all fields in the result as an object.\n *\n * @returns An object containing all fields in the document or\n * 'undefined' if the document doesn't exist.\n *\n * @example\n * ```\n * let p = firestore.pipeline().collection('col');\n *\n * p.execute().then(results => {\n * let data = results[0].data();\n * console.log(`Retrieved data: ${JSON.stringify(data)}`);\n * });\n * ```\n */\n data(): AppModelType {\n return this._userDataWriter.convertValue(\n this._fields.value,\n this._listenOptions?.serverTimestampBehavior\n ) as AppModelType;\n }\n\n /**\n * @internal\n * @private\n *\n * Retrieves all fields in the result as a proto value.\n *\n * @returns An `Object` containing all fields in the result.\n */\n _fieldsProto(): { [key: string]: firestoreV1ApiClientInterfaces.Value } {\n // Return a cloned value to prevent manipulation of the Snapshot's data\n return this._fields.clone().value.mapValue.fields!;\n }\n\n /**\n * Retrieves the field specified by `field`.\n *\n * @param field - The field path\n * (e.g. 'foo' or 'foo.bar') to a specific field.\n * @returns The data at the specified field location or `undefined` if no\n * such field exists.\n *\n * @example\n * ```\n * let p = firestore.pipeline().collection('col');\n *\n * p.execute().then(results => {\n * let field = results[0].get('a.b');\n * console.log(`Retrieved field value: ${field}`);\n * });\n * ```\n */\n // We deliberately use `any` in the external API to not impose type-checking\n // on end users.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n get(fieldPath: string | FieldPath | Field): any {\n if (this._fields === undefined) {\n return undefined;\n }\n if (isField(fieldPath)) {\n fieldPath = fieldPath.fieldName;\n }\n\n const value = this._fields.field(\n fieldPathFromArgument('DocumentSnapshot.get', fieldPath)\n );\n if (value !== null) {\n return this._userDataWriter.convertValue(\n value,\n this._listenOptions?.serverTimestampBehavior\n );\n }\n }\n}\n\n/**\n * Test equality of two PipelineResults.\n * @param left - First PipelineResult to compare.\n * @param right - Second PipelineResult to compare.\n */\nexport function pipelineResultEqual(\n left: PipelineResult,\n right: PipelineResult\n): boolean {\n if (left === right) {\n return true;\n }\n\n return (\n isOptionalEqual(left._ref, right._ref, refEqual) &&\n isOptionalEqual(left._fields, right._fields, (l, r) => l.isEqual(r))\n );\n}\n\nexport function toPipelineResult(\n doc: Document,\n pipeline: RealtimePipeline,\n listenOptions?: ListenOptions\n): PipelineResult {\n return PipelineResult.fromDocument(\n pipeline._userDataWriter,\n doc,\n doc.key.path\n ? new DocumentReference(pipeline._db, null, doc.key)\n : undefined,\n undefined,\n listenOptions\n );\n}\n","/**\n * @license\n * Copyright 2025 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n _constant,\n AggregateFunction,\n AliasedAggregate,\n array,\n constant,\n Expression,\n AliasedExpression,\n field,\n Field,\n map,\n Selectable,\n pipelineValue\n} from '../lite-api/expressions';\nimport { vector } from '../lite-api/field_value_impl';\nimport type { Pipeline } from '../lite-api/pipeline';\nimport { VectorValue } from '../lite-api/vector_value';\n\nimport { fail } from './assert';\nimport { FirestoreError } from './error';\nimport { isPlainObject } from './input_validation';\nimport { isFirestoreValue } from './proto';\nimport { isString } from './types';\n\n/**\n * @deprecated use selectablesToObject instead\n * @param selectables\n */\nexport function selectablesToMap(\n selectables: Array<Selectable | string>\n): Map<string, Expression> {\n return new Map(Object.entries(selectablesToObject(selectables)));\n}\n\nexport function selectablesToObject(\n selectables: Array<Selectable | string>\n): Record<string, Expression> {\n const result: Record<string, Expression> = {};\n for (const selectable of selectables) {\n let alias: string;\n let expression: Expression;\n if (typeof selectable === 'string') {\n alias = selectable as string;\n expression = field(selectable);\n } else if (selectable instanceof Field) {\n alias = selectable.alias;\n expression = selectable.expr;\n } else if (selectable instanceof AliasedExpression) {\n alias = selectable.alias;\n expression = selectable.expr;\n } else {\n fail(0x5319, '`selectable` has an unsupported type', { selectable });\n }\n\n if (result[alias] !== undefined) {\n throw new FirestoreError(\n 'invalid-argument',\n `Duplicate alias or field '${alias}'`\n );\n }\n\n result[alias] = expression;\n }\n return result;\n}\n\nexport function aliasedAggregateToMap(\n aliasedAggregatees: AliasedAggregate[]\n): Map<string, AggregateFunction> {\n return aliasedAggregatees.reduce(\n (map: Map<string, AggregateFunction>, selectable: AliasedAggregate) => {\n if (map.get(selectable.alias) !== undefined) {\n throw new FirestoreError(\n 'invalid-argument',\n `Duplicate alias or field '${selectable.alias}'`\n );\n }\n\n map.set(selectable.alias, selectable.aggregate as AggregateFunction);\n return map;\n },\n new Map() as Map<string, AggregateFunction>\n );\n}\n\n/**\n * Converts a value to an Expression, Returning either a Constant, MapFunction,\n * ArrayFunction, or the input itself (if it's already an expression).\n *\n * @private\n * @internal\n * @param value\n */\nexport function vectorToExpr(\n value: VectorValue | number[] | Expression\n): Expression {\n if (value instanceof Expression) {\n return value;\n } else if (value instanceof VectorValue) {\n const result = constant(value);\n return result;\n } else if (Array.isArray(value)) {\n const result = constant(vector(value));\n return result;\n } else {\n throw new Error('Unsupported value: ' + typeof value);\n }\n}\n\n/**\n * Converts a value to an Expression, Returning either a Constant, MapFunction,\n * ArrayFunction, or the input itself (if it's already an expression).\n * If the input is a string, it is assumed to be a field name, and a\n * field(value) is returned.\n *\n * @private\n * @internal\n * @param value\n */\nexport function fieldOrExpression(value: unknown): Expression {\n if (isString(value)) {\n const result = field(value);\n return result;\n } else {\n return valueToDefaultExpr(value);\n }\n}\n/**\n * Converts a value to an Expression, Returning either a Constant, MapFunction,\n * ArrayFunction, or the input itself (if it's already an expression).\n *\n * @private\n * @internal\n * @param value\n */\nexport function valueToDefaultExpr(value: unknown): Expression {\n let result: Expression | undefined;\n if (isFirestoreValue(value)) {\n return constant(value);\n }\n if (value instanceof Expression) {\n return value;\n } else if (isPlainObject(value)) {\n result = map(value as Record<string, unknown>);\n } else if (value instanceof Array) {\n result = array(value);\n } else if (isPipeline(value)) {\n result = pipelineValue(value);\n } else {\n result = _constant(value, undefined);\n }\n\n return result;\n}\n\n/**\n * Checks if a value is a Pipeline object.\n *\n * We use duck typing here to avoid a circular dependency between pipeline.ts and pipeline_util.ts.\n */\nfunction isPipeline(value: unknown): value is Pipeline {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as Pipeline).toArrayExpression === 'function'\n );\n}\n","/**\n * @license\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ParseContext } from '../api/parse_context';\nimport {\n Pipeline as ProtoPipeline,\n Stage as ProtoStage\n} from '../protos/firestore_proto_api';\nimport { JsonProtoSerializer, ProtoSerializable } from '../remote/serializer';\nimport { isPlainObject } from '../util/input_validation';\nimport {\n aliasedAggregateToMap,\n fieldOrExpression,\n selectablesToMap,\n selectablesToObject,\n vectorToExpr\n} from '../util/pipeline_util';\nimport { isNumber, isString } from '../util/types';\n\nimport { Firestore } from './database';\nimport {\n _mapValue,\n AggregateFunction,\n AliasedAggregate,\n BooleanExpression,\n _constant,\n Expression,\n Field,\n field,\n Ordering,\n Selectable,\n _field,\n isSelectable,\n isField,\n isBooleanExpr,\n isAliasedAggregate,\n toField,\n isOrdering,\n isExpr,\n AliasedExpression,\n FunctionExpression,\n isAliasedExpr,\n documentMatches\n} from './expressions';\nimport {\n AddFields,\n Aggregate,\n Distinct,\n FindNearest,\n RawStage,\n Limit,\n Offset,\n RemoveFields,\n Replace,\n Sample,\n Select,\n Sort,\n Stage,\n Union,\n Unnest,\n Where,\n Define,\n Search\n} from './stage';\nimport {\n AddFieldsStageOptions,\n AggregateStageOptions,\n DefineStageOptions,\n DistinctStageOptions,\n FindNearestStageOptions,\n LimitStageOptions,\n OffsetStageOptions,\n RemoveFieldsStageOptions,\n ReplaceWithStageOptions,\n SampleStageOptions,\n SearchStageOptions,\n SelectStageOptions,\n SortStageOptions,\n StageOptions,\n UnionStageOptions,\n UnnestStageOptions,\n WhereStageOptions\n} from './stage_options';\nimport { UserDataReader, UserData } from './user_data_reader';\nimport { AbstractUserDataWriter } from './user_data_writer';\n\n/**\n *\n * The Pipeline class provides a flexible and expressive framework for building complex data\n * transformation and query pipelines for Firestore.\n *\n * A pipeline takes data sources, such as Firestore collections or collection groups, and applies\n * a series of stages that are chained together. Each stage takes the output from the previous stage\n * (or the data source) and produces an output for the next stage (or as the final output of the\n * pipeline).\n *\n * Expressions can be used within each stage to filter and transform data through the stage.\n *\n * NOTE: The chained stages do not prescribe exactly how Firestore will execute the pipeline.\n * Instead, Firestore only guarantees that the result is the same as if the chained stages were\n * executed in order.\n *\n * @example\n * ```typescript\n * const db: Firestore; // Assumes a valid firestore instance.\n *\n * // Example 1: Select specific fields and rename 'rating' to 'bookRating'\n * const results1 = await execute(db.pipeline()\n * .collection(\"books\")\n * .select(\"title\", \"author\", field(\"rating\").as(\"bookRating\")));\n *\n * // Example 2: Filter documents where 'genre' is \"Science Fiction\" and 'published' is after 1950\n * const results2 = await execute(db.pipeline()\n * .collection(\"books\")\n * .where(and(field(\"genre\").equal(\"Science Fiction\"), field(\"published\").greaterThan(1950))));\n *\n * // Example 3: Calculate the average rating of books published after 1980\n * const results3 = await execute(db.pipeline()\n * .collection(\"books\")\n * .where(field(\"published\").greaterThan(1980))\n * .aggregate(average(field(\"rating\")).as(\"averageRating\")));\n * ```\n */\nexport class Pipeline implements ProtoSerializable<ProtoPipeline>, UserData {\n /**\n * @internal\n * @private\n * @param _db\n * @param userDataReader\n * @param _userDataWriter\n * @param stages\n */\n constructor(\n /**\n * @internal\n * @private\n */\n public _db: Firestore | undefined,\n /**\n * @internal\n * @private\n */\n readonly userDataReader: UserDataReader | undefined,\n /**\n * @internal\n * @private\n */\n public _userDataWriter: AbstractUserDataWriter | undefined,\n /**\n * @internal\n * @private\n */\n readonly stages: Stage[]\n ) {}\n\n _readUserData(context: ParseContext): void {\n this.stages.forEach(stage => {\n const subContext = context.contextWith({\n methodName: stage._name\n });\n stage._readUserData(subContext);\n });\n }\n\n /**\n * Adds new fields to outputs from previous stages.\n *\n * This stage allows you to compute values on-the-fly based on existing data from previous\n * stages or constants. You can use this to create new fields or overwrite existing ones (if there\n * is name overlaps).\n *\n * The added fields are defined using {@link @firebase/firestore/pipelines#Selectable}s, which can be:\n *\n * <ul>\n * <li>{@link @firebase/firestore/pipelines#Field}: References an existing document field.</li>\n * <li>{@link @firebase/firestore/pipelines#Expression}: Either a literal value (see {@link @firebase/firestore/pipelines#(constant:1)}) or a computed value\n * with an assigned alias using {@link @firebase/firestore/pipelines#Expression.(as:1)}.</li>\n * </ul>\n *\n * @example\n * ```typescript\n * firestore.pipeline().collection(\"books\")\n * .addFields(\n * field(\"rating\").as(\"bookRating\"), // Rename 'rating' to 'bookRating'\n * add(field(\"quantity\"), 5).as(\"totalCost\") // Calculate 'totalCost'\n * );\n * ```\n *\n * @param field - The first field to add to the documents, specified as a {@link @firebase/firestore/pipelines#Selectable}.\n * @param additionalFields - Optional additional fields to add to the documents, specified as {@link @firebase/firestore/pipelines#Selectable}s.\n * @returns A new Pipeline object with this stage appended to the stage list.\n */\n addFields(field: Selectable, ...additionalFields: Selectable[]): Pipeline;\n /**\n * Adds new fields to outputs from previous stages.\n *\n * This stage allows you to compute values on-the-fly based on existing data from previous\n * stages or constants. You can use this to create new fields or overwrite existing ones (if there\n * is name overlaps).\n *\n * The added fields are defined using {@link @firebase/firestore/pipelines#Selectable}s, which can be:\n *\n * <ul>\n * <li>{@link @firebase/firestore/pipelines#Field}: References an existing document field.</li>\n * <li>{@link @firebase/firestore/pipelines#Expression}: Either a literal value (see {@link @firebase/firestore/pipelines#(constant:1)}) or a computed value\n * with an assigned alias using {@link @firebase/firestore/pipelines#Expression.(as:1)}.</li>\n * </ul>\n *\n * @example\n * ```typescript\n * firestore.pipeline().collection(\"books\")\n * .addFields(\n * field(\"rating\").as(\"bookRating\"), // Rename 'rating' to 'bookRating'\n * add(field(\"quantity\"), 5).as(\"totalCost\") // Calculate 'totalCost'\n * );\n * ```\n *\n * @param options - An object that specifies required and optional parameters for the stage.\n * @returns A new Pipeline object with this stage appended to the stage list.\n */\n addFields(options: AddFieldsStageOptions): Pipeline;\n addFields(\n fieldOrOptions: Selectable | AddFieldsStageOptions,\n ...additionalFields: Selectable[]\n ): Pipeline {\n // Process argument union(s) from method overloads\n let fields: Selectable[];\n let options: {};\n if (isSelectable(fieldOrOptions)) {\n fields = [fieldOrOptions, ...additionalFields];\n options = {};\n } else {\n ({ fields, ...options } = fieldOrOptions);\n }\n\n // Convert user land convenience types to internal types\n const normalizedFields: Map<string, Expression> = selectablesToMap(fields);\n\n // Create stage object\n const stage = new AddFields(normalizedFields, options);\n\n // Add stage to the pipeline\n return this._addStage(stage);\n }\n\n /**\n * Remove fields from outputs of previous stages.\n *\n * @example\n * ```typescript\n * firestore.pipeline().collection('books')\n * // removes field 'rating' and 'cost' from the previous stage outputs.\n * .removeFields(\n * field('rating'),\n * 'cost'\n * );\n * ```\n *\n * @param fieldValue - The first field to remove.\n * @param additionalFields - Optional additional fields to remove.\n * @returns A new Pipeline object with this stage appended to the stage list.\n */\n removeFields(\n fieldValue: Field | string,\n ...additionalFields: Array<Field | string>\n ): Pipeline;\n /**\n * Remove fields from outputs of previous stages.\n *\n * @example\n * ```typescript\n * firestore.pipeline().collection('books')\n * // removes field 'rating' and 'cost' from the previous stage outputs.\n * .removeFields(\n * field('rating'),\n * 'cost'\n * );\n * ```\n *\n * @param options - An object that specifies required and optional parameters for the stage.\n * @returns A new Pipeline object with this stage appended to the stage list.\n */\n removeFields(options: RemoveFieldsStageOptions): Pipeline;\n removeFields(\n fieldValueOrOptions: Field | string | RemoveFieldsStageOptions,\n ...additionalFields: Array<Field | string>\n ): Pipeline {\n // Process argument union(s) from method overloads\n const options =\n isField(fieldValueOrOptions) || isString(fieldValueOrOptions)\n ? {}\n : fieldValueOrOptions;\n const fields: Array<Field | string> =\n isField(fieldValueOrOptions) || isString(fieldValueOrOptions)\n ? [fieldValueOrOptions, ...additionalFields]\n : fieldValueOrOptions.fields;\n\n // Convert user land convenience types to internal types\n const convertedFields: Field[] = fields.map(f =>\n isString(f) ? field(f) : (f as Field)\n );\n\n // Create stage object\n const stage = new RemoveFields(convertedFields, options);\n\n // Add stage to the pipeline\n return this._addStage(stage);\n }\n\n /**\n * Defines one or more variables in the pipeline's scope. `define` is used to bind a value to a\n * variable for internal reuse within the pipeline body (accessed via the `variable()` function).\n *\n * This stage is useful for declaring reusable values or intermediate calculations that can be\n * referenced multiple times in later parts of the pipeline, improving readability and\n * maintainability.\n *\n * Each variable is defined using an {@link @firebase/firestore/pipelines#AliasedExpression}, which pairs an expression with a name\n * (alias). The expression can be a simple constant, a field reference, or a complex computation.\n *\n * @example\n * ```typescript\n * db.pipeline().collection(\"products\")\n * .define(\n * field(\"price\").multiply(0.9).as(\"discountedPrice\"),\n * field(\"stock\").add(10).as(\"newStock\")\n * )\n * .where(variable(\"discountedPrice\").lessThan(100))\n * .select(field(\"name\"), variable(\"newStock\"));\n * ```\n *\n * @param aliasedExpression - The first expression to bind to a variable.\n * @param additionalExpressions - Optional additional expression to bind to a variable.\n * @returns A new Pipeline object with this stage appended to the stage list.\n */\n define(\n aliasedExpression: AliasedExpression,\n ...additionalExpressions: AliasedExpression[]\n ): Pipeline;\n /**\n * Defines one or more variables in the pipeline's scope. `define` is used to bind a value to a\n * variable for internal reuse within the pipeline body (accessed via the `variable()` function).\n *\n * This stage is useful for declaring reusable values or intermediate calculations that can be\n * referenced multiple times in later parts of the pipeline, improving readability and\n * maintainability.\n *\n * Each variable is defined using an {@link @firebase/firestore/pipelines#AliasedExpression}, which pairs an expression with a name\n * (alias). The expression can be a simple constant, a field reference, or a complex computation.\n *\n * @example\n * ```typescript\n * db.pipeline().collection(\"products\")\n * .define(\n * field(\"price\").multiply(0.9).as(\"discountedPrice\"),\n * field(\"stock\").add(10).as(\"newStock\")\n * )\n * .where(variable(\"discountedPrice\").lessThan(100))\n * .select(field(\"name\"), variable(\"newStock\"));\n * ```\n *\n * @param options - An object that specifies required and optional parameters for the stage.\n * @returns A new Pipeline object with this stage appended to the stage list.\n */\n define(options: DefineStageOptions): Pipeline;\n define(\n aliasedExpressionOrOptions: AliasedExpression | DefineStageOptions,\n ...additionalExpressions: AliasedExpression[]\n ): Pipeline {\n // Process argument union(s) from method overloads\n const options = isAliasedExpr(aliasedExpressionOrOptions)\n ? {}\n : aliasedExpressionOrOptions;\n const aliasedExpressions: AliasedExpression[] = isAliasedExpr(\n aliasedExpressionOrOptions\n )\n ? [aliasedExpressionOrOptions, ...additionalExpressions]\n : aliasedExpressionOrOptions.variables;\n\n const convertedExpressions: Map<string, Expression> =\n selectablesToMap(aliasedExpressions);\n\n // Create stage object\n const stage = new Define(convertedExpressions, options);\n\n return this._addStage(stage);\n }\n\n /**\n * Converts this Pipeline into an expression that evaluates to an array of results.\n *\n * <p>Result Unwrapping:</p>\n * <ul>\n * <li>If the items have a single field, their values are unwrapped and returned directly in the array.</li>\n * <li>If the items have multiple fields, they are returned as objects in the array</li>\n * </ul>\n *\n * @example\n * ```typescript\n * // Get a list of reviewers for each book\n * db.pipeline().collection(\"books\")\n * .define(field(\"id\").as(\"book_id\"))\n * .addFields(\n * db.pipeline().collection(\"reviews\")\n * .where(field(\"book_id\").equal(variable(\"book_id\")))\n * .select(field(\"reviewer\"))\n * .toArrayExpression()\n * .as(\"reviewers\")\n * )\n * ```\n *\n * Output:\n * ```json\n * [\n * {\n * \"id\": \"1\",\n * \"title\": \"1984\",\n * \"reviewers\": [\"Alice\", \"Bob\"]\n * }\n * ]\n * ```\n *\n * Multiple Fields:\n * ```typescript\n * // Get a list of reviews (reviewer and rating) for each book\n * db.pipeline().collection(\"books\")\n * .define(field(\"id\").as(\"book_id\"))\n * .addFields(\n * db.pipeline().collection(\"reviews\")\n * .where(field(\"book_id\").equal(variable(\"book_id\")))\n * .select(field(\"reviewer\"), field(\"rating\"))\n * .toArrayExpression()\n * .as(\"reviews\"))\n * ```\n *\n * Output:\n * ```json\n * [\n * {\n * \"id\": \"1\",\n * \"title\": \"1984\",\n * \"reviews\": [\n * { \"reviewer\": \"Alice\", \"rating\": 5 },\n * { \"reviewer\": \"Bob\", \"rating\": 4 }\n * ]\n * }\n * ]\n * ```\n *\n * @returns An `Expression` representing the execution of this pipeline.\n */\n toArrayExpression(): Expression {\n return new FunctionExpression('array', [fieldOrExpression(this)]);\n }\n\n /**\n * Converts this Pipeline into an expression that evaluates to a single scalar result.\n *\n * <p><b>Runtime Validation:</b> The runtime validates that the result set contains zero or one item. If\n * zero items, it evaluates to `null`.</p>\n *\n * <p>Result Unwrapping:</p>\n * <ul>\n * <li>If the item has a single field, its value is unwrapped and returned directly.</li>\n * <li>If the item has multiple fields, they are returned as an object.</li>\n * </ul>\n *\n * @example\n * ```typescript\n * // Calculate average rating for a restaurant\n * db.pipeline().collection(\"restaurants\").addFields(\n * db.pipeline().collection(\"reviews\")\n * .where(field(\"restaurant_id\").equal(variable(\"rid\")))\n * .aggregate(average(\"rating\").as(\"avg\"))\n * // Unwraps the single \"avg\" field to a scalar double\n * .toScalarExpression().as(\"average_rating\")\n * )\n * ```\n *\n * Output:\n * ```json\n * {\n * \"name\": \"The Burger Joint\",\n * \"average_rating\": 4.5\n * }\n * ```\n *\n * Multiple Fields:\n * ```typescript\n * // Calculate average rating AND count for a restaurant\n * db.pipeline().collection(\"restaurants\").addFields(\n * db.pipeline().collection(\"reviews\")\n * .where(field(\"restaurant_id\").equal(variable(\"rid\")))\n * .aggregate(\n * average(\"rating\").as(\"avg\"),\n * count().as(\"count\")\n * )\n * // Returns an object with \"avg\" and \"count\" fields\n * .toScalarExpression().as(\"stats\")\n * )\n * ```\n *\n * Output:\n * ```json\n * {\n * \"name\": \"The Burger Joint\",\n * \"stats\": {\n * \"avg\": 4.5,\n * \"count\": 100\n * }\n * }\n * ```\n *\n * @returns An `Expression` representing the execution of this pipeline.\n */\n toScalarExpression(): Expression {\n return new FunctionExpression('scalar', [fieldOrExpression(this)]);\n }\n\n /**\n * Selects or creates a set of fields from the outputs of previous stages.\n *\n * <p>The selected fields are defined using {@link @firebase/firestore/pipelines#Selectable} expressions, which can be:\n *\n * <ul>\n * <li>`string` : Name of an existing field</li>\n * <li>{@link @firebase/firestore/pipelines#Field}: References an existing field.</li>\n * <li>{@link @firebase/firestore/pipelines#AliasedExpression}: Represents the result of a function with an assigned alias name using\n * {@link @firebase/firestore/pipelines#Expression.(as:1)}</li>\n * </ul>\n *\n * <p>If no selections are provided, the output of this stage is empty. Use {@link\n * @firebase/firestore/pipelines#Pipeline.(addFields:1)} instead if only additions are\n * desired.\n *\n * @example\n * ```typescript\n * db.pipeline().collection(\"books\")\n * .select(\n * \"firstName\",\n * field(\"lastName\"),\n * field(\"address\").toUpper().as(\"upperAddress\"),\n * );\n * ```\n *\n * @param selection - The first field to include in the output documents, specified as {@link\n * @firebase/firestore/pipelines#Selectable} expression or string value representing the field name.\n * @param additionalSelections - Optional additional fields to include in the output documents, specified as {@link\n * @firebase/firestore/pipelines#Selectable} expressions or `string` values representing field names.\n * @returns A new Pipeline object with this stage appended to the stage list.\n */\n select(\n selection: Selectable | string,\n ...additionalSelections: Array<Selectable | string>\n ): Pipeline;\n /**\n * Selects or creates a set of fields from the outputs of previous stages.\n *\n * <p>The selected fields are defined using {@link @firebase/firestore/pipelines#Selectable} expressions, which can be:\n *\n * <ul>\n * <li>`string`: Name of an existing field</li>\n * <li>{@link @firebase/firestore/pipelines#Field}: References an existing field.</li>\n * <li>{@link @firebase/firestore/pipelines#AliasedExpression}: Represents the result of a function with an assigned alias name using\n * {@link @firebase/firestore/pipelines#Expression.(as:1)}</li>\n * </ul>\n *\n * <p>If no selections are provided, the output of this stage is empty. Use {@link\n * @firebase/firestore/pipelines#Pipeline.(addFields:1)} instead if only additions are\n * desired.\n *\n * @example\n * ```typescript\n * db.pipeline().collection(\"books\")\n * .select(\n * \"firstName\",\n * field(\"lastName\"),\n * field(\"address\").toUpper().as(\"upperAddress\"),\n * );\n * ```\n *\n * @param options - An object that specifies required and optional parameters for the stage.\n * @returns A new Pipeline object with this stage appended to the stage list.\n */\n select(options: SelectStageOptions): Pipeline;\n select(\n selectionOrOptions: Selectable | string | SelectStageOptions,\n ...additionalSelections: Array<Selectable | string>\n ): Pipeline {\n // Process argument union(s) from method overloads\n const options =\n isSelectable(selectionOrOptions) || isString(selectionOrOptions)\n ? {}\n : selectionOrOptions;\n\n const selections: Array<Selectable | string> =\n isSelectable(selectionOrOptions) || isString(selectionOrOptions)\n ? [selectionOrOptions, ...additionalSelections]\n : selectionOrOptions.selections;\n\n // Convert user land convenience types to internal types\n const normalizedSelections: Map<string, Expression> =\n selectablesToMap(selections);\n\n // Create stage object\n const stage = new Select(normalizedSelections, options);\n\n // Add stage to the pipeline\n return this._addStage(stage);\n }\n\n /**\n * Filters the documents from previous stages to only include those matching the specified {@link\n * @firebase/firestore/pipelines#BooleanExpression}.\n *\n * <p>This stage allows you to apply conditions to the data, similar to a \"WHERE\" clause in SQL.\n * You can filter documents based on their field values, using implementations of {@link\n * @firebase/firestore/pipelines#BooleanExpression}, typically including but not limited to:\n *\n * <ul>\n * <li>field comparators: {@link @firebase/firestore/pipelines#Expression.(equal:1)}, {@link @firebase/firestore/pipelines#Expression.(lessThan:1)}, {@link\n * @firebase/firestore/pipelines#Expression.(greaterThan:1)}, etc.</li>\n * <li>logical operators: {@link @firebase/firestore/pipelines#Expression.(and:1)}, {@link @firebase/firestore/pipelines#Expression.(or:1)}, {@link @firebase/firestore/pipelines#Expression.(not:1)}, etc.</li>\n * <li>advanced functions: {@link @firebase/firestore/pipelines#Expression.(regexMatch:1)}, {@link\n * @firebase/firestore/pipelines#Expression.(arrayContains:1)}, etc.</li>\n * </ul>\n *\n * @example\n * ```typescript\n * firestore.pipeline().collection(\"books\")\n * .where(\n * and(\n * greaterThan(field(\"rating\"), 4.0), // Filter for ratings greater than 4.0\n * field(\"genre\").equal(\"Science Fiction\") // Equivalent to equal(\"genre\", \"Science Fiction\")\n * )\n * );\n * ```\n *\n * @param condition - The {@link @firebase/firestore/pipelines#BooleanExpression} to apply.\n * @returns A new Pipeline object with this stage appended to the stage list.\n */\n where(condition: BooleanExpression): Pipeline;\n /**\n * Filters the documents from previous stages to only include those matching the specified {@link\n * @firebase/firestore/pipelines#BooleanExpression}.\n *\n * <p>This stage allows you to apply conditions to the data, similar to a \"WHERE\" clause in SQL.\n * You can filter documents based on their field values, using implementations of {@link\n * @firebase/firestore/pipelines#BooleanExpression}, typically including but not limited to:\n *\n * <ul>\n * <li>field comparators: {@link @firebase/firestore/pipelines#Expression.(eq:1)}, {@link @firebase/firestore/pipelines#Expression.(lt:1)} (less than), {@link\n * @firebase/firestore/pipelines#Expression.(greaterThan:1)}, etc.</li>\n * <li>logical operators: {@link @firebase/firestore/pipelines#Expression.(and:1)}, {@link @firebase/firestore/pipelines#Expression.(or:1)}, {@link @firebase/firestore/pipelines#Expression.(not:1)}, etc.</li>\n * <li>advanced functions: {@link @firebase/firestore/pipelines#Expression.(regexMatch:1)}, {@link\n * @firebase/firestore/pipelines#Expression.(arrayContains:1)}, etc.</li>\n * </ul>\n *\n * @example\n * ```typescript\n * firestore.pipeline().collection(\"books\")\n * .where(\n * and(\n * greaterThan(field(\"rating\"), 4.0), // Filter for ratings greater than 4.0\n * field(\"genre\").equal(\"Science Fiction\") // Equivalent to equal(\"genre\", \"Science Fiction\")\n * )\n * );\n * ```\n *\n * @param options - An object that specifies required and optional parameters for the stage.\n * @returns A new Pipeline object with this stage appended to the stage list.\n */\n where(options: WhereStageOptions): Pipeline;\n where(conditionOrOptions: BooleanExpression | WhereStageOptions): Pipeline {\n // Process argument union(s) from method overloads\n const options = isBooleanExpr(conditionOrOptions) ? {} : conditionOrOptions;\n const condition: BooleanExpression = isBooleanExpr(conditionOrOptions)\n ? conditionOrOptions\n : conditionOrOptions.condition;\n\n // Create stage object\n const stage = new Where(condition, options);\n\n // Add stage to the pipeline\n return this._addStage(stage);\n }\n\n /**\n * Skips the first `offset` number of documents from the results of previous stages.\n *\n * <p>This stage is useful for implementing pagination in your pipelines, allowing you to retrieve\n * results in chunks. It is typically used in conjunction with {@link @firebase/firestore/pipelines#Pipeline.limit} to control the\n * size of each page.\n *\n * @example\n * ```typescript\n * // Retrieve the second page of 20 results\n * firestore.pipeline().collection('books')\n * .sort(field('published').descending())\n * .offset(20) // Skip the first 20 results\n * .limit(20); // Take the next 20 results\n * ```\n *\n * @param offset - The number of documents to skip.\n * @returns A new Pipeline object with this stage appended to the stage list.\n */\n offset(offset: number): Pipeline;\n /**\n * Skips the first `offset` number of documents from the results of previous stages.\n *\n * <p>This stage is useful for implementing pagination in your pipelines, allowing you to retrieve\n * results in chunks. It is typically used in conjunction with {@link @firebase/firestore/pipelines#Pipeline.limit} to control the\n * size of each page.\n *\n * @example\n * ```typescript\n * // Retrieve the second page of 20 results\n * firestore.pipeline().collection('books')\n * .sort(field('published').descending())\n * .offset(20) // Skip the first 20 results\n * .limit(20); // Take the next 20 results\n * ```\n *\n * @param options - An object that specifies required and optional parameters for the stage.\n * @returns A new Pipeline object with this stage appended to the stage list.\n */\n offset(options: OffsetStageOptions): Pipeline;\n offset(offsetOrOptions: number | OffsetStageOptions): Pipeline {\n // Process argument union(s) from method overloads\n let options: {};\n let offset: number;\n if (isNumber(offsetOrOptions)) {\n options = {};\n offset = offsetOrOptions;\n } else {\n options = offsetOrOptions;\n offset = offsetOrOptions.offset;\n }\n\n // Create stage object\n const stage = new Offset(offset, options);\n\n // Add stage to the pipeline\n return this._addStage(stage);\n }\n\n /**\n * Limits the maximum number of documents returned by previous stages to `limit`.\n *\n * <p>This stage is particularly useful when you want to retrieve a controlled subset of data from\n * a potentially large result set. It's often used for:\n *\n * <ul>\n * <li>Pagination: In combination with {@link @firebase/firestore/pipelines#Pipeline.offset} to retrieve specific pages of\n * results.</li>\n * <li>Limiting Data Retrieval: To prevent excessive data transfer and improve performance,\n * especially when dealing with large collections.</li>\n * </ul>\n *\n * @example\n * ```typescript\n * // Limit the results to the top 10 highest-rated books\n * firestore.pipeline().collection('books')\n * .sort(field('rating').descending())\n * .limit(10);\n * ```\n *\n * @param limit - The maximum number of documents to return.\n * @returns A new Pipeline object with this stage appended to the stage list.\n */\n limit(limit: number): Pipeline;\n /**\n * Limits the maximum number of documents returned by previous stages to `limit`.\n *\n * <p>This stage is particularly useful when you want to retrieve a controlled subset of data from\n * a potentially large result set. It's often used for:\n *\n * <ul>\n * <li>Pagination: In combination with {@link @firebase/firestore/pipelines#Pipeline.offset} to retrieve specific pages of\n * results.</li>\n * <li>Limiting Data Retrieval: To prevent excessive data transfer and improve performance,\n * especially when dealing with large collections.</li>\n * </ul>\n *\n * @example\n * ```typescript\n * // Limit the results to the top 10 highest-rated books\n * firestore.pipeline().collection('books')\n * .sort(field('rating').descending())\n * .limit(10);\n * ```\n *\n * @param options - An object that specifies required and optional parameters for the stage.\n * @returns A new Pipeline object with this stage appended to the stage list.\n */\n limit(options: LimitStageOptions): Pipeline;\n limit(limitOrOptions: number | LimitStageOptions): Pipeline {\n // Process argument union(s) from method overloads\n const options = isNumber(limitOrOptions) ? {} : limitOrOptions;\n const limit: number = isNumber(limitOrOptions)\n ? limitOrOptions\n : limitOrOptions.limit;\n\n // Create stage object\n const stage = new Limit(limit, options);\n\n // Add stage to the pipeline\n return this._addStage(stage);\n }\n\n /**\n * Returns a set of distinct values from the inputs to this stage.\n *\n * This stage runs through the results from previous stages to include only results with\n * unique combinations of {@link @firebase/firestore/pipelines#Expression} values ({@link @firebase/firestore/pipelines#Field}, {@link @firebase/firestore/pipelines#AliasedExpression}, etc).\n *\n * The parameters to this stage are defined using {@link @firebase/firestore/pipelines#Selectable} expressions or strings:\n *\n * <ul>\n * <li> `string`: Name of an existing field</li>\n * <li> {@link @firebase/firestore/pipelines#Field}: References an existing document field.</li>\n * <li> {@link @firebase/firestore/pipelines#AliasedExpression}: Represents the result of a function with an assigned alias name\n * using {@link @firebase/firestore/pipelines#Expression.(as:1)}.</li>\n * </ul>\n *\n * @example\n * ```typescript\n * // Get a list of unique author names in uppercase and genre combinations.\n * firestore.pipeline().collection(\"books\")\n * .distinct(toUpper(field(\"author\")).as(\"authorName\"), field(\"genre\"), \"publishedAt\")\n * .select(\"authorName\");\n * ```\n *\n * @param group - The {@link @firebase/firestore/pipelines#Selectable} expression or field name to consider when determining\n * distinct value combinations.\n * @param additionalGroups - Optional additional {@link @firebase/firestore/pipelines#Selectable} expressions to consider when determining distinct\n * value combinations or strings representing field names.\n * @returns A new {@link @firebase/firestore/pipelines#Pipeline} object with this stage appended to the stage list.\n */\n distinct(\n group: string | Selectable,\n ...additionalGroups: Array<string | Selectable>\n ): Pipeline;\n /**\n * Returns a set of distinct values from the inputs to this stage.\n *\n * This stage runs through the results from previous stages to include only results with\n * unique combinations of {@link @firebase/firestore/pipelines#Expression} values ({@link @firebase/firestore/pipelines#Field}, {@link @firebase/firestore/pipelines#AliasedExpression}, etc).\n *\n * The parameters to this stage are defined using {@link @firebase/firestore/pipelines#Selectable} expressions or strings:\n *\n * <ul>\n * <li>`string`: Name of an existing field</li>\n * <li>{@link @firebase/firestore/pipelines#Field}: References an existing document field.</li>\n * <li>{@link @firebase/firestore/pipelines#AliasedExpression}: Represents the result of a function with an assigned alias name\n * using {@link @firebase/firestore/pipelines#Expression.(as:1)}.</li>\n * </ul>\n *\n * @example\n * ```typescript\n * // Get a list of unique author names in uppercase and genre combinations.\n * firestore.pipeline().collection(\"books\")\n * .distinct(toUpper(field(\"author\")).as(\"authorName\"), field(\"genre\"), \"publishedAt\")\n * .select(\"authorName\");\n * ```\n *\n * @param options - An object that specifies required and optional parameters for the stage.\n * @returns A new {@link @firebase/firestore/pipelines#Pipeline} object with this stage appended to the stage list.\n */\n distinct(options: DistinctStageOptions): Pipeline;\n distinct(\n groupOrOptions: string | Selectable | DistinctStageOptions,\n ...additionalGroups: Array<string | Selectable>\n ): Pipeline {\n // Process argument union(s) from method overloads\n const options =\n isString(groupOrOptions) || isSelectable(groupOrOptions)\n ? {}\n : groupOrOptions;\n const groups: Array<string | Selectable> =\n isString(groupOrOptions) || isSelectable(groupOrOptions)\n ? [groupOrOptions, ...additionalGroups]\n : groupOrOptions.groups;\n\n // Convert user land convenience types to internal types\n const convertedGroups: Map<string, Expression> = selectablesToMap(groups);\n\n // Create stage object\n const stage = new Distinct(convertedGroups, options);\n\n // Add stage to the pipeline\n return this._addStage(stage);\n }\n\n /**\n * Performs aggregation operations on the documents from previous stages.\n *\n * This stage allows you to calculate aggregate values over a set of documents. You define the\n * aggregations to perform using {@link @firebase/firestore/pipelines#AliasedAggregate} expressions which are typically results of\n * calling {@link @firebase/firestore/pipelines#Expression.(as:1)} on {@link @firebase/firestore/pipelines#AggregateFunction} instances.\n *\n * @example\n * ```typescript\n * // Calculate the average rating and the total number of books\n * firestore.pipeline().collection(\"books\")\n * .aggregate(\n * field(\"rating\").average().as(\"averageRating\"),\n * countAll().as(\"totalBooks\")\n * );\n * ```\n *\n * @param accumulator - The first {@link @firebase/firestore/pipelines#AliasedAggregate}, wrapping an {@link @firebase/firestore/pipelines#AggregateFunction}\n * and providing a name for the accumulated results.\n * @param additionalAccumulators - Optional additional {@link @firebase/firestore/pipelines#AliasedAggregate}, each wrapping an {@link @firebase/firestore/pipelines#AggregateFunction}\n * and providing a name for the accumulated results.\n * @returns A new Pipeline object with this stage appended to the stage list.\n */\n aggregate(\n accumulator: AliasedAggregate,\n ...additionalAccumulators: AliasedAggregate[]\n ): Pipeline;\n /**\n * Performs optionally grouped aggregation operations on the documents from previous stages.\n *\n * This stage allows you to calculate aggregate values over a set of documents, optionally\n * grouped by one or more fields or functions. You can specify:\n *\n * <ul>\n * <li>Grouping Fields or Functions: One or more fields or functions to group the documents\n * by. For each distinct combination of values in these fields, a separate group is created.\n * If no grouping fields are provided, a single group containing all documents is used. Not\n * specifying groups is the same as putting the entire inputs into one group.</li>\n * <li>Accumulators: One or more accumulation operations to perform within each group. These\n * are defined using {@link @firebase/firestore/pipelines#AliasedAggregate} expressions, which are typically created by\n * calling {@link @firebase/firestore/pipelines#Expression.(as:1)} on {@link @firebase/firestore/pipelines#AggregateFunction} instances. Each aggregation\n * calculates a value (e.g., sum, average, count) based on the documents within its group.</li>\n * </ul>\n *\n * @example\n * ```typescript\n * // Calculate the average rating for each genre.\n * firestore.pipeline().collection(\"books\")\n * .aggregate({\n * accumulators: [average(field(\"rating\")).as(\"avg_rating\")],\n * groups: [\"genre\"]\n * });\n * ```\n *\n * @param options - An object that specifies required and optional parameters for the stage.\n * @returns A new {@link @firebase/firestore/pipelines#Pipeline} object with this stage appended to the stage\n * list.\n */\n aggregate(options: AggregateStageOptions): Pipeline;\n aggregate(\n targetOrOptions: AliasedAggregate | AggregateStageOptions,\n ...rest: AliasedAggregate[]\n ): Pipeline {\n // Process argument union(s) from method overloads\n const options = isAliasedAggregate(targetOrOptions) ? {} : targetOrOptions;\n const accumulators: AliasedAggregate[] = isAliasedAggregate(targetOrOptions)\n ? [targetOrOptions, ...rest]\n : targetOrOptions.accumulators;\n const groups: Array<Selectable | string> = isAliasedAggregate(\n targetOrOptions\n )\n ? []\n : targetOrOptions.groups ?? [];\n\n // Convert user land convenience types to internal types\n const convertedAccumulators: Map<string, AggregateFunction> =\n aliasedAggregateToMap(accumulators);\n const convertedGroups: Map<string, Expression> = selectablesToMap(groups);\n\n // Create stage object\n const stage = new Aggregate(\n convertedGroups,\n convertedAccumulators,\n options\n );\n\n // Add stage to the pipeline\n return this._addStage(stage);\n }\n\n /**\n * Performs a vector proximity search on the documents from the previous stage, returning the\n * K-nearest documents based on the specified query `vectorValue` and `distanceMeasure`. The\n * returned documents will be sorted in order from nearest to furthest from the query `vectorValue`.\n *\n * @example\n * ```typescript\n * // Find the 10 most similar books based on the book description.\n * const bookDescription = \"Lorem ipsum...\";\n * const queryVector: number[] = ...; // compute embedding of `bookDescription`\n *\n * firestore.pipeline().collection(\"books\")\n * .findNearest({\n * field: 'embedding',\n * vectorValue: queryVector,\n * distanceMeasure: 'euclidean',\n * limit: 10, // optional\n * distanceField: 'computedDistance' // optional\n * });\n * ```\n *\n * @param options - An object that specifies required and optional parameters for the stage.\n * @returns A new {@link @firebase/firestore/pipelines#Pipeline} object with this stage appended to the stage list.\n */\n findNearest(options: FindNearestStageOptions): Pipeline {\n // Convert user land convenience types to internal types\n const field = toField(options.field);\n const vectorValue = vectorToExpr(options.vectorValue);\n const distanceField = options.distanceField\n ? toField(options.distanceField)\n : undefined;\n const internalOptions = {\n distanceField,\n limit: options.limit,\n rawOptions: options.rawOptions\n };\n\n // Create stage object\n const stage = new FindNearest(\n vectorValue,\n field,\n options.distanceMeasure,\n internalOptions\n );\n\n // Add stage to the pipeline\n return this._addStage(stage);\n }\n\n // TODO(search) link to external documentation citing list of supported\n // expressions, when that documentation is created. List is not maintained\n // in the SDK because the list will change as the backend enables support.\n\n /**\n * Add a search stage to the Pipeline. The search stage supports\n * full-text search and geo search expressions.\n *\n * @remarks\n * This must be the first stage of the pipeline. A limited set of expressions are supported in the search stage.\n *\n * @example\n * ```typescript\n * // Full-text search example\n * firestore.pipeline().collection(\"restaurants\")\n * .search({\n * query: documentMatches(\"waffles OR pancakes\"),\n * sort: [\n * score().descending(),\n * ],\n * addFields: [\n * score().as(\"searchScore\"),\n * ]\n * })\n * ```\n *\n * @example\n * ```typescript\n * // Geo distance search example\n * const queryLocation = new GeoPoint(0, 0);\n * db.pipeline().collection('restaurants').search({\n * query: field('location').geoDistance(queryLocation).lessThanOrEqual(1000),\n * sort: [\n * score().descending(),\n * ],\n * })\n * ```\n *\n * @param options - An object that specifies parameters for the stage.\n * @return A new `Pipeline` object with this stage appended to the stage list.\n * @beta\n */\n search(options: SearchStageOptions): Pipeline {\n // Convert user land convenience types to internal types\n const addFields: Record<string, Expression> | undefined = options.addFields\n ? selectablesToObject(options.addFields)\n : undefined;\n const query: BooleanExpression = isExpr(options.query)\n ? options.query\n : documentMatches(options.query);\n const sort: Ordering[] | undefined = isOrdering(options.sort)\n ? [options.sort]\n : options.sort;\n\n const select: Record<string, Expression> | undefined = undefined;\n // TODO(search) enable with backend support\n // select = options.select\n // ? selectablesToObject(options.select)\n // : undefined;\n\n const internalOptions = {\n ...options,\n addFields,\n select,\n query,\n sort\n };\n\n // Create stage object\n const stage = new Search(internalOptions);\n\n // Add stage to the pipeline\n return this._addStage(stage);\n }\n\n /**\n * Sorts the documents from previous stages based on one or more {@link @firebase/firestore/pipelines#Ordering} criteria.\n *\n * <p>This stage allows you to order the results of your pipeline. You can specify multiple {@link\n * @firebase/firestore/pipelines#Ordering} instances to sort by multiple fields in ascending or descending order. If documents\n * have the same value for a field used for sorting, the next specified ordering will be used. If\n * all orderings result in equal comparison, the documents are considered equal and the order is\n * unspecified.\n *\n * @example\n * ```typescript\n * // Sort books by rating in descending order, and then by title in ascending order for books\n * // with the same rating\n * firestore.pipeline().collection(\"books\")\n * .sort(\n * field(\"rating\").descending(),\n * field(\"title\").ascending()\n * );\n * ```\n *\n * @param ordering - The first {@link @firebase/firestore/pipelines#Ordering} instance specifying the sorting criteria.\n * @param additionalOrderings - Optional additional {@link @firebase/firestore/pipelines#Ordering} instances specifying the additional sorting criteria.\n * @returns A new {@link @firebase/firestore/pipelines#Pipeline} object with this stage appended to the stage list.\n */\n sort(ordering: Ordering, ...additionalOrderings: Ordering[]): Pipeline;\n /**\n * Sorts the documents from previous stages based on one or more {@link @firebase/firestore/pipelines#Ordering} criteria.\n *\n * <p>This stage allows you to order the results of your pipeline. You can specify multiple {@link\n * @firebase/firestore/pipelines#Ordering} instances to sort by multiple fields in ascending or descending order. If documents\n * have the same value for a field used for sorting, the next specified ordering will be used. If\n * all orderings result in equal comparison, the documents are considered equal and the order is\n * unspecified.\n *\n * @example\n * ```typescript\n * // Sort books by rating in descending order, and then by title in ascending order for books\n * // with the same rating\n * firestore.pipeline().collection(\"books\")\n * .sort(\n * field(\"rating\").descending(),\n * field(\"title\").ascending()\n * );\n * ```\n *\n * @param options - An object that specifies required and optional parameters for the stage.\n * @returns A new {@link @firebase/firestore/pipelines#Pipeline} object with this stage appended to the stage list.\n */\n sort(options: SortStageOptions): Pipeline;\n sort(\n orderingOrOptions: Ordering | SortStageOptions,\n ...additionalOrderings: Ordering[]\n ): Pipeline {\n // Process argument union(s) from method overloads\n const options = isOrdering(orderingOrOptions) ? {} : orderingOrOptions;\n const orderings: Ordering[] = isOrdering(orderingOrOptions)\n ? [orderingOrOptions, ...additionalOrderings]\n : orderingOrOptions.orderings;\n\n // Create stage object\n const stage = new Sort(orderings, options);\n\n // Add stage to the pipeline\n return this._addStage(stage);\n }\n\n /**\n * Fully overwrites all fields in a document with those coming from a nested map.\n *\n * <p>This stage allows you to emit a map value as a document. Each key of the map becomes a field\n * on the document that contains the corresponding value.\n *\n * @example\n * ```typescript\n * // Input.\n * // {\n * // 'name': 'John Doe Jr.',\n * // 'parents': {\n * // 'father': 'John Doe Sr.',\n * // 'mother': 'Jane Doe'\n * // }\n * // }\n *\n * // Emit parents as document.\n * firestore.pipeline().collection('people').replaceWith('parents');\n *\n * // Output\n * // {\n * // 'father': 'John Doe Sr.',\n * // 'mother': 'Jane Doe'\n * // }\n * ```\n *\n * @param fieldName - The {@link @firebase/firestore/pipelines#Field} field containing the nested map.\n * @returns A new {@link @firebase/firestore/pipelines#Pipeline} object with this stage appended to the stage list.\n */\n replaceWith(fieldName: string): Pipeline;\n /**\n * Fully overwrites all fields in a document with those coming from a map.\n *\n * <p>This stage allows you to emit a map value as a document. Each key of the map becomes a field\n * on the document that contains the corresponding value.\n *\n * @example\n * ```typescript\n * // Input.\n * // {\n * // 'name': 'John Doe Jr.',\n * // 'parents': {\n * // 'father': 'John Doe Sr.',\n * // 'mother': 'Jane Doe'\n * // }\n * // }\n *\n * // Emit parents as document.\n * firestore.pipeline().collection('people').replaceWith(map({\n * foo: 'bar',\n * info: {\n * name: field('name')\n * }\n * }));\n *\n * // Output\n * // {\n * // 'father': 'John Doe Sr.',\n * // 'mother': 'Jane Doe'\n * // }\n * ```\n *\n * @param expr - An {@link @firebase/firestore/pipelines#Expression} that when returned evaluates to a map.\n * @returns A new {@link @firebase/firestore/pipelines#Pipeline} object with this stage appended to the stage list.\n */\n replaceWith(expr: Expression): Pipeline;\n /**\n * Fully overwrites all fields in a document with those coming from a map.\n *\n * <p>This stage allows you to emit a map value as a document. Each key of the map becomes a field\n * on the document that contains the corresponding value.\n *\n * @example\n * ```typescript\n * // Input.\n * // {\n * // 'name': 'John Doe Jr.',\n * // 'parents': {\n * // 'father': 'John Doe Sr.',\n * // 'mother': 'Jane Doe'\n * // }\n * // }\n *\n * // Emit parents as document.\n * firestore.pipeline().collection('people').replaceWith(map({\n * foo: 'bar',\n * info: {\n * name: field('name')\n * }\n * }));\n *\n * // Output\n * // {\n * // 'father': 'John Doe Sr.',\n * // 'mother': 'Jane Doe'\n * // }\n * ```\n *\n * @param options - An object that specifies required and optional parameters for the stage.\n * @returns A new {@link @firebase/firestore/pipelines#Pipeline} object with this stage appended to the stage list.\n */\n replaceWith(options: ReplaceWithStageOptions): Pipeline;\n replaceWith(\n valueOrOptions: Expression | string | ReplaceWithStageOptions\n ): Pipeline {\n // Process argument union(s) from method overloads\n const options =\n isString(valueOrOptions) || isExpr(valueOrOptions) ? {} : valueOrOptions;\n const fieldNameOrExpr: string | Expression =\n isString(valueOrOptions) || isExpr(valueOrOptions)\n ? valueOrOptions\n : valueOrOptions.map;\n\n // Convert user land convenience types to internal types\n const mapExpr = fieldOrExpression(fieldNameOrExpr);\n\n // Create stage object\n const stage = new Replace(mapExpr, options);\n\n // Add stage to the pipeline\n return this._addStage(stage);\n }\n\n /**\n * Performs a pseudo-random sampling of the documents from the previous stage.\n *\n * <p>This stage will filter documents pseudo-randomly. The parameter specifies how number of\n * documents to be returned.\n *\n * <p>Examples:\n *\n * @example\n * ```typescript\n * // Sample 25 books, if available.\n * firestore.pipeline().collection('books')\n * .sample(25);\n * ```\n *\n * @param documents - The number of documents to sample.\n * @returns A new {@link @firebase/firestore/pipelines#Pipeline} object with this stage appended to the stage list.\n */\n sample(documents: number): Pipeline;\n\n /**\n * Performs a pseudo-random sampling of the documents from the previous stage.\n *\n * <p>This stage will filter documents pseudo-randomly. The 'options' parameter specifies how\n * sampling will be performed. See {@link @firebase/firestore/pipelines#SampleStageOptions} for more information.\n *\n * @example\n * ```typescript\n * // Sample 10 books, if available.\n * firestore.pipeline().collection(\"books\")\n * .sample({ documents: 10 });\n *\n * // Sample 50% of books.\n * firestore.pipeline().collection(\"books\")\n * .sample({ percentage: 0.5 });\n * ```\n *\n * @param options - An object that specifies required and optional parameters for the stage.\n * @returns A new {@link @firebase/firestore/pipelines#Pipeline} object with this stage appended to the stage list.\n */\n sample(options: SampleStageOptions): Pipeline;\n sample(documentsOrOptions: number | SampleStageOptions): Pipeline {\n // Process argument union(s) from method overloads\n const options = isNumber(documentsOrOptions) ? {} : documentsOrOptions;\n let rate: number;\n let mode: 'documents' | 'percent';\n if (isNumber(documentsOrOptions)) {\n rate = documentsOrOptions;\n mode = 'documents';\n } else if (isNumber(documentsOrOptions.documents)) {\n rate = documentsOrOptions.documents;\n mode = 'documents';\n } else {\n rate = documentsOrOptions.percentage!;\n mode = 'percent';\n }\n\n // Create stage object\n const stage = new Sample(rate, mode, options);\n\n // Add stage to the pipeline\n return this._addStage(stage);\n }\n\n /**\n * Performs union of all documents from two pipelines, including duplicates.\n *\n * <p>This stage will pass through documents from previous stage, and also pass through documents\n * from previous stage of the `other` {@link @firebase/firestore/pipelines#Pipeline} given in parameter. The order of documents\n * emitted from this stage is undefined.\n *\n * @example\n * ```typescript\n * // Emit documents from books collection and magazines collection.\n * firestore.pipeline().collection('books')\n * .union(firestore.pipeline().collection('magazines'));\n * ```\n *\n * @param other - The other {@link @firebase/firestore/pipelines#Pipeline} that is part of union.\n * @returns A new {@link @firebase/firestore/pipelines#Pipeline} object with this stage appended to the stage list.\n */\n union(other: Pipeline): Pipeline;\n /**\n * Performs union of all documents from two pipelines, including duplicates.\n *\n * <p>This stage will pass through documents from previous stage, and also pass through documents\n * from previous stage of the `other` {@link @firebase/firestore/pipelines#Pipeline} given in parameter. The order of documents\n * emitted from this stage is undefined.\n *\n * @example\n * ```typescript\n * // Emit documents from books collection and magazines collection.\n * firestore.pipeline().collection('books')\n * .union(firestore.pipeline().collection('magazines'));\n * ```\n *\n * @param options - An object that specifies required and optional parameters for the stage.\n * @returns A new {@link @firebase/firestore/pipelines#Pipeline} object with this stage appended to the stage list.\n */\n union(options: UnionStageOptions): Pipeline;\n union(otherOrOptions: Pipeline | UnionStageOptions): Pipeline {\n // Process argument union(s) from method overloads\n let options: {};\n let otherPipeline: Pipeline;\n if (isPipeline(otherOrOptions)) {\n options = {};\n otherPipeline = otherOrOptions;\n } else {\n ({ other: otherPipeline, ...options } = otherOrOptions);\n }\n\n // Create stage object\n const stage = new Union(otherPipeline, options);\n\n // Add stage to the pipeline\n return this._addStage(stage);\n }\n\n /**\n * Produces a document for each element in an input array.\n *\n * For each previous stage document, this stage will emit zero or more augmented documents. The\n * input array specified by the `selectable` parameter, will emit an augmented document for each input array element. The input array element will\n * augment the previous stage document by setting the `alias` field with the array element value.\n *\n * When `selectable` evaluates to a non-array value (ex: number, null, absent), then the stage becomes a no-op for\n * the current input document, returning it as is with the `alias` field absent.\n *\n * No documents are emitted when `selectable` evaluates to an empty array.\n *\n * @example\n * ```typescript\n * // Input:\n * // { \"title\": \"The Hitchhiker's Guide to the Galaxy\", \"tags\": [ \"comedy\", \"space\", \"adventure\" ], ... }\n *\n * // Emit a book document for each tag of the book.\n * firestore.pipeline().collection(\"books\")\n * .unnest(field(\"tags\").as('tag'), 'tagIndex');\n *\n * // Output:\n * // { \"title\": \"The Hitchhiker's Guide to the Galaxy\", \"tag\": \"comedy\", \"tagIndex\": 0, ... }\n * // { \"title\": \"The Hitchhiker's Guide to the Galaxy\", \"tag\": \"space\", \"tagIndex\": 1, ... }\n * // { \"title\": \"The Hitchhiker's Guide to the Galaxy\", \"tag\": \"adventure\", \"tagIndex\": 2, ... }\n * ```\n *\n * @param selectable - A selectable expression defining the field to unnest and the alias to use for each un-nested element in the output documents.\n * @param indexField - An optional string value specifying the field path to write the offset (starting at zero) into the array the un-nested element is from\n * @returns A new {@link @firebase/firestore/pipelines#Pipeline} object with this stage appended to the stage list.\n */\n unnest(selectable: Selectable, indexField?: string): Pipeline;\n /**\n * Produces a document for each element in an input array.\n *\n * For each previous stage document, this stage will emit zero or more augmented documents. The\n * input array specified by the `selectable` parameter, will emit an augmented document for each input array element. The input array element will\n * augment the previous stage document by setting the `alias` field with the array element value.\n *\n * When `selectable` evaluates to a non-array value (ex: number, null, absent), then the stage becomes a no-op for\n * the current input document, returning it as is with the `alias` field absent.\n *\n * No documents are emitted when `selectable` evaluates to an empty array.\n *\n * @example\n * ```typescript\n * // Input:\n * // { \"title\": \"The Hitchhiker's Guide to the Galaxy\", \"tags\": [ \"comedy\", \"space\", \"adventure\" ], ... }\n *\n * // Emit a book document for each tag of the book.\n * firestore.pipeline().collection(\"books\")\n * .unnest(field(\"tags\").as('tag'), 'tagIndex');\n *\n * // Output:\n * // { \"title\": \"The Hitchhiker's Guide to the Galaxy\", \"tag\": \"comedy\", \"tagIndex\": 0, ... }\n * // { \"title\": \"The Hitchhiker's Guide to the Galaxy\", \"tag\": \"space\", \"tagIndex\": 1, ... }\n * // { \"title\": \"The Hitchhiker's Guide to the Galaxy\", \"tag\": \"adventure\", \"tagIndex\": 2, ... }\n * ```\n *\n * @param options - An object that specifies required and optional parameters for the stage.\n * @returns A new {@link @firebase/firestore/pipelines#Pipeline} object with this stage appended to the stage list.\n */\n unnest(options: UnnestStageOptions): Pipeline;\n unnest(\n selectableOrOptions: Selectable | UnnestStageOptions,\n indexField?: string\n ): Pipeline {\n // Process argument union(s) from method overloads\n let options: { indexField?: Field } & StageOptions;\n let selectable: Selectable;\n let indexFieldName: string | undefined;\n if (isSelectable(selectableOrOptions)) {\n options = {};\n selectable = selectableOrOptions;\n indexFieldName = indexField;\n } else {\n ({\n selectable,\n indexField: indexFieldName,\n ...options\n } = selectableOrOptions);\n }\n\n // Convert user land convenience types to internal types\n const alias = selectable.alias;\n const expr = selectable.expr as Expression;\n if (isString(indexFieldName)) {\n options.indexField = _field(indexFieldName, 'unnest');\n }\n\n // Create stage object\n const stage = new Unnest(alias, expr, options);\n\n // Add stage to the pipeline\n return this._addStage(stage);\n }\n\n /**\n * Adds a raw stage to the pipeline.\n *\n * <p>This method provides a flexible way to extend the pipeline's functionality by adding custom\n * stages. Each raw stage is defined by a unique `name` and a set of `params` that control its\n * behavior.\n *\n * <p>Example (Assuming there is no 'where' stage available in SDK):\n *\n * @example\n * ```typescript\n * // Assume we don't have a built-in 'where' stage\n * firestore.pipeline().collection('books')\n * .rawStage('where', [field('published').lessThan(1900)]) // Custom 'where' stage\n * .select('title', 'author');\n * ```\n *\n * @param name - The unique name of the raw stage to add.\n * @param params - A list of parameters to configure the raw stage's behavior.\n * @param options - An object of key value pairs that specifies optional parameters for the stage.\n * @returns A new {@link @firebase/firestore/pipelines#Pipeline} object with this stage appended to the stage list.\n */\n rawStage(\n name: string,\n params: unknown[],\n options?: { [key: string]: Expression | unknown }\n ): Pipeline {\n // Convert user land convenience types to internal types\n const expressionParams = params.map((value: unknown) => {\n if (value instanceof Expression) {\n return value;\n } else if (value instanceof AggregateFunction) {\n return value;\n } else if (isPlainObject(value)) {\n return _mapValue(value as Record<string, unknown>);\n } else {\n return _constant(value, 'rawStage');\n }\n });\n\n // Create stage object\n const stage = new RawStage(name, expressionParams, options ?? {});\n\n // Add stage to the pipeline\n return this._addStage(stage);\n }\n\n /**\n * @internal\n * @private\n */\n _toProto(jsonProtoSerializer: JsonProtoSerializer): ProtoPipeline {\n const stages: ProtoStage[] = this.stages.map(stage =>\n stage._toProto(jsonProtoSerializer)\n );\n return { stages };\n }\n\n private _addStage(stage: Stage): Pipeline {\n const copy = this.stages.map(s => s);\n copy.push(stage);\n return this.newPipeline(this._db, copy);\n }\n\n /**\n * @internal\n * @private\n * @param db\n * @param userDataReader\n * @param userDataWriter\n * @param stages\n * @protected\n */\n protected newPipeline(db: Firestore | undefined, stages: Stage[]): Pipeline {\n return new Pipeline(db, this.userDataReader, this._userDataWriter, stages);\n }\n}\n\nexport function isPipeline(val: unknown): val is Pipeline {\n return val instanceof Pipeline;\n}\n","/**\n * @license\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DatabaseId } from '../core/database_info';\nimport { toPipelineStages } from '../core/pipeline-util';\nimport { Code, FirestoreError } from '../util/error';\nimport { isString } from '../util/types';\n\nimport { Pipeline } from './pipeline';\nimport {\n CollectionReference,\n DocumentReference,\n isCollectionReference,\n Query\n} from './reference';\nimport {\n CollectionGroupSource,\n CollectionSource,\n DatabaseSource,\n DocumentsSource,\n Stage,\n SubcollectionSource\n} from './stage';\nimport {\n CollectionGroupStageOptions,\n CollectionStageOptions,\n DatabaseStageOptions,\n DocumentsStageOptions,\n SubcollectionStageOptions\n} from './stage_options';\nimport { UserDataReader, UserDataSource } from './user_data_reader';\n\n/**\n * Provides the entry point for defining the data source of a Firestore {@link @firebase/firestore/pipelines#Pipeline}.\n *\n * Use the methods of this class (e.g., {@link @firebase/firestore/pipelines#PipelineSource.(collection:1)}, {@link @firebase/firestore/pipelines#PipelineSource.(collectionGroup:1)},\n * {@link @firebase/firestore/pipelines#PipelineSource.(database:1)}, or {@link @firebase/firestore/pipelines#PipelineSource.(documents:1)}) to specify the initial data\n * for your pipeline, such as a collection, a collection group, the entire database, or a set of specific documents.\n */\nexport class PipelineSource<PipelineType> {\n /**\n * @internal\n * @private\n * @param databaseId\n * @param userDataReader\n * @param _createPipeline\n */\n constructor(\n private databaseId: DatabaseId,\n private userDataReader: UserDataReader,\n /**\n * @internal\n * @private\n */\n public _createPipeline: (stages: Stage[]) => PipelineType\n ) {}\n\n /**\n * Returns all documents from the entire collection. The collection can be nested.\n * @param collection - Name or reference to the collection that will be used as the Pipeline source.\n */\n collection(collection: string | CollectionReference): PipelineType;\n /**\n * Returns all documents from the entire collection. The collection can be nested.\n * @param options - Options defining how this CollectionStage is evaluated.\n */\n collection(options: CollectionStageOptions): PipelineType;\n collection(\n collectionOrOptions: string | CollectionReference | CollectionStageOptions\n ): PipelineType {\n // Process argument union(s) from method overloads\n const options =\n isString(collectionOrOptions) ||\n isCollectionReference(collectionOrOptions)\n ? {}\n : collectionOrOptions;\n const collectionRefOrString =\n isString(collectionOrOptions) ||\n isCollectionReference(collectionOrOptions)\n ? collectionOrOptions\n : collectionOrOptions.collection;\n\n // Validate that a user provided reference is for the same Firestore DB\n if (isCollectionReference(collectionRefOrString)) {\n this._validateReference(collectionRefOrString);\n }\n\n // Convert user land convenience types to internal types\n const normalizedCollection = isString(collectionRefOrString)\n ? (collectionRefOrString as string)\n : collectionRefOrString.path;\n\n // Create stage object\n const stage = new CollectionSource(normalizedCollection, options);\n\n // User data must be read in the context of the API method to\n // provide contextual errors\n const parseContext = this.userDataReader.createContext(\n UserDataSource.Argument,\n 'collection'\n );\n stage._readUserData(parseContext);\n\n // Add stage to the pipeline\n return this._createPipeline([stage]);\n }\n\n /**\n * Returns all documents from a collection ID regardless of the parent.\n * @param collectionId - ID of the collection group to use as the Pipeline source.\n */\n collectionGroup(collectionId: string): PipelineType;\n /**\n * Returns all documents from a collection ID regardless of the parent.\n * @param options - Options defining how this CollectionGroupStage is evaluated.\n */\n collectionGroup(options: CollectionGroupStageOptions): PipelineType;\n collectionGroup(\n collectionIdOrOptions: string | CollectionGroupStageOptions\n ): PipelineType {\n // Process argument union(s) from method overloads\n let collectionId: string;\n let options: {};\n if (isString(collectionIdOrOptions)) {\n collectionId = collectionIdOrOptions;\n options = {};\n } else {\n ({ collectionId, ...options } = collectionIdOrOptions);\n }\n\n // Create stage object\n const stage = new CollectionGroupSource(collectionId, options);\n\n // User data must be read in the context of the API method to\n // provide contextual errors\n const parseContext = this.userDataReader.createContext(\n UserDataSource.Argument,\n 'collectionGroup'\n );\n stage._readUserData(parseContext);\n\n // Add stage to the pipeline\n return this._createPipeline([stage]);\n }\n\n /**\n * Returns all documents from the entire database.\n */\n database(): PipelineType;\n /**\n * Returns all documents from the entire database.\n * @param options - Options defining how a DatabaseStage is evaluated.\n */\n database(options: DatabaseStageOptions): PipelineType;\n database(options?: DatabaseStageOptions): PipelineType {\n // Process argument union(s) from method overloads\n options = options ?? {};\n\n // Create stage object\n const stage = new DatabaseSource(options);\n\n // User data must be read in the context of the API method to\n // provide contextual errors\n const parseContext = this.userDataReader.createContext(\n UserDataSource.Argument,\n 'database'\n );\n stage._readUserData(parseContext);\n\n // Add stage to the pipeline\n return this._createPipeline([stage]);\n }\n\n /**\n * Set the pipeline's source to the documents specified by the given paths and DocumentReferences.\n *\n * @param docs - An array of paths and DocumentReferences specifying the individual documents that will be the source of this pipeline.\n * The converters for these DocumentReferences will be ignored and not have an effect on this pipeline.\n *\n * @throws `FirestoreError` Thrown if any of the provided DocumentReferences target a different project or database than the pipeline.\n */\n documents(docs: Array<string | DocumentReference>): PipelineType;\n\n /**\n * Set the pipeline's source to the documents specified by the given paths and DocumentReferences.\n *\n * @param options - Options defining how this DocumentsStage is evaluated.\n *\n * @throws `FirestoreError` Thrown if any of the provided DocumentReferences target a different project or database than the pipeline.\n */\n documents(options: DocumentsStageOptions): PipelineType;\n documents(\n docsOrOptions: Array<string | DocumentReference> | DocumentsStageOptions\n ): PipelineType {\n // Process argument union(s) from method overloads\n let options: {};\n let docs: Array<string | DocumentReference>;\n if (Array.isArray(docsOrOptions)) {\n docs = docsOrOptions;\n options = {};\n } else {\n ({ docs, ...options } = docsOrOptions);\n }\n\n // Validate that all user provided references are for the same Firestore DB\n docs\n .filter(v => v instanceof DocumentReference)\n .forEach(dr => this._validateReference(dr as DocumentReference));\n\n // Convert user land convenience types to internal types\n const normalizedDocs: string[] = docs.map(doc =>\n isString(doc) ? doc : doc.path\n );\n\n // Create stage object\n const stage = new DocumentsSource(normalizedDocs, options);\n\n // User data must be read in the context of the API method to\n // provide contextual errors\n const parseContext = this.userDataReader.createContext(\n UserDataSource.Argument,\n 'documents'\n );\n stage._readUserData(parseContext);\n\n // Add stage to the pipeline\n return this._createPipeline([stage]);\n }\n\n /**\n * Convert the given Query into an equivalent Pipeline.\n *\n * @param query - A Query to be converted into a Pipeline.\n *\n * @throws `FirestoreError` Thrown if any of the provided DocumentReferences target a different project or database than the pipeline.\n */\n createFrom(query: Query): PipelineType {\n return this._createPipeline(\n toPipelineStages(query._query, query.firestore)\n );\n }\n\n _validateReference(reference: CollectionReference | DocumentReference): void {\n const refDbId = reference.firestore._databaseId;\n if (!refDbId.isEqual(this.databaseId)) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Invalid ${\n reference instanceof CollectionReference\n ? 'CollectionReference'\n : 'DocumentReference'\n }. ` +\n `The project ID (\"${refDbId.projectId}\") or the database (\"${refDbId.database}\") does not match ` +\n `the project ID (\"${this.databaseId.projectId}\") and database (\"${this.databaseId.database}\") of the target database of this Pipeline.`\n );\n }\n }\n}\n\n/**\n * @public\n * Creates a new Pipeline targeted at a subcollection relative to the current document context.\n * This creates a pipeline without a database instance, suitable for embedding as a subquery.\n * If executed directly, this pipeline will fail.\n *\n * @param path - The relative path to the subcollection.\n */\nexport function subcollection(path: string): Pipeline;\n/**\n * @public\n * Creates a new Pipeline targeted at a subcollection relative to the current document context.\n * This creates a pipeline without a database instance, suitable for embedding as a subquery.\n * If executed directly, this pipeline will fail.\n *\n * @param options - Options defining how this SubcollectionStage is evaluated.\n */\nexport function subcollection(options: SubcollectionStageOptions): Pipeline;\nexport function subcollection(\n pathOrOptions: string | SubcollectionStageOptions\n): Pipeline {\n // Process argument union(s) from method overloads\n let path: string;\n let options: {};\n if (isString(pathOrOptions)) {\n path = pathOrOptions;\n options = {};\n } else {\n ({ path, ...options } = pathOrOptions);\n }\n\n // Create stage object\n const stage = new SubcollectionSource(path, options);\n\n return new Pipeline(undefined, undefined, undefined, [stage]);\n}\n","/**\n * @license\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Pipeline as LitePipeline } from '../lite-api/pipeline';\nimport { Stage } from '../lite-api/stage';\n\nimport { Firestore } from './database';\n\nexport class Pipeline extends LitePipeline {\n /**\n * @internal\n * @private\n * @param db\n * @param userDataReader\n * @param userDataWriter\n * @param stages\n * @param converter\n * @protected\n */\n protected newPipeline(db: Firestore | undefined, stages: Stage[]): Pipeline {\n return new Pipeline(db, this.userDataReader, this._userDataWriter, stages);\n }\n}\n","/**\n * @license\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Pipeline } from '../api/pipeline';\nimport { firestoreClientExecutePipeline } from '../core/firestore_client';\nimport {\n StructuredPipeline,\n StructuredPipelineOptions\n} from '../core/structured_pipeline';\nimport { Pipeline as LitePipeline } from '../lite-api/pipeline';\nimport { PipelineResult, PipelineSnapshot } from '../lite-api/pipeline-result';\nimport { PipelineSource } from '../lite-api/pipeline-source';\nimport { PipelineExecuteOptions } from '../lite-api/pipeline_options';\nimport { Stage } from '../lite-api/stage';\nimport {\n newUserDataReader,\n UserDataSource\n} from '../lite-api/user_data_reader';\nimport { Code, FirestoreError } from '../util/error';\nimport { cast } from '../util/input_validation';\n\nimport { ensureFirestoreConfigured, Firestore } from './database';\nimport { RealtimePipeline } from './realtime_pipeline';\nimport { DocumentReference } from './reference';\nimport { ExpUserDataWriter } from './user_data_writer';\n\ndeclare module './database' {\n /**\n * Creates and returns a new PipelineSource, which allows specifying the source stage of a {@link @firebase/firestore/pipelines#Pipeline}.\n *\n * @example\n * ```\n * let myPipeline: Pipeline = firestore.pipeline().collection('books');\n * ```\n */\n interface Firestore {\n pipeline(): PipelineSource<Pipeline>;\n /** @internal */\n realtimePipeline(): PipelineSource<RealtimePipeline>;\n }\n}\n\n/**\n * Executes a pipeline and returns a Promise to represent the asynchronous operation.\n *\n * The returned Promise can be used to track the progress of the pipeline execution\n * and retrieve the results (or handle any errors) asynchronously.\n *\n * The pipeline results are returned as a {@link @firebase/firestore/pipelines#PipelineSnapshot} that contains\n * a list of {@link @firebase/firestore/pipelines#PipelineResult} objects. Each {@link @firebase/firestore/pipelines#PipelineResult} typically\n * represents a single key/value map that has passed through all the\n * stages of the pipeline, however this might differ depending on the stages involved in the\n * pipeline. For example:\n *\n * <ul>\n * <li>If there are no stages or only transformation stages, each {@link @firebase/firestore/pipelines#PipelineResult}\n * represents a single document.</li>\n * <li>If there is an aggregation, only a single {@link @firebase/firestore/pipelines#PipelineResult} is returned,\n * representing the aggregated results over the entire dataset .</li>\n * <li>If there is an aggregation stage with grouping, each {@link @firebase/firestore/pipelines#PipelineResult} represents a\n * distinct group and its associated aggregated values.</li>\n * </ul>\n *\n * @example\n * ```typescript\n * const snapshot: PipelineSnapshot = await execute(firestore.pipeline().collection(\"books\")\n * .where(greaterThan(field(\"rating\"), 4.5))\n * .select(\"title\", \"author\", \"rating\"));\n *\n * const results: PipelineResult[] = snapshot.results;\n * ```\n *\n * @param pipeline - The pipeline to execute.\n * @returns A Promise representing the asynchronous pipeline execution.\n */\nexport function execute(pipeline: LitePipeline): Promise<PipelineSnapshot>;\n/**\n * Executes a pipeline and returns a Promise to represent the asynchronous operation.\n *\n * The returned Promise can be used to track the progress of the pipeline execution\n * and retrieve the results (or handle any errors) asynchronously.\n *\n * The pipeline results are returned as a {@link @firebase/firestore/pipelines#PipelineSnapshot} that contains\n * a list of {@link @firebase/firestore/pipelines#PipelineResult} objects. Each {@link @firebase/firestore/pipelines#PipelineResult} typically\n * represents a single key/value map that has passed through all the\n * stages of the pipeline, however this might differ depending on the stages involved in the\n * pipeline. For example:\n *\n * <ul>\n * <li>If there are no stages or only transformation stages, each {@link @firebase/firestore/pipelines#PipelineResult}\n * represents a single document.</li>\n * <li>If there is an aggregation, only a single {@link @firebase/firestore/pipelines#PipelineResult} is returned,\n * representing the aggregated results over the entire dataset .</li>\n * <li>If there is an aggregation stage with grouping, each {@link @firebase/firestore/pipelines#PipelineResult} represents a\n * distinct group and its associated aggregated values.</li>\n * </ul>\n *\n * @example\n * ```typescript\n * const snapshot: PipelineSnapshot = await execute(firestore.pipeline().collection(\"books\")\n * .where(greaterThan(field(\"rating\"), 4.5))\n * .select(\"title\", \"author\", \"rating\"));\n *\n * const results: PipelineResult[] = snapshot.results;\n * ```\n *\n * @param options - Specifies the pipeline to execute and other options for execute.\n * @returns A Promise representing the asynchronous pipeline execution.\n */\nexport function execute(\n options: PipelineExecuteOptions\n): Promise<PipelineSnapshot>;\nexport function execute(\n pipelineOrOptions: LitePipeline | PipelineExecuteOptions\n): Promise<PipelineSnapshot> {\n const options: PipelineExecuteOptions = !(\n pipelineOrOptions instanceof LitePipeline\n )\n ? pipelineOrOptions\n : {\n pipeline: pipelineOrOptions\n };\n\n const { pipeline, rawOptions, ...rest } = options;\n\n if (!pipeline._db) {\n return Promise.reject(\n new FirestoreError(\n Code.FAILED_PRECONDITION,\n '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.'\n )\n );\n }\n\n const firestore = cast(pipeline._db, Firestore);\n const client = ensureFirestoreConfigured(firestore);\n\n const userDataReader = newUserDataReader(firestore);\n const context = userDataReader.createContext(\n UserDataSource.Argument,\n 'execute'\n );\n\n pipeline._readUserData(context);\n const userDataWriter = new ExpUserDataWriter(firestore);\n\n const structuredPipelineOptions = new StructuredPipelineOptions(\n rest,\n rawOptions\n );\n structuredPipelineOptions._readUserData(context);\n\n const structuredPipeline: StructuredPipeline = new StructuredPipeline(\n pipeline,\n structuredPipelineOptions\n );\n\n return firestoreClientExecutePipeline(client, structuredPipeline).then(\n result => {\n // Get the execution time from the first result.\n // firestoreClientExecutePipeline returns at least one PipelineStreamElement\n // even if the returned document set is empty.\n const executionTime =\n result.length > 0 ? result[0].executionTime?.toTimestamp() : undefined;\n\n const docs = result\n // Currently ignore any response from ExecutePipeline that does\n // not contain any document data in the `fields` property.\n .filter(element => !!element.fields)\n .map(\n element =>\n new PipelineResult(\n userDataWriter,\n element.fields!,\n element.key?.path\n ? new DocumentReference(firestore, null, element.key)\n : undefined,\n element.createTime?.toTimestamp(),\n element.updateTime?.toTimestamp()\n )\n );\n\n return new PipelineSnapshot(pipeline, docs, executionTime);\n }\n );\n}\n\n/**\n * @beta\n * Creates and returns a new PipelineSource, which allows specifying the source stage of a {@link @firebase/firestore/pipelines#Pipeline}.\n *\n * @example\n * ```typescript\n * let myPipeline: Pipeline = firestore.pipeline().collection('books');\n * ```\n */\n// Augment the Firestore class with the pipeline() factory method\nFirestore.prototype.pipeline = function (): PipelineSource<Pipeline> {\n const userDataReader = newUserDataReader(this);\n return new PipelineSource<Pipeline>(\n this._databaseId,\n userDataReader,\n (stages: Stage[]) => {\n return new Pipeline(\n this,\n userDataReader,\n new ExpUserDataWriter(this),\n stages\n );\n }\n );\n};\n\n/** @internal */\nexport function _enableRealtimePipeline(firestore: Firestore): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (firestore as any).realtimePipeline =\n function (): PipelineSource<RealtimePipeline> {\n const userDataReader = newUserDataReader(this);\n return new PipelineSource<RealtimePipeline>(\n this._databaseId,\n userDataReader,\n (stages: Stage[]) => {\n return new RealtimePipeline(\n this,\n newUserDataReader(this),\n new ExpUserDataWriter(this),\n stages\n );\n }\n );\n };\n}\n"],"names":["isPipeline","Pipeline","LitePipeline"],"mappings":"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"}