Skip to content

Commit d539d33

Browse files
authored
feat: use ember source types (#327)
* Use EmberData types * Types * Types * Cleanup * Rm lint:types * Cleanup * Lint * Downgrade * Ch * Cleanup * Type imports * Mv
1 parent 7d625b0 commit d539d33

25 files changed

+355
-695
lines changed

addon/adapters/cloud-firestore-modular.ts

+37-38
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
1-
import { getOwner } from '@ember/application';
1+
import { getOwner } from '@ember/owner';
22
import { service } from '@ember/service';
33
import Adapter from '@ember-data/adapter';
4-
import type DS from 'ember-data';
5-
import { type ModelSchema } from 'ember-data';
6-
import type ModelRegistry from 'ember-data/types/registries/model';
4+
import type { ModelSchema } from '@ember-data/store/types';
5+
import type { AdapterPayload } from '@ember-data/legacy-compat';
6+
import type { Snapshot as _Snapshot } from '@ember-data/legacy-compat/legacy-network-handler/snapshot';
7+
import type { SnapshotRecordArray as _SnapshotRecordArray } from '@ember-data/legacy-compat/-private';
8+
import type { Collection } from '@ember-data/store/-private/record-arrays/identifier-array';
9+
import type {
10+
LegacyBelongsToField,
11+
LegacyHasManyField,
12+
} from '@warp-drive/core-types/schema/fields';
13+
import type Model from 'ember-data/model';
714
import RSVP from 'rsvp';
815
import type Store from '@ember-data/store';
916

@@ -41,30 +48,27 @@ export interface AdapterOption {
4148
[key: string]: unknown;
4249
}
4350

44-
interface Snapshot extends DS.Snapshot {
51+
interface Snapshot extends _Snapshot {
4552
adapterOptions: AdapterOption;
4653
}
4754

48-
interface SnapshotRecordArray
49-
extends DS.SnapshotRecordArray<keyof ModelRegistry> {
55+
interface SnapshotRecordArray extends _SnapshotRecordArray {
5056
adapterOptions: AdapterOption;
5157
}
5258

53-
interface BelongsToRelationshipMeta {
54-
type: keyof ModelRegistry;
59+
type BelongsToRelationshipMeta = LegacyBelongsToField & {
5560
options: { isRealtime?: boolean };
56-
}
61+
};
5762

58-
interface HasManyRelationshipMeta {
63+
type HasManyRelationshipMeta = LegacyHasManyField & {
5964
key: string;
60-
type: string;
6165
options: {
6266
isRealtime?: boolean;
6367

6468
buildReference?(db: Firestore, record: unknown): CollectionReference;
6569
filter?(db: CollectionReference | Query, record: unknown): Query;
6670
};
67-
}
71+
};
6872

6973
export default class CloudFirestoreAdapter extends Adapter {
7074
@service('-firestore-data-manager')
@@ -73,9 +77,9 @@ export default class CloudFirestoreAdapter extends Adapter {
7377
protected referenceKeyName = 'referenceTo';
7478

7579
protected get isFastBoot(): boolean {
76-
const fastboot = getOwner(this).lookup('service:fastboot');
80+
const fastboot = getOwner(this)?.lookup('service:fastboot');
7781

78-
return fastboot && fastboot.isFastBoot;
82+
return !!fastboot && fastboot.isFastBoot;
7983
}
8084

8185
public generateIdForRecord(_store: Store, type: unknown): string {
@@ -89,21 +93,21 @@ export default class CloudFirestoreAdapter extends Adapter {
8993
store: Store,
9094
type: ModelSchema,
9195
snapshot: Snapshot,
92-
): RSVP.Promise<unknown> {
96+
): Promise<AdapterPayload> {
9397
return this.updateRecord(store, type, snapshot);
9498
}
9599

96100
public updateRecord(
97101
_store: Store,
98102
type: ModelSchema,
99103
snapshot: Snapshot,
100-
): RSVP.Promise<unknown> {
104+
): Promise<AdapterPayload> {
101105
return new RSVP.Promise((resolve, reject) => {
102106
const collectionRef = this.buildCollectionRef(
103107
type.modelName,
104108
snapshot.adapterOptions,
105109
);
106-
const docRef = doc(collectionRef, snapshot.id);
110+
const docRef = doc(collectionRef, snapshot.id!);
107111
const batch = this.buildWriteBatch(docRef, snapshot);
108112

109113
batch
@@ -131,14 +135,14 @@ export default class CloudFirestoreAdapter extends Adapter {
131135
_store: Store,
132136
type: ModelSchema,
133137
snapshot: Snapshot,
134-
): RSVP.Promise<unknown> {
138+
): Promise<AdapterPayload> {
135139
return new RSVP.Promise((resolve, reject) => {
136140
const db = getFirestore();
137141
const collectionRef = this.buildCollectionRef(
138142
type.modelName,
139143
snapshot.adapterOptions,
140144
);
141-
const docRef = doc(collectionRef, snapshot.id);
145+
const docRef = doc(collectionRef, snapshot.id!);
142146
const batch = writeBatch(db);
143147

144148
batch.delete(docRef);
@@ -160,7 +164,7 @@ export default class CloudFirestoreAdapter extends Adapter {
160164
type: ModelSchema,
161165
id: string,
162166
snapshot: Snapshot,
163-
): RSVP.Promise<unknown> {
167+
): Promise<AdapterPayload> {
164168
return new RSVP.Promise(async (resolve, reject) => {
165169
try {
166170
const colRef = this.buildCollectionRef(
@@ -194,9 +198,9 @@ export default class CloudFirestoreAdapter extends Adapter {
194198
public findAll(
195199
_store: Store,
196200
type: ModelSchema,
197-
_sinceToken: string,
198-
snapshotRecordArray?: SnapshotRecordArray,
199-
): RSVP.Promise<unknown> {
201+
_sinceToken: null,
202+
snapshotRecordArray: SnapshotRecordArray,
203+
): Promise<AdapterPayload> {
200204
return new RSVP.Promise(async (resolve, reject) => {
201205
try {
202206
const db = getFirestore();
@@ -223,12 +227,13 @@ export default class CloudFirestoreAdapter extends Adapter {
223227
});
224228
}
225229

230+
// @ts-expect-error ember data types 3 arg
226231
public query(
227232
_store: Store,
228233
type: ModelSchema,
229234
queryOption: AdapterOption,
230-
recordArray: DS.AdapterPopulatedRecordArray<unknown>,
231-
): RSVP.Promise<unknown> {
235+
recordArray: Collection,
236+
): Promise<AdapterPayload> {
232237
return new RSVP.Promise(async (resolve, reject) => {
233238
try {
234239
const colRef = this.buildCollectionRef(type.modelName, queryOption);
@@ -264,7 +269,7 @@ export default class CloudFirestoreAdapter extends Adapter {
264269
_snapshot: Snapshot,
265270
url: string,
266271
relationship: BelongsToRelationshipMeta,
267-
): RSVP.Promise<unknown> {
272+
): Promise<AdapterPayload> {
268273
return new RSVP.Promise(async (resolve, reject) => {
269274
try {
270275
const urlNodes = url.split('/');
@@ -303,7 +308,7 @@ export default class CloudFirestoreAdapter extends Adapter {
303308
snapshot: Snapshot,
304309
url: string,
305310
relationship: HasManyRelationshipMeta,
306-
): RSVP.Promise<unknown> {
311+
): Promise<AdapterPayload> {
307312
return new RSVP.Promise(async (resolve, reject) => {
308313
try {
309314
const queryRef = this.buildHasManyCollectionRef(
@@ -315,7 +320,7 @@ export default class CloudFirestoreAdapter extends Adapter {
315320
const config = {
316321
queryRef,
317322
modelName: snapshot.modelName,
318-
id: snapshot.id,
323+
id: snapshot.id!,
319324
field: relationship.key,
320325
referenceKeyName: this.referenceKeyName,
321326
};
@@ -339,7 +344,7 @@ export default class CloudFirestoreAdapter extends Adapter {
339344
}
340345

341346
protected buildCollectionRef(
342-
modelName: keyof ModelRegistry,
347+
modelName: string,
343348
adapterOptions?: AdapterOption,
344349
): CollectionReference {
345350
const db = getFirestore();
@@ -402,7 +407,7 @@ export default class CloudFirestoreAdapter extends Adapter {
402407
);
403408
}
404409

405-
const modelClass = store.modelFor(snapshot.modelName);
410+
const modelClass = store.modelFor(snapshot.modelName) as typeof Model;
406411
const cardinality = modelClass.determineRelationshipType(
407412
relationship,
408413
store,
@@ -420,7 +425,7 @@ export default class CloudFirestoreAdapter extends Adapter {
420425
const collectionRef = collection(db, url);
421426
const queryRef = query(
422427
collectionRef,
423-
where(inverse.name, '==', snapshotDocRef),
428+
where(inverse?.name as string, '==', snapshotDocRef),
424429
);
425430

426431
return (
@@ -436,9 +441,3 @@ export default class CloudFirestoreAdapter extends Adapter {
436441
);
437442
}
438443
}
439-
440-
declare module 'ember-data/types/registries/adapter' {
441-
export default interface AdapterRegistry {
442-
'cloud-firestore-modular': CloudFirestoreAdapter;
443-
}
444-
}

addon/serializers/cloud-firestore-modular.ts

+9-19
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,9 @@
44
*/
55

66
import { isNone } from '@ember/utils';
7-
import type DS from 'ember-data';
8-
import { type ModelSchema } from 'ember-data';
7+
import type Model from '@ember-data/model';
8+
import type { Snapshot } from '@ember-data/legacy-compat/legacy-network-handler/snapshot';
99
import JSONSerializer from '@ember-data/serializer/json';
10-
import type Store from '@ember-data/store';
1110

1211
import type {
1312
CollectionReference,
@@ -39,19 +38,13 @@ interface RelationshipDefinition {
3938
};
4039
}
4140

42-
type ModelClass = ModelSchema & {
43-
determineRelationshipType(
44-
descriptor: { kind: string; type: string },
45-
store: Store,
46-
): string;
47-
};
48-
4941
export default class CloudFirestoreSerializer extends JSONSerializer {
5042
public extractRelationship(
5143
relationshipModelName: string,
5244
relationshipHash: DocumentReference,
5345
): { id: string; type: string } | Record<string, unknown> {
5446
if (isNone(relationshipHash)) {
47+
// @ts-expect-error ember data types aren't exporting serializer types correctly
5548
return super.extractRelationship(relationshipModelName, relationshipHash);
5649
}
5750

@@ -62,7 +55,7 @@ export default class CloudFirestoreSerializer extends JSONSerializer {
6255
}
6356

6457
public extractRelationships(
65-
modelClass: ModelClass,
58+
modelClass: typeof Model,
6659
resourceHash: ResourceHash,
6760
): Record<string, unknown> {
6861
const newResourceHash = { ...resourceHash };
@@ -99,14 +92,16 @@ export default class CloudFirestoreSerializer extends JSONSerializer {
9992

10093
newResourceHash.links = links;
10194

95+
// @ts-expect-error ember data types aren't exporting serializer types correctly
10296
return super.extractRelationships(modelClass, newResourceHash);
10397
}
10498

10599
public serializeBelongsTo(
106-
snapshot: DS.Snapshot,
100+
snapshot: Snapshot,
107101
json: { [key: string]: string | null | DocumentReference },
108102
relationship: RelationshipDefinition,
109103
): void {
104+
// @ts-expect-error ember data types aren't exporting serializer types correctly
110105
super.serializeBelongsTo(snapshot, json, relationship);
111106

112107
if (json[relationship.key]) {
@@ -128,10 +123,11 @@ export default class CloudFirestoreSerializer extends JSONSerializer {
128123
}
129124

130125
public serialize(
131-
snapshot: DS.Snapshot,
126+
snapshot: Snapshot,
132127
options: Record<string, unknown>,
133128
): Record<string, unknown> {
134129
const json: { [key: string]: unknown } = {
130+
// @ts-expect-error ember data types aren't exporting serializer types correctly
135131
...super.serialize(snapshot, options),
136132
};
137133

@@ -144,9 +140,3 @@ export default class CloudFirestoreSerializer extends JSONSerializer {
144140
return json;
145141
}
146142
}
147-
148-
declare module 'ember-data/types/registries/serializer' {
149-
export default interface SerializerRegistry {
150-
'cloud-firestore-modular': CloudFirestoreSerializer;
151-
}
152-
}

0 commit comments

Comments
 (0)