mirror of
https://github.com/Start9Labs/start-os.git
synced 2026-04-04 22:39:46 +00:00
merge 036, everything broken
This commit is contained in:
85
sdk/lib/actions/createAction.ts
Normal file
85
sdk/lib/actions/createAction.ts
Normal file
@@ -0,0 +1,85 @@
|
||||
import { Config, ExtractConfigType } from "../config/builder/config"
|
||||
import { SDKManifest } from "../manifest/ManifestTypes"
|
||||
import { ActionMetadata, ActionResult, Effects, ExportedAction } from "../types"
|
||||
|
||||
export type MaybeFn<Manifest extends SDKManifest, Store, Value> =
|
||||
| Value
|
||||
| ((options: { effects: Effects }) => Promise<Value> | Value)
|
||||
export class CreatedAction<
|
||||
Manifest extends SDKManifest,
|
||||
Store,
|
||||
ConfigType extends
|
||||
| Record<string, any>
|
||||
| Config<any, Store>
|
||||
| Config<any, never>,
|
||||
Type extends Record<string, any> = ExtractConfigType<ConfigType>,
|
||||
> {
|
||||
private constructor(
|
||||
public readonly myMetaData: MaybeFn<
|
||||
Manifest,
|
||||
Store,
|
||||
Omit<ActionMetadata, "input">
|
||||
>,
|
||||
readonly fn: (options: {
|
||||
effects: Effects
|
||||
input: Type
|
||||
}) => Promise<ActionResult>,
|
||||
readonly input: Config<Type, Store>,
|
||||
public validator = input.validator,
|
||||
) {}
|
||||
|
||||
static of<
|
||||
Manifest extends SDKManifest,
|
||||
Store,
|
||||
ConfigType extends
|
||||
| Record<string, any>
|
||||
| Config<any, any>
|
||||
| Config<any, never>,
|
||||
Type extends Record<string, any> = ExtractConfigType<ConfigType>,
|
||||
>(
|
||||
metaData: MaybeFn<Manifest, Store, Omit<ActionMetadata, "input">>,
|
||||
fn: (options: { effects: Effects; input: Type }) => Promise<ActionResult>,
|
||||
inputConfig: Config<Type, Store> | Config<Type, never>,
|
||||
) {
|
||||
return new CreatedAction<Manifest, Store, ConfigType, Type>(
|
||||
metaData,
|
||||
fn,
|
||||
inputConfig as Config<Type, Store>,
|
||||
)
|
||||
}
|
||||
|
||||
exportedAction: ExportedAction = ({ effects, input }) => {
|
||||
return this.fn({
|
||||
effects,
|
||||
input: this.validator.unsafeCast(input),
|
||||
})
|
||||
}
|
||||
|
||||
run = async ({ effects, input }: { effects: Effects; input?: Type }) => {
|
||||
return this.fn({
|
||||
effects,
|
||||
input: this.validator.unsafeCast(input),
|
||||
})
|
||||
}
|
||||
|
||||
async metaData(options: { effects: Effects }) {
|
||||
if (this.myMetaData instanceof Function)
|
||||
return await this.myMetaData(options)
|
||||
return this.myMetaData
|
||||
}
|
||||
|
||||
async ActionMetadata(options: { effects: Effects }): Promise<ActionMetadata> {
|
||||
return {
|
||||
...(await this.metaData(options)),
|
||||
input: await this.input.build(options),
|
||||
}
|
||||
}
|
||||
|
||||
async getConfig({ effects }: { effects: Effects }) {
|
||||
return this.input.build({
|
||||
effects,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
export const createAction = CreatedAction.of
|
||||
3
sdk/lib/actions/index.ts
Normal file
3
sdk/lib/actions/index.ts
Normal file
@@ -0,0 +1,3 @@
|
||||
import "./createAction"
|
||||
|
||||
import "./setupActions"
|
||||
31
sdk/lib/actions/setupActions.ts
Normal file
31
sdk/lib/actions/setupActions.ts
Normal file
@@ -0,0 +1,31 @@
|
||||
import { SDKManifest } from "../manifest/ManifestTypes"
|
||||
import { Effects, ExpectedExports } from "../types"
|
||||
import { once } from "../util/once"
|
||||
import { CreatedAction } from "./createAction"
|
||||
|
||||
export function setupActions<Manifest extends SDKManifest, Store>(
|
||||
...createdActions: CreatedAction<Manifest, Store, any>[]
|
||||
) {
|
||||
const myActions = async (options: { effects: Effects }) => {
|
||||
const actions: Record<string, CreatedAction<Manifest, Store, any>> = {}
|
||||
for (const action of createdActions) {
|
||||
const actionMetadata = await action.metaData(options)
|
||||
actions[actionMetadata.id] = action
|
||||
}
|
||||
return actions
|
||||
}
|
||||
const answer: {
|
||||
actions: ExpectedExports.actions
|
||||
actionsMetadata: ExpectedExports.actionsMetadata
|
||||
} = {
|
||||
actions(options: { effects: Effects }) {
|
||||
return myActions(options)
|
||||
},
|
||||
async actionsMetadata({ effects }: { effects: Effects }) {
|
||||
return Promise.all(
|
||||
createdActions.map((x) => x.ActionMetadata({ effects })),
|
||||
)
|
||||
},
|
||||
}
|
||||
return answer
|
||||
}
|
||||
Reference in New Issue
Block a user