diff --git a/packages/hydrooj/src/settings.ts b/packages/hydrooj/src/settings.ts index 71a8cf546..f333e1b51 100644 --- a/packages/hydrooj/src/settings.ts +++ b/packages/hydrooj/src/settings.ts @@ -2,7 +2,7 @@ import yaml from 'js-yaml'; import { nanoid } from 'nanoid'; import Schema from 'schemastery'; import { Logger } from './logger'; -import { NestKeys } from './typeutils'; +import { Flatten } from './typeutils'; const defaultPath = process.env.CI ? '/tmp/file' : process.env.DEFAULT_STORE_PATH || '/data/file/hydro'; @@ -80,7 +80,7 @@ export async function setConfig(key: string, value: any) { export function requestConfig(s: Schema): { config: ReturnType>, - setConfig: (key: NestKeys>>, value: any) => Promise, + setConfig: (key: keyof Flatten>> & string, value: any) => Promise, } { SystemSettings.push(s); let curValue = s(systemConfig); diff --git a/packages/hydrooj/src/typeutils.ts b/packages/hydrooj/src/typeutils.ts index 958930630..383787525 100644 --- a/packages/hydrooj/src/typeutils.ts +++ b/packages/hydrooj/src/typeutils.ts @@ -1,12 +1,21 @@ +/* eslint-disable @typescript-eslint/indent */ +export type Atomic = number | string | boolean | bigint | symbol | Date | any[]; +export type Values = S[keyof S]; +export type Intersect = (U extends any ? (arg: U) => void : never) extends ((arg: infer I) => void) ? I : never; export type NumberKeys = { [K in keyof O]: number extends O[K] ? K : never }[keyof O]; export type ArrayKeys = { [K in keyof O]: P[] extends O[K] ? K : never }[keyof O]; -export type NestKeys = O extends object ? O extends S ? never : { - [K in keyof O]: (O[K] extends T ? K : never) | `${K & string}.${NestKeys}` -}[keyof O] & string : never; +type FlatWrap = { [K in P]?: S } | (S extends T ? never // rule out atomic / recursive types + : S extends any[] ? never // rule out array types + : string extends keyof S ? never // rule out dict / infinite types + : FlatMap); +type FlatMap = Values<{ + [K in keyof S & string as `${P}${K}`]: FlatWrap +}>; +export type Flatten = Intersect>; export type Value = { [K in keyof O]: V };