@xmachines/play-router 1.0.0-beta.32 → 1.0.0-beta.34
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 +1 -1
- package/dist/errors.d.ts +45 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +65 -0
- package/dist/errors.js.map +1 -1
- package/dist/extract-routes.d.ts.map +1 -1
- package/dist/extract-routes.js +1 -3
- package/dist/extract-routes.js.map +1 -1
- package/dist/machine-to-graph.d.ts.map +1 -1
- package/dist/machine-to-graph.js +2 -2
- package/dist/machine-to-graph.js.map +1 -1
- package/dist/validate-routes.d.ts +3 -3
- package/dist/validate-routes.d.ts.map +1 -1
- package/dist/validate-routes.js +7 -8
- package/dist/validate-routes.js.map +1 -1
- package/package.json +8 -8
package/README.md
CHANGED
|
@@ -179,7 +179,7 @@ Bridge teardown must be explicit and deterministic:
|
|
|
179
179
|
- Do not rely on GC-only cleanup guidance.
|
|
180
180
|
- Infrastructure remains passive: bridges observe and forward intents, actors decide validity.
|
|
181
181
|
- `createBrowserHistory().destroy()` (from `@xmachines/play-dom-router`) is idempotent and restores shared `window.history` patches only after the last wrapper for that window is removed.
|
|
182
|
-
|
|
182
|
+
- **Note**: `createBrowserHistory()` mutates global `window.history` methods (`pushState` and `replaceState`) and coordinates wrappers with shared ref-count state. To reduce leakage, create one history wrapper per browser window at the application boundary and always pair it with `destroy()` during teardown.
|
|
183
183
|
|
|
184
184
|
## Bridge Sync Ordering
|
|
185
185
|
|
package/dist/errors.d.ts
CHANGED
|
@@ -67,6 +67,51 @@ export declare class URLPatternUnavailableError extends PlayError {
|
|
|
67
67
|
* }
|
|
68
68
|
* ```
|
|
69
69
|
*/
|
|
70
|
+
/**
|
|
71
|
+
* Thrown by `validateRouteFormat()` when a state declares `meta.route` with an
|
|
72
|
+
* empty string path.
|
|
73
|
+
*
|
|
74
|
+
* **Error code:** `PLAY_ROUTE_EMPTY_PATH`
|
|
75
|
+
*/
|
|
76
|
+
export declare class EmptyRoutePathError extends PlayError {
|
|
77
|
+
/** The state ID whose route path is empty. */
|
|
78
|
+
readonly stateId: string;
|
|
79
|
+
constructor(stateId: string);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Thrown by `validateStateExists()` when a route references a state ID that does
|
|
83
|
+
* not exist in the machine graph.
|
|
84
|
+
*
|
|
85
|
+
* **Error code:** `PLAY_ROUTE_INVALID_STATE_ID`
|
|
86
|
+
*/
|
|
87
|
+
export declare class InvalidStateIdError extends PlayError {
|
|
88
|
+
/** The state ID that was referenced but not found. */
|
|
89
|
+
readonly stateId: string;
|
|
90
|
+
constructor(stateId: string);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Thrown by `detectDuplicateRoutes()` when two or more states share the same URL path.
|
|
94
|
+
*
|
|
95
|
+
* **Error code:** `PLAY_ROUTE_DUPLICATE_PATH`
|
|
96
|
+
*/
|
|
97
|
+
export declare class DuplicateRoutePathError extends PlayError {
|
|
98
|
+
/** Human-readable list of conflicting path → state-ID mappings. */
|
|
99
|
+
readonly duplicates: string[];
|
|
100
|
+
constructor(duplicates: string[]);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Thrown by `machineToGraph()` when an XState state node has an unrecognised
|
|
104
|
+
* `.type` value.
|
|
105
|
+
*
|
|
106
|
+
* **Error code:** `PLAY_ROUTE_UNKNOWN_STATE_TYPE`
|
|
107
|
+
*/
|
|
108
|
+
export declare class UnknownStateTypeError extends PlayError {
|
|
109
|
+
/** The unrecognised state type string. */
|
|
110
|
+
readonly stateType: string;
|
|
111
|
+
/** The ID of the state node with the unknown type. */
|
|
112
|
+
readonly nodeId: string;
|
|
113
|
+
constructor(stateType: string, nodeId: string, validTypes: string[]);
|
|
114
|
+
}
|
|
70
115
|
export declare class InvalidRoutePatternError extends PlayError {
|
|
71
116
|
/** The route pattern string that could not be compiled by URLPattern. */
|
|
72
117
|
readonly pattern: string;
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,eAAgB,SAAQ,SAAS;gBACjC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAInD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,0BAA2B,SAAQ,SAAS;;CASxD;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBAAa,wBAAyB,SAAQ,SAAS;IACtD,yEAAyE;IACzE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEb,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAUnD"}
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,eAAgB,SAAQ,SAAS;gBACjC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAInD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,0BAA2B,SAAQ,SAAS;;CASxD;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH;;;;;GAKG;AACH,qBAAa,mBAAoB,SAAQ,SAAS;IACjD,8CAA8C;IAC9C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEb,OAAO,EAAE,MAAM;CAS3B;AAED;;;;;GAKG;AACH,qBAAa,mBAAoB,SAAQ,SAAS;IACjD,sDAAsD;IACtD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEb,OAAO,EAAE,MAAM;CAS3B;AAED;;;;GAIG;AACH,qBAAa,uBAAwB,SAAQ,SAAS;IACrD,mEAAmE;IACnE,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;gBAElB,UAAU,EAAE,MAAM,EAAE;CAWhC;AAED;;;;;GAKG;AACH,qBAAa,qBAAsB,SAAQ,SAAS;IACnD,0CAA0C;IAC1C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,sDAAsD;IACtD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE;CAWnE;AAED,qBAAa,wBAAyB,SAAQ,SAAS;IACtD,yEAAyE;IACzE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEb,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAUnD"}
|
package/dist/errors.js
CHANGED
|
@@ -73,6 +73,71 @@ export class URLPatternUnavailableError extends PlayError {
|
|
|
73
73
|
* }
|
|
74
74
|
* ```
|
|
75
75
|
*/
|
|
76
|
+
/**
|
|
77
|
+
* Thrown by `validateRouteFormat()` when a state declares `meta.route` with an
|
|
78
|
+
* empty string path.
|
|
79
|
+
*
|
|
80
|
+
* **Error code:** `PLAY_ROUTE_EMPTY_PATH`
|
|
81
|
+
*/
|
|
82
|
+
export class EmptyRoutePathError extends PlayError {
|
|
83
|
+
/** The state ID whose route path is empty. */
|
|
84
|
+
stateId;
|
|
85
|
+
constructor(stateId) {
|
|
86
|
+
super("RouteMap", "PLAY_ROUTE_EMPTY_PATH", `Empty route path in state "${stateId}": routes must have a non-empty path`);
|
|
87
|
+
this.name = "EmptyRoutePathError";
|
|
88
|
+
this.stateId = stateId;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Thrown by `validateStateExists()` when a route references a state ID that does
|
|
93
|
+
* not exist in the machine graph.
|
|
94
|
+
*
|
|
95
|
+
* **Error code:** `PLAY_ROUTE_INVALID_STATE_ID`
|
|
96
|
+
*/
|
|
97
|
+
export class InvalidStateIdError extends PlayError {
|
|
98
|
+
/** The state ID that was referenced but not found. */
|
|
99
|
+
stateId;
|
|
100
|
+
constructor(stateId) {
|
|
101
|
+
super("RouteMap", "PLAY_ROUTE_INVALID_STATE_ID", `Route references non-existent state ID: ${stateId}`);
|
|
102
|
+
this.name = "InvalidStateIdError";
|
|
103
|
+
this.stateId = stateId;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Thrown by `detectDuplicateRoutes()` when two or more states share the same URL path.
|
|
108
|
+
*
|
|
109
|
+
* **Error code:** `PLAY_ROUTE_DUPLICATE_PATH`
|
|
110
|
+
*/
|
|
111
|
+
export class DuplicateRoutePathError extends PlayError {
|
|
112
|
+
/** Human-readable list of conflicting path → state-ID mappings. */
|
|
113
|
+
duplicates;
|
|
114
|
+
constructor(duplicates) {
|
|
115
|
+
super("RouteMap", "PLAY_ROUTE_DUPLICATE_PATH", `Duplicate route paths detected:\n${duplicates.join("\n")}\n\n` +
|
|
116
|
+
`Each route path must map to exactly one state.\n` +
|
|
117
|
+
`Use different paths (e.g., /dashboard vs /) or conditional rendering within a single state.`);
|
|
118
|
+
this.name = "DuplicateRoutePathError";
|
|
119
|
+
this.duplicates = duplicates;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Thrown by `machineToGraph()` when an XState state node has an unrecognised
|
|
124
|
+
* `.type` value.
|
|
125
|
+
*
|
|
126
|
+
* **Error code:** `PLAY_ROUTE_UNKNOWN_STATE_TYPE`
|
|
127
|
+
*/
|
|
128
|
+
export class UnknownStateTypeError extends PlayError {
|
|
129
|
+
/** The unrecognised state type string. */
|
|
130
|
+
stateType;
|
|
131
|
+
/** The ID of the state node with the unknown type. */
|
|
132
|
+
nodeId;
|
|
133
|
+
constructor(stateType, nodeId, validTypes) {
|
|
134
|
+
super("machineToGraph", "PLAY_ROUTE_UNKNOWN_STATE_TYPE", `Unknown XState state type "${stateType}" on node "${nodeId}". ` +
|
|
135
|
+
`Expected one of: ${validTypes.join(", ")}.`);
|
|
136
|
+
this.name = "UnknownStateTypeError";
|
|
137
|
+
this.stateType = stateType;
|
|
138
|
+
this.nodeId = nodeId;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
76
141
|
export class InvalidRoutePatternError extends PlayError {
|
|
77
142
|
/** The route pattern string that could not be compiled by URLPattern. */
|
|
78
143
|
pattern;
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,OAAO,eAAgB,SAAQ,SAAS;IAC7C,YAAY,OAAe,EAAE,OAAsB;QAClD,KAAK,CAAC,kBAAkB,EAAE,yBAAyB,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACvE,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAC/B,CAAC;CACD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,0BAA2B,SAAQ,SAAS;IACxD;QACC,KAAK,CACJ,UAAU,EACV,uCAAuC,EACvC,6IAA6I,CAC7I,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC1C,CAAC;CACD;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,OAAO,wBAAyB,SAAQ,SAAS;IACtD,yEAAyE;IAChE,OAAO,CAAS;IAEzB,YAAY,OAAe,EAAE,OAAsB;QAClD,KAAK,CACJ,UAAU,EACV,gCAAgC,EAChC,2BAA2B,OAAO,GAAG,EACrC,OAAO,CACP,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;QACvC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACxB,CAAC;CACD"}
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,OAAO,eAAgB,SAAQ,SAAS;IAC7C,YAAY,OAAe,EAAE,OAAsB;QAClD,KAAK,CAAC,kBAAkB,EAAE,yBAAyB,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACvE,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAC/B,CAAC;CACD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAO,0BAA2B,SAAQ,SAAS;IACxD;QACC,KAAK,CACJ,UAAU,EACV,uCAAuC,EACvC,6IAA6I,CAC7I,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC1C,CAAC;CACD;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH;;;;;GAKG;AACH,MAAM,OAAO,mBAAoB,SAAQ,SAAS;IACjD,8CAA8C;IACrC,OAAO,CAAS;IAEzB,YAAY,OAAe;QAC1B,KAAK,CACJ,UAAU,EACV,uBAAuB,EACvB,8BAA8B,OAAO,sCAAsC,CAC3E,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACxB,CAAC;CACD;AAED;;;;;GAKG;AACH,MAAM,OAAO,mBAAoB,SAAQ,SAAS;IACjD,sDAAsD;IAC7C,OAAO,CAAS;IAEzB,YAAY,OAAe;QAC1B,KAAK,CACJ,UAAU,EACV,6BAA6B,EAC7B,2CAA2C,OAAO,EAAE,CACpD,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACxB,CAAC;CACD;AAED;;;;GAIG;AACH,MAAM,OAAO,uBAAwB,SAAQ,SAAS;IACrD,mEAAmE;IAC1D,UAAU,CAAW;IAE9B,YAAY,UAAoB;QAC/B,KAAK,CACJ,UAAU,EACV,2BAA2B,EAC3B,oCAAoC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM;YAC9D,kDAAkD;YAClD,6FAA6F,CAC9F,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;QACtC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC9B,CAAC;CACD;AAED;;;;;GAKG;AACH,MAAM,OAAO,qBAAsB,SAAQ,SAAS;IACnD,0CAA0C;IACjC,SAAS,CAAS;IAC3B,sDAAsD;IAC7C,MAAM,CAAS;IAExB,YAAY,SAAiB,EAAE,MAAc,EAAE,UAAoB;QAClE,KAAK,CACJ,gBAAgB,EAChB,+BAA+B,EAC/B,8BAA8B,SAAS,cAAc,MAAM,KAAK;YAC/D,oBAAoB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAC7C,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACtB,CAAC;CACD;AAED,MAAM,OAAO,wBAAyB,SAAQ,SAAS;IACtD,yEAAyE;IAChE,OAAO,CAAS;IAEzB,YAAY,OAAe,EAAE,OAAsB;QAClD,KAAK,CACJ,UAAU,EACV,gCAAgC,EAChC,2BAA2B,OAAO,GAAG,EACrC,OAAO,CACP,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;QACvC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACxB,CAAC;CACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract-routes.d.ts","sourceRoot":"","sources":["../src/extract-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,KAAK,EAAE,SAAS,EAA6C,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"extract-routes.d.ts","sourceRoot":"","sources":["../src/extract-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,KAAK,EAAE,SAAS,EAA6C,MAAM,YAAY,CAAC;AA6EvF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,oBAAoB,GAAI,SAAS,eAAe,KAAG,SAmB/D,CAAC"}
|
package/dist/extract-routes.js
CHANGED
|
@@ -37,9 +37,7 @@ const extractRouteFromNode = (graphNode, stateIds, graphNodeMap) => {
|
|
|
37
37
|
const statePath = buildStatePath(graphNode, graphNodeMap);
|
|
38
38
|
const pattern = route.includes(":") ? route : undefined;
|
|
39
39
|
// Reconstruct original metadata shape from graph data
|
|
40
|
-
const metadata = meta && typeof meta === "object" && "route" in meta
|
|
41
|
-
? meta["route"]
|
|
42
|
-
: route;
|
|
40
|
+
const metadata = meta && typeof meta === "object" && "route" in meta ? meta["route"] : route;
|
|
43
41
|
const result = {
|
|
44
42
|
stateId,
|
|
45
43
|
statePath,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract-routes.js","sourceRoot":"","sources":["../src/extract-routes.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAqB,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EACN,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,GACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;;;;;;;;GASG;AACH,MAAM,cAAc,GAAG,CACtB,SAAqC,EACrC,YAAqD,EAC1C,EAAE;IACb,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,OAAO,GAA2C,SAAS,CAAC;IAEhE,OAAO,OAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC/E,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnC,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,oBAAoB,GAAG,CAC5B,SAAqC,EACrC,QAAqB,EACrB,YAAqD,EAClC,EAAE;IACrB,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC;IAEhD,mCAAmC;IACnC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,sCAAsC;IACtC,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAEpC,2EAA2E;IAC3E,mBAAmB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAEvC,uFAAuF;IACvF,MAAM,SAAS,GAAG,cAAc,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAE1D,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAExD,sDAAsD;IACtD,MAAM,QAAQ,GACb,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,IAAI
|
|
1
|
+
{"version":3,"file":"extract-routes.js","sourceRoot":"","sources":["../src/extract-routes.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAqB,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EACN,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,GACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;;;;;;;;GASG;AACH,MAAM,cAAc,GAAG,CACtB,SAAqC,EACrC,YAAqD,EAC1C,EAAE;IACb,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,OAAO,GAA2C,SAAS,CAAC;IAEhE,OAAO,OAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC/E,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnC,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,oBAAoB,GAAG,CAC5B,SAAqC,EACrC,QAAqB,EACrB,YAAqD,EAClC,EAAE;IACrB,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC;IAEhD,mCAAmC;IACnC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,sCAAsC;IACtC,mBAAmB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAEpC,2EAA2E;IAC3E,mBAAmB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAEvC,uFAAuF;IACvF,MAAM,SAAS,GAAG,cAAc,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAE1D,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAExD,sDAAsD;IACtD,MAAM,QAAQ,GACb,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,IAAI,CAAC,CAAC,CAAE,IAAI,CAAC,OAAO,CAAmB,CAAC,CAAC,CAAC,KAAK,CAAC;IAEhG,MAAM,MAAM,GAAc;QACzB,OAAO;QACP,SAAS;QACT,SAAS,EAAE,KAAK;QAChB,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;QACjC,QAAQ,EAAE,IAAI;QACd,QAAQ;KACR,CAAC;IAEF,IAAI,OAAO;QAAE,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;IAEtC,OAAO,MAAM,CAAC;AACf,CAAC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,OAAwB,EAAa,EAAE;IAC3E,8BAA8B;IAC9B,MAAM,KAAK,GAAiB,cAAc,CAAC,OAAO,CAAC,CAAC;IAEpD,2EAA2E;IAC3E,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACjE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEhE,qCAAqC;IACrC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK;SACxB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;SACjE,MAAM,CAAC,CAAC,CAAC,EAAkB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IAE5C,6BAA6B;IAC7B,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAE9B,8CAA8C;IAC9C,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACpC,OAAO,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,CAAC;AAC3B,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"machine-to-graph.d.ts","sourceRoot":"","sources":["../src/machine-to-graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"machine-to-graph.d.ts","sourceRoot":"","sources":["../src/machine-to-graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGnE;;;;;;;;;;GAUG;AACH,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;AAqDnE,eAAO,MAAM,cAAc,GAAI,SAAS,eAAe,KAAG,YAwEzD,CAAC"}
|
package/dist/machine-to-graph.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { toDirectedGraph } from "xstate/graph";
|
|
2
2
|
import { createGraph } from "@statelyai/graph";
|
|
3
|
+
import { UnknownStateTypeError } from "./errors.js";
|
|
3
4
|
/**
|
|
4
5
|
* Convert an XState v5 state machine to a typed @statelyai/graph Graph.
|
|
5
6
|
*
|
|
@@ -67,8 +68,7 @@ export const machineToGraph = (machine) => {
|
|
|
67
68
|
: undefined;
|
|
68
69
|
// Runtime assertion: validate state type before casting
|
|
69
70
|
if (!VALID_STATE_TYPES.has(sn.type)) {
|
|
70
|
-
throw new
|
|
71
|
-
`Expected one of: ${[...VALID_STATE_TYPES].join(", ")}.`);
|
|
71
|
+
throw new UnknownStateTypeError(sn.type, sn.id, [...VALID_STATE_TYPES]);
|
|
72
72
|
}
|
|
73
73
|
const nodeData = {
|
|
74
74
|
stateId: sn.id,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"machine-to-graph.js","sourceRoot":"","sources":["../src/machine-to-graph.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAA0B,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,WAAW,EAAc,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"machine-to-graph.js","sourceRoot":"","sources":["../src/machine-to-graph.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAA0B,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,WAAW,EAAc,MAAM,kBAAkB,CAAC;AAE3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAepD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH;;;GAGG;AACH,MAAM,iBAAiB,GAAwB,IAAI,GAAG,CAAC;IACtD,QAAQ;IACR,UAAU;IACV,UAAU;IACV,OAAO;IACP,SAAS;CACT,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAwB,EAAgB,EAAE;IACxE,MAAM,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAEpC,iEAAiE;IACjE,MAAM,KAAK,GAAoE,EAAE,CAAC;IAClF,MAAM,KAAK,GAKN,EAAE,CAAC;IACR,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,MAAM,IAAI,GAAG,CAAC,MAAyB,EAAE,QAAiB,EAAQ,EAAE;QACnE,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC;QAC5B,MAAM,IAAI,GAAG,EAAE,CAAC,IAA2C,CAAC;QAC5D,MAAM,SAAS,GAAG,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,KAAK,GACV,OAAO,SAAS,KAAK,QAAQ;YAC5B,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI,IAAI,MAAM,IAAI,SAAS;gBAC3E,CAAC,CAAE,SAA8B,CAAC,IAAI;gBACtC,CAAC,CAAC,SAAS,CAAC;QAEf,wDAAwD;QACxD,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,qBAAqB,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,QAAQ,GAAoB;YACjC,OAAO,EAAE,EAAE,CAAC,EAAE;YACd,IAAI,EAAE,EAAE,CAAC,IAA+B;SACxC,CAAC;QACF,IAAI,IAAI,KAAK,SAAS;YAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;QAC7C,IAAI,KAAK,KAAK,SAAS;YAAE,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC;QAEhD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACP,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,0EAA0E;QAC1E,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAoB;gBACjC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;aAC1B,CAAC;YACF,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBAC3B,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACpD,CAAC;YACD,KAAK,CAAC,IAAI,CAAC;gBACV,EAAE,EAAE,IAAI,WAAW,EAAE,EAAE;gBACvB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE;gBACxB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE;gBACxB,IAAI,EAAE,QAAQ;aACd,CAAC,CAAC;QACJ,CAAC;QAED,oDAAoD;QACpD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACrC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC;IACF,CAAC,CAAC;IAEF,IAAI,CAAC,EAAE,CAAC,CAAC;IAET,OAAO,WAAW,CAAC;QAClB,IAAI,EAAE,UAAU;QAChB,aAAa,EAAE,EAAE,CAAC,EAAE;QACpB,KAAK;QACL,KAAK;KACL,CAAC,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -8,7 +8,7 @@ import type { RouteInfo } from "./types.js";
|
|
|
8
8
|
*
|
|
9
9
|
* @param routePath - Route path to validate (absolute or relative)
|
|
10
10
|
* @param stateId - State identifier for error messages
|
|
11
|
-
* @throws {
|
|
11
|
+
* @throws {EmptyRoutePathError} If route path is empty
|
|
12
12
|
*/
|
|
13
13
|
export declare const validateRouteFormat: (routePath: string, stateId: string) => void;
|
|
14
14
|
/**
|
|
@@ -19,7 +19,7 @@ export declare const validateRouteFormat: (routePath: string, stateId: string) =
|
|
|
19
19
|
*
|
|
20
20
|
* @param stateId - State identifier to validate
|
|
21
21
|
* @param stateIds - Set of all known state IDs from the machine graph
|
|
22
|
-
* @throws {
|
|
22
|
+
* @throws {InvalidStateIdError} If state ID doesn't exist in set
|
|
23
23
|
*/
|
|
24
24
|
export declare const validateStateExists: (stateId: string, stateIds: Set<string>) => void;
|
|
25
25
|
/**
|
|
@@ -33,7 +33,7 @@ export declare const validateStateExists: (stateId: string, stateIds: Set<string
|
|
|
33
33
|
* conditional rendering.
|
|
34
34
|
*
|
|
35
35
|
* @param routes - Array of extracted RouteInfo objects
|
|
36
|
-
* @throws {
|
|
36
|
+
* @throws {DuplicateRoutePathError} If duplicate route paths are detected
|
|
37
37
|
*/
|
|
38
38
|
export declare const detectDuplicateRoutes: (routes: RouteInfo[]) => void;
|
|
39
39
|
//# sourceMappingURL=validate-routes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-routes.d.ts","sourceRoot":"","sources":["../src/validate-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"validate-routes.d.ts","sourceRoot":"","sources":["../src/validate-routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,GAAI,WAAW,MAAM,EAAE,SAAS,MAAM,KAAG,IAIxE,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB,GAAI,SAAS,MAAM,EAAE,UAAU,GAAG,CAAC,MAAM,CAAC,KAAG,IAI5E,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,qBAAqB,GAAI,QAAQ,SAAS,EAAE,KAAG,IAqB3D,CAAC"}
|
package/dist/validate-routes.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { EmptyRoutePathError, InvalidStateIdError, DuplicateRoutePathError } from "./errors.js";
|
|
1
2
|
/**
|
|
2
3
|
* Validate route path format
|
|
3
4
|
*
|
|
@@ -7,11 +8,11 @@
|
|
|
7
8
|
*
|
|
8
9
|
* @param routePath - Route path to validate (absolute or relative)
|
|
9
10
|
* @param stateId - State identifier for error messages
|
|
10
|
-
* @throws {
|
|
11
|
+
* @throws {EmptyRoutePathError} If route path is empty
|
|
11
12
|
*/
|
|
12
13
|
export const validateRouteFormat = (routePath, stateId) => {
|
|
13
14
|
if (!routePath) {
|
|
14
|
-
throw new
|
|
15
|
+
throw new EmptyRoutePathError(stateId);
|
|
15
16
|
}
|
|
16
17
|
};
|
|
17
18
|
/**
|
|
@@ -22,11 +23,11 @@ export const validateRouteFormat = (routePath, stateId) => {
|
|
|
22
23
|
*
|
|
23
24
|
* @param stateId - State identifier to validate
|
|
24
25
|
* @param stateIds - Set of all known state IDs from the machine graph
|
|
25
|
-
* @throws {
|
|
26
|
+
* @throws {InvalidStateIdError} If state ID doesn't exist in set
|
|
26
27
|
*/
|
|
27
28
|
export const validateStateExists = (stateId, stateIds) => {
|
|
28
29
|
if (!stateIds.has(stateId)) {
|
|
29
|
-
throw new
|
|
30
|
+
throw new InvalidStateIdError(stateId);
|
|
30
31
|
}
|
|
31
32
|
};
|
|
32
33
|
/**
|
|
@@ -40,7 +41,7 @@ export const validateStateExists = (stateId, stateIds) => {
|
|
|
40
41
|
* conditional rendering.
|
|
41
42
|
*
|
|
42
43
|
* @param routes - Array of extracted RouteInfo objects
|
|
43
|
-
* @throws {
|
|
44
|
+
* @throws {DuplicateRoutePathError} If duplicate route paths are detected
|
|
44
45
|
*/
|
|
45
46
|
export const detectDuplicateRoutes = (routes) => {
|
|
46
47
|
const routeMap = new Map();
|
|
@@ -58,9 +59,7 @@ export const detectDuplicateRoutes = (routes) => {
|
|
|
58
59
|
}
|
|
59
60
|
}
|
|
60
61
|
if (duplicates.length > 0) {
|
|
61
|
-
throw new
|
|
62
|
-
`Each route path must map to exactly one state.\n` +
|
|
63
|
-
`Use different paths (e.g., /dashboard vs /) or conditional rendering within a single state.`);
|
|
62
|
+
throw new DuplicateRoutePathError(duplicates);
|
|
64
63
|
}
|
|
65
64
|
};
|
|
66
65
|
//# sourceMappingURL=validate-routes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-routes.js","sourceRoot":"","sources":["../src/validate-routes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validate-routes.js","sourceRoot":"","sources":["../src/validate-routes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAEhG;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,SAAiB,EAAE,OAAe,EAAQ,EAAE;IAC/E,IAAI,CAAC,SAAS,EAAE,CAAC;QAChB,MAAM,IAAI,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;AACF,CAAC,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,OAAe,EAAE,QAAqB,EAAQ,EAAE;IACnF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;AACF,CAAC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,MAAmB,EAAQ,EAAE;IAClE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE7C,wCAAwC;IACxC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACrD,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,uCAAuC;IACvC,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;QACxD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,UAAU,CAAC,IAAI,CAAC,KAAK,SAAS,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7D,CAAC;IACF,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,uBAAuB,CAAC,UAAU,CAAC,CAAC;IAC/C,CAAC;AACF,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xmachines/play-router",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.34",
|
|
4
4
|
"description": "Route tree extraction from XState v5 state machines. Part of @xmachines/play Universal Player Architecture.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"routing",
|
|
@@ -46,16 +46,16 @@
|
|
|
46
46
|
"prepublishOnly": "npm run build"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@statelyai/graph": "^0.
|
|
50
|
-
"@xmachines/play": "1.0.0-beta.
|
|
51
|
-
"@xmachines/play-actor": "1.0.0-beta.
|
|
52
|
-
"@xmachines/play-signals": "1.0.0-beta.
|
|
53
|
-
"quick-lru": "^7.
|
|
49
|
+
"@statelyai/graph": "^0.11.0",
|
|
50
|
+
"@xmachines/play": "1.0.0-beta.34",
|
|
51
|
+
"@xmachines/play-actor": "1.0.0-beta.34",
|
|
52
|
+
"@xmachines/play-signals": "1.0.0-beta.34",
|
|
53
|
+
"quick-lru": "^7.3.0"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
56
|
"@types/node": "^25.6.0",
|
|
57
|
-
"@xmachines/play-xstate": "1.0.0-beta.
|
|
58
|
-
"@xmachines/shared": "1.0.0-beta.
|
|
57
|
+
"@xmachines/play-xstate": "1.0.0-beta.34",
|
|
58
|
+
"@xmachines/shared": "1.0.0-beta.34",
|
|
59
59
|
"oxfmt": "^0.45.0",
|
|
60
60
|
"oxlint": "^1.60.0",
|
|
61
61
|
"typescript": "^5.9.3 || ^6.0.3",
|