import { AnyParser } from "ts-matches" import { SDKManifest } from "./manifest/ManifestTypes" import { RequiredDefault, Value } from "./config/builder/value" import { Config, ExtractConfigType, LazyBuild } from "./config/builder/config" import { DefaultString, Pattern, RandomString, ValueSpecDatetime, ValueSpecText, } from "./config/configTypes" import { Variants } from "./config/builder/variants" import { createAction } from "./actions/createAction" import { ActionMetaData, Effects, ActionResult, Metadata, BackupOptions, } from "./types" import { Utils } from "./util" import { AutoConfig, AutoConfigFrom } from "./autoconfig/AutoConfig" import { BackupSet, Backups } from "./backup/Backups" import { smtpConfig } from "./config/configConstants" // prettier-ignore type AnyNeverCond = T extends [] ? Else : T extends [never, ...Array] ? Then : T extends [any, ...infer U] ? AnyNeverCond : never class StartSDK { private constructor() {} private anyOf( a: A, ): AnyNeverCond<[Manifest, Store], "Build not ready", A> { return a as any } static of() { return new StartSDK() } withManifest() { return new StartSDK() } withStore>() { return new StartSDK() } build() { return this.anyOf({ AutoConfig: ( configs: AutoConfigFrom, path: keyof AutoConfigFrom, ) => new AutoConfig(configs, path), Backups: { volumes: (...volumeNames: Array) => Backups.volumes(...volumeNames), addSets: ( ...options: BackupSet[] ) => Backups.addSets(...options), withOptions: (options?: Partial) => Backups.with_options(options), }, Config: { of: < Spec extends Record | Value>, >( spec: Spec, ) => Config.of(spec), }, configConstants: { smtpConfig }, createAction: < Store, ConfigType extends | Record | Config | Config, Type extends Record = ExtractConfigType, >( metaData: Omit & { input: Config | Config }, fn: (options: { effects: Effects utils: Utils input: Type }) => Promise, ) => createAction(metaData, fn), // TODO Daemons // TODO HealthCheck // TODO healthCheckFns // TODO List // TODO mainNetwork // TODO Migration // TODO setupActions // TODO setupAutoConfig // TODO setupBackup // TODO setupInit // TODO setupInstall // TODO setupMain // TODO setupManifest // TODO setupMigrations // TODO setupUninstall // TODO trigger changeOnFirstSuccess, cooldown, default Value: { toggle: Value.toggle, text: Value.text, textarea: Value.textarea, number: Value.number, color: Value.color, datetime: Value.datetime, select: Value.select, multiselect: Value.multiselect, object: Value.object, union: Value.union, list: Value.list, dynamicToggle: ( a: LazyBuild< Store, { name: string description?: string | null warning?: string | null default: boolean disabled?: false | string } >, ) => Value.dynamicToggle(a), dynamicText: ( getA: LazyBuild< Store, { name: string description?: string | null warning?: string | null required: RequiredDefault /** Default = false */ masked?: boolean placeholder?: string | null minLength?: number | null maxLength?: number | null patterns?: Pattern[] /** Default = 'text' */ inputmode?: ValueSpecText["inputmode"] generate?: null | RandomString } >, ) => Value.dynamicText(getA), dynamicTextarea: ( getA: LazyBuild< Store, { name: string description?: string | null warning?: string | null required: boolean minLength?: number | null maxLength?: number | null placeholder?: string | null disabled?: false | string generate?: null | RandomString } >, ) => Value.dynamicTextarea(getA), dynamicNumber: ( getA: LazyBuild< Store, { name: string description?: string | null warning?: string | null required: RequiredDefault min?: number | null max?: number | null /** Default = '1' */ step?: string | null integer: boolean units?: string | null placeholder?: string | null disabled?: false | string } >, ) => Value.dynamicNumber(getA), dynamicColor: ( getA: LazyBuild< Store, { name: string description?: string | null warning?: string | null required: RequiredDefault disabled?: false | string } >, ) => Value.dynamicColor(getA), dynamicDatetime: ( getA: LazyBuild< Store, { name: string description?: string | null warning?: string | null required: RequiredDefault /** Default = 'datetime-local' */ inputmode?: ValueSpecDatetime["inputmode"] min?: string | null max?: string | null step?: string | null disabled?: false | string } >, ) => Value.dynamicDatetime(getA), dynamicSelect: ( getA: LazyBuild< Store, { name: string description?: string | null warning?: string | null required: RequiredDefault values: Record disabled?: false | string } >, ) => Value.dynamicSelect(getA), dynamicMultiselect: ( getA: LazyBuild< Store, { name: string description?: string | null warning?: string | null default: string[] values: Record minLength?: number | null maxLength?: number | null disabled?: false | string } >, ) => Value.dynamicMultiselect(getA), filteredUnion: < Required extends RequiredDefault, Type extends Record, >( getDisabledFn: LazyBuild, a: { name: string description?: string | null warning?: string | null required: Required }, aVariants: Variants | Variants, ) => Value.filteredUnion( getDisabledFn, a, aVariants, ), }, // TODO Variants }) } } // TODO Test output.ts with sdk // const test = StartSDK.of() // .withManifest() // .withStore<{}>() // .Value.dynamicToggle({} as any, {} as any)