diff --git a/config/list.ts b/config/list.ts index e92cb77..fe7051a 100644 --- a/config/list.ts +++ b/config/list.ts @@ -1,9 +1,10 @@ import { ConfigSpec, Tag, UniqueBy, ValueSpecList } from "../types.ts"; -import { BuilderExtract, IBuilder } from "./builder.ts"; +import { IBuilder } from "./builder.ts"; import { Config } from "./config.ts"; import { Default, NullableDefault, NumberSpec, StringSpec } from "./value.ts"; import { Description } from "./value.ts"; import * as T from "../types.ts"; +import { Variants } from "./variants.ts"; export class List> extends IBuilder { // deno-lint-ignore ban-types @@ -89,22 +90,16 @@ export class List> extends IBuilder { [key: string]: string; }; }; - variants: Variants; + variants: Variants; "display-as": null | string | undefined; "unique-by": null | UniqueBy | undefined; }; }, - Variants extends { [key: string]: Config }, - B extends ConfigSpec + B extends { [key: string]: ConfigSpec } >(a: A) { const { spec: previousSpec, ...rest } = a; const { variants: previousVariants, ...restSpec } = previousSpec; - // deno-lint-ignore no-explicit-any - const variants: { [K in keyof Variants]: BuilderExtract } = {} as any; - for (const key in previousVariants) { - // deno-lint-ignore no-explicit-any - variants[key] = previousVariants[key].build() as any; - } + const variants = previousVariants.build(); const spec = { ...restSpec, variants, diff --git a/config/index.ts b/config/mod.ts similarity index 77% rename from config/index.ts rename to config/mod.ts index 1e9cba0..a16bb38 100644 --- a/config/index.ts +++ b/config/mod.ts @@ -2,3 +2,4 @@ export { Config } from "./config.ts"; export { List } from "./list.ts"; export { Pointer } from "./pointer.ts"; export { Value } from "./value.ts"; +export { Variants } from "./variants.ts"; diff --git a/config/value.ts b/config/value.ts index 50ca45a..0f53079 100644 --- a/config/value.ts +++ b/config/value.ts @@ -4,6 +4,7 @@ import { BuilderExtract, IBuilder } from "./builder.ts"; import { Config } from "./config.ts"; import { List } from "./list.ts"; import { Pointer } from "./pointer.ts"; +import { Variants } from "./variants.ts"; export type DefaultString = | string @@ -108,22 +109,14 @@ export class Value extends IBuilder { [key: string]: string; }; }; - variants: Variants; + variants: Variants; "display-as": string | null; "unique-by": _UniqueBy | null; }, - Variants extends { - [key: string]: Config; - }, - B extends ConfigSpec + B extends { [key: string]: ConfigSpec } >(a: A) { const { variants: previousVariants, ...rest } = a; - // deno-lint-ignore no-explicit-any - const variants: { [K in keyof Variants]: BuilderExtract } = {} as any; - for (const key in previousVariants) { - // deno-lint-ignore no-explicit-any - variants[key] = previousVariants[key].build() as any; - } + const variants = previousVariants.build(); return new Value({ type: "union" as const, ...rest, diff --git a/config/variants.ts b/config/variants.ts new file mode 100644 index 0000000..8d402c9 --- /dev/null +++ b/config/variants.ts @@ -0,0 +1,33 @@ +import { ConfigSpec } from "../types.ts"; +import { BuilderExtract, IBuilder } from "./builder.ts"; +import { Config } from "./mod.ts"; + +export class Variants extends IBuilder { + static of< + A extends { + [key: string]: Config; + } + >(a: A) { + // deno-lint-ignore no-explicit-any + const variants: { [K in keyof A]: BuilderExtract } = {} as any; + for (const key in a) { + // deno-lint-ignore no-explicit-any + variants[key] = a[key].build() as any; + } + return new Variants(variants); + } + + static empty() { + return Variants.of({}); + } + static withVariannt(key: K, value: Config) { + return Variants.empty().withVariant(key, value); + } + + withVariant(key: K, value: Config) { + return new Variants({ + ...this.a, + [key]: value.build(), + } as A & { [key in K]: B }); + } +} diff --git a/mod.ts b/mod.ts index c146c6f..4d6be02 100644 --- a/mod.ts +++ b/mod.ts @@ -4,4 +4,6 @@ export * as compat from "./compat/mod.ts"; export * as migrations from "./migrations.ts"; export * as healthUtil from "./healthUtil.ts"; export * as util from "./util.ts"; +export * as C from "./config/mod.ts"; +export * as config from "./config/mod.ts"; export { Backups } from "./backups.ts";