std-react-bindings 0.0.1

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 (663) hide show
  1. package/LICENSE +19 -0
  2. package/README.md +146 -0
  3. package/lib/bc/bc.d.ts +7 -0
  4. package/lib/bc/bc.d.ts.map +1 -0
  5. package/lib/bc/exports.d.ts +2 -0
  6. package/lib/bc/exports.d.ts.map +1 -0
  7. package/lib/binding/exports.d.ts +4 -0
  8. package/lib/binding/exports.d.ts.map +1 -0
  9. package/lib/binding/internal/DoubleLinkedList/index.d.ts +25 -0
  10. package/lib/binding/internal/DoubleLinkedList/index.d.ts.map +1 -0
  11. package/lib/binding/internal/binding-impl.d.ts +60 -0
  12. package/lib/binding/internal/binding-impl.d.ts.map +1 -0
  13. package/lib/binding/internal/consts.d.ts +3 -0
  14. package/lib/binding/internal/consts.d.ts.map +1 -0
  15. package/lib/binding/make-binding.d.ts +7 -0
  16. package/lib/binding/make-binding.d.ts.map +1 -0
  17. package/lib/binding/types/binding-args.d.ts +44 -0
  18. package/lib/binding/types/binding-args.d.ts.map +1 -0
  19. package/lib/binding/types/binding-dependencies.d.ts +5 -0
  20. package/lib/binding/types/binding-dependencies.d.ts.map +1 -0
  21. package/lib/binding/types/binding-initializer.d.ts +3 -0
  22. package/lib/binding/types/binding-initializer.d.ts.map +1 -0
  23. package/lib/binding/types/binding.d.ts +22 -0
  24. package/lib/binding/types/binding.d.ts.map +1 -0
  25. package/lib/binding/types/change-listener.d.ts +5 -0
  26. package/lib/binding/types/change-listener.d.ts.map +1 -0
  27. package/lib/binding/types/exports.d.ts +12 -0
  28. package/lib/binding/types/exports.d.ts.map +1 -0
  29. package/lib/binding/types/infer-binding-value-types.d.ts +8 -0
  30. package/lib/binding/types/infer-binding-value-types.d.ts.map +1 -0
  31. package/lib/binding/types/infer-bindings-array-value-types.d.ts +8 -0
  32. package/lib/binding/types/infer-bindings-array-value-types.d.ts.map +1 -0
  33. package/lib/binding/types/infer-named-binding-value-types.d.ts +8 -0
  34. package/lib/binding/types/infer-named-binding-value-types.d.ts.map +1 -0
  35. package/lib/binding/types/inference.d.ts +4 -0
  36. package/lib/binding/types/inference.d.ts.map +1 -0
  37. package/lib/binding/types/readonly-binding.d.ts +35 -0
  38. package/lib/binding/types/readonly-binding.d.ts.map +1 -0
  39. package/lib/binding/types/set-value-transformer.d.ts +11 -0
  40. package/lib/binding/types/set-value-transformer.d.ts.map +1 -0
  41. package/lib/binding/use-binding.d.ts +7 -0
  42. package/lib/binding/use-binding.d.ts.map +1 -0
  43. package/lib/binding-utils/exports.d.ts +4 -0
  44. package/lib/binding-utils/exports.d.ts.map +1 -0
  45. package/lib/binding-utils/internal/make-value-then-do.d.ts +6 -0
  46. package/lib/binding-utils/internal/make-value-then-do.d.ts.map +1 -0
  47. package/lib/binding-utils/lock-utils.d.ts +27 -0
  48. package/lib/binding-utils/lock-utils.d.ts.map +1 -0
  49. package/lib/binding-utils/modified-utils.d.ts +18 -0
  50. package/lib/binding-utils/modified-utils.d.ts.map +1 -0
  51. package/lib/binding-utils/type-utils.d.ts +6 -0
  52. package/lib/binding-utils/type-utils.d.ts.map +1 -0
  53. package/lib/cjs/bc/bc.js +13 -0
  54. package/lib/cjs/bc/bc.js.map +1 -0
  55. package/lib/cjs/bc/exports.js +18 -0
  56. package/lib/cjs/bc/exports.js.map +1 -0
  57. package/lib/cjs/binding/exports.js +20 -0
  58. package/lib/cjs/binding/exports.js.map +1 -0
  59. package/lib/cjs/binding/internal/DoubleLinkedList/index.js +110 -0
  60. package/lib/cjs/binding/internal/DoubleLinkedList/index.js.map +1 -0
  61. package/lib/cjs/binding/internal/binding-impl.js +181 -0
  62. package/lib/cjs/binding/internal/binding-impl.js.map +1 -0
  63. package/lib/cjs/binding/internal/consts.js +6 -0
  64. package/lib/cjs/binding/internal/consts.js.map +1 -0
  65. package/lib/cjs/binding/make-binding.js +22 -0
  66. package/lib/cjs/binding/make-binding.js.map +1 -0
  67. package/lib/cjs/binding/types/binding-args.js +3 -0
  68. package/lib/cjs/binding/types/binding-args.js.map +1 -0
  69. package/lib/cjs/binding/types/binding-dependencies.js +3 -0
  70. package/lib/cjs/binding/types/binding-dependencies.js.map +1 -0
  71. package/lib/cjs/binding/types/binding-initializer.js +3 -0
  72. package/lib/cjs/binding/types/binding-initializer.js.map +1 -0
  73. package/lib/cjs/binding/types/binding.js +3 -0
  74. package/lib/cjs/binding/types/binding.js.map +1 -0
  75. package/lib/cjs/binding/types/change-listener.js +3 -0
  76. package/lib/cjs/binding/types/change-listener.js.map +1 -0
  77. package/lib/cjs/binding/types/exports.js +28 -0
  78. package/lib/cjs/binding/types/exports.js.map +1 -0
  79. package/lib/cjs/binding/types/infer-binding-value-types.js +3 -0
  80. package/lib/cjs/binding/types/infer-binding-value-types.js.map +1 -0
  81. package/lib/cjs/binding/types/infer-bindings-array-value-types.js +3 -0
  82. package/lib/cjs/binding/types/infer-bindings-array-value-types.js.map +1 -0
  83. package/lib/cjs/binding/types/infer-named-binding-value-types.js +3 -0
  84. package/lib/cjs/binding/types/infer-named-binding-value-types.js.map +1 -0
  85. package/lib/cjs/binding/types/inference.js +3 -0
  86. package/lib/cjs/binding/types/inference.js.map +1 -0
  87. package/lib/cjs/binding/types/readonly-binding.js +3 -0
  88. package/lib/cjs/binding/types/readonly-binding.js.map +1 -0
  89. package/lib/cjs/binding/types/set-value-transformer.js +3 -0
  90. package/lib/cjs/binding/types/set-value-transformer.js.map +1 -0
  91. package/lib/cjs/binding/use-binding.js +10 -0
  92. package/lib/cjs/binding/use-binding.js.map +1 -0
  93. package/lib/cjs/binding-utils/exports.js +20 -0
  94. package/lib/cjs/binding-utils/exports.js.map +1 -0
  95. package/lib/cjs/binding-utils/internal/make-value-then-do.js +55 -0
  96. package/lib/cjs/binding-utils/internal/make-value-then-do.js.map +1 -0
  97. package/lib/cjs/binding-utils/lock-utils.js +51 -0
  98. package/lib/cjs/binding-utils/lock-utils.js.map +1 -0
  99. package/lib/cjs/binding-utils/modified-utils.js +33 -0
  100. package/lib/cjs/binding-utils/modified-utils.js.map +1 -0
  101. package/lib/cjs/binding-utils/type-utils.js +12 -0
  102. package/lib/cjs/binding-utils/type-utils.js.map +1 -0
  103. package/lib/cjs/components/BindingsConsumer/index.js +75 -0
  104. package/lib/cjs/components/BindingsConsumer/index.js.map +1 -0
  105. package/lib/cjs/components/BindingsConsumer/internal/Refreshable.js +48 -0
  106. package/lib/cjs/components/BindingsConsumer/internal/Refreshable.js.map +1 -0
  107. package/lib/cjs/components/BindingsConsumer/types/exports.js +19 -0
  108. package/lib/cjs/components/BindingsConsumer/types/exports.js.map +1 -0
  109. package/lib/cjs/components/BindingsConsumer/types/props.js +3 -0
  110. package/lib/cjs/components/BindingsConsumer/types/props.js.map +1 -0
  111. package/lib/cjs/components/BindingsConsumer/types/render-callback.js +3 -0
  112. package/lib/cjs/components/BindingsConsumer/types/render-callback.js.map +1 -0
  113. package/lib/cjs/components/exports.js +18 -0
  114. package/lib/cjs/components/exports.js.map +1 -0
  115. package/lib/cjs/config/are-equal.js +21 -0
  116. package/lib/cjs/config/are-equal.js.map +1 -0
  117. package/lib/cjs/config/exports.js +21 -0
  118. package/lib/cjs/config/exports.js.map +1 -0
  119. package/lib/cjs/config/logging.js +23 -0
  120. package/lib/cjs/config/logging.js.map +1 -0
  121. package/lib/cjs/config/stats-handler.js +14 -0
  122. package/lib/cjs/config/stats-handler.js.map +1 -0
  123. package/lib/cjs/default-queue/default-queue-context.js +63 -0
  124. package/lib/cjs/default-queue/default-queue-context.js.map +1 -0
  125. package/lib/cjs/default-queue/exports.js +18 -0
  126. package/lib/cjs/default-queue/exports.js.map +1 -0
  127. package/lib/cjs/index.js +31 -0
  128. package/lib/cjs/index.js.map +1 -0
  129. package/lib/cjs/internal-hooks/use-is-mounted-ref.js +17 -0
  130. package/lib/cjs/internal-hooks/use-is-mounted-ref.js.map +1 -0
  131. package/lib/cjs/internal-utils/array-like.js +32 -0
  132. package/lib/cjs/internal-utils/array-like.js.map +1 -0
  133. package/lib/cjs/internal-utils/extract-binding-dependency-values.js +34 -0
  134. package/lib/cjs/internal-utils/extract-binding-dependency-values.js.map +1 -0
  135. package/lib/cjs/internal-utils/get-typed-keys.js +11 -0
  136. package/lib/cjs/internal-utils/get-typed-keys.js.map +1 -0
  137. package/lib/cjs/internal-utils/uid.js +8 -0
  138. package/lib/cjs/internal-utils/uid.js.map +1 -0
  139. package/lib/cjs/limiter/exports.js +21 -0
  140. package/lib/cjs/limiter/exports.js.map +1 -0
  141. package/lib/cjs/limiter/internal/LimiterImpl.js +49 -0
  142. package/lib/cjs/limiter/internal/LimiterImpl.js.map +1 -0
  143. package/lib/cjs/limiter/make-limiter.js +8 -0
  144. package/lib/cjs/limiter/make-limiter.js.map +1 -0
  145. package/lib/cjs/limiter/pick-limiter-options.js +12 -0
  146. package/lib/cjs/limiter/pick-limiter-options.js.map +1 -0
  147. package/lib/cjs/limiter/types/LimitMode.js +3 -0
  148. package/lib/cjs/limiter/types/LimitMode.js.map +1 -0
  149. package/lib/cjs/limiter/types/LimitType.js +3 -0
  150. package/lib/cjs/limiter/types/LimitType.js.map +1 -0
  151. package/lib/cjs/limiter/types/Limiter.js +3 -0
  152. package/lib/cjs/limiter/types/Limiter.js.map +1 -0
  153. package/lib/cjs/limiter/types/LimiterOptions.js +3 -0
  154. package/lib/cjs/limiter/types/LimiterOptions.js.map +1 -0
  155. package/lib/cjs/limiter/types/exports.js +21 -0
  156. package/lib/cjs/limiter/types/exports.js.map +1 -0
  157. package/lib/cjs/limiter/use-limiter.js +26 -0
  158. package/lib/cjs/limiter/use-limiter.js.map +1 -0
  159. package/lib/cjs/make-bindable-component/exports.js +19 -0
  160. package/lib/cjs/make-bindable-component/exports.js.map +1 -0
  161. package/lib/cjs/make-bindable-component/make-bindable-component.js +43 -0
  162. package/lib/cjs/make-bindable-component/make-bindable-component.js.map +1 -0
  163. package/lib/cjs/make-bindable-component/types/exports.js +19 -0
  164. package/lib/cjs/make-bindable-component/types/exports.js.map +1 -0
  165. package/lib/cjs/make-bindable-component/types/make-bindable-component-options.js +3 -0
  166. package/lib/cjs/make-bindable-component/types/make-bindable-component-options.js.map +1 -0
  167. package/lib/cjs/make-bindable-component/types/upgrade-to-binding-props.js +3 -0
  168. package/lib/cjs/make-bindable-component/types/upgrade-to-binding-props.js.map +1 -0
  169. package/lib/cjs/resolveable/exports.js +19 -0
  170. package/lib/cjs/resolveable/exports.js.map +1 -0
  171. package/lib/cjs/resolveable/types.js +3 -0
  172. package/lib/cjs/resolveable/types.js.map +1 -0
  173. package/lib/cjs/resolveable/utils.js +17 -0
  174. package/lib/cjs/resolveable/utils.js.map +1 -0
  175. package/lib/cjs/specialized-bindings/const-binding.js +16 -0
  176. package/lib/cjs/specialized-bindings/const-binding.js.map +1 -0
  177. package/lib/cjs/specialized-bindings/derived-binding/exports.js +19 -0
  178. package/lib/cjs/specialized-bindings/derived-binding/exports.js.map +1 -0
  179. package/lib/cjs/specialized-bindings/derived-binding/options.js +3 -0
  180. package/lib/cjs/specialized-bindings/derived-binding/options.js.map +1 -0
  181. package/lib/cjs/specialized-bindings/derived-binding/use-derived-binding.js +44 -0
  182. package/lib/cjs/specialized-bindings/derived-binding/use-derived-binding.js.map +1 -0
  183. package/lib/cjs/specialized-bindings/exports.js +21 -0
  184. package/lib/cjs/specialized-bindings/exports.js.map +1 -0
  185. package/lib/cjs/specialized-bindings/flattened-binding.js +59 -0
  186. package/lib/cjs/specialized-bindings/flattened-binding.js.map +1 -0
  187. package/lib/cjs/specialized-bindings/transient-derived-binding/exports.js +20 -0
  188. package/lib/cjs/specialized-bindings/transient-derived-binding/exports.js.map +1 -0
  189. package/lib/cjs/specialized-bindings/transient-derived-binding/make-transient-derived-binding.js +53 -0
  190. package/lib/cjs/specialized-bindings/transient-derived-binding/make-transient-derived-binding.js.map +1 -0
  191. package/lib/cjs/specialized-bindings/transient-derived-binding/types/exports.js +18 -0
  192. package/lib/cjs/specialized-bindings/transient-derived-binding/types/exports.js.map +1 -0
  193. package/lib/cjs/specialized-bindings/transient-derived-binding/types/transient-derived-binding-args.js +3 -0
  194. package/lib/cjs/specialized-bindings/transient-derived-binding/types/transient-derived-binding-args.js.map +1 -0
  195. package/lib/cjs/specialized-bindings/transient-derived-binding/use-transient-derived-binding.js +18 -0
  196. package/lib/cjs/specialized-bindings/transient-derived-binding/use-transient-derived-binding.js.map +1 -0
  197. package/lib/cjs/synchronization/exports.js +20 -0
  198. package/lib/cjs/synchronization/exports.js.map +1 -0
  199. package/lib/cjs/synchronization/types/exports.js +18 -0
  200. package/lib/cjs/synchronization/types/exports.js.map +1 -0
  201. package/lib/cjs/synchronization/types/options.js +3 -0
  202. package/lib/cjs/synchronization/types/options.js.map +1 -0
  203. package/lib/cjs/synchronization/use-bi-dir-binding-sync.js +16 -0
  204. package/lib/cjs/synchronization/use-bi-dir-binding-sync.js.map +1 -0
  205. package/lib/cjs/synchronization/use-uni-dir-binding-sync.js +10 -0
  206. package/lib/cjs/synchronization/use-uni-dir-binding-sync.js.map +1 -0
  207. package/lib/cjs/types/array-like.js +3 -0
  208. package/lib/cjs/types/array-like.js.map +1 -0
  209. package/lib/cjs/types/empty.js +3 -0
  210. package/lib/cjs/types/empty.js.map +1 -0
  211. package/lib/cjs/types/exports.js +19 -0
  212. package/lib/cjs/types/exports.js.map +1 -0
  213. package/lib/cjs/use-binding-effect/exports.js +19 -0
  214. package/lib/cjs/use-binding-effect/exports.js.map +1 -0
  215. package/lib/cjs/use-binding-effect/types/exports.js +18 -0
  216. package/lib/cjs/use-binding-effect/types/exports.js.map +1 -0
  217. package/lib/cjs/use-binding-effect/types/options.js +3 -0
  218. package/lib/cjs/use-binding-effect/types/options.js.map +1 -0
  219. package/lib/cjs/use-binding-effect/use-binding-effect.js +145 -0
  220. package/lib/cjs/use-binding-effect/use-binding-effect.js.map +1 -0
  221. package/lib/cjs/utility-hooks/exports.js +19 -0
  222. package/lib/cjs/utility-hooks/exports.js.map +1 -0
  223. package/lib/cjs/utility-hooks/use-callback-ref.js +38 -0
  224. package/lib/cjs/utility-hooks/use-callback-ref.js.map +1 -0
  225. package/lib/cjs/utility-hooks/use-stable-value.js +18 -0
  226. package/lib/cjs/utility-hooks/use-stable-value.js.map +1 -0
  227. package/lib/components/BindingsConsumer/index.d.ts +27 -0
  228. package/lib/components/BindingsConsumer/index.d.ts.map +1 -0
  229. package/lib/components/BindingsConsumer/internal/Refreshable.d.ts +16 -0
  230. package/lib/components/BindingsConsumer/internal/Refreshable.d.ts.map +1 -0
  231. package/lib/components/BindingsConsumer/types/exports.d.ts +3 -0
  232. package/lib/components/BindingsConsumer/types/exports.d.ts.map +1 -0
  233. package/lib/components/BindingsConsumer/types/props.d.ts +29 -0
  234. package/lib/components/BindingsConsumer/types/props.d.ts.map +1 -0
  235. package/lib/components/BindingsConsumer/types/render-callback.d.ts +11 -0
  236. package/lib/components/BindingsConsumer/types/render-callback.d.ts.map +1 -0
  237. package/lib/components/exports.d.ts +2 -0
  238. package/lib/components/exports.d.ts.map +1 -0
  239. package/lib/config/are-equal.d.ts +7 -0
  240. package/lib/config/are-equal.d.ts.map +1 -0
  241. package/lib/config/exports.d.ts +4 -0
  242. package/lib/config/exports.d.ts.map +1 -0
  243. package/lib/config/logging.d.ts +17 -0
  244. package/lib/config/logging.d.ts.map +1 -0
  245. package/lib/config/stats-handler.d.ts +26 -0
  246. package/lib/config/stats-handler.d.ts.map +1 -0
  247. package/lib/default-queue/default-queue-context.d.ts +19 -0
  248. package/lib/default-queue/default-queue-context.d.ts.map +1 -0
  249. package/lib/default-queue/exports.d.ts +2 -0
  250. package/lib/default-queue/exports.d.ts.map +1 -0
  251. package/lib/index.d.ts +15 -0
  252. package/lib/index.d.ts.map +1 -0
  253. package/lib/internal-hooks/use-is-mounted-ref.d.ts +4 -0
  254. package/lib/internal-hooks/use-is-mounted-ref.d.ts.map +1 -0
  255. package/lib/internal-utils/array-like.d.ts +11 -0
  256. package/lib/internal-utils/array-like.d.ts.map +1 -0
  257. package/lib/internal-utils/extract-binding-dependency-values.d.ts +7 -0
  258. package/lib/internal-utils/extract-binding-dependency-values.d.ts.map +1 -0
  259. package/lib/internal-utils/get-typed-keys.d.ts +7 -0
  260. package/lib/internal-utils/get-typed-keys.d.ts.map +1 -0
  261. package/lib/internal-utils/uid.d.ts +3 -0
  262. package/lib/internal-utils/uid.d.ts.map +1 -0
  263. package/lib/limiter/exports.d.ts +5 -0
  264. package/lib/limiter/exports.d.ts.map +1 -0
  265. package/lib/limiter/internal/LimiterImpl.d.ts +15 -0
  266. package/lib/limiter/internal/LimiterImpl.d.ts.map +1 -0
  267. package/lib/limiter/make-limiter.d.ts +9 -0
  268. package/lib/limiter/make-limiter.d.ts.map +1 -0
  269. package/lib/limiter/pick-limiter-options.d.ts +3 -0
  270. package/lib/limiter/pick-limiter-options.d.ts.map +1 -0
  271. package/lib/limiter/types/LimitMode.d.ts +7 -0
  272. package/lib/limiter/types/LimitMode.d.ts.map +1 -0
  273. package/lib/limiter/types/LimitType.d.ts +32 -0
  274. package/lib/limiter/types/LimitType.d.ts.map +1 -0
  275. package/lib/limiter/types/Limiter.d.ts +9 -0
  276. package/lib/limiter/types/Limiter.d.ts.map +1 -0
  277. package/lib/limiter/types/LimiterOptions.d.ts +36 -0
  278. package/lib/limiter/types/LimiterOptions.d.ts.map +1 -0
  279. package/lib/limiter/types/exports.d.ts +5 -0
  280. package/lib/limiter/types/exports.d.ts.map +1 -0
  281. package/lib/limiter/use-limiter.d.ts +14 -0
  282. package/lib/limiter/use-limiter.d.ts.map +1 -0
  283. package/lib/make-bindable-component/exports.d.ts +3 -0
  284. package/lib/make-bindable-component/exports.d.ts.map +1 -0
  285. package/lib/make-bindable-component/make-bindable-component.d.ts +16 -0
  286. package/lib/make-bindable-component/make-bindable-component.d.ts.map +1 -0
  287. package/lib/make-bindable-component/types/exports.d.ts +3 -0
  288. package/lib/make-bindable-component/types/exports.d.ts.map +1 -0
  289. package/lib/make-bindable-component/types/make-bindable-component-options.d.ts +6 -0
  290. package/lib/make-bindable-component/types/make-bindable-component-options.d.ts.map +1 -0
  291. package/lib/make-bindable-component/types/upgrade-to-binding-props.d.ts +5 -0
  292. package/lib/make-bindable-component/types/upgrade-to-binding-props.d.ts.map +1 -0
  293. package/lib/mjs/bc/bc.js +6 -0
  294. package/lib/mjs/bc/bc.js.map +1 -0
  295. package/lib/mjs/bc/exports.js +2 -0
  296. package/lib/mjs/bc/exports.js.map +1 -0
  297. package/lib/mjs/binding/exports.js +4 -0
  298. package/lib/mjs/binding/exports.js.map +1 -0
  299. package/lib/mjs/binding/internal/DoubleLinkedList/index.js +105 -0
  300. package/lib/mjs/binding/internal/DoubleLinkedList/index.js.map +1 -0
  301. package/lib/mjs/binding/internal/binding-impl.js +177 -0
  302. package/lib/mjs/binding/internal/binding-impl.js.map +1 -0
  303. package/lib/mjs/binding/internal/consts.js +3 -0
  304. package/lib/mjs/binding/internal/consts.js.map +1 -0
  305. package/lib/mjs/binding/make-binding.js +18 -0
  306. package/lib/mjs/binding/make-binding.js.map +1 -0
  307. package/lib/mjs/binding/types/binding-args.js +2 -0
  308. package/lib/mjs/binding/types/binding-args.js.map +1 -0
  309. package/lib/mjs/binding/types/binding-dependencies.js +2 -0
  310. package/lib/mjs/binding/types/binding-dependencies.js.map +1 -0
  311. package/lib/mjs/binding/types/binding-initializer.js +2 -0
  312. package/lib/mjs/binding/types/binding-initializer.js.map +1 -0
  313. package/lib/mjs/binding/types/binding.js +2 -0
  314. package/lib/mjs/binding/types/binding.js.map +1 -0
  315. package/lib/mjs/binding/types/change-listener.js +2 -0
  316. package/lib/mjs/binding/types/change-listener.js.map +1 -0
  317. package/lib/mjs/binding/types/exports.js +12 -0
  318. package/lib/mjs/binding/types/exports.js.map +1 -0
  319. package/lib/mjs/binding/types/infer-binding-value-types.js +2 -0
  320. package/lib/mjs/binding/types/infer-binding-value-types.js.map +1 -0
  321. package/lib/mjs/binding/types/infer-bindings-array-value-types.js +2 -0
  322. package/lib/mjs/binding/types/infer-bindings-array-value-types.js.map +1 -0
  323. package/lib/mjs/binding/types/infer-named-binding-value-types.js +2 -0
  324. package/lib/mjs/binding/types/infer-named-binding-value-types.js.map +1 -0
  325. package/lib/mjs/binding/types/inference.js +2 -0
  326. package/lib/mjs/binding/types/inference.js.map +1 -0
  327. package/lib/mjs/binding/types/readonly-binding.js +2 -0
  328. package/lib/mjs/binding/types/readonly-binding.js.map +1 -0
  329. package/lib/mjs/binding/types/set-value-transformer.js +2 -0
  330. package/lib/mjs/binding/types/set-value-transformer.js.map +1 -0
  331. package/lib/mjs/binding/use-binding.js +6 -0
  332. package/lib/mjs/binding/use-binding.js.map +1 -0
  333. package/lib/mjs/binding-utils/exports.js +4 -0
  334. package/lib/mjs/binding-utils/exports.js.map +1 -0
  335. package/lib/mjs/binding-utils/internal/make-value-then-do.js +48 -0
  336. package/lib/mjs/binding-utils/internal/make-value-then-do.js.map +1 -0
  337. package/lib/mjs/binding-utils/lock-utils.js +45 -0
  338. package/lib/mjs/binding-utils/lock-utils.js.map +1 -0
  339. package/lib/mjs/binding-utils/modified-utils.js +28 -0
  340. package/lib/mjs/binding-utils/modified-utils.js.map +1 -0
  341. package/lib/mjs/binding-utils/type-utils.js +7 -0
  342. package/lib/mjs/binding-utils/type-utils.js.map +1 -0
  343. package/lib/mjs/components/BindingsConsumer/index.js +45 -0
  344. package/lib/mjs/components/BindingsConsumer/index.js.map +1 -0
  345. package/lib/mjs/components/BindingsConsumer/internal/Refreshable.js +18 -0
  346. package/lib/mjs/components/BindingsConsumer/internal/Refreshable.js.map +1 -0
  347. package/lib/mjs/components/BindingsConsumer/types/exports.js +3 -0
  348. package/lib/mjs/components/BindingsConsumer/types/exports.js.map +1 -0
  349. package/lib/mjs/components/BindingsConsumer/types/props.js +2 -0
  350. package/lib/mjs/components/BindingsConsumer/types/props.js.map +1 -0
  351. package/lib/mjs/components/BindingsConsumer/types/render-callback.js +2 -0
  352. package/lib/mjs/components/BindingsConsumer/types/render-callback.js.map +1 -0
  353. package/lib/mjs/components/exports.js +2 -0
  354. package/lib/mjs/components/exports.js.map +1 -0
  355. package/lib/mjs/config/are-equal.js +12 -0
  356. package/lib/mjs/config/are-equal.js.map +1 -0
  357. package/lib/mjs/config/exports.js +5 -0
  358. package/lib/mjs/config/exports.js.map +1 -0
  359. package/lib/mjs/config/logging.js +16 -0
  360. package/lib/mjs/config/logging.js.map +1 -0
  361. package/lib/mjs/config/stats-handler.js +9 -0
  362. package/lib/mjs/config/stats-handler.js.map +1 -0
  363. package/lib/mjs/default-queue/default-queue-context.js +35 -0
  364. package/lib/mjs/default-queue/default-queue-context.js.map +1 -0
  365. package/lib/mjs/default-queue/exports.js +2 -0
  366. package/lib/mjs/default-queue/exports.js.map +1 -0
  367. package/lib/mjs/index.js +15 -0
  368. package/lib/mjs/index.js.map +1 -0
  369. package/lib/mjs/internal-hooks/use-is-mounted-ref.js +13 -0
  370. package/lib/mjs/internal-hooks/use-is-mounted-ref.js.map +1 -0
  371. package/lib/mjs/internal-utils/array-like.js +26 -0
  372. package/lib/mjs/internal-utils/array-like.js.map +1 -0
  373. package/lib/mjs/internal-utils/extract-binding-dependency-values.js +30 -0
  374. package/lib/mjs/internal-utils/extract-binding-dependency-values.js.map +1 -0
  375. package/lib/mjs/internal-utils/get-typed-keys.js +7 -0
  376. package/lib/mjs/internal-utils/get-typed-keys.js.map +1 -0
  377. package/lib/mjs/internal-utils/uid.js +4 -0
  378. package/lib/mjs/internal-utils/uid.js.map +1 -0
  379. package/lib/mjs/limiter/exports.js +5 -0
  380. package/lib/mjs/limiter/exports.js.map +1 -0
  381. package/lib/mjs/limiter/internal/LimiterImpl.js +42 -0
  382. package/lib/mjs/limiter/internal/LimiterImpl.js.map +1 -0
  383. package/lib/mjs/limiter/make-limiter.js +4 -0
  384. package/lib/mjs/limiter/make-limiter.js.map +1 -0
  385. package/lib/mjs/limiter/pick-limiter-options.js +8 -0
  386. package/lib/mjs/limiter/pick-limiter-options.js.map +1 -0
  387. package/lib/mjs/limiter/types/LimitMode.js +2 -0
  388. package/lib/mjs/limiter/types/LimitMode.js.map +1 -0
  389. package/lib/mjs/limiter/types/LimitType.js +2 -0
  390. package/lib/mjs/limiter/types/LimitType.js.map +1 -0
  391. package/lib/mjs/limiter/types/Limiter.js +2 -0
  392. package/lib/mjs/limiter/types/Limiter.js.map +1 -0
  393. package/lib/mjs/limiter/types/LimiterOptions.js +2 -0
  394. package/lib/mjs/limiter/types/LimiterOptions.js.map +1 -0
  395. package/lib/mjs/limiter/types/exports.js +5 -0
  396. package/lib/mjs/limiter/types/exports.js.map +1 -0
  397. package/lib/mjs/limiter/use-limiter.js +22 -0
  398. package/lib/mjs/limiter/use-limiter.js.map +1 -0
  399. package/lib/mjs/make-bindable-component/exports.js +3 -0
  400. package/lib/mjs/make-bindable-component/exports.js.map +1 -0
  401. package/lib/mjs/make-bindable-component/make-bindable-component.js +36 -0
  402. package/lib/mjs/make-bindable-component/make-bindable-component.js.map +1 -0
  403. package/lib/mjs/make-bindable-component/types/exports.js +3 -0
  404. package/lib/mjs/make-bindable-component/types/exports.js.map +1 -0
  405. package/lib/mjs/make-bindable-component/types/make-bindable-component-options.js +2 -0
  406. package/lib/mjs/make-bindable-component/types/make-bindable-component-options.js.map +1 -0
  407. package/lib/mjs/make-bindable-component/types/upgrade-to-binding-props.js +2 -0
  408. package/lib/mjs/make-bindable-component/types/upgrade-to-binding-props.js.map +1 -0
  409. package/lib/mjs/resolveable/exports.js +3 -0
  410. package/lib/mjs/resolveable/exports.js.map +1 -0
  411. package/lib/mjs/resolveable/types.js +2 -0
  412. package/lib/mjs/resolveable/types.js.map +1 -0
  413. package/lib/mjs/resolveable/utils.js +10 -0
  414. package/lib/mjs/resolveable/utils.js.map +1 -0
  415. package/lib/mjs/specialized-bindings/const-binding.js +11 -0
  416. package/lib/mjs/specialized-bindings/const-binding.js.map +1 -0
  417. package/lib/mjs/specialized-bindings/derived-binding/exports.js +3 -0
  418. package/lib/mjs/specialized-bindings/derived-binding/exports.js.map +1 -0
  419. package/lib/mjs/specialized-bindings/derived-binding/options.js +2 -0
  420. package/lib/mjs/specialized-bindings/derived-binding/options.js.map +1 -0
  421. package/lib/mjs/specialized-bindings/derived-binding/use-derived-binding.js +40 -0
  422. package/lib/mjs/specialized-bindings/derived-binding/use-derived-binding.js.map +1 -0
  423. package/lib/mjs/specialized-bindings/exports.js +5 -0
  424. package/lib/mjs/specialized-bindings/exports.js.map +1 -0
  425. package/lib/mjs/specialized-bindings/flattened-binding.js +55 -0
  426. package/lib/mjs/specialized-bindings/flattened-binding.js.map +1 -0
  427. package/lib/mjs/specialized-bindings/transient-derived-binding/exports.js +4 -0
  428. package/lib/mjs/specialized-bindings/transient-derived-binding/exports.js.map +1 -0
  429. package/lib/mjs/specialized-bindings/transient-derived-binding/make-transient-derived-binding.js +49 -0
  430. package/lib/mjs/specialized-bindings/transient-derived-binding/make-transient-derived-binding.js.map +1 -0
  431. package/lib/mjs/specialized-bindings/transient-derived-binding/types/exports.js +2 -0
  432. package/lib/mjs/specialized-bindings/transient-derived-binding/types/exports.js.map +1 -0
  433. package/lib/mjs/specialized-bindings/transient-derived-binding/types/transient-derived-binding-args.js +2 -0
  434. package/lib/mjs/specialized-bindings/transient-derived-binding/types/transient-derived-binding-args.js.map +1 -0
  435. package/lib/mjs/specialized-bindings/transient-derived-binding/use-transient-derived-binding.js +14 -0
  436. package/lib/mjs/specialized-bindings/transient-derived-binding/use-transient-derived-binding.js.map +1 -0
  437. package/lib/mjs/synchronization/exports.js +4 -0
  438. package/lib/mjs/synchronization/exports.js.map +1 -0
  439. package/lib/mjs/synchronization/types/exports.js +2 -0
  440. package/lib/mjs/synchronization/types/exports.js.map +1 -0
  441. package/lib/mjs/synchronization/types/options.js +2 -0
  442. package/lib/mjs/synchronization/types/options.js.map +1 -0
  443. package/lib/mjs/synchronization/use-bi-dir-binding-sync.js +12 -0
  444. package/lib/mjs/synchronization/use-bi-dir-binding-sync.js.map +1 -0
  445. package/lib/mjs/synchronization/use-uni-dir-binding-sync.js +6 -0
  446. package/lib/mjs/synchronization/use-uni-dir-binding-sync.js.map +1 -0
  447. package/lib/mjs/types/array-like.js +2 -0
  448. package/lib/mjs/types/array-like.js.map +1 -0
  449. package/lib/mjs/types/empty.js +2 -0
  450. package/lib/mjs/types/empty.js.map +1 -0
  451. package/lib/mjs/types/exports.js +3 -0
  452. package/lib/mjs/types/exports.js.map +1 -0
  453. package/lib/mjs/use-binding-effect/exports.js +3 -0
  454. package/lib/mjs/use-binding-effect/exports.js.map +1 -0
  455. package/lib/mjs/use-binding-effect/types/exports.js +2 -0
  456. package/lib/mjs/use-binding-effect/types/exports.js.map +1 -0
  457. package/lib/mjs/use-binding-effect/types/options.js +2 -0
  458. package/lib/mjs/use-binding-effect/types/options.js.map +1 -0
  459. package/lib/mjs/use-binding-effect/use-binding-effect.js +141 -0
  460. package/lib/mjs/use-binding-effect/use-binding-effect.js.map +1 -0
  461. package/lib/mjs/utility-hooks/exports.js +3 -0
  462. package/lib/mjs/utility-hooks/exports.js.map +1 -0
  463. package/lib/mjs/utility-hooks/use-callback-ref.js +11 -0
  464. package/lib/mjs/utility-hooks/use-callback-ref.js.map +1 -0
  465. package/lib/mjs/utility-hooks/use-stable-value.js +14 -0
  466. package/lib/mjs/utility-hooks/use-stable-value.js.map +1 -0
  467. package/lib/resolveable/exports.d.ts +3 -0
  468. package/lib/resolveable/exports.d.ts.map +1 -0
  469. package/lib/resolveable/types.d.ts +10 -0
  470. package/lib/resolveable/types.d.ts.map +1 -0
  471. package/lib/resolveable/utils.d.ts +10 -0
  472. package/lib/resolveable/utils.d.ts.map +1 -0
  473. package/lib/specialized-bindings/const-binding.d.ts +10 -0
  474. package/lib/specialized-bindings/const-binding.d.ts.map +1 -0
  475. package/lib/specialized-bindings/derived-binding/exports.d.ts +3 -0
  476. package/lib/specialized-bindings/derived-binding/exports.d.ts.map +1 -0
  477. package/lib/specialized-bindings/derived-binding/options.d.ts +52 -0
  478. package/lib/specialized-bindings/derived-binding/options.d.ts.map +1 -0
  479. package/lib/specialized-bindings/derived-binding/use-derived-binding.d.ts +16 -0
  480. package/lib/specialized-bindings/derived-binding/use-derived-binding.d.ts.map +1 -0
  481. package/lib/specialized-bindings/exports.d.ts +5 -0
  482. package/lib/specialized-bindings/exports.d.ts.map +1 -0
  483. package/lib/specialized-bindings/flattened-binding.d.ts +16 -0
  484. package/lib/specialized-bindings/flattened-binding.d.ts.map +1 -0
  485. package/lib/specialized-bindings/transient-derived-binding/exports.d.ts +4 -0
  486. package/lib/specialized-bindings/transient-derived-binding/exports.d.ts.map +1 -0
  487. package/lib/specialized-bindings/transient-derived-binding/make-transient-derived-binding.d.ts +12 -0
  488. package/lib/specialized-bindings/transient-derived-binding/make-transient-derived-binding.d.ts.map +1 -0
  489. package/lib/specialized-bindings/transient-derived-binding/types/exports.d.ts +2 -0
  490. package/lib/specialized-bindings/transient-derived-binding/types/exports.d.ts.map +1 -0
  491. package/lib/specialized-bindings/transient-derived-binding/types/transient-derived-binding-args.d.ts +10 -0
  492. package/lib/specialized-bindings/transient-derived-binding/types/transient-derived-binding-args.d.ts.map +1 -0
  493. package/lib/specialized-bindings/transient-derived-binding/use-transient-derived-binding.d.ts +13 -0
  494. package/lib/specialized-bindings/transient-derived-binding/use-transient-derived-binding.d.ts.map +1 -0
  495. package/lib/synchronization/exports.d.ts +4 -0
  496. package/lib/synchronization/exports.d.ts.map +1 -0
  497. package/lib/synchronization/types/exports.d.ts +2 -0
  498. package/lib/synchronization/types/exports.d.ts.map +1 -0
  499. package/lib/synchronization/types/options.d.ts +13 -0
  500. package/lib/synchronization/types/options.d.ts.map +1 -0
  501. package/lib/synchronization/use-bi-dir-binding-sync.d.ts +10 -0
  502. package/lib/synchronization/use-bi-dir-binding-sync.d.ts.map +1 -0
  503. package/lib/synchronization/use-uni-dir-binding-sync.d.ts +6 -0
  504. package/lib/synchronization/use-uni-dir-binding-sync.d.ts.map +1 -0
  505. package/lib/types/array-like.d.ts +3 -0
  506. package/lib/types/array-like.d.ts.map +1 -0
  507. package/lib/types/empty.d.ts +3 -0
  508. package/lib/types/empty.d.ts.map +1 -0
  509. package/lib/types/exports.d.ts +3 -0
  510. package/lib/types/exports.d.ts.map +1 -0
  511. package/lib/use-binding-effect/exports.d.ts +3 -0
  512. package/lib/use-binding-effect/exports.d.ts.map +1 -0
  513. package/lib/use-binding-effect/types/exports.d.ts +2 -0
  514. package/lib/use-binding-effect/types/exports.d.ts.map +1 -0
  515. package/lib/use-binding-effect/types/options.d.ts +46 -0
  516. package/lib/use-binding-effect/types/options.d.ts.map +1 -0
  517. package/lib/use-binding-effect/use-binding-effect.d.ts +21 -0
  518. package/lib/use-binding-effect/use-binding-effect.d.ts.map +1 -0
  519. package/lib/utility-hooks/exports.d.ts +3 -0
  520. package/lib/utility-hooks/exports.d.ts.map +1 -0
  521. package/lib/utility-hooks/use-callback-ref.d.ts +3 -0
  522. package/lib/utility-hooks/use-callback-ref.d.ts.map +1 -0
  523. package/lib/utility-hooks/use-stable-value.d.ts +6 -0
  524. package/lib/utility-hooks/use-stable-value.d.ts.map +1 -0
  525. package/package.json +70 -0
  526. package/src/__test_dependency__/index.ts +4 -0
  527. package/src/__test_dependency__/run-in-dom.tsx +46 -0
  528. package/src/__test_dependency__/sleep.ts +3 -0
  529. package/src/bc/bc.tsx +12 -0
  530. package/src/bc/exports.ts +1 -0
  531. package/src/binding/__tests__/make-binding.test.ts +25 -0
  532. package/src/binding/__tests__/use-binding.test.tsx +54 -0
  533. package/src/binding/exports.ts +3 -0
  534. package/src/binding/internal/DoubleLinkedList/__tests__/double-linked-list.test.ts +134 -0
  535. package/src/binding/internal/DoubleLinkedList/index.ts +128 -0
  536. package/src/binding/internal/__tests__/custom-value-comparison.test.ts +31 -0
  537. package/src/binding/internal/__tests__/default-settings.test.ts +92 -0
  538. package/src/binding/internal/__tests__/default-value-comparison.test.ts +55 -0
  539. package/src/binding/internal/__tests__/locking.test.ts +111 -0
  540. package/src/binding/internal/__tests__/transformed.test.ts +48 -0
  541. package/src/binding/internal/binding-impl.ts +253 -0
  542. package/src/binding/internal/consts.ts +2 -0
  543. package/src/binding/make-binding.ts +26 -0
  544. package/src/binding/types/binding-args.ts +49 -0
  545. package/src/binding/types/binding-dependencies.ts +7 -0
  546. package/src/binding/types/binding-initializer.ts +2 -0
  547. package/src/binding/types/binding.ts +25 -0
  548. package/src/binding/types/change-listener.ts +5 -0
  549. package/src/binding/types/exports.ts +11 -0
  550. package/src/binding/types/infer-binding-value-types.ts +14 -0
  551. package/src/binding/types/infer-bindings-array-value-types.ts +12 -0
  552. package/src/binding/types/infer-named-binding-value-types.ts +12 -0
  553. package/src/binding/types/inference.ts +4 -0
  554. package/src/binding/types/readonly-binding.ts +39 -0
  555. package/src/binding/types/set-value-transformer.ts +11 -0
  556. package/src/binding/use-binding.ts +17 -0
  557. package/src/binding-utils/__tests__/are-all-bindings-locked.test.ts +40 -0
  558. package/src/binding-utils/__tests__/are-any-bindings-modified.test.ts +35 -0
  559. package/src/binding-utils/__tests__/lock-all-bindings.test.ts +36 -0
  560. package/src/binding-utils/__tests__/lock-bindings-and-do.test.ts +52 -0
  561. package/src/binding-utils/__tests__/set-all-bindings-modified.test.ts +22 -0
  562. package/src/binding-utils/exports.ts +3 -0
  563. package/src/binding-utils/internal/__tests__/make-value-then-do.test.ts +52 -0
  564. package/src/binding-utils/internal/make-value-then-do.ts +37 -0
  565. package/src/binding-utils/lock-utils.ts +50 -0
  566. package/src/binding-utils/modified-utils.ts +31 -0
  567. package/src/binding-utils/type-utils.ts +9 -0
  568. package/src/components/BindingsConsumer/__tests__/basic-rendering.test.tsx +75 -0
  569. package/src/components/BindingsConsumer/__tests__/debounced-rendering.test.tsx +93 -0
  570. package/src/components/BindingsConsumer/__tests__/multiple-bindings.test.tsx +94 -0
  571. package/src/components/BindingsConsumer/__tests__/nested-rendering.test.tsx +144 -0
  572. package/src/components/BindingsConsumer/__tests__/value-comparison.test.tsx +97 -0
  573. package/src/components/BindingsConsumer/__tests__/value-extraction.test.tsx +56 -0
  574. package/src/components/BindingsConsumer/index.tsx +77 -0
  575. package/src/components/BindingsConsumer/internal/Refreshable.tsx +38 -0
  576. package/src/components/BindingsConsumer/types/exports.ts +2 -0
  577. package/src/components/BindingsConsumer/types/props.ts +30 -0
  578. package/src/components/BindingsConsumer/types/render-callback.ts +15 -0
  579. package/src/components/exports.ts +1 -0
  580. package/src/config/are-equal.ts +16 -0
  581. package/src/config/exports.ts +5 -0
  582. package/src/config/logging.ts +31 -0
  583. package/src/config/stats-handler.ts +21 -0
  584. package/src/default-queue/__tests__/default-queue.test.tsx +32 -0
  585. package/src/default-queue/default-queue-context.tsx +48 -0
  586. package/src/default-queue/exports.ts +1 -0
  587. package/src/index.ts +14 -0
  588. package/src/internal-hooks/__tests__/use-is-mounted.test.ts +18 -0
  589. package/src/internal-hooks/use-is-mounted-ref.ts +16 -0
  590. package/src/internal-utils/__tests__/concat-arrays.test.ts +25 -0
  591. package/src/internal-utils/__tests__/extract-binding-dependency-values.test.ts +73 -0
  592. package/src/internal-utils/__tests__/normalize-as-array.test.ts +17 -0
  593. package/src/internal-utils/__tests__/normalize-as-optonal-array.test.ts +17 -0
  594. package/src/internal-utils/array-like.ts +26 -0
  595. package/src/internal-utils/extract-binding-dependency-values.ts +36 -0
  596. package/src/internal-utils/get-typed-keys.ts +6 -0
  597. package/src/internal-utils/uid.ts +4 -0
  598. package/src/limiter/__tests__/use-limiter.test.ts +227 -0
  599. package/src/limiter/exports.ts +4 -0
  600. package/src/limiter/internal/LimiterImpl.ts +73 -0
  601. package/src/limiter/make-limiter.ts +20 -0
  602. package/src/limiter/pick-limiter-options.ts +9 -0
  603. package/src/limiter/types/LimitMode.ts +6 -0
  604. package/src/limiter/types/LimitType.ts +31 -0
  605. package/src/limiter/types/Limiter.ts +10 -0
  606. package/src/limiter/types/LimiterOptions.ts +38 -0
  607. package/src/limiter/types/exports.ts +4 -0
  608. package/src/limiter/use-limiter.ts +52 -0
  609. package/src/make-bindable-component/__tests__/make-bindable-component.test.tsx +30 -0
  610. package/src/make-bindable-component/exports.ts +2 -0
  611. package/src/make-bindable-component/make-bindable-component.tsx +78 -0
  612. package/src/make-bindable-component/types/exports.ts +2 -0
  613. package/src/make-bindable-component/types/make-bindable-component-options.ts +6 -0
  614. package/src/make-bindable-component/types/upgrade-to-binding-props.tsx +11 -0
  615. package/src/resolveable/__tests__/resolve-type-or-binding-type.test.ts +22 -0
  616. package/src/resolveable/__tests__/resolve-type-or-deferred-type-or-binding-type.test.ts +26 -0
  617. package/src/resolveable/__tests__/resolve-type-or-deferred-type-with-args.test.ts +19 -0
  618. package/src/resolveable/__tests__/resolve-type-or-deferred-type.test.ts +19 -0
  619. package/src/resolveable/exports.ts +2 -0
  620. package/src/resolveable/types.ts +13 -0
  621. package/src/resolveable/utils.ts +17 -0
  622. package/src/specialized-bindings/__tests__/const-binding.test.tsx +43 -0
  623. package/src/specialized-bindings/__tests__/flattened-binding.test.ts +45 -0
  624. package/src/specialized-bindings/const-binding.ts +19 -0
  625. package/src/specialized-bindings/derived-binding/__tests__/basic.test.ts +94 -0
  626. package/src/specialized-bindings/derived-binding/__tests__/derivations-of-derivations.test.ts +71 -0
  627. package/src/specialized-bindings/derived-binding/__tests__/multiple-dependencies.test.ts +60 -0
  628. package/src/specialized-bindings/derived-binding/exports.ts +2 -0
  629. package/src/specialized-bindings/derived-binding/options.ts +56 -0
  630. package/src/specialized-bindings/derived-binding/use-derived-binding.ts +77 -0
  631. package/src/specialized-bindings/exports.ts +4 -0
  632. package/src/specialized-bindings/flattened-binding.ts +104 -0
  633. package/src/specialized-bindings/transient-derived-binding/__tests__/basic.test.ts +75 -0
  634. package/src/specialized-bindings/transient-derived-binding/__tests__/derivations-of-derivations.test.ts +69 -0
  635. package/src/specialized-bindings/transient-derived-binding/__tests__/multiple-dependencies.test.ts +52 -0
  636. package/src/specialized-bindings/transient-derived-binding/exports.ts +3 -0
  637. package/src/specialized-bindings/transient-derived-binding/make-transient-derived-binding.ts +63 -0
  638. package/src/specialized-bindings/transient-derived-binding/types/exports.ts +1 -0
  639. package/src/specialized-bindings/transient-derived-binding/types/transient-derived-binding-args.ts +11 -0
  640. package/src/specialized-bindings/transient-derived-binding/use-transient-derived-binding.ts +25 -0
  641. package/src/synchronization/__tests__/use-bi-dir-binding-sync.test.ts +27 -0
  642. package/src/synchronization/__tests__/use-uni-dir-binding-sync.test.ts +23 -0
  643. package/src/synchronization/exports.ts +3 -0
  644. package/src/synchronization/types/exports.ts +1 -0
  645. package/src/synchronization/types/options.ts +15 -0
  646. package/src/synchronization/use-bi-dir-binding-sync.ts +14 -0
  647. package/src/synchronization/use-uni-dir-binding-sync.ts +9 -0
  648. package/src/types/array-like.ts +2 -0
  649. package/src/types/empty.ts +2 -0
  650. package/src/types/exports.ts +2 -0
  651. package/src/use-binding-effect/__tests__/basic.test.ts +70 -0
  652. package/src/use-binding-effect/__tests__/throttled.test.ts +106 -0
  653. package/src/use-binding-effect/__tests__/trigger-on-mount.test.tsx +125 -0
  654. package/src/use-binding-effect/__tests__/value-comparison.test.ts +71 -0
  655. package/src/use-binding-effect/exports.ts +2 -0
  656. package/src/use-binding-effect/types/exports.ts +1 -0
  657. package/src/use-binding-effect/types/options.ts +50 -0
  658. package/src/use-binding-effect/use-binding-effect.ts +204 -0
  659. package/src/utility-hooks/__tests__/use-callback-ref.test.tsx +59 -0
  660. package/src/utility-hooks/__tests__/use-stable-value.test.tsx +49 -0
  661. package/src/utility-hooks/exports.ts +2 -0
  662. package/src/utility-hooks/use-callback-ref.ts +15 -0
  663. package/src/utility-hooks/use-stable-value.ts +17 -0
@@ -0,0 +1,2 @@
1
+ export * from './array-like';
2
+ export * from './empty';
@@ -0,0 +1,70 @@
1
+ import { jest } from '@jest/globals';
2
+ import { waitFor } from '@testing-library/react';
3
+
4
+ import { runInDom, sleep } from '../../__test_dependency__';
5
+ import type { ReadonlyBinding } from '../../binding/types/readonly-binding';
6
+ import { useBinding } from '../../binding/use-binding';
7
+ import { useBindingEffect } from '../use-binding-effect';
8
+
9
+ describe('useBindingEffect', () => {
10
+ it('should work with undefined bindings', () =>
11
+ runInDom(({ onMount }) => {
12
+ const callback = jest.fn((values) => {
13
+ expect(values).toBeUndefined();
14
+ });
15
+
16
+ useBindingEffect(undefined, callback, { triggerOnMount: true });
17
+
18
+ onMount(async () => {
19
+ await waitFor(() => expect(callback).toHaveBeenCalledTimes(1));
20
+ });
21
+ }));
22
+
23
+ it('with default settings, callback should only run if binding changed while mounted', () =>
24
+ runInDom(({ onMount }) => {
25
+ const b = useBinding(() => 0, { id: 'test' });
26
+
27
+ const callback = jest.fn(({ b }: { b: number }, bindings: { b: ReadonlyBinding<number> }) => {
28
+ expect(b).toBe(0);
29
+ expect(bindings.b.get()).toBe(0);
30
+ });
31
+
32
+ useBindingEffect({ b }, callback);
33
+
34
+ onMount(async () => {
35
+ await sleep(50); // giving time for callback
36
+
37
+ expect(callback).not.toHaveBeenCalled();
38
+
39
+ b.set(0);
40
+
41
+ await sleep(50); // giving time for callback
42
+
43
+ expect(callback).toHaveBeenCalledTimes(1);
44
+ });
45
+ }));
46
+
47
+ it('with default settings, callback should be run on mount if bindings changed between render and mount', () =>
48
+ runInDom(({ onMount }) => {
49
+ const b = useBinding(() => 0, { id: 'test' });
50
+
51
+ const callback = jest.fn(({ b }: { b: number }) => {
52
+ expect(b).toBe(1);
53
+ });
54
+
55
+ useBindingEffect({ b }, callback);
56
+ b.set(1);
57
+
58
+ onMount(async () => {
59
+ await sleep(50); // giving time for callback
60
+
61
+ expect(callback).toHaveBeenCalledTimes(1);
62
+
63
+ b.set(1);
64
+
65
+ await sleep(50); // giving time for callback
66
+
67
+ expect(callback).toHaveBeenCalledTimes(2);
68
+ });
69
+ }));
70
+ });
@@ -0,0 +1,106 @@
1
+ import { jest } from '@jest/globals';
2
+
3
+ import { runInDom, sleep } from '../../__test_dependency__';
4
+ import { useBinding } from '../../binding/use-binding';
5
+ import { useBindingEffect } from '../use-binding-effect';
6
+
7
+ describe('useBindingEffect', () => {
8
+ it('trailing throttled effects should be run only when the elapsed interval has been reached', () =>
9
+ runInDom(({ onMount }) => {
10
+ const b = useBinding(() => 0, { id: 'test' });
11
+
12
+ const callback = jest.fn(({ b }: { b: number }) => {
13
+ expect(b).toBe(0);
14
+ });
15
+
16
+ useBindingEffect({ b }, callback, { limitType: 'throttle', limitMode: 'trailing', limitMSec: 500 });
17
+
18
+ onMount(async () => {
19
+ await sleep(50); // giving time for callback
20
+
21
+ expect(callback).not.toHaveBeenCalled();
22
+
23
+ b.set(0);
24
+
25
+ await sleep(50); // giving time for callback (shouldn't run though)
26
+
27
+ expect(callback).not.toHaveBeenCalled();
28
+
29
+ await sleep(50); // giving time for callback (shouldn't run though)
30
+
31
+ expect(callback).not.toHaveBeenCalled();
32
+
33
+ await sleep(500); // giving time for callback
34
+
35
+ expect(callback).toHaveBeenCalledTimes(1);
36
+
37
+ b.set(1);
38
+ b.set(2);
39
+ b.set(3);
40
+
41
+ await sleep(50); // giving time for callback (shouldn't run though)
42
+
43
+ expect(callback).toHaveBeenCalledTimes(1);
44
+
45
+ await sleep(50); // giving time for callback (shouldn't run though)
46
+
47
+ expect(callback).toHaveBeenCalledTimes(1);
48
+
49
+ await sleep(500); // giving time for callback
50
+
51
+ expect(callback).toHaveBeenCalledTimes(2);
52
+ });
53
+ }));
54
+
55
+ it('leading throttled effects should be run on the first change or on the next change after enough time has elapsed', () =>
56
+ runInDom(({ onMount }) => {
57
+ const b = useBinding(() => 0, { id: 'test' });
58
+
59
+ const callback = jest.fn(({ b }: { b: number }) => {
60
+ expect(b).toBe(0);
61
+ });
62
+
63
+ useBindingEffect({ b }, callback, { limitType: 'throttle', limitMode: 'leading', limitMSec: 500 });
64
+
65
+ onMount(async () => {
66
+ await sleep(50); // giving time for callback
67
+
68
+ expect(callback).not.toHaveBeenCalled();
69
+
70
+ b.set(0);
71
+
72
+ await sleep(50); // giving time for callback (shouldn't run though)
73
+
74
+ expect(callback).toHaveBeenCalledTimes(1);
75
+
76
+ await sleep(50); // giving time for callback (shouldn't run though)
77
+
78
+ expect(callback).toHaveBeenCalledTimes(1);
79
+
80
+ await sleep(500); // giving time for callback
81
+
82
+ expect(callback).toHaveBeenCalledTimes(1);
83
+
84
+ b.set(1);
85
+
86
+ await sleep(0); // giving time for callback (shouldn't run though)
87
+
88
+ expect(callback).toHaveBeenCalledTimes(2);
89
+
90
+ b.set(2);
91
+ b.set(3);
92
+
93
+ await sleep(50); // giving time for callback (shouldn't run though)
94
+
95
+ expect(callback).toHaveBeenCalledTimes(2);
96
+
97
+ await sleep(50); // giving time for callback (shouldn't run though)
98
+
99
+ expect(callback).toHaveBeenCalledTimes(2);
100
+
101
+ await sleep(500); // giving time for callback
102
+
103
+ expect(callback).toHaveBeenCalledTimes(2);
104
+ });
105
+ }));
106
+ });
@@ -0,0 +1,125 @@
1
+ import { jest } from '@jest/globals';
2
+ import { waitFor } from '@testing-library/react';
3
+ import React from 'react';
4
+
5
+ import { runInDom, sleep } from '../../__test_dependency__';
6
+ import { useBinding } from '../../binding/use-binding';
7
+ import { BindingsConsumer } from '../../components/BindingsConsumer';
8
+ import { useBindingEffect } from '../use-binding-effect';
9
+
10
+ describe('useBindingEffect', () => {
11
+ it('with triggerOnMount=false, callback should not be run on mount even if bindings changed between render and mount', () =>
12
+ runInDom(({ onMount }) => {
13
+ const b = useBinding(() => 0, { id: 'test' });
14
+
15
+ const callback = jest.fn(({ b }: { b: number }) => {
16
+ expect(b).toBe(1);
17
+ });
18
+
19
+ useBindingEffect({ b }, callback, { triggerOnMount: false });
20
+ b.set(1);
21
+
22
+ onMount(async () => {
23
+ await sleep(50); // giving time for callback
24
+
25
+ expect(callback).toHaveBeenCalledTimes(0);
26
+
27
+ b.set(1);
28
+
29
+ await sleep(50); // giving time for callback
30
+
31
+ expect(callback).toHaveBeenCalledTimes(1);
32
+ });
33
+ }));
34
+
35
+ it('with triggerOnMount=true, callback should always be made on mount', () =>
36
+ runInDom(({ onMount }) => {
37
+ const b = useBinding(() => 0, { id: 'test' });
38
+
39
+ const callback = jest.fn(({ b: _b }: { b: number }) => {});
40
+
41
+ const refreshValue = useBinding(() => 0, { id: 'refreshValue' });
42
+ const MyComponent = () => {
43
+ useBindingEffect({ b }, callback, { triggerOnMount: true });
44
+
45
+ return <></>;
46
+ };
47
+
48
+ onMount(async () => {
49
+ await sleep(50); // giving time for callback
50
+
51
+ expect(callback).toHaveBeenCalledTimes(1);
52
+
53
+ b.set(1);
54
+
55
+ await sleep(50); // giving time for callback
56
+
57
+ expect(callback).toHaveBeenCalledTimes(2);
58
+
59
+ refreshValue.set(1);
60
+ await waitFor(() => expect(callback).toHaveBeenCalledTimes(3));
61
+ });
62
+
63
+ return <BindingsConsumer bindings={refreshValue}>{() => <MyComponent />}</BindingsConsumer>;
64
+ }));
65
+
66
+ it('with triggerOnMount=first, callback should be made only on the first mount', () =>
67
+ runInDom(({ onMount }) => {
68
+ const b = useBinding(() => 0, { id: 'test' });
69
+
70
+ const callback = jest.fn(({ b: _b }: { b: number }) => {});
71
+
72
+ const refreshValue = useBinding(() => 0, { id: 'refreshValue' });
73
+ const MyComponent = () => {
74
+ useBindingEffect({ b }, callback, { triggerOnMount: 'first' });
75
+
76
+ return <></>;
77
+ };
78
+
79
+ onMount(async () => {
80
+ await sleep(50); // giving time for callback
81
+
82
+ expect(callback).toHaveBeenCalledTimes(1);
83
+
84
+ b.set(1);
85
+ await waitFor(() => expect(callback).toHaveBeenCalledTimes(2));
86
+
87
+ refreshValue.set(1);
88
+ await expect(waitFor(() => expect(callback).not.toHaveBeenCalledTimes(2))).rejects.toThrow();
89
+ });
90
+
91
+ return <BindingsConsumer bindings={refreshValue}>{() => <MyComponent />}</BindingsConsumer>;
92
+ }));
93
+
94
+ it('with deps, callback should be made only on the first mount or if the dependency values change', () =>
95
+ runInDom(({ onMount }) => {
96
+ const callback = jest.fn(() => {});
97
+
98
+ const refreshValue = useBinding(() => 0, { id: 'refreshValue' });
99
+ const MyComponent = ({ value }: { value: number }) => {
100
+ useBindingEffect(undefined, callback, { deps: [value], limitType: 'none' });
101
+
102
+ return <></>;
103
+ };
104
+
105
+ onMount(async () => {
106
+ await sleep(50); // giving time for callback
107
+
108
+ expect(callback).toHaveBeenCalledTimes(0);
109
+
110
+ refreshValue.set(0);
111
+ await expect(waitFor(() => expect(callback).not.toHaveBeenCalledTimes(0))).rejects.toThrow();
112
+
113
+ refreshValue.set(1);
114
+ await waitFor(() => expect(callback).toHaveBeenCalledTimes(1));
115
+
116
+ refreshValue.set(1);
117
+ await expect(waitFor(() => expect(callback).not.toHaveBeenCalledTimes(1))).rejects.toThrow();
118
+
119
+ refreshValue.set(2);
120
+ await waitFor(() => expect(callback).toHaveBeenCalledTimes(2));
121
+ });
122
+
123
+ return <BindingsConsumer bindings={refreshValue}>{(refreshValue) => <MyComponent value={refreshValue} />}</BindingsConsumer>;
124
+ }));
125
+ });
@@ -0,0 +1,71 @@
1
+ import { jest } from '@jest/globals';
2
+
3
+ import { runInDom, sleep } from '../../__test_dependency__';
4
+ import { useBinding } from '../../binding/use-binding';
5
+ import { useBindingEffect } from '../use-binding-effect';
6
+
7
+ describe('useBindingEffect', () => {
8
+ it('with detectInputChanges=true, callback should only run if binding values really changed, according to areEqual', () =>
9
+ runInDom(({ onMount }) => {
10
+ const b = useBinding(() => 0, { id: 'test' });
11
+
12
+ const callback = jest.fn(({ b }: { b: number }) => {
13
+ expect(b).toBe(0);
14
+ });
15
+
16
+ useBindingEffect({ b }, callback, { detectInputChanges: true });
17
+
18
+ onMount(async () => {
19
+ await sleep(50); // giving time for callback
20
+
21
+ expect(callback).not.toHaveBeenCalled();
22
+
23
+ b.set(0);
24
+
25
+ await sleep(50); // giving time for callback
26
+
27
+ expect(callback).not.toHaveBeenCalled();
28
+
29
+ b.set(1);
30
+
31
+ await sleep(50); // giving time for callback
32
+
33
+ expect(callback).toHaveBeenCalledTimes(1);
34
+ });
35
+ }));
36
+
37
+ it("with detectChanges=true and makeComparableInputValue=evenness checker, callback should only run if binding's evenness changes", () =>
38
+ runInDom(({ onMount }) => {
39
+ const b = useBinding(() => 0, { id: 'test' });
40
+
41
+ const callback = jest.fn(({ b }: { b: number }) => {
42
+ expect(b).toBe(0);
43
+ });
44
+
45
+ useBindingEffect({ b }, callback, { detectInputChanges: true, makeComparableInputValue: () => b.get() % 2 === 0 });
46
+
47
+ onMount(async () => {
48
+ await sleep(50); // giving time for callback
49
+
50
+ expect(callback).not.toHaveBeenCalled();
51
+
52
+ b.set(0);
53
+
54
+ await sleep(50); // giving time for callback
55
+
56
+ expect(callback).not.toHaveBeenCalled();
57
+
58
+ b.set(2);
59
+
60
+ await sleep(50); // giving time for callback
61
+
62
+ expect(callback).not.toHaveBeenCalled();
63
+
64
+ b.set(3);
65
+
66
+ await sleep(50); // giving time for callback
67
+
68
+ expect(callback).toHaveBeenCalledTimes(1);
69
+ });
70
+ }));
71
+ });
@@ -0,0 +1,2 @@
1
+ export * from './types/exports';
2
+ export * from './use-binding-effect';
@@ -0,0 +1 @@
1
+ export * from './options';
@@ -0,0 +1,50 @@
1
+ import type { DependencyList } from 'react';
2
+
3
+ import type { LimiterOptions } from '../../limiter/types/LimiterOptions';
4
+
5
+ export interface UseBindingEffectOptions extends LimiterOptions {
6
+ /** A technical but human-readable ID */
7
+ id?: string;
8
+
9
+ /**
10
+ * On a rerender, deps changes are treated like bindings changes. That is, if they change between renders, the input change detection
11
+ * logic is run (using the `areInputValuesEqual`, `detectInputChanges`, and `makeComparableInputValue` values) using the limiter (see
12
+ * `LimiterOptions`).
13
+ */
14
+ deps?: DependencyList;
15
+
16
+ /**
17
+ * If specified, overrides the function used to compare input values
18
+ *
19
+ * @defaultValue `_.isEqual`, which can be globally overridden using `setAreEqual`
20
+ */
21
+ areInputValuesEqual?: (a: any, b: any) => boolean;
22
+ /**
23
+ * - If `true` – `areInputValuesEqual` is used to compare the old and new results of `makeComparableInputValue` when any of the input
24
+ * bindings or `deps` are changed. If the values are equal, the transformer won't be run. If they're unequal, the transformer will be
25
+ * run.
26
+ * - If `false` – old and new values aren't compared, the transformer will always be run.
27
+ *
28
+ * @defaultValue `false`
29
+ */
30
+ detectInputChanges?: boolean;
31
+ /**
32
+ * By default, when `detectInputChanges` is true, the input is compared using all specified bindings. This behavior can be overridden by
33
+ * providing this function to generate a value that can be compared instead. This value will be remembered until the next comparison is
34
+ * needed. Comparisons are performed using `areInputValuesEqual`
35
+ *
36
+ * @defaultValue A function that returns the values of all input bindings (including any additional bindings) and the deps
37
+ */
38
+ makeComparableInputValue?: () => any;
39
+
40
+ /**
41
+ * - If `true`, the callback is triggered every time this is mounted in addition to whenever the input bindings change.
42
+ * - If `false`, the callback is only triggered when the input bindings change.
43
+ * - If `'first'`, the callback is triggered on the first mount and whenever the input bindings change
44
+ * - If `'if-input-changed'`, the callback is triggered on mount if the bindings have changed since the last evaluation of the
45
+ * transformer
46
+ *
47
+ * @defaultValue `'if-input-changed'`
48
+ */
49
+ triggerOnMount?: boolean | 'first' | 'if-input-changed';
50
+ }
@@ -0,0 +1,204 @@
1
+ import { useEffect, useRef } from 'react';
2
+
3
+ import type { BindingArrayDependencies, BindingDependencies, NamedBindingDependencies } from '../binding/types/binding-dependencies';
4
+ import type { ChangeListenerRemover } from '../binding/types/change-listener';
5
+ import type { InferBindingValueTypes } from '../binding/types/infer-binding-value-types';
6
+ import type { ReadonlyBinding } from '../binding/types/readonly-binding';
7
+ import { isBinding } from '../binding-utils/type-utils';
8
+ import { areEqual } from '../config/are-equal';
9
+ import { normalizeAsArray } from '../internal-utils/array-like';
10
+ import { extractBindingDependencyValues } from '../internal-utils/extract-binding-dependency-values';
11
+ import { getTypedKeys } from '../internal-utils/get-typed-keys';
12
+ import { pickLimiterOptions } from '../limiter/pick-limiter-options';
13
+ import { useLimiter } from '../limiter/use-limiter';
14
+ import type { EmptyObject } from '../types/empty';
15
+ import { useCallbackRef } from '../utility-hooks/use-callback-ref';
16
+ import { useStableValue } from '../utility-hooks/use-stable-value';
17
+ import type { UseBindingEffectOptions } from './types/options';
18
+
19
+ const emptyDependencies = Object.freeze({} as EmptyObject);
20
+
21
+ /**
22
+ * Called when the associated bindings change, depending on the options provided to `useBindingEffect`.
23
+ *
24
+ * @param bindingValues - The extracted values of the associated named bindings. If named bindings aren't used, this will be an empty
25
+ * object.
26
+ * @param bindings - The original named bindings if named bindings are used or an empty object otherwise.
27
+ */
28
+ export type UseBindingEffectCallback<DependenciesT extends BindingDependencies> = (
29
+ bindingValues: InferBindingValueTypes<DependenciesT>,
30
+ bindings: DependenciesT
31
+ ) => void;
32
+
33
+ /**
34
+ * Calls the specified callback function any time any of the specified bindings are changed.
35
+ *
36
+ * Most of the time you should use this hook rather than addChangeListener.
37
+ *
38
+ * @returns a function that can be called anytime to cancel the most recent limited callback. This is useful, for example, if the the
39
+ * callback would have triggered a re-render that we, by other means, know to be unnecessary.
40
+ */
41
+ export const useBindingEffect = <DependenciesT extends BindingDependencies>(
42
+ bindings: DependenciesT | undefined,
43
+ callback: UseBindingEffectCallback<DependenciesT>,
44
+ options: UseBindingEffectOptions = {}
45
+ ): (() => void) => {
46
+ const {
47
+ id,
48
+ deps,
49
+ areInputValuesEqual = areEqual,
50
+ detectInputChanges = false,
51
+ makeComparableInputValue,
52
+ triggerOnMount = 'if-input-changed'
53
+ } = options;
54
+
55
+ const limiterOptions = pickLimiterOptions(options);
56
+
57
+ const isNonNamedBindings = Array.isArray(bindings) || isBinding(bindings);
58
+ const nonNamedBindings = isNonNamedBindings ? (bindings as ReadonlyBinding | BindingArrayDependencies) : undefined;
59
+ const namedBindings = isNonNamedBindings ? undefined : (bindings as NamedBindingDependencies);
60
+ const namedBindingsKeys = namedBindings !== undefined ? getTypedKeys(namedBindings) : undefined;
61
+ const stableAllBindings = useStableValue(
62
+ isNonNamedBindings ? normalizeAsArray(nonNamedBindings) : Object.values(namedBindings ?? emptyDependencies)
63
+ );
64
+
65
+ // Doesn't need to be stable since always used in a callback ref
66
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
67
+ const getDependencyValues = () => extractBindingDependencyValues<DependenciesT>({ bindings, namedBindingsKeys });
68
+
69
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
70
+ const comparableInputValueMaker = makeComparableInputValue ?? getDependencyValues;
71
+ const lastComparableInputValue = useRef(
72
+ detectInputChanges && (triggerOnMount === false || triggerOnMount === 'if-input-changed') ? comparableInputValueMaker() : undefined
73
+ );
74
+
75
+ /** Only used when `detectInputChanges` is `false` and `triggerOnMount` is `'if-input-changed'` */
76
+ const lastChangeUids = useRef<string | undefined>();
77
+
78
+ const limiter = useLimiter({
79
+ id: id ?? 'use-binding-effect',
80
+ cancelOnUnmount: true,
81
+ ...limiterOptions
82
+ });
83
+
84
+ const checkAndUpdateIfInputChanged = useCallbackRef(() => {
85
+ if (detectInputChanges) {
86
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
87
+ const nextComparableInputValue = comparableInputValueMaker!();
88
+ if (areInputValuesEqual(lastComparableInputValue.current, nextComparableInputValue)) {
89
+ return false;
90
+ }
91
+
92
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
93
+ lastComparableInputValue.current = nextComparableInputValue;
94
+ return true;
95
+ } else if (triggerOnMount === 'if-input-changed') {
96
+ const newChangeUids = makeChangeUidsString(stableAllBindings);
97
+ if (newChangeUids === lastChangeUids.current) {
98
+ return false;
99
+ }
100
+
101
+ lastChangeUids.current = newChangeUids;
102
+ return true;
103
+ } else {
104
+ return true;
105
+ }
106
+ });
107
+
108
+ const isFirstRender = useRef(true);
109
+ const needsTrigger = useRef(false);
110
+
111
+ const triggerCallback = useCallbackRef((needsInputChangeTrackingUpdate: boolean) => {
112
+ needsTrigger.current = false;
113
+
114
+ if (needsInputChangeTrackingUpdate) {
115
+ // We don't care about the result here -- just want to update the tracking
116
+ checkAndUpdateIfInputChanged();
117
+ }
118
+
119
+ callback(getDependencyValues(), bindings ?? (emptyDependencies as DependenciesT));
120
+ });
121
+
122
+ const performChecksAndTriggerCallbackIfNeeded = useCallbackRef(() => {
123
+ if (needsTrigger.current) {
124
+ triggerCallback(true);
125
+ } else {
126
+ const didChange = checkAndUpdateIfInputChanged();
127
+ if (detectInputChanges && !didChange) {
128
+ return; // No change
129
+ }
130
+
131
+ triggerCallback(false);
132
+ }
133
+ });
134
+
135
+ if (isFirstRender.current) {
136
+ isFirstRender.current = false;
137
+
138
+ if (!detectInputChanges && triggerOnMount === 'if-input-changed') {
139
+ lastChangeUids.current = makeChangeUidsString(stableAllBindings);
140
+ }
141
+ }
142
+
143
+ useEffect(() => {
144
+ const addedBindingUids = new Set<string>();
145
+ const removers: ChangeListenerRemover[] = [];
146
+ for (const b of stableAllBindings) {
147
+ if (b !== undefined && !addedBindingUids.has(b.uid)) {
148
+ // Making sure we only listen for changes once per binding, even if the same binding is listed multiple times
149
+ addedBindingUids.add(b.uid);
150
+
151
+ removers.push(b.addChangeListener(() => limiter.limit(performChecksAndTriggerCallbackIfNeeded)));
152
+ }
153
+ }
154
+
155
+ return () => {
156
+ for (const remover of removers) {
157
+ remover();
158
+ }
159
+ removers.length = 0;
160
+ };
161
+ }, [limiter, performChecksAndTriggerCallbackIfNeeded, stableAllBindings]);
162
+
163
+ const isFirstMount = useRef(true);
164
+ useEffect(() => {
165
+ if (
166
+ needsTrigger.current ||
167
+ triggerOnMount === true ||
168
+ (isFirstMount.current && triggerOnMount === 'first') ||
169
+ (triggerOnMount === 'if-input-changed' && checkAndUpdateIfInputChanged())
170
+ ) {
171
+ needsTrigger.current = true;
172
+ limiter.limit(() => triggerCallback(true));
173
+ }
174
+ isFirstMount.current = false;
175
+ });
176
+
177
+ // If the deps changed,
178
+ const lastDepsValue = useRef(deps);
179
+ if (!areEqual(lastDepsValue.current, deps)) {
180
+ lastDepsValue.current = deps;
181
+
182
+ needsTrigger.current = true;
183
+ limiter.limit(() => triggerCallback(true));
184
+ }
185
+
186
+ // If the upcoming callback is canceled, it's assumed we have already dealt with the input in a different way, so we need to update the
187
+ // tracking info to make sure we don't reprocess the same thing later
188
+ return () => {
189
+ limiter.cancel();
190
+ needsTrigger.current = false;
191
+ // We don't care about the result here -- just want to update the tracking
192
+ checkAndUpdateIfInputChanged();
193
+ };
194
+ };
195
+
196
+ // Helpers
197
+
198
+ const makeChangeUidsString = (bindings: Array<ReadonlyBinding | undefined>) => {
199
+ const array: string[] = [];
200
+ for (const b of bindings) {
201
+ array.push(b?.getChangeUid() ?? '');
202
+ }
203
+ return array.join(',');
204
+ };