@matheuspuel/state-machine 0.2.2 → 0.3.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.
Files changed (84) hide show
  1. package/dist/StateMachine.js +4 -0
  2. package/dist/StateMachine.js.map +1 -0
  3. package/dist/definition.js +12 -0
  4. package/dist/definition.js.map +1 -0
  5. package/dist/dts/StateMachine.d.ts +6 -0
  6. package/dist/dts/StateMachine.d.ts.map +1 -0
  7. package/dist/dts/definition.d.ts +28 -0
  8. package/dist/dts/definition.d.ts.map +1 -0
  9. package/dist/dts/form/definition.d.ts +20 -0
  10. package/dist/dts/form/definition.d.ts.map +1 -0
  11. package/dist/dts/form/index.d.ts +2 -0
  12. package/dist/dts/form/index.d.ts.map +1 -0
  13. package/dist/dts/index.d.ts +2 -0
  14. package/dist/dts/index.d.ts.map +1 -0
  15. package/dist/dts/machines/Form.d.ts +28 -0
  16. package/dist/dts/machines/Form.d.ts.map +1 -0
  17. package/dist/dts/machines/FormValue.d.ts +12 -0
  18. package/dist/dts/machines/FormValue.d.ts.map +1 -0
  19. package/dist/dts/machines/Struct.d.ts +3 -0
  20. package/dist/dts/machines/Struct.d.ts.map +1 -0
  21. package/dist/dts/machines/index.d.ts +5 -0
  22. package/dist/dts/machines/index.d.ts.map +1 -0
  23. package/dist/dts/machines/of.d.ts +6 -0
  24. package/dist/dts/machines/of.d.ts.map +1 -0
  25. package/dist/dts/react/context.d.ts +10 -0
  26. package/dist/dts/react/context.d.ts.map +1 -0
  27. package/dist/dts/react/index.d.ts +4 -0
  28. package/dist/dts/react/index.d.ts.map +1 -0
  29. package/dist/dts/react/useSelector.d.ts +5 -0
  30. package/dist/dts/react/useSelector.d.ts.map +1 -0
  31. package/dist/dts/react/useStateMachine.d.ts +6 -0
  32. package/dist/dts/react/useStateMachine.d.ts.map +1 -0
  33. package/dist/dts/runtime/index.d.ts +14 -0
  34. package/dist/dts/runtime/index.d.ts.map +1 -0
  35. package/dist/form/definition.js +14 -0
  36. package/dist/form/definition.js.map +1 -0
  37. package/dist/form/index.js +2 -0
  38. package/dist/form/index.js.map +1 -0
  39. package/dist/index.js +2 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/machines/Form.js +47 -0
  42. package/dist/machines/Form.js.map +1 -0
  43. package/dist/machines/FormValue.js +12 -0
  44. package/dist/machines/FormValue.js.map +1 -0
  45. package/dist/machines/Struct.js +15 -0
  46. package/dist/machines/Struct.js.map +1 -0
  47. package/dist/machines/index.js +5 -0
  48. package/dist/machines/index.js.map +1 -0
  49. package/dist/machines/of.js +10 -0
  50. package/dist/machines/of.js.map +1 -0
  51. package/dist/react/context.js +19 -0
  52. package/dist/react/context.js.map +1 -0
  53. package/dist/react/index.js +4 -0
  54. package/dist/react/index.js.map +1 -0
  55. package/dist/react/useSelector.js +9 -0
  56. package/dist/react/useSelector.js.map +1 -0
  57. package/dist/react/useStateMachine.js +25 -0
  58. package/dist/react/useStateMachine.js.map +1 -0
  59. package/dist/runtime/index.js +26 -0
  60. package/dist/runtime/index.js.map +1 -0
  61. package/package.json +33 -9
  62. package/src/StateMachine.ts +5 -3
  63. package/src/form/index.ts +1 -1
  64. package/src/index.ts +1 -1
  65. package/src/machines/Form.test.ts +3 -4
  66. package/src/machines/Form.ts +2 -2
  67. package/src/machines/FormValue.test.ts +3 -4
  68. package/src/machines/FormValue.ts +1 -1
  69. package/src/machines/Struct.test.ts +15 -14
  70. package/src/machines/Struct.ts +6 -20
  71. package/src/machines/index.ts +4 -4
  72. package/src/machines/of.test.ts +3 -4
  73. package/src/machines/of.ts +1 -1
  74. package/src/react/context.tsx +2 -2
  75. package/src/react/index.ts +3 -3
  76. package/src/react/useSelector.ts +1 -1
  77. package/src/react/useStateMachine.ts +1 -1
  78. package/src/runtime/index.ts +1 -1
  79. package/.eslintrc.js +0 -34
  80. package/.eslintrc.production.js +0 -11
  81. package/.prettierrc +0 -9
  82. package/pnpm-workspace.yaml +0 -2
  83. package/tsconfig.json +0 -14
  84. package/vitest.config.ts +0 -5
@@ -0,0 +1,4 @@
1
+ export { make } from './definition.js';
2
+ export * from './machines/index.js';
3
+ export { run } from './runtime/index.js';
4
+ //# sourceMappingURL=StateMachine.js.map
@@ -0,0 +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"}
@@ -0,0 +1,12 @@
1
+ import { Optic } from '@matheuspuel/optic';
2
+ export const makeStore = (base) => ({
3
+ ...base,
4
+ zoom: zoomF => ({
5
+ get: () => zoomF(Optic.id()).get(base.get()),
6
+ getOption: () => zoomF(Optic.id()).getOption(base.get()),
7
+ update: f => base.update(zoomF(Optic.id()).update(f)),
8
+ }),
9
+ });
10
+ export const make = () => (args) => args;
11
+ export const prepareActions = (machine, store) => machine.actions({ Store: store });
12
+ //# sourceMappingURL=definition.js.map
@@ -0,0 +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"}
@@ -0,0 +1,6 @@
1
+ export { make } from './definition.js';
2
+ export type { StateMachine } from './definition.js';
3
+ export * from './machines/index.js';
4
+ export { run } from './runtime/index.js';
5
+ export type { Instance } from './runtime/index.js';
6
+ //# sourceMappingURL=StateMachine.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,28 @@
1
+ import { Optic } from '@matheuspuel/optic';
2
+ export type StoreBase<State> = {
3
+ get: () => State;
4
+ update: (stateUpdate: (_: State) => State) => void;
5
+ };
6
+ export type Store<State> = StoreBase<State> & {
7
+ zoom: <A, Optional extends boolean>(f: (optic: Optic<State, State>) => Optic<A, State, Optional>) => StoreBase<A>;
8
+ };
9
+ export declare const makeStore: <State>(base: StoreBase<State>) => Store<State>;
10
+ export type StateAction<A extends unknown[], B> = (...args: A) => B;
11
+ export type AnyStateAction = StateAction<any[], unknown>;
12
+ export type AnyStateActions = {
13
+ [key: string]: AnyStateAction | AnyStateActions;
14
+ };
15
+ export type StateMachine<State, Actions extends AnyStateActions> = {
16
+ initialState: State;
17
+ actions: (machine: {
18
+ Store: Store<State>;
19
+ }) => Actions;
20
+ start?: (machine: {
21
+ Store: Store<State>;
22
+ }) => undefined | Promise<unknown>;
23
+ onUpdate?: (state: State) => void | Promise<void>;
24
+ };
25
+ export declare const make: <State>() => <Actions extends AnyStateActions>(args: StateMachine<State, Actions>) => StateMachine<State, Actions>;
26
+ export type PreparedStateActions<Actions extends AnyStateActions> = Actions;
27
+ export declare const prepareActions: <State, Actions extends AnyStateActions>(machine: StateMachine<State, Actions>, store: Store<State>) => PreparedStateActions<Actions>;
28
+ //# sourceMappingURL=definition.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,20 @@
1
+ import { Effect, Schema } from 'effect';
2
+ import { ParseError } from 'effect/ParseResult';
3
+ export type AnyForm = {
4
+ [key: string]: AnyForm | FormField<any, any, any>;
5
+ };
6
+ export type FormField<A, I, E> = {
7
+ initial: I;
8
+ validate: (value: I) => Effect.Effect<A, E>;
9
+ fromData: (data: A) => I;
10
+ };
11
+ export declare const field: <A, I, E>(args: FormField<A, I, E>) => FormField<A, I, E>;
12
+ export declare const fieldSchema: <A, I>(args: {
13
+ initial: I;
14
+ schema: Schema.Schema<A, I>;
15
+ }) => FormField<A, I, ParseError>;
16
+ export declare const fieldSuccess: <A>(args: {
17
+ initial: A;
18
+ }) => FormField<A, A, never>;
19
+ export declare const Struct: <Fields extends AnyForm>(fields: Fields) => Fields;
20
+ //# sourceMappingURL=definition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../../src/form/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAE/C,MAAM,MAAM,OAAO,GAAG;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;CAClD,CAAA;AAED,MAAM,MAAM,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI;IAC/B,OAAO,EAAE,CAAC,CAAA;IACV,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAC3C,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAA;CACzB,CAAA;AAED,eAAO,MAAM,KAAK,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,uBAAS,CAAA;AAEhE,eAAO,MAAM,WAAW,GAAI,CAAC,EAAE,CAAC,EAAE,MAAM;IACtC,OAAO,EAAE,CAAC,CAAA;IACV,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;CAC5B,gCAKG,CAAA;AAEJ,eAAO,MAAM,YAAY,GAAI,CAAC,EAAE,MAAM;IAAE,OAAO,EAAE,CAAC,CAAA;CAAE,2BAKhD,CAAA;AAEJ,eAAO,MAAM,MAAM,GAAI,MAAM,SAAS,OAAO,EAAE,QAAQ,MAAM,WAAW,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * as Form from './definition.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/form/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * as StateMachine from './StateMachine.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAA"}
@@ -0,0 +1,28 @@
1
+ import { Effect, Option } from 'effect';
2
+ import { AnyForm, FormField } from '../form/definition.js';
3
+ export type FormState<Form extends AnyForm> = {
4
+ [K in keyof Form]: Form[K] extends FormField<infer A, infer I, infer E> ? {
5
+ value: I;
6
+ error: E | null;
7
+ } : Form[K] extends AnyForm ? FormState<Form[K]> : never;
8
+ };
9
+ export type FormData<Form extends AnyForm> = {
10
+ [K in keyof Form]: Form[K] extends FormField<infer A, infer I, infer E> ? A : Form[K] extends AnyForm ? FormData<Form[K]> : never;
11
+ };
12
+ export type FormError<Form extends AnyForm> = {
13
+ [K in keyof Form]: Form[K] extends FormField<infer A, infer I, infer E> ? Option.Option<E> : Form[K] extends AnyForm ? FormError<Form[K]> : never;
14
+ };
15
+ export type FormActions<Form extends AnyForm> = {
16
+ [K in keyof Form]: Form[K] extends FormField<infer A, infer I, infer E> ? {
17
+ set: (value: I) => void;
18
+ update: (f: (previous: I) => I) => void;
19
+ error: {
20
+ set: (error: E | null) => void;
21
+ };
22
+ } : Form[K] extends AnyForm ? FormActions<Form[K]> : never;
23
+ };
24
+ 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>>;
26
+ setStateFromData: (data: FormData<F>) => void;
27
+ }>;
28
+ //# sourceMappingURL=Form.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,12 @@
1
+ export type FormValue<A, E> = {
2
+ value: A;
3
+ error: E | null;
4
+ };
5
+ export declare const FormValue: <A, E>(initialValue: A) => import("../definition.js").StateMachine<FormValue<A, E>, {
6
+ update: (f: (previous: A) => A) => void;
7
+ set: (value: A) => void;
8
+ error: {
9
+ set: (error: E | null) => void;
10
+ };
11
+ }>;
12
+ //# sourceMappingURL=FormValue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormValue.d.ts","sourceRoot":"","sources":["../../../src/machines/FormValue.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,SAAS,CAAC,CAAC,EAAE,CAAC,IAAI;IAAE,KAAK,EAAE,CAAC,CAAC;IAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAA;CAAE,CAAA;AAE3D,eAAO,MAAM,SAAS,GAAI,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC;gBAI7B,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC;iBAEjB,CAAC;;qBAEC,CAAC,GAAG,IAAI;;EAIzB,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { AnyStateActions, StateMachine } from '../definition.js';
2
+ export declare const Struct: <A extends Record<string, StateMachine<any, AnyStateActions>>>(fields: A) => StateMachine<{ [K in keyof A]: A[K] extends StateMachine<infer State, any> ? State : never; }, { [K_1 in keyof A]: A[K_1] extends StateMachine<any, infer Actions extends AnyStateActions> ? Actions : never; }>;
3
+ //# sourceMappingURL=Struct.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,5 @@
1
+ export { Form } from './Form.js';
2
+ export { FormValue } from './FormValue.js';
3
+ export { of } from './of.js';
4
+ export { Struct } from './Struct.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/machines/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,6 @@
1
+ export declare const of: <A>(initialState: A) => import("../definition.js").StateMachine<A, {
2
+ get: () => A;
3
+ update: (f: (previous: A) => A) => void;
4
+ set: (value: A) => void;
5
+ }>;
6
+ //# sourceMappingURL=of.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"of.d.ts","sourceRoot":"","sources":["../../../src/machines/of.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,EAAE,GAAI,CAAC,EAAE,cAAc,CAAC;;gBAKnB,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC;iBACjB,CAAC;EAEhB,CAAA"}
@@ -0,0 +1,10 @@
1
+ import * as React from 'react';
2
+ import { AnyStateActions, StateMachine } from '../definition.js';
3
+ export declare const makeStateMachineContext: <State, Actions extends AnyStateActions>(machine: StateMachine<State, Actions>) => {
4
+ Provider: (props: {
5
+ children: React.ReactNode;
6
+ }) => import("react/jsx-runtime").JSX.Element;
7
+ useActions: () => Actions;
8
+ useSelector: <A>(fn: (state: State) => A) => A;
9
+ };
10
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/react/context.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EACL,eAAe,EAEf,YAAY,EACb,MAAM,kBAAkB,CAAA;AAGzB,eAAO,MAAM,uBAAuB,GAAI,KAAK,EAAE,OAAO,SAAS,eAAe,EAC5E,SAAS,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC;sBAQjB;QAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;KAAE;;kBAKjC,CAAC,MAAO,CAAC,KAAK,EAAE,KAAK,KAAK,CAAC;CAM5C,CAAA"}
@@ -0,0 +1,4 @@
1
+ export * from './context.js';
2
+ export * from './useSelector.js';
3
+ export * from './useStateMachine.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA;AAChC,cAAc,sBAAsB,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { Equivalence } from 'effect';
2
+ import { AnyStateActions } from '../definition.js';
3
+ import { Instance } from '../runtime/index.js';
4
+ export declare const makeUseSelector: <State, Actions extends AnyStateActions>(stateMachine: Instance<State, Actions>) => <A>(selector: (state: State) => A, equivalence?: Equivalence.Equivalence<A>) => A;
5
+ //# sourceMappingURL=useSelector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSelector.d.ts","sourceRoot":"","sources":["../../../src/react/useSelector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,WAAW,EAAE,MAAM,QAAQ,CAAA;AAEnD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAE9C,eAAO,MAAM,eAAe,GACzB,KAAK,EAAE,OAAO,SAAS,eAAe,EACrC,cAAc,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,MAEvC,CAAC,EACA,UAAU,CAAC,KAAK,EAAE,KAAK,KAAK,CAAC,EAC7B,cAAc,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,KACvC,CAYA,CAAA"}
@@ -0,0 +1,6 @@
1
+ import { AnyStateActions, StateMachine } from '../definition.js';
2
+ export declare const useStateMachine: <State, Actions extends AnyStateActions>(stateMachine: StateMachine<State, Actions> | (() => StateMachine<State, Actions>)) => {
3
+ state: State;
4
+ actions: Actions;
5
+ };
6
+ //# sourceMappingURL=useStateMachine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStateMachine.d.ts","sourceRoot":"","sources":["../../../src/react/useStateMachine.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EAGf,YAAY,EACb,MAAM,kBAAkB,CAAA;AAEzB,eAAO,MAAM,eAAe,GAAI,KAAK,EAAE,OAAO,SAAS,eAAe,EACpE,cACI,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,GAC5B,CAAC,MAAM,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;;;CA8BzC,CAAA"}
@@ -0,0 +1,14 @@
1
+ import { Effect, Ref } from 'effect';
2
+ import { AnyStateActions, PreparedStateActions, StateMachine } from '../definition.js';
3
+ type SubscriptionTask<State> = (state: State) => Effect.Effect<void>;
4
+ export type Instance<State, Actions extends AnyStateActions> = {
5
+ ref: Ref.Ref<State>;
6
+ actions: PreparedStateActions<Actions>;
7
+ startPromise: Promise<unknown> | undefined;
8
+ subscribe: (task: SubscriptionTask<State>) => Effect.Effect<{
9
+ unsubscribe: Effect.Effect<void, never, never>;
10
+ }, never, never>;
11
+ };
12
+ export declare const run: <State, Actions extends AnyStateActions>(machine: StateMachine<State, Actions>) => Instance<State, Actions>;
13
+ export {};
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAA;AAC3C,OAAO,EACL,eAAe,EAGf,oBAAoB,EACpB,YAAY,EACb,MAAM,kBAAkB,CAAA;AAEzB,KAAK,gBAAgB,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;AAEpE,MAAM,MAAM,QAAQ,CAAC,KAAK,EAAE,OAAO,SAAS,eAAe,IAAI;IAC7D,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IACnB,OAAO,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAA;IACtC,YAAY,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,SAAS,CAAA;IAC1C,SAAS,EAAE,CACT,IAAI,EAAE,gBAAgB,CAAC,KAAK,CAAC,KAC1B,MAAM,CAAC,MAAM,CAChB;QAAE,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;KAAE,EAClD,KAAK,EACL,KAAK,CACN,CAAA;CACF,CAAA;AAED,eAAO,MAAM,GAAG,GAAI,KAAK,EAAE,OAAO,SAAS,eAAe,EACxD,SAAS,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,KACpC,QAAQ,CAAC,KAAK,EAAE,OAAO,CA6BzB,CAAA"}
@@ -0,0 +1,14 @@
1
+ import { Effect, Schema } from 'effect';
2
+ export const field = (args) => args;
3
+ export const fieldSchema = (args) => field({
4
+ initial: args.initial,
5
+ validate: Schema.decode(args.schema),
6
+ fromData: Schema.encodeSync(args.schema),
7
+ });
8
+ export const fieldSuccess = (args) => field({
9
+ initial: args.initial,
10
+ validate: Effect.succeed,
11
+ fromData: _ => _,
12
+ });
13
+ export const Struct = (fields) => fields;
14
+ //# sourceMappingURL=definition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.js","sourceRoot":"","sources":["../../src/form/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAavC,MAAM,CAAC,MAAM,KAAK,GAAG,CAAU,IAAwB,EAAE,EAAE,CAAC,IAAI,CAAA;AAEhE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAO,IAGjC,EAAE,EAAE,CACH,KAAK,CAAmB;IACtB,OAAO,EAAE,IAAI,CAAC,OAAO;IACrB,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;IACpC,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;CACzC,CAAC,CAAA;AAEJ,MAAM,CAAC,MAAM,YAAY,GAAG,CAAI,IAAoB,EAAE,EAAE,CACtD,KAAK,CAAc;IACjB,OAAO,EAAE,IAAI,CAAC,OAAO;IACrB,QAAQ,EAAE,MAAM,CAAC,OAAO;IACxB,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;CACjB,CAAC,CAAA;AAEJ,MAAM,CAAC,MAAM,MAAM,GAAG,CAAyB,MAAc,EAAE,EAAE,CAAC,MAAM,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * as Form from './definition.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/form/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export * as StateMachine from './StateMachine.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAA"}
@@ -0,0 +1,47 @@
1
+ import { Effect, Either, Option, Record } from 'effect';
2
+ import { make, makeStore } from '../definition.js';
3
+ const isField = (value) => typeof value.validate === 'function';
4
+ export const Form = (form) => {
5
+ const getInitialState = (form) => Record.map(form, _ => isField(_) ? { value: _.initial, error: null } : getInitialState(_));
6
+ const getActions = (form, Store) => Record.map(form, (_, key) => isField(_)
7
+ ? {
8
+ update: (f) => Store.update(_ => ({
9
+ ..._,
10
+ [key]: { value: f(_[key].value), error: null },
11
+ })),
12
+ set: (value) => Store.update(_ => ({ ..._, [key]: { value, error: null } })),
13
+ error: {
14
+ set: (error) => Store.update(_ => ({ ..._, [key]: { value: _.value, error } })),
15
+ },
16
+ }
17
+ : getActions(_, makeStore({
18
+ get: () => Store.get()[key],
19
+ update: f => Store.update(_ => ({ ..._, [key]: f(_[key]) })),
20
+ })));
21
+ const validate = (form, Store) => Effect.all(Record.map(form, (_, key) => isField(_)
22
+ ? _.validate(Store.get()[key].value).pipe(Effect.either, Effect.tap(e => Store.update(_ => ({
23
+ ..._,
24
+ [key]: {
25
+ value: _[key].value,
26
+ error: Option.getOrNull(Either.getLeft(e)),
27
+ },
28
+ }))), Effect.flatten)
29
+ : validate(_, makeStore({
30
+ get: () => Store.get()[key],
31
+ update: f => Store.update(_ => ({ ..._, [key]: f(_[key]) })),
32
+ }))), { mode: 'validate' });
33
+ return make()({
34
+ initialState: getInitialState(form),
35
+ actions: ({ Store }) => ({
36
+ ...getActions(form, Store),
37
+ validate: () => validate(form, Store),
38
+ setStateFromData: (data) => Store.update(() => {
39
+ const updateState = (form, data) => Record.map(form, (_, key) => isField(_)
40
+ ? { value: _.fromData(data[key]), error: null }
41
+ : updateState(_, data[key]));
42
+ return updateState(form, data);
43
+ }),
44
+ }),
45
+ });
46
+ };
47
+ //# sourceMappingURL=Form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Form.js","sourceRoot":"","sources":["../../src/machines/Form.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { make } from '../definition.js';
2
+ export const FormValue = (initialValue) => make()({
3
+ initialState: { value: initialValue, error: null },
4
+ actions: ({ Store }) => ({
5
+ update: (f) => Store.update(_ => ({ value: f(_.value), error: null })),
6
+ set: (value) => Store.update(() => ({ value, error: null })),
7
+ error: {
8
+ set: (error) => Store.update(_ => ({ value: _.value, error })),
9
+ },
10
+ }),
11
+ });
12
+ //# sourceMappingURL=FormValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormValue.js","sourceRoot":"","sources":["../../src/machines/FormValue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAIvC,MAAM,CAAC,MAAM,SAAS,GAAG,CAAO,YAAe,EAAE,EAAE,CACjD,IAAI,EAAmB,CAAC;IACtB,YAAY,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE;IAClD,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACvB,MAAM,EAAE,CAAC,CAAqB,EAAE,EAAE,CAChC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,GAAG,EAAE,CAAC,KAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,KAAK,EAAE;YACL,GAAG,EAAE,CAAC,KAAe,EAAE,EAAE,CACvB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;SACjD;KACF,CAAC;CACH,CAAC,CAAA"}
@@ -0,0 +1,15 @@
1
+ import { Record } from 'effect';
2
+ import { make, makeStore, } from '../definition.js';
3
+ export const Struct = (fields) => make()({
4
+ initialState: Record.map(fields, _ => _.initialState),
5
+ actions: ({ Store }) => ({
6
+ ...Record.map(fields, (_, key) => _.actions({
7
+ Store: makeStore({
8
+ get: () => Store.get()[key],
9
+ update: f => Store.update(_ => ({ ..._, [key]: f(_[key]) })),
10
+ }),
11
+ })),
12
+ }),
13
+ // TODO implement other options
14
+ });
15
+ //# sourceMappingURL=Struct.js.map
@@ -0,0 +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"}
@@ -0,0 +1,5 @@
1
+ export { Form } from './Form.js';
2
+ export { FormValue } from './FormValue.js';
3
+ export { of } from './of.js';
4
+ export { Struct } from './Struct.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/machines/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,10 @@
1
+ import { make } from '../definition.js';
2
+ export const of = (initialState) => make()({
3
+ initialState,
4
+ actions: ({ Store }) => ({
5
+ get: Store.get,
6
+ update: (f) => Store.update(f),
7
+ set: (value) => Store.update(() => value),
8
+ }),
9
+ });
10
+ //# sourceMappingURL=of.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"of.js","sourceRoot":"","sources":["../../src/machines/of.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAEvC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAI,YAAe,EAAE,EAAE,CACvC,IAAI,EAAK,CAAC;IACR,YAAY;IACZ,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACvB,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,MAAM,EAAE,CAAC,CAAqB,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QAClD,GAAG,EAAE,CAAC,KAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;KAC7C,CAAC;CACH,CAAC,CAAA"}
@@ -0,0 +1,19 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from 'react';
3
+ import { useStateMachine } from './useStateMachine.js';
4
+ export const makeStateMachineContext = (machine) => {
5
+ const Context = React.createContext(undefined);
6
+ return {
7
+ Provider: (props) => {
8
+ const value = useStateMachine(machine);
9
+ return _jsx(Context.Provider, { value: value, children: props.children });
10
+ },
11
+ useActions: () => React.useContext(Context).actions,
12
+ useSelector: (fn) => {
13
+ const state = React.useContext(Context).state;
14
+ // eslint-disable-next-line react-hooks/exhaustive-deps
15
+ return React.useMemo(() => fn(state), [state]);
16
+ },
17
+ };
18
+ };
19
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/react/context.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAM9B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEtD,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,OAAqC,EACrC,EAAE;IACF,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAIhC,SAAgB,CAAC,CAAA;IACpB,OAAO;QACL,QAAQ,EAAE,CAAC,KAAoC,EAAE,EAAE;YACjD,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,CAAA;YACtC,OAAO,KAAC,OAAO,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,KAAK,CAAC,QAAQ,GAAoB,CAAA;QAC5E,CAAC;QACD,UAAU,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,OAAO;QACnD,WAAW,EAAE,CAAK,EAAuB,EAAE,EAAE;YAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,KAAK,CAAA;YAC7C,uDAAuD;YACvD,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;QAChD,CAAC;KACF,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,4 @@
1
+ export * from './context.js';
2
+ export * from './useSelector.js';
3
+ export * from './useStateMachine.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA;AAChC,cAAc,sBAAsB,CAAA"}
@@ -0,0 +1,9 @@
1
+ import { Effect, Equal } from 'effect';
2
+ import { useSyncExternalStoreWithSelector } from 'use-sync-external-store/with-selector';
3
+ export const makeUseSelector = (stateMachine) => (selector, equivalence) => useSyncExternalStoreWithSelector(onChange => {
4
+ const subscription = stateMachine
5
+ .subscribe(() => Effect.sync(onChange))
6
+ .pipe(Effect.runSync);
7
+ return () => subscription.unsubscribe.pipe(Effect.runSync);
8
+ }, () => stateMachine.ref.get.pipe(Effect.runSync), undefined, selector, equivalence ?? Equal.equivalence());
9
+ //# sourceMappingURL=useSelector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSelector.js","sourceRoot":"","sources":["../../src/react/useSelector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAe,MAAM,QAAQ,CAAA;AACnD,OAAO,EAAE,gCAAgC,EAAE,MAAM,uCAAuC,CAAA;AAIxF,MAAM,CAAC,MAAM,eAAe,GAC1B,CACE,YAAsC,EACtC,EAAE,CACJ,CACE,QAA6B,EAC7B,WAAwC,EACrC,EAAE,CACL,gCAAgC,CAC9B,QAAQ,CAAC,EAAE;IACT,MAAM,YAAY,GAAG,YAAY;SAC9B,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SACtC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACvB,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;AAC5D,CAAC,EACD,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAC/C,SAAS,EACT,QAAQ,EACR,WAAW,IAAI,KAAK,CAAC,WAAW,EAAK,CACtC,CAAA"}
@@ -0,0 +1,25 @@
1
+ import * as React from 'react';
2
+ import { makeStore, prepareActions, } from '../definition.js';
3
+ export const useStateMachine = (stateMachine) => {
4
+ const machine = typeof stateMachine === 'function' ? stateMachine() : stateMachine;
5
+ const [state, setState] = React.useState(() => machine.initialState);
6
+ const stateRef = React.useRef(machine.initialState);
7
+ const getState = React.useMemo(() => () => stateRef.current, []);
8
+ const store = React.useMemo(() => makeStore({
9
+ get: getState,
10
+ update: fn => {
11
+ const previousState = getState();
12
+ const state = fn(previousState);
13
+ stateRef.current = state;
14
+ void machine.onUpdate?.(state);
15
+ setState(() => state);
16
+ },
17
+ }), [machine, getState]);
18
+ const actions = React.useMemo(() => prepareActions(machine, store), [machine, store]);
19
+ React.useEffect(() => {
20
+ void machine.start?.({ Store: store });
21
+ // eslint-disable-next-line react-hooks/exhaustive-deps
22
+ }, []);
23
+ return { state, actions };
24
+ };
25
+ //# sourceMappingURL=useStateMachine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStateMachine.js","sourceRoot":"","sources":["../../src/react/useStateMachine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAEL,SAAS,EACT,cAAc,GAEf,MAAM,kBAAkB,CAAA;AAEzB,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,YAEwC,EACxC,EAAE;IACF,MAAM,OAAO,GACX,OAAO,YAAY,KAAK,UAAU,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,YAAY,CAAA;IACpE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;IACpE,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;IACnD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;IAChE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CACzB,GAAG,EAAE,CACH,SAAS,CAAQ;QACf,GAAG,EAAE,QAAQ;QACb,MAAM,EAAE,EAAE,CAAC,EAAE;YACX,MAAM,aAAa,GAAG,QAAQ,EAAE,CAAA;YAChC,MAAM,KAAK,GAAG,EAAE,CAAC,aAAa,CAAC,CAAA;YAC/B,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAA;YACxB,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAA;YAC9B,QAAQ,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAA;QACvB,CAAC;KACF,CAAC,EACJ,CAAC,OAAO,EAAE,QAAQ,CAAC,CACpB,CAAA;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAC3B,GAAG,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,EACpC,CAAC,OAAO,EAAE,KAAK,CAAC,CACjB,CAAA;IACD,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;QACtC,uDAAuD;IACzD,CAAC,EAAE,EAAE,CAAC,CAAA;IACN,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAA;AAC3B,CAAC,CAAA"}
@@ -0,0 +1,26 @@
1
+ import { Array, Effect, Ref } from 'effect';
2
+ import { makeStore, prepareActions, } from '../definition.js';
3
+ export const run = (machine) => {
4
+ const subscriptionsRef = Ref.unsafeMake([]);
5
+ const ref = Ref.unsafeMake(machine.initialState);
6
+ const store = makeStore({
7
+ get: () => ref.get.pipe(Effect.runSync),
8
+ update: fn => Effect.gen(function* () {
9
+ const previousState = yield* ref.get;
10
+ const state = fn(previousState);
11
+ yield* Ref.set(ref, state);
12
+ yield* Effect.forEach(yield* subscriptionsRef.get, _ => _(state)).pipe(Effect.exit);
13
+ void machine.onUpdate?.(state);
14
+ }).pipe(Effect.runSync),
15
+ });
16
+ const actions = prepareActions(machine, store);
17
+ const subscribe = (task) => Effect.gen(function* () {
18
+ yield* Ref.update(subscriptionsRef, Array.append(task));
19
+ return {
20
+ unsubscribe: Ref.update(subscriptionsRef, Array.filter(_ => _ !== task)),
21
+ };
22
+ });
23
+ const startPromise = machine.start?.({ Store: store });
24
+ return { ref, actions, subscribe, startPromise };
25
+ };
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAA;AAC3C,OAAO,EAEL,SAAS,EACT,cAAc,GAGf,MAAM,kBAAkB,CAAA;AAiBzB,MAAM,CAAC,MAAM,GAAG,GAAG,CACjB,OAAqC,EACX,EAAE;IAC5B,MAAM,gBAAgB,GAAG,GAAG,CAAC,UAAU,CAA4B,EAAE,CAAC,CAAA;IACtE,MAAM,GAAG,GAAG,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;IAChD,MAAM,KAAK,GAAG,SAAS,CAAQ;QAC7B,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QACvC,MAAM,EAAE,EAAE,CAAC,EAAE,CACX,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAA;YACpC,MAAM,KAAK,GAAG,EAAE,CAAC,aAAa,CAAC,CAAA;YAC/B,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;YAC1B,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CACpE,MAAM,CAAC,IAAI,CACZ,CAAA;YACD,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAA;QAChC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;KAC1B,CAAC,CAAA;IACF,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IAC9C,MAAM,SAAS,GAAG,CAAC,IAA6B,EAAE,EAAE,CAClD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,gBAAgB,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;QACvD,OAAO;YACL,WAAW,EAAE,GAAG,CAAC,MAAM,CACrB,gBAAgB,EAChB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAC9B;SACF,CAAA;IACH,CAAC,CAAC,CAAA;IACJ,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;IACtD,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,CAAA;AAClD,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,25 +1,47 @@
1
1
  {
2
2
  "name": "@matheuspuel/state-machine",
3
- "version": "0.2.2",
3
+ "version": "0.3.0",
4
4
  "type": "module",
5
- "module": "index.ts",
5
+ "files": [
6
+ "/dist",
7
+ "/src"
8
+ ],
6
9
  "exports": {
7
10
  "./package.json": "./package.json",
8
- ".": "./src/index.ts",
9
- "./definition": "./src/definition.ts",
10
- "./form": "./src/form/index.ts",
11
- "./machines": "./src/machines/index.ts",
12
- "./react": "./src/react/index.ts",
13
- "./runtime": "./src/runtime/index.ts"
11
+ ".": {
12
+ "types": "./dist/dts/index.d.ts",
13
+ "default": "./dist/index.js"
14
+ },
15
+ "./definition": {
16
+ "types": "./dist/dts/definition.d.ts",
17
+ "default": "./dist/definition.js"
18
+ },
19
+ "./form": {
20
+ "types": "./dist/dts/form/index.d.ts",
21
+ "default": "./dist/form/index.js"
22
+ },
23
+ "./machines": {
24
+ "types": "./dist/dts/machines/index.d.ts",
25
+ "default": "./dist/machines/index.js"
26
+ },
27
+ "./react": {
28
+ "types": "./dist/dts/react/index.d.ts",
29
+ "default": "./dist/react/index.js"
30
+ },
31
+ "./runtime": {
32
+ "types": "./dist/dts/runtime/index.d.ts",
33
+ "default": "./dist/runtime/index.js"
34
+ }
14
35
  },
15
36
  "scripts": {
37
+ "build": "tsc -b tsconfig.build.json",
16
38
  "lint": "eslint . --max-warnings 0 --config .eslintrc.production.js",
17
39
  "lint:fix": "eslint . --fix --config .eslintrc.production.js",
18
40
  "typecheck": "tsc",
19
41
  "test": "vitest"
20
42
  },
21
43
  "dependencies": {
22
- "@matheuspuel/optic": "^0.1.0",
44
+ "@matheuspuel/optic": "^0.2.0",
23
45
  "effect": "^3.18.1",
24
46
  "react": "19.1.0",
25
47
  "use-sync-external-store": "^1.5.0"
@@ -27,6 +49,8 @@
27
49
  "devDependencies": {
28
50
  "@effect/language-service": "^0.41.1",
29
51
  "@effect/vitest": "^0.26.0",
52
+ "@matheuspuel/state-machine": "file:.",
53
+ "@types/node": "^25.0.8",
30
54
  "@types/react": "~19.1.17",
31
55
  "@types/use-sync-external-store": "^1.5.0",
32
56
  "@typescript-eslint/parser": "^8.29.1",
@@ -1,3 +1,5 @@
1
- export { make, StateMachine } from './definition'
2
- export * from './machines'
3
- export { Instance, run } from './runtime'
1
+ export { make } from './definition.js'
2
+ export type { StateMachine } from './definition.js'
3
+ export * from './machines/index.js'
4
+ export { run } from './runtime/index.js'
5
+ export type { Instance } from './runtime/index.js'
package/src/form/index.ts CHANGED
@@ -1 +1 @@
1
- export * as Form from './definition'
1
+ export * as Form from './definition.js'
package/src/index.ts CHANGED
@@ -1 +1 @@
1
- export * as StateMachine from './StateMachine'
1
+ export * as StateMachine from './StateMachine.js'
@@ -1,8 +1,7 @@
1
1
  import { describe, expect, it } from '@effect/vitest'
2
+ import { StateMachine } from '@matheuspuel/state-machine'
3
+ import { Form } from '@matheuspuel/state-machine/form'
2
4
  import { Effect } from 'effect'
3
- import { StateMachine } from '..'
4
- import { Form } from '../form'
5
- import { run } from '../runtime'
6
5
 
7
6
  describe('Form', () => {
8
7
  it('should work', () => {
@@ -17,7 +16,7 @@ describe('Form', () => {
17
16
  b: Form.Struct({ c: formField }),
18
17
  })
19
18
  const machine = StateMachine.Form(form)
20
- const instance = run(machine)
19
+ const instance = StateMachine.run(machine)
21
20
  const getState = () => instance.ref.get.pipe(Effect.runSync)
22
21
  expect(getState()).toStrictEqual<ReturnType<typeof getState>>({
23
22
  a: { value: 0, error: null },
@@ -1,6 +1,6 @@
1
1
  import { Effect, Either, Option, Record } from 'effect'
2
- import { make, makeStore, Store } from '../definition'
3
- import { AnyForm, FormField } from '../form/definition'
2
+ import { make, makeStore, Store } from '../definition.js'
3
+ import { AnyForm, FormField } from '../form/definition.js'
4
4
 
5
5
  export type FormState<Form extends AnyForm> = {
6
6
  [K in keyof Form]: Form[K] extends FormField<infer A, infer I, infer E>
@@ -1,12 +1,11 @@
1
1
  import { describe, expect, it } from '@effect/vitest'
2
+ import { StateMachine } from '@matheuspuel/state-machine'
2
3
  import { Effect } from 'effect'
3
- import { run } from '../runtime'
4
- import { FormValue } from './FormValue'
5
4
 
6
5
  describe('FormValue', () => {
7
6
  it('should work', () => {
8
- const machine = FormValue<number, string>(0)
9
- const instance = run(machine)
7
+ const machine = StateMachine.FormValue<number, string>(0)
8
+ const instance = StateMachine.run(machine)
10
9
  const getState = () => instance.ref.get.pipe(Effect.runSync)
11
10
  expect(getState()).toStrictEqual({ value: 0, error: null })
12
11
  instance.actions.set(1)
@@ -1,4 +1,4 @@
1
- import { make } from '../definition'
1
+ import { make } from '../definition.js'
2
2
 
3
3
  export type FormValue<A, E> = { value: A; error: E | null }
4
4
 
@@ -1,23 +1,24 @@
1
1
  import { describe, expect, it } from '@effect/vitest'
2
- import { Effect } from 'effect'
3
- import { run } from '../runtime'
4
- import { Struct } from './Struct'
5
- import { of } from './of'
2
+ import { StateMachine } from '@matheuspuel/state-machine'
3
+ import { Effect, pipe } from 'effect'
6
4
 
7
5
  describe('Struct', () => {
8
6
  it('should work', () => {
9
- const machine = Struct(
10
- {
11
- a: of(0),
12
- b: of(''),
13
- },
14
- {
15
- extraActions: ({ Store }) => ({
16
- get: () => Store.get(),
7
+ const machine = pipe(
8
+ StateMachine.Struct({
9
+ a: StateMachine.of(0),
10
+ b: StateMachine.of(''),
11
+ }),
12
+ base =>
13
+ StateMachine.make<(typeof base)['initialState']>()({
14
+ ...base,
15
+ actions: ({ Store }) => ({
16
+ ...base.actions({ Store }),
17
+ get: () => Store.get(),
18
+ }),
17
19
  }),
18
- },
19
20
  )
20
- const instance = run(machine)
21
+ const instance = StateMachine.run(machine)
21
22
  const getState = () => instance.ref.get.pipe(Effect.runSync)
22
23
  expect(getState()).toStrictEqual({ a: 0, b: '' })
23
24
  instance.actions.a.set(1)
@@ -4,33 +4,20 @@ import {
4
4
  make,
5
5
  makeStore,
6
6
  StateMachine,
7
- Store,
8
- } from '../definition'
7
+ } from '../definition.js'
9
8
 
10
9
  export const Struct = <
11
10
  A extends Record<string, StateMachine<any, AnyStateActions>>,
12
- ExtraActions extends AnyStateActions = {},
13
11
  >(
14
12
  fields: A,
15
- options?: {
16
- extraActions?: (machine: {
17
- Store: Store<{
18
- [K in keyof A]: A[K] extends StateMachine<infer State, any>
19
- ? State
20
- : never
21
- }>
22
- }) => ExtraActions
23
- },
24
13
  ) =>
25
14
  make<{
26
15
  [K in keyof A]: A[K] extends StateMachine<infer State, any> ? State : never
27
- }>()<
28
- {
29
- [K in keyof A]: A[K] extends StateMachine<any, infer Actions>
30
- ? Actions
31
- : never
32
- } & ExtraActions
33
- >({
16
+ }>()<{
17
+ [K in keyof A]: A[K] extends StateMachine<any, infer Actions>
18
+ ? Actions
19
+ : never
20
+ }>({
34
21
  initialState: Record.map(fields, _ => _.initialState) as any,
35
22
  actions: ({ Store }) => ({
36
23
  ...(Record.map(fields, (_, key) =>
@@ -41,7 +28,6 @@ export const Struct = <
41
28
  }) as any,
42
29
  }),
43
30
  ) as any),
44
- ...options?.extraActions?.({ Store }),
45
31
  }),
46
32
  // TODO implement other options
47
33
  })
@@ -1,4 +1,4 @@
1
- export { Form } from './Form'
2
- export { FormValue } from './FormValue'
3
- export { of } from './of'
4
- export { Struct } from './Struct'
1
+ export { Form } from './Form.js'
2
+ export { FormValue } from './FormValue.js'
3
+ export { of } from './of.js'
4
+ export { Struct } from './Struct.js'
@@ -1,12 +1,11 @@
1
1
  import { describe, expect, it } from '@effect/vitest'
2
+ import { StateMachine } from '@matheuspuel/state-machine'
2
3
  import { Effect } from 'effect'
3
- import { run } from '../runtime'
4
- import { of } from './of'
5
4
 
6
5
  describe('of', () => {
7
6
  it('should work', () => {
8
- const machine = of('')
9
- const instance = run(machine)
7
+ const machine = StateMachine.of('')
8
+ const instance = StateMachine.run(machine)
10
9
  instance.actions.set('a')
11
10
  const state = instance.ref.get.pipe(Effect.runSync)
12
11
  expect(state).toStrictEqual('a')
@@ -1,4 +1,4 @@
1
- import { make } from '../definition'
1
+ import { make } from '../definition.js'
2
2
 
3
3
  export const of = <A>(initialState: A) =>
4
4
  make<A>()({
@@ -3,8 +3,8 @@ import {
3
3
  AnyStateActions,
4
4
  PreparedStateActions,
5
5
  StateMachine,
6
- } from '../definition'
7
- import { useStateMachine } from './useStateMachine'
6
+ } from '../definition.js'
7
+ import { useStateMachine } from './useStateMachine.js'
8
8
 
9
9
  export const makeStateMachineContext = <State, Actions extends AnyStateActions>(
10
10
  machine: StateMachine<State, Actions>,
@@ -1,3 +1,3 @@
1
- export * from './context'
2
- export * from './useSelector'
3
- export * from './useStateMachine'
1
+ export * from './context.js'
2
+ export * from './useSelector.js'
3
+ export * from './useStateMachine.js'
@@ -1,7 +1,7 @@
1
1
  import { Effect, Equal, Equivalence } from 'effect'
2
2
  import { useSyncExternalStoreWithSelector } from 'use-sync-external-store/with-selector'
3
3
  import { AnyStateActions } from '../definition.js'
4
- import { Instance } from '../runtime'
4
+ import { Instance } from '../runtime/index.js'
5
5
 
6
6
  export const makeUseSelector =
7
7
  <State, Actions extends AnyStateActions>(
@@ -4,7 +4,7 @@ import {
4
4
  makeStore,
5
5
  prepareActions,
6
6
  StateMachine,
7
- } from '../definition'
7
+ } from '../definition.js'
8
8
 
9
9
  export const useStateMachine = <State, Actions extends AnyStateActions>(
10
10
  stateMachine:
@@ -5,7 +5,7 @@ import {
5
5
  prepareActions,
6
6
  PreparedStateActions,
7
7
  StateMachine,
8
- } from '../definition'
8
+ } from '../definition.js'
9
9
 
10
10
  type SubscriptionTask<State> = (state: State) => Effect.Effect<void>
11
11
 
package/.eslintrc.js DELETED
@@ -1,34 +0,0 @@
1
- module.exports = {
2
- extends: [
3
- 'eslint:recommended',
4
- 'plugin:@typescript-eslint/recommended',
5
- 'plugin:@typescript-eslint/recommended-requiring-type-checking',
6
- 'plugin:@typescript-eslint/strict',
7
- ],
8
- parserOptions: {
9
- tsconfigRootDir: __dirname,
10
- project: ['./tsconfig.json'],
11
- ecmaVersion: 'latest',
12
- sourceType: 'module',
13
- },
14
- ignorePatterns: [
15
- '/.vscode/*',
16
- '/coverage/*',
17
- '/dist/*',
18
- '/experiments/*',
19
- '/node_modules/*',
20
- '.eslintrc.js',
21
- '.eslintrc.production.js',
22
- ],
23
- rules: {
24
- // already checked by typescript
25
- '@typescript-eslint/no-redeclare': 'off',
26
- // warn instead of error
27
- '@typescript-eslint/no-unused-vars': 'warn',
28
- // allow namespace declaration for types
29
- '@typescript-eslint/no-namespace': ['error', { allowDeclarations: true }],
30
- // warn instead of error to prevent covering more specific errors
31
- '@typescript-eslint/no-unsafe-return': 'warn',
32
- '@typescript-eslint/no-unsafe-call': 'warn',
33
- },
34
- }
@@ -1,11 +0,0 @@
1
- const base = require('./.eslintrc.js')
2
-
3
- module.exports = {
4
- ...base,
5
- extends: [...base.extends, 'prettier'],
6
- plugins: [...(base.plugins ?? []), 'prettier'],
7
- rules: {
8
- ...base.rules,
9
- 'prettier/prettier': ['warn'],
10
- },
11
- }
package/.prettierrc DELETED
@@ -1,9 +0,0 @@
1
- {
2
- "semi": false,
3
- "trailingComma": "all",
4
- "arrowParens": "avoid",
5
- "singleQuote": true,
6
- "printWidth": 80,
7
- "tabWidth": 2,
8
- "endOfLine": "lf"
9
- }
@@ -1,2 +0,0 @@
1
- onlyBuiltDependencies:
2
- - esbuild
package/tsconfig.json DELETED
@@ -1,14 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "noEmit": true,
4
- "skipLibCheck": true,
5
- "moduleResolution": "bundler",
6
- "target": "ESNext",
7
- "jsx": "preserve",
8
- "strict": true,
9
- "noUncheckedIndexedAccess": true,
10
- "noFallthroughCasesInSwitch": true,
11
- "plugins": [{ "name": "@effect/language-service" }]
12
- },
13
- "include": ["**/*.ts", "**/*.tsx"]
14
- }
package/vitest.config.ts DELETED
@@ -1,5 +0,0 @@
1
- import { defineConfig } from 'vitest/config'
2
-
3
- export default defineConfig({
4
- test: {},
5
- })