perf: 🏷️ fix most of slow types using deno lint

This commit is contained in:
Julien Oculi 2024-06-19 17:10:00 +02:00
parent 94632dbc07
commit ae7b911b16
8 changed files with 69 additions and 69 deletions

View file

@ -1,6 +1,6 @@
{
"name": "@cohabit/ressources",
"version": "0.1.1",
"version": "0.1.2",
"exports": {
".": "./mod.ts",
"./models": "./src/models/mod.ts"

View file

@ -14,7 +14,7 @@ import type { CredentialCategory } from '../models/src/credential.ts'
export class Db {
#kv: Deno.Kv
static async init(path?: string) {
static async init(path?: string): Promise<Db> {
const kv = await Deno.openKv(path ?? Deno.env.get('DB_PATH'))
return new Db(kv)
}
@ -23,11 +23,11 @@ export class Db {
this.#kv = kv
}
get storage() {
get storage(): Deno.Kv {
return this.#kv
}
get prefix() {
get prefix(): { ressource: 'ressource' } {
return {
ressource: 'ressource',
}

View file

@ -65,11 +65,11 @@ export class Credential<T extends CredentialCategory> extends Ressource {
return 'credential'
}
get category() {
get category(): T {
return this.#category
}
get store() {
get store(): Readonly<CredentialStore<T>['store']> {
return this.#store
}

View file

@ -50,13 +50,7 @@ export class Group extends Ressource {
}
#posix?: Posix
#permissions: Readonly<{
[serviceOrMachine: UUID]: {
read: boolean
write: boolean
execute: boolean
}
}>
#permissions: Readonly<GroupPermissions>
#groups: readonly Ref<Group>[]
private constructor(
@ -93,15 +87,15 @@ export class Group extends Ressource {
return 'group'
}
get posix() {
get posix(): Posix | undefined {
return this.#posix
}
get permissions() {
get permissions(): Readonly<GroupPermissions> {
return this.#permissions
}
get groups() {
get groups(): readonly Ref<Group>[] {
return this.#groups
}
@ -134,11 +128,13 @@ export interface Group extends Ressource {
type: 'group'
posix: Posix | undefined
groups: readonly Ref<Group>[]
permissions: Readonly<{
[serviceOrMachine: UUID]: {
read: boolean
write: boolean
execute: boolean
}
}>
permissions: Readonly<GroupPermissions>
}
export type GroupPermissions = {
[serviceOrMachine: UUID]: {
read: boolean
write: boolean
execute: boolean
}
}

View file

@ -53,13 +53,7 @@ export class Machine extends Ressource {
#tags: readonly string[]
#url: UrlString
#status:
| 'ready'
| 'busy'
| 'unavailable'
| 'discontinued'
| 'error'
| 'unknown'
#status: MachineStatus
#groups: readonly Ref<Group>[]
private constructor(
@ -83,16 +77,16 @@ export class Machine extends Ressource {
get type(): 'machine' {
return 'machine'
}
get tags() {
get tags(): readonly string[] {
return this.#tags
}
get url() {
get url(): UrlString {
return this.#url
}
get status() {
get status(): MachineStatus {
return this.#status
}
get groups() {
get groups(): readonly Ref<Group>[] {
return this.#groups
}
@ -128,12 +122,14 @@ export interface Machine extends Ressource {
type: 'machine'
tags: readonly string[]
url: UrlString
status:
| 'ready'
| 'busy'
| 'unavailable'
| 'discontinued'
| 'error'
| 'unknown'
status: MachineStatus
groups: readonly Ref<Group>[]
}
export type MachineStatus =
| 'ready'
| 'busy'
| 'unavailable'
| 'discontinued'
| 'error'
| 'unknown'

View file

@ -52,7 +52,7 @@ export class Service extends Ressource {
return this.create({ name, avatar, tags, url, category, groups })
}
#category: 'web' | 'fs' | 'git'
#category: ServiceCategory
#url: UrlString
#groups: readonly Ref<Group>[]
#tags: readonly string[]
@ -92,19 +92,19 @@ export class Service extends Ressource {
return 'service'
}
get category() {
get category(): ServiceCategory {
return this.#category
}
get tags() {
get tags(): readonly string[] {
return this.#tags
}
get url() {
get url(): UrlString {
return this.#url
}
get groups() {
get groups(): readonly Ref<Group>[] {
return this.#groups
}
@ -138,8 +138,10 @@ export class Service extends Ressource {
export interface Service extends Ressource {
type: 'service'
category: 'web' | 'fs' | 'git'
category: ServiceCategory
tags: readonly string[]
url: UrlString
groups: readonly Ref<Group>[]
}
export type ServiceCategory = 'web' | 'fs' | 'git'

View file

@ -150,25 +150,25 @@ export class User extends Ressource {
get type(): 'user' {
return 'user'
}
get firstname() {
get firstname(): string {
return this.#firstname
}
get lastname() {
get lastname(): string {
return this.#lastname
}
get login() {
get login(): Login {
return this.#login
}
get mail() {
get mail(): MailAddress {
return this.#mail
}
get groups() {
get groups(): readonly Ref<Group>[] {
return this.#groups
}
get posix() {
get posix(): Posix | undefined {
return this.#posix
}
get credentials() {
get credentials(): readonly Ref<Credential<CredentialCategory>>[] {
return this.#credentials
}

View file

@ -22,7 +22,9 @@ export class Ref<T extends Ressource> extends String {
return `@ref/${type}#${uuid}` as const
}
static parse<T extends Ressource>(string: RefString<T>) {
static parse<T extends Ressource>(
string: RefString<T>,
): { type: T['type']; uuid: UUID } {
const [_, value] = string.split('/')
const [type, uuid] = value.split('#') as [T['type'], UUID]
@ -33,11 +35,13 @@ export class Ref<T extends Ressource> extends String {
return new Ref<T>(ressource)
}
static fromString<T extends Ressource>(string: RefString<T>) {
static fromString<T extends Ressource>(string: RefString<T>): Ref<T> {
return new Ref<T>(Ref.parse(string))
}
static dbResolver(db: Db) {
static dbResolver(
db: Db,
): <T extends Ressource>(ref: RefString<T>) => Promise<T> {
return <T extends Ressource>(ref: RefString<T>): Promise<T> => {
const { type, uuid } = Ref.parse(ref)
//@ts-expect-error force type casting to fix
@ -45,27 +49,29 @@ export class Ref<T extends Ressource> extends String {
}
}
static restResolver(endpoint: string | URL) {
return async <T extends Ressource>(ref: RefString<T>) => {
static restResolver(
endpoint: string | URL,
): <T extends Ressource>(ref: RefString<T>) => Promise<T> {
return async <T extends Ressource>(ref: RefString<T>): Promise<T> => {
const { type, uuid } = Ref.parse(ref)
const url = new URL(`${type}s/${uuid}`, endpoint)
const response = await fetch(url)
const json = await response.json()
if (type === 'user') {
return User.fromJSON(json)
return User.fromJSON(json) as unknown as T
}
if (type === 'machine') {
return Machine.fromJSON(json)
return Machine.fromJSON(json) as unknown as T
}
if (type === 'service') {
return Service.fromJSON(json)
return Service.fromJSON(json) as unknown as T
}
if (type === 'group') {
return Group.fromJSON(json)
return Group.fromJSON(json) as unknown as T
}
if (type === 'credential') {
return Credential.fromJSON(json)
return Credential.fromJSON(json) as unknown as T
}
throw new TypeError(`unknown ref type "${type}"`)
@ -81,23 +87,23 @@ export class Ref<T extends Ressource> extends String {
#type: T['type']
#uuid: UUID
get type() {
get type(): T['type'] {
return this.#type
}
get uuid() {
get uuid(): UUID {
return this.#uuid
}
ref(resolver: RefResolver<T>) {
ref(resolver: RefResolver<T>): T | Promise<T> {
return resolver(this.toString())
}
toString() {
toString(): `@ref/${T['type']}#${UUID}` {
return Ref.#toString<T>({ uuid: this.uuid, type: this.type })
}
toJSON() {
toJSON(): `@ref/${T['type']}#${UUID}` {
return this.toString()
}
}