// // Copyright 2021 DXOS.org // import { type Config as ConfigProto } from '@dxos/protocols/proto/dxos/config'; export const FILE_DEFAULTS = 'defaults.yml'; export const FILE_ENVS = 'envs-map.yml'; export const FILE_DYNAMICS = 'config.yml'; type DotPrefix = T extends '' ? '' : `.${T}`; /** * Returns all dot-separated nested keys for an object. * * Read more: https://stackoverflow.com/a/68404823. */ type DotNestedKeys = ( T extends object ? { [K in Exclude]: `${K}${DotPrefix>}`; }[Exclude] : '' ) extends infer D ? Extract : never; /** * Parse a dot separated nested key into an array of keys. * * Example: 'services.signal.server' -> ['services', 'signal', 'server']. */ export type ParseKey = K extends `${infer L}.${infer Rest}` ? [L, ...ParseKey] : [K]; /** * Array of types that can act as an object key. */ type Keys = (keyof any)[]; /** * Retrieves a property type in a series of nested objects. * * Read more: https://stackoverflow.com/a/61648690. */ export type DeepIndex = KS extends [infer F, ...infer R] ? F extends keyof Exclude ? R extends Keys ? DeepIndex[F], R, Fail> : Fail : Fail : T; /** * Any nested dot separated key that can be in config. */ // TODO(egorgripasov): Clean once old config deprecated. export type ConfigKey = DotNestedKeys;