@signaltree/core 4.0.7 → 4.0.8

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 (1137) hide show
  1. package/README.md +84 -86
  2. package/dist/enhancers/batching/index.d.ts +495 -0
  3. package/dist/enhancers/batching/index.js +406 -0
  4. package/dist/enhancers/batching/index.js.map +1 -0
  5. package/dist/enhancers/batching/types/packages/core/src/enhancers/batching/index.d.ts +2 -0
  6. package/dist/enhancers/batching/types/packages/core/src/enhancers/batching/index.d.ts.map +1 -0
  7. package/dist/enhancers/batching/types/packages/core/src/enhancers/batching/jest.config.d.ts +16 -0
  8. package/dist/enhancers/batching/types/packages/core/src/enhancers/batching/jest.config.d.ts.map +1 -0
  9. package/dist/enhancers/batching/types/packages/core/src/enhancers/batching/lib/batching.d.ts +262 -0
  10. package/dist/enhancers/batching/types/packages/core/src/enhancers/batching/lib/batching.d.ts.map +1 -0
  11. package/dist/enhancers/batching/types/packages/core/src/enhancers/batching/test-setup.d.ts +2 -0
  12. package/dist/enhancers/batching/types/packages/core/src/enhancers/batching/test-setup.d.ts.map +1 -0
  13. package/dist/enhancers/batching/types/packages/core/src/enhancers/computed/index.d.ts +2 -0
  14. package/dist/enhancers/batching/types/packages/core/src/enhancers/computed/index.d.ts.map +1 -0
  15. package/dist/enhancers/batching/types/packages/core/src/enhancers/computed/jest.config.d.ts +16 -0
  16. package/dist/enhancers/batching/types/packages/core/src/enhancers/computed/jest.config.d.ts.map +1 -0
  17. package/dist/enhancers/batching/types/packages/core/src/enhancers/computed/lib/computed.d.ts +68 -0
  18. package/dist/enhancers/batching/types/packages/core/src/enhancers/computed/lib/computed.d.ts.map +1 -0
  19. package/dist/enhancers/batching/types/packages/core/src/enhancers/devtools/index.d.ts +2 -0
  20. package/dist/enhancers/batching/types/packages/core/src/enhancers/devtools/index.d.ts.map +1 -0
  21. package/dist/enhancers/batching/types/packages/core/src/enhancers/devtools/jest.config.d.ts +16 -0
  22. package/dist/enhancers/batching/types/packages/core/src/enhancers/devtools/jest.config.d.ts.map +1 -0
  23. package/dist/enhancers/batching/types/packages/core/src/enhancers/devtools/lib/devtools.d.ts +129 -0
  24. package/dist/enhancers/batching/types/packages/core/src/enhancers/devtools/lib/devtools.d.ts.map +1 -0
  25. package/dist/enhancers/batching/types/packages/core/src/enhancers/devtools/test-setup.d.ts +2 -0
  26. package/dist/enhancers/batching/types/packages/core/src/enhancers/devtools/test-setup.d.ts.map +1 -0
  27. package/dist/enhancers/batching/types/packages/core/src/enhancers/entities/index.d.ts +2 -0
  28. package/dist/enhancers/batching/types/packages/core/src/enhancers/entities/index.d.ts.map +1 -0
  29. package/dist/enhancers/batching/types/packages/core/src/enhancers/entities/jest.config.d.ts +16 -0
  30. package/dist/enhancers/batching/types/packages/core/src/enhancers/entities/jest.config.d.ts.map +1 -0
  31. package/dist/enhancers/batching/types/packages/core/src/enhancers/entities/lib/entities.d.ts +39 -0
  32. package/dist/enhancers/batching/types/packages/core/src/enhancers/entities/lib/entities.d.ts.map +1 -0
  33. package/dist/enhancers/batching/types/packages/core/src/enhancers/entities/test-setup.d.ts +2 -0
  34. package/dist/enhancers/batching/types/packages/core/src/enhancers/entities/test-setup.d.ts.map +1 -0
  35. package/dist/enhancers/batching/types/packages/core/src/enhancers/index.d.ts +38 -0
  36. package/dist/enhancers/batching/types/packages/core/src/enhancers/index.d.ts.map +1 -0
  37. package/dist/enhancers/batching/types/packages/core/src/enhancers/memoization/index.d.ts +2 -0
  38. package/dist/enhancers/batching/types/packages/core/src/enhancers/memoization/index.d.ts.map +1 -0
  39. package/dist/enhancers/batching/types/packages/core/src/enhancers/memoization/jest.config.d.ts +16 -0
  40. package/dist/enhancers/batching/types/packages/core/src/enhancers/memoization/jest.config.d.ts.map +1 -0
  41. package/dist/enhancers/batching/types/packages/core/src/enhancers/memoization/lib/memoization.d.ts +190 -0
  42. package/dist/enhancers/batching/types/packages/core/src/enhancers/memoization/lib/memoization.d.ts.map +1 -0
  43. package/dist/enhancers/batching/types/packages/core/src/enhancers/memoization/test-setup.d.ts +2 -0
  44. package/dist/enhancers/batching/types/packages/core/src/enhancers/memoization/test-setup.d.ts.map +1 -0
  45. package/dist/enhancers/batching/types/packages/core/src/enhancers/middleware/index.d.ts +3 -0
  46. package/dist/enhancers/batching/types/packages/core/src/enhancers/middleware/index.d.ts.map +1 -0
  47. package/dist/enhancers/batching/types/packages/core/src/enhancers/middleware/jest.config.d.ts +16 -0
  48. package/dist/enhancers/batching/types/packages/core/src/enhancers/middleware/jest.config.d.ts.map +1 -0
  49. package/dist/enhancers/batching/types/packages/core/src/enhancers/middleware/lib/async-helpers.d.ts +16 -0
  50. package/dist/enhancers/batching/types/packages/core/src/enhancers/middleware/lib/async-helpers.d.ts.map +1 -0
  51. package/dist/enhancers/batching/types/packages/core/src/enhancers/middleware/lib/middleware.d.ts +43 -0
  52. package/dist/enhancers/batching/types/packages/core/src/enhancers/middleware/lib/middleware.d.ts.map +1 -0
  53. package/dist/enhancers/batching/types/packages/core/src/enhancers/middleware/test-setup.d.ts +2 -0
  54. package/dist/enhancers/batching/types/packages/core/src/enhancers/middleware/test-setup.d.ts.map +1 -0
  55. package/dist/enhancers/batching/types/packages/core/src/enhancers/presets/index.d.ts +2 -0
  56. package/dist/enhancers/batching/types/packages/core/src/enhancers/presets/index.d.ts.map +1 -0
  57. package/dist/enhancers/batching/types/packages/core/src/enhancers/presets/jest.config.d.ts +16 -0
  58. package/dist/enhancers/batching/types/packages/core/src/enhancers/presets/jest.config.d.ts.map +1 -0
  59. package/dist/enhancers/batching/types/packages/core/src/enhancers/presets/lib/presets.d.ts +69 -0
  60. package/dist/enhancers/batching/types/packages/core/src/enhancers/presets/lib/presets.d.ts.map +1 -0
  61. package/dist/enhancers/batching/types/packages/core/src/enhancers/presets/test-setup.d.ts +2 -0
  62. package/dist/enhancers/batching/types/packages/core/src/enhancers/presets/test-setup.d.ts.map +1 -0
  63. package/dist/enhancers/batching/types/packages/core/src/enhancers/serialization/constants.d.ts +19 -0
  64. package/dist/enhancers/batching/types/packages/core/src/enhancers/serialization/constants.d.ts.map +1 -0
  65. package/dist/enhancers/batching/types/packages/core/src/enhancers/serialization/index.d.ts +3 -0
  66. package/dist/enhancers/batching/types/packages/core/src/enhancers/serialization/index.d.ts.map +1 -0
  67. package/dist/enhancers/batching/types/packages/core/src/enhancers/serialization/jest.config.d.ts +16 -0
  68. package/dist/enhancers/batching/types/packages/core/src/enhancers/serialization/jest.config.d.ts.map +1 -0
  69. package/dist/enhancers/batching/types/packages/core/src/enhancers/serialization/lib/serialization.d.ts +186 -0
  70. package/dist/enhancers/batching/types/packages/core/src/enhancers/serialization/lib/serialization.d.ts.map +1 -0
  71. package/dist/enhancers/batching/types/packages/core/src/enhancers/serialization/test-setup.d.ts +2 -0
  72. package/dist/enhancers/batching/types/packages/core/src/enhancers/serialization/test-setup.d.ts.map +1 -0
  73. package/dist/enhancers/batching/types/packages/core/src/enhancers/time-travel/index.d.ts +2 -0
  74. package/dist/enhancers/batching/types/packages/core/src/enhancers/time-travel/index.d.ts.map +1 -0
  75. package/dist/enhancers/batching/types/packages/core/src/enhancers/time-travel/jest.config.d.ts +16 -0
  76. package/dist/enhancers/batching/types/packages/core/src/enhancers/time-travel/jest.config.d.ts.map +1 -0
  77. package/dist/enhancers/batching/types/packages/core/src/enhancers/time-travel/lib/time-travel.d.ts +145 -0
  78. package/dist/enhancers/batching/types/packages/core/src/enhancers/time-travel/lib/time-travel.d.ts.map +1 -0
  79. package/dist/enhancers/batching/types/packages/core/src/enhancers/time-travel/lib/utils.d.ts +3 -0
  80. package/dist/enhancers/batching/types/packages/core/src/enhancers/time-travel/lib/utils.d.ts.map +1 -0
  81. package/dist/enhancers/batching/types/packages/core/src/enhancers/time-travel/test-setup.d.ts +2 -0
  82. package/dist/enhancers/batching/types/packages/core/src/enhancers/time-travel/test-setup.d.ts.map +1 -0
  83. package/dist/enhancers/batching/types/packages/core/src/enhancers/types.d.ts +112 -0
  84. package/dist/enhancers/batching/types/packages/core/src/enhancers/types.d.ts.map +1 -0
  85. package/dist/enhancers/batching/types/packages/core/src/index.d.ts +119 -0
  86. package/dist/enhancers/batching/types/packages/core/src/index.d.ts.map +1 -0
  87. package/dist/enhancers/batching/types/packages/core/src/lib/constants.d.ts +50 -0
  88. package/dist/enhancers/batching/types/packages/core/src/lib/constants.d.ts.map +1 -0
  89. package/dist/enhancers/batching/types/packages/core/src/lib/memory/memory-manager.d.ts +145 -0
  90. package/dist/enhancers/batching/types/packages/core/src/lib/memory/memory-manager.d.ts.map +1 -0
  91. package/dist/enhancers/batching/types/packages/core/src/lib/performance/diff-engine.d.ts +109 -0
  92. package/dist/enhancers/batching/types/packages/core/src/lib/performance/diff-engine.d.ts.map +1 -0
  93. package/dist/enhancers/batching/types/packages/core/src/lib/performance/path-index.d.ts +120 -0
  94. package/dist/enhancers/batching/types/packages/core/src/lib/performance/path-index.d.ts.map +1 -0
  95. package/dist/enhancers/batching/types/packages/core/src/lib/performance/update-engine.d.ts +116 -0
  96. package/dist/enhancers/batching/types/packages/core/src/lib/performance/update-engine.d.ts.map +1 -0
  97. package/dist/enhancers/batching/types/packages/core/src/lib/security/security-validator.d.ts +145 -0
  98. package/dist/enhancers/batching/types/packages/core/src/lib/security/security-validator.d.ts.map +1 -0
  99. package/dist/enhancers/batching/types/packages/core/src/lib/signal-tree.d.ts +17 -0
  100. package/dist/enhancers/batching/types/packages/core/src/lib/signal-tree.d.ts.map +1 -0
  101. package/dist/enhancers/batching/types/packages/core/src/lib/types.d.ts +299 -0
  102. package/dist/enhancers/batching/types/packages/core/src/lib/types.d.ts.map +1 -0
  103. package/dist/enhancers/batching/types/packages/core/src/lib/utils.d.ts +53 -0
  104. package/dist/enhancers/batching/types/packages/core/src/lib/utils.d.ts.map +1 -0
  105. package/dist/enhancers/computed/index.d.ts +302 -0
  106. package/dist/enhancers/computed/index.js +165 -0
  107. package/dist/enhancers/computed/index.js.map +1 -0
  108. package/dist/enhancers/computed/types/packages/core/src/enhancers/batching/index.d.ts +2 -0
  109. package/dist/enhancers/computed/types/packages/core/src/enhancers/batching/index.d.ts.map +1 -0
  110. package/dist/enhancers/computed/types/packages/core/src/enhancers/batching/jest.config.d.ts +16 -0
  111. package/dist/enhancers/computed/types/packages/core/src/enhancers/batching/jest.config.d.ts.map +1 -0
  112. package/dist/enhancers/computed/types/packages/core/src/enhancers/batching/lib/batching.d.ts +262 -0
  113. package/dist/enhancers/computed/types/packages/core/src/enhancers/batching/lib/batching.d.ts.map +1 -0
  114. package/dist/enhancers/computed/types/packages/core/src/enhancers/batching/test-setup.d.ts +2 -0
  115. package/dist/enhancers/computed/types/packages/core/src/enhancers/batching/test-setup.d.ts.map +1 -0
  116. package/dist/enhancers/computed/types/packages/core/src/enhancers/computed/index.d.ts +2 -0
  117. package/dist/enhancers/computed/types/packages/core/src/enhancers/computed/index.d.ts.map +1 -0
  118. package/dist/enhancers/computed/types/packages/core/src/enhancers/computed/jest.config.d.ts +16 -0
  119. package/dist/enhancers/computed/types/packages/core/src/enhancers/computed/jest.config.d.ts.map +1 -0
  120. package/dist/enhancers/computed/types/packages/core/src/enhancers/computed/lib/computed.d.ts +68 -0
  121. package/dist/enhancers/computed/types/packages/core/src/enhancers/computed/lib/computed.d.ts.map +1 -0
  122. package/dist/enhancers/computed/types/packages/core/src/enhancers/devtools/index.d.ts +2 -0
  123. package/dist/enhancers/computed/types/packages/core/src/enhancers/devtools/index.d.ts.map +1 -0
  124. package/dist/enhancers/computed/types/packages/core/src/enhancers/devtools/jest.config.d.ts +16 -0
  125. package/dist/enhancers/computed/types/packages/core/src/enhancers/devtools/jest.config.d.ts.map +1 -0
  126. package/dist/enhancers/computed/types/packages/core/src/enhancers/devtools/lib/devtools.d.ts +129 -0
  127. package/dist/enhancers/computed/types/packages/core/src/enhancers/devtools/lib/devtools.d.ts.map +1 -0
  128. package/dist/enhancers/computed/types/packages/core/src/enhancers/devtools/test-setup.d.ts +2 -0
  129. package/dist/enhancers/computed/types/packages/core/src/enhancers/devtools/test-setup.d.ts.map +1 -0
  130. package/dist/enhancers/computed/types/packages/core/src/enhancers/entities/index.d.ts +2 -0
  131. package/dist/enhancers/computed/types/packages/core/src/enhancers/entities/index.d.ts.map +1 -0
  132. package/dist/enhancers/computed/types/packages/core/src/enhancers/entities/jest.config.d.ts +16 -0
  133. package/dist/enhancers/computed/types/packages/core/src/enhancers/entities/jest.config.d.ts.map +1 -0
  134. package/dist/enhancers/computed/types/packages/core/src/enhancers/entities/lib/entities.d.ts +39 -0
  135. package/dist/enhancers/computed/types/packages/core/src/enhancers/entities/lib/entities.d.ts.map +1 -0
  136. package/dist/enhancers/computed/types/packages/core/src/enhancers/entities/test-setup.d.ts +2 -0
  137. package/dist/enhancers/computed/types/packages/core/src/enhancers/entities/test-setup.d.ts.map +1 -0
  138. package/dist/enhancers/computed/types/packages/core/src/enhancers/index.d.ts +38 -0
  139. package/dist/enhancers/computed/types/packages/core/src/enhancers/index.d.ts.map +1 -0
  140. package/dist/enhancers/computed/types/packages/core/src/enhancers/memoization/index.d.ts +2 -0
  141. package/dist/enhancers/computed/types/packages/core/src/enhancers/memoization/index.d.ts.map +1 -0
  142. package/dist/enhancers/computed/types/packages/core/src/enhancers/memoization/jest.config.d.ts +16 -0
  143. package/dist/enhancers/computed/types/packages/core/src/enhancers/memoization/jest.config.d.ts.map +1 -0
  144. package/dist/enhancers/computed/types/packages/core/src/enhancers/memoization/lib/memoization.d.ts +190 -0
  145. package/dist/enhancers/computed/types/packages/core/src/enhancers/memoization/lib/memoization.d.ts.map +1 -0
  146. package/dist/enhancers/computed/types/packages/core/src/enhancers/memoization/test-setup.d.ts +2 -0
  147. package/dist/enhancers/computed/types/packages/core/src/enhancers/memoization/test-setup.d.ts.map +1 -0
  148. package/dist/enhancers/computed/types/packages/core/src/enhancers/middleware/index.d.ts +3 -0
  149. package/dist/enhancers/computed/types/packages/core/src/enhancers/middleware/index.d.ts.map +1 -0
  150. package/dist/enhancers/computed/types/packages/core/src/enhancers/middleware/jest.config.d.ts +16 -0
  151. package/dist/enhancers/computed/types/packages/core/src/enhancers/middleware/jest.config.d.ts.map +1 -0
  152. package/dist/enhancers/computed/types/packages/core/src/enhancers/middleware/lib/async-helpers.d.ts +16 -0
  153. package/dist/enhancers/computed/types/packages/core/src/enhancers/middleware/lib/async-helpers.d.ts.map +1 -0
  154. package/dist/enhancers/computed/types/packages/core/src/enhancers/middleware/lib/middleware.d.ts +43 -0
  155. package/dist/enhancers/computed/types/packages/core/src/enhancers/middleware/lib/middleware.d.ts.map +1 -0
  156. package/dist/enhancers/computed/types/packages/core/src/enhancers/middleware/test-setup.d.ts +2 -0
  157. package/dist/enhancers/computed/types/packages/core/src/enhancers/middleware/test-setup.d.ts.map +1 -0
  158. package/dist/enhancers/computed/types/packages/core/src/enhancers/presets/index.d.ts +2 -0
  159. package/dist/enhancers/computed/types/packages/core/src/enhancers/presets/index.d.ts.map +1 -0
  160. package/dist/enhancers/computed/types/packages/core/src/enhancers/presets/jest.config.d.ts +16 -0
  161. package/dist/enhancers/computed/types/packages/core/src/enhancers/presets/jest.config.d.ts.map +1 -0
  162. package/dist/enhancers/computed/types/packages/core/src/enhancers/presets/lib/presets.d.ts +69 -0
  163. package/dist/enhancers/computed/types/packages/core/src/enhancers/presets/lib/presets.d.ts.map +1 -0
  164. package/dist/enhancers/computed/types/packages/core/src/enhancers/presets/test-setup.d.ts +2 -0
  165. package/dist/enhancers/computed/types/packages/core/src/enhancers/presets/test-setup.d.ts.map +1 -0
  166. package/dist/enhancers/computed/types/packages/core/src/enhancers/serialization/constants.d.ts +19 -0
  167. package/dist/enhancers/computed/types/packages/core/src/enhancers/serialization/constants.d.ts.map +1 -0
  168. package/dist/enhancers/computed/types/packages/core/src/enhancers/serialization/index.d.ts +3 -0
  169. package/dist/enhancers/computed/types/packages/core/src/enhancers/serialization/index.d.ts.map +1 -0
  170. package/dist/enhancers/computed/types/packages/core/src/enhancers/serialization/jest.config.d.ts +16 -0
  171. package/dist/enhancers/computed/types/packages/core/src/enhancers/serialization/jest.config.d.ts.map +1 -0
  172. package/dist/enhancers/computed/types/packages/core/src/enhancers/serialization/lib/serialization.d.ts +186 -0
  173. package/dist/enhancers/computed/types/packages/core/src/enhancers/serialization/lib/serialization.d.ts.map +1 -0
  174. package/dist/enhancers/computed/types/packages/core/src/enhancers/serialization/test-setup.d.ts +2 -0
  175. package/dist/enhancers/computed/types/packages/core/src/enhancers/serialization/test-setup.d.ts.map +1 -0
  176. package/dist/enhancers/computed/types/packages/core/src/enhancers/time-travel/index.d.ts +2 -0
  177. package/dist/enhancers/computed/types/packages/core/src/enhancers/time-travel/index.d.ts.map +1 -0
  178. package/dist/enhancers/computed/types/packages/core/src/enhancers/time-travel/jest.config.d.ts +16 -0
  179. package/dist/enhancers/computed/types/packages/core/src/enhancers/time-travel/jest.config.d.ts.map +1 -0
  180. package/dist/enhancers/computed/types/packages/core/src/enhancers/time-travel/lib/time-travel.d.ts +145 -0
  181. package/dist/enhancers/computed/types/packages/core/src/enhancers/time-travel/lib/time-travel.d.ts.map +1 -0
  182. package/dist/enhancers/computed/types/packages/core/src/enhancers/time-travel/lib/utils.d.ts +3 -0
  183. package/dist/enhancers/computed/types/packages/core/src/enhancers/time-travel/lib/utils.d.ts.map +1 -0
  184. package/dist/enhancers/computed/types/packages/core/src/enhancers/time-travel/test-setup.d.ts +2 -0
  185. package/dist/enhancers/computed/types/packages/core/src/enhancers/time-travel/test-setup.d.ts.map +1 -0
  186. package/dist/enhancers/computed/types/packages/core/src/enhancers/types.d.ts +112 -0
  187. package/dist/enhancers/computed/types/packages/core/src/enhancers/types.d.ts.map +1 -0
  188. package/dist/enhancers/computed/types/packages/core/src/index.d.ts +119 -0
  189. package/dist/enhancers/computed/types/packages/core/src/index.d.ts.map +1 -0
  190. package/dist/enhancers/computed/types/packages/core/src/lib/constants.d.ts +50 -0
  191. package/dist/enhancers/computed/types/packages/core/src/lib/constants.d.ts.map +1 -0
  192. package/dist/enhancers/computed/types/packages/core/src/lib/memory/memory-manager.d.ts +145 -0
  193. package/dist/enhancers/computed/types/packages/core/src/lib/memory/memory-manager.d.ts.map +1 -0
  194. package/dist/enhancers/computed/types/packages/core/src/lib/performance/diff-engine.d.ts +109 -0
  195. package/dist/enhancers/computed/types/packages/core/src/lib/performance/diff-engine.d.ts.map +1 -0
  196. package/dist/enhancers/computed/types/packages/core/src/lib/performance/path-index.d.ts +120 -0
  197. package/dist/enhancers/computed/types/packages/core/src/lib/performance/path-index.d.ts.map +1 -0
  198. package/dist/enhancers/computed/types/packages/core/src/lib/performance/update-engine.d.ts +116 -0
  199. package/dist/enhancers/computed/types/packages/core/src/lib/performance/update-engine.d.ts.map +1 -0
  200. package/dist/enhancers/computed/types/packages/core/src/lib/security/security-validator.d.ts +145 -0
  201. package/dist/enhancers/computed/types/packages/core/src/lib/security/security-validator.d.ts.map +1 -0
  202. package/dist/enhancers/computed/types/packages/core/src/lib/signal-tree.d.ts +17 -0
  203. package/dist/enhancers/computed/types/packages/core/src/lib/signal-tree.d.ts.map +1 -0
  204. package/dist/enhancers/computed/types/packages/core/src/lib/types.d.ts +299 -0
  205. package/dist/enhancers/computed/types/packages/core/src/lib/types.d.ts.map +1 -0
  206. package/dist/enhancers/computed/types/packages/core/src/lib/utils.d.ts +53 -0
  207. package/dist/enhancers/computed/types/packages/core/src/lib/utils.d.ts.map +1 -0
  208. package/dist/enhancers/devtools/index.d.ts +363 -0
  209. package/dist/enhancers/devtools/index.js +319 -0
  210. package/dist/enhancers/devtools/index.js.map +1 -0
  211. package/dist/enhancers/devtools/types/packages/core/src/enhancers/batching/index.d.ts +2 -0
  212. package/dist/enhancers/devtools/types/packages/core/src/enhancers/batching/index.d.ts.map +1 -0
  213. package/dist/enhancers/devtools/types/packages/core/src/enhancers/batching/jest.config.d.ts +16 -0
  214. package/dist/enhancers/devtools/types/packages/core/src/enhancers/batching/jest.config.d.ts.map +1 -0
  215. package/dist/enhancers/devtools/types/packages/core/src/enhancers/batching/lib/batching.d.ts +262 -0
  216. package/dist/enhancers/devtools/types/packages/core/src/enhancers/batching/lib/batching.d.ts.map +1 -0
  217. package/dist/enhancers/devtools/types/packages/core/src/enhancers/batching/test-setup.d.ts +2 -0
  218. package/dist/enhancers/devtools/types/packages/core/src/enhancers/batching/test-setup.d.ts.map +1 -0
  219. package/dist/enhancers/devtools/types/packages/core/src/enhancers/computed/index.d.ts +2 -0
  220. package/dist/enhancers/devtools/types/packages/core/src/enhancers/computed/index.d.ts.map +1 -0
  221. package/dist/enhancers/devtools/types/packages/core/src/enhancers/computed/jest.config.d.ts +16 -0
  222. package/dist/enhancers/devtools/types/packages/core/src/enhancers/computed/jest.config.d.ts.map +1 -0
  223. package/dist/enhancers/devtools/types/packages/core/src/enhancers/computed/lib/computed.d.ts +68 -0
  224. package/dist/enhancers/devtools/types/packages/core/src/enhancers/computed/lib/computed.d.ts.map +1 -0
  225. package/dist/enhancers/devtools/types/packages/core/src/enhancers/devtools/index.d.ts +2 -0
  226. package/dist/enhancers/devtools/types/packages/core/src/enhancers/devtools/index.d.ts.map +1 -0
  227. package/dist/enhancers/devtools/types/packages/core/src/enhancers/devtools/jest.config.d.ts +16 -0
  228. package/dist/enhancers/devtools/types/packages/core/src/enhancers/devtools/jest.config.d.ts.map +1 -0
  229. package/dist/enhancers/devtools/types/packages/core/src/enhancers/devtools/lib/devtools.d.ts +129 -0
  230. package/dist/enhancers/devtools/types/packages/core/src/enhancers/devtools/lib/devtools.d.ts.map +1 -0
  231. package/dist/enhancers/devtools/types/packages/core/src/enhancers/devtools/test-setup.d.ts +2 -0
  232. package/dist/enhancers/devtools/types/packages/core/src/enhancers/devtools/test-setup.d.ts.map +1 -0
  233. package/dist/enhancers/devtools/types/packages/core/src/enhancers/entities/index.d.ts +2 -0
  234. package/dist/enhancers/devtools/types/packages/core/src/enhancers/entities/index.d.ts.map +1 -0
  235. package/dist/enhancers/devtools/types/packages/core/src/enhancers/entities/jest.config.d.ts +16 -0
  236. package/dist/enhancers/devtools/types/packages/core/src/enhancers/entities/jest.config.d.ts.map +1 -0
  237. package/dist/enhancers/devtools/types/packages/core/src/enhancers/entities/lib/entities.d.ts +39 -0
  238. package/dist/enhancers/devtools/types/packages/core/src/enhancers/entities/lib/entities.d.ts.map +1 -0
  239. package/dist/enhancers/devtools/types/packages/core/src/enhancers/entities/test-setup.d.ts +2 -0
  240. package/dist/enhancers/devtools/types/packages/core/src/enhancers/entities/test-setup.d.ts.map +1 -0
  241. package/dist/enhancers/devtools/types/packages/core/src/enhancers/index.d.ts +38 -0
  242. package/dist/enhancers/devtools/types/packages/core/src/enhancers/index.d.ts.map +1 -0
  243. package/dist/enhancers/devtools/types/packages/core/src/enhancers/memoization/index.d.ts +2 -0
  244. package/dist/enhancers/devtools/types/packages/core/src/enhancers/memoization/index.d.ts.map +1 -0
  245. package/dist/enhancers/devtools/types/packages/core/src/enhancers/memoization/jest.config.d.ts +16 -0
  246. package/dist/enhancers/devtools/types/packages/core/src/enhancers/memoization/jest.config.d.ts.map +1 -0
  247. package/dist/enhancers/devtools/types/packages/core/src/enhancers/memoization/lib/memoization.d.ts +190 -0
  248. package/dist/enhancers/devtools/types/packages/core/src/enhancers/memoization/lib/memoization.d.ts.map +1 -0
  249. package/dist/enhancers/devtools/types/packages/core/src/enhancers/memoization/test-setup.d.ts +2 -0
  250. package/dist/enhancers/devtools/types/packages/core/src/enhancers/memoization/test-setup.d.ts.map +1 -0
  251. package/dist/enhancers/devtools/types/packages/core/src/enhancers/middleware/index.d.ts +3 -0
  252. package/dist/enhancers/devtools/types/packages/core/src/enhancers/middleware/index.d.ts.map +1 -0
  253. package/dist/enhancers/devtools/types/packages/core/src/enhancers/middleware/jest.config.d.ts +16 -0
  254. package/dist/enhancers/devtools/types/packages/core/src/enhancers/middleware/jest.config.d.ts.map +1 -0
  255. package/dist/enhancers/devtools/types/packages/core/src/enhancers/middleware/lib/async-helpers.d.ts +16 -0
  256. package/dist/enhancers/devtools/types/packages/core/src/enhancers/middleware/lib/async-helpers.d.ts.map +1 -0
  257. package/dist/enhancers/devtools/types/packages/core/src/enhancers/middleware/lib/middleware.d.ts +43 -0
  258. package/dist/enhancers/devtools/types/packages/core/src/enhancers/middleware/lib/middleware.d.ts.map +1 -0
  259. package/dist/enhancers/devtools/types/packages/core/src/enhancers/middleware/test-setup.d.ts +2 -0
  260. package/dist/enhancers/devtools/types/packages/core/src/enhancers/middleware/test-setup.d.ts.map +1 -0
  261. package/dist/enhancers/devtools/types/packages/core/src/enhancers/presets/index.d.ts +2 -0
  262. package/dist/enhancers/devtools/types/packages/core/src/enhancers/presets/index.d.ts.map +1 -0
  263. package/dist/enhancers/devtools/types/packages/core/src/enhancers/presets/jest.config.d.ts +16 -0
  264. package/dist/enhancers/devtools/types/packages/core/src/enhancers/presets/jest.config.d.ts.map +1 -0
  265. package/dist/enhancers/devtools/types/packages/core/src/enhancers/presets/lib/presets.d.ts +69 -0
  266. package/dist/enhancers/devtools/types/packages/core/src/enhancers/presets/lib/presets.d.ts.map +1 -0
  267. package/dist/enhancers/devtools/types/packages/core/src/enhancers/presets/test-setup.d.ts +2 -0
  268. package/dist/enhancers/devtools/types/packages/core/src/enhancers/presets/test-setup.d.ts.map +1 -0
  269. package/dist/enhancers/devtools/types/packages/core/src/enhancers/serialization/constants.d.ts +19 -0
  270. package/dist/enhancers/devtools/types/packages/core/src/enhancers/serialization/constants.d.ts.map +1 -0
  271. package/dist/enhancers/devtools/types/packages/core/src/enhancers/serialization/index.d.ts +3 -0
  272. package/dist/enhancers/devtools/types/packages/core/src/enhancers/serialization/index.d.ts.map +1 -0
  273. package/dist/enhancers/devtools/types/packages/core/src/enhancers/serialization/jest.config.d.ts +16 -0
  274. package/dist/enhancers/devtools/types/packages/core/src/enhancers/serialization/jest.config.d.ts.map +1 -0
  275. package/dist/enhancers/devtools/types/packages/core/src/enhancers/serialization/lib/serialization.d.ts +186 -0
  276. package/dist/enhancers/devtools/types/packages/core/src/enhancers/serialization/lib/serialization.d.ts.map +1 -0
  277. package/dist/enhancers/devtools/types/packages/core/src/enhancers/serialization/test-setup.d.ts +2 -0
  278. package/dist/enhancers/devtools/types/packages/core/src/enhancers/serialization/test-setup.d.ts.map +1 -0
  279. package/dist/enhancers/devtools/types/packages/core/src/enhancers/time-travel/index.d.ts +2 -0
  280. package/dist/enhancers/devtools/types/packages/core/src/enhancers/time-travel/index.d.ts.map +1 -0
  281. package/dist/enhancers/devtools/types/packages/core/src/enhancers/time-travel/jest.config.d.ts +16 -0
  282. package/dist/enhancers/devtools/types/packages/core/src/enhancers/time-travel/jest.config.d.ts.map +1 -0
  283. package/dist/enhancers/devtools/types/packages/core/src/enhancers/time-travel/lib/time-travel.d.ts +145 -0
  284. package/dist/enhancers/devtools/types/packages/core/src/enhancers/time-travel/lib/time-travel.d.ts.map +1 -0
  285. package/dist/enhancers/devtools/types/packages/core/src/enhancers/time-travel/lib/utils.d.ts +3 -0
  286. package/dist/enhancers/devtools/types/packages/core/src/enhancers/time-travel/lib/utils.d.ts.map +1 -0
  287. package/dist/enhancers/devtools/types/packages/core/src/enhancers/time-travel/test-setup.d.ts +2 -0
  288. package/dist/enhancers/devtools/types/packages/core/src/enhancers/time-travel/test-setup.d.ts.map +1 -0
  289. package/dist/enhancers/devtools/types/packages/core/src/enhancers/types.d.ts +112 -0
  290. package/dist/enhancers/devtools/types/packages/core/src/enhancers/types.d.ts.map +1 -0
  291. package/dist/enhancers/devtools/types/packages/core/src/index.d.ts +119 -0
  292. package/dist/enhancers/devtools/types/packages/core/src/index.d.ts.map +1 -0
  293. package/dist/enhancers/devtools/types/packages/core/src/lib/constants.d.ts +50 -0
  294. package/dist/enhancers/devtools/types/packages/core/src/lib/constants.d.ts.map +1 -0
  295. package/dist/enhancers/devtools/types/packages/core/src/lib/memory/memory-manager.d.ts +145 -0
  296. package/dist/enhancers/devtools/types/packages/core/src/lib/memory/memory-manager.d.ts.map +1 -0
  297. package/dist/enhancers/devtools/types/packages/core/src/lib/performance/diff-engine.d.ts +109 -0
  298. package/dist/enhancers/devtools/types/packages/core/src/lib/performance/diff-engine.d.ts.map +1 -0
  299. package/dist/enhancers/devtools/types/packages/core/src/lib/performance/path-index.d.ts +120 -0
  300. package/dist/enhancers/devtools/types/packages/core/src/lib/performance/path-index.d.ts.map +1 -0
  301. package/dist/enhancers/devtools/types/packages/core/src/lib/performance/update-engine.d.ts +116 -0
  302. package/dist/enhancers/devtools/types/packages/core/src/lib/performance/update-engine.d.ts.map +1 -0
  303. package/dist/enhancers/devtools/types/packages/core/src/lib/security/security-validator.d.ts +145 -0
  304. package/dist/enhancers/devtools/types/packages/core/src/lib/security/security-validator.d.ts.map +1 -0
  305. package/dist/enhancers/devtools/types/packages/core/src/lib/signal-tree.d.ts +17 -0
  306. package/dist/enhancers/devtools/types/packages/core/src/lib/signal-tree.d.ts.map +1 -0
  307. package/dist/enhancers/devtools/types/packages/core/src/lib/types.d.ts +299 -0
  308. package/dist/enhancers/devtools/types/packages/core/src/lib/types.d.ts.map +1 -0
  309. package/dist/enhancers/devtools/types/packages/core/src/lib/utils.d.ts +53 -0
  310. package/dist/enhancers/devtools/types/packages/core/src/lib/utils.d.ts.map +1 -0
  311. package/dist/enhancers/entities/index.d.ts +272 -0
  312. package/dist/enhancers/entities/index.js +164 -0
  313. package/dist/enhancers/entities/index.js.map +1 -0
  314. package/dist/enhancers/entities/types/packages/core/src/enhancers/batching/index.d.ts +2 -0
  315. package/dist/enhancers/entities/types/packages/core/src/enhancers/batching/index.d.ts.map +1 -0
  316. package/dist/enhancers/entities/types/packages/core/src/enhancers/batching/jest.config.d.ts +16 -0
  317. package/dist/enhancers/entities/types/packages/core/src/enhancers/batching/jest.config.d.ts.map +1 -0
  318. package/dist/enhancers/entities/types/packages/core/src/enhancers/batching/lib/batching.d.ts +262 -0
  319. package/dist/enhancers/entities/types/packages/core/src/enhancers/batching/lib/batching.d.ts.map +1 -0
  320. package/dist/enhancers/entities/types/packages/core/src/enhancers/batching/test-setup.d.ts +2 -0
  321. package/dist/enhancers/entities/types/packages/core/src/enhancers/batching/test-setup.d.ts.map +1 -0
  322. package/dist/enhancers/entities/types/packages/core/src/enhancers/computed/index.d.ts +2 -0
  323. package/dist/enhancers/entities/types/packages/core/src/enhancers/computed/index.d.ts.map +1 -0
  324. package/dist/enhancers/entities/types/packages/core/src/enhancers/computed/jest.config.d.ts +16 -0
  325. package/dist/enhancers/entities/types/packages/core/src/enhancers/computed/jest.config.d.ts.map +1 -0
  326. package/dist/enhancers/entities/types/packages/core/src/enhancers/computed/lib/computed.d.ts +68 -0
  327. package/dist/enhancers/entities/types/packages/core/src/enhancers/computed/lib/computed.d.ts.map +1 -0
  328. package/dist/enhancers/entities/types/packages/core/src/enhancers/devtools/index.d.ts +2 -0
  329. package/dist/enhancers/entities/types/packages/core/src/enhancers/devtools/index.d.ts.map +1 -0
  330. package/dist/enhancers/entities/types/packages/core/src/enhancers/devtools/jest.config.d.ts +16 -0
  331. package/dist/enhancers/entities/types/packages/core/src/enhancers/devtools/jest.config.d.ts.map +1 -0
  332. package/dist/enhancers/entities/types/packages/core/src/enhancers/devtools/lib/devtools.d.ts +129 -0
  333. package/dist/enhancers/entities/types/packages/core/src/enhancers/devtools/lib/devtools.d.ts.map +1 -0
  334. package/dist/enhancers/entities/types/packages/core/src/enhancers/devtools/test-setup.d.ts +2 -0
  335. package/dist/enhancers/entities/types/packages/core/src/enhancers/devtools/test-setup.d.ts.map +1 -0
  336. package/dist/enhancers/entities/types/packages/core/src/enhancers/entities/index.d.ts +2 -0
  337. package/dist/enhancers/entities/types/packages/core/src/enhancers/entities/index.d.ts.map +1 -0
  338. package/dist/enhancers/entities/types/packages/core/src/enhancers/entities/jest.config.d.ts +16 -0
  339. package/dist/enhancers/entities/types/packages/core/src/enhancers/entities/jest.config.d.ts.map +1 -0
  340. package/dist/enhancers/entities/types/packages/core/src/enhancers/entities/lib/entities.d.ts +39 -0
  341. package/dist/enhancers/entities/types/packages/core/src/enhancers/entities/lib/entities.d.ts.map +1 -0
  342. package/dist/enhancers/entities/types/packages/core/src/enhancers/entities/test-setup.d.ts +2 -0
  343. package/dist/enhancers/entities/types/packages/core/src/enhancers/entities/test-setup.d.ts.map +1 -0
  344. package/dist/enhancers/entities/types/packages/core/src/enhancers/index.d.ts +38 -0
  345. package/dist/enhancers/entities/types/packages/core/src/enhancers/index.d.ts.map +1 -0
  346. package/dist/enhancers/entities/types/packages/core/src/enhancers/memoization/index.d.ts +2 -0
  347. package/dist/enhancers/entities/types/packages/core/src/enhancers/memoization/index.d.ts.map +1 -0
  348. package/dist/enhancers/entities/types/packages/core/src/enhancers/memoization/jest.config.d.ts +16 -0
  349. package/dist/enhancers/entities/types/packages/core/src/enhancers/memoization/jest.config.d.ts.map +1 -0
  350. package/dist/enhancers/entities/types/packages/core/src/enhancers/memoization/lib/memoization.d.ts +190 -0
  351. package/dist/enhancers/entities/types/packages/core/src/enhancers/memoization/lib/memoization.d.ts.map +1 -0
  352. package/dist/enhancers/entities/types/packages/core/src/enhancers/memoization/test-setup.d.ts +2 -0
  353. package/dist/enhancers/entities/types/packages/core/src/enhancers/memoization/test-setup.d.ts.map +1 -0
  354. package/dist/enhancers/entities/types/packages/core/src/enhancers/middleware/index.d.ts +3 -0
  355. package/dist/enhancers/entities/types/packages/core/src/enhancers/middleware/index.d.ts.map +1 -0
  356. package/dist/enhancers/entities/types/packages/core/src/enhancers/middleware/jest.config.d.ts +16 -0
  357. package/dist/enhancers/entities/types/packages/core/src/enhancers/middleware/jest.config.d.ts.map +1 -0
  358. package/dist/enhancers/entities/types/packages/core/src/enhancers/middleware/lib/async-helpers.d.ts +16 -0
  359. package/dist/enhancers/entities/types/packages/core/src/enhancers/middleware/lib/async-helpers.d.ts.map +1 -0
  360. package/dist/enhancers/entities/types/packages/core/src/enhancers/middleware/lib/middleware.d.ts +43 -0
  361. package/dist/enhancers/entities/types/packages/core/src/enhancers/middleware/lib/middleware.d.ts.map +1 -0
  362. package/dist/enhancers/entities/types/packages/core/src/enhancers/middleware/test-setup.d.ts +2 -0
  363. package/dist/enhancers/entities/types/packages/core/src/enhancers/middleware/test-setup.d.ts.map +1 -0
  364. package/dist/enhancers/entities/types/packages/core/src/enhancers/presets/index.d.ts +2 -0
  365. package/dist/enhancers/entities/types/packages/core/src/enhancers/presets/index.d.ts.map +1 -0
  366. package/dist/enhancers/entities/types/packages/core/src/enhancers/presets/jest.config.d.ts +16 -0
  367. package/dist/enhancers/entities/types/packages/core/src/enhancers/presets/jest.config.d.ts.map +1 -0
  368. package/dist/enhancers/entities/types/packages/core/src/enhancers/presets/lib/presets.d.ts +69 -0
  369. package/dist/enhancers/entities/types/packages/core/src/enhancers/presets/lib/presets.d.ts.map +1 -0
  370. package/dist/enhancers/entities/types/packages/core/src/enhancers/presets/test-setup.d.ts +2 -0
  371. package/dist/enhancers/entities/types/packages/core/src/enhancers/presets/test-setup.d.ts.map +1 -0
  372. package/dist/enhancers/entities/types/packages/core/src/enhancers/serialization/constants.d.ts +19 -0
  373. package/dist/enhancers/entities/types/packages/core/src/enhancers/serialization/constants.d.ts.map +1 -0
  374. package/dist/enhancers/entities/types/packages/core/src/enhancers/serialization/index.d.ts +3 -0
  375. package/dist/enhancers/entities/types/packages/core/src/enhancers/serialization/index.d.ts.map +1 -0
  376. package/dist/enhancers/entities/types/packages/core/src/enhancers/serialization/jest.config.d.ts +16 -0
  377. package/dist/enhancers/entities/types/packages/core/src/enhancers/serialization/jest.config.d.ts.map +1 -0
  378. package/dist/enhancers/entities/types/packages/core/src/enhancers/serialization/lib/serialization.d.ts +186 -0
  379. package/dist/enhancers/entities/types/packages/core/src/enhancers/serialization/lib/serialization.d.ts.map +1 -0
  380. package/dist/enhancers/entities/types/packages/core/src/enhancers/serialization/test-setup.d.ts +2 -0
  381. package/dist/enhancers/entities/types/packages/core/src/enhancers/serialization/test-setup.d.ts.map +1 -0
  382. package/dist/enhancers/entities/types/packages/core/src/enhancers/time-travel/index.d.ts +2 -0
  383. package/dist/enhancers/entities/types/packages/core/src/enhancers/time-travel/index.d.ts.map +1 -0
  384. package/dist/enhancers/entities/types/packages/core/src/enhancers/time-travel/jest.config.d.ts +16 -0
  385. package/dist/enhancers/entities/types/packages/core/src/enhancers/time-travel/jest.config.d.ts.map +1 -0
  386. package/dist/enhancers/entities/types/packages/core/src/enhancers/time-travel/lib/time-travel.d.ts +145 -0
  387. package/dist/enhancers/entities/types/packages/core/src/enhancers/time-travel/lib/time-travel.d.ts.map +1 -0
  388. package/dist/enhancers/entities/types/packages/core/src/enhancers/time-travel/lib/utils.d.ts +3 -0
  389. package/dist/enhancers/entities/types/packages/core/src/enhancers/time-travel/lib/utils.d.ts.map +1 -0
  390. package/dist/enhancers/entities/types/packages/core/src/enhancers/time-travel/test-setup.d.ts +2 -0
  391. package/dist/enhancers/entities/types/packages/core/src/enhancers/time-travel/test-setup.d.ts.map +1 -0
  392. package/dist/enhancers/entities/types/packages/core/src/enhancers/types.d.ts +112 -0
  393. package/dist/enhancers/entities/types/packages/core/src/enhancers/types.d.ts.map +1 -0
  394. package/dist/enhancers/entities/types/packages/core/src/index.d.ts +119 -0
  395. package/dist/enhancers/entities/types/packages/core/src/index.d.ts.map +1 -0
  396. package/dist/enhancers/entities/types/packages/core/src/lib/constants.d.ts +50 -0
  397. package/dist/enhancers/entities/types/packages/core/src/lib/constants.d.ts.map +1 -0
  398. package/dist/enhancers/entities/types/packages/core/src/lib/memory/memory-manager.d.ts +145 -0
  399. package/dist/enhancers/entities/types/packages/core/src/lib/memory/memory-manager.d.ts.map +1 -0
  400. package/dist/enhancers/entities/types/packages/core/src/lib/performance/diff-engine.d.ts +109 -0
  401. package/dist/enhancers/entities/types/packages/core/src/lib/performance/diff-engine.d.ts.map +1 -0
  402. package/dist/enhancers/entities/types/packages/core/src/lib/performance/path-index.d.ts +120 -0
  403. package/dist/enhancers/entities/types/packages/core/src/lib/performance/path-index.d.ts.map +1 -0
  404. package/dist/enhancers/entities/types/packages/core/src/lib/performance/update-engine.d.ts +116 -0
  405. package/dist/enhancers/entities/types/packages/core/src/lib/performance/update-engine.d.ts.map +1 -0
  406. package/dist/enhancers/entities/types/packages/core/src/lib/security/security-validator.d.ts +145 -0
  407. package/dist/enhancers/entities/types/packages/core/src/lib/security/security-validator.d.ts.map +1 -0
  408. package/dist/enhancers/entities/types/packages/core/src/lib/signal-tree.d.ts +17 -0
  409. package/dist/enhancers/entities/types/packages/core/src/lib/signal-tree.d.ts.map +1 -0
  410. package/dist/enhancers/entities/types/packages/core/src/lib/types.d.ts +299 -0
  411. package/dist/enhancers/entities/types/packages/core/src/lib/types.d.ts.map +1 -0
  412. package/dist/enhancers/entities/types/packages/core/src/lib/utils.d.ts +53 -0
  413. package/dist/enhancers/entities/types/packages/core/src/lib/utils.d.ts.map +1 -0
  414. package/dist/enhancers/index.d.ts +73 -0
  415. package/dist/enhancers/index.js +191 -0
  416. package/dist/enhancers/index.js.map +1 -0
  417. package/dist/enhancers/memoization/index.d.ts +425 -0
  418. package/dist/enhancers/memoization/index.js +570 -0
  419. package/dist/enhancers/memoization/index.js.map +1 -0
  420. package/dist/enhancers/memoization/types/packages/core/src/enhancers/batching/index.d.ts +2 -0
  421. package/dist/enhancers/memoization/types/packages/core/src/enhancers/batching/index.d.ts.map +1 -0
  422. package/dist/enhancers/memoization/types/packages/core/src/enhancers/batching/jest.config.d.ts +16 -0
  423. package/dist/enhancers/memoization/types/packages/core/src/enhancers/batching/jest.config.d.ts.map +1 -0
  424. package/dist/enhancers/memoization/types/packages/core/src/enhancers/batching/lib/batching.d.ts +262 -0
  425. package/dist/enhancers/memoization/types/packages/core/src/enhancers/batching/lib/batching.d.ts.map +1 -0
  426. package/dist/enhancers/memoization/types/packages/core/src/enhancers/batching/test-setup.d.ts +2 -0
  427. package/dist/enhancers/memoization/types/packages/core/src/enhancers/batching/test-setup.d.ts.map +1 -0
  428. package/dist/enhancers/memoization/types/packages/core/src/enhancers/computed/index.d.ts +2 -0
  429. package/dist/enhancers/memoization/types/packages/core/src/enhancers/computed/index.d.ts.map +1 -0
  430. package/dist/enhancers/memoization/types/packages/core/src/enhancers/computed/jest.config.d.ts +16 -0
  431. package/dist/enhancers/memoization/types/packages/core/src/enhancers/computed/jest.config.d.ts.map +1 -0
  432. package/dist/enhancers/memoization/types/packages/core/src/enhancers/computed/lib/computed.d.ts +68 -0
  433. package/dist/enhancers/memoization/types/packages/core/src/enhancers/computed/lib/computed.d.ts.map +1 -0
  434. package/dist/enhancers/memoization/types/packages/core/src/enhancers/devtools/index.d.ts +2 -0
  435. package/dist/enhancers/memoization/types/packages/core/src/enhancers/devtools/index.d.ts.map +1 -0
  436. package/dist/enhancers/memoization/types/packages/core/src/enhancers/devtools/jest.config.d.ts +16 -0
  437. package/dist/enhancers/memoization/types/packages/core/src/enhancers/devtools/jest.config.d.ts.map +1 -0
  438. package/dist/enhancers/memoization/types/packages/core/src/enhancers/devtools/lib/devtools.d.ts +129 -0
  439. package/dist/enhancers/memoization/types/packages/core/src/enhancers/devtools/lib/devtools.d.ts.map +1 -0
  440. package/dist/enhancers/memoization/types/packages/core/src/enhancers/devtools/test-setup.d.ts +2 -0
  441. package/dist/enhancers/memoization/types/packages/core/src/enhancers/devtools/test-setup.d.ts.map +1 -0
  442. package/dist/enhancers/memoization/types/packages/core/src/enhancers/entities/index.d.ts +2 -0
  443. package/dist/enhancers/memoization/types/packages/core/src/enhancers/entities/index.d.ts.map +1 -0
  444. package/dist/enhancers/memoization/types/packages/core/src/enhancers/entities/jest.config.d.ts +16 -0
  445. package/dist/enhancers/memoization/types/packages/core/src/enhancers/entities/jest.config.d.ts.map +1 -0
  446. package/dist/enhancers/memoization/types/packages/core/src/enhancers/entities/lib/entities.d.ts +39 -0
  447. package/dist/enhancers/memoization/types/packages/core/src/enhancers/entities/lib/entities.d.ts.map +1 -0
  448. package/dist/enhancers/memoization/types/packages/core/src/enhancers/entities/test-setup.d.ts +2 -0
  449. package/dist/enhancers/memoization/types/packages/core/src/enhancers/entities/test-setup.d.ts.map +1 -0
  450. package/dist/enhancers/memoization/types/packages/core/src/enhancers/index.d.ts +38 -0
  451. package/dist/enhancers/memoization/types/packages/core/src/enhancers/index.d.ts.map +1 -0
  452. package/dist/enhancers/memoization/types/packages/core/src/enhancers/memoization/index.d.ts +2 -0
  453. package/dist/enhancers/memoization/types/packages/core/src/enhancers/memoization/index.d.ts.map +1 -0
  454. package/dist/enhancers/memoization/types/packages/core/src/enhancers/memoization/jest.config.d.ts +16 -0
  455. package/dist/enhancers/memoization/types/packages/core/src/enhancers/memoization/jest.config.d.ts.map +1 -0
  456. package/dist/enhancers/memoization/types/packages/core/src/enhancers/memoization/lib/memoization.d.ts +190 -0
  457. package/dist/enhancers/memoization/types/packages/core/src/enhancers/memoization/lib/memoization.d.ts.map +1 -0
  458. package/dist/enhancers/memoization/types/packages/core/src/enhancers/memoization/test-setup.d.ts +2 -0
  459. package/dist/enhancers/memoization/types/packages/core/src/enhancers/memoization/test-setup.d.ts.map +1 -0
  460. package/dist/enhancers/memoization/types/packages/core/src/enhancers/middleware/index.d.ts +3 -0
  461. package/dist/enhancers/memoization/types/packages/core/src/enhancers/middleware/index.d.ts.map +1 -0
  462. package/dist/enhancers/memoization/types/packages/core/src/enhancers/middleware/jest.config.d.ts +16 -0
  463. package/dist/enhancers/memoization/types/packages/core/src/enhancers/middleware/jest.config.d.ts.map +1 -0
  464. package/dist/enhancers/memoization/types/packages/core/src/enhancers/middleware/lib/async-helpers.d.ts +16 -0
  465. package/dist/enhancers/memoization/types/packages/core/src/enhancers/middleware/lib/async-helpers.d.ts.map +1 -0
  466. package/dist/enhancers/memoization/types/packages/core/src/enhancers/middleware/lib/middleware.d.ts +43 -0
  467. package/dist/enhancers/memoization/types/packages/core/src/enhancers/middleware/lib/middleware.d.ts.map +1 -0
  468. package/dist/enhancers/memoization/types/packages/core/src/enhancers/middleware/test-setup.d.ts +2 -0
  469. package/dist/enhancers/memoization/types/packages/core/src/enhancers/middleware/test-setup.d.ts.map +1 -0
  470. package/dist/enhancers/memoization/types/packages/core/src/enhancers/presets/index.d.ts +2 -0
  471. package/dist/enhancers/memoization/types/packages/core/src/enhancers/presets/index.d.ts.map +1 -0
  472. package/dist/enhancers/memoization/types/packages/core/src/enhancers/presets/jest.config.d.ts +16 -0
  473. package/dist/enhancers/memoization/types/packages/core/src/enhancers/presets/jest.config.d.ts.map +1 -0
  474. package/dist/enhancers/memoization/types/packages/core/src/enhancers/presets/lib/presets.d.ts +69 -0
  475. package/dist/enhancers/memoization/types/packages/core/src/enhancers/presets/lib/presets.d.ts.map +1 -0
  476. package/dist/enhancers/memoization/types/packages/core/src/enhancers/presets/test-setup.d.ts +2 -0
  477. package/dist/enhancers/memoization/types/packages/core/src/enhancers/presets/test-setup.d.ts.map +1 -0
  478. package/dist/enhancers/memoization/types/packages/core/src/enhancers/serialization/constants.d.ts +19 -0
  479. package/dist/enhancers/memoization/types/packages/core/src/enhancers/serialization/constants.d.ts.map +1 -0
  480. package/dist/enhancers/memoization/types/packages/core/src/enhancers/serialization/index.d.ts +3 -0
  481. package/dist/enhancers/memoization/types/packages/core/src/enhancers/serialization/index.d.ts.map +1 -0
  482. package/dist/enhancers/memoization/types/packages/core/src/enhancers/serialization/jest.config.d.ts +16 -0
  483. package/dist/enhancers/memoization/types/packages/core/src/enhancers/serialization/jest.config.d.ts.map +1 -0
  484. package/dist/enhancers/memoization/types/packages/core/src/enhancers/serialization/lib/serialization.d.ts +186 -0
  485. package/dist/enhancers/memoization/types/packages/core/src/enhancers/serialization/lib/serialization.d.ts.map +1 -0
  486. package/dist/enhancers/memoization/types/packages/core/src/enhancers/serialization/test-setup.d.ts +2 -0
  487. package/dist/enhancers/memoization/types/packages/core/src/enhancers/serialization/test-setup.d.ts.map +1 -0
  488. package/dist/enhancers/memoization/types/packages/core/src/enhancers/time-travel/index.d.ts +2 -0
  489. package/dist/enhancers/memoization/types/packages/core/src/enhancers/time-travel/index.d.ts.map +1 -0
  490. package/dist/enhancers/memoization/types/packages/core/src/enhancers/time-travel/jest.config.d.ts +16 -0
  491. package/dist/enhancers/memoization/types/packages/core/src/enhancers/time-travel/jest.config.d.ts.map +1 -0
  492. package/dist/enhancers/memoization/types/packages/core/src/enhancers/time-travel/lib/time-travel.d.ts +145 -0
  493. package/dist/enhancers/memoization/types/packages/core/src/enhancers/time-travel/lib/time-travel.d.ts.map +1 -0
  494. package/dist/enhancers/memoization/types/packages/core/src/enhancers/time-travel/lib/utils.d.ts +3 -0
  495. package/dist/enhancers/memoization/types/packages/core/src/enhancers/time-travel/lib/utils.d.ts.map +1 -0
  496. package/dist/enhancers/memoization/types/packages/core/src/enhancers/time-travel/test-setup.d.ts +2 -0
  497. package/dist/enhancers/memoization/types/packages/core/src/enhancers/time-travel/test-setup.d.ts.map +1 -0
  498. package/dist/enhancers/memoization/types/packages/core/src/enhancers/types.d.ts +112 -0
  499. package/dist/enhancers/memoization/types/packages/core/src/enhancers/types.d.ts.map +1 -0
  500. package/dist/enhancers/memoization/types/packages/core/src/index.d.ts +119 -0
  501. package/dist/enhancers/memoization/types/packages/core/src/index.d.ts.map +1 -0
  502. package/dist/enhancers/memoization/types/packages/core/src/lib/constants.d.ts +50 -0
  503. package/dist/enhancers/memoization/types/packages/core/src/lib/constants.d.ts.map +1 -0
  504. package/dist/enhancers/memoization/types/packages/core/src/lib/memory/memory-manager.d.ts +145 -0
  505. package/dist/enhancers/memoization/types/packages/core/src/lib/memory/memory-manager.d.ts.map +1 -0
  506. package/dist/enhancers/memoization/types/packages/core/src/lib/performance/diff-engine.d.ts +109 -0
  507. package/dist/enhancers/memoization/types/packages/core/src/lib/performance/diff-engine.d.ts.map +1 -0
  508. package/dist/enhancers/memoization/types/packages/core/src/lib/performance/path-index.d.ts +120 -0
  509. package/dist/enhancers/memoization/types/packages/core/src/lib/performance/path-index.d.ts.map +1 -0
  510. package/dist/enhancers/memoization/types/packages/core/src/lib/performance/update-engine.d.ts +116 -0
  511. package/dist/enhancers/memoization/types/packages/core/src/lib/performance/update-engine.d.ts.map +1 -0
  512. package/dist/enhancers/memoization/types/packages/core/src/lib/security/security-validator.d.ts +145 -0
  513. package/dist/enhancers/memoization/types/packages/core/src/lib/security/security-validator.d.ts.map +1 -0
  514. package/dist/enhancers/memoization/types/packages/core/src/lib/signal-tree.d.ts +17 -0
  515. package/dist/enhancers/memoization/types/packages/core/src/lib/signal-tree.d.ts.map +1 -0
  516. package/dist/enhancers/memoization/types/packages/core/src/lib/types.d.ts +299 -0
  517. package/dist/enhancers/memoization/types/packages/core/src/lib/types.d.ts.map +1 -0
  518. package/dist/enhancers/memoization/types/packages/core/src/lib/utils.d.ts +53 -0
  519. package/dist/enhancers/memoization/types/packages/core/src/lib/utils.d.ts.map +1 -0
  520. package/dist/enhancers/middleware/index.d.ts +293 -0
  521. package/dist/enhancers/middleware/index.js +339 -0
  522. package/dist/enhancers/middleware/index.js.map +1 -0
  523. package/dist/enhancers/middleware/types/packages/core/src/enhancers/batching/index.d.ts +2 -0
  524. package/dist/enhancers/middleware/types/packages/core/src/enhancers/batching/index.d.ts.map +1 -0
  525. package/dist/enhancers/middleware/types/packages/core/src/enhancers/batching/jest.config.d.ts +16 -0
  526. package/dist/enhancers/middleware/types/packages/core/src/enhancers/batching/jest.config.d.ts.map +1 -0
  527. package/dist/enhancers/middleware/types/packages/core/src/enhancers/batching/lib/batching.d.ts +262 -0
  528. package/dist/enhancers/middleware/types/packages/core/src/enhancers/batching/lib/batching.d.ts.map +1 -0
  529. package/dist/enhancers/middleware/types/packages/core/src/enhancers/batching/test-setup.d.ts +2 -0
  530. package/dist/enhancers/middleware/types/packages/core/src/enhancers/batching/test-setup.d.ts.map +1 -0
  531. package/dist/enhancers/middleware/types/packages/core/src/enhancers/computed/index.d.ts +2 -0
  532. package/dist/enhancers/middleware/types/packages/core/src/enhancers/computed/index.d.ts.map +1 -0
  533. package/dist/enhancers/middleware/types/packages/core/src/enhancers/computed/jest.config.d.ts +16 -0
  534. package/dist/enhancers/middleware/types/packages/core/src/enhancers/computed/jest.config.d.ts.map +1 -0
  535. package/dist/enhancers/middleware/types/packages/core/src/enhancers/computed/lib/computed.d.ts +68 -0
  536. package/dist/enhancers/middleware/types/packages/core/src/enhancers/computed/lib/computed.d.ts.map +1 -0
  537. package/dist/enhancers/middleware/types/packages/core/src/enhancers/devtools/index.d.ts +2 -0
  538. package/dist/enhancers/middleware/types/packages/core/src/enhancers/devtools/index.d.ts.map +1 -0
  539. package/dist/enhancers/middleware/types/packages/core/src/enhancers/devtools/jest.config.d.ts +16 -0
  540. package/dist/enhancers/middleware/types/packages/core/src/enhancers/devtools/jest.config.d.ts.map +1 -0
  541. package/dist/enhancers/middleware/types/packages/core/src/enhancers/devtools/lib/devtools.d.ts +129 -0
  542. package/dist/enhancers/middleware/types/packages/core/src/enhancers/devtools/lib/devtools.d.ts.map +1 -0
  543. package/dist/enhancers/middleware/types/packages/core/src/enhancers/devtools/test-setup.d.ts +2 -0
  544. package/dist/enhancers/middleware/types/packages/core/src/enhancers/devtools/test-setup.d.ts.map +1 -0
  545. package/dist/enhancers/middleware/types/packages/core/src/enhancers/entities/index.d.ts +2 -0
  546. package/dist/enhancers/middleware/types/packages/core/src/enhancers/entities/index.d.ts.map +1 -0
  547. package/dist/enhancers/middleware/types/packages/core/src/enhancers/entities/jest.config.d.ts +16 -0
  548. package/dist/enhancers/middleware/types/packages/core/src/enhancers/entities/jest.config.d.ts.map +1 -0
  549. package/dist/enhancers/middleware/types/packages/core/src/enhancers/entities/lib/entities.d.ts +39 -0
  550. package/dist/enhancers/middleware/types/packages/core/src/enhancers/entities/lib/entities.d.ts.map +1 -0
  551. package/dist/enhancers/middleware/types/packages/core/src/enhancers/entities/test-setup.d.ts +2 -0
  552. package/dist/enhancers/middleware/types/packages/core/src/enhancers/entities/test-setup.d.ts.map +1 -0
  553. package/dist/enhancers/middleware/types/packages/core/src/enhancers/index.d.ts +38 -0
  554. package/dist/enhancers/middleware/types/packages/core/src/enhancers/index.d.ts.map +1 -0
  555. package/dist/enhancers/middleware/types/packages/core/src/enhancers/memoization/index.d.ts +2 -0
  556. package/dist/enhancers/middleware/types/packages/core/src/enhancers/memoization/index.d.ts.map +1 -0
  557. package/dist/enhancers/middleware/types/packages/core/src/enhancers/memoization/jest.config.d.ts +16 -0
  558. package/dist/enhancers/middleware/types/packages/core/src/enhancers/memoization/jest.config.d.ts.map +1 -0
  559. package/dist/enhancers/middleware/types/packages/core/src/enhancers/memoization/lib/memoization.d.ts +190 -0
  560. package/dist/enhancers/middleware/types/packages/core/src/enhancers/memoization/lib/memoization.d.ts.map +1 -0
  561. package/dist/enhancers/middleware/types/packages/core/src/enhancers/memoization/test-setup.d.ts +2 -0
  562. package/dist/enhancers/middleware/types/packages/core/src/enhancers/memoization/test-setup.d.ts.map +1 -0
  563. package/dist/enhancers/middleware/types/packages/core/src/enhancers/middleware/index.d.ts +3 -0
  564. package/dist/enhancers/middleware/types/packages/core/src/enhancers/middleware/index.d.ts.map +1 -0
  565. package/dist/enhancers/middleware/types/packages/core/src/enhancers/middleware/jest.config.d.ts +16 -0
  566. package/dist/enhancers/middleware/types/packages/core/src/enhancers/middleware/jest.config.d.ts.map +1 -0
  567. package/dist/enhancers/middleware/types/packages/core/src/enhancers/middleware/lib/async-helpers.d.ts +16 -0
  568. package/dist/enhancers/middleware/types/packages/core/src/enhancers/middleware/lib/async-helpers.d.ts.map +1 -0
  569. package/dist/enhancers/middleware/types/packages/core/src/enhancers/middleware/lib/middleware.d.ts +43 -0
  570. package/dist/enhancers/middleware/types/packages/core/src/enhancers/middleware/lib/middleware.d.ts.map +1 -0
  571. package/dist/enhancers/middleware/types/packages/core/src/enhancers/middleware/test-setup.d.ts +2 -0
  572. package/dist/enhancers/middleware/types/packages/core/src/enhancers/middleware/test-setup.d.ts.map +1 -0
  573. package/dist/enhancers/middleware/types/packages/core/src/enhancers/presets/index.d.ts +2 -0
  574. package/dist/enhancers/middleware/types/packages/core/src/enhancers/presets/index.d.ts.map +1 -0
  575. package/dist/enhancers/middleware/types/packages/core/src/enhancers/presets/jest.config.d.ts +16 -0
  576. package/dist/enhancers/middleware/types/packages/core/src/enhancers/presets/jest.config.d.ts.map +1 -0
  577. package/dist/enhancers/middleware/types/packages/core/src/enhancers/presets/lib/presets.d.ts +69 -0
  578. package/dist/enhancers/middleware/types/packages/core/src/enhancers/presets/lib/presets.d.ts.map +1 -0
  579. package/dist/enhancers/middleware/types/packages/core/src/enhancers/presets/test-setup.d.ts +2 -0
  580. package/dist/enhancers/middleware/types/packages/core/src/enhancers/presets/test-setup.d.ts.map +1 -0
  581. package/dist/enhancers/middleware/types/packages/core/src/enhancers/serialization/constants.d.ts +19 -0
  582. package/dist/enhancers/middleware/types/packages/core/src/enhancers/serialization/constants.d.ts.map +1 -0
  583. package/dist/enhancers/middleware/types/packages/core/src/enhancers/serialization/index.d.ts +3 -0
  584. package/dist/enhancers/middleware/types/packages/core/src/enhancers/serialization/index.d.ts.map +1 -0
  585. package/dist/enhancers/middleware/types/packages/core/src/enhancers/serialization/jest.config.d.ts +16 -0
  586. package/dist/enhancers/middleware/types/packages/core/src/enhancers/serialization/jest.config.d.ts.map +1 -0
  587. package/dist/enhancers/middleware/types/packages/core/src/enhancers/serialization/lib/serialization.d.ts +186 -0
  588. package/dist/enhancers/middleware/types/packages/core/src/enhancers/serialization/lib/serialization.d.ts.map +1 -0
  589. package/dist/enhancers/middleware/types/packages/core/src/enhancers/serialization/test-setup.d.ts +2 -0
  590. package/dist/enhancers/middleware/types/packages/core/src/enhancers/serialization/test-setup.d.ts.map +1 -0
  591. package/dist/enhancers/middleware/types/packages/core/src/enhancers/time-travel/index.d.ts +2 -0
  592. package/dist/enhancers/middleware/types/packages/core/src/enhancers/time-travel/index.d.ts.map +1 -0
  593. package/dist/enhancers/middleware/types/packages/core/src/enhancers/time-travel/jest.config.d.ts +16 -0
  594. package/dist/enhancers/middleware/types/packages/core/src/enhancers/time-travel/jest.config.d.ts.map +1 -0
  595. package/dist/enhancers/middleware/types/packages/core/src/enhancers/time-travel/lib/time-travel.d.ts +145 -0
  596. package/dist/enhancers/middleware/types/packages/core/src/enhancers/time-travel/lib/time-travel.d.ts.map +1 -0
  597. package/dist/enhancers/middleware/types/packages/core/src/enhancers/time-travel/lib/utils.d.ts +3 -0
  598. package/dist/enhancers/middleware/types/packages/core/src/enhancers/time-travel/lib/utils.d.ts.map +1 -0
  599. package/dist/enhancers/middleware/types/packages/core/src/enhancers/time-travel/test-setup.d.ts +2 -0
  600. package/dist/enhancers/middleware/types/packages/core/src/enhancers/time-travel/test-setup.d.ts.map +1 -0
  601. package/dist/enhancers/middleware/types/packages/core/src/enhancers/types.d.ts +112 -0
  602. package/dist/enhancers/middleware/types/packages/core/src/enhancers/types.d.ts.map +1 -0
  603. package/dist/enhancers/middleware/types/packages/core/src/index.d.ts +119 -0
  604. package/dist/enhancers/middleware/types/packages/core/src/index.d.ts.map +1 -0
  605. package/dist/enhancers/middleware/types/packages/core/src/lib/constants.d.ts +50 -0
  606. package/dist/enhancers/middleware/types/packages/core/src/lib/constants.d.ts.map +1 -0
  607. package/dist/enhancers/middleware/types/packages/core/src/lib/memory/memory-manager.d.ts +145 -0
  608. package/dist/enhancers/middleware/types/packages/core/src/lib/memory/memory-manager.d.ts.map +1 -0
  609. package/dist/enhancers/middleware/types/packages/core/src/lib/performance/diff-engine.d.ts +109 -0
  610. package/dist/enhancers/middleware/types/packages/core/src/lib/performance/diff-engine.d.ts.map +1 -0
  611. package/dist/enhancers/middleware/types/packages/core/src/lib/performance/path-index.d.ts +120 -0
  612. package/dist/enhancers/middleware/types/packages/core/src/lib/performance/path-index.d.ts.map +1 -0
  613. package/dist/enhancers/middleware/types/packages/core/src/lib/performance/update-engine.d.ts +116 -0
  614. package/dist/enhancers/middleware/types/packages/core/src/lib/performance/update-engine.d.ts.map +1 -0
  615. package/dist/enhancers/middleware/types/packages/core/src/lib/security/security-validator.d.ts +145 -0
  616. package/dist/enhancers/middleware/types/packages/core/src/lib/security/security-validator.d.ts.map +1 -0
  617. package/dist/enhancers/middleware/types/packages/core/src/lib/signal-tree.d.ts +17 -0
  618. package/dist/enhancers/middleware/types/packages/core/src/lib/signal-tree.d.ts.map +1 -0
  619. package/dist/enhancers/middleware/types/packages/core/src/lib/types.d.ts +299 -0
  620. package/dist/enhancers/middleware/types/packages/core/src/lib/types.d.ts.map +1 -0
  621. package/dist/enhancers/middleware/types/packages/core/src/lib/utils.d.ts +53 -0
  622. package/dist/enhancers/middleware/types/packages/core/src/lib/utils.d.ts.map +1 -0
  623. package/dist/enhancers/presets/index.d.ts +185 -0
  624. package/dist/enhancers/presets/index.js +170 -0
  625. package/dist/enhancers/presets/index.js.map +1 -0
  626. package/dist/enhancers/presets/types/packages/core/src/enhancers/batching/index.d.ts +2 -0
  627. package/dist/enhancers/presets/types/packages/core/src/enhancers/batching/index.d.ts.map +1 -0
  628. package/dist/enhancers/presets/types/packages/core/src/enhancers/batching/jest.config.d.ts +16 -0
  629. package/dist/enhancers/presets/types/packages/core/src/enhancers/batching/jest.config.d.ts.map +1 -0
  630. package/dist/enhancers/presets/types/packages/core/src/enhancers/batching/lib/batching.d.ts +262 -0
  631. package/dist/enhancers/presets/types/packages/core/src/enhancers/batching/lib/batching.d.ts.map +1 -0
  632. package/dist/enhancers/presets/types/packages/core/src/enhancers/batching/test-setup.d.ts +2 -0
  633. package/dist/enhancers/presets/types/packages/core/src/enhancers/batching/test-setup.d.ts.map +1 -0
  634. package/dist/enhancers/presets/types/packages/core/src/enhancers/computed/index.d.ts +2 -0
  635. package/dist/enhancers/presets/types/packages/core/src/enhancers/computed/index.d.ts.map +1 -0
  636. package/dist/enhancers/presets/types/packages/core/src/enhancers/computed/jest.config.d.ts +16 -0
  637. package/dist/enhancers/presets/types/packages/core/src/enhancers/computed/jest.config.d.ts.map +1 -0
  638. package/dist/enhancers/presets/types/packages/core/src/enhancers/computed/lib/computed.d.ts +68 -0
  639. package/dist/enhancers/presets/types/packages/core/src/enhancers/computed/lib/computed.d.ts.map +1 -0
  640. package/dist/enhancers/presets/types/packages/core/src/enhancers/devtools/index.d.ts +2 -0
  641. package/dist/enhancers/presets/types/packages/core/src/enhancers/devtools/index.d.ts.map +1 -0
  642. package/dist/enhancers/presets/types/packages/core/src/enhancers/devtools/jest.config.d.ts +16 -0
  643. package/dist/enhancers/presets/types/packages/core/src/enhancers/devtools/jest.config.d.ts.map +1 -0
  644. package/dist/enhancers/presets/types/packages/core/src/enhancers/devtools/lib/devtools.d.ts +129 -0
  645. package/dist/enhancers/presets/types/packages/core/src/enhancers/devtools/lib/devtools.d.ts.map +1 -0
  646. package/dist/enhancers/presets/types/packages/core/src/enhancers/devtools/test-setup.d.ts +2 -0
  647. package/dist/enhancers/presets/types/packages/core/src/enhancers/devtools/test-setup.d.ts.map +1 -0
  648. package/dist/enhancers/presets/types/packages/core/src/enhancers/entities/index.d.ts +2 -0
  649. package/dist/enhancers/presets/types/packages/core/src/enhancers/entities/index.d.ts.map +1 -0
  650. package/dist/enhancers/presets/types/packages/core/src/enhancers/entities/jest.config.d.ts +16 -0
  651. package/dist/enhancers/presets/types/packages/core/src/enhancers/entities/jest.config.d.ts.map +1 -0
  652. package/dist/enhancers/presets/types/packages/core/src/enhancers/entities/lib/entities.d.ts +39 -0
  653. package/dist/enhancers/presets/types/packages/core/src/enhancers/entities/lib/entities.d.ts.map +1 -0
  654. package/dist/enhancers/presets/types/packages/core/src/enhancers/entities/test-setup.d.ts +2 -0
  655. package/dist/enhancers/presets/types/packages/core/src/enhancers/entities/test-setup.d.ts.map +1 -0
  656. package/dist/enhancers/presets/types/packages/core/src/enhancers/index.d.ts +38 -0
  657. package/dist/enhancers/presets/types/packages/core/src/enhancers/index.d.ts.map +1 -0
  658. package/dist/enhancers/presets/types/packages/core/src/enhancers/memoization/index.d.ts +2 -0
  659. package/dist/enhancers/presets/types/packages/core/src/enhancers/memoization/index.d.ts.map +1 -0
  660. package/dist/enhancers/presets/types/packages/core/src/enhancers/memoization/jest.config.d.ts +16 -0
  661. package/dist/enhancers/presets/types/packages/core/src/enhancers/memoization/jest.config.d.ts.map +1 -0
  662. package/dist/enhancers/presets/types/packages/core/src/enhancers/memoization/lib/memoization.d.ts +190 -0
  663. package/dist/enhancers/presets/types/packages/core/src/enhancers/memoization/lib/memoization.d.ts.map +1 -0
  664. package/dist/enhancers/presets/types/packages/core/src/enhancers/memoization/test-setup.d.ts +2 -0
  665. package/dist/enhancers/presets/types/packages/core/src/enhancers/memoization/test-setup.d.ts.map +1 -0
  666. package/dist/enhancers/presets/types/packages/core/src/enhancers/middleware/index.d.ts +3 -0
  667. package/dist/enhancers/presets/types/packages/core/src/enhancers/middleware/index.d.ts.map +1 -0
  668. package/dist/enhancers/presets/types/packages/core/src/enhancers/middleware/jest.config.d.ts +16 -0
  669. package/dist/enhancers/presets/types/packages/core/src/enhancers/middleware/jest.config.d.ts.map +1 -0
  670. package/dist/enhancers/presets/types/packages/core/src/enhancers/middleware/lib/async-helpers.d.ts +16 -0
  671. package/dist/enhancers/presets/types/packages/core/src/enhancers/middleware/lib/async-helpers.d.ts.map +1 -0
  672. package/dist/enhancers/presets/types/packages/core/src/enhancers/middleware/lib/middleware.d.ts +43 -0
  673. package/dist/enhancers/presets/types/packages/core/src/enhancers/middleware/lib/middleware.d.ts.map +1 -0
  674. package/dist/enhancers/presets/types/packages/core/src/enhancers/middleware/test-setup.d.ts +2 -0
  675. package/dist/enhancers/presets/types/packages/core/src/enhancers/middleware/test-setup.d.ts.map +1 -0
  676. package/dist/enhancers/presets/types/packages/core/src/enhancers/presets/index.d.ts +2 -0
  677. package/dist/enhancers/presets/types/packages/core/src/enhancers/presets/index.d.ts.map +1 -0
  678. package/dist/enhancers/presets/types/packages/core/src/enhancers/presets/jest.config.d.ts +16 -0
  679. package/dist/enhancers/presets/types/packages/core/src/enhancers/presets/jest.config.d.ts.map +1 -0
  680. package/dist/enhancers/presets/types/packages/core/src/enhancers/presets/lib/presets.d.ts +69 -0
  681. package/dist/enhancers/presets/types/packages/core/src/enhancers/presets/lib/presets.d.ts.map +1 -0
  682. package/dist/enhancers/presets/types/packages/core/src/enhancers/presets/test-setup.d.ts +2 -0
  683. package/dist/enhancers/presets/types/packages/core/src/enhancers/presets/test-setup.d.ts.map +1 -0
  684. package/dist/enhancers/presets/types/packages/core/src/enhancers/serialization/constants.d.ts +19 -0
  685. package/dist/enhancers/presets/types/packages/core/src/enhancers/serialization/constants.d.ts.map +1 -0
  686. package/dist/enhancers/presets/types/packages/core/src/enhancers/serialization/index.d.ts +3 -0
  687. package/dist/enhancers/presets/types/packages/core/src/enhancers/serialization/index.d.ts.map +1 -0
  688. package/dist/enhancers/presets/types/packages/core/src/enhancers/serialization/jest.config.d.ts +16 -0
  689. package/dist/enhancers/presets/types/packages/core/src/enhancers/serialization/jest.config.d.ts.map +1 -0
  690. package/dist/enhancers/presets/types/packages/core/src/enhancers/serialization/lib/serialization.d.ts +186 -0
  691. package/dist/enhancers/presets/types/packages/core/src/enhancers/serialization/lib/serialization.d.ts.map +1 -0
  692. package/dist/enhancers/presets/types/packages/core/src/enhancers/serialization/test-setup.d.ts +2 -0
  693. package/dist/enhancers/presets/types/packages/core/src/enhancers/serialization/test-setup.d.ts.map +1 -0
  694. package/dist/enhancers/presets/types/packages/core/src/enhancers/time-travel/index.d.ts +2 -0
  695. package/dist/enhancers/presets/types/packages/core/src/enhancers/time-travel/index.d.ts.map +1 -0
  696. package/dist/enhancers/presets/types/packages/core/src/enhancers/time-travel/jest.config.d.ts +16 -0
  697. package/dist/enhancers/presets/types/packages/core/src/enhancers/time-travel/jest.config.d.ts.map +1 -0
  698. package/dist/enhancers/presets/types/packages/core/src/enhancers/time-travel/lib/time-travel.d.ts +145 -0
  699. package/dist/enhancers/presets/types/packages/core/src/enhancers/time-travel/lib/time-travel.d.ts.map +1 -0
  700. package/dist/enhancers/presets/types/packages/core/src/enhancers/time-travel/lib/utils.d.ts +3 -0
  701. package/dist/enhancers/presets/types/packages/core/src/enhancers/time-travel/lib/utils.d.ts.map +1 -0
  702. package/dist/enhancers/presets/types/packages/core/src/enhancers/time-travel/test-setup.d.ts +2 -0
  703. package/dist/enhancers/presets/types/packages/core/src/enhancers/time-travel/test-setup.d.ts.map +1 -0
  704. package/dist/enhancers/presets/types/packages/core/src/enhancers/types.d.ts +112 -0
  705. package/dist/enhancers/presets/types/packages/core/src/enhancers/types.d.ts.map +1 -0
  706. package/dist/enhancers/presets/types/packages/core/src/index.d.ts +119 -0
  707. package/dist/enhancers/presets/types/packages/core/src/index.d.ts.map +1 -0
  708. package/dist/enhancers/presets/types/packages/core/src/lib/constants.d.ts +50 -0
  709. package/dist/enhancers/presets/types/packages/core/src/lib/constants.d.ts.map +1 -0
  710. package/dist/enhancers/presets/types/packages/core/src/lib/memory/memory-manager.d.ts +145 -0
  711. package/dist/enhancers/presets/types/packages/core/src/lib/memory/memory-manager.d.ts.map +1 -0
  712. package/dist/enhancers/presets/types/packages/core/src/lib/performance/diff-engine.d.ts +109 -0
  713. package/dist/enhancers/presets/types/packages/core/src/lib/performance/diff-engine.d.ts.map +1 -0
  714. package/dist/enhancers/presets/types/packages/core/src/lib/performance/path-index.d.ts +120 -0
  715. package/dist/enhancers/presets/types/packages/core/src/lib/performance/path-index.d.ts.map +1 -0
  716. package/dist/enhancers/presets/types/packages/core/src/lib/performance/update-engine.d.ts +116 -0
  717. package/dist/enhancers/presets/types/packages/core/src/lib/performance/update-engine.d.ts.map +1 -0
  718. package/dist/enhancers/presets/types/packages/core/src/lib/security/security-validator.d.ts +145 -0
  719. package/dist/enhancers/presets/types/packages/core/src/lib/security/security-validator.d.ts.map +1 -0
  720. package/dist/enhancers/presets/types/packages/core/src/lib/signal-tree.d.ts +17 -0
  721. package/dist/enhancers/presets/types/packages/core/src/lib/signal-tree.d.ts.map +1 -0
  722. package/dist/enhancers/presets/types/packages/core/src/lib/types.d.ts +299 -0
  723. package/dist/enhancers/presets/types/packages/core/src/lib/types.d.ts.map +1 -0
  724. package/dist/enhancers/presets/types/packages/core/src/lib/utils.d.ts +53 -0
  725. package/dist/enhancers/presets/types/packages/core/src/lib/utils.d.ts.map +1 -0
  726. package/dist/enhancers/serialization/index.d.ts +439 -0
  727. package/dist/enhancers/serialization/index.js +837 -0
  728. package/dist/enhancers/serialization/index.js.map +1 -0
  729. package/dist/enhancers/serialization/types/packages/core/src/enhancers/batching/index.d.ts +2 -0
  730. package/dist/enhancers/serialization/types/packages/core/src/enhancers/batching/index.d.ts.map +1 -0
  731. package/dist/enhancers/serialization/types/packages/core/src/enhancers/batching/jest.config.d.ts +16 -0
  732. package/dist/enhancers/serialization/types/packages/core/src/enhancers/batching/jest.config.d.ts.map +1 -0
  733. package/dist/enhancers/serialization/types/packages/core/src/enhancers/batching/lib/batching.d.ts +262 -0
  734. package/dist/enhancers/serialization/types/packages/core/src/enhancers/batching/lib/batching.d.ts.map +1 -0
  735. package/dist/enhancers/serialization/types/packages/core/src/enhancers/batching/test-setup.d.ts +2 -0
  736. package/dist/enhancers/serialization/types/packages/core/src/enhancers/batching/test-setup.d.ts.map +1 -0
  737. package/dist/enhancers/serialization/types/packages/core/src/enhancers/computed/index.d.ts +2 -0
  738. package/dist/enhancers/serialization/types/packages/core/src/enhancers/computed/index.d.ts.map +1 -0
  739. package/dist/enhancers/serialization/types/packages/core/src/enhancers/computed/jest.config.d.ts +16 -0
  740. package/dist/enhancers/serialization/types/packages/core/src/enhancers/computed/jest.config.d.ts.map +1 -0
  741. package/dist/enhancers/serialization/types/packages/core/src/enhancers/computed/lib/computed.d.ts +68 -0
  742. package/dist/enhancers/serialization/types/packages/core/src/enhancers/computed/lib/computed.d.ts.map +1 -0
  743. package/dist/enhancers/serialization/types/packages/core/src/enhancers/devtools/index.d.ts +2 -0
  744. package/dist/enhancers/serialization/types/packages/core/src/enhancers/devtools/index.d.ts.map +1 -0
  745. package/dist/enhancers/serialization/types/packages/core/src/enhancers/devtools/jest.config.d.ts +16 -0
  746. package/dist/enhancers/serialization/types/packages/core/src/enhancers/devtools/jest.config.d.ts.map +1 -0
  747. package/dist/enhancers/serialization/types/packages/core/src/enhancers/devtools/lib/devtools.d.ts +129 -0
  748. package/dist/enhancers/serialization/types/packages/core/src/enhancers/devtools/lib/devtools.d.ts.map +1 -0
  749. package/dist/enhancers/serialization/types/packages/core/src/enhancers/devtools/test-setup.d.ts +2 -0
  750. package/dist/enhancers/serialization/types/packages/core/src/enhancers/devtools/test-setup.d.ts.map +1 -0
  751. package/dist/enhancers/serialization/types/packages/core/src/enhancers/entities/index.d.ts +2 -0
  752. package/dist/enhancers/serialization/types/packages/core/src/enhancers/entities/index.d.ts.map +1 -0
  753. package/dist/enhancers/serialization/types/packages/core/src/enhancers/entities/jest.config.d.ts +16 -0
  754. package/dist/enhancers/serialization/types/packages/core/src/enhancers/entities/jest.config.d.ts.map +1 -0
  755. package/dist/enhancers/serialization/types/packages/core/src/enhancers/entities/lib/entities.d.ts +39 -0
  756. package/dist/enhancers/serialization/types/packages/core/src/enhancers/entities/lib/entities.d.ts.map +1 -0
  757. package/dist/enhancers/serialization/types/packages/core/src/enhancers/entities/test-setup.d.ts +2 -0
  758. package/dist/enhancers/serialization/types/packages/core/src/enhancers/entities/test-setup.d.ts.map +1 -0
  759. package/dist/enhancers/serialization/types/packages/core/src/enhancers/index.d.ts +38 -0
  760. package/dist/enhancers/serialization/types/packages/core/src/enhancers/index.d.ts.map +1 -0
  761. package/dist/enhancers/serialization/types/packages/core/src/enhancers/memoization/index.d.ts +2 -0
  762. package/dist/enhancers/serialization/types/packages/core/src/enhancers/memoization/index.d.ts.map +1 -0
  763. package/dist/enhancers/serialization/types/packages/core/src/enhancers/memoization/jest.config.d.ts +16 -0
  764. package/dist/enhancers/serialization/types/packages/core/src/enhancers/memoization/jest.config.d.ts.map +1 -0
  765. package/dist/enhancers/serialization/types/packages/core/src/enhancers/memoization/lib/memoization.d.ts +190 -0
  766. package/dist/enhancers/serialization/types/packages/core/src/enhancers/memoization/lib/memoization.d.ts.map +1 -0
  767. package/dist/enhancers/serialization/types/packages/core/src/enhancers/memoization/test-setup.d.ts +2 -0
  768. package/dist/enhancers/serialization/types/packages/core/src/enhancers/memoization/test-setup.d.ts.map +1 -0
  769. package/dist/enhancers/serialization/types/packages/core/src/enhancers/middleware/index.d.ts +3 -0
  770. package/dist/enhancers/serialization/types/packages/core/src/enhancers/middleware/index.d.ts.map +1 -0
  771. package/dist/enhancers/serialization/types/packages/core/src/enhancers/middleware/jest.config.d.ts +16 -0
  772. package/dist/enhancers/serialization/types/packages/core/src/enhancers/middleware/jest.config.d.ts.map +1 -0
  773. package/dist/enhancers/serialization/types/packages/core/src/enhancers/middleware/lib/async-helpers.d.ts +16 -0
  774. package/dist/enhancers/serialization/types/packages/core/src/enhancers/middleware/lib/async-helpers.d.ts.map +1 -0
  775. package/dist/enhancers/serialization/types/packages/core/src/enhancers/middleware/lib/middleware.d.ts +43 -0
  776. package/dist/enhancers/serialization/types/packages/core/src/enhancers/middleware/lib/middleware.d.ts.map +1 -0
  777. package/dist/enhancers/serialization/types/packages/core/src/enhancers/middleware/test-setup.d.ts +2 -0
  778. package/dist/enhancers/serialization/types/packages/core/src/enhancers/middleware/test-setup.d.ts.map +1 -0
  779. package/dist/enhancers/serialization/types/packages/core/src/enhancers/presets/index.d.ts +2 -0
  780. package/dist/enhancers/serialization/types/packages/core/src/enhancers/presets/index.d.ts.map +1 -0
  781. package/dist/enhancers/serialization/types/packages/core/src/enhancers/presets/jest.config.d.ts +16 -0
  782. package/dist/enhancers/serialization/types/packages/core/src/enhancers/presets/jest.config.d.ts.map +1 -0
  783. package/dist/enhancers/serialization/types/packages/core/src/enhancers/presets/lib/presets.d.ts +69 -0
  784. package/dist/enhancers/serialization/types/packages/core/src/enhancers/presets/lib/presets.d.ts.map +1 -0
  785. package/dist/enhancers/serialization/types/packages/core/src/enhancers/presets/test-setup.d.ts +2 -0
  786. package/dist/enhancers/serialization/types/packages/core/src/enhancers/presets/test-setup.d.ts.map +1 -0
  787. package/dist/enhancers/serialization/types/packages/core/src/enhancers/serialization/constants.d.ts +19 -0
  788. package/dist/enhancers/serialization/types/packages/core/src/enhancers/serialization/constants.d.ts.map +1 -0
  789. package/dist/enhancers/serialization/types/packages/core/src/enhancers/serialization/index.d.ts +3 -0
  790. package/dist/enhancers/serialization/types/packages/core/src/enhancers/serialization/index.d.ts.map +1 -0
  791. package/dist/enhancers/serialization/types/packages/core/src/enhancers/serialization/jest.config.d.ts +16 -0
  792. package/dist/enhancers/serialization/types/packages/core/src/enhancers/serialization/jest.config.d.ts.map +1 -0
  793. package/dist/enhancers/serialization/types/packages/core/src/enhancers/serialization/lib/serialization.d.ts +186 -0
  794. package/dist/enhancers/serialization/types/packages/core/src/enhancers/serialization/lib/serialization.d.ts.map +1 -0
  795. package/dist/enhancers/serialization/types/packages/core/src/enhancers/serialization/test-setup.d.ts +2 -0
  796. package/dist/enhancers/serialization/types/packages/core/src/enhancers/serialization/test-setup.d.ts.map +1 -0
  797. package/dist/enhancers/serialization/types/packages/core/src/enhancers/time-travel/index.d.ts +2 -0
  798. package/dist/enhancers/serialization/types/packages/core/src/enhancers/time-travel/index.d.ts.map +1 -0
  799. package/dist/enhancers/serialization/types/packages/core/src/enhancers/time-travel/jest.config.d.ts +16 -0
  800. package/dist/enhancers/serialization/types/packages/core/src/enhancers/time-travel/jest.config.d.ts.map +1 -0
  801. package/dist/enhancers/serialization/types/packages/core/src/enhancers/time-travel/lib/time-travel.d.ts +145 -0
  802. package/dist/enhancers/serialization/types/packages/core/src/enhancers/time-travel/lib/time-travel.d.ts.map +1 -0
  803. package/dist/enhancers/serialization/types/packages/core/src/enhancers/time-travel/lib/utils.d.ts +3 -0
  804. package/dist/enhancers/serialization/types/packages/core/src/enhancers/time-travel/lib/utils.d.ts.map +1 -0
  805. package/dist/enhancers/serialization/types/packages/core/src/enhancers/time-travel/test-setup.d.ts +2 -0
  806. package/dist/enhancers/serialization/types/packages/core/src/enhancers/time-travel/test-setup.d.ts.map +1 -0
  807. package/dist/enhancers/serialization/types/packages/core/src/enhancers/types.d.ts +112 -0
  808. package/dist/enhancers/serialization/types/packages/core/src/enhancers/types.d.ts.map +1 -0
  809. package/dist/enhancers/serialization/types/packages/core/src/index.d.ts +119 -0
  810. package/dist/enhancers/serialization/types/packages/core/src/index.d.ts.map +1 -0
  811. package/dist/enhancers/serialization/types/packages/core/src/lib/constants.d.ts +50 -0
  812. package/dist/enhancers/serialization/types/packages/core/src/lib/constants.d.ts.map +1 -0
  813. package/dist/enhancers/serialization/types/packages/core/src/lib/memory/memory-manager.d.ts +145 -0
  814. package/dist/enhancers/serialization/types/packages/core/src/lib/memory/memory-manager.d.ts.map +1 -0
  815. package/dist/enhancers/serialization/types/packages/core/src/lib/performance/diff-engine.d.ts +109 -0
  816. package/dist/enhancers/serialization/types/packages/core/src/lib/performance/diff-engine.d.ts.map +1 -0
  817. package/dist/enhancers/serialization/types/packages/core/src/lib/performance/path-index.d.ts +120 -0
  818. package/dist/enhancers/serialization/types/packages/core/src/lib/performance/path-index.d.ts.map +1 -0
  819. package/dist/enhancers/serialization/types/packages/core/src/lib/performance/update-engine.d.ts +116 -0
  820. package/dist/enhancers/serialization/types/packages/core/src/lib/performance/update-engine.d.ts.map +1 -0
  821. package/dist/enhancers/serialization/types/packages/core/src/lib/security/security-validator.d.ts +145 -0
  822. package/dist/enhancers/serialization/types/packages/core/src/lib/security/security-validator.d.ts.map +1 -0
  823. package/dist/enhancers/serialization/types/packages/core/src/lib/signal-tree.d.ts +17 -0
  824. package/dist/enhancers/serialization/types/packages/core/src/lib/signal-tree.d.ts.map +1 -0
  825. package/dist/enhancers/serialization/types/packages/core/src/lib/types.d.ts +299 -0
  826. package/dist/enhancers/serialization/types/packages/core/src/lib/types.d.ts.map +1 -0
  827. package/dist/enhancers/serialization/types/packages/core/src/lib/utils.d.ts +53 -0
  828. package/dist/enhancers/serialization/types/packages/core/src/lib/utils.d.ts.map +1 -0
  829. package/dist/enhancers/time-travel/index.d.ts +380 -0
  830. package/dist/enhancers/time-travel/index.js +289 -0
  831. package/dist/enhancers/time-travel/index.js.map +1 -0
  832. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/batching/index.d.ts +2 -0
  833. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/batching/index.d.ts.map +1 -0
  834. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/batching/jest.config.d.ts +16 -0
  835. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/batching/jest.config.d.ts.map +1 -0
  836. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/batching/lib/batching.d.ts +262 -0
  837. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/batching/lib/batching.d.ts.map +1 -0
  838. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/batching/test-setup.d.ts +2 -0
  839. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/batching/test-setup.d.ts.map +1 -0
  840. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/computed/index.d.ts +2 -0
  841. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/computed/index.d.ts.map +1 -0
  842. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/computed/jest.config.d.ts +16 -0
  843. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/computed/jest.config.d.ts.map +1 -0
  844. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/computed/lib/computed.d.ts +68 -0
  845. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/computed/lib/computed.d.ts.map +1 -0
  846. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/devtools/index.d.ts +2 -0
  847. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/devtools/index.d.ts.map +1 -0
  848. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/devtools/jest.config.d.ts +16 -0
  849. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/devtools/jest.config.d.ts.map +1 -0
  850. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/devtools/lib/devtools.d.ts +129 -0
  851. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/devtools/lib/devtools.d.ts.map +1 -0
  852. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/devtools/test-setup.d.ts +2 -0
  853. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/devtools/test-setup.d.ts.map +1 -0
  854. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/entities/index.d.ts +2 -0
  855. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/entities/index.d.ts.map +1 -0
  856. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/entities/jest.config.d.ts +16 -0
  857. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/entities/jest.config.d.ts.map +1 -0
  858. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/entities/lib/entities.d.ts +39 -0
  859. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/entities/lib/entities.d.ts.map +1 -0
  860. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/entities/test-setup.d.ts +2 -0
  861. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/entities/test-setup.d.ts.map +1 -0
  862. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/index.d.ts +38 -0
  863. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/index.d.ts.map +1 -0
  864. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/memoization/index.d.ts +2 -0
  865. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/memoization/index.d.ts.map +1 -0
  866. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/memoization/jest.config.d.ts +16 -0
  867. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/memoization/jest.config.d.ts.map +1 -0
  868. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/memoization/lib/memoization.d.ts +190 -0
  869. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/memoization/lib/memoization.d.ts.map +1 -0
  870. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/memoization/test-setup.d.ts +2 -0
  871. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/memoization/test-setup.d.ts.map +1 -0
  872. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/middleware/index.d.ts +3 -0
  873. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/middleware/index.d.ts.map +1 -0
  874. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/middleware/jest.config.d.ts +16 -0
  875. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/middleware/jest.config.d.ts.map +1 -0
  876. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/middleware/lib/async-helpers.d.ts +16 -0
  877. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/middleware/lib/async-helpers.d.ts.map +1 -0
  878. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/middleware/lib/middleware.d.ts +43 -0
  879. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/middleware/lib/middleware.d.ts.map +1 -0
  880. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/middleware/test-setup.d.ts +2 -0
  881. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/middleware/test-setup.d.ts.map +1 -0
  882. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/presets/index.d.ts +2 -0
  883. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/presets/index.d.ts.map +1 -0
  884. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/presets/jest.config.d.ts +16 -0
  885. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/presets/jest.config.d.ts.map +1 -0
  886. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/presets/lib/presets.d.ts +69 -0
  887. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/presets/lib/presets.d.ts.map +1 -0
  888. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/presets/test-setup.d.ts +2 -0
  889. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/presets/test-setup.d.ts.map +1 -0
  890. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/serialization/constants.d.ts +19 -0
  891. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/serialization/constants.d.ts.map +1 -0
  892. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/serialization/index.d.ts +3 -0
  893. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/serialization/index.d.ts.map +1 -0
  894. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/serialization/jest.config.d.ts +16 -0
  895. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/serialization/jest.config.d.ts.map +1 -0
  896. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/serialization/lib/serialization.d.ts +186 -0
  897. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/serialization/lib/serialization.d.ts.map +1 -0
  898. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/serialization/test-setup.d.ts +2 -0
  899. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/serialization/test-setup.d.ts.map +1 -0
  900. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/time-travel/index.d.ts +2 -0
  901. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/time-travel/index.d.ts.map +1 -0
  902. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/time-travel/jest.config.d.ts +16 -0
  903. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/time-travel/jest.config.d.ts.map +1 -0
  904. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/time-travel/lib/time-travel.d.ts +145 -0
  905. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/time-travel/lib/time-travel.d.ts.map +1 -0
  906. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/time-travel/lib/utils.d.ts +3 -0
  907. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/time-travel/lib/utils.d.ts.map +1 -0
  908. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/time-travel/test-setup.d.ts +2 -0
  909. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/time-travel/test-setup.d.ts.map +1 -0
  910. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/types.d.ts +112 -0
  911. package/dist/enhancers/time-travel/types/packages/core/src/enhancers/types.d.ts.map +1 -0
  912. package/dist/enhancers/time-travel/types/packages/core/src/index.d.ts +119 -0
  913. package/dist/enhancers/time-travel/types/packages/core/src/index.d.ts.map +1 -0
  914. package/dist/enhancers/time-travel/types/packages/core/src/lib/constants.d.ts +50 -0
  915. package/dist/enhancers/time-travel/types/packages/core/src/lib/constants.d.ts.map +1 -0
  916. package/dist/enhancers/time-travel/types/packages/core/src/lib/memory/memory-manager.d.ts +145 -0
  917. package/dist/enhancers/time-travel/types/packages/core/src/lib/memory/memory-manager.d.ts.map +1 -0
  918. package/dist/enhancers/time-travel/types/packages/core/src/lib/performance/diff-engine.d.ts +109 -0
  919. package/dist/enhancers/time-travel/types/packages/core/src/lib/performance/diff-engine.d.ts.map +1 -0
  920. package/dist/enhancers/time-travel/types/packages/core/src/lib/performance/path-index.d.ts +120 -0
  921. package/dist/enhancers/time-travel/types/packages/core/src/lib/performance/path-index.d.ts.map +1 -0
  922. package/dist/enhancers/time-travel/types/packages/core/src/lib/performance/update-engine.d.ts +116 -0
  923. package/dist/enhancers/time-travel/types/packages/core/src/lib/performance/update-engine.d.ts.map +1 -0
  924. package/dist/enhancers/time-travel/types/packages/core/src/lib/security/security-validator.d.ts +145 -0
  925. package/dist/enhancers/time-travel/types/packages/core/src/lib/security/security-validator.d.ts.map +1 -0
  926. package/dist/enhancers/time-travel/types/packages/core/src/lib/signal-tree.d.ts +17 -0
  927. package/dist/enhancers/time-travel/types/packages/core/src/lib/signal-tree.d.ts.map +1 -0
  928. package/dist/enhancers/time-travel/types/packages/core/src/lib/types.d.ts +299 -0
  929. package/dist/enhancers/time-travel/types/packages/core/src/lib/types.d.ts.map +1 -0
  930. package/dist/enhancers/time-travel/types/packages/core/src/lib/utils.d.ts +53 -0
  931. package/dist/enhancers/time-travel/types/packages/core/src/lib/utils.d.ts.map +1 -0
  932. package/dist/enhancers/types/packages/core/src/enhancers/batching/index.d.ts +2 -0
  933. package/dist/enhancers/types/packages/core/src/enhancers/batching/index.d.ts.map +1 -0
  934. package/dist/enhancers/types/packages/core/src/enhancers/batching/jest.config.d.ts +16 -0
  935. package/dist/enhancers/types/packages/core/src/enhancers/batching/jest.config.d.ts.map +1 -0
  936. package/dist/enhancers/types/packages/core/src/enhancers/batching/lib/batching.d.ts +262 -0
  937. package/dist/enhancers/types/packages/core/src/enhancers/batching/lib/batching.d.ts.map +1 -0
  938. package/dist/enhancers/types/packages/core/src/enhancers/batching/test-setup.d.ts +2 -0
  939. package/dist/enhancers/types/packages/core/src/enhancers/batching/test-setup.d.ts.map +1 -0
  940. package/dist/enhancers/types/packages/core/src/enhancers/computed/index.d.ts +2 -0
  941. package/dist/enhancers/types/packages/core/src/enhancers/computed/index.d.ts.map +1 -0
  942. package/dist/enhancers/types/packages/core/src/enhancers/computed/jest.config.d.ts +16 -0
  943. package/dist/enhancers/types/packages/core/src/enhancers/computed/jest.config.d.ts.map +1 -0
  944. package/dist/enhancers/types/packages/core/src/enhancers/computed/lib/computed.d.ts +68 -0
  945. package/dist/enhancers/types/packages/core/src/enhancers/computed/lib/computed.d.ts.map +1 -0
  946. package/dist/enhancers/types/packages/core/src/enhancers/devtools/index.d.ts +2 -0
  947. package/dist/enhancers/types/packages/core/src/enhancers/devtools/index.d.ts.map +1 -0
  948. package/dist/enhancers/types/packages/core/src/enhancers/devtools/jest.config.d.ts +16 -0
  949. package/dist/enhancers/types/packages/core/src/enhancers/devtools/jest.config.d.ts.map +1 -0
  950. package/dist/enhancers/types/packages/core/src/enhancers/devtools/lib/devtools.d.ts +129 -0
  951. package/dist/enhancers/types/packages/core/src/enhancers/devtools/lib/devtools.d.ts.map +1 -0
  952. package/dist/enhancers/types/packages/core/src/enhancers/devtools/test-setup.d.ts +2 -0
  953. package/dist/enhancers/types/packages/core/src/enhancers/devtools/test-setup.d.ts.map +1 -0
  954. package/dist/enhancers/types/packages/core/src/enhancers/entities/index.d.ts +2 -0
  955. package/dist/enhancers/types/packages/core/src/enhancers/entities/index.d.ts.map +1 -0
  956. package/dist/enhancers/types/packages/core/src/enhancers/entities/jest.config.d.ts +16 -0
  957. package/dist/enhancers/types/packages/core/src/enhancers/entities/jest.config.d.ts.map +1 -0
  958. package/dist/enhancers/types/packages/core/src/enhancers/entities/lib/entities.d.ts +39 -0
  959. package/dist/enhancers/types/packages/core/src/enhancers/entities/lib/entities.d.ts.map +1 -0
  960. package/dist/enhancers/types/packages/core/src/enhancers/entities/test-setup.d.ts +2 -0
  961. package/dist/enhancers/types/packages/core/src/enhancers/entities/test-setup.d.ts.map +1 -0
  962. package/dist/enhancers/types/packages/core/src/enhancers/index.d.ts +38 -0
  963. package/dist/enhancers/types/packages/core/src/enhancers/index.d.ts.map +1 -0
  964. package/dist/enhancers/types/packages/core/src/enhancers/memoization/index.d.ts +2 -0
  965. package/dist/enhancers/types/packages/core/src/enhancers/memoization/index.d.ts.map +1 -0
  966. package/dist/enhancers/types/packages/core/src/enhancers/memoization/jest.config.d.ts +16 -0
  967. package/dist/enhancers/types/packages/core/src/enhancers/memoization/jest.config.d.ts.map +1 -0
  968. package/dist/enhancers/types/packages/core/src/enhancers/memoization/lib/memoization.d.ts +190 -0
  969. package/dist/enhancers/types/packages/core/src/enhancers/memoization/lib/memoization.d.ts.map +1 -0
  970. package/dist/enhancers/types/packages/core/src/enhancers/memoization/test-setup.d.ts +2 -0
  971. package/dist/enhancers/types/packages/core/src/enhancers/memoization/test-setup.d.ts.map +1 -0
  972. package/dist/enhancers/types/packages/core/src/enhancers/middleware/index.d.ts +3 -0
  973. package/dist/enhancers/types/packages/core/src/enhancers/middleware/index.d.ts.map +1 -0
  974. package/dist/enhancers/types/packages/core/src/enhancers/middleware/jest.config.d.ts +16 -0
  975. package/dist/enhancers/types/packages/core/src/enhancers/middleware/jest.config.d.ts.map +1 -0
  976. package/dist/enhancers/types/packages/core/src/enhancers/middleware/lib/async-helpers.d.ts +16 -0
  977. package/dist/enhancers/types/packages/core/src/enhancers/middleware/lib/async-helpers.d.ts.map +1 -0
  978. package/dist/enhancers/types/packages/core/src/enhancers/middleware/lib/middleware.d.ts +43 -0
  979. package/dist/enhancers/types/packages/core/src/enhancers/middleware/lib/middleware.d.ts.map +1 -0
  980. package/dist/enhancers/types/packages/core/src/enhancers/middleware/test-setup.d.ts +2 -0
  981. package/dist/enhancers/types/packages/core/src/enhancers/middleware/test-setup.d.ts.map +1 -0
  982. package/dist/enhancers/types/packages/core/src/enhancers/presets/index.d.ts +2 -0
  983. package/dist/enhancers/types/packages/core/src/enhancers/presets/index.d.ts.map +1 -0
  984. package/dist/enhancers/types/packages/core/src/enhancers/presets/jest.config.d.ts +16 -0
  985. package/dist/enhancers/types/packages/core/src/enhancers/presets/jest.config.d.ts.map +1 -0
  986. package/dist/enhancers/types/packages/core/src/enhancers/presets/lib/presets.d.ts +69 -0
  987. package/dist/enhancers/types/packages/core/src/enhancers/presets/lib/presets.d.ts.map +1 -0
  988. package/dist/enhancers/types/packages/core/src/enhancers/presets/test-setup.d.ts +2 -0
  989. package/dist/enhancers/types/packages/core/src/enhancers/presets/test-setup.d.ts.map +1 -0
  990. package/dist/enhancers/types/packages/core/src/enhancers/serialization/constants.d.ts +19 -0
  991. package/dist/enhancers/types/packages/core/src/enhancers/serialization/constants.d.ts.map +1 -0
  992. package/dist/enhancers/types/packages/core/src/enhancers/serialization/index.d.ts +3 -0
  993. package/dist/enhancers/types/packages/core/src/enhancers/serialization/index.d.ts.map +1 -0
  994. package/dist/enhancers/types/packages/core/src/enhancers/serialization/jest.config.d.ts +16 -0
  995. package/dist/enhancers/types/packages/core/src/enhancers/serialization/jest.config.d.ts.map +1 -0
  996. package/dist/enhancers/types/packages/core/src/enhancers/serialization/lib/serialization.d.ts +186 -0
  997. package/dist/enhancers/types/packages/core/src/enhancers/serialization/lib/serialization.d.ts.map +1 -0
  998. package/dist/enhancers/types/packages/core/src/enhancers/serialization/test-setup.d.ts +2 -0
  999. package/dist/enhancers/types/packages/core/src/enhancers/serialization/test-setup.d.ts.map +1 -0
  1000. package/dist/enhancers/types/packages/core/src/enhancers/time-travel/index.d.ts +2 -0
  1001. package/dist/enhancers/types/packages/core/src/enhancers/time-travel/index.d.ts.map +1 -0
  1002. package/dist/enhancers/types/packages/core/src/enhancers/time-travel/jest.config.d.ts +16 -0
  1003. package/dist/enhancers/types/packages/core/src/enhancers/time-travel/jest.config.d.ts.map +1 -0
  1004. package/dist/enhancers/types/packages/core/src/enhancers/time-travel/lib/time-travel.d.ts +145 -0
  1005. package/dist/enhancers/types/packages/core/src/enhancers/time-travel/lib/time-travel.d.ts.map +1 -0
  1006. package/dist/enhancers/types/packages/core/src/enhancers/time-travel/lib/utils.d.ts +3 -0
  1007. package/dist/enhancers/types/packages/core/src/enhancers/time-travel/lib/utils.d.ts.map +1 -0
  1008. package/dist/enhancers/types/packages/core/src/enhancers/time-travel/test-setup.d.ts +2 -0
  1009. package/dist/enhancers/types/packages/core/src/enhancers/time-travel/test-setup.d.ts.map +1 -0
  1010. package/dist/enhancers/types/packages/core/src/enhancers/types.d.ts +112 -0
  1011. package/dist/enhancers/types/packages/core/src/enhancers/types.d.ts.map +1 -0
  1012. package/dist/enhancers/types/packages/core/src/index.d.ts +119 -0
  1013. package/dist/enhancers/types/packages/core/src/index.d.ts.map +1 -0
  1014. package/dist/enhancers/types/packages/core/src/lib/constants.d.ts +50 -0
  1015. package/dist/enhancers/types/packages/core/src/lib/constants.d.ts.map +1 -0
  1016. package/dist/enhancers/types/packages/core/src/lib/memory/memory-manager.d.ts +145 -0
  1017. package/dist/enhancers/types/packages/core/src/lib/memory/memory-manager.d.ts.map +1 -0
  1018. package/dist/enhancers/types/packages/core/src/lib/performance/diff-engine.d.ts +109 -0
  1019. package/dist/enhancers/types/packages/core/src/lib/performance/diff-engine.d.ts.map +1 -0
  1020. package/dist/enhancers/types/packages/core/src/lib/performance/path-index.d.ts +120 -0
  1021. package/dist/enhancers/types/packages/core/src/lib/performance/path-index.d.ts.map +1 -0
  1022. package/dist/enhancers/types/packages/core/src/lib/performance/update-engine.d.ts +116 -0
  1023. package/dist/enhancers/types/packages/core/src/lib/performance/update-engine.d.ts.map +1 -0
  1024. package/dist/enhancers/types/packages/core/src/lib/security/security-validator.d.ts +145 -0
  1025. package/dist/enhancers/types/packages/core/src/lib/security/security-validator.d.ts.map +1 -0
  1026. package/dist/enhancers/types/packages/core/src/lib/signal-tree.d.ts +17 -0
  1027. package/dist/enhancers/types/packages/core/src/lib/signal-tree.d.ts.map +1 -0
  1028. package/dist/enhancers/types/packages/core/src/lib/types.d.ts +299 -0
  1029. package/dist/enhancers/types/packages/core/src/lib/types.d.ts.map +1 -0
  1030. package/dist/enhancers/types/packages/core/src/lib/utils.d.ts +53 -0
  1031. package/dist/enhancers/types/packages/core/src/lib/utils.d.ts.map +1 -0
  1032. package/dist/index.cjs +4966 -0
  1033. package/dist/index.cjs.map +1 -0
  1034. package/dist/index.d.ts +1384 -0
  1035. package/dist/index.js +4900 -0
  1036. package/dist/index.js.map +1 -0
  1037. package/dist/types/packages/core/src/enhancers/batching/index.d.ts +2 -0
  1038. package/dist/types/packages/core/src/enhancers/batching/index.d.ts.map +1 -0
  1039. package/dist/types/packages/core/src/enhancers/batching/jest.config.d.ts +16 -0
  1040. package/dist/types/packages/core/src/enhancers/batching/jest.config.d.ts.map +1 -0
  1041. package/dist/types/packages/core/src/enhancers/batching/lib/batching.d.ts +262 -0
  1042. package/dist/types/packages/core/src/enhancers/batching/lib/batching.d.ts.map +1 -0
  1043. package/dist/types/packages/core/src/enhancers/batching/test-setup.d.ts +2 -0
  1044. package/dist/types/packages/core/src/enhancers/batching/test-setup.d.ts.map +1 -0
  1045. package/dist/types/packages/core/src/enhancers/computed/index.d.ts +2 -0
  1046. package/dist/types/packages/core/src/enhancers/computed/index.d.ts.map +1 -0
  1047. package/dist/types/packages/core/src/enhancers/computed/jest.config.d.ts +16 -0
  1048. package/dist/types/packages/core/src/enhancers/computed/jest.config.d.ts.map +1 -0
  1049. package/dist/types/packages/core/src/enhancers/computed/lib/computed.d.ts +68 -0
  1050. package/dist/types/packages/core/src/enhancers/computed/lib/computed.d.ts.map +1 -0
  1051. package/dist/types/packages/core/src/enhancers/devtools/index.d.ts +2 -0
  1052. package/dist/types/packages/core/src/enhancers/devtools/index.d.ts.map +1 -0
  1053. package/dist/types/packages/core/src/enhancers/devtools/jest.config.d.ts +16 -0
  1054. package/dist/types/packages/core/src/enhancers/devtools/jest.config.d.ts.map +1 -0
  1055. package/dist/types/packages/core/src/enhancers/devtools/lib/devtools.d.ts +129 -0
  1056. package/dist/types/packages/core/src/enhancers/devtools/lib/devtools.d.ts.map +1 -0
  1057. package/dist/types/packages/core/src/enhancers/devtools/test-setup.d.ts +2 -0
  1058. package/dist/types/packages/core/src/enhancers/devtools/test-setup.d.ts.map +1 -0
  1059. package/dist/types/packages/core/src/enhancers/entities/index.d.ts +2 -0
  1060. package/dist/types/packages/core/src/enhancers/entities/index.d.ts.map +1 -0
  1061. package/dist/types/packages/core/src/enhancers/entities/jest.config.d.ts +16 -0
  1062. package/dist/types/packages/core/src/enhancers/entities/jest.config.d.ts.map +1 -0
  1063. package/dist/types/packages/core/src/enhancers/entities/lib/entities.d.ts +39 -0
  1064. package/dist/types/packages/core/src/enhancers/entities/lib/entities.d.ts.map +1 -0
  1065. package/dist/types/packages/core/src/enhancers/entities/test-setup.d.ts +2 -0
  1066. package/dist/types/packages/core/src/enhancers/entities/test-setup.d.ts.map +1 -0
  1067. package/dist/types/packages/core/src/enhancers/index.d.ts +38 -0
  1068. package/dist/types/packages/core/src/enhancers/index.d.ts.map +1 -0
  1069. package/dist/types/packages/core/src/enhancers/memoization/index.d.ts +2 -0
  1070. package/dist/types/packages/core/src/enhancers/memoization/index.d.ts.map +1 -0
  1071. package/dist/types/packages/core/src/enhancers/memoization/jest.config.d.ts +16 -0
  1072. package/dist/types/packages/core/src/enhancers/memoization/jest.config.d.ts.map +1 -0
  1073. package/dist/types/packages/core/src/enhancers/memoization/lib/memoization.d.ts +190 -0
  1074. package/dist/types/packages/core/src/enhancers/memoization/lib/memoization.d.ts.map +1 -0
  1075. package/dist/types/packages/core/src/enhancers/memoization/test-setup.d.ts +2 -0
  1076. package/dist/types/packages/core/src/enhancers/memoization/test-setup.d.ts.map +1 -0
  1077. package/dist/types/packages/core/src/enhancers/middleware/index.d.ts +3 -0
  1078. package/dist/types/packages/core/src/enhancers/middleware/index.d.ts.map +1 -0
  1079. package/dist/types/packages/core/src/enhancers/middleware/jest.config.d.ts +16 -0
  1080. package/dist/types/packages/core/src/enhancers/middleware/jest.config.d.ts.map +1 -0
  1081. package/dist/types/packages/core/src/enhancers/middleware/lib/async-helpers.d.ts +16 -0
  1082. package/dist/types/packages/core/src/enhancers/middleware/lib/async-helpers.d.ts.map +1 -0
  1083. package/dist/types/packages/core/src/enhancers/middleware/lib/middleware.d.ts +43 -0
  1084. package/dist/types/packages/core/src/enhancers/middleware/lib/middleware.d.ts.map +1 -0
  1085. package/dist/types/packages/core/src/enhancers/middleware/test-setup.d.ts +2 -0
  1086. package/dist/types/packages/core/src/enhancers/middleware/test-setup.d.ts.map +1 -0
  1087. package/dist/types/packages/core/src/enhancers/presets/index.d.ts +2 -0
  1088. package/dist/types/packages/core/src/enhancers/presets/index.d.ts.map +1 -0
  1089. package/dist/types/packages/core/src/enhancers/presets/jest.config.d.ts +16 -0
  1090. package/dist/types/packages/core/src/enhancers/presets/jest.config.d.ts.map +1 -0
  1091. package/dist/types/packages/core/src/enhancers/presets/lib/presets.d.ts +69 -0
  1092. package/dist/types/packages/core/src/enhancers/presets/lib/presets.d.ts.map +1 -0
  1093. package/dist/types/packages/core/src/enhancers/presets/test-setup.d.ts +2 -0
  1094. package/dist/types/packages/core/src/enhancers/presets/test-setup.d.ts.map +1 -0
  1095. package/dist/types/packages/core/src/enhancers/serialization/constants.d.ts +19 -0
  1096. package/dist/types/packages/core/src/enhancers/serialization/constants.d.ts.map +1 -0
  1097. package/dist/types/packages/core/src/enhancers/serialization/index.d.ts +3 -0
  1098. package/dist/types/packages/core/src/enhancers/serialization/index.d.ts.map +1 -0
  1099. package/dist/types/packages/core/src/enhancers/serialization/jest.config.d.ts +16 -0
  1100. package/dist/types/packages/core/src/enhancers/serialization/jest.config.d.ts.map +1 -0
  1101. package/dist/types/packages/core/src/enhancers/serialization/lib/serialization.d.ts +186 -0
  1102. package/dist/types/packages/core/src/enhancers/serialization/lib/serialization.d.ts.map +1 -0
  1103. package/dist/types/packages/core/src/enhancers/serialization/test-setup.d.ts +2 -0
  1104. package/dist/types/packages/core/src/enhancers/serialization/test-setup.d.ts.map +1 -0
  1105. package/dist/types/packages/core/src/enhancers/time-travel/index.d.ts +2 -0
  1106. package/dist/types/packages/core/src/enhancers/time-travel/index.d.ts.map +1 -0
  1107. package/dist/types/packages/core/src/enhancers/time-travel/jest.config.d.ts +16 -0
  1108. package/dist/types/packages/core/src/enhancers/time-travel/jest.config.d.ts.map +1 -0
  1109. package/dist/types/packages/core/src/enhancers/time-travel/lib/time-travel.d.ts +145 -0
  1110. package/dist/types/packages/core/src/enhancers/time-travel/lib/time-travel.d.ts.map +1 -0
  1111. package/dist/types/packages/core/src/enhancers/time-travel/lib/utils.d.ts +3 -0
  1112. package/dist/types/packages/core/src/enhancers/time-travel/lib/utils.d.ts.map +1 -0
  1113. package/dist/types/packages/core/src/enhancers/time-travel/test-setup.d.ts +2 -0
  1114. package/dist/types/packages/core/src/enhancers/time-travel/test-setup.d.ts.map +1 -0
  1115. package/dist/types/packages/core/src/enhancers/types.d.ts +112 -0
  1116. package/dist/types/packages/core/src/enhancers/types.d.ts.map +1 -0
  1117. package/dist/types/packages/core/src/index.d.ts +119 -0
  1118. package/dist/types/packages/core/src/index.d.ts.map +1 -0
  1119. package/dist/types/packages/core/src/lib/constants.d.ts +50 -0
  1120. package/dist/types/packages/core/src/lib/constants.d.ts.map +1 -0
  1121. package/dist/types/packages/core/src/lib/memory/memory-manager.d.ts +145 -0
  1122. package/dist/types/packages/core/src/lib/memory/memory-manager.d.ts.map +1 -0
  1123. package/dist/types/packages/core/src/lib/performance/diff-engine.d.ts +109 -0
  1124. package/dist/types/packages/core/src/lib/performance/diff-engine.d.ts.map +1 -0
  1125. package/dist/types/packages/core/src/lib/performance/path-index.d.ts +120 -0
  1126. package/dist/types/packages/core/src/lib/performance/path-index.d.ts.map +1 -0
  1127. package/dist/types/packages/core/src/lib/performance/update-engine.d.ts +116 -0
  1128. package/dist/types/packages/core/src/lib/performance/update-engine.d.ts.map +1 -0
  1129. package/dist/types/packages/core/src/lib/security/security-validator.d.ts +145 -0
  1130. package/dist/types/packages/core/src/lib/security/security-validator.d.ts.map +1 -0
  1131. package/dist/types/packages/core/src/lib/signal-tree.d.ts +17 -0
  1132. package/dist/types/packages/core/src/lib/signal-tree.d.ts.map +1 -0
  1133. package/dist/types/packages/core/src/lib/types.d.ts +299 -0
  1134. package/dist/types/packages/core/src/lib/types.d.ts.map +1 -0
  1135. package/dist/types/packages/core/src/lib/utils.d.ts +53 -0
  1136. package/dist/types/packages/core/src/lib/utils.d.ts.map +1 -0
  1137. package/package.json +2 -2
package/dist/index.cjs ADDED
@@ -0,0 +1,4966 @@
1
+ 'use strict';
2
+
3
+ var core = require('@angular/core');
4
+ var shared = require('@signaltree/shared');
5
+
6
+ /**
7
+ * SignalTree Constants
8
+ * Centralized configuration values and messages
9
+ */
10
+ const SIGNAL_TREE_CONSTANTS = {
11
+ /** Cache configuration */
12
+ MAX_PATH_CACHE_SIZE: shared.DEFAULT_PATH_CACHE_SIZE,
13
+ /** Performance thresholds */
14
+ LAZY_THRESHOLD: 50,
15
+ ESTIMATE_MAX_DEPTH: 3,
16
+ ESTIMATE_SAMPLE_SIZE_ARRAY: 3,
17
+ ESTIMATE_SAMPLE_SIZE_OBJECT: 5,
18
+ /** Default values */
19
+ DEFAULT_CACHE_SIZE: 100,
20
+ DEFAULT_BATCH_SIZE: 10,
21
+ };
22
+ // Full developer-facing messages
23
+ const DEV_MESSAGES = {
24
+ NULL_OR_UNDEFINED: 'null/undefined',
25
+ CIRCULAR_REF: 'circular ref',
26
+ UPDATER_INVALID: 'updater invalid',
27
+ LAZY_FALLBACK: 'lazy fallback',
28
+ SIGNAL_CREATION_FAILED: 'signal creation failed',
29
+ UPDATE_PATH_NOT_FOUND: 'update path not found',
30
+ UPDATE_FAILED: 'update failed',
31
+ ROLLBACK_FAILED: 'rollback failed',
32
+ CLEANUP_ERROR: 'cleanup error',
33
+ PRESET_UNKNOWN: 'unknown preset',
34
+ STRATEGY_SELECTION: 'strategy select',
35
+ TREE_DESTROYED: 'destroyed',
36
+ UPDATE_TRANSACTION: 'update tx',
37
+ BATCH_NOT_ENABLED: 'batching disabled',
38
+ MEMOIZE_NOT_ENABLED: 'memoize disabled',
39
+ MIDDLEWARE_NOT_AVAILABLE: 'middleware missing',
40
+ ENTITY_HELPERS_NOT_AVAILABLE: 'entity helpers missing',
41
+ ASYNC_ACTIONS_NOT_AVAILABLE: 'async actions missing',
42
+ TIME_TRAVEL_NOT_AVAILABLE: 'time travel missing',
43
+ OPTIMIZE_NOT_AVAILABLE: 'optimize missing',
44
+ UPDATE_OPTIMIZED_NOT_AVAILABLE: 'update optimized missing',
45
+ CACHE_NOT_AVAILABLE: 'cache missing',
46
+ PERFORMANCE_NOT_ENABLED: 'performance disabled',
47
+ ENHANCER_ORDER_FAILED: 'enhancer order failed',
48
+ ENHANCER_CYCLE_DETECTED: 'enhancer cycle',
49
+ ENHANCER_REQUIREMENT_MISSING: 'enhancer req missing',
50
+ ENHANCER_PROVIDES_MISSING: 'enhancer provides missing',
51
+ ENHANCER_FAILED: 'enhancer failed',
52
+ ENHANCER_NOT_FUNCTION: 'enhancer not function',
53
+ EFFECT_NO_CONTEXT: 'no angular context',
54
+ SUBSCRIBE_NO_CONTEXT: 'no angular context',
55
+ };
56
+ // Compact production messages (very short numeric codes) to keep bundles minimal.
57
+ // We map each key to a short numeric string like '0','1','2' to minimize bytes.
58
+ const PROD_MESSAGES = (() => {
59
+ const out = {};
60
+ let i = 0;
61
+ for (const k of Object.keys(DEV_MESSAGES)) {
62
+ out[k] = String(i++);
63
+ }
64
+ return out;
65
+ })();
66
+ // Avoid referencing the bare `process` identifier to keep builds free of Node
67
+ // type assumptions; use globalThis to check env when available.
68
+ const _isProdByEnv = Boolean(typeof globalThis === 'object' &&
69
+ globalThis !== null &&
70
+ 'process' in globalThis &&
71
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
72
+ typeof globalThis.process === 'object' &&
73
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
74
+ 'env' in globalThis.process &&
75
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
76
+ globalThis.process.env.NODE_ENV === 'production');
77
+ const _isDev = typeof ngDevMode !== 'undefined' ? Boolean(ngDevMode) : !_isProdByEnv;
78
+ const SIGNAL_TREE_MESSAGES = Object.freeze(_isDev
79
+ ? DEV_MESSAGES
80
+ : PROD_MESSAGES);
81
+
82
+ /** Symbol key for enhancer metadata */
83
+ const ENHANCER_META = Symbol('signaltree:enhancer:meta');
84
+
85
+ /**
86
+ * Helper to create an enhancer with metadata attached
87
+ *
88
+ * @param meta - Metadata describing the enhancer
89
+ * @param enhancerFn - The enhancer function
90
+ * @returns Enhancer function with metadata attached
91
+ *
92
+ * @example
93
+ * ```typescript
94
+ * const myEnhancer = createEnhancer(
95
+ * {
96
+ * name: 'myEnhancer',
97
+ * provides: ['feature1'],
98
+ * requires: ['feature2']
99
+ * },
100
+ * (tree) => {
101
+ * // Enhance the tree
102
+ * return { ...tree, feature1: true };
103
+ * }
104
+ * );
105
+ * ```
106
+ */
107
+ function createEnhancer(meta, enhancerFn) {
108
+ const fn = enhancerFn;
109
+ try {
110
+ fn.metadata = meta;
111
+ // Also attach under symbol for third-party compatibility
112
+ try {
113
+ fn[ENHANCER_META] = meta;
114
+ }
115
+ catch {
116
+ // Ignore if property can't be set
117
+ }
118
+ }
119
+ catch {
120
+ // Ignore errors
121
+ }
122
+ return fn;
123
+ }
124
+ /**
125
+ * Resolve enhancer order using topological sort based on dependencies
126
+ *
127
+ * @param enhancers - Array of enhancers to order
128
+ * @param availableCapabilities - Set of already available capabilities
129
+ * @param debugMode - Whether to log debug information
130
+ * @returns Ordered array of enhancers
131
+ */
132
+ function resolveEnhancerOrder(enhancers, availableCapabilities = new Set(), debugMode = false) {
133
+ // Build nodes with metadata
134
+ const nodes = enhancers.map((e, idx) => ({
135
+ fn: e,
136
+ name: e.metadata && e.metadata.name
137
+ ? String(e.metadata.name)
138
+ : `enhancer#${idx}`,
139
+ requires: new Set(e.metadata?.requires ?? []),
140
+ provides: new Set(e.metadata?.provides ?? []),
141
+ }));
142
+ // Build dependency graph
143
+ const adj = new Map();
144
+ const nameToNode = new Map();
145
+ for (const n of nodes) {
146
+ nameToNode.set(n.name, n);
147
+ adj.set(n.name, new Set());
148
+ }
149
+ // Create edges based on requirements
150
+ for (const a of nodes) {
151
+ for (const b of nodes) {
152
+ if (a === b)
153
+ continue;
154
+ for (const req of b.requires) {
155
+ // Skip if requirement is already satisfied
156
+ if (availableCapabilities.has(req))
157
+ continue;
158
+ if (a.provides.has(req)) {
159
+ // a must come before b
160
+ const set = adj.get(a.name);
161
+ if (set)
162
+ set.add(b.name);
163
+ }
164
+ }
165
+ }
166
+ }
167
+ // Kahn's algorithm for topological sort
168
+ const inDegree = new Map();
169
+ for (const entry of adj.keys())
170
+ inDegree.set(entry, 0);
171
+ for (const [, outs] of adj) {
172
+ for (const to of outs)
173
+ inDegree.set(to, (inDegree.get(to) || 0) + 1);
174
+ }
175
+ const queue = [];
176
+ for (const [name, deg] of inDegree.entries()) {
177
+ if (deg === 0)
178
+ queue.push(name);
179
+ }
180
+ const ordered = [];
181
+ while (queue.length > 0) {
182
+ const n = queue.shift();
183
+ if (!n)
184
+ break;
185
+ ordered.push(n);
186
+ const outs = adj.get(n);
187
+ if (!outs)
188
+ continue;
189
+ for (const m of outs) {
190
+ inDegree.set(m, (inDegree.get(m) || 0) - 1);
191
+ if (inDegree.get(m) === 0)
192
+ queue.push(m);
193
+ }
194
+ }
195
+ // Check for cycles
196
+ if (ordered.length !== nodes.length) {
197
+ if (debugMode) {
198
+ console.warn(SIGNAL_TREE_MESSAGES.ENHANCER_CYCLE_DETECTED);
199
+ }
200
+ return enhancers;
201
+ }
202
+ // Map ordered names back to enhancer functions
203
+ return ordered.map((name) => {
204
+ const n = nameToNode.get(name);
205
+ return (n ? n.fn : enhancers[0]);
206
+ });
207
+ }
208
+
209
+ /**
210
+ * Memory Manager for SignalTree
211
+ * Provides automatic cleanup and memory leak prevention for lazy-loaded signal trees
212
+ * @packageDocumentation
213
+ */
214
+ /**
215
+ * SignalMemoryManager
216
+ *
217
+ * Manages memory for lazy-loaded signal trees using WeakRef and FinalizationRegistry.
218
+ * Provides automatic cleanup when signals are no longer referenced, preventing memory leaks.
219
+ *
220
+ * Features:
221
+ * - WeakRef caches allow garbage collection when signals are unused
222
+ * - FinalizationRegistry automatically cleans up after GC
223
+ * - Stats API for memory profiling and monitoring
224
+ * - Manual dispose() for explicit cleanup
225
+ *
226
+ * @example
227
+ * ```ts
228
+ * const manager = new SignalMemoryManager({
229
+ * enableAutoCleanup: true,
230
+ * onCleanup: (path, stats) => {
231
+ * console.log(`Cleaned up signal at ${path}`, stats);
232
+ * }
233
+ * });
234
+ *
235
+ * // Cache a signal
236
+ * manager.cacheSignal('user.name', nameSignal);
237
+ *
238
+ * // Get cached signal (returns undefined if GC'd)
239
+ * const signal = manager.getSignal('user.name');
240
+ *
241
+ * // Get memory stats
242
+ * const stats = manager.getStats();
243
+ * console.log(`Memory: ${stats.estimatedMemoryBytes} bytes`);
244
+ *
245
+ * // Dispose all cached signals
246
+ * manager.dispose();
247
+ * ```
248
+ */
249
+ class SignalMemoryManager {
250
+ cache = new Map();
251
+ registry = null;
252
+ config;
253
+ // Statistics
254
+ stats = {
255
+ cleanedUpSignals: 0,
256
+ peakCachedSignals: 0,
257
+ manualDisposes: 0,
258
+ };
259
+ constructor(config = {}) {
260
+ this.config = {
261
+ enableAutoCleanup: config.enableAutoCleanup ?? true,
262
+ debugMode: config.debugMode ?? false,
263
+ onCleanup: config.onCleanup ??
264
+ (() => {
265
+ // Default no-op
266
+ }),
267
+ };
268
+ // Set up FinalizationRegistry for automatic cleanup
269
+ if (this.config.enableAutoCleanup &&
270
+ typeof FinalizationRegistry !== 'undefined') {
271
+ this.registry = new FinalizationRegistry((path) => {
272
+ this.handleCleanup(path);
273
+ });
274
+ }
275
+ if (this.config.debugMode) {
276
+ console.log('[SignalMemoryManager] Initialized', {
277
+ autoCleanup: this.config.enableAutoCleanup,
278
+ hasRegistry: !!this.registry,
279
+ });
280
+ }
281
+ }
282
+ /**
283
+ * Cache a signal with WeakRef for automatic garbage collection
284
+ *
285
+ * @param path - Dot-notation path to the signal
286
+ * @param signal - The signal to cache
287
+ */
288
+ cacheSignal(path, signal) {
289
+ // Create WeakRef to allow GC
290
+ const ref = new WeakRef(signal);
291
+ // Store in cache
292
+ const entry = {
293
+ ref,
294
+ path,
295
+ cachedAt: Date.now(),
296
+ };
297
+ this.cache.set(path, entry);
298
+ // Register for automatic cleanup
299
+ if (this.registry) {
300
+ this.registry.register(signal, path, signal);
301
+ }
302
+ // Update peak stats
303
+ const currentSize = this.cache.size;
304
+ if (currentSize > this.stats.peakCachedSignals) {
305
+ this.stats.peakCachedSignals = currentSize;
306
+ }
307
+ if (this.config.debugMode) {
308
+ console.log(`[SignalMemoryManager] Cached signal: ${path}`, {
309
+ cacheSize: currentSize,
310
+ peak: this.stats.peakCachedSignals,
311
+ });
312
+ }
313
+ }
314
+ /**
315
+ * Get a cached signal
316
+ * Returns undefined if the signal has been garbage collected
317
+ *
318
+ * @param path - Dot-notation path to the signal
319
+ * @returns The signal or undefined if GC'd
320
+ */
321
+ getSignal(path) {
322
+ const entry = this.cache.get(path);
323
+ if (!entry) {
324
+ return undefined;
325
+ }
326
+ // Try to dereference the WeakRef
327
+ const signal = entry.ref.deref();
328
+ if (!signal) {
329
+ // Signal was garbage collected, remove from cache
330
+ this.cache.delete(path);
331
+ if (this.config.debugMode) {
332
+ console.log(`[SignalMemoryManager] Signal GC'd: ${path}`);
333
+ }
334
+ return undefined;
335
+ }
336
+ return signal;
337
+ }
338
+ /**
339
+ * Check if a signal is cached (even if potentially GC'd)
340
+ *
341
+ * @param path - Dot-notation path to the signal
342
+ * @returns true if the path exists in cache
343
+ */
344
+ hasSignal(path) {
345
+ return this.cache.has(path);
346
+ }
347
+ /**
348
+ * Remove a signal from the cache
349
+ *
350
+ * @param path - Dot-notation path to the signal
351
+ * @returns true if the signal was removed
352
+ */
353
+ removeSignal(path) {
354
+ const entry = this.cache.get(path);
355
+ if (!entry) {
356
+ return false;
357
+ }
358
+ // Unregister from FinalizationRegistry
359
+ const signal = entry.ref.deref();
360
+ if (signal && this.registry) {
361
+ this.registry.unregister(signal);
362
+ }
363
+ this.cache.delete(path);
364
+ if (this.config.debugMode) {
365
+ console.log(`[SignalMemoryManager] Removed signal: ${path}`);
366
+ }
367
+ return true;
368
+ }
369
+ /**
370
+ * Handle automatic cleanup from FinalizationRegistry
371
+ * @private
372
+ */
373
+ handleCleanup(path) {
374
+ this.cache.delete(path);
375
+ this.stats.cleanedUpSignals++;
376
+ const currentStats = this.getStats();
377
+ if (this.config.debugMode) {
378
+ console.log(`[SignalMemoryManager] Auto cleanup: ${path}`, currentStats);
379
+ }
380
+ this.config.onCleanup(path, currentStats);
381
+ }
382
+ /**
383
+ * Get current memory statistics
384
+ *
385
+ * @returns Current memory stats
386
+ */
387
+ getStats() {
388
+ // Clean up stale entries (where WeakRef.deref() returns undefined)
389
+ let validSignals = 0;
390
+ for (const [path, entry] of this.cache.entries()) {
391
+ if (entry.ref.deref()) {
392
+ validSignals++;
393
+ }
394
+ else {
395
+ // Remove stale entry
396
+ this.cache.delete(path);
397
+ }
398
+ }
399
+ // Rough estimate: each signal ~100 bytes (very approximate)
400
+ const estimatedMemoryBytes = validSignals * 100;
401
+ return {
402
+ cachedSignals: validSignals,
403
+ cleanedUpSignals: this.stats.cleanedUpSignals,
404
+ peakCachedSignals: this.stats.peakCachedSignals,
405
+ manualDisposes: this.stats.manualDisposes,
406
+ estimatedMemoryBytes,
407
+ };
408
+ }
409
+ /**
410
+ * Dispose all cached signals and clean up resources
411
+ * Call this when destroying a SignalTree to prevent memory leaks
412
+ */
413
+ dispose() {
414
+ if (this.config.debugMode) {
415
+ console.log('[SignalMemoryManager] Disposing', {
416
+ cachedSignals: this.cache.size,
417
+ });
418
+ }
419
+ // Unregister all signals from FinalizationRegistry
420
+ if (this.registry) {
421
+ for (const entry of this.cache.values()) {
422
+ const signal = entry.ref.deref();
423
+ if (signal) {
424
+ this.registry.unregister(signal);
425
+ }
426
+ }
427
+ }
428
+ // Clear cache
429
+ this.cache.clear();
430
+ this.stats.manualDisposes++;
431
+ if (this.config.debugMode) {
432
+ console.log('[SignalMemoryManager] Disposed', this.getStats());
433
+ }
434
+ }
435
+ /**
436
+ * Get all cached signal paths (for debugging)
437
+ *
438
+ * @returns Array of cached signal paths
439
+ */
440
+ getCachedPaths() {
441
+ const paths = [];
442
+ for (const [path, entry] of this.cache.entries()) {
443
+ // Only include if signal is still alive
444
+ if (entry.ref.deref()) {
445
+ paths.push(path);
446
+ }
447
+ }
448
+ return paths;
449
+ }
450
+ /**
451
+ * Clear all stale entries (where signals have been GC'd)
452
+ * Useful for freeing up cache Map memory
453
+ *
454
+ * @returns Number of stale entries removed
455
+ */
456
+ clearStale() {
457
+ let removed = 0;
458
+ for (const [path, entry] of this.cache.entries()) {
459
+ if (!entry.ref.deref()) {
460
+ this.cache.delete(path);
461
+ removed++;
462
+ }
463
+ }
464
+ if (this.config.debugMode && removed > 0) {
465
+ console.log(`[SignalMemoryManager] Cleared ${removed} stale entries`);
466
+ }
467
+ return removed;
468
+ }
469
+ /**
470
+ * Reset all statistics
471
+ */
472
+ resetStats() {
473
+ this.stats = {
474
+ cleanedUpSignals: 0,
475
+ peakCachedSignals: 0,
476
+ manualDisposes: 0,
477
+ };
478
+ if (this.config.debugMode) {
479
+ console.log('[SignalMemoryManager] Stats reset');
480
+ }
481
+ }
482
+ }
483
+
484
+ /**
485
+ * DiffEngine - Efficient change detection for tree updates
486
+ * @packageDocumentation
487
+ */
488
+ /**
489
+ * Type of change detected
490
+ */
491
+ var ChangeType;
492
+ (function (ChangeType) {
493
+ ChangeType["ADD"] = "add";
494
+ ChangeType["UPDATE"] = "update";
495
+ ChangeType["DELETE"] = "delete";
496
+ ChangeType["REPLACE"] = "replace";
497
+ })(ChangeType || (ChangeType = {}));
498
+ /**
499
+ * DiffEngine
500
+ *
501
+ * Efficiently detects changes between two objects to minimize unnecessary updates.
502
+ *
503
+ * Features:
504
+ * - Deep object comparison
505
+ * - Circular reference detection
506
+ * - Configurable equality checking
507
+ * - Array diffing (ordered and unordered)
508
+ * - Path tracking for precise updates
509
+ *
510
+ * @example
511
+ * ```ts
512
+ * const engine = new DiffEngine();
513
+ *
514
+ * const current = { user: { name: 'Alice', age: 30 } };
515
+ * const updates = { user: { name: 'Alice', age: 31 } };
516
+ *
517
+ * const diff = engine.diff(current, updates);
518
+ *
519
+ * console.log(diff.changes);
520
+ * // [{ type: 'update', path: ['user', 'age'], value: 31, oldValue: 30 }]
521
+ * ```
522
+ */
523
+ class DiffEngine {
524
+ defaultOptions = {
525
+ maxDepth: 100,
526
+ detectDeletions: false,
527
+ ignoreArrayOrder: false,
528
+ equalityFn: (a, b) => a === b,
529
+ keyValidator: undefined,
530
+ };
531
+ /**
532
+ * Diff two objects and return changes
533
+ *
534
+ * @param current - Current state
535
+ * @param updates - Updated state
536
+ * @param options - Diff options
537
+ * @returns Diff result with all changes
538
+ */
539
+ diff(current, updates, options = {}) {
540
+ const opts = { ...this.defaultOptions, ...options };
541
+ const changes = [];
542
+ const visited = new WeakSet();
543
+ this.traverse(current, updates, [], changes, visited, opts, 0);
544
+ return {
545
+ changes,
546
+ hasChanges: changes.length > 0,
547
+ };
548
+ }
549
+ /**
550
+ * Traverse and compare objects recursively
551
+ */
552
+ traverse(curr, upd, path, changes, visited, opts, depth) {
553
+ // Depth limit
554
+ if (depth > opts.maxDepth) {
555
+ return;
556
+ }
557
+ // Handle primitives
558
+ if (typeof upd !== 'object' || upd === null) {
559
+ if (!opts.equalityFn(curr, upd)) {
560
+ changes.push({
561
+ type: curr === undefined ? ChangeType.ADD : ChangeType.UPDATE,
562
+ path: [...path],
563
+ value: upd,
564
+ oldValue: curr,
565
+ });
566
+ }
567
+ return;
568
+ }
569
+ // Circular reference detection
570
+ if (visited.has(upd)) {
571
+ return;
572
+ }
573
+ visited.add(upd);
574
+ // Handle arrays
575
+ if (Array.isArray(upd)) {
576
+ this.diffArrays(curr, upd, path, changes, visited, opts, depth);
577
+ return;
578
+ }
579
+ // Handle objects
580
+ if (!curr || typeof curr !== 'object' || Array.isArray(curr)) {
581
+ // Type mismatch - replace entire subtree
582
+ changes.push({
583
+ type: ChangeType.REPLACE,
584
+ path: [...path],
585
+ value: upd,
586
+ oldValue: curr,
587
+ });
588
+ return;
589
+ }
590
+ // Diff object properties
591
+ const currObj = curr;
592
+ const updObj = upd;
593
+ for (const key in updObj) {
594
+ if (Object.prototype.hasOwnProperty.call(updObj, key)) {
595
+ // Validate key for security (e.g., prevent prototype pollution)
596
+ if (opts.keyValidator && !opts.keyValidator(key)) {
597
+ // Skip dangerous keys silently
598
+ continue;
599
+ }
600
+ this.traverse(currObj[key], updObj[key], [...path, key], changes, visited, opts, depth + 1);
601
+ }
602
+ }
603
+ // Check for deletions if enabled
604
+ if (opts.detectDeletions) {
605
+ for (const key in currObj) {
606
+ if (Object.prototype.hasOwnProperty.call(currObj, key) &&
607
+ !(key in updObj)) {
608
+ changes.push({
609
+ type: ChangeType.DELETE,
610
+ path: [...path, key],
611
+ oldValue: currObj[key],
612
+ });
613
+ }
614
+ }
615
+ }
616
+ }
617
+ /**
618
+ * Diff arrays
619
+ */
620
+ diffArrays(curr, upd, path, changes, visited, opts, depth) {
621
+ if (!Array.isArray(curr)) {
622
+ // Not an array - replace
623
+ changes.push({
624
+ type: ChangeType.REPLACE,
625
+ path: [...path],
626
+ value: upd,
627
+ oldValue: curr,
628
+ });
629
+ return;
630
+ }
631
+ if (opts.ignoreArrayOrder) {
632
+ this.diffArraysUnordered(curr, upd, path, changes, opts);
633
+ }
634
+ else {
635
+ this.diffArraysOrdered(curr, upd, path, changes, visited, opts, depth);
636
+ }
637
+ }
638
+ /**
639
+ * Diff arrays in order (index-based)
640
+ */
641
+ diffArraysOrdered(curr, upd, path, changes, visited, opts, depth) {
642
+ // Check each index
643
+ const maxLength = Math.max(curr.length, upd.length);
644
+ for (let i = 0; i < maxLength; i++) {
645
+ if (i >= upd.length) {
646
+ // Deletion (if enabled)
647
+ if (opts.detectDeletions) {
648
+ changes.push({
649
+ type: ChangeType.DELETE,
650
+ path: [...path, i],
651
+ oldValue: curr[i],
652
+ });
653
+ }
654
+ }
655
+ else if (i >= curr.length) {
656
+ // Addition
657
+ changes.push({
658
+ type: ChangeType.ADD,
659
+ path: [...path, i],
660
+ value: upd[i],
661
+ });
662
+ }
663
+ else {
664
+ // Potential update
665
+ this.traverse(curr[i], upd[i], [...path, i], changes, visited, opts, depth + 1);
666
+ }
667
+ }
668
+ }
669
+ /**
670
+ * Diff arrays ignoring order (value-based)
671
+ */
672
+ diffArraysUnordered(curr, upd, path, changes, opts) {
673
+ // Build value sets
674
+ const currSet = new Set(curr.map((v) => this.stringify(v)));
675
+ const updSet = new Set(upd.map((v) => this.stringify(v)));
676
+ // Find additions
677
+ upd.forEach((value, index) => {
678
+ const str = this.stringify(value);
679
+ if (!currSet.has(str)) {
680
+ changes.push({
681
+ type: ChangeType.ADD,
682
+ path: [...path, index],
683
+ value,
684
+ });
685
+ }
686
+ });
687
+ // Find deletions (if enabled)
688
+ if (opts.detectDeletions) {
689
+ curr.forEach((value, index) => {
690
+ const str = this.stringify(value);
691
+ if (!updSet.has(str)) {
692
+ changes.push({
693
+ type: ChangeType.DELETE,
694
+ path: [...path, index],
695
+ oldValue: value,
696
+ });
697
+ }
698
+ });
699
+ }
700
+ }
701
+ /**
702
+ * Stringify value for set comparison
703
+ */
704
+ stringify(value) {
705
+ try {
706
+ return JSON.stringify(value);
707
+ }
708
+ catch {
709
+ return String(value);
710
+ }
711
+ }
712
+ }
713
+
714
+ /**
715
+ * Node in the Trie structure
716
+ */
717
+ class TrieNode {
718
+ value = null;
719
+ children = new Map();
720
+ }
721
+ /**
722
+ * PathIndex
723
+ *
724
+ * Fast signal lookup using a Trie (prefix tree) data structure.
725
+ * Provides O(k) lookup time where k is the path length, regardless of total signals.
726
+ *
727
+ * Features:
728
+ * - Trie-based indexing for O(k) lookup
729
+ * - WeakRef caching for memory efficiency
730
+ * - Automatic cleanup of stale references
731
+ * - Prefix matching for batch operations
732
+ * - Path normalization
733
+ *
734
+ * @example
735
+ * ```ts
736
+ * const index = new PathIndex();
737
+ *
738
+ * // Index signals
739
+ * index.set(['user', 'name'], nameSignal);
740
+ * index.set(['user', 'email'], emailSignal);
741
+ *
742
+ * // Fast lookup
743
+ * const signal = index.get(['user', 'name']);
744
+ *
745
+ * // Prefix matching
746
+ * const userSignals = index.getByPrefix(['user']);
747
+ * // Returns: { name: nameSignal, email: emailSignal }
748
+ *
749
+ * // Check if path exists
750
+ * if (index.has(['user', 'name'])) {
751
+ * // ...
752
+ * }
753
+ * ```
754
+ */
755
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
756
+ class PathIndex {
757
+ root = new TrieNode();
758
+ pathCache = new Map();
759
+ stats = {
760
+ hits: 0,
761
+ misses: 0,
762
+ sets: 0,
763
+ cleanups: 0,
764
+ };
765
+ /**
766
+ * Set a value at the given path
767
+ *
768
+ * @param path - Path segments
769
+ * @param value - Value to store
770
+ */
771
+ set(path, signal) {
772
+ const pathStr = this.pathToString(path);
773
+ const ref = new WeakRef(signal);
774
+ // Update trie
775
+ let node = this.root;
776
+ for (const segment of path) {
777
+ const key = String(segment);
778
+ if (!node.children.has(key)) {
779
+ node.children.set(key, new TrieNode());
780
+ }
781
+ const nextNode = node.children.get(key);
782
+ if (!nextNode) {
783
+ throw new Error(`Failed to get node for key: ${key}`);
784
+ }
785
+ node = nextNode;
786
+ }
787
+ node.value = ref;
788
+ // Update cache for fast string lookups
789
+ this.pathCache.set(pathStr, ref);
790
+ this.stats.sets++;
791
+ }
792
+ /**
793
+ * Get value at the given path
794
+ *
795
+ * @param path - Path segments
796
+ * @returns Value if found and not GC'd, null otherwise
797
+ */
798
+ get(path) {
799
+ const pathStr = this.pathToString(path);
800
+ // Try cache first
801
+ const cached = this.pathCache.get(pathStr);
802
+ if (cached) {
803
+ const value = cached.deref();
804
+ if (value) {
805
+ this.stats.hits++;
806
+ return value;
807
+ }
808
+ // Clean up dead reference
809
+ this.pathCache.delete(pathStr);
810
+ this.stats.cleanups++;
811
+ }
812
+ // Try trie
813
+ let node = this.root;
814
+ for (const segment of path) {
815
+ const key = String(segment);
816
+ node = node.children.get(key);
817
+ if (!node) {
818
+ this.stats.misses++;
819
+ return null;
820
+ }
821
+ }
822
+ if (node.value) {
823
+ const value = node.value.deref();
824
+ if (value) {
825
+ // Re-cache for next time
826
+ this.pathCache.set(pathStr, node.value);
827
+ this.stats.hits++;
828
+ return value;
829
+ }
830
+ // Clean up dead reference
831
+ node.value = null;
832
+ this.stats.cleanups++;
833
+ }
834
+ this.stats.misses++;
835
+ return null;
836
+ }
837
+ /**
838
+ * Check if path exists in index
839
+ *
840
+ * @param path - Path segments
841
+ * @returns True if path exists and value is not GC'd
842
+ */
843
+ has(path) {
844
+ return this.get(path) !== null;
845
+ }
846
+ /**
847
+ * Get all values matching a prefix
848
+ *
849
+ * @param prefix - Path prefix
850
+ * @returns Map of relative paths to values
851
+ */
852
+ getByPrefix(prefix) {
853
+ const results = new Map();
854
+ // Find the node at prefix
855
+ let node = this.root;
856
+ for (const segment of prefix) {
857
+ const key = String(segment);
858
+ node = node.children.get(key);
859
+ if (!node) {
860
+ return results; // Empty map
861
+ }
862
+ }
863
+ // Collect all descendants
864
+ this.collectDescendants(node, [], results);
865
+ return results;
866
+ }
867
+ /**
868
+ * Delete value at path
869
+ *
870
+ * @param path - Path segments
871
+ * @returns True if deleted, false if not found
872
+ */
873
+ delete(path) {
874
+ const pathStr = this.pathToString(path);
875
+ // Remove from cache
876
+ this.pathCache.delete(pathStr);
877
+ // Remove from trie
878
+ let node = this.root;
879
+ const nodes = [node];
880
+ for (const segment of path) {
881
+ const key = String(segment);
882
+ node = node.children.get(key);
883
+ if (!node) {
884
+ return false;
885
+ }
886
+ nodes.push(node);
887
+ }
888
+ // Clear value
889
+ const hadValue = node.value !== null;
890
+ node.value = null;
891
+ // Clean up empty nodes (from leaf to root)
892
+ for (let i = nodes.length - 1; i > 0; i--) {
893
+ const current = nodes[i];
894
+ if (current.value === null && current.children.size === 0) {
895
+ const parent = nodes[i - 1];
896
+ const segment = path[i - 1];
897
+ parent.children.delete(String(segment));
898
+ }
899
+ else {
900
+ break; // Stop if node has value or children
901
+ }
902
+ }
903
+ return hadValue;
904
+ }
905
+ /**
906
+ * Clear all entries
907
+ */
908
+ clear() {
909
+ this.root = new TrieNode();
910
+ this.pathCache.clear();
911
+ }
912
+ /**
913
+ * Get statistics
914
+ *
915
+ * @returns Index statistics
916
+ */
917
+ getStats() {
918
+ const total = this.stats.hits + this.stats.misses;
919
+ const hitRate = total > 0 ? this.stats.hits / total : 0;
920
+ return {
921
+ ...this.stats,
922
+ hitRate,
923
+ cacheSize: this.pathCache.size,
924
+ };
925
+ }
926
+ /**
927
+ * Build index from a tree structure
928
+ *
929
+ * @param tree - Tree object to index
930
+ * @param path - Current path (for recursion)
931
+ */
932
+ buildFromTree(tree, path = []) {
933
+ if (!tree) {
934
+ return;
935
+ }
936
+ // Check if it's a signal using Angular's isSignal
937
+ if (core.isSignal(tree)) {
938
+ this.set(path, tree);
939
+ return;
940
+ }
941
+ // Only continue if it's an object (not a signal or primitive)
942
+ if (typeof tree !== 'object') {
943
+ return;
944
+ }
945
+ // Recursively index children
946
+ for (const [key, value] of Object.entries(tree)) {
947
+ this.buildFromTree(value, [...path, key]);
948
+ }
949
+ }
950
+ /**
951
+ * Convert path to string for caching
952
+ */
953
+ pathToString(path) {
954
+ return path.join('.');
955
+ }
956
+ /**
957
+ * Collect all descendant values recursively
958
+ */
959
+ collectDescendants(node, currentPath, results) {
960
+ // Add current node's value if it exists
961
+ if (node.value) {
962
+ const value = node.value.deref();
963
+ if (value) {
964
+ results.set(this.pathToString(currentPath), value);
965
+ }
966
+ }
967
+ // Recursively collect children
968
+ for (const [key, child] of node.children) {
969
+ this.collectDescendants(child, [...currentPath, key], results);
970
+ }
971
+ }
972
+ }
973
+
974
+ /**
975
+ * OptimizedUpdateEngine
976
+ *
977
+ * High-performance update engine using path indexing and diffing to minimize
978
+ * unnecessary signal updates.
979
+ *
980
+ * Features:
981
+ * - Diff-based updates (only update what changed)
982
+ * - Path indexing for O(k) lookups
983
+ * - Automatic batching for large updates
984
+ * - Priority-based patch ordering
985
+ * - Skip unchanged values
986
+ *
987
+ * @example
988
+ * ```ts
989
+ * const tree = signalTree(data, { useLazySignals: true });
990
+ * const engine = new OptimizedUpdateEngine(tree);
991
+ *
992
+ * // Optimized update - only changes what's different
993
+ * const result = engine.update({
994
+ * user: { name: 'Alice' } // Only updates if name changed
995
+ * });
996
+ *
997
+ * console.log(result.changedPaths); // ['user.name']
998
+ * console.log(result.duration); // ~2ms
999
+ * ```
1000
+ */
1001
+ class OptimizedUpdateEngine {
1002
+ pathIndex;
1003
+ diffEngine;
1004
+ constructor(tree) {
1005
+ this.pathIndex = new PathIndex();
1006
+ this.diffEngine = new DiffEngine();
1007
+ // Build initial index
1008
+ this.pathIndex.buildFromTree(tree);
1009
+ }
1010
+ /**
1011
+ * Update tree with optimizations
1012
+ *
1013
+ * @param tree - Current tree state
1014
+ * @param updates - Updates to apply
1015
+ * @param options - Update options
1016
+ * @returns Update result
1017
+ */
1018
+ update(tree, updates, options = {}) {
1019
+ const startTime = performance.now();
1020
+ // Step 1: Generate diff to find actual changes
1021
+ const diffOptions = {};
1022
+ if (options.maxDepth !== undefined)
1023
+ diffOptions.maxDepth = options.maxDepth;
1024
+ if (options.ignoreArrayOrder !== undefined)
1025
+ diffOptions.ignoreArrayOrder = options.ignoreArrayOrder;
1026
+ if (options.equalityFn !== undefined)
1027
+ diffOptions.equalityFn = options.equalityFn;
1028
+ const diff = this.diffEngine.diff(tree, updates, diffOptions);
1029
+ if (diff.changes.length === 0) {
1030
+ // No actual changes, skip update entirely
1031
+ return {
1032
+ changed: false,
1033
+ duration: performance.now() - startTime,
1034
+ changedPaths: [],
1035
+ };
1036
+ }
1037
+ // Step 2: Convert diff to optimized patches
1038
+ const patches = this.createPatches(diff.changes);
1039
+ // Step 3: Sort patches for optimal application order
1040
+ const sortedPatches = this.sortPatches(patches);
1041
+ // Step 4: Apply patches with optional batching
1042
+ const result = options.batch
1043
+ ? this.batchApplyPatches(tree, sortedPatches, options.batchSize)
1044
+ : this.applyPatches(tree, sortedPatches);
1045
+ const duration = performance.now() - startTime;
1046
+ return {
1047
+ changed: true,
1048
+ duration,
1049
+ changedPaths: result.appliedPaths,
1050
+ stats: {
1051
+ totalPaths: diff.changes.length,
1052
+ optimizedPaths: patches.length,
1053
+ batchedUpdates: result.batchCount,
1054
+ },
1055
+ };
1056
+ }
1057
+ /**
1058
+ * Rebuild path index from current tree state
1059
+ *
1060
+ * @param tree - Current tree
1061
+ */
1062
+ rebuildIndex(tree) {
1063
+ this.pathIndex.clear();
1064
+ this.pathIndex.buildFromTree(tree);
1065
+ }
1066
+ /**
1067
+ * Get path index statistics
1068
+ */
1069
+ getIndexStats() {
1070
+ return this.pathIndex.getStats();
1071
+ }
1072
+ /**
1073
+ * Creates optimized patches from diff changes
1074
+ */
1075
+ createPatches(changes) {
1076
+ const patches = [];
1077
+ const processedPaths = new Set();
1078
+ for (const change of changes) {
1079
+ const pathStr = change.path.join('.');
1080
+ // Skip if parent path already processed (optimization)
1081
+ let skipPath = false;
1082
+ for (const processed of processedPaths) {
1083
+ if (pathStr.startsWith(processed + '.')) {
1084
+ skipPath = true;
1085
+ break;
1086
+ }
1087
+ }
1088
+ if (skipPath) {
1089
+ continue;
1090
+ }
1091
+ // Create patch based on change type
1092
+ const patch = this.createPatch(change);
1093
+ patches.push(patch);
1094
+ // Mark path as processed
1095
+ processedPaths.add(pathStr);
1096
+ // If this is an object replacement, skip child paths
1097
+ if (change.type === ChangeType.REPLACE &&
1098
+ typeof change.value === 'object') {
1099
+ processedPaths.add(pathStr);
1100
+ }
1101
+ }
1102
+ return patches;
1103
+ }
1104
+ /**
1105
+ * Creates a single patch from a change
1106
+ */
1107
+ createPatch(change) {
1108
+ return {
1109
+ type: change.type,
1110
+ path: change.path,
1111
+ value: change.value,
1112
+ oldValue: change.oldValue,
1113
+ priority: this.calculatePriority(change),
1114
+ signal: this.pathIndex.get(change.path),
1115
+ };
1116
+ }
1117
+ /**
1118
+ * Calculates update priority for optimal ordering
1119
+ */
1120
+ calculatePriority(change) {
1121
+ let priority = 0;
1122
+ // Shallow updates have higher priority
1123
+ priority += (10 - change.path.length) * 10;
1124
+ // Array updates have lower priority (more expensive)
1125
+ if (change.path.some((p) => typeof p === 'number')) {
1126
+ priority -= 20;
1127
+ }
1128
+ // Replace operations have higher priority than nested updates
1129
+ if (change.type === ChangeType.REPLACE) {
1130
+ priority += 30;
1131
+ }
1132
+ return priority;
1133
+ }
1134
+ /**
1135
+ * Sorts patches for optimal application
1136
+ */
1137
+ sortPatches(patches) {
1138
+ return patches.sort((a, b) => {
1139
+ // Sort by priority (higher first)
1140
+ if (a.priority !== b.priority) {
1141
+ return b.priority - a.priority;
1142
+ }
1143
+ // Then by path depth (shallow first)
1144
+ return a.path.length - b.path.length;
1145
+ });
1146
+ }
1147
+ /**
1148
+ * Applies patches directly (no batching)
1149
+ */
1150
+ applyPatches(tree, patches) {
1151
+ const appliedPaths = [];
1152
+ let updateCount = 0;
1153
+ for (const patch of patches) {
1154
+ if (this.applyPatch(patch, tree)) {
1155
+ appliedPaths.push(patch.path.join('.'));
1156
+ updateCount++;
1157
+ }
1158
+ }
1159
+ return {
1160
+ appliedPaths,
1161
+ updateCount,
1162
+ batchCount: 1,
1163
+ };
1164
+ }
1165
+ /**
1166
+ * Applies patches with batching for better performance
1167
+ */
1168
+ batchApplyPatches(tree, patches, batchSize = 50) {
1169
+ const batches = [];
1170
+ for (let i = 0; i < patches.length; i += batchSize) {
1171
+ batches.push(patches.slice(i, i + batchSize));
1172
+ }
1173
+ const appliedPaths = [];
1174
+ let updateCount = 0;
1175
+ // Process patches in batches
1176
+ for (const currentBatch of batches) {
1177
+ for (const patch of currentBatch) {
1178
+ if (this.applyPatch(patch, tree)) {
1179
+ appliedPaths.push(patch.path.join('.'));
1180
+ updateCount++;
1181
+ }
1182
+ }
1183
+ }
1184
+ return {
1185
+ appliedPaths,
1186
+ updateCount,
1187
+ batchCount: batches.length,
1188
+ };
1189
+ }
1190
+ /**
1191
+ * Applies a single patch to the tree object
1192
+ */
1193
+ applyPatch(patch, tree) {
1194
+ try {
1195
+ // First, try to update via signal if available
1196
+ if (patch.signal && core.isSignal(patch.signal) && 'set' in patch.signal) {
1197
+ const currentValue = patch.signal();
1198
+ // Only update if value actually changed
1199
+ if (this.isEqual(currentValue, patch.value)) {
1200
+ return false;
1201
+ }
1202
+ // Update the signal - this will handle reactivity
1203
+ patch.signal.set(patch.value);
1204
+ // After successful ADD, update the index
1205
+ if (patch.type === ChangeType.ADD && patch.value !== undefined) {
1206
+ this.pathIndex.set(patch.path, patch.signal);
1207
+ }
1208
+ return true;
1209
+ } // Fallback: Navigate to parent object and update directly
1210
+ let current = tree;
1211
+ for (let i = 0; i < patch.path.length - 1; i++) {
1212
+ const key = patch.path[i];
1213
+ current = current[key];
1214
+ if (!current || typeof current !== 'object') {
1215
+ return false;
1216
+ }
1217
+ }
1218
+ const lastKey = patch.path[patch.path.length - 1];
1219
+ // Only update if value actually changed
1220
+ if (this.isEqual(current[lastKey], patch.value)) {
1221
+ return false;
1222
+ }
1223
+ // Apply update directly to object
1224
+ current[lastKey] = patch.value;
1225
+ return true;
1226
+ }
1227
+ catch (error) {
1228
+ console.error(`Failed to apply patch at ${patch.path.join('.')}:`, error);
1229
+ return false;
1230
+ }
1231
+ }
1232
+ /**
1233
+ * Check equality
1234
+ */
1235
+ isEqual(a, b) {
1236
+ // Fast path for primitives
1237
+ if (a === b) {
1238
+ return true;
1239
+ }
1240
+ if (typeof a !== typeof b) {
1241
+ return false;
1242
+ }
1243
+ if (typeof a !== 'object' || a === null || b === null) {
1244
+ return false;
1245
+ }
1246
+ // Deep equality for objects (simple version)
1247
+ try {
1248
+ return JSON.stringify(a) === JSON.stringify(b);
1249
+ }
1250
+ catch {
1251
+ return false;
1252
+ }
1253
+ }
1254
+ }
1255
+
1256
+ /**
1257
+ * Security validator for SignalTree to prevent common vulnerabilities
1258
+ * @packageDocumentation
1259
+ */
1260
+ /**
1261
+ * Built-in dangerous keys that can lead to prototype pollution
1262
+ */
1263
+ const DANGEROUS_KEYS = ['__proto__', 'constructor', 'prototype'];
1264
+ /**
1265
+ * Basic HTML tag pattern for XSS detection
1266
+ */
1267
+ const HTML_TAG_PATTERN = /<[^>]*>/g;
1268
+ /**
1269
+ * Dangerous HTML patterns that should always be blocked
1270
+ */
1271
+ const DANGEROUS_HTML_PATTERNS = [
1272
+ /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
1273
+ /on\w+\s*=/gi, // Event handlers like onclick=
1274
+ /javascript:/gi,
1275
+ /<iframe\b/gi,
1276
+ /<object\b/gi,
1277
+ /<embed\b/gi,
1278
+ ];
1279
+ /**
1280
+ * SecurityValidator prevents common security vulnerabilities in SignalTree
1281
+ *
1282
+ * Features:
1283
+ * - Prototype pollution prevention (blocks __proto__, constructor, prototype)
1284
+ * - XSS prevention (sanitizes string values)
1285
+ * - Security event callbacks for monitoring
1286
+ * - Configurable validation rules
1287
+ *
1288
+ * @example
1289
+ * ```ts
1290
+ * const validator = new SecurityValidator({
1291
+ * preventPrototypePollution: true,
1292
+ * preventXSS: true,
1293
+ * onSecurityEvent: (event) => console.warn('Security event:', event)
1294
+ * });
1295
+ *
1296
+ * // This will throw an error
1297
+ * validator.validateKey('__proto__');
1298
+ *
1299
+ * // This will sanitize the value
1300
+ * const safe = validator.validateValue('<script>alert("xss")</script>');
1301
+ * ```
1302
+ */
1303
+ class SecurityValidator {
1304
+ config;
1305
+ dangerousKeys;
1306
+ constructor(config = {}) {
1307
+ this.config = {
1308
+ preventPrototypePollution: config.preventPrototypePollution ?? true,
1309
+ preventXSS: config.preventXSS ?? false,
1310
+ preventFunctions: config.preventFunctions ?? true,
1311
+ customDangerousKeys: config.customDangerousKeys ?? [],
1312
+ onSecurityEvent: config.onSecurityEvent ??
1313
+ (() => {
1314
+ // Default no-op callback
1315
+ }),
1316
+ sanitizationMode: config.sanitizationMode ?? 'strict',
1317
+ };
1318
+ // Build set of dangerous keys for O(1) lookup
1319
+ this.dangerousKeys = new Set([
1320
+ ...DANGEROUS_KEYS,
1321
+ ...this.config.customDangerousKeys,
1322
+ ]);
1323
+ }
1324
+ /**
1325
+ * Validate a key to prevent prototype pollution
1326
+ *
1327
+ * @param key - The key to validate
1328
+ * @throws Error if the key is dangerous and validation is enabled
1329
+ */
1330
+ validateKey(key) {
1331
+ if (!this.config.preventPrototypePollution) {
1332
+ return;
1333
+ }
1334
+ if (this.dangerousKeys.has(key)) {
1335
+ const event = {
1336
+ type: 'dangerous-key-blocked',
1337
+ key,
1338
+ reason: `Dangerous key "${key}" blocked to prevent prototype pollution`,
1339
+ timestamp: Date.now(),
1340
+ };
1341
+ this.config.onSecurityEvent(event);
1342
+ throw new Error(`[SignalTree Security] Dangerous key "${key}" is not allowed. ` +
1343
+ `This key can lead to prototype pollution attacks. ` +
1344
+ `Blocked keys: ${Array.from(this.dangerousKeys).join(', ')}`);
1345
+ }
1346
+ }
1347
+ /**
1348
+ * Validate and sanitize a value to prevent XSS and block functions
1349
+ *
1350
+ * @param value - The value to validate
1351
+ * @returns The sanitized value (or original if not a string or validation disabled)
1352
+ * @throws Error if value is a function and preventFunctions is enabled
1353
+ */
1354
+ validateValue(value) {
1355
+ // Block function values to ensure serializable state
1356
+ if (this.config.preventFunctions && typeof value === 'function') {
1357
+ const event = {
1358
+ type: 'function-value-blocked',
1359
+ value,
1360
+ reason: 'Function values are not allowed - state must be serializable',
1361
+ timestamp: Date.now(),
1362
+ };
1363
+ this.config.onSecurityEvent(event);
1364
+ throw new Error(`[SignalTree Security] Function values are not allowed in state trees. ` +
1365
+ `Functions cannot be serialized, breaking features like time-travel, ` +
1366
+ `persistence, debugging, and SSR. ` +
1367
+ `\n\nTo fix this:` +
1368
+ `\n - Store function references outside the tree` +
1369
+ `\n - Use method names (strings) and a function registry` +
1370
+ `\n - Use computed signals for derived values` +
1371
+ `\n\nBlocked value: ${value.toString().substring(0, 100)}...`);
1372
+ }
1373
+ if (!this.config.preventXSS || typeof value !== 'string') {
1374
+ return value;
1375
+ }
1376
+ // Check for dangerous patterns first
1377
+ let hasDangerousPattern = false;
1378
+ for (const pattern of DANGEROUS_HTML_PATTERNS) {
1379
+ // Reset lastIndex for global regexes
1380
+ pattern.lastIndex = 0;
1381
+ if (pattern.test(value)) {
1382
+ hasDangerousPattern = true;
1383
+ break;
1384
+ }
1385
+ }
1386
+ if (hasDangerousPattern) {
1387
+ const event = {
1388
+ type: 'xss-attempt-blocked',
1389
+ value,
1390
+ reason: 'Dangerous HTML pattern detected and sanitized',
1391
+ timestamp: Date.now(),
1392
+ };
1393
+ this.config.onSecurityEvent(event);
1394
+ // In strict mode, remove all HTML
1395
+ // In permissive mode, we still block dangerous patterns
1396
+ return this.sanitize(value);
1397
+ }
1398
+ // Apply general sanitization based on mode
1399
+ return this.sanitize(value);
1400
+ }
1401
+ /**
1402
+ * Sanitize a string value based on the configured mode
1403
+ *
1404
+ * @param value - The string to sanitize
1405
+ * @returns The sanitized string
1406
+ */
1407
+ sanitize(value) {
1408
+ if (this.config.sanitizationMode === 'strict') {
1409
+ // First remove dangerous patterns, then all HTML tags
1410
+ let sanitized = value;
1411
+ for (const pattern of DANGEROUS_HTML_PATTERNS) {
1412
+ // Reset lastIndex for global regexes
1413
+ pattern.lastIndex = 0;
1414
+ sanitized = sanitized.replace(pattern, '');
1415
+ }
1416
+ // Then remove all remaining HTML tags
1417
+ return sanitized.replace(HTML_TAG_PATTERN, '');
1418
+ }
1419
+ else {
1420
+ // Permissive mode: only remove dangerous patterns
1421
+ let sanitized = value;
1422
+ for (const pattern of DANGEROUS_HTML_PATTERNS) {
1423
+ // Reset lastIndex for global regexes
1424
+ pattern.lastIndex = 0;
1425
+ sanitized = sanitized.replace(pattern, '');
1426
+ }
1427
+ return sanitized;
1428
+ }
1429
+ }
1430
+ /**
1431
+ * Validate both key and value (convenience method)
1432
+ *
1433
+ * @param key - The key to validate
1434
+ * @param value - The value to validate
1435
+ * @returns The sanitized value
1436
+ */
1437
+ validateKeyValue(key, value) {
1438
+ this.validateKey(key);
1439
+ return this.validateValue(value);
1440
+ }
1441
+ /**
1442
+ * Check if a key is dangerous without throwing
1443
+ *
1444
+ * @param key - The key to check
1445
+ * @returns true if the key is dangerous
1446
+ */
1447
+ isDangerousKey(key) {
1448
+ return this.dangerousKeys.has(key);
1449
+ }
1450
+ /**
1451
+ * Get the current configuration
1452
+ */
1453
+ getConfig() {
1454
+ return { ...this.config };
1455
+ }
1456
+ }
1457
+ /**
1458
+ * Create a SecurityValidator with common presets
1459
+ */
1460
+ const SecurityPresets = {
1461
+ /**
1462
+ * Strict security: All protections enabled (recommended for production)
1463
+ */
1464
+ strict: () => new SecurityValidator({
1465
+ preventPrototypePollution: true,
1466
+ preventXSS: true,
1467
+ preventFunctions: true,
1468
+ sanitizationMode: 'strict',
1469
+ }),
1470
+ /**
1471
+ * Standard security: Prototype pollution and function blocking (default)
1472
+ */
1473
+ standard: () => new SecurityValidator({
1474
+ preventPrototypePollution: true,
1475
+ preventXSS: false,
1476
+ preventFunctions: true,
1477
+ }),
1478
+ /**
1479
+ * Permissive security: Only prototype pollution prevention
1480
+ * WARNING: Allows functions, breaking serialization features
1481
+ */
1482
+ permissive: () => new SecurityValidator({
1483
+ preventPrototypePollution: true,
1484
+ preventXSS: false,
1485
+ preventFunctions: false,
1486
+ }),
1487
+ /**
1488
+ * Disabled: No security validations
1489
+ * DANGER: Not recommended - allows prototype pollution and functions
1490
+ */
1491
+ disabled: () => new SecurityValidator({
1492
+ preventPrototypePollution: false,
1493
+ preventXSS: false,
1494
+ preventFunctions: false,
1495
+ }),
1496
+ };
1497
+
1498
+ /** Symbol to mark callable signals - using global symbol to match across files */
1499
+ const CALLABLE_SIGNAL_SYMBOL = Symbol.for('NodeAccessor');
1500
+ /**
1501
+ * Checks if a value is a node accessor created by makeNodeAccessor
1502
+ */
1503
+ function isNodeAccessor$1(value) {
1504
+ return (typeof value === 'function' && value && CALLABLE_SIGNAL_SYMBOL in value);
1505
+ }
1506
+ /**
1507
+ * Checks if a value is either an Angular signal or a callable signal
1508
+ * This is useful for packages that need to work with both types
1509
+ */
1510
+ function isAnySignal(value) {
1511
+ return core.isSignal(value) || isNodeAccessor$1(value);
1512
+ }
1513
+ function composeEnhancers(...enhancers) {
1514
+ return (tree) => enhancers.reduce((t, e) => e(t), tree);
1515
+ }
1516
+ /**
1517
+ * Creates a lazy signal tree using Proxy for on-demand signal creation
1518
+ */
1519
+ function createLazySignalTree(obj, equalityFn, basePath = '', memoryManager) {
1520
+ const signalCache = new Map();
1521
+ const nestedProxies = new Map();
1522
+ const nestedCleanups = new Map();
1523
+ const cleanup = () => {
1524
+ nestedCleanups.forEach((fn) => {
1525
+ try {
1526
+ fn();
1527
+ }
1528
+ catch (error) {
1529
+ console.warn('Error during nested cleanup:', error);
1530
+ }
1531
+ });
1532
+ nestedCleanups.clear();
1533
+ signalCache.clear();
1534
+ nestedProxies.clear();
1535
+ // Clear from memory manager if provided
1536
+ if (memoryManager) {
1537
+ memoryManager.dispose();
1538
+ }
1539
+ };
1540
+ const proxy = new Proxy(obj, {
1541
+ get(target, prop) {
1542
+ if (prop === '__cleanup__')
1543
+ return cleanup;
1544
+ if (typeof prop === 'symbol') {
1545
+ return target[prop];
1546
+ }
1547
+ if (prop === 'valueOf' || prop === 'toString') {
1548
+ return target[prop];
1549
+ }
1550
+ const key = prop;
1551
+ const path = basePath ? `${basePath}.${key}` : key;
1552
+ if (!(key in target))
1553
+ return undefined;
1554
+ const value = target[key];
1555
+ if (core.isSignal(value))
1556
+ return value;
1557
+ // Check memory manager cache first
1558
+ if (memoryManager) {
1559
+ const cached = memoryManager.getSignal(path);
1560
+ if (cached)
1561
+ return cached;
1562
+ }
1563
+ if (signalCache.has(path))
1564
+ return signalCache.get(path);
1565
+ if (nestedProxies.has(path))
1566
+ return nestedProxies.get(path);
1567
+ if (value &&
1568
+ typeof value === 'object' &&
1569
+ !Array.isArray(value) &&
1570
+ !core.isSignal(value) &&
1571
+ !shared.isBuiltInObject(value)) {
1572
+ try {
1573
+ const nestedProxy = createLazySignalTree(value, equalityFn, path, memoryManager);
1574
+ nestedProxies.set(path, nestedProxy);
1575
+ const proxyWithCleanup = nestedProxy;
1576
+ if (typeof proxyWithCleanup.__cleanup__ === 'function') {
1577
+ nestedCleanups.set(path, proxyWithCleanup.__cleanup__);
1578
+ }
1579
+ return nestedProxy;
1580
+ }
1581
+ catch (error) {
1582
+ console.warn(`Failed to create lazy proxy for path "${path}":`, error);
1583
+ const fallbackSignal = core.signal(value, { equal: equalityFn });
1584
+ signalCache.set(path, fallbackSignal);
1585
+ // Cache in memory manager
1586
+ if (memoryManager) {
1587
+ memoryManager.cacheSignal(path, fallbackSignal);
1588
+ }
1589
+ return fallbackSignal;
1590
+ }
1591
+ }
1592
+ try {
1593
+ const newSignal = core.signal(value, { equal: equalityFn });
1594
+ signalCache.set(path, newSignal);
1595
+ // Cache in memory manager
1596
+ if (memoryManager) {
1597
+ memoryManager.cacheSignal(path, newSignal);
1598
+ }
1599
+ return newSignal;
1600
+ }
1601
+ catch (error) {
1602
+ console.warn(`Failed to create signal for path "${path}":`, error);
1603
+ return value;
1604
+ }
1605
+ },
1606
+ set(target, prop, value) {
1607
+ if (typeof prop === 'symbol') {
1608
+ target[prop] = value;
1609
+ return true;
1610
+ }
1611
+ const key = prop;
1612
+ const path = basePath ? `${basePath}.${key}` : key;
1613
+ try {
1614
+ target[key] = value;
1615
+ const cachedSignal = signalCache.get(path);
1616
+ if (cachedSignal && 'set' in cachedSignal) {
1617
+ cachedSignal.set(value);
1618
+ }
1619
+ if (nestedProxies.has(path)) {
1620
+ const nestedCleanup = nestedCleanups.get(path);
1621
+ if (nestedCleanup) {
1622
+ nestedCleanup();
1623
+ nestedCleanups.delete(path);
1624
+ }
1625
+ nestedProxies.delete(path);
1626
+ }
1627
+ return true;
1628
+ }
1629
+ catch (error) {
1630
+ console.warn(`Failed to set value for path "${path}":`, error);
1631
+ return false;
1632
+ }
1633
+ },
1634
+ has(target, prop) {
1635
+ return prop in target;
1636
+ },
1637
+ ownKeys(target) {
1638
+ return Reflect.ownKeys(target);
1639
+ },
1640
+ getOwnPropertyDescriptor(target, prop) {
1641
+ return Reflect.getOwnPropertyDescriptor(target, prop);
1642
+ },
1643
+ });
1644
+ return proxy;
1645
+ }
1646
+ function unwrap(node) {
1647
+ if (node === null || node === undefined) {
1648
+ return node;
1649
+ }
1650
+ // Handle callable signals first
1651
+ if (isNodeAccessor$1(node)) {
1652
+ // For NodeAccessors, don't call them - read from their properties directly
1653
+ // This prevents infinite recursion when NodeAccessor calls unwrap(accessor)
1654
+ const result = {};
1655
+ for (const key in node) {
1656
+ if (!Object.prototype.hasOwnProperty.call(node, key))
1657
+ continue;
1658
+ // Skip function prototype properties only, not user properties
1659
+ if (key === 'length' || key === 'prototype')
1660
+ continue;
1661
+ // Special handling for 'name' - if it's a signal or NodeAccessor, include it
1662
+ if (key === 'name') {
1663
+ const value = node[key];
1664
+ if (!core.isSignal(value) && !isNodeAccessor$1(value)) {
1665
+ // Skip if it's just the function name property
1666
+ continue;
1667
+ }
1668
+ }
1669
+ const value = node[key];
1670
+ if (isNodeAccessor$1(value)) {
1671
+ result[key] = unwrap(value);
1672
+ }
1673
+ else if (core.isSignal(value)) {
1674
+ const unwrappedValue = value();
1675
+ if (typeof unwrappedValue === 'object' &&
1676
+ unwrappedValue !== null &&
1677
+ !Array.isArray(unwrappedValue) &&
1678
+ !shared.isBuiltInObject(unwrappedValue)) {
1679
+ result[key] = unwrap(unwrappedValue);
1680
+ }
1681
+ else {
1682
+ result[key] = unwrappedValue;
1683
+ }
1684
+ }
1685
+ else if (typeof value === 'object' &&
1686
+ value !== null &&
1687
+ !Array.isArray(value) &&
1688
+ !shared.isBuiltInObject(value)) {
1689
+ result[key] = unwrap(value);
1690
+ }
1691
+ else {
1692
+ result[key] = value;
1693
+ }
1694
+ }
1695
+ return result;
1696
+ }
1697
+ if (core.isSignal(node)) {
1698
+ const value = node();
1699
+ if (typeof value === 'object' &&
1700
+ value !== null &&
1701
+ !Array.isArray(value) &&
1702
+ !shared.isBuiltInObject(value)) {
1703
+ return unwrap(value);
1704
+ }
1705
+ return value;
1706
+ }
1707
+ if (typeof node !== 'object') {
1708
+ return node;
1709
+ }
1710
+ if (Array.isArray(node)) {
1711
+ return node;
1712
+ }
1713
+ if (shared.isBuiltInObject(node)) {
1714
+ return node;
1715
+ }
1716
+ const result = {};
1717
+ for (const key in node) {
1718
+ if (!Object.prototype.hasOwnProperty.call(node, key))
1719
+ continue;
1720
+ if (key === 'set' || key === 'update') {
1721
+ const v = node[key];
1722
+ if (typeof v === 'function')
1723
+ continue;
1724
+ }
1725
+ const value = node[key];
1726
+ if (isNodeAccessor$1(value)) {
1727
+ const unwrappedValue = value();
1728
+ if (typeof unwrappedValue === 'object' &&
1729
+ unwrappedValue !== null &&
1730
+ !Array.isArray(unwrappedValue) &&
1731
+ !shared.isBuiltInObject(unwrappedValue)) {
1732
+ result[key] = unwrap(unwrappedValue);
1733
+ }
1734
+ else {
1735
+ result[key] = unwrappedValue;
1736
+ }
1737
+ }
1738
+ else if (core.isSignal(value)) {
1739
+ const unwrappedValue = value();
1740
+ if (typeof unwrappedValue === 'object' &&
1741
+ unwrappedValue !== null &&
1742
+ !Array.isArray(unwrappedValue) &&
1743
+ !shared.isBuiltInObject(unwrappedValue)) {
1744
+ result[key] = unwrap(unwrappedValue);
1745
+ }
1746
+ else {
1747
+ result[key] = unwrappedValue;
1748
+ }
1749
+ }
1750
+ else if (typeof value === 'object' &&
1751
+ value !== null &&
1752
+ !Array.isArray(value) &&
1753
+ !shared.isBuiltInObject(value)) {
1754
+ result[key] = unwrap(value);
1755
+ }
1756
+ else {
1757
+ result[key] = value;
1758
+ }
1759
+ }
1760
+ const symbols = Object.getOwnPropertySymbols(node);
1761
+ for (const sym of symbols) {
1762
+ const value = node[sym];
1763
+ if (isNodeAccessor$1(value)) {
1764
+ const unwrappedValue = value();
1765
+ if (typeof unwrappedValue === 'object' &&
1766
+ unwrappedValue !== null &&
1767
+ !Array.isArray(unwrappedValue) &&
1768
+ !shared.isBuiltInObject(unwrappedValue)) {
1769
+ result[sym] = unwrap(unwrappedValue);
1770
+ }
1771
+ else {
1772
+ result[sym] = unwrappedValue;
1773
+ }
1774
+ }
1775
+ else if (core.isSignal(value)) {
1776
+ const unwrappedValue = value();
1777
+ if (typeof unwrappedValue === 'object' &&
1778
+ unwrappedValue !== null &&
1779
+ !Array.isArray(unwrappedValue) &&
1780
+ !shared.isBuiltInObject(unwrappedValue)) {
1781
+ result[sym] = unwrap(unwrappedValue);
1782
+ }
1783
+ else {
1784
+ result[sym] = unwrappedValue;
1785
+ }
1786
+ }
1787
+ else if (typeof value === 'object' &&
1788
+ value !== null &&
1789
+ !Array.isArray(value) &&
1790
+ !shared.isBuiltInObject(value)) {
1791
+ result[sym] = unwrap(value);
1792
+ }
1793
+ else {
1794
+ result[sym] = value;
1795
+ }
1796
+ }
1797
+ return result;
1798
+ }
1799
+
1800
+ // Global symbol for NodeAccessor identification
1801
+ const NODE_ACCESSOR_SYMBOL = Symbol.for('NodeAccessor');
1802
+ // Note: Callable syntax is supported via optional build-time transform only.
1803
+ // No runtime Proxy wrapping is applied to writable signals to keep zero-cost semantics.
1804
+ /**
1805
+ * Creates a callable NodeAccessor for nested objects WITHOUT a backing signal
1806
+ * This accessor reads from and writes to child signals directly
1807
+ */
1808
+ function makeNodeAccessor() {
1809
+ const accessor = function (arg) {
1810
+ if (arguments.length === 0) {
1811
+ // Read from child signals - use the accessor itself as the context
1812
+ return unwrap(accessor);
1813
+ }
1814
+ if (typeof arg === 'function') {
1815
+ const updater = arg;
1816
+ const currentValue = unwrap(accessor);
1817
+ const newValue = updater(currentValue);
1818
+ recursiveUpdate(accessor, newValue);
1819
+ }
1820
+ else {
1821
+ // Direct set
1822
+ recursiveUpdate(accessor, arg);
1823
+ }
1824
+ };
1825
+ accessor[NODE_ACCESSOR_SYMBOL] = true;
1826
+ return accessor;
1827
+ }
1828
+ /**
1829
+ * Creates a NodeAccessor for the root tree that manages a backing signal
1830
+ */
1831
+ function makeRootNodeAccessor(readSignal, writeSignal) {
1832
+ const accessor = function (arg) {
1833
+ if (arguments.length === 0) {
1834
+ return readSignal();
1835
+ }
1836
+ if (typeof arg === 'function') {
1837
+ const updater = arg;
1838
+ writeSignal.set(updater(readSignal()));
1839
+ }
1840
+ else {
1841
+ writeSignal.set(arg);
1842
+ }
1843
+ };
1844
+ accessor[NODE_ACCESSOR_SYMBOL] = true;
1845
+ return accessor;
1846
+ }
1847
+ function recursiveUpdate(target, updates) {
1848
+ if (!updates || typeof updates !== 'object') {
1849
+ return;
1850
+ }
1851
+ let targetObj;
1852
+ // Handle NodeAccessor (function) as target
1853
+ if (isNodeAccessor(target)) {
1854
+ targetObj = target;
1855
+ }
1856
+ else if (target && typeof target === 'object') {
1857
+ targetObj = target;
1858
+ }
1859
+ else {
1860
+ return;
1861
+ }
1862
+ const updatesObj = updates;
1863
+ for (const key in updatesObj) {
1864
+ if (!(key in targetObj)) {
1865
+ continue;
1866
+ }
1867
+ const targetProp = targetObj[key];
1868
+ const updateValue = updatesObj[key];
1869
+ if (core.isSignal(targetProp)) {
1870
+ // Leaf signal - check if it's writable
1871
+ if ('set' in targetProp && typeof targetProp.set === 'function') {
1872
+ targetProp.set(updateValue);
1873
+ }
1874
+ }
1875
+ else if (isNodeAccessor(targetProp)) {
1876
+ // For nested objects, check if updateValue is an object for recursive update
1877
+ if (updateValue && typeof updateValue === 'object') {
1878
+ recursiveUpdate(targetProp, updateValue);
1879
+ }
1880
+ else {
1881
+ // Direct value assignment
1882
+ targetProp(updateValue);
1883
+ }
1884
+ }
1885
+ }
1886
+ }
1887
+ /**
1888
+ * Checks if a value is a NodeAccessor
1889
+ */
1890
+ function isNodeAccessor(value) {
1891
+ return (typeof value === 'function' &&
1892
+ value &&
1893
+ value[NODE_ACCESSOR_SYMBOL] === true);
1894
+ }
1895
+ // ============================================
1896
+ // PERFORMANCE HEURISTICS
1897
+ // ============================================
1898
+ function estimateObjectSize(obj, maxDepth = SIGNAL_TREE_CONSTANTS.ESTIMATE_MAX_DEPTH, currentDepth = 0) {
1899
+ if (currentDepth >= maxDepth)
1900
+ return 1;
1901
+ if (obj === null || obj === undefined)
1902
+ return 0;
1903
+ if (typeof obj !== 'object')
1904
+ return 1;
1905
+ let size = 0;
1906
+ try {
1907
+ if (Array.isArray(obj)) {
1908
+ size = obj.length;
1909
+ const sampleSize = Math.min(SIGNAL_TREE_CONSTANTS.ESTIMATE_SAMPLE_SIZE_ARRAY, obj.length);
1910
+ for (let i = 0; i < sampleSize; i++) {
1911
+ size += estimateObjectSize(obj[i], maxDepth, currentDepth + 1) * 0.1;
1912
+ }
1913
+ }
1914
+ else {
1915
+ const keys = Object.keys(obj);
1916
+ size = keys.length;
1917
+ const sampleSize = Math.min(SIGNAL_TREE_CONSTANTS.ESTIMATE_SAMPLE_SIZE_OBJECT, keys.length);
1918
+ for (let i = 0; i < sampleSize; i++) {
1919
+ const value = obj[keys[i]];
1920
+ size += estimateObjectSize(value, maxDepth, currentDepth + 1) * 0.5;
1921
+ }
1922
+ }
1923
+ }
1924
+ catch {
1925
+ return 1;
1926
+ }
1927
+ return Math.floor(size);
1928
+ }
1929
+ function shouldUseLazy(obj, config, precomputedSize) {
1930
+ if (config.useLazySignals !== undefined)
1931
+ return config.useLazySignals;
1932
+ if (config.debugMode || config.enableDevTools)
1933
+ return false;
1934
+ if (config.batchUpdates && config.useMemoization)
1935
+ return true;
1936
+ const estimatedSize = precomputedSize ?? estimateObjectSize(obj);
1937
+ return estimatedSize > SIGNAL_TREE_CONSTANTS.LAZY_THRESHOLD;
1938
+ }
1939
+ // ============================================
1940
+ // SECURITY VALIDATION
1941
+ // ============================================
1942
+ /**
1943
+ * Validates an object tree using SecurityValidator if configured
1944
+ * Throws if validation fails
1945
+ */
1946
+ function validateTree(obj, config, path = []) {
1947
+ if (!config.security) {
1948
+ return; // No validation needed
1949
+ }
1950
+ const validator = new SecurityValidator(config.security);
1951
+ function validate(value, currentPath) {
1952
+ // Validate primitives and null/undefined
1953
+ if (value === null || value === undefined) {
1954
+ return;
1955
+ }
1956
+ if (typeof value !== 'object') {
1957
+ // Validate the value (this will catch functions)
1958
+ validator.validateValue(value);
1959
+ return;
1960
+ }
1961
+ // Skip built-in objects
1962
+ if (shared.isBuiltInObject(value)) {
1963
+ return;
1964
+ }
1965
+ // Validate arrays
1966
+ if (Array.isArray(value)) {
1967
+ value.forEach((item, index) => {
1968
+ validate(item, [...currentPath, String(index)]);
1969
+ });
1970
+ return;
1971
+ }
1972
+ // Validate object keys and values
1973
+ // Use Reflect.ownKeys to catch all keys including __proto__
1974
+ const keys = [
1975
+ ...Object.keys(value),
1976
+ ...Object.getOwnPropertyNames(value),
1977
+ ];
1978
+ const uniqueKeys = [...new Set(keys)];
1979
+ for (const key of uniqueKeys) {
1980
+ if (typeof key === 'symbol')
1981
+ continue;
1982
+ // Validate the key
1983
+ try {
1984
+ validator.validateKey(key);
1985
+ }
1986
+ catch (error) {
1987
+ const err = error;
1988
+ throw new Error(`${err.message}\nPath: ${[...currentPath, key].join('.')}`);
1989
+ }
1990
+ // Get the value
1991
+ const val = value[key];
1992
+ // Validate the value
1993
+ try {
1994
+ validator.validateValue(val);
1995
+ }
1996
+ catch (error) {
1997
+ const err = error;
1998
+ throw new Error(`${err.message}\nPath: ${[...currentPath, key].join('.')}`);
1999
+ }
2000
+ // Recursively validate nested objects
2001
+ validate(val, [...currentPath, key]);
2002
+ }
2003
+ }
2004
+ validate(obj, path);
2005
+ }
2006
+ function createEqualityFn(useShallowComparison) {
2007
+ return useShallowComparison ? Object.is : shared.deepEqual;
2008
+ }
2009
+ // ============================================
2010
+ // SIGNAL CREATION
2011
+ // ============================================
2012
+ function createSignalStore(obj, equalityFn) {
2013
+ if (obj === null || obj === undefined || typeof obj !== 'object') {
2014
+ return core.signal(obj, { equal: equalityFn });
2015
+ }
2016
+ if (Array.isArray(obj)) {
2017
+ return core.signal(obj, { equal: equalityFn });
2018
+ }
2019
+ if (shared.isBuiltInObject(obj)) {
2020
+ return core.signal(obj, { equal: equalityFn });
2021
+ }
2022
+ const store = {};
2023
+ const processedObjects = new WeakSet();
2024
+ if (processedObjects.has(obj)) {
2025
+ console.warn(SIGNAL_TREE_MESSAGES.CIRCULAR_REF);
2026
+ return core.signal(obj, { equal: equalityFn });
2027
+ }
2028
+ processedObjects.add(obj);
2029
+ try {
2030
+ for (const [key, value] of Object.entries(obj)) {
2031
+ try {
2032
+ if (typeof key === 'symbol')
2033
+ continue;
2034
+ if (core.isSignal(value)) {
2035
+ // Preserve existing signals as-is
2036
+ store[key] = value;
2037
+ continue;
2038
+ }
2039
+ if (value === null || value === undefined) {
2040
+ store[key] = core.signal(value, {
2041
+ equal: equalityFn,
2042
+ });
2043
+ }
2044
+ else if (typeof value !== 'object') {
2045
+ store[key] = core.signal(value, {
2046
+ equal: equalityFn,
2047
+ });
2048
+ }
2049
+ else if (Array.isArray(value) || shared.isBuiltInObject(value)) {
2050
+ store[key] = core.signal(value, {
2051
+ equal: equalityFn,
2052
+ });
2053
+ }
2054
+ else {
2055
+ // Nested object - create recursive structure
2056
+ const branch = createSignalStore(value, equalityFn);
2057
+ // Create a NodeAccessor for this nested object (no backing signal)
2058
+ const callableBranch = makeNodeAccessor();
2059
+ // Copy all the nested signal properties onto the callable branch
2060
+ for (const branchKey in branch) {
2061
+ if (Object.prototype.hasOwnProperty.call(branch, branchKey)) {
2062
+ try {
2063
+ Object.defineProperty(callableBranch, branchKey, {
2064
+ value: branch[branchKey],
2065
+ enumerable: true,
2066
+ configurable: true,
2067
+ });
2068
+ }
2069
+ catch {
2070
+ // Skip if property can't be defined
2071
+ }
2072
+ }
2073
+ }
2074
+ store[key] = callableBranch;
2075
+ }
2076
+ }
2077
+ catch (error) {
2078
+ console.warn(`${SIGNAL_TREE_MESSAGES.SIGNAL_CREATION_FAILED} "${key}":`, error);
2079
+ store[key] = core.signal(value, {
2080
+ equal: equalityFn,
2081
+ });
2082
+ }
2083
+ }
2084
+ const symbols = Object.getOwnPropertySymbols(obj);
2085
+ for (const sym of symbols) {
2086
+ const value = obj[sym];
2087
+ try {
2088
+ if (core.isSignal(value)) {
2089
+ store[sym] = value;
2090
+ }
2091
+ else {
2092
+ store[sym] = core.signal(value, {
2093
+ equal: equalityFn,
2094
+ });
2095
+ }
2096
+ }
2097
+ catch (error) {
2098
+ console.warn(SIGNAL_TREE_MESSAGES.SIGNAL_CREATION_FAILED, error);
2099
+ }
2100
+ }
2101
+ }
2102
+ catch (error) {
2103
+ throw new Error(`Failed to create signal store: ${error instanceof Error ? error.message : 'Unknown error'}`);
2104
+ }
2105
+ return store;
2106
+ }
2107
+ // ============================================
2108
+ // TREE ENHANCEMENT
2109
+ // ============================================
2110
+ function enhanceTree(tree, config = {}) {
2111
+ const isLazy = config.useLazySignals ?? shouldUseLazy(tree.state, config);
2112
+ // with() enhancer composition
2113
+ tree.with = ((...enhancers) => {
2114
+ if (enhancers.length === 0) {
2115
+ return tree;
2116
+ }
2117
+ const coreCapabilities = new Set();
2118
+ if (config.batchUpdates)
2119
+ coreCapabilities.add('batchUpdate');
2120
+ if (config.useMemoization)
2121
+ coreCapabilities.add('memoize');
2122
+ if (config.enableTimeTravel)
2123
+ coreCapabilities.add('undo');
2124
+ if (config.enableDevTools)
2125
+ coreCapabilities.add('connectDevTools');
2126
+ try {
2127
+ for (const key of Object.keys(tree))
2128
+ coreCapabilities.add(String(key));
2129
+ }
2130
+ catch {
2131
+ // Ignore reflection issues
2132
+ }
2133
+ const hasMetadata = enhancers.some((e) => Boolean(e.metadata && (e.metadata.requires || e.metadata.provides)));
2134
+ let orderedEnhancers = enhancers;
2135
+ if (hasMetadata) {
2136
+ try {
2137
+ orderedEnhancers = resolveEnhancerOrder(enhancers, coreCapabilities, config.debugMode);
2138
+ }
2139
+ catch (err) {
2140
+ console.warn(SIGNAL_TREE_MESSAGES.ENHANCER_ORDER_FAILED, err);
2141
+ }
2142
+ }
2143
+ const provided = new Set(coreCapabilities);
2144
+ let currentTree = tree;
2145
+ for (let i = 0; i < orderedEnhancers.length; i++) {
2146
+ const enhancer = orderedEnhancers[i];
2147
+ if (typeof enhancer !== 'function') {
2148
+ throw new Error(SIGNAL_TREE_MESSAGES.ENHANCER_NOT_FUNCTION.replace('%d', String(i)));
2149
+ }
2150
+ const reqs = enhancer.metadata?.requires ?? [];
2151
+ for (const r of reqs) {
2152
+ if (!(r in currentTree) && !provided.has(r)) {
2153
+ const name = enhancer.metadata?.name ?? `enhancer#${i}`;
2154
+ const msg = SIGNAL_TREE_MESSAGES.ENHANCER_REQUIREMENT_MISSING.replace('%s', name).replace('%s', r);
2155
+ if (config.debugMode) {
2156
+ throw new Error(msg);
2157
+ }
2158
+ else {
2159
+ console.warn(msg);
2160
+ }
2161
+ }
2162
+ }
2163
+ try {
2164
+ const result = enhancer(currentTree);
2165
+ if (result !== currentTree)
2166
+ currentTree = result;
2167
+ const provs = enhancer.metadata?.provides ?? [];
2168
+ for (const p of provs)
2169
+ provided.add(p);
2170
+ if (config.debugMode && provs.length > 0) {
2171
+ for (const p of provs) {
2172
+ if (!(p in currentTree)) {
2173
+ console.warn(SIGNAL_TREE_MESSAGES.ENHANCER_PROVIDES_MISSING.replace('%s', enhancer.metadata?.name ?? String(i)).replace('%s', p));
2174
+ }
2175
+ }
2176
+ }
2177
+ }
2178
+ catch (error) {
2179
+ const name = enhancer.metadata?.name || `enhancer at index ${i}`;
2180
+ console.error(SIGNAL_TREE_MESSAGES.ENHANCER_FAILED.replace('%s', name), error);
2181
+ if (config.debugMode) {
2182
+ console.error('[SignalTree] Enhancer stack trace:', enhancer);
2183
+ console.error('[SignalTree] Tree state at failure:', currentTree);
2184
+ }
2185
+ throw error;
2186
+ }
2187
+ }
2188
+ return currentTree;
2189
+ });
2190
+ // destroy unchanged
2191
+ tree.destroy = () => {
2192
+ try {
2193
+ if (isLazy) {
2194
+ const state = tree.state;
2195
+ if (state && typeof state === 'object' && '__cleanup__' in state) {
2196
+ const cleanup = state.__cleanup__;
2197
+ if (typeof cleanup === 'function') {
2198
+ cleanup();
2199
+ }
2200
+ }
2201
+ }
2202
+ if (config.debugMode) {
2203
+ console.log(SIGNAL_TREE_MESSAGES.TREE_DESTROYED);
2204
+ }
2205
+ }
2206
+ catch (error) {
2207
+ console.error(SIGNAL_TREE_MESSAGES.CLEANUP_ERROR, error);
2208
+ }
2209
+ };
2210
+ // Add stub implementations for advanced features
2211
+ addStubMethods(tree, config);
2212
+ return tree;
2213
+ }
2214
+ function addStubMethods(tree, config) {
2215
+ tree.batchUpdate = (updater) => {
2216
+ console.warn(SIGNAL_TREE_MESSAGES.BATCH_NOT_ENABLED);
2217
+ tree((current) => {
2218
+ const partial = updater(current);
2219
+ return { ...current, ...partial };
2220
+ });
2221
+ };
2222
+ tree.memoize = (fn, cacheKey) => {
2223
+ console.warn(SIGNAL_TREE_MESSAGES.MEMOIZE_NOT_ENABLED);
2224
+ return core.computed(() => fn(tree()));
2225
+ };
2226
+ // Memoization helper stubs (overridden by withMemoization)
2227
+ tree.memoizedUpdate = (updater) => {
2228
+ if (config.debugMode) {
2229
+ console.warn(SIGNAL_TREE_MESSAGES.MEMOIZE_NOT_ENABLED);
2230
+ }
2231
+ // Fallback: apply the update without caching
2232
+ tree((current) => ({ ...current, ...updater(current) }));
2233
+ };
2234
+ tree.clearMemoCache = () => {
2235
+ if (config.debugMode) {
2236
+ console.warn(SIGNAL_TREE_MESSAGES.MEMOIZE_NOT_ENABLED);
2237
+ }
2238
+ // no-op
2239
+ };
2240
+ tree.getCacheStats = () => ({
2241
+ size: 0,
2242
+ hitRate: 0,
2243
+ totalHits: 0,
2244
+ totalMisses: 0,
2245
+ keys: [],
2246
+ });
2247
+ // Memoization helper methods are only present when withMemoization is applied
2248
+ tree.effect = (fn) => {
2249
+ try {
2250
+ core.effect(() => fn(tree()));
2251
+ }
2252
+ catch (error) {
2253
+ if (config.debugMode) {
2254
+ console.warn(SIGNAL_TREE_MESSAGES.EFFECT_NO_CONTEXT, error);
2255
+ }
2256
+ }
2257
+ };
2258
+ tree.subscribe = (fn) => {
2259
+ try {
2260
+ const destroyRef = core.inject(core.DestroyRef);
2261
+ let isDestroyed = false;
2262
+ const effectRef = core.effect(() => {
2263
+ if (!isDestroyed) {
2264
+ fn(tree());
2265
+ }
2266
+ });
2267
+ const unsubscribe = () => {
2268
+ isDestroyed = true;
2269
+ effectRef.destroy();
2270
+ };
2271
+ destroyRef.onDestroy(unsubscribe);
2272
+ return unsubscribe;
2273
+ }
2274
+ catch (error) {
2275
+ if (config.debugMode) {
2276
+ console.warn(SIGNAL_TREE_MESSAGES.SUBSCRIBE_NO_CONTEXT, error);
2277
+ }
2278
+ fn(tree());
2279
+ return () => {
2280
+ // No-op
2281
+ };
2282
+ }
2283
+ };
2284
+ // Performance stubs
2285
+ tree.optimize = () => {
2286
+ if (config.debugMode) {
2287
+ console.warn(SIGNAL_TREE_MESSAGES.OPTIMIZE_NOT_AVAILABLE);
2288
+ }
2289
+ };
2290
+ tree.clearCache = () => {
2291
+ if (config.debugMode) {
2292
+ console.warn(SIGNAL_TREE_MESSAGES.CACHE_NOT_AVAILABLE);
2293
+ }
2294
+ };
2295
+ tree.invalidatePattern = () => {
2296
+ if (config.debugMode) {
2297
+ console.warn(SIGNAL_TREE_MESSAGES.PERFORMANCE_NOT_ENABLED);
2298
+ }
2299
+ return 0;
2300
+ };
2301
+ // Initialize optimized update engine
2302
+ const treeWithEngine = tree;
2303
+ if (!treeWithEngine.updateEngine) {
2304
+ treeWithEngine.updateEngine = new OptimizedUpdateEngine(tree);
2305
+ }
2306
+ tree.updateOptimized = (updates, options = {}) => {
2307
+ const treeWithEngine = tree;
2308
+ const engine = treeWithEngine.updateEngine;
2309
+ if (!engine) {
2310
+ // Fallback to basic update
2311
+ if (config.debugMode) {
2312
+ console.warn(SIGNAL_TREE_MESSAGES.UPDATE_OPTIMIZED_NOT_AVAILABLE);
2313
+ }
2314
+ tree((current) => ({ ...current, ...updates }));
2315
+ return {
2316
+ changed: true,
2317
+ duration: 0,
2318
+ changedPaths: Object.keys(updates),
2319
+ stats: undefined,
2320
+ };
2321
+ }
2322
+ return engine.update(tree(), updates, options);
2323
+ };
2324
+ tree.getMetrics = () => {
2325
+ return {
2326
+ updates: 0,
2327
+ computations: 0,
2328
+ cacheHits: 0,
2329
+ cacheMisses: 0,
2330
+ averageUpdateTime: 0,
2331
+ };
2332
+ };
2333
+ // Middleware stubs
2334
+ tree.addTap = (middleware) => {
2335
+ if (config.debugMode) {
2336
+ console.warn(SIGNAL_TREE_MESSAGES.MIDDLEWARE_NOT_AVAILABLE);
2337
+ }
2338
+ };
2339
+ tree.removeTap = (id) => {
2340
+ if (config.debugMode) {
2341
+ console.warn(SIGNAL_TREE_MESSAGES.MIDDLEWARE_NOT_AVAILABLE);
2342
+ }
2343
+ };
2344
+ // Entity helpers stub
2345
+ tree.entities = () => {
2346
+ if (config.debugMode) {
2347
+ console.warn(SIGNAL_TREE_MESSAGES.ENTITY_HELPERS_NOT_AVAILABLE);
2348
+ }
2349
+ return {};
2350
+ };
2351
+ // Async action stub
2352
+ tree.asyncAction = (operation, asyncConfig = {}) => {
2353
+ if (config.debugMode) {
2354
+ console.warn(SIGNAL_TREE_MESSAGES.ASYNC_ACTIONS_NOT_AVAILABLE);
2355
+ }
2356
+ return {};
2357
+ };
2358
+ // Time travel stubs
2359
+ tree.undo = () => {
2360
+ if (config.debugMode) {
2361
+ console.warn(SIGNAL_TREE_MESSAGES.TIME_TRAVEL_NOT_AVAILABLE);
2362
+ }
2363
+ };
2364
+ tree.redo = () => {
2365
+ if (config.debugMode) {
2366
+ console.warn(SIGNAL_TREE_MESSAGES.TIME_TRAVEL_NOT_AVAILABLE);
2367
+ }
2368
+ };
2369
+ tree.getHistory = () => {
2370
+ if (config.debugMode) {
2371
+ console.warn(SIGNAL_TREE_MESSAGES.TIME_TRAVEL_NOT_AVAILABLE);
2372
+ }
2373
+ return [];
2374
+ };
2375
+ tree.resetHistory = () => {
2376
+ if (config.debugMode) {
2377
+ console.warn(SIGNAL_TREE_MESSAGES.TIME_TRAVEL_NOT_AVAILABLE);
2378
+ }
2379
+ };
2380
+ }
2381
+ // ============================================
2382
+ // CORE CREATION FUNCTION
2383
+ // ============================================
2384
+ function create(obj, config = {}) {
2385
+ if (obj === null || obj === undefined) {
2386
+ throw new Error(SIGNAL_TREE_MESSAGES.NULL_OR_UNDEFINED);
2387
+ }
2388
+ // Validate the tree if security is configured
2389
+ validateTree(obj, config);
2390
+ const estimatedSize = estimateObjectSize(obj);
2391
+ const equalityFn = createEqualityFn(config.useShallowComparison ?? false);
2392
+ // ARRAY ROOT MODE: arrays are treated as single signals
2393
+ if (Array.isArray(obj)) {
2394
+ const signalState = core.signal(obj, {
2395
+ equal: equalityFn,
2396
+ });
2397
+ const tree = makeRootNodeAccessor(signalState, signalState);
2398
+ // Add state and $ properties that reference the signal itself
2399
+ Object.defineProperty(tree, 'state', {
2400
+ value: signalState,
2401
+ enumerable: false,
2402
+ });
2403
+ Object.defineProperty(tree, '$', { value: signalState, enumerable: false });
2404
+ enhanceTree(tree, config);
2405
+ return tree;
2406
+ }
2407
+ const useLazy = shouldUseLazy(obj, config, estimatedSize);
2408
+ if (config.debugMode) {
2409
+ console.log(SIGNAL_TREE_MESSAGES.STRATEGY_SELECTION.replace('%s', useLazy ? 'lazy' : 'eager').replace('%d', String(estimatedSize)));
2410
+ }
2411
+ let signalState;
2412
+ let memoryManager;
2413
+ try {
2414
+ if (useLazy && typeof obj === 'object') {
2415
+ memoryManager = new SignalMemoryManager();
2416
+ signalState = createLazySignalTree(obj, equalityFn, '', // basePath
2417
+ memoryManager);
2418
+ }
2419
+ else {
2420
+ signalState = createSignalStore(obj, equalityFn);
2421
+ }
2422
+ }
2423
+ catch (error) {
2424
+ if (useLazy) {
2425
+ console.warn(SIGNAL_TREE_MESSAGES.LAZY_FALLBACK, error);
2426
+ signalState = createSignalStore(obj, equalityFn);
2427
+ memoryManager = undefined; // Reset memory manager on fallback
2428
+ }
2429
+ else {
2430
+ throw error;
2431
+ }
2432
+ }
2433
+ // Create callable tree function for the root
2434
+ const tree = function (arg) {
2435
+ if (arguments.length === 0) {
2436
+ return unwrap(signalState);
2437
+ }
2438
+ if (typeof arg === 'function') {
2439
+ const updater = arg;
2440
+ const currentValue = unwrap(signalState);
2441
+ const newValue = updater(currentValue);
2442
+ // Use recursive update to preserve signals
2443
+ recursiveUpdate(signalState, newValue);
2444
+ }
2445
+ else {
2446
+ // Direct set - use recursive update
2447
+ recursiveUpdate(signalState, arg);
2448
+ }
2449
+ };
2450
+ // Mark as NodeAccessor
2451
+ Object.defineProperty(tree, NODE_ACCESSOR_SYMBOL, {
2452
+ value: true,
2453
+ enumerable: false,
2454
+ });
2455
+ // Add state and $ properties first (these are safe)
2456
+ Object.defineProperty(tree, 'state', {
2457
+ value: signalState,
2458
+ enumerable: false,
2459
+ });
2460
+ Object.defineProperty(tree, '$', { value: signalState, enumerable: false });
2461
+ // Add dispose() method for manual cleanup when using lazy signals (stub)
2462
+ if (memoryManager) {
2463
+ Object.defineProperty(tree, 'dispose', {
2464
+ value: () => {
2465
+ memoryManager?.dispose();
2466
+ const cleanup = signalState.__cleanup__;
2467
+ if (typeof cleanup === 'function') {
2468
+ cleanup();
2469
+ }
2470
+ },
2471
+ enumerable: false,
2472
+ writable: false,
2473
+ });
2474
+ }
2475
+ // Enhance tree with methods
2476
+ enhanceTree(tree, config);
2477
+ // Attach signal state properties to the tree AFTER enhancement
2478
+ // This prevents conflicts with built-in methods
2479
+ for (const key in signalState) {
2480
+ if (Object.prototype.hasOwnProperty.call(signalState, key)) {
2481
+ // Skip if the property already exists (from enhancement)
2482
+ if (!(key in tree)) {
2483
+ try {
2484
+ Object.defineProperty(tree, key, {
2485
+ value: signalState[key],
2486
+ enumerable: true,
2487
+ configurable: true,
2488
+ });
2489
+ }
2490
+ catch {
2491
+ // Skip if property can't be defined
2492
+ }
2493
+ }
2494
+ }
2495
+ }
2496
+ return tree;
2497
+ }
2498
+ // ============================================
2499
+ // PRESET CONFIGURATIONS
2500
+ // ============================================
2501
+ const presetConfigs = {
2502
+ basic: {
2503
+ useLazySignals: false,
2504
+ debugMode: false,
2505
+ },
2506
+ performance: {
2507
+ useLazySignals: true,
2508
+ batchUpdates: true,
2509
+ useMemoization: true,
2510
+ useShallowComparison: true,
2511
+ },
2512
+ development: {
2513
+ useLazySignals: false,
2514
+ debugMode: true,
2515
+ enableDevTools: true,
2516
+ trackPerformance: true,
2517
+ },
2518
+ production: {
2519
+ useLazySignals: true,
2520
+ batchUpdates: true,
2521
+ useMemoization: true,
2522
+ debugMode: false,
2523
+ },
2524
+ };
2525
+ function signalTree(obj, configOrPreset) {
2526
+ if (typeof configOrPreset === 'string') {
2527
+ const config = presetConfigs[configOrPreset];
2528
+ if (!config) {
2529
+ console.warn(SIGNAL_TREE_MESSAGES.PRESET_UNKNOWN.replace('%s', configOrPreset));
2530
+ return create(obj, {});
2531
+ }
2532
+ return create(obj, config);
2533
+ }
2534
+ const config = configOrPreset || {};
2535
+ return create(obj, config);
2536
+ }
2537
+
2538
+ /** Global queue for batched updates awaiting processing */
2539
+ let updateQueue = [];
2540
+ /** Flag to prevent recursive batch processing */
2541
+ let isUpdating = false;
2542
+ /** Timeout ID for scheduled flush operations */
2543
+ let flushTimeoutId;
2544
+ /** Current batching configuration */
2545
+ let currentBatchingConfig = {};
2546
+ /**
2547
+ * Enhanced queue management with priority and deduplication
2548
+ * Returns true if queue was flushed immediately, false if scheduled for later
2549
+ */
2550
+ function addToQueue(update, config = currentBatchingConfig) {
2551
+ const maxSize = config.maxBatchSize ?? 100;
2552
+ // Remove duplicates based on path if available
2553
+ if (update.path) {
2554
+ updateQueue = updateQueue.filter((existing) => existing.path !== update.path);
2555
+ }
2556
+ updateQueue.push(update);
2557
+ // Check if we should flush immediately due to maxBatchSize
2558
+ // Flush when we exceed maxBatchSize, not when we reach it
2559
+ if (updateQueue.length > maxSize) {
2560
+ // Flush immediately when max batch size is exceeded
2561
+ flushUpdates();
2562
+ return true; // Indicate that queue was flushed
2563
+ }
2564
+ // Schedule auto-flush if not already scheduled
2565
+ scheduleFlush(config);
2566
+ return false; // Indicate that queue was scheduled for later
2567
+ }
2568
+ /**
2569
+ * Schedules automatic queue flushing with configurable timing
2570
+ */
2571
+ function scheduleFlush(config) {
2572
+ if (flushTimeoutId !== undefined) {
2573
+ clearTimeout(flushTimeoutId);
2574
+ }
2575
+ const delay = config.autoFlushDelay ?? 16; // Default to 60fps
2576
+ flushTimeoutId = setTimeout(() => {
2577
+ flushUpdates();
2578
+ }, delay);
2579
+ }
2580
+ /**
2581
+ * Processes the update queue immediately with race condition protection.
2582
+ * Handles updates that arrive during flush execution.
2583
+ */
2584
+ function flushUpdates() {
2585
+ if (isUpdating)
2586
+ return;
2587
+ let queue;
2588
+ do {
2589
+ if (updateQueue.length === 0)
2590
+ return;
2591
+ isUpdating = true;
2592
+ queue = updateQueue;
2593
+ updateQueue = []; // Clear queue atomically
2594
+ // Clear any pending flush timeout
2595
+ if (flushTimeoutId !== undefined) {
2596
+ clearTimeout(flushTimeoutId);
2597
+ flushTimeoutId = undefined;
2598
+ }
2599
+ // Sort by depth (deepest first) for optimal update propagation
2600
+ queue.sort((a, b) => (b.depth ?? 0) - (a.depth ?? 0));
2601
+ try {
2602
+ queue.forEach(({ fn }) => fn());
2603
+ }
2604
+ finally {
2605
+ isUpdating = false;
2606
+ }
2607
+ // Process any updates that were added during flush
2608
+ } while (updateQueue.length > 0);
2609
+ }
2610
+ /**
2611
+ * Core batching function that intelligently queues updates and processes them in optimized microtasks.
2612
+ * Updates are sorted by depth (deepest first) for optimal update propagation and minimal re-computations.
2613
+ *
2614
+ * @param fn - The update function to batch
2615
+ * @param path - Optional state path for update grouping and optimization
2616
+ *
2617
+ * @example
2618
+ * ```typescript
2619
+ * // Simple batched update
2620
+ * batchUpdates(() => tree.update(() => ({ count: 1 })));
2621
+ *
2622
+ * // Path-aware batching for nested updates
2623
+ * batchUpdates(() => tree.update(() => ({ user: { name: 'John' } })), 'user.name');
2624
+ *
2625
+ * // Multiple updates get automatically batched
2626
+ * batchUpdates(() => tree.update(() => ({ loading: true })));
2627
+ * batchUpdates(() => tree.update(() => ({ error: null })));
2628
+ * // Both execute in single microtask
2629
+ * ```
2630
+ */
2631
+ function batchUpdates(fn, path) {
2632
+ const startTime = performance.now();
2633
+ const depth = 0;
2634
+ const update = { fn, startTime, depth, path };
2635
+ // Use enhanced queue management
2636
+ const wasFlushed = addToQueue(update, currentBatchingConfig);
2637
+ // Only schedule additional flush if queue wasn't already flushed
2638
+ if (!wasFlushed) {
2639
+ // Check if we need to process immediately due to timeout
2640
+ const isTimedOut = currentBatchingConfig.batchTimeoutMs &&
2641
+ updateQueue.length > 0 &&
2642
+ startTime - updateQueue[0].startTime >=
2643
+ currentBatchingConfig.batchTimeoutMs;
2644
+ if (isTimedOut) {
2645
+ flushUpdates();
2646
+ }
2647
+ else if (!isUpdating && updateQueue.length > 0) {
2648
+ // Schedule flush but don't set isUpdating until the microtask runs
2649
+ queueMicrotask(() => {
2650
+ flushUpdates();
2651
+ });
2652
+ }
2653
+ }
2654
+ }
2655
+ /**
2656
+ * Enhances a SignalTree with intelligent batching capabilities for optimal performance.
2657
+ * Automatically groups rapid state updates into efficient batch cycles to eliminate UI thrashing.
2658
+ *
2659
+ * @template T - The state object type extending StateObject
2660
+ * @param config - Configuration options for batching behavior
2661
+ * @returns Function that enhances a SignalTree with batching capabilities
2662
+ *
2663
+ * @example
2664
+ * ```typescript
2665
+ * // Basic batching with default settings
2666
+ * const tree = create(initialState).with(withBatching());
2667
+ *
2668
+ * // High-performance batching for demanding applications
2669
+ * const tree = create(initialState).with(withBatching({
2670
+ * maxBatchSize: 50,
2671
+ * autoFlushDelay: 8, // ~120fps
2672
+ * batchTimeoutMs: 50
2673
+ * }));
2674
+ *
2675
+ * // Conservative batching for stable UIs
2676
+ * const tree = create(initialState).with(withBatching({
2677
+ * maxBatchSize: 10,
2678
+ * autoFlushDelay: 100,
2679
+ * batchTimeoutMs: 200
2680
+ * }));
2681
+ *
2682
+ * // Use batching methods
2683
+ * tree.batchUpdate((state) => ({
2684
+ * users: [...state.users, newUser],
2685
+ * loading: false,
2686
+ * error: null
2687
+ * }));
2688
+ * Uses unconstrained recursive typing - no limitations on T
2689
+ * ```
2690
+ */
2691
+ function withBatching(config = {}) {
2692
+ const { enabled = true } = config;
2693
+ // Update global config for this batching instance
2694
+ currentBatchingConfig = { ...currentBatchingConfig, ...config };
2695
+ return (tree) => {
2696
+ if (!enabled) {
2697
+ return tree;
2698
+ }
2699
+ // Store the original callable tree function
2700
+ const originalTreeCall = tree.bind(tree);
2701
+ // Create enhanced tree function that batches update operations
2702
+ const enhancedTree = function (...args) {
2703
+ if (args.length === 0) {
2704
+ // Get operation - call original directly
2705
+ return originalTreeCall();
2706
+ }
2707
+ else {
2708
+ // Set or update operation - batch it
2709
+ batchUpdates(() => {
2710
+ if (args.length === 1) {
2711
+ const arg = args[0];
2712
+ if (typeof arg === 'function') {
2713
+ originalTreeCall(arg);
2714
+ }
2715
+ else {
2716
+ originalTreeCall(arg);
2717
+ }
2718
+ }
2719
+ });
2720
+ }
2721
+ };
2722
+ // Copy all properties and methods from original tree
2723
+ Object.setPrototypeOf(enhancedTree, Object.getPrototypeOf(tree));
2724
+ Object.assign(enhancedTree, tree);
2725
+ // Ensure state and $ properties are preserved
2726
+ if ('state' in tree) {
2727
+ Object.defineProperty(enhancedTree, 'state', {
2728
+ value: tree.state,
2729
+ enumerable: false,
2730
+ configurable: true,
2731
+ });
2732
+ }
2733
+ // Ensure $ alias is preserved
2734
+ if ('$' in tree) {
2735
+ Object.defineProperty(enhancedTree, '$', {
2736
+ value: tree['$'],
2737
+ enumerable: false,
2738
+ configurable: true,
2739
+ });
2740
+ }
2741
+ // Replace the stub batchUpdate method with actual batching logic
2742
+ enhancedTree.batchUpdate = (updater) => {
2743
+ batchUpdates(() => {
2744
+ const current = originalTreeCall();
2745
+ const updates = updater(current);
2746
+ // Apply updates to individual properties
2747
+ Object.entries(updates).forEach(([key, value]) => {
2748
+ const property = enhancedTree.state[key];
2749
+ if (property && 'set' in property) {
2750
+ // It's a WritableSignal - use .set()
2751
+ property.set(value);
2752
+ }
2753
+ else if (isNodeAccessor$1(property)) {
2754
+ // It's a NodeAccessor - use callable syntax
2755
+ property(value);
2756
+ }
2757
+ });
2758
+ });
2759
+ };
2760
+ return enhancedTree;
2761
+ };
2762
+ }
2763
+ /**
2764
+ * Convenience function to enable batching with default settings.
2765
+ * Equivalent to withBatching({ enabled: true }) but more concise for common usage.
2766
+ *
2767
+ * @template T - The state object type extending StateObject
2768
+ * @returns Function that enhances a SignalTree with default batching settings
2769
+ *
2770
+ * @example
2771
+ * ```typescript
2772
+ * // Simple batching enablement
2773
+ * const tree = create(initialState).with(enableBatching());
2774
+ *
2775
+ * // Equivalent to:
2776
+ * const tree = create(initialState).with(withBatching({ enabled: true }));
2777
+ * Uses unconstrained recursive typing - no limitations on T
2778
+ * ```
2779
+ */
2780
+ /**
2781
+ * Creates high-performance batching configuration optimized for demanding applications.
2782
+ * Uses aggressive batching settings for maximum performance in high-frequency update scenarios.
2783
+ * Uses unconstrained recursive typing - no limitations on T
2784
+ *
2785
+ * @template T - The state object type extending StateObject
2786
+ * @returns Function that enhances a SignalTree with high-performance batching
2787
+ *
2788
+ * @example
2789
+ * ```typescript
2790
+ * // For performance-critical applications
2791
+ * const gameTree = create(gameState).with(withHighPerformanceBatching());
2792
+ *
2793
+ * // Perfect for:
2794
+ * // - Real-time games
2795
+ * // - High-frequency data updates
2796
+ * // - Animation-heavy UIs
2797
+ * // - Large dataset operations
2798
+ *
2799
+ * // Automatically includes:
2800
+ * // - Large batch sizes (200 updates)
2801
+ * // - Immediate processing (0ms timeout)
2802
+ * // - Aggressive optimization
2803
+ * Uses unconstrained recursive typing - no limitations on T
2804
+ * ```
2805
+ */
2806
+ function withHighPerformanceBatching() {
2807
+ return withBatching({
2808
+ enabled: true,
2809
+ maxBatchSize: 200,
2810
+ batchTimeoutMs: 0,
2811
+ });
2812
+ }
2813
+ /**
2814
+ * Manually flushes all pending batched updates immediately.
2815
+ * Forces synchronous execution of queued updates, bypassing normal batching delays.
2816
+ * Useful for testing scenarios or when immediate state consistency is required.
2817
+ *
2818
+ * @example
2819
+ * ```typescript
2820
+ * // Queue some updates
2821
+ * tree.batchUpdate(() => ({ count: 1 }));
2822
+ * tree.batchUpdate(() => ({ name: 'test' }));
2823
+ *
2824
+ * // In tests, ensure updates are applied immediately
2825
+ * flushBatchedUpdates();
2826
+ * expect(tree().count).toBe(1);
2827
+ * expect(tree().name).toBe('test');
2828
+ *
2829
+ * // Before critical operations that need current state
2830
+ * flushBatchedUpdates();
2831
+ * const currentState = tree(); // Guaranteed to be up-to-date
2832
+ *
2833
+ * // In animation frames for precise timing
2834
+ * requestAnimationFrame(() => {
2835
+ * flushBatchedUpdates(); // Ensure updates are applied before render
2836
+ * updateUI();
2837
+ * });
2838
+ * ```
2839
+ */
2840
+ function flushBatchedUpdates() {
2841
+ if (updateQueue.length > 0) {
2842
+ // Force flush regardless of isUpdating state
2843
+ const queue = updateQueue.slice();
2844
+ updateQueue = [];
2845
+ isUpdating = false; // Reset the updating flag
2846
+ // Sort by depth (deepest first) for optimal update propagation
2847
+ queue.sort((a, b) => (b.depth ?? 0) - (a.depth ?? 0));
2848
+ queue.forEach(({ fn }) => {
2849
+ fn();
2850
+ });
2851
+ }
2852
+ }
2853
+ /**
2854
+ * Checks if there are pending batched updates waiting to be processed.
2855
+ * Useful for testing, debugging, or conditional logic based on update queue state.
2856
+ *
2857
+ * @returns True if updates are queued, false if queue is empty
2858
+ *
2859
+ * @example
2860
+ * ```typescript
2861
+ * // Check before critical operations
2862
+ * tree.batchUpdate(() => ({ loading: true }));
2863
+ *
2864
+ * if (hasPendingUpdates()) {
2865
+ * console.log('Updates are queued for processing');
2866
+ * flushBatchedUpdates(); // Process them now if needed
2867
+ * }
2868
+ *
2869
+ * // In testing
2870
+ * tree.batchUpdate(() => ({ count: 1 }));
2871
+ * expect(hasPendingUpdates()).toBe(true);
2872
+ *
2873
+ * flushBatchedUpdates();
2874
+ * expect(hasPendingUpdates()).toBe(false);
2875
+ *
2876
+ * // Conditional behavior
2877
+ * function performCriticalOperation() {
2878
+ * if (hasPendingUpdates()) {
2879
+ * flushBatchedUpdates(); // Ensure consistent state
2880
+ * }
2881
+ * // Proceed with operation
2882
+ * }
2883
+ * ```
2884
+ */
2885
+ function hasPendingUpdates() {
2886
+ return updateQueue.length > 0;
2887
+ }
2888
+ /**
2889
+ * Gets the current number of updates waiting in the batch queue.
2890
+ * Useful for performance monitoring, debugging, and batch size optimization.
2891
+ *
2892
+ * @returns Number of queued updates
2893
+ *
2894
+ * @example
2895
+ * ```typescript
2896
+ * // Performance monitoring
2897
+ * function monitorBatchPerformance() {
2898
+ * const queueSize = getBatchQueueSize();
2899
+ *
2900
+ * if (queueSize > 50) {
2901
+ * console.warn(`Large batch queue detected: ${queueSize} updates`);
2902
+ * }
2903
+ *
2904
+ * // Log metrics
2905
+ * console.log(`Current queue size: ${queueSize}`);
2906
+ * }
2907
+ *
2908
+ * // Debug batching behavior
2909
+ * tree.batchUpdate(() => ({ a: 1 }));
2910
+ * tree.batchUpdate(() => ({ b: 2 }));
2911
+ * tree.batchUpdate(() => ({ c: 3 }));
2912
+ *
2913
+ * console.log(`Queue size: ${getBatchQueueSize()}`); // 3
2914
+ *
2915
+ * flushBatchedUpdates();
2916
+ * console.log(`Queue size after flush: ${getBatchQueueSize()}`); // 0
2917
+ *
2918
+ * // Optimize batch configuration
2919
+ * const currentQueueSize = getBatchQueueSize();
2920
+ * if (currentQueueSize > 100) {
2921
+ * // Consider reducing maxBatchSize or autoFlushDelay
2922
+ * console.log('Consider optimizing batch configuration');
2923
+ * }
2924
+ * ```
2925
+ */
2926
+ function getBatchQueueSize() {
2927
+ return updateQueue.length;
2928
+ }
2929
+
2930
+ // Global memoization cache with size limits and TTL
2931
+ const MAX_CACHE_SIZE = 1000;
2932
+ const DEFAULT_TTL = 5 * 60 * 1000; // 5 minutes
2933
+ // Use Map for global cache management (we keep iteration for diagnostics).
2934
+ // Note: we avoid starting any global timers at module import to prevent
2935
+ // background timer leaks in long-running processes; cleanup is performed
2936
+ // opportunistically inside hot paths (probabilistic) or via explicit APIs.
2937
+ const memoizationCache = new Map();
2938
+ function createMemoCacheStore(maxSize, enableLRU) {
2939
+ if (enableLRU) {
2940
+ const cache = new shared.LRUCache(maxSize);
2941
+ const shadow = new Map();
2942
+ const pruneShadow = () => {
2943
+ while (shadow.size > cache.size()) {
2944
+ const oldestKey = shadow.keys().next().value;
2945
+ if (oldestKey === undefined) {
2946
+ break;
2947
+ }
2948
+ shadow.delete(oldestKey);
2949
+ }
2950
+ };
2951
+ return {
2952
+ get: (key) => {
2953
+ const value = cache.get(key);
2954
+ if (value !== undefined) {
2955
+ shadow.set(key, value);
2956
+ }
2957
+ else if (shadow.has(key)) {
2958
+ shadow.delete(key);
2959
+ }
2960
+ return value;
2961
+ },
2962
+ set: (key, value) => {
2963
+ cache.set(key, value);
2964
+ shadow.set(key, value);
2965
+ pruneShadow();
2966
+ },
2967
+ delete: (key) => {
2968
+ cache.delete(key);
2969
+ shadow.delete(key);
2970
+ },
2971
+ clear: () => {
2972
+ cache.clear();
2973
+ shadow.clear();
2974
+ },
2975
+ size: () => shadow.size,
2976
+ forEach: (callback) => {
2977
+ shadow.forEach((value, key) => callback(value, key));
2978
+ },
2979
+ keys: () => shadow.keys(),
2980
+ };
2981
+ }
2982
+ const store = new Map();
2983
+ return {
2984
+ get: (key) => store.get(key),
2985
+ set: (key, value) => {
2986
+ store.set(key, value);
2987
+ },
2988
+ delete: (key) => store.delete(key),
2989
+ clear: () => store.clear(),
2990
+ size: () => store.size,
2991
+ forEach: (callback) => {
2992
+ store.forEach((value, key) => callback(value, key));
2993
+ },
2994
+ keys: () => store.keys(),
2995
+ };
2996
+ }
2997
+ function getCleanupInterval(tree) {
2998
+ return tree._memoCleanupInterval;
2999
+ }
3000
+ function setCleanupInterval(tree, interval) {
3001
+ if (interval === undefined) {
3002
+ delete tree._memoCleanupInterval;
3003
+ return;
3004
+ }
3005
+ tree._memoCleanupInterval = interval;
3006
+ }
3007
+ function clearCleanupInterval(tree) {
3008
+ const interval = getCleanupInterval(tree);
3009
+ if (!interval) {
3010
+ return;
3011
+ }
3012
+ try {
3013
+ clearInterval(interval);
3014
+ }
3015
+ catch {
3016
+ /* best-effort cleanup */
3017
+ }
3018
+ setCleanupInterval(tree);
3019
+ }
3020
+ function resetMemoizationCaches() {
3021
+ memoizationCache.forEach((cache, tree) => {
3022
+ cache.clear();
3023
+ clearCleanupInterval(tree);
3024
+ });
3025
+ memoizationCache.clear();
3026
+ }
3027
+ /**
3028
+ * Cleanup the cache interval on app shutdown
3029
+ */
3030
+ function cleanupMemoizationCache() {
3031
+ resetMemoizationCaches();
3032
+ }
3033
+ /**
3034
+ * Shallow equality check for dependency comparison
3035
+ * Much faster than deep equality for objects with primitive values
3036
+ * Optimized: Uses for...in instead of Object.keys() to avoid array allocations
3037
+ */
3038
+ function shallowEqual(a, b) {
3039
+ if (a === b)
3040
+ return true;
3041
+ if (a == null || b == null)
3042
+ return false;
3043
+ if (typeof a !== typeof b)
3044
+ return false;
3045
+ if (typeof a === 'object' && typeof b === 'object') {
3046
+ const objA = a;
3047
+ const objB = b;
3048
+ // Count properties in objA and check equality
3049
+ let countA = 0;
3050
+ for (const key in objA) {
3051
+ if (!Object.prototype.hasOwnProperty.call(objA, key))
3052
+ continue;
3053
+ countA++;
3054
+ // Early exit if key missing or value different
3055
+ if (!(key in objB) || objA[key] !== objB[key])
3056
+ return false;
3057
+ }
3058
+ // Count properties in objB to ensure same number
3059
+ let countB = 0;
3060
+ for (const key in objB) {
3061
+ if (Object.prototype.hasOwnProperty.call(objB, key))
3062
+ countB++;
3063
+ }
3064
+ return countA === countB;
3065
+ }
3066
+ return false;
3067
+ }
3068
+ /**
3069
+ * Generate cache key for memoization
3070
+ */
3071
+ function generateCacheKey(fn, args) {
3072
+ try {
3073
+ return `${fn.name || 'anonymous'}_${JSON.stringify(args)}`;
3074
+ }
3075
+ catch {
3076
+ // Fallback for cyclic or non-serializable args
3077
+ return `${fn.name || 'anonymous'}_${args.length}`;
3078
+ }
3079
+ }
3080
+ /**
3081
+ * Get equality function based on strategy
3082
+ */
3083
+ function getEqualityFn(strategy) {
3084
+ switch (strategy) {
3085
+ case 'shallow':
3086
+ return shallowEqual;
3087
+ case 'reference':
3088
+ return (a, b) => a === b;
3089
+ case 'deep':
3090
+ default:
3091
+ return shared.deepEqual;
3092
+ }
3093
+ }
3094
+ /**
3095
+ * Memoization function that caches expensive computations with enhanced cache management
3096
+ */
3097
+ function memoize(fn, keyFn, config = {}) {
3098
+ const maxSize = config.maxCacheSize ?? MAX_CACHE_SIZE;
3099
+ const ttl = config.ttl ?? DEFAULT_TTL;
3100
+ // Use shallow equality by default to avoid expensive deep comparisons
3101
+ const equality = getEqualityFn(config.equality ?? 'shallow');
3102
+ // Disable LRU by default to avoid hidden CPU overhead
3103
+ const enableLRU = config.enableLRU ?? false;
3104
+ const cache = createMemoCacheStore(maxSize, enableLRU);
3105
+ const cleanExpiredEntries = () => {
3106
+ if (!ttl)
3107
+ return; // Skip if TTL is disabled
3108
+ const now = Date.now();
3109
+ cache.forEach((entry, key) => {
3110
+ if (entry.timestamp && now - entry.timestamp > ttl) {
3111
+ cache.delete(key);
3112
+ }
3113
+ });
3114
+ };
3115
+ return (...args) => {
3116
+ // Probabilistic cleanup to avoid paying cleanup cost on every hot call.
3117
+ // Runs ~1% of the time when TTL is enabled.
3118
+ if (ttl && Math.random() < 0.01) {
3119
+ cleanExpiredEntries();
3120
+ }
3121
+ const key = keyFn
3122
+ ? keyFn(...args)
3123
+ : generateCacheKey(fn, args);
3124
+ const cached = cache.get(key);
3125
+ // If using custom key function, trust the key; otherwise check equality
3126
+ if (cached && (keyFn || equality(cached.deps, args))) {
3127
+ if (enableLRU) {
3128
+ cached.hitCount += 1;
3129
+ }
3130
+ return cached.value;
3131
+ }
3132
+ const result = fn(...args);
3133
+ cache.set(key, {
3134
+ value: result,
3135
+ deps: args,
3136
+ timestamp: Date.now(),
3137
+ hitCount: 1,
3138
+ });
3139
+ return result;
3140
+ };
3141
+ }
3142
+ /**
3143
+ * High-performance memoization function optimized for speed
3144
+ * Uses shallow equality and minimal cache management overhead
3145
+ */
3146
+ function memoizeShallow(fn, keyFn) {
3147
+ return memoize(fn, keyFn, {
3148
+ equality: 'shallow',
3149
+ enableLRU: false,
3150
+ ttl: undefined,
3151
+ maxCacheSize: 100,
3152
+ });
3153
+ }
3154
+ /**
3155
+ * Lightweight memoization function with reference equality only
3156
+ * Maximum performance for scenarios where exact reference matches are sufficient
3157
+ */
3158
+ function memoizeReference(fn, keyFn) {
3159
+ return memoize(fn, keyFn, {
3160
+ equality: 'reference',
3161
+ enableLRU: false,
3162
+ ttl: undefined,
3163
+ maxCacheSize: 50,
3164
+ });
3165
+ }
3166
+ /**
3167
+ * Preset memoization configurations optimized for common use cases
3168
+ * These presets are the same ones used in SignalTree's benchmarks
3169
+ */
3170
+ const MEMOIZATION_PRESETS = {
3171
+ /**
3172
+ * Optimized for selectors and frequently-accessed computed values
3173
+ * - Fast reference-only equality checks (~0.3μs)
3174
+ * - Small cache (10 entries) for minimal overhead
3175
+ * - No LRU management (eliminates bookkeeping cost)
3176
+ * - Best for: Selectors, derived values, stable references
3177
+ */
3178
+ selector: {
3179
+ equality: 'reference',
3180
+ maxCacheSize: 10,
3181
+ enableLRU: false,
3182
+ ttl: undefined,
3183
+ },
3184
+ /**
3185
+ * Balanced configuration for general computed values
3186
+ * - Shallow equality checks (~5-15μs) for object comparisons
3187
+ * - Medium cache (100 entries) for reasonable coverage
3188
+ * - No LRU (good performance/memory balance)
3189
+ * - Best for: General computations, objects with primitives
3190
+ */
3191
+ computed: {
3192
+ equality: 'shallow',
3193
+ maxCacheSize: 100,
3194
+ enableLRU: false,
3195
+ ttl: undefined,
3196
+ },
3197
+ /**
3198
+ * Thorough configuration for complex nested state
3199
+ * - Deep equality checks (~50-200μs) for nested objects
3200
+ * - Large cache (1000 entries) for complex scenarios
3201
+ * - LRU enabled for intelligent cache management
3202
+ * - 5-minute TTL to prevent stale data
3203
+ * - Best for: Complex nested objects, thorough comparisons needed
3204
+ */
3205
+ deepState: {
3206
+ equality: 'deep',
3207
+ maxCacheSize: 1000,
3208
+ enableLRU: true,
3209
+ ttl: 5 * 60 * 1000,
3210
+ },
3211
+ /**
3212
+ * Minimal overhead for high-frequency operations
3213
+ * - Reference-only equality (fastest possible)
3214
+ * - Tiny cache (5 entries) for minimal memory
3215
+ * - No bells and whistles
3216
+ * - Best for: Hot paths, microseconds matter, immutable data
3217
+ */
3218
+ highFrequency: {
3219
+ equality: 'reference',
3220
+ maxCacheSize: 5,
3221
+ enableLRU: false,
3222
+ ttl: undefined,
3223
+ },
3224
+ };
3225
+ /**
3226
+ * Convenience function: Memoization optimized for selectors
3227
+ * Uses reference equality and small cache for maximum performance
3228
+ *
3229
+ * @example
3230
+ * ```typescript
3231
+ * const tree = signalTree(state).with(withSelectorMemoization());
3232
+ * const activeUsers = computed(() =>
3233
+ * tree.state.users().filter(u => u.active)
3234
+ * );
3235
+ * ```
3236
+ */
3237
+ function withSelectorMemoization() {
3238
+ return withMemoization(MEMOIZATION_PRESETS.selector);
3239
+ }
3240
+ /**
3241
+ * Convenience function: Memoization optimized for computed values
3242
+ * Uses shallow equality for balanced performance
3243
+ *
3244
+ * @example
3245
+ * ```typescript
3246
+ * const tree = signalTree(state).with(withComputedMemoization());
3247
+ * const metrics = computed(() =>
3248
+ * calculateExpensiveMetrics(tree.state.data())
3249
+ * );
3250
+ * ```
3251
+ */
3252
+ function withComputedMemoization() {
3253
+ return withMemoization(MEMOIZATION_PRESETS.computed);
3254
+ }
3255
+ /**
3256
+ * Convenience function: Memoization for complex nested state
3257
+ * Uses deep equality and LRU management
3258
+ *
3259
+ * @example
3260
+ * ```typescript
3261
+ * const tree = signalTree(state).with(withDeepStateMemoization());
3262
+ * // Handles complex nested object comparisons
3263
+ * ```
3264
+ */
3265
+ function withDeepStateMemoization() {
3266
+ return withMemoization(MEMOIZATION_PRESETS.deepState);
3267
+ }
3268
+ /**
3269
+ * Convenience function: Minimal memoization for hot paths
3270
+ * Maximum performance with minimal overhead
3271
+ *
3272
+ * @example
3273
+ * ```typescript
3274
+ * const tree = signalTree(state).with(withHighFrequencyMemoization());
3275
+ * // For operations called thousands of times per second
3276
+ * ```
3277
+ */
3278
+ function withHighFrequencyMemoization() {
3279
+ return withMemoization(MEMOIZATION_PRESETS.highFrequency);
3280
+ }
3281
+ /**
3282
+ * Enhances a SignalTree with memoization capabilities
3283
+ * Uses unconstrained recursive typing - no limitations on T
3284
+ */
3285
+ function withMemoization(config = {}) {
3286
+ const { enabled = true, maxCacheSize = 1000, ttl,
3287
+ // Default behavior: deep equality and LRU enabled to preserve
3288
+ // memoization semantics expected by existing consumers/tests.
3289
+ equality = 'deep', enableLRU = true, } = config;
3290
+ return (tree) => {
3291
+ const originalTreeCall = tree.bind(tree);
3292
+ const applyUpdateResult = (result) => {
3293
+ Object.entries(result).forEach(([propKey, value]) => {
3294
+ const property = tree.state[propKey];
3295
+ if (property && 'set' in property) {
3296
+ property.set(value);
3297
+ }
3298
+ else if (isNodeAccessor$1(property)) {
3299
+ property(value);
3300
+ }
3301
+ });
3302
+ };
3303
+ if (!enabled) {
3304
+ const memoTree = tree;
3305
+ memoTree.memoizedUpdate = (updater) => {
3306
+ const currentState = originalTreeCall();
3307
+ const result = updater(currentState);
3308
+ applyUpdateResult(result);
3309
+ };
3310
+ memoTree.clearMemoCache = () => {
3311
+ /* no-op when memoization disabled */
3312
+ };
3313
+ memoTree.getCacheStats = () => ({
3314
+ size: 0,
3315
+ hitRate: 0,
3316
+ totalHits: 0,
3317
+ totalMisses: 0,
3318
+ keys: [],
3319
+ });
3320
+ return memoTree;
3321
+ }
3322
+ // Initialize cache for this tree
3323
+ const cache = createMemoCacheStore(maxCacheSize, enableLRU);
3324
+ memoizationCache.set(tree, cache);
3325
+ const equalityFn = getEqualityFn(equality);
3326
+ // Add memoized update method
3327
+ tree.memoizedUpdate = (updater, cacheKey) => {
3328
+ const currentState = originalTreeCall();
3329
+ // Determine cache key: prefer explicit keyFn-like behavior if not provided
3330
+ const key = cacheKey ||
3331
+ generateCacheKey(updater, [
3332
+ currentState,
3333
+ ]);
3334
+ // Check cache
3335
+ const cached = cache.get(key);
3336
+ if (cached && equalityFn(cached.deps, [currentState])) {
3337
+ // Apply cached result - use callable interface to set the partial update
3338
+ const cachedUpdate = cached.value;
3339
+ applyUpdateResult(cachedUpdate);
3340
+ return;
3341
+ }
3342
+ // Compute new result
3343
+ const result = updater(currentState);
3344
+ // Cache the result
3345
+ cache.set(key, {
3346
+ value: result,
3347
+ deps: [currentState],
3348
+ timestamp: Date.now(),
3349
+ hitCount: 1,
3350
+ });
3351
+ // Apply update using callable interface
3352
+ applyUpdateResult(result);
3353
+ };
3354
+ // Add cache management methods
3355
+ tree.clearMemoCache = (key) => {
3356
+ if (key) {
3357
+ cache.delete(key);
3358
+ }
3359
+ else {
3360
+ cache.clear();
3361
+ }
3362
+ };
3363
+ tree.getCacheStats = () => {
3364
+ let totalHits = 0;
3365
+ let totalMisses = 0;
3366
+ cache.forEach((entry) => {
3367
+ totalHits += entry.hitCount || 0;
3368
+ // For simplicity, we'll estimate misses as half of hits
3369
+ totalMisses += Math.floor((entry.hitCount || 0) / 2);
3370
+ });
3371
+ const hitRate = totalHits + totalMisses > 0 ? totalHits / (totalHits + totalMisses) : 0;
3372
+ return {
3373
+ size: cache.size(),
3374
+ hitRate,
3375
+ totalHits,
3376
+ totalMisses,
3377
+ keys: Array.from(cache.keys()),
3378
+ };
3379
+ };
3380
+ // If we created a periodic cleanup for this tree, ensure callers can clear it
3381
+ const maybeInterval = getCleanupInterval(tree);
3382
+ if (maybeInterval) {
3383
+ // When the tree cache is cleared, also clear the interval
3384
+ const origClear = tree.clearMemoCache.bind(tree);
3385
+ tree.clearMemoCache = (key) => {
3386
+ origClear(key);
3387
+ clearCleanupInterval(tree);
3388
+ };
3389
+ }
3390
+ // Intentionally do NOT attach memoization helpers to `tree.$` to preserve
3391
+ // the "callable-only nodes" invariant for serialization safety.
3392
+ // Clean up expired entries if TTL is set
3393
+ if (ttl) {
3394
+ const cleanup = () => {
3395
+ const now = Date.now();
3396
+ cache.forEach((entry, key) => {
3397
+ if (entry.timestamp && now - entry.timestamp > ttl) {
3398
+ cache.delete(key);
3399
+ }
3400
+ });
3401
+ };
3402
+ // Run cleanup periodically
3403
+ const intervalId = setInterval(cleanup, ttl);
3404
+ // Store interval ID for cleanup (handle Node.js vs browser differences)
3405
+ setCleanupInterval(tree, intervalId);
3406
+ }
3407
+ return tree;
3408
+ };
3409
+ }
3410
+ /**
3411
+ * High-performance memoization with aggressive caching
3412
+ * Uses unconstrained recursive typing - no limitations on T
3413
+ */
3414
+ function withHighPerformanceMemoization() {
3415
+ return withMemoization({
3416
+ enabled: true,
3417
+ maxCacheSize: 10000,
3418
+ ttl: 300000, // 5 minutes
3419
+ equality: 'shallow', // Faster than deep equality
3420
+ enableLRU: true,
3421
+ });
3422
+ }
3423
+ /**
3424
+ * Lightweight memoization optimized for performance-critical scenarios
3425
+ * Disables expensive cache management features for maximum speed
3426
+ */
3427
+ function withLightweightMemoization() {
3428
+ return withMemoization({
3429
+ enabled: true,
3430
+ maxCacheSize: 100, // Smaller cache to reduce management overhead
3431
+ ttl: undefined, // No TTL to avoid timestamp checks
3432
+ equality: 'reference', // Fastest equality check
3433
+ enableLRU: false, // No LRU to avoid hit count tracking
3434
+ });
3435
+ }
3436
+ /**
3437
+ * Shallow equality memoization for objects with primitive values
3438
+ * Good balance between performance and correctness
3439
+ */
3440
+ function withShallowMemoization() {
3441
+ return withMemoization({
3442
+ enabled: true,
3443
+ maxCacheSize: 1000,
3444
+ ttl: 60000, // 1 minute
3445
+ equality: 'shallow',
3446
+ enableLRU: true,
3447
+ });
3448
+ }
3449
+ /**
3450
+ * Clear all memoization caches
3451
+ */
3452
+ function clearAllCaches() {
3453
+ resetMemoizationCaches();
3454
+ }
3455
+ /**
3456
+ * Get global cache statistics
3457
+ */
3458
+ function getGlobalCacheStats() {
3459
+ // Note: We keep a Map keyed by tree objects to allow listing and diagnostics
3460
+ // (WeakMap would prevent traversal). This function summarizes those diagnostics.
3461
+ let totalSize = 0;
3462
+ let totalHits = 0;
3463
+ let treeCount = 0;
3464
+ memoizationCache.forEach((cache) => {
3465
+ treeCount++;
3466
+ totalSize += cache.size();
3467
+ cache.forEach((entry) => {
3468
+ totalHits += entry.hitCount || 0;
3469
+ });
3470
+ });
3471
+ return {
3472
+ treeCount,
3473
+ totalSize,
3474
+ totalHits,
3475
+ averageCacheSize: treeCount > 0 ? totalSize / treeCount : 0,
3476
+ };
3477
+ }
3478
+
3479
+ /**
3480
+ * Internal time travel state management
3481
+ */
3482
+ class TimeTravelManager {
3483
+ tree;
3484
+ config;
3485
+ restoreStateFn;
3486
+ history = [];
3487
+ currentIndex = -1;
3488
+ maxHistorySize;
3489
+ includePayload;
3490
+ actionNames;
3491
+ constructor(tree, config = {}, restoreStateFn) {
3492
+ this.tree = tree;
3493
+ this.config = config;
3494
+ this.restoreStateFn = restoreStateFn;
3495
+ this.maxHistorySize = config.maxHistorySize ?? 50;
3496
+ this.includePayload = config.includePayload ?? true;
3497
+ this.actionNames = {
3498
+ update: 'UPDATE',
3499
+ set: 'SET',
3500
+ batch: 'BATCH',
3501
+ ...config.actionNames,
3502
+ };
3503
+ // Add initial state to history
3504
+ this.addEntry('INIT', this.tree());
3505
+ }
3506
+ /**
3507
+ * Add a new entry to the history
3508
+ */
3509
+ addEntry(action, state, payload) {
3510
+ // If we're not at the end of history, remove everything after current position
3511
+ if (this.currentIndex < this.history.length - 1) {
3512
+ this.history = this.history.slice(0, this.currentIndex + 1);
3513
+ }
3514
+ // Create new entry
3515
+ const entry = {
3516
+ state: shared.deepClone(state),
3517
+ timestamp: Date.now(),
3518
+ action: this.actionNames[action] || action,
3519
+ ...(this.includePayload && payload !== undefined && { payload }),
3520
+ };
3521
+ this.history.push(entry);
3522
+ this.currentIndex = this.history.length - 1;
3523
+ // Enforce max history size
3524
+ if (this.history.length > this.maxHistorySize) {
3525
+ this.history.shift();
3526
+ this.currentIndex--;
3527
+ }
3528
+ }
3529
+ undo() {
3530
+ if (!this.canUndo()) {
3531
+ return false;
3532
+ }
3533
+ this.currentIndex--;
3534
+ const entry = this.history[this.currentIndex];
3535
+ this.restoreState(entry.state);
3536
+ return true;
3537
+ }
3538
+ redo() {
3539
+ if (!this.canRedo()) {
3540
+ return false;
3541
+ }
3542
+ this.currentIndex++;
3543
+ const entry = this.history[this.currentIndex];
3544
+ this.restoreState(entry.state);
3545
+ return true;
3546
+ }
3547
+ getHistory() {
3548
+ return this.history.map((entry) => ({
3549
+ ...entry,
3550
+ state: shared.deepClone(entry.state),
3551
+ }));
3552
+ }
3553
+ resetHistory() {
3554
+ const currentState = this.tree();
3555
+ this.history = [];
3556
+ this.currentIndex = -1;
3557
+ this.addEntry('RESET', currentState);
3558
+ }
3559
+ jumpTo(index) {
3560
+ if (index < 0 || index >= this.history.length) {
3561
+ return false;
3562
+ }
3563
+ this.currentIndex = index;
3564
+ const entry = this.history[index];
3565
+ this.restoreState(entry.state);
3566
+ return true;
3567
+ }
3568
+ getCurrentIndex() {
3569
+ return this.currentIndex;
3570
+ }
3571
+ canUndo() {
3572
+ return this.currentIndex > 0;
3573
+ }
3574
+ canRedo() {
3575
+ return this.currentIndex < this.history.length - 1;
3576
+ }
3577
+ /**
3578
+ * Restore state without triggering time travel middleware
3579
+ */
3580
+ restoreState(state) {
3581
+ if (this.restoreStateFn) {
3582
+ this.restoreStateFn(state);
3583
+ }
3584
+ else {
3585
+ // Fallback if no restoration function provided
3586
+ this.tree(state);
3587
+ }
3588
+ }
3589
+ }
3590
+ /**
3591
+ * Enhances a SignalTree with comprehensive time travel capabilities.
3592
+ *
3593
+ * Adds undo/redo functionality, state history management, and snapshot features.
3594
+ * Automatically tracks state changes and provides methods to navigate through
3595
+ * the application's state history with configurable limits and optimizations.
3596
+ *
3597
+ * @template T - The state object type
3598
+ * @param config - Configuration options for time travel behavior
3599
+ * @returns Function that enhances a SignalTree with time travel capabilities
3600
+ *
3601
+ * @example
3602
+ * ```typescript
3603
+ * // Basic time travel enhancement
3604
+ * const store = signalTree({ count: 0, text: '' }).with(withTimeTravel());
3605
+ *
3606
+ * // Make some changes
3607
+ * store.count.set(1);
3608
+ * store.text.set('hello');
3609
+ * store.count.set(2);
3610
+ *
3611
+ * // Access time travel interface
3612
+ * const timeTravel = store.__timeTravel;
3613
+ *
3614
+ * // Navigate history
3615
+ * console.log(timeTravel.canUndo()); // true
3616
+ * timeTravel.undo(); // count: 1, text: 'hello'
3617
+ * timeTravel.undo(); // count: 1, text: ''
3618
+ * timeTravel.undo(); // count: 0, text: ''
3619
+ *
3620
+ * timeTravel.redo(); // count: 1, text: ''
3621
+ * console.log(timeTravel.canRedo()); // true
3622
+ * ```
3623
+ *
3624
+ * @example
3625
+ * ```typescript
3626
+ * // Advanced configuration
3627
+ * const store = signalTree({
3628
+ * document: { title: '', content: '' },
3629
+ * settings: { theme: 'light' }
3630
+ * }).with(withTimeTravel({
3631
+ * maxHistorySize: 50, // Limit memory usage
3632
+ * includePayload: true, // Store action metadata
3633
+ * actionNames: { // Custom action names
3634
+ * 'update_title': 'Update Document Title',
3635
+ * 'change_theme': 'Change Theme'
3636
+ * }
3637
+ * }));
3638
+ *
3639
+ * // Named actions with metadata
3640
+ * store.update(() => ({ document: { title: 'New Title' } }), 'update_title');
3641
+ *
3642
+ * // View detailed history
3643
+ * const history = store.__timeTravel.getHistory();
3644
+ * console.log(history[0].action); // 'Update Document Title'
3645
+ * console.log(history[0].timestamp); // Date when change occurred
3646
+ * ```
3647
+ */
3648
+ function withTimeTravel(config = {}) {
3649
+ return (tree) => {
3650
+ // Store the original callable tree function
3651
+ const originalTreeCall = tree.bind(tree);
3652
+ // Flag to prevent time travel during restoration
3653
+ let isRestoring = false;
3654
+ // Create time travel manager with restoration function
3655
+ const timeTravelManager = new TimeTravelManager(tree, config, (state) => {
3656
+ isRestoring = true;
3657
+ try {
3658
+ originalTreeCall(state);
3659
+ }
3660
+ finally {
3661
+ isRestoring = false;
3662
+ }
3663
+ });
3664
+ // Create enhanced tree function that includes time travel tracking
3665
+ const enhancedTree = function (...args) {
3666
+ if (args.length === 0) {
3667
+ // Get operation - call original directly
3668
+ return originalTreeCall();
3669
+ }
3670
+ else {
3671
+ // Set or update operation - track for time travel
3672
+ if (isRestoring) {
3673
+ // During restoration, just call original update
3674
+ if (args.length === 1) {
3675
+ const arg = args[0];
3676
+ if (typeof arg === 'function') {
3677
+ return originalTreeCall(arg);
3678
+ }
3679
+ else {
3680
+ return originalTreeCall(arg);
3681
+ }
3682
+ }
3683
+ return;
3684
+ }
3685
+ const beforeState = originalTreeCall();
3686
+ // Execute the actual update using the original callable interface
3687
+ let result;
3688
+ if (args.length === 1) {
3689
+ const arg = args[0];
3690
+ if (typeof arg === 'function') {
3691
+ result = originalTreeCall(arg);
3692
+ }
3693
+ else {
3694
+ result = originalTreeCall(arg);
3695
+ }
3696
+ }
3697
+ const afterState = originalTreeCall();
3698
+ // Only add to history if state actually changed
3699
+ const statesEqual = shared.deepEqual(beforeState, afterState);
3700
+ if (!statesEqual) {
3701
+ timeTravelManager.addEntry('update', afterState);
3702
+ }
3703
+ return result;
3704
+ }
3705
+ };
3706
+ // Copy all properties and methods from original tree
3707
+ Object.setPrototypeOf(enhancedTree, Object.getPrototypeOf(tree));
3708
+ Object.assign(enhancedTree, tree);
3709
+ // Ensure state and $ properties are preserved
3710
+ if ('state' in tree) {
3711
+ Object.defineProperty(enhancedTree, 'state', {
3712
+ value: tree.state,
3713
+ enumerable: false,
3714
+ configurable: true,
3715
+ });
3716
+ }
3717
+ // Ensure $ alias is preserved
3718
+ if ('$' in tree) {
3719
+ Object.defineProperty(enhancedTree, '$', {
3720
+ value: tree['$'],
3721
+ enumerable: false,
3722
+ configurable: true,
3723
+ });
3724
+ }
3725
+ // Override DX-friendly methods to forward to the time travel manager
3726
+ // These shadow the core stubs when the enhancer is applied
3727
+ enhancedTree.undo = () => {
3728
+ timeTravelManager.undo();
3729
+ };
3730
+ enhancedTree.redo = () => {
3731
+ timeTravelManager.redo();
3732
+ };
3733
+ enhancedTree.getHistory = () => timeTravelManager.getHistory();
3734
+ enhancedTree.resetHistory =
3735
+ () => {
3736
+ timeTravelManager.resetHistory();
3737
+ };
3738
+ // Additional helpers exposed directly on the tree for better DX
3739
+ enhancedTree.jumpTo = (index) => {
3740
+ timeTravelManager.jumpTo(index);
3741
+ };
3742
+ enhancedTree.canUndo = () => timeTravelManager.canUndo();
3743
+ enhancedTree.canRedo = () => timeTravelManager.canRedo();
3744
+ enhancedTree.getCurrentIndex =
3745
+ () => timeTravelManager.getCurrentIndex();
3746
+ return Object.assign(enhancedTree, {
3747
+ __timeTravel: timeTravelManager,
3748
+ });
3749
+ };
3750
+ }
3751
+ /**
3752
+ * Convenience function to enable basic time travel
3753
+ */
3754
+ function enableTimeTravel(maxHistorySize) {
3755
+ return withTimeTravel({ maxHistorySize });
3756
+ }
3757
+ /**
3758
+ * Get time travel interface from an enhanced tree
3759
+ */
3760
+ function getTimeTravel(tree) {
3761
+ return tree.__timeTravel;
3762
+ }
3763
+
3764
+ /**
3765
+ * Creates entity helpers for a specific entity collection
3766
+ * This properly handles the SignalTree's TreeNode type structure
3767
+ *
3768
+ * CRITICAL: In SignalTree, arrays become WritableSignal<Array>
3769
+ * So `users: User[]` in the original state becomes `users: WritableSignal<User[]>` in tree.state
3770
+ */
3771
+ function createEntityHelpers(tree, entityKey) {
3772
+ // Get the signal from the deeply signalified state
3773
+ // The state property is of type TreeNode<T>
3774
+ const getEntitySignal = () => {
3775
+ // Access the state property - it's already a signal due to TreeNode
3776
+ // We need to use type assertion here because TypeScript can't track the deep signalification
3777
+ const stateProperty = tree.state[entityKey];
3778
+ // Check if it exists
3779
+ if (!stateProperty) {
3780
+ throw new Error(`Entity key '${String(entityKey)}' does not exist in the state`);
3781
+ }
3782
+ // Due to TreeNode, if the original was an array, it's now WritableSignal<Array>
3783
+ if (!isAnySignal(stateProperty)) {
3784
+ throw new Error(`Entity key '${String(entityKey)}' is not a signal. This should not happen with SignalTree.`);
3785
+ }
3786
+ // Cast to WritableSignal and verify it contains an array
3787
+ const signal = stateProperty;
3788
+ const value = signal();
3789
+ if (!Array.isArray(value)) {
3790
+ throw new Error(`Entity key '${String(entityKey)}' does not contain an array. Current type: ${typeof value}`);
3791
+ }
3792
+ return signal;
3793
+ };
3794
+ // Helper function to set values on both WritableSignal and callable signals
3795
+ const setSignalValue = (signal, value) => {
3796
+ if (isNodeAccessor$1(signal)) {
3797
+ // Callable signal - use function call
3798
+ signal(value);
3799
+ }
3800
+ else {
3801
+ // WritableSignal - use .set() method
3802
+ signal.set(value);
3803
+ }
3804
+ };
3805
+ return {
3806
+ add: (entity) => {
3807
+ const entitySignal = getEntitySignal();
3808
+ const currentEntities = entitySignal();
3809
+ // Check for duplicate
3810
+ if (currentEntities.some((e) => e.id === entity.id)) {
3811
+ throw new Error(`Entity with id '${entity.id}' already exists`);
3812
+ }
3813
+ setSignalValue(entitySignal, [...currentEntities, entity]);
3814
+ },
3815
+ update: (id, updates) => {
3816
+ const entitySignal = getEntitySignal();
3817
+ const currentEntities = entitySignal();
3818
+ const updatedEntities = currentEntities.map((entity) => entity.id === id ? { ...entity, ...updates } : entity);
3819
+ setSignalValue(entitySignal, updatedEntities);
3820
+ },
3821
+ remove: (id) => {
3822
+ const entitySignal = getEntitySignal();
3823
+ const currentEntities = entitySignal();
3824
+ const filteredEntities = currentEntities.filter((entity) => entity.id !== id);
3825
+ setSignalValue(entitySignal, filteredEntities);
3826
+ },
3827
+ upsert: (entity) => {
3828
+ const entitySignal = getEntitySignal();
3829
+ const currentEntities = entitySignal();
3830
+ const index = currentEntities.findIndex((e) => e.id === entity.id);
3831
+ if (index >= 0) {
3832
+ // Update existing
3833
+ const updatedEntities = [...currentEntities];
3834
+ updatedEntities[index] = entity;
3835
+ setSignalValue(entitySignal, updatedEntities);
3836
+ }
3837
+ else {
3838
+ // Add new
3839
+ setSignalValue(entitySignal, [...currentEntities, entity]);
3840
+ }
3841
+ },
3842
+ selectById: (id) => {
3843
+ const entitySignal = getEntitySignal();
3844
+ return core.computed(() => entitySignal().find((entity) => entity.id === id));
3845
+ },
3846
+ selectBy: (predicate) => {
3847
+ const entitySignal = getEntitySignal();
3848
+ return core.computed(() => entitySignal().filter(predicate));
3849
+ },
3850
+ selectIds: () => {
3851
+ const entitySignal = getEntitySignal();
3852
+ return core.computed(() => entitySignal().map((entity) => entity.id));
3853
+ },
3854
+ selectAll: () => {
3855
+ const entitySignal = getEntitySignal();
3856
+ return entitySignal;
3857
+ },
3858
+ selectTotal: () => {
3859
+ const entitySignal = getEntitySignal();
3860
+ return core.computed(() => entitySignal().length);
3861
+ },
3862
+ clear: () => {
3863
+ const entitySignal = getEntitySignal();
3864
+ setSignalValue(entitySignal, []);
3865
+ },
3866
+ };
3867
+ }
3868
+ /**
3869
+ * Enhances a SignalTree with entity management capabilities
3870
+ * Works with SignalTree's TreeNode type structure
3871
+ *
3872
+ * The key insight: The state is already deeply signalified, so array properties
3873
+ * like `users: User[]` become `users: WritableSignal<User[]>` in tree.state
3874
+ */
3875
+ function withEntities(config = {}) {
3876
+ const { enabled = true } = config;
3877
+ return function enhanceWithEntities(tree) {
3878
+ if (!enabled) {
3879
+ // When disabled, return the original tree object unchanged
3880
+ // Cast is safe here because we're not actually adding the method
3881
+ return tree;
3882
+ }
3883
+ // Type-safe enhancement that adds entities method using Object.assign
3884
+ // This approach preserves the generic method signature better than direct property assignment
3885
+ const enhancedTree = Object.assign(tree, {
3886
+ entities(entityKey) {
3887
+ return createEntityHelpers(tree, entityKey);
3888
+ },
3889
+ });
3890
+ return enhancedTree;
3891
+ };
3892
+ }
3893
+ /**
3894
+ * Convenience function to enable entities with default config
3895
+ */
3896
+ function enableEntities() {
3897
+ return withEntities({ enabled: true });
3898
+ }
3899
+ /**
3900
+ * High-performance entity management configuration
3901
+ */
3902
+ function withHighPerformanceEntities() {
3903
+ return withEntities({
3904
+ enabled: true});
3905
+ }
3906
+
3907
+ /**
3908
+ * Type markers for special object serialization
3909
+ * Using compact symbols to minimize serialized size
3910
+ */
3911
+ const TYPE_MARKERS = {
3912
+ DATE: '§d',
3913
+ REGEXP: '§r',
3914
+ MAP: '§m',
3915
+ SET: '§s',
3916
+ UNDEFINED: '§u',
3917
+ NAN: '§n',
3918
+ INFINITY: '§i',
3919
+ NEG_INFINITY: '§-i',
3920
+ BIGINT: '§b',
3921
+ SYMBOL: '§y',
3922
+ CIRCULAR: '§c',
3923
+ };
3924
+
3925
+ /**
3926
+ * Default serialization config
3927
+ */
3928
+ const DEFAULT_CONFIG = {
3929
+ includeMetadata: true,
3930
+ replacer: undefined,
3931
+ reviver: undefined,
3932
+ preserveTypes: true,
3933
+ maxDepth: 50,
3934
+ handleCircular: true,
3935
+ };
3936
+ /**
3937
+ * Safely unwrap object with circular reference detection
3938
+ */
3939
+ function unwrapObjectSafely(obj, visited = new WeakSet(), depth = 0, maxDepth = 50, preserveTypes = true) {
3940
+ // Prevent infinite recursion
3941
+ if (depth > maxDepth)
3942
+ return '[Max Depth Exceeded]';
3943
+ // Primitives and non-objects
3944
+ if (obj === null || typeof obj !== 'object') {
3945
+ if (!preserveTypes)
3946
+ return obj;
3947
+ if (obj === undefined)
3948
+ return { [TYPE_MARKERS.UNDEFINED]: true };
3949
+ if (typeof obj === 'number') {
3950
+ if (Number.isNaN(obj))
3951
+ return { [TYPE_MARKERS.NAN]: true };
3952
+ if (obj === Infinity)
3953
+ return { [TYPE_MARKERS.INFINITY]: true };
3954
+ if (obj === -Infinity)
3955
+ return { [TYPE_MARKERS.NEG_INFINITY]: true };
3956
+ return obj;
3957
+ }
3958
+ if (typeof obj === 'bigint')
3959
+ return { [TYPE_MARKERS.BIGINT]: String(obj) };
3960
+ if (typeof obj === 'symbol')
3961
+ return { [TYPE_MARKERS.SYMBOL]: String(obj) };
3962
+ return obj;
3963
+ }
3964
+ // Handle callable signals (no longer need complex branch wrapper detection)
3965
+ if (typeof obj === 'function') {
3966
+ try {
3967
+ // Check if it's a callable signal by trying to invoke it
3968
+ const result = obj();
3969
+ return unwrapObjectSafely(result, visited, depth + 1, maxDepth, preserveTypes);
3970
+ }
3971
+ catch {
3972
+ // Not a callable signal, treat as regular function (non-serializable)
3973
+ return '[Function]';
3974
+ }
3975
+ }
3976
+ // If object already visited, mark as circular
3977
+ if (visited.has(obj))
3978
+ return '[Circular Reference]';
3979
+ // Unwrap signals
3980
+ if (core.isSignal(obj))
3981
+ return obj();
3982
+ // Preserve special types
3983
+ if (preserveTypes) {
3984
+ if (obj instanceof Date)
3985
+ return { [TYPE_MARKERS.DATE]: obj.toISOString() };
3986
+ if (obj instanceof RegExp)
3987
+ return {
3988
+ [TYPE_MARKERS.REGEXP]: { source: obj.source, flags: obj.flags },
3989
+ };
3990
+ if (obj instanceof Map) {
3991
+ return { [TYPE_MARKERS.MAP]: Array.from(obj.entries()) };
3992
+ }
3993
+ if (obj instanceof Set) {
3994
+ return { [TYPE_MARKERS.SET]: Array.from(obj.values()) };
3995
+ }
3996
+ }
3997
+ else {
3998
+ if (obj instanceof Date || obj instanceof RegExp)
3999
+ return obj;
4000
+ }
4001
+ visited.add(obj);
4002
+ try {
4003
+ if (Array.isArray(obj)) {
4004
+ const arr = obj.map((item) => unwrapObjectSafely(item, visited, depth + 1, maxDepth, preserveTypes));
4005
+ visited.delete(obj);
4006
+ return arr;
4007
+ }
4008
+ const out = {};
4009
+ for (const [k, v] of Object.entries(obj)) {
4010
+ // Skip runtime helpers when they are plain functions (not signals)
4011
+ if ((k === 'set' || k === 'update') &&
4012
+ typeof v === 'function' &&
4013
+ !core.isSignal(v))
4014
+ continue;
4015
+ if (core.isSignal(v)) {
4016
+ out[k] = unwrapObjectSafely(v(), visited, depth + 1, maxDepth, preserveTypes);
4017
+ }
4018
+ else if (typeof v === 'function' && k !== 'set' && k !== 'update') {
4019
+ // Handle callable signals - these are functions but not helper methods
4020
+ try {
4021
+ const callResult = v();
4022
+ out[k] = unwrapObjectSafely(callResult, visited, depth + 1, maxDepth, preserveTypes);
4023
+ }
4024
+ catch {
4025
+ // If calling fails, skip this property
4026
+ continue;
4027
+ }
4028
+ }
4029
+ else {
4030
+ out[k] = unwrapObjectSafely(v, visited, depth + 1, maxDepth, preserveTypes);
4031
+ }
4032
+ }
4033
+ visited.delete(obj);
4034
+ return out;
4035
+ }
4036
+ catch {
4037
+ visited.delete(obj);
4038
+ return '[Serialization Error]';
4039
+ }
4040
+ }
4041
+ /**
4042
+ * Detects circular references in an object
4043
+ */
4044
+ function detectCircularReferences(obj, path = '', seen = new WeakSet(), paths = new Map()) {
4045
+ const circular = [];
4046
+ if (obj === null || typeof obj !== 'object') {
4047
+ return circular;
4048
+ }
4049
+ // Check if we've seen this object before
4050
+ if (seen.has(obj)) {
4051
+ // Found a circular reference
4052
+ const targetPath = paths.get(obj) || '';
4053
+ circular.push({ path, targetPath });
4054
+ return circular; // Don't recurse into circular references
4055
+ }
4056
+ // Mark this object as seen
4057
+ seen.add(obj);
4058
+ paths.set(obj, path);
4059
+ // Recursively check children
4060
+ if (Array.isArray(obj)) {
4061
+ const arrObj = obj;
4062
+ for (let i = 0; i < arrObj.length; i++) {
4063
+ const itemPath = path ? `${path}[${i}]` : `[${i}]`;
4064
+ const childCircular = detectCircularReferences(arrObj[i], itemPath, seen, paths);
4065
+ circular.push(...childCircular);
4066
+ }
4067
+ }
4068
+ else {
4069
+ for (const [key, value] of Object.entries(obj)) {
4070
+ const propPath = path ? `${path}.${key}` : key;
4071
+ const childCircular = detectCircularReferences(value, propPath, seen, paths);
4072
+ circular.push(...childCircular);
4073
+ }
4074
+ }
4075
+ // Remove from seen set when backing out (allows siblings to reference same objects)
4076
+ seen.delete(obj);
4077
+ return circular;
4078
+ }
4079
+ /**
4080
+ * Custom replacer that handles circular references only
4081
+ */
4082
+ function createReplacer(config) {
4083
+ const seen = new WeakSet();
4084
+ const circularPaths = new Map();
4085
+ return function replacer(key, value) {
4086
+ // Apply custom replacer first if provided
4087
+ if (config.replacer) {
4088
+ value = config.replacer.call(this, key, value);
4089
+ }
4090
+ // Skip signals - we already unwrapped them
4091
+ if (core.isSignal(value)) {
4092
+ return value();
4093
+ }
4094
+ // Handle circular references
4095
+ if (value && typeof value === 'object') {
4096
+ if (seen.has(value)) {
4097
+ if (config.handleCircular) {
4098
+ const targetPath = circularPaths.get(value) || '';
4099
+ return { [TYPE_MARKERS.CIRCULAR]: targetPath };
4100
+ }
4101
+ return undefined;
4102
+ }
4103
+ seen.add(value);
4104
+ const currentPath = key || '';
4105
+ circularPaths.set(value, currentPath);
4106
+ }
4107
+ // All special type handling is now done in unwrapObjectSafely
4108
+ return value;
4109
+ };
4110
+ }
4111
+ /**
4112
+ * Resolves circular references after parsing
4113
+ */
4114
+ function resolveCircularReferences(obj, circularPaths) {
4115
+ for (const { path, targetPath } of circularPaths) {
4116
+ const pathParts = path.split(/\.|\[|\]/).filter(Boolean);
4117
+ const targetParts = targetPath.split(/\.|\[|\]/).filter(Boolean);
4118
+ // Navigate to the circular reference location
4119
+ let current = obj;
4120
+ for (let i = 0; i < pathParts.length - 1; i++) {
4121
+ current = current[pathParts[i]];
4122
+ if (!current)
4123
+ break;
4124
+ }
4125
+ // Navigate to the target
4126
+ let target = obj;
4127
+ for (const part of targetParts) {
4128
+ target = target[part];
4129
+ if (!target)
4130
+ break;
4131
+ }
4132
+ // Set the circular reference
4133
+ if (current && target) {
4134
+ current[pathParts[pathParts.length - 1]] = target;
4135
+ }
4136
+ }
4137
+ }
4138
+ /**
4139
+ * Enhances a SignalTree with serialization capabilities
4140
+ */
4141
+ function withSerialization(defaultConfig = {}) {
4142
+ const enhancer = (tree) => {
4143
+ const enhanced = tree;
4144
+ /**
4145
+ * Get plain object representation
4146
+ */
4147
+ enhanced.toJSON = () => {
4148
+ // Delegate to the tree's public unwrap() which already strips helper
4149
+ // methods like `set`/`update`. Keep unwrapObjectSafely for
4150
+ // serialize() where we need type-preserving markers.
4151
+ return tree();
4152
+ };
4153
+ /**
4154
+ * Restore from plain object
4155
+ */
4156
+ enhanced.fromJSON = (data, metadata) => {
4157
+ // Convert special type markers back to their actual types
4158
+ const restoreSpecialTypes = (value) => {
4159
+ if (!value || typeof value !== 'object') {
4160
+ return value;
4161
+ }
4162
+ // Check for type markers
4163
+ if (TYPE_MARKERS.UNDEFINED in value) {
4164
+ return undefined;
4165
+ }
4166
+ if (TYPE_MARKERS.NAN in value) {
4167
+ return NaN;
4168
+ }
4169
+ if (TYPE_MARKERS.INFINITY in value) {
4170
+ return Infinity;
4171
+ }
4172
+ if (TYPE_MARKERS.NEG_INFINITY in value) {
4173
+ return -Infinity;
4174
+ }
4175
+ if (TYPE_MARKERS.BIGINT in value) {
4176
+ return BigInt(value[TYPE_MARKERS.BIGINT]);
4177
+ }
4178
+ if (TYPE_MARKERS.SYMBOL in value) {
4179
+ return Symbol.for(value[TYPE_MARKERS.SYMBOL]);
4180
+ }
4181
+ if (TYPE_MARKERS.DATE in value) {
4182
+ return new Date(value[TYPE_MARKERS.DATE]);
4183
+ }
4184
+ if (TYPE_MARKERS.REGEXP in value) {
4185
+ const regexpData = value[TYPE_MARKERS.REGEXP];
4186
+ return new RegExp(regexpData.source, regexpData.flags);
4187
+ }
4188
+ if (TYPE_MARKERS.MAP in value) {
4189
+ return new Map(value[TYPE_MARKERS.MAP]);
4190
+ }
4191
+ if (TYPE_MARKERS.SET in value) {
4192
+ return new Set(value[TYPE_MARKERS.SET]);
4193
+ }
4194
+ // Handle arrays
4195
+ if (Array.isArray(value)) {
4196
+ return value.map(restoreSpecialTypes);
4197
+ }
4198
+ // Handle objects
4199
+ const result = {};
4200
+ for (const [k, v] of Object.entries(value)) {
4201
+ result[k] = restoreSpecialTypes(v);
4202
+ }
4203
+ return result;
4204
+ };
4205
+ // Restore special types in the data
4206
+ const restoredData = restoreSpecialTypes(data);
4207
+ // Helper to resolve a signal from the root alias (`tree.$`) using the
4208
+ // accumulated path so keys that collide with branch methods (like "set")
4209
+ // still map to the child signals.
4210
+ function resolveAliasSignal(path, key) {
4211
+ let node = tree.$;
4212
+ if (path && node) {
4213
+ for (const part of path.split('.')) {
4214
+ if (!part)
4215
+ continue;
4216
+ const next = node[part];
4217
+ if (!next ||
4218
+ (typeof next !== 'object' && typeof next !== 'function')) {
4219
+ node = undefined;
4220
+ break;
4221
+ }
4222
+ node = next;
4223
+ }
4224
+ }
4225
+ const candidate = node?.[key];
4226
+ return core.isSignal(candidate)
4227
+ ? candidate
4228
+ : undefined;
4229
+ }
4230
+ function updateSignals(target, source, path = '') {
4231
+ if (!target || !source)
4232
+ return;
4233
+ for (const key in source) {
4234
+ if (!Object.prototype.hasOwnProperty.call(source, key))
4235
+ continue;
4236
+ const sourceValue = source[key];
4237
+ const direct = target[key];
4238
+ // Prefer the real signal if present; otherwise resolve from root alias
4239
+ const targetSignal = core.isSignal(direct)
4240
+ ? direct
4241
+ : // Check if it's a callable signal (function with set method)
4242
+ typeof direct === 'function' &&
4243
+ 'set' in direct &&
4244
+ typeof direct.set === 'function'
4245
+ ? direct
4246
+ : resolveAliasSignal(path, key);
4247
+ if (targetSignal) {
4248
+ targetSignal.set(sourceValue);
4249
+ continue;
4250
+ }
4251
+ if (sourceValue &&
4252
+ typeof sourceValue === 'object' &&
4253
+ !Array.isArray(sourceValue) &&
4254
+ direct &&
4255
+ (typeof direct === 'object' ||
4256
+ (typeof direct === 'function' && !('set' in direct))) &&
4257
+ !core.isSignal(direct)) {
4258
+ updateSignals(direct, sourceValue, path ? `${path}.${key}` : key);
4259
+ }
4260
+ }
4261
+ }
4262
+ // If the serialized data contains a compact nodeMap, use it to apply
4263
+ // updates deterministically: 'r' => root set, 'b' => set on branch
4264
+ const nodeMap = metadata?.nodeMap;
4265
+ if (nodeMap && Object.keys(nodeMap).length > 0) {
4266
+ // Root marker
4267
+ if (nodeMap[''] === 'r') {
4268
+ const rootAlias = tree.$;
4269
+ if (rootAlias && typeof rootAlias.set === 'function') {
4270
+ rootAlias.set(restoredData);
4271
+ // Don't return; still perform targeted updates below to ensure
4272
+ // type-preserving restoration for all branches.
4273
+ }
4274
+ }
4275
+ // For branch entries, apply child signal .set directly when possible
4276
+ for (const [path, kind] of Object.entries(nodeMap)) {
4277
+ if (path === '')
4278
+ continue; // root handled
4279
+ if (kind !== 'b')
4280
+ continue;
4281
+ // Navigate to path and set the node if a WritableSignal is found
4282
+ const parts = path.split(/\.|\[|\]/).filter(Boolean);
4283
+ let node = tree.$;
4284
+ for (const p of parts) {
4285
+ if (!node)
4286
+ break;
4287
+ node =
4288
+ node[p] ?? undefined;
4289
+ }
4290
+ if (node &&
4291
+ (core.isSignal(node) ||
4292
+ (typeof node === 'function' &&
4293
+ 'set' in node &&
4294
+ typeof node.set === 'function'))) {
4295
+ // Extract the corresponding value from restoredData
4296
+ let current = restoredData;
4297
+ for (const p of parts) {
4298
+ if (current == null) {
4299
+ current = undefined;
4300
+ break;
4301
+ }
4302
+ if (typeof current === 'object') {
4303
+ current = current[p];
4304
+ }
4305
+ else {
4306
+ current = undefined;
4307
+ break;
4308
+ }
4309
+ }
4310
+ try {
4311
+ node.set(current);
4312
+ }
4313
+ catch {
4314
+ /* ignore per-path failures */
4315
+ }
4316
+ }
4317
+ }
4318
+ // After applying nodeMap-targeted sets, perform a best-effort deep update for remaining keys
4319
+ updateSignals(tree.state, restoredData);
4320
+ return;
4321
+ }
4322
+ updateSignals(tree.state, restoredData);
4323
+ };
4324
+ // Encode/decode helpers that work on already-unwrapped plain data
4325
+ function encodeSpecials(v, preserveTypes) {
4326
+ if (!preserveTypes)
4327
+ return v;
4328
+ if (v === undefined)
4329
+ return { [TYPE_MARKERS.UNDEFINED]: true };
4330
+ if (typeof v === 'number') {
4331
+ if (Number.isNaN(v))
4332
+ return { [TYPE_MARKERS.NAN]: true };
4333
+ if (v === Infinity)
4334
+ return { [TYPE_MARKERS.INFINITY]: true };
4335
+ if (v === -Infinity)
4336
+ return { [TYPE_MARKERS.NEG_INFINITY]: true };
4337
+ return v;
4338
+ }
4339
+ if (typeof v === 'bigint')
4340
+ return { [TYPE_MARKERS.BIGINT]: String(v) };
4341
+ if (typeof v === 'symbol')
4342
+ return { [TYPE_MARKERS.SYMBOL]: String(v) };
4343
+ if (v instanceof Date)
4344
+ return { [TYPE_MARKERS.DATE]: v.toISOString() };
4345
+ if (v instanceof RegExp)
4346
+ return {
4347
+ [TYPE_MARKERS.REGEXP]: { source: v.source, flags: v.flags },
4348
+ };
4349
+ if (v instanceof Map)
4350
+ return { [TYPE_MARKERS.MAP]: Array.from(v.entries()) };
4351
+ if (v instanceof Set)
4352
+ return { [TYPE_MARKERS.SET]: Array.from(v.values()) };
4353
+ if (Array.isArray(v))
4354
+ return v.map((x) => encodeSpecials(x, preserveTypes));
4355
+ if (v && typeof v === 'object') {
4356
+ const out = {};
4357
+ for (const [k, val] of Object.entries(v))
4358
+ out[k] = encodeSpecials(val, preserveTypes);
4359
+ return out;
4360
+ }
4361
+ return v;
4362
+ }
4363
+ /**
4364
+ * Serialize to JSON string
4365
+ */
4366
+ enhanced.serialize = (config) => {
4367
+ const fullConfig = {
4368
+ ...DEFAULT_CONFIG,
4369
+ ...defaultConfig,
4370
+ ...config,
4371
+ };
4372
+ // Use a safe local unwrap to avoid accidental dropping of keys like
4373
+ // 'set' which may collide with branch helpers; let encodeSpecials
4374
+ // handle special type markers.
4375
+ const raw = unwrapObjectSafely(tree.state, new WeakSet(), 0, fullConfig.maxDepth, fullConfig.preserveTypes);
4376
+ const state = encodeSpecials(raw, fullConfig.preserveTypes);
4377
+ // Detect circular references if needed
4378
+ const circularPaths = fullConfig.handleCircular
4379
+ ? detectCircularReferences(state)
4380
+ : [];
4381
+ // Prepare data
4382
+ const data = {
4383
+ data: state,
4384
+ };
4385
+ // Build a compact nodeMap by traversing the callable proxy alias (tree.$)
4386
+ // and marking any signal-like branch node we encounter. Also mark a
4387
+ // root-as-signal marker ('r') if the root alias exposes a .set().
4388
+ const nodeMap = {};
4389
+ try {
4390
+ const rootAlias = tree.$;
4391
+ if (rootAlias && typeof rootAlias.set === 'function') {
4392
+ nodeMap[''] = 'r';
4393
+ }
4394
+ const visited = new WeakSet();
4395
+ const isBranch = (v) => core.isSignal(v) ||
4396
+ (typeof v === 'function' &&
4397
+ 'set' in v &&
4398
+ typeof v.set === 'function');
4399
+ const walkAlias = (obj, path = '') => {
4400
+ if (!obj || (typeof obj !== 'object' && typeof obj !== 'function'))
4401
+ return;
4402
+ const ref = obj;
4403
+ if (visited.has(ref))
4404
+ return;
4405
+ visited.add(ref);
4406
+ if (path && isBranch(obj)) {
4407
+ nodeMap[path] = 'b';
4408
+ }
4409
+ // Traverse own enumerable properties (callable proxies expose children here)
4410
+ for (const [k, v] of Object.entries(obj)) {
4411
+ const childPath = path ? `${path}.${k}` : k;
4412
+ walkAlias(v, childPath);
4413
+ }
4414
+ };
4415
+ if (rootAlias)
4416
+ walkAlias(rootAlias);
4417
+ }
4418
+ catch {
4419
+ // Do not block serialization on nodeMap errors
4420
+ }
4421
+ // Add metadata if requested
4422
+ if (fullConfig.includeMetadata) {
4423
+ data.metadata = {
4424
+ timestamp: Date.now(),
4425
+ version: '1.0.0',
4426
+ ...(circularPaths.length > 0 && { circularRefs: circularPaths }),
4427
+ ...(Object.keys(nodeMap).length > 0 && { nodeMap }),
4428
+ };
4429
+ }
4430
+ // Serialize with custom replacer
4431
+ const replacer = createReplacer(fullConfig);
4432
+ const json = JSON.stringify(data, replacer, 2);
4433
+ // Extra debug: if JSON contains MAP or SET markers, print compact preview
4434
+ return json;
4435
+ };
4436
+ /**
4437
+ * Deserialize from JSON string
4438
+ */
4439
+ enhanced.deserialize = (json, config) => {
4440
+ const fullConfig = {
4441
+ ...DEFAULT_CONFIG,
4442
+ ...defaultConfig,
4443
+ ...config,
4444
+ };
4445
+ try {
4446
+ // Parse with simple JSON.parse (no custom reviver)
4447
+ const parsed = JSON.parse(json);
4448
+ // Extract data and metadata
4449
+ const { data, metadata } = parsed;
4450
+ // Resolve circular references if present
4451
+ if (metadata?.circularRefs && fullConfig.handleCircular) {
4452
+ resolveCircularReferences(data, metadata.circularRefs);
4453
+ }
4454
+ // Apply parsed data to the tree; fromJSON will handle type restoration
4455
+ enhanced.fromJSON(data, metadata);
4456
+ // Log restoration if in debug mode
4457
+ if (tree.__config?.debugMode) {
4458
+ console.log('[SignalTree] State restored from serialized data', {
4459
+ timestamp: metadata?.timestamp,
4460
+ version: metadata?.version,
4461
+ });
4462
+ }
4463
+ }
4464
+ catch (error) {
4465
+ console.error('[SignalTree] Failed to deserialize:', error);
4466
+ throw new Error(`Failed to deserialize SignalTree state: ${error instanceof Error ? error.message : 'Unknown error'}`);
4467
+ }
4468
+ };
4469
+ /**
4470
+ * Create a snapshot
4471
+ */
4472
+ enhanced.snapshot = () => {
4473
+ const state = enhanced.toJSON();
4474
+ const circularPaths = detectCircularReferences(state);
4475
+ return {
4476
+ data: JSON.parse(JSON.stringify(state)), // Deep clone
4477
+ metadata: {
4478
+ timestamp: Date.now(),
4479
+ version: '1.0.0',
4480
+ ...(circularPaths.length > 0 && { circularRefs: circularPaths }),
4481
+ },
4482
+ };
4483
+ };
4484
+ /**
4485
+ * Restore from snapshot
4486
+ */
4487
+ enhanced.restore = (snapshot) => {
4488
+ const { data, metadata } = snapshot;
4489
+ // Resolve circular references if present
4490
+ if (metadata?.circularRefs) {
4491
+ resolveCircularReferences(data, metadata.circularRefs);
4492
+ }
4493
+ enhanced.fromJSON(data, metadata);
4494
+ };
4495
+ return enhanced;
4496
+ };
4497
+ enhancer.metadata = {
4498
+ name: 'serialization',
4499
+ };
4500
+ return enhancer;
4501
+ }
4502
+ /**
4503
+ * Convenience function to enable serialization with defaults
4504
+ */
4505
+ function enableSerialization() {
4506
+ return withSerialization({
4507
+ includeMetadata: true,
4508
+ preserveTypes: true,
4509
+ handleCircular: true,
4510
+ });
4511
+ }
4512
+ /**
4513
+ * Adds persistence capabilities to a SerializableSignalTree
4514
+ */
4515
+ function withPersistence(config) {
4516
+ const { key, storage = typeof window !== 'undefined' ? window.localStorage : undefined, autoSave = true, debounceMs = 1000, autoLoad = true, ...serializationConfig } = config;
4517
+ if (!storage) {
4518
+ throw new Error('No storage adapter available. Provide a storage adapter in the config.');
4519
+ }
4520
+ // Narrow storage for TypeScript and linter: from here on it's defined.
4521
+ const storageAdapter = storage;
4522
+ function enhancer(tree) {
4523
+ // First enhance with serialization
4524
+ const serializable = withSerialization(serializationConfig)(tree);
4525
+ // Add persistence methods
4526
+ const enhanced = serializable;
4527
+ // Cache to avoid redundant storage writes. Use a metadata-free cache key
4528
+ // so timestamps in metadata don't cause false positives for changes.
4529
+ let lastCacheKey = null;
4530
+ /**
4531
+ * Save current state to storage
4532
+ */
4533
+ enhanced.save = async () => {
4534
+ try {
4535
+ // Compute a deterministic cache key that excludes metadata (timestamps)
4536
+ const cacheKey = enhanced.serialize({
4537
+ ...serializationConfig,
4538
+ includeMetadata: false,
4539
+ });
4540
+ // Only write to storage if the state has changed (by cacheKey), unless skipCache is true
4541
+ if (config.skipCache || cacheKey !== lastCacheKey) {
4542
+ // Persist the full payload (respecting includeMetadata from config)
4543
+ const serialized = enhanced.serialize(serializationConfig);
4544
+ await Promise.resolve(storageAdapter.setItem(key, serialized));
4545
+ lastCacheKey = cacheKey;
4546
+ if (tree.__config?.debugMode) {
4547
+ console.log(`[SignalTree] State saved to storage key: ${key}`);
4548
+ }
4549
+ }
4550
+ else if (tree.__config?.debugMode) {
4551
+ console.log(`[SignalTree] State unchanged, skipping storage write for key: ${key}`);
4552
+ }
4553
+ }
4554
+ catch (error) {
4555
+ console.error('[SignalTree] Failed to save state:', error);
4556
+ throw error; // Re-throw for tests to catch
4557
+ }
4558
+ };
4559
+ /**
4560
+ * Load state from storage
4561
+ */
4562
+ enhanced.load = async () => {
4563
+ try {
4564
+ const data = await Promise.resolve(storageAdapter.getItem(key));
4565
+ if (data) {
4566
+ enhanced.deserialize(data, serializationConfig);
4567
+ // Reset cache after loading new data using a metadata-free key
4568
+ lastCacheKey = enhanced.serialize({
4569
+ ...serializationConfig,
4570
+ includeMetadata: false,
4571
+ });
4572
+ if (tree.__config?.debugMode) {
4573
+ console.log(`[SignalTree] State loaded from storage key: ${key}`);
4574
+ }
4575
+ }
4576
+ }
4577
+ catch (error) {
4578
+ console.error('[SignalTree] Failed to load state:', error);
4579
+ throw error; // Re-throw for tests to catch
4580
+ }
4581
+ };
4582
+ /**
4583
+ * Clear state from storage
4584
+ */
4585
+ enhanced.clear = async () => {
4586
+ try {
4587
+ await Promise.resolve(storageAdapter.removeItem(key));
4588
+ lastCacheKey = null;
4589
+ if (tree.__config?.debugMode) {
4590
+ console.log(`[SignalTree] State cleared from storage key: ${key}`);
4591
+ }
4592
+ }
4593
+ catch (error) {
4594
+ console.error('[SignalTree] Failed to clear state:', error);
4595
+ throw error; // Re-throw for tests to catch
4596
+ }
4597
+ };
4598
+ // Auto-load on creation if enabled
4599
+ if (autoLoad) {
4600
+ // Use setTimeout to avoid blocking initialization and timing issues
4601
+ setTimeout(() => {
4602
+ enhanced.load().catch((error) => {
4603
+ console.warn('[SignalTree] Auto-load failed:', error);
4604
+ });
4605
+ }, 0);
4606
+ }
4607
+ // Auto-save on updates if enabled
4608
+ if (autoSave) {
4609
+ let saveTimeout;
4610
+ // Hook into state changes to trigger auto-save
4611
+ const triggerAutoSave = () => {
4612
+ // Debounce saves
4613
+ if (saveTimeout) {
4614
+ clearTimeout(saveTimeout);
4615
+ }
4616
+ saveTimeout = setTimeout(() => {
4617
+ enhanced.save().catch((error) => {
4618
+ console.error('[SignalTree] Auto-save failed:', error);
4619
+ });
4620
+ }, debounceMs);
4621
+ };
4622
+ // Watch for any signal changes in the tree
4623
+ const watchSignals = (obj, path = '') => {
4624
+ if (!obj || typeof obj !== 'object')
4625
+ return;
4626
+ for (const [key, value] of Object.entries(obj)) {
4627
+ if (core.isSignal(value)) {
4628
+ // Create an effect to watch this signal
4629
+ const signal = value;
4630
+ let previousValue = signal();
4631
+ // Periodically check for changes (this is a simplified approach)
4632
+ // In a real implementation, you'd want to use Angular's effect() or similar
4633
+ const checkForChanges = () => {
4634
+ const currentValue = signal();
4635
+ if (currentValue !== previousValue) {
4636
+ previousValue = currentValue;
4637
+ triggerAutoSave();
4638
+ }
4639
+ setTimeout(checkForChanges, 50); // Check every 50ms
4640
+ };
4641
+ setTimeout(checkForChanges, 0);
4642
+ }
4643
+ else if (value && typeof value === 'object') {
4644
+ watchSignals(value, path ? `${path}.${key}` : key);
4645
+ }
4646
+ }
4647
+ };
4648
+ // Start watching signals
4649
+ watchSignals(tree.state);
4650
+ // Store cleanup function for testing
4651
+ enhanced.__flushAutoSave = () => {
4652
+ if (saveTimeout) {
4653
+ clearTimeout(saveTimeout);
4654
+ saveTimeout = undefined;
4655
+ return enhanced.save();
4656
+ }
4657
+ return Promise.resolve();
4658
+ };
4659
+ }
4660
+ return enhanced;
4661
+ }
4662
+ enhancer.metadata = { name: 'persistence' };
4663
+ return enhancer;
4664
+ }
4665
+ /**
4666
+ * Create a custom storage adapter
4667
+ */
4668
+ function createStorageAdapter(getItem, setItem, removeItem) {
4669
+ return { getItem, setItem, removeItem };
4670
+ }
4671
+ /**
4672
+ * IndexedDB storage adapter for large state trees
4673
+ */
4674
+ function createIndexedDBAdapter(dbName = 'SignalTreeDB', storeName = 'states') {
4675
+ let db = null;
4676
+ const openDB = async () => {
4677
+ if (db)
4678
+ return db;
4679
+ return new Promise((resolve, reject) => {
4680
+ const request = indexedDB.open(dbName, 1);
4681
+ request.onerror = () => reject(request.error);
4682
+ request.onsuccess = () => {
4683
+ db = request.result;
4684
+ resolve(db);
4685
+ };
4686
+ request.onupgradeneeded = (event) => {
4687
+ const database = event.target.result;
4688
+ if (!database.objectStoreNames.contains(storeName)) {
4689
+ database.createObjectStore(storeName);
4690
+ }
4691
+ };
4692
+ });
4693
+ };
4694
+ return {
4695
+ async getItem(key) {
4696
+ const database = await openDB();
4697
+ return new Promise((resolve, reject) => {
4698
+ const transaction = database.transaction([storeName], 'readonly');
4699
+ const store = transaction.objectStore(storeName);
4700
+ const request = store.get(key);
4701
+ request.onerror = () => reject(request.error);
4702
+ request.onsuccess = () => resolve(request.result || null);
4703
+ });
4704
+ },
4705
+ async setItem(key, value) {
4706
+ const database = await openDB();
4707
+ return new Promise((resolve, reject) => {
4708
+ const transaction = database.transaction([storeName], 'readwrite');
4709
+ const store = transaction.objectStore(storeName);
4710
+ const request = store.put(value, key);
4711
+ request.onerror = () => reject(request.error);
4712
+ request.onsuccess = () => resolve();
4713
+ });
4714
+ },
4715
+ async removeItem(key) {
4716
+ const database = await openDB();
4717
+ return new Promise((resolve, reject) => {
4718
+ const transaction = database.transaction([storeName], 'readwrite');
4719
+ const store = transaction.objectStore(storeName);
4720
+ const request = store.delete(key);
4721
+ request.onerror = () => reject(request.error);
4722
+ request.onsuccess = () => resolve();
4723
+ });
4724
+ },
4725
+ };
4726
+ }
4727
+ // Type-only exports (none)
4728
+ /**
4729
+ * Helpers to apply enhancers with explicit typing to avoid depending on
4730
+ * complex `.with()` overload inference in tests and tooling.
4731
+ */
4732
+ function applySerialization(tree) {
4733
+ return withSerialization()(tree);
4734
+ }
4735
+ function applyPersistence(tree, cfg) {
4736
+ return withPersistence(cfg)(tree);
4737
+ }
4738
+
4739
+ /**
4740
+ * Pre-configured SignalTree configurations for common use cases.
4741
+ *
4742
+ * - **basic**: Minimal configuration with no advanced features
4743
+ * - **performance**: Optimized for speed with batching and memoization
4744
+ * - **development**: Full debugging features including time-travel and devtools
4745
+ * - **production**: Optimized for production with performance features only
4746
+ */
4747
+ const TREE_PRESETS = {
4748
+ basic: {
4749
+ batchUpdates: false,
4750
+ useMemoization: false,
4751
+ trackPerformance: false,
4752
+ enableTimeTravel: false,
4753
+ enableDevTools: false,
4754
+ debugMode: false,
4755
+ },
4756
+ performance: {
4757
+ batchUpdates: true,
4758
+ useMemoization: true,
4759
+ trackPerformance: false,
4760
+ enableTimeTravel: false,
4761
+ enableDevTools: false,
4762
+ debugMode: false,
4763
+ useShallowComparison: true,
4764
+ maxCacheSize: 200,
4765
+ },
4766
+ development: {
4767
+ batchUpdates: true,
4768
+ useMemoization: true,
4769
+ trackPerformance: true,
4770
+ enableTimeTravel: true,
4771
+ enableDevTools: true,
4772
+ debugMode: true,
4773
+ maxCacheSize: 100,
4774
+ },
4775
+ production: {
4776
+ batchUpdates: true,
4777
+ useMemoization: true,
4778
+ trackPerformance: false,
4779
+ enableTimeTravel: false,
4780
+ enableDevTools: false,
4781
+ debugMode: false,
4782
+ useShallowComparison: true,
4783
+ maxCacheSize: 200,
4784
+ },
4785
+ };
4786
+ /**
4787
+ * Helper function to create a tree configuration from a preset.
4788
+ * Can be used to start with a preset and then customize specific options.
4789
+ *
4790
+ * @param preset - The preset name to use as a base
4791
+ * @param overrides - Optional overrides to apply on top of the preset
4792
+ * @returns Complete tree configuration
4793
+ *
4794
+ * @example
4795
+ * ```typescript
4796
+ * // Use development preset with custom tree name
4797
+ * const config = createPresetConfig('development', { treeName: 'MyApp' });
4798
+ *
4799
+ * // Use performance preset but enable debug mode
4800
+ * const debugPerf = createPresetConfig('performance', { debugMode: true });
4801
+ * ```
4802
+ */
4803
+ function createPresetConfig(preset, overrides = {}) {
4804
+ const baseConfig = TREE_PRESETS[preset];
4805
+ return {
4806
+ ...baseConfig,
4807
+ ...overrides,
4808
+ };
4809
+ }
4810
+ /**
4811
+ * Validates that a preset configuration is valid.
4812
+ * Useful for development-time checks.
4813
+ *
4814
+ * @param preset - The preset to validate
4815
+ * @returns True if valid, throws error if invalid
4816
+ */
4817
+ function validatePreset(preset) {
4818
+ if (!TREE_PRESETS[preset]) {
4819
+ throw new Error(`Invalid preset: ${preset}. Valid presets are: ${Object.keys(TREE_PRESETS).join(', ')}`);
4820
+ }
4821
+ return true;
4822
+ }
4823
+ /**
4824
+ * Gets the list of available preset names.
4825
+ *
4826
+ * @returns Array of preset names
4827
+ */
4828
+ function getAvailablePresets() {
4829
+ return Object.keys(TREE_PRESETS);
4830
+ }
4831
+ /**
4832
+ * Creates a custom preset by combining multiple existing presets.
4833
+ * Later presets in the array take precedence over earlier ones.
4834
+ *
4835
+ * @param presets - Array of presets to combine
4836
+ * @param overrides - Optional final overrides
4837
+ * @returns Combined configuration
4838
+ *
4839
+ * @example
4840
+ * ```typescript
4841
+ * // Combine basic preset with some performance features
4842
+ * const config = combinePresets(['basic', 'performance'], { enableDevTools: true });
4843
+ * ```
4844
+ */
4845
+ function combinePresets(presets, overrides = {}) {
4846
+ let combined = {};
4847
+ for (const preset of presets) {
4848
+ validatePreset(preset);
4849
+ combined = { ...combined, ...TREE_PRESETS[preset] };
4850
+ }
4851
+ return { ...combined, ...overrides };
4852
+ }
4853
+ /**
4854
+ * Convenience helper for creating a development-ready SignalTree.
4855
+ * Composes dev-only enhancers (devtools, time-travel, async) into a single
4856
+ * enhancer function that can be applied to a tree. This keeps packages
4857
+ * independent while offering a one-line dev onboarding.
4858
+ */
4859
+ function createDevTree(overrides = {}) {
4860
+ const config = createPresetConfig('development', overrides);
4861
+ // Compose enhancers in a predictable left-to-right order. We import the
4862
+ // enhancers lazily so consumers who don't install dev packages won't fail at
4863
+ // module-eval time.
4864
+ const enhancers = [];
4865
+ // Helper to access CommonJS-style require at runtime without forcing Node types
4866
+ function tryRequire(id) {
4867
+ const maybeReq = globalThis.require;
4868
+ if (typeof maybeReq !== 'function')
4869
+ return undefined;
4870
+ try {
4871
+ return maybeReq(id);
4872
+ }
4873
+ catch {
4874
+ return undefined;
4875
+ }
4876
+ }
4877
+ try {
4878
+ const mod = tryRequire('@signaltree/devtools');
4879
+ const withDevtools = mod && (mod.withDevtools ?? mod.withDevTools ?? mod.default ?? mod);
4880
+ if (typeof withDevtools === 'function')
4881
+ enhancers.push(withDevtools);
4882
+ }
4883
+ catch (e) {
4884
+ }
4885
+ try {
4886
+ const mod = tryRequire('@signaltree/time-travel');
4887
+ const withTimeTravel = mod && (mod.withTimeTravel ?? mod.default ?? mod);
4888
+ if (typeof withTimeTravel === 'function')
4889
+ enhancers.push(withTimeTravel);
4890
+ }
4891
+ catch (e) {
4892
+ }
4893
+ const composed = composeEnhancers(...enhancers);
4894
+ return {
4895
+ config,
4896
+ enhancer: composed,
4897
+ };
4898
+ }
4899
+
4900
+ Object.defineProperty(exports, "deepEqual", {
4901
+ enumerable: true,
4902
+ get: function () { return shared.deepEqual; }
4903
+ });
4904
+ Object.defineProperty(exports, "equal", {
4905
+ enumerable: true,
4906
+ get: function () { return shared.deepEqual; }
4907
+ });
4908
+ Object.defineProperty(exports, "isBuiltInObject", {
4909
+ enumerable: true,
4910
+ get: function () { return shared.isBuiltInObject; }
4911
+ });
4912
+ Object.defineProperty(exports, "parsePath", {
4913
+ enumerable: true,
4914
+ get: function () { return shared.parsePath; }
4915
+ });
4916
+ exports.ENHANCER_META = ENHANCER_META;
4917
+ exports.SIGNAL_TREE_CONSTANTS = SIGNAL_TREE_CONSTANTS;
4918
+ exports.SIGNAL_TREE_MESSAGES = SIGNAL_TREE_MESSAGES;
4919
+ exports.SecurityPresets = SecurityPresets;
4920
+ exports.SecurityValidator = SecurityValidator;
4921
+ exports.TREE_PRESETS = TREE_PRESETS;
4922
+ exports.applyPersistence = applyPersistence;
4923
+ exports.applySerialization = applySerialization;
4924
+ exports.cleanupMemoizationCache = cleanupMemoizationCache;
4925
+ exports.clearAllCaches = clearAllCaches;
4926
+ exports.combinePresets = combinePresets;
4927
+ exports.composeEnhancers = composeEnhancers;
4928
+ exports.createDevTree = createDevTree;
4929
+ exports.createEnhancer = createEnhancer;
4930
+ exports.createIndexedDBAdapter = createIndexedDBAdapter;
4931
+ exports.createLazySignalTree = createLazySignalTree;
4932
+ exports.createPresetConfig = createPresetConfig;
4933
+ exports.createStorageAdapter = createStorageAdapter;
4934
+ exports.enableEntities = enableEntities;
4935
+ exports.enableSerialization = enableSerialization;
4936
+ exports.enableTimeTravel = enableTimeTravel;
4937
+ exports.flushBatchedUpdates = flushBatchedUpdates;
4938
+ exports.getAvailablePresets = getAvailablePresets;
4939
+ exports.getBatchQueueSize = getBatchQueueSize;
4940
+ exports.getGlobalCacheStats = getGlobalCacheStats;
4941
+ exports.getTimeTravel = getTimeTravel;
4942
+ exports.hasPendingUpdates = hasPendingUpdates;
4943
+ exports.isAnySignal = isAnySignal;
4944
+ exports.isNodeAccessor = isNodeAccessor$1;
4945
+ exports.memoize = memoize;
4946
+ exports.memoizeReference = memoizeReference;
4947
+ exports.memoizeShallow = memoizeShallow;
4948
+ exports.resolveEnhancerOrder = resolveEnhancerOrder;
4949
+ exports.signalTree = signalTree;
4950
+ exports.validatePreset = validatePreset;
4951
+ exports.withBatching = withBatching;
4952
+ exports.withComputedMemoization = withComputedMemoization;
4953
+ exports.withDeepStateMemoization = withDeepStateMemoization;
4954
+ exports.withEntities = withEntities;
4955
+ exports.withHighFrequencyMemoization = withHighFrequencyMemoization;
4956
+ exports.withHighPerformanceBatching = withHighPerformanceBatching;
4957
+ exports.withHighPerformanceEntities = withHighPerformanceEntities;
4958
+ exports.withHighPerformanceMemoization = withHighPerformanceMemoization;
4959
+ exports.withLightweightMemoization = withLightweightMemoization;
4960
+ exports.withMemoization = withMemoization;
4961
+ exports.withPersistence = withPersistence;
4962
+ exports.withSelectorMemoization = withSelectorMemoization;
4963
+ exports.withSerialization = withSerialization;
4964
+ exports.withShallowMemoization = withShallowMemoization;
4965
+ exports.withTimeTravel = withTimeTravel;
4966
+ //# sourceMappingURL=index.cjs.map