Skip to content

Commit cc8dd9c

Browse files
authored
Add bundles to d.ts and rearrange bundles source code for building it as a separate module (#4120)
* Add bundles to d.ts and rearrange bundles source code for building it as a separate module.
1 parent ddb7993 commit cc8dd9c

20 files changed

+330
-162
lines changed

packages/firebase/index.d.ts

+35
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
* limitations under the License.
1616
*/
1717

18+
import { DocumentData, LoadBundleTask, Query } from '@firebase/firestore-types';
19+
1820
/**
1921
* <code>firebase</code> is a global namespace from which all Firebase
2022
* services are accessed.
@@ -8289,12 +8291,45 @@ declare namespace firebase.firestore {
82898291
*/
82908292
terminate(): Promise<void>;
82918293

8294+
loadBundle(
8295+
bundleData: ArrayBuffer | ReadableStream<ArrayBuffer> | string
8296+
): LoadBundleTask;
8297+
8298+
namedQuery(name: string): Promise<Query<DocumentData> | null>;
8299+
82928300
/**
82938301
* @hidden
82948302
*/
82958303
INTERNAL: { delete: () => Promise<void> };
82968304
}
82978305

8306+
export interface LoadBundleTask {
8307+
onProgress(
8308+
next?: (progress: LoadBundleTaskProgress) => any,
8309+
error?: (error: Error) => any,
8310+
complete?: () => void
8311+
): void;
8312+
8313+
then<T, R>(
8314+
onFulfilled?: (a: LoadBundleTaskProgress) => T | PromiseLike<T>,
8315+
onRejected?: (a: Error) => R | PromiseLike<R>
8316+
): Promise<T | R>;
8317+
8318+
catch<R>(
8319+
onRejected: (a: Error) => R | PromiseLike<R>
8320+
): Promise<R | LoadBundleTaskProgress>;
8321+
}
8322+
8323+
export interface LoadBundleTaskProgress {
8324+
documentsLoaded: number;
8325+
totalDocuments: number;
8326+
bytesLoaded: number;
8327+
totalBytes: number;
8328+
taskState: TaskState;
8329+
}
8330+
8331+
export type TaskState = 'Error' | 'Running' | 'Success';
8332+
82988333
/**
82998334
* An immutable object representing a geo point in Firestore. The geo point
83008335
* is represented as latitude/longitude pair.

packages/firestore-types/index.d.ts

+33
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,42 @@ export class FirebaseFirestore {
9696

9797
terminate(): Promise<void>;
9898

99+
loadBundle(
100+
bundleData: ArrayBuffer | ReadableStream<ArrayBuffer> | string
101+
): LoadBundleTask;
102+
103+
namedQuery(name: string): Promise<Query<DocumentData> | null>;
104+
99105
INTERNAL: { delete: () => Promise<void> };
100106
}
101107

108+
export interface LoadBundleTask {
109+
onProgress(
110+
next?: (progress: LoadBundleTaskProgress) => any,
111+
error?: (error: Error) => any,
112+
complete?: () => void
113+
): void;
114+
115+
then<T, R>(
116+
onFulfilled?: (a: LoadBundleTaskProgress) => T | PromiseLike<T>,
117+
onRejected?: (a: Error) => R | PromiseLike<R>
118+
): Promise<T | R>;
119+
120+
catch<R>(
121+
onRejected: (a: Error) => R | PromiseLike<R>
122+
): Promise<R | LoadBundleTaskProgress>;
123+
}
124+
125+
export interface LoadBundleTaskProgress {
126+
documentsLoaded: number;
127+
totalDocuments: number;
128+
bytesLoaded: number;
129+
totalBytes: number;
130+
taskState: TaskState;
131+
}
132+
133+
export type TaskState = 'Error' | 'Running' | 'Success';
134+
102135
export class GeoPoint {
103136
constructor(latitude: number, longitude: number);
104137

packages/firestore/exp-types/index.d.ts

+37
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,43 @@ export function snapshotEqual<T>(
516516
right: DocumentSnapshot<T> | QuerySnapshot<T>
517517
): boolean;
518518

519+
export interface LoadBundleTask {
520+
onProgress(
521+
next?: (progress: LoadBundleTaskProgress) => any,
522+
error?: (error: Error) => any,
523+
complete?: () => void
524+
): void;
525+
526+
then<T, R>(
527+
onFulfilled?: (a: LoadBundleTaskProgress) => T | PromiseLike<T>,
528+
onRejected?: (a: Error) => R | PromiseLike<R>
529+
): Promise<T | R>;
530+
531+
catch<R>(
532+
onRejected: (a: Error) => R | PromiseLike<R>
533+
): Promise<R | LoadBundleTaskProgress>;
534+
}
535+
536+
export interface LoadBundleTaskProgress {
537+
documentsLoaded: number;
538+
totalDocuments: number;
539+
bytesLoaded: number;
540+
totalBytes: number;
541+
taskState: TaskState;
542+
}
543+
544+
export type TaskState = 'Error' | 'Running' | 'Success';
545+
546+
export function loadBundle(
547+
firestore: FirebaseFirestore,
548+
bundleData: ArrayBuffer | ReadableStream<Uint8Array> | string
549+
): LoadBundleTask;
550+
551+
export function namedQuery(
552+
firestore: FirebaseFirestore,
553+
name: string
554+
): Promise<Query<DocumentData> | null>;
555+
519556
export type FirestoreErrorCode =
520557
| 'cancelled'
521558
| 'unknown'

packages/firestore/index.bundle.ts

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/**
2+
* @license
3+
* Copyright 2020 Google LLC
4+
*
5+
* Licensed under the Apache License, Version 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
import { Firestore } from './src/api/database';
19+
import { loadBundle, namedQuery } from './src/api/bundle';
20+
21+
/**
22+
* Registers Firestore bundle loading features with the components framework.
23+
*/
24+
export function registerBundle(instance: typeof Firestore): void {
25+
instance.prototype.loadBundle = function (
26+
this: Firestore,
27+
data: ArrayBuffer | ReadableStream<Uint8Array> | string
28+
) {
29+
return loadBundle(this, data);
30+
};
31+
instance.prototype.namedQuery = function (
32+
this: Firestore,
33+
queryName: string
34+
) {
35+
return namedQuery(this, queryName);
36+
};
37+
}
38+
39+
registerBundle(Firestore);

packages/firestore/src/api/bundle.ts

+46-38
Original file line numberDiff line numberDiff line change
@@ -15,46 +15,27 @@
1515
* limitations under the License.
1616
*/
1717

18+
import {
19+
LoadBundleTask as ApiLoadBundleTask,
20+
LoadBundleTaskProgress
21+
} from '@firebase/firestore-types';
1822
import { Deferred } from '../util/promise';
1923
import { PartialObserver } from './observer';
2024
import { debugAssert } from '../util/assert';
2125
import { FirestoreError } from '../util/error';
22-
23-
export interface ApiLoadBundleTask {
24-
onProgress(
25-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
26-
next?: (progress: ApiLoadBundleTaskProgress) => any,
27-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
28-
error?: (error: Error) => any,
29-
complete?: () => void
30-
): void;
31-
32-
then<T, R>(
33-
onFulfilled?: (a: ApiLoadBundleTaskProgress) => T | PromiseLike<T>,
34-
onRejected?: (a: Error) => R | PromiseLike<R>
35-
): Promise<T | R>;
36-
37-
catch<R>(
38-
onRejected: (a: Error) => R | PromiseLike<R>
39-
): Promise<R | ApiLoadBundleTaskProgress>;
40-
}
41-
42-
export interface ApiLoadBundleTaskProgress {
43-
documentsLoaded: number;
44-
totalDocuments: number;
45-
bytesLoaded: number;
46-
totalBytes: number;
47-
taskState: TaskState;
48-
}
49-
50-
export type TaskState = 'Error' | 'Running' | 'Success';
26+
import { ensureFirestoreConfigured, Query, Firestore } from './database';
27+
import { Query as ExpQuery } from '../../exp/src/api/reference';
28+
import {
29+
firestoreClientGetNamedQuery,
30+
firestoreClientLoadBundle
31+
} from '../core/firestore_client';
5132

5233
export class LoadBundleTask
53-
implements ApiLoadBundleTask, PromiseLike<ApiLoadBundleTaskProgress> {
54-
private _progressObserver: PartialObserver<ApiLoadBundleTaskProgress> = {};
55-
private _taskCompletionResolver = new Deferred<ApiLoadBundleTaskProgress>();
34+
implements ApiLoadBundleTask, PromiseLike<LoadBundleTaskProgress> {
35+
private _progressObserver: PartialObserver<LoadBundleTaskProgress> = {};
36+
private _taskCompletionResolver = new Deferred<LoadBundleTaskProgress>();
5637

57-
private _lastProgress: ApiLoadBundleTaskProgress = {
38+
private _lastProgress: LoadBundleTaskProgress = {
5839
taskState: 'Running',
5940
totalBytes: 0,
6041
totalDocuments: 0,
@@ -63,7 +44,7 @@ export class LoadBundleTask
6344
};
6445

6546
onProgress(
66-
next?: (progress: ApiLoadBundleTaskProgress) => unknown,
47+
next?: (progress: LoadBundleTaskProgress) => unknown,
6748
error?: (err: Error) => unknown,
6849
complete?: () => void
6950
): void {
@@ -76,12 +57,12 @@ export class LoadBundleTask
7657

7758
catch<R>(
7859
onRejected: (a: Error) => R | PromiseLike<R>
79-
): Promise<R | ApiLoadBundleTaskProgress> {
60+
): Promise<R | LoadBundleTaskProgress> {
8061
return this._taskCompletionResolver.promise.catch(onRejected);
8162
}
8263

8364
then<T, R>(
84-
onFulfilled?: (a: ApiLoadBundleTaskProgress) => T | PromiseLike<T>,
65+
onFulfilled?: (a: LoadBundleTaskProgress) => T | PromiseLike<T>,
8566
onRejected?: (a: Error) => R | PromiseLike<R>
8667
): Promise<T | R> {
8768
return this._taskCompletionResolver.promise.then(onFulfilled, onRejected);
@@ -91,7 +72,7 @@ export class LoadBundleTask
9172
* Notifies all observers that bundle loading has completed, with a provided
9273
* `LoadBundleTaskProgress` object.
9374
*/
94-
_completeWith(progress: ApiLoadBundleTaskProgress): void {
75+
_completeWith(progress: LoadBundleTaskProgress): void {
9576
debugAssert(
9677
progress.taskState === 'Success',
9778
'Task is not completed with Success.'
@@ -126,7 +107,7 @@ export class LoadBundleTask
126107
* Notifies a progress update of loading a bundle.
127108
* @param progress - The new progress.
128109
*/
129-
_updateProgress(progress: ApiLoadBundleTaskProgress): void {
110+
_updateProgress(progress: LoadBundleTaskProgress): void {
130111
debugAssert(
131112
this._lastProgress.taskState === 'Running',
132113
'Cannot update progress on a completed or failed task'
@@ -138,3 +119,30 @@ export class LoadBundleTask
138119
}
139120
}
140121
}
122+
123+
export function loadBundle(
124+
db: Firestore,
125+
bundleData: ArrayBuffer | ReadableStream<Uint8Array> | string
126+
): LoadBundleTask {
127+
const resultTask = new LoadBundleTask();
128+
firestoreClientLoadBundle(
129+
ensureFirestoreConfigured(db._delegate),
130+
db._databaseId,
131+
bundleData,
132+
resultTask
133+
);
134+
return resultTask;
135+
}
136+
137+
export function namedQuery(db: Firestore, name: string): Promise<Query | null> {
138+
return firestoreClientGetNamedQuery(
139+
ensureFirestoreConfigured(db._delegate),
140+
name
141+
).then(namedQuery => {
142+
if (!namedQuery) {
143+
return null;
144+
}
145+
146+
return new Query(db, new ExpQuery(db._delegate, null, namedQuery.query));
147+
});
148+
}

0 commit comments

Comments
 (0)