diff --git a/types/ember-data/test/store.ts b/types/ember-data/test/store.ts index f692a668d9..e06f9d2fc2 100644 --- a/types/ember-data/test/store.ts +++ b/types/ember-data/test/store.ts @@ -13,7 +13,7 @@ class Post extends DS.Model { declare module 'ember-data/types/registries/model' { export default interface ModelRegistry { - 'post': Post; + post: Post; 'post-comment': PostComment; } } @@ -109,7 +109,7 @@ const SomeComponent = Ember.Object.extend({ lookUpUsers() { assertType(this.get('store').findRecord('user', 123)); assertType>(this.get('store').findAll('user')); - } + }, }); const MyRouteAsync = Ember.Route.extend({ @@ -124,7 +124,7 @@ const MyRouteAsync = Ember.Route.extend({ async afterModel(): Promise> { const post = await this.get('store').findRecord('post', 1); return await post.get('comments'); - } + }, }); class MyRouteAsyncES6 extends Ember.Route { diff --git a/types/ember-data/tsconfig.json b/types/ember-data/tsconfig.json index a07f9b5fc8..27184f1958 100644 --- a/types/ember-data/tsconfig.json +++ b/types/ember-data/tsconfig.json @@ -102,7 +102,8 @@ "types": [], "noEmit": true, "forceConsistentCasingInFileNames": true, - "esModuleInterop": true + "esModuleInterop": true, + "experimentalDecorators": true }, "files": [ "index.d.ts", diff --git a/types/ember-data__adapter/OTHER_FILES.txt b/types/ember-data__adapter/OTHER_FILES.txt new file mode 100644 index 0000000000..aefca8869f --- /dev/null +++ b/types/ember-data__adapter/OTHER_FILES.txt @@ -0,0 +1,3 @@ +error.d.ts +json-api.d.ts +rest.d.ts diff --git a/types/ember-data__adapter/error.d.ts b/types/ember-data__adapter/error.d.ts new file mode 100644 index 0000000000..d8fbece163 --- /dev/null +++ b/types/ember-data__adapter/error.d.ts @@ -0,0 +1,14 @@ +import DS from 'ember-data'; + +export import AdapterError = DS.AdapterError; +export import InvalidError = DS.InvalidError; +export import UnauthorizedError = DS.UnauthorizedError; +export import ForbiddenError = DS.ForbiddenError; +export import NotFoundError = DS.NotFoundError; +export import ConflictError = DS.ConflictError; +export import ServerError = DS.ServerError; +export import TimeoutError = DS.TimeoutError; +export import AbortError = DS.AbortError; + +export const errorsHashToArray: typeof DS.errorsHashToArray; +export const errorsArrayToHash: typeof DS.errorsArrayToHash; diff --git a/types/ember-data__adapter/index.d.ts b/types/ember-data__adapter/index.d.ts new file mode 100644 index 0000000000..3b5150c4e2 --- /dev/null +++ b/types/ember-data__adapter/index.d.ts @@ -0,0 +1,14 @@ +// Type definitions for @ember-data/adapter 3.15 +// Project: https://github.com/emberjs/data +// Definitions by: Mike North +// Chris Krycho +// Dan Freeman +// James C. Davis +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 3.6 + +import DS from 'ember-data'; + +export let BuildURLMixin: DS.BuildURLMixin; + +export default DS.Adapter; diff --git a/types/ember-data__adapter/json-api.d.ts b/types/ember-data__adapter/json-api.d.ts new file mode 100644 index 0000000000..4296b32eec --- /dev/null +++ b/types/ember-data__adapter/json-api.d.ts @@ -0,0 +1,2 @@ +import DS from 'ember-data'; +export default DS.JSONAPIAdapter; diff --git a/types/ember-data__adapter/rest.d.ts b/types/ember-data__adapter/rest.d.ts new file mode 100644 index 0000000000..c7dd3824ae --- /dev/null +++ b/types/ember-data__adapter/rest.d.ts @@ -0,0 +1,2 @@ +import DS from 'ember-data'; +export default DS.RESTAdapter; diff --git a/types/ember-data__adapter/test/error.ts b/types/ember-data__adapter/test/error.ts new file mode 100644 index 0000000000..bd937fc1be --- /dev/null +++ b/types/ember-data__adapter/test/error.ts @@ -0,0 +1,26 @@ +// These tests *actually do* what we need: show that the imports work at all. +// They are empty sub-classes of EmberObject at present in the base definitions +// being re-exported here. As long as the imports resolve, this is safe (until +// we make these the root definitions and expand these as appropriate). + +import AdapterError, { + InvalidError, + TimeoutError, + AbortError, + UnauthorizedError, + ForbiddenError, + NotFoundError, + ConflictError, + ServerError, + errorsHashToArray, + errorsArrayToHash, +} from '@ember-data/adapter/error'; + +class MyInvalid extends InvalidError { + constructor() { + super([]); // required + } +} + +errorsHashToArray({}); // $ExpectType +errorsArrayToHash([]); // $ExpectType<{}> diff --git a/types/ember-data__adapter/test/index.ts b/types/ember-data__adapter/test/index.ts new file mode 100644 index 0000000000..160076f379 --- /dev/null +++ b/types/ember-data__adapter/test/index.ts @@ -0,0 +1,49 @@ +import Service, { inject as service } from '@ember/service'; +import Adapter, { BuildURLMixin } from '@ember-data/adapter'; +import Model from '@ember-data/model'; + +import Store from '@ember-data/store'; +import DS from 'ember-data'; + +class Session extends Service { + login(userName: string, password: string): Promise { + return Promise.resolve(); + } +} + +declare module '@ember/service' { + interface Registry { + session: Session; + } +} + +declare module 'ember-data/types/registries/model' { + export default interface ModelRegistry { + rootModel: any; + 'super-user': any; + } +} + +declare module 'ember-data/types/registries/adapter' { + export default interface AdapterRegistry { + customized: Customized; + } +} + +class Customized extends Adapter { + @service session!: Session; + + async someMethod(): Promise { + this.defaultSerializer = 'a string'; + this.defaultSerializer = 12; // $ExpectError + + return this.session.login('hi@example.com', 'password'); + } +} + +const MixedIn = Adapter.extend(BuildURLMixin, { + findRecord(store: Store, type: typeof Model, id: string, snapshot: DS.Snapshot) { + let url = this.buildURL(type.modelName, id, snapshot, 'findRecord'); + return $.ajax(url, { method: 'GET' }); + }, +}); diff --git a/types/ember-data__adapter/test/json-api.ts b/types/ember-data__adapter/test/json-api.ts new file mode 100644 index 0000000000..be84e3a557 --- /dev/null +++ b/types/ember-data__adapter/test/json-api.ts @@ -0,0 +1,59 @@ +import { inject as service } from '@ember/service'; +import { computed } from '@ember/object'; +import $ from 'jquery'; +import JSONAPIAdapter from '@ember-data/adapter/json-api'; +import Store from '@ember-data/store'; + +class JsonApi extends JSONAPIAdapter { + // Application specific overrides go here +} + +const Customized = JSONAPIAdapter.extend({ + host: 'https://api.example.com', + namespace: 'api/v1', + headers: { + API_KEY: 'secret key', + ANOTHER_HEADER: 'Some header value', + }, +}); + +const AuthTokenHeader = JSONAPIAdapter.extend({ + session: service('session'), + headers: computed('session.authToken', function() { + return { + API_KEY: this.get('session.authToken'), + ANOTHER_HEADER: 'Some header value', + }; + }), +}); + +const UseAjax = JSONAPIAdapter.extend({ + query(store: Store, type: string, query: object) { + const url = 'https://api.example.com/my-api'; + return this.ajax(url, 'POST', { + param: 'foo', + }); + }, +}); + +const UseAjaxOptions = JSONAPIAdapter.extend({ + query(store: Store, type: string, query: object) { + const url = 'https://api.example.com/my-api'; + const options = this.ajaxOptions(url, 'DELETE', { + foo: 'bar', + }); + return $.ajax(url, { + ...options, + }); + }, +}); + +const UseAjaxOptionsWithOptionalThirdParams = JSONAPIAdapter.extend({ + query(store: Store, type: string, query: object) { + const url = 'https://api.example.com/my-api'; + const options = this.ajaxOptions(url, 'DELETE'); + return $.ajax(url, { + ...options, + }); + }, +}); diff --git a/types/ember-data__adapter/test/lib/assert.ts b/types/ember-data__adapter/test/lib/assert.ts new file mode 100644 index 0000000000..10094b9616 --- /dev/null +++ b/types/ember-data__adapter/test/lib/assert.ts @@ -0,0 +1,2 @@ +/** Static assertion that `value` has type `T` */ +export declare function assertType(value: T): void; diff --git a/types/ember-data__adapter/test/rest.ts b/types/ember-data__adapter/test/rest.ts new file mode 100644 index 0000000000..0813612dcb --- /dev/null +++ b/types/ember-data__adapter/test/rest.ts @@ -0,0 +1,8 @@ +import RESTAdapter from '@ember-data/adapter/rest'; + +class MyRESTAdapter extends RESTAdapter { + someMethod() { + this.coalesceFindRequests; // $ExpectType boolean + this.namespace; // $ExpectType string + } +} diff --git a/types/ember-data__adapter/tsconfig.json b/types/ember-data__adapter/tsconfig.json new file mode 100644 index 0000000000..98451f4034 --- /dev/null +++ b/types/ember-data__adapter/tsconfig.json @@ -0,0 +1,63 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": ["es6", "dom"], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "strictFunctionTypes": false, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "paths": { + "@ember-data/adapter": ["ember-data__adapter"], + "@ember-data/adapter/*": ["ember-data__adapter/*"], + "@ember-data/model": ["ember-data__model"], + "@ember-data/model/*": ["ember-data__model/*"], + "@ember-data/store": ["ember-data__store"], + "@ember-data/store/*": ["ember-data__store/*"], + "@ember/application": ["ember__application"], + "@ember/application/*": ["ember__application/*"], + "@ember/array": ["ember__array"], + "@ember/array/*": ["ember__array/*"], + "@ember/component": ["ember__component"], + "@ember/component/*": ["ember__component/*"], + "@ember/controller": ["ember__controller"], + "@ember/debug": ["ember__debug"], + "@ember/debug/*": ["ember__debug/*"], + "@ember/engine": ["ember__engine"], + "@ember/engine/*": ["ember__engine/*"], + "@ember/error": ["ember__error"], + "@ember/object": ["ember__object"], + "@ember/object/*": ["ember__object/*"], + "@ember/polyfills": ["ember__polyfills"], + "@ember/routing": ["ember__routing"], + "@ember/routing/*": ["ember__routing/*"], + "@ember/runloop": ["ember__runloop"], + "@ember/runloop/*": ["ember__runloop/*"], + "@ember/service": ["ember__service"], + "@ember/string": ["ember__string"], + "@ember/string/*": ["ember__string/*"], + "@ember/template": ["ember__template"], + "@ember/template/*": ["ember__template/*"], + "@ember/test": ["ember__test"], + "@ember/test/*": ["ember__test/*"], + "@ember/utils": ["ember__utils"], + "@ember/utils/*": ["ember__utils/*"] + }, + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true, + "esModuleInterop": true, + "experimentalDecorators": true + }, + "files": [ + "index.d.ts", + "test/lib/assert.ts", + "test/index.ts", + "test/error.ts", + "test/json-api.ts", + "test/rest.ts" + ] +} diff --git a/types/ember-data__adapter/tslint.json b/types/ember-data__adapter/tslint.json new file mode 100644 index 0000000000..a24d0f104a --- /dev/null +++ b/types/ember-data__adapter/tslint.json @@ -0,0 +1,21 @@ +{ + "extends": "dtslint/dt.json", + // Copied without modification from config for ember-data. + "rules": { + "strict-export-declare-modifiers": false, + "jsdoc-format": false, + "no-misused-new": false, + // not sure what this means + "no-single-declare-module": false, + "object-literal-key-quotes": false, + "only-arrow-functions": false, + "no-empty-interface": false, + "prefer-const": false, + "no-unnecessary-generics": false, + "no-declare-current-package": false, + "no-self-import": false, + "no-return-await": false, // used in tests + // @ember-data packages do not yet have ES module exports + "npm-naming": false + } +} diff --git a/types/ember-data__model/index.d.ts b/types/ember-data__model/index.d.ts new file mode 100644 index 0000000000..54af1c6199 --- /dev/null +++ b/types/ember-data__model/index.d.ts @@ -0,0 +1,15 @@ +// Type definitions for @ember-data/model 3.15 +// Project: https://github.com/emberjs/data +// Definitions by: Mike North +// Chris Krycho +// Dan Freeman +// James C. Davis +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 3.6 + +import DS from 'ember-data'; +export default DS.Model; + +export import attr = DS.attr; +export import belongsTo = DS.belongsTo; +export import hasMany = DS.hasMany; diff --git a/types/ember-data__model/test/lib/assert.ts b/types/ember-data__model/test/lib/assert.ts new file mode 100644 index 0000000000..10094b9616 --- /dev/null +++ b/types/ember-data__model/test/lib/assert.ts @@ -0,0 +1,2 @@ +/** Static assertion that `value` has type `T` */ +export declare function assertType(value: T): void; diff --git a/types/ember-data__model/test/model.ts b/types/ember-data__model/test/model.ts new file mode 100644 index 0000000000..af22494736 --- /dev/null +++ b/types/ember-data__model/test/model.ts @@ -0,0 +1,80 @@ +import { computed } from '@ember/object'; +import Model, { attr, belongsTo, hasMany } from '@ember-data/model'; +import DS, { ChangedAttributes } from 'ember-data'; +import RSVP from 'rsvp'; + +declare module 'ember-data/types/registries/model' { + export default interface ModelRegistry { + user: InstanceType; + person: Person; + human: Human; + } +} + +class Person extends Model.extend({ + firstName: attr(), + lastName: attr(), + title: attr({ defaultValue: 'The default' }), + title2: attr({ defaultValue: () => 'The default' }), + + fullName: computed('firstName', 'lastName', function() { + return `${this.get('firstName')} ${this.get('lastName')}`; + }), +}) {} + +const User = Model.extend({ + username: attr('string'), + email: attr('string'), + verified: attr('boolean', { defaultValue: false }), + canBeNull: attr('boolean', { allowNull: true }), + createdAt: attr('date', { + defaultValue() { + return new Date(); + }, + }), + mother: belongsTo('person'), + father: belongsTo('person'), + friends: hasMany('human'), +}); + +class Human extends Model { + @attr() age: number; + @belongsTo('human') mother: Human; + // We should remove the direct use of `DS.PromiseManyArray` by creating and + // exporting a type which represents `HasMany`. + @hasMany('person') children: DS.PromiseManyArray; +} + +const user = User.create({ username: 'dwickern' }); +user.get('id'); // $ExpectType string +user.get('username'); // $ExpectType string +user.get('verified'); // $ExpectType boolean +user.get('createdAt'); // $ExpectType Date + +user.serialize(); +user.serialize({ includeId: true }); +user.serialize({ includeId: true }); + +const attributes: ChangedAttributes = user.changedAttributes(); + +user.rollbackAttributes(); // $ExpectType void + +let destroyResult: RSVP.Promise; +destroyResult = user.destroyRecord(); +destroyResult = user.destroyRecord({}); +destroyResult = user.destroyRecord({ adapterOptions: {} }); +destroyResult = user.destroyRecord({ adapterOptions: { waffles: 'are yummy' } }); + +user.deleteRecord(); // $ExpectType void + +user.unloadRecord(); // $ExpectType void + +let jsonified: object; +jsonified = user.toJSON(); +jsonified = user.toJSON({ includeId: true }); + +let reloaded: RSVP.Promise; +reloaded = user.reload(); +reloaded = user.reload({}); +reloaded = user.reload({ adapterOptions: {} }); +reloaded = user.reload({ adapterOptions: { fastAsCanBe: 'yessirree' } }); diff --git a/types/ember-data__model/tsconfig.json b/types/ember-data__model/tsconfig.json new file mode 100644 index 0000000000..206b199ba0 --- /dev/null +++ b/types/ember-data__model/tsconfig.json @@ -0,0 +1,56 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": ["es6", "dom"], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "strictFunctionTypes": false, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "paths": { + "@ember-data/model": ["ember-data__model"], + "@ember-data/model/*": ["ember-data__model/*"], + "@ember/application": ["ember__application"], + "@ember/application/*": ["ember__application/*"], + "@ember/array": ["ember__array"], + "@ember/array/*": ["ember__array/*"], + "@ember/component": ["ember__component"], + "@ember/component/*": ["ember__component/*"], + "@ember/controller": ["ember__controller"], + "@ember/debug": ["ember__debug"], + "@ember/debug/*": ["ember__debug/*"], + "@ember/engine": ["ember__engine"], + "@ember/engine/*": ["ember__engine/*"], + "@ember/error": ["ember__error"], + "@ember/object": ["ember__object"], + "@ember/object/*": ["ember__object/*"], + "@ember/polyfills": ["ember__polyfills"], + "@ember/routing": ["ember__routing"], + "@ember/routing/*": ["ember__routing/*"], + "@ember/runloop": ["ember__runloop"], + "@ember/runloop/*": ["ember__runloop/*"], + "@ember/service": ["ember__service"], + "@ember/string": ["ember__string"], + "@ember/string/*": ["ember__string/*"], + "@ember/template": ["ember__template"], + "@ember/template/*": ["ember__template/*"], + "@ember/test": ["ember__test"], + "@ember/test/*": ["ember__test/*"], + "@ember/utils": ["ember__utils"], + "@ember/utils/*": ["ember__utils/*"] + }, + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true, + "esModuleInterop": true, + "experimentalDecorators": true + }, + "files": [ + "index.d.ts", + "test/lib/assert.ts", + "test/model.ts" + ] +} diff --git a/types/ember-data__model/tslint.json b/types/ember-data__model/tslint.json new file mode 100644 index 0000000000..a24d0f104a --- /dev/null +++ b/types/ember-data__model/tslint.json @@ -0,0 +1,21 @@ +{ + "extends": "dtslint/dt.json", + // Copied without modification from config for ember-data. + "rules": { + "strict-export-declare-modifiers": false, + "jsdoc-format": false, + "no-misused-new": false, + // not sure what this means + "no-single-declare-module": false, + "object-literal-key-quotes": false, + "only-arrow-functions": false, + "no-empty-interface": false, + "prefer-const": false, + "no-unnecessary-generics": false, + "no-declare-current-package": false, + "no-self-import": false, + "no-return-await": false, // used in tests + // @ember-data packages do not yet have ES module exports + "npm-naming": false + } +} diff --git a/types/ember-data__serializer/OTHER_FILES.txt b/types/ember-data__serializer/OTHER_FILES.txt new file mode 100644 index 0000000000..4c7894e483 --- /dev/null +++ b/types/ember-data__serializer/OTHER_FILES.txt @@ -0,0 +1,4 @@ +json-api.d.ts +json.d.ts +rest.d.ts +transform.d.ts diff --git a/types/ember-data__serializer/index.d.ts b/types/ember-data__serializer/index.d.ts new file mode 100644 index 0000000000..187b86f9db --- /dev/null +++ b/types/ember-data__serializer/index.d.ts @@ -0,0 +1,11 @@ +// Type definitions for @ember-data/serializer 3.15 +// Project: https://github.com/emberjs/data +// Definitions by: Chris Krycho +// Dan Freeman +// James C. Davis +// Mike North +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 3.6 + +import DS from 'ember-data'; +export default DS.Serializer; diff --git a/types/ember-data__serializer/json-api.d.ts b/types/ember-data__serializer/json-api.d.ts new file mode 100644 index 0000000000..3619a4aa2b --- /dev/null +++ b/types/ember-data__serializer/json-api.d.ts @@ -0,0 +1,3 @@ +import DS from 'ember-data'; + +export default DS.JSONAPISerializer; diff --git a/types/ember-data__serializer/json.d.ts b/types/ember-data__serializer/json.d.ts new file mode 100644 index 0000000000..12d8dc3f6e --- /dev/null +++ b/types/ember-data__serializer/json.d.ts @@ -0,0 +1,2 @@ +import DS from 'ember-data'; +export default DS.JSONSerializer; diff --git a/types/ember-data__serializer/rest.d.ts b/types/ember-data__serializer/rest.d.ts new file mode 100644 index 0000000000..77049a32ac --- /dev/null +++ b/types/ember-data__serializer/rest.d.ts @@ -0,0 +1,4 @@ +import DS from 'ember-data'; + +export let EmbeddedRecordsMixin: DS.EmbeddedRecordsMixin; +export default DS.RESTSerializer; diff --git a/types/ember-data__serializer/test/index.ts b/types/ember-data__serializer/test/index.ts new file mode 100644 index 0000000000..6089f09bbd --- /dev/null +++ b/types/ember-data__serializer/test/index.ts @@ -0,0 +1,22 @@ +import Serializer from '@ember-data/serializer'; +import ModelRegistry from 'ember-data/types/registries/model'; +import Store from '@ember-data/store'; +import Model from '@ember-data/model'; + +class FakeModel extends Model { + hasFunData = true; +} + +declare module 'ember-data/types/registries/model' { + export default interface ModelRegistry { + 'fake-model': FakeModel; + } +} + +class MySerializer extends Serializer { + someMethod() { + // has types from Serializer + this.store; // $ExpectType Store + this.normalize(new FakeModel(), { works: 'yep' }); // $ExpectType {} + } +} diff --git a/types/ember-data__serializer/test/json-api.ts b/types/ember-data__serializer/test/json-api.ts new file mode 100644 index 0000000000..658c7ab385 --- /dev/null +++ b/types/ember-data__serializer/test/json-api.ts @@ -0,0 +1,8 @@ +import JSONAPISerializer from '@ember-data/serializer/json-api'; + +class MoarSerialized extends JSONAPISerializer { + someMethod() { + // has types from JSONAPISerializer + this.modelNameFromPayloadKey('hello'); // $ExpectType string + } +} diff --git a/types/ember-data__serializer/test/json.ts b/types/ember-data__serializer/test/json.ts new file mode 100644 index 0000000000..0e775ea18d --- /dev/null +++ b/types/ember-data__serializer/test/json.ts @@ -0,0 +1,8 @@ +import JSONSerializer from '@ember-data/serializer/json'; + +class MyJSONSerializer extends JSONSerializer { + someMethod() { + // has types from JSONSerializer + this.keyForLink('a', 'b'); // $ExpectType string + } +} diff --git a/types/ember-data__serializer/test/rest.ts b/types/ember-data__serializer/test/rest.ts new file mode 100644 index 0000000000..962db82e9a --- /dev/null +++ b/types/ember-data__serializer/test/rest.ts @@ -0,0 +1,18 @@ +import RESTSerializer, { EmbeddedRecordsMixin } from '@ember-data/serializer/rest'; +import EmberObject from '@ember/object'; +import Model from '@ember-data/model'; + +class MySerializer extends RESTSerializer { + because = 'this needs to have the right type *and* the right runtime'; + + someMethod() { + // has types from RESTSerializer + this.keyForPolymorphicType('a', 'b', 'c'); // $ExpectType string + } +} + +class Foo extends EmberObject.extend(EmbeddedRecordsMixin) { + someMethod() { + this.normalize; // $ExpectType (typeClass: Model, hash: {}, prop: string) => {} + } +} diff --git a/types/ember-data__serializer/test/transform.ts b/types/ember-data__serializer/test/transform.ts new file mode 100644 index 0000000000..01d53dc080 --- /dev/null +++ b/types/ember-data__serializer/test/transform.ts @@ -0,0 +1,8 @@ +import Transform from '@ember-data/serializer/transform'; + +class Foo extends Transform { + someMethod() { + // has types from Transform + this.serialize({ cool: 'cool cool' }, { defaultValue: 'potato', allowNull: false }); // $ExpectType any + } +} diff --git a/types/ember-data__serializer/transform.d.ts b/types/ember-data__serializer/transform.d.ts new file mode 100644 index 0000000000..b57b7cbe76 --- /dev/null +++ b/types/ember-data__serializer/transform.d.ts @@ -0,0 +1,2 @@ +import DS from 'ember-data'; +export default DS.Transform; diff --git a/types/ember-data__serializer/tsconfig.json b/types/ember-data__serializer/tsconfig.json new file mode 100644 index 0000000000..0d201a034d --- /dev/null +++ b/types/ember-data__serializer/tsconfig.json @@ -0,0 +1,61 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": ["es6", "dom"], + "noImplicitAny": true, + "noImplicitThis": true, + "strictFunctionTypes": true, + "strictNullChecks": true, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "paths": { + "@ember-data/model": ["ember-data__model"], + "@ember-data/model/*": ["ember-data__model/*"], + "@ember-data/serializer": ["ember-data__serializer"], + "@ember-data/serializer/*": ["ember-data__serializer/*"], + "@ember-data/store": ["ember-data__store"], + "@ember-data/store/*": ["ember-data__store/*"], + "@ember/application": ["ember__application"], + "@ember/application/*": ["ember__application/*"], + "@ember/array": ["ember__array"], + "@ember/array/*": ["ember__array/*"], + "@ember/component": ["ember__component"], + "@ember/component/*": ["ember__component/*"], + "@ember/controller": ["ember__controller"], + "@ember/debug": ["ember__debug"], + "@ember/debug/*": ["ember__debug/*"], + "@ember/engine": ["ember__engine"], + "@ember/engine/*": ["ember__engine/*"], + "@ember/error": ["ember__error"], + "@ember/object": ["ember__object"], + "@ember/object/*": ["ember__object/*"], + "@ember/polyfills": ["ember__polyfills"], + "@ember/routing": ["ember__routing"], + "@ember/routing/*": ["ember__routing/*"], + "@ember/runloop": ["ember__runloop"], + "@ember/runloop/*": ["ember__runloop/*"], + "@ember/service": ["ember__service"], + "@ember/string": ["ember__string"], + "@ember/string/*": ["ember__string/*"], + "@ember/template": ["ember__template"], + "@ember/template/*": ["ember__template/*"], + "@ember/test": ["ember__test"], + "@ember/test/*": ["ember__test/*"], + "@ember/utils": ["ember__utils"], + "@ember/utils/*": ["ember__utils/*"] + }, + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true + }, + "files": [ + "index.d.ts", + "test/index.ts", + "test/json-api.ts", + "test/json.ts", + "test/rest.ts", + "test/transform.ts" + ] +} diff --git a/types/ember-data__serializer/tslint.json b/types/ember-data__serializer/tslint.json new file mode 100644 index 0000000000..c90ea4cfb6 --- /dev/null +++ b/types/ember-data__serializer/tslint.json @@ -0,0 +1,6 @@ +{ + "extends": "dtslint/dt.json", + "rules": { + "npm-naming": false // The ember addon package exports *build-time*, not *run-time* code. + } +} diff --git a/types/ember-data__store/ember-data__store-tests.ts b/types/ember-data__store/ember-data__store-tests.ts new file mode 100644 index 0000000000..156aebe2ea --- /dev/null +++ b/types/ember-data__store/ember-data__store-tests.ts @@ -0,0 +1,31 @@ +import DS from 'ember-data'; +import ModelRegistry from 'ember-data/types/registries/model'; +import Store, { normalizeModelName } from '@ember-data/store'; +import Model, { attr, hasMany, belongsTo } from '@ember-data/model'; +import EmberArray from '@ember/array'; + +// -- support types +declare class Post extends Model { + @attr('string') + title: string; + + @hasMany('post-comment') + comments: EmberArray; +} + +declare class PostComment extends Model { + @belongsTo('post') + post: Post; +} + +declare module 'ember-data/types/registries/model' { + export default interface ModelRegistry { + post: Post; + 'post-comment': PostComment; + } +} + +// -- actual tests +Store; // $ExpectType +normalizeModelName('post'); // $ExpectType +normalizeModelName('post-comment'); // $ExpectType diff --git a/types/ember-data__store/index.d.ts b/types/ember-data__store/index.d.ts new file mode 100644 index 0000000000..0e78219a4a --- /dev/null +++ b/types/ember-data__store/index.d.ts @@ -0,0 +1,14 @@ +// Type definitions for @ember-data/store 3.15 +// Project: https://github.com/emberjs/data +// Definitions by: Chris Krycho +// Dan Freeman +// James C. Davis +// Mike North +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TypeScript Version: 3.6 + +import DS from 'ember-data'; + +export import normalizeModelName = DS.normalizeModelName; + +export default DS.Store; diff --git a/types/ember-data__store/tsconfig.json b/types/ember-data__store/tsconfig.json new file mode 100644 index 0000000000..62481a3e7b --- /dev/null +++ b/types/ember-data__store/tsconfig.json @@ -0,0 +1,57 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib": ["es6", "dom"], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "strictFunctionTypes": false, + "baseUrl": "../", + "typeRoots": [ + "../" + ], + "paths": { + "@ember-data/model": ["ember-data__model"], + "@ember-data/model/*": ["ember-data__model/*"], + "@ember-data/store": ["ember-data__store"], + "@ember-data/store/*": ["ember-data__store/*"], + "@ember/application": ["ember__application"], + "@ember/application/*": ["ember__application/*"], + "@ember/array": ["ember__array"], + "@ember/array/*": ["ember__array/*"], + "@ember/component": ["ember__component"], + "@ember/component/*": ["ember__component/*"], + "@ember/controller": ["ember__controller"], + "@ember/debug": ["ember__debug"], + "@ember/debug/*": ["ember__debug/*"], + "@ember/engine": ["ember__engine"], + "@ember/engine/*": ["ember__engine/*"], + "@ember/error": ["ember__error"], + "@ember/object": ["ember__object"], + "@ember/object/*": ["ember__object/*"], + "@ember/polyfills": ["ember__polyfills"], + "@ember/routing": ["ember__routing"], + "@ember/routing/*": ["ember__routing/*"], + "@ember/runloop": ["ember__runloop"], + "@ember/runloop/*": ["ember__runloop/*"], + "@ember/service": ["ember__service"], + "@ember/string": ["ember__string"], + "@ember/string/*": ["ember__string/*"], + "@ember/template": ["ember__template"], + "@ember/template/*": ["ember__template/*"], + "@ember/test": ["ember__test"], + "@ember/test/*": ["ember__test/*"], + "@ember/utils": ["ember__utils"], + "@ember/utils/*": ["ember__utils/*"] + }, + "types": [], + "noEmit": true, + "forceConsistentCasingInFileNames": true, + "esModuleInterop": true, + "experimentalDecorators": true + }, + "files": [ + "index.d.ts", + "ember-data__store-tests.ts" + ] +} diff --git a/types/ember-data__store/tslint.json b/types/ember-data__store/tslint.json new file mode 100644 index 0000000000..a24d0f104a --- /dev/null +++ b/types/ember-data__store/tslint.json @@ -0,0 +1,21 @@ +{ + "extends": "dtslint/dt.json", + // Copied without modification from config for ember-data. + "rules": { + "strict-export-declare-modifiers": false, + "jsdoc-format": false, + "no-misused-new": false, + // not sure what this means + "no-single-declare-module": false, + "object-literal-key-quotes": false, + "only-arrow-functions": false, + "no-empty-interface": false, + "prefer-const": false, + "no-unnecessary-generics": false, + "no-declare-current-package": false, + "no-self-import": false, + "no-return-await": false, // used in tests + // @ember-data packages do not yet have ES module exports + "npm-naming": false + } +}