@xmachines/play-xstate 1.0.0-beta.7 → 1.0.0-beta.9
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 +25 -19
- package/dist/catalog/index.d.ts +1 -1
- package/dist/catalog/index.d.ts.map +1 -1
- package/dist/catalog/types.d.ts +2 -11
- package/dist/catalog/types.d.ts.map +1 -1
- package/dist/catalog/validate-binding.d.ts +2 -1
- package/dist/catalog/validate-binding.d.ts.map +1 -1
- package/dist/catalog/validate-binding.js.map +1 -1
- package/dist/catalog/validate-props.d.ts +20 -4
- package/dist/catalog/validate-props.d.ts.map +1 -1
- package/dist/catalog/validate-props.js +3 -23
- package/dist/catalog/validate-props.js.map +1 -1
- package/dist/guards/compose.d.ts +7 -3
- package/dist/guards/compose.d.ts.map +1 -1
- package/dist/guards/compose.js +26 -0
- package/dist/guards/compose.js.map +1 -1
- package/dist/guards/helpers.d.ts +4 -21
- package/dist/guards/helpers.d.ts.map +1 -1
- package/dist/guards/helpers.js +11 -2
- package/dist/guards/helpers.js.map +1 -1
- package/dist/guards/types.d.ts +3 -2
- package/dist/guards/types.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/player-actor.d.ts +6 -10
- package/dist/player-actor.d.ts.map +1 -1
- package/dist/player-actor.js +31 -19
- package/dist/player-actor.js.map +1 -1
- package/dist/player-actor.typecheck.js +4 -2
- package/dist/player-actor.typecheck.js.map +1 -1
- package/dist/routing/build-url.d.ts.map +1 -1
- package/dist/routing/build-url.js +2 -1
- package/dist/routing/build-url.js.map +1 -1
- package/dist/routing/derive-route.d.ts +1 -1
- package/dist/routing/derive-route.d.ts.map +1 -1
- package/dist/routing/derive-route.js +2 -2
- package/dist/routing/derive-route.js.map +1 -1
- package/dist/routing/format-play-route-transitions.d.ts +7 -6
- package/dist/routing/format-play-route-transitions.d.ts.map +1 -1
- package/dist/routing/format-play-route-transitions.js +19 -21
- package/dist/routing/format-play-route-transitions.js.map +1 -1
- package/dist/routing/types.d.ts +5 -0
- package/dist/routing/types.d.ts.map +1 -1
- package/dist/signals/state-signal.d.ts +1 -1
- package/dist/signals/state-signal.d.ts.map +1 -1
- package/dist/types.d.ts +10 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +9 -9
package/README.md
CHANGED
|
@@ -19,22 +19,15 @@ Per [RFC Play v1](https://gitlab.com/xmachin-es/rfc/-/blob/main/src/play-v1.md),
|
|
|
19
19
|
## Installation
|
|
20
20
|
|
|
21
21
|
```bash
|
|
22
|
-
npm install xstate@^5.0.0
|
|
22
|
+
npm install xstate@^5.0.0
|
|
23
23
|
npm install @xmachines/play-xstate
|
|
24
24
|
```
|
|
25
25
|
|
|
26
|
-
## Current Exports
|
|
27
|
-
|
|
28
|
-
- `definePlayer`, `PlayerActor`
|
|
29
|
-
- player types: `PlayerConfig`, `PlayerOptions`, `PlayerFactory`
|
|
30
|
-
- guard utilities: `composeGuards`, `composeGuardsOr`, `negateGuard`, `hasContext`, `eventMatches`, `stateMatches`
|
|
31
|
-
- routing utilities: `deriveRoute`, `isAbsoluteRoute`, `buildRouteUrl`, `formatPlayRouteTransitions`
|
|
32
|
-
- catalog utilities: `validateComponentBinding`, `validateViewProps`, `mergeViewProps`
|
|
33
|
-
|
|
34
26
|
**Peer dependencies:**
|
|
35
27
|
|
|
36
|
-
- `xstate` ^5.0.0
|
|
37
|
-
|
|
28
|
+
- `xstate` ^5.0.0 — State machine runtime
|
|
29
|
+
|
|
30
|
+
> `zod` is a direct dependency of `@xmachines/play-xstate` (not a peer). You do not need to install it separately unless you use it in your own catalog schemas.
|
|
38
31
|
|
|
39
32
|
## Quick Start
|
|
40
33
|
|
|
@@ -152,20 +145,33 @@ Concrete actor implementing Play signal protocol:
|
|
|
152
145
|
|
|
153
146
|
**Signal Properties:**
|
|
154
147
|
|
|
155
|
-
- `state: Signal.State<
|
|
156
|
-
- `currentRoute: Signal.Computed<string | null>`
|
|
157
|
-
- `currentView: Signal.
|
|
148
|
+
- `state: Signal.State<AnyMachineSnapshot>` — Reactive snapshot of current state
|
|
149
|
+
- `currentRoute: Signal.Computed<string | null>` — Derived navigation path
|
|
150
|
+
- `currentView: Signal.State<ViewMetadata | null>` — Current UI structure (updated at state entry)
|
|
158
151
|
|
|
159
152
|
**Actor Properties:**
|
|
160
153
|
|
|
161
|
-
- `catalog: Catalog`
|
|
154
|
+
- `catalog: Catalog` — Component catalog
|
|
155
|
+
|
|
156
|
+
**Constructor:**
|
|
157
|
+
|
|
158
|
+
```typescript
|
|
159
|
+
new PlayerActor(machine, catalog, options, input?)
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
- `input` — Typed as `InputFrom<TMachine>`. Consumers receive compile-time validation against the machine's input schema. Pass initial context values required by the machine.
|
|
162
163
|
|
|
163
164
|
**Methods:**
|
|
164
165
|
|
|
165
|
-
- `start()`
|
|
166
|
-
- `stop()`
|
|
167
|
-
- `send(event: PlayEvent)`
|
|
168
|
-
- `dispose()`
|
|
166
|
+
- `start()` — Start the actor (must call after creation)
|
|
167
|
+
- `stop()` — Stop the actor
|
|
168
|
+
- `send(event: PlayEvent)` — Send event to actor
|
|
169
|
+
- `dispose()` — Convenience cleanup (calls stop())
|
|
170
|
+
|
|
171
|
+
**Prop validation modes** (via `PlayerOptions.propValidation`):
|
|
172
|
+
|
|
173
|
+
- `"lenient"` (default) — On catalog prop validation failure, calls `onError` hook and renders with unvalidated props
|
|
174
|
+
- `"strict"` — On catalog prop validation failure, calls `onError` hook and sets `currentView` to `null` (blocks render)
|
|
169
175
|
|
|
170
176
|
**Example:**
|
|
171
177
|
|
package/dist/catalog/index.d.ts
CHANGED
|
@@ -9,5 +9,5 @@
|
|
|
9
9
|
export { validateComponentBinding } from "./validate-binding.js";
|
|
10
10
|
export { validateViewProps, mergeViewProps, createMemoSignature } from "./validate-props.js";
|
|
11
11
|
export type { ValidationResult, ViewMergeContext } from "./validate-props.js";
|
|
12
|
-
export type { Catalog, CatalogEntry
|
|
12
|
+
export type { Catalog, CatalogEntry } from "./types.js";
|
|
13
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/catalog/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC7F,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC9E,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/catalog/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC7F,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC9E,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/catalog/types.d.ts
CHANGED
|
@@ -7,9 +7,9 @@ import type { Catalog as BaseCatalog } from "@xmachines/play-catalog";
|
|
|
7
7
|
*/
|
|
8
8
|
export interface CatalogEntry {
|
|
9
9
|
/** Zod schema for component props */
|
|
10
|
-
schema: z.ZodType<
|
|
10
|
+
schema: z.ZodType<unknown>;
|
|
11
11
|
/** React component (or other framework component) */
|
|
12
|
-
component:
|
|
12
|
+
component: unknown;
|
|
13
13
|
}
|
|
14
14
|
/**
|
|
15
15
|
* Component catalog mapping
|
|
@@ -24,13 +24,4 @@ export interface CatalogEntry {
|
|
|
24
24
|
* otherwise treats as direct Zod schema.
|
|
25
25
|
*/
|
|
26
26
|
export type Catalog = BaseCatalog | Record<string, CatalogEntry>;
|
|
27
|
-
/**
|
|
28
|
-
* View metadata from state machine
|
|
29
|
-
*/
|
|
30
|
-
export interface ViewMetadata {
|
|
31
|
-
/** Component name from catalog */
|
|
32
|
-
component: string;
|
|
33
|
-
/** Additional view props/data */
|
|
34
|
-
[key: string]: any;
|
|
35
|
-
}
|
|
36
27
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/catalog/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtE;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC5B,qCAAqC;IACrC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/catalog/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtE;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC5B,qCAAqC;IACrC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3B,qDAAqD;IACrD,SAAS,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,OAAO,GAAG,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-binding.d.ts","sourceRoot":"","sources":["../../src/catalog/validate-binding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"validate-binding.d.ts","sourceRoot":"","sources":["../../src/catalog/validate-binding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,wBAAwB,GAAI,MAAM,YAAY,EAAE,SAAS,OAAO,KAAG,IAc/E,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-binding.js","sourceRoot":"","sources":["../../src/catalog/validate-binding.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validate-binding.js","sourceRoot":"","sources":["../../src/catalog/validate-binding.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,IAAkB,EAAE,OAAgB,EAAQ,EAAE;IACtF,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAE3B,qBAAqB;IACrB,IAAI,CAAC,CAAC,SAAS,IAAI,OAAO,CAAC,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,IAAI,KAAK,CACd,cAAc,SAAS,iDAAiD,SAAS,IAAI,QAAQ,EAAE,CAC/F,CAAC;IACH,CAAC;AACF,CAAC,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { z } from "zod";
|
|
2
|
-
import type { Catalog
|
|
2
|
+
import type { Catalog } from "./types.js";
|
|
3
|
+
import type { ViewMetadata } from "@xmachines/play-actor";
|
|
3
4
|
export type ViewMergeContext = {
|
|
4
5
|
routeParams?: Record<string, unknown>;
|
|
5
6
|
queryParams?: Record<string, unknown>;
|
|
@@ -7,13 +8,28 @@ export type ViewMergeContext = {
|
|
|
7
8
|
};
|
|
8
9
|
export type ValidationResult = {
|
|
9
10
|
success: true;
|
|
10
|
-
data: unknown
|
|
11
|
+
data: Record<string, unknown>;
|
|
11
12
|
} | {
|
|
12
13
|
success: false;
|
|
13
14
|
error: z.ZodError | Error;
|
|
14
15
|
};
|
|
15
16
|
/**
|
|
16
|
-
* Validate view props against Zod schema
|
|
17
|
+
* Validate view props against Zod schema — generic overload for typed catalogs
|
|
18
|
+
*
|
|
19
|
+
* When called with a typed catalog, `componentName` is constrained to `keyof TCatalog`.
|
|
20
|
+
* Malformed catalog entries or unknown component names produce compile-time errors
|
|
21
|
+
* rather than runtime failures.
|
|
22
|
+
*
|
|
23
|
+
* @typeParam TCatalog - Catalog type (must extend Catalog)
|
|
24
|
+
*
|
|
25
|
+
* @param componentName - Component name constrained to string keys of TCatalog
|
|
26
|
+
* @param props - Props to validate
|
|
27
|
+
* @param catalog - Typed component catalog
|
|
28
|
+
* @returns Zod parse result
|
|
29
|
+
*/
|
|
30
|
+
export declare function validateViewProps<TCatalog extends Catalog>(componentName: keyof TCatalog & string, props: unknown, catalog: TCatalog): ValidationResult;
|
|
31
|
+
/**
|
|
32
|
+
* Validate view props against Zod schema — base overload for untyped catalogs
|
|
17
33
|
*
|
|
18
34
|
* Per CONTEXT.md:
|
|
19
35
|
* - "Prop validation: At state entry"
|
|
@@ -35,7 +51,7 @@ export type ValidationResult = {
|
|
|
35
51
|
* @param catalog - Component catalog with schemas
|
|
36
52
|
* @returns Zod parse result
|
|
37
53
|
*/
|
|
38
|
-
export declare
|
|
54
|
+
export declare function validateViewProps(componentName: string, props: unknown, catalog: Catalog): ValidationResult;
|
|
39
55
|
/**
|
|
40
56
|
* Merge view metadata with context for props
|
|
41
57
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-props.d.ts","sourceRoot":"","sources":["../../src/catalog/validate-props.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"validate-props.d.ts","sourceRoot":"","sources":["../../src/catalog/validate-props.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,MAAM,gBAAgB,GAAG;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GACzB;IACA,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7B,GACD;IACA,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,CAAC,CAAC,QAAQ,GAAG,KAAK,CAAC;CACzB,CAAC;AAEL;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,SAAS,OAAO,EACzD,aAAa,EAAE,MAAM,QAAQ,GAAG,MAAM,EACtC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,QAAQ,GACf,gBAAgB,CAAC;AAEpB;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,iBAAiB,CAChC,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,OAAO,GACd,gBAAgB,CAAC;AAsCpB;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,GAC1B,MAAM,YAAY,EAClB,SAAS,gBAAgB,GAAG,IAAI,GAAG,SAAS,KAC1C,MAAM,CAAC,MAAM,EAAE,OAAO,CAkDxB,CAAC;AAiEF,eAAO,MAAM,mBAAmB,GAAI,OAAO,OAAO,KAAG,MAEpD,CAAC"}
|
|
@@ -1,27 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* Per CONTEXT.md:
|
|
5
|
-
* - "Prop validation: At state entry"
|
|
6
|
-
* - "currentView derivation: Merge meta.view with relevant context data"
|
|
7
|
-
*
|
|
8
|
-
* Per RESEARCH.md Pattern 4: Use safeParse() for validation
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* ```typescript
|
|
12
|
-
* const props = { userId: '123', stats: { logins: 5 } };
|
|
13
|
-
* const result = validateViewProps('Dashboard', props, catalog);
|
|
14
|
-
* if (!result.success) {
|
|
15
|
-
* console.error(result.error);
|
|
16
|
-
* }
|
|
17
|
-
* ```
|
|
18
|
-
*
|
|
19
|
-
* @param componentName - Component name from catalog
|
|
20
|
-
* @param props - Props to validate
|
|
21
|
-
* @param catalog - Component catalog with schemas
|
|
22
|
-
* @returns Zod parse result
|
|
2
|
+
* Implementation — shared by both overloads
|
|
23
3
|
*/
|
|
24
|
-
export
|
|
4
|
+
export function validateViewProps(componentName, props, catalog) {
|
|
25
5
|
const entry = catalog[componentName];
|
|
26
6
|
if (!entry) {
|
|
27
7
|
return {
|
|
@@ -43,7 +23,7 @@ export const validateViewProps = (componentName, props, catalog) => {
|
|
|
43
23
|
success: true,
|
|
44
24
|
data: result.data,
|
|
45
25
|
};
|
|
46
|
-
}
|
|
26
|
+
}
|
|
47
27
|
/**
|
|
48
28
|
* Merge view metadata with context for props
|
|
49
29
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-props.js","sourceRoot":"","sources":["../../src/catalog/validate-props.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validate-props.js","sourceRoot":"","sources":["../../src/catalog/validate-props.ts"],"names":[],"mappings":"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"}
|
package/dist/guards/compose.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import type { GuardPredicate } from "xstate";
|
|
1
2
|
import type { Guard, GuardArray } from "./types.js";
|
|
3
|
+
import type { MachineContext, EventObject, ParameterizedObject } from "xstate";
|
|
4
|
+
type ComposedGuard = GuardPredicate<MachineContext, EventObject, unknown, ParameterizedObject>;
|
|
2
5
|
/**
|
|
3
6
|
* Compose guards with AND logic using XState's and() helper
|
|
4
7
|
*
|
|
@@ -54,7 +57,7 @@ import type { Guard, GuardArray } from "./types.js";
|
|
|
54
57
|
* @see {@link composeGuardsOr} for OR composition
|
|
55
58
|
* @see {@link negateGuard} for NOT logic
|
|
56
59
|
*/
|
|
57
|
-
export declare const composeGuards: <TContext = any, TEvent = any>(guards: GuardArray<TContext, TEvent>) =>
|
|
60
|
+
export declare const composeGuards: <TContext = any, TEvent = any>(guards: GuardArray<TContext, TEvent>) => ComposedGuard;
|
|
58
61
|
/**
|
|
59
62
|
* Compose guards with OR logic using XState's or() helper
|
|
60
63
|
*
|
|
@@ -95,7 +98,7 @@ export declare const composeGuards: <TContext = any, TEvent = any>(guards: Guard
|
|
|
95
98
|
* @see {@link composeGuards} for AND composition
|
|
96
99
|
* @see {@link negateGuard} for NOT logic
|
|
97
100
|
*/
|
|
98
|
-
export declare const composeGuardsOr: <TContext = any, TEvent = any>(guards: GuardArray<TContext, TEvent>) =>
|
|
101
|
+
export declare const composeGuardsOr: <TContext = any, TEvent = any>(guards: GuardArray<TContext, TEvent>) => ComposedGuard;
|
|
99
102
|
/**
|
|
100
103
|
* Negate a guard using XState's not() helper
|
|
101
104
|
*
|
|
@@ -132,5 +135,6 @@ export declare const composeGuardsOr: <TContext = any, TEvent = any>(guards: Gua
|
|
|
132
135
|
* @see {@link composeGuards} for AND composition
|
|
133
136
|
* @see {@link composeGuardsOr} for OR composition
|
|
134
137
|
*/
|
|
135
|
-
export declare const negateGuard: <TContext = any, TEvent = any>(guard: Guard<TContext, TEvent> | string) =>
|
|
138
|
+
export declare const negateGuard: <TContext = any, TEvent = any>(guard: Guard<TContext, TEvent> | string) => ComposedGuard;
|
|
139
|
+
export {};
|
|
136
140
|
//# sourceMappingURL=compose.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../src/guards/compose.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../src/guards/compose.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAK/E,KAAK,aAAa,GAAG,cAAc,CAAC,cAAc,EAAE,WAAW,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC;AAE/F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AAEH,eAAO,MAAM,aAAa,GAAI,QAAQ,GAAG,GAAG,EAAE,MAAM,GAAG,GAAG,EACzD,QAAQ,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,KAClC,aAqBF,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,eAAO,MAAM,eAAe,GAAI,QAAQ,GAAG,GAAG,EAAE,MAAM,GAAG,GAAG,EAC3D,QAAQ,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,KAClC,aAmBF,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,eAAO,MAAM,WAAW,GAAI,QAAQ,GAAG,GAAG,EAAE,MAAM,GAAG,GAAG,EACvD,OAAO,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,MAAM,KACrC,aAOF,CAAC"}
|
package/dist/guards/compose.js
CHANGED
|
@@ -54,15 +54,25 @@ import { and, or, not } from "xstate";
|
|
|
54
54
|
* @see {@link composeGuardsOr} for OR composition
|
|
55
55
|
* @see {@link negateGuard} for NOT logic
|
|
56
56
|
*/
|
|
57
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
57
58
|
export const composeGuards = (guards) => {
|
|
58
59
|
if (guards.length === 0) {
|
|
59
60
|
throw new Error("composeGuards requires at least one guard");
|
|
60
61
|
}
|
|
61
62
|
if (guards.length === 1) {
|
|
63
|
+
// Single guard passthrough — cast through unknown because our Guard<TContext, TEvent>
|
|
64
|
+
// does not structurally match ComposedGuard at compile time (generic event mismatch).
|
|
65
|
+
// At runtime both are plain function objects with identical shape.
|
|
66
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
62
67
|
return guards[0];
|
|
63
68
|
}
|
|
64
69
|
// Use XState's built-in and() for type inference and serialization
|
|
65
70
|
// Per RESEARCH.md: Don't hand-roll guard composition
|
|
71
|
+
// XState 5.28.0: and() requires `readonly [...tuple]` but our GuardArray is a mutable array.
|
|
72
|
+
// We cast through unknown to express the narrowest possible type boundary rather than
|
|
73
|
+
// escaping to `any`. The runtime value is identical.
|
|
74
|
+
// Track XState typing improvements: https://github.com/statelyai/xstate/issues
|
|
75
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
66
76
|
return and(guards);
|
|
67
77
|
};
|
|
68
78
|
/**
|
|
@@ -105,13 +115,23 @@ export const composeGuards = (guards) => {
|
|
|
105
115
|
* @see {@link composeGuards} for AND composition
|
|
106
116
|
* @see {@link negateGuard} for NOT logic
|
|
107
117
|
*/
|
|
118
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
108
119
|
export const composeGuardsOr = (guards) => {
|
|
109
120
|
if (guards.length === 0) {
|
|
110
121
|
throw new Error("composeGuardsOr requires at least one guard");
|
|
111
122
|
}
|
|
112
123
|
if (guards.length === 1) {
|
|
124
|
+
// Single guard passthrough — cast through unknown because our Guard<TContext, TEvent>
|
|
125
|
+
// does not structurally match ComposedGuard at compile time (generic event mismatch).
|
|
126
|
+
// At runtime both are plain function objects with identical shape.
|
|
127
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
113
128
|
return guards[0];
|
|
114
129
|
}
|
|
130
|
+
// XState 5.28.0: or() requires `readonly [...tuple]` but our GuardArray is a mutable array.
|
|
131
|
+
// We cast through unknown to express the narrowest possible type boundary rather than
|
|
132
|
+
// escaping to `any`. The runtime value is identical.
|
|
133
|
+
// Track XState typing improvements: https://github.com/statelyai/xstate/issues
|
|
134
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
115
135
|
return or(guards);
|
|
116
136
|
};
|
|
117
137
|
/**
|
|
@@ -150,7 +170,13 @@ export const composeGuardsOr = (guards) => {
|
|
|
150
170
|
* @see {@link composeGuards} for AND composition
|
|
151
171
|
* @see {@link composeGuardsOr} for OR composition
|
|
152
172
|
*/
|
|
173
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
153
174
|
export const negateGuard = (guard) => {
|
|
175
|
+
// XState 5.28.0: not() requires a specific SingleGuardArg shape, not our Guard type.
|
|
176
|
+
// We cast through unknown to express the narrowest possible type boundary rather than
|
|
177
|
+
// escaping to `any`. The runtime value is identical.
|
|
178
|
+
// Track XState typing improvements: https://github.com/statelyai/xstate/issues
|
|
179
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
154
180
|
return not(guard);
|
|
155
181
|
};
|
|
156
182
|
//# sourceMappingURL=compose.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compose.js","sourceRoot":"","sources":["../../src/guards/compose.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"compose.js","sourceRoot":"","sources":["../../src/guards/compose.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAUtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AACH,8DAA8D;AAC9D,MAAM,CAAC,MAAM,aAAa,GAAG,CAC5B,MAAoC,EACpB,EAAE;IAClB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,sFAAsF;QACtF,sFAAsF;QACtF,mEAAmE;QACnE,8DAA8D;QAC9D,OAAO,MAAM,CAAC,CAAC,CAA6B,CAAC;IAC9C,CAAC;IAED,mEAAmE;IACnE,qDAAqD;IACrD,6FAA6F;IAC7F,sFAAsF;IACtF,qDAAqD;IACrD,+EAA+E;IAC/E,8DAA8D;IAC9D,OAAO,GAAG,CAAC,MAA8C,CAAC,CAAC;AAC5D,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,8DAA8D;AAC9D,MAAM,CAAC,MAAM,eAAe,GAAG,CAC9B,MAAoC,EACpB,EAAE;IAClB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAChE,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,sFAAsF;QACtF,sFAAsF;QACtF,mEAAmE;QACnE,8DAA8D;QAC9D,OAAO,MAAM,CAAC,CAAC,CAA6B,CAAC;IAC9C,CAAC;IAED,4FAA4F;IAC5F,sFAAsF;IACtF,qDAAqD;IACrD,+EAA+E;IAC/E,8DAA8D;IAC9D,OAAO,EAAE,CAAC,MAA6C,CAAC,CAAC;AAC1D,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,8DAA8D;AAC9D,MAAM,CAAC,MAAM,WAAW,GAAG,CAC1B,KAAuC,EACvB,EAAE;IAClB,qFAAqF;IACrF,sFAAsF;IACtF,qDAAqD;IACrD,+EAA+E;IAC/E,8DAA8D;IAC9D,OAAO,GAAG,CAAC,KAA6C,CAAC,CAAC;AAC3D,CAAC,CAAC"}
|
package/dist/guards/helpers.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Guard } from "./types.js";
|
|
2
|
+
import type { PlayEvent } from "@xmachines/play";
|
|
2
3
|
/**
|
|
3
4
|
* Check if context has a truthy value at path
|
|
4
5
|
*
|
|
@@ -17,7 +18,7 @@ import type { Guard } from "./types.js";
|
|
|
17
18
|
* @param path - Dot-separated path to context property
|
|
18
19
|
* @returns Guard predicate checking if property is truthy
|
|
19
20
|
*/
|
|
20
|
-
export declare const hasContext: <TContext =
|
|
21
|
+
export declare const hasContext: <TContext = Record<string, unknown>>(path: string) => Guard<TContext, PlayEvent>;
|
|
21
22
|
/**
|
|
22
23
|
* Check if event type matches expected type
|
|
23
24
|
*
|
|
@@ -37,24 +38,6 @@ export declare const hasContext: <TContext = any>(path: string) => Guard<TContex
|
|
|
37
38
|
* @param eventType - Expected event type
|
|
38
39
|
* @returns Guard predicate checking event type
|
|
39
40
|
*/
|
|
40
|
-
export declare const eventMatches: <TEvent extends
|
|
41
|
-
|
|
42
|
-
} = any>(eventType: string) => Guard<any, TEvent>;
|
|
43
|
-
/**
|
|
44
|
-
* Check if current state matches expected value
|
|
45
|
-
*
|
|
46
|
-
* @example
|
|
47
|
-
* ```typescript
|
|
48
|
-
* const machine = setup({
|
|
49
|
-
* guards: {
|
|
50
|
-
* isLoggedIn: stateMatches('authenticated'),
|
|
51
|
-
* isDashboard: stateMatches('authenticated.dashboard')
|
|
52
|
-
* }
|
|
53
|
-
* });
|
|
54
|
-
* ```
|
|
55
|
-
*
|
|
56
|
-
* @param stateValue - Expected state value (string or object)
|
|
57
|
-
* @returns Guard predicate checking state value
|
|
58
|
-
*/
|
|
59
|
-
export declare const stateMatches: <TContext = any>(stateValue: string) => Guard<TContext, any>;
|
|
41
|
+
export declare const eventMatches: <TEvent extends PlayEvent = PlayEvent>(eventType: string) => Guard<unknown, TEvent>;
|
|
42
|
+
export declare const stateMatches: <TContext = Record<string, unknown>>(stateValue: string) => Guard<TContext, PlayEvent>;
|
|
60
43
|
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/guards/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/guards/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,UAAU,GACrB,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,MAAM,KAAG,KAAK,CAAC,QAAQ,EAAE,SAAS,CAI5E,CAAC;AAEH;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,YAAY,GACvB,MAAM,SAAS,SAAS,GAAG,SAAS,EAAE,WAAW,MAAM,KAAG,KAAK,CAAC,OAAO,EAAE,MAAM,CAG/E,CAAC;AAsBH,eAAO,MAAM,YAAY,GACvB,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,MAAM,KAAG,KAAK,CAAC,QAAQ,EAAE,SAAS,CAqBlF,CAAC"}
|
package/dist/guards/helpers.js
CHANGED
|
@@ -58,11 +58,20 @@ export const eventMatches = (eventType) => ({ event }) => {
|
|
|
58
58
|
* @param stateValue - Expected state value (string or object)
|
|
59
59
|
* @returns Guard predicate checking state value
|
|
60
60
|
*/
|
|
61
|
+
const isRecord = (value) => {
|
|
62
|
+
return typeof value === "object" && value !== null;
|
|
63
|
+
};
|
|
61
64
|
export const stateMatches = (stateValue) => ({ context }) => {
|
|
62
65
|
// Note: This helper checks context for state info
|
|
63
66
|
// For actual XState state matching, use machine.matches() in actions
|
|
64
67
|
// This is a simplified version for context-based state checks
|
|
65
|
-
|
|
68
|
+
let currentState;
|
|
69
|
+
if (isRecord(context) && "_state" in context) {
|
|
70
|
+
currentState = context._state;
|
|
71
|
+
}
|
|
72
|
+
else if (isRecord(context) && "state" in context) {
|
|
73
|
+
currentState = context.state;
|
|
74
|
+
}
|
|
66
75
|
if (!currentState)
|
|
67
76
|
return false;
|
|
68
77
|
// Simple string matching (can be enhanced for nested states)
|
|
@@ -81,7 +90,7 @@ const getNestedValue = (obj, path) => {
|
|
|
81
90
|
const keys = path.split(".");
|
|
82
91
|
let value = obj;
|
|
83
92
|
for (const key of keys) {
|
|
84
|
-
if (value === null || value === undefined) {
|
|
93
|
+
if (value === null || value === undefined || typeof value !== "object") {
|
|
85
94
|
return undefined;
|
|
86
95
|
}
|
|
87
96
|
value = value[key];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/guards/helpers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/guards/helpers.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,UAAU,GACtB,CAAqC,IAAY,EAA8B,EAAE,CACjF,CAAC,EAAE,OAAO,EAAyB,EAAE,EAAE;IACtC,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC5C,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;AAC9D,CAAC,CAAC;AAEH;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,YAAY,GACxB,CAAuC,SAAiB,EAA0B,EAAE,CACpF,CAAC,EAAE,KAAK,EAAqB,EAAE,EAAE;IAChC,OAAO,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC;AACjC,CAAC,CAAC;AAEH;;;;;;;;;;;;;;;GAeG;AACH,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAoC,EAAE;IACrE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GACxB,CAAqC,UAAkB,EAA8B,EAAE,CACvF,CAAC,EAAE,OAAO,EAAyB,EAAE,EAAE;IACtC,kDAAkD;IAClD,qEAAqE;IACrE,8DAA8D;IAC9D,IAAI,YAAqB,CAAC;IAC1B,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,IAAI,OAAO,EAAE,CAAC;QAC9C,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAC/B,CAAC;SAAM,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;QACpD,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC;IAC9B,CAAC;IAED,IAAI,CAAC,YAAY;QAAE,OAAO,KAAK,CAAC;IAEhC,6DAA6D;IAC7D,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;QACtC,OAAO,YAAY,KAAK,UAAU,CAAC;IACpC,CAAC;IAED,wBAAwB;IACxB,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AAC1D,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,cAAc,GAAG,CAAC,GAAY,EAAE,IAAY,EAAW,EAAE;IAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,KAAK,GAAG,GAAG,CAAC;IAEhB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACxB,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACxE,OAAO,SAAS,CAAC;QAClB,CAAC;QACD,KAAK,GAAI,KAAiC,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,KAAK,CAAC;AACd,CAAC,CAAC"}
|
package/dist/guards/types.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { PlayEvent } from "@xmachines/play";
|
|
1
2
|
/**
|
|
2
3
|
* Standard XState guard function signature
|
|
3
4
|
*
|
|
@@ -8,7 +9,7 @@
|
|
|
8
9
|
* @param args.event - Event that triggered the guard evaluation
|
|
9
10
|
* @returns boolean indicating if guard passes
|
|
10
11
|
*/
|
|
11
|
-
export type Guard<TContext =
|
|
12
|
+
export type Guard<TContext = Record<string, unknown>, TEvent = PlayEvent> = (args: {
|
|
12
13
|
context: TContext;
|
|
13
14
|
event: TEvent;
|
|
14
15
|
}) => boolean;
|
|
@@ -17,5 +18,5 @@ export type Guard<TContext = any, TEvent = any> = (args: {
|
|
|
17
18
|
*
|
|
18
19
|
* Per CONTEXT.md: Array means AND - all guards must pass
|
|
19
20
|
*/
|
|
20
|
-
export type GuardArray<TContext =
|
|
21
|
+
export type GuardArray<TContext = Record<string, unknown>, TEvent = PlayEvent> = Array<Guard<TContext, TEvent>> | Array<string>;
|
|
21
22
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/guards/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,MAAM,KAAK,CAAC,QAAQ,GAAG,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/guards/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;;;;;;;;GASG;AACH,MAAM,MAAM,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,IAAI,CAAC,IAAI,EAAE;IAClF,OAAO,EAAE,QAAQ,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACd,KAAK,OAAO,CAAC;AAEd;;;;GAIG;AACH,MAAM,MAAM,UAAU,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,IAC1E,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,GAC9B,KAAK,CAAC,MAAM,CAAC,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -20,5 +20,5 @@ export type { RouteMachineConfig, RouteStateNode } from "./routing/index.js";
|
|
|
20
20
|
export type { RouteContext } from "./routing/types.js";
|
|
21
21
|
export { validateComponentBinding, validateViewProps, mergeViewProps } from "./catalog/index.js";
|
|
22
22
|
export type { ValidationResult, ViewMergeContext } from "./catalog/index.js";
|
|
23
|
-
export type { Catalog, CatalogEntry
|
|
23
|
+
export type { Catalog, CatalogEntry } from "./catalog/types.js";
|
|
24
24
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG7E,OAAO,EACN,aAAa,EACb,eAAe,EACf,WAAW,EACX,UAAU,EACV,YAAY,EACZ,YAAY,GACZ,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG3D,OAAO,EACN,WAAW,EACX,eAAe,EACf,aAAa,EACb,0BAA0B,GAC1B,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC7E,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACjG,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC7E,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG7E,OAAO,EACN,aAAa,EACb,eAAe,EACf,WAAW,EACX,UAAU,EACV,YAAY,EACZ,YAAY,GACZ,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG3D,OAAO,EACN,WAAW,EACX,eAAe,EACf,aAAa,EACb,0BAA0B,GAC1B,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC7E,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACjG,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC7E,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/player-actor.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { type AnyStateMachine, type AnyActorLogic } from "xstate";
|
|
2
|
-
import { AbstractActor, type Routable, type Viewable } from "@xmachines/play-actor";
|
|
1
|
+
import { type AnyStateMachine, type Actor, type AnyActorLogic, type AnyMachineSnapshot, type InputFrom } from "xstate";
|
|
2
|
+
import { AbstractActor, type Routable, type Viewable, type ViewMetadata } from "@xmachines/play-actor";
|
|
3
3
|
import { Signal } from "@xmachines/play-signals";
|
|
4
4
|
import type { PlayEvent } from "@xmachines/play";
|
|
5
5
|
import type { PlayerOptions } from "./types.js";
|
|
@@ -80,21 +80,17 @@ import type { Catalog } from "./catalog/types.js";
|
|
|
80
80
|
* cached and updated at state entry, not computed on every read.
|
|
81
81
|
*/
|
|
82
82
|
export declare class PlayerActor<TMachine extends AnyStateMachine> extends AbstractActor<AnyActorLogic> implements Routable, Viewable {
|
|
83
|
-
[key: string]: unknown;
|
|
84
83
|
private _xstateActor;
|
|
85
84
|
private _stateManager;
|
|
86
85
|
private _options;
|
|
87
86
|
private _catalog;
|
|
88
87
|
private _viewSignal;
|
|
89
88
|
private _lastViewMemo;
|
|
90
|
-
state: Signal.State<
|
|
89
|
+
state: Signal.State<AnyMachineSnapshot>;
|
|
91
90
|
currentRoute: Signal.Computed<string | null>;
|
|
92
|
-
currentView: Signal.State<
|
|
93
|
-
component: string;
|
|
94
|
-
props: unknown;
|
|
95
|
-
} | null>;
|
|
91
|
+
currentView: Signal.State<ViewMetadata | null>;
|
|
96
92
|
catalog: Catalog;
|
|
97
|
-
constructor(machine: TMachine, catalog: Catalog | null | undefined, options: PlayerOptions<TMachine>, input?:
|
|
93
|
+
constructor(machine: TMachine, catalog: Catalog | null | undefined, options: PlayerOptions<TMachine>, input?: InputFrom<TMachine>);
|
|
98
94
|
/**
|
|
99
95
|
* Start the actor
|
|
100
96
|
*
|
|
@@ -126,7 +122,7 @@ export declare class PlayerActor<TMachine extends AnyStateMachine> extends Abstr
|
|
|
126
122
|
/**
|
|
127
123
|
* Get current snapshot
|
|
128
124
|
*/
|
|
129
|
-
getSnapshot():
|
|
125
|
+
getSnapshot(): ReturnType<Actor<TMachine>["getSnapshot"]>;
|
|
130
126
|
/**
|
|
131
127
|
* Validate view at state entry and cache result
|
|
132
128
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"player-actor.d.ts","sourceRoot":"","sources":["../src/player-actor.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"player-actor.d.ts","sourceRoot":"","sources":["../src/player-actor.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,eAAe,EACpB,KAAK,KAAK,EACV,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,SAAS,EAEd,MAAM,QAAQ,CAAC;AAChB,OAAO,EACN,aAAa,EACb,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAQhD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAkBlD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0EG;AACH,qBAAa,WAAW,CAAC,QAAQ,SAAS,eAAe,CACxD,SAAQ,aAAa,CAAC,aAAa,CACnC,YAAW,QAAQ,EAAE,QAAQ;IAE7B,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,aAAa,CAAyC;IAC9D,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,WAAW,CAAoC;IACvD,OAAO,CAAC,aAAa,CAKZ;IAGF,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACxC,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7C,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAC/C,OAAO,EAAE,OAAO,CAAC;gBAGvB,OAAO,EAAE,QAAQ,EACjB,OAAO,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,EACnC,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,EAChC,KAAK,CAAC,EAAE,SAAS,CAAC,QAAQ,CAAC;IAwF5B;;;;OAIG;IACM,KAAK,IAAI,IAAI;IAWtB;;OAEG;IACM,IAAI,IAAI,IAAI;IAYrB;;;;;;;;;;;;;;;;OAgBG;IACM,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAsBrC;;OAEG;IACM,WAAW,IAAI,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,aAAa,CAAC,CAAC;IAIlE;;;;;;;OAOG;IACH,OAAO,CAAC,qBAAqB;IA8G7B;;;;OAIG;IACH,OAAO,IAAI,IAAI;CAGf"}
|
package/dist/player-actor.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { createActor } from "xstate";
|
|
2
|
-
import { AbstractActor } from "@xmachines/play-actor";
|
|
1
|
+
import { createActor, } from "xstate";
|
|
2
|
+
import { AbstractActor, } from "@xmachines/play-actor";
|
|
3
3
|
import { Signal } from "@xmachines/play-signals";
|
|
4
4
|
import { StateSignalManager } from "./signals/state-signal.js";
|
|
5
5
|
import { deriveRoute, buildRouteUrl } from "./routing/index.js";
|
|
@@ -109,6 +109,13 @@ export class PlayerActor extends AbstractActor {
|
|
|
109
109
|
throw new Error("PlayerActor requires a valid XState machine");
|
|
110
110
|
}
|
|
111
111
|
// Create XState actor
|
|
112
|
+
// XState 5.28.0: createActor() options has a conditional type constraint on `input` that
|
|
113
|
+
// TypeScript cannot resolve against an unbound generic TMachine parameter.
|
|
114
|
+
// Option B: Cast to ActorOptions<TMachine> — narrower than `as any` because we remain
|
|
115
|
+
// within the XState type system. The `input` parameter is typed as InputFrom<TMachine>
|
|
116
|
+
// at the constructor call site, so consumers receive compile-time validation.
|
|
117
|
+
// Track XState typing improvements: https://github.com/statelyai/xstate/issues
|
|
118
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
112
119
|
const xstateActor = createActor(machine, { input });
|
|
113
120
|
// Defensive check: Validate actor was created successfully
|
|
114
121
|
if (!xstateActor) {
|
|
@@ -129,12 +136,11 @@ export class PlayerActor extends AbstractActor {
|
|
|
129
136
|
// Initialize currentRoute computed signal
|
|
130
137
|
this.currentRoute = new Signal.Computed(() => {
|
|
131
138
|
const snapshot = this.state.get();
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
if (!snapshot || typeof snapshotWithMeta.getMeta !== "function") {
|
|
139
|
+
// Defensive check: Validate snapshot exists and has getMeta
|
|
140
|
+
if (!snapshot || typeof snapshot.getMeta !== "function") {
|
|
135
141
|
return null;
|
|
136
142
|
}
|
|
137
|
-
const meta =
|
|
143
|
+
const meta = snapshot.getMeta();
|
|
138
144
|
// Defensive check: Validate meta is an object
|
|
139
145
|
if (!meta || typeof meta !== "object") {
|
|
140
146
|
return null;
|
|
@@ -146,7 +152,7 @@ export class PlayerActor extends AbstractActor {
|
|
|
146
152
|
}
|
|
147
153
|
// Build full URL with params, query, hash
|
|
148
154
|
// Per CONTEXT.md: "Full URL generation including query params, hash, base path from context"
|
|
149
|
-
return buildRouteUrl(routeTemplate,
|
|
155
|
+
return buildRouteUrl(routeTemplate, snapshot.context ?? {});
|
|
150
156
|
});
|
|
151
157
|
// Expose view signal directly for proper watcher propagation
|
|
152
158
|
this.currentView = this._viewSignal;
|
|
@@ -217,8 +223,8 @@ export class PlayerActor extends AbstractActor {
|
|
|
217
223
|
// Store previous state for onTransition hook
|
|
218
224
|
const prevSnapshot = this._xstateActor.getSnapshot();
|
|
219
225
|
// Send to XState actor
|
|
220
|
-
//
|
|
221
|
-
//
|
|
226
|
+
// EventFromLogic<TMachine> is narrower than PlayEvent at the type level,
|
|
227
|
+
// but at runtime both are plain { type: string, ...fields } objects.
|
|
222
228
|
this._xstateActor.send(event);
|
|
223
229
|
// Call onTransition hook
|
|
224
230
|
if (this._options.onTransition) {
|
|
@@ -241,14 +247,13 @@ export class PlayerActor extends AbstractActor {
|
|
|
241
247
|
* @param snapshot - Current XState snapshot
|
|
242
248
|
*/
|
|
243
249
|
_validateAndCacheView(snapshot) {
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
if (!snapshot || typeof snapshotWithMeta.getMeta !== "function") {
|
|
250
|
+
// Defensive check: Validate snapshot exists
|
|
251
|
+
if (!snapshot) {
|
|
247
252
|
this._lastViewMemo = null;
|
|
248
253
|
this._viewSignal.set(null);
|
|
249
254
|
return;
|
|
250
255
|
}
|
|
251
|
-
const meta =
|
|
256
|
+
const meta = snapshot.getMeta();
|
|
252
257
|
// Defensive check: Validate meta is an object
|
|
253
258
|
if (!meta || typeof meta !== "object") {
|
|
254
259
|
this._lastViewMemo = null;
|
|
@@ -285,11 +290,12 @@ export class PlayerActor extends AbstractActor {
|
|
|
285
290
|
return;
|
|
286
291
|
}
|
|
287
292
|
// Merge meta.view with context for props
|
|
288
|
-
const props = mergeViewProps(viewMeta,
|
|
289
|
-
|
|
293
|
+
const props = mergeViewProps(viewMeta, snapshot.context);
|
|
294
|
+
// Use reference equality for snapshot.value (XState snapshots are immutable)
|
|
295
|
+
// Per user decision (CONS-11): ref equality on snapshot.value, createMemoSignature for props
|
|
290
296
|
const propsSignature = createMemoSignature(props);
|
|
291
297
|
if (this._lastViewMemo &&
|
|
292
|
-
this._lastViewMemo.
|
|
298
|
+
this._lastViewMemo.snapshotValue === snapshot.value &&
|
|
293
299
|
this._lastViewMemo.component === viewMeta.component &&
|
|
294
300
|
this._lastViewMemo.propsSignature === propsSignature) {
|
|
295
301
|
this._viewSignal.set({
|
|
@@ -306,8 +312,14 @@ export class PlayerActor extends AbstractActor {
|
|
|
306
312
|
this._options.onError(this, new Error(`Invalid props for component "${viewMeta.component}": ${validation.error?.message || "Unknown error"}`));
|
|
307
313
|
}
|
|
308
314
|
console.error("View props validation failed:", validation.error);
|
|
309
|
-
//
|
|
310
|
-
|
|
315
|
+
// STRICT MODE (CONS-15): block rendering on validation failure
|
|
316
|
+
if (this._options.propValidation === "strict") {
|
|
317
|
+
this._lastViewMemo = null;
|
|
318
|
+
this._viewSignal.set(null);
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
// LENIENT MODE (default): fall through and render with unvalidated props
|
|
322
|
+
// Documented trade-off: components may receive malformed props but app stays visible
|
|
311
323
|
}
|
|
312
324
|
// Cache validated view structure (validated once at state entry)
|
|
313
325
|
const newView = {
|
|
@@ -315,7 +327,7 @@ export class PlayerActor extends AbstractActor {
|
|
|
315
327
|
props: validation.success ? validation.data : props,
|
|
316
328
|
};
|
|
317
329
|
this._lastViewMemo = {
|
|
318
|
-
|
|
330
|
+
snapshotValue: snapshot.value,
|
|
319
331
|
component: viewMeta.component,
|
|
320
332
|
propsSignature,
|
|
321
333
|
view: newView,
|
package/dist/player-actor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"player-actor.js","sourceRoot":"","sources":["../src/player-actor.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"player-actor.js","sourceRoot":"","sources":["../src/player-actor.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,7 +17,9 @@ const createPlayer = definePlayer({ machine, catalog: {} });
|
|
|
17
17
|
const actor = createPlayer({ value: 1 });
|
|
18
18
|
const catalogNotAny = false;
|
|
19
19
|
void catalogNotAny;
|
|
20
|
+
// CONS-16: [key: string]: unknown index signature removed.
|
|
21
|
+
// Accessing unknown properties on PlayerActor is now a type error (correct behavior).
|
|
22
|
+
// @ts-expect-error — unknown fields no longer accessible via index signature
|
|
20
23
|
const unknownField = actor["custom-extension-field"];
|
|
21
|
-
|
|
22
|
-
void extensionNotAny;
|
|
24
|
+
void unknownField;
|
|
23
25
|
//# sourceMappingURL=player-actor.typecheck.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"player-actor.typecheck.js","sourceRoot":"","sources":["../src/player-actor.typecheck.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKlD,MAAM,OAAO,GAAG,KAAK,CAAC;IACrB,KAAK,EAAE;QACN,OAAO,EAAE,EAAuB;QAChC,KAAK,EAAE,EAAuB;QAC9B,MAAM,EAAE,EAAsB;KAC9B;CACD,CAAC,CAAC,aAAa,CAAC;IAChB,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;IAChD,OAAO,EAAE,MAAM;IACf,MAAM,EAAE;QACP,IAAI,EAAE,EAAE;KACR;CACD,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,YAAY,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;AAC5D,MAAM,KAAK,GAAG,YAAY,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;AAGzC,MAAM,aAAa,GAA8B,KAAK,CAAC;AACvD,KAAK,aAAa,CAAC;AAEnB,MAAM,YAAY,GAAG,KAAK,CAAC,wBAAwB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"player-actor.typecheck.js","sourceRoot":"","sources":["../src/player-actor.typecheck.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKlD,MAAM,OAAO,GAAG,KAAK,CAAC;IACrB,KAAK,EAAE;QACN,OAAO,EAAE,EAAuB;QAChC,KAAK,EAAE,EAAuB;QAC9B,MAAM,EAAE,EAAsB;KAC9B;CACD,CAAC,CAAC,aAAa,CAAC;IAChB,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;IAChD,OAAO,EAAE,MAAM;IACf,MAAM,EAAE;QACP,IAAI,EAAE,EAAE;KACR;CACD,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,YAAY,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;AAC5D,MAAM,KAAK,GAAG,YAAY,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;AAGzC,MAAM,aAAa,GAA8B,KAAK,CAAC;AACvD,KAAK,aAAa,CAAC;AAEnB,2DAA2D;AAC3D,sFAAsF;AACtF,6EAA6E;AAC7E,MAAM,YAAY,GAAG,KAAK,CAAC,wBAAwB,CAAC,CAAC;AACrD,KAAK,YAAY,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-url.d.ts","sourceRoot":"","sources":["../../src/routing/build-url.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,aAAa,GAAI,eAAe,MAAM,EAAE,UAAS,YAAiB,KAAG,
|
|
1
|
+
{"version":3,"file":"build-url.d.ts","sourceRoot":"","sources":["../../src/routing/build-url.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,aAAa,GAAI,eAAe,MAAM,EAAE,UAAS,YAAiB,KAAG,MA6BjF,CAAC"}
|
|
@@ -33,7 +33,8 @@ export const buildRouteUrl = (routeTemplate, context = {}) => {
|
|
|
33
33
|
url = substituteParams(url, context);
|
|
34
34
|
// Append query params from context
|
|
35
35
|
if (context.query && typeof context.query === "object") {
|
|
36
|
-
const
|
|
36
|
+
const stringEntries = Object.entries(context.query).map(([k, v]) => [k, String(v)]);
|
|
37
|
+
const params = new URLSearchParams(stringEntries);
|
|
37
38
|
const queryString = params.toString();
|
|
38
39
|
if (queryString) {
|
|
39
40
|
url += `?${queryString}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-url.js","sourceRoot":"","sources":["../../src/routing/build-url.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,aAAqB,EAAE,UAAwB,EAAE,EAAU,EAAE;IAC1F,oCAAoC;IACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;IACxC,MAAM,UAAU,GAAG,eAAe,CAAC,aAAa,CAAC,CAAC;IAElD,iBAAiB;IACjB,IAAI,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IAE1E,qCAAqC;IACrC,GAAG,GAAG,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAErC,mCAAmC;IACnC,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxD,MAAM,
|
|
1
|
+
{"version":3,"file":"build-url.js","sourceRoot":"","sources":["../../src/routing/build-url.ts"],"names":[],"mappings":"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"}
|
|
@@ -85,7 +85,7 @@
|
|
|
85
85
|
* not all states need routes. For example, intermediate loading states or substates may
|
|
86
86
|
* not correspond to distinct URLs.
|
|
87
87
|
*/
|
|
88
|
-
export declare const deriveRoute: (stateMeta: Record<string,
|
|
88
|
+
export declare const deriveRoute: (stateMeta: Record<string, unknown>) => string | null;
|
|
89
89
|
/**
|
|
90
90
|
* Check if route path is absolute
|
|
91
91
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"derive-route.d.ts","sourceRoot":"","sources":["../../src/routing/derive-route.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsFG;AACH,eAAO,MAAM,WAAW,GAAI,WAAW,MAAM,CAAC,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"derive-route.d.ts","sourceRoot":"","sources":["../../src/routing/derive-route.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsFG;AACH,eAAO,MAAM,WAAW,GAAI,WAAW,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,MAAM,GAAG,IAYzE,CAAC;AA2BF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,eAAe,GAAI,MAAM,MAAM,KAAG,OAE9C,CAAC"}
|
|
@@ -88,10 +88,10 @@
|
|
|
88
88
|
export const deriveRoute = (stateMeta) => {
|
|
89
89
|
// Iterate through active state nodes to find route information
|
|
90
90
|
for (const [_stateId, meta] of Object.entries(stateMeta)) {
|
|
91
|
-
if (
|
|
91
|
+
if (typeof meta !== "object" || meta === null)
|
|
92
92
|
continue;
|
|
93
93
|
// Check meta.route for routable states
|
|
94
|
-
if (meta.route) {
|
|
94
|
+
if ("route" in meta && meta.route) {
|
|
95
95
|
return normalizeRoute(meta.route);
|
|
96
96
|
}
|
|
97
97
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"derive-route.js","sourceRoot":"","sources":["../../src/routing/derive-route.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsFG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"derive-route.js","sourceRoot":"","sources":["../../src/routing/derive-route.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsFG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,SAAkC,EAAiB,EAAE;IAChF,+DAA+D;IAC/D,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1D,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;YAAE,SAAS;QAExD,uCAAuC;QACvC,IAAI,OAAO,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACnC,OAAO,cAAc,CAAC,IAAI,CAAC,KAAsB,CAAC,CAAC;QACpD,CAAC;IACF,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,cAAc,GAAG,CAAC,KAAoB,EAAU,EAAE;IACvD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC;IACd,CAAC;IAED,kCAAkC;IAClC,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;QAC3D,OAAQ,KAAqB,CAAC,IAAI,CAAC;IACpC,CAAC;IAED,MAAM,IAAI,KAAK,CACd,2BAA2B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,uCAAuC,CACvF,CAAC;AACH,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAY,EAAW,EAAE;IACxD,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC,CAAC"}
|
|
@@ -7,8 +7,9 @@ export type RouteStateNode = {
|
|
|
7
7
|
[key: string]: unknown;
|
|
8
8
|
};
|
|
9
9
|
export type RouteMachineConfig = {
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
context?: unknown;
|
|
11
|
+
states?: Record<string, unknown> | undefined;
|
|
12
|
+
on?: Record<string, unknown> | undefined;
|
|
12
13
|
[key: string]: unknown;
|
|
13
14
|
};
|
|
14
15
|
/**
|
|
@@ -19,7 +20,7 @@ export type RouteMachineConfig = {
|
|
|
19
20
|
*
|
|
20
21
|
* Inspired by XState's internal formatRouteTransitions (stateUtils.ts line 391).
|
|
21
22
|
*
|
|
22
|
-
*
|
|
23
|
+
* @example
|
|
23
24
|
* ```typescript
|
|
24
25
|
* const machineConfig = {
|
|
25
26
|
* id: "myMachine",
|
|
@@ -37,8 +38,8 @@ export type RouteMachineConfig = {
|
|
|
37
38
|
* - Target the appropriate state
|
|
38
39
|
* - Assign routeParams and queryParams from the event to context
|
|
39
40
|
*
|
|
40
|
-
* @param machineConfig - XState machine config (before createMachine)
|
|
41
|
-
* @returns
|
|
41
|
+
* @param machineConfig - XState machine config (before createMachine). Must extend `RouteMachineConfig`.
|
|
42
|
+
* @returns The same machine config with auto-generated `play.route` handlers merged in, preserving the original type `T`.
|
|
42
43
|
*/
|
|
43
|
-
export declare function formatPlayRouteTransitions<
|
|
44
|
+
export declare function formatPlayRouteTransitions<T extends RouteMachineConfig>(machineConfig: T): T;
|
|
44
45
|
//# sourceMappingURL=format-play-route-transitions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format-play-route-transitions.d.ts","sourceRoot":"","sources":["../../src/routing/format-play-route-transitions.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,cAAc,GAAG;IAC5B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE;QACN,KAAK,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACxC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB,CAAC;AASF,MAAM,MAAM,kBAAkB,GAAG;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"format-play-route-transitions.d.ts","sourceRoot":"","sources":["../../src/routing/format-play-route-transitions.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,cAAc,GAAG;IAC5B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE;QACN,KAAK,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACxC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB,CAAC;AASF,MAAM,MAAM,kBAAkB,GAAG;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC7C,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IACzC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,SAAS,kBAAkB,EAAE,aAAa,EAAE,CAAC,GAAG,CAAC,CA+C5F"}
|
|
@@ -7,7 +7,7 @@ import { assign } from "xstate";
|
|
|
7
7
|
*
|
|
8
8
|
* Inspired by XState's internal formatRouteTransitions (stateUtils.ts line 391).
|
|
9
9
|
*
|
|
10
|
-
*
|
|
10
|
+
* @example
|
|
11
11
|
* ```typescript
|
|
12
12
|
* const machineConfig = {
|
|
13
13
|
* id: "myMachine",
|
|
@@ -25,20 +25,20 @@ import { assign } from "xstate";
|
|
|
25
25
|
* - Target the appropriate state
|
|
26
26
|
* - Assign routeParams and queryParams from the event to context
|
|
27
27
|
*
|
|
28
|
-
* @param machineConfig - XState machine config (before createMachine)
|
|
29
|
-
* @returns
|
|
28
|
+
* @param machineConfig - XState machine config (before createMachine). Must extend `RouteMachineConfig`.
|
|
29
|
+
* @returns The same machine config with auto-generated `play.route` handlers merged in, preserving the original type `T`.
|
|
30
30
|
*/
|
|
31
31
|
export function formatPlayRouteTransitions(machineConfig) {
|
|
32
32
|
const routeTransitions = [];
|
|
33
33
|
const collectRoutes = (states, parentPath = "") => {
|
|
34
34
|
Object.entries(states).forEach(([key, stateConfig]) => {
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
const node = stateConfig;
|
|
36
|
+
const stateId = node.id || (parentPath ? `${parentPath}.${key}` : key);
|
|
37
|
+
if (node.meta?.route && node.id) {
|
|
38
38
|
const transition = {
|
|
39
|
-
target: `.${key}`,
|
|
40
|
-
guard: ({ event }) => event.to === `#${
|
|
41
|
-
reenter: true,
|
|
39
|
+
target: `.${key}`,
|
|
40
|
+
guard: ({ event }) => event.to === `#${node.id}`,
|
|
41
|
+
reenter: true,
|
|
42
42
|
actions: assign({
|
|
43
43
|
routeParams: ({ event }) => event.params || {},
|
|
44
44
|
queryParams: ({ event }) => event.query || {},
|
|
@@ -46,26 +46,24 @@ export function formatPlayRouteTransitions(machineConfig) {
|
|
|
46
46
|
};
|
|
47
47
|
routeTransitions.push(transition);
|
|
48
48
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
collectRoutes(stateConfig.states, stateId);
|
|
49
|
+
if (node.states) {
|
|
50
|
+
collectRoutes(node.states, stateId);
|
|
52
51
|
}
|
|
53
52
|
});
|
|
54
53
|
};
|
|
55
|
-
const
|
|
56
|
-
const machineStates = routeConfig.states;
|
|
54
|
+
const machineStates = machineConfig.states;
|
|
57
55
|
if (machineStates) {
|
|
58
56
|
collectRoutes(machineStates);
|
|
59
57
|
}
|
|
60
|
-
// Add play.route handler to root if we found any routes
|
|
61
58
|
if (routeTransitions.length > 0) {
|
|
62
|
-
const existingOn =
|
|
59
|
+
const existingOn = machineConfig.on || {};
|
|
60
|
+
const updatedOn = {
|
|
61
|
+
...existingOn,
|
|
62
|
+
"play.route": routeTransitions,
|
|
63
|
+
};
|
|
63
64
|
return {
|
|
64
|
-
...
|
|
65
|
-
on:
|
|
66
|
-
...existingOn,
|
|
67
|
-
"play.route": routeTransitions,
|
|
68
|
-
},
|
|
65
|
+
...machineConfig,
|
|
66
|
+
on: updatedOn,
|
|
69
67
|
};
|
|
70
68
|
}
|
|
71
69
|
return machineConfig;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format-play-route-transitions.js","sourceRoot":"","sources":["../../src/routing/format-play-route-transitions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"format-play-route-transitions.js","sourceRoot":"","sources":["../../src/routing/format-play-route-transitions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAmChC;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,UAAU,0BAA0B,CAA+B,aAAgB;IACxF,MAAM,gBAAgB,GAAsB,EAAE,CAAC;IAE/C,MAAM,aAAa,GAAG,CAAC,MAA+B,EAAE,UAAU,GAAG,EAAE,EAAE,EAAE;QAC1E,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,EAAE;YACrD,MAAM,IAAI,GAAG,WAA6B,CAAC;YAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAEvE,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;gBACjC,MAAM,UAAU,GAAoB;oBACnC,MAAM,EAAE,IAAI,GAAG,EAAE;oBACjB,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC,EAAE,EAAE;oBAChD,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,MAAM,CAAC;wBACf,WAAW,EAAE,CAAC,EAAE,KAAK,EAAkB,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE;wBAC9D,WAAW,EAAE,CAAC,EAAE,KAAK,EAAkB,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE;qBAC7D,CAAC;iBACF,CAAC;gBAEF,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACnC,CAAC;YAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACrC,CAAC;QACF,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC;IAC3C,IAAI,aAAa,EAAE,CAAC;QACnB,aAAa,CAAC,aAAa,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,aAAa,CAAC,EAAE,IAAI,EAAE,CAAC;QAC1C,MAAM,SAAS,GAAG;YACjB,GAAG,UAAU;YACb,YAAY,EAAE,gBAAgB;SAC9B,CAAC;QAEF,OAAO;YACN,GAAG,aAAa;YAChB,EAAE,EAAE,SAAS;SACR,CAAC;IACR,CAAC;IAED,OAAO,aAAa,CAAC;AACtB,CAAC"}
|
package/dist/routing/types.d.ts
CHANGED
|
@@ -10,6 +10,11 @@ export interface RouteContext {
|
|
|
10
10
|
/** Base path for relative routes */
|
|
11
11
|
basePath?: string;
|
|
12
12
|
/** Route parameters to substitute */
|
|
13
|
+
routeParams?: Record<string, unknown>;
|
|
14
|
+
/** Query parameters */
|
|
15
|
+
query?: Record<string, unknown>;
|
|
16
|
+
/** Hash fragment */
|
|
17
|
+
hash?: string;
|
|
13
18
|
[key: string]: unknown;
|
|
14
19
|
}
|
|
15
20
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/routing/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,WAAW,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/routing/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,WAAW,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,uBAAuB;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,oBAAoB;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB"}
|
|
@@ -9,7 +9,7 @@ import { Signal } from "@xmachines/play-signals";
|
|
|
9
9
|
* XState already provides coalescence - if multiple transitions occur in a single send(),
|
|
10
10
|
* the subscription callback only fires once with the final state.
|
|
11
11
|
*/
|
|
12
|
-
export declare class StateSignalManager<TSnapshot =
|
|
12
|
+
export declare class StateSignalManager<TSnapshot = unknown> {
|
|
13
13
|
private _signal;
|
|
14
14
|
constructor(initialSnapshot: TSnapshot);
|
|
15
15
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state-signal.d.ts","sourceRoot":"","sources":["../../src/signals/state-signal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEjD;;;;;;;;;GASG;AACH,qBAAa,kBAAkB,CAAC,SAAS,GAAG,
|
|
1
|
+
{"version":3,"file":"state-signal.d.ts","sourceRoot":"","sources":["../../src/signals/state-signal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEjD;;;;;;;;;GASG;AACH,qBAAa,kBAAkB,CAAC,SAAS,GAAG,OAAO;IAClD,OAAO,CAAC,OAAO,CAA0B;gBAE7B,eAAe,EAAE,SAAS;IAItC;;OAEG;IACH,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAEpC;IAED;;;;;;;OAOG;IACH,cAAc,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI;IAIzC;;OAEG;IACH,OAAO,IAAI,IAAI;CAGf"}
|
package/dist/types.d.ts
CHANGED
|
@@ -29,6 +29,16 @@ export interface PlayerOptions<TMachine extends AnyStateMachine> {
|
|
|
29
29
|
onStateChange?: (actor: PlayerActorClass<TMachine>, state: SnapshotFrom<TMachine>) => void;
|
|
30
30
|
/** Called on actor errors */
|
|
31
31
|
onError?: (actor: PlayerActorClass<TMachine>, error: Error) => void;
|
|
32
|
+
/**
|
|
33
|
+
* Prop validation failure mode (default: 'lenient')
|
|
34
|
+
*
|
|
35
|
+
* - 'lenient': On validation failure, call onError hook and render with
|
|
36
|
+
* unvalidated props (current behavior). Documents as explicit trade-off.
|
|
37
|
+
* - 'strict': On validation failure, call onError hook and set viewSignal
|
|
38
|
+
* to null (no render). Blocks rendering until machine transitions to a
|
|
39
|
+
* state with valid props.
|
|
40
|
+
*/
|
|
41
|
+
propValidation?: "strict" | "lenient";
|
|
32
42
|
}
|
|
33
43
|
/**
|
|
34
44
|
* Factory function returned by definePlayer()
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,IAAI,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEzE;;;;GAIG;AACH,MAAM,WAAW,YAAY,CAC5B,QAAQ,SAAS,eAAe,EAChC,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAElC,8BAA8B;IAC9B,OAAO,EAAE,QAAQ,CAAC;IAElB,mEAAmE;IACnE,OAAO,CAAC,EAAE,QAAQ,CAAC;IAEnB,wCAAwC;IACxC,OAAO,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;CAClC;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa,CAAC,QAAQ,SAAS,eAAe;IAC9D,+BAA+B;IAC/B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;IAEtD,8BAA8B;IAC9B,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;IAErD,uCAAuC;IACvC,YAAY,CAAC,EAAE,CACd,KAAK,EAAE,gBAAgB,CAAC,QAAQ,CAAC,EACjC,SAAS,EAAE,YAAY,CAAC,QAAQ,CAAC,EACjC,SAAS,EAAE,YAAY,CAAC,QAAQ,CAAC,KAC7B,IAAI,CAAC;IAEV,uCAAuC;IACvC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;IAE3F,6BAA6B;IAC7B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,IAAI,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEzE;;;;GAIG;AACH,MAAM,WAAW,YAAY,CAC5B,QAAQ,SAAS,eAAe,EAChC,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAElC,8BAA8B;IAC9B,OAAO,EAAE,QAAQ,CAAC;IAElB,mEAAmE;IACnE,OAAO,CAAC,EAAE,QAAQ,CAAC;IAEnB,wCAAwC;IACxC,OAAO,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;CAClC;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa,CAAC,QAAQ,SAAS,eAAe;IAC9D,+BAA+B;IAC/B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;IAEtD,8BAA8B;IAC9B,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;IAErD,uCAAuC;IACvC,YAAY,CAAC,EAAE,CACd,KAAK,EAAE,gBAAgB,CAAC,QAAQ,CAAC,EACjC,SAAS,EAAE,YAAY,CAAC,QAAQ,CAAC,EACjC,SAAS,EAAE,YAAY,CAAC,QAAQ,CAAC,KAC7B,IAAI,CAAC;IAEV,uCAAuC;IACvC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;IAE3F,6BAA6B;IAC7B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAEpE;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;CACtC;AAED;;;;GAIG;AACH,MAAM,MAAM,aAAa,CAAC,QAAQ,SAAS,eAAe,IAAI,CAC7D,KAAK,CAAC,EAAE,SAAS,CAAC,QAAQ,CAAC,KACvB,gBAAgB,CAAC,QAAQ,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xmachines/play-xstate",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.9",
|
|
4
4
|
"description": "XState v5 adapter for Play Architecture",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"actor-model",
|
|
@@ -30,22 +30,22 @@
|
|
|
30
30
|
},
|
|
31
31
|
"scripts": {
|
|
32
32
|
"build": "tsc --build",
|
|
33
|
-
"clean": "rm -rf dist *.tsbuildinfo",
|
|
33
|
+
"clean": "rm -rf dist *.tsbuildinfo node_modules/.vite node_modules/.vite-temp",
|
|
34
34
|
"typecheck": "tsc --noEmit",
|
|
35
|
-
"test": "vitest
|
|
35
|
+
"test": "vitest",
|
|
36
36
|
"prepublishOnly": "npm run build"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@xmachines/play": "1.0.0-beta.
|
|
40
|
-
"@xmachines/play-actor": "1.0.0-beta.
|
|
41
|
-
"@xmachines/play-catalog": "1.0.0-beta.
|
|
42
|
-
"@xmachines/play-signals": "1.0.0-beta.
|
|
39
|
+
"@xmachines/play": "1.0.0-beta.9",
|
|
40
|
+
"@xmachines/play-actor": "1.0.0-beta.9",
|
|
41
|
+
"@xmachines/play-catalog": "1.0.0-beta.9",
|
|
42
|
+
"@xmachines/play-signals": "1.0.0-beta.9",
|
|
43
43
|
"zod": "^4.3.6"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
|
-
"@xmachines/shared": "1.0.0-beta.
|
|
46
|
+
"@xmachines/shared": "1.0.0-beta.9"
|
|
47
47
|
},
|
|
48
48
|
"peerDependencies": {
|
|
49
|
-
"xstate": "^5.
|
|
49
|
+
"xstate": "^5.0.0"
|
|
50
50
|
}
|
|
51
51
|
}
|