From 90cfd257aab5c71cbc886f3a093a0ae52a47c980 Mon Sep 17 00:00:00 2001 From: Julien Oculi Date: Tue, 16 Jul 2024 15:01:16 +0200 Subject: [PATCH] refactor: :rotating_light: fix deno lint rule `no-slow-types` --- src/db/mod.ts | 33 +++++++++++++++++++++++++++------ src/models/mod.ts | 1 - src/models/src/credential.ts | 4 ++-- src/models/src/group.ts | 11 +++++++++-- src/models/src/machine.ts | 10 ++++++++-- src/models/src/resource.ts | 26 +++++++++++++++++++++++++- src/models/src/service.ts | 10 ++++++++-- src/models/src/user.ts | 13 +++++++++++-- 8 files changed, 90 insertions(+), 18 deletions(-) diff --git a/src/db/mod.ts b/src/db/mod.ts index ca1171b..3ef5d27 100644 --- a/src/db/mod.ts +++ b/src/db/mod.ts @@ -33,7 +33,7 @@ export class Db { } } - get resource() { + get resource(): ResourceAccessors { return { credential: this.#resourceStorage>( 'credential', @@ -49,10 +49,9 @@ export class Db { #resourceStorage( type: ResourceType, Builder: ResourceBuilder, - ) { + ): ResourceStorage { return { - get: (resource: Pick) => - this.#get(type, Builder, resource), + get: (resource: Pick) => this.#get(type, Builder, resource), set: (resources: T[]) => this.#set(type, resources), delete: (resources: Pick[]) => this.#delete(type, resources), @@ -132,8 +131,8 @@ export class Db { } } -type ResourceType = T extends - Credential ? 'credential' +type ResourceType = T extends Credential + ? 'credential' : T extends Group ? 'group' : T extends Machine ? 'machine' : T extends Service ? 'service' @@ -149,3 +148,25 @@ type ResourceBuilder = T extends : never type ResourceJson = ReturnType + +type ResourceStorage = { + get: (resource: Pick) => Promise + set: (resources: T[]) => Promise + delete: ( + resources: Pick[], + ) => Promise + list: ( + filter?: (resource: T) => boolean | Promise, + ) => AsyncGenerator + listRef: ( + filter?: (resource: T) => boolean | Promise, + ) => Promise[]> +} + +type ResourceAccessors = { + credential: ResourceStorage> + group: ResourceStorage + machine: ResourceStorage + service: ResourceStorage + user: ResourceStorage +} diff --git a/src/models/mod.ts b/src/models/mod.ts index 5d39305..56c758b 100644 --- a/src/models/mod.ts +++ b/src/models/mod.ts @@ -5,4 +5,3 @@ export type { Resource } from './src/resource.ts' export { Service } from './src/service.ts' export { User } from './src/user.ts' export { Ref, type RefResolver, type RefString } from './utils/ref.ts' - diff --git a/src/models/src/credential.ts b/src/models/src/credential.ts index 69b9cec..1a39f17 100644 --- a/src/models/src/credential.ts +++ b/src/models/src/credential.ts @@ -1,7 +1,7 @@ import type { Base64String, ToJson, UUID } from '../../../types.ts' import { Avatar } from '../utils/avatar.ts' import type { Ref } from '../utils/ref.ts' -import { Resource } from './resource.ts' +import { Resource, type ResourceJson } from './resource.ts' export class Credential extends Resource { static fromJSON( @@ -89,7 +89,7 @@ export class Credential extends Resource { }) } - toJSON() { + toJSON(): ResourceJson, 'category' | 'store'> { return { ...super.toJSON(), type: this.type, diff --git a/src/models/src/group.ts b/src/models/src/group.ts index b281574..c5edcbc 100644 --- a/src/models/src/group.ts +++ b/src/models/src/group.ts @@ -1,7 +1,11 @@ import type { Posix, ToJson, UUID } from '../../../types.ts' import { Avatar } from '../utils/avatar.ts' import { Ref } from '../utils/ref.ts' -import { Resource } from './resource.ts' +import { + Resource, + type ResourceJson, + type ResourceRefJson, +} from './resource.ts' export class Group extends Resource { static fromJSON( @@ -114,7 +118,10 @@ export class Group extends Resource { }) } - toJSON() { + toJSON(): + & ResourceJson + & { posix: Posix | null } + & ResourceRefJson { return { ...super.toJSON(), type: this.type, diff --git a/src/models/src/machine.ts b/src/models/src/machine.ts index a1fee0e..237f45a 100644 --- a/src/models/src/machine.ts +++ b/src/models/src/machine.ts @@ -2,7 +2,11 @@ import type { ToJson, UrlString } from '../../../types.ts' import { Avatar } from '../utils/avatar.ts' import { Ref } from '../utils/ref.ts' import type { Group } from './group.ts' -import { Resource } from './resource.ts' +import { + Resource, + type ResourceJson, + type ResourceRefJson, +} from './resource.ts' export class Machine extends Resource { static fromJSON( @@ -108,7 +112,9 @@ export class Machine extends Resource { }) } - toJSON() { + toJSON(): + & ResourceJson + & ResourceRefJson { return { ...super.toJSON(), type: this.type, diff --git a/src/models/src/resource.ts b/src/models/src/resource.ts index 9885795..bb14543 100644 --- a/src/models/src/resource.ts +++ b/src/models/src/resource.ts @@ -95,7 +95,10 @@ export class Resource { }) } - toJSON() { + toJSON(): ResourceJson< + Resource, + 'type' | 'uuid' | 'name' | 'avatar' | 'createdAt' | 'updatedAt' + > { return { type: this.type, uuid: this.uuid, @@ -123,3 +126,24 @@ export interface Resource { createdAt: DateString updatedAt: DateString } + +export type ResourceJson = Readonly< + Pick< + T, + | 'type' + | 'uuid' + | 'name' + | 'avatar' + | 'createdAt' + | 'updatedAt' + | K + > +> + +export type ResourceRefJson< + T extends Resource, + Ref extends Resource, + K extends keyof T, +> = { + [k in K]: Readonly['toString']>[]> +} diff --git a/src/models/src/service.ts b/src/models/src/service.ts index 0c7136a..88e3600 100644 --- a/src/models/src/service.ts +++ b/src/models/src/service.ts @@ -2,7 +2,11 @@ import type { ToJson, UrlString } from '../../../types.ts' import { Avatar } from '../utils/avatar.ts' import { Ref } from '../utils/ref.ts' import type { Group } from './group.ts' -import { Resource } from './resource.ts' +import { + Resource, + type ResourceJson, + type ResourceRefJson, +} from './resource.ts' export class Service extends Resource { static fromJSON( @@ -126,7 +130,9 @@ export class Service extends Resource { }) } - toJSON() { + toJSON(): + & ResourceJson + & ResourceRefJson { return { ...super.toJSON(), type: this.type, diff --git a/src/models/src/user.ts b/src/models/src/user.ts index e3adbcb..7b56b7c 100644 --- a/src/models/src/user.ts +++ b/src/models/src/user.ts @@ -4,7 +4,11 @@ import { Avatar } from '../utils/avatar.ts' import { Ref } from '../utils/ref.ts' import type { Credential, CredentialCategory } from './credential.ts' import type { Group } from './group.ts' -import { Resource } from './resource.ts' +import { + Resource, + type ResourceJson, + type ResourceRefJson, +} from './resource.ts' export class User extends Resource { static fromJSON(json: ToJson): User { @@ -190,9 +194,14 @@ export class User extends Resource { }) } - toJSON() { + toJSON(): + & ResourceJson + & { posix: Posix | null } + & ResourceRefJson + & ResourceRefJson, 'credentials'> { return { ...super.toJSON(), + type: this.type, lastname: this.lastname, firstname: this.firstname, login: this.login,