@doeixd/machine 1.2.0 → 1.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.
- package/README.md +3 -1
- package/dist/cjs/development/core.js +4 -2
- package/dist/cjs/development/core.js.map +2 -2
- package/dist/cjs/development/index.js +17 -7
- package/dist/cjs/development/index.js.map +2 -2
- package/dist/cjs/development/minimal.js +13 -5
- package/dist/cjs/development/minimal.js.map +2 -2
- package/dist/cjs/development/react.js +4 -2
- package/dist/cjs/development/react.js.map +2 -2
- package/dist/cjs/production/core.js +1 -1
- package/dist/cjs/production/index.js +2 -2
- package/dist/cjs/production/minimal.js +1 -1
- package/dist/cjs/production/react.js +1 -1
- package/dist/esm/development/core.js +4 -2
- package/dist/esm/development/core.js.map +2 -2
- package/dist/esm/development/index.js +17 -7
- package/dist/esm/development/index.js.map +2 -2
- package/dist/esm/development/minimal.js +13 -5
- package/dist/esm/development/minimal.js.map +2 -2
- package/dist/esm/development/react.js +4 -2
- package/dist/esm/development/react.js.map +2 -2
- package/dist/esm/production/core.js +1 -1
- package/dist/esm/production/index.js +2 -2
- package/dist/esm/production/minimal.js +1 -1
- package/dist/esm/production/react.js +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/minimal.d.ts +5 -28
- package/dist/types/minimal.d.ts.map +1 -1
- package/dist/types/types.d.ts +2 -2
- package/dist/types/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +4 -2
- package/src/minimal.ts +20 -38
- package/src/types.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"minimal.d.ts","sourceRoot":"","sources":["../../src/minimal.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;GAEG;AACH,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAGjD,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,KAAK,EAAE,KAAK,OAAO,EAAE,MAAM,SAAS,CAAC;AAMhE;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,EACzC,OAAO,EAAE,CAAC,EACV,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,GAAG,KAAK,CAAC,GAChD,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"minimal.d.ts","sourceRoot":"","sources":["../../src/minimal.ts"],"names":[],"mappings":"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"}
|
package/dist/types/types.d.ts
CHANGED
|
@@ -80,8 +80,8 @@ export declare namespace tag {
|
|
|
80
80
|
* @param name - The tag name
|
|
81
81
|
* @example const idle = tag.factory<{ count: number }>('idle');
|
|
82
82
|
*/
|
|
83
|
-
function factory<C extends object, T extends object = {}>(name:
|
|
84
|
-
readonly tag:
|
|
83
|
+
function factory<C extends object, T extends object = {}, K extends string = string>(name: K): (props: C) => {
|
|
84
|
+
readonly tag: K;
|
|
85
85
|
} & C & T;
|
|
86
86
|
/**
|
|
87
87
|
* Creates a curried tag factory, ideal for use with the States utility.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,CAAC,GAAG,CAAC,CAAC;AAEzE;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAA;CAAE,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAEnF;;GAEG;AACH,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI;IAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAA;CAAE,CAAC;AAEpE;;GAEG;AACH,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;AAE/C;;;;;;;GAOG;AACH,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI;KACpD,CAAC,IAAI,MAAM,CAAC,GAAG;QAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAA;KAAE,GAAG,CAAC,CAAC,CAAC,CAAC;CAC3C,CAAC,MAAM,CAAC,CAAC,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC;AAEjC;;;;;GAKG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;AAE5E;;GAEG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;AAE3E;;GAEG;AACH,wBAAgB,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG;IAAE,GAAG,EAAE,CAAC,CAAA;CAAE,CAAC;AAC3D,wBAAgB,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG;IAAE,GAAG,EAAE,CAAC,CAAA;CAAE,GAAG,CAAC,CAAC;AAC3F,wBAAgB,GAAG,CAAC,KAAK,CAAC,CAAC,SAAS;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;AAchE;;GAEG;AACH,yBAAiB,GAAG,CAAC;IACnB;;;;;;;;;;;;OAYG;IACH,SAAgB,OAAO,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,GAAG,EAAE,EAAE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -384,13 +384,15 @@ export function createMachine<C extends object, M extends BaseMachine<C>>(
|
|
|
384
384
|
|
|
385
385
|
export function createMachine(context: any, fnsOrFactory: any): any {
|
|
386
386
|
if (typeof fnsOrFactory === 'function') {
|
|
387
|
+
let self: any;
|
|
387
388
|
let transitions: any;
|
|
388
389
|
const transition = (newContext: any) => {
|
|
389
|
-
return createMachine(newContext, transitions);
|
|
390
|
+
return newContext === context ? self : createMachine(newContext, transitions);
|
|
390
391
|
};
|
|
391
392
|
transitions = fnsOrFactory(transition);
|
|
392
393
|
|
|
393
|
-
|
|
394
|
+
self = attachTransitions(Object.assign({ context }, transitions), transitions);
|
|
395
|
+
return self;
|
|
394
396
|
}
|
|
395
397
|
|
|
396
398
|
// If fns is a machine (has context property), extract just the transition functions
|
package/src/minimal.ts
CHANGED
|
@@ -30,9 +30,10 @@ export function machine<C extends object, T>(
|
|
|
30
30
|
context: C,
|
|
31
31
|
factory: (ctx: C, next: (context: C) => any) => T
|
|
32
32
|
): C & T {
|
|
33
|
-
|
|
34
|
-
const
|
|
35
|
-
|
|
33
|
+
let self!: C & T;
|
|
34
|
+
const next = (newContext: C): any => (newContext === context ? self : machine(newContext, factory));
|
|
35
|
+
self = Object.assign({}, context, factory(context, next)) as C & T;
|
|
36
|
+
return self;
|
|
36
37
|
}
|
|
37
38
|
|
|
38
39
|
// ============================================================================
|
|
@@ -210,9 +211,16 @@ export function withChildren<
|
|
|
210
211
|
// Re-exports from types.ts are enough
|
|
211
212
|
|
|
212
213
|
export function factory<C extends object>() {
|
|
213
|
-
return <T
|
|
214
|
-
transitionFactory: (ctx: C, next: (context: C) =>
|
|
215
|
-
) =>
|
|
214
|
+
return <T extends Record<string, Function>>(
|
|
215
|
+
transitionFactory: (ctx: C, next: (context: C) => C & T) => T
|
|
216
|
+
) => {
|
|
217
|
+
type M = C & T;
|
|
218
|
+
const resultFactory = (context: C): M => {
|
|
219
|
+
const next = (c: C) => resultFactory(c);
|
|
220
|
+
return machine(context, (ctx: any) => transitionFactory(ctx, next as any)) as any;
|
|
221
|
+
};
|
|
222
|
+
return resultFactory;
|
|
223
|
+
};
|
|
216
224
|
}
|
|
217
225
|
|
|
218
226
|
/**
|
|
@@ -223,45 +231,19 @@ export type UnionOf<F extends (...args: any[]) => any> = ReturnType<F>;
|
|
|
223
231
|
/**
|
|
224
232
|
* Creates a union factory that routes to different transition factories based on a tag.
|
|
225
233
|
* This is the primary way to define multi-state machines (Type-States) in the minimal API.
|
|
226
|
-
*
|
|
227
|
-
* @param factories - A map of tags to transition factories.
|
|
228
|
-
* @returns A single factory function that produces the correct machine based on the input context's tag.
|
|
229
|
-
*
|
|
230
|
-
* @example
|
|
231
|
-
* const auth = union({
|
|
232
|
-
* idle: (ctx, next) => ({ login: () => next({ tag: 'loggedIn', user: 'alice' }) }),
|
|
233
|
-
* loggedIn: (ctx, next) => ({ logout: () => next({ tag: 'idle' }) })
|
|
234
|
-
* });
|
|
235
|
-
*
|
|
236
|
-
* const m = auth({ tag: 'idle' });
|
|
237
|
-
* const next = m.login(); // Transition to loggedIn state
|
|
238
|
-
*/
|
|
239
|
-
/**
|
|
240
|
-
* Creates a union factory that routes to different transition factories based on a tag.
|
|
241
|
-
* This is the primary way to define multi-state machines (Type-States) in the minimal API.
|
|
242
|
-
*
|
|
243
|
-
* @example
|
|
244
|
-
* const auth = union<AuthState>()({
|
|
245
|
-
* idle: (ctx, next) => ({ login: () => next({ tag: 'loggedIn', user: 'alice' }) }),
|
|
246
|
-
* loggedIn: (ctx, next) => ({ logout: () => next({ tag: 'idle' }) })
|
|
247
|
-
* });
|
|
248
|
-
*
|
|
249
|
-
* const m = auth({ tag: 'idle' });
|
|
250
|
-
* const next = m.login(); // Transition to loggedIn state
|
|
251
234
|
*/
|
|
252
235
|
export function union<C extends Tagged>() {
|
|
253
236
|
return <F extends { [K in TagOf<C>]: (ctx: Extract<C, { tag: K }>, next: (c: C) => any) => any }>(
|
|
254
237
|
factories: F
|
|
255
238
|
) => {
|
|
256
|
-
type
|
|
257
|
-
[K in TagOf<C> & keyof F]:
|
|
258
|
-
|
|
259
|
-
: never
|
|
260
|
-
};
|
|
239
|
+
type MachineUnion = {
|
|
240
|
+
[K in TagOf<C> & keyof F]: Extract<C, { tag: K }> & ReturnType<F[K]>
|
|
241
|
+
}[TagOf<C> & keyof F];
|
|
261
242
|
|
|
262
|
-
const resultFactory = <T extends C>(context: T):
|
|
243
|
+
const resultFactory = <T extends C>(context: T): Extract<MachineUnion, { tag: T['tag'] }> => {
|
|
263
244
|
const factoryFn = (factories as any)[(context as any).tag];
|
|
264
|
-
|
|
245
|
+
const next = (c: C) => resultFactory(c as any);
|
|
246
|
+
return machine(context as any, (ctx: any) => factoryFn(ctx as any, next as any)) as any;
|
|
265
247
|
};
|
|
266
248
|
|
|
267
249
|
return resultFactory;
|
package/src/types.ts
CHANGED
|
@@ -88,7 +88,7 @@ export namespace tag {
|
|
|
88
88
|
* @param name - The tag name
|
|
89
89
|
* @example const idle = tag.factory<{ count: number }>('idle');
|
|
90
90
|
*/
|
|
91
|
-
export function factory<C extends object, T extends object = {}>(name:
|
|
91
|
+
export function factory<C extends object, T extends object = {}, K extends string = string>(name: K): (props: C) => { readonly tag: K } & C & T;
|
|
92
92
|
/**
|
|
93
93
|
* Creates a curried tag factory, ideal for use with the States utility.
|
|
94
94
|
* @example const state = tag.factory<AppState>()('idle')({ count: 0 });
|