From 8df8210efdf31ba69deea48a599bb4ccd2bcd58c Mon Sep 17 00:00:00 2001 From: Charles Fries Date: Wed, 30 Oct 2024 21:06:00 -0700 Subject: [PATCH 01/12] Use EmberData types --- addon/adapters/cloud-firestore-modular.ts | 72 +- addon/serializers/cloud-firestore-modular.ts | 23 +- addon/services/-firestore-data-manager.ts | 49 +- addon/transforms/timestamp.ts | 6 - package-lock.json | 627 +++++------------- package.json | 35 +- tests/dummy/app/adapters/application.ts | 7 - tests/dummy/app/controllers/features.ts | 32 +- tests/dummy/app/models/group.ts | 15 +- tests/dummy/app/models/post.ts | 17 +- tests/dummy/app/models/user.ts | 18 +- tests/dummy/app/routes/create-record.ts | 8 +- tests/dummy/app/routes/delete-record.ts | 6 +- tests/dummy/app/routes/find-all.ts | 5 +- tests/dummy/app/routes/find-record.ts | 2 +- tests/dummy/app/routes/query.ts | 6 +- tests/dummy/app/routes/update-record.ts | 2 +- tests/dummy/app/serializers/application.ts | 7 - .../adapters/cloud-firestore-modular-test.ts | 4 +- .../services/-firestore-data-manager-test.ts | 7 +- tsconfig.json | 17 +- types/ember-data/types/registries/model.d.ts | 8 - types/global.d.ts | 8 + 23 files changed, 314 insertions(+), 667 deletions(-) delete mode 100644 types/ember-data/types/registries/model.d.ts diff --git a/addon/adapters/cloud-firestore-modular.ts b/addon/adapters/cloud-firestore-modular.ts index 06fe63c1..2968d4fc 100644 --- a/addon/adapters/cloud-firestore-modular.ts +++ b/addon/adapters/cloud-firestore-modular.ts @@ -1,8 +1,11 @@ -import { getOwner } from '@ember/application'; +import { getOwner } from '@ember/owner'; import { service } from '@ember/service'; import Adapter from '@ember-data/adapter'; -import DS, { type ModelSchema } from 'ember-data'; -import type ModelRegistry from 'ember-data/types/registries/model'; +import type { ModelSchema } from '@ember-data/store/types'; +import type { AdapterPayload } from '@ember-data/legacy-compat'; +import type { Snapshot as _Snapshot } from '@ember-data/legacy-compat/legacy-network-handler/snapshot'; +import type { SnapshotRecordArray as _SnapshotRecordArray } from '@ember-data/legacy-compat/-private'; +import type { Collection } from '@ember-data/store/-private/record-arrays/identifier-array'; import RSVP from 'rsvp'; import Store from '@ember-data/store'; @@ -28,6 +31,11 @@ import AdapterRecordNotFoundError from 'ember-cloud-firestore-adapter/utils/cust import FirestoreDataManager from 'ember-cloud-firestore-adapter/services/-firestore-data-manager'; import buildCollectionName from 'ember-cloud-firestore-adapter/-private/build-collection-name'; import flattenDocSnapshot from 'ember-cloud-firestore-adapter/-private/flatten-doc-snapshot'; +import type { + LegacyBelongsToField, + LegacyHasManyField, +} from '@warp-drive/core-types/schema/fields'; +import type Model from 'ember-data/model'; export interface AdapterOption { isRealtime?: boolean; @@ -40,23 +48,21 @@ export interface AdapterOption { [key: string]: unknown; } -interface Snapshot extends DS.Snapshot { +interface Snapshot extends _Snapshot { adapterOptions: AdapterOption; } -interface SnapshotRecordArray - extends DS.SnapshotRecordArray { +interface SnapshotRecordArray extends _SnapshotRecordArray { adapterOptions: AdapterOption; } -interface BelongsToRelationshipMeta { - type: keyof ModelRegistry; +type BelongsToRelationshipMeta = LegacyBelongsToField & { options: { isRealtime?: boolean }; -} +}; -interface HasManyRelationshipMeta { +interface HasManyRelationshipMeta extends LegacyHasManyField { key: string; - type: string; + // type: string; options: { isRealtime?: boolean; @@ -72,9 +78,9 @@ export default class CloudFirestoreAdapter extends Adapter { protected referenceKeyName = 'referenceTo'; protected get isFastBoot(): boolean { - const fastboot = getOwner(this).lookup('service:fastboot'); + const fastboot = getOwner(this)?.lookup('service:fastboot'); - return fastboot && fastboot.isFastBoot; + return !!fastboot && fastboot.isFastBoot; } public generateIdForRecord(_store: Store, type: unknown): string { @@ -88,7 +94,7 @@ export default class CloudFirestoreAdapter extends Adapter { store: Store, type: ModelSchema, snapshot: Snapshot, - ): RSVP.Promise { + ): Promise { return this.updateRecord(store, type, snapshot); } @@ -96,13 +102,13 @@ export default class CloudFirestoreAdapter extends Adapter { _store: Store, type: ModelSchema, snapshot: Snapshot, - ): RSVP.Promise { + ): Promise { return new RSVP.Promise((resolve, reject) => { const collectionRef = this.buildCollectionRef( type.modelName, snapshot.adapterOptions, ); - const docRef = doc(collectionRef, snapshot.id); + const docRef = doc(collectionRef, snapshot.id!); const batch = this.buildWriteBatch(docRef, snapshot); batch @@ -130,14 +136,14 @@ export default class CloudFirestoreAdapter extends Adapter { _store: Store, type: ModelSchema, snapshot: Snapshot, - ): RSVP.Promise { + ): Promise { return new RSVP.Promise((resolve, reject) => { const db = getFirestore(); const collectionRef = this.buildCollectionRef( type.modelName, snapshot.adapterOptions, ); - const docRef = doc(collectionRef, snapshot.id); + const docRef = doc(collectionRef, snapshot.id!); const batch = writeBatch(db); batch.delete(docRef); @@ -159,7 +165,7 @@ export default class CloudFirestoreAdapter extends Adapter { type: ModelSchema, id: string, snapshot: Snapshot, - ): RSVP.Promise { + ): Promise { return new RSVP.Promise(async (resolve, reject) => { try { const colRef = this.buildCollectionRef( @@ -193,9 +199,9 @@ export default class CloudFirestoreAdapter extends Adapter { public findAll( _store: Store, type: ModelSchema, - _sinceToken: string, - snapshotRecordArray?: SnapshotRecordArray, - ): RSVP.Promise { + _sinceToken: null, + snapshotRecordArray: SnapshotRecordArray, + ): Promise { return new RSVP.Promise(async (resolve, reject) => { try { const db = getFirestore(); @@ -226,8 +232,8 @@ export default class CloudFirestoreAdapter extends Adapter { _store: Store, type: ModelSchema, queryOption: AdapterOption, - recordArray: DS.AdapterPopulatedRecordArray, - ): RSVP.Promise { + recordArray: Collection, + ): Promise { return new RSVP.Promise(async (resolve, reject) => { try { const colRef = this.buildCollectionRef(type.modelName, queryOption); @@ -263,7 +269,7 @@ export default class CloudFirestoreAdapter extends Adapter { _snapshot: Snapshot, url: string, relationship: BelongsToRelationshipMeta, - ): RSVP.Promise { + ): Promise { return new RSVP.Promise(async (resolve, reject) => { try { const urlNodes = url.split('/'); @@ -302,7 +308,7 @@ export default class CloudFirestoreAdapter extends Adapter { snapshot: Snapshot, url: string, relationship: HasManyRelationshipMeta, - ): RSVP.Promise { + ): Promise { return new RSVP.Promise(async (resolve, reject) => { try { const queryRef = this.buildHasManyCollectionRef( @@ -314,7 +320,7 @@ export default class CloudFirestoreAdapter extends Adapter { const config = { queryRef, modelName: snapshot.modelName, - id: snapshot.id, + id: snapshot.id!, field: relationship.key, referenceKeyName: this.referenceKeyName, }; @@ -338,7 +344,7 @@ export default class CloudFirestoreAdapter extends Adapter { } protected buildCollectionRef( - modelName: keyof ModelRegistry, + modelName: string, adapterOptions?: AdapterOption, ): CollectionReference { const db = getFirestore(); @@ -401,7 +407,7 @@ export default class CloudFirestoreAdapter extends Adapter { ); } - const modelClass = store.modelFor(snapshot.modelName); + const modelClass = store.modelFor(snapshot.modelName) as typeof Model; const cardinality = modelClass.determineRelationshipType( relationship, store, @@ -419,7 +425,7 @@ export default class CloudFirestoreAdapter extends Adapter { const collectionRef = collection(db, url); const queryRef = query( collectionRef, - where(inverse.name, '==', snapshotDocRef), + where(inverse?.name as string, '==', snapshotDocRef), ); return ( @@ -435,9 +441,3 @@ export default class CloudFirestoreAdapter extends Adapter { ); } } - -declare module 'ember-data/types/registries/adapter' { - export default interface AdapterRegistry { - 'cloud-firestore-modular': CloudFirestoreAdapter; - } -} diff --git a/addon/serializers/cloud-firestore-modular.ts b/addon/serializers/cloud-firestore-modular.ts index 8b696916..2a16a8df 100644 --- a/addon/serializers/cloud-firestore-modular.ts +++ b/addon/serializers/cloud-firestore-modular.ts @@ -4,9 +4,9 @@ */ import { isNone } from '@ember/utils'; -import DS, { type ModelSchema } from 'ember-data'; +import type Model from '@ember-data/model'; +import type { Snapshot } from '@ember-data/legacy-compat/legacy-network-handler/snapshot'; import JSONSerializer from '@ember-data/serializer/json'; -import Store from '@ember-data/store'; import { CollectionReference, @@ -38,13 +38,6 @@ interface RelationshipDefinition { }; } -type ModelClass = ModelSchema & { - determineRelationshipType( - descriptor: { kind: string; type: string }, - store: Store, - ): string; -}; - export default class CloudFirestoreSerializer extends JSONSerializer { public extractRelationship( relationshipModelName: string, @@ -61,7 +54,7 @@ export default class CloudFirestoreSerializer extends JSONSerializer { } public extractRelationships( - modelClass: ModelClass, + modelClass: typeof Model, resourceHash: ResourceHash, ): Record { const newResourceHash = { ...resourceHash }; @@ -102,7 +95,7 @@ export default class CloudFirestoreSerializer extends JSONSerializer { } public serializeBelongsTo( - snapshot: DS.Snapshot, + snapshot: Snapshot, json: { [key: string]: string | null | DocumentReference }, relationship: RelationshipDefinition, ): void { @@ -127,7 +120,7 @@ export default class CloudFirestoreSerializer extends JSONSerializer { } public serialize( - snapshot: DS.Snapshot, + snapshot: Snapshot, options: Record, ): Record { const json: { [key: string]: unknown } = { @@ -143,9 +136,3 @@ export default class CloudFirestoreSerializer extends JSONSerializer { return json; } } - -declare module 'ember-data/types/registries/serializer' { - export default interface SerializerRegistry { - 'cloud-firestore-modular': CloudFirestoreSerializer; - } -} diff --git a/addon/services/-firestore-data-manager.ts b/addon/services/-firestore-data-manager.ts index dcb34ddf..fbabcf32 100644 --- a/addon/services/-firestore-data-manager.ts +++ b/addon/services/-firestore-data-manager.ts @@ -1,6 +1,6 @@ import { next } from '@ember/runloop'; -import DS from 'ember-data'; -import type ModelRegistry from 'ember-data/types/registries/model'; +import type { Collection } from '@ember-data/store/-private/record-arrays/identifier-array'; +import type { CompatStore } from '@ember-data/legacy-compat'; import Service, { service } from '@ember/service'; import StoreService from '@ember-data/store'; @@ -19,6 +19,7 @@ import { onSnapshot, } from 'ember-cloud-firestore-adapter/firebase/firestore'; import flattenDocSnapshot from 'ember-cloud-firestore-adapter/-private/flatten-doc-snapshot'; +import Model from '@ember-data/model'; interface DocListeners { [key: string]: { @@ -42,15 +43,15 @@ interface QueryListeners { } interface QueryFetchConfig { - modelName: keyof ModelRegistry; + modelName: string; referenceKeyName: string; - recordArray: DS.AdapterPopulatedRecordArray; + recordArray: Collection; queryRef: Query; queryId?: string; } interface HasManyFetchConfig { - modelName: keyof ModelRegistry; + modelName: string; id: string; field: string; referenceKeyName: string; @@ -87,7 +88,7 @@ export default class FirestoreDataManager extends Service { } public async findRecordRealtime( - modelName: keyof ModelRegistry, + modelName: string, docRef: DocumentReference, ): Promise { const { path: listenerKey } = docRef; @@ -100,7 +101,7 @@ export default class FirestoreDataManager extends Service { } public async findAllRealtime( - modelName: keyof ModelRegistry, + modelName: string, colRef: CollectionReference, ): Promise { const { path: listenerKey } = colRef; @@ -167,7 +168,7 @@ export default class FirestoreDataManager extends Service { } private setupDocRealtimeUpdates( - modelName: keyof ModelRegistry, + modelName: string, docRef: DocumentReference, ): Promise { return new Promise((resolve, reject) => { @@ -202,7 +203,7 @@ export default class FirestoreDataManager extends Service { } private setupColRealtimeUpdates( - modelName: keyof ModelRegistry, + modelName: string, colRef: CollectionReference, ): Promise { return new Promise((resolve, reject) => { @@ -316,7 +317,7 @@ export default class FirestoreDataManager extends Service { private handleSubsequentDocRealtimeUpdates( docSnapshot: DocumentSnapshot, - modelName: keyof ModelRegistry, + modelName: string, listenerKey: string, ): void { if (docSnapshot.exists()) { @@ -328,7 +329,7 @@ export default class FirestoreDataManager extends Service { } private handleSubsequentColRealtimeUpdates( - modelName: keyof ModelRegistry, + modelName: string, listenerKey: string, querySnapshot: QuerySnapshot, ): void { @@ -366,7 +367,7 @@ export default class FirestoreDataManager extends Service { private handleSubsequentQueryRealtimeUpdates( queryId: string, - recordArray: DS.AdapterPopulatedRecordArray, + recordArray: Collection, ): void { // Schedule for next runloop to avoid race condition errors. This can happen when a listener // exists for a record that's part of the query array. When that happens, doing an update @@ -415,16 +416,16 @@ export default class FirestoreDataManager extends Service { // to happen first. next(() => { const hasManyRef = this.store - .peekRecord(config.modelName, config.id) - .hasMany(config.field); + .peekRecord(config.modelName, config.id) + ?.hasMany(config.field); - hasManyRef.reload(); + hasManyRef?.reload(); }); } public async getReferenceToDoc( docSnapshot: DocumentSnapshot, - modelName: keyof ModelRegistry, + modelName: string, referenceKeyName: string, isRealtime = false, ): Promise { @@ -439,12 +440,12 @@ export default class FirestoreDataManager extends Service { return docSnapshot; } - private pushRecord( - modelName: keyof ModelRegistry, - snapshot: DocumentSnapshot, - ): void { + private pushRecord(modelName: string, snapshot: DocumentSnapshot): void { const flatRecord = flattenDocSnapshot(snapshot); - const normalizedRecord = this.store.normalize(modelName, flatRecord); + const normalizedRecord = (this.store as CompatStore).normalize( + modelName, + flatRecord, + ); // Race condition can happen because of the realtime nature. We handle that in a try-catch // to avoid unexpected side-effects. When this happens, we just ignore it. @@ -455,11 +456,7 @@ export default class FirestoreDataManager extends Service { } } - private unloadRecord( - modelName: keyof ModelRegistry, - id: string, - path?: string, - ): void { + private unloadRecord(modelName: string, id: string, path?: string): void { const record = this.store.peekRecord(modelName, id); if (record !== null) { diff --git a/addon/transforms/timestamp.ts b/addon/transforms/timestamp.ts index 56fdb584..74434ea0 100644 --- a/addon/transforms/timestamp.ts +++ b/addon/transforms/timestamp.ts @@ -18,9 +18,3 @@ export default class TimestampTransform extends Transform { return typeOf(value) === 'date' ? (value as Date) : serverTimestamp(); } } - -declare module 'ember-data/types/registries/transform' { - export default interface TransformRegistry { - timestamp: TimestampTransform; - } -} diff --git a/package-lock.json b/package-lock.json index 7f7dc567..ecf98178 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,16 @@ "ember-cli-typescript": "^4.2.1" }, "devDependencies": { + "@ember-data-types/adapter": "5.4.0-alpha.113", + "@ember-data-types/graph": "5.4.0-alpha.113", + "@ember-data-types/json-api": "5.4.0-alpha.113", + "@ember-data-types/legacy-compat": "5.4.0-alpha.113", + "@ember-data-types/model": "5.4.0-alpha.113", + "@ember-data-types/request": "5.4.0-alpha.113", + "@ember-data-types/request-utils": "5.4.0-alpha.113", + "@ember-data-types/serializer": "5.4.0-alpha.113", + "@ember-data-types/store": "5.4.0-alpha.113", + "@ember-data-types/tracking": "5.4.0-alpha.113", "@ember/optional-features": "^2.1.0", "@ember/string": "^3.1.1", "@ember/test-helpers": "^3.2.0", @@ -23,35 +33,13 @@ "@glimmer/component": "^1.1.2", "@glimmer/tracking": "^1.1.2", "@tsconfig/ember": "^3.0.8", - "@types/ember": "^4.0.11", - "@types/ember__application": "^4.0.11", - "@types/ember__array": "^4.0.10", - "@types/ember__component": "^4.0.22", - "@types/ember__controller": "^4.0.12", - "@types/ember__debug": "^4.0.8", - "@types/ember__engine": "^4.0.11", - "@types/ember__error": "^4.0.6", - "@types/ember__object": "^4.0.12", - "@types/ember__owner": "^4.0.9", - "@types/ember__polyfills": "^4.0.6", - "@types/ember__routing": "^4.0.22", - "@types/ember__runloop": "^4.0.10", - "@types/ember__service": "^4.0.9", - "@types/ember__string": "^3.0.15", - "@types/ember__template": "^4.0.7", - "@types/ember__test": "^4.0.6", - "@types/ember__utils": "^4.0.7", - "@types/ember-data": "^4.4.16", - "@types/ember-data__adapter": "^4.0.6", - "@types/ember-data__model": "^4.0.5", - "@types/ember-data__serializer": "^4.0.6", - "@types/ember-data__store": "^4.0.7", "@types/node": "^20.14.2", "@types/qunit": "^2.19.10", "@types/rsvp": "^4.0.9", "@types/sinon": "^17.0.3", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", + "@warp-drive-types/core-types": "0.0.0-alpha.99", "broccoli-asset-rev": "^3.0.0", "concurrently": "^8.2.2", "ember-cli": "~5.4.2", @@ -63,6 +51,7 @@ "ember-cli-terser": "^4.0.2", "ember-cli-typescript-blueprints": "^3.0.0", "ember-data": "~4.11.2", + "ember-data-types": "5.4.0-alpha.113", "ember-fetch": "^8.1.2", "ember-load-initializers": "^2.1.2", "ember-page-title": "^8.0.0", @@ -2140,6 +2129,66 @@ "postcss-selector-parser": "^6.0.13" } }, + "node_modules/@ember-data-types/adapter": { + "version": "5.4.0-alpha.113", + "resolved": "https://registry.npmjs.org/@ember-data-types/adapter/-/adapter-5.4.0-alpha.113.tgz", + "integrity": "sha512-46u4mZGRBCXujaHeWSpjz8yb/wMoIiTj031rh3HAf1PbGh6h/+qky8uVUE+f7gQls0ANfjS8ZoXCFEY/txM/og==", + "dev": true + }, + "node_modules/@ember-data-types/graph": { + "version": "5.4.0-alpha.113", + "resolved": "https://registry.npmjs.org/@ember-data-types/graph/-/graph-5.4.0-alpha.113.tgz", + "integrity": "sha512-SfK7z7pShArMJJkCCelBFEsS7HHrkJWfGQzUjiSs09EdQWlodKaJLexfVFfvKw2C40xnx3QIYYDqpKIHaEgI9A==", + "dev": true + }, + "node_modules/@ember-data-types/json-api": { + "version": "5.4.0-alpha.113", + "resolved": "https://registry.npmjs.org/@ember-data-types/json-api/-/json-api-5.4.0-alpha.113.tgz", + "integrity": "sha512-tD05GxyJHTXAwbR+1ACt86hL0RmqZGaFsvsrQq5ko3r6dwYAwaTMBfJ6HRdSs3sNaN3A9o3AooB+F8bxUCuSGg==", + "dev": true + }, + "node_modules/@ember-data-types/legacy-compat": { + "version": "5.4.0-alpha.113", + "resolved": "https://registry.npmjs.org/@ember-data-types/legacy-compat/-/legacy-compat-5.4.0-alpha.113.tgz", + "integrity": "sha512-hcy2G/hFbqFJ8yP3altNHqXAU+QsafmDHfvCG3CyP2UhGTGXsh9P54F7jcBYT2x6g/34FSuBl5cIdfdSqGgNhA==", + "dev": true + }, + "node_modules/@ember-data-types/model": { + "version": "5.4.0-alpha.113", + "resolved": "https://registry.npmjs.org/@ember-data-types/model/-/model-5.4.0-alpha.113.tgz", + "integrity": "sha512-c8eGnArzHKkUYT9nvogSrDDkne/OVePiiQ/t5Na/64cn8hBW78ccUV6ylMK9rl2ZQvQN+eO6yEPbm6X6Z2+xBQ==", + "dev": true + }, + "node_modules/@ember-data-types/request": { + "version": "5.4.0-alpha.113", + "resolved": "https://registry.npmjs.org/@ember-data-types/request/-/request-5.4.0-alpha.113.tgz", + "integrity": "sha512-UNfujg0g0MT+Lo50qDa9Km1vgIUGulEtFyLL3pCvJy8fpynw4KN472HZLVH8DfRESpdHS9fXZQWqm7XKnQ99aQ==", + "dev": true + }, + "node_modules/@ember-data-types/request-utils": { + "version": "5.4.0-alpha.113", + "resolved": "https://registry.npmjs.org/@ember-data-types/request-utils/-/request-utils-5.4.0-alpha.113.tgz", + "integrity": "sha512-ZaOZJB8l3Yf97AXZJdvEpja1cVoQbv+Oz6fTLt7S1EnUDxSK7+hv9m3gEk1coFX5tYAp/SAxfnjWGO4sN75wmw==", + "dev": true + }, + "node_modules/@ember-data-types/serializer": { + "version": "5.4.0-alpha.113", + "resolved": "https://registry.npmjs.org/@ember-data-types/serializer/-/serializer-5.4.0-alpha.113.tgz", + "integrity": "sha512-8ZkjyPfLs6bYARtE+xJa5RZfwxY5kzkoRCuQ9xarTb+NjN0yn/jCeDW5AtHHqE2Swru44ZZp5e6kFGgZipJTBg==", + "dev": true + }, + "node_modules/@ember-data-types/store": { + "version": "5.4.0-alpha.113", + "resolved": "https://registry.npmjs.org/@ember-data-types/store/-/store-5.4.0-alpha.113.tgz", + "integrity": "sha512-pR2maUEtCQLxQ7VESfJ1/CP4AnmvtDYTXiK7I9+CtpV1WXazAZao2py7z4x9suY5qOgm1iY8bQ512AD2ZH5QGg==", + "dev": true + }, + "node_modules/@ember-data-types/tracking": { + "version": "5.4.0-alpha.113", + "resolved": "https://registry.npmjs.org/@ember-data-types/tracking/-/tracking-5.4.0-alpha.113.tgz", + "integrity": "sha512-adgreEYFso9v2+BLLfHyYTOhtufelYcaSil4Z+rO/KOy/LCPSRr55pxFlN4VY5EOLKDeGbp6MWHb+dHzU33J2Q==", + "dev": true + }, "node_modules/@ember-data/adapter": { "version": "4.11.3", "resolved": "https://registry.npmjs.org/@ember-data/adapter/-/adapter-4.11.3.tgz", @@ -11608,230 +11657,6 @@ "@types/node": "*" } }, - "node_modules/@types/ember": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/@types/ember/-/ember-4.0.11.tgz", - "integrity": "sha512-v7VIex0YILK8fP87LkIfzeeYKNnu74+xwf6U56v6MUDDGfSs9q/6NCxiUfwkxD+z5nQiUcwvfKVokX8qzZFRLw==", - "dev": true, - "dependencies": { - "@types/ember__application": "*", - "@types/ember__array": "*", - "@types/ember__component": "*", - "@types/ember__controller": "*", - "@types/ember__debug": "*", - "@types/ember__engine": "*", - "@types/ember__error": "*", - "@types/ember__object": "*", - "@types/ember__polyfills": "*", - "@types/ember__routing": "*", - "@types/ember__runloop": "*", - "@types/ember__service": "*", - "@types/ember__string": "*", - "@types/ember__template": "*", - "@types/ember__test": "*", - "@types/ember__utils": "*", - "@types/rsvp": "*" - } - }, - "node_modules/@types/ember__application": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/@types/ember__application/-/ember__application-4.0.11.tgz", - "integrity": "sha512-U1S7XW0V70nTWbFckWoraJbYGBJK69muP/CsPFLeAuUYHfkkDiwh1SfqgAUN9aHtrEJM5SuSYVYp2YsTI2yLuA==", - "dev": true, - "dependencies": { - "@glimmer/component": "^1.1.0", - "@types/ember": "*", - "@types/ember__engine": "*", - "@types/ember__object": "*", - "@types/ember__owner": "*", - "@types/ember__routing": "*" - } - }, - "node_modules/@types/ember__array": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@types/ember__array/-/ember__array-4.0.10.tgz", - "integrity": "sha512-UrhDbopLI3jB0MqV14y8yji2IuPNmeDrtT1PRYJL4CThLHrRkfeYyFvxqvrxWxn0wXKjbbjfH1gOe7BU57QrLQ==", - "dev": true, - "dependencies": { - "@types/ember": "*", - "@types/ember__object": "*" - } - }, - "node_modules/@types/ember__component": { - "version": "4.0.22", - "resolved": "https://registry.npmjs.org/@types/ember__component/-/ember__component-4.0.22.tgz", - "integrity": "sha512-m72EtmBN/RxOChXqRsyOg4RR5+AiB4LQ8s1CEKNYAfvANt18m4hjqxtA7QZYLTq2ZjEVJGpdMsrdDuONWjwRSQ==", - "dev": true, - "dependencies": { - "@types/ember": "*", - "@types/ember__object": "*" - } - }, - "node_modules/@types/ember__controller": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@types/ember__controller/-/ember__controller-4.0.12.tgz", - "integrity": "sha512-80rdnSC0UJBqoUX5/vkQcM2xkRdTPTvY0dPXEfY5cC5OZITbcSeRo5qa7ZGhgNBfH6XYyh55Lo/b811LwU3N9w==", - "dev": true, - "dependencies": { - "@types/ember__object": "*" - } - }, - "node_modules/@types/ember__debug": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@types/ember__debug/-/ember__debug-4.0.8.tgz", - "integrity": "sha512-9wF7STmDHDsUxSjyCq2lpMq/03QOPkBQMGJnV8yOBnVZxB6f+FJH/kxaCprdMkUe7iwAPNEC2zrFFx1tzH75Kg==", - "dev": true, - "dependencies": { - "@types/ember__object": "*", - "@types/ember__owner": "*" - } - }, - "node_modules/@types/ember__engine": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/@types/ember__engine/-/ember__engine-4.0.11.tgz", - "integrity": "sha512-ryR4Q1Xm3kQ3Ap58w10CxV3+vb3hs1cJqi7UZ5IlSdLRql7AbpS6hIjxSQ3EQ4zadeeJ6/D8JJcSwqR7eX3PFA==", - "dev": true, - "dependencies": { - "@types/ember__object": "*", - "@types/ember__owner": "*" - } - }, - "node_modules/@types/ember__error": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/ember__error/-/ember__error-4.0.6.tgz", - "integrity": "sha512-vYrLaGGjHkN14K89Vm8yqB2mkpJQefE5w7QJkkgYyV+smzns1vKlPbvuFevRtoeYNn4u4yY0JyF7HceNkm3H0Q==", - "dev": true - }, - "node_modules/@types/ember__object": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@types/ember__object/-/ember__object-4.0.12.tgz", - "integrity": "sha512-ZEpikPjZ02m1QCBiTPTayMJwVwF4UBlHlGDoScRB3IP/SUS1O5mmn1/CnSQDxzzF3ctfmhNuTZzVBBc1Y8OC1A==", - "dev": true, - "dependencies": { - "@types/ember": "*", - "@types/rsvp": "*" - } - }, - "node_modules/@types/ember__owner": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/ember__owner/-/ember__owner-4.0.9.tgz", - "integrity": "sha512-iyBda4aUIjBmeiKTKmPow/EJO7xWn8m85CnQTOCqQzTWJyJpgfObbXSHahOHXOfMm279Oa5NlbmS/EontB+XiQ==", - "dev": true - }, - "node_modules/@types/ember__polyfills": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/ember__polyfills/-/ember__polyfills-4.0.6.tgz", - "integrity": "sha512-hbds3Qv+oVm/QKIaY1E6atvrCoJTH/MPSl4swOhX6P0RiMB2fOfFCrFSD1mP1KrU1LqpHJ2Rzs7XLe53SWVzgw==", - "dev": true - }, - "node_modules/@types/ember__routing": { - "version": "4.0.22", - "resolved": "https://registry.npmjs.org/@types/ember__routing/-/ember__routing-4.0.22.tgz", - "integrity": "sha512-qLk9Vd2GMxdlGmX9xbzg4Farths+AQGzYDH901Wo2Nsre+Cwv1Tk1rbCiay2V3ICYZYufytdWT6V++DISF3nvw==", - "dev": true, - "dependencies": { - "@types/ember": "*", - "@types/ember__controller": "*", - "@types/ember__object": "*", - "@types/ember__service": "*" - } - }, - "node_modules/@types/ember__runloop": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@types/ember__runloop/-/ember__runloop-4.0.10.tgz", - "integrity": "sha512-9MZfOJBXuUP7RqLjovmzy1yY2xKTxVpqHMapqy6QJ8mjAekRmq9IJ+ni2zJ5CWftyb3Lqu3Eks05CL7fnbhcJA==", - "dev": true, - "dependencies": { - "@types/ember": "*" - } - }, - "node_modules/@types/ember__service": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/ember__service/-/ember__service-4.0.9.tgz", - "integrity": "sha512-DrepocL/4hH5YxbDWbxEKMDcAchBPSGGa4g+LEINW1Po81RmSdKw5GZV4UO0mvRWgkdu3EbWUxbTzB4gmbDSeQ==", - "dev": true, - "dependencies": { - "@types/ember__object": "*" - } - }, - "node_modules/@types/ember__string": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@types/ember__string/-/ember__string-3.0.15.tgz", - "integrity": "sha512-SxoaweAJUJKSIt82clIwpi/Fm0IfeisozLnXthnBp/hE2JyVcnOb1wMIbw0CCfzercmyWG1njV45VBqy8SrLDQ==", - "dev": true - }, - "node_modules/@types/ember__template": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@types/ember__template/-/ember__template-4.0.7.tgz", - "integrity": "sha512-jv4hhG+8d1zdma+jhbCdJ3Ak7C22YNatGyWWvB3N9zbXq358AAPXaJoyNY8QTDbD/RIR9P6yoRk4u9vLbF6zfA==", - "dev": true - }, - "node_modules/@types/ember__test": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/ember__test/-/ember__test-4.0.6.tgz", - "integrity": "sha512-Nswm/epfTepXknT8scZvWyyop1aqJcZcyzY4THGHFcXvYQQfA9rgmgrx6vo9vCJmYHh3jm0TTAIAIfoCvGaX5g==", - "dev": true, - "dependencies": { - "@types/ember__application": "*" - } - }, - "node_modules/@types/ember__utils": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@types/ember__utils/-/ember__utils-4.0.7.tgz", - "integrity": "sha512-qQPBeWRyIPigKnZ68POlkqI5e6XA78Q4G3xHo687wQTcEtfoL/iZyPC4hn70mdijcZq8Hjch2Y3E5yhsEMzK+g==", - "dev": true, - "dependencies": { - "@types/ember": "*" - } - }, - "node_modules/@types/ember-data": { - "version": "4.4.16", - "resolved": "https://registry.npmjs.org/@types/ember-data/-/ember-data-4.4.16.tgz", - "integrity": "sha512-plFqPkgw7n4YlkzvApkQAIhvvYTERlx8PeI2J5gSFtMtsKuoaIo8fXm4w22ZdBQtTzeh/kwvpO2WY8R/d5Ttfg==", - "dev": true, - "dependencies": { - "@types/ember": "*", - "@types/ember__error": "*", - "@types/ember__object": "*", - "@types/rsvp": "*" - } - }, - "node_modules/@types/ember-data__adapter": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/ember-data__adapter/-/ember-data__adapter-4.0.6.tgz", - "integrity": "sha512-vSrx1cqz8jO0cBYwu98SrwFk5s722C+BGpw++NregwQio3g9VbNoymx+HsYeXvsWvGUsoRewxu9K7TwAOJSsvw==", - "dev": true, - "dependencies": { - "@types/ember-data": "*" - } - }, - "node_modules/@types/ember-data__model": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/ember-data__model/-/ember-data__model-4.0.5.tgz", - "integrity": "sha512-zyfHh3tQiMdpbPZ1/RFxi4m9TdwsZxDmVY0e7V1UYp7pWvm/DeqEXqoy3WS9xa/O01xoJFpQtJHyasdXvVTfbg==", - "dev": true, - "dependencies": { - "@types/ember-data": "*" - } - }, - "node_modules/@types/ember-data__serializer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/ember-data__serializer/-/ember-data__serializer-4.0.6.tgz", - "integrity": "sha512-ebxxySSvTiay1/hgN4fElahSuL0MX+1sMMwx/RQyy7z98ifV8wafW62BwlYtbH44aeTIdcaSBE2pm3R1aP2yUA==", - "dev": true, - "dependencies": { - "@types/ember-data": "*" - } - }, - "node_modules/@types/ember-data__store": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@types/ember-data__store/-/ember-data__store-4.0.7.tgz", - "integrity": "sha512-0S3Etr32i4aGvhXhZM6CXaosvX8E6c+RCx8pCxUXVdn+SmICm8jqFXsDC6Gnqq4bJeTkf9cglqz46prOVR1Tcg==", - "dev": true, - "dependencies": { - "@types/ember-data": "*" - } - }, "node_modules/@types/eslint": { "version": "8.56.10", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", @@ -12247,6 +12072,12 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, + "node_modules/@warp-drive-types/core-types": { + "version": "0.0.0-alpha.99", + "resolved": "https://registry.npmjs.org/@warp-drive-types/core-types/-/core-types-0.0.0-alpha.99.tgz", + "integrity": "sha512-q+drvSsY5U4mwrWA59N4bl1104vjXzCCKuxO6Jppah6DDq848J5q4YgN8sN4p8JAWVD8dZs9I6v1BMquQr0y3g==", + "dev": true + }, "node_modules/@webassemblyjs/ast": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", @@ -22284,6 +22115,12 @@ "@ember/string": "^3.0.1" } }, + "node_modules/ember-data-types": { + "version": "5.4.0-alpha.113", + "resolved": "https://registry.npmjs.org/ember-data-types/-/ember-data-types-5.4.0-alpha.113.tgz", + "integrity": "sha512-5JvxDlBAt8Zr46M7h8ByC99eKP0ul84z6aFKLMF7K+REie9gv6Sbdf8WfMO3cxwxdN3Xl7plauJ0mWXI5mH5qQ==", + "dev": true + }, "node_modules/ember-data/node_modules/@types/fs-extra": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.1.0.tgz", @@ -55058,6 +54895,66 @@ "dev": true, "requires": {} }, + "@ember-data-types/adapter": { + "version": "5.4.0-alpha.113", + "resolved": "https://registry.npmjs.org/@ember-data-types/adapter/-/adapter-5.4.0-alpha.113.tgz", + "integrity": "sha512-46u4mZGRBCXujaHeWSpjz8yb/wMoIiTj031rh3HAf1PbGh6h/+qky8uVUE+f7gQls0ANfjS8ZoXCFEY/txM/og==", + "dev": true + }, + "@ember-data-types/graph": { + "version": "5.4.0-alpha.113", + "resolved": "https://registry.npmjs.org/@ember-data-types/graph/-/graph-5.4.0-alpha.113.tgz", + "integrity": "sha512-SfK7z7pShArMJJkCCelBFEsS7HHrkJWfGQzUjiSs09EdQWlodKaJLexfVFfvKw2C40xnx3QIYYDqpKIHaEgI9A==", + "dev": true + }, + "@ember-data-types/json-api": { + "version": "5.4.0-alpha.113", + "resolved": "https://registry.npmjs.org/@ember-data-types/json-api/-/json-api-5.4.0-alpha.113.tgz", + "integrity": "sha512-tD05GxyJHTXAwbR+1ACt86hL0RmqZGaFsvsrQq5ko3r6dwYAwaTMBfJ6HRdSs3sNaN3A9o3AooB+F8bxUCuSGg==", + "dev": true + }, + "@ember-data-types/legacy-compat": { + "version": "5.4.0-alpha.113", + "resolved": "https://registry.npmjs.org/@ember-data-types/legacy-compat/-/legacy-compat-5.4.0-alpha.113.tgz", + "integrity": "sha512-hcy2G/hFbqFJ8yP3altNHqXAU+QsafmDHfvCG3CyP2UhGTGXsh9P54F7jcBYT2x6g/34FSuBl5cIdfdSqGgNhA==", + "dev": true + }, + "@ember-data-types/model": { + "version": "5.4.0-alpha.113", + "resolved": "https://registry.npmjs.org/@ember-data-types/model/-/model-5.4.0-alpha.113.tgz", + "integrity": "sha512-c8eGnArzHKkUYT9nvogSrDDkne/OVePiiQ/t5Na/64cn8hBW78ccUV6ylMK9rl2ZQvQN+eO6yEPbm6X6Z2+xBQ==", + "dev": true + }, + "@ember-data-types/request": { + "version": "5.4.0-alpha.113", + "resolved": "https://registry.npmjs.org/@ember-data-types/request/-/request-5.4.0-alpha.113.tgz", + "integrity": "sha512-UNfujg0g0MT+Lo50qDa9Km1vgIUGulEtFyLL3pCvJy8fpynw4KN472HZLVH8DfRESpdHS9fXZQWqm7XKnQ99aQ==", + "dev": true + }, + "@ember-data-types/request-utils": { + "version": "5.4.0-alpha.113", + "resolved": "https://registry.npmjs.org/@ember-data-types/request-utils/-/request-utils-5.4.0-alpha.113.tgz", + "integrity": "sha512-ZaOZJB8l3Yf97AXZJdvEpja1cVoQbv+Oz6fTLt7S1EnUDxSK7+hv9m3gEk1coFX5tYAp/SAxfnjWGO4sN75wmw==", + "dev": true + }, + "@ember-data-types/serializer": { + "version": "5.4.0-alpha.113", + "resolved": "https://registry.npmjs.org/@ember-data-types/serializer/-/serializer-5.4.0-alpha.113.tgz", + "integrity": "sha512-8ZkjyPfLs6bYARtE+xJa5RZfwxY5kzkoRCuQ9xarTb+NjN0yn/jCeDW5AtHHqE2Swru44ZZp5e6kFGgZipJTBg==", + "dev": true + }, + "@ember-data-types/store": { + "version": "5.4.0-alpha.113", + "resolved": "https://registry.npmjs.org/@ember-data-types/store/-/store-5.4.0-alpha.113.tgz", + "integrity": "sha512-pR2maUEtCQLxQ7VESfJ1/CP4AnmvtDYTXiK7I9+CtpV1WXazAZao2py7z4x9suY5qOgm1iY8bQ512AD2ZH5QGg==", + "dev": true + }, + "@ember-data-types/tracking": { + "version": "5.4.0-alpha.113", + "resolved": "https://registry.npmjs.org/@ember-data-types/tracking/-/tracking-5.4.0-alpha.113.tgz", + "integrity": "sha512-adgreEYFso9v2+BLLfHyYTOhtufelYcaSil4Z+rO/KOy/LCPSRr55pxFlN4VY5EOLKDeGbp6MWHb+dHzU33J2Q==", + "dev": true + }, "@ember-data/adapter": { "version": "4.11.3", "resolved": "https://registry.npmjs.org/@ember-data/adapter/-/adapter-4.11.3.tgz", @@ -62997,230 +62894,6 @@ "@types/node": "*" } }, - "@types/ember": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/@types/ember/-/ember-4.0.11.tgz", - "integrity": "sha512-v7VIex0YILK8fP87LkIfzeeYKNnu74+xwf6U56v6MUDDGfSs9q/6NCxiUfwkxD+z5nQiUcwvfKVokX8qzZFRLw==", - "dev": true, - "requires": { - "@types/ember__application": "*", - "@types/ember__array": "*", - "@types/ember__component": "*", - "@types/ember__controller": "*", - "@types/ember__debug": "*", - "@types/ember__engine": "*", - "@types/ember__error": "*", - "@types/ember__object": "*", - "@types/ember__polyfills": "*", - "@types/ember__routing": "*", - "@types/ember__runloop": "*", - "@types/ember__service": "*", - "@types/ember__string": "*", - "@types/ember__template": "*", - "@types/ember__test": "*", - "@types/ember__utils": "*", - "@types/rsvp": "*" - } - }, - "@types/ember__application": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/@types/ember__application/-/ember__application-4.0.11.tgz", - "integrity": "sha512-U1S7XW0V70nTWbFckWoraJbYGBJK69muP/CsPFLeAuUYHfkkDiwh1SfqgAUN9aHtrEJM5SuSYVYp2YsTI2yLuA==", - "dev": true, - "requires": { - "@glimmer/component": "^1.1.0", - "@types/ember": "*", - "@types/ember__engine": "*", - "@types/ember__object": "*", - "@types/ember__owner": "*", - "@types/ember__routing": "*" - } - }, - "@types/ember__array": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@types/ember__array/-/ember__array-4.0.10.tgz", - "integrity": "sha512-UrhDbopLI3jB0MqV14y8yji2IuPNmeDrtT1PRYJL4CThLHrRkfeYyFvxqvrxWxn0wXKjbbjfH1gOe7BU57QrLQ==", - "dev": true, - "requires": { - "@types/ember": "*", - "@types/ember__object": "*" - } - }, - "@types/ember__component": { - "version": "4.0.22", - "resolved": "https://registry.npmjs.org/@types/ember__component/-/ember__component-4.0.22.tgz", - "integrity": "sha512-m72EtmBN/RxOChXqRsyOg4RR5+AiB4LQ8s1CEKNYAfvANt18m4hjqxtA7QZYLTq2ZjEVJGpdMsrdDuONWjwRSQ==", - "dev": true, - "requires": { - "@types/ember": "*", - "@types/ember__object": "*" - } - }, - "@types/ember__controller": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@types/ember__controller/-/ember__controller-4.0.12.tgz", - "integrity": "sha512-80rdnSC0UJBqoUX5/vkQcM2xkRdTPTvY0dPXEfY5cC5OZITbcSeRo5qa7ZGhgNBfH6XYyh55Lo/b811LwU3N9w==", - "dev": true, - "requires": { - "@types/ember__object": "*" - } - }, - "@types/ember__debug": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@types/ember__debug/-/ember__debug-4.0.8.tgz", - "integrity": "sha512-9wF7STmDHDsUxSjyCq2lpMq/03QOPkBQMGJnV8yOBnVZxB6f+FJH/kxaCprdMkUe7iwAPNEC2zrFFx1tzH75Kg==", - "dev": true, - "requires": { - "@types/ember__object": "*", - "@types/ember__owner": "*" - } - }, - "@types/ember__engine": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/@types/ember__engine/-/ember__engine-4.0.11.tgz", - "integrity": "sha512-ryR4Q1Xm3kQ3Ap58w10CxV3+vb3hs1cJqi7UZ5IlSdLRql7AbpS6hIjxSQ3EQ4zadeeJ6/D8JJcSwqR7eX3PFA==", - "dev": true, - "requires": { - "@types/ember__object": "*", - "@types/ember__owner": "*" - } - }, - "@types/ember__error": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/ember__error/-/ember__error-4.0.6.tgz", - "integrity": "sha512-vYrLaGGjHkN14K89Vm8yqB2mkpJQefE5w7QJkkgYyV+smzns1vKlPbvuFevRtoeYNn4u4yY0JyF7HceNkm3H0Q==", - "dev": true - }, - "@types/ember__object": { - "version": "4.0.12", - "resolved": "https://registry.npmjs.org/@types/ember__object/-/ember__object-4.0.12.tgz", - "integrity": "sha512-ZEpikPjZ02m1QCBiTPTayMJwVwF4UBlHlGDoScRB3IP/SUS1O5mmn1/CnSQDxzzF3ctfmhNuTZzVBBc1Y8OC1A==", - "dev": true, - "requires": { - "@types/ember": "*", - "@types/rsvp": "*" - } - }, - "@types/ember__owner": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/ember__owner/-/ember__owner-4.0.9.tgz", - "integrity": "sha512-iyBda4aUIjBmeiKTKmPow/EJO7xWn8m85CnQTOCqQzTWJyJpgfObbXSHahOHXOfMm279Oa5NlbmS/EontB+XiQ==", - "dev": true - }, - "@types/ember__polyfills": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/ember__polyfills/-/ember__polyfills-4.0.6.tgz", - "integrity": "sha512-hbds3Qv+oVm/QKIaY1E6atvrCoJTH/MPSl4swOhX6P0RiMB2fOfFCrFSD1mP1KrU1LqpHJ2Rzs7XLe53SWVzgw==", - "dev": true - }, - "@types/ember__routing": { - "version": "4.0.22", - "resolved": "https://registry.npmjs.org/@types/ember__routing/-/ember__routing-4.0.22.tgz", - "integrity": "sha512-qLk9Vd2GMxdlGmX9xbzg4Farths+AQGzYDH901Wo2Nsre+Cwv1Tk1rbCiay2V3ICYZYufytdWT6V++DISF3nvw==", - "dev": true, - "requires": { - "@types/ember": "*", - "@types/ember__controller": "*", - "@types/ember__object": "*", - "@types/ember__service": "*" - } - }, - "@types/ember__runloop": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@types/ember__runloop/-/ember__runloop-4.0.10.tgz", - "integrity": "sha512-9MZfOJBXuUP7RqLjovmzy1yY2xKTxVpqHMapqy6QJ8mjAekRmq9IJ+ni2zJ5CWftyb3Lqu3Eks05CL7fnbhcJA==", - "dev": true, - "requires": { - "@types/ember": "*" - } - }, - "@types/ember__service": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/ember__service/-/ember__service-4.0.9.tgz", - "integrity": "sha512-DrepocL/4hH5YxbDWbxEKMDcAchBPSGGa4g+LEINW1Po81RmSdKw5GZV4UO0mvRWgkdu3EbWUxbTzB4gmbDSeQ==", - "dev": true, - "requires": { - "@types/ember__object": "*" - } - }, - "@types/ember__string": { - "version": "3.0.15", - "resolved": "https://registry.npmjs.org/@types/ember__string/-/ember__string-3.0.15.tgz", - "integrity": "sha512-SxoaweAJUJKSIt82clIwpi/Fm0IfeisozLnXthnBp/hE2JyVcnOb1wMIbw0CCfzercmyWG1njV45VBqy8SrLDQ==", - "dev": true - }, - "@types/ember__template": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@types/ember__template/-/ember__template-4.0.7.tgz", - "integrity": "sha512-jv4hhG+8d1zdma+jhbCdJ3Ak7C22YNatGyWWvB3N9zbXq358AAPXaJoyNY8QTDbD/RIR9P6yoRk4u9vLbF6zfA==", - "dev": true - }, - "@types/ember__test": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/ember__test/-/ember__test-4.0.6.tgz", - "integrity": "sha512-Nswm/epfTepXknT8scZvWyyop1aqJcZcyzY4THGHFcXvYQQfA9rgmgrx6vo9vCJmYHh3jm0TTAIAIfoCvGaX5g==", - "dev": true, - "requires": { - "@types/ember__application": "*" - } - }, - "@types/ember__utils": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@types/ember__utils/-/ember__utils-4.0.7.tgz", - "integrity": "sha512-qQPBeWRyIPigKnZ68POlkqI5e6XA78Q4G3xHo687wQTcEtfoL/iZyPC4hn70mdijcZq8Hjch2Y3E5yhsEMzK+g==", - "dev": true, - "requires": { - "@types/ember": "*" - } - }, - "@types/ember-data": { - "version": "4.4.16", - "resolved": "https://registry.npmjs.org/@types/ember-data/-/ember-data-4.4.16.tgz", - "integrity": "sha512-plFqPkgw7n4YlkzvApkQAIhvvYTERlx8PeI2J5gSFtMtsKuoaIo8fXm4w22ZdBQtTzeh/kwvpO2WY8R/d5Ttfg==", - "dev": true, - "requires": { - "@types/ember": "*", - "@types/ember__error": "*", - "@types/ember__object": "*", - "@types/rsvp": "*" - } - }, - "@types/ember-data__adapter": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/ember-data__adapter/-/ember-data__adapter-4.0.6.tgz", - "integrity": "sha512-vSrx1cqz8jO0cBYwu98SrwFk5s722C+BGpw++NregwQio3g9VbNoymx+HsYeXvsWvGUsoRewxu9K7TwAOJSsvw==", - "dev": true, - "requires": { - "@types/ember-data": "*" - } - }, - "@types/ember-data__model": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/ember-data__model/-/ember-data__model-4.0.5.tgz", - "integrity": "sha512-zyfHh3tQiMdpbPZ1/RFxi4m9TdwsZxDmVY0e7V1UYp7pWvm/DeqEXqoy3WS9xa/O01xoJFpQtJHyasdXvVTfbg==", - "dev": true, - "requires": { - "@types/ember-data": "*" - } - }, - "@types/ember-data__serializer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/ember-data__serializer/-/ember-data__serializer-4.0.6.tgz", - "integrity": "sha512-ebxxySSvTiay1/hgN4fElahSuL0MX+1sMMwx/RQyy7z98ifV8wafW62BwlYtbH44aeTIdcaSBE2pm3R1aP2yUA==", - "dev": true, - "requires": { - "@types/ember-data": "*" - } - }, - "@types/ember-data__store": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@types/ember-data__store/-/ember-data__store-4.0.7.tgz", - "integrity": "sha512-0S3Etr32i4aGvhXhZM6CXaosvX8E6c+RCx8pCxUXVdn+SmICm8jqFXsDC6Gnqq4bJeTkf9cglqz46prOVR1Tcg==", - "dev": true, - "requires": { - "@types/ember-data": "*" - } - }, "@types/eslint": { "version": "8.56.10", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", @@ -63539,6 +63212,12 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, + "@warp-drive-types/core-types": { + "version": "0.0.0-alpha.99", + "resolved": "https://registry.npmjs.org/@warp-drive-types/core-types/-/core-types-0.0.0-alpha.99.tgz", + "integrity": "sha512-q+drvSsY5U4mwrWA59N4bl1104vjXzCCKuxO6Jppah6DDq848J5q4YgN8sN4p8JAWVD8dZs9I6v1BMquQr0y3g==", + "dev": true + }, "@webassemblyjs/ast": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", @@ -72251,6 +71930,12 @@ } } }, + "ember-data-types": { + "version": "5.4.0-alpha.113", + "resolved": "https://registry.npmjs.org/ember-data-types/-/ember-data-types-5.4.0-alpha.113.tgz", + "integrity": "sha512-5JvxDlBAt8Zr46M7h8ByC99eKP0ul84z6aFKLMF7K+REie9gv6Sbdf8WfMO3cxwxdN3Xl7plauJ0mWXI5mH5qQ==", + "dev": true + }, "ember-fetch": { "version": "8.1.2", "resolved": "https://registry.npmjs.org/ember-fetch/-/ember-fetch-8.1.2.tgz", diff --git a/package.json b/package.json index c2fb9dcc..83f23493 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,16 @@ "ember-cli-typescript": "^4.2.1" }, "devDependencies": { + "@ember-data-types/adapter": "5.4.0-alpha.113", + "@ember-data-types/graph": "5.4.0-alpha.113", + "@ember-data-types/json-api": "5.4.0-alpha.113", + "@ember-data-types/legacy-compat": "5.4.0-alpha.113", + "@ember-data-types/model": "5.4.0-alpha.113", + "@ember-data-types/request": "5.4.0-alpha.113", + "@ember-data-types/request-utils": "5.4.0-alpha.113", + "@ember-data-types/serializer": "5.4.0-alpha.113", + "@ember-data-types/store": "5.4.0-alpha.113", + "@ember-data-types/tracking": "5.4.0-alpha.113", "@ember/optional-features": "^2.1.0", "@ember/string": "^3.1.1", "@ember/test-helpers": "^3.2.0", @@ -48,35 +58,13 @@ "@glimmer/component": "^1.1.2", "@glimmer/tracking": "^1.1.2", "@tsconfig/ember": "^3.0.8", - "@types/ember": "^4.0.11", - "@types/ember__application": "^4.0.11", - "@types/ember__array": "^4.0.10", - "@types/ember__component": "^4.0.22", - "@types/ember__controller": "^4.0.12", - "@types/ember__debug": "^4.0.8", - "@types/ember__engine": "^4.0.11", - "@types/ember__error": "^4.0.6", - "@types/ember__object": "^4.0.12", - "@types/ember__owner": "^4.0.9", - "@types/ember__polyfills": "^4.0.6", - "@types/ember__routing": "^4.0.22", - "@types/ember__runloop": "^4.0.10", - "@types/ember__service": "^4.0.9", - "@types/ember__string": "^3.0.15", - "@types/ember__template": "^4.0.7", - "@types/ember__test": "^4.0.6", - "@types/ember__utils": "^4.0.7", - "@types/ember-data": "^4.4.16", - "@types/ember-data__adapter": "^4.0.6", - "@types/ember-data__model": "^4.0.5", - "@types/ember-data__serializer": "^4.0.6", - "@types/ember-data__store": "^4.0.7", "@types/node": "^20.14.2", "@types/qunit": "^2.19.10", "@types/rsvp": "^4.0.9", "@types/sinon": "^17.0.3", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", + "@warp-drive-types/core-types": "0.0.0-alpha.99", "broccoli-asset-rev": "^3.0.0", "concurrently": "^8.2.2", "ember-cli": "~5.4.2", @@ -88,6 +76,7 @@ "ember-cli-terser": "^4.0.2", "ember-cli-typescript-blueprints": "^3.0.0", "ember-data": "~4.11.2", + "ember-data-types": "5.4.0-alpha.113", "ember-fetch": "^8.1.2", "ember-load-initializers": "^2.1.2", "ember-page-title": "^8.0.0", diff --git a/tests/dummy/app/adapters/application.ts b/tests/dummy/app/adapters/application.ts index fb6c060f..852d75f3 100644 --- a/tests/dummy/app/adapters/application.ts +++ b/tests/dummy/app/adapters/application.ts @@ -1,10 +1,3 @@ import CloudFirestoreAdapter from 'ember-cloud-firestore-adapter/adapters/cloud-firestore-modular'; export default class ApplicationAdapter extends CloudFirestoreAdapter {} - -// DO NOT DELETE: this is how TypeScript knows how to look up your adapters. -declare module 'ember-data/types/registries/adapter' { - export default interface AdapterRegistry { - application: ApplicationAdapter; - } -} diff --git a/tests/dummy/app/controllers/features.ts b/tests/dummy/app/controllers/features.ts index dfb6f0f3..4c1b1a54 100644 --- a/tests/dummy/app/controllers/features.ts +++ b/tests/dummy/app/controllers/features.ts @@ -13,6 +13,7 @@ import { where, } from 'ember-cloud-firestore-adapter/firebase/firestore'; import UserModel from '../models/user'; +import PostModel from '../models/post'; export default class FeaturesController extends Controller { @service @@ -24,7 +25,7 @@ export default class FeaturesController extends Controller { @action public async handleCreateRecordWithIdClick(): Promise { const user = await this.store - .createRecord('user', { + .createRecord('user', { id: 'new', name: 'new_user_created_with_id', age: 25, @@ -37,7 +38,7 @@ export default class FeaturesController extends Controller { @action public async handleCreateRecordWithoutIdClick(): Promise { const user = await this.store - .createRecord('user', { + .createRecord('user', { name: 'new_user_created_without_id', age: 30, }) @@ -48,9 +49,9 @@ export default class FeaturesController extends Controller { @action public async handleCreateRecordWithoutBelongsToRelationship(): Promise { - const user = await this.store.findRecord('user', 'user_a'); + const user = await this.store.findRecord('user', 'user_a'); const post = await this.store - .createRecord('post', { + .createRecord('post', { // No belongs to relationship for Group model author: user, title: 'What does having it all mean to you? (By: Gabe Lewis)', @@ -58,14 +59,14 @@ export default class FeaturesController extends Controller { .save(); const author = await post.get('author'); - this.users = [author]; + this.users = [author!]; } @action public async handleCreateRecordWithBelongsToBuildReference(): Promise { - const user = await this.store.findRecord('user', 'user_a'); + const user = await this.store.findRecord('user', 'user_a'); const post = await this.store - .createRecord('post', { + .createRecord('post', { id: 'new_post', publisher: user, title: 'What does having it all mean to you? (By: Gabe Lewis)', @@ -73,12 +74,12 @@ export default class FeaturesController extends Controller { .save(); const publisher = await post.get('publisher'); - this.users = [publisher]; + this.users = [publisher!]; } @action public async handleUpdateRecordClick(): Promise { - const user = await this.store.findRecord('user', 'user_a'); + const user = await this.store.findRecord('user', 'user_a'); user.set('name', 'updated_user'); @@ -89,9 +90,8 @@ export default class FeaturesController extends Controller { @action public async handleDeleteRecordClick(): Promise { - const users = await this.store.findAll('user'); - // @ts-expect-error array proxy is indeed indexable - const user = users[0]; + const users = await this.store.findAll('user'); + const [user] = users; await user?.destroyRecord(); @@ -100,21 +100,21 @@ export default class FeaturesController extends Controller { @action public async handleFindAllClick(): Promise { - const users = await this.store.findAll('user'); + const users = await this.store.findAll('user'); this.users = users; } @action public async handleFindRecordClick(): Promise { - const user = await this.store.findRecord('user', 'user_a'); + const user = await this.store.findRecord('user', 'user_a'); this.users = [user]; } @action public async handleQuery1Click(): Promise { - const users = await this.store.query('user', { + const users = await this.store.query('user', { buildReference(db: Firestore) { return collection(db, 'users'); }, @@ -129,7 +129,7 @@ export default class FeaturesController extends Controller { @action public async handleQuery2Click(): Promise { - const users = await this.store.query('user', { + const users = await this.store.query('user', { buildReference(db: Firestore) { return collection(db, 'users/user_a/foobar'); }, diff --git a/tests/dummy/app/models/group.ts b/tests/dummy/app/models/group.ts index 7addd324..196279ec 100644 --- a/tests/dummy/app/models/group.ts +++ b/tests/dummy/app/models/group.ts @@ -3,8 +3,8 @@ import/no-cycle: off, */ -import DS from 'ember-data'; -import Model, { attr, hasMany } from '@ember-data/model'; +import Model, { attr, hasMany, type AsyncHasMany } from '@ember-data/model'; +import { Type } from '@warp-drive/core-types/symbols'; import { Query } from 'firebase/firestore'; @@ -17,7 +17,7 @@ export default class GroupModel extends Model { public declare name: string; @hasMany('user', { async: true, inverse: 'groups' }) - public declare members: DS.PromiseManyArray; + public declare members: AsyncHasMany; @hasMany('post', { async: true, @@ -28,12 +28,7 @@ export default class GroupModel extends Model { return query(reference, limit(1)); }, }) - public declare posts: DS.PromiseManyArray; -} + public declare posts: AsyncHasMany; -// DO NOT DELETE: this is how TypeScript knows how to look up your models. -declare module 'ember-data/types/registries/model' { - export default interface ModelRegistry { - group: GroupModel; - } + declare [Type]: 'group'; } diff --git a/tests/dummy/app/models/post.ts b/tests/dummy/app/models/post.ts index 6357f70c..372eda90 100644 --- a/tests/dummy/app/models/post.ts +++ b/tests/dummy/app/models/post.ts @@ -3,8 +3,8 @@ import/no-cycle: off, */ -import DS from 'ember-data'; -import Model, { attr, belongsTo } from '@ember-data/model'; +import Model, { attr, belongsTo, type AsyncBelongsTo } from '@ember-data/model'; +import { Type } from '@warp-drive/core-types/symbols'; import { Firestore } from 'firebase/firestore'; @@ -21,10 +21,10 @@ export default class PostModel extends Model { public declare createdOn: TimestampTransform; @belongsTo('user', { async: true, inverse: 'posts' }) - public declare author: DS.PromiseObject; + public declare author: AsyncBelongsTo; @belongsTo('group', { async: true, inverse: 'posts' }) - public declare group: DS.PromiseObject; + public declare group: AsyncBelongsTo; @belongsTo('user', { async: true, @@ -34,12 +34,7 @@ export default class PostModel extends Model { return collection(db, 'publishers'); }, }) - public declare publisher: DS.PromiseObject; -} + public declare publisher: AsyncBelongsTo; -// DO NOT DELETE: this is how TypeScript knows how to look up your models. -declare module 'ember-data/types/registries/model' { - export default interface ModelRegistry { - post: PostModel; - } + declare [Type]: 'post'; } diff --git a/tests/dummy/app/models/user.ts b/tests/dummy/app/models/user.ts index f644532f..a41dd49c 100644 --- a/tests/dummy/app/models/user.ts +++ b/tests/dummy/app/models/user.ts @@ -3,8 +3,8 @@ import/no-cycle: off, */ -import DS from 'ember-data'; -import Model, { attr, hasMany } from '@ember-data/model'; +import Model, { attr, hasMany, type AsyncHasMany } from '@ember-data/model'; +import { Type } from '@warp-drive/core-types/symbols'; import GroupModel from './group'; import PostModel from './post'; @@ -13,16 +13,14 @@ export default class UserModel extends Model { @attr('string') public declare name: string; + @attr('number') + public declare age: number; + @hasMany('group', { async: true, inverse: 'members' }) - public declare groups: DS.PromiseManyArray; + public declare groups: AsyncHasMany; @hasMany('post', { async: true, inverse: 'author' }) - public declare posts: DS.PromiseManyArray; -} + public declare posts: AsyncHasMany; -// DO NOT DELETE: this is how TypeScript knows how to look up your models. -declare module 'ember-data/types/registries/model' { - export default interface ModelRegistry { - user: UserModel; - } + declare [Type]: 'user'; } diff --git a/tests/dummy/app/routes/create-record.ts b/tests/dummy/app/routes/create-record.ts index bedc1fcb..c344867f 100644 --- a/tests/dummy/app/routes/create-record.ts +++ b/tests/dummy/app/routes/create-record.ts @@ -3,17 +3,19 @@ import Route from '@ember/routing/route'; import Store from '@ember-data/store'; import PostModel from '../models/post'; +import GroupModel from '../models/group'; +import UserModel from '../models/user'; export default class CreateRecordRoute extends Route { @service public declare store: Store; public async model(): Promise { - const group = await this.store.findRecord('group', 'group_a'); - const author = await this.store.findRecord('user', 'user_a'); + const group = await this.store.findRecord('group', 'group_a'); + const author = await this.store.findRecord('user', 'user_a'); return this.store - .createRecord('post', { + .createRecord('post', { author, group, title: 'What does having it all mean to you? (By: Gabe Lewis)', diff --git a/tests/dummy/app/routes/delete-record.ts b/tests/dummy/app/routes/delete-record.ts index 29b7c54e..a362f190 100644 --- a/tests/dummy/app/routes/delete-record.ts +++ b/tests/dummy/app/routes/delete-record.ts @@ -2,12 +2,16 @@ import { service } from '@ember/service'; import Route from '@ember/routing/route'; import Store from '@ember-data/store'; +import UserModel from '../models/user'; + export default class DeleteRecordRoute extends Route { @service public declare store: Store; public async beforeModel(): Promise { - const record = this.store.createRecord('user', { name: 'To be deleted' }); + const record = this.store.createRecord('user', { + name: 'To be deleted', + }); await record.save(); await record.destroyRecord(); diff --git a/tests/dummy/app/routes/find-all.ts b/tests/dummy/app/routes/find-all.ts index 486fd7d4..10de2625 100644 --- a/tests/dummy/app/routes/find-all.ts +++ b/tests/dummy/app/routes/find-all.ts @@ -1,5 +1,4 @@ import { service } from '@ember/service'; -import ArrayProxy from '@ember/array/proxy'; import Route from '@ember/routing/route'; import Store from '@ember-data/store'; @@ -9,7 +8,7 @@ export default class FindAllRoute extends Route { @service public declare store: Store; - public async model(): Promise> { - return this.store.findAll('group'); + public async model(): Promise { + return this.store.findAll('group'); } } diff --git a/tests/dummy/app/routes/find-record.ts b/tests/dummy/app/routes/find-record.ts index 735fdac1..18ef968f 100644 --- a/tests/dummy/app/routes/find-record.ts +++ b/tests/dummy/app/routes/find-record.ts @@ -9,7 +9,7 @@ export default class FindRecordRoute extends Route { public declare store: Store; public async model(): Promise { - return this.store.findRecord('group', 'group_a', { + return this.store.findRecord('group', 'group_a', { adapterOptions: { isRealtime: true, }, diff --git a/tests/dummy/app/routes/query.ts b/tests/dummy/app/routes/query.ts index 910ab594..767a4f41 100644 --- a/tests/dummy/app/routes/query.ts +++ b/tests/dummy/app/routes/query.ts @@ -1,5 +1,5 @@ import { service } from '@ember/service'; -import ArrayProxy from '@ember/array/proxy'; +import { Collection } from '@ember-data/store/-private/record-arrays/identifier-array'; import Route from '@ember/routing/route'; import Store from '@ember-data/store'; @@ -17,8 +17,8 @@ export default class QueryRoute extends Route { @service public declare store: Store; - public async model(): Promise> { - return this.store.query('group', { + public async model(): Promise> { + return this.store.query('group', { isRealtime: true, filter(reference: CollectionReference) { return query(reference, orderBy('name'), limit(1)); diff --git a/tests/dummy/app/routes/update-record.ts b/tests/dummy/app/routes/update-record.ts index da0d5046..384474c7 100644 --- a/tests/dummy/app/routes/update-record.ts +++ b/tests/dummy/app/routes/update-record.ts @@ -9,7 +9,7 @@ export default class UpdateRecordRoute extends Route { public declare store: Store; public async model(params: { title: string }): Promise { - const post = await this.store.findRecord('post', 'post_a'); + const post = await this.store.findRecord('post', 'post_a'); post.set('title', params.title); await post.save(); diff --git a/tests/dummy/app/serializers/application.ts b/tests/dummy/app/serializers/application.ts index 656530c0..90561356 100644 --- a/tests/dummy/app/serializers/application.ts +++ b/tests/dummy/app/serializers/application.ts @@ -1,10 +1,3 @@ import CloudFirestoreSerializer from 'ember-cloud-firestore-adapter/serializers/cloud-firestore-modular'; export default class ApplicationSerializer extends CloudFirestoreSerializer {} - -// DO NOT DELETE: this is how TypeScript knows how to look up your serializers. -declare module 'ember-data/types/registries/serializer' { - export default interface SerializerRegistry { - application: ApplicationSerializer; - } -} diff --git a/tests/unit/adapters/cloud-firestore-modular-test.ts b/tests/unit/adapters/cloud-firestore-modular-test.ts index 7870412e..3febc040 100644 --- a/tests/unit/adapters/cloud-firestore-modular-test.ts +++ b/tests/unit/adapters/cloud-firestore-modular-test.ts @@ -9,7 +9,7 @@ import { setupTest } from 'ember-qunit'; import EmberObject from '@ember/object'; import Store from '@ember-data/store'; -import type { ModelSchema } from 'ember-data'; +import type { ModelSchema } from '@ember-data/store/types'; import { CollectionReference, Firestore, WriteBatch } from 'firebase/firestore'; import sinon from 'sinon'; @@ -283,7 +283,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) { ) as CloudFirestoreModularAdapter; // Act - const result = await adapter.findAll(store, modelClass, undefined as any); + const result = await adapter.findAll(store, modelClass, null, {}); // Assert assert.deepEqual(result, [ diff --git a/tests/unit/services/-firestore-data-manager-test.ts b/tests/unit/services/-firestore-data-manager-test.ts index 8f3ea3b1..66d2297a 100644 --- a/tests/unit/services/-firestore-data-manager-test.ts +++ b/tests/unit/services/-firestore-data-manager-test.ts @@ -16,6 +16,7 @@ import { updateDoc, } from 'ember-cloud-firestore-adapter/firebase/firestore'; import resetFixtureData from '../../helpers/reset-fixture-data'; +import type { Collection } from '@ember-data/store/-private/record-arrays/identifier-array'; module('Unit | Service | -firestore-data-manager', function (hooks) { let db: Firestore; @@ -171,7 +172,7 @@ module('Unit | Service | -firestore-data-manager', function (hooks) { recordArray: { update: () => DS.PromiseArray.create({ promise: RSVP.Promise.resolve([]) }), - } as unknown as DS.AdapterPopulatedRecordArray, + } as Collection, }; const firestoreDataManager = this.owner.lookup( 'service:-firestore-data-manager', @@ -201,7 +202,7 @@ module('Unit | Service | -firestore-data-manager', function (hooks) { recordArray: { update: () => DS.PromiseArray.create({ promise: RSVP.Promise.resolve([]) }), - } as unknown as DS.AdapterPopulatedRecordArray, + } as Collection, }; const firestoreDataManager = this.owner.lookup( 'service:-firestore-data-manager', @@ -229,7 +230,7 @@ module('Unit | Service | -firestore-data-manager', function (hooks) { recordArray: { update: () => DS.PromiseArray.create({ promise: RSVP.Promise.resolve([]) }), - } as unknown as DS.AdapterPopulatedRecordArray, + } as Collection, }; const updateSpy = sinon.spy(config.recordArray, 'update'); const firestoreDataManager = this.owner.lookup( diff --git a/tsconfig.json b/tsconfig.json index c4bed3a0..73ca275e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,6 +13,21 @@ "ember-cloud-firestore-adapter/test-support": ["addon-test-support"], "ember-cloud-firestore-adapter/test-support/*": ["addon-test-support/*"], "*": ["types/*"] - } + }, + "types": [ + "./node_modules/@ember-data-types/adapter/unstable-preview-types", + "./node_modules/@ember-data-types/graph/unstable-preview-types", + "./node_modules/@ember-data-types/json-api/unstable-preview-types", + "./node_modules/@ember-data-types/legacy-compat/unstable-preview-types", + "./node_modules/@ember-data-types/model/unstable-preview-types", + "./node_modules/@ember-data-types/request-utils/unstable-preview-types", + "./node_modules/@ember-data-types/request/unstable-preview-types", + "./node_modules/@ember-data-types/serializer/unstable-preview-types", + "./node_modules/@ember-data-types/store/unstable-preview-types", + "./node_modules/@ember-data-types/tracking/unstable-preview-types", + "./node_modules/@warp-drive-types/core-types/unstable-preview-types", + "./node_modules/ember-data-types/unstable-preview-types", + "ember-source/types" + ] } } diff --git a/types/ember-data/types/registries/model.d.ts b/types/ember-data/types/registries/model.d.ts deleted file mode 100644 index c65ed10f..00000000 --- a/types/ember-data/types/registries/model.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -/* eslint @typescript-eslint/no-explicit-any: off */ - -/** - * Catch-all for ember-data. - */ -export default interface ModelRegistry { - [key: string]: any; -} diff --git a/types/global.d.ts b/types/global.d.ts index 5b6cb811..6371a373 100644 --- a/types/global.d.ts +++ b/types/global.d.ts @@ -1,2 +1,10 @@ // eslint-disable-next-line @typescript-eslint/no-explicit-any declare const FastBoot: { require(moduleName: string): any } | undefined; + +import type { CompatStore } from '@ember-data/legacy-compat'; + +declare module '@ember/service' { + interface Registry { + store: CompatStore; + } +} From 504f1e70e01b3c4f83054716245e5cb0b8452de2 Mon Sep 17 00:00:00 2001 From: Charles Fries Date: Sat, 14 Dec 2024 14:29:11 -0800 Subject: [PATCH 02/12] Types --- addon/adapters/cloud-firestore-modular.ts | 24 ++++++++--------- addon/services/-firestore-data-manager.ts | 2 +- package.json | 1 + tests/dummy/app/controllers/features.ts | 3 +++ tests/dummy/app/models/group.ts | 3 ++- tests/dummy/app/models/post.ts | 3 ++- tests/dummy/app/models/user.ts | 2 +- tests/dummy/app/routes/query.ts | 1 + .../adapters/cloud-firestore-modular-test.ts | 26 +++++++++---------- .../services/-firestore-data-manager-test.ts | 2 +- types/global.d.ts | 4 +-- 11 files changed, 39 insertions(+), 32 deletions(-) diff --git a/addon/adapters/cloud-firestore-modular.ts b/addon/adapters/cloud-firestore-modular.ts index 2968d4fc..c6fff6f0 100644 --- a/addon/adapters/cloud-firestore-modular.ts +++ b/addon/adapters/cloud-firestore-modular.ts @@ -3,9 +3,14 @@ import { service } from '@ember/service'; import Adapter from '@ember-data/adapter'; import type { ModelSchema } from '@ember-data/store/types'; import type { AdapterPayload } from '@ember-data/legacy-compat'; -import type { Snapshot as _Snapshot } from '@ember-data/legacy-compat/legacy-network-handler/snapshot'; -import type { SnapshotRecordArray as _SnapshotRecordArray } from '@ember-data/legacy-compat/-private'; -import type { Collection } from '@ember-data/store/-private/record-arrays/identifier-array'; +import { Snapshot as _Snapshot } from '@ember-data/legacy-compat/legacy-network-handler/snapshot'; +import { SnapshotRecordArray as _SnapshotRecordArray } from '@ember-data/legacy-compat/-private'; +import { Collection } from '@ember-data/store/-private/record-arrays/identifier-array'; +import type { + LegacyBelongsToField, + LegacyHasManyField, +} from '@warp-drive/core-types/schema/fields'; +import Model from 'ember-data/model'; import RSVP from 'rsvp'; import Store from '@ember-data/store'; @@ -31,11 +36,6 @@ import AdapterRecordNotFoundError from 'ember-cloud-firestore-adapter/utils/cust import FirestoreDataManager from 'ember-cloud-firestore-adapter/services/-firestore-data-manager'; import buildCollectionName from 'ember-cloud-firestore-adapter/-private/build-collection-name'; import flattenDocSnapshot from 'ember-cloud-firestore-adapter/-private/flatten-doc-snapshot'; -import type { - LegacyBelongsToField, - LegacyHasManyField, -} from '@warp-drive/core-types/schema/fields'; -import type Model from 'ember-data/model'; export interface AdapterOption { isRealtime?: boolean; @@ -93,7 +93,7 @@ export default class CloudFirestoreAdapter extends Adapter { public createRecord( store: Store, type: ModelSchema, - snapshot: Snapshot, + snapshot: _Snapshot, ): Promise { return this.updateRecord(store, type, snapshot); } @@ -101,7 +101,7 @@ export default class CloudFirestoreAdapter extends Adapter { public updateRecord( _store: Store, type: ModelSchema, - snapshot: Snapshot, + snapshot: _Snapshot, ): Promise { return new RSVP.Promise((resolve, reject) => { const collectionRef = this.buildCollectionRef( @@ -135,7 +135,7 @@ export default class CloudFirestoreAdapter extends Adapter { public deleteRecord( _store: Store, type: ModelSchema, - snapshot: Snapshot, + snapshot: _Snapshot, ): Promise { return new RSVP.Promise((resolve, reject) => { const db = getFirestore(); @@ -164,7 +164,7 @@ export default class CloudFirestoreAdapter extends Adapter { _store: Store, type: ModelSchema, id: string, - snapshot: Snapshot, + snapshot: _Snapshot, ): Promise { return new RSVP.Promise(async (resolve, reject) => { try { diff --git a/addon/services/-firestore-data-manager.ts b/addon/services/-firestore-data-manager.ts index fbabcf32..74c803f0 100644 --- a/addon/services/-firestore-data-manager.ts +++ b/addon/services/-firestore-data-manager.ts @@ -1,6 +1,7 @@ import { next } from '@ember/runloop'; import type { Collection } from '@ember-data/store/-private/record-arrays/identifier-array'; import type { CompatStore } from '@ember-data/legacy-compat'; +import type Model from '@ember-data/model'; import Service, { service } from '@ember/service'; import StoreService from '@ember-data/store'; @@ -19,7 +20,6 @@ import { onSnapshot, } from 'ember-cloud-firestore-adapter/firebase/firestore'; import flattenDocSnapshot from 'ember-cloud-firestore-adapter/-private/flatten-doc-snapshot'; -import Model from '@ember-data/model'; interface DocListeners { [key: string]: { diff --git a/package.json b/package.json index 83f23493..0dca7d3b 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "lint:hbs:fix": "ember-template-lint . --fix", "lint:js": "eslint . --cache", "lint:js:fix": "eslint . --fix", + "lint:types": "tsc --noEmit", "start": "npm run build:wrappers && firebase emulators:exec --import=./emulator-data --project ember-cloud-firestore-adapter-test-project --ui \"ember serve\"", "test": "concurrently \"npm:lint\" \"npm:test:*\" --names \"lint,test:\"", "test:ember": "npm run build:wrappers && firebase emulators:exec --import=./emulator-data --project ember-cloud-firestore-adapter-test-project \"ember test\"", diff --git a/tests/dummy/app/controllers/features.ts b/tests/dummy/app/controllers/features.ts index 4c1b1a54..7dbd07a8 100644 --- a/tests/dummy/app/controllers/features.ts +++ b/tests/dummy/app/controllers/features.ts @@ -115,10 +115,12 @@ export default class FeaturesController extends Controller { @action public async handleQuery1Click(): Promise { const users = await this.store.query('user', { + // @ts-expect-error ember data types won't accept function buildReference(db: Firestore) { return collection(db, 'users'); }, + // @ts-expect-error ember data types won't accept function filter(reference: CollectionReference) { return query(reference, where('age', '>=', 15)); }, @@ -130,6 +132,7 @@ export default class FeaturesController extends Controller { @action public async handleQuery2Click(): Promise { const users = await this.store.query('user', { + // @ts-expect-error ember data types won't accept function buildReference(db: Firestore) { return collection(db, 'users/user_a/foobar'); }, diff --git a/tests/dummy/app/models/group.ts b/tests/dummy/app/models/group.ts index 196279ec..780942f9 100644 --- a/tests/dummy/app/models/group.ts +++ b/tests/dummy/app/models/group.ts @@ -4,7 +4,7 @@ */ import Model, { attr, hasMany, type AsyncHasMany } from '@ember-data/model'; -import { Type } from '@warp-drive/core-types/symbols'; +import type { Type } from '@warp-drive/core-types/symbols'; import { Query } from 'firebase/firestore'; @@ -19,6 +19,7 @@ export default class GroupModel extends Model { @hasMany('user', { async: true, inverse: 'groups' }) public declare members: AsyncHasMany; + // @ts-expect-error ember data types won't accept function @hasMany('post', { async: true, inverse: 'group', diff --git a/tests/dummy/app/models/post.ts b/tests/dummy/app/models/post.ts index 372eda90..edb9b717 100644 --- a/tests/dummy/app/models/post.ts +++ b/tests/dummy/app/models/post.ts @@ -4,7 +4,7 @@ */ import Model, { attr, belongsTo, type AsyncBelongsTo } from '@ember-data/model'; -import { Type } from '@warp-drive/core-types/symbols'; +import type { Type } from '@warp-drive/core-types/symbols'; import { Firestore } from 'firebase/firestore'; @@ -26,6 +26,7 @@ export default class PostModel extends Model { @belongsTo('group', { async: true, inverse: 'posts' }) public declare group: AsyncBelongsTo; + // @ts-expect-error ember data types won't accept function @belongsTo('user', { async: true, inverse: null, diff --git a/tests/dummy/app/models/user.ts b/tests/dummy/app/models/user.ts index a41dd49c..9358c303 100644 --- a/tests/dummy/app/models/user.ts +++ b/tests/dummy/app/models/user.ts @@ -4,7 +4,7 @@ */ import Model, { attr, hasMany, type AsyncHasMany } from '@ember-data/model'; -import { Type } from '@warp-drive/core-types/symbols'; +import type { Type } from '@warp-drive/core-types/symbols'; import GroupModel from './group'; import PostModel from './post'; diff --git a/tests/dummy/app/routes/query.ts b/tests/dummy/app/routes/query.ts index 767a4f41..a476c5d0 100644 --- a/tests/dummy/app/routes/query.ts +++ b/tests/dummy/app/routes/query.ts @@ -20,6 +20,7 @@ export default class QueryRoute extends Route { public async model(): Promise> { return this.store.query('group', { isRealtime: true, + // @ts-expect-error ember data types won't accept function filter(reference: CollectionReference) { return query(reference, orderBy('name'), limit(1)); }, diff --git a/tests/unit/adapters/cloud-firestore-modular-test.ts b/tests/unit/adapters/cloud-firestore-modular-test.ts index 3febc040..8d86db07 100644 --- a/tests/unit/adapters/cloud-firestore-modular-test.ts +++ b/tests/unit/adapters/cloud-firestore-modular-test.ts @@ -276,7 +276,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) { // Arrange const store = this.owner.lookup('service:store'); store.normalize = sinon.stub(); - store.push = sinon.stub(); + store.push = sinon.stub() as any; const modelClass = { modelName: 'user' } as ModelSchema; const adapter = this.owner.lookup( 'adapter:cloud-firestore-modular', @@ -314,7 +314,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) { // Arrange const store = this.owner.lookup('service:store'); store.normalize = sinon.stub(); - store.push = sinon.stub(); + store.push = sinon.stub() as any; const modelClass = { modelName: 'user' } as ModelSchema; const modelId = 'user_a'; const snapshot = {}; @@ -343,7 +343,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) { // Arrange const store = this.owner.lookup('service:store'); store.normalize = sinon.stub(); - store.push = sinon.stub(); + store.push = sinon.stub() as any; const modelClass = { modelName: 'user' } as ModelSchema; const modelId = 'user_a'; const snapshot = { @@ -375,7 +375,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) { const store = this.owner.lookup('service:store'); store.normalize = sinon.stub(); - store.push = sinon.stub(); + store.push = sinon.stub() as any; const modelClass = { modelName: 'user' } as ModelSchema; const modelId = 'user_100'; const snapshot = {}; @@ -402,7 +402,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) { // Arrange const store = this.owner.lookup('service:store'); store.normalize = sinon.stub(); - store.push = sinon.stub(); + store.push = sinon.stub() as any; const snapshot = {}; const url = 'users/user_a'; const relationship = { type: 'user', options: {} }; @@ -415,7 +415,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) { store, snapshot as any, url, - relationship, + relationship as any, ); // Assert @@ -447,7 +447,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) { const store = this.owner.lookup('service:store'); store.normalize = sinon.stub(); - store.push = sinon.stub(); + store.push = sinon.stub() as any; const snapshot = { id: 'user_a', modelName: 'user', @@ -472,7 +472,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) { store, snapshot as any, url, - relationship, + relationship as any, )) as any; // Assert @@ -500,7 +500,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) { const store = this.owner.lookup('service:store'); store.normalize = sinon.stub(); - store.push = sinon.stub(); + store.push = sinon.stub() as any; const snapshot = { modelName: 'user', record: EmberObject.create({ @@ -560,7 +560,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) { const store = this.owner.lookup('service:store'); store.normalize = sinon.stub(); - store.push = sinon.stub(); + store.push = sinon.stub() as any; const snapshot = { id: 'user_a', modelName: 'user', @@ -587,7 +587,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) { store, snapshot as any, url, - relationship, + relationship as any, )) as any; // Assert @@ -603,7 +603,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) { // Arrange const store = this.owner.lookup('service:store'); store.normalize = sinon.stub(); - store.push = sinon.stub(); + store.push = sinon.stub() as any; const snapshot = { record: EmberObject.create({ id: 'user_a' }), }; @@ -630,7 +630,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) { store, snapshot as any, url as any, - relationship, + relationship as any, )) as any; // Assert diff --git a/tests/unit/services/-firestore-data-manager-test.ts b/tests/unit/services/-firestore-data-manager-test.ts index 66d2297a..3ff5a29c 100644 --- a/tests/unit/services/-firestore-data-manager-test.ts +++ b/tests/unit/services/-firestore-data-manager-test.ts @@ -6,6 +6,7 @@ import RSVP from 'rsvp'; import type { Firestore } from 'firebase/firestore'; import sinon from 'sinon'; +import type { Collection } from '@ember-data/store/-private/record-arrays/identifier-array'; import { collection, @@ -16,7 +17,6 @@ import { updateDoc, } from 'ember-cloud-firestore-adapter/firebase/firestore'; import resetFixtureData from '../../helpers/reset-fixture-data'; -import type { Collection } from '@ember-data/store/-private/record-arrays/identifier-array'; module('Unit | Service | -firestore-data-manager', function (hooks) { let db: Firestore; diff --git a/types/global.d.ts b/types/global.d.ts index 6371a373..806570eb 100644 --- a/types/global.d.ts +++ b/types/global.d.ts @@ -1,8 +1,8 @@ +import type { CompatStore } from '@ember-data/legacy-compat'; + // eslint-disable-next-line @typescript-eslint/no-explicit-any declare const FastBoot: { require(moduleName: string): any } | undefined; -import type { CompatStore } from '@ember-data/legacy-compat'; - declare module '@ember/service' { interface Registry { store: CompatStore; From c4856d9f2c592dae888ddbe5b00a195328d8952d Mon Sep 17 00:00:00 2001 From: Charles Fries Date: Sat, 14 Dec 2024 14:57:46 -0800 Subject: [PATCH 03/12] Types --- addon/adapters/cloud-firestore-modular.ts | 11 ++++++----- addon/serializers/cloud-firestore-modular.ts | 4 ++++ addon/services/-firestore-data-manager.ts | 12 ++++++------ tests/acceptance/features-test.ts | 4 ++-- .../adapters/cloud-firestore-modular-test.ts | 18 +++++++++--------- .../services/-firestore-data-manager-test.ts | 1 + types/global.d.ts | 4 ++-- 7 files changed, 30 insertions(+), 24 deletions(-) diff --git a/addon/adapters/cloud-firestore-modular.ts b/addon/adapters/cloud-firestore-modular.ts index c6fff6f0..fd6582da 100644 --- a/addon/adapters/cloud-firestore-modular.ts +++ b/addon/adapters/cloud-firestore-modular.ts @@ -60,7 +60,7 @@ type BelongsToRelationshipMeta = LegacyBelongsToField & { options: { isRealtime?: boolean }; }; -interface HasManyRelationshipMeta extends LegacyHasManyField { +type HasManyRelationshipMeta = LegacyHasManyField & { key: string; // type: string; options: { @@ -93,7 +93,7 @@ export default class CloudFirestoreAdapter extends Adapter { public createRecord( store: Store, type: ModelSchema, - snapshot: _Snapshot, + snapshot: Snapshot, ): Promise { return this.updateRecord(store, type, snapshot); } @@ -101,7 +101,7 @@ export default class CloudFirestoreAdapter extends Adapter { public updateRecord( _store: Store, type: ModelSchema, - snapshot: _Snapshot, + snapshot: Snapshot, ): Promise { return new RSVP.Promise((resolve, reject) => { const collectionRef = this.buildCollectionRef( @@ -135,7 +135,7 @@ export default class CloudFirestoreAdapter extends Adapter { public deleteRecord( _store: Store, type: ModelSchema, - snapshot: _Snapshot, + snapshot: Snapshot, ): Promise { return new RSVP.Promise((resolve, reject) => { const db = getFirestore(); @@ -164,7 +164,7 @@ export default class CloudFirestoreAdapter extends Adapter { _store: Store, type: ModelSchema, id: string, - snapshot: _Snapshot, + snapshot: Snapshot, ): Promise { return new RSVP.Promise(async (resolve, reject) => { try { @@ -228,6 +228,7 @@ export default class CloudFirestoreAdapter extends Adapter { }); } + // @ts-expect-error ember data types 3 arg public query( _store: Store, type: ModelSchema, diff --git a/addon/serializers/cloud-firestore-modular.ts b/addon/serializers/cloud-firestore-modular.ts index 2a16a8df..2df00114 100644 --- a/addon/serializers/cloud-firestore-modular.ts +++ b/addon/serializers/cloud-firestore-modular.ts @@ -44,6 +44,7 @@ export default class CloudFirestoreSerializer extends JSONSerializer { relationshipHash: DocumentReference, ): { id: string; type: string } | Record { if (isNone(relationshipHash)) { + // @ts-expect-error ember data types incorrect return super.extractRelationship(relationshipModelName, relationshipHash); } @@ -91,6 +92,7 @@ export default class CloudFirestoreSerializer extends JSONSerializer { newResourceHash.links = links; + // @ts-expect-error ember data types incorrect return super.extractRelationships(modelClass, newResourceHash); } @@ -99,6 +101,7 @@ export default class CloudFirestoreSerializer extends JSONSerializer { json: { [key: string]: string | null | DocumentReference }, relationship: RelationshipDefinition, ): void { + // @ts-expect-error ember data types incorrect super.serializeBelongsTo(snapshot, json, relationship); if (json[relationship.key]) { @@ -124,6 +127,7 @@ export default class CloudFirestoreSerializer extends JSONSerializer { options: Record, ): Record { const json: { [key: string]: unknown } = { + // @ts-expect-error ember data types incorrect ...super.serialize(snapshot, options), }; diff --git a/addon/services/-firestore-data-manager.ts b/addon/services/-firestore-data-manager.ts index 74c803f0..189436d5 100644 --- a/addon/services/-firestore-data-manager.ts +++ b/addon/services/-firestore-data-manager.ts @@ -1,7 +1,8 @@ import { next } from '@ember/runloop'; +import type Model from '@ember-data/model'; import type { Collection } from '@ember-data/store/-private/record-arrays/identifier-array'; import type { CompatStore } from '@ember-data/legacy-compat'; -import type Model from '@ember-data/model'; +import type { ObjectValue } from '@warp-drive/core-types/json/raw'; import Service, { service } from '@ember/service'; import StoreService from '@ember-data/store'; @@ -415,9 +416,8 @@ export default class FirestoreDataManager extends Service { // To avoid the issue, we run .reload() in the next runloop so that we allow the unload // to happen first. next(() => { - const hasManyRef = this.store - .peekRecord(config.modelName, config.id) - ?.hasMany(config.field); + const record = this.store.peekRecord(config.modelName, config.id); + const hasManyRef = (record as Model).hasMany(config.field); hasManyRef?.reload(); }); @@ -444,13 +444,13 @@ export default class FirestoreDataManager extends Service { const flatRecord = flattenDocSnapshot(snapshot); const normalizedRecord = (this.store as CompatStore).normalize( modelName, - flatRecord, + flatRecord as ObjectValue, ); // Race condition can happen because of the realtime nature. We handle that in a try-catch // to avoid unexpected side-effects. When this happens, we just ignore it. try { - this.store.push(normalizedRecord); + this.store.push(normalizedRecord as never); } catch { // Do nothing } diff --git a/tests/acceptance/features-test.ts b/tests/acceptance/features-test.ts index d425c64b..eb2c2ae4 100644 --- a/tests/acceptance/features-test.ts +++ b/tests/acceptance/features-test.ts @@ -69,7 +69,7 @@ module('Acceptance | features', function (hooks) { await waitFor('[data-test-id]', { timeout: 5000 }); assert.dom('[data-test-id="user_a"]').hasText('user_a'); assert.dom('[data-test-name="user_a"]').hasText('user_a'); - assert.dom('[data-test-age="user_a"]').hasNoText(); + assert.dom('[data-test-age="user_a"]').hasText('15'); }); test('should be able to create record with belongs to build reference', async function (assert) { @@ -87,7 +87,7 @@ module('Acceptance | features', function (hooks) { await waitFor('[data-test-id]', { timeout: 5000 }); assert.dom('[data-test-id="user_a"]').hasText('user_a'); assert.dom('[data-test-name="user_a"]').hasText('user_a'); - assert.dom('[data-test-age="user_a"]').hasNoText(); + assert.dom('[data-test-age="user_a"]').hasText('15'); const createdRecord = await getDoc(doc(db, 'posts/new_post')); diff --git a/tests/unit/adapters/cloud-firestore-modular-test.ts b/tests/unit/adapters/cloud-firestore-modular-test.ts index 8d86db07..53e3dbf6 100644 --- a/tests/unit/adapters/cloud-firestore-modular-test.ts +++ b/tests/unit/adapters/cloud-firestore-modular-test.ts @@ -65,7 +65,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) { const updateRecordStub = sinon .stub(adapter, 'updateRecord') - .returns('foo' as any); + .returns(Promise.resolve({ foo: 'foo' })); // Act const result = await adapter.createRecord( @@ -75,7 +75,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) { ); // Assert - assert.strictEqual(result, 'foo'); + assert.deepEqual(result, { foo: 'foo' }); assert.ok( updateRecordStub.calledWithExactly(store, modelClass, snapshot as any), ); @@ -283,7 +283,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) { ) as CloudFirestoreModularAdapter; // Act - const result = await adapter.findAll(store, modelClass, null, {}); + const result = await adapter.findAll(store, modelClass, null, {} as any); // Assert assert.deepEqual(result, [ @@ -440,7 +440,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) { return { determineRelationshipType: determineRelationshipTypeStub, inverseFor: inverseForStub, - }; + } as unknown as ModelSchema; } }, ); @@ -493,7 +493,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) { modelFor() { return { determineRelationshipType: determineRelationshipTypeStub, - }; + } as unknown as ModelSchema; } }, ); @@ -505,7 +505,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) { modelName: 'user', record: EmberObject.create({ referenceTo: doc(db, 'users/user_a'), - }), + } as any), }; const url = 'users/user_a/friends'; const relationship = { @@ -553,7 +553,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) { return { determineRelationshipType: determineRelationshipTypeStub, inverseFor: inverseForStub, - }; + } as unknown as ModelSchema; } }, ); @@ -566,7 +566,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) { modelName: 'user', record: EmberObject.create({ id: 'user_a', - }), + } as any), }; const url = 'posts'; const relationship = { @@ -605,7 +605,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) { store.normalize = sinon.stub(); store.push = sinon.stub() as any; const snapshot = { - record: EmberObject.create({ id: 'user_a' }), + record: EmberObject.create({ id: 'user_a' } as any), }; const url = null; const relationship = { diff --git a/tests/unit/services/-firestore-data-manager-test.ts b/tests/unit/services/-firestore-data-manager-test.ts index 3ff5a29c..1b106a95 100644 --- a/tests/unit/services/-firestore-data-manager-test.ts +++ b/tests/unit/services/-firestore-data-manager-test.ts @@ -308,6 +308,7 @@ module('Unit | Service | -firestore-data-manager', function (hooks) { sinon .stub(store, 'peekRecord') + // @ts-expect-error method overloads .withArgs('user', 'user_a') .returns({ hasMany: sinon diff --git a/types/global.d.ts b/types/global.d.ts index 806570eb..7c9a3bf0 100644 --- a/types/global.d.ts +++ b/types/global.d.ts @@ -1,9 +1,9 @@ -import type { CompatStore } from '@ember-data/legacy-compat'; - // eslint-disable-next-line @typescript-eslint/no-explicit-any declare const FastBoot: { require(moduleName: string): any } | undefined; declare module '@ember/service' { + import type { CompatStore } from '@ember-data/legacy-compat'; + interface Registry { store: CompatStore; } From 6a5cd5c7b480452e2994c37e4f59e40ce6481321 Mon Sep 17 00:00:00 2001 From: Charles Fries Date: Sat, 14 Dec 2024 15:42:10 -0800 Subject: [PATCH 04/12] Cleanup --- addon/adapters/cloud-firestore-modular.ts | 4 ++-- addon/serializers/cloud-firestore-modular.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addon/adapters/cloud-firestore-modular.ts b/addon/adapters/cloud-firestore-modular.ts index fd6582da..6f5500b8 100644 --- a/addon/adapters/cloud-firestore-modular.ts +++ b/addon/adapters/cloud-firestore-modular.ts @@ -62,14 +62,14 @@ type BelongsToRelationshipMeta = LegacyBelongsToField & { type HasManyRelationshipMeta = LegacyHasManyField & { key: string; - // type: string; + type: string; options: { isRealtime?: boolean; buildReference?(db: Firestore, record: unknown): CollectionReference; filter?(db: CollectionReference | Query, record: unknown): Query; }; -} +}; export default class CloudFirestoreAdapter extends Adapter { @service('-firestore-data-manager') diff --git a/addon/serializers/cloud-firestore-modular.ts b/addon/serializers/cloud-firestore-modular.ts index 2df00114..83e626ce 100644 --- a/addon/serializers/cloud-firestore-modular.ts +++ b/addon/serializers/cloud-firestore-modular.ts @@ -92,7 +92,7 @@ export default class CloudFirestoreSerializer extends JSONSerializer { newResourceHash.links = links; - // @ts-expect-error ember data types incorrect + // @ts-expect-error ember data types incorrect return super.extractRelationships(modelClass, newResourceHash); } From aa1ea60234d2027738f289cb4279fb6d2f7bbc54 Mon Sep 17 00:00:00 2001 From: Charles Fries Date: Sat, 14 Dec 2024 16:05:13 -0800 Subject: [PATCH 05/12] Rm lint:types --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 0dca7d3b..83f23493 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,6 @@ "lint:hbs:fix": "ember-template-lint . --fix", "lint:js": "eslint . --cache", "lint:js:fix": "eslint . --fix", - "lint:types": "tsc --noEmit", "start": "npm run build:wrappers && firebase emulators:exec --import=./emulator-data --project ember-cloud-firestore-adapter-test-project --ui \"ember serve\"", "test": "concurrently \"npm:lint\" \"npm:test:*\" --names \"lint,test:\"", "test:ember": "npm run build:wrappers && firebase emulators:exec --import=./emulator-data --project ember-cloud-firestore-adapter-test-project \"ember test\"", From 35de44f15cc89bf09e10693cc7ce6ff525815141 Mon Sep 17 00:00:00 2001 From: Charles Fries Date: Sat, 14 Dec 2024 16:16:13 -0800 Subject: [PATCH 06/12] Cleanup --- addon/adapters/cloud-firestore-modular.ts | 6 +++--- tests/dummy/app/routes/query.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/addon/adapters/cloud-firestore-modular.ts b/addon/adapters/cloud-firestore-modular.ts index 6f5500b8..1029a652 100644 --- a/addon/adapters/cloud-firestore-modular.ts +++ b/addon/adapters/cloud-firestore-modular.ts @@ -3,9 +3,9 @@ import { service } from '@ember/service'; import Adapter from '@ember-data/adapter'; import type { ModelSchema } from '@ember-data/store/types'; import type { AdapterPayload } from '@ember-data/legacy-compat'; -import { Snapshot as _Snapshot } from '@ember-data/legacy-compat/legacy-network-handler/snapshot'; -import { SnapshotRecordArray as _SnapshotRecordArray } from '@ember-data/legacy-compat/-private'; -import { Collection } from '@ember-data/store/-private/record-arrays/identifier-array'; +import type { Snapshot as _Snapshot } from '@ember-data/legacy-compat/legacy-network-handler/snapshot'; +import type { SnapshotRecordArray as _SnapshotRecordArray } from '@ember-data/legacy-compat/-private'; +import type { Collection } from '@ember-data/store/-private/record-arrays/identifier-array'; import type { LegacyBelongsToField, LegacyHasManyField, diff --git a/tests/dummy/app/routes/query.ts b/tests/dummy/app/routes/query.ts index a476c5d0..4614694d 100644 --- a/tests/dummy/app/routes/query.ts +++ b/tests/dummy/app/routes/query.ts @@ -1,5 +1,5 @@ import { service } from '@ember/service'; -import { Collection } from '@ember-data/store/-private/record-arrays/identifier-array'; +import type { Collection } from '@ember-data/store/-private/record-arrays/identifier-array'; import Route from '@ember/routing/route'; import Store from '@ember-data/store'; From 9838ea4f2104491d48c2dfebcfc547b872be95e9 Mon Sep 17 00:00:00 2001 From: Charles Fries Date: Sat, 28 Dec 2024 22:01:33 -0800 Subject: [PATCH 07/12] Lint --- addon/adapters/cloud-firestore-modular.ts | 8 ++++---- addon/serializers/cloud-firestore-modular.ts | 2 +- addon/services/-firestore-data-manager.ts | 2 +- tests/dummy/app/models/group.ts | 4 ++-- tests/dummy/app/models/post.ts | 2 +- tests/dummy/app/models/user.ts | 2 +- tests/dummy/app/routes/delete-record.ts | 2 +- tests/unit/adapters/cloud-firestore-modular-test.ts | 6 +++++- 8 files changed, 16 insertions(+), 12 deletions(-) diff --git a/addon/adapters/cloud-firestore-modular.ts b/addon/adapters/cloud-firestore-modular.ts index 1029a652..61b37cf6 100644 --- a/addon/adapters/cloud-firestore-modular.ts +++ b/addon/adapters/cloud-firestore-modular.ts @@ -10,11 +10,11 @@ import type { LegacyBelongsToField, LegacyHasManyField, } from '@warp-drive/core-types/schema/fields'; -import Model from 'ember-data/model'; +import type Model from 'ember-data/model'; import RSVP from 'rsvp'; -import Store from '@ember-data/store'; +import type Store from '@ember-data/store'; -import { +import type { CollectionReference, DocumentReference, Firestore, @@ -33,7 +33,7 @@ import { writeBatch, } from 'ember-cloud-firestore-adapter/firebase/firestore'; import AdapterRecordNotFoundError from 'ember-cloud-firestore-adapter/utils/custom-errors'; -import FirestoreDataManager from 'ember-cloud-firestore-adapter/services/-firestore-data-manager'; +import type FirestoreDataManager from 'ember-cloud-firestore-adapter/services/-firestore-data-manager'; import buildCollectionName from 'ember-cloud-firestore-adapter/-private/build-collection-name'; import flattenDocSnapshot from 'ember-cloud-firestore-adapter/-private/flatten-doc-snapshot'; diff --git a/addon/serializers/cloud-firestore-modular.ts b/addon/serializers/cloud-firestore-modular.ts index 83e626ce..42fec602 100644 --- a/addon/serializers/cloud-firestore-modular.ts +++ b/addon/serializers/cloud-firestore-modular.ts @@ -8,7 +8,7 @@ import type Model from '@ember-data/model'; import type { Snapshot } from '@ember-data/legacy-compat/legacy-network-handler/snapshot'; import JSONSerializer from '@ember-data/serializer/json'; -import { +import type { CollectionReference, DocumentReference, Firestore, diff --git a/addon/services/-firestore-data-manager.ts b/addon/services/-firestore-data-manager.ts index 189436d5..ddf91069 100644 --- a/addon/services/-firestore-data-manager.ts +++ b/addon/services/-firestore-data-manager.ts @@ -4,7 +4,7 @@ import type { Collection } from '@ember-data/store/-private/record-arrays/identi import type { CompatStore } from '@ember-data/legacy-compat'; import type { ObjectValue } from '@warp-drive/core-types/json/raw'; import Service, { service } from '@ember/service'; -import StoreService from '@ember-data/store'; +import type StoreService from '@ember-data/store'; import type { CollectionReference, diff --git a/tests/dummy/app/models/group.ts b/tests/dummy/app/models/group.ts index 9665e654..5ec24aa9 100644 --- a/tests/dummy/app/models/group.ts +++ b/tests/dummy/app/models/group.ts @@ -4,9 +4,9 @@ */ import Model, { attr, hasMany, type AsyncHasMany } from '@ember-data/model'; -import type { Type } from '@warp-drive/core-types/symbols'; +import { Type } from '@warp-drive/core-types/symbols'; -import { Query } from 'firebase/firestore'; +import type { Query } from 'firebase/firestore'; import { limit, query } from 'ember-cloud-firestore-adapter/firebase/firestore'; import type PostModel from './post'; diff --git a/tests/dummy/app/models/post.ts b/tests/dummy/app/models/post.ts index a091717e..cf73edb0 100644 --- a/tests/dummy/app/models/post.ts +++ b/tests/dummy/app/models/post.ts @@ -4,7 +4,7 @@ */ import Model, { attr, belongsTo, type AsyncBelongsTo } from '@ember-data/model'; -import type { Type } from '@warp-drive/core-types/symbols'; +import { Type } from '@warp-drive/core-types/symbols'; import type { Firestore } from 'firebase/firestore'; diff --git a/tests/dummy/app/models/user.ts b/tests/dummy/app/models/user.ts index 0f56a741..c0457393 100644 --- a/tests/dummy/app/models/user.ts +++ b/tests/dummy/app/models/user.ts @@ -4,7 +4,7 @@ */ import Model, { attr, hasMany, type AsyncHasMany } from '@ember-data/model'; -import type { Type } from '@warp-drive/core-types/symbols'; +import { Type } from '@warp-drive/core-types/symbols'; import type GroupModel from './group'; import type PostModel from './post'; diff --git a/tests/dummy/app/routes/delete-record.ts b/tests/dummy/app/routes/delete-record.ts index 0bf70749..f9aefd2e 100644 --- a/tests/dummy/app/routes/delete-record.ts +++ b/tests/dummy/app/routes/delete-record.ts @@ -2,7 +2,7 @@ import { service } from '@ember/service'; import Route from '@ember/routing/route'; import type Store from '@ember-data/store'; -import UserModel from '../models/user'; +import type UserModel from '../models/user'; export default class DeleteRecordRoute extends Route { @service diff --git a/tests/unit/adapters/cloud-firestore-modular-test.ts b/tests/unit/adapters/cloud-firestore-modular-test.ts index 53e3dbf6..1e2acd26 100644 --- a/tests/unit/adapters/cloud-firestore-modular-test.ts +++ b/tests/unit/adapters/cloud-firestore-modular-test.ts @@ -10,7 +10,11 @@ import EmberObject from '@ember/object'; import Store from '@ember-data/store'; import type { ModelSchema } from '@ember-data/store/types'; -import { CollectionReference, Firestore, WriteBatch } from 'firebase/firestore'; +import type { + CollectionReference, + Firestore, + WriteBatch, +} from 'firebase/firestore'; import sinon from 'sinon'; import { From ba6b382c7096d890978681f2d4bf57e6ece9d2e4 Mon Sep 17 00:00:00 2001 From: Charles Fries Date: Mon, 30 Dec 2024 15:50:01 -0800 Subject: [PATCH 08/12] Downgrade --- package-lock.json | 168 ++++++++++++++++---------------- package.json | 24 ++--- tests/dummy/app/models/group.ts | 2 +- tests/dummy/app/models/post.ts | 2 +- tests/dummy/app/models/user.ts | 2 +- 5 files changed, 99 insertions(+), 99 deletions(-) diff --git a/package-lock.json b/package-lock.json index ecf98178..2ca0904c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,16 +16,16 @@ "ember-cli-typescript": "^4.2.1" }, "devDependencies": { - "@ember-data-types/adapter": "5.4.0-alpha.113", - "@ember-data-types/graph": "5.4.0-alpha.113", - "@ember-data-types/json-api": "5.4.0-alpha.113", - "@ember-data-types/legacy-compat": "5.4.0-alpha.113", - "@ember-data-types/model": "5.4.0-alpha.113", - "@ember-data-types/request": "5.4.0-alpha.113", - "@ember-data-types/request-utils": "5.4.0-alpha.113", - "@ember-data-types/serializer": "5.4.0-alpha.113", - "@ember-data-types/store": "5.4.0-alpha.113", - "@ember-data-types/tracking": "5.4.0-alpha.113", + "@ember-data-types/adapter": "^5.3.9", + "@ember-data-types/graph": "^5.3.9", + "@ember-data-types/json-api": "^5.3.9", + "@ember-data-types/legacy-compat": "^5.3.9", + "@ember-data-types/model": "^5.3.9", + "@ember-data-types/request": "^5.3.9", + "@ember-data-types/request-utils": "^5.3.9", + "@ember-data-types/serializer": "^5.3.9", + "@ember-data-types/store": "^5.3.9", + "@ember-data-types/tracking": "^5.3.9", "@ember/optional-features": "^2.1.0", "@ember/string": "^3.1.1", "@ember/test-helpers": "^3.2.0", @@ -39,7 +39,7 @@ "@types/sinon": "^17.0.3", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", - "@warp-drive-types/core-types": "0.0.0-alpha.99", + "@warp-drive-types/core-types": "^0.0.0-alpha.107", "broccoli-asset-rev": "^3.0.0", "concurrently": "^8.2.2", "ember-cli": "~5.4.2", @@ -51,7 +51,7 @@ "ember-cli-terser": "^4.0.2", "ember-cli-typescript-blueprints": "^3.0.0", "ember-data": "~4.11.2", - "ember-data-types": "5.4.0-alpha.113", + "ember-data-types": "^5.3.9", "ember-fetch": "^8.1.2", "ember-load-initializers": "^2.1.2", "ember-page-title": "^8.0.0", @@ -2130,63 +2130,63 @@ } }, "node_modules/@ember-data-types/adapter": { - "version": "5.4.0-alpha.113", - "resolved": "https://registry.npmjs.org/@ember-data-types/adapter/-/adapter-5.4.0-alpha.113.tgz", - "integrity": "sha512-46u4mZGRBCXujaHeWSpjz8yb/wMoIiTj031rh3HAf1PbGh6h/+qky8uVUE+f7gQls0ANfjS8ZoXCFEY/txM/og==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@ember-data-types/adapter/-/adapter-5.3.9.tgz", + "integrity": "sha512-soCShQiwEtV3kqGOSPgB6UljFY7NAlWDy06XqiNTPiBBiilPjYG+EJeWwoXbNbWf70XPdWG4ecIJd56Nz/Fhyw==", "dev": true }, "node_modules/@ember-data-types/graph": { - "version": "5.4.0-alpha.113", - "resolved": "https://registry.npmjs.org/@ember-data-types/graph/-/graph-5.4.0-alpha.113.tgz", - "integrity": "sha512-SfK7z7pShArMJJkCCelBFEsS7HHrkJWfGQzUjiSs09EdQWlodKaJLexfVFfvKw2C40xnx3QIYYDqpKIHaEgI9A==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@ember-data-types/graph/-/graph-5.3.9.tgz", + "integrity": "sha512-Qo6N+KYZATeheB55dEhQAXzsGVNOtUiLdOfUITAOxvv+wmvbKuGjNfffJ4HuNJBT2ZWB1R6XzCL+YYk2Q+dMyQ==", "dev": true }, "node_modules/@ember-data-types/json-api": { - "version": "5.4.0-alpha.113", - "resolved": "https://registry.npmjs.org/@ember-data-types/json-api/-/json-api-5.4.0-alpha.113.tgz", - "integrity": "sha512-tD05GxyJHTXAwbR+1ACt86hL0RmqZGaFsvsrQq5ko3r6dwYAwaTMBfJ6HRdSs3sNaN3A9o3AooB+F8bxUCuSGg==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@ember-data-types/json-api/-/json-api-5.3.9.tgz", + "integrity": "sha512-Yi41shKtFyoveIW8NIfyTDCQImDxQqT5OANL2+ZHR/4xnkt9292NOfwFFDwTxGIt3BS/NcfOFUJSRZp3gPONmA==", "dev": true }, "node_modules/@ember-data-types/legacy-compat": { - "version": "5.4.0-alpha.113", - "resolved": "https://registry.npmjs.org/@ember-data-types/legacy-compat/-/legacy-compat-5.4.0-alpha.113.tgz", - "integrity": "sha512-hcy2G/hFbqFJ8yP3altNHqXAU+QsafmDHfvCG3CyP2UhGTGXsh9P54F7jcBYT2x6g/34FSuBl5cIdfdSqGgNhA==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@ember-data-types/legacy-compat/-/legacy-compat-5.3.9.tgz", + "integrity": "sha512-WQKez8tL60bjRUYt2mMjUWZI9FaSSCSKEPTnQSX5t6cIsuC67y3mDt5vmwMEITqw82uV8yXu8J44A1D/bY1aNw==", "dev": true }, "node_modules/@ember-data-types/model": { - "version": "5.4.0-alpha.113", - "resolved": "https://registry.npmjs.org/@ember-data-types/model/-/model-5.4.0-alpha.113.tgz", - "integrity": "sha512-c8eGnArzHKkUYT9nvogSrDDkne/OVePiiQ/t5Na/64cn8hBW78ccUV6ylMK9rl2ZQvQN+eO6yEPbm6X6Z2+xBQ==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@ember-data-types/model/-/model-5.3.9.tgz", + "integrity": "sha512-N1KJ/qMdqI4wCV8TcyBGR583dqtqwyFcR5rjP0W2pZZ8khRDk3XROMzOa7wki/BYGkJxwfHxvlFVLRdAP/vF3w==", "dev": true }, "node_modules/@ember-data-types/request": { - "version": "5.4.0-alpha.113", - "resolved": "https://registry.npmjs.org/@ember-data-types/request/-/request-5.4.0-alpha.113.tgz", - "integrity": "sha512-UNfujg0g0MT+Lo50qDa9Km1vgIUGulEtFyLL3pCvJy8fpynw4KN472HZLVH8DfRESpdHS9fXZQWqm7XKnQ99aQ==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@ember-data-types/request/-/request-5.3.9.tgz", + "integrity": "sha512-uD3hQCNkSvHFVmKXt4FCJY+GuU/6jL9c6lC5tAD+TMa/C6JrOoJAzeBoWt61xRxtVUcxQB6g4qjm11YsUy5tGw==", "dev": true }, "node_modules/@ember-data-types/request-utils": { - "version": "5.4.0-alpha.113", - "resolved": "https://registry.npmjs.org/@ember-data-types/request-utils/-/request-utils-5.4.0-alpha.113.tgz", - "integrity": "sha512-ZaOZJB8l3Yf97AXZJdvEpja1cVoQbv+Oz6fTLt7S1EnUDxSK7+hv9m3gEk1coFX5tYAp/SAxfnjWGO4sN75wmw==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@ember-data-types/request-utils/-/request-utils-5.3.9.tgz", + "integrity": "sha512-7Iy23SE8404QD+eH9DuE2R3McW2A6Odsn/wKCwo7gmGyvDZB/5Ca9OOVsm2U9swO2xaQrlB4sE/139jkAji54A==", "dev": true }, "node_modules/@ember-data-types/serializer": { - "version": "5.4.0-alpha.113", - "resolved": "https://registry.npmjs.org/@ember-data-types/serializer/-/serializer-5.4.0-alpha.113.tgz", - "integrity": "sha512-8ZkjyPfLs6bYARtE+xJa5RZfwxY5kzkoRCuQ9xarTb+NjN0yn/jCeDW5AtHHqE2Swru44ZZp5e6kFGgZipJTBg==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@ember-data-types/serializer/-/serializer-5.3.9.tgz", + "integrity": "sha512-WqzguopBOzm657s1bAGFK3E2O5+nvx2jJRi1kpsYrELxfbXpWCUWit3E9d8FGUqlMYoyBtQWdAwPosjuJTb2/Q==", "dev": true }, "node_modules/@ember-data-types/store": { - "version": "5.4.0-alpha.113", - "resolved": "https://registry.npmjs.org/@ember-data-types/store/-/store-5.4.0-alpha.113.tgz", - "integrity": "sha512-pR2maUEtCQLxQ7VESfJ1/CP4AnmvtDYTXiK7I9+CtpV1WXazAZao2py7z4x9suY5qOgm1iY8bQ512AD2ZH5QGg==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@ember-data-types/store/-/store-5.3.9.tgz", + "integrity": "sha512-d6iEm6rktkVXmOzhi4QfKlt3dTCVOdSO569RAeDw8Ak3d8zCX3rLu/rcjOnISvGHQ0lVfDG3tHIpgfGpZmb5yg==", "dev": true }, "node_modules/@ember-data-types/tracking": { - "version": "5.4.0-alpha.113", - "resolved": "https://registry.npmjs.org/@ember-data-types/tracking/-/tracking-5.4.0-alpha.113.tgz", - "integrity": "sha512-adgreEYFso9v2+BLLfHyYTOhtufelYcaSil4Z+rO/KOy/LCPSRr55pxFlN4VY5EOLKDeGbp6MWHb+dHzU33J2Q==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@ember-data-types/tracking/-/tracking-5.3.9.tgz", + "integrity": "sha512-4vrPQBo0Hf5TpOuGNMMHWJItqcfuj/oc1RqmEkL9C0Sv60UGnfNLQ994Dsye7CPtjIcIQOdU7/1vhSBqybMgKA==", "dev": true }, "node_modules/@ember-data/adapter": { @@ -12073,9 +12073,9 @@ "dev": true }, "node_modules/@warp-drive-types/core-types": { - "version": "0.0.0-alpha.99", - "resolved": "https://registry.npmjs.org/@warp-drive-types/core-types/-/core-types-0.0.0-alpha.99.tgz", - "integrity": "sha512-q+drvSsY5U4mwrWA59N4bl1104vjXzCCKuxO6Jppah6DDq848J5q4YgN8sN4p8JAWVD8dZs9I6v1BMquQr0y3g==", + "version": "0.0.0-alpha.107", + "resolved": "https://registry.npmjs.org/@warp-drive-types/core-types/-/core-types-0.0.0-alpha.107.tgz", + "integrity": "sha512-nUsJplM8y1eTDnrsQ1shq+eJOEZ5476tsRkTE5GeTNha6viyJuvGKoTDhsI8Id/M+CBp8jFz18egYLiC8jShsA==", "dev": true }, "node_modules/@webassemblyjs/ast": { @@ -22116,9 +22116,9 @@ } }, "node_modules/ember-data-types": { - "version": "5.4.0-alpha.113", - "resolved": "https://registry.npmjs.org/ember-data-types/-/ember-data-types-5.4.0-alpha.113.tgz", - "integrity": "sha512-5JvxDlBAt8Zr46M7h8ByC99eKP0ul84z6aFKLMF7K+REie9gv6Sbdf8WfMO3cxwxdN3Xl7plauJ0mWXI5mH5qQ==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/ember-data-types/-/ember-data-types-5.3.9.tgz", + "integrity": "sha512-Dp7HS756l92pv+5W5zoFM5huIPfZqGVfNofZvf1w0qlRTUFVT/q8KqxFFNAcWvZyZtEqm34WyAlARhfuBgGuXA==", "dev": true }, "node_modules/ember-data/node_modules/@types/fs-extra": { @@ -54896,63 +54896,63 @@ "requires": {} }, "@ember-data-types/adapter": { - "version": "5.4.0-alpha.113", - "resolved": "https://registry.npmjs.org/@ember-data-types/adapter/-/adapter-5.4.0-alpha.113.tgz", - "integrity": "sha512-46u4mZGRBCXujaHeWSpjz8yb/wMoIiTj031rh3HAf1PbGh6h/+qky8uVUE+f7gQls0ANfjS8ZoXCFEY/txM/og==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@ember-data-types/adapter/-/adapter-5.3.9.tgz", + "integrity": "sha512-soCShQiwEtV3kqGOSPgB6UljFY7NAlWDy06XqiNTPiBBiilPjYG+EJeWwoXbNbWf70XPdWG4ecIJd56Nz/Fhyw==", "dev": true }, "@ember-data-types/graph": { - "version": "5.4.0-alpha.113", - "resolved": "https://registry.npmjs.org/@ember-data-types/graph/-/graph-5.4.0-alpha.113.tgz", - "integrity": "sha512-SfK7z7pShArMJJkCCelBFEsS7HHrkJWfGQzUjiSs09EdQWlodKaJLexfVFfvKw2C40xnx3QIYYDqpKIHaEgI9A==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@ember-data-types/graph/-/graph-5.3.9.tgz", + "integrity": "sha512-Qo6N+KYZATeheB55dEhQAXzsGVNOtUiLdOfUITAOxvv+wmvbKuGjNfffJ4HuNJBT2ZWB1R6XzCL+YYk2Q+dMyQ==", "dev": true }, "@ember-data-types/json-api": { - "version": "5.4.0-alpha.113", - "resolved": "https://registry.npmjs.org/@ember-data-types/json-api/-/json-api-5.4.0-alpha.113.tgz", - "integrity": "sha512-tD05GxyJHTXAwbR+1ACt86hL0RmqZGaFsvsrQq5ko3r6dwYAwaTMBfJ6HRdSs3sNaN3A9o3AooB+F8bxUCuSGg==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@ember-data-types/json-api/-/json-api-5.3.9.tgz", + "integrity": "sha512-Yi41shKtFyoveIW8NIfyTDCQImDxQqT5OANL2+ZHR/4xnkt9292NOfwFFDwTxGIt3BS/NcfOFUJSRZp3gPONmA==", "dev": true }, "@ember-data-types/legacy-compat": { - "version": "5.4.0-alpha.113", - "resolved": "https://registry.npmjs.org/@ember-data-types/legacy-compat/-/legacy-compat-5.4.0-alpha.113.tgz", - "integrity": "sha512-hcy2G/hFbqFJ8yP3altNHqXAU+QsafmDHfvCG3CyP2UhGTGXsh9P54F7jcBYT2x6g/34FSuBl5cIdfdSqGgNhA==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@ember-data-types/legacy-compat/-/legacy-compat-5.3.9.tgz", + "integrity": "sha512-WQKez8tL60bjRUYt2mMjUWZI9FaSSCSKEPTnQSX5t6cIsuC67y3mDt5vmwMEITqw82uV8yXu8J44A1D/bY1aNw==", "dev": true }, "@ember-data-types/model": { - "version": "5.4.0-alpha.113", - "resolved": "https://registry.npmjs.org/@ember-data-types/model/-/model-5.4.0-alpha.113.tgz", - "integrity": "sha512-c8eGnArzHKkUYT9nvogSrDDkne/OVePiiQ/t5Na/64cn8hBW78ccUV6ylMK9rl2ZQvQN+eO6yEPbm6X6Z2+xBQ==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@ember-data-types/model/-/model-5.3.9.tgz", + "integrity": "sha512-N1KJ/qMdqI4wCV8TcyBGR583dqtqwyFcR5rjP0W2pZZ8khRDk3XROMzOa7wki/BYGkJxwfHxvlFVLRdAP/vF3w==", "dev": true }, "@ember-data-types/request": { - "version": "5.4.0-alpha.113", - "resolved": "https://registry.npmjs.org/@ember-data-types/request/-/request-5.4.0-alpha.113.tgz", - "integrity": "sha512-UNfujg0g0MT+Lo50qDa9Km1vgIUGulEtFyLL3pCvJy8fpynw4KN472HZLVH8DfRESpdHS9fXZQWqm7XKnQ99aQ==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@ember-data-types/request/-/request-5.3.9.tgz", + "integrity": "sha512-uD3hQCNkSvHFVmKXt4FCJY+GuU/6jL9c6lC5tAD+TMa/C6JrOoJAzeBoWt61xRxtVUcxQB6g4qjm11YsUy5tGw==", "dev": true }, "@ember-data-types/request-utils": { - "version": "5.4.0-alpha.113", - "resolved": "https://registry.npmjs.org/@ember-data-types/request-utils/-/request-utils-5.4.0-alpha.113.tgz", - "integrity": "sha512-ZaOZJB8l3Yf97AXZJdvEpja1cVoQbv+Oz6fTLt7S1EnUDxSK7+hv9m3gEk1coFX5tYAp/SAxfnjWGO4sN75wmw==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@ember-data-types/request-utils/-/request-utils-5.3.9.tgz", + "integrity": "sha512-7Iy23SE8404QD+eH9DuE2R3McW2A6Odsn/wKCwo7gmGyvDZB/5Ca9OOVsm2U9swO2xaQrlB4sE/139jkAji54A==", "dev": true }, "@ember-data-types/serializer": { - "version": "5.4.0-alpha.113", - "resolved": "https://registry.npmjs.org/@ember-data-types/serializer/-/serializer-5.4.0-alpha.113.tgz", - "integrity": "sha512-8ZkjyPfLs6bYARtE+xJa5RZfwxY5kzkoRCuQ9xarTb+NjN0yn/jCeDW5AtHHqE2Swru44ZZp5e6kFGgZipJTBg==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@ember-data-types/serializer/-/serializer-5.3.9.tgz", + "integrity": "sha512-WqzguopBOzm657s1bAGFK3E2O5+nvx2jJRi1kpsYrELxfbXpWCUWit3E9d8FGUqlMYoyBtQWdAwPosjuJTb2/Q==", "dev": true }, "@ember-data-types/store": { - "version": "5.4.0-alpha.113", - "resolved": "https://registry.npmjs.org/@ember-data-types/store/-/store-5.4.0-alpha.113.tgz", - "integrity": "sha512-pR2maUEtCQLxQ7VESfJ1/CP4AnmvtDYTXiK7I9+CtpV1WXazAZao2py7z4x9suY5qOgm1iY8bQ512AD2ZH5QGg==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@ember-data-types/store/-/store-5.3.9.tgz", + "integrity": "sha512-d6iEm6rktkVXmOzhi4QfKlt3dTCVOdSO569RAeDw8Ak3d8zCX3rLu/rcjOnISvGHQ0lVfDG3tHIpgfGpZmb5yg==", "dev": true }, "@ember-data-types/tracking": { - "version": "5.4.0-alpha.113", - "resolved": "https://registry.npmjs.org/@ember-data-types/tracking/-/tracking-5.4.0-alpha.113.tgz", - "integrity": "sha512-adgreEYFso9v2+BLLfHyYTOhtufelYcaSil4Z+rO/KOy/LCPSRr55pxFlN4VY5EOLKDeGbp6MWHb+dHzU33J2Q==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/@ember-data-types/tracking/-/tracking-5.3.9.tgz", + "integrity": "sha512-4vrPQBo0Hf5TpOuGNMMHWJItqcfuj/oc1RqmEkL9C0Sv60UGnfNLQ994Dsye7CPtjIcIQOdU7/1vhSBqybMgKA==", "dev": true }, "@ember-data/adapter": { @@ -63213,9 +63213,9 @@ "dev": true }, "@warp-drive-types/core-types": { - "version": "0.0.0-alpha.99", - "resolved": "https://registry.npmjs.org/@warp-drive-types/core-types/-/core-types-0.0.0-alpha.99.tgz", - "integrity": "sha512-q+drvSsY5U4mwrWA59N4bl1104vjXzCCKuxO6Jppah6DDq848J5q4YgN8sN4p8JAWVD8dZs9I6v1BMquQr0y3g==", + "version": "0.0.0-alpha.107", + "resolved": "https://registry.npmjs.org/@warp-drive-types/core-types/-/core-types-0.0.0-alpha.107.tgz", + "integrity": "sha512-nUsJplM8y1eTDnrsQ1shq+eJOEZ5476tsRkTE5GeTNha6viyJuvGKoTDhsI8Id/M+CBp8jFz18egYLiC8jShsA==", "dev": true }, "@webassemblyjs/ast": { @@ -71931,9 +71931,9 @@ } }, "ember-data-types": { - "version": "5.4.0-alpha.113", - "resolved": "https://registry.npmjs.org/ember-data-types/-/ember-data-types-5.4.0-alpha.113.tgz", - "integrity": "sha512-5JvxDlBAt8Zr46M7h8ByC99eKP0ul84z6aFKLMF7K+REie9gv6Sbdf8WfMO3cxwxdN3Xl7plauJ0mWXI5mH5qQ==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/ember-data-types/-/ember-data-types-5.3.9.tgz", + "integrity": "sha512-Dp7HS756l92pv+5W5zoFM5huIPfZqGVfNofZvf1w0qlRTUFVT/q8KqxFFNAcWvZyZtEqm34WyAlARhfuBgGuXA==", "dev": true }, "ember-fetch": { diff --git a/package.json b/package.json index 83f23493..ea521c19 100644 --- a/package.json +++ b/package.json @@ -41,16 +41,16 @@ "ember-cli-typescript": "^4.2.1" }, "devDependencies": { - "@ember-data-types/adapter": "5.4.0-alpha.113", - "@ember-data-types/graph": "5.4.0-alpha.113", - "@ember-data-types/json-api": "5.4.0-alpha.113", - "@ember-data-types/legacy-compat": "5.4.0-alpha.113", - "@ember-data-types/model": "5.4.0-alpha.113", - "@ember-data-types/request": "5.4.0-alpha.113", - "@ember-data-types/request-utils": "5.4.0-alpha.113", - "@ember-data-types/serializer": "5.4.0-alpha.113", - "@ember-data-types/store": "5.4.0-alpha.113", - "@ember-data-types/tracking": "5.4.0-alpha.113", + "@ember-data-types/adapter": "^5.3.9", + "@ember-data-types/graph": "^5.3.9", + "@ember-data-types/json-api": "^5.3.9", + "@ember-data-types/legacy-compat": "^5.3.9", + "@ember-data-types/model": "^5.3.9", + "@ember-data-types/request": "^5.3.9", + "@ember-data-types/request-utils": "^5.3.9", + "@ember-data-types/serializer": "^5.3.9", + "@ember-data-types/store": "^5.3.9", + "@ember-data-types/tracking": "^5.3.9", "@ember/optional-features": "^2.1.0", "@ember/string": "^3.1.1", "@ember/test-helpers": "^3.2.0", @@ -64,7 +64,7 @@ "@types/sinon": "^17.0.3", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", - "@warp-drive-types/core-types": "0.0.0-alpha.99", + "@warp-drive-types/core-types": "^0.0.0-alpha.107", "broccoli-asset-rev": "^3.0.0", "concurrently": "^8.2.2", "ember-cli": "~5.4.2", @@ -76,7 +76,7 @@ "ember-cli-terser": "^4.0.2", "ember-cli-typescript-blueprints": "^3.0.0", "ember-data": "~4.11.2", - "ember-data-types": "5.4.0-alpha.113", + "ember-data-types": "^5.3.9", "ember-fetch": "^8.1.2", "ember-load-initializers": "^2.1.2", "ember-page-title": "^8.0.0", diff --git a/tests/dummy/app/models/group.ts b/tests/dummy/app/models/group.ts index 5ec24aa9..57d9b193 100644 --- a/tests/dummy/app/models/group.ts +++ b/tests/dummy/app/models/group.ts @@ -4,7 +4,7 @@ */ import Model, { attr, hasMany, type AsyncHasMany } from '@ember-data/model'; -import { Type } from '@warp-drive/core-types/symbols'; +import type { Type } from '@warp-drive/core-types/symbols'; import type { Query } from 'firebase/firestore'; diff --git a/tests/dummy/app/models/post.ts b/tests/dummy/app/models/post.ts index cf73edb0..a091717e 100644 --- a/tests/dummy/app/models/post.ts +++ b/tests/dummy/app/models/post.ts @@ -4,7 +4,7 @@ */ import Model, { attr, belongsTo, type AsyncBelongsTo } from '@ember-data/model'; -import { Type } from '@warp-drive/core-types/symbols'; +import type { Type } from '@warp-drive/core-types/symbols'; import type { Firestore } from 'firebase/firestore'; diff --git a/tests/dummy/app/models/user.ts b/tests/dummy/app/models/user.ts index c0457393..0f56a741 100644 --- a/tests/dummy/app/models/user.ts +++ b/tests/dummy/app/models/user.ts @@ -4,7 +4,7 @@ */ import Model, { attr, hasMany, type AsyncHasMany } from '@ember-data/model'; -import { Type } from '@warp-drive/core-types/symbols'; +import type { Type } from '@warp-drive/core-types/symbols'; import type GroupModel from './group'; import type PostModel from './post'; From 84adce24542524338a5fa53dd31e80317e5d7bc5 Mon Sep 17 00:00:00 2001 From: Charles Fries Date: Mon, 30 Dec 2024 15:51:46 -0800 Subject: [PATCH 09/12] Ch --- addon/serializers/cloud-firestore-modular.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addon/serializers/cloud-firestore-modular.ts b/addon/serializers/cloud-firestore-modular.ts index 42fec602..252e7fc1 100644 --- a/addon/serializers/cloud-firestore-modular.ts +++ b/addon/serializers/cloud-firestore-modular.ts @@ -44,7 +44,7 @@ export default class CloudFirestoreSerializer extends JSONSerializer { relationshipHash: DocumentReference, ): { id: string; type: string } | Record { if (isNone(relationshipHash)) { - // @ts-expect-error ember data types incorrect + // @ts-expect-error ember data types aren't exporting serializer types correctly return super.extractRelationship(relationshipModelName, relationshipHash); } @@ -92,7 +92,7 @@ export default class CloudFirestoreSerializer extends JSONSerializer { newResourceHash.links = links; - // @ts-expect-error ember data types incorrect + // @ts-expect-error ember data types aren't exporting serializer types correctly return super.extractRelationships(modelClass, newResourceHash); } @@ -101,7 +101,7 @@ export default class CloudFirestoreSerializer extends JSONSerializer { json: { [key: string]: string | null | DocumentReference }, relationship: RelationshipDefinition, ): void { - // @ts-expect-error ember data types incorrect + // @ts-expect-error ember data types aren't exporting serializer types correctly super.serializeBelongsTo(snapshot, json, relationship); if (json[relationship.key]) { @@ -127,7 +127,7 @@ export default class CloudFirestoreSerializer extends JSONSerializer { options: Record, ): Record { const json: { [key: string]: unknown } = { - // @ts-expect-error ember data types incorrect + // @ts-expect-error ember data types aren't exporting serializer types correctly ...super.serialize(snapshot, options), }; From 61634d1ea58533ae25b1dff05b06c8fdd2b4a293 Mon Sep 17 00:00:00 2001 From: Charles Fries Date: Mon, 30 Dec 2024 16:26:54 -0800 Subject: [PATCH 10/12] Cleanup --- .../adapters/cloud-firestore-modular-test.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/tests/unit/adapters/cloud-firestore-modular-test.ts b/tests/unit/adapters/cloud-firestore-modular-test.ts index 1e2acd26..9d01514e 100644 --- a/tests/unit/adapters/cloud-firestore-modular-test.ts +++ b/tests/unit/adapters/cloud-firestore-modular-test.ts @@ -10,6 +10,7 @@ import EmberObject from '@ember/object'; import Store from '@ember-data/store'; import type { ModelSchema } from '@ember-data/store/types'; +import type { EmptyResourceDocument } from '@warp-drive/core-types/spec/json-api-raw'; import type { CollectionReference, Firestore, @@ -280,7 +281,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) { // Arrange const store = this.owner.lookup('service:store'); store.normalize = sinon.stub(); - store.push = sinon.stub() as any; + (store.push as (data: EmptyResourceDocument) => null) = sinon.stub(); const modelClass = { modelName: 'user' } as ModelSchema; const adapter = this.owner.lookup( 'adapter:cloud-firestore-modular', @@ -318,7 +319,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) { // Arrange const store = this.owner.lookup('service:store'); store.normalize = sinon.stub(); - store.push = sinon.stub() as any; + (store.push as (data: EmptyResourceDocument) => null) = sinon.stub(); const modelClass = { modelName: 'user' } as ModelSchema; const modelId = 'user_a'; const snapshot = {}; @@ -347,7 +348,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) { // Arrange const store = this.owner.lookup('service:store'); store.normalize = sinon.stub(); - store.push = sinon.stub() as any; + (store.push as (data: EmptyResourceDocument) => null) = sinon.stub(); const modelClass = { modelName: 'user' } as ModelSchema; const modelId = 'user_a'; const snapshot = { @@ -379,7 +380,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) { const store = this.owner.lookup('service:store'); store.normalize = sinon.stub(); - store.push = sinon.stub() as any; + (store.push as (data: EmptyResourceDocument) => null) = sinon.stub(); const modelClass = { modelName: 'user' } as ModelSchema; const modelId = 'user_100'; const snapshot = {}; @@ -406,7 +407,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) { // Arrange const store = this.owner.lookup('service:store'); store.normalize = sinon.stub(); - store.push = sinon.stub() as any; + (store.push as (data: EmptyResourceDocument) => null) = sinon.stub(); const snapshot = {}; const url = 'users/user_a'; const relationship = { type: 'user', options: {} }; @@ -451,7 +452,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) { const store = this.owner.lookup('service:store'); store.normalize = sinon.stub(); - store.push = sinon.stub() as any; + (store.push as (data: EmptyResourceDocument) => null) = sinon.stub(); const snapshot = { id: 'user_a', modelName: 'user', @@ -504,7 +505,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) { const store = this.owner.lookup('service:store'); store.normalize = sinon.stub(); - store.push = sinon.stub() as any; + (store.push as (data: EmptyResourceDocument) => null) = sinon.stub(); const snapshot = { modelName: 'user', record: EmberObject.create({ @@ -564,7 +565,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) { const store = this.owner.lookup('service:store'); store.normalize = sinon.stub(); - store.push = sinon.stub() as any; + (store.push as (data: EmptyResourceDocument) => null) = sinon.stub(); const snapshot = { id: 'user_a', modelName: 'user', @@ -607,7 +608,7 @@ module('Unit | Adapter | cloud firestore modular', function (hooks) { // Arrange const store = this.owner.lookup('service:store'); store.normalize = sinon.stub(); - store.push = sinon.stub() as any; + (store.push as (data: EmptyResourceDocument) => null) = sinon.stub(); const snapshot = { record: EmberObject.create({ id: 'user_a' } as any), }; From e7098c6c76236454f90554f831e4c279e66338ca Mon Sep 17 00:00:00 2001 From: Charles Fries Date: Mon, 30 Dec 2024 16:53:39 -0800 Subject: [PATCH 11/12] Type imports --- addon/adapters/cloud-firestore-modular.ts | 1 - types/global.d.ts | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/addon/adapters/cloud-firestore-modular.ts b/addon/adapters/cloud-firestore-modular.ts index 61b37cf6..54116ae9 100644 --- a/addon/adapters/cloud-firestore-modular.ts +++ b/addon/adapters/cloud-firestore-modular.ts @@ -62,7 +62,6 @@ type BelongsToRelationshipMeta = LegacyBelongsToField & { type HasManyRelationshipMeta = LegacyHasManyField & { key: string; - type: string; options: { isRealtime?: boolean; diff --git a/types/global.d.ts b/types/global.d.ts index 7c9a3bf0..0f87f19b 100644 --- a/types/global.d.ts +++ b/types/global.d.ts @@ -1,3 +1,6 @@ +import 'ember-source/types'; +import 'ember-source/types/preview'; + // eslint-disable-next-line @typescript-eslint/no-explicit-any declare const FastBoot: { require(moduleName: string): any } | undefined; From f2a0b477ecb23152fc62f3af0e06f6766a68ff81 Mon Sep 17 00:00:00 2001 From: Charles Fries Date: Mon, 30 Dec 2024 16:58:05 -0800 Subject: [PATCH 12/12] Mv --- types/dummy/app.d.ts | 3 +++ types/global.d.ts | 3 --- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/types/dummy/app.d.ts b/types/dummy/app.d.ts index 4d8bb7b1..7ac8d326 100644 --- a/types/dummy/app.d.ts +++ b/types/dummy/app.d.ts @@ -1,3 +1,6 @@ +import 'ember-source/types'; +import 'ember-source/types/preview'; + declare module 'dummy/app' { import Application from '@ember/application'; diff --git a/types/global.d.ts b/types/global.d.ts index 0f87f19b..7c9a3bf0 100644 --- a/types/global.d.ts +++ b/types/global.d.ts @@ -1,6 +1,3 @@ -import 'ember-source/types'; -import 'ember-source/types/preview'; - // eslint-disable-next-line @typescript-eslint/no-explicit-any declare const FastBoot: { require(moduleName: string): any } | undefined;