diff --git a/packages/firestore/rollup.config.js b/packages/firestore/rollup.config.js index c71888b6152..7ac7b4c9647 100644 --- a/packages/firestore/rollup.config.js +++ b/packages/firestore/rollup.config.js @@ -55,7 +55,7 @@ const browserPlugins = [ abortOnError: true, transformers: [util.removeAssertAndPrefixInternalTransformer] }), - json({ preferConst: true }), + json({ preferConst: true }) //terser(util.manglePrivatePropertiesOptions) ]; diff --git a/packages/firestore/rollup.shared.js b/packages/firestore/rollup.shared.js index 513dc4ee1cd..e785c3089fe 100644 --- a/packages/firestore/rollup.shared.js +++ b/packages/firestore/rollup.shared.js @@ -130,7 +130,7 @@ exports.removeAssertTransformer = removeAssertTransformer; */ const removeAssertAndPrefixInternalTransformer = service => ({ before: [ - removeAsserts(service.getProgram()), + removeAsserts(service.getProgram()) // renameInternals(service.getProgram(), { // publicIdentifiers, // prefix: '__PRIVATE_' diff --git a/packages/firestore/src/api/pipeline_impl.ts b/packages/firestore/src/api/pipeline_impl.ts index 40cd3d1489e..7598e6e847b 100644 --- a/packages/firestore/src/api/pipeline_impl.ts +++ b/packages/firestore/src/api/pipeline_impl.ts @@ -87,31 +87,16 @@ declare module './database' { * @param pipeline The pipeline to execute. * @return A Promise representing the asynchronous pipeline execution. */ -export function execute(pipeline: LitePipeline): Promise; -export function execute( - pipeline: RealtimePipeline -): Promise; -export function execute( - pipeline: LitePipeline | RealtimePipeline -): Promise { +export function execute(pipeline: LitePipeline): Promise { const firestore = cast(pipeline._db, Firestore); const client = ensureFirestoreConfigured(firestore); - if (pipeline instanceof RealtimePipeline) { - return firestoreClientGetDocumentsViaSnapshotListener( - client, - pipeline - ).then( - snapshot => - new RealtimePipelineSnapshot(pipeline as RealtimePipeline, snapshot) - ); - } else { - return firestoreClientExecutePipeline(client, pipeline).then(result => { - // Get the execution time from the first result. - // firestoreClientExecutePipeline returns at least one PipelineStreamElement - // even if the returned document set is empty. - const executionTime = - result.length > 0 ? result[0].executionTime?.toTimestamp() : undefined; + return firestoreClientExecutePipeline(client, pipeline).then(result => { + // Get the execution time from the first result. + // firestoreClientExecutePipeline returns at least one PipelineStreamElement + // even if the returned document set is empty. + const executionTime = + result.length > 0 ? result[0].executionTime?.toTimestamp() : undefined; const docs = result // Currently ignore any response from ExecutePipeline that does @@ -131,9 +116,8 @@ export function execute( ) ); - return new PipelineSnapshot(pipeline, docs, executionTime); - }); - } + return new PipelineSnapshot(pipeline, docs, executionTime); + }); } // Augment the Firestore class with the pipeline() factory method diff --git a/packages/firestore/src/api/snapshot.ts b/packages/firestore/src/api/snapshot.ts index 4b78ec43c82..290cae773a2 100644 --- a/packages/firestore/src/api/snapshot.ts +++ b/packages/firestore/src/api/snapshot.ts @@ -22,7 +22,6 @@ import { newQueryComparator } from '../core/query'; import { ChangeType, ViewSnapshot } from '../core/view_snapshot'; import { FieldPath } from '../lite-api/field_path'; import { PipelineResult, toPipelineResult } from '../lite-api/pipeline-result'; -import { PipelineResult, toPipelineResult } from '../lite-api/pipeline-result'; import { DocumentData, DocumentReference, diff --git a/packages/firestore/src/core/expressions.ts b/packages/firestore/src/core/expressions.ts index 5942fd14f09..cd25483954b 100644 --- a/packages/firestore/src/core/expressions.ts +++ b/packages/firestore/src/core/expressions.ts @@ -326,7 +326,7 @@ export class CoreField implements EvaluableExpr { }); } // Return 'UNSET' if the field doesn't exist, otherwise the Value. - const result = input.data.field(this.expr.fieldPath); + const result = input.data.field(this.expr._fieldPath); if (!!result) { return EvaluateResult.newValue(result); } else { @@ -367,38 +367,6 @@ export class CoreListOfExprs implements EvaluableExpr { } } -export class CoreListOfExprs implements EvaluableExpr { - constructor(private expr: ListOfExprs) {} - - evaluate( - context: EvaluationContext, - input: PipelineInputOutput - ): EvaluateResult { - return EvaluateResult.newValue(this.expr._getValue()); - } -} - -export class CoreListOfExprs implements EvaluableExpr { - constructor(private expr: ListOfExprs) {} - - evaluate( - context: EvaluationContext, - input: PipelineInputOutput - ): EvaluateResult { - const results: EvaluateResult[] = this.expr.exprs.map(expr => - toEvaluable(expr).evaluate(context, input) - ); - // If any sub-expression resulted in error or was unset, the list evaluation fails. - if (results.some(value => value.isErrorOrUnset())) { - return EvaluateResult.newError(); - } - - return EvaluateResult.newValue({ - arrayValue: { values: results.map(value => value.value!) } - }); - } -} - function asDouble( protoNumber: | { doubleValue: number | string } @@ -2576,8 +2544,6 @@ export class CoreUnixMicrosToTimestamp extends UnixToTimestamp { const nanos = Number((value % MICROSECONDS_PER_SECOND) * BigInt(1000)); return EvaluateResult.newValue({ timestampValue: { seconds, nanos } }); } - - abstract toTimestamp(value: bigint): Value | undefined; } export class CoreUnixMillisToTimestamp extends UnixToTimestamp { diff --git a/packages/firestore/src/core/pipeline-util.ts b/packages/firestore/src/core/pipeline-util.ts index 24e1563d0da..d846b86a99c 100644 --- a/packages/firestore/src/core/pipeline-util.ts +++ b/packages/firestore/src/core/pipeline-util.ts @@ -15,7 +15,6 @@ * limitations under the License. */ -import { RealtimePipeline } from '../api/realtime_pipeline'; import { RealtimePipeline } from '../api/realtime_pipeline'; import { Firestore } from '../lite-api/database'; import { @@ -37,7 +36,7 @@ import { AggregateFunction } from '../lite-api/expressions'; import { Pipeline, Pipeline as ApiPipeline } from '../lite-api/pipeline'; -import { doc } from '../lite-api/reference'; +import { doc, DocumentReference } from '../lite-api/reference'; import { AddFields, Aggregate, diff --git a/packages/firestore/src/core/sync_engine_impl.ts b/packages/firestore/src/core/sync_engine_impl.ts index 164d69bf086..2525d211cec 100644 --- a/packages/firestore/src/core/sync_engine_impl.ts +++ b/packages/firestore/src/core/sync_engine_impl.ts @@ -91,8 +91,6 @@ import { ListenSequence } from './listen_sequence'; import { getPipelineCollectionId, getPipelineSourceType } from './pipeline'; import { canonifyQueryOrPipeline, - getPipelineCollectionId, - getPipelineSourceType, isPipeline, QueryOrPipeline, queryOrPipelineEqual, diff --git a/packages/firestore/src/lite-api/pipeline_impl.ts b/packages/firestore/src/lite-api/pipeline_impl.ts index d8ee1d8d17c..a3be73b3a84 100644 --- a/packages/firestore/src/lite-api/pipeline_impl.ts +++ b/packages/firestore/src/lite-api/pipeline_impl.ts @@ -15,7 +15,6 @@ * limitations under the License. */ -import { RealtimePipeline } from '../api/realtime_pipeline'; import { invokeExecutePipeline } from '../remote/datastore'; import { getDatastore } from './components'; @@ -28,9 +27,6 @@ import { LiteUserDataWriter } from './reference_impl'; import { Stage } from './stage'; import { newUserDataReader } from './user_data_reader'; -// TODO should not be in lite -import { RealtimePipeline} from "../api/realtime_pipeline"; - declare module './database' { interface Firestore { pipeline(): PipelineSource; diff --git a/packages/firestore/src/lite-api/user_data_reader.ts b/packages/firestore/src/lite-api/user_data_reader.ts index 3e9daa8c09a..96ba702fe3c 100644 --- a/packages/firestore/src/lite-api/user_data_reader.ts +++ b/packages/firestore/src/lite-api/user_data_reader.ts @@ -712,7 +712,7 @@ export function parseData( input = getModularInstance(input); // Workaround for circular dependency - if ((input as Constant).exprType === 'Constant') { + if ((input as Constant)?.exprType === 'Constant') { return (input as Constant)._getValue(); } diff --git a/packages/firestore/src/local/local_store_impl.ts b/packages/firestore/src/local/local_store_impl.ts index 2e4a0cf26a6..45ae35ccd43 100644 --- a/packages/firestore/src/local/local_store_impl.ts +++ b/packages/firestore/src/local/local_store_impl.ts @@ -18,6 +18,7 @@ import { User } from '../auth/user'; import { BundleConverter, BundledDocuments, NamedQuery } from '../core/bundle'; import { CorePipeline, getPipelineDocuments } from '../core/pipeline'; + import { canonifyTargetOrPipeline, isPipeline, @@ -25,15 +26,7 @@ import { TargetOrPipeline, targetOrPipelineEqual } from '../core/pipeline-util'; -import { - canonifyTargetOrPipeline, - getPipelineDocuments, - isPipeline, - QueryOrPipeline, - TargetOrPipeline, - targetOrPipelineEqual -} from '../core/pipeline-util'; -import { CorePipeline } from '../core/pipeline_run'; + import { newQueryForPath, queryCollectionGroup, diff --git a/packages/firestore/test/integration/api/query.test.ts b/packages/firestore/test/integration/api/query.test.ts index adbb7b9226b..04905364e90 100644 --- a/packages/firestore/test/integration/api/query.test.ts +++ b/packages/firestore/test/integration/api/query.test.ts @@ -77,10 +77,7 @@ import { withTestCollection, withTestDb } from '../util/helpers'; -import { - onSnapshot as onPipelineSnapshot, - execute -} from '../util/pipeline_export'; +import { onSnapshot as onPipelineSnapshot } from '../util/pipeline_export'; import { USE_EMULATOR } from '../util/settings'; import { captureExistenceFilterMismatches } from '../util/testing_hooks_util'; @@ -1458,7 +1455,7 @@ apiPipelineDescribe.only('Queries', (persistence, pipelineMode) => { }); }); - it.only('can use filter with nested field', () => { + it('can use filter with nested field', () => { // Reproduces https://github.com/firebase/firebase-js-sdk/issues/2204 const testDocs = { a: {}, diff --git a/packages/firestore/test/integration/api/snapshot_listener_source.test.ts b/packages/firestore/test/integration/api/snapshot_listener_source.test.ts index 0ad5eda88d6..6810370639a 100644 --- a/packages/firestore/test/integration/api/snapshot_listener_source.test.ts +++ b/packages/firestore/test/integration/api/snapshot_listener_source.test.ts @@ -24,6 +24,7 @@ import { doc, DocumentSnapshot, enableNetwork, + Firestore, getDoc, limit, limitToLast, @@ -91,7 +92,9 @@ apiPipelineDescribe.only( new EventsAccumulator(); const unsubscribe = onSnapshot( pipelineMode, - docRef.firestore.realtimePipeline().documents([docRef]), + (docRef.firestore as Firestore) + .realtimePipeline() + .documents([docRef]), { source: 'cache' }, storeEvent.storeEvent ); diff --git a/packages/firestore/test/integration/util/helpers.ts b/packages/firestore/test/integration/util/helpers.ts index a05355b3a79..c2e183dc8e8 100644 --- a/packages/firestore/test/integration/util/helpers.ts +++ b/packages/firestore/test/integration/util/helpers.ts @@ -59,8 +59,8 @@ import { TARGET_DB_ID, USE_EMULATOR } from './settings'; -import { _onRealtimePipelineSnapshot } from '../../../src/api/pipeline_impl'; import { RealtimePipeline } from '../../../src/api/realtime_pipeline'; +import { onPipelineSnapshot } from '../../../src/api/reference_impl'; /* eslint-disable no-restricted-globals */ @@ -647,9 +647,11 @@ export async function checkOnlineAndOfflineResultsMatchWithPipelineMode( await checkOnlineAndOfflineResultsMatch(query, ...expectedDocs); } else { // pipelineMode === 'query-to-pipeline' - const pipeline = query.firestore.realtimePipeline().createFrom(query); + const pipeline = (query.firestore as Firestore) + .realtimePipeline() + .createFrom(query); const deferred = new Deferred(); - const unsub = _onRealtimePipelineSnapshot( + const unsub = onPipelineSnapshot( pipeline, { includeMetadataChanges: true }, snapshot => { @@ -668,7 +670,7 @@ export async function checkOnlineAndOfflineResultsMatchWithPipelineMode( } const cacheDeferred = new Deferred(); - const cacheUnsub = _onRealtimePipelineSnapshot( + const cacheUnsub = onPipelineSnapshot( pipeline, { includeMetadataChanges: true, source: 'cache' }, snapshot => { @@ -689,6 +691,22 @@ export function itIf( return condition === 'only' ? it.only : condition ? it : it.skip; } +function getDocsFromPipeline( + pipeline: RealtimePipeline +): Promise { + const deferred = new Deferred(); + const unsub = onSnapshot( + 'query-to-pipeline', + pipeline, + (snapshot: RealtimePipelineSnapshot) => { + deferred.resolve(snapshot); + unsub(); + } + ); + + return deferred.promise; +} + export function getDocs( pipelineMode: PipelineMode, queryOrPipeline: Query | RealtimePipeline @@ -698,7 +716,7 @@ export function getDocs( const ppl = queryOrPipeline.firestore .pipeline() .createFrom(queryOrPipeline); - return getDocsProd( + return getDocsFromPipeline( new RealtimePipeline( ppl._db, ppl.userDataReader, @@ -707,7 +725,7 @@ export function getDocs( ) ); } else { - return getDocsProd(queryOrPipeline); + return getDocsFromPipeline(queryOrPipeline); } } @@ -743,7 +761,7 @@ export function onSnapshot( const ppl = queryOrPipeline.firestore .pipeline() .createFrom(queryOrPipeline); - return onSnapshotProd( + return onPipelineSnapshot( new RealtimePipeline( ppl._db, ppl.userDataReader, @@ -754,7 +772,7 @@ export function onSnapshot( obs as any ); } else { - return onSnapshotProd(queryOrPipeline, options as any, obs as any); + return onPipelineSnapshot(queryOrPipeline, options as any, obs as any); } } diff --git a/packages/firestore/test/unit/specs/spec_builder.ts b/packages/firestore/test/unit/specs/spec_builder.ts index c8cfdea083e..3118a4215af 100644 --- a/packages/firestore/test/unit/specs/spec_builder.ts +++ b/packages/firestore/test/unit/specs/spec_builder.ts @@ -31,7 +31,7 @@ import { TargetOrPipeline, targetOrPipelineEqual, toCorePipeline, - toPipeline + toPipelineStages } from '../../../src/core/pipeline-util'; import { LimitType, diff --git a/packages/firestore/test/unit/specs/spec_test_runner.ts b/packages/firestore/test/unit/specs/spec_test_runner.ts index 50679daac45..4671eb9cdf4 100644 --- a/packages/firestore/test/unit/specs/spec_test_runner.ts +++ b/packages/firestore/test/unit/specs/spec_test_runner.ts @@ -49,7 +49,7 @@ import { queryOrPipelineEqual, TargetOrPipeline, toCorePipeline, - toPipeline + toPipelineStages } from '../../../src/core/pipeline-util'; import { canonifyQuery,