simply-stated 0.1.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/LICENSE +21 -0
- package/README.md +96 -0
- package/dist/adapters/redux-toolkit/collection.d.ts +77 -0
- package/dist/adapters/redux-toolkit/collection.d.ts.map +1 -0
- package/dist/adapters/redux-toolkit/collection.js +86 -0
- package/dist/adapters/redux-toolkit/collection.js.map +1 -0
- package/dist/adapters/redux-toolkit/index.d.ts +3 -0
- package/dist/adapters/redux-toolkit/index.d.ts.map +1 -0
- package/dist/adapters/redux-toolkit/index.js +3 -0
- package/dist/adapters/redux-toolkit/index.js.map +1 -0
- package/dist/adapters/redux-toolkit/shared.d.ts +19 -0
- package/dist/adapters/redux-toolkit/shared.d.ts.map +1 -0
- package/dist/adapters/redux-toolkit/shared.js +23 -0
- package/dist/adapters/redux-toolkit/shared.js.map +1 -0
- package/dist/adapters/redux-toolkit/slice.d.ts +39 -0
- package/dist/adapters/redux-toolkit/slice.d.ts.map +1 -0
- package/dist/adapters/redux-toolkit/slice.js +27 -0
- package/dist/adapters/redux-toolkit/slice.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/simply-stated.d.ts +135 -0
- package/dist/simply-stated.d.ts.map +1 -0
- package/dist/simply-stated.js +76 -0
- package/dist/simply-stated.js.map +1 -0
- package/package.json +56 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Szymon Masłowski
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Simply Stated
|
|
2
|
+
|
|
3
|
+
Strongly typed, declarative utility for state machine modeling.
|
|
4
|
+
|
|
5
|
+
It is **not** a state-management library — it is about **state description**.
|
|
6
|
+
Describe your states and transitions, then drive them with whatever state
|
|
7
|
+
manager you already use.
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install simply-stated
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Quick look
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
import { combineStates, defineState } from 'simply-stated';
|
|
17
|
+
import type { EventOf, StateOf } from 'simply-stated';
|
|
18
|
+
|
|
19
|
+
type Job = {
|
|
20
|
+
id: string;
|
|
21
|
+
data: Buffer;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const workerMachine = combineStates(
|
|
25
|
+
defineState('Idle'),
|
|
26
|
+
defineState('Listening').withData<Date>(),
|
|
27
|
+
defineState('Queued', 'Processing').withData<Job>(),
|
|
28
|
+
defineState('Failed').withData<{ reason: string }>(),
|
|
29
|
+
).createMachine(state => ({
|
|
30
|
+
Idle: {
|
|
31
|
+
started: () => state.Listening(new Date()),
|
|
32
|
+
},
|
|
33
|
+
Listening: {
|
|
34
|
+
consumed: (_, job: Job) => state.Queued(job),
|
|
35
|
+
failed: (
|
|
36
|
+
dateOfStart,
|
|
37
|
+
{ critical, reason }: { critical: boolean; reason: string },
|
|
38
|
+
) => {
|
|
39
|
+
if (critical) return state.Failed({ reason });
|
|
40
|
+
return state.Listening(dateOfStart);
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
Queued: {
|
|
44
|
+
picked: job => state.Processing(job),
|
|
45
|
+
},
|
|
46
|
+
Processing: {},
|
|
47
|
+
Failed: {},
|
|
48
|
+
'*': {
|
|
49
|
+
reset: () => state.Idle(),
|
|
50
|
+
failForced: (reason: string) => state.Failed({ reason }),
|
|
51
|
+
},
|
|
52
|
+
}));
|
|
53
|
+
|
|
54
|
+
const { state } = workerMachine;
|
|
55
|
+
|
|
56
|
+
type MachineState = StateOf<typeof state>;
|
|
57
|
+
let currentState = state.Listening(new Date()) as MachineState;
|
|
58
|
+
|
|
59
|
+
type MachineEvent = EventOf<typeof workerMachine.event>;
|
|
60
|
+
const processEvents = (eventsToProcess: MachineEvent[]) => {
|
|
61
|
+
const nextState = eventsToProcess.reduce(
|
|
62
|
+
workerMachine.transition,
|
|
63
|
+
currentState,
|
|
64
|
+
);
|
|
65
|
+
currentState = nextState;
|
|
66
|
+
return nextState;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
const nextEvent = workerMachine.event.consumed({
|
|
70
|
+
id: '0',
|
|
71
|
+
data: Buffer.from('data'),
|
|
72
|
+
});
|
|
73
|
+
const resultingState = processEvents([nextEvent]);
|
|
74
|
+
|
|
75
|
+
if (currentState.is(state.Queued, state.Processing)) {
|
|
76
|
+
console.info('Job already consumed. Details:', currentState.data);
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Adapters
|
|
81
|
+
|
|
82
|
+
Plug a machine into your state manager:
|
|
83
|
+
|
|
84
|
+
- **Redux Toolkit** — `simply-stated/redux-toolkit` (slice + collection
|
|
85
|
+
adapters). See the
|
|
86
|
+
[adapter docs](https://github.com/szymonmaslowski/simply-stated/blob/main/simply-stated/src/adapters/redux-toolkit/README.md).
|
|
87
|
+
- **Zustand** — _(coming soon)_
|
|
88
|
+
|
|
89
|
+
## Documentation
|
|
90
|
+
|
|
91
|
+
Full API walkthrough and runnable examples:
|
|
92
|
+
[github.com/szymonmaslowski/simply-stated](https://github.com/szymonmaslowski/simply-stated#readme).
|
|
93
|
+
|
|
94
|
+
## License
|
|
95
|
+
|
|
96
|
+
[MIT](./LICENSE)
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { type Comparer, type SliceSelectors } from '@reduxjs/toolkit';
|
|
2
|
+
import type { EntityId as RTKEntityId, EntityState } from '@reduxjs/toolkit';
|
|
3
|
+
import type { Simplify } from 'type-fest';
|
|
4
|
+
import type { AnyMachine } from '../../simply-stated';
|
|
5
|
+
import type { EventPayload, EventReducer, NativeStateOfMachine, NestAt, PlainStateOfMachine, RebindSelectors } from './shared';
|
|
6
|
+
type DataOfMachine<Machine extends AnyMachine> = [
|
|
7
|
+
NativeStateOfMachine<Machine>
|
|
8
|
+
] extends [{
|
|
9
|
+
data: infer D;
|
|
10
|
+
}] ? D : never;
|
|
11
|
+
type PlainEntity<Machine extends AnyMachine, Id extends RTKEntityId, Mode> = Mode extends 'data' ? PlainStateOfMachine<Machine> : Simplify<{
|
|
12
|
+
entityId: Id;
|
|
13
|
+
} & PlainStateOfMachine<Machine>>;
|
|
14
|
+
type NativeEntity<Machine extends AnyMachine, Id extends RTKEntityId, Mode> = Mode extends 'data' ? NativeStateOfMachine<Machine> : Simplify<{
|
|
15
|
+
entityId: Id;
|
|
16
|
+
} & NativeStateOfMachine<Machine>>;
|
|
17
|
+
type CollectionPayload<Id extends RTKEntityId, P> = [P] extends [never] ? {
|
|
18
|
+
entityId: Id;
|
|
19
|
+
} : {
|
|
20
|
+
entityId: Id;
|
|
21
|
+
payload: P;
|
|
22
|
+
};
|
|
23
|
+
type EventReducers<Machine extends AnyMachine, Id extends RTKEntityId, SliceState> = {
|
|
24
|
+
[K in keyof Machine['event']]: EventReducer<SliceState, CollectionPayload<Id, EventPayload<Machine['event'][K]>>>;
|
|
25
|
+
};
|
|
26
|
+
type AddEntityInput<Machine extends AnyMachine, Id extends RTKEntityId, Mode> = Mode extends 'data' ? {
|
|
27
|
+
state: NativeStateOfMachine<Machine>;
|
|
28
|
+
} : {
|
|
29
|
+
entityId: Id;
|
|
30
|
+
state: NativeStateOfMachine<Machine>;
|
|
31
|
+
};
|
|
32
|
+
type LifecycleReducers<Machine extends AnyMachine, Id extends RTKEntityId, SliceState, Mode> = {
|
|
33
|
+
addEntity: {
|
|
34
|
+
reducer: EventReducer<SliceState, PlainEntity<Machine, Id, Mode>>;
|
|
35
|
+
prepare: (input: AddEntityInput<Machine, Id, Mode>) => {
|
|
36
|
+
payload: PlainEntity<Machine, Id, Mode>;
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
removeEntity: EventReducer<SliceState, {
|
|
40
|
+
entityId: Id;
|
|
41
|
+
}>;
|
|
42
|
+
};
|
|
43
|
+
type JointReducers<Machine extends AnyMachine, Id extends RTKEntityId, SliceState, Mode> = EventReducers<Machine, Id, SliceState> & LifecycleReducers<Machine, Id, SliceState, Mode>;
|
|
44
|
+
type BuiltinSelectorName = 'selectIds' | 'selectTotal' | 'selectAllNative' | 'selectNativeEntities' | 'selectNativeById';
|
|
45
|
+
type EntityStateSelectors<Machine extends AnyMachine, Id extends RTKEntityId, SliceState, Mode> = {
|
|
46
|
+
selectIds: (state: SliceState) => Id[];
|
|
47
|
+
selectTotal: (state: SliceState) => number;
|
|
48
|
+
selectAllNative: (state: SliceState) => NativeEntity<Machine, Id, Mode>[];
|
|
49
|
+
selectNativeEntities: (state: SliceState) => Record<Id, NativeEntity<Machine, Id, Mode>>;
|
|
50
|
+
selectNativeById: (state: SliceState, id: Id) => NativeEntity<Machine, Id, Mode> | undefined;
|
|
51
|
+
};
|
|
52
|
+
type CollectionSliceOptions<Machine extends AnyMachine> = {
|
|
53
|
+
nestingPath?: string;
|
|
54
|
+
selectIdFromData?: (data: DataOfMachine<Machine>) => RTKEntityId;
|
|
55
|
+
selectors?: SliceSelectors<Record<RTKEntityId, NativeEntity<Machine, RTKEntityId, 'data' | 'explicit'>>> & Partial<Record<BuiltinSelectorName, never>>;
|
|
56
|
+
sortComparer?: Comparer<NativeEntity<Machine, RTKEntityId, 'data' | 'explicit'>>;
|
|
57
|
+
};
|
|
58
|
+
type ModeFromOptions<O> = O extends {
|
|
59
|
+
selectIdFromData: (...args: never[]) => unknown;
|
|
60
|
+
} ? 'data' : 'explicit';
|
|
61
|
+
type EntityIdFromOptions<O> = O extends {
|
|
62
|
+
selectIdFromData: (...args: never[]) => infer R extends RTKEntityId;
|
|
63
|
+
} ? R : string;
|
|
64
|
+
type NestingPathFromOptions<O> = O extends {
|
|
65
|
+
nestingPath: infer P extends string;
|
|
66
|
+
} ? P : undefined;
|
|
67
|
+
type SelectorsFromOptions<O> = O extends {
|
|
68
|
+
selectors: infer S;
|
|
69
|
+
} ? S : Record<never, never>;
|
|
70
|
+
export declare const toCollectionSliceOptions: <Machine extends AnyMachine, const O extends CollectionSliceOptions<Machine>>(machine: Machine, options?: O) => {
|
|
71
|
+
entityAdapter: import("@reduxjs/toolkit").EntityAdapter<PlainEntity<Machine, EntityIdFromOptions<O>, ModeFromOptions<O>>, EntityIdFromOptions<O>>;
|
|
72
|
+
initialState: NestAt<NestingPathFromOptions<O>, EntityState<PlainEntity<Machine, EntityIdFromOptions<O>, ModeFromOptions<O>>, EntityIdFromOptions<O>>>;
|
|
73
|
+
reducers: JointReducers<Machine, EntityIdFromOptions<O>, NestAt<NestingPathFromOptions<O>, EntityState<PlainEntity<Machine, EntityIdFromOptions<O>, ModeFromOptions<O>>, EntityIdFromOptions<O>>>, ModeFromOptions<O>>;
|
|
74
|
+
selectors: EntityStateSelectors<Machine, EntityIdFromOptions<O>, NestAt<NestingPathFromOptions<O>, EntityState<PlainEntity<Machine, EntityIdFromOptions<O>, ModeFromOptions<O>>, EntityIdFromOptions<O>>>, ModeFromOptions<O>> & RebindSelectors<NestAt<NestingPathFromOptions<O>, EntityState<PlainEntity<Machine, EntityIdFromOptions<O>, ModeFromOptions<O>>, EntityIdFromOptions<O>>>, SelectorsFromOptions<O>> extends infer T ? { [KeyType in keyof T]: T[KeyType]; } : never;
|
|
75
|
+
};
|
|
76
|
+
export {};
|
|
77
|
+
//# sourceMappingURL=collection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../../../src/adapters/redux-toolkit/collection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { createEntityAdapter, } from '@reduxjs/toolkit';
|
|
2
|
+
import { toNativeState, toPlainState, } from '../../simply-stated';
|
|
3
|
+
import { getAtPath, setAtPath, rebindUserSelectors } from './shared';
|
|
4
|
+
export const toCollectionSliceOptions = (machine, options) => {
|
|
5
|
+
const { nestingPath = '', selectIdFromData, selectors: userSelectors, sortComparer, } = options ?? {};
|
|
6
|
+
const toNativeEntity = (entity) => toNativeState(entity);
|
|
7
|
+
const resolveEntityId = (entity) => {
|
|
8
|
+
if (!selectIdFromData)
|
|
9
|
+
return entity.entityId;
|
|
10
|
+
const data = ('data' in entity ? entity.data : undefined);
|
|
11
|
+
return selectIdFromData(data);
|
|
12
|
+
};
|
|
13
|
+
const entityAdapterOptions = {
|
|
14
|
+
selectId: resolveEntityId,
|
|
15
|
+
};
|
|
16
|
+
if (sortComparer) {
|
|
17
|
+
entityAdapterOptions.sortComparer = (a, b) => sortComparer(toNativeEntity(a), toNativeEntity(b));
|
|
18
|
+
}
|
|
19
|
+
const entityAdapter = createEntityAdapter(entityAdapterOptions);
|
|
20
|
+
const extractEntitiesState = (state) => getAtPath(state, nestingPath);
|
|
21
|
+
const stateToEntity = (state, entityId) => {
|
|
22
|
+
const plainState = toPlainState(state);
|
|
23
|
+
return selectIdFromData
|
|
24
|
+
? plainState
|
|
25
|
+
: {
|
|
26
|
+
entityId,
|
|
27
|
+
...plainState,
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
const eventReducers = Object.fromEntries(Object.keys(machine.event).map(type => [
|
|
31
|
+
type,
|
|
32
|
+
(state, action) => {
|
|
33
|
+
const entitiesCollection = extractEntitiesState(state);
|
|
34
|
+
const entity = entitiesCollection.entities[action.payload.entityId];
|
|
35
|
+
if (entity) {
|
|
36
|
+
const payload = 'payload' in action.payload ? action.payload.payload : undefined;
|
|
37
|
+
const nextState = machine.transition(entity, machine.event[type](payload));
|
|
38
|
+
entityAdapter.setOne(entitiesCollection, stateToEntity(nextState, entity.entityId));
|
|
39
|
+
}
|
|
40
|
+
return state;
|
|
41
|
+
},
|
|
42
|
+
]));
|
|
43
|
+
const lifecycleReducers = {
|
|
44
|
+
addEntity: {
|
|
45
|
+
reducer: (state, action) => {
|
|
46
|
+
entityAdapter.addOne(extractEntitiesState(state), action.payload);
|
|
47
|
+
return state;
|
|
48
|
+
},
|
|
49
|
+
prepare: input => ({
|
|
50
|
+
payload: stateToEntity(input.state, input.entityId),
|
|
51
|
+
}),
|
|
52
|
+
},
|
|
53
|
+
removeEntity: (state, action) => {
|
|
54
|
+
entityAdapter.removeOne(extractEntitiesState(state), action.payload.entityId);
|
|
55
|
+
return state;
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
const reducers = {
|
|
59
|
+
...eventReducers,
|
|
60
|
+
...lifecycleReducers,
|
|
61
|
+
};
|
|
62
|
+
const entitySelectors = entityAdapter.getSelectors();
|
|
63
|
+
const selectNativeEntities = (state) => Object.fromEntries(entitySelectors
|
|
64
|
+
.selectAll(extractEntitiesState(state))
|
|
65
|
+
.map(entity => [resolveEntityId(entity), toNativeEntity(entity)]));
|
|
66
|
+
const reboundUserSelectors = rebindUserSelectors(userSelectors ?? {}, selectNativeEntities);
|
|
67
|
+
const builtinSelectors = {
|
|
68
|
+
selectIds: state => entitySelectors.selectIds(extractEntitiesState(state)),
|
|
69
|
+
selectTotal: state => entitySelectors.selectTotal(extractEntitiesState(state)),
|
|
70
|
+
selectAllNative: state => entitySelectors
|
|
71
|
+
.selectAll(extractEntitiesState(state))
|
|
72
|
+
.map(toNativeEntity),
|
|
73
|
+
selectNativeEntities,
|
|
74
|
+
selectNativeById: (state, id) => {
|
|
75
|
+
const entity = entitySelectors.selectById(extractEntitiesState(state), id);
|
|
76
|
+
return entity ? toNativeEntity(entity) : undefined;
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
const selectors = {
|
|
80
|
+
...builtinSelectors,
|
|
81
|
+
...reboundUserSelectors,
|
|
82
|
+
};
|
|
83
|
+
const initialState = setAtPath({}, nestingPath, entityAdapter.getInitialState());
|
|
84
|
+
return { entityAdapter, initialState, reducers, selectors };
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=collection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collection.js","sourceRoot":"","sources":["../../../src/adapters/redux-toolkit/collection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/redux-toolkit/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/redux-toolkit/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { PayloadAction, SliceSelectors } from '@reduxjs/toolkit';
|
|
2
|
+
import type { Simplify } from 'type-fest';
|
|
3
|
+
import type { AnyMachine, StateOf, PlainStateFromNative } from '../../simply-stated';
|
|
4
|
+
export type NativeStateOfMachine<Machine extends AnyMachine> = StateOf<Machine['state']>;
|
|
5
|
+
export type PlainStateOfMachine<Machine extends AnyMachine> = Simplify<PlainStateFromNative<NativeStateOfMachine<Machine>>>;
|
|
6
|
+
export type NestAt<Path extends string | undefined, Value> = Path extends string ? Path extends `${infer Head}.${infer Rest}` ? {
|
|
7
|
+
[K in Head]: NestAt<Rest, Value>;
|
|
8
|
+
} : {
|
|
9
|
+
[K in Path]: Value;
|
|
10
|
+
} : Value;
|
|
11
|
+
export type EventPayload<Event extends (...args: never[]) => unknown> = Parameters<Event> extends [infer P] ? P : never;
|
|
12
|
+
export type EventReducer<SliceState, Payload> = [Payload] extends [never] ? <S extends SliceState>(state: S) => S : <S extends SliceState>(state: S, action: PayloadAction<Payload>) => S;
|
|
13
|
+
export type RebindSelectors<SliceState, Selectors> = {
|
|
14
|
+
[K in keyof Selectors]: Selectors[K] extends (state: never, ...args: infer Args) => infer Result ? (state: SliceState, ...args: Args) => Result : never;
|
|
15
|
+
};
|
|
16
|
+
export declare const rebindUserSelectors: <SliceState, Projected, Selectors>(userSelectors: Selectors & SliceSelectors<Projected>, project: (state: SliceState) => Projected) => RebindSelectors<SliceState, Selectors>;
|
|
17
|
+
export declare const getAtPath: <R extends object>(obj: object, path: string) => R;
|
|
18
|
+
export declare const setAtPath: <R extends object>(target: Record<string, unknown>, path: string, value: unknown) => R;
|
|
19
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/adapters/redux-toolkit/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,KAAK,EACV,UAAU,EACV,OAAO,EACP,oBAAoB,EACrB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,MAAM,oBAAoB,CAAC,OAAO,SAAS,UAAU,IAAI,OAAO,CACpE,OAAO,CAAC,OAAO,CAAC,CACjB,CAAC;AAEF,MAAM,MAAM,mBAAmB,CAAC,OAAO,SAAS,UAAU,IAAI,QAAQ,CACpE,oBAAoB,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CACpD,CAAC;AAEF,MAAM,MAAM,MAAM,CAAC,IAAI,SAAS,MAAM,GAAG,SAAS,EAAE,KAAK,IAAI,IAAI,SAAS,MAAM,GAC5E,IAAI,SAAS,GAAG,MAAM,IAAI,IAAI,MAAM,IAAI,EAAE,GACxC;KAAG,CAAC,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;CAAE,GACpC;KAAG,CAAC,IAAI,IAAI,GAAG,KAAK;CAAE,GACxB,KAAK,CAAC;AAEV,MAAM,MAAM,YAAY,CAAC,KAAK,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,IAClE,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAElD,MAAM,MAAM,YAAY,CAAC,UAAU,EAAE,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,GACrE,CAAC,CAAC,SAAS,UAAU,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,GACrC,CAAC,CAAC,SAAS,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAE1E,MAAM,MAAM,eAAe,CAAC,UAAU,EAAE,SAAS,IAAI;KAClD,CAAC,IAAI,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAC3C,KAAK,EAAE,KAAK,EACZ,GAAG,IAAI,EAAE,MAAM,IAAI,KAChB,MAAM,MAAM,GACb,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,IAAI,EAAE,IAAI,KAAK,MAAM,GAC5C,KAAK;CACV,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,UAAU,EAAE,SAAS,EAAE,SAAS,EAClE,eAAe,SAAS,GAAG,cAAc,CAAC,SAAS,CAAC,EACpD,SAAS,CAAC,KAAK,EAAE,UAAU,KAAK,SAAS,KAQpC,eAAe,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;AAE9C,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,MAAM,EAAE,KAAK,MAAM,EAAE,MAAM,MAAM,KAGO,CAAC,CAAC;AAE9E,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,MAAM,EACxC,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,MAAM,EACZ,OAAO,OAAO,MAgBf,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export const rebindUserSelectors = (userSelectors, project) => Object.fromEntries(Object.entries(userSelectors).map(([key, selector]) => [
|
|
2
|
+
key,
|
|
3
|
+
(state, ...args) => selector(project(state), ...args),
|
|
4
|
+
]));
|
|
5
|
+
export const getAtPath = (obj, path) => (path === ''
|
|
6
|
+
? obj
|
|
7
|
+
: path.split('.').reduce((o, key) => o[key], obj));
|
|
8
|
+
export const setAtPath = (target, path, value) => {
|
|
9
|
+
if (path === '')
|
|
10
|
+
return value;
|
|
11
|
+
const keys = path.split('.');
|
|
12
|
+
const last = keys.pop();
|
|
13
|
+
let cursor = target;
|
|
14
|
+
for (const key of keys) {
|
|
15
|
+
if (typeof cursor[key] !== 'object' || cursor[key] === null) {
|
|
16
|
+
cursor[key] = {};
|
|
17
|
+
}
|
|
18
|
+
cursor = cursor[key];
|
|
19
|
+
}
|
|
20
|
+
cursor[last] = value;
|
|
21
|
+
return target;
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/adapters/redux-toolkit/shared.ts"],"names":[],"mappings":"AAsCA,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,aAAoD,EACpD,OAAyC,EACzC,EAAE,CACF,MAAM,CAAC,WAAW,CAChB,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC;IACrD,GAAG;IACH,CAAC,KAAiB,EAAE,GAAG,IAAa,EAAE,EAAE,CACtC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC;CACpC,CAAC,CACuC,CAAC;AAE9C,MAAM,CAAC,MAAM,SAAS,GAAG,CAAmB,GAAW,EAAE,IAAY,EAAE,EAAE,CACvE,CAAC,IAAI,KAAK,EAAE;IACV,CAAC,CAAC,GAAG;IACL,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,GAAqB,CAAC,EAAE,GAAG,CAAC,CAAM,CAAC;AAE9E,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,MAA+B,EAC/B,IAAY,EACZ,KAAc,EACd,EAAE;IACF,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,KAAU,CAAC;IAEnC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAG,CAAC;IACzB,IAAI,MAAM,GAAG,MAAM,CAAC;IACpB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;YAC5D,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;QACnB,CAAC;QACD,MAAM,GAAG,MAAM,CAAC,GAAG,CAA4B,CAAC;IAClD,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IAErB,OAAO,MAAW,CAAC;AACrB,CAAC,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { SliceSelectors } from '@reduxjs/toolkit';
|
|
2
|
+
import type { AnyMachine, PlainStateFromNative } from '../../simply-stated';
|
|
3
|
+
import type { EventPayload, EventReducer, NativeStateOfMachine, NestAt, RebindSelectors } from './shared';
|
|
4
|
+
type EventReducers<Machine extends AnyMachine, SliceState> = {
|
|
5
|
+
[K in keyof Machine['event']]: EventReducer<SliceState, EventPayload<Machine['event'][K]>>;
|
|
6
|
+
};
|
|
7
|
+
export declare const toSliceOptions: <Machine extends AnyMachine, NativeState extends NativeStateOfMachine<Machine>, NestingPath extends string | undefined = undefined, Selectors extends SliceSelectors<NativeState> = Record<never, never>>(machine: Machine, { initialState, nestingPath, selectors: userSelectors, }: {
|
|
8
|
+
initialState: NoInfer<NativeState>;
|
|
9
|
+
nestingPath?: NestingPath;
|
|
10
|
+
selectors?: Selectors & SliceSelectors<NativeState>;
|
|
11
|
+
}) => {
|
|
12
|
+
initialState: NestAt<NestingPath, PlainStateFromNative<NativeState> extends infer T ? { [KeyType in keyof T]: T[KeyType]; } : never>;
|
|
13
|
+
reducers: EventReducers<Machine, NestAt<NestingPath, PlainStateFromNative<NativeState> extends infer T_1 ? { [KeyType in keyof T_1]: T_1[KeyType]; } : never>>;
|
|
14
|
+
selectors: {
|
|
15
|
+
selectNativeState: ((state: NestAt<NestingPath, PlainStateFromNative<NativeState> extends infer T_3 ? { [KeyType_2 in keyof T_3]: T_3[KeyType_2]; } : never>) => NativeState) & {
|
|
16
|
+
clearCache: () => void;
|
|
17
|
+
resultsCount: () => number;
|
|
18
|
+
resetResultsCount: () => void;
|
|
19
|
+
} & {
|
|
20
|
+
resultFunc: (resultFuncArgs_0: unknown extends (PlainStateFromNative<NativeState> extends infer T_3 ? { [KeyType_2 in keyof T_3]: T_3[KeyType_2]; } : never) ? [PlainStateFromNative<NativeState> extends infer T_4 ? { [KeyType_2 in keyof T_4]: T_4[KeyType_2]; } : never] extends [null] ? PlainStateFromNative<NativeState> extends infer T_5 ? { [KeyType_2 in keyof T_5]: T_5[KeyType_2]; } : never : any : PlainStateFromNative<NativeState> extends infer T_6 ? { [KeyType_2 in keyof T_6]: T_6[KeyType_2]; } : never) => NativeState;
|
|
21
|
+
memoizedResultFunc: ((resultFuncArgs_0: unknown extends (PlainStateFromNative<NativeState> extends infer T_3 ? { [KeyType_2 in keyof T_3]: T_3[KeyType_2]; } : never) ? [PlainStateFromNative<NativeState> extends infer T_4 ? { [KeyType_2 in keyof T_4]: T_4[KeyType_2]; } : never] extends [null] ? PlainStateFromNative<NativeState> extends infer T_5 ? { [KeyType_2 in keyof T_5]: T_5[KeyType_2]; } : never : any : PlainStateFromNative<NativeState> extends infer T_6 ? { [KeyType_2 in keyof T_6]: T_6[KeyType_2]; } : never) => NativeState) & {
|
|
22
|
+
clearCache: () => void;
|
|
23
|
+
resultsCount: () => number;
|
|
24
|
+
resetResultsCount: () => void;
|
|
25
|
+
};
|
|
26
|
+
lastResult: () => NativeState;
|
|
27
|
+
dependencies: [(state: NestAt<NestingPath, PlainStateFromNative<NativeState> extends infer T_3 ? { [KeyType in keyof T_3]: T_3[KeyType]; } : never>) => PlainStateFromNative<NativeState> extends infer T_4 ? { [KeyType in keyof T_4]: T_4[KeyType]; } : never];
|
|
28
|
+
recomputations: () => number;
|
|
29
|
+
resetRecomputations: () => void;
|
|
30
|
+
dependencyRecomputations: () => number;
|
|
31
|
+
resetDependencyRecomputations: () => void;
|
|
32
|
+
} & {
|
|
33
|
+
argsMemoize: typeof import("@reduxjs/toolkit").weakMapMemoize;
|
|
34
|
+
memoize: typeof import("@reduxjs/toolkit").weakMapMemoize;
|
|
35
|
+
};
|
|
36
|
+
} & RebindSelectors<NestAt<NestingPath, PlainStateFromNative<NativeState> extends infer T_3 ? { [KeyType in keyof T_3]: T_3[KeyType]; } : never>, Selectors> extends infer T_2 ? { [KeyType_1 in keyof T_2]: T_2[KeyType_1]; } : never;
|
|
37
|
+
};
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=slice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slice.d.ts","sourceRoot":"","sources":["../../../src/adapters/redux-toolkit/slice.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE5E,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,oBAAoB,EACpB,MAAM,EACN,eAAe,EAChB,MAAM,UAAU,CAAC;AAElB,KAAK,aAAa,CAAC,OAAO,SAAS,UAAU,EAAE,UAAU,IAAI;KAC1D,CAAC,IAAI,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,YAAY,CACzC,UAAU,EACV,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAClC;CACF,CAAC;AAEF,eAAO,MAAM,cAAc,GACzB,OAAO,SAAS,UAAU,EAC1B,WAAW,SAAS,oBAAoB,CAAC,OAAO,CAAC,EACjD,WAAW,SAAS,MAAM,GAAG,SAAS,GAAG,SAAS,EAClD,SAAS,SAAS,cAAc,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EAEpE,SAAS,OAAO,EAChB,0DAIG;IACD,YAAY,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IACnC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,SAAS,CAAC,EAAE,SAAS,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;CACrD;;;;;;;;;;;;;;;;;;;;;;;;;;CAmDF,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { createSelector } from '@reduxjs/toolkit';
|
|
2
|
+
import { toNativeState, toPlainState } from '../../simply-stated';
|
|
3
|
+
import { getAtPath, setAtPath, rebindUserSelectors } from './shared';
|
|
4
|
+
export const toSliceOptions = (machine, { initialState, nestingPath = '', selectors: userSelectors, }) => {
|
|
5
|
+
const reducers = Object.fromEntries(Object.keys(machine.event).map(type => [
|
|
6
|
+
type,
|
|
7
|
+
(state, action) => {
|
|
8
|
+
const nextState = machine.transition(getAtPath(state, nestingPath), machine.event[type](action.payload));
|
|
9
|
+
return setAtPath(state, nestingPath, toPlainState(nextState));
|
|
10
|
+
},
|
|
11
|
+
]));
|
|
12
|
+
const selectNativeState = createSelector((state) => getAtPath(state, nestingPath), state => toNativeState(state));
|
|
13
|
+
const wrappedSelectors = rebindUserSelectors(userSelectors ?? {}, selectNativeState);
|
|
14
|
+
const selectors = {
|
|
15
|
+
selectNativeState,
|
|
16
|
+
...wrappedSelectors,
|
|
17
|
+
};
|
|
18
|
+
const plainInitialState = toPlainState(initialState);
|
|
19
|
+
let sliceInitialState = {};
|
|
20
|
+
sliceInitialState = setAtPath(sliceInitialState, nestingPath, plainInitialState);
|
|
21
|
+
return {
|
|
22
|
+
initialState: sliceInitialState,
|
|
23
|
+
reducers,
|
|
24
|
+
selectors,
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=slice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slice.js","sourceRoot":"","sources":["../../../src/adapters/redux-toolkit/slice.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAElE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAgBrE,MAAM,CAAC,MAAM,cAAc,GAAG,CAM5B,OAAgB,EAChB,EACE,YAAY,EACZ,WAAW,GAAG,EAAE,EAChB,SAAS,EAAE,aAAa,GAKzB,EACD,EAAE;IAIF,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CACjC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,IAAI;QACJ,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YAChB,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAClC,SAAS,CAAc,KAAK,EAAE,WAAW,CAAC,EAC1C,OAAO,CAAC,KAAK,CAAC,IAAI,CAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CACrC,CAAC;YACF,OAAO,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC;QAChE,CAAC;KACF,CAAC,CACmC,CAAC;IAExC,MAAM,iBAAiB,GAAG,cAAc,CACtC,CAAC,KAAiB,EAAE,EAAE,CAAC,SAAS,CAAa,KAAK,EAAE,WAAW,CAAC,EAChE,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,CAAgB,CAC7C,CAAC;IAEF,MAAM,gBAAgB,GAAG,mBAAmB,CAC1C,aAAa,IAAI,EAAE,EACnB,iBAAiB,CAClB,CAAC;IAEF,MAAM,SAAS,GAAG;QAChB,iBAAiB;QACjB,GAAG,gBAAgB;KAMpB,CAAC;IAEF,MAAM,iBAAiB,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IACrD,IAAI,iBAAiB,GAAG,EAAgB,CAAC;IACzC,iBAAiB,GAAG,SAAS,CAC3B,iBAAiB,EACjB,WAAW,EACX,iBAAiB,CAClB,CAAC;IAEF,OAAO;QACL,YAAY,EAAE,iBAA+B;QAC7C,QAAQ;QACR,SAAS;KACV,CAAC;AACJ,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,WAAW,EACX,aAAa,EACb,YAAY,GACb,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,WAAW,EACX,aAAa,EACb,YAAY,GACb,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import type { GetTagMetadata, IsAny, IsEqual, IsUnion, Simplify, Tagged, UnionToIntersection } from 'type-fest';
|
|
2
|
+
type ApiError<M extends string> = {
|
|
3
|
+
__message: M;
|
|
4
|
+
};
|
|
5
|
+
type StateDefinition<StateName extends string, Data extends NonNullable<unknown> | void = void> = Tagged<{
|
|
6
|
+
stateName: StateName;
|
|
7
|
+
withData: Data extends void ? false : true;
|
|
8
|
+
}, 'StateDefinition', Data>;
|
|
9
|
+
type AnyStateDefinition = StateDefinition<string, any>;
|
|
10
|
+
type StateDefinitionsFor<StateNames extends readonly string[], Data extends NonNullable<unknown> | void = void> = {
|
|
11
|
+
[SN in keyof StateNames]: StateNames[SN] extends string ? StateDefinition<StateNames[SN], Data> : never;
|
|
12
|
+
};
|
|
13
|
+
type DefineStateTuple<StateNames extends readonly string[]> = StateDefinitionsFor<StateNames> & {
|
|
14
|
+
withData<Data extends NonNullable<unknown>>(): StateDefinitionsFor<StateNames, Data>;
|
|
15
|
+
};
|
|
16
|
+
type StateObject<StateName extends string, Data extends NonNullable<unknown> | void = void> = Readonly<Data extends void ? {
|
|
17
|
+
name: StateName;
|
|
18
|
+
} : {
|
|
19
|
+
name: StateName;
|
|
20
|
+
data: Data;
|
|
21
|
+
}> & {
|
|
22
|
+
is<StateCreators extends readonly AnyStateCreator[]>(...creators: StateCreators): this is StateType<StateCreators>;
|
|
23
|
+
};
|
|
24
|
+
type StateCreator<StateName extends string, Data extends NonNullable<unknown> | void> = (Data extends void ? () => StateObject<StateName> : (data: Data) => StateObject<StateName, Data>) & {
|
|
25
|
+
stateName: StateName;
|
|
26
|
+
};
|
|
27
|
+
export type AnyStateCreator = StateCreator<string, any>;
|
|
28
|
+
type StateCreatorsFromDefinitions<Definitions extends readonly AnyStateDefinition[]> = {
|
|
29
|
+
[K in keyof Definitions]: Definitions[K] extends AnyStateDefinition ? Definitions[K] extends StateDefinition<infer Name extends string, any> ? StateCreator<Name, GetTagMetadata<Definitions[K], 'StateDefinition'>> : never : never;
|
|
30
|
+
};
|
|
31
|
+
type AsTuple<T extends readonly unknown[], R extends readonly unknown[] = []> = number extends T['length'] ? T : R['length'] extends T['length'] ? R : AsTuple<T, [...R, T[R['length']]]>;
|
|
32
|
+
type Flatten<T extends readonly unknown[], R extends readonly unknown[] = []> = T extends readonly [infer Head, ...infer Rest extends readonly unknown[]] ? Head extends readonly unknown[] ? Flatten<Rest, readonly [...R, ...AsTuple<Head>]> : Flatten<Rest, readonly [...R, Head]> : R;
|
|
33
|
+
type ValidateNoStar<StateNames extends readonly string[]> = {
|
|
34
|
+
[SN in keyof StateNames]: StateNames[SN] extends '*' ? ApiError<`'*' is reserved for cross-state events`> : StateNames[SN];
|
|
35
|
+
};
|
|
36
|
+
export type PlainStateFromNative<State extends AnyNativeState> = State extends unknown ? Omit<State, 'is'> : never;
|
|
37
|
+
export declare const toNativeState: <PlainState extends PlainStateFromNative<AnyNativeState>>(state: PlainState) => PlainState & {
|
|
38
|
+
is: (...stateCreators: AnyStateCreator[]) => boolean;
|
|
39
|
+
};
|
|
40
|
+
export declare const toPlainState: <State extends AnyNativeState>(state: State) => PlainStateFromNative<State>;
|
|
41
|
+
export declare const defineState: <const StateNames extends readonly string[]>(...stateNames: ValidateNoStar<StateNames>) => DefineStateTuple<StateNames>;
|
|
42
|
+
export type StateType<StateCreators extends readonly AnyStateCreator[]> = ReturnType<StateCreators[number]>;
|
|
43
|
+
type StateCreatorsMap<StateCreators extends readonly AnyStateCreator[]> = Simplify<{
|
|
44
|
+
[SC in StateCreators[number] as SC['stateName']]: SC;
|
|
45
|
+
}>;
|
|
46
|
+
type EventHandler<StateCreators extends readonly AnyStateCreator[], SC extends AnyStateCreator | void = void> = SC extends void ? (...payload: any) => StateType<StateCreators> : SC extends AnyStateCreator ? (data: ReturnType<SC> extends {
|
|
47
|
+
data: infer D;
|
|
48
|
+
} ? D : undefined, ...payload: any) => StateType<StateCreators> : never;
|
|
49
|
+
type StateMachineTree<StateCreators extends readonly AnyStateCreator[]> = {
|
|
50
|
+
[SC in StateCreators[number] as SC['stateName']]: {
|
|
51
|
+
[event: string]: EventHandler<StateCreators, SC>;
|
|
52
|
+
};
|
|
53
|
+
} & {
|
|
54
|
+
'*'?: {
|
|
55
|
+
[event: string]: EventHandler<StateCreators>;
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
type EventNames<Tree> = {
|
|
59
|
+
[S in keyof Tree]: keyof NonNullable<Tree[S]>;
|
|
60
|
+
}[keyof Tree] & string;
|
|
61
|
+
type InferEventPayload<F> = F extends (...args: infer Args) => any ? Args extends [any, infer P, ...any[]] ? P : never : never;
|
|
62
|
+
type InferCrossStateEventPayload<F> = F extends (...args: infer Args) => any ? Args extends [infer P, ...any[]] ? P : never : never;
|
|
63
|
+
type EventPayloadFor<Tree, EventName extends string> = {
|
|
64
|
+
[S in keyof Tree]: EventName extends keyof NonNullable<Tree[S]> ? S extends '*' ? InferCrossStateEventPayload<NonNullable<Tree[S]>[EventName]> : InferEventPayload<NonNullable<Tree[S]>[EventName]> : never;
|
|
65
|
+
}[keyof Tree];
|
|
66
|
+
type EventObject<Tree, Name extends string, Payload = EventPayloadFor<Tree, Name>> = [Payload] extends [never] ? {
|
|
67
|
+
type: Name;
|
|
68
|
+
} : {
|
|
69
|
+
type: Name;
|
|
70
|
+
payload: Payload;
|
|
71
|
+
};
|
|
72
|
+
type EventCreatorsMap<Tree> = Simplify<{
|
|
73
|
+
[EN in EventNames<Tree>]: [EventPayloadFor<Tree, EN>] extends [never] ? () => EventObject<Tree, EN> : (payload: EventPayloadFor<Tree, EN>) => EventObject<Tree, EN>;
|
|
74
|
+
}>;
|
|
75
|
+
type EventType<Tree> = {
|
|
76
|
+
[E in EventNames<Tree>]: EventObject<Tree, E>;
|
|
77
|
+
}[EventNames<Tree>];
|
|
78
|
+
type EventPayloadAnynessUnion<Tree, EventName extends string> = {
|
|
79
|
+
[S in keyof Tree]: EventName extends keyof NonNullable<Tree[S]> ? S extends '*' ? IsAny<InferCrossStateEventPayload<NonNullable<Tree[S]>[EventName]>> : IsAny<InferEventPayload<NonNullable<Tree[S]>[EventName]>> : never;
|
|
80
|
+
}[keyof Tree];
|
|
81
|
+
type HasPayloadMixedWithAny<Tree, E extends string> = true extends EventPayloadAnynessUnion<Tree, E> ? false extends EventPayloadAnynessUnion<Tree, E> ? true : false : false;
|
|
82
|
+
type MismatchErrorMessage = 'Mismatching payload types across handlers';
|
|
83
|
+
type ContributingStates<Tree, E extends string> = {
|
|
84
|
+
[S in keyof Tree]: E extends keyof NonNullable<Tree[S]> ? S : never;
|
|
85
|
+
}[keyof Tree];
|
|
86
|
+
type ValidateEventPayloadsConsistency<Tree> = {
|
|
87
|
+
[S in keyof Tree]: {
|
|
88
|
+
[E in keyof NonNullable<Tree[S]>]: E extends string ? [EventPayloadFor<Tree, E>] extends [never] ? NonNullable<Tree[S]>[E] : IsUnion<ContributingStates<Tree, E>> extends false ? NonNullable<Tree[S]>[E] : HasPayloadMixedWithAny<Tree, E> extends true ? ApiError<MismatchErrorMessage> : IsEqual<EventPayloadFor<Tree, E>, UnionToIntersection<EventPayloadFor<Tree, E>>> extends true ? NonNullable<Tree[S]>[E] : ApiError<MismatchErrorMessage> : NonNullable<Tree[S]>[E];
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
type Machine<StateCreators extends readonly AnyStateCreator[], Tree> = Simplify<{
|
|
92
|
+
event: EventCreatorsMap<Tree>;
|
|
93
|
+
state: StateCreatorsMap<StateCreators>;
|
|
94
|
+
transition: (state: StateType<StateCreators>, event: EventType<Tree>) => StateType<StateCreators>;
|
|
95
|
+
}>;
|
|
96
|
+
type CreateMachineOptions<StateCreators extends readonly AnyStateCreator[], Tree> = {
|
|
97
|
+
onInvalidTransition?: (context: {
|
|
98
|
+
state: StateType<StateCreators>;
|
|
99
|
+
event: EventType<Tree>;
|
|
100
|
+
}) => void;
|
|
101
|
+
};
|
|
102
|
+
type StateNamesOfDefinitions<Definitions extends readonly AnyStateDefinition[]> = {
|
|
103
|
+
[K in keyof Definitions]: Definitions[K] extends {
|
|
104
|
+
stateName: infer Name extends string;
|
|
105
|
+
} ? Name : never;
|
|
106
|
+
};
|
|
107
|
+
type FirstDuplicate<Items extends readonly unknown[]> = Items extends readonly [
|
|
108
|
+
infer Head,
|
|
109
|
+
...infer Rest
|
|
110
|
+
] ? Rest extends readonly unknown[] ? Head extends Rest[number] ? Head : FirstDuplicate<Rest> : never : never;
|
|
111
|
+
type ValidateCombine<DefinitionGroups extends readonly (readonly AnyStateDefinition[])[]> = FirstDuplicate<StateNamesOfDefinitions<Flatten<DefinitionGroups>>> extends infer Duplicate ? [Duplicate] extends [never] ? DefinitionGroups : {
|
|
112
|
+
[_I in keyof DefinitionGroups]: ApiError<`Duplicate state '${Duplicate & string}'`>;
|
|
113
|
+
} : DefinitionGroups;
|
|
114
|
+
export type StateOf<MapOfStateCreators extends StateCreatorsMap<readonly AnyStateCreator[]>, StateName extends keyof MapOfStateCreators = keyof MapOfStateCreators> = Simplify<{
|
|
115
|
+
[SN in StateName]: MapOfStateCreators[SN] extends AnyStateCreator ? ReturnType<MapOfStateCreators[SN]> : never;
|
|
116
|
+
}[StateName]>;
|
|
117
|
+
export type EventOf<MapOfEventCreators extends Record<string, (...args: any) => {
|
|
118
|
+
type: string;
|
|
119
|
+
}>, EventName extends keyof MapOfEventCreators = keyof MapOfEventCreators> = {
|
|
120
|
+
[K in EventName]: MapOfEventCreators[K] extends (...args: any) => any ? ReturnType<MapOfEventCreators[K]> : never;
|
|
121
|
+
}[EventName];
|
|
122
|
+
export declare const combineStates: <const DefinitionGroups extends readonly (readonly AnyStateDefinition[])[]>(...stateDefinitionItems: ValidateCombine<DefinitionGroups>) => {
|
|
123
|
+
state: { [SC in StateCreatorsFromDefinitions<Flatten<DefinitionGroups, []>>[number] as SC["stateName"]]: SC; } extends infer T ? { [KeyType in keyof T]: T[KeyType]; } : never;
|
|
124
|
+
createMachine: <const TreeOrFactory extends StateMachineTree<StateCreatorsFromDefinitions<Flatten<DefinitionGroups, []>>> | ((state: StateCreatorsMap<StateCreatorsFromDefinitions<Flatten<DefinitionGroups, []>>>) => StateMachineTree<StateCreatorsFromDefinitions<Flatten<DefinitionGroups, []>>>), Tree extends TreeOrFactory extends (...args: any) => infer T_1 ? T_1 : TreeOrFactory>(treeOrFactory: TreeOrFactory extends (...args: infer A) => infer T_1 ? (...args: A) => T_1 & ValidateEventPayloadsConsistency<T_1> : TreeOrFactory & ValidateEventPayloadsConsistency<TreeOrFactory>, { onInvalidTransition, }?: CreateMachineOptions<StateCreatorsFromDefinitions<Flatten<DefinitionGroups, []>>, Tree>) => Machine<StateCreatorsFromDefinitions<Flatten<DefinitionGroups, []>>, Tree>;
|
|
125
|
+
};
|
|
126
|
+
export type AnyNativeState = ReturnType<StateCreator<string, any>>;
|
|
127
|
+
export type AnyMachine = {
|
|
128
|
+
event: Record<string, (...args: any) => {
|
|
129
|
+
type: string;
|
|
130
|
+
}>;
|
|
131
|
+
state: Record<string, AnyStateCreator>;
|
|
132
|
+
transition: (state: any, event: any) => AnyNativeState;
|
|
133
|
+
};
|
|
134
|
+
export {};
|
|
135
|
+
//# sourceMappingURL=simply-stated.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simply-stated.d.ts","sourceRoot":"","sources":["../src/simply-stated.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
export const toNativeState = (state) => ({
|
|
3
|
+
...state,
|
|
4
|
+
is: (...stateCreators) => stateCreators.some(sc => sc.stateName === state.name),
|
|
5
|
+
});
|
|
6
|
+
export const toPlainState = (state) => {
|
|
7
|
+
const { is: _is, ...plainState } = state;
|
|
8
|
+
return plainState;
|
|
9
|
+
};
|
|
10
|
+
const makeStateCreator = ({ stateName, withData, }) => {
|
|
11
|
+
const stateCreator = withData
|
|
12
|
+
? (data) => toNativeState({ name: stateName, data })
|
|
13
|
+
: () => toNativeState({ name: stateName });
|
|
14
|
+
return Object.assign(stateCreator, {
|
|
15
|
+
stateName,
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
export const defineState = (...stateNames) => {
|
|
19
|
+
stateNames.forEach(sn => {
|
|
20
|
+
if (sn !== '*')
|
|
21
|
+
return;
|
|
22
|
+
throw new Error("'*' is reserved for cross-state events");
|
|
23
|
+
});
|
|
24
|
+
const makeAllStateDefinitions = (withData = false) => stateNames.map(stateName => ({
|
|
25
|
+
stateName,
|
|
26
|
+
withData,
|
|
27
|
+
}));
|
|
28
|
+
const tuple = makeAllStateDefinitions();
|
|
29
|
+
tuple.withData = () => makeAllStateDefinitions(true);
|
|
30
|
+
return tuple;
|
|
31
|
+
};
|
|
32
|
+
const defaultInvalidTransitionLogger = (context) => {
|
|
33
|
+
console.error(`Invalid transition: event '${context.event.type}' not allowed in state '${context.state.name}'`);
|
|
34
|
+
};
|
|
35
|
+
export const combineStates = (...stateDefinitionItems) => {
|
|
36
|
+
const allDefinitions = stateDefinitionItems.flat();
|
|
37
|
+
const validatedStateNames = new Set();
|
|
38
|
+
for (const definition of allDefinitions) {
|
|
39
|
+
if (definition.stateName === '*') {
|
|
40
|
+
throw new Error("'*' is reserved for cross-state events");
|
|
41
|
+
}
|
|
42
|
+
if (validatedStateNames.has(definition.stateName)) {
|
|
43
|
+
throw new Error(`Duplicate state '${definition.stateName}'`);
|
|
44
|
+
}
|
|
45
|
+
validatedStateNames.add(definition.stateName);
|
|
46
|
+
}
|
|
47
|
+
const stateCreators = allDefinitions.map(makeStateCreator);
|
|
48
|
+
const stateCreatorsMap = Object.fromEntries(stateCreators.map(creator => [creator.stateName, creator]));
|
|
49
|
+
const createMachine = (treeOrFactory, { onInvalidTransition = defaultInvalidTransitionLogger, } = {}) => {
|
|
50
|
+
const tree = (typeof treeOrFactory === 'function'
|
|
51
|
+
? treeOrFactory(stateCreatorsMap)
|
|
52
|
+
: treeOrFactory);
|
|
53
|
+
const eventNames = Array.from(new Set(Object.values(tree).flatMap(Object.keys)));
|
|
54
|
+
const makeEventCreator = (type) => (payload) => payload === undefined ? { type } : { type, payload };
|
|
55
|
+
const eventCreatorsMap = Object.fromEntries(eventNames.map(type => [type, makeEventCreator(type)]));
|
|
56
|
+
const transition = (currentState, event) => {
|
|
57
|
+
const eventPayload = 'payload' in event ? event.payload : undefined;
|
|
58
|
+
const stateNode = tree[currentState.name];
|
|
59
|
+
const eventHandler = stateNode?.[event.type];
|
|
60
|
+
if (eventHandler) {
|
|
61
|
+
const data = 'data' in currentState ? currentState.data : undefined;
|
|
62
|
+
return eventHandler(data, eventPayload);
|
|
63
|
+
}
|
|
64
|
+
const crossStateHandlers = tree['*'];
|
|
65
|
+
const crossStateEventHandler = crossStateHandlers?.[event.type];
|
|
66
|
+
if (crossStateEventHandler) {
|
|
67
|
+
return crossStateEventHandler(eventPayload);
|
|
68
|
+
}
|
|
69
|
+
onInvalidTransition({ state: currentState, event });
|
|
70
|
+
return currentState;
|
|
71
|
+
};
|
|
72
|
+
return { event: eventCreatorsMap, state: stateCreatorsMap, transition };
|
|
73
|
+
};
|
|
74
|
+
return { state: stateCreatorsMap, createMachine };
|
|
75
|
+
};
|
|
76
|
+
//# sourceMappingURL=simply-stated.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simply-stated.js","sourceRoot":"","sources":["../src/simply-stated.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "simply-stated",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Strongly typed, declarative state machine modeling",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"state-machine",
|
|
7
|
+
"fsm",
|
|
8
|
+
"state",
|
|
9
|
+
"statechart",
|
|
10
|
+
"typescript",
|
|
11
|
+
"type-safe",
|
|
12
|
+
"redux",
|
|
13
|
+
"redux-toolkit"
|
|
14
|
+
],
|
|
15
|
+
"license": "MIT",
|
|
16
|
+
"author": "Szymon Masłowski",
|
|
17
|
+
"homepage": "https://github.com/szymonmaslowski/simply-stated#readme",
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "git+https://github.com/szymonmaslowski/simply-stated.git",
|
|
21
|
+
"directory": "simply-stated"
|
|
22
|
+
},
|
|
23
|
+
"bugs": {
|
|
24
|
+
"url": "https://github.com/szymonmaslowski/simply-stated/issues"
|
|
25
|
+
},
|
|
26
|
+
"type": "module",
|
|
27
|
+
"main": "./dist/index.js",
|
|
28
|
+
"module": "./dist/index.js",
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"exports": {
|
|
31
|
+
".": {
|
|
32
|
+
"types": "./dist/index.d.ts",
|
|
33
|
+
"import": "./dist/index.js",
|
|
34
|
+
"require": "./dist/index.js"
|
|
35
|
+
},
|
|
36
|
+
"./redux-toolkit": {
|
|
37
|
+
"types": "./dist/adapters/redux-toolkit/index.d.ts",
|
|
38
|
+
"import": "./dist/adapters/redux-toolkit/index.js",
|
|
39
|
+
"require": "./dist/adapters/redux-toolkit/index.js"
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
"files": [
|
|
43
|
+
"dist"
|
|
44
|
+
],
|
|
45
|
+
"peerDependencies": {
|
|
46
|
+
"@reduxjs/toolkit": "^2.0.0"
|
|
47
|
+
},
|
|
48
|
+
"peerDependenciesMeta": {
|
|
49
|
+
"@reduxjs/toolkit": {
|
|
50
|
+
"optional": true
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"dependencies": {
|
|
54
|
+
"type-fest": "^5.7.0"
|
|
55
|
+
}
|
|
56
|
+
}
|