@doeixd/machine 0.0.13 → 0.0.18
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/README.md +77 -25
- package/dist/cjs/development/core.js +1852 -0
- package/dist/cjs/development/core.js.map +7 -0
- package/dist/cjs/development/index.js +1377 -1372
- package/dist/cjs/development/index.js.map +4 -4
- package/dist/cjs/production/core.js +1 -0
- package/dist/cjs/production/index.js +5 -5
- package/dist/esm/development/core.js +1829 -0
- package/dist/esm/development/core.js.map +7 -0
- package/dist/esm/development/index.js +1377 -1372
- package/dist/esm/development/index.js.map +4 -4
- package/dist/esm/production/core.js +1 -0
- package/dist/esm/production/index.js +5 -5
- package/dist/types/core.d.ts +18 -0
- package/dist/types/core.d.ts.map +1 -0
- package/dist/types/extract.d.ts +15 -1
- package/dist/types/extract.d.ts.map +1 -1
- package/dist/types/functional-combinators.d.ts +3 -5
- package/dist/types/functional-combinators.d.ts.map +1 -1
- package/dist/types/index.d.ts +254 -18
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/middleware/composition.d.ts +460 -0
- package/dist/types/middleware/composition.d.ts.map +1 -0
- package/dist/types/middleware/core.d.ts +196 -0
- package/dist/types/middleware/core.d.ts.map +1 -0
- package/dist/types/middleware/history.d.ts +54 -0
- package/dist/types/middleware/history.d.ts.map +1 -0
- package/dist/types/middleware/index.d.ts +10 -0
- package/dist/types/middleware/index.d.ts.map +1 -0
- package/dist/types/middleware/snapshot.d.ts +63 -0
- package/dist/types/middleware/snapshot.d.ts.map +1 -0
- package/dist/types/middleware/time-travel.d.ts +81 -0
- package/dist/types/middleware/time-travel.d.ts.map +1 -0
- package/package.json +19 -6
- package/src/core.ts +167 -0
- package/src/entry-react.ts +9 -0
- package/src/entry-solid.ts +9 -0
- package/src/extract.ts +61 -61
- package/src/functional-combinators.ts +3 -3
- package/src/generators.ts +6 -6
- package/src/index.ts +389 -101
- package/src/middleware/composition.ts +944 -0
- package/src/middleware/core.ts +573 -0
- package/src/middleware/history.ts +104 -0
- package/src/middleware/index.ts +13 -0
- package/src/middleware/snapshot.ts +153 -0
- package/src/middleware/time-travel.ts +236 -0
- package/src/middleware.ts +735 -1614
- package/src/prototype_functional.ts +46 -0
- package/src/reproduce_issue.ts +26 -0
- package/dist/types/middleware.d.ts +0 -1048
- package/dist/types/middleware.d.ts.map +0 -1
- package/dist/types/runtime-extract.d.ts +0 -53
- package/dist/types/runtime-extract.d.ts.map +0 -1
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// Mocking the core types for the prototype
|
|
2
|
+
type Machine<C, T> = { context: C } & T;
|
|
3
|
+
|
|
4
|
+
function createMachineInternal<C, T>(context: C, transitions: T): Machine<C, T> {
|
|
5
|
+
return Object.assign({ context }, transitions) as Machine<C, T>;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
// Proposed API
|
|
9
|
+
// fn takes a 'transition' helper and returns the transitions object
|
|
10
|
+
export function createMachine<C, T extends Record<string, (this: C, ...args: any[]) => any>>(
|
|
11
|
+
context: C,
|
|
12
|
+
fn: (transition: (newContext: C) => Machine<C, T>) => T
|
|
13
|
+
): Machine<C, T> {
|
|
14
|
+
// We need to handle the circularity:
|
|
15
|
+
// T depends on the return type of fn.
|
|
16
|
+
// fn needs 'transition' which returns Machine<C, T>.
|
|
17
|
+
|
|
18
|
+
// In runtime:
|
|
19
|
+
let transitions: T;
|
|
20
|
+
|
|
21
|
+
const transition = (newContext: C) => {
|
|
22
|
+
return createMachineInternal(newContext, transitions);
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
transitions = fn(transition);
|
|
26
|
+
|
|
27
|
+
return createMachineInternal(context, transitions);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Usage Test
|
|
31
|
+
type Context = { count: number };
|
|
32
|
+
|
|
33
|
+
const machine = createMachine({ count: 0 }, (transition) => ({
|
|
34
|
+
inc() {
|
|
35
|
+
// 'this' should be Context
|
|
36
|
+
return transition({ count: this.count + 1 });
|
|
37
|
+
},
|
|
38
|
+
add(n: number) {
|
|
39
|
+
return transition({ count: this.count + n });
|
|
40
|
+
}
|
|
41
|
+
}));
|
|
42
|
+
|
|
43
|
+
// Verify types
|
|
44
|
+
const next = machine.inc(); // Should be Machine<Context, ...>
|
|
45
|
+
const val = next.context.count;
|
|
46
|
+
const next2 = next.add(5);
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { createMachine } from './index';
|
|
2
|
+
|
|
3
|
+
type ContextA = { count: number };
|
|
4
|
+
type ContextB = { text: string };
|
|
5
|
+
|
|
6
|
+
const machineA = createMachine<ContextA, any>({ count: 0 }, {
|
|
7
|
+
next() {
|
|
8
|
+
// Check if this.transitions exists
|
|
9
|
+
console.log('this.transitions is:', (this as any).transitions);
|
|
10
|
+
|
|
11
|
+
// Passing `this` which includes `context: ContextA`
|
|
12
|
+
// to a machine that expects `ContextB`.
|
|
13
|
+
return createMachine<ContextB, any>({ text: "hello" }, this);
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
// Check the type of machineA.next()
|
|
18
|
+
const machineB = machineA.next();
|
|
19
|
+
|
|
20
|
+
// machineB.context should be ContextB
|
|
21
|
+
// But if the issue exists, it might have issues.
|
|
22
|
+
const text: string = machineB.context.text;
|
|
23
|
+
|
|
24
|
+
// Let's try to access a property that shouldn't exist if types are correct
|
|
25
|
+
// @ts-expect-error
|
|
26
|
+
const count: number = machineB.context.count;
|