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,56 @@
1
+ import type { DependencyList } from 'react';
2
+
3
+ import type { LimiterOptions } from '../../limiter/types/LimiterOptions';
4
+
5
+ export interface DerivedBindingOptions<GetT> extends LimiterOptions {
6
+ /** A technical, but human-readable ID, which isn't guaranteed to be unique */
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 `true`
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
33
+ * by providing this function to generate a value that can be compared instead. The generated value will be remembered until the next
34
+ * comparison is needed. Comparisons are performed using `areInputValuesEqual`
35
+ *
36
+ * @defaultValue A function that returns the values of all input bindings and the deps
37
+ */
38
+ makeComparableInputValue?: () => any;
39
+
40
+ /**
41
+ * If specified, overrides the function used to compare output values
42
+ *
43
+ * @defaultValue `_.isEqual`, which can be globally overridden using `setAreEqual`
44
+ */
45
+ areOutputValuesEqual?: (a: GetT, b: GetT) => boolean;
46
+ /**
47
+ * - If `true` – `areOutputValuesEqual` is used to compare the old and new results of the transformer function, each time it's run. If the
48
+ * values are equal, the derived binding's value won't be changed. If they're unequal, the binding value will be changed and listeners
49
+ * will be notified.
50
+ * - If `false` – old and new results of the transformer function aren't compared. The derived binding's value will always be changed each
51
+ * time the transformer function is run.
52
+ *
53
+ * @defaultValue `true`
54
+ */
55
+ detectOutputChanges?: boolean;
56
+ }
@@ -0,0 +1,77 @@
1
+ import type { BindingDependencies, NamedBindingDependencies } from '../../binding/types/binding-dependencies';
2
+ import type { InferBindingValueTypes } from '../../binding/types/infer-binding-value-types';
3
+ import type { ReadonlyBinding } from '../../binding/types/readonly-binding';
4
+ import { useBinding } from '../../binding/use-binding';
5
+ import { isBinding } from '../../binding-utils/type-utils';
6
+ import { getStatsHandler } from '../../config/stats-handler';
7
+ import { extractBindingDependencyValues } from '../../internal-utils/extract-binding-dependency-values';
8
+ import { getTypedKeys } from '../../internal-utils/get-typed-keys';
9
+ import { pickLimiterOptions } from '../../limiter/pick-limiter-options';
10
+ import { useBindingEffect } from '../../use-binding-effect/use-binding-effect';
11
+ import { useCallbackRef } from '../../utility-hooks/use-callback-ref';
12
+ import type { DerivedBindingOptions } from './options';
13
+
14
+ /**
15
+ * Called to compute the derived value on the initial render and anytime the dependencies change.
16
+ *
17
+ * @param bindingValues - The extracted values of the bindings.
18
+ * @param bindings - The original bindings
19
+ *
20
+ * @returns The derived value
21
+ */
22
+ export type UseDerivedBindingTransformer<GetT, DependenciesT extends BindingDependencies> = (
23
+ bindingValues: InferBindingValueTypes<DependenciesT>,
24
+ bindings: DependenciesT
25
+ ) => GetT;
26
+
27
+ /** A derived binding is a binding derived from zero or more other bindings */
28
+ export const useDerivedBinding = <GetT, DependenciesT extends BindingDependencies>(
29
+ bindings: DependenciesT | undefined,
30
+ transformer: UseDerivedBindingTransformer<GetT, DependenciesT>,
31
+ options: DerivedBindingOptions<GetT>
32
+ ): ReadonlyBinding<GetT> => {
33
+ const {
34
+ id,
35
+ deps,
36
+ areInputValuesEqual,
37
+ detectInputChanges = true,
38
+ makeComparableInputValue,
39
+ areOutputValuesEqual,
40
+ detectOutputChanges = true
41
+ } = options;
42
+
43
+ const limiterOptions = pickLimiterOptions(options);
44
+
45
+ const isNonNamedBindings = Array.isArray(bindings) || isBinding(bindings);
46
+ const namedBindings = isNonNamedBindings ? undefined : (bindings as NamedBindingDependencies);
47
+ const namedBindingsKeys = namedBindings !== undefined ? getTypedKeys(namedBindings) : undefined;
48
+
49
+ // Doesn't need to be stable since Refreshable will always get rendered with the latest anyway
50
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
51
+ const getDependencyValues = () => extractBindingDependencyValues<DependenciesT>({ bindings, namedBindingsKeys });
52
+
53
+ const measuredTransformer = useCallbackRef((dependencyValues: InferBindingValueTypes<DependenciesT> = getDependencyValues()) => {
54
+ const startMSec = performance.now();
55
+ try {
56
+ return transformer(dependencyValues, bindings ?? (undefined as any as DependenciesT));
57
+ } finally {
58
+ getStatsHandler().trackDerivedBindingTransformerDidRun?.({ id, durationMSec: performance.now() - startMSec });
59
+ }
60
+ });
61
+
62
+ const internalBinding = useBinding(() => measuredTransformer(), {
63
+ id,
64
+ areEqual: areOutputValuesEqual,
65
+ detectChanges: detectOutputChanges
66
+ });
67
+
68
+ useBindingEffect(bindings, (namedBindingValues) => internalBinding.set(measuredTransformer(namedBindingValues)), {
69
+ deps,
70
+ areInputValuesEqual,
71
+ detectInputChanges,
72
+ makeComparableInputValue,
73
+ ...limiterOptions
74
+ });
75
+
76
+ return internalBinding;
77
+ };
@@ -0,0 +1,4 @@
1
+ export * from './const-binding';
2
+ export * from './derived-binding/exports';
3
+ export * from './flattened-binding';
4
+ export * from './transient-derived-binding/exports';
@@ -0,0 +1,104 @@
1
+ import { useEffect, useRef } from 'react';
2
+
3
+ import type { BindingDependencies, NamedBindingDependencies } from '../binding/types/binding-dependencies';
4
+ import type { InferBindingValueTypes } from '../binding/types/infer-binding-value-types';
5
+ import type { ReadonlyBinding } from '../binding/types/readonly-binding';
6
+ import { useBinding } from '../binding/use-binding';
7
+ import { isBinding } from '../binding-utils/type-utils';
8
+ import { useIsMountedRef } from '../internal-hooks/use-is-mounted-ref';
9
+ import { extractBindingDependencyValues } from '../internal-utils/extract-binding-dependency-values';
10
+ import { getTypedKeys } from '../internal-utils/get-typed-keys';
11
+ import { pickLimiterOptions } from '../limiter/pick-limiter-options';
12
+ import { useBindingEffect } from '../use-binding-effect/use-binding-effect';
13
+ import { useStableValue } from '../utility-hooks/use-stable-value';
14
+ import type { DerivedBindingOptions } from './derived-binding/options';
15
+
16
+ /**
17
+ * Called to extract the second-level binding on the initial render and anytime the dependencies change.
18
+ *
19
+ * @param bindingValues - The extracted values of bindings.
20
+ * @param bindings - The original bindings.
21
+ *
22
+ * @returns The second-level binding (i.e. a binding determined dynamically by executing this function)
23
+ */
24
+ export type UseFlattenedBindingTransformer<GetT, DependenciesT extends BindingDependencies> = (
25
+ bindingValues: InferBindingValueTypes<DependenciesT>,
26
+ bindings: DependenciesT
27
+ ) => ReadonlyBinding<GetT>;
28
+
29
+ /** Use when a binding contains another binding, to listen to the second-level binding if either the first or second levels change */
30
+ export const useFlattenedBinding = <GetT, DependenciesT extends BindingDependencies>(
31
+ bindings: DependenciesT | undefined,
32
+ transformer: UseFlattenedBindingTransformer<GetT, DependenciesT>,
33
+ options: DerivedBindingOptions<GetT>
34
+ ): ReadonlyBinding<GetT> => {
35
+ const {
36
+ id,
37
+ deps = [],
38
+ areInputValuesEqual,
39
+ detectInputChanges = true,
40
+ makeComparableInputValue,
41
+ areOutputValuesEqual,
42
+ detectOutputChanges = true
43
+ } = options;
44
+
45
+ const limiterOptions = pickLimiterOptions(options);
46
+
47
+ const isMounted = useIsMountedRef();
48
+
49
+ const isNonNamedBindings = Array.isArray(bindings) || isBinding(bindings);
50
+ const namedBindings = useStableValue(isNonNamedBindings ? undefined : (bindings as NamedBindingDependencies));
51
+ const namedBindingsKeys = namedBindings !== undefined ? getTypedKeys(namedBindings) : undefined;
52
+
53
+ // Doesn't need to be stable since Refreshable will always get rendered with the latest anyway
54
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
55
+ const getDependencyValues = () => extractBindingDependencyValues<DependenciesT>({ bindings, namedBindingsKeys });
56
+
57
+ const internalBinding = useBinding(() => transformer(getDependencyValues(), bindings ?? (undefined as any as DependenciesT)).get(), {
58
+ id,
59
+ areEqual: areOutputValuesEqual,
60
+ detectChanges: detectOutputChanges
61
+ });
62
+
63
+ const secondLevelBindingListenerRemover = useRef<(() => void) | undefined>(undefined);
64
+
65
+ useBindingEffect(
66
+ bindings,
67
+ (dependencyValues) => {
68
+ secondLevelBindingListenerRemover.current?.();
69
+ secondLevelBindingListenerRemover.current = undefined;
70
+
71
+ const secondLevelBinding = transformer(dependencyValues, bindings ?? (undefined as any as DependenciesT));
72
+ internalBinding.set(secondLevelBinding.get());
73
+
74
+ if (isMounted.current ?? false) {
75
+ secondLevelBindingListenerRemover.current = secondLevelBinding.addChangeListener(() => {
76
+ internalBinding.set(secondLevelBinding.get());
77
+ });
78
+ }
79
+ },
80
+ {
81
+ deps,
82
+ areInputValuesEqual,
83
+ detectInputChanges,
84
+ makeComparableInputValue,
85
+ triggerOnMount: true,
86
+ ...limiterOptions
87
+ }
88
+ );
89
+
90
+ useEffect(() => {
91
+ const secondLevelBinding = transformer(getDependencyValues(), bindings ?? (undefined as any as DependenciesT));
92
+
93
+ secondLevelBindingListenerRemover.current = secondLevelBinding.addChangeListener(() => {
94
+ internalBinding.set(secondLevelBinding.get());
95
+ });
96
+
97
+ return () => {
98
+ secondLevelBindingListenerRemover.current?.();
99
+ secondLevelBindingListenerRemover.current = undefined;
100
+ };
101
+ });
102
+
103
+ return internalBinding;
104
+ };
@@ -0,0 +1,75 @@
1
+ import { jest } from '@jest/globals';
2
+
3
+ import { runInDom } from '../../../__test_dependency__';
4
+ import { useBinding } from '../../../binding/use-binding';
5
+ import { makeTransientDerivedBinding } from '../make-transient-derived-binding';
6
+
7
+ describe('makeTransientDerivedBinding', () => {
8
+ it('should work with undefined bindings', () =>
9
+ runInDom(({ onMount }) => {
10
+ onMount(() => {
11
+ expect(
12
+ makeTransientDerivedBinding(
13
+ undefined,
14
+ (values) => {
15
+ expect(values).toBeUndefined();
16
+ return 1;
17
+ },
18
+ { id: 'a' }
19
+ ).get()
20
+ ).toBe(1);
21
+ });
22
+ }));
23
+
24
+ it('initial value should work with named bindings', () =>
25
+ runInDom(({ onMount }) => {
26
+ const a = useBinding(() => 0, { id: 'a' });
27
+
28
+ const bTransformer = jest.fn(({ a }: { a: number }) => a + 1);
29
+
30
+ onMount(() => {
31
+ expect(makeTransientDerivedBinding({ a }, bTransformer, { id: 'a' }).get()).toBe(1);
32
+ expect(bTransformer).toHaveBeenCalledTimes(1);
33
+ });
34
+ }));
35
+
36
+ it('initial value should work with single unnamed bindings', () =>
37
+ runInDom(({ onMount }) => {
38
+ const a = useBinding(() => 0, { id: 'a' });
39
+
40
+ const bTransformer = jest.fn(() => a.get() + 1);
41
+
42
+ onMount(() => {
43
+ expect(makeTransientDerivedBinding(a, bTransformer, { id: 'a' }).get()).toBe(1);
44
+ expect(bTransformer).toHaveBeenCalledTimes(1);
45
+ });
46
+ }));
47
+
48
+ it('initial value should work with array of unnamed bindings', () =>
49
+ runInDom(({ onMount }) => {
50
+ const a = useBinding(() => 0, { id: 'a' });
51
+
52
+ const bTransformer = jest.fn(() => a.get() + 1);
53
+
54
+ onMount(() => {
55
+ expect(makeTransientDerivedBinding([a], bTransformer, { id: 'a' }).get()).toBe(1);
56
+ expect(bTransformer).toHaveBeenCalledTimes(1);
57
+ });
58
+ }));
59
+
60
+ it('updates to dependencies should be propagated asynchronously', () =>
61
+ runInDom(({ onMount }) => {
62
+ const a = useBinding(() => 0, { id: 'a' });
63
+
64
+ const bTransformer = jest.fn(({ a }: { a: number }) => a + 1);
65
+
66
+ onMount(async () => {
67
+ expect(makeTransientDerivedBinding({ a }, bTransformer, { id: 'b' }).get()).toBe(1);
68
+
69
+ a.set(1);
70
+
71
+ expect(makeTransientDerivedBinding({ a }, bTransformer, { id: 'b' }).get()).toBe(2);
72
+ expect(bTransformer).toHaveBeenCalledTimes(2);
73
+ });
74
+ }));
75
+ });
@@ -0,0 +1,69 @@
1
+ import { jest } from '@jest/globals';
2
+
3
+ import { runInDom } from '../../../__test_dependency__';
4
+ import { useBinding } from '../../../binding/use-binding';
5
+ import { makeTransientDerivedBinding } from '../make-transient-derived-binding';
6
+
7
+ describe('makeTransientDerivedBinding', () => {
8
+ it('initial value should work with derivations of derivations', () =>
9
+ runInDom(({ onMount }) => {
10
+ const a = useBinding(() => 0, { id: 'a' });
11
+ const b = makeTransientDerivedBinding({ a }, ({ a }) => a + 1, { id: 'b' });
12
+ const c = makeTransientDerivedBinding({ b }, ({ b }) => b + 1, { id: 'c' });
13
+
14
+ const dTransformer = jest.fn(({ c }: { c: number }) => c + 1);
15
+ const d = makeTransientDerivedBinding({ c }, dTransformer, { id: 'd' });
16
+
17
+ onMount(() => {
18
+ expect(d.get()).toBe(3);
19
+ expect(dTransformer).toHaveBeenCalledTimes(1);
20
+ });
21
+ }));
22
+
23
+ it('updates to deepest dependency should be propagated immediately', () =>
24
+ runInDom(({ onMount }) => {
25
+ const a = useBinding(() => 0, { id: 'a' });
26
+ const b = makeTransientDerivedBinding({ a }, ({ a }) => a + 1, { id: 'b' });
27
+ const c = makeTransientDerivedBinding({ b }, ({ b }) => b + 1, { id: 'c' });
28
+
29
+ const dTransformer = jest.fn(({ c }: { c: number }) => c + 1);
30
+ const d = makeTransientDerivedBinding({ c }, dTransformer, { id: 'd' });
31
+
32
+ onMount(async () => {
33
+ expect(b.get()).toBe(1);
34
+ expect(c.get()).toBe(2);
35
+ expect(d.get()).toBe(3);
36
+
37
+ a.set(1);
38
+
39
+ expect(b.get()).toBe(2);
40
+ expect(c.get()).toBe(3);
41
+ expect(d.get()).toBe(4);
42
+ expect(dTransformer).toHaveBeenCalledTimes(2);
43
+ });
44
+ }));
45
+
46
+ it('multiple quick updates to deepest dependency should be propagated immediately', () =>
47
+ runInDom(({ onMount }) => {
48
+ const a = useBinding(() => 0, { id: 'a' });
49
+ const b = makeTransientDerivedBinding({ a }, ({ a }) => a + 1, { id: 'b' });
50
+ const c = makeTransientDerivedBinding({ b }, ({ b }) => b + 1, { id: 'c' });
51
+
52
+ const dTransformer = jest.fn(({ c }: { c: number }) => c + 1);
53
+ const d = makeTransientDerivedBinding({ c }, dTransformer, { id: 'd' });
54
+
55
+ onMount(async () => {
56
+ expect(b.get()).toBe(1);
57
+ expect(c.get()).toBe(2);
58
+ expect(d.get()).toBe(3);
59
+
60
+ a.set(1);
61
+ a.set(2);
62
+
63
+ expect(b.get()).toBe(3);
64
+ expect(c.get()).toBe(4);
65
+ expect(d.get()).toBe(5);
66
+ expect(dTransformer).toHaveBeenCalledTimes(2);
67
+ });
68
+ }));
69
+ });
@@ -0,0 +1,52 @@
1
+ import { jest } from '@jest/globals';
2
+
3
+ import { runInDom } from '../../../__test_dependency__';
4
+ import { useBinding } from '../../../binding/use-binding';
5
+ import { makeTransientDerivedBinding } from '../make-transient-derived-binding';
6
+
7
+ describe('makeTransientDerivedBinding', () => {
8
+ it('initial value should work with multiple dependencies', () =>
9
+ runInDom(({ onMount }) => {
10
+ const a = useBinding(() => 0, { id: 'a' });
11
+ const b = useBinding(() => 1, { id: 'b' });
12
+
13
+ const cTransformer = jest.fn(({ a, b }: { a: number; b: number }) => a + b + 1);
14
+ const c = makeTransientDerivedBinding({ a, b }, cTransformer, { id: 'c' });
15
+
16
+ onMount(() => {
17
+ expect(c.get()).toBe(2);
18
+ expect(cTransformer).toHaveBeenCalledTimes(1);
19
+ });
20
+ }));
21
+
22
+ it('updates to one dependency should be propagated immediately', () =>
23
+ runInDom(({ onMount }) => {
24
+ const a = useBinding(() => 0, { id: 'a' });
25
+ const b = useBinding(() => 1, { id: 'b' });
26
+
27
+ const cTransformer = jest.fn(({ a, b }: { a: number; b: number }) => a + b + 1);
28
+ const c = makeTransientDerivedBinding({ a, b }, cTransformer, { id: 'c' });
29
+
30
+ onMount(async () => {
31
+ a.set(2);
32
+ expect(c.get()).toBe(4);
33
+ expect(cTransformer).toHaveBeenCalledTimes(1);
34
+ });
35
+ }));
36
+
37
+ it('quick updates to multiple dependencies should be propagated immediately', () =>
38
+ runInDom(({ onMount }) => {
39
+ const a = useBinding(() => 0, { id: 'a' });
40
+ const b = useBinding(() => 1, { id: 'b' });
41
+
42
+ const cTransformer = jest.fn(({ a, b }: { a: number; b: number }) => a + b + 1);
43
+ const c = makeTransientDerivedBinding({ a, b }, cTransformer, { id: 'c' });
44
+
45
+ onMount(async () => {
46
+ a.set(2);
47
+ b.set(3);
48
+ expect(c.get()).toBe(6);
49
+ expect(cTransformer).toHaveBeenCalledTimes(1);
50
+ });
51
+ }));
52
+ });
@@ -0,0 +1,3 @@
1
+ export * from './make-transient-derived-binding';
2
+ export * from './types/exports';
3
+ export * from './use-transient-derived-binding';
@@ -0,0 +1,63 @@
1
+ import type { BindingArrayDependencies, BindingDependencies, NamedBindingDependencies } from '../../binding/types/binding-dependencies';
2
+ import type { ReadonlyBinding } from '../../binding/types/readonly-binding';
3
+ import { isBinding } from '../../binding-utils/type-utils';
4
+ import { getLogger } from '../../config/logging';
5
+ import { normalizeAsArray } from '../../internal-utils/array-like';
6
+ import { extractBindingDependencyValues } from '../../internal-utils/extract-binding-dependency-values';
7
+ import { getTypedKeys } from '../../internal-utils/get-typed-keys';
8
+ import { makeUID } from '../../internal-utils/uid';
9
+ import type { EmptyObject } from '../../types/empty';
10
+ import type { UseDerivedBindingTransformer } from '../derived-binding/use-derived-binding';
11
+ import type { MakeTransientDerivedBindingArgs } from './types/transient-derived-binding-args';
12
+
13
+ const emptyNamedBindings = Object.freeze({} as EmptyObject);
14
+
15
+ /**
16
+ * Similar to `useDerivedBinding` except that this binding doesn't persist any values internally. The derivative is computed each time the
17
+ * getter is accessed and listeners are immediately triggered any time any of the dependencies change.
18
+ *
19
+ * This is most useful for inline declarations of derivatives that would feel too-heavy to declare elsewhere.
20
+ */
21
+ export const makeTransientDerivedBinding = <GetT, DependenciesT extends BindingDependencies>(
22
+ bindings: DependenciesT | undefined,
23
+ transformer: UseDerivedBindingTransformer<GetT, DependenciesT>,
24
+ { id }: MakeTransientDerivedBindingArgs = {}
25
+ ): ReadonlyBinding<GetT> => {
26
+ const isNonNamedBindings = Array.isArray(bindings) || isBinding(bindings);
27
+ const nonNamedBindings = isNonNamedBindings ? (bindings as ReadonlyBinding | BindingArrayDependencies) : undefined;
28
+ const namedBindings = isNonNamedBindings ? undefined : (bindings as NamedBindingDependencies);
29
+ const namedBindingsKeys = namedBindings !== undefined ? getTypedKeys(namedBindings) : undefined;
30
+ const allBindings = isNonNamedBindings ? normalizeAsArray(nonNamedBindings) : Object.values(namedBindings ?? emptyNamedBindings);
31
+
32
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
33
+ const getDependencyValues = () => extractBindingDependencyValues<DependenciesT>({ bindings, namedBindingsKeys });
34
+
35
+ const uid = makeUID();
36
+
37
+ return {
38
+ isBinding: true,
39
+ id: id ?? uid,
40
+ uid,
41
+ addChangeListener: (listener) => {
42
+ const removers = allBindings.map((b) => b?.addChangeListener(listener));
43
+
44
+ let alreadyRemoved = false;
45
+ return () => {
46
+ if (alreadyRemoved) {
47
+ getLogger().debug?.(`A change listener for binding ${id ?? uid} was removed more than once`);
48
+ return;
49
+ }
50
+ alreadyRemoved = true;
51
+
52
+ for (const remover of removers) {
53
+ return remover?.();
54
+ }
55
+ };
56
+ },
57
+ get: () => transformer(getDependencyValues(), bindings ?? (undefined as any as DependenciesT)),
58
+ getChangeUid: () => allBindings.map((b) => b?.getChangeUid() ?? '').join('+'),
59
+ isModified: () => false,
60
+ isLocked: () => true,
61
+ lock: () => () => {}
62
+ };
63
+ };
@@ -0,0 +1 @@
1
+ export * from './transient-derived-binding-args';
@@ -0,0 +1,11 @@
1
+ import type { DependencyList } from 'react';
2
+
3
+ export interface MakeTransientDerivedBindingArgs {
4
+ /** A technical, but human-readable ID, which isn't guaranteed to be unique */
5
+ id?: string;
6
+ }
7
+
8
+ export interface UseTransientDerivedBindingArgs extends MakeTransientDerivedBindingArgs {
9
+ /** Hook dependencies */
10
+ deps?: DependencyList;
11
+ }
@@ -0,0 +1,25 @@
1
+ import type { DependencyList } from 'react';
2
+ import { useMemo } from 'react';
3
+
4
+ import type { BindingDependencies } from '../../binding/types/binding-dependencies';
5
+ import type { ReadonlyBinding } from '../../binding/types/readonly-binding';
6
+ import type { UseDerivedBindingTransformer } from '../derived-binding/use-derived-binding';
7
+ import { makeTransientDerivedBinding } from './make-transient-derived-binding';
8
+ import type { UseTransientDerivedBindingArgs } from './types/transient-derived-binding-args';
9
+
10
+ const emptyDeps: DependencyList = Object.freeze([]);
11
+
12
+ /**
13
+ * Similar to `useDerivedBinding` except that this binding doesn't persist any values internally. The derivative is computed each time the
14
+ * getter is accessed and listeners are immediately triggered any time any of the dependencies change.
15
+ *
16
+ * This is most useful for cases where bindings need to have up to date values even when unmounted (though this still wont be proactively
17
+ * triggered when unmounted).
18
+ */
19
+ export const useTransientDerivedBinding = <GetT, DependenciesT extends BindingDependencies>(
20
+ bindings: DependenciesT | undefined,
21
+ transformer: UseDerivedBindingTransformer<GetT, DependenciesT>,
22
+ args: UseTransientDerivedBindingArgs = {}
23
+ ): ReadonlyBinding<GetT> =>
24
+ // eslint-disable-next-line react-hooks/exhaustive-deps
25
+ useMemo(() => makeTransientDerivedBinding<GetT, DependenciesT>(bindings, transformer, args), args.deps ?? emptyDeps);
@@ -0,0 +1,27 @@
1
+ import { waitFor } from '@testing-library/react';
2
+
3
+ import { runInDom } from '../../__test_dependency__';
4
+ import { useBinding } from '../../binding/use-binding';
5
+ import { useBiDirBindingSync } from '../use-bi-dir-binding-sync';
6
+
7
+ describe('useBiDirBindingSync', () => {
8
+ it('should work', () =>
9
+ runInDom(({ onMount }) => {
10
+ const a = useBinding(() => 0, { id: 'a', detectChanges: true });
11
+ const b = useBinding(() => 1, { id: 'b', detectChanges: true });
12
+
13
+ useBiDirBindingSync(a, b);
14
+
15
+ onMount(async () => {
16
+ await waitFor(() => expect(b.get()).toBe(0));
17
+
18
+ b.set(2);
19
+
20
+ await waitFor(() => expect(a.get()).toBe(2));
21
+
22
+ a.set(3);
23
+
24
+ await waitFor(() => expect(b.get()).toBe(3));
25
+ });
26
+ }));
27
+ });
@@ -0,0 +1,23 @@
1
+ import { waitFor } from '@testing-library/react';
2
+
3
+ import { runInDom } from '../../__test_dependency__';
4
+ import { useBinding } from '../../binding/use-binding';
5
+ import { useUniDirBindingSync } from '../use-uni-dir-binding-sync';
6
+
7
+ describe('useUniDirBindingSync', () => {
8
+ it('should work', () =>
9
+ runInDom(({ onMount }) => {
10
+ const dest = useBinding(() => 0, { id: 'dest', detectChanges: true });
11
+ const source = useBinding(() => 1, { id: 'source', detectChanges: true });
12
+
13
+ useUniDirBindingSync(source, dest);
14
+
15
+ onMount(async () => {
16
+ await waitFor(() => expect(dest.get()).toBe(1));
17
+
18
+ source.set(2);
19
+
20
+ await waitFor(() => expect(dest.get()).toBe(2));
21
+ });
22
+ }));
23
+ });
@@ -0,0 +1,3 @@
1
+ export * from './types/exports';
2
+ export * from './use-bi-dir-binding-sync';
3
+ export * from './use-uni-dir-binding-sync';
@@ -0,0 +1 @@
1
+ export * from './options';
@@ -0,0 +1,15 @@
1
+ import type { DependencyList } from 'react';
2
+
3
+ import type { LimiterOptions } from '../../limiter/types/LimiterOptions';
4
+
5
+ export interface UseBindingSyncOptions 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
+ }
@@ -0,0 +1,14 @@
1
+ import type { Binding } from '../binding/types/binding';
2
+ import { useBindingEffect } from '../use-binding-effect/use-binding-effect';
3
+ import type { UseBindingSyncOptions } from './types/options';
4
+
5
+ /**
6
+ * Synchronizes two bindings bidirectionally so that any change in one will also affect the other.
7
+ *
8
+ * It's the responsibility of the bindings themselves to make sure this doesn't result in an infinite update. For example, the bindings
9
+ * could be configured to use `detectChanges: true`, so that trivial changes doesn't result in triggers.
10
+ */
11
+ export const useBiDirBindingSync = <T>(a: Binding<T>, b: Binding<T>, options?: UseBindingSyncOptions) => {
12
+ useBindingEffect(a, (a) => b.set(a), { ...options, triggerOnMount: true });
13
+ useBindingEffect(b, (b) => a.set(b), { ...options, triggerOnMount: true });
14
+ };
@@ -0,0 +1,9 @@
1
+ import type { Binding } from '../binding/types/binding';
2
+ import type { ReadonlyBinding } from '../binding/types/readonly-binding';
3
+ import { useBindingEffect } from '../use-binding-effect/use-binding-effect';
4
+ import type { UseBindingSyncOptions } from './types/options';
5
+
6
+ /** Synchronizes a source binding into a destination binding */
7
+ export const useUniDirBindingSync = <T>(source: ReadonlyBinding<T>, dest: Binding<T>, options?: UseBindingSyncOptions) => {
8
+ useBindingEffect(source, (source) => dest.set(source), { ...options, triggerOnMount: true });
9
+ };
@@ -0,0 +1,2 @@
1
+ /** A single instance or an array of instances */
2
+ export type SingleOrArray<T> = T | T[];
@@ -0,0 +1,2 @@
1
+ /** An empty object */
2
+ export type EmptyObject = Record<string, never>;