Adjusted the typing of the ModelRepository and related interfaces to better distinguish between parent & child models

This commit is contained in:
Christopher Allford 2020-10-01 18:06:34 -07:00
parent 8f5ff436a2
commit 54b876fc75
4 changed files with 4969 additions and 4953 deletions

View File

@ -4636,9 +4636,9 @@
} }
}, },
"typescript": { "typescript": {
"version": "3.8.3", "version": "3.9.7",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz",
"integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==",
"dev": true "dev": true
}, },
"union-value": { "union-value": {

View File

@ -46,7 +46,7 @@
"jest-mock-extended": "^1.0.10", "jest-mock-extended": "^1.0.10",
"moxios": "0.4.0", "moxios": "0.4.0",
"ts-jest": "25.5.0", "ts-jest": "25.5.0",
"typescript": "3.8.3" "typescript": "3.9.7"
}, },
"publishConfig": { "publishConfig": {
"access": "public" "access": "public"

View File

@ -212,7 +212,7 @@ describe( 'ModelRepository', () => {
it( 'should delete', async () => { it( 'should delete', async () => {
const callback = jest.fn().mockResolvedValue( true ); const callback = jest.fn().mockResolvedValue( true );
const repository: DeletesModels = new ModelRepository< DummyModelParams >( const repository: DeletesModels< DummyModelParams > = new ModelRepository< DummyModelParams >(
null, null,
null, null,
null, null,
@ -241,7 +241,7 @@ describe( 'ModelRepository', () => {
} ); } );
it( 'should throw error on delete without callback', () => { it( 'should throw error on delete without callback', () => {
const repository: DeletesModels = new ModelRepository< DummyModelParams >( const repository: DeletesModels< DummyModelParams > = new ModelRepository< DummyModelParams >(
null, null,
null, null,
null, null,

View File

@ -158,7 +158,7 @@ export type DeleteChildFn< T extends ModelRepositoryParams > = ( parent: ParentI
* @template L * @template L
*/ */
export interface ListsModels< T extends ModelRepositoryParams > { export interface ListsModels< T extends ModelRepositoryParams > {
list( params?: ListParams< T > ): Promise< ModelClass< T >[] >; list( params?: HasParent< T, never, ListParams< T > > ): Promise< ModelClass< T >[] >;
} }
/** /**
@ -171,7 +171,10 @@ export interface ListsModels< T extends ModelRepositoryParams > {
* @template L * @template L
*/ */
export interface ListsChildModels< T extends ModelRepositoryParams > { export interface ListsChildModels< T extends ModelRepositoryParams > {
list( parent: ParentID< T >, params?: ListParams< T > ): Promise< ModelClass< T >[] >; list(
parent: HasParent< T, ParentID< T >, never >,
params?: HasParent< T, ListParams< T >, never >,
): Promise< ModelClass< T >[] >;
} }
/** /**
@ -193,7 +196,7 @@ export interface CreatesModels< T extends ModelRepositoryParams > {
* @template {Model} T * @template {Model} T
*/ */
export interface ReadsModels< T extends ModelRepositoryParams > { export interface ReadsModels< T extends ModelRepositoryParams > {
read( id: ModelID ): Promise< ModelClass< T > >; read( id: HasParent< T, never, ModelID > ): Promise< ModelClass< T > >;
} }
/** /**
@ -205,7 +208,10 @@ export interface ReadsModels< T extends ModelRepositoryParams > {
* @template {ModelParentID} P * @template {ModelParentID} P
*/ */
export interface ReadsChildModels< T extends ModelRepositoryParams > { export interface ReadsChildModels< T extends ModelRepositoryParams > {
read( parent: ParentID< T >, childID: ModelID ): Promise< ModelClass< T > >; read(
parent: HasParent< T, ParentID< T >, never >,
childID: HasParent< T, ModelID, never >,
): Promise< ModelClass< T > >;
} }
/** /**
@ -216,7 +222,10 @@ export interface ReadsChildModels< T extends ModelRepositoryParams > {
* @template {Model} T * @template {Model} T
*/ */
export interface UpdatesModels< T extends ModelRepositoryParams > { export interface UpdatesModels< T extends ModelRepositoryParams > {
update( id: ModelID, properties: UpdateParams< T > ): Promise< ModelClass< T > >; update(
id: HasParent< T, never, ModelID >,
properties: HasParent< T, never, UpdateParams< T > >,
): Promise< ModelClass< T > >;
} }
/** /**
@ -228,7 +237,11 @@ export interface UpdatesModels< T extends ModelRepositoryParams > {
* @template {ModelParentID} P * @template {ModelParentID} P
*/ */
export interface UpdatesChildModels< T extends ModelRepositoryParams > { export interface UpdatesChildModels< T extends ModelRepositoryParams > {
update( parent: ParentID< T >, childID: ModelID, properties: UpdateParams< T > ): Promise< ModelClass< T > >; update(
parent: HasParent< T, ParentID< T >, never >,
childID: HasParent< T, ModelID, never >,
properties: HasParent< T, UpdateParams< T >, never >,
): Promise< ModelClass< T > >;
} }
/** /**
@ -237,8 +250,8 @@ export interface UpdatesChildModels< T extends ModelRepositoryParams > {
* @typedef DeletesModels * @typedef DeletesModels
* @property {DeleteFn} delete Deletes a model using the repository. * @property {DeleteFn} delete Deletes a model using the repository.
*/ */
export interface DeletesModels { export interface DeletesModels< T extends ModelRepositoryParams > {
delete( id: ModelID ): Promise< boolean >; delete( id: HasParent< T, never, ModelID > ): Promise< boolean >;
} }
/** /**
@ -249,7 +262,10 @@ export interface DeletesModels {
* @template {ModelParentID} P * @template {ModelParentID} P
*/ */
export interface DeletesChildModels< T extends ModelRepositoryParams > { export interface DeletesChildModels< T extends ModelRepositoryParams > {
delete( parent: ParentID< T >, childID: ModelID ): Promise< boolean >; delete(
parent: HasParent< T, ParentID< T >, never >,
childID: HasParent< T, ModelID, never >,
): Promise< boolean >;
} }
/** /**
@ -268,7 +284,7 @@ export class ModelRepository< T extends ModelRepositoryParams > implements
ReadsChildModels< T >, ReadsChildModels< T >,
UpdatesModels< T >, UpdatesModels< T >,
UpdatesChildModels< T >, UpdatesChildModels< T >,
DeletesModels, DeletesModels< T >,
DeletesChildModels< T > { DeletesChildModels< T > {
/** /**
* The hook used to list models. * The hook used to list models.
@ -341,8 +357,8 @@ export class ModelRepository< T extends ModelRepositoryParams > implements
* @return {Promise.<Array.<T>>} Resolves to the listed models. * @return {Promise.<Array.<T>>} Resolves to the listed models.
*/ */
public list( public list(
paramsOrParent?: ListParams< T > | ParentID< T >, paramsOrParent?: HasParent< T, ParentID< T >, ListParams< T > >,
params?: ListParams< T >, params?: HasParent< T, ListParams< T >, never >,
): Promise< ModelClass< T >[] > { ): Promise< ModelClass< T >[] > {
if ( ! this.listHook ) { if ( ! this.listHook ) {
throw new Error( 'The \'list\' operation is not supported on this model.' ); throw new Error( 'The \'list\' operation is not supported on this model.' );
@ -382,8 +398,8 @@ export class ModelRepository< T extends ModelRepositoryParams > implements
* @return {Promise.<T>} Resolves to the loaded model. * @return {Promise.<T>} Resolves to the loaded model.
*/ */
public read( public read(
idOrParent: ModelID | ParentID< T >, idOrParent: HasParent< T, ParentID< T >, ModelID >,
childID?: ModelID, childID?: HasParent< T, ModelID, never >,
): Promise< ModelClass< T > > { ): Promise< ModelClass< T > > {
if ( ! this.readHook ) { if ( ! this.readHook ) {
throw new Error( 'The \'read\' operation is not supported on this model.' ); throw new Error( 'The \'read\' operation is not supported on this model.' );
@ -410,9 +426,9 @@ export class ModelRepository< T extends ModelRepositoryParams > implements
* @return {Promise.<T>} Resolves to the updated model. * @return {Promise.<T>} Resolves to the updated model.
*/ */
public update( public update(
idOrParent: ModelID | ParentID< T >, idOrParent: HasParent< T, ParentID< T >, ModelID >,
propertiesOrChildID: UpdateParams< T > | ModelID, propertiesOrChildID: HasParent< T, ModelID, UpdateParams< T > >,
properties?: UpdateParams< T >, properties?: HasParent< T, UpdateParams< T >, never >,
): Promise< ModelClass< T > > { ): Promise< ModelClass< T > > {
if ( ! this.updateHook ) { if ( ! this.updateHook ) {
throw new Error( 'The \'update\' operation is not supported on this model.' ); throw new Error( 'The \'update\' operation is not supported on this model.' );
@ -440,8 +456,8 @@ export class ModelRepository< T extends ModelRepositoryParams > implements
* @return {Promise.<T>} Resolves to the loaded model. * @return {Promise.<T>} Resolves to the loaded model.
*/ */
public delete( public delete(
idOrParent: ModelID | ParentID< T >, idOrParent: HasParent< T, ParentID< T >, ModelID >,
childID?: ModelID, childID?: HasParent< T, ModelID, never >,
): Promise< boolean > { ): Promise< boolean > {
if ( ! this.deleteHook ) { if ( ! this.deleteHook ) {
throw new Error( 'The \'delete\' operation is not supported on this model.' ); throw new Error( 'The \'delete\' operation is not supported on this model.' );