@matheuspuel/state-machine 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- export { make } from './definition.js';
1
+ export { make, mapActions } from './definition.js';
2
2
  export * from './machines/index.js';
3
3
  export { run } from './runtime/index.js';
4
4
  //# sourceMappingURL=StateMachine.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"StateMachine.js","sourceRoot":"","sources":["../src/StateMachine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAEtC,cAAc,qBAAqB,CAAA;AACnC,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAA"}
1
+ {"version":3,"file":"StateMachine.js","sourceRoot":"","sources":["../src/StateMachine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAElD,cAAc,qBAAqB,CAAA;AACnC,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAA"}
@@ -9,4 +9,8 @@ export const makeStore = (base) => ({
9
9
  });
10
10
  export const make = () => (args) => args;
11
11
  export const prepareActions = (machine, store) => machine.actions({ Store: store });
12
+ export const mapActions = (self, f) => make()({
13
+ ...self,
14
+ actions: machine => ({ ...f(self.actions(machine), machine) }),
15
+ });
12
16
  //# sourceMappingURL=definition.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"definition.js","sourceRoot":"","sources":["../src/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAa1C,MAAM,CAAC,MAAM,SAAS,GAAG,CAAQ,IAAsB,EAAgB,EAAE,CAAC,CAAC;IACzE,GAAG,IAAI;IACP,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QACd,GAAG,EAAE,GAAG,EAAE,CAAE,KAAK,CAAC,KAAK,CAAC,EAAE,EAAS,CAAS,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QAC5D,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,EAAS,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QAC/D,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,EAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;KAC7D,CAAC;CACH,CAAC,CAAA;AAkBF,MAAM,CAAC,MAAM,IAAI,GACf,GAAU,EAAE,CACZ,CAAkC,IAAkC,EAAE,EAAE,CACtE,IAAI,CAAA;AAIR,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,OAAqC,EACrC,KAAmB,EACY,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA"}
1
+ {"version":3,"file":"definition.js","sourceRoot":"","sources":["../src/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAa1C,MAAM,CAAC,MAAM,SAAS,GAAG,CAAQ,IAAsB,EAAgB,EAAE,CAAC,CAAC;IACzE,GAAG,IAAI;IACP,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QACd,GAAG,EAAE,GAAG,EAAE,CAAE,KAAK,CAAC,KAAK,CAAC,EAAE,EAAS,CAAS,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QAC5D,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,EAAS,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QAC/D,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,EAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;KAC7D,CAAC;CACH,CAAC,CAAA;AAkBF,MAAM,CAAC,MAAM,IAAI,GACf,GAAU,EAAE,CACZ,CAAkC,IAAkC,EAAE,EAAE,CACtE,IAAI,CAAA;AAIR,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,OAAqC,EACrC,KAAmB,EACY,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;AAErE,MAAM,CAAC,MAAM,UAAU,GAAG,CAKxB,IAAkC,EAClC,CAAsE,EACpC,EAAE,CACpC,IAAI,EAAS,CAAC;IACZ,GAAG,IAAI;IACP,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC;CAC/D,CAAC,CAAA"}
@@ -1,4 +1,4 @@
1
- export { make } from './definition.js';
1
+ export { make, mapActions } from './definition.js';
2
2
  export type { StateMachine } from './definition.js';
3
3
  export * from './machines/index.js';
4
4
  export { run } from './runtime/index.js';
@@ -1 +1 @@
1
- {"version":3,"file":"StateMachine.d.ts","sourceRoot":"","sources":["../../src/StateMachine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AACtC,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACnD,cAAc,qBAAqB,CAAA;AACnC,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAA;AACxC,YAAY,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA"}
1
+ {"version":3,"file":"StateMachine.d.ts","sourceRoot":"","sources":["../../src/StateMachine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAClD,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACnD,cAAc,qBAAqB,CAAA;AACnC,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAA;AACxC,YAAY,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA"}
@@ -25,4 +25,7 @@ export type StateMachine<State, Actions extends AnyStateActions> = {
25
25
  export declare const make: <State>() => <Actions extends AnyStateActions>(args: StateMachine<State, Actions>) => StateMachine<State, Actions>;
26
26
  export type PreparedStateActions<Actions extends AnyStateActions> = Actions;
27
27
  export declare const prepareActions: <State, Actions extends AnyStateActions>(machine: StateMachine<State, Actions>, store: Store<State>) => PreparedStateActions<Actions>;
28
+ export declare const mapActions: <State, Actions extends AnyStateActions, NextActions extends AnyStateActions>(self: StateMachine<State, Actions>, f: (actions: Actions, machine: {
29
+ Store: Store<State>;
30
+ }) => NextActions) => StateMachine<State, NextActions>;
28
31
  //# sourceMappingURL=definition.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAE1C,MAAM,MAAM,SAAS,CAAC,KAAK,IAAI;IAC7B,GAAG,EAAE,MAAM,KAAK,CAAA;IAChB,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,KAAK,KAAK,IAAI,CAAA;CACnD,CAAA;AAED,MAAM,MAAM,KAAK,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK,CAAC,GAAG;IAC5C,IAAI,EAAE,CAAC,CAAC,EAAE,QAAQ,SAAS,OAAO,EAChC,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KACzD,SAAS,CAAC,CAAC,CAAC,CAAA;CAClB,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,KAAK,EAAE,MAAM,SAAS,CAAC,KAAK,CAAC,KAAG,KAAK,CAAC,KAAK,CAOnE,CAAA;AAEF,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC,CAAA;AAGnE,MAAM,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAA;AAExD,MAAM,MAAM,eAAe,GAAG;IAC5B,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,eAAe,CAAA;CAChD,CAAA;AAED,MAAM,MAAM,YAAY,CAAC,KAAK,EAAE,OAAO,SAAS,eAAe,IAAI;IACjE,YAAY,EAAE,KAAK,CAAA;IACnB,OAAO,EAAE,CAAC,OAAO,EAAE;QAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;KAAE,KAAK,OAAO,CAAA;IACtD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE;QAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;KAAE,KAAK,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC1E,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAClD,CAAA;AAED,eAAO,MAAM,IAAI,GACd,KAAK,QACL,OAAO,SAAS,eAAe,EAAE,MAAM,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,iCAC9D,CAAA;AAER,MAAM,MAAM,oBAAoB,CAAC,OAAO,SAAS,eAAe,IAAI,OAAO,CAAA;AAE3E,eAAO,MAAM,cAAc,GAAI,KAAK,EAAE,OAAO,SAAS,eAAe,EACnE,SAAS,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,EACrC,OAAO,KAAK,CAAC,KAAK,CAAC,KAClB,oBAAoB,CAAC,OAAO,CAAsC,CAAA"}
1
+ {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAE1C,MAAM,MAAM,SAAS,CAAC,KAAK,IAAI;IAC7B,GAAG,EAAE,MAAM,KAAK,CAAA;IAChB,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,KAAK,KAAK,IAAI,CAAA;CACnD,CAAA;AAED,MAAM,MAAM,KAAK,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK,CAAC,GAAG;IAC5C,IAAI,EAAE,CAAC,CAAC,EAAE,QAAQ,SAAS,OAAO,EAChC,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,KACzD,SAAS,CAAC,CAAC,CAAC,CAAA;CAClB,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,KAAK,EAAE,MAAM,SAAS,CAAC,KAAK,CAAC,KAAG,KAAK,CAAC,KAAK,CAOnE,CAAA;AAEF,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC,CAAA;AAGnE,MAAM,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAA;AAExD,MAAM,MAAM,eAAe,GAAG;IAC5B,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,eAAe,CAAA;CAChD,CAAA;AAED,MAAM,MAAM,YAAY,CAAC,KAAK,EAAE,OAAO,SAAS,eAAe,IAAI;IACjE,YAAY,EAAE,KAAK,CAAA;IACnB,OAAO,EAAE,CAAC,OAAO,EAAE;QAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;KAAE,KAAK,OAAO,CAAA;IACtD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE;QAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;KAAE,KAAK,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC1E,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAClD,CAAA;AAED,eAAO,MAAM,IAAI,GACd,KAAK,QACL,OAAO,SAAS,eAAe,EAAE,MAAM,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,iCAC9D,CAAA;AAER,MAAM,MAAM,oBAAoB,CAAC,OAAO,SAAS,eAAe,IAAI,OAAO,CAAA;AAE3E,eAAO,MAAM,cAAc,GAAI,KAAK,EAAE,OAAO,SAAS,eAAe,EACnE,SAAS,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,EACrC,OAAO,KAAK,CAAC,KAAK,CAAC,KAClB,oBAAoB,CAAC,OAAO,CAAsC,CAAA;AAErE,eAAO,MAAM,UAAU,GACrB,KAAK,EACL,OAAO,SAAS,eAAe,EAC/B,WAAW,SAAS,eAAe,EAEnC,MAAM,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,EAClC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE;IAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;CAAE,KAAK,WAAW,KACrE,YAAY,CAAC,KAAK,EAAE,WAAW,CAI9B,CAAA"}
@@ -1,4 +1,4 @@
1
- import { Effect, Option } from 'effect';
1
+ import { Effect, Either, Option } from 'effect';
2
2
  import { AnyForm, FormField } from '../form/definition.js';
3
3
  export type FormState<Form extends AnyForm> = {
4
4
  [K in keyof Form]: Form[K] extends FormField<infer A, infer I, infer E> ? {
@@ -16,13 +16,22 @@ export type FormActions<Form extends AnyForm> = {
16
16
  [K in keyof Form]: Form[K] extends FormField<infer A, infer I, infer E> ? {
17
17
  set: (value: I) => void;
18
18
  update: (f: (previous: I) => I) => void;
19
+ validate: () => Promise<Either.Either<A, E | null>>;
19
20
  error: {
20
21
  set: (error: E | null) => void;
21
22
  };
22
23
  } : Form[K] extends AnyForm ? FormActions<Form[K]> : never;
23
24
  };
25
+ declare const FormValidationError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
26
+ readonly _tag: "FormValidationError";
27
+ } & Readonly<A>;
28
+ export declare class FormValidationError<Form extends AnyForm> extends FormValidationError_base<{
29
+ errors: FormError<Form>;
30
+ }> {
31
+ }
24
32
  export declare const Form: <F extends AnyForm>(form: F) => import("../definition.js").StateMachine<FormState<F>, FormActions<F> & {
25
- validate: () => Effect.Effect<FormData<F>, FormError<F>>;
33
+ validate: () => Effect.Effect<FormData<F>, FormValidationError<F>>;
26
34
  setStateFromData: (data: FormData<F>) => void;
27
35
  }>;
36
+ export {};
28
37
  //# sourceMappingURL=Form.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Form.d.ts","sourceRoot":"","sources":["../../../src/machines/Form.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAU,MAAM,EAAU,MAAM,QAAQ,CAAA;AAEvD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAE1D,MAAM,MAAM,SAAS,CAAC,IAAI,SAAS,OAAO,IAAI;KAC3C,CAAC,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,GACnE;QAAE,KAAK,EAAE,CAAC,CAAC;QAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAA;KAAE,GAC7B,IAAI,CAAC,CAAC,CAAC,SAAS,OAAO,GACrB,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAClB,KAAK;CACZ,CAAA;AAED,MAAM,MAAM,QAAQ,CAAC,IAAI,SAAS,OAAO,IAAI;KAC1C,CAAC,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,GACnE,CAAC,GACD,IAAI,CAAC,CAAC,CAAC,SAAS,OAAO,GACrB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GACjB,KAAK;CACZ,CAAA;AAED,MAAM,MAAM,SAAS,CAAC,IAAI,SAAS,OAAO,IAAI;KAC3C,CAAC,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,GACnE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAChB,IAAI,CAAC,CAAC,CAAC,SAAS,OAAO,GACrB,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAClB,KAAK;CACZ,CAAA;AAED,MAAM,MAAM,WAAW,CAAC,IAAI,SAAS,OAAO,IAAI;KAC7C,CAAC,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,GACnE;QACE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAA;QACvB,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,CAAA;QACvC,KAAK,EAAE;YAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,CAAA;SAAE,CAAA;KAC1C,GACD,IAAI,CAAC,CAAC,CAAC,SAAS,OAAO,GACrB,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GACpB,KAAK;CACZ,CAAA;AAMD,eAAO,MAAM,IAAI,GAAI,CAAC,SAAS,OAAO,EAAE,MAAM,CAAC;cAgE/B,MAAM,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;sBACtC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI;EAsBlD,CAAA"}
1
+ {"version":3,"file":"Form.d.ts","sourceRoot":"","sources":["../../../src/machines/Form.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,MAAM,EAAE,MAAM,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAA;AAE7D,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAE1D,MAAM,MAAM,SAAS,CAAC,IAAI,SAAS,OAAO,IAAI;KAC3C,CAAC,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,GACnE;QAAE,KAAK,EAAE,CAAC,CAAC;QAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAA;KAAE,GAC7B,IAAI,CAAC,CAAC,CAAC,SAAS,OAAO,GACrB,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAClB,KAAK;CACZ,CAAA;AAED,MAAM,MAAM,QAAQ,CAAC,IAAI,SAAS,OAAO,IAAI;KAC1C,CAAC,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,GACnE,CAAC,GACD,IAAI,CAAC,CAAC,CAAC,SAAS,OAAO,GACrB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GACjB,KAAK;CACZ,CAAA;AAED,MAAM,MAAM,SAAS,CAAC,IAAI,SAAS,OAAO,IAAI;KAC3C,CAAC,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,GACnE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAChB,IAAI,CAAC,CAAC,CAAC,SAAS,OAAO,GACrB,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAClB,KAAK;CACZ,CAAA;AAED,MAAM,MAAM,WAAW,CAAC,IAAI,SAAS,OAAO,IAAI;KAC7C,CAAC,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,GACnE;QACE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAA;QACvB,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,CAAA;QACvC,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;QACnD,KAAK,EAAE;YAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,CAAA;SAAE,CAAA;KAC1C,GACD,IAAI,CAAC,CAAC,CAAC,SAAS,OAAO,GACrB,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GACpB,KAAK;CACZ,CAAA;;;;AAED,qBAAa,mBAAmB,CAAC,IAAI,SAAS,OAAO,CAAE,SAAQ,yBAE7D;IAAE,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC;CAAG;AAMjC,eAAO,MAAM,IAAI,GAAI,CAAC,SAAS,OAAO,EAAE,MAAM,CAAC;cAiF/B,MAAM,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;sBAChD,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI;EAsBlD,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"Struct.d.ts","sourceRoot":"","sources":["../../../src/machines/Struct.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EAGf,YAAY,EACb,MAAM,kBAAkB,CAAA;AAEzB,eAAO,MAAM,MAAM,GACjB,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,EAE5D,QAAQ,CAAC,qBAGN,CAAC,8CAA8C,KAAK,sFAEA,OAAO,+CAgB5D,CAAA"}
1
+ {"version":3,"file":"Struct.d.ts","sourceRoot":"","sources":["../../../src/machines/Struct.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EAGf,YAAY,EACb,MAAM,kBAAkB,CAAA;AAEzB,eAAO,MAAM,MAAM,GACjB,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,EAE5D,QAAQ,CAAC,qBAGN,CAAC,8CAA8C,KAAK,sFAEA,OAAO,+CAmC5D,CAAA"}
@@ -1,5 +1,7 @@
1
- import { Effect, Either, Option, Record } from 'effect';
1
+ import { Data, Effect, Either, Option, Record } from 'effect';
2
2
  import { make, makeStore } from '../definition.js';
3
+ export class FormValidationError extends Data.TaggedError('FormValidationError') {
4
+ }
3
5
  const isField = (value) => typeof value.validate === 'function';
4
6
  export const Form = (form) => {
5
7
  const getInitialState = (form) => Record.map(form, _ => isField(_) ? { value: _.initial, error: null } : getInitialState(_));
@@ -9,9 +11,21 @@ export const Form = (form) => {
9
11
  ..._,
10
12
  [key]: { value: f(_[key].value), error: null },
11
13
  })),
14
+ validate: () => Effect.gen(function* () {
15
+ const result = yield* _.validate(Store.get()[key].value).pipe(Effect.either);
16
+ const error = Option.getOrNull(Either.getLeft(result));
17
+ Store.update(_ => ({
18
+ ..._,
19
+ [key]: { value: _[key].value, error },
20
+ }));
21
+ return result;
22
+ }).pipe(Effect.runPromise),
12
23
  set: (value) => Store.update(_ => ({ ..._, [key]: { value, error: null } })),
13
24
  error: {
14
- set: (error) => Store.update(_ => ({ ..._, [key]: { value: _.value, error } })),
25
+ set: (error) => Store.update(_ => ({
26
+ ..._,
27
+ [key]: { value: _[key].value, error },
28
+ })),
15
29
  },
16
30
  }
17
31
  : getActions(_, makeStore({
@@ -29,7 +43,7 @@ export const Form = (form) => {
29
43
  : validate(_, makeStore({
30
44
  get: () => Store.get()[key],
31
45
  update: f => Store.update(_ => ({ ..._, [key]: f(_[key]) })),
32
- }))), { mode: 'validate' });
46
+ })).pipe(Effect.mapError(e => e.errors))), { mode: 'validate' }).pipe(Effect.mapError(e => new FormValidationError({ errors: e })));
33
47
  return make()({
34
48
  initialState: getInitialState(form),
35
49
  actions: ({ Store }) => ({
@@ -1 +1 @@
1
- {"version":3,"file":"Form.js","sourceRoot":"","sources":["../../src/machines/Form.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Form.js","sourceRoot":"","sources":["../../src/machines/Form.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,20 @@ export const Struct = (fields) => make()({
10
10
  }),
11
11
  })),
12
12
  }),
13
- // TODO implement other options
13
+ start: ({ Store }) => Promise.all(Object.keys(fields).map(async (key) => {
14
+ const field = fields[key];
15
+ return field.start?.({
16
+ Store: makeStore({
17
+ get: () => Store.get()[key],
18
+ update: f => Store.update(_ => ({ ..._, [key]: f(_[key]) })),
19
+ }),
20
+ });
21
+ })),
22
+ onUpdate: async (state) => {
23
+ await Promise.all(Object.keys(fields).map(async (key) => {
24
+ const field = fields[key];
25
+ return field.onUpdate?.(state[key]);
26
+ }));
27
+ },
14
28
  });
15
29
  //# sourceMappingURL=Struct.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Struct.js","sourceRoot":"","sources":["../../src/machines/Struct.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAEL,IAAI,EACJ,SAAS,GAEV,MAAM,kBAAkB,CAAA;AAEzB,MAAM,CAAC,MAAM,MAAM,GAAG,CAGpB,MAAS,EACT,EAAE,CACF,IAAI,EAEA,CAID;IACD,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAQ;IAC5D,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACvB,GAAI,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAChC,CAAC,CAAC,OAAO,CAAC;YACR,KAAK,EAAE,SAAS,CAAC;gBACf,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC;gBAC3B,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;aAC7D,CAAQ;SACV,CAAC,CACK;KACV,CAAC;IACF,+BAA+B;CAChC,CAAC,CAAA"}
1
+ {"version":3,"file":"Struct.js","sourceRoot":"","sources":["../../src/machines/Struct.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,EAEL,IAAI,EACJ,SAAS,GAEV,MAAM,kBAAkB,CAAA;AAEzB,MAAM,CAAC,MAAM,MAAM,GAAG,CAGpB,MAAS,EACT,EAAE,CACF,IAAI,EAEA,CAID;IACD,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAQ;IAC5D,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACvB,GAAI,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAChC,CAAC,CAAC,OAAO,CAAC;YACR,KAAK,EAAE,SAAS,CAAC;gBACf,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC;gBAC3B,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;aAC7D,CAAQ;SACV,CAAC,CACK;KACV,CAAC;IACF,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CACnB,OAAO,CAAC,GAAG,CACT,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,KAAK,EAAC,GAAG,EAAC,EAAE;QAClC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAE,CAAA;QAC1B,OAAO,KAAK,CAAC,KAAK,EAAE,CAAC;YACnB,KAAK,EAAE,SAAS,CAAC;gBACf,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC;gBAC3B,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;aAC7D,CAAQ;SACV,CAAC,CAAA;IACJ,CAAC,CAAC,CACH;IACH,QAAQ,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;QACtB,MAAM,OAAO,CAAC,GAAG,CACf,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,KAAK,EAAC,GAAG,EAAC,EAAE;YAClC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAE,CAAA;YAC1B,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;QACrC,CAAC,CAAC,CACH,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matheuspuel/state-machine",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "/dist",
@@ -1,4 +1,4 @@
1
- export { make } from './definition.js'
1
+ export { make, mapActions } from './definition.js'
2
2
  export type { StateMachine } from './definition.js'
3
3
  export * from './machines/index.js'
4
4
  export { run } from './runtime/index.js'
package/src/definition.ts CHANGED
@@ -47,3 +47,16 @@ export const prepareActions = <State, Actions extends AnyStateActions>(
47
47
  machine: StateMachine<State, Actions>,
48
48
  store: Store<State>,
49
49
  ): PreparedStateActions<Actions> => machine.actions({ Store: store })
50
+
51
+ export const mapActions = <
52
+ State,
53
+ Actions extends AnyStateActions,
54
+ NextActions extends AnyStateActions,
55
+ >(
56
+ self: StateMachine<State, Actions>,
57
+ f: (actions: Actions, machine: { Store: Store<State> }) => NextActions,
58
+ ): StateMachine<State, NextActions> =>
59
+ make<State>()({
60
+ ...self,
61
+ actions: machine => ({ ...f(self.actions(machine), machine) }),
62
+ })
@@ -1,4 +1,4 @@
1
- import { Effect, Either, Option, Record } from 'effect'
1
+ import { Data, Effect, Either, Option, Record } from 'effect'
2
2
  import { make, makeStore, Store } from '../definition.js'
3
3
  import { AnyForm, FormField } from '../form/definition.js'
4
4
 
@@ -31,6 +31,7 @@ export type FormActions<Form extends AnyForm> = {
31
31
  ? {
32
32
  set: (value: I) => void
33
33
  update: (f: (previous: I) => I) => void
34
+ validate: () => Promise<Either.Either<A, E | null>>
34
35
  error: { set: (error: E | null) => void }
35
36
  }
36
37
  : Form[K] extends AnyForm
@@ -38,6 +39,10 @@ export type FormActions<Form extends AnyForm> = {
38
39
  : never
39
40
  }
40
41
 
42
+ export class FormValidationError<Form extends AnyForm> extends Data.TaggedError(
43
+ 'FormValidationError',
44
+ )<{ errors: FormError<Form> }> {}
45
+
41
46
  const isField = (
42
47
  value: AnyForm | FormField<any, any, any>,
43
48
  ): value is FormField<any, any, any> => typeof value.validate === 'function'
@@ -59,11 +64,26 @@ export const Form = <F extends AnyForm>(form: F) => {
59
64
  ..._,
60
65
  [key]: { value: f(_[key]!.value), error: null },
61
66
  })),
67
+ validate: () =>
68
+ Effect.gen(function* () {
69
+ const result = yield* _.validate(Store.get()[key]!.value).pipe(
70
+ Effect.either,
71
+ )
72
+ const error = Option.getOrNull(Either.getLeft(result))
73
+ Store.update(_ => ({
74
+ ..._,
75
+ [key]: { value: _[key]!.value, error },
76
+ }))
77
+ return result
78
+ }).pipe(Effect.runPromise),
62
79
  set: (value: any) =>
63
80
  Store.update(_ => ({ ..._, [key]: { value, error: null } })),
64
81
  error: {
65
82
  set: (error: any) =>
66
- Store.update(_ => ({ ..._, [key]: { value: _.value, error } })),
83
+ Store.update(_ => ({
84
+ ..._,
85
+ [key]: { value: _[key]!.value, error },
86
+ })),
67
87
  },
68
88
  }
69
89
  : getActions(
@@ -77,7 +97,7 @@ export const Form = <F extends AnyForm>(form: F) => {
77
97
  const validate = <F extends AnyForm>(
78
98
  form: F,
79
99
  Store: Store<FormState<F>>,
80
- ): any =>
100
+ ): Effect.Effect<FormData<F>, FormValidationError<F>> =>
81
101
  Effect.all(
82
102
  Record.map(form, (_, key) =>
83
103
  isField(_)
@@ -100,13 +120,15 @@ export const Form = <F extends AnyForm>(form: F) => {
100
120
  get: () => Store.get()[key],
101
121
  update: f => Store.update(_ => ({ ..._, [key]: f(_[key]) })),
102
122
  }) as any,
103
- ),
123
+ ).pipe(Effect.mapError(e => e.errors)),
104
124
  ),
105
125
  { mode: 'validate' },
126
+ ).pipe(
127
+ Effect.mapError(e => new FormValidationError({ errors: e as any })),
106
128
  ) as any
107
129
  return make<FormState<F>>()<
108
130
  FormActions<F> & {
109
- validate: () => Effect.Effect<FormData<F>, FormError<F>>
131
+ validate: () => Effect.Effect<FormData<F>, FormValidationError<F>>
110
132
  setStateFromData: (data: FormData<F>) => void
111
133
  }
112
134
  >({
@@ -29,5 +29,24 @@ export const Struct = <
29
29
  }),
30
30
  ) as any),
31
31
  }),
32
- // TODO implement other options
32
+ start: ({ Store }) =>
33
+ Promise.all(
34
+ Object.keys(fields).map(async key => {
35
+ const field = fields[key]!
36
+ return field.start?.({
37
+ Store: makeStore({
38
+ get: () => Store.get()[key],
39
+ update: f => Store.update(_ => ({ ..._, [key]: f(_[key]) })),
40
+ }) as any,
41
+ })
42
+ }),
43
+ ),
44
+ onUpdate: async state => {
45
+ await Promise.all(
46
+ Object.keys(fields).map(async key => {
47
+ const field = fields[key]!
48
+ return field.onUpdate?.(state[key])
49
+ }),
50
+ )
51
+ },
33
52
  })