Skip to content

Commit 4d7d2c4

Browse files
authored
Storage compat build and release (#4641)
* Implement storage-compat * save * build storage compat * build v8 correctly * script for publishing storage-compat * remove unused imports * add build script * simplify release build * make compat work in runtime * fix misc things * fix tests
1 parent 4789018 commit 4d7d2c4

35 files changed

+966
-458
lines changed

common/api-review/storage.api.md

+86-1
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,32 @@
66

77
import { CompleteFn } from '@firebase/util';
88
import { FirebaseApp } from '@firebase/app';
9+
import { FirebaseAuthInternalName } from '@firebase/auth-interop-types';
910
import { FirebaseError } from '@firebase/util';
11+
import { _FirebaseService } from '@firebase/app';
1012
import { NextFn } from '@firebase/util';
13+
import { Provider } from '@firebase/component';
1114
import { Subscribe } from '@firebase/util';
1215
import { Unsubscribe } from '@firebase/util';
1316

1417
// @public
1518
export function deleteObject(ref: StorageReference): Promise<void>;
1619

20+
// @internal (undocumented)
21+
export class _FbsBlob {
22+
constructor(data: Blob | Uint8Array | ArrayBuffer, elideCopy?: boolean);
23+
// (undocumented)
24+
static getBlob(...args: Array<string | _FbsBlob>): _FbsBlob | null;
25+
// (undocumented)
26+
size(): number;
27+
// (undocumented)
28+
slice(startByte: number, endByte: number): _FbsBlob | null;
29+
// (undocumented)
30+
type(): string;
31+
// (undocumented)
32+
uploadData(): Blob | Uint8Array;
33+
}
34+
1735
// @public
1836
export interface FirebaseStorageError extends FirebaseError {
1937
serverResponse: string | null;
@@ -33,6 +51,9 @@ export interface FullMetadata extends UploadMetadata {
3351
updated: string;
3452
}
3553

54+
// @internal (undocumented)
55+
export function _getChild(ref: StorageReference, childPath: string): _Reference;
56+
3657
// @public
3758
export function getDownloadURL(ref: StorageReference): Promise<string>;
3859

@@ -61,12 +82,50 @@ export interface ListResult {
6182
prefixes: StorageReference[];
6283
}
6384

85+
// @internal
86+
export class _Location {
87+
constructor(bucket: string, path: string);
88+
// (undocumented)
89+
readonly bucket: string;
90+
// (undocumented)
91+
bucketOnlyServerUrl(): string;
92+
// (undocumented)
93+
fullServerUrl(): string;
94+
// (undocumented)
95+
get isRoot(): boolean;
96+
// (undocumented)
97+
static makeFromBucketSpec(bucketString: string): _Location;
98+
// (undocumented)
99+
static makeFromUrl(url: string): _Location;
100+
// (undocumented)
101+
get path(): string;
102+
}
103+
64104
// @public
65105
export function ref(storage: StorageService, url?: string): StorageReference;
66106

67107
// @public
68108
export function ref(storageOrRef: StorageService | StorageReference, path?: string): StorageReference;
69109

110+
// @internal
111+
export class _Reference {
112+
// Warning: (ae-forgotten-export) The symbol "StorageService" needs to be exported by the entry point index.d.ts
113+
constructor(_service: StorageService_2, location: string | _Location);
114+
get bucket(): string;
115+
get fullPath(): string;
116+
// (undocumented)
117+
_location: _Location;
118+
get name(): string;
119+
// (undocumented)
120+
protected _newRef(service: StorageService_2, location: _Location): _Reference;
121+
get parent(): _Reference | null;
122+
get root(): _Reference;
123+
get storage(): StorageService_2;
124+
_throwIfRoot(name: string): void;
125+
// @override
126+
toString(): string;
127+
}
128+
70129
// @public
71130
export interface SettableMetadata {
72131
cacheControl?: string | undefined;
@@ -101,7 +160,7 @@ export interface StorageReference {
101160
}
102161

103162
// @public
104-
export interface StorageService {
163+
export interface StorageService extends _FirebaseService {
105164
readonly app: FirebaseApp;
106165
maxOperationRetryTime: number;
107166
maxUploadRetryTime: number;
@@ -158,6 +217,32 @@ export interface UploadTask {
158217
then(onFulfilled?: ((snapshot: UploadTaskSnapshot) => unknown) | null, onRejected?: ((error: FirebaseStorageError) => unknown) | null): Promise<unknown>;
159218
}
160219

220+
// @internal
221+
export class _UploadTask {
222+
constructor(ref: _Reference, blob: _FbsBlob, metadata?: Metadata | null);
223+
_blob: _FbsBlob;
224+
cancel(): boolean;
225+
catch<T>(onRejected: (p1: FirebaseStorageError_2) => T | Promise<T>): Promise<T>;
226+
// Warning: (ae-forgotten-export) The symbol "Metadata" needs to be exported by the entry point index.d.ts
227+
_metadata: Metadata | null;
228+
// Warning: (ae-forgotten-export) The symbol "TaskEvent" needs to be exported by the entry point index.d.ts
229+
// Warning: (ae-forgotten-export) The symbol "StorageObserver" needs to be exported by the entry point index.d.ts
230+
// Warning: (ae-forgotten-export) The symbol "ErrorFn" needs to be exported by the entry point index.d.ts
231+
// Warning: (ae-forgotten-export) The symbol "CompleteFn" needs to be exported by the entry point index.d.ts
232+
// Warning: (ae-forgotten-export) The symbol "Unsubscribe" needs to be exported by the entry point index.d.ts
233+
// Warning: (ae-forgotten-export) The symbol "Subscribe" needs to be exported by the entry point index.d.ts
234+
on(type: TaskEvent_2, nextOrObserver?: StorageObserver_2<UploadTaskSnapshot_2> | ((a: UploadTaskSnapshot_2) => unknown), error?: ErrorFn, completed?: CompleteFn_2): Unsubscribe_2 | Subscribe_2<UploadTaskSnapshot_2>;
235+
pause(): boolean;
236+
resume(): boolean;
237+
// Warning: (ae-forgotten-export) The symbol "UploadTaskSnapshot" needs to be exported by the entry point index.d.ts
238+
get snapshot(): UploadTaskSnapshot_2;
239+
// Warning: (ae-forgotten-export) The symbol "InternalTaskState" needs to be exported by the entry point index.d.ts
240+
_state: InternalTaskState;
241+
// Warning: (ae-forgotten-export) The symbol "FirebaseStorageError" needs to be exported by the entry point index.d.ts
242+
then<U>(onFulfilled?: ((value: UploadTaskSnapshot_2) => U | Promise<U>) | null, onRejected?: ((error: FirebaseStorageError_2) => U | Promise<U>) | null): Promise<U>;
243+
_transferred: number;
244+
}
245+
161246
// @public
162247
export interface UploadTaskSnapshot {
163248
bytesTransferred: number;

packages-exp/analytics-compat/rollup.shared.js

+4-3
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,10 @@
1616
*/
1717
import pkg from './package.json';
1818

19-
const deps = Object.keys(
20-
Object.assign({}, pkg.peerDependencies, pkg.dependencies)
21-
);
19+
const deps = [
20+
...Object.keys(Object.assign({}, pkg.peerDependencies, pkg.dependencies)),
21+
'@firebase/analytics'
22+
];
2223

2324
export const es5BuildsNoPlugin = [
2425
/**

packages-exp/app-compat/rollup.config.release.js

+4-3
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,10 @@ import typescript from 'typescript';
2121
import pkg from './package.json';
2222
import { importPathTransformer } from '../../scripts/exp/ts-transform-import-path';
2323

24-
const deps = Object.keys(
25-
Object.assign({}, pkg.peerDependencies, pkg.dependencies)
26-
);
24+
const deps = [
25+
...Object.keys(Object.assign({}, pkg.peerDependencies, pkg.dependencies)),
26+
'@firebase/app'
27+
];
2728

2829
/**
2930
* ES5 Builds

packages-exp/functions-compat/rollup.config.base.js

+4-3
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,10 @@ import typescriptPlugin from 'rollup-plugin-typescript2';
2020
import typescript from 'typescript';
2121
import pkg from './package.json';
2222

23-
const deps = Object.keys(
24-
Object.assign({}, pkg.peerDependencies, pkg.dependencies)
25-
);
23+
const deps = [
24+
...Object.keys(Object.assign({}, pkg.peerDependencies, pkg.dependencies)),
25+
'@firebase/functions'
26+
];
2627

2728
/**
2829
* ES5 Builds

packages-exp/performance-compat/rollup.shared.js

+4-3
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,10 @@
1717

1818
import pkg from './package.json';
1919

20-
const deps = Object.keys(
21-
Object.assign({}, pkg.peerDependencies, pkg.dependencies)
22-
);
20+
const deps = [
21+
...Object.keys(Object.assign({}, pkg.peerDependencies, pkg.dependencies)),
22+
'@firebase/performance'
23+
];
2324

2425
export const es5BuildsNoPlugin = [
2526
/**

packages-exp/remote-config-compat/rollup.shared.js

+4-3
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,10 @@
1717

1818
import pkg from './package.json';
1919

20-
const deps = Object.keys(
21-
Object.assign({}, pkg.peerDependencies, pkg.dependencies)
22-
);
20+
const deps = [
21+
...Object.keys(Object.assign({}, pkg.peerDependencies, pkg.dependencies)),
22+
'@firebase/remote-config'
23+
];
2324

2425
export const es5BuildsNoPlugin = [
2526
/**

packages/storage/compat/index.ts

+11-17
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,14 @@
1515
* limitations under the License.
1616
*/
1717

18-
import firebase from '@firebase/app';
18+
// eslint-disable-next-line import/no-extraneous-dependencies
19+
import firebase from '@firebase/app-compat';
1920
import { _FirebaseNamespace } from '@firebase/app-types/private';
2021
import { StringFormat } from '../src/implementation/string';
2122
import { TaskEvent, TaskState } from '../src/implementation/taskenums';
2223

23-
import { XhrIoPool } from '../src/implementation/xhriopool';
2424
import { ReferenceCompat } from './reference';
2525
import { StorageServiceCompat } from './service';
26-
import { StorageService } from '../src/service';
2726
import * as types from '@firebase/storage-types';
2827
import {
2928
Component,
@@ -34,6 +33,8 @@ import {
3433

3534
import { name, version } from '../package.json';
3635

36+
import '../register-module';
37+
3738
/**
3839
* Type constant for Firebase Storage.
3940
*/
@@ -44,21 +45,14 @@ function factory(
4445
{ instanceIdentifier: url }: InstanceFactoryOptions
4546
): types.FirebaseStorage {
4647
// Dependencies
47-
// TODO: This should eventually be 'app-compat'
48-
const app = container.getProvider('app').getImmediate();
49-
const authProvider = container.getProvider('auth-internal');
48+
const app = container.getProvider('app-compat').getImmediate();
49+
const storageExp = container
50+
.getProvider('storage-exp')
51+
.getImmediate({ identifier: url });
5052

51-
// TODO: get StorageService instance from component framework instead
52-
// of creating a new one.
5353
const storageServiceCompat: StorageServiceCompat = new StorageServiceCompat(
5454
app,
55-
new StorageService(
56-
app,
57-
authProvider,
58-
new XhrIoPool(),
59-
url,
60-
firebase.SDK_VERSION
61-
)
55+
storageExp
6256
);
6357
return storageServiceCompat;
6458
}
@@ -69,7 +63,7 @@ export function registerStorage(instance: _FirebaseNamespace): void {
6963
TaskState,
7064
TaskEvent,
7165
StringFormat,
72-
Storage: StorageService,
66+
Storage: StorageServiceCompat,
7367
Reference: ReferenceCompat
7468
};
7569
instance.INTERNAL.registerComponent(
@@ -81,7 +75,7 @@ export function registerStorage(instance: _FirebaseNamespace): void {
8175
instance.registerVersion(name, version);
8276
}
8377

84-
registerStorage(firebase as _FirebaseNamespace);
78+
registerStorage((firebase as unknown) as _FirebaseNamespace);
8579

8680
/**
8781
* Define extension behavior for `registerStorage`

packages/storage/compat/list.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,8 @@
1414
* See the License for the specific language governing permissions and
1515
* limitations under the License.
1616
*/
17-
17+
import { ListResult } from '../exp/api';
1818
import * as types from '@firebase/storage-types';
19-
import { ListResult } from '../src/list';
2019
import { ReferenceCompat } from './reference';
2120
import { StorageServiceCompat } from './service';
2221

packages/storage/compat/package.json

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"name": "@firebase/storage-compat",
3+
"version": "0.0.900",
4+
"description": "The Cloud Storage component of the Firebase JS SDK.",
5+
"author": "Firebase <[email protected]> (https://firebase.google.com/)",
6+
"main": "../dist/compat/node-cjs/index.js",
7+
"browser": "../dist/compat/esm5/index.js",
8+
"module": "../dist/compat/esm5/index.js",
9+
"esm2017": "../dist/compat/esm2017/index.js",
10+
"license": "Apache-2.0",
11+
"typings": "../dist/compat/esm5/compat/index.d.ts"
12+
}
13+

packages/storage/compat/reference.ts

+21-16
Original file line numberDiff line numberDiff line change
@@ -16,29 +16,34 @@
1616
*/
1717

1818
import {
19-
Reference,
20-
_getChild,
19+
StorageReference,
2120
uploadBytesResumable,
2221
list,
2322
listAll,
2423
getDownloadURL,
2524
getMetadata,
2625
updateMetadata,
27-
deleteObject
28-
} from '../src/reference';
29-
import * as types from '@firebase/storage-types';
30-
import { Metadata } from '../src/metadata';
31-
import { dataFromString, StringFormat } from '../src/implementation/string';
26+
deleteObject,
27+
UploadTask,
28+
StringFormat,
29+
_UploadTask,
30+
_getChild,
31+
_Reference,
32+
_FbsBlob
33+
} from '../exp/api'; // import from the exp public API
34+
3235
import { UploadTaskCompat } from './task';
3336
import { ListResultCompat } from './list';
3437
import { StorageServiceCompat } from './service';
38+
39+
import * as types from '@firebase/storage-types';
40+
import { Metadata } from '../src/metadata';
41+
import { dataFromString } from '../src/implementation/string';
3542
import { invalidRootOperation } from '../src/implementation/error';
36-
import { UploadTask } from '../src/task';
37-
import { FbsBlob } from '../src/implementation/blob';
3843

3944
export class ReferenceCompat implements types.Reference {
4045
constructor(
41-
private readonly _delegate: Reference,
46+
private readonly _delegate: StorageReference,
4247
public storage: StorageServiceCompat
4348
) {}
4449

@@ -120,11 +125,11 @@ export class ReferenceCompat implements types.Reference {
120125
metadataClone['contentType'] = data.contentType;
121126
}
122127
return new UploadTaskCompat(
123-
new UploadTask(
124-
this._delegate,
125-
new FbsBlob(data.data, true),
128+
new _UploadTask(
129+
this._delegate as _Reference,
130+
new _FbsBlob(data.data, true),
126131
metadataClone
127-
),
132+
) as UploadTask,
128133
this
129134
);
130135
}
@@ -172,7 +177,7 @@ export class ReferenceCompat implements types.Reference {
172177
* can be used to get the rest of the results.
173178
*/
174179
list(options?: types.ListOptions | null): Promise<types.ListResult> {
175-
return list(this._delegate, options).then(
180+
return list(this._delegate, options || undefined).then(
176181
r => new ListResultCompat(r, this.storage)
177182
);
178183
}
@@ -222,7 +227,7 @@ export class ReferenceCompat implements types.Reference {
222227
}
223228

224229
private _throwIfRoot(name: string): void {
225-
if (this._delegate._location.path === '') {
230+
if ((this._delegate as _Reference)._location.path === '') {
226231
throw invalidRootOperation(name);
227232
}
228233
}

0 commit comments

Comments
 (0)