mirror of
https://github.com/Start9Labs/start-sdk.git
synced 2026-03-26 02:11:56 +00:00
feat: Add a builder for variants
This commit is contained in:
@@ -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<A extends Tag<"list", ValueSpecList>> extends IBuilder<A> {
|
||||
// deno-lint-ignore ban-types
|
||||
@@ -89,22 +90,16 @@ export class List<A extends Tag<"list", ValueSpecList>> extends IBuilder<A> {
|
||||
[key: string]: string;
|
||||
};
|
||||
};
|
||||
variants: Variants;
|
||||
variants: Variants<B>;
|
||||
"display-as": null | string | undefined;
|
||||
"unique-by": null | UniqueBy | undefined;
|
||||
};
|
||||
},
|
||||
Variants extends { [key: string]: Config<ConfigSpec> },
|
||||
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<Variants[K]> } = {} 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,
|
||||
|
||||
@@ -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";
|
||||
@@ -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<A extends ValueSpecAny> extends IBuilder<A> {
|
||||
[key: string]: string;
|
||||
};
|
||||
};
|
||||
variants: Variants;
|
||||
variants: Variants<B>;
|
||||
"display-as": string | null;
|
||||
"unique-by": _UniqueBy | null;
|
||||
},
|
||||
Variants extends {
|
||||
[key: string]: Config<B>;
|
||||
},
|
||||
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<Variants[K]> } = {} 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,
|
||||
|
||||
33
config/variants.ts
Normal file
33
config/variants.ts
Normal file
@@ -0,0 +1,33 @@
|
||||
import { ConfigSpec } from "../types.ts";
|
||||
import { BuilderExtract, IBuilder } from "./builder.ts";
|
||||
import { Config } from "./mod.ts";
|
||||
|
||||
export class Variants<A extends { [key: string]: ConfigSpec }> extends IBuilder<A> {
|
||||
static of<
|
||||
A extends {
|
||||
[key: string]: Config<ConfigSpec>;
|
||||
}
|
||||
>(a: A) {
|
||||
// deno-lint-ignore no-explicit-any
|
||||
const variants: { [K in keyof A]: BuilderExtract<A[K]> } = {} 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<K extends string, B extends ConfigSpec>(key: K, value: Config<B>) {
|
||||
return Variants.empty().withVariant(key, value);
|
||||
}
|
||||
|
||||
withVariant<K extends string, B extends ConfigSpec>(key: K, value: Config<B>) {
|
||||
return new Variants({
|
||||
...this.a,
|
||||
[key]: value.build(),
|
||||
} as A & { [key in K]: B });
|
||||
}
|
||||
}
|
||||
2
mod.ts
2
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";
|
||||
|
||||
Reference in New Issue
Block a user