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";