@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.
- package/dist/StateMachine.js +1 -1
- package/dist/StateMachine.js.map +1 -1
- package/dist/definition.js +4 -0
- package/dist/definition.js.map +1 -1
- package/dist/dts/StateMachine.d.ts +1 -1
- package/dist/dts/StateMachine.d.ts.map +1 -1
- package/dist/dts/definition.d.ts +3 -0
- package/dist/dts/definition.d.ts.map +1 -1
- package/dist/dts/machines/Form.d.ts +11 -2
- package/dist/dts/machines/Form.d.ts.map +1 -1
- package/dist/dts/machines/Struct.d.ts.map +1 -1
- package/dist/machines/Form.js +17 -3
- package/dist/machines/Form.js.map +1 -1
- package/dist/machines/Struct.js +15 -1
- package/dist/machines/Struct.js.map +1 -1
- package/package.json +1 -1
- package/src/StateMachine.ts +1 -1
- package/src/definition.ts +13 -0
- package/src/machines/Form.ts +27 -5
- package/src/machines/Struct.ts +20 -1
package/dist/StateMachine.js
CHANGED
package/dist/StateMachine.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StateMachine.js","sourceRoot":"","sources":["../src/StateMachine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,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"}
|
package/dist/definition.js
CHANGED
|
@@ -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
|
package/dist/definition.js.map
CHANGED
|
@@ -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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StateMachine.d.ts","sourceRoot":"","sources":["../../src/StateMachine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,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"}
|
package/dist/dts/definition.d.ts
CHANGED
|
@@ -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>,
|
|
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,
|
|
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,+
|
|
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"}
|
package/dist/machines/Form.js
CHANGED
|
@@ -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(_ => ({
|
|
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":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"Form.js","sourceRoot":"","sources":["../../src/machines/Form.ts"],"names":[],"mappings":"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"}
|
package/dist/machines/Struct.js
CHANGED
|
@@ -10,6 +10,20 @@ export const Struct = (fields) => make()({
|
|
|
10
10
|
}),
|
|
11
11
|
})),
|
|
12
12
|
}),
|
|
13
|
-
|
|
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
|
|
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
package/src/StateMachine.ts
CHANGED
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
|
+
})
|
package/src/machines/Form.ts
CHANGED
|
@@ -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(_ => ({
|
|
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
|
-
):
|
|
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>,
|
|
131
|
+
validate: () => Effect.Effect<FormData<F>, FormValidationError<F>>
|
|
110
132
|
setStateFromData: (data: FormData<F>) => void
|
|
111
133
|
}
|
|
112
134
|
>({
|
package/src/machines/Struct.ts
CHANGED
|
@@ -29,5 +29,24 @@ export const Struct = <
|
|
|
29
29
|
}),
|
|
30
30
|
) as any),
|
|
31
31
|
}),
|
|
32
|
-
|
|
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
|
})
|