diff --git a/lib/actions/setupActions.ts b/lib/actions/setupActions.ts index 5efc844..4d9233c 100644 --- a/lib/actions/setupActions.ts +++ b/lib/actions/setupActions.ts @@ -1,5 +1,3 @@ -import { Effects, ExpectedExports, ExportedAction } from "../types" -import { ActionMetaData } from "../types" import { once } from "../util/once" import { CreatedAction } from "./createAction" diff --git a/lib/inits/migrations/Migration.ts b/lib/inits/migrations/Migration.ts index 3cb20dd..9dc955e 100644 --- a/lib/inits/migrations/Migration.ts +++ b/lib/inits/migrations/Migration.ts @@ -1,12 +1,13 @@ import { ManifestVersion } from "../../manifest/ManifestTypes" import { Effects } from "../../types" +import { Utils } from "../../util" -export class Migration { +export class Migration { constructor( readonly options: { version: Version - up: (opts: { effects: Effects }) => Promise - down: (opts: { effects: Effects }) => Promise + up: (opts: { effects: Effects; utils: Utils }) => Promise + down: (opts: { effects: Effects; utils: Utils }) => Promise }, ) {} static of(options: { @@ -17,11 +18,11 @@ export class Migration { return new Migration(options) } - async up(opts: { effects: Effects }) { + async up(opts: { effects: Effects; utils: Utils }) { this.up(opts) } - async down(opts: { effects: Effects }) { + 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 7034eca..7302af9 100644 --- a/lib/inits/migrations/setupMigrations.ts +++ b/lib/inits/migrations/setupMigrations.ts @@ -1,69 +1,70 @@ -import { setupActions } from "../../actions/setupActions" import { EmVer } from "../../emverLite/mod" import { SDKManifest } from "../../manifest/ManifestTypes" import { ExpectedExports } from "../../types" 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>).map( - (x) => [EmVer.parse(x.options.version), x] as const, - ) + const migrationsAsVersions = ( + 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>>( + static of>, WD>( manifest: SDKManifest, - ...migrations: EnsureUniqueId + ...migrations: EnsureUniqueId ) { - return new Migrations(manifest, migrations as Array>) + return new Migrations(manifest, migrations as Array>) } async init({ effects, + utils, previousVersion, - }: Parameters[0]) { + }: Parameters>[0]) { if (!!previousVersion) { const previousVersionEmVer = EmVer.parse(previousVersion) for (const [_, migration] of this.sortedMigrations() .filter((x) => x[0].greaterThan(previousVersionEmVer)) .filter((x) => x[0].lessThanOrEqual(this.currentVersion()))) { - await migration.up({ effects }) + await migration.up({ effects, utils }) } } } async uninit({ effects, + utils, nextVersion, - }: Parameters[0]) { + }: Parameters>[0]) { if (!!nextVersion) { const nextVersionEmVer = EmVer.parse(nextVersion) const reversed = [...this.sortedMigrations()].reverse() for (const [_, migration] of reversed .filter((x) => x[0].greaterThan(nextVersionEmVer)) .filter((x) => x[0].lessThanOrEqual(this.currentVersion()))) { - await migration.down({ effects }) + await migration.down({ effects, utils }) } } } } -export function setupMigrations>>( - manifest: SDKManifest, - ...migrations: EnsureUniqueId -) { +export function setupMigrations< + Migrations extends Array>, + WD, +>(manifest: SDKManifest, ...migrations: EnsureUniqueId) { return Migrations.of(manifest, ...migrations) } // prettier-ignore -export type EnsureUniqueId = +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 c782b2c..4659282 100644 --- a/lib/inits/setupInit.ts +++ b/lib/inits/setupInit.ts @@ -3,13 +3,13 @@ import { Migrations } from "./migrations/setupMigrations" import { Install } from "./setupInstall" import { Uninstall } from "./setupUninstall" -export function setupInit( - migrations: Migrations, - install: Install, - uninstall: Uninstall, +export function setupInit( + migrations: Migrations, + install: Install, + uninstall: Uninstall, ): { - init: ExpectedExports.init - uninit: ExpectedExports.uninit + init: ExpectedExports.init + uninit: ExpectedExports.uninit } { return { init: async (opts) => { diff --git a/lib/inits/setupInstall.ts b/lib/inits/setupInstall.ts index 67c9569..48fc6c7 100644 --- a/lib/inits/setupInstall.ts +++ b/lib/inits/setupInstall.ts @@ -1,24 +1,24 @@ import { Effects, ExpectedExports } from "../types" import { Utils, utils } from "../util" -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) } async init({ effects, previousVersion, - }: Parameters[0]) { + }: Parameters>[0]) { if (!previousVersion) await this.fn({ effects, utils: utils(effects) }) } } -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 5352001..e9f2581 100644 --- a/lib/inits/setupUninstall.ts +++ b/lib/inits/setupUninstall.ts @@ -1,24 +1,24 @@ import { Effects, ExpectedExports } from "../types" import { Utils, utils } from "../util" -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) } async uninit({ effects, nextVersion, - }: Parameters[0]) { + }: Parameters>[0]) { if (!nextVersion) await this.fn({ effects, utils: utils(effects) }) } } -export function setupUninstall(fn: UninstallFn) { +export function setupUninstall(fn: UninstallFn) { return Uninstall.of(fn) } diff --git a/lib/types.ts b/lib/types.ts index abc120a..ff491a0 100644 --- a/lib/types.ts +++ b/lib/types.ts @@ -1,6 +1,7 @@ export * as configTypes from "./config/configTypes" import { InputSpec } from "./config/configTypes" import { DependenciesReceipt } from "./config/setupConfig" +import { Utils } from "./util" export type ExportedAction = (options: { effects: Effects @@ -66,15 +67,17 @@ export namespace ExpectedExports { * Every time a package completes an install, this function is called before the main. * Can be used to do migration like things. */ - export type init = (options: { + export type init = (options: { effects: Effects + utils: Utils previousVersion: null | string }) => Promise /** This will be ran during any time a package is uninstalled, for example during a update * this will be called. */ - export type uninit = (options: { + export type uninit = (options: { effects: Effects + utils: Utils nextVersion: null | string }) => Promise diff --git a/lib/util/index.ts b/lib/util/index.ts index 296fb00..249d157 100644 --- a/lib/util/index.ts +++ b/lib/util/index.ts @@ -101,14 +101,14 @@ export const utils = ( generator: DefaultString }) => { if (value) { - await effects.vaultSet({ key, value }) + await effects.vault.set({ key, value }) return value } - if (await effects.vaultList().then((x) => x.includes(key))) { + if (await effects.vault.list().then((x) => x.includes(key))) { return null } const newValue = getDefaultString(generator) - await effects.vaultSet({ key, value: newValue }) + await effects.vault.set({ key, value: newValue }) return newValue }, getSystemSmtp: () =>