@rxflow/manhattan 0.0.2 → 0.0.3

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.
Files changed (176) hide show
  1. package/cjs/geometry/Line.d.ts +21 -0
  2. package/cjs/geometry/Line.d.ts.map +1 -0
  3. package/cjs/geometry/Line.js +88 -0
  4. package/cjs/geometry/Point.d.ts +49 -0
  5. package/cjs/geometry/Point.d.ts.map +1 -0
  6. package/cjs/geometry/Point.js +94 -0
  7. package/cjs/geometry/Rectangle.d.ts +41 -0
  8. package/cjs/geometry/Rectangle.d.ts.map +1 -0
  9. package/cjs/geometry/Rectangle.js +65 -0
  10. package/cjs/geometry/collision.d.ts +15 -0
  11. package/cjs/geometry/collision.d.ts.map +1 -0
  12. package/cjs/geometry/collision.js +81 -0
  13. package/cjs/geometry/index.d.ts +5 -0
  14. package/cjs/geometry/index.d.ts.map +1 -0
  15. package/cjs/geometry/index.js +45 -0
  16. package/cjs/getManHattanPath.d.ts +53 -0
  17. package/cjs/getManHattanPath.d.ts.map +1 -0
  18. package/cjs/getManHattanPath.js +449 -0
  19. package/cjs/index.d.ts +16 -0
  20. package/cjs/index.d.ts.map +1 -0
  21. package/cjs/index.js +117 -0
  22. package/cjs/obstacle/ObstacleMap.d.ts +66 -0
  23. package/cjs/obstacle/ObstacleMap.d.ts.map +1 -0
  24. package/cjs/obstacle/ObstacleMap.js +328 -0
  25. package/cjs/obstacle/QuadTree.d.ts +119 -0
  26. package/cjs/obstacle/QuadTree.d.ts.map +1 -0
  27. package/cjs/obstacle/QuadTree.js +334 -0
  28. package/cjs/obstacle/index.d.ts +2 -0
  29. package/cjs/obstacle/index.d.ts.map +1 -0
  30. package/cjs/obstacle/index.js +12 -0
  31. package/cjs/options/defaults.d.ts +16 -0
  32. package/cjs/options/defaults.d.ts.map +1 -0
  33. package/cjs/options/defaults.js +39 -0
  34. package/cjs/options/index.d.ts +4 -0
  35. package/cjs/options/index.d.ts.map +1 -0
  36. package/cjs/options/index.js +38 -0
  37. package/cjs/options/resolver.d.ts +10 -0
  38. package/cjs/options/resolver.d.ts.map +1 -0
  39. package/cjs/options/resolver.js +248 -0
  40. package/cjs/options/types.d.ts +210 -0
  41. package/cjs/options/types.d.ts.map +1 -0
  42. package/cjs/options/types.js +5 -0
  43. package/cjs/pathfinder/PathCache.d.ts +92 -0
  44. package/cjs/pathfinder/PathCache.d.ts.map +1 -0
  45. package/cjs/pathfinder/PathCache.js +249 -0
  46. package/cjs/pathfinder/SortedSet.d.ts +35 -0
  47. package/cjs/pathfinder/SortedSet.d.ts.map +1 -0
  48. package/cjs/pathfinder/SortedSet.js +95 -0
  49. package/cjs/pathfinder/findRoute.d.ts +8 -0
  50. package/cjs/pathfinder/findRoute.d.ts.map +1 -0
  51. package/cjs/pathfinder/findRoute.js +395 -0
  52. package/cjs/pathfinder/index.d.ts +4 -0
  53. package/cjs/pathfinder/index.d.ts.map +1 -0
  54. package/cjs/pathfinder/index.js +44 -0
  55. package/cjs/svg/index.d.ts +3 -0
  56. package/cjs/svg/index.d.ts.map +1 -0
  57. package/cjs/svg/index.js +31 -0
  58. package/cjs/svg/pathConverter.d.ts +23 -0
  59. package/cjs/svg/pathConverter.d.ts.map +1 -0
  60. package/cjs/svg/pathConverter.js +285 -0
  61. package/cjs/svg/pathParser.d.ts +11 -0
  62. package/cjs/svg/pathParser.d.ts.map +1 -0
  63. package/cjs/svg/pathParser.js +76 -0
  64. package/cjs/utils/AdaptiveStepCalculator.d.ts +90 -0
  65. package/cjs/utils/AdaptiveStepCalculator.d.ts.map +1 -0
  66. package/cjs/utils/AdaptiveStepCalculator.js +224 -0
  67. package/cjs/utils/ErrorRecovery.d.ts +182 -0
  68. package/cjs/utils/ErrorRecovery.d.ts.map +1 -0
  69. package/cjs/utils/ErrorRecovery.js +413 -0
  70. package/cjs/utils/GlobalGrid.d.ts +99 -0
  71. package/cjs/utils/GlobalGrid.d.ts.map +1 -0
  72. package/cjs/utils/GlobalGrid.js +224 -0
  73. package/cjs/utils/PerformanceMonitor.d.ts +139 -0
  74. package/cjs/utils/PerformanceMonitor.d.ts.map +1 -0
  75. package/cjs/utils/PerformanceMonitor.js +305 -0
  76. package/cjs/utils/direction.d.ts +24 -0
  77. package/cjs/utils/direction.d.ts.map +1 -0
  78. package/cjs/utils/direction.js +54 -0
  79. package/cjs/utils/getAnchorPoints.d.ts +15 -0
  80. package/cjs/utils/getAnchorPoints.d.ts.map +1 -0
  81. package/cjs/utils/getAnchorPoints.js +71 -0
  82. package/cjs/utils/grid.d.ts +42 -0
  83. package/cjs/utils/grid.d.ts.map +1 -0
  84. package/cjs/utils/grid.js +73 -0
  85. package/cjs/utils/heuristics.d.ts +61 -0
  86. package/cjs/utils/heuristics.d.ts.map +1 -0
  87. package/cjs/utils/heuristics.js +141 -0
  88. package/cjs/utils/index.d.ts +14 -0
  89. package/cjs/utils/index.d.ts.map +1 -0
  90. package/cjs/utils/index.js +148 -0
  91. package/cjs/utils/node.d.ts +27 -0
  92. package/cjs/utils/node.d.ts.map +1 -0
  93. package/cjs/utils/node.js +36 -0
  94. package/cjs/utils/pathProcessing.d.ts +45 -0
  95. package/cjs/utils/pathProcessing.d.ts.map +1 -0
  96. package/cjs/utils/pathProcessing.js +270 -0
  97. package/cjs/utils/pathValidation.d.ts +11 -0
  98. package/cjs/utils/pathValidation.d.ts.map +1 -0
  99. package/cjs/utils/pathValidation.js +129 -0
  100. package/cjs/utils/rect.d.ts +9 -0
  101. package/cjs/utils/rect.d.ts.map +1 -0
  102. package/cjs/utils/rect.js +110 -0
  103. package/cjs/utils/route.d.ts +19 -0
  104. package/cjs/utils/route.d.ts.map +1 -0
  105. package/cjs/utils/route.js +92 -0
  106. package/esm/geometry/Line.d.ts +21 -0
  107. package/esm/geometry/Line.d.ts.map +1 -0
  108. package/esm/geometry/Point.d.ts +49 -0
  109. package/esm/geometry/Point.d.ts.map +1 -0
  110. package/esm/geometry/Rectangle.d.ts +41 -0
  111. package/esm/geometry/Rectangle.d.ts.map +1 -0
  112. package/esm/geometry/collision.d.ts +15 -0
  113. package/esm/geometry/collision.d.ts.map +1 -0
  114. package/esm/geometry/index.d.ts +5 -0
  115. package/esm/geometry/index.d.ts.map +1 -0
  116. package/esm/getManHattanPath.d.ts +53 -0
  117. package/esm/getManHattanPath.d.ts.map +1 -0
  118. package/esm/index.d.ts +16 -0
  119. package/esm/index.d.ts.map +1 -0
  120. package/esm/obstacle/ObstacleMap.d.ts +66 -0
  121. package/esm/obstacle/ObstacleMap.d.ts.map +1 -0
  122. package/esm/obstacle/QuadTree.d.ts +119 -0
  123. package/esm/obstacle/QuadTree.d.ts.map +1 -0
  124. package/esm/obstacle/index.d.ts +2 -0
  125. package/esm/obstacle/index.d.ts.map +1 -0
  126. package/esm/options/defaults.d.ts +16 -0
  127. package/esm/options/defaults.d.ts.map +1 -0
  128. package/esm/options/index.d.ts +4 -0
  129. package/esm/options/index.d.ts.map +1 -0
  130. package/esm/options/resolver.d.ts +10 -0
  131. package/esm/options/resolver.d.ts.map +1 -0
  132. package/esm/options/types.d.ts +210 -0
  133. package/esm/options/types.d.ts.map +1 -0
  134. package/esm/pathfinder/PathCache.d.ts +92 -0
  135. package/esm/pathfinder/PathCache.d.ts.map +1 -0
  136. package/esm/pathfinder/SortedSet.d.ts +35 -0
  137. package/esm/pathfinder/SortedSet.d.ts.map +1 -0
  138. package/esm/pathfinder/findRoute.d.ts +8 -0
  139. package/esm/pathfinder/findRoute.d.ts.map +1 -0
  140. package/esm/pathfinder/index.d.ts +4 -0
  141. package/esm/pathfinder/index.d.ts.map +1 -0
  142. package/esm/svg/index.d.ts +3 -0
  143. package/esm/svg/index.d.ts.map +1 -0
  144. package/esm/svg/pathConverter.d.ts +23 -0
  145. package/esm/svg/pathConverter.d.ts.map +1 -0
  146. package/esm/svg/pathParser.d.ts +11 -0
  147. package/esm/svg/pathParser.d.ts.map +1 -0
  148. package/esm/utils/AdaptiveStepCalculator.d.ts +90 -0
  149. package/esm/utils/AdaptiveStepCalculator.d.ts.map +1 -0
  150. package/esm/utils/ErrorRecovery.d.ts +182 -0
  151. package/esm/utils/ErrorRecovery.d.ts.map +1 -0
  152. package/esm/utils/GlobalGrid.d.ts +99 -0
  153. package/esm/utils/GlobalGrid.d.ts.map +1 -0
  154. package/esm/utils/PerformanceMonitor.d.ts +139 -0
  155. package/esm/utils/PerformanceMonitor.d.ts.map +1 -0
  156. package/esm/utils/direction.d.ts +24 -0
  157. package/esm/utils/direction.d.ts.map +1 -0
  158. package/esm/utils/getAnchorPoints.d.ts +15 -0
  159. package/esm/utils/getAnchorPoints.d.ts.map +1 -0
  160. package/esm/utils/grid.d.ts +42 -0
  161. package/esm/utils/grid.d.ts.map +1 -0
  162. package/esm/utils/heuristics.d.ts +61 -0
  163. package/esm/utils/heuristics.d.ts.map +1 -0
  164. package/esm/utils/index.d.ts +14 -0
  165. package/esm/utils/index.d.ts.map +1 -0
  166. package/esm/utils/node.d.ts +27 -0
  167. package/esm/utils/node.d.ts.map +1 -0
  168. package/esm/utils/pathProcessing.d.ts +45 -0
  169. package/esm/utils/pathProcessing.d.ts.map +1 -0
  170. package/esm/utils/pathValidation.d.ts +11 -0
  171. package/esm/utils/pathValidation.d.ts.map +1 -0
  172. package/esm/utils/rect.d.ts +9 -0
  173. package/esm/utils/rect.d.ts.map +1 -0
  174. package/esm/utils/route.d.ts +19 -0
  175. package/esm/utils/route.d.ts.map +1 -0
  176. package/package.json +1 -1
@@ -0,0 +1,248 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.normalizeAngle = normalizeAngle;
7
+ exports.resolveOptions = resolveOptions;
8
+ var _geometry = require("../geometry");
9
+ var _defaults = require("./defaults");
10
+ var _AdaptiveStepCalculator = require("../utils/AdaptiveStepCalculator");
11
+ /**
12
+ * Default performance configuration
13
+ */
14
+ const DEFAULT_PERFORMANCE_CONFIG = {
15
+ enableCache: true,
16
+ cacheSize: 100,
17
+ enableQuadTree: true,
18
+ earlyTermination: false
19
+ };
20
+
21
+ /**
22
+ * Default debug configuration
23
+ */
24
+ const DEFAULT_DEBUG_CONFIG = {
25
+ enableLogging: false,
26
+ enableMetrics: false,
27
+ logLevel: 'info'
28
+ };
29
+
30
+ /**
31
+ * Normalize padding value to box format
32
+ */
33
+ function normalizePadding(padding) {
34
+ if (typeof padding === 'number') {
35
+ return {
36
+ top: padding,
37
+ right: padding,
38
+ bottom: padding,
39
+ left: padding
40
+ };
41
+ }
42
+ return padding;
43
+ }
44
+
45
+ /**
46
+ * Normalize angle to 0-360 range
47
+ */
48
+ function normalizeAngle(angle) {
49
+ while (angle < 0) {
50
+ angle += 360;
51
+ }
52
+ while (angle >= 360) {
53
+ angle -= 360;
54
+ }
55
+ return angle;
56
+ }
57
+
58
+ /**
59
+ * Validate and fix configuration options
60
+ */
61
+ function validateAndFixOptions(options) {
62
+ const fixed = {
63
+ ...options
64
+ };
65
+
66
+ // Validate step
67
+ if (fixed.step !== undefined && fixed.step <= 0) {
68
+ console.warn('[ManhattanRouter] Invalid step value, using default');
69
+ fixed.step = _defaults.defaults.step;
70
+ }
71
+
72
+ // Validate maxLoopCount
73
+ if (fixed.maxLoopCount !== undefined && fixed.maxLoopCount <= 0) {
74
+ console.warn('[ManhattanRouter] Invalid maxLoopCount, using default');
75
+ fixed.maxLoopCount = _defaults.defaults.maxLoopCount;
76
+ }
77
+
78
+ // Validate borderRadius
79
+ if (fixed.borderRadius !== undefined && fixed.borderRadius < 0) {
80
+ console.warn('[ManhattanRouter] Invalid borderRadius, using default');
81
+ fixed.borderRadius = _defaults.defaults.borderRadius;
82
+ }
83
+
84
+ // Validate extensionDistance
85
+ if (fixed.extensionDistance !== undefined && fixed.extensionDistance < 0) {
86
+ console.warn('[ManhattanRouter] Invalid extensionDistance, using default');
87
+ fixed.extensionDistance = _defaults.defaults.extensionDistance;
88
+ }
89
+
90
+ // Validate precision
91
+ if (fixed.precision !== undefined && (fixed.precision < 0 || fixed.precision > 10)) {
92
+ console.warn('[ManhattanRouter] Invalid precision, using default');
93
+ fixed.precision = _defaults.defaults.precision;
94
+ }
95
+ return fixed;
96
+ }
97
+
98
+ /**
99
+ * Resolve adaptive step configuration
100
+ */
101
+ function resolveAdaptiveStepConfig(config) {
102
+ if (!config) {
103
+ return {
104
+ ..._AdaptiveStepCalculator.DEFAULT_ADAPTIVE_STEP_CONFIG
105
+ };
106
+ }
107
+ return {
108
+ enabled: config.enabled ?? _AdaptiveStepCalculator.DEFAULT_ADAPTIVE_STEP_CONFIG.enabled,
109
+ minStep: config.minStep ?? _AdaptiveStepCalculator.DEFAULT_ADAPTIVE_STEP_CONFIG.minStep,
110
+ maxStep: config.maxStep ?? _AdaptiveStepCalculator.DEFAULT_ADAPTIVE_STEP_CONFIG.maxStep,
111
+ densityBased: {
112
+ enabled: config.densityBased?.enabled ?? _AdaptiveStepCalculator.DEFAULT_ADAPTIVE_STEP_CONFIG.densityBased.enabled,
113
+ threshold: config.densityBased?.threshold ?? _AdaptiveStepCalculator.DEFAULT_ADAPTIVE_STEP_CONFIG.densityBased.threshold
114
+ },
115
+ distanceBased: {
116
+ enabled: config.distanceBased?.enabled ?? _AdaptiveStepCalculator.DEFAULT_ADAPTIVE_STEP_CONFIG.distanceBased.enabled,
117
+ shortPathThreshold: config.distanceBased?.shortPathThreshold ?? _AdaptiveStepCalculator.DEFAULT_ADAPTIVE_STEP_CONFIG.distanceBased.shortPathThreshold,
118
+ longPathThreshold: config.distanceBased?.longPathThreshold ?? _AdaptiveStepCalculator.DEFAULT_ADAPTIVE_STEP_CONFIG.distanceBased.longPathThreshold
119
+ }
120
+ };
121
+ }
122
+
123
+ /**
124
+ * Resolve performance configuration
125
+ */
126
+ function resolvePerformanceConfig(config) {
127
+ if (!config) {
128
+ return {
129
+ ...DEFAULT_PERFORMANCE_CONFIG
130
+ };
131
+ }
132
+ return {
133
+ enableCache: config.enableCache ?? DEFAULT_PERFORMANCE_CONFIG.enableCache,
134
+ cacheSize: config.cacheSize ?? DEFAULT_PERFORMANCE_CONFIG.cacheSize,
135
+ enableQuadTree: config.enableQuadTree ?? DEFAULT_PERFORMANCE_CONFIG.enableQuadTree,
136
+ earlyTermination: config.earlyTermination ?? DEFAULT_PERFORMANCE_CONFIG.earlyTermination
137
+ };
138
+ }
139
+
140
+ /**
141
+ * Resolve debug configuration
142
+ */
143
+ function resolveDebugConfig(config) {
144
+ if (!config) {
145
+ return {
146
+ ...DEFAULT_DEBUG_CONFIG
147
+ };
148
+ }
149
+ return {
150
+ enableLogging: config.enableLogging ?? DEFAULT_DEBUG_CONFIG.enableLogging,
151
+ enableMetrics: config.enableMetrics ?? DEFAULT_DEBUG_CONFIG.enableMetrics,
152
+ logLevel: config.logLevel ?? DEFAULT_DEBUG_CONFIG.logLevel
153
+ };
154
+ }
155
+
156
+ /**
157
+ * Resolve options by merging user options with defaults
158
+ */
159
+ function resolveOptions(options = {}) {
160
+ // Validate and fix options first
161
+ const validatedOptions = validateAndFixOptions(options);
162
+ const step = validatedOptions.step ?? _defaults.defaults.step;
163
+ const maxLoopCount = validatedOptions.maxLoopCount ?? _defaults.defaults.maxLoopCount;
164
+ const precision = validatedOptions.precision ?? _defaults.defaults.precision;
165
+ const maxDirectionChange = validatedOptions.maxDirectionChange ?? _defaults.defaults.maxDirectionChange;
166
+ const startDirections = validatedOptions.startDirections ?? _defaults.defaults.startDirections;
167
+ const endDirections = validatedOptions.endDirections ?? _defaults.defaults.endDirections;
168
+ const excludeNodes = validatedOptions.excludeNodes ?? _defaults.defaults.excludeNodes;
169
+ const excludeShapes = validatedOptions.excludeShapes ?? _defaults.defaults.excludeShapes;
170
+ const excludeTerminals = validatedOptions.excludeTerminals ?? _defaults.defaults.excludeTerminals;
171
+ const borderRadius = validatedOptions.borderRadius ?? _defaults.defaults.borderRadius;
172
+ const extensionDistance = validatedOptions.extensionDistance ?? _defaults.defaults.extensionDistance;
173
+ const penalties = validatedOptions.penalties ?? _defaults.defaults.penalties;
174
+ const fallbackRoute = validatedOptions.fallbackRoute;
175
+
176
+ // Convert padding to paddingBox
177
+ const padding = validatedOptions.padding ?? _defaults.defaults.padding;
178
+ const sides = normalizePadding(padding);
179
+ const paddingBox = {
180
+ x: -sides.left,
181
+ y: -sides.top,
182
+ width: sides.left + sides.right,
183
+ height: sides.top + sides.bottom
184
+ };
185
+
186
+ // Calculate cost (same as step)
187
+ const cost = step;
188
+
189
+ // Calculate directions array with offsets and costs
190
+ const directions = [{
191
+ cost,
192
+ offsetX: step,
193
+ offsetY: 0,
194
+ angle: 0
195
+ }, {
196
+ cost,
197
+ offsetX: -step,
198
+ offsetY: 0,
199
+ angle: 0
200
+ }, {
201
+ cost,
202
+ offsetX: 0,
203
+ offsetY: step,
204
+ angle: 0
205
+ }, {
206
+ cost,
207
+ offsetX: 0,
208
+ offsetY: -step,
209
+ angle: 0
210
+ }];
211
+
212
+ // Calculate angle for each direction
213
+ directions.forEach(direction => {
214
+ const point1 = new _geometry.Point(0, 0);
215
+ const point2 = new _geometry.Point(direction.offsetX, direction.offsetY);
216
+ direction.angle = normalizeAngle(point1.theta(point2));
217
+ });
218
+
219
+ // Resolve new configuration sections
220
+ const adaptiveStep = resolveAdaptiveStepConfig(validatedOptions.adaptiveStep);
221
+ const performance = resolvePerformanceConfig(validatedOptions.performance);
222
+ const debug = resolveDebugConfig(validatedOptions.debug);
223
+ return {
224
+ step,
225
+ maxLoopCount,
226
+ precision,
227
+ maxDirectionChange,
228
+ startDirections,
229
+ endDirections,
230
+ excludeNodes,
231
+ excludeShapes,
232
+ excludeTerminals,
233
+ paddingBox,
234
+ borderRadius,
235
+ extensionDistance,
236
+ sourcePosition: validatedOptions.sourcePosition,
237
+ targetPosition: validatedOptions.targetPosition,
238
+ directionMap: _defaults.directionMap,
239
+ directions,
240
+ penalties,
241
+ cost,
242
+ fallbackRoute,
243
+ previousDirectionAngle: undefined,
244
+ adaptiveStep,
245
+ performance,
246
+ debug
247
+ };
248
+ }
@@ -0,0 +1,210 @@
1
+ import { Point } from '../geometry';
2
+ import type { AdaptiveStepConfig } from '../utils/AdaptiveStepCalculator';
3
+ /**
4
+ * Direction type for routing
5
+ */
6
+ export type Direction = 'top' | 'right' | 'bottom' | 'left';
7
+ /**
8
+ * ReactFlow internal node structure
9
+ * Based on ReactFlow's InternalNodeBase type
10
+ */
11
+ export interface InternalNode {
12
+ id: string;
13
+ position: {
14
+ x: number;
15
+ y: number;
16
+ };
17
+ internals: {
18
+ positionAbsolute: {
19
+ x: number;
20
+ y: number;
21
+ };
22
+ };
23
+ measured?: {
24
+ width?: number;
25
+ height?: number;
26
+ };
27
+ width?: number;
28
+ height?: number;
29
+ initialWidth?: number;
30
+ initialHeight?: number;
31
+ type?: string;
32
+ [key: string]: any;
33
+ }
34
+ /**
35
+ * Node lookup map type (ReactFlow's internal structure)
36
+ */
37
+ export type NodeLookup = Map<string, InternalNode>;
38
+ /**
39
+ * Performance optimization configuration
40
+ */
41
+ export interface PerformanceConfig {
42
+ /** Enable path caching */
43
+ enableCache?: boolean;
44
+ /** Maximum cache size */
45
+ cacheSize?: number;
46
+ /** Enable QuadTree for obstacle queries */
47
+ enableQuadTree?: boolean;
48
+ /** Enable early termination when good path found */
49
+ earlyTermination?: boolean;
50
+ }
51
+ /**
52
+ * Debug configuration
53
+ */
54
+ export interface DebugConfig {
55
+ /** Enable logging */
56
+ enableLogging?: boolean;
57
+ /** Enable performance metrics collection */
58
+ enableMetrics?: boolean;
59
+ /** Log level */
60
+ logLevel?: 'error' | 'warn' | 'info' | 'debug';
61
+ }
62
+ /**
63
+ * Manhattan router configuration options
64
+ */
65
+ export interface ManhattanRouterOptions {
66
+ /**
67
+ * The size of step to find a route (the grid of the manhattan pathfinder)
68
+ * @default 10
69
+ */
70
+ step?: number;
71
+ /**
72
+ * The number of route finding loops that cause the router to abort and return fallback route instead
73
+ * @default 2000
74
+ */
75
+ maxLoopCount?: number;
76
+ /**
77
+ * The number of decimal places to round floating point coordinates
78
+ * @default 1
79
+ */
80
+ precision?: number;
81
+ /**
82
+ * The maximum change of direction (in degrees)
83
+ * @default 90
84
+ */
85
+ maxDirectionChange?: number;
86
+ /**
87
+ * Possible starting directions from a node
88
+ * @default ['top', 'right', 'bottom', 'left']
89
+ */
90
+ startDirections?: Direction[];
91
+ /**
92
+ * Possible ending directions to a node
93
+ * @default ['top', 'right', 'bottom', 'left']
94
+ */
95
+ endDirections?: Direction[];
96
+ /**
97
+ * Should certain nodes not be considered as obstacles?
98
+ */
99
+ excludeNodes?: string[];
100
+ /**
101
+ * Should certain types of nodes not be considered as obstacles?
102
+ */
103
+ excludeShapes?: string[];
104
+ /**
105
+ * Should the source and/or target not be considered as obstacles?
106
+ */
107
+ excludeTerminals?: ('source' | 'target')[];
108
+ /**
109
+ * The padding applied on the element bounding boxes
110
+ */
111
+ padding?: number | {
112
+ top: number;
113
+ right: number;
114
+ bottom: number;
115
+ left: number;
116
+ };
117
+ /**
118
+ * Border radius for rounded corners at path turns (in pixels)
119
+ * Set to 0 for sharp corners
120
+ * @default 5
121
+ */
122
+ borderRadius?: number;
123
+ /**
124
+ * Extension distance from node edge for path start/end points (in pixels)
125
+ * This controls how far the path extends away from the node before turning
126
+ * @default 20
127
+ */
128
+ extensionDistance?: number;
129
+ /**
130
+ * Source position (from ReactFlow)
131
+ * Used for smart point generation
132
+ */
133
+ sourcePosition?: string;
134
+ /**
135
+ * Target position (from ReactFlow)
136
+ * Used for smart point generation
137
+ */
138
+ targetPosition?: string;
139
+ /**
140
+ * A penalty received for direction change
141
+ */
142
+ penalties?: {
143
+ [angle: number]: number;
144
+ };
145
+ /**
146
+ * Fallback route function when pathfinding fails
147
+ */
148
+ fallbackRoute?: (from: Point, to: Point) => Point[];
149
+ /**
150
+ * Adaptive step configuration
151
+ * Automatically adjusts step size based on node density and path distance
152
+ */
153
+ adaptiveStep?: Partial<AdaptiveStepConfig>;
154
+ /**
155
+ * Performance optimization configuration
156
+ */
157
+ performance?: PerformanceConfig;
158
+ /**
159
+ * Debug configuration
160
+ */
161
+ debug?: DebugConfig;
162
+ }
163
+ /**
164
+ * Resolved options with all defaults applied
165
+ */
166
+ export interface ResolvedOptions {
167
+ step: number;
168
+ maxLoopCount: number;
169
+ precision: number;
170
+ maxDirectionChange: number;
171
+ startDirections: Direction[];
172
+ endDirections: Direction[];
173
+ excludeNodes: string[];
174
+ excludeShapes: string[];
175
+ excludeTerminals: ('source' | 'target')[];
176
+ paddingBox: {
177
+ x: number;
178
+ y: number;
179
+ width: number;
180
+ height: number;
181
+ };
182
+ borderRadius: number;
183
+ extensionDistance: number;
184
+ sourcePosition?: string;
185
+ targetPosition?: string;
186
+ directionMap: {
187
+ top: Point;
188
+ right: Point;
189
+ bottom: Point;
190
+ left: Point;
191
+ };
192
+ directions: Array<{
193
+ cost: number;
194
+ offsetX: number;
195
+ offsetY: number;
196
+ angle?: number;
197
+ gridOffsetX?: number;
198
+ gridOffsetY?: number;
199
+ }>;
200
+ penalties: {
201
+ [angle: number]: number;
202
+ };
203
+ cost: number;
204
+ fallbackRoute?: (from: Point, to: Point) => Point[];
205
+ previousDirectionAngle?: number | null;
206
+ adaptiveStep: AdaptiveStepConfig;
207
+ performance: Required<PerformanceConfig>;
208
+ debug: Required<DebugConfig>;
209
+ }
210
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/options/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
@@ -0,0 +1,92 @@
1
+ /**
2
+ * PathCache - LRU cache for computed paths
3
+ * Feature: manhattan-optimization
4
+ *
5
+ * Implements a Least Recently Used (LRU) cache for storing computed paths.
6
+ * This improves performance by avoiding redundant path calculations for
7
+ * identical source-target-options combinations.
8
+ *
9
+ * Requirements: 3.4
10
+ */
11
+ import { Point, Rectangle } from '../geometry';
12
+ import type { ResolvedOptions } from '../options';
13
+ /**
14
+ * Cache entry containing the computed path and metadata
15
+ */
16
+ export interface CacheEntry {
17
+ path: Point[];
18
+ timestamp: number;
19
+ hitCount: number;
20
+ }
21
+ /**
22
+ * Configuration for PathCache
23
+ */
24
+ export interface PathCacheConfig {
25
+ /** Maximum number of entries in the cache */
26
+ maxSize: number;
27
+ /** Time-to-live in milliseconds (0 = no expiration) */
28
+ ttl: number;
29
+ /** Whether caching is enabled */
30
+ enabled: boolean;
31
+ }
32
+ /**
33
+ * Generate a cache key from path parameters
34
+ */
35
+ export declare function generateCacheKey(sourceBBox: Rectangle, targetBBox: Rectangle, sourceAnchor: Point, targetAnchor: Point, options: ResolvedOptions): string;
36
+ /**
37
+ * LRU Cache for computed paths
38
+ */
39
+ export declare class PathCache {
40
+ private cache;
41
+ private config;
42
+ private hits;
43
+ private misses;
44
+ constructor(config?: Partial<PathCacheConfig>);
45
+ /**
46
+ * Get a cached path if available and not expired
47
+ */
48
+ get(key: string): Point[] | null;
49
+ /**
50
+ * Store a path in the cache
51
+ */
52
+ set(key: string, path: Point[]): void;
53
+ /**
54
+ * Check if a key exists in the cache (without updating LRU order)
55
+ */
56
+ has(key: string): boolean;
57
+ /**
58
+ * Clear all cached entries
59
+ */
60
+ clear(): void;
61
+ /**
62
+ * Get cache statistics
63
+ */
64
+ getStats(): {
65
+ size: number;
66
+ maxSize: number;
67
+ hits: number;
68
+ misses: number;
69
+ hitRate: number;
70
+ };
71
+ /**
72
+ * Update cache configuration
73
+ */
74
+ updateConfig(config: Partial<PathCacheConfig>): void;
75
+ /**
76
+ * Get current configuration
77
+ */
78
+ getConfig(): PathCacheConfig;
79
+ /**
80
+ * Remove expired entries (useful for periodic cleanup)
81
+ */
82
+ cleanup(): number;
83
+ }
84
+ /**
85
+ * Get the global path cache instance
86
+ */
87
+ export declare function getGlobalPathCache(): PathCache;
88
+ /**
89
+ * Reset the global path cache (useful for testing)
90
+ */
91
+ export declare function resetGlobalPathCache(): void;
92
+ //# sourceMappingURL=PathCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PathCache.d.ts","sourceRoot":"","sources":["../../src/pathfinder/PathCache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAEjD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,KAAK,EAAE,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAA;IACf,uDAAuD;IACvD,GAAG,EAAE,MAAM,CAAA;IACX,iCAAiC;IACjC,OAAO,EAAE,OAAO,CAAA;CACjB;AAWD;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,SAAS,EACrB,UAAU,EAAE,SAAS,EACrB,YAAY,EAAE,KAAK,EACnB,YAAY,EAAE,KAAK,EACnB,OAAO,EAAE,eAAe,GACvB,MAAM,CAsBR;AAED;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,IAAI,CAAY;IACxB,OAAO,CAAC,MAAM,CAAY;gBAEd,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM;IAKjD;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,EAAE,GAAG,IAAI;IAiChC;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI;IAoBrC;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAsBzB;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;OAEG;IACH,QAAQ,IAAI;QACV,IAAI,EAAE,MAAM,CAAA;QACZ,OAAO,EAAE,MAAM,CAAA;QACf,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,EAAE,MAAM,CAAA;QACd,OAAO,EAAE,MAAM,CAAA;KAChB;IAWD;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI;IAiBpD;;OAEG;IACH,SAAS,IAAI,eAAe;IAI5B;;OAEG;IACH,OAAO,IAAI,MAAM;CAiBlB;AAOD;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,SAAS,CAK9C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAK3C"}