@xmachines/play-tanstack-react-router 1.0.0-beta.5 → 1.0.0-beta.7

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 CHANGED
@@ -174,4 +174,7 @@ This keeps routing infrastructure passive while preserving business-logic contro
174
174
 
175
175
  ## License
176
176
 
177
- MIT
177
+ Copyright (c) 2016 [Mikael Karon](mailto:mikael@karon.se). All rights reserved.
178
+
179
+ This work is licensed under the terms of the MIT license.
180
+ For a copy, see <https://opensource.org/licenses/MIT>.
@@ -42,7 +42,8 @@ export interface RouteMapping {
42
42
  export declare class RouteMap {
43
43
  private stateIdToPath;
44
44
  private pathToStateId;
45
- private patterns;
45
+ private patternBuckets;
46
+ private pathMatchCache;
46
47
  /**
47
48
  * Create RouteMap from route mappings
48
49
  *
@@ -64,6 +65,8 @@ export declare class RouteMap {
64
65
  * ```
65
66
  */
66
67
  getStateIdByPath(path: string): string | null;
68
+ private getIndexKey;
69
+ private getCandidates;
67
70
  /**
68
71
  * Get router path from state ID
69
72
  *
@@ -1 +1 @@
1
- {"version":3,"file":"route-map.d.ts","sourceRoot":"","sources":["../src/route-map.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAa,MAAM,wBAAwB,CAAC;AAEnE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,QAAQ;IACpB,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,QAAQ,CAA4D;IAE5E;;;;OAIG;gBACS,MAAM,EAAE,YAAY,EAAE;IA0BlC;;;;;;;;;;;;;OAaG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAa7C;;;;;;;;;;;;;OAaG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAGhD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,SAAS,GAAG,QAAQ,CAcrE"}
1
+ {"version":3,"file":"route-map.d.ts","sourceRoot":"","sources":["../src/route-map.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAa,MAAM,wBAAwB,CAAC;AAEnE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,QAAQ;IACpB,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,cAAc,CAA0E;IAChG,OAAO,CAAC,cAAc,CAA6B;IAEnD;;;;OAIG;gBACS,MAAM,EAAE,YAAY,EAAE;IA+BlC;;;;;;;;;;;;;OAaG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAwB7C,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,aAAa;IAyCrB;;;;;;;;;;;;;OAaG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAGhD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,SAAS,GAAG,QAAQ,CAcrE"}
package/dist/route-map.js CHANGED
@@ -32,7 +32,8 @@
32
32
  export class RouteMap {
33
33
  stateIdToPath;
34
34
  pathToStateId;
35
- patterns;
35
+ patternBuckets;
36
+ pathMatchCache;
36
37
  /**
37
38
  * Create RouteMap from route mappings
38
39
  *
@@ -41,7 +42,9 @@ export class RouteMap {
41
42
  constructor(routes) {
42
43
  this.stateIdToPath = new Map();
43
44
  this.pathToStateId = new Map();
44
- this.patterns = [];
45
+ this.patternBuckets = new Map();
46
+ this.pathMatchCache = new Map();
47
+ let patternOrder = 0;
45
48
  for (const { stateId, path } of routes) {
46
49
  this.stateIdToPath.set(stateId, path);
47
50
  // Check if path has parameters
@@ -50,11 +53,14 @@ export class RouteMap {
50
53
  const pattern = path
51
54
  .replace(/\/:[^/]+\?/g, "(?:/([^/]+))?") // Optional params with optional slash
52
55
  .replace(/:[^/]+/g, "([^/]+)"); // Required params
53
- this.patterns.push({
56
+ const bucketKey = this.getIndexKey(path);
57
+ const bucket = this.patternBuckets.get(bucketKey) ?? [];
58
+ bucket.push({
54
59
  pattern: new RegExp(`^${pattern}$`),
55
60
  stateId,
56
- path,
61
+ order: patternOrder++,
57
62
  });
63
+ this.patternBuckets.set(bucketKey, bucket);
58
64
  }
59
65
  else {
60
66
  // Exact match for static paths
@@ -81,13 +87,65 @@ export class RouteMap {
81
87
  const exactMatch = this.pathToStateId.get(path);
82
88
  if (exactMatch)
83
89
  return exactMatch;
90
+ const cachedMatch = this.pathMatchCache.get(path);
91
+ if (cachedMatch !== undefined) {
92
+ return cachedMatch;
93
+ }
84
94
  // Try pattern match
85
- for (const { pattern, stateId } of this.patterns) {
86
- if (pattern.test(path))
95
+ const firstSegment = this.getIndexKey(path);
96
+ const candidates = this.getCandidates(firstSegment);
97
+ for (const { pattern, stateId } of candidates) {
98
+ if (pattern.test(path)) {
99
+ this.pathMatchCache.set(path, stateId);
87
100
  return stateId;
101
+ }
88
102
  }
103
+ this.pathMatchCache.set(path, null);
89
104
  return null;
90
105
  }
106
+ getIndexKey(path) {
107
+ const trimmed = path.startsWith("/") ? path.slice(1) : path;
108
+ if (trimmed.length === 0) {
109
+ return "/";
110
+ }
111
+ const segment = trimmed.split("/")[0];
112
+ if (segment.startsWith(":")) {
113
+ return "*";
114
+ }
115
+ return segment;
116
+ }
117
+ getCandidates(indexKey) {
118
+ const bucket = this.patternBuckets.get(indexKey) ?? [];
119
+ const wildcardBucket = this.patternBuckets.get("*") ?? [];
120
+ if (bucket.length === 0) {
121
+ return wildcardBucket;
122
+ }
123
+ if (wildcardBucket.length === 0) {
124
+ return bucket;
125
+ }
126
+ const merged = [];
127
+ let bucketIndex = 0;
128
+ let wildcardIndex = 0;
129
+ while (bucketIndex < bucket.length && wildcardIndex < wildcardBucket.length) {
130
+ if (bucket[bucketIndex].order < wildcardBucket[wildcardIndex].order) {
131
+ merged.push(bucket[bucketIndex]);
132
+ bucketIndex += 1;
133
+ }
134
+ else {
135
+ merged.push(wildcardBucket[wildcardIndex]);
136
+ wildcardIndex += 1;
137
+ }
138
+ }
139
+ while (bucketIndex < bucket.length) {
140
+ merged.push(bucket[bucketIndex]);
141
+ bucketIndex += 1;
142
+ }
143
+ while (wildcardIndex < wildcardBucket.length) {
144
+ merged.push(wildcardBucket[wildcardIndex]);
145
+ wildcardIndex += 1;
146
+ }
147
+ return merged;
148
+ }
91
149
  /**
92
150
  * Get router path from state ID
93
151
  *
@@ -1 +1 @@
1
- {"version":3,"file":"route-map.js","sourceRoot":"","sources":["../src/route-map.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAcH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,QAAQ;IACZ,aAAa,CAAsB;IACnC,aAAa,CAAsB;IACnC,QAAQ,CAA4D;IAE5E;;;;OAIG;IACH,YAAY,MAAsB;QACjC,IAAI,CAAC,aAAa,GAAG,IAAI,GAAG,EAAE,CAAC;QAC/B,IAAI,CAAC,aAAa,GAAG,IAAI,GAAG,EAAE,CAAC;QAC/B,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QAEnB,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,MAAM,EAAE,CAAC;YACxC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAEtC,+BAA+B;YAC/B,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,sCAAsC;gBACtC,MAAM,OAAO,GAAG,IAAI;qBAClB,OAAO,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC,sCAAsC;qBAC9E,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,kBAAkB;gBACnD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAClB,OAAO,EAAE,IAAI,MAAM,CAAC,IAAI,OAAO,GAAG,CAAC;oBACnC,OAAO;oBACP,IAAI;iBACJ,CAAC,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACP,+BAA+B;gBAC/B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACvC,CAAC;QACF,CAAC;IACF,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,gBAAgB,CAAC,IAAY;QAC5B,wBAAwB;QACxB,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,UAAU;YAAE,OAAO,UAAU,CAAC;QAElC,oBAAoB;QACpB,KAAK,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClD,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO,OAAO,CAAC;QACxC,CAAC;QAED,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,gBAAgB,CAAC,OAAe;QAC/B,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;IAChD,CAAC;CACD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAAoB;IAC1D,MAAM,MAAM,GAAmB,EAAE,CAAC;IAElC,SAAS,QAAQ,CAAC,IAAe;QAChC,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;IACF,CAAC;IAED,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACzB,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC7B,CAAC"}
1
+ {"version":3,"file":"route-map.js","sourceRoot":"","sources":["../src/route-map.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xmachines/play-tanstack-react-router",
3
- "version": "1.0.0-beta.5",
3
+ "version": "1.0.0-beta.7",
4
4
  "description": "TanStack React Router adapter for XMachines Play - synchronizes browser URL with actor state through passive infrastructure",
5
5
  "keywords": [
6
6
  "routing",
@@ -37,15 +37,15 @@
37
37
  "prepublishOnly": "npm run build"
38
38
  },
39
39
  "dependencies": {
40
- "@xmachines/play-actor": "1.0.0-beta.5",
41
- "@xmachines/play-router": "1.0.0-beta.5",
42
- "@xmachines/play-signals": "1.0.0-beta.5",
40
+ "@xmachines/play-actor": "1.0.0-beta.7",
41
+ "@xmachines/play-router": "1.0.0-beta.7",
42
+ "@xmachines/play-signals": "1.0.0-beta.7",
43
43
  "xstate": "^5.28.0"
44
44
  },
45
45
  "devDependencies": {
46
46
  "@tanstack/react-router": "^1.167.5",
47
47
  "@types/node": "^25.5.0",
48
- "@xmachines/shared": "1.0.0-beta.5",
48
+ "@xmachines/shared": "1.0.0-beta.7",
49
49
  "typescript": "^5.9.3"
50
50
  },
51
51
  "peerDependencies": {