diff --git a/lib/StartSdk.ts b/lib/StartSdk.ts index b1338dc..d2413b3 100644 --- a/lib/StartSdk.ts +++ b/lib/StartSdk.ts @@ -94,7 +94,7 @@ export class StartSdk { }) => Promise, ) => { const { input, ...rest } = metaData - return createAction(rest, fn, input) + return createAction(rest, fn, input) }, createDynamicAction: < ConfigType extends @@ -114,7 +114,11 @@ export class StartSdk { }) => Promise, input: Config | Config, ) => { - return createAction(metaData, fn, input) + return createAction( + metaData, + fn, + input, + ) }, HealthCheck: { @@ -127,7 +131,7 @@ export class StartSdk { }, patterns, setupActions: (...createdActions: CreatedAction[]) => - setupActions(...createdActions), + setupActions(...createdActions), setupBackups: (...args: SetupBackupsParams) => setupBackups(...args), setupConfig: < @@ -168,26 +172,26 @@ export class StartSdk { setupExports: (fn: SetupExports) => fn, setupDependencyMounts, setupInit: ( - migrations: Migrations, - install: Install, - uninstall: Uninstall, - setInterfaces: SetInterfaces, + migrations: Migrations, + install: Install, + uninstall: Uninstall, + setInterfaces: SetInterfaces, setupExports: SetupExports, ) => - setupInit( + setupInit( migrations, install, uninstall, setInterfaces, setupExports, ), - setupInstall: (fn: InstallFn) => Install.of(fn), + setupInstall: (fn: InstallFn) => Install.of(fn), setupInterfaces: < ConfigInput extends Record, Output extends InterfacesReceipt, >( config: Config, - fn: SetInterfaces, + fn: SetInterfaces, ) => setupInterfaces(config, fn), setupMain: ( fn: (o: { @@ -196,10 +200,17 @@ export class StartSdk { utils: Utils }) => Promise>, ) => setupMain(fn), - setupMigrations: >>( + setupMigrations: < + Migrations extends Array>, + >( ...migrations: EnsureUniqueId - ) => setupMigrations(this.manifest, ...migrations), - setupUninstall: (fn: UninstallFn) => setupUninstall(fn), + ) => + setupMigrations( + this.manifest, + ...migrations, + ), + setupUninstall: (fn: UninstallFn) => + setupUninstall(fn), trigger: { defaultTrigger, cooldownTrigger, @@ -331,7 +342,7 @@ export class StartSdk { effects: Effects utils: Utils }) => Promise - }) => Migration.of(options), + }) => Migration.of(options), }, Value: { toggle: Value.toggle, diff --git a/lib/actions/createAction.ts b/lib/actions/createAction.ts index 2cea0d4..d14b7ce 100644 --- a/lib/actions/createAction.ts +++ b/lib/actions/createAction.ts @@ -1,15 +1,17 @@ import { Config, ExtractConfigType } from "../config/builder/config" +import { SDKManifest } from "../manifest/ManifestTypes" import { ActionMetadata, ActionResult, Effects, ExportedAction } from "../types" import { createUtils } from "../util" import { Utils } from "../util/utils" -export type MaybeFn = +export type MaybeFn = | Value | ((options: { effects: Effects - utils: Utils + utils: Utils }) => Promise | Value) export class CreatedAction< + Manifest extends SDKManifest, Store, ConfigType extends | Record @@ -18,17 +20,22 @@ export class CreatedAction< Type extends Record = ExtractConfigType, > { private constructor( - public readonly myMetaData: MaybeFn>, + public readonly myMetaData: MaybeFn< + Manifest, + Store, + Omit + >, readonly fn: (options: { effects: Effects - utils: Utils + utils: Utils input: Type }) => Promise, readonly input: Config, + public validator = input.validator, ) {} - public validator = this.input.validator static of< + Manifest extends SDKManifest, Store, ConfigType extends | Record @@ -36,15 +43,15 @@ export class CreatedAction< | Config, Type extends Record = ExtractConfigType, >( - metaData: MaybeFn>, + metaData: MaybeFn>, fn: (options: { effects: Effects - utils: Utils + utils: Utils input: Type }) => Promise, inputConfig: Config | Config, ) { - return new CreatedAction( + return new CreatedAction( metaData, fn, inputConfig as Config, @@ -67,7 +74,7 @@ export class CreatedAction< }) } - async metaData(options: { effects: Effects; utils: Utils }) { + async metaData(options: { effects: Effects; utils: Utils }) { if (this.myMetaData instanceof Function) return await this.myMetaData(options) return this.myMetaData @@ -75,7 +82,7 @@ export class CreatedAction< async ActionMetadata(options: { effects: Effects - utils: Utils + utils: Utils }): Promise { return { ...(await this.metaData(options)), diff --git a/lib/actions/setupActions.ts b/lib/actions/setupActions.ts index 615c490..84a0e43 100644 --- a/lib/actions/setupActions.ts +++ b/lib/actions/setupActions.ts @@ -1,17 +1,18 @@ +import { SDKManifest } from "../manifest/ManifestTypes" import { Effects, ExpectedExports } from "../types" import { createUtils } from "../util" import { once } from "../util/once" import { Utils } from "../util/utils" import { CreatedAction } from "./createAction" -export function setupActions( - ...createdActions: CreatedAction[] +export function setupActions( + ...createdActions: CreatedAction[] ) { const myActions = async (options: { effects: Effects - utils: Utils + utils: Utils }) => { - const actions: Record> = {} + const actions: Record> = {} for (const action of createdActions) { const actionMetadata = await action.metaData(options) actions[actionMetadata.id] = action @@ -23,7 +24,7 @@ export function setupActions( actionsMetadata: ExpectedExports.actionsMetadata } = { actions(options: { effects: Effects }) { - const utils = createUtils(options.effects) + const utils = createUtils(options.effects) return myActions({ ...options, @@ -31,7 +32,7 @@ export function setupActions( }) }, async actionsMetadata({ effects }: { effects: Effects }) { - const utils = createUtils(effects) + const utils = createUtils(effects) return Promise.all( createdActions.map((x) => x.ActionMetadata({ effects, utils })), ) diff --git a/lib/config/builder/config.ts b/lib/config/builder/config.ts index f68b999..81009ab 100644 --- a/lib/config/builder/config.ts +++ b/lib/config/builder/config.ts @@ -7,7 +7,7 @@ import { Parser, object } from "ts-matches" export type LazyBuildOptions = { effects: Effects - utils: Utils + utils: Utils } export type LazyBuild = ( options: LazyBuildOptions, diff --git a/lib/inits/migrations/Migration.ts b/lib/inits/migrations/Migration.ts index 37928fd..06e8e6e 100644 --- a/lib/inits/migrations/Migration.ts +++ b/lib/inits/migrations/Migration.ts @@ -1,28 +1,48 @@ -import { ManifestVersion } from "../../manifest/ManifestTypes" +import { ManifestVersion, SDKManifest } from "../../manifest/ManifestTypes" import { Effects } from "../../types" import { Utils } from "../../util/utils" -export class Migration { +export class Migration< + Manifest extends SDKManifest, + Store, + Version extends ManifestVersion, +> { constructor( readonly options: { version: Version - up: (opts: { effects: Effects; utils: Utils }) => Promise - down: (opts: { effects: Effects; utils: Utils }) => Promise + up: (opts: { + effects: Effects + utils: Utils + }) => Promise + down: (opts: { + effects: Effects + utils: Utils + }) => Promise }, ) {} - static of(options: { + static of< + Manifest extends SDKManifest, + Store, + Version extends ManifestVersion, + >(options: { version: Version - up: (opts: { effects: Effects; utils: Utils }) => Promise - down: (opts: { effects: Effects; utils: Utils }) => Promise + up: (opts: { + effects: Effects + utils: Utils + }) => Promise + down: (opts: { + effects: Effects + utils: Utils + }) => Promise }) { - return new Migration(options) + return new Migration(options) } - async up(opts: { effects: Effects; utils: Utils }) { + async up(opts: { effects: Effects; utils: Utils }) { this.up(opts) } - async down(opts: { effects: Effects; utils: Utils }) { + async down(opts: { effects: Effects; utils: Utils }) { this.down(opts) } } diff --git a/lib/inits/migrations/setupMigrations.ts b/lib/inits/migrations/setupMigrations.ts index 9d8a6a1..dabe312 100644 --- a/lib/inits/migrations/setupMigrations.ts +++ b/lib/inits/migrations/setupMigrations.ts @@ -5,30 +5,34 @@ import { createUtils } from "../../util" import { once } from "../../util/once" import { Migration } from "./Migration" -export class Migrations { +export class Migrations { private constructor( readonly manifest: SDKManifest, - readonly migrations: Array>, + readonly migrations: Array>, ) {} private sortedMigrations = once(() => { const migrationsAsVersions = ( - this.migrations as Array> + this.migrations as Array> ).map((x) => [EmVer.parse(x.options.version), x] as const) migrationsAsVersions.sort((a, b) => a[0].compareForSort(b[0])) return migrationsAsVersions }) private currentVersion = once(() => EmVer.parse(this.manifest.version)) - static of>>( - manifest: SDKManifest, - ...migrations: EnsureUniqueId - ) { - return new Migrations(manifest, migrations as Array>) + static of< + Manifest extends SDKManifest, + Store, + Migrations extends Array>, + >(manifest: SDKManifest, ...migrations: EnsureUniqueId) { + return new Migrations( + manifest, + migrations as Array>, + ) } async init({ effects, previousVersion, }: Parameters[0]) { - const utils = createUtils(effects) + const utils = createUtils(effects) if (!!previousVersion) { const previousVersionEmVer = EmVer.parse(previousVersion) for (const [_, migration] of this.sortedMigrations() @@ -42,7 +46,7 @@ export class Migrations { effects, nextVersion, }: Parameters[0]) { - const utils = createUtils(effects) + const utils = createUtils(effects) if (!!nextVersion) { const nextVersionEmVer = EmVer.parse(nextVersion) const reversed = [...this.sortedMigrations()].reverse() @@ -56,16 +60,17 @@ export class Migrations { } export function setupMigrations< + Manifest extends SDKManifest, Store, - Migrations extends Array>, + Migrations extends Array>, >(manifest: SDKManifest, ...migrations: EnsureUniqueId) { - return Migrations.of(manifest, ...migrations) + return Migrations.of(manifest, ...migrations) } // prettier-ignore export type EnsureUniqueId = B extends [] ? A : - B extends [Migration, ...infer Rest] ? ( + B extends [Migration, ...infer Rest] ? ( id extends ids ? "One of the ids are not unique"[] : EnsureUniqueId ) : "There exists a migration that is not a Migration"[] diff --git a/lib/inits/setupInit.ts b/lib/inits/setupInit.ts index bdf3cdc..7d4586e 100644 --- a/lib/inits/setupInit.ts +++ b/lib/inits/setupInit.ts @@ -1,4 +1,5 @@ import { SetInterfaces } from "../interfaces/setupInterfaces" +import { SDKManifest } from "../manifest/ManifestTypes" import { ExpectedExports } from "../types" import { createUtils } from "../util" import { Migrations } from "./migrations/setupMigrations" @@ -6,11 +7,11 @@ import { SetupExports } from "./setupExports" import { Install } from "./setupInstall" import { Uninstall } from "./setupUninstall" -export function setupInit( - migrations: Migrations, - install: Install, - uninstall: Uninstall, - setInterfaces: SetInterfaces, +export function setupInit( + migrations: Migrations, + install: Install, + uninstall: Uninstall, + setInterfaces: SetInterfaces, setupExports: SetupExports, ): { init: ExpectedExports.init @@ -18,7 +19,7 @@ export function setupInit( } { return { init: async (opts) => { - const utils = createUtils(opts.effects) + const utils = createUtils(opts.effects) await migrations.init(opts) await install.init(opts) await setInterfaces({ diff --git a/lib/inits/setupInstall.ts b/lib/inits/setupInstall.ts index 98e0be5..82489c8 100644 --- a/lib/inits/setupInstall.ts +++ b/lib/inits/setupInstall.ts @@ -1,13 +1,16 @@ +import { SDKManifest } from "../manifest/ManifestTypes" import { Effects, ExpectedExports } from "../types" import { Utils, utils } from "../util/utils" -export type InstallFn = (opts: { +export type InstallFn = (opts: { effects: Effects - utils: Utils + utils: Utils }) => Promise -export class Install { - private constructor(readonly fn: InstallFn) {} - static of(fn: InstallFn) { +export class Install { + private constructor(readonly fn: InstallFn) {} + static of( + fn: InstallFn, + ) { return new Install(fn) } @@ -23,6 +26,8 @@ export class Install { } } -export function setupInstall(fn: InstallFn) { +export function setupInstall( + fn: InstallFn, +) { return Install.of(fn) } diff --git a/lib/inits/setupUninstall.ts b/lib/inits/setupUninstall.ts index 6a76463..bfb72bd 100644 --- a/lib/inits/setupUninstall.ts +++ b/lib/inits/setupUninstall.ts @@ -1,13 +1,16 @@ +import { SDKManifest } from "../manifest/ManifestTypes" import { Effects, ExpectedExports } from "../types" import { Utils, utils } from "../util/utils" -export type UninstallFn = (opts: { +export type UninstallFn = (opts: { effects: Effects - utils: Utils + utils: Utils }) => Promise -export class Uninstall { - private constructor(readonly fn: UninstallFn) {} - static of(fn: UninstallFn) { +export class Uninstall { + private constructor(readonly fn: UninstallFn) {} + static of( + fn: UninstallFn, + ) { return new Uninstall(fn) } @@ -23,6 +26,8 @@ export class Uninstall { } } -export function setupUninstall(fn: UninstallFn) { +export function setupUninstall( + fn: UninstallFn, +) { return Uninstall.of(fn) } diff --git a/lib/interfaces/setupInterfaces.ts b/lib/interfaces/setupInterfaces.ts index 3a11d6c..c99164e 100644 --- a/lib/interfaces/setupInterfaces.ts +++ b/lib/interfaces/setupInterfaces.ts @@ -1,25 +1,28 @@ import { Config } from "../config/builder/config" +import { SDKManifest } from "../manifest/ManifestTypes" import { Address, Effects } from "../types" import { Utils } from "../util/utils" import { AddressReceipt } from "./AddressReceipt" export type InterfacesReceipt = Array export type SetInterfaces< + Manifest extends SDKManifest, Store, ConfigInput extends Record, Output extends InterfacesReceipt, > = (opts: { effects: Effects input: null | ConfigInput - utils: Utils + utils: Utils }) => Promise export type SetupInterfaces = < + Manifest extends SDKManifest, Store, ConfigInput extends Record, Output extends InterfacesReceipt, >( config: Config, - fn: SetInterfaces, -) => SetInterfaces + fn: SetInterfaces, +) => SetInterfaces export const NO_INTERFACE_CHANGES = [] as InterfacesReceipt export const setupInterfaces: SetupInterfaces = (_config, fn) => fn