diff --git a/CHANGELOG.md b/CHANGELOG.md index 57db1c401c2..b225ed1b8b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -99,7 +99,7 @@ * fix: de-dupe coalescing when includes or adapterOptions is present but still use findRecord #8704 * fix: make implicit relationship teardown following delete of related record safe #8705 * fix: catch errors during didCommit in DEBUG #8708 - + ## 5.1.1 (2023-07-07) #### :bug: Bug Fix @@ -3053,7 +3053,7 @@ The full API reference of `DS.Snapshot` can be found [here](https://api.emberjs. - fetch() -> fetchById() in docs - Run findHasMany inside an ED runloop - Cleanup debug adapter test: Watching Records -- Fixed didDelete event/callback not fired in uncommited state +- Fixed didDelete event/callback not fired in uncommitted state - Add main entry point for package.json. - register the store as a service - Warn when expected coalesced records are not found in the response diff --git a/package.json b/package.json index 88a52fb5341..b581b44df8b 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,8 @@ "scripts": { "takeoff": "FORCE_COLOR=2 pnpm install --reporter=append-only", "prepare": "pnpm build", - "build": "turbo _build --log-order=stream --filter=./packages/*", + "build": "turbo _build --log-order=stream --filter=./packages/* --concurrency=1; pnpm run sync:tests", + "sync:tests": "pnpm run --filter=./tests/* -r --workspace-concurrency=1 --if-present _syncPnpm", "build:docs": "mkdir -p packages/-ember-data/dist && cd ./docs-generator && node ./compile-docs.js", "lint": "bun run turbo --log-order=stream lint --concurrency=1", "lint:prettier": "prettier --check --cache --cache-location=.prettier-cache --log-level=warn .", diff --git a/packages/active-record/package.json b/packages/active-record/package.json index b376834658d..69870d531a5 100644 --- a/packages/active-record/package.json +++ b/packages/active-record/package.json @@ -61,7 +61,8 @@ "README.md", "LICENSE.md", "ember-data-logo-dark.svg", - "ember-data-logo-light.svg" + "ember-data-logo-light.svg", + "unstable-preview-types" ], "exports": { "./*": { diff --git a/packages/unpublished-test-infra/package.json b/packages/unpublished-test-infra/package.json index 7ec645f24b5..54df15f4435 100644 --- a/packages/unpublished-test-infra/package.json +++ b/packages/unpublished-test-infra/package.json @@ -13,13 +13,36 @@ }, "license": "MIT", "author": "", + "files": [ + "addon-test-support", + "src", + "index.js", + "dist", + "tsconfig.json" + ], + "typesVersions": { + "*": { + "test-support": [ + "dist/addon-test-support/index.d.ts" + ], + "test-support/*": [ + "dist/addon-test-support/*", + "dist/addon-test-support/*/index.d.ts" + ], + "*": [ + "dist/addon/*", + "dist/addon/*/index.d.ts" + ] + } + }, "directories": { "doc": "doc", "test": "tests" }, "scripts": { - "check:types": "tsc --noEmit", "test:infra": "ember test", + "build:types": "tsc --build --emitDeclarationOnly", + "_build": "bun run build:types", "_syncPnpm": "bun run sync-dependencies-meta-injected" }, "peerDependencies": { diff --git a/packages/unpublished-test-infra/tsconfig.json b/packages/unpublished-test-infra/tsconfig.json index 87ee035d61a..a98ba5b4457 100644 --- a/packages/unpublished-test-infra/tsconfig.json +++ b/packages/unpublished-test-infra/tsconfig.json @@ -13,7 +13,7 @@ "allowSyntheticDefaultImports": true, "forceConsistentCasingInFileNames": true, "allowJs": true, - "noEmit": true, + "noEmit": false, "noImplicitOverride": true, // Enable faster builds diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cbde8b743e6..126088bcaa0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2413,6 +2413,9 @@ importers: silent-error: specifier: ^1.1.1 version: 1.1.1 + typescript: + specifier: ^5.2.2 + version: 5.2.2 webpack: specifier: ^5.89.0 version: 5.89.0 @@ -2569,6 +2572,9 @@ importers: pnpm-sync-dependencies-meta-injected: specifier: 0.0.10 version: 0.0.10 + typescript: + specifier: ^5.2.2 + version: 5.2.2 webpack: specifier: ^5.89.0 version: 5.89.0 @@ -2730,6 +2736,9 @@ importers: silent-error: specifier: ^1.1.1 version: 1.1.1 + typescript: + specifier: ^5.2.2 + version: 5.2.2 webpack: specifier: ^5.89.0 version: 5.89.0 @@ -2777,12 +2786,21 @@ importers: '@babel/runtime': specifier: ^7.23.2 version: 7.23.2 + '@ember-data/debug': + specifier: workspace:5.5.0-alpha.11 + version: file:packages/debug(@ember-data/store@5.5.0-alpha.11)(@ember/string@3.1.1) '@ember-data/graph': specifier: workspace:5.5.0-alpha.11 version: file:packages/graph(@babel/core@7.23.2)(@ember-data/store@5.5.0-alpha.11)(@warp-drive/core-types@5.5.0-alpha.11) '@ember-data/json-api': specifier: workspace:5.5.0-alpha.11 version: file:packages/json-api(@babel/core@7.23.2)(@ember-data/graph@5.5.0-alpha.11)(@ember-data/request-utils@5.5.0-alpha.11)(@ember-data/store@5.5.0-alpha.11)(@warp-drive/core-types@5.5.0-alpha.11)(ember-inflector@4.0.2) + '@ember-data/legacy-compat': + specifier: workspace:5.5.0-alpha.11 + version: file:packages/legacy-compat(@babel/core@7.23.2)(@ember-data/graph@5.5.0-alpha.11)(@ember-data/json-api@5.5.0-alpha.11)(@ember-data/request@5.5.0-alpha.11)(@ember-data/store@5.5.0-alpha.11)(@warp-drive/core-types@5.5.0-alpha.11) + '@ember-data/model': + specifier: workspace:5.5.0-alpha.11 + version: file:packages/model(@babel/core@7.23.2)(@ember-data/debug@5.5.0-alpha.11)(@ember-data/graph@5.5.0-alpha.11)(@ember-data/json-api@5.5.0-alpha.11)(@ember-data/legacy-compat@5.5.0-alpha.11)(@ember-data/store@5.5.0-alpha.11)(@ember-data/tracking@5.5.0-alpha.11)(@ember/string@3.1.1)(@warp-drive/core-types@5.5.0-alpha.11)(ember-inflector@4.0.2) '@ember-data/private-build-infra': specifier: workspace:5.5.0-alpha.11 version: file:packages/private-build-infra @@ -2882,14 +2900,23 @@ importers: silent-error: specifier: ^1.1.1 version: 1.1.1 + typescript: + specifier: ^5.2.2 + version: 5.2.2 webpack: specifier: ^5.89.0 version: 5.89.0 dependenciesMeta: + '@ember-data/debug': + injected: true '@ember-data/graph': injected: true '@ember-data/json-api': injected: true + '@ember-data/legacy-compat': + injected: true + '@ember-data/model': + injected: true '@ember-data/private-build-infra': injected: true '@ember-data/request': @@ -3016,6 +3043,9 @@ importers: loader.js: specifier: ^4.7.0 version: 4.7.0 + typescript: + specifier: ^5.2.2 + version: 5.2.2 webpack: specifier: ^5.89.0 version: 5.89.0 @@ -3157,6 +3187,9 @@ importers: silent-error: specifier: ^1.1.1 version: 1.1.1 + typescript: + specifier: ^5.2.2 + version: 5.2.2 webpack: specifier: ^5.89.0 version: 5.89.0 @@ -3284,6 +3317,9 @@ importers: qunit-dom: specifier: ^3.0.0 version: 3.0.0 + typescript: + specifier: ^5.2.2 + version: 5.2.2 webpack: specifier: ^5.89.0 version: 5.89.0 diff --git a/tests/builders/app/app.ts b/tests/builders/app/app.ts index 1f39476ae86..8f235d166e6 100644 --- a/tests/builders/app/app.ts +++ b/tests/builders/app/app.ts @@ -8,7 +8,7 @@ import Resolver from './resolver'; class App extends Application { modulePrefix = config.modulePrefix; podModulePrefix = config.podModulePrefix; - Resolver = Resolver; + override Resolver = Resolver; } loadInitializers(App, config.modulePrefix); diff --git a/tests/builders/app/services/store.ts b/tests/builders/app/services/store.ts index ece2c2b1ec7..f0957be4881 100644 --- a/tests/builders/app/services/store.ts +++ b/tests/builders/app/services/store.ts @@ -7,8 +7,9 @@ import { buildSchema, modelFor } from '@ember-data/model/hooks'; import RequestManager from '@ember-data/request'; import Fetch from '@ember-data/request/fetch'; import DataStore, { CacheHandler } from '@ember-data/store'; -import type { Cache } from '@ember-data/store/-types/cache/cache'; import type { CacheCapabilitiesManager } from '@ember-data/store/-types/q/cache-store-wrapper'; +import { ModelSchema } from '@ember-data/store/-types/q/ds-model'; +import type { Cache } from '@warp-drive/core-types/cache'; export default class Store extends DataStore { constructor(args: unknown) { @@ -21,19 +22,22 @@ export default class Store extends DataStore { this.registerSchema(buildSchema(this)); } - createCache(capabilities: CacheCapabilitiesManager): Cache { + override createCache(capabilities: CacheCapabilitiesManager): Cache { return new JSONAPICache(capabilities); } - instantiateRecord(identifier: StableRecordIdentifier, createRecordArgs: { [key: string]: unknown }): unknown { + override instantiateRecord( + identifier: StableRecordIdentifier, + createRecordArgs: { [key: string]: unknown } + ): unknown { return instantiateRecord.call(this, identifier, createRecordArgs); } - teardownRecord(record: Model): void { + override teardownRecord(record: Model): void { return teardownRecord.call(this, record); } - modelFor(type: string) { - return modelFor.call(this, type); + override modelFor(type: string): ModelSchema { + return modelFor.call(this, type)!; } } diff --git a/tests/builders/package.json b/tests/builders/package.json index a1f105f7710..fab29f56299 100644 --- a/tests/builders/package.json +++ b/tests/builders/package.json @@ -16,6 +16,7 @@ "scripts": { "build:tests": "IS_TESTING=true EMBER_CLI_TEST_COMMAND=true ember build --output-path=dist-test --suppress-sizes", "build:production": "pnpm build:tests -e production", + "check:types": "tsc --noEmit", "test": "bun ./diagnostic.js", "test:production": "bun ./diagnostic.js", "_syncPnpm": "bun run sync-dependencies-meta-injected" @@ -114,6 +115,7 @@ "ember-source-channel-url": "^3.0.0", "loader.js": "^4.7.0", "silent-error": "^1.1.1", + "typescript": "^5.2.2", "webpack": "^5.89.0" }, "ember": { diff --git a/tests/builders/tests/integration/create-record-test.ts b/tests/builders/tests/integration/create-record-test.ts index 7ea9f20f797..7ceab8ca272 100644 --- a/tests/builders/tests/integration/create-record-test.ts +++ b/tests/builders/tests/integration/create-record-test.ts @@ -6,16 +6,18 @@ import JSONAPICache from '@ember-data/json-api'; import { createRecord } from '@ember-data/json-api/request'; import Model, { attr, instantiateRecord, teardownRecord } from '@ember-data/model'; import { buildSchema, modelFor } from '@ember-data/model/hooks'; -import type { StructuredDataDocument } from '@ember-data/request'; +import type { RequestContext, StructuredDataDocument } from '@ember-data/request'; import RequestManager from '@ember-data/request'; -import type { Future, Handler, RequestContext } from '@ember-data/request/-private/types'; import { setBuildURLConfig } from '@ember-data/request-utils'; +import type { Future, Handler } from '@ember-data/request/-private/types'; import DataStore, { CacheHandler, recordIdentifierFor } from '@ember-data/store'; -import type { Cache } from '@ember-data/store/-types/cache/cache'; -import { SingleResourceDataDocument } from '@ember-data/store/-types/cache/document'; import type { CacheCapabilitiesManager } from '@ember-data/store/-types/q/cache-store-wrapper'; -import { SingleResourceDocument } from '@warp-drive/core-types/spec/raw'; +import { ModelSchema } from '@ember-data/store/-types/q/ds-model'; import { JsonApiError } from '@ember-data/store/-types/q/record-data-json-api'; +import { TestContext } from '@ember/test-helpers'; +import type { Cache } from '@warp-drive/core-types/cache'; +import type { SingleResourceDataDocument } from '@warp-drive/core-types/spec/document'; +import type { SingleResourceDocument } from '@warp-drive/core-types/spec/raw'; class TestStore extends DataStore { constructor(args: unknown) { @@ -27,20 +29,23 @@ class TestStore extends DataStore { this.registerSchema(buildSchema(this)); } - createCache(capabilities: CacheCapabilitiesManager): Cache { + override createCache(capabilities: CacheCapabilitiesManager): Cache { return new JSONAPICache(capabilities); } - instantiateRecord(identifier: StableRecordIdentifier, createRecordArgs: { [key: string]: unknown }): unknown { + override instantiateRecord( + identifier: StableRecordIdentifier, + createRecordArgs: { [key: string]: unknown } + ): unknown { return instantiateRecord.call(this, identifier, createRecordArgs); } - teardownRecord(record: Model): void { + override teardownRecord(record: Model): void { return teardownRecord.call(this, record); } - modelFor(type: string) { - return modelFor.call(this, type); + override modelFor(type: string): ModelSchema { + return modelFor.call(this, type)!; } } @@ -59,23 +64,23 @@ module('Integration - createRecord', function (hooks) { setBuildURLConfig({ host: '', namespace: '' }); }); - test('Saving a new record with a createRecord op works as expected', async function (assert) { + test('Saving a new record with a createRecord op works as expected', async function (this: TestContext, assert) { const { owner } = this; // intercept cache APIs to ensure they are called as expected class TestCache extends JSONAPICache { - willCommit(identifier: StableRecordIdentifier): void { + override willCommit(identifier: StableRecordIdentifier): void { assert.step(`willCommit ${identifier.lid}`); return super.willCommit(identifier); } - didCommit( + override didCommit( committedIdentifier: StableRecordIdentifier, result: StructuredDataDocument ): SingleResourceDataDocument { assert.step(`didCommit ${committedIdentifier.lid}`); return super.didCommit(committedIdentifier, result); } - commitWasRejected(identifier: StableRecordIdentifier, errors?: JsonApiError[]): void { + override commitWasRejected(identifier: StableRecordIdentifier, errors?: JsonApiError[]): void { assert.step(`commitWasRejected ${identifier.lid}`); return super.commitWasRejected(identifier, errors); } @@ -101,7 +106,7 @@ module('Integration - createRecord', function (hooks) { const manager = this.requestManager; manager.use([TestHandler]); } - createCache(capabilities: CacheCapabilitiesManager): Cache { + override createCache(capabilities: CacheCapabilitiesManager): Cache { return new TestCache(capabilities); } } @@ -139,23 +144,23 @@ module('Integration - createRecord', function (hooks) { assert.verifySteps([`willCommit ${identifier.lid}`, 'handle createRecord request', `didCommit ${identifier.lid}`]); }); - test('Rejecting during Save of a new record with a createRecord op works as expected', async function (assert) { + test('Rejecting during Save of a new record with a createRecord op works as expected', async function (this: TestContext, assert) { const { owner } = this; // intercept cache APIs to ensure they are called as expected class TestCache extends JSONAPICache { - willCommit(identifier: StableRecordIdentifier): void { + override willCommit(identifier: StableRecordIdentifier): void { assert.step(`willCommit ${identifier.lid}`); return super.willCommit(identifier); } - didCommit( + override didCommit( committedIdentifier: StableRecordIdentifier, result: StructuredDataDocument ): SingleResourceDataDocument { assert.step(`didCommit ${committedIdentifier.lid}`); return super.didCommit(committedIdentifier, result); } - commitWasRejected(identifier: StableRecordIdentifier, errors?: JsonApiError[]): void { + override commitWasRejected(identifier: StableRecordIdentifier, errors?: JsonApiError[]): void { assert.step(`commitWasRejected ${identifier.lid}`); return super.commitWasRejected(identifier, errors); } @@ -181,7 +186,7 @@ module('Integration - createRecord', function (hooks) { const manager = this.requestManager; manager.use([TestHandler]); } - createCache(capabilities: CacheCapabilitiesManager): Cache { + override createCache(capabilities: CacheCapabilitiesManager): Cache { return new TestCache(capabilities); } } diff --git a/tests/builders/tests/integration/delete-record-test.ts b/tests/builders/tests/integration/delete-record-test.ts index 19dc0021891..f6b90fc8ac0 100644 --- a/tests/builders/tests/integration/delete-record-test.ts +++ b/tests/builders/tests/integration/delete-record-test.ts @@ -6,16 +6,18 @@ import JSONAPICache from '@ember-data/json-api'; import { deleteRecord } from '@ember-data/json-api/request'; import Model, { attr, instantiateRecord, teardownRecord } from '@ember-data/model'; import { buildSchema, modelFor } from '@ember-data/model/hooks'; -import type { StructuredDataDocument } from '@ember-data/request'; +import type { RequestContext, StructuredDataDocument } from '@ember-data/request'; import RequestManager from '@ember-data/request'; -import type { Future, Handler, RequestContext } from '@ember-data/request/-private/types'; import { setBuildURLConfig } from '@ember-data/request-utils'; +import type { Future, Handler } from '@ember-data/request/-private/types'; import DataStore, { CacheHandler, recordIdentifierFor } from '@ember-data/store'; -import type { Cache } from '@ember-data/store/-types/cache/cache'; -import { SingleResourceDataDocument } from '@ember-data/store/-types/cache/document'; import type { CacheCapabilitiesManager } from '@ember-data/store/-types/q/cache-store-wrapper'; -import { SingleResourceDocument } from '@warp-drive/core-types/spec/raw'; +import { ModelSchema } from '@ember-data/store/-types/q/ds-model'; import { JsonApiError } from '@ember-data/store/-types/q/record-data-json-api'; +import { TestContext } from '@ember/test-helpers'; +import type { Cache } from '@warp-drive/core-types/cache'; +import type { SingleResourceDataDocument } from '@warp-drive/core-types/spec/document'; +import type { SingleResourceDocument } from '@warp-drive/core-types/spec/raw'; class TestStore extends DataStore { constructor(args: unknown) { @@ -27,20 +29,23 @@ class TestStore extends DataStore { this.registerSchema(buildSchema(this)); } - createCache(capabilities: CacheCapabilitiesManager): Cache { + override createCache(capabilities: CacheCapabilitiesManager): Cache { return new JSONAPICache(capabilities); } - instantiateRecord(identifier: StableRecordIdentifier, createRecordArgs: { [key: string]: unknown }): unknown { + override instantiateRecord( + identifier: StableRecordIdentifier, + createRecordArgs: { [key: string]: unknown } + ): unknown { return instantiateRecord.call(this, identifier, createRecordArgs); } - teardownRecord(record: Model): void { + override teardownRecord(record: Model): void { return teardownRecord.call(this, record); } - modelFor(type: string) { - return modelFor.call(this, type); + override modelFor(type: string): ModelSchema { + return modelFor.call(this, type)!; } } @@ -59,23 +64,23 @@ module('Integration - deleteRecord', function (hooks) { setBuildURLConfig({ host: '', namespace: '' }); }); - test('Persisting deletion for a record with a deleteRecord op works as expected', async function (assert) { + test('Persisting deletion for a record with a deleteRecord op works as expected', async function (this: TestContext, assert) { const { owner } = this; // intercept cache APIs to ensure they are called as expected class TestCache extends JSONAPICache { - willCommit(identifier: StableRecordIdentifier): void { + override willCommit(identifier: StableRecordIdentifier): void { assert.step(`willCommit ${identifier.lid}`); return super.willCommit(identifier); } - didCommit( + override didCommit( committedIdentifier: StableRecordIdentifier, result: StructuredDataDocument ): SingleResourceDataDocument { assert.step(`didCommit ${committedIdentifier.lid}`); return super.didCommit(committedIdentifier, result); } - commitWasRejected(identifier: StableRecordIdentifier, errors?: JsonApiError[]): void { + override commitWasRejected(identifier: StableRecordIdentifier, errors?: JsonApiError[]): void { assert.step(`commitWasRejected ${identifier.lid}`); return super.commitWasRejected(identifier, errors); } @@ -101,7 +106,7 @@ module('Integration - deleteRecord', function (hooks) { const manager = this.requestManager; manager.use([TestHandler]); } - createCache(capabilities: CacheCapabilitiesManager): Cache { + override createCache(capabilities: CacheCapabilitiesManager): Cache { return new TestCache(capabilities); } } @@ -155,23 +160,23 @@ module('Integration - deleteRecord', function (hooks) { assert.equal(user2?.name, 'John', 'The user has the expected name'); }); - test('Rejecting while persisting a deletion with a deleteRecord op works as expected', async function (assert) { + test('Rejecting while persisting a deletion with a deleteRecord op works as expected', async function (this: TestContext, assert) { const { owner } = this; // intercept cache APIs to ensure they are called as expected class TestCache extends JSONAPICache { - willCommit(identifier: StableRecordIdentifier): void { + override willCommit(identifier: StableRecordIdentifier): void { assert.step(`willCommit ${identifier.lid}`); return super.willCommit(identifier); } - didCommit( + override didCommit( committedIdentifier: StableRecordIdentifier, result: StructuredDataDocument ): SingleResourceDataDocument { assert.step(`didCommit ${committedIdentifier.lid}`); return super.didCommit(committedIdentifier, result); } - commitWasRejected(identifier: StableRecordIdentifier, errors?: JsonApiError[]): void { + override commitWasRejected(identifier: StableRecordIdentifier, errors?: JsonApiError[]): void { assert.step(`commitWasRejected ${identifier.lid}`); return super.commitWasRejected(identifier, errors); } @@ -197,7 +202,7 @@ module('Integration - deleteRecord', function (hooks) { const manager = this.requestManager; manager.use([TestHandler]); } - createCache(capabilities: CacheCapabilitiesManager): Cache { + override createCache(capabilities: CacheCapabilitiesManager): Cache { return new TestCache(capabilities); } } diff --git a/tests/builders/tests/integration/update-record-test.ts b/tests/builders/tests/integration/update-record-test.ts index 74b86c095dd..de2659cbb9a 100644 --- a/tests/builders/tests/integration/update-record-test.ts +++ b/tests/builders/tests/integration/update-record-test.ts @@ -6,16 +6,18 @@ import JSONAPICache from '@ember-data/json-api'; import { updateRecord } from '@ember-data/json-api/request'; import Model, { attr, instantiateRecord, teardownRecord } from '@ember-data/model'; import { buildSchema, modelFor } from '@ember-data/model/hooks'; -import type { StructuredDataDocument } from '@ember-data/request'; +import type { RequestContext, StructuredDataDocument } from '@ember-data/request'; import RequestManager from '@ember-data/request'; -import type { Future, Handler, RequestContext } from '@ember-data/request/-private/types'; import { setBuildURLConfig } from '@ember-data/request-utils'; +import type { Future, Handler } from '@ember-data/request/-private/types'; import DataStore, { CacheHandler, recordIdentifierFor } from '@ember-data/store'; -import type { Cache } from '@ember-data/store/-types/cache/cache'; -import { SingleResourceDataDocument } from '@ember-data/store/-types/cache/document'; import type { CacheCapabilitiesManager } from '@ember-data/store/-types/q/cache-store-wrapper'; -import { SingleResourceDocument } from '@warp-drive/core-types/spec/raw'; +import { ModelSchema } from '@ember-data/store/-types/q/ds-model'; import { JsonApiError } from '@ember-data/store/-types/q/record-data-json-api'; +import { TestContext } from '@ember/test-helpers'; +import type { Cache } from '@warp-drive/core-types/cache'; +import { SingleResourceDataDocument } from '@warp-drive/core-types/spec/document'; +import { SingleResourceDocument } from '@warp-drive/core-types/spec/raw'; class TestStore extends DataStore { constructor(args: unknown) { @@ -27,20 +29,23 @@ class TestStore extends DataStore { this.registerSchema(buildSchema(this)); } - createCache(capabilities: CacheCapabilitiesManager): Cache { + override createCache(capabilities: CacheCapabilitiesManager): Cache { return new JSONAPICache(capabilities); } - instantiateRecord(identifier: StableRecordIdentifier, createRecordArgs: { [key: string]: unknown }): unknown { + override instantiateRecord( + identifier: StableRecordIdentifier, + createRecordArgs: { [key: string]: unknown } + ): unknown { return instantiateRecord.call(this, identifier, createRecordArgs); } - teardownRecord(record: Model): void { + override teardownRecord(record: Model): void { return teardownRecord.call(this, record); } - modelFor(type: string) { - return modelFor.call(this, type); + override modelFor(type: string): ModelSchema { + return modelFor.call(this, type)!; } } @@ -59,23 +64,23 @@ module('Integration - updateRecord', function (hooks) { setBuildURLConfig({ host: '', namespace: '' }); }); - test('Saving a record with an updateRecord op works as expected', async function (assert) { + test('Saving a record with an updateRecord op works as expected', async function (this: TestContext, assert) { const { owner } = this; // intercept cache APIs to ensure they are called as expected class TestCache extends JSONAPICache { - willCommit(identifier: StableRecordIdentifier): void { + override willCommit(identifier: StableRecordIdentifier): void { assert.step(`willCommit ${identifier.lid}`); return super.willCommit(identifier); } - didCommit( + override didCommit( committedIdentifier: StableRecordIdentifier, result: StructuredDataDocument ): SingleResourceDataDocument { assert.step(`didCommit ${committedIdentifier.lid}`); return super.didCommit(committedIdentifier, result); } - commitWasRejected(identifier: StableRecordIdentifier, errors?: JsonApiError[]): void { + override commitWasRejected(identifier: StableRecordIdentifier, errors?: JsonApiError[]): void { assert.step(`commitWasRejected ${identifier.lid}`); return super.commitWasRejected(identifier, errors); } @@ -101,7 +106,7 @@ module('Integration - updateRecord', function (hooks) { const manager = this.requestManager; manager.use([TestHandler]); } - createCache(capabilities: CacheCapabilitiesManager): Cache { + override createCache(capabilities: CacheCapabilitiesManager): Cache { return new TestCache(capabilities); } } @@ -140,23 +145,23 @@ module('Integration - updateRecord', function (hooks) { assert.verifySteps([`willCommit ${identifier.lid}`, 'handle updateRecord request', `didCommit ${identifier.lid}`]); }); - test('Rejecting during Save of a new record with a createRecord op works as expected', async function (assert) { + test('Rejecting during Save of a new record with a createRecord op works as expected', async function (this: TestContext, assert) { const { owner } = this; // intercept cache APIs to ensure they are called as expected class TestCache extends JSONAPICache { - willCommit(identifier: StableRecordIdentifier): void { + override willCommit(identifier: StableRecordIdentifier): void { assert.step(`willCommit ${identifier.lid}`); return super.willCommit(identifier); } - didCommit( + override didCommit( committedIdentifier: StableRecordIdentifier, result: StructuredDataDocument ): SingleResourceDataDocument { assert.step(`didCommit ${committedIdentifier.lid}`); return super.didCommit(committedIdentifier, result); } - commitWasRejected(identifier: StableRecordIdentifier, errors?: JsonApiError[]): void { + override commitWasRejected(identifier: StableRecordIdentifier, errors?: JsonApiError[]): void { assert.step(`commitWasRejected ${identifier.lid}`); return super.commitWasRejected(identifier, errors); } @@ -182,7 +187,7 @@ module('Integration - updateRecord', function (hooks) { const manager = this.requestManager; manager.use([TestHandler]); } - createCache(capabilities: CacheCapabilitiesManager): Cache { + override createCache(capabilities: CacheCapabilitiesManager): Cache { return new TestCache(capabilities); } } diff --git a/tests/builders/tests/unit/active-record-builder-test.ts b/tests/builders/tests/unit/active-record-builder-test.ts index d317a3f440f..373605c1589 100644 --- a/tests/builders/tests/unit/active-record-builder-test.ts +++ b/tests/builders/tests/unit/active-record-builder-test.ts @@ -4,6 +4,7 @@ import { setupTest } from '@warp-drive/diagnostic/ember'; import { createRecord, deleteRecord, findRecord, query, updateRecord } from '@ember-data/active-record/request'; import { setBuildURLConfig } from '@ember-data/request-utils'; import Store, { recordIdentifierFor } from '@ember-data/store'; +import { TestContext } from '@ember/test-helpers'; import UserSetting from '../../app/models/user-setting'; import { headersToObject } from '../helpers/utils'; @@ -21,7 +22,7 @@ module('ActiveRecord | Request Builders', function (hooks) { setBuildURLConfig({ host: '', namespace: '' }); }); - test('findRecord by identifier', function (assert) { + test('findRecord by identifier', function (this: TestContext, assert) { const result = findRecord({ type: 'user-setting', id: '1' }); assert.deepEqual( result, @@ -38,7 +39,7 @@ module('ActiveRecord | Request Builders', function (hooks) { assert.deepEqual(headersToObject(result.headers), ACTIVE_RECORD_HEADERS); }); - test('findRecord by type+id', function (assert) { + test('findRecord by type+id', function (this: TestContext, assert) { const result = findRecord('user-setting', '1'); assert.deepEqual( result, @@ -55,7 +56,7 @@ module('ActiveRecord | Request Builders', function (hooks) { assert.deepEqual(headersToObject(result.headers), ACTIVE_RECORD_HEADERS); }); - test('findRecord by identifier with options', function (assert) { + test('findRecord by identifier with options', function (this: TestContext, assert) { const result = findRecord( { type: 'user-setting', id: '1' }, { reload: true, backgroundReload: false, include: 'user,friends' } @@ -78,7 +79,7 @@ module('ActiveRecord | Request Builders', function (hooks) { assert.deepEqual(headersToObject(result.headers), ACTIVE_RECORD_HEADERS); }); - test('findRecord by type+id with options', function (assert) { + test('findRecord by type+id with options', function (this: TestContext, assert) { const result = findRecord('user-setting', '1', { reload: true, backgroundReload: false, include: 'user,friends' }); assert.deepEqual( result, @@ -95,7 +96,7 @@ module('ActiveRecord | Request Builders', function (hooks) { assert.deepEqual(headersToObject(result.headers), ACTIVE_RECORD_HEADERS); }); - test('query', function (assert) { + test('query', function (this: TestContext, assert) { const result = query( 'user-setting', { include: 'user,friends', sort: 'name:asc', search: ['zeta', 'beta'] }, @@ -115,7 +116,7 @@ module('ActiveRecord | Request Builders', function (hooks) { assert.deepEqual(headersToObject(result.headers), ACTIVE_RECORD_HEADERS); }); - test('createRecord passing store record', function (assert) { + test('createRecord passing store record', function (this: TestContext, assert) { const store = this.owner.lookup('service:store') as Store; const userSetting = store.createRecord('user-setting', { name: 'test', @@ -139,7 +140,7 @@ module('ActiveRecord | Request Builders', function (hooks) { assert.deepEqual(headersToObject(result.headers), ACTIVE_RECORD_HEADERS, "headers are set to ActiveRecord API's"); }); - test('createRecord passing store record and options', function (assert) { + test('createRecord passing store record and options', function (this: TestContext, assert) { const store = this.owner.lookup('service:store') as Store; const userSetting = store.createRecord('user-setting', { name: 'test', @@ -163,7 +164,7 @@ module('ActiveRecord | Request Builders', function (hooks) { assert.deepEqual(headersToObject(result.headers), ACTIVE_RECORD_HEADERS, "headers are set to ActiveRecord API's"); }); - test('updateRecord passing store record', function (assert) { + test('updateRecord passing store record', function (this: TestContext, assert) { const store = this.owner.lookup('service:store') as Store; const expectedData = { @@ -200,7 +201,7 @@ module('ActiveRecord | Request Builders', function (hooks) { assert.deepEqual(headersToObject(result.headers), ACTIVE_RECORD_HEADERS, "headers are set to ActiveRecord API's"); }); - test('updateRecord with PATCH method', function (assert) { + test('updateRecord with PATCH method', function (this: TestContext, assert) { const store = this.owner.lookup('service:store') as Store; const expectedData = { @@ -237,7 +238,7 @@ module('ActiveRecord | Request Builders', function (hooks) { assert.deepEqual(headersToObject(result.headers), ACTIVE_RECORD_HEADERS, "headers are set to ActiveRecord API's"); }); - test('deleteRecord with identifier', function (assert) { + test('deleteRecord with identifier', function (this: TestContext, assert) { const store = this.owner.lookup('service:store') as Store; const expectedData = { diff --git a/tests/builders/tests/unit/json-api-builder-test.ts b/tests/builders/tests/unit/json-api-builder-test.ts index e4936556ad1..440a6c8b94d 100644 --- a/tests/builders/tests/unit/json-api-builder-test.ts +++ b/tests/builders/tests/unit/json-api-builder-test.ts @@ -4,6 +4,7 @@ import { setupTest } from '@warp-drive/diagnostic/ember'; import { createRecord, deleteRecord, findRecord, postQuery, query, updateRecord } from '@ember-data/json-api/request'; import { setBuildURLConfig } from '@ember-data/request-utils'; import Store, { recordIdentifierFor } from '@ember-data/store'; +import { TestContext } from '@ember/test-helpers'; import UserSetting from '../../app/models/user-setting'; import { headersToObject } from '../helpers/utils'; @@ -21,7 +22,7 @@ module('JSON:API | Request Builders', function (hooks) { setBuildURLConfig({ host: '', namespace: '' }); }); - test('findRecord by identifier', function (assert) { + test('findRecord by identifier', function (this: TestContext, assert) { const result = findRecord({ type: 'user-setting', id: '1' }); assert.deepEqual( result, @@ -38,7 +39,7 @@ module('JSON:API | Request Builders', function (hooks) { assert.deepEqual(headersToObject(result.headers), JSON_API_HEADERS); }); - test('findRecord by type+id', function (assert) { + test('findRecord by type+id', function (this: TestContext, assert) { const result = findRecord('user-setting', '1'); assert.deepEqual( result, @@ -55,7 +56,7 @@ module('JSON:API | Request Builders', function (hooks) { assert.deepEqual(headersToObject(result.headers), JSON_API_HEADERS); }); - test('findRecord by identifier with options', function (assert) { + test('findRecord by identifier with options', function (this: TestContext, assert) { const result = findRecord( { type: 'user-setting', id: '1' }, { reload: true, backgroundReload: false, include: 'user,friends' } @@ -78,7 +79,7 @@ module('JSON:API | Request Builders', function (hooks) { assert.deepEqual(headersToObject(result.headers), JSON_API_HEADERS); }); - test('findRecord by type+id with options', function (assert) { + test('findRecord by type+id with options', function (this: TestContext, assert) { const result = findRecord('user-setting', '1', { reload: true, backgroundReload: false, include: 'user,friends' }); assert.deepEqual( result, @@ -95,7 +96,7 @@ module('JSON:API | Request Builders', function (hooks) { assert.deepEqual(headersToObject(result.headers), JSON_API_HEADERS); }); - test('query', function (assert) { + test('query', function (this: TestContext, assert) { const result = query( 'user-setting', { include: 'user,friends', sort: 'name:asc', search: ['zeta', 'beta'] }, @@ -115,7 +116,7 @@ module('JSON:API | Request Builders', function (hooks) { assert.deepEqual(headersToObject(result.headers), JSON_API_HEADERS); }); - test('postQuery', function (assert) { + test('postQuery', function (this: TestContext, assert) { const result = postQuery( 'user-setting', { include: 'user,friends', sort: 'name:asc', search: ['zeta', 'beta'] }, @@ -140,7 +141,7 @@ module('JSON:API | Request Builders', function (hooks) { assert.deepEqual(headersToObject(result.headers), JSON_API_HEADERS); }); - test('createRecord passing store record', function (assert) { + test('createRecord passing store record', function (this: TestContext, assert) { const store = this.owner.lookup('service:store') as Store; const userSetting = store.createRecord('user-setting', { name: 'test', @@ -164,7 +165,7 @@ module('JSON:API | Request Builders', function (hooks) { assert.deepEqual(headersToObject(result.headers), JSON_API_HEADERS, "headers are set to JSON API's"); }); - test('createRecord passing store record and options', function (assert) { + test('createRecord passing store record and options', function (this: TestContext, assert) { const store = this.owner.lookup('service:store') as Store; const userSetting = store.createRecord('user-setting', { name: 'test', @@ -188,7 +189,7 @@ module('JSON:API | Request Builders', function (hooks) { assert.deepEqual(headersToObject(result.headers), JSON_API_HEADERS, "headers are set to JSON API's"); }); - test('updateRecord passing store record', function (assert) { + test('updateRecord passing store record', function (this: TestContext, assert) { const store = this.owner.lookup('service:store') as Store; const expectedData = { @@ -225,7 +226,7 @@ module('JSON:API | Request Builders', function (hooks) { assert.deepEqual(headersToObject(result.headers), JSON_API_HEADERS, "headers are set to JSON API's"); }); - test('updateRecord with PATCH method', function (assert) { + test('updateRecord with PATCH method', function (this: TestContext, assert) { const store = this.owner.lookup('service:store') as Store; const expectedData = { @@ -262,7 +263,7 @@ module('JSON:API | Request Builders', function (hooks) { assert.deepEqual(headersToObject(result.headers), JSON_API_HEADERS, "headers are set to JSON API's"); }); - test('deleteRecord with identifier', function (assert) { + test('deleteRecord with identifier', function (this: TestContext, assert) { const store = this.owner.lookup('service:store') as Store; const expectedData = { diff --git a/tests/builders/tests/unit/rest-builder-test.ts b/tests/builders/tests/unit/rest-builder-test.ts index eb69902df1e..270fe1246b9 100644 --- a/tests/builders/tests/unit/rest-builder-test.ts +++ b/tests/builders/tests/unit/rest-builder-test.ts @@ -4,6 +4,7 @@ import { setupTest } from '@warp-drive/diagnostic/ember'; import { setBuildURLConfig } from '@ember-data/request-utils'; import { createRecord, deleteRecord, findRecord, query, updateRecord } from '@ember-data/rest/request'; import Store, { recordIdentifierFor } from '@ember-data/store'; +import { TestContext } from '@ember/test-helpers'; import UserSetting from '../../app/models/user-setting'; import { headersToObject } from '../helpers/utils'; @@ -21,7 +22,7 @@ module('REST | Request Builders', function (hooks) { setBuildURLConfig({ host: '', namespace: '' }); }); - test('findRecord by identifier', function (assert) { + test('findRecord by identifier', function (this: TestContext, assert) { const result = findRecord({ type: 'user-setting', id: '1' }); assert.deepEqual( result, @@ -38,7 +39,7 @@ module('REST | Request Builders', function (hooks) { assert.deepEqual(headersToObject(result.headers), REST_HEADERS); }); - test('findRecord by type+id', function (assert) { + test('findRecord by type+id', function (this: TestContext, assert) { const result = findRecord('user-setting', '1'); assert.deepEqual( result, @@ -55,7 +56,7 @@ module('REST | Request Builders', function (hooks) { assert.deepEqual(headersToObject(result.headers), REST_HEADERS); }); - test('findRecord by identifier with options', function (assert) { + test('findRecord by identifier with options', function (this: TestContext, assert) { const result = findRecord( { type: 'user-setting', id: '1' }, { reload: true, backgroundReload: false, include: 'user,friends' } @@ -78,7 +79,7 @@ module('REST | Request Builders', function (hooks) { assert.deepEqual(headersToObject(result.headers), REST_HEADERS); }); - test('findRecord by type+id with options', function (assert) { + test('findRecord by type+id with options', function (this: TestContext, assert) { const result = findRecord('user-setting', '1', { reload: true, backgroundReload: false, include: 'user,friends' }); assert.deepEqual( result, @@ -95,7 +96,7 @@ module('REST | Request Builders', function (hooks) { assert.deepEqual(headersToObject(result.headers), REST_HEADERS); }); - test('query', function (assert) { + test('query', function (this: TestContext, assert) { const result = query( 'user-setting', { include: 'user,friends', sort: 'name:asc', search: ['zeta', 'beta'] }, @@ -115,7 +116,7 @@ module('REST | Request Builders', function (hooks) { assert.deepEqual(headersToObject(result.headers), REST_HEADERS); }); - test('createRecord passing store record', function (assert) { + test('createRecord passing store record', function (this: TestContext, assert) { const store = this.owner.lookup('service:store') as Store; const userSetting = store.createRecord('user-setting', { name: 'test', @@ -139,7 +140,7 @@ module('REST | Request Builders', function (hooks) { assert.deepEqual(headersToObject(result.headers), REST_HEADERS, "headers are set to REST API's"); }); - test('createRecord passing store record and options', function (assert) { + test('createRecord passing store record and options', function (this: TestContext, assert) { const store = this.owner.lookup('service:store') as Store; const userSetting = store.createRecord('user-setting', { name: 'test', @@ -163,7 +164,7 @@ module('REST | Request Builders', function (hooks) { assert.deepEqual(headersToObject(result.headers), REST_HEADERS, "headers are set to REST API's"); }); - test('updateRecord passing store record', function (assert) { + test('updateRecord passing store record', function (this: TestContext, assert) { const store = this.owner.lookup('service:store') as Store; const expectedData = { @@ -200,7 +201,7 @@ module('REST | Request Builders', function (hooks) { assert.deepEqual(headersToObject(result.headers), REST_HEADERS, "headers are set to REST API's"); }); - test('updateRecord with PATCH method', function (assert) { + test('updateRecord with PATCH method', function (this: TestContext, assert) { const store = this.owner.lookup('service:store') as Store; const expectedData = { @@ -237,7 +238,7 @@ module('REST | Request Builders', function (hooks) { assert.deepEqual(headersToObject(result.headers), REST_HEADERS, "headers are set to REST API's"); }); - test('deleteRecord with identifier', function (assert) { + test('deleteRecord with identifier', function (this: TestContext, assert) { const store = this.owner.lookup('service:store') as Store; const expectedData = { diff --git a/tests/builders/tsconfig.json b/tests/builders/tsconfig.json new file mode 100644 index 00000000000..3a781c7337e --- /dev/null +++ b/tests/builders/tsconfig.json @@ -0,0 +1,30 @@ +{ + "include": ["app/**/*", "config/**/*", "tests/**/*"], + "baseUrl": ".", + "compilerOptions": { + "lib": ["DOM", "ESNext"], + "module": "esnext", + "target": "esnext", + "moduleResolution": "bundler", + "moduleDetection": "force", + "strict": true, + "downlevelIteration": true, + "skipLibCheck": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "allowJs": true, + + "noImplicitOverride": true, + + "experimentalDecorators": true, + + "incremental": true, + + "noEmit": true, + "declaration": false, + + "types": ["ember-source/types"], + "paths": {} + }, + "references": [] +} diff --git a/tests/ember-data__adapter/app/services/store.ts b/tests/ember-data__adapter/app/services/store.ts index ac54f924f09..33a046b1899 100644 --- a/tests/ember-data__adapter/app/services/store.ts +++ b/tests/ember-data__adapter/app/services/store.ts @@ -16,9 +16,10 @@ import RequestManager from '@ember-data/request'; import Fetch from '@ember-data/request/fetch'; import BaseStore, { CacheHandler } from '@ember-data/store'; import type { CacheCapabilitiesManager } from '@ember-data/store/-types/q/cache-store-wrapper'; +import { ModelSchema } from '@ember-data/store/-types/q/ds-model'; export default class Store extends BaseStore { - constructor(args) { + constructor(args: unknown) { super(args); this.requestManager = new RequestManager(); this.requestManager.use([LegacyNetworkHandler, Fetch]); @@ -26,19 +27,19 @@ export default class Store extends BaseStore { this.registerSchema(buildSchema(this)); } - createCache(capabilities: CacheCapabilitiesManager) { + override createCache(capabilities: CacheCapabilitiesManager) { return new JSONAPICache(capabilities); } - instantiateRecord(identifier: StableRecordIdentifier, createRecordArgs: Record) { + override instantiateRecord(identifier: StableRecordIdentifier, createRecordArgs: Record): Model { return instantiateRecord.call(this, identifier, createRecordArgs); } - teardownRecord(record: Model) { + override teardownRecord(record: Model) { teardownRecord.call(this, record); } - modelFor(type: string) { + override modelFor(type: string): ModelSchema> { return modelFor.call(this, type) || super.modelFor(type); } @@ -48,7 +49,7 @@ export default class Store extends BaseStore { serializerFor = serializerFor; normalize = normalize; - destroy() { + override destroy() { cleanup.call(this); super.destroy(); } diff --git a/tests/ember-data__adapter/package.json b/tests/ember-data__adapter/package.json index 2405ec90b1c..8a8fd43502f 100644 --- a/tests/ember-data__adapter/package.json +++ b/tests/ember-data__adapter/package.json @@ -17,6 +17,7 @@ "scripts": { "build:tests": "IS_TESTING=true EMBER_CLI_TEST_COMMAND=true ember build --output-path=dist-test --suppress-sizes", "_build:production": "pnpm build:tests -e production", + "check:types": "tsc --noEmit", "test": "bun ./diagnostic.js", "_test:production": "bun ./diagnostic.js", "_syncPnpm": "bun run sync-dependencies-meta-injected" @@ -104,6 +105,7 @@ "ember-source": "~5.4.0", "loader.js": "^4.7.0", "pnpm-sync-dependencies-meta-injected": "0.0.10", + "typescript": "^5.2.2", "webpack": "^5.89.0" }, "engines": { diff --git a/tests/ember-data__adapter/tsconfig.json b/tests/ember-data__adapter/tsconfig.json new file mode 100644 index 00000000000..3a781c7337e --- /dev/null +++ b/tests/ember-data__adapter/tsconfig.json @@ -0,0 +1,30 @@ +{ + "include": ["app/**/*", "config/**/*", "tests/**/*"], + "baseUrl": ".", + "compilerOptions": { + "lib": ["DOM", "ESNext"], + "module": "esnext", + "target": "esnext", + "moduleResolution": "bundler", + "moduleDetection": "force", + "strict": true, + "downlevelIteration": true, + "skipLibCheck": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "allowJs": true, + + "noImplicitOverride": true, + + "experimentalDecorators": true, + + "incremental": true, + + "noEmit": true, + "declaration": false, + + "types": ["ember-source/types"], + "paths": {} + }, + "references": [] +} diff --git a/tests/ember-data__graph/app/app.ts b/tests/ember-data__graph/app/app.ts index 1f39476ae86..8f235d166e6 100644 --- a/tests/ember-data__graph/app/app.ts +++ b/tests/ember-data__graph/app/app.ts @@ -8,7 +8,7 @@ import Resolver from './resolver'; class App extends Application { modulePrefix = config.modulePrefix; podModulePrefix = config.podModulePrefix; - Resolver = Resolver; + override Resolver = Resolver; } loadInitializers(App, config.modulePrefix); diff --git a/tests/ember-data__graph/app/services/store.ts b/tests/ember-data__graph/app/services/store.ts index ac54f924f09..33a046b1899 100644 --- a/tests/ember-data__graph/app/services/store.ts +++ b/tests/ember-data__graph/app/services/store.ts @@ -16,9 +16,10 @@ import RequestManager from '@ember-data/request'; import Fetch from '@ember-data/request/fetch'; import BaseStore, { CacheHandler } from '@ember-data/store'; import type { CacheCapabilitiesManager } from '@ember-data/store/-types/q/cache-store-wrapper'; +import { ModelSchema } from '@ember-data/store/-types/q/ds-model'; export default class Store extends BaseStore { - constructor(args) { + constructor(args: unknown) { super(args); this.requestManager = new RequestManager(); this.requestManager.use([LegacyNetworkHandler, Fetch]); @@ -26,19 +27,19 @@ export default class Store extends BaseStore { this.registerSchema(buildSchema(this)); } - createCache(capabilities: CacheCapabilitiesManager) { + override createCache(capabilities: CacheCapabilitiesManager) { return new JSONAPICache(capabilities); } - instantiateRecord(identifier: StableRecordIdentifier, createRecordArgs: Record) { + override instantiateRecord(identifier: StableRecordIdentifier, createRecordArgs: Record): Model { return instantiateRecord.call(this, identifier, createRecordArgs); } - teardownRecord(record: Model) { + override teardownRecord(record: Model) { teardownRecord.call(this, record); } - modelFor(type: string) { + override modelFor(type: string): ModelSchema> { return modelFor.call(this, type) || super.modelFor(type); } @@ -48,7 +49,7 @@ export default class Store extends BaseStore { serializerFor = serializerFor; normalize = normalize; - destroy() { + override destroy() { cleanup.call(this); super.destroy(); } diff --git a/tests/ember-data__graph/package.json b/tests/ember-data__graph/package.json index 309761b3fb6..73c6670695a 100644 --- a/tests/ember-data__graph/package.json +++ b/tests/ember-data__graph/package.json @@ -17,6 +17,7 @@ "scripts": { "build:tests": "IS_TESTING=true EMBER_CLI_TEST_COMMAND=true ember build --output-path=dist-test --suppress-sizes", "build:production": "pnpm build:tests -e production", + "check:types": "tsc --noEmit", "test": "bun ./diagnostic.js", "test:production": "bun ./diagnostic.js", "_syncPnpm": "bun run sync-dependencies-meta-injected" @@ -109,6 +110,7 @@ "ember-try": "^3.0.0", "loader.js": "^4.7.0", "silent-error": "^1.1.1", + "typescript": "^5.2.2", "webpack": "^5.89.0" }, "ember": { diff --git a/tests/ember-data__graph/tests/integration/graph/diff-preservation-test.ts b/tests/ember-data__graph/tests/integration/graph/diff-preservation-test.ts index 33b6304a189..10493cb71d1 100644 --- a/tests/ember-data__graph/tests/integration/graph/diff-preservation-test.ts +++ b/tests/ember-data__graph/tests/integration/graph/diff-preservation-test.ts @@ -1,6 +1,7 @@ import { module, test } from '@warp-drive/diagnostic'; import { setupTest } from '@warp-drive/diagnostic/ember'; +// @ts-expect-error TODO: This is supplied via private-build-infra/virtual-packages import { DEPRECATE_RELATIONSHIP_REMOTE_UPDATE_CLEARING_LOCAL_STATE } from '@ember-data/deprecations'; import { graphFor } from '@ember-data/graph/-private'; import Model, { attr, belongsTo, hasMany } from '@ember-data/model'; diff --git a/tests/ember-data__graph/tests/integration/graph/duplicate-data-test.ts b/tests/ember-data__graph/tests/integration/graph/duplicate-data-test.ts index b5fad2345f8..861ff4cf6df 100644 --- a/tests/ember-data__graph/tests/integration/graph/duplicate-data-test.ts +++ b/tests/ember-data__graph/tests/integration/graph/duplicate-data-test.ts @@ -1,6 +1,7 @@ import { module } from '@warp-drive/diagnostic'; import { setupTest } from '@warp-drive/diagnostic/ember'; +// @ts-expect-error TODO: This is supplied via private-build-infra/virtual-packages import { DEPRECATE_NON_UNIQUE_PAYLOADS } from '@ember-data/deprecations'; import { graphFor } from '@ember-data/graph/-private'; import Model, { attr, hasMany } from '@ember-data/model'; diff --git a/tests/ember-data__graph/tests/integration/graph/edge-removal/helpers.ts b/tests/ember-data__graph/tests/integration/graph/edge-removal/helpers.ts index 91e1d60806a..e4b3b35da62 100644 --- a/tests/ember-data__graph/tests/integration/graph/edge-removal/helpers.ts +++ b/tests/ember-data__graph/tests/integration/graph/edge-removal/helpers.ts @@ -101,8 +101,8 @@ export async function setInitialState(context: Context, config: TestConfig, asse }; class User extends Model { - @attr name; - @relFn('user', relConfig) bestFriends; + @attr declare name: string; + @relFn('user', relConfig) declare bestFriends: unknown; } owner.register('model:user', User); @@ -166,7 +166,9 @@ export async function setInitialState(context: Context, config: TestConfig, asse assert.false(chris.isDeleted, 'PreCond: Chris is not deleted'); assert.false(john.isDeleted, 'PreCond: John is not deleted'); + // @ts-expect-error TODO: Graph type is not assignable to private Graph type const chrisState = stateOf(store._graph!, chrisBestFriend); + // @ts-expect-error TODO: Graph type is not assignable to private Graph type const johnState = stateOf(store._graph!, johnBestFriend); assert.deepEqual( @@ -203,6 +205,7 @@ export async function setInitialState(context: Context, config: TestConfig, asse assert.ok(chrisImplicitFriend, 'PreCond: Chris has an implicit best friend'); + // @ts-expect-error TODO: Graph type is not assignable to private Graph type const chrisImplicitState = stateOf(store._graph!, chrisImplicitFriend); assert.deepEqual( @@ -226,6 +229,7 @@ export async function setInitialState(context: Context, config: TestConfig, asse } else { assert.equal(Object.keys(johnImplicits).length, 1, 'PreCond: John has one implicit relationship'); assert.ok(johnImplicitFriend, 'PreCond: John has no implicit best friend'); + // @ts-expect-error TODO: Graph type is not assignable to private Graph type const johnImplicitState = stateOf(store._graph!, johnImplicitFriend); assert.deepEqual( johnImplicitState.remote, @@ -268,11 +272,12 @@ export function testFinalState( const { chrisIdentifier, johnIdentifier } = testState; const chrisBestFriend = graph.get(chrisIdentifier, 'bestFriends'); + // @ts-expect-error TODO: Graph type is not assignable to private Graph type const chrisState = stateOf(store._graph!, chrisBestFriend); // this specific case gets it's own WAT // this is something ideally a refactor should do away with. - const isUnloadOfImplictAsyncHasManyWithLocalChange = + const isUnloadOfImplicitAsyncHasManyWithLocalChange = !!config.isUnloadAsDelete && !!config.dirtyLocal && !!config.async && @@ -285,7 +290,7 @@ export function testFinalState( // in the dirtyLocal and useCreate case there is no remote data const chrisRemoteRemoved = config.dirtyLocal || config.useCreate || statuses.removed; - const chrisLocalRemoved = statuses.removed && !isUnloadOfImplictAsyncHasManyWithLocalChange; + const chrisLocalRemoved = statuses.removed && !isUnloadOfImplicitAsyncHasManyWithLocalChange; // for the isUnloadAsDelete case we don't remove unless dirtyLocal or useCreate // this may be a bug but likely is related to retaining info for rematerialization. @@ -335,6 +340,7 @@ export function testFinalState( assert.false(graph.identifiers.has(johnIdentifier), 'Result: Relationships for John were cleared from the cache'); } else { const johnBestFriend = graph.get(johnIdentifier, 'bestFriends'); + // @ts-expect-error TODO: Graph type is not assignable to private Graph type const johnState = stateOf(store._graph!, johnBestFriend); assert.deepEqual( @@ -361,6 +367,7 @@ export function testFinalState( const chrisImplicitFriend = chrisImplicits[testState.chrisInverseKey]; assert.ok(chrisImplicitFriend, 'Result: Chris has an implicit relationship for best friend'); + // @ts-expect-error TODO: Graph type is not assignable to private Graph type const chrisImplicitState = stateOf(store._graph!, chrisImplicitFriend); assert.deepEqual( @@ -385,6 +392,7 @@ export function testFinalState( const johnImplicitFriend = johnImplicits[testState.johnInverseKey]; assert.equal(Object.keys(johnImplicits).length, 1, 'Result: John has one implicit relationship in the cache'); assert.ok(johnImplicitFriend, 'Result: John has an implicit key for best friend'); + // @ts-expect-error TODO: Graph type is not assignable to private Graph type const johnImplicitState = stateOf(store._graph!, johnImplicitFriend); assert.deepEqual( diff --git a/tests/ember-data__graph/tests/integration/graph/edge-removal/setup.ts b/tests/ember-data__graph/tests/integration/graph/edge-removal/setup.ts index 61c39dc7b99..58072936a03 100644 --- a/tests/ember-data__graph/tests/integration/graph/edge-removal/setup.ts +++ b/tests/ember-data__graph/tests/integration/graph/edge-removal/setup.ts @@ -11,14 +11,15 @@ import type { ResourceEdge } from '@ember-data/graph/-private/edges/resource'; import type { Graph, GraphEdge } from '@ember-data/graph/-private/graph'; import type Model from '@ember-data/model'; import type Store from '@ember-data/store'; -import type { CollectionRelationship } from '@ember-data/store/-types/cache/relationship'; +import type { RecordInstance } from '@ember-data/store/-types/q/record-instance'; +import type { CollectionRelationship } from '@warp-drive/core-types/cache/relationship'; import type { CollectionResourceDocument, EmptyResourceDocument, JsonApiDocument, SingleResourceDocument, } from '@warp-drive/core-types/spec/raw'; -import type { RecordInstance } from '@ember-data/store/-types/q/record-instance'; +import type { ModelSchema } from '@ember-data/store/-types/q/ds-model'; class AbstractMap { constructor( @@ -129,7 +130,7 @@ class Serializer { static create() { return new this(); } - normalizeResponse(_, __, data: unknown) { + normalizeResponse(_: Store, __: ModelSchema, data: unknown) { return data; } } diff --git a/tests/ember-data__graph/tests/integration/graph/edge-test.ts b/tests/ember-data__graph/tests/integration/graph/edge-test.ts index 853e0a35b91..55988c7e53f 100644 --- a/tests/ember-data__graph/tests/integration/graph/edge-test.ts +++ b/tests/ember-data__graph/tests/integration/graph/edge-test.ts @@ -34,7 +34,7 @@ module('Integration | Graph | Edges', function (hooks) { const { identifierCache } = store; class User extends Model { @attr declare name: string; - @belongsTo('user', { async: false, inverse: 'bestFriend' }) bestFriend; + @belongsTo('user', { async: false, inverse: 'bestFriend' }) declare bestFriend: User; } owner.register('model:user', User); @@ -97,7 +97,7 @@ module('Integration | Graph | Edges', function (hooks) { const { identifierCache } = store; class User extends Model { @attr declare name: string; - @belongsTo('user', { async: false, inverse: 'bestFriend' }) bestFriend; + @belongsTo('user', { async: false, inverse: 'bestFriend' }) declare bestFriend: User; } owner.register('model:user', User); @@ -178,8 +178,8 @@ module('Integration | Graph | Edges', function (hooks) { const { owner } = this; const { identifierCache } = store; class User extends Model { - @attr name; - @belongsTo('user', { async: true, inverse: 'bestFriend' }) bestFriend; + @attr declare name: string; + @belongsTo('user', { async: true, inverse: 'bestFriend' }) declare bestFriend: Promise; } owner.register('model:user', User); @@ -260,8 +260,8 @@ module('Integration | Graph | Edges', function (hooks) { const { owner } = this; const { identifierCache } = store; class User extends Model { - @attr name; - @hasMany('user', { async: false, inverse: 'bestFriends' }) bestFriends; + @attr declare name: string; + @hasMany('user', { async: false, inverse: 'bestFriends' }) declare bestFriends: User[]; } owner.register('model:user', User); @@ -355,8 +355,8 @@ module('Integration | Graph | Edges', function (hooks) { const { owner } = this; const { identifierCache } = store; class User extends Model { - @attr name; - @hasMany('user', { async: true, inverse: 'bestFriends' }) bestFriends; + @attr declare name: string; + @hasMany('user', { async: true, inverse: 'bestFriends' }) declare bestFriends: Promise; } owner.register('model:user', User); diff --git a/tests/ember-data__graph/tests/integration/graph/polymorphism/implicit-keys-test.ts b/tests/ember-data__graph/tests/integration/graph/polymorphism/implicit-keys-test.ts index 86b715b9f51..226c9cfdbb6 100644 --- a/tests/ember-data__graph/tests/integration/graph/polymorphism/implicit-keys-test.ts +++ b/tests/ember-data__graph/tests/integration/graph/polymorphism/implicit-keys-test.ts @@ -11,15 +11,15 @@ module('Integration | Graph | Implicit Keys', function (hooks) { test('Non-polymorphic records do not trigger polymorphic assertions when they share the same key with another record', async function (assert) { const { owner } = this; class User extends Model { - @attr name; - @belongsTo('organization', { async: false, inverse: null }) organization; + @attr declare name: string; + @belongsTo('organization', { async: false, inverse: null }) declare organization: Organization; } class Product extends Model { - @attr name; - @belongsTo('organization', { async: false, inverse: null }) organization; + @attr declare name: string; + @belongsTo('organization', { async: false, inverse: null }) declare organization: Organization; } class Organization extends Model { - @attr name; + @attr declare name: string; } owner.register('model:user', User); owner.register('model:product', Product); diff --git a/tests/ember-data__graph/tsconfig.json b/tests/ember-data__graph/tsconfig.json new file mode 100644 index 00000000000..c700f6150b4 --- /dev/null +++ b/tests/ember-data__graph/tsconfig.json @@ -0,0 +1,30 @@ +{ + "include": ["app/**/*", "config/**/*", "tests/**/*"], + "baseUrl": ".", + "compilerOptions": { + "lib": ["DOM", "ESNext"], + "module": "esnext", + "target": "esnext", + "moduleResolution": "bundler", + "moduleDetection": "force", + "strict": true, + "downlevelIteration": true, + "skipLibCheck": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "allowJs": true, + + "experimentalDecorators": true, + + "noImplicitOverride": true, + + "incremental": true, + + "noEmit": true, + "declaration": false, + + "types": ["ember-source/types"], + "paths": {} + }, + "references": [] +} diff --git a/tests/ember-data__json-api/app/app.ts b/tests/ember-data__json-api/app/app.ts index 1f39476ae86..8f235d166e6 100644 --- a/tests/ember-data__json-api/app/app.ts +++ b/tests/ember-data__json-api/app/app.ts @@ -8,7 +8,7 @@ import Resolver from './resolver'; class App extends Application { modulePrefix = config.modulePrefix; podModulePrefix = config.podModulePrefix; - Resolver = Resolver; + override Resolver = Resolver; } loadInitializers(App, config.modulePrefix); diff --git a/tests/ember-data__json-api/package.json b/tests/ember-data__json-api/package.json index 7e0e025122b..db2307595ba 100644 --- a/tests/ember-data__json-api/package.json +++ b/tests/ember-data__json-api/package.json @@ -17,6 +17,7 @@ "scripts": { "build:tests": "IS_TESTING=true EMBER_CLI_TEST_COMMAND=true ember build --output-path=dist-test --suppress-sizes", "build:production": "pnpm build:tests -e production", + "check:types": "tsc --noEmit", "test": "bun ./diagnostic.js", "test:production": "bun ./diagnostic.js", "_syncPnpm": "bun run sync-dependencies-meta-injected" @@ -57,16 +58,28 @@ }, "@ember-data/request": { "injected": true + }, + "@ember-data/model": { + "injected": true + }, + "@ember-data/debug": { + "injected": true + }, + "@ember-data/legacy-compat": { + "injected": true } }, "devDependencies": { "@babel/core": "^7.23.2", "@babel/runtime": "^7.23.2", + "@ember-data/debug": "workspace:5.5.0-alpha.11", "@ember-data/graph": "workspace:5.5.0-alpha.11", "@ember-data/json-api": "workspace:5.5.0-alpha.11", + "@ember-data/legacy-compat": "workspace:5.5.0-alpha.11", + "@ember-data/model": "workspace:5.5.0-alpha.11", "@ember-data/private-build-infra": "workspace:5.5.0-alpha.11", - "@ember-data/request": "workspace:5.5.0-alpha.11", "@ember-data/request-utils": "workspace:5.5.0-alpha.11", + "@ember-data/request": "workspace:5.5.0-alpha.11", "@ember-data/store": "workspace:5.5.0-alpha.11", "@ember-data/tracking": "workspace:5.5.0-alpha.11", "@ember-data/unpublished-test-infra": "workspace:5.5.0-alpha.11", @@ -97,6 +110,7 @@ "ember-try": "^3.0.0", "loader.js": "^4.7.0", "silent-error": "^1.1.1", + "typescript": "^5.2.2", "webpack": "^5.89.0" }, "ember": { diff --git a/tests/ember-data__json-api/tests/integration/cache/collection-data-documents-test.ts b/tests/ember-data__json-api/tests/integration/cache/collection-data-documents-test.ts index d74c67878e4..30fd65d2f98 100644 --- a/tests/ember-data__json-api/tests/integration/cache/collection-data-documents-test.ts +++ b/tests/ember-data__json-api/tests/integration/cache/collection-data-documents-test.ts @@ -6,20 +6,20 @@ import type Model from '@ember-data/model'; import type { StructuredDataDocument } from '@ember-data/request'; import Store from '@ember-data/store'; import type { NotificationType } from '@ember-data/store/-private/managers/notification-manager'; -import type { CollectionResourceDataDocument } from '@ember-data/store/-types/cache/document'; import type { CacheCapabilitiesManager } from '@ember-data/store/-types/q/cache-store-wrapper'; -import type { CollectionResourceDocument } from '@warp-drive/core-types/spec/raw'; import { JsonApiResource } from '@ember-data/store/-types/q/record-data-json-api'; import { AttributesSchema, RelationshipsSchema } from '@warp-drive/core-types/schema'; import type { FieldSchema } from '@ember-data/store/-types/q/schema-service'; +import type { CollectionResourceDataDocument } from '@warp-drive/core-types/spec/document'; +import type { CollectionResourceDocument } from '@warp-drive/core-types/spec/raw'; type FakeRecord = { [key: string]: unknown; destroy: () => void }; class TestStore extends Store { - createCache(wrapper: CacheCapabilitiesManager) { + override createCache(wrapper: CacheCapabilitiesManager) { return new Cache(wrapper); } - instantiateRecord(identifier: StableRecordIdentifier) { + override instantiateRecord(identifier: StableRecordIdentifier) { const { id, lid, type } = identifier; const record: FakeRecord = { id, lid, type } as unknown as FakeRecord; Object.assign(record, (this.cache.peek(identifier) as JsonApiResource).attributes); @@ -40,7 +40,7 @@ class TestStore extends Store { return record; } - teardownRecord(record: FakeRecord) { + override teardownRecord(record: FakeRecord) { record.destroy(); } } @@ -58,7 +58,7 @@ class TestSchema { _fieldsDefCache: Record> = {}; - fields(identifier: StableRecordIdentifier | { type: string }): Map { + fields(identifier: { type: T }): Map { const { type } = identifier; let fieldDefs: Map | undefined = this._fieldsDefCache[type]; diff --git a/tests/ember-data__json-api/tests/integration/cache/meta-documents-test.ts b/tests/ember-data__json-api/tests/integration/cache/meta-documents-test.ts index 3a6e62991fb..a74aa7fab62 100644 --- a/tests/ember-data__json-api/tests/integration/cache/meta-documents-test.ts +++ b/tests/ember-data__json-api/tests/integration/cache/meta-documents-test.ts @@ -1,18 +1,18 @@ -import type { StableExistingRecordIdentifier } from '@warp-drive/core-types/identifier'; +import type { StableExistingRecordIdentifier, StableRecordIdentifier } from '@warp-drive/core-types/identifier'; import { module, test } from '@warp-drive/diagnostic'; import Cache from '@ember-data/json-api'; import type { StructuredDocument } from '@ember-data/request'; import Store from '@ember-data/store'; import { CacheOperation } from '@ember-data/store/-private/managers/notification-manager'; -import type { CollectionResourceDataDocument, ResourceMetaDocument } from '@ember-data/store/-types/cache/document'; import type { CacheCapabilitiesManager } from '@ember-data/store/-types/q/cache-store-wrapper'; import type { StableDocumentIdentifier } from '@warp-drive/core-types/identifier'; import { AttributesSchema, RelationshipsSchema } from '@warp-drive/core-types/schema'; import type { FieldSchema } from '@ember-data/store/-types/q/schema-service'; +import type { CollectionResourceDataDocument, ResourceMetaDocument } from '@warp-drive/core-types/spec/document'; class TestStore extends Store { - createCache(wrapper: CacheCapabilitiesManager) { + override createCache(wrapper: CacheCapabilitiesManager) { return new Cache(wrapper); } } @@ -30,7 +30,7 @@ class TestSchema { _fieldsDefCache: Record> = {}; - fields(identifier: StableRecordIdentifier | { type: string }): Map { + fields(identifier: { type: T }): Map { const { type } = identifier; let fieldDefs: Map | undefined = this._fieldsDefCache[type]; diff --git a/tests/ember-data__json-api/tests/integration/cache/resource-data-documents-test.ts b/tests/ember-data__json-api/tests/integration/cache/resource-data-documents-test.ts index 45a79fb9bc5..54485617ecf 100644 --- a/tests/ember-data__json-api/tests/integration/cache/resource-data-documents-test.ts +++ b/tests/ember-data__json-api/tests/integration/cache/resource-data-documents-test.ts @@ -6,21 +6,21 @@ import type Model from '@ember-data/model'; import type { StructuredDocument } from '@ember-data/request'; import Store from '@ember-data/store'; import type { CacheOperation, NotificationType } from '@ember-data/store/-private/managers/notification-manager'; -import type { SingleResourceDataDocument } from '@ember-data/store/-types/cache/document'; import type { CacheCapabilitiesManager } from '@ember-data/store/-types/q/cache-store-wrapper'; import type { JsonApiResource } from '@ember-data/store/-types/q/record-data-json-api'; import type { StableDocumentIdentifier } from '@warp-drive/core-types/identifier'; import type { AttributesSchema, RelationshipsSchema } from '@warp-drive/core-types/schema'; +import type { SingleResourceDataDocument } from '@warp-drive/core-types/spec/document'; import type { SingleResourceDocument } from '@warp-drive/core-types/spec/raw'; import type { FieldSchema } from '@ember-data/store/-types/q/schema-service'; type FakeRecord = { [key: string]: unknown; destroy: () => void }; class TestStore extends Store { - createCache(wrapper: CacheCapabilitiesManager) { + override createCache(wrapper: CacheCapabilitiesManager) { return new Cache(wrapper); } - instantiateRecord(identifier: StableRecordIdentifier) { + override instantiateRecord(identifier: StableRecordIdentifier) { const { id, lid, type } = identifier; const record: FakeRecord = { id, lid, type } as unknown as FakeRecord; Object.assign(record, (this.cache.peek(identifier) as JsonApiResource).attributes); @@ -41,7 +41,7 @@ class TestStore extends Store { return record; } - teardownRecord(record: FakeRecord) { + override teardownRecord(record: FakeRecord) { record.destroy(); } } @@ -59,7 +59,7 @@ class TestSchema { _fieldsDefCache: Record> = {}; - fields(identifier: StableRecordIdentifier | { type: string }): Map { + fields(identifier: { type: T }): Map { const { type } = identifier; let fieldDefs: Map | undefined = this._fieldsDefCache[type]; diff --git a/tests/ember-data__json-api/tests/integration/serialize-test.ts b/tests/ember-data__json-api/tests/integration/serialize-test.ts index e75ca6fe649..5abb0be855f 100644 --- a/tests/ember-data__json-api/tests/integration/serialize-test.ts +++ b/tests/ember-data__json-api/tests/integration/serialize-test.ts @@ -12,11 +12,11 @@ import type { FieldSchema } from '@ember-data/store/-types/q/schema-service'; type FakeRecord = { [key: string]: unknown; destroy: () => void }; class TestStore extends Store { - createCache(wrapper: CacheCapabilitiesManager) { + override createCache(wrapper: CacheCapabilitiesManager) { return new Cache(wrapper); } - instantiateRecord(identifier: StableRecordIdentifier) { + override instantiateRecord(identifier: StableRecordIdentifier) { const { id, lid, type } = identifier; const record: FakeRecord = { id, lid, type } as unknown as FakeRecord; Object.assign(record, (this.cache.peek(identifier) as JsonApiResource).attributes); @@ -37,7 +37,7 @@ class TestStore extends Store { return record; } - teardownRecord(record: FakeRecord) { + override teardownRecord(record: FakeRecord) { record.destroy(); } } @@ -55,7 +55,7 @@ class TestSchema { _fieldsDefCache: Record> = {}; - fields(identifier: StableRecordIdentifier | { type: string }): Map { + fields(identifier: { type: T }): Map { const { type } = identifier; let fieldDefs: Map | undefined = this._fieldsDefCache[type]; @@ -265,9 +265,9 @@ module('Integration | @ember-data/json-api/request', function (hooks) { relationships: { friends: { data: [ - { type: 'user', id: '2', lid: '@lid:user-2' }, - { type: 'user', id: '3', lid: '@lid:user-3' }, - { type: 'user', id: '4', lid: '@lid:user-4' }, + { type: 'user', id: '2', lid: '@lid:user-2' } as StableRecordIdentifier, + { type: 'user', id: '3', lid: '@lid:user-3' } as StableRecordIdentifier, + { type: 'user', id: '4', lid: '@lid:user-4' } as StableRecordIdentifier, ], }, }, @@ -297,8 +297,8 @@ module('Integration | @ember-data/json-api/request', function (hooks) { relationships: { friends: { data: [ - { type: 'user', id: '3', lid: '@lid:user-3' }, - { type: 'user', id: '4', lid: '@lid:user-4' }, + { type: 'user', id: '3', lid: '@lid:user-3' } as StableRecordIdentifier, + { type: 'user', id: '4', lid: '@lid:user-4' } as StableRecordIdentifier, ], }, }, @@ -331,8 +331,8 @@ module('Integration | @ember-data/json-api/request', function (hooks) { relationships: { friends: { data: [ - { type: 'user', id: '3', lid: '@lid:user-3' }, - { type: 'user', id: '2', lid: '@lid:user-2' }, + { type: 'user', id: '3', lid: '@lid:user-3' } as StableRecordIdentifier, + { type: 'user', id: '2', lid: '@lid:user-2' } as StableRecordIdentifier, ], }, }, diff --git a/tests/ember-data__json-api/tsconfig.json b/tests/ember-data__json-api/tsconfig.json new file mode 100644 index 00000000000..9ae3d027c80 --- /dev/null +++ b/tests/ember-data__json-api/tsconfig.json @@ -0,0 +1,28 @@ +{ + "include": ["app/**/*", "config/**/*", "tests/**/*"], + "baseUrl": ".", + "compilerOptions": { + "lib": ["DOM", "ESNext"], + "module": "esnext", + "target": "esnext", + "moduleResolution": "bundler", + "moduleDetection": "force", + "strict": true, + "downlevelIteration": true, + "skipLibCheck": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "allowJs": true, + + "noImplicitOverride": true, + + "incremental": true, + + "noEmit": true, + "declaration": false, + + "types": ["ember-source/types"], + "paths": {} + }, + "references": [] +} diff --git a/tests/ember-data__model/package.json b/tests/ember-data__model/package.json index ae2557b2acd..da63d703ac9 100644 --- a/tests/ember-data__model/package.json +++ b/tests/ember-data__model/package.json @@ -16,6 +16,7 @@ }, "scripts": { "build:tests": "IS_TESTING=true EMBER_CLI_TEST_COMMAND=true ember build --output-path=dist-test --suppress-sizes", + "check:types": "tsc --noEmit", "test": "bun ./diagnostic.js", "_syncPnpm": "bun run sync-dependencies-meta-injected" }, @@ -97,6 +98,7 @@ "ember-resolver": "^11.0.1", "ember-source": "~5.4.0", "loader.js": "^4.7.0", + "typescript": "^5.2.2", "webpack": "^5.89.0" }, "engines": { diff --git a/tests/ember-data__model/tests/integration/model-for-test.ts b/tests/ember-data__model/tests/integration/model-for-test.ts index 04b60d2a9fb..a65b72c2052 100644 --- a/tests/ember-data__model/tests/integration/model-for-test.ts +++ b/tests/ember-data__model/tests/integration/model-for-test.ts @@ -1,36 +1,39 @@ import { module, test } from '@warp-drive/diagnostic'; -import type { FieldSchema } from '@ember-data/store/-types/q/schema-service'; +import type { FieldSchema, SchemaService } from '@ember-data/store/-types/q/schema-service'; +import type { RelationshipsSchema } from '@warp-drive/core-types/schema'; import Store from '@ember-data/store'; module('modelFor without @ember-data/model', function () { test('We can call modelFor', function (assert) { class TestStore extends Store { - instantiateRecord() { + override instantiateRecord() { return { id: '1', type: 'user', name: 'Chris Thoburn', }; } - teardownRecord() { + override teardownRecord() { return; } } const store = new TestStore(); - store.registerSchema({ - attributesDefinitionFor(identifier) { + class TestSchema implements SchemaService { + attributesDefinitionFor(_identifier: { type: string }) { return { name: { name: 'name', - kind: 'attribute', + kind: 'attribute' as const, type: null, }, }; - }, - _fieldsDefCache: {} as Record>, - fields(identifier: StableRecordIdentifier | { type: string }): Map { + } + + _fieldsDefCache = {} as Record>; + + fields(identifier: { type: string }): Map { const { type } = identifier; let fieldDefs: Map | undefined = this._fieldsDefCache[type]; @@ -51,14 +54,18 @@ module('modelFor without @ember-data/model', function () { } return fieldDefs; - }, - relationshipsDefinitionFor(identifier) { + } + + relationshipsDefinitionFor(_identifier: { type: string }): RelationshipsSchema { return {}; - }, - doesTypeExist(type) { + } + + doesTypeExist(type: string) { return type === 'user'; - }, - }); + } + } + + store.registerSchema(new TestSchema()); try { store.modelFor('user'); @@ -81,30 +88,32 @@ module('modelFor without @ember-data/model', function () { test('modelFor returns a stable reference', function (assert) { class TestStore extends Store { - instantiateRecord() { + override instantiateRecord() { return { id: '1', type: 'user', name: 'Chris Thoburn', }; } - teardownRecord() { + override teardownRecord() { return; } } const store = new TestStore(); - store.registerSchema({ - attributesDefinitionFor(identifier) { + class TestSchema implements SchemaService { + attributesDefinitionFor(_identifier: { type: string }) { return { name: { name: 'name', - kind: 'attribute', + kind: 'attribute' as const, type: null, }, }; - }, - _fieldsDefCache: {} as Record>, - fields(identifier: StableRecordIdentifier | { type: string }): Map { + } + + _fieldsDefCache = {} as Record>; + + fields(identifier: { type: string }): Map { const { type } = identifier; let fieldDefs: Map | undefined = this._fieldsDefCache[type]; @@ -125,14 +134,18 @@ module('modelFor without @ember-data/model', function () { } return fieldDefs; - }, - relationshipsDefinitionFor(identifier) { + } + + relationshipsDefinitionFor(_identifier: { type: string }): RelationshipsSchema { return {}; - }, - doesTypeExist(type) { + } + + doesTypeExist(type: string) { return type === 'user'; - }, - }); + } + } + + store.registerSchema(new TestSchema()); const ShimUser1 = store.modelFor('user'); const ShimUser2 = store.modelFor('user'); diff --git a/tests/ember-data__model/tsconfig.json b/tests/ember-data__model/tsconfig.json new file mode 100644 index 00000000000..3a781c7337e --- /dev/null +++ b/tests/ember-data__model/tsconfig.json @@ -0,0 +1,30 @@ +{ + "include": ["app/**/*", "config/**/*", "tests/**/*"], + "baseUrl": ".", + "compilerOptions": { + "lib": ["DOM", "ESNext"], + "module": "esnext", + "target": "esnext", + "moduleResolution": "bundler", + "moduleDetection": "force", + "strict": true, + "downlevelIteration": true, + "skipLibCheck": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "allowJs": true, + + "noImplicitOverride": true, + + "experimentalDecorators": true, + + "incremental": true, + + "noEmit": true, + "declaration": false, + + "types": ["ember-source/types"], + "paths": {} + }, + "references": [] +} diff --git a/tests/ember-data__request/app/app.ts b/tests/ember-data__request/app/app.ts index 1f39476ae86..8f235d166e6 100644 --- a/tests/ember-data__request/app/app.ts +++ b/tests/ember-data__request/app/app.ts @@ -8,7 +8,7 @@ import Resolver from './resolver'; class App extends Application { modulePrefix = config.modulePrefix; podModulePrefix = config.podModulePrefix; - Resolver = Resolver; + override Resolver = Resolver; } loadInitializers(App, config.modulePrefix); diff --git a/tests/ember-data__request/package.json b/tests/ember-data__request/package.json index a9b2e8bcf92..b2151caf216 100644 --- a/tests/ember-data__request/package.json +++ b/tests/ember-data__request/package.json @@ -16,6 +16,7 @@ "scripts": { "build:tests": "IS_TESTING=true EMBER_CLI_TEST_COMMAND=true ember build --output-path=dist-test --suppress-sizes", "_build:production": "pnpm build:tests -e production", + "check:types": "tsc --noEmit", "test": "bun ./diagnostic.js", "_test:production": "bun ./diagnostic.js", "_syncPnpm": "bun run sync-dependencies-meta-injected" @@ -78,6 +79,7 @@ "ember-try": "^3.0.0", "loader.js": "^4.7.0", "silent-error": "^1.1.1", + "typescript": "^5.2.2", "webpack": "^5.89.0" }, "ember": { diff --git a/tests/ember-data__request/tests/integration/abort-test.ts b/tests/ember-data__request/tests/integration/abort-test.ts index 2f7a95e0899..5ec5717697b 100644 --- a/tests/ember-data__request/tests/integration/abort-test.ts +++ b/tests/ember-data__request/tests/integration/abort-test.ts @@ -1,8 +1,9 @@ import { module, test } from '@warp-drive/diagnostic'; +import type { RequestInfo } from '@ember-data/request'; import RequestManager from '@ember-data/request'; import type { Context } from '@ember-data/request/-private/context'; -import type { Future, Handler, NextFn, RequestInfo } from '@ember-data/request/-private/types'; +import type { Future, Handler, NextFn } from '@ember-data/request/-private/types'; module('RequestManager | Abort', function () { test('We can abort requests', async function (assert) { diff --git a/tests/ember-data__request/tests/integration/custom-abort-test.ts b/tests/ember-data__request/tests/integration/custom-abort-test.ts index c2ede21c023..56a2ee5a071 100644 --- a/tests/ember-data__request/tests/integration/custom-abort-test.ts +++ b/tests/ember-data__request/tests/integration/custom-abort-test.ts @@ -1,8 +1,9 @@ import { module, test } from '@warp-drive/diagnostic'; +import type { RequestInfo } from '@ember-data/request'; import RequestManager from '@ember-data/request'; import type { Context } from '@ember-data/request/-private/context'; -import type { Future, Handler, NextFn, RequestInfo } from '@ember-data/request/-private/types'; +import type { Future, Handler, NextFn } from '@ember-data/request/-private/types'; module('RequestManager | Custom Abort', function () { test('We can abort requests', async function (assert) { diff --git a/tests/ember-data__request/tests/integration/error-propagation-test.ts b/tests/ember-data__request/tests/integration/error-propagation-test.ts index c705e5314bd..035fb104504 100644 --- a/tests/ember-data__request/tests/integration/error-propagation-test.ts +++ b/tests/ember-data__request/tests/integration/error-propagation-test.ts @@ -1,8 +1,9 @@ import { module, test } from '@warp-drive/diagnostic'; +import type { StructuredErrorDocument } from '@ember-data/request'; import RequestManager from '@ember-data/request'; import type { Context } from '@ember-data/request/-private/context'; -import type { Future, Handler, NextFn, StructuredErrorDocument } from '@ember-data/request/-private/types'; +import type { Future, Handler, NextFn } from '@ember-data/request/-private/types'; function isErrorDoc(e: Error | unknown | StructuredErrorDocument): e is StructuredErrorDocument { return Boolean(e && e instanceof Error && 'request' in e); diff --git a/tests/ember-data__request/tests/integration/immutability-test.ts b/tests/ember-data__request/tests/integration/immutability-test.ts index a6038e2b11c..0ed3cac24fd 100644 --- a/tests/ember-data__request/tests/integration/immutability-test.ts +++ b/tests/ember-data__request/tests/integration/immutability-test.ts @@ -54,6 +54,7 @@ module('RequestManager | Immutability', function () { request(context: Context, next: NextFn) { const headers = new Headers(context.request.headers); headers.append('house', 'home'); + // @ts-expect-error Types are wrong: Property 'entries' does not exist on type 'Headers'. return Promise.resolve([...headers.entries()] as T); }, }; diff --git a/tests/ember-data__request/tests/integration/service-test.ts b/tests/ember-data__request/tests/integration/service-test.ts index ad500d66320..c08ededeebe 100644 --- a/tests/ember-data__request/tests/integration/service-test.ts +++ b/tests/ember-data__request/tests/integration/service-test.ts @@ -8,16 +8,18 @@ import Resolver from 'ember-resolver'; import RequestManager from '@ember-data/request'; +import { TestContext } from '@ember/test-helpers'; + module('RequestManager | Ember Service Setup', function (hooks) { setupTest(hooks, { resolver: new Resolver() }); - test('We can register RequestManager as a service', function (assert) { + test('We can register RequestManager as a service', function (this: TestContext, assert) { this.owner.register('service:request', RequestManager); const manager = this.owner.lookup('service:request'); assert.ok(manager instanceof RequestManager, 'We instantiated'); }); - test('We can use injections when registering the RequestManager as a service', function (assert) { + test('We can use injections when registering the RequestManager as a service', function (this: TestContext, assert) { class CustomManager extends RequestManager { @service cache; } diff --git a/tests/ember-data__request/tests/integration/stateful-handler-test.ts b/tests/ember-data__request/tests/integration/stateful-handler-test.ts index ae555329c49..4faf8c31bed 100644 --- a/tests/ember-data__request/tests/integration/stateful-handler-test.ts +++ b/tests/ember-data__request/tests/integration/stateful-handler-test.ts @@ -1,6 +1,8 @@ import { setOwner } from '@ember/owner'; import { service } from '@ember/service'; +import { TestContext } from '@ember/test-helpers'; + import { module, test } from '@warp-drive/diagnostic'; import { setupTest } from '@warp-drive/diagnostic/ember'; @@ -13,7 +15,7 @@ import type { NextFn } from '@ember-data/request/-private/types'; module('RequestManager | Stateful Handlers', function (hooks) { setupTest(hooks, { resolver: new Resolver() }); - test('We can register a handler with `.use()`', async function (assert) { + test('We can register a handler with `.use()`', async function (this: TestContext, assert) { const manager = new RequestManager(); let calls = 0; diff --git a/tests/ember-data__request/tsconfig.json b/tests/ember-data__request/tsconfig.json new file mode 100644 index 00000000000..7126e70cbbc --- /dev/null +++ b/tests/ember-data__request/tsconfig.json @@ -0,0 +1,33 @@ +{ + "include": ["app/**/*", "config/**/*", "tests/**/*"], + "baseUrl": ".", + "compilerOptions": { + "lib": ["DOM", "ESNext"], + "module": "esnext", + "target": "esnext", + "moduleResolution": "bundler", + "moduleDetection": "force", + "strict": true, + "downlevelIteration": true, + "skipLibCheck": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "allowJs": true, + + "experimentalDecorators": true, + + // TODO: Reenable this + "noImplicitAny": false, + + "noImplicitOverride": true, + + "incremental": true, + + "noEmit": true, + "declaration": false, + + "types": ["ember-source/types"], + "paths": {} + }, + "references": [] +} diff --git a/tests/ember-data__serializer/app/services/store.ts b/tests/ember-data__serializer/app/services/store.ts index ac54f924f09..33a046b1899 100644 --- a/tests/ember-data__serializer/app/services/store.ts +++ b/tests/ember-data__serializer/app/services/store.ts @@ -16,9 +16,10 @@ import RequestManager from '@ember-data/request'; import Fetch from '@ember-data/request/fetch'; import BaseStore, { CacheHandler } from '@ember-data/store'; import type { CacheCapabilitiesManager } from '@ember-data/store/-types/q/cache-store-wrapper'; +import { ModelSchema } from '@ember-data/store/-types/q/ds-model'; export default class Store extends BaseStore { - constructor(args) { + constructor(args: unknown) { super(args); this.requestManager = new RequestManager(); this.requestManager.use([LegacyNetworkHandler, Fetch]); @@ -26,19 +27,19 @@ export default class Store extends BaseStore { this.registerSchema(buildSchema(this)); } - createCache(capabilities: CacheCapabilitiesManager) { + override createCache(capabilities: CacheCapabilitiesManager) { return new JSONAPICache(capabilities); } - instantiateRecord(identifier: StableRecordIdentifier, createRecordArgs: Record) { + override instantiateRecord(identifier: StableRecordIdentifier, createRecordArgs: Record): Model { return instantiateRecord.call(this, identifier, createRecordArgs); } - teardownRecord(record: Model) { + override teardownRecord(record: Model) { teardownRecord.call(this, record); } - modelFor(type: string) { + override modelFor(type: string): ModelSchema> { return modelFor.call(this, type) || super.modelFor(type); } @@ -48,7 +49,7 @@ export default class Store extends BaseStore { serializerFor = serializerFor; normalize = normalize; - destroy() { + override destroy() { cleanup.call(this); super.destroy(); } diff --git a/tests/ember-data__serializer/package.json b/tests/ember-data__serializer/package.json index f8f6ef7caf8..db92bfef096 100644 --- a/tests/ember-data__serializer/package.json +++ b/tests/ember-data__serializer/package.json @@ -18,6 +18,7 @@ "build:tests": "IS_TESTING=true EMBER_CLI_TEST_COMMAND=true ember build --output-path=dist-test --suppress-sizes", "lint:hbs": "ember-template-lint .", "lint:old": "eslint --config ../../.eslintrc.js --ignore-path ../../.eslintignore .", + "check:types": "tsc --noEmit", "start": "ember serve", "test": "ember test --test-port=0 --path=dist-test", "_syncPnpm": "bun run sync-dependencies-meta-injected" @@ -101,6 +102,7 @@ "loader.js": "^4.7.0", "qunit": "^2.20.0", "qunit-dom": "^3.0.0", + "typescript": "^5.2.2", "webpack": "^5.89.0" }, "engines": { diff --git a/tests/ember-data__serializer/tsconfig.json b/tests/ember-data__serializer/tsconfig.json new file mode 100644 index 00000000000..3a781c7337e --- /dev/null +++ b/tests/ember-data__serializer/tsconfig.json @@ -0,0 +1,30 @@ +{ + "include": ["app/**/*", "config/**/*", "tests/**/*"], + "baseUrl": ".", + "compilerOptions": { + "lib": ["DOM", "ESNext"], + "module": "esnext", + "target": "esnext", + "moduleResolution": "bundler", + "moduleDetection": "force", + "strict": true, + "downlevelIteration": true, + "skipLibCheck": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "allowJs": true, + + "noImplicitOverride": true, + + "experimentalDecorators": true, + + "incremental": true, + + "noEmit": true, + "declaration": false, + + "types": ["ember-source/types"], + "paths": {} + }, + "references": [] +} diff --git a/tests/main/app/app.ts b/tests/main/app/app.ts index bc2162ddfd0..fc6f593cae2 100644 --- a/tests/main/app/app.ts +++ b/tests/main/app/app.ts @@ -41,8 +41,8 @@ const EventConfig = { class App extends Application { modulePrefix = config.modulePrefix; podModulePrefix = config.podModulePrefix; - Resolver = Resolver; - customEvents = EventConfig; + override Resolver = Resolver; + override customEvents = EventConfig; } loadInitializers(App, config.modulePrefix); diff --git a/tests/main/app/route.ts b/tests/main/app/route.ts index 6d94d5c6cd4..92acf0bce89 100644 --- a/tests/main/app/route.ts +++ b/tests/main/app/route.ts @@ -6,7 +6,7 @@ import type Store from '@ember-data/store'; export default class ApplicationRoute extends Route { @inject declare store: Store; - model() { + override model() { // adding a model to the store to enable manually testing the debug-adapter return this.store.push({ data: { diff --git a/tests/main/app/routes/application.ts b/tests/main/app/routes/application.ts index 6d94d5c6cd4..92acf0bce89 100644 --- a/tests/main/app/routes/application.ts +++ b/tests/main/app/routes/application.ts @@ -6,7 +6,7 @@ import type Store from '@ember-data/store'; export default class ApplicationRoute extends Route { @inject declare store: Store; - model() { + override model() { // adding a model to the store to enable manually testing the debug-adapter return this.store.push({ data: { diff --git a/tests/main/package.json b/tests/main/package.json index e116faeb642..7b323295051 100644 --- a/tests/main/package.json +++ b/tests/main/package.json @@ -15,6 +15,7 @@ "scripts": { "build:tests": "IS_TESTING=true EMBER_CLI_TEST_COMMAND=true ember build --output-path=dist-test --suppress-sizes", "build:production": "pnpm build:tests -e production", + "check:types": "tsc --noEmit", "examine": "export EXAM_PARALLEL_COUNT=$(./bin/calculate-test-jobs); ember exam --test-port=0 --path=dist-test --parallel=$EXAM_PARALLEL_COUNT --load-balance", "test:try-one": "ember try:one", "holodeck:start-program": "holodeck start", @@ -23,6 +24,7 @@ "start": "holodeck run launch:tests", "test": "holodeck run examine", "test:production": "holodeck run examine", + "typescript": "^5.2.2", "_syncPnpm": "bun run sync-dependencies-meta-injected" }, "author": "", diff --git a/tests/main/tests/integration/cache-handler/store-package-setup-test.ts b/tests/main/tests/integration/cache-handler/store-package-setup-test.ts index 36e34d43843..5588a34d14e 100644 --- a/tests/main/tests/integration/cache-handler/store-package-setup-test.ts +++ b/tests/main/tests/integration/cache-handler/store-package-setup-test.ts @@ -7,28 +7,23 @@ import { setupTest } from 'ember-qunit'; import Cache from '@ember-data/json-api'; import { LegacyNetworkHandler } from '@ember-data/legacy-compat'; -import RequestManager from '@ember-data/request'; +import RequestManager, { StructuredDataDocument, StructuredErrorDocument } from '@ember-data/request'; import type { Context } from '@ember-data/request/-private/context'; -import type { - Future, - NextFn, - StructuredDataDocument, - StructuredErrorDocument, -} from '@ember-data/request/-private/types'; +import type { Future, NextFn } from '@ember-data/request/-private/types'; import Fetch from '@ember-data/request/fetch'; import Store, { CacheHandler, recordIdentifierFor } from '@ember-data/store'; import type { Document } from '@ember-data/store/-private/document'; import type { NotificationType } from '@ember-data/store/-private/managers/notification-manager'; import { Collection } from '@ember-data/store/-private/record-arrays/identifier-array'; -import type { - CollectionResourceDataDocument, - ResourceDataDocument, - SingleResourceDataDocument, -} from '@ember-data/store/-types/cache/document'; import type { CacheCapabilitiesManager } from '@ember-data/store/-types/q/cache-store-wrapper'; import type { JsonApiResource } from '@ember-data/store/-types/q/record-data-json-api'; import type { RecordInstance } from '@ember-data/store/-types/q/record-instance'; import type { StableDocumentIdentifier } from '@warp-drive/core-types/identifier'; +import { + CollectionResourceDataDocument, + ResourceDataDocument, + SingleResourceDataDocument, +} from '@warp-drive/core-types/spec/document'; import type { ResourceIdentifierObject } from '@warp-drive/core-types/spec/raw'; import type { FieldSchema } from '@ember-data/store/-types/q/schema-service'; @@ -63,11 +58,11 @@ class TestStore extends Store { }); } - createCache(wrapper: CacheCapabilitiesManager) { + override createCache(wrapper: CacheCapabilitiesManager) { return new Cache(wrapper); } - instantiateRecord(identifier: StableRecordIdentifier) { + override instantiateRecord(identifier: StableRecordIdentifier) { const { id, lid, type } = identifier; const record: FakeRecord = { id, lid, type } as unknown as FakeRecord; Object.assign(record, (this.cache.peek(identifier) as JsonApiResource).attributes); @@ -88,7 +83,7 @@ class TestStore extends Store { return record; } - teardownRecord(record: FakeRecord) { + override teardownRecord(record: FakeRecord) { record.destroy(); } } @@ -292,11 +287,11 @@ module('Store | CacheHandler - @ember-data/store', function (hooks) { }); } - createCache(wrapper: CacheCapabilitiesManager) { + override createCache(wrapper: CacheCapabilitiesManager) { return new Cache(wrapper); } - instantiateRecord(identifier: StableRecordIdentifier) { + override instantiateRecord(identifier: StableRecordIdentifier) { const { id, lid, type } = identifier; const record: FakeRecord = { id, lid, type } as unknown as FakeRecord; Object.assign(record, (this.cache.peek(identifier) as JsonApiResource).attributes); @@ -317,7 +312,7 @@ module('Store | CacheHandler - @ember-data/store', function (hooks) { return record; } - teardownRecord(record: FakeRecord) { + override teardownRecord(record: FakeRecord) { record.destroy(); } } @@ -390,11 +385,11 @@ module('Store | CacheHandler - @ember-data/store', function (hooks) { }); } - createCache(wrapper: CacheCapabilitiesManager) { + override createCache(wrapper: CacheCapabilitiesManager) { return new Cache(wrapper); } - instantiateRecord(identifier: StableRecordIdentifier) { + override instantiateRecord(identifier: StableRecordIdentifier) { const { id, lid, type } = identifier; const record: FakeRecord = { id, lid, type } as unknown as FakeRecord; Object.assign(record, (this.cache.peek(identifier) as JsonApiResource).attributes); @@ -415,7 +410,7 @@ module('Store | CacheHandler - @ember-data/store', function (hooks) { return record; } - teardownRecord(record: FakeRecord) { + override teardownRecord(record: FakeRecord) { record.destroy(); } } @@ -489,11 +484,11 @@ module('Store | CacheHandler - @ember-data/store', function (hooks) { }); } - createCache(wrapper: CacheCapabilitiesManager) { + override createCache(wrapper: CacheCapabilitiesManager) { return new Cache(wrapper); } - instantiateRecord(identifier: StableRecordIdentifier) { + override instantiateRecord(identifier: StableRecordIdentifier) { const { id, lid, type } = identifier; const record: FakeRecord = { id, lid, type } as unknown as FakeRecord; Object.assign(record, (this.cache.peek(identifier) as JsonApiResource).attributes); @@ -514,7 +509,7 @@ module('Store | CacheHandler - @ember-data/store', function (hooks) { return record; } - teardownRecord(record: FakeRecord) { + override teardownRecord(record: FakeRecord) { record.destroy(); } } @@ -780,7 +775,7 @@ module('Store | CacheHandler - @ember-data/store', function (hooks) { ' we get access to the document meta' ); - // Backgrond Re-Fetch without Hydration + // Background Re-Fetch without Hydration const userDocument2 = await store.requestManager.request({ store, url: '/assets/users/1.json', @@ -1324,7 +1319,7 @@ module('Store | CacheHandler - @ember-data/store', function (hooks) { 'we get access to the document meta' ); - // Backgrond Re-Fetch without Hydration + // Background Re-Fetch without Hydration const userDocument2 = await store.requestManager.request({ store, url: '/assets/users/list.json', diff --git a/tests/main/tests/integration/identifiers/configuration-test.ts b/tests/main/tests/integration/identifiers/configuration-test.ts index 42132771433..44e39961068 100644 --- a/tests/main/tests/integration/identifiers/configuration-test.ts +++ b/tests/main/tests/integration/identifiers/configuration-test.ts @@ -135,7 +135,7 @@ module('Integration | Identifiers - configuration', function (hooks) { } } class TestAdapter extends Adapter { - createRecord() { + override createRecord() { return Promise.resolve({ data: { id: '1', @@ -199,7 +199,7 @@ module('Integration | Identifiers - configuration', function (hooks) { } } class TestAdapter extends Adapter { - createRecord() { + override createRecord() { return Promise.resolve({ data: { id: '1', @@ -268,7 +268,7 @@ module('Integration | Identifiers - configuration', function (hooks) { } } class TestAdapter extends Adapter { - updateRecord() { + override updateRecord() { return Promise.resolve({ data: { id: '1', @@ -357,7 +357,7 @@ module('Integration | Identifiers - configuration', function (hooks) { } } class TestAdapter extends Adapter { - findRecord() { + override findRecord() { return Promise.resolve({ data: { id: '1', diff --git a/tests/main/tests/integration/identifiers/lid-reflection-test.ts b/tests/main/tests/integration/identifiers/lid-reflection-test.ts index c859fe42da0..e63252d462c 100644 --- a/tests/main/tests/integration/identifiers/lid-reflection-test.ts +++ b/tests/main/tests/integration/identifiers/lid-reflection-test.ts @@ -87,7 +87,7 @@ module('Integration | Identifiers - lid reflection', function (hooks: NestedHook } } class TestAdapter extends Adapter { - createRecord(store, ModelClass, snapshot: Snapshot) { + override createRecord(store, ModelClass, snapshot: Snapshot) { beganSavePromise.resolve(void 0); return adapterPromise.promise.then(() => { return { @@ -165,7 +165,7 @@ module('Integration | Identifiers - lid reflection', function (hooks: NestedHook } class TestAdapter extends Adapter { - createRecord(store, ModelClass, snapshot: Snapshot) { + override createRecord(store, ModelClass, snapshot: Snapshot) { const record = snapshot.record as Cake; const cakeLid = recordIdentifierFor(record).lid; const ingredientLid = recordIdentifierFor(record.ingredients.at(0)).lid; @@ -251,7 +251,7 @@ module('Integration | Identifiers - lid reflection', function (hooks: NestedHook } class TestAdapter extends Adapter { - createRecord(store, ModelClass, snapshot: Snapshot) { + override createRecord(store, ModelClass, snapshot: Snapshot) { const record = snapshot.record as Cake; const lid = recordIdentifierFor(record.topping).lid; return Promise.resolve({ diff --git a/tests/main/tests/integration/identifiers/polymorphic-scenarios-test.ts b/tests/main/tests/integration/identifiers/polymorphic-scenarios-test.ts index 1ab85fc4cac..11798f21c79 100644 --- a/tests/main/tests/integration/identifiers/polymorphic-scenarios-test.ts +++ b/tests/main/tests/integration/identifiers/polymorphic-scenarios-test.ts @@ -67,10 +67,10 @@ module('Integration | Identifiers - single-table-inheritance polymorphic scenari test(`Identity of polymorphic relations can change type on first load`, async function (assert) { const { owner } = this; class TestAdapter extends Adapter { - shouldBackgroundReloadRecord() { + override shouldBackgroundReloadRecord() { return false; } - findRecord(_, __, id) { + override findRecord(_, __, id) { return Promise.resolve({ data: { id, @@ -104,10 +104,10 @@ module('Integration | Identifiers - single-table-inheritance polymorphic scenari { id: '2', type: 'car' }, ]; class TestAdapter extends Adapter { - shouldBackgroundReloadRecord() { + override shouldBackgroundReloadRecord() { return false; } - findRecord(_, { modelName: type }, id) { + override findRecord(_, { modelName: type }, id) { if (type === 'dealership') { return Promise.resolve({ data: { diff --git a/tests/main/tests/integration/identifiers/record-identifier-for-test.ts b/tests/main/tests/integration/identifiers/record-identifier-for-test.ts index 2bae5d91dae..ea191c6c8f6 100644 --- a/tests/main/tests/integration/identifiers/record-identifier-for-test.ts +++ b/tests/main/tests/integration/identifiers/record-identifier-for-test.ts @@ -35,7 +35,7 @@ module('Integration | Identifiers - recordIdentifierFor', function (hooks) { test(`Saving newly created records updates the associated id on the identifier`, async function (assert) { class TestAdapter extends Adapter { - createRecord() { + override createRecord() { return Promise.resolve({ data: { type: 'user', diff --git a/tests/main/tests/integration/identifiers/scenarios-test.ts b/tests/main/tests/integration/identifiers/scenarios-test.ts index 55be5cf432f..4b08052f21d 100644 --- a/tests/main/tests/integration/identifiers/scenarios-test.ts +++ b/tests/main/tests/integration/identifiers/scenarios-test.ts @@ -41,10 +41,10 @@ module('Integration | Identifiers - scenarios', function (hooks) { } } class TestAdapter extends Adapter { - shouldBackgroundReloadRecord() { + override shouldBackgroundReloadRecord() { return false; } - findRecord() { + override findRecord() { if (isQuery !== true) { calls.findRecord++; } @@ -61,7 +61,7 @@ module('Integration | Identifiers - scenarios', function (hooks) { }, }); } - queryRecord() { + override queryRecord() { calls.queryRecord++; isQuery = true; return this.findRecord(); @@ -251,10 +251,10 @@ module('Integration | Identifiers - scenarios', function (hooks) { } } class TestAdapter extends Adapter { - shouldBackgroundReloadRecord() { + override shouldBackgroundReloadRecord() { return false; } - findRecord() { + override findRecord() { if (isQuery !== true) { calls.findRecord++; } @@ -271,7 +271,7 @@ module('Integration | Identifiers - scenarios', function (hooks) { }, }); } - queryRecord() { + override queryRecord() { calls.queryRecord++; isQuery = true; return this.findRecord(); diff --git a/tests/main/tests/integration/record-data/record-data-errors-test.ts b/tests/main/tests/integration/record-data/record-data-errors-test.ts index dd729c522f7..389908f9770 100644 --- a/tests/main/tests/integration/record-data/record-data-errors-test.ts +++ b/tests/main/tests/integration/record-data/record-data-errors-test.ts @@ -8,10 +8,8 @@ import type { } from '@warp-drive/core-types/identifier'; import type { CollectionResourceDocument, - CollectionResourceRelationship, JsonApiDocument, SingleResourceDocument, - SingleResourceRelationship, } from '@warp-drive/core-types/spec/raw'; import { module, test } from 'qunit'; @@ -22,20 +20,21 @@ import { InvalidError } from '@ember-data/adapter/error'; import Model, { attr } from '@ember-data/model'; import type { StructuredDataDocument, StructuredDocument } from '@ember-data/request'; import { recordIdentifierFor } from '@ember-data/store'; -import type { ResourceBlob } from '@ember-data/store/-types/cache/aliases'; -import type { RelationshipDiff } from '@ember-data/store/-types/cache/cache'; -import type { Change } from '@ember-data/store/-types/cache/change'; -import type { +import type { Cache, MergeOperation } from '@ember-data/store/-types/q/cache'; +import type { CacheCapabilitiesManager } from '@ember-data/store/-types/q/cache-store-wrapper'; +import type { JsonApiError, JsonApiResource } from '@ember-data/store/-types/q/record-data-json-api'; +import { ChangedAttributesHash, RelationshipDiff } from '@warp-drive/core-types/cache'; +import type { ResourceBlob } from '@warp-drive/core-types/cache/aliases'; +import { Change } from '@warp-drive/core-types/cache/change'; +import { CollectionRelationship, ResourceRelationship } from '@warp-drive/core-types/cache/relationship'; +import type { StableDocumentIdentifier } from '@warp-drive/core-types/identifier'; +import { CollectionResourceDataDocument, ResourceDocument, ResourceErrorDocument, ResourceMetaDocument, SingleResourceDataDocument, -} from '@ember-data/store/-types/cache/document'; -import type { Cache, ChangedAttributesHash, MergeOperation } from '@ember-data/store/-types/q/cache'; -import type { CacheCapabilitiesManager } from '@ember-data/store/-types/q/cache-store-wrapper'; -import type { JsonApiError, JsonApiResource } from '@ember-data/store/-types/q/record-data-json-api'; -import type { StableDocumentIdentifier } from '@warp-drive/core-types/identifier'; +} from '@warp-drive/core-types/spec/document'; class Person extends Model { @attr declare firstName: string; @@ -138,7 +137,7 @@ class TestRecordData implements Cache { this._errors = errors; } unloadRecord(identifier: StableRecordIdentifier): void {} - getAttr(identifier: StableRecordIdentifier, propertyName: string): unknown { + getAttr(identifier: StableRecordIdentifier, propertyName: string): string { return ''; } setAttr(identifier: StableRecordIdentifier, propertyName: string, value: unknown): void { @@ -156,7 +155,7 @@ class TestRecordData implements Cache { getRelationship( identifier: StableRecordIdentifier, propertyName: string - ): SingleResourceRelationship | CollectionResourceRelationship { + ): ResourceRelationship | CollectionRelationship { throw new Error('Method not implemented.'); } addToHasMany( @@ -200,20 +199,21 @@ module('integration/record-data Custom RecordData (v2) Errors', function (hooks) const { owner } = this; class LifecycleRecordData extends TestRecordData { - commitWasRejected(identifier: StableRecordIdentifier, errors?: JsonApiError[]) { + override commitWasRejected(identifier: StableRecordIdentifier, errors?: JsonApiError[]) { super.commitWasRejected(identifier, errors); assert.strictEqual(errors?.[0]?.detail, 'is a generally unsavoury character', 'received the error'); assert.strictEqual(errors?.[0]?.source?.pointer, '/data/attributes/name', 'pointer is correct'); } } class TestStore extends Store { - createCache(wrapper: CacheCapabilitiesManager) { + override createCache(wrapper: CacheCapabilitiesManager) { return new LifecycleRecordData(wrapper) as Cache; } } class TestAdapter extends EmberObject { updateRecord() { return Promise.reject( + // @ts-expect-error Constructor of class 'InvalidError' is private new InvalidError([ { title: 'Invalid Attribute', @@ -261,13 +261,13 @@ module('integration/record-data Custom RecordData (v2) Errors', function (hooks) const { owner } = this; class LifecycleRecordData extends TestRecordData { - commitWasRejected(identifier: StableRecordIdentifier, errors?: JsonApiError[]) { + override commitWasRejected(identifier: StableRecordIdentifier, errors?: JsonApiError[]) { super.commitWasRejected(identifier, errors); assert.strictEqual(errors, undefined, 'Did not pass adapter errors'); } } class TestStore extends Store { - createCache(wrapper: CacheCapabilitiesManager) { + override createCache(wrapper: CacheCapabilitiesManager) { return new LifecycleRecordData(wrapper) as Cache; } } @@ -311,13 +311,13 @@ module('integration/record-data Custom RecordData (v2) Errors', function (hooks) let storeWrapper!: CacheCapabilitiesManager; class LifecycleRecordData extends TestRecordData { - getErrors(): JsonApiError[] { + override getErrors(): JsonApiError[] { return errorsToReturn || []; } } class TestStore extends Store { - createCache(wrapper: CacheCapabilitiesManager) { + override createCache(wrapper: CacheCapabilitiesManager) { storeWrapper = wrapper; return new LifecycleRecordData(wrapper) as Cache; } diff --git a/tests/main/tests/integration/record-data/record-data-state-test.ts b/tests/main/tests/integration/record-data/record-data-state-test.ts index 3afe710bfa6..642e05a113a 100644 --- a/tests/main/tests/integration/record-data/record-data-state-test.ts +++ b/tests/main/tests/integration/record-data/record-data-state-test.ts @@ -5,10 +5,8 @@ import type { LocalRelationshipOperation } from '@warp-drive/core-types/graph'; import type { StableExistingRecordIdentifier, StableRecordIdentifier } from '@warp-drive/core-types/identifier'; import type { CollectionResourceDocument, - CollectionResourceRelationship, JsonApiDocument, SingleResourceDocument, - SingleResourceRelationship, } from '@warp-drive/core-types/spec/raw'; import { module, test } from 'qunit'; @@ -19,20 +17,21 @@ import Model, { attr } from '@ember-data/model'; import type { StructuredDataDocument, StructuredDocument } from '@ember-data/request'; import JSONAPISerializer from '@ember-data/serializer/json-api'; import { recordIdentifierFor } from '@ember-data/store'; -import type { ResourceBlob } from '@ember-data/store/-types/cache/aliases'; -import type { RelationshipDiff } from '@ember-data/store/-types/cache/cache'; -import type { Change } from '@ember-data/store/-types/cache/change'; +import type { Cache, MergeOperation } from '@ember-data/store/-types/q/cache'; +import type { CacheCapabilitiesManager } from '@ember-data/store/-types/q/cache-store-wrapper'; +import type { JsonApiError, JsonApiResource } from '@ember-data/store/-types/q/record-data-json-api'; +import type { ChangedAttributesHash, RelationshipDiff } from '@warp-drive/core-types/cache'; +import type { ResourceBlob } from '@warp-drive/core-types/cache/aliases'; +import type { Change } from '@warp-drive/core-types/cache/change'; +import { CollectionRelationship, ResourceRelationship } from '@warp-drive/core-types/cache/relationship'; +import type { StableDocumentIdentifier } from '@warp-drive/core-types/identifier'; import type { CollectionResourceDataDocument, ResourceDocument, ResourceErrorDocument, ResourceMetaDocument, SingleResourceDataDocument, -} from '@ember-data/store/-types/cache/document'; -import type { Cache, ChangedAttributesHash, MergeOperation } from '@ember-data/store/-types/q/cache'; -import type { CacheCapabilitiesManager } from '@ember-data/store/-types/q/cache-store-wrapper'; -import type { JsonApiError, JsonApiResource } from '@ember-data/store/-types/q/record-data-json-api'; -import type { StableDocumentIdentifier } from '@warp-drive/core-types/identifier'; +} from '@warp-drive/core-types/spec/document'; class Person extends Model { // TODO fix the typing for naked attrs @@ -155,7 +154,7 @@ class TestRecordData implements Cache { this._errors = errors; } unloadRecord(identifier: StableRecordIdentifier): void {} - getAttr(identifier: StableRecordIdentifier, propertyName: string): unknown { + getAttr(identifier: StableRecordIdentifier, propertyName: string): string { return ''; } setAttr(identifier: StableRecordIdentifier, propertyName: string, value: unknown): void { @@ -173,7 +172,7 @@ class TestRecordData implements Cache { getRelationship( identifier: StableRecordIdentifier, propertyName: string - ): SingleResourceRelationship | CollectionResourceRelationship { + ): ResourceRelationship | CollectionRelationship { throw new Error('Method not implemented.'); } addToHasMany( @@ -240,25 +239,25 @@ module('integration/record-data - Record Data State', function (hooks) { let { owner } = this; class LifecycleRecordData extends TestRecordData { - isNew(): boolean { + override isNew(): boolean { return isNew; } - isDeleted(): boolean { + override isDeleted(): boolean { return isDeleted; } - isDeletionCommitted(): boolean { + override isDeletionCommitted(): boolean { return isDeletionCommitted; } - setIsDeleted(): void { + override setIsDeleted(): void { isDeleted = true; } } class TestStore extends Store { - createCache(wrapper: CacheCapabilitiesManager) { + override createCache(wrapper: CacheCapabilitiesManager) { // @ts-expect-error return new LifecycleRecordData(wrapper) as Cache; } @@ -304,7 +303,7 @@ module('integration/record-data - Record Data State', function (hooks) { isDeleted = false; await person.save(); - assert.true(calledUpdate, 'called update if record isnt deleted or new'); + assert.true(calledUpdate, "called update if record isn't deleted or new"); }); test('Record Data state record flags', async function (assert) { @@ -328,30 +327,30 @@ module('integration/record-data - Record Data State', function (hooks) { storeWrapper = sw; } - isEmpty(): boolean { + override isEmpty(): boolean { return !isNew && isDeletionCommitted; } - isNew(): boolean { + override isNew(): boolean { return isNew; } - isDeleted(): boolean { + override isDeleted(): boolean { return isDeleted; } - isDeletionCommitted(): boolean { + override isDeletionCommitted(): boolean { return isDeletionCommitted; } - setIsDeleted(identifier: StableRecordIdentifier, value: boolean): void { + override setIsDeleted(identifier: StableRecordIdentifier, value: boolean): void { isDeleted = true; calledSetIsDeleted = true; } } class TestStore extends Store { - createCache(wrapper: CacheCapabilitiesManager) { + override createCache(wrapper: CacheCapabilitiesManager) { // @ts-expect-error return new LifecycleRecordData(wrapper) as Cache; } @@ -400,6 +399,6 @@ module('integration/record-data - Record Data State', function (hooks) { isDeletionCommitted = true; storeWrapper.notifyChange(personIdentifier, 'state'); await settled(); - assert.strictEqual(people.length, 0, 'commiting a deletion updates the live array'); + assert.strictEqual(people.length, 0, 'committing a deletion updates the live array'); }); }); diff --git a/tests/main/tests/integration/record-data/record-data-test.ts b/tests/main/tests/integration/record-data/record-data-test.ts index c135b90b7c7..14802c73da2 100644 --- a/tests/main/tests/integration/record-data/record-data-test.ts +++ b/tests/main/tests/integration/record-data/record-data-test.ts @@ -9,10 +9,8 @@ import type { } from '@warp-drive/core-types/identifier'; import type { CollectionResourceDocument, - CollectionResourceRelationship, JsonApiDocument, SingleResourceDocument, - SingleResourceRelationship, } from '@warp-drive/core-types/spec/raw'; import { module, test } from 'qunit'; @@ -23,20 +21,21 @@ import JSONAPIAdapter from '@ember-data/adapter/json-api'; import Model, { attr, belongsTo, hasMany } from '@ember-data/model'; import type { StructuredDataDocument, StructuredDocument } from '@ember-data/request'; import JSONAPISerializer from '@ember-data/serializer/json-api'; -import { ResourceBlob } from '@ember-data/store/-types/cache/aliases'; -import type { RelationshipDiff } from '@ember-data/store/-types/cache/cache'; -import { Change } from '@ember-data/store/-types/cache/change'; -import { +import type { Cache, MergeOperation } from '@ember-data/store/-types/q/cache'; +import type { CacheCapabilitiesManager } from '@ember-data/store/-types/q/cache-store-wrapper'; +import type { JsonApiError, JsonApiResource } from '@ember-data/store/-types/q/record-data-json-api'; +import type { ChangedAttributesHash, RelationshipDiff } from '@warp-drive/core-types/cache'; +import type { ResourceBlob } from '@warp-drive/core-types/cache/aliases'; +import type { Change } from '@warp-drive/core-types/cache/change'; +import { CollectionRelationship, ResourceRelationship } from '@warp-drive/core-types/cache/relationship'; +import type { StableDocumentIdentifier } from '@warp-drive/core-types/identifier'; +import type { CollectionResourceDataDocument, ResourceDocument, ResourceErrorDocument, ResourceMetaDocument, SingleResourceDataDocument, -} from '@ember-data/store/-types/cache/document'; -import type { Cache, ChangedAttributesHash, MergeOperation } from '@ember-data/store/-types/q/cache'; -import type { CacheCapabilitiesManager } from '@ember-data/store/-types/q/cache-store-wrapper'; -import type { JsonApiError, JsonApiResource } from '@ember-data/store/-types/q/record-data-json-api'; -import type { StableDocumentIdentifier } from '@warp-drive/core-types/identifier'; +} from '@warp-drive/core-types/spec/document'; class Person extends Model { // TODO fix the typing for naked attrs @@ -162,7 +161,7 @@ class TestRecordData implements Cache { this._errors = errors; } unloadRecord(identifier: StableRecordIdentifier): void {} - getAttr(identifier: StableRecordIdentifier, propertyName: string): unknown { + getAttr(identifier: StableRecordIdentifier, propertyName: string): string { return ''; } setAttr(identifier: StableRecordIdentifier, propertyName: string, value: unknown): void { @@ -180,7 +179,7 @@ class TestRecordData implements Cache { getRelationship( identifier: StableRecordIdentifier, propertyName: string - ): SingleResourceRelationship | CollectionResourceRelationship { + ): ResourceRelationship | CollectionRelationship { throw new Error('Method not implemented.'); } mutate(operation: LocalRelationshipOperation): void { @@ -286,11 +285,11 @@ module('integration/record-data - Custom RecordData Implementations', function ( let isNew = false; class LifecycleRecordData extends TestRecordData { - upsert() { + override upsert() { calledUpsert++; } - clientDidCreate( + override clientDidCreate( identifier: StableRecordIdentifier, options?: Record | undefined ): Record { @@ -299,20 +298,20 @@ module('integration/record-data - Custom RecordData Implementations', function ( return {}; } - willCommit() { + override willCommit() { calledWillCommit++; } - commitWasRejected(identifier, errors) { + override commitWasRejected(identifier, errors) { super.commitWasRejected(identifier, errors); calledWasRejected++; } - unloadRecord() { + override unloadRecord() { calledUnloadRecord++; } - rollbackAttrs() { + override rollbackAttrs() { calledRollbackAttributes++; return []; } @@ -320,19 +319,19 @@ module('integration/record-data - Custom RecordData Implementations', function ( calledRollbackAttributes++; } - didCommit(identifier, result) { + override didCommit(identifier, result) { calledDidCommit++; isNew = false; return { data: identifier }; } - isNew() { + override isNew() { return isNew; } } class TestStore extends Store { - createCache(storeWrapper: CacheCapabilitiesManager) { + override createCache(storeWrapper: CacheCapabilitiesManager) { // @ts-expect-error return new LifecycleRecordData(storeWrapper) as Cache; } @@ -441,15 +440,15 @@ module('integration/record-data - Custom RecordData Implementations', function ( return false; } - changedAttrs(): any { + override changedAttrs(): any { return { name: ['old', 'new'] }; } - hasChangedAttrs(): boolean { + override hasChangedAttrs(): boolean { return false; } - setAttr(identifier: StableRecordIdentifier, key: string, value: any) { + override setAttr(identifier: StableRecordIdentifier, key: string, value: any) { assert.strictEqual(key, 'name', 'key passed to setDirtyAttribute'); assert.strictEqual(value, 'new value', 'value passed to setDirtyAttribute'); } @@ -459,7 +458,7 @@ module('integration/record-data - Custom RecordData Implementations', function ( assert.strictEqual(value, 'new value', 'value passed to setDirtyAttribute'); } - getAttr(identifier: StableRecordIdentifier, key: string): string { + override getAttr(identifier: StableRecordIdentifier, key: string): string { calledGet++; assert.strictEqual(key, 'name', 'key passed to getAttr'); @@ -468,7 +467,7 @@ module('integration/record-data - Custom RecordData Implementations', function ( } class TestStore extends Store { - createCache(storeWrapper: CacheCapabilitiesManager) { + override createCache(storeWrapper: CacheCapabilitiesManager) { // @ts-expect-error return new AttributeRecordData(storeWrapper) as Cache; } diff --git a/tests/main/tests/integration/record-data/store-wrapper-test.ts b/tests/main/tests/integration/record-data/store-wrapper-test.ts index c4870d69aa5..6f3847d36e9 100644 --- a/tests/main/tests/integration/record-data/store-wrapper-test.ts +++ b/tests/main/tests/integration/record-data/store-wrapper-test.ts @@ -141,7 +141,7 @@ module('integration/store-wrapper - RecordData StoreWrapper tests', function (ho let storeWrapper!: CacheCapabilitiesManager; class TestStore extends Store { - createCache(wrapper: CacheCapabilitiesManager) { + override createCache(wrapper: CacheCapabilitiesManager) { storeWrapper = wrapper; return super.createCache(wrapper); } @@ -221,7 +221,7 @@ module('integration/store-wrapper - RecordData StoreWrapper tests', function (ho let storeWrapper!: CacheCapabilitiesManager; class TestStore extends Store { - createCache(wrapper: CacheCapabilitiesManager) { + override createCache(wrapper: CacheCapabilitiesManager) { storeWrapper = wrapper; return super.createCache(wrapper); } @@ -245,7 +245,7 @@ module('integration/store-wrapper - RecordData StoreWrapper tests', function (ho let storeWrapper!: CacheCapabilitiesManager; class TestStore extends Store { - createCache(wrapper: CacheCapabilitiesManager) { + override createCache(wrapper: CacheCapabilitiesManager) { storeWrapper = wrapper; return super.createCache(wrapper); } @@ -275,7 +275,7 @@ module('integration/store-wrapper - RecordData StoreWrapper tests', function (ho let storeWrapper!: CacheCapabilitiesManager; class TestStore extends Store { - createCache(wrapper: CacheCapabilitiesManager) { + override createCache(wrapper: CacheCapabilitiesManager) { storeWrapper = wrapper; return super.createCache(wrapper); } diff --git a/tests/main/tests/integration/records/save-test.js b/tests/main/tests/integration/records/save-test.js index 660efe9d945..533d7276228 100644 --- a/tests/main/tests/integration/records/save-test.js +++ b/tests/main/tests/integration/records/save-test.js @@ -114,7 +114,7 @@ module('integration/records/save - Save Record', function (hooks) { assert.strictEqual(post.id, '123', 'The post ID made it through'); }); - test('Repeated failed saves keeps the record in uncommited state', async function (assert) { + test('Repeated failed saves keeps the record in uncommitted state', async function (assert) { assert.expect(4); let store = this.owner.lookup('service:store'); diff --git a/tests/main/tests/integration/store-extension-test.ts b/tests/main/tests/integration/store-extension-test.ts index 75610eb0735..5c21c9c5d9a 100644 --- a/tests/main/tests/integration/store-extension-test.ts +++ b/tests/main/tests/integration/store-extension-test.ts @@ -1,8 +1,8 @@ -import { module, test } from 'qunit'; -import { setupTest } from 'ember-qunit'; -import Store from 'ember-data/store'; import RequestManager from '@ember-data/request'; import { inject as service } from '@ember/service'; +import Store from 'ember-data/store'; +import { setupTest } from 'ember-qunit'; +import { module, test } from 'qunit'; module('Integration | Store Extension', function (hooks) { setupTest(hooks); @@ -11,7 +11,7 @@ module('Integration | Store Extension', function (hooks) { const { owner } = this; class CustomStore extends Store {} owner.register('service:store', CustomStore); - const store = owner.lookup('service:store'); + const store = owner.lookup('service:store') as CustomStore; assert.true( store.requestManager instanceof RequestManager, @@ -22,13 +22,13 @@ module('Integration | Store Extension', function (hooks) { test('We can create a store with a custom request manager injected as a service', function (assert) { const { owner } = this; class CustomStore extends Store { - @service requestManager!: RequestManager; + @service declare requestManager: RequestManager; } owner.register('service:store', CustomStore); owner.register('service:request-manager', RequestManager); const requestManager = owner.lookup('service:request-manager'); - const store = owner.lookup('service:store'); + const store = owner.lookup('service:store') as CustomStore; assert.true(store.requestManager === requestManager, 'We can inject a custom request manager into the store'); }); @@ -37,11 +37,11 @@ module('Integration | Store Extension', function (hooks) { const { owner } = this; const requestManager = new RequestManager(); class CustomStore extends Store { - requestManager = requestManager; + override requestManager = requestManager; } owner.register('service:store', CustomStore); - const store = owner.lookup('service:store'); + const store = owner.lookup('service:store') as CustomStore; assert.true(store.requestManager === requestManager, 'We can inject a custom request manager into the store'); }); diff --git a/tests/main/tests/unit/custom-class-support/custom-class-model-test.ts b/tests/main/tests/unit/custom-class-support/custom-class-model-test.ts index a875dccb5dd..d618217bd3a 100644 --- a/tests/main/tests/unit/custom-class-support/custom-class-model-test.ts +++ b/tests/main/tests/unit/custom-class-support/custom-class-model-test.ts @@ -8,9 +8,9 @@ import JSONAPIAdapter from '@ember-data/adapter/json-api'; import type { Snapshot } from '@ember-data/legacy-compat/-private'; import JSONAPISerializer from '@ember-data/serializer/json-api'; import { Cache } from '@ember-data/store/-types/q/cache'; -import type { AttributesSchema, RelationshipsSchema } from '@warp-drive/core-types/schema'; import type { SchemaService } from '@ember-data/store/-types/q/schema-service'; import type { FieldSchema } from '@ember-data/store/-types/q/schema-service'; +import type { AttributesSchema, RelationshipsSchema } from '@warp-drive/core-types/schema'; module('unit/model - Custom Class Model', function (hooks: NestedHooks) { class Person { @@ -24,55 +24,61 @@ module('unit/model - Custom Class Model', function (hooks: NestedHooks) { } } - class CustomStore extends Store { - constructor(args: Record) { - super(args); - this.registerSchema({ - attributesDefinitionFor() { - let schema: AttributesSchema = {}; - schema.name = { - kind: 'attribute', - options: {}, - type: 'string', - name: 'name', - }; - return schema; - }, - _fieldsDefCache: {} as Record>, - fields(identifier: StableRecordIdentifier | { type: string }): Map { - const { type } = identifier; - let fieldDefs: Map | undefined = this._fieldsDefCache[type]; + class TestSchema { + attributesDefinitionFor(identifier: { type: T }): AttributesSchema { + let schema: AttributesSchema = {}; + schema.name = { + kind: 'attribute', + options: {}, + type: 'string', + name: 'name', + }; + return schema; + } - if (fieldDefs === undefined) { - fieldDefs = new Map(); - this._fieldsDefCache[type] = fieldDefs; + _fieldsDefCache: Record> = {}; - const attributes = this.attributesDefinitionFor(identifier); - const relationships = this.relationshipsDefinitionFor(identifier); + fields(identifier: { type: T }): Map { + const { type } = identifier; + let fieldDefs: Map | undefined = this._fieldsDefCache[type]; - for (const attr of Object.values(attributes)) { - fieldDefs.set(attr.name, attr); - } + if (fieldDefs === undefined) { + fieldDefs = new Map(); + this._fieldsDefCache[type] = fieldDefs; - for (const rel of Object.values(relationships)) { - fieldDefs.set(rel.name, rel); - } - } + const attributes = this.attributesDefinitionFor(identifier); + const relationships = this.relationshipsDefinitionFor(identifier); - return fieldDefs; - }, - relationshipsDefinitionFor() { - return {}; - }, - doesTypeExist() { - return true; - }, - }); + for (const attr of Object.values(attributes)) { + fieldDefs.set(attr.name, attr); + } + + for (const rel of Object.values(relationships)) { + fieldDefs.set(rel.name, rel); + } + } + + return fieldDefs; } - instantiateRecord(identifier, createOptions) { + + relationshipsDefinitionFor(identifier: { type: T }): RelationshipsSchema { + return {}; + } + + doesTypeExist(type: string) { + return true; + } + } + + class CustomStore extends Store { + constructor(args: Record) { + super(args); + this.registerSchema(new TestSchema()); + } + override instantiateRecord(identifier, createOptions) { return new Person(this); } - teardownRecord(record) {} + override teardownRecord(record) {} } setupTest(hooks); @@ -97,7 +103,7 @@ module('unit/model - Custom Class Model', function (hooks: NestedHooks) { let notificationCount = 0; let identifier: StableRecordIdentifier; class CreationStore extends CustomStore { - instantiateRecord(id: StableRecordIdentifier, createRecordArgs): object { + override instantiateRecord(id: StableRecordIdentifier, createRecordArgs): object { identifier = id; this.notifications.subscribe(identifier, (passedId, key) => { notificationCount++; @@ -132,13 +138,13 @@ module('unit/model - Custom Class Model', function (hooks: NestedHooks) { assert.expect(5); let returnValue: unknown; class CreationStore extends CustomStore { - instantiateRecord(identifier: StableRecordIdentifier, createRecordArgs) { + override instantiateRecord(identifier: StableRecordIdentifier, createRecordArgs) { assert.strictEqual(identifier.type, 'person', 'Identifier type passed in correctly'); assert.deepEqual(createRecordArgs, { name: 'chris', otherProp: 'unk' }, 'createRecordArg passed in'); returnValue = {}; return returnValue; } - teardownRecord(record) { + override teardownRecord(record) { assert.strictEqual(record, person, 'Passed in person to teardown'); } } @@ -165,7 +171,7 @@ module('unit/model - Custom Class Model', function (hooks: NestedHooks) { assert.deepEqual( attrDef, { kind: 'attribute', type: 'string', options: {}, name: 'name' }, - 'attribute def matches schem' + 'attribute def matches schema' ); } else if (count === 1) { assert.step('Adapter:createRecord:attr:age'); @@ -173,7 +179,7 @@ module('unit/model - Custom Class Model', function (hooks: NestedHooks) { assert.deepEqual( attrDef, { kind: 'attribute', type: 'number', options: {}, name: 'age' }, - 'attribute def matches schem' + 'attribute def matches schema' ); } count++; @@ -194,7 +200,7 @@ module('unit/model - Custom Class Model', function (hooks: NestedHooks) { }, name: 'boats', }, - 'relationships def matches schem' + 'relationships def matches schema' ); } else if (count === 1) { assert.step('Adapter:createRecord:rel:house'); @@ -207,7 +213,7 @@ module('unit/model - Custom Class Model', function (hooks: NestedHooks) { options: { inverse: null, async: false }, name: 'house', }, - 'relationship def matches schem' + 'relationship def matches schema' ); } count++; @@ -227,14 +233,14 @@ module('unit/model - Custom Class Model', function (hooks: NestedHooks) { ); // eslint-disable-next-line @typescript-eslint/no-shadow class CustomStore extends Store { - instantiateRecord(identifier, createOptions) { + override instantiateRecord(identifier, createOptions) { return new Person(this); } - teardownRecord(record) {} + override teardownRecord(record) {} } this.owner.register('service:store', CustomStore); const store = this.owner.lookup('service:store') as Store; - let schema: SchemaService = { + class TestSchema { attributesDefinitionFor(identifier: RecordIdentifier | { type: string }): AttributesSchema { assert.step('Schema:attributesDefinitionFor'); if (typeof identifier === 'string') { @@ -256,8 +262,10 @@ module('unit/model - Custom Class Model', function (hooks: NestedHooks) { name: 'age', }, }; - }, - _fieldsDefCache: {} as Record>, + } + + _fieldsDefCache: Record> = {}; + fields(identifier: StableRecordIdentifier | { type: string }): Map { assert.step('Schema:fields'); const { type } = identifier; @@ -281,7 +289,8 @@ module('unit/model - Custom Class Model', function (hooks: NestedHooks) { } return fieldDefs; - }, + } + relationshipsDefinitionFor(identifier: RecordIdentifier | { type: string }): RelationshipsSchema { assert.step('Schema:relationshipsDefinitionFor'); if (typeof identifier === 'string') { @@ -309,11 +318,14 @@ module('unit/model - Custom Class Model', function (hooks: NestedHooks) { name: 'house', }, }; - }, + } + doesTypeExist() { return true; - }, - }; + } + } + + let schema: SchemaService = new TestSchema(); store.registerSchemaDefinitionService(schema); assert.verifySteps([]); let person = store.createRecord('person', { name: 'chris' }) as Person; @@ -365,7 +377,7 @@ module('unit/model - Custom Class Model', function (hooks: NestedHooks) { ); const subscribedValues: string[] = []; class CreationStore extends CustomStore { - instantiateRecord(identifier: StableRecordIdentifier, createRecordArgs) { + override instantiateRecord(identifier: StableRecordIdentifier, createRecordArgs) { ident = identifier; assert.false(this.cache.isDeleted(identifier), 'we are not deleted when we start'); this.notifications.subscribe(identifier, (passedId, key: string) => { @@ -374,7 +386,7 @@ module('unit/model - Custom Class Model', function (hooks: NestedHooks) { }); return {}; } - teardownRecord(record) { + override teardownRecord(record) { assert.strictEqual(record, person, 'Passed in person to teardown'); } } @@ -385,7 +397,7 @@ module('unit/model - Custom Class Model', function (hooks: NestedHooks) { store.deleteRecord(person); assert.true(rd.isDeleted(ident!), 'record has been marked as deleted'); await store.saveRecord(person); - assert.true(rd.isDeletionCommitted(ident!), 'deletion has been commited'); + assert.true(rd.isDeletionCommitted(ident!), 'deletion has been committed'); assert.strictEqual(subscribedValues.length, 3, 'we received the proper notifications'); // TODO this indicates our implementation could likely be more efficient assert.deepEqual(subscribedValues, ['state', 'removed', 'state'], 'state change to deleted has been notified'); @@ -404,14 +416,14 @@ module('unit/model - Custom Class Model', function (hooks: NestedHooks) { ); // eslint-disable-next-line @typescript-eslint/no-shadow class CustomStore extends Store { - instantiateRecord(identifier, createOptions) { + override instantiateRecord(identifier, createOptions) { return new Person(this); } - teardownRecord(record) {} + override teardownRecord(record) {} } this.owner.register('service:store', CustomStore); const store = this.owner.lookup('service:store') as Store; - let schema: SchemaService = { + class TestSchema { attributesDefinitionFor(identifier: RecordIdentifier | { type: string }): AttributesSchema { let modelName = (identifier as RecordIdentifier).type || identifier; if (modelName === 'person') { @@ -435,8 +447,10 @@ module('unit/model - Custom Class Model', function (hooks: NestedHooks) { } else { return {}; } - }, - _fieldsDefCache: {} as Record>, + } + + _fieldsDefCache: Record> = {}; + fields(identifier: StableRecordIdentifier | { type: string }): Map { const { type } = identifier; let fieldDefs: Map | undefined = this._fieldsDefCache[type]; @@ -458,7 +472,8 @@ module('unit/model - Custom Class Model', function (hooks: NestedHooks) { } return fieldDefs; - }, + } + relationshipsDefinitionFor(identifier: RecordIdentifier | { type: string }): RelationshipsSchema { let modelName = (identifier as RecordIdentifier).type || identifier; if (modelName === 'person') { @@ -476,11 +491,13 @@ module('unit/model - Custom Class Model', function (hooks: NestedHooks) { } else { return {}; } - }, + } + doesTypeExist() { return true; - }, - }; + } + } + const schema = new TestSchema(); store.registerSchemaDefinitionService(schema); let person = store.push({ data: { diff --git a/tests/main/tsconfig.json b/tests/main/tsconfig.json new file mode 100644 index 00000000000..b787097e7dd --- /dev/null +++ b/tests/main/tsconfig.json @@ -0,0 +1,33 @@ +{ + "include": ["app/**/*", "config/**/*", "tests/**/*", "../../@types/ember-data-qunit-asserts"], + "baseUrl": ".", + "compilerOptions": { + "lib": ["DOM", "ESNext"], + "module": "esnext", + "target": "esnext", + "moduleResolution": "bundler", + "moduleDetection": "force", + "strict": true, + "downlevelIteration": true, + "skipLibCheck": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "allowJs": true, + + "noImplicitOverride": true, + + // TODO: Reenable this + "noImplicitAny": false, + + "experimentalDecorators": true, + + "incremental": true, + + "noEmit": true, + "declaration": false, + + "types": ["ember-source/types"], + "paths": {} + }, + "references": [] +}