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,111 @@
1
+ import { jest } from '@jest/globals';
2
+
3
+ import { BindingImpl } from '../binding-impl';
4
+
5
+ describe('BindingImpl', () => {
6
+ describe('with default settings', () => {
7
+ const changeListener = jest.fn();
8
+
9
+ beforeEach(() => {
10
+ changeListener.mockReset();
11
+ });
12
+
13
+ it('setting locked should do nothing until unlocked, after which it should update value', () => {
14
+ const b = new BindingImpl(() => 0, { id: 'test' });
15
+ b.addChangeListener(changeListener);
16
+
17
+ const unlock = b.lock();
18
+ b.set(1);
19
+ expect(changeListener).not.toHaveBeenCalled();
20
+ expect(b.isModified()).toBeFalsy();
21
+ expect(b.get()).toEqual(0);
22
+ unlock();
23
+ expect(changeListener).toHaveBeenCalledTimes(1);
24
+ expect(b.isModified()).toBeTruthy();
25
+ expect(b.get()).toEqual(1);
26
+ });
27
+
28
+ it('setting locked twice should do nothing until unlocked, after which it should update with the most recent value', () => {
29
+ const b = new BindingImpl(() => 0, { id: 'test' });
30
+ b.addChangeListener(changeListener);
31
+
32
+ const unlock = b.lock();
33
+ b.set(1);
34
+ expect(changeListener).not.toHaveBeenCalled();
35
+ expect(b.isModified()).toBeFalsy();
36
+ expect(b.get()).toEqual(0);
37
+ b.set(2);
38
+ expect(changeListener).not.toHaveBeenCalled();
39
+ expect(b.isModified()).toBeFalsy();
40
+ expect(b.get()).toEqual(0);
41
+ unlock();
42
+ expect(changeListener).toHaveBeenCalledTimes(1);
43
+ expect(b.isModified()).toBeTruthy();
44
+ expect(b.get()).toEqual(2);
45
+ });
46
+
47
+ it('setting locked then resetting should do nothing until unlocked, after which it should reset', () => {
48
+ const b = new BindingImpl(() => 0, { id: 'test' });
49
+ b.addChangeListener(changeListener);
50
+
51
+ b.set(1);
52
+ expect(changeListener).toHaveBeenCalledTimes(1);
53
+ expect(b.isModified()).toBeTruthy();
54
+ expect(b.get()).toEqual(1);
55
+
56
+ const unlock = b.lock();
57
+ b.set(2);
58
+ expect(changeListener).toHaveBeenCalledTimes(1);
59
+ b.reset();
60
+ expect(changeListener).toHaveBeenCalledTimes(1);
61
+ expect(b.get()).toEqual(1);
62
+ unlock();
63
+ expect(changeListener).toHaveBeenCalledTimes(2);
64
+ expect(b.isModified()).toBeFalsy();
65
+ expect(b.get()).toEqual(0);
66
+ });
67
+
68
+ it('setting locked then resetting then setting again should do nothing until unlocked, after which it should reset and then update the most recent value', () => {
69
+ const b = new BindingImpl(() => 0, { id: 'test' });
70
+ b.addChangeListener(changeListener);
71
+
72
+ b.set(1);
73
+ expect(changeListener).toHaveBeenCalledTimes(1);
74
+ expect(b.isModified()).toBeTruthy();
75
+ expect(b.get()).toEqual(1);
76
+
77
+ const unlock = b.lock();
78
+ b.set(2);
79
+ expect(changeListener).toHaveBeenCalledTimes(1);
80
+ b.reset();
81
+ expect(changeListener).toHaveBeenCalledTimes(1);
82
+ b.set(3);
83
+ expect(changeListener).toHaveBeenCalledTimes(1);
84
+ expect(b.get()).toEqual(1);
85
+ unlock();
86
+ expect(changeListener).toHaveBeenCalledTimes(3);
87
+ expect(b.isModified()).toBeTruthy();
88
+ expect(b.get()).toEqual(3);
89
+ });
90
+
91
+ it('unlocking the same lock twice should work', () => {
92
+ const b = new BindingImpl(() => 0, { id: 'test' });
93
+ b.addChangeListener(changeListener);
94
+
95
+ b.set(1);
96
+ expect(changeListener).toHaveBeenCalledTimes(1);
97
+ expect(b.isModified()).toBeTruthy();
98
+ expect(b.get()).toEqual(1);
99
+
100
+ const unlock = b.lock();
101
+ b.set(2);
102
+ expect(changeListener).toHaveBeenCalledTimes(1);
103
+ expect(b.get()).toEqual(1);
104
+ unlock();
105
+ unlock();
106
+ expect(changeListener).toHaveBeenCalledTimes(2);
107
+ expect(b.isModified()).toBeTruthy();
108
+ expect(b.get()).toEqual(2);
109
+ });
110
+ });
111
+ });
@@ -0,0 +1,48 @@
1
+ import { jest } from '@jest/globals';
2
+
3
+ import { BindingImpl } from '../binding-impl';
4
+
5
+ describe('BindingImpl', () => {
6
+ describe('with set value transformer', () => {
7
+ const changeListener = jest.fn();
8
+
9
+ beforeEach(() => {
10
+ changeListener.mockReset();
11
+ });
12
+
13
+ it('getting after setting a new value should return the transformed new value', () => {
14
+ const b = new BindingImpl(() => 'hello', { id: 'test', setValueTransformer: (v) => v.toLocaleLowerCase() });
15
+ b.addChangeListener(changeListener);
16
+
17
+ b.set('WORLD');
18
+ expect(b.isModified()).toBeTruthy();
19
+ expect(changeListener).toHaveBeenCalledTimes(1);
20
+ expect(b.get()).toEqual('world');
21
+ });
22
+
23
+ it('getting after setting a new value using setRaw should return the unmodified new value', () => {
24
+ const b = new BindingImpl(() => 'hello', { id: 'test', setValueTransformer: (v) => v.toLocaleLowerCase() });
25
+ b.addChangeListener(changeListener);
26
+
27
+ b.setRaw('WORLD');
28
+ expect(b.isModified()).toBeFalsy();
29
+ expect(changeListener).toHaveBeenCalledTimes(1);
30
+ expect(b.get()).toEqual('WORLD');
31
+ });
32
+
33
+ it('setting locked using setRaw should do nothing until unlocked, after which it should update value without transformation', () => {
34
+ const b = new BindingImpl(() => 'hello', { id: 'test', setValueTransformer: (v) => v.toLocaleLowerCase() });
35
+ b.addChangeListener(changeListener);
36
+
37
+ const unlock = b.lock();
38
+ b.setRaw('WORLD');
39
+ expect(changeListener).not.toHaveBeenCalled();
40
+ expect(b.isModified()).toBeFalsy();
41
+ expect(b.get()).toEqual('hello');
42
+ unlock();
43
+ expect(changeListener).toHaveBeenCalledTimes(1);
44
+ expect(b.isModified()).toBeFalsy();
45
+ expect(b.get()).toEqual('WORLD');
46
+ });
47
+ });
48
+ });
@@ -0,0 +1,253 @@
1
+ import { areEqual as globalAreEqual } from '../../config/are-equal';
2
+ import { getLogger, isSpecialLoggingEnabledFor } from '../../config/logging';
3
+ import { getStatsHandler } from '../../config/stats-handler';
4
+ import { makeUID } from '../../internal-utils/uid';
5
+ import type { Binding } from '../types/binding';
6
+ import type { BindingConstructorArgs } from '../types/binding-args';
7
+ import type { BindingInitializer } from '../types/binding-initializer';
8
+ import type { ChangeListener } from '../types/change-listener';
9
+ import type { SetValueTransformer } from '../types/set-value-transformer';
10
+ import { LOCK_DURATION_WARNING_INTERVAL_MSEC } from './consts';
11
+ import type { DoubleLinkedListNode } from './DoubleLinkedList';
12
+ import { DoubleLinkedList } from './DoubleLinkedList';
13
+
14
+ /** A pending update on a binding */
15
+ type PendingUpdate<GetType = any> =
16
+ | { type: 'set-raw'; value: GetType }
17
+ | { type: 'set'; value: GetType }
18
+ | { type: 'reset'; value?: undefined };
19
+
20
+ /** The standard implementation of a read-write binding */
21
+ export class BindingImpl<GetType = any> implements Binding<GetType> {
22
+ // Public Fields
23
+
24
+ public readonly isBinding = true;
25
+ public readonly id: string;
26
+ public readonly uid = makeUID();
27
+
28
+ public readonly setValueTransformer: SetValueTransformer<GetType> | undefined;
29
+
30
+ // Private Fields
31
+
32
+ /** The stored value of the binding */
33
+ private value_: GetType;
34
+
35
+ /** An ID updated every time the value is changed. This value is unique to this runtime. */
36
+ private changeUid_ = this.uid; // Using the binding's uid as the initial change ID for convenience
37
+ /** Registered change listeners */
38
+ private onChangeListeners_?: DoubleLinkedList<ChangeListener>;
39
+
40
+ /**
41
+ * A flag indicating whether or not this binding was modified. This is initially `false` when the binding is created and set to `true`
42
+ * when `set` is called (even if the underlying value doesn't actually change).
43
+ *
44
+ * This can also be set manually using `setIsModified`.
45
+ */
46
+ private isModified_ = false;
47
+
48
+ /** This binding is considered to be locked if `> 0` */
49
+ private lockedCount_ = 0;
50
+ /**
51
+ * We keep track of the most-recent mutating call made while this binding is locked. When it becomes unlocked, we apply the requested
52
+ * change.
53
+ */
54
+ private pending_: PendingUpdate<GetType> | undefined = undefined;
55
+ /**
56
+ * In addition to tracking the most-recent mutating call made while this binding is locked, we also track if any of those mutating calls
57
+ * were resets. If they were, when this binding becomes unlocked, we first reset and then apply the pending update.
58
+ */
59
+ private hasPendingReset_ = false;
60
+
61
+ /** The value equality checker function */
62
+ private areEqual_?: (a: GetType, b: GetType) => boolean;
63
+ /** If `true`, `areEqual_` (or the default) is used to determine if the value has changed */
64
+ private detectChanges_: boolean;
65
+
66
+ /** The initializer function, which can be used to reset the binding */
67
+ private initializer_: BindingInitializer<GetType>;
68
+
69
+ /**
70
+ * @param initializer - A function called to initialize this binding's value, which can also be called to reset its value.
71
+ * @param args - Additional arguments for configuring this binding.
72
+ */
73
+ constructor(initializer: BindingInitializer<GetType>, args: BindingConstructorArgs<GetType>) {
74
+ const theInitialValue = initializer(false);
75
+
76
+ this.id = args.id;
77
+ this.value_ = theInitialValue;
78
+
79
+ this.setValueTransformer = args.setValueTransformer;
80
+
81
+ this.initializer_ = initializer;
82
+
83
+ this.areEqual_ = args.areEqual;
84
+ this.detectChanges_ = args.detectChanges ?? false;
85
+ }
86
+
87
+ // Getters
88
+
89
+ public readonly get = () => this.value_;
90
+
91
+ public readonly getChangeUid = () => this.changeUid_;
92
+
93
+ // Setters
94
+
95
+ public readonly reset = () => {
96
+ if (this.lockedCount_ > 0) {
97
+ getLogger().debug?.(
98
+ `Attempted to change locked binding ${this.id}. The most recently set value will be restored once this binding is unlocked`
99
+ );
100
+ this.pending_ = { type: 'reset' };
101
+ this.hasPendingReset_ = true;
102
+
103
+ return;
104
+ }
105
+
106
+ this.setRaw(this.initializer_(true));
107
+ this.setIsModified(false);
108
+ };
109
+
110
+ public readonly setRaw = (newValue: GetType) => {
111
+ if (this.lockedCount_ > 0) {
112
+ getLogger().debug?.(
113
+ `Attempted to change locked binding ${this.id}. The most recently set value will be restored once this binding is unlocked`
114
+ );
115
+ this.pending_ = { type: 'set-raw', value: newValue };
116
+ return;
117
+ }
118
+
119
+ if (this.detectChanges_) {
120
+ const shouldChangeValue = !(this.areEqual_ ?? globalAreEqual)(this.value_, newValue);
121
+ if (!shouldChangeValue) {
122
+ return; // No change
123
+ }
124
+ }
125
+
126
+ const startMSec = performance.now();
127
+
128
+ this.value_ = newValue;
129
+ this.changeUid_ = makeUID();
130
+
131
+ const numListeners = this.triggerChangeListeners();
132
+
133
+ getStatsHandler().trackBindingDidSetRaw?.({
134
+ binding: this,
135
+ durationMSec: performance.now() - startMSec,
136
+ numListeners
137
+ });
138
+ };
139
+
140
+ public readonly set = (newValue: GetType) => {
141
+ if (this.lockedCount_ > 0) {
142
+ getLogger().debug?.(
143
+ `Attempted to change locked binding ${this.id}. The most recently set value will be restored once this binding is unlocked`
144
+ );
145
+ this.pending_ = { type: 'set', value: newValue };
146
+ return;
147
+ }
148
+
149
+ this.isModified_ = true;
150
+ this.setRaw(this.setValueTransformer !== undefined ? this.setValueTransformer(newValue, this) : newValue);
151
+ };
152
+
153
+ // Modified
154
+
155
+ public readonly isModified = () => this.isModified_;
156
+
157
+ public readonly setIsModified = (newIsModified: boolean) => {
158
+ this.isModified_ = newIsModified;
159
+ };
160
+
161
+ // Locked
162
+
163
+ public readonly isLocked = () => this.lockedCount_ > 0;
164
+
165
+ public readonly lock = () => {
166
+ this.lockedCount_ += 1;
167
+
168
+ const shouldLogBindingLockDurationWarnings = isSpecialLoggingEnabledFor('binding-lock-duration-warnings');
169
+ const warningTimeout: ReturnType<typeof setTimeout> | undefined = shouldLogBindingLockDurationWarnings
170
+ ? setTimeout(() => {
171
+ getLogger().debug?.(
172
+ `A lock for binding ${this.id} wasn't released after more than ${LOCK_DURATION_WARNING_INTERVAL_MSEC / 1000} seconds`
173
+ );
174
+ }, LOCK_DURATION_WARNING_INTERVAL_MSEC)
175
+ : undefined;
176
+
177
+ let wasUnlocked = false;
178
+ return () => {
179
+ if (wasUnlocked) {
180
+ getLogger().debug?.(`A lock for binding ${this.id} was released more than once`);
181
+ return;
182
+ }
183
+ wasUnlocked = true;
184
+
185
+ if (warningTimeout !== undefined) {
186
+ clearTimeout(warningTimeout);
187
+ }
188
+
189
+ this.lockedCount_ -= 1;
190
+
191
+ // Restoring any pending values that were set while locked (mostly for bindings with memories)
192
+ if (this.lockedCount_ === 0 && this.pending_ !== undefined) {
193
+ const hasPendingReset = this.hasPendingReset_;
194
+ this.hasPendingReset_ = false;
195
+
196
+ const pending = this.pending_;
197
+ this.pending_ = undefined;
198
+
199
+ if (hasPendingReset) {
200
+ this.reset();
201
+ }
202
+
203
+ switch (pending.type) {
204
+ case 'set':
205
+ this.set(pending.value);
206
+ break;
207
+ case 'set-raw':
208
+ this.setRaw(pending.value);
209
+ break;
210
+ case 'reset':
211
+ // Nothing to do here, handled above
212
+ break;
213
+ }
214
+ }
215
+ };
216
+ };
217
+
218
+ // Change Listener
219
+
220
+ public readonly addChangeListener = (listener: ChangeListener) => {
221
+ getStatsHandler().trackBindingDidAddChangeListener?.({ binding: this });
222
+
223
+ if (this.onChangeListeners_ === undefined) {
224
+ this.onChangeListeners_ = new DoubleLinkedList<ChangeListener>();
225
+ }
226
+ let newNode: Readonly<DoubleLinkedListNode<ChangeListener>> | undefined = this.onChangeListeners_.append(listener);
227
+
228
+ // Returning function that can be used to remove the same change listener;
229
+ return () => {
230
+ if (newNode === undefined) {
231
+ getLogger().debug?.(`A change listener for binding ${this.id} was removed more than once`);
232
+ return;
233
+ }
234
+
235
+ getStatsHandler().trackBindingDidRemoveChangeListener?.({ binding: this });
236
+ this.onChangeListeners_!.remove(newNode);
237
+ newNode = undefined;
238
+ };
239
+ };
240
+
241
+ public readonly triggerChangeListeners = () => {
242
+ if (this.onChangeListeners_ === undefined) {
243
+ return 0;
244
+ }
245
+
246
+ const listeners = this.onChangeListeners_.toArray();
247
+ for (const listener of listeners) {
248
+ listener();
249
+ }
250
+
251
+ return listeners?.length;
252
+ };
253
+ }
@@ -0,0 +1,2 @@
1
+ /** The duration after which a warning will be logged if a lock hasn't been released */
2
+ export const LOCK_DURATION_WARNING_INTERVAL_MSEC = 10 * 1000; // 10 seconds
@@ -0,0 +1,26 @@
1
+ import { getStatsHandler } from '../config/stats-handler';
2
+ import { getTypedKeys } from '../internal-utils/get-typed-keys';
3
+ import type { EmptyObject } from '../types/empty';
4
+ import { BindingImpl } from './internal/binding-impl';
5
+ import type { Binding } from './types/binding';
6
+ import type { MakeBindingArgs } from './types/binding-args';
7
+ import type { BindingInitializer } from './types/binding-initializer';
8
+
9
+ /** Makes a binding without using any React contexts. */
10
+ export const makeBinding = <GetType = any, ExtraFieldsT extends object = EmptyObject>(
11
+ initialValue: BindingInitializer<GetType>,
12
+ args: MakeBindingArgs<GetType, ExtraFieldsT>
13
+ ): Binding<GetType> & ExtraFieldsT => {
14
+ const output = new BindingImpl<GetType>(initialValue, args) as unknown as Binding<GetType> & ExtraFieldsT;
15
+ const extraFields = args.addFields?.(output);
16
+ if (extraFields !== undefined) {
17
+ for (const key of getTypedKeys(extraFields)) {
18
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
19
+ output[key] = extraFields[key] as any;
20
+ }
21
+ }
22
+
23
+ getStatsHandler().trackDidMakeBinding?.({ binding: output });
24
+
25
+ return output;
26
+ };
@@ -0,0 +1,49 @@
1
+ import type { DependencyList } from 'react';
2
+
3
+ import type { EmptyObject } from '../../types/empty';
4
+ import type { Binding } from './binding';
5
+ import type { SetValueTransformer } from './set-value-transformer';
6
+
7
+ /** Post-initializer arguments used to configure bindings */
8
+ export interface BindingConstructorArgs<GetType = any> {
9
+ /** A technical, but human-readable ID, which isn't guaranteed to be unique */
10
+ id: string;
11
+
12
+ /**
13
+ * A transformer function called prior to storing the value when using the `set` method
14
+ *
15
+ * @param newValue - The proposed new value
16
+ * @param thisBinding - The binding being updated
17
+ *
18
+ * @returns The transformed value to set the binding to
19
+ */
20
+ setValueTransformer?: SetValueTransformer<GetType>;
21
+
22
+ /**
23
+ * If specified, overrides the function used to compare values
24
+ *
25
+ * @defaultValue `_.isEqual`, which can be globally overridden using `setAreEqual`
26
+ */
27
+ areEqual?: (a: GetType, b: GetType) => boolean;
28
+ /**
29
+ * - If `true` – `areEqual` is used to compare the old and new values when `set`/`setRaw` are called. If the values are equal, the
30
+ * binding value won't be changed. If they're unequal, the binding value will be changed and listeners will be notified.
31
+ * - If `false` – old and new values aren't compared when `set`/`setRaw` are called. The binding will always be changed and listeners
32
+ * will always be notified.
33
+ *
34
+ * @defaultValue `false`
35
+ */
36
+ detectChanges?: boolean;
37
+ }
38
+
39
+ /** The post-initializer arguments that are passed to `makeBinding` */
40
+ export interface MakeBindingArgs<GetType = any, ExtraFieldsT extends object = EmptyObject> extends BindingConstructorArgs<GetType> {
41
+ /** Use to support injecting additional fields into bindings */
42
+ addFields?: (thisBinding: Binding<GetType>) => ExtraFieldsT;
43
+ }
44
+
45
+ /** The post-initializer arguments that are passed to `useBinding` */
46
+ export interface UseBindingArgs<GetType = any, ExtraFieldsT extends object = EmptyObject> extends MakeBindingArgs<GetType, ExtraFieldsT> {
47
+ /** Hook dependencies */
48
+ deps?: DependencyList;
49
+ }
@@ -0,0 +1,7 @@
1
+ import type { ReadonlyBinding } from './readonly-binding';
2
+
3
+ export type BindingArrayDependencies = Array<ReadonlyBinding | undefined>;
4
+
5
+ export type NamedBindingDependencies = Record<string, ReadonlyBinding | undefined>;
6
+
7
+ export type BindingDependencies = ReadonlyBinding | BindingArrayDependencies | NamedBindingDependencies | undefined;
@@ -0,0 +1,2 @@
1
+ /** A function called to initialize a binding's value, which can also be called to reset its value. */
2
+ export type BindingInitializer<GetType> = (isReset: boolean) => GetType;
@@ -0,0 +1,25 @@
1
+ import type { ReadonlyBinding } from './readonly-binding';
2
+ import type { SetValueTransformer } from './set-value-transformer';
3
+
4
+ /**
5
+ * A binding is a stored piece of data that notifies registered listeners when changed.
6
+ *
7
+ * @see `useBinding`
8
+ */
9
+ export interface Binding<GetType = any> extends ReadonlyBinding<GetType> {
10
+ /** Resets the binding back to its initial value and marks the binding as non-modified. */
11
+ readonly reset: () => void;
12
+ /** Sets the value, using the result of `setValueTransformer` if set, and then marks the binding as modified. */
13
+ readonly set: (newValue: GetType) => void;
14
+ /** Sets the internal value without transforming or marking as changed. Don't normally use this! */
15
+ readonly setRaw: (newValue: GetType) => void;
16
+
17
+ /** Sets the binding as having been modified or not */
18
+ readonly setIsModified: (isModified: boolean) => void;
19
+
20
+ /** If set, a function to transform the value before it's stored */
21
+ readonly setValueTransformer?: SetValueTransformer<GetType>;
22
+
23
+ /** Forcibly triggers the change listeners. Don't normally use this! */
24
+ readonly triggerChangeListeners: () => void;
25
+ }
@@ -0,0 +1,5 @@
1
+ /** Called when a change is made */
2
+ export type ChangeListener = () => void;
3
+
4
+ /** Call to remove a change listener */
5
+ export type ChangeListenerRemover = () => void;
@@ -0,0 +1,11 @@
1
+ export * from './binding';
2
+ export * from './binding-args';
3
+ export * from './binding-dependencies';
4
+ export * from './binding-initializer';
5
+ export * from './change-listener';
6
+ export * from './infer-binding-value-types';
7
+ export * from './infer-bindings-array-value-types';
8
+ export * from './infer-named-binding-value-types';
9
+ export * from './inference';
10
+ export * from './readonly-binding';
11
+ export * from './set-value-transformer';
@@ -0,0 +1,14 @@
1
+ import type { BindingArrayDependencies, BindingDependencies, NamedBindingDependencies } from './binding-dependencies';
2
+ import type { InferBindingsArrayValueTypes } from './infer-bindings-array-value-types';
3
+ import type { InferNamedBindingsValueTypes } from './infer-named-binding-value-types';
4
+ import type { InferBindingGetType } from './inference';
5
+ import type { ReadonlyBinding } from './readonly-binding';
6
+
7
+ /** Infers the values of either a single binding, bindings in an array or tuple, or a record with binding values */
8
+ export type InferBindingValueTypes<DependenciesT extends BindingDependencies> = DependenciesT extends ReadonlyBinding
9
+ ? InferBindingGetType<DependenciesT>
10
+ : DependenciesT extends NamedBindingDependencies
11
+ ? InferNamedBindingsValueTypes<DependenciesT>
12
+ : DependenciesT extends BindingArrayDependencies
13
+ ? InferBindingsArrayValueTypes<DependenciesT>
14
+ : Record<string, never>;
@@ -0,0 +1,12 @@
1
+ import type { BindingArrayDependencies } from './binding-dependencies';
2
+ import type { InferBindingGetType } from './inference';
3
+ import type { ReadonlyBinding } from './readonly-binding';
4
+
5
+ /** Infers the value types from bindings arrays */
6
+ export type InferBindingsArrayValueTypes<BindingsArrayT extends BindingArrayDependencies> = {
7
+ [KeyT in keyof BindingsArrayT]: BindingsArrayT[KeyT] extends ReadonlyBinding
8
+ ? InferBindingGetType<BindingsArrayT[KeyT]>
9
+ : BindingsArrayT[KeyT] extends ReadonlyBinding | undefined
10
+ ? InferBindingGetType<BindingsArrayT[KeyT]> | undefined
11
+ : BindingsArrayT[KeyT];
12
+ };
@@ -0,0 +1,12 @@
1
+ import type { NamedBindingDependencies } from './binding-dependencies';
2
+ import type { InferBindingGetType } from './inference';
3
+ import type { ReadonlyBinding } from './readonly-binding';
4
+
5
+ /** Infers the value types from named bindings */
6
+ export type InferNamedBindingsValueTypes<NamedBindingsT extends NamedBindingDependencies> = {
7
+ [KeyT in keyof NamedBindingsT]: NamedBindingsT[KeyT] extends ReadonlyBinding
8
+ ? InferBindingGetType<NamedBindingsT[KeyT]>
9
+ : NamedBindingsT[KeyT] extends ReadonlyBinding | undefined
10
+ ? InferBindingGetType<NamedBindingsT[KeyT]> | undefined
11
+ : NamedBindingsT[KeyT];
12
+ };
@@ -0,0 +1,4 @@
1
+ import type { ReadonlyBinding } from './readonly-binding';
2
+
3
+ /** Infers the stored value type from a binding type */
4
+ export type InferBindingGetType<BindingT> = BindingT extends ReadonlyBinding<infer GetType> ? GetType : never;
@@ -0,0 +1,39 @@
1
+ import type { ChangeListener, ChangeListenerRemover } from './change-listener';
2
+
3
+ /** The readonly interface for bindings */
4
+ export interface ReadonlyBinding<GetType = any> {
5
+ /** A marker indicating that this is a binding type */
6
+ readonly isBinding: true;
7
+
8
+ /** A technical, but human-readable ID, which isn't guaranteed to be unique */
9
+ readonly id: string;
10
+ /** An ID that's unique to this runtime */
11
+ readonly uid: string;
12
+
13
+ /**
14
+ * Adds a listener that will be called when this binding changes.
15
+ *
16
+ * @see `useBindingEffect` and `BindingsConsumer`
17
+ *
18
+ * @returns a function that may be used to remove the added listener.
19
+ */
20
+ readonly addChangeListener: (listener: ChangeListener) => ChangeListenerRemover;
21
+
22
+ /** @returns the value */
23
+ readonly get: () => GetType;
24
+ /** Every time the value is changed, the change uid is updated */
25
+ readonly getChangeUid: () => string;
26
+ /** @returns `true` if this binding has been marked as being modified */
27
+ readonly isModified: () => boolean;
28
+
29
+ /** @returns `true` if the binding is locked */
30
+ readonly isLocked: () => boolean;
31
+ /**
32
+ * Increments the lock count and returns a method to decrement it. A binding is locked if its lock
33
+ * count is `> 0`. When a binding is locked, mutating calls (`reset`/`set`/`setRaw`) won't have an immediate effect. However, if a
34
+ * mutating call is made on a locked binding, the change will be applied once the binding becomes unlocked.
35
+ *
36
+ * @returns a function for decrementing this binding's lock count.
37
+ */
38
+ readonly lock: () => () => void;
39
+ }
@@ -0,0 +1,11 @@
1
+ import type { ReadonlyBinding } from './readonly-binding';
2
+
3
+ /**
4
+ * A transformer function called prior to storing the value when using the `set` method
5
+ *
6
+ * @param newValue - The proposed new value
7
+ * @param thisBinding - The binding being updated
8
+ *
9
+ * @returns The transformed value to set the binding to
10
+ */
11
+ export type SetValueTransformer<GetType> = (newValue: GetType, thisBinding: ReadonlyBinding<GetType>) => GetType;
@@ -0,0 +1,17 @@
1
+ import type { DependencyList } from 'react';
2
+ import { useMemo } from 'react';
3
+
4
+ import type { EmptyObject } from '../types/empty';
5
+ import { makeBinding } from './make-binding';
6
+ import type { Binding } from './types/binding';
7
+ import type { UseBindingArgs } from './types/binding-args';
8
+ import type { BindingInitializer } from './types/binding-initializer';
9
+
10
+ const emptyDeps: DependencyList = Object.freeze([]);
11
+
12
+ /** Makes a binding memo'd using the specified dependencies */
13
+ export const useBinding = <GetType = any, ExtraFieldsT extends object = EmptyObject>(
14
+ initialValue: BindingInitializer<GetType>,
15
+ args: UseBindingArgs<GetType, ExtraFieldsT>
16
+ ): // eslint-disable-next-line react-hooks/exhaustive-deps
17
+ Binding<GetType> & ExtraFieldsT => useMemo(() => makeBinding<GetType, ExtraFieldsT>(initialValue, args), args.deps ?? emptyDeps);