@synnaxlabs/x 0.16.1 → 0.24.0

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 (516) hide show
  1. package/.turbo/turbo-build.log +99 -7
  2. package/.vscode/settings.json +5 -1
  3. package/dist/base-B48bPNx5.cjs +1 -0
  4. package/dist/base-DnZzEvvz.js +38 -0
  5. package/dist/binary.cjs +3 -0
  6. package/dist/binary.js +100 -0
  7. package/dist/bounds-Bh_QBZZK.cjs +1 -0
  8. package/dist/bounds-Dmn-hd_-.js +129 -0
  9. package/dist/bounds.cjs +1 -0
  10. package/dist/bounds.js +4 -0
  11. package/dist/box-C92jYSNY.js +205 -0
  12. package/dist/box-m3dlc1kR.cjs +1 -0
  13. package/dist/box.cjs +1 -0
  14. package/dist/box.js +4 -0
  15. package/dist/caseconv.cjs +1 -0
  16. package/dist/caseconv.js +4 -0
  17. package/dist/change-C-YELKx6.cjs +1 -0
  18. package/dist/change-DLl6DccR.js +12 -0
  19. package/dist/change.cjs +1 -0
  20. package/dist/change.js +4 -0
  21. package/dist/compare.cjs +1 -0
  22. package/dist/compare.js +4 -0
  23. package/dist/debounce.cjs +1 -0
  24. package/dist/debounce.js +17 -0
  25. package/dist/deep.cjs +1 -0
  26. package/dist/deep.js +121 -0
  27. package/dist/destructor.cjs +1 -0
  28. package/dist/destructor.js +1 -0
  29. package/dist/dimensions-BAuHfd-b.js +44 -0
  30. package/dist/dimensions-zMcb9pMk.cjs +1 -0
  31. package/dist/dimensions.cjs +1 -0
  32. package/dist/dimensions.js +4 -0
  33. package/dist/direction-CScbfCdT.js +16 -0
  34. package/dist/direction-DZbN47uL.cjs +1 -0
  35. package/dist/direction.cjs +1 -0
  36. package/dist/direction.js +4 -0
  37. package/dist/external-B-DoBvh7.cjs +1 -0
  38. package/dist/external-DI9122wF.js +27 -0
  39. package/dist/identity.cjs +1 -0
  40. package/dist/identity.js +4 -0
  41. package/dist/index-BpCPHf78.cjs +1 -0
  42. package/dist/index-Bt5ivtN9.js +95 -0
  43. package/dist/index-BwkQTA-j.js +360 -0
  44. package/dist/index-CuG8fceO.cjs +1 -0
  45. package/dist/index.cjs +3 -0
  46. package/dist/index.js +178 -0
  47. package/dist/kv.cjs +1 -0
  48. package/dist/kv.js +6 -0
  49. package/dist/location-CfP9TAnW.js +94 -0
  50. package/dist/location-c3g6WKs-.cjs +1 -0
  51. package/dist/location.cjs +1 -0
  52. package/dist/location.js +4 -0
  53. package/dist/observe.cjs +1 -0
  54. package/dist/observe.js +43 -0
  55. package/dist/path-BO4pyGZf.cjs +1 -0
  56. package/dist/path-nTHmt_4i.js +65 -0
  57. package/dist/position-BBnkwGX1.cjs +1 -0
  58. package/dist/position-B_aphAR0.js +87 -0
  59. package/dist/position.cjs +1 -0
  60. package/dist/position.js +4 -0
  61. package/dist/record.cjs +1 -0
  62. package/dist/record.js +9 -0
  63. package/dist/runtime.cjs +1 -0
  64. package/dist/runtime.js +4 -0
  65. package/dist/scale-C8axypQ2.cjs +1 -0
  66. package/dist/scale-CgtgqlYU.js +205 -0
  67. package/dist/scale.cjs +1 -0
  68. package/dist/scale.js +4 -0
  69. package/dist/search.cjs +1 -0
  70. package/dist/search.js +15 -0
  71. package/dist/series-8E6FnWBU.cjs +11 -0
  72. package/dist/series-DCJSrg1P.js +1629 -0
  73. package/dist/spatial-BOhaO8xN.cjs +1 -0
  74. package/dist/spatial-DozyssiN.js +11 -0
  75. package/dist/spatial.cjs +1 -0
  76. package/dist/spatial.js +20 -0
  77. package/dist/{binary → src/binary}/encoder.d.ts +26 -2
  78. package/dist/src/binary/encoder.d.ts.map +1 -0
  79. package/dist/src/binary/encoder.spec.d.ts.map +1 -0
  80. package/dist/src/binary/index.d.ts.map +1 -0
  81. package/dist/src/caseconv/caseconv.d.ts +6 -0
  82. package/dist/src/caseconv/caseconv.d.ts.map +1 -0
  83. package/dist/src/caseconv/index.d.ts +2 -0
  84. package/dist/src/caseconv/index.d.ts.map +1 -0
  85. package/dist/{change → src/change}/change.d.ts +10 -9
  86. package/dist/src/change/change.d.ts.map +1 -0
  87. package/dist/src/change/index.d.ts.map +1 -0
  88. package/dist/src/clamp/clamp.d.ts.map +1 -0
  89. package/dist/src/clamp/index.d.ts +2 -0
  90. package/dist/src/clamp/index.d.ts.map +1 -0
  91. package/dist/{compare → src/compare}/compare.d.ts +6 -4
  92. package/dist/src/compare/compare.d.ts.map +1 -0
  93. package/dist/src/compare/compare.spec.d.ts +2 -0
  94. package/dist/src/compare/compare.spec.d.ts.map +1 -0
  95. package/dist/src/compare/index.d.ts.map +1 -0
  96. package/dist/src/control/control.d.ts +107 -0
  97. package/dist/src/control/control.d.ts.map +1 -0
  98. package/dist/src/control/index.d.ts +2 -0
  99. package/dist/src/control/index.d.ts.map +1 -0
  100. package/dist/src/debounce/debounce.d.ts.map +1 -0
  101. package/dist/src/debounce/debounce.spec.d.ts +2 -0
  102. package/dist/src/debounce/debounce.spec.d.ts.map +1 -0
  103. package/dist/src/debounce/index.d.ts +2 -0
  104. package/dist/src/debounce/index.d.ts.map +1 -0
  105. package/dist/src/deep/copy.d.ts.map +1 -0
  106. package/dist/{deep → src/deep}/delete.d.ts +2 -1
  107. package/dist/src/deep/delete.d.ts.map +1 -0
  108. package/dist/{deep → src/deep}/delete.spec.d.ts.map +1 -1
  109. package/dist/src/deep/difference.d.ts.map +1 -0
  110. package/dist/src/deep/difference.spec.d.ts.map +1 -0
  111. package/dist/src/deep/equal.d.ts.map +1 -0
  112. package/dist/{deep → src/deep}/equal.spec.d.ts.map +1 -1
  113. package/dist/{deep → src/deep}/external.d.ts +3 -4
  114. package/dist/src/deep/external.d.ts.map +1 -0
  115. package/dist/src/deep/index.d.ts.map +1 -0
  116. package/dist/src/deep/merge.d.ts +12 -0
  117. package/dist/src/deep/merge.d.ts.map +1 -0
  118. package/dist/{deep → src/deep}/merge.spec.d.ts.map +1 -1
  119. package/dist/src/deep/partial.d.ts.map +1 -0
  120. package/dist/src/deep/path.d.ts +54 -0
  121. package/dist/src/deep/path.d.ts.map +1 -0
  122. package/dist/{deep → src/deep}/path.spec.d.ts.map +1 -1
  123. package/dist/src/destructor.d.ts.map +1 -0
  124. package/dist/{identity.d.ts → src/identity.d.ts} +2 -1
  125. package/dist/src/identity.d.ts.map +1 -0
  126. package/dist/{index.d.ts → src/index.d.ts} +22 -20
  127. package/dist/src/index.d.ts.map +1 -0
  128. package/dist/src/invert.d.ts.map +1 -0
  129. package/dist/src/join.d.ts.map +1 -0
  130. package/dist/src/kv/index.d.ts.map +1 -0
  131. package/dist/src/kv/types.d.ts.map +1 -0
  132. package/dist/src/math/index.d.ts +2 -0
  133. package/dist/src/math/index.d.ts.map +1 -0
  134. package/dist/src/math/math.d.ts +11 -0
  135. package/dist/src/math/math.d.ts.map +1 -0
  136. package/dist/src/migrate/index.d.ts.map +1 -0
  137. package/dist/src/migrate/migrate.d.ts +29 -0
  138. package/dist/src/migrate/migrate.d.ts.map +1 -0
  139. package/dist/src/migrate/migrate.spec.d.ts.map +1 -0
  140. package/dist/{mock → src/mock}/MockGLBufferController.d.ts +2 -1
  141. package/dist/src/mock/MockGLBufferController.d.ts.map +1 -0
  142. package/dist/src/mock/index.d.ts.map +1 -0
  143. package/dist/src/observe/index.d.ts.map +1 -0
  144. package/dist/src/observe/observe.d.ts +24 -0
  145. package/dist/src/observe/observe.d.ts.map +1 -0
  146. package/dist/src/observe/obsever.spec.d.ts +2 -0
  147. package/dist/src/observe/obsever.spec.d.ts.map +1 -0
  148. package/dist/src/optional.d.ts.map +1 -0
  149. package/dist/{primitive.d.ts → src/primitive.d.ts} +2 -1
  150. package/dist/src/primitive.d.ts.map +1 -0
  151. package/dist/{record.d.ts → src/record.d.ts} +7 -8
  152. package/dist/src/record.d.ts.map +1 -0
  153. package/dist/{renderable.d.ts → src/renderable.d.ts} +2 -1
  154. package/dist/src/renderable.d.ts.map +1 -0
  155. package/dist/src/runtime/detect.d.ts.map +1 -0
  156. package/dist/src/runtime/external.d.ts.map +1 -0
  157. package/dist/src/runtime/index.d.ts.map +1 -0
  158. package/dist/src/runtime/os.d.ts +20 -0
  159. package/dist/src/runtime/os.d.ts.map +1 -0
  160. package/dist/{search.d.ts → src/search.d.ts} +5 -2
  161. package/dist/src/search.d.ts.map +1 -0
  162. package/dist/src/shallowCopy.d.ts +2 -0
  163. package/dist/src/shallowCopy.d.ts.map +1 -0
  164. package/dist/{spatial → src/spatial}/base.d.ts +30 -5
  165. package/dist/src/spatial/base.d.ts.map +1 -0
  166. package/dist/src/spatial/bounds/bounds.d.ts +148 -0
  167. package/dist/src/spatial/bounds/bounds.d.ts.map +1 -0
  168. package/dist/src/spatial/bounds/bounds.spec.d.ts.map +1 -0
  169. package/dist/src/spatial/bounds/index.d.ts.map +1 -0
  170. package/dist/{spatial → src/spatial}/box/box.d.ts +73 -24
  171. package/dist/src/spatial/box/box.d.ts.map +1 -0
  172. package/dist/src/spatial/box/box.spec.d.ts.map +1 -0
  173. package/dist/src/spatial/box/index.d.ts.map +1 -0
  174. package/dist/{spatial → src/spatial}/dimensions/dimensions.d.ts +4 -3
  175. package/dist/src/spatial/dimensions/dimensions.d.ts.map +1 -0
  176. package/dist/src/spatial/dimensions/dimensions.spec.d.ts.map +1 -0
  177. package/dist/src/spatial/dimensions/index.d.ts.map +1 -0
  178. package/dist/{spatial → src/spatial}/direction/direction.d.ts +4 -3
  179. package/dist/src/spatial/direction/direction.d.ts.map +1 -0
  180. package/dist/src/spatial/direction/direction.spec.d.ts.map +1 -0
  181. package/dist/src/spatial/direction/index.d.ts.map +1 -0
  182. package/dist/{spatial → src/spatial}/external.d.ts +2 -2
  183. package/dist/src/spatial/external.d.ts.map +1 -0
  184. package/dist/src/spatial/index.d.ts.map +1 -0
  185. package/dist/src/spatial/location/index.d.ts.map +1 -0
  186. package/dist/{spatial → src/spatial}/location/location.d.ts +4 -3
  187. package/dist/src/spatial/location/location.d.ts.map +1 -0
  188. package/dist/src/spatial/location/location.spec.d.ts.map +1 -0
  189. package/dist/src/spatial/position/index.d.ts.map +1 -0
  190. package/dist/{spatial → src/spatial}/position/position.d.ts +4 -4
  191. package/dist/src/spatial/position/position.d.ts.map +1 -0
  192. package/dist/src/spatial/position/position.spec.d.ts.map +1 -0
  193. package/dist/src/spatial/scale/index.d.ts.map +1 -0
  194. package/dist/{spatial → src/spatial}/scale/scale.d.ts +15 -62
  195. package/dist/src/spatial/scale/scale.d.ts.map +1 -0
  196. package/dist/src/spatial/scale/scale.spec.d.ts.map +1 -0
  197. package/dist/src/spatial/spatial.d.ts +2 -0
  198. package/dist/src/spatial/spatial.d.ts.map +1 -0
  199. package/dist/src/spatial/xy/index.d.ts.map +1 -0
  200. package/dist/{spatial → src/spatial}/xy/xy.d.ts +16 -25
  201. package/dist/src/spatial/xy/xy.d.ts.map +1 -0
  202. package/dist/{spatial → src/spatial}/xy/xy.spec.d.ts.map +1 -1
  203. package/dist/src/telem/generate.d.ts +4 -0
  204. package/dist/src/telem/generate.d.ts.map +1 -0
  205. package/dist/src/telem/gl.d.ts.map +1 -0
  206. package/dist/{telem → src/telem}/index.d.ts +1 -1
  207. package/dist/src/telem/index.d.ts.map +1 -0
  208. package/dist/{telem → src/telem}/series.d.ts +10 -8
  209. package/dist/src/telem/series.d.ts.map +1 -0
  210. package/dist/{telem → src/telem}/series.spec.d.ts.map +1 -1
  211. package/dist/{telem → src/telem}/telem.d.ts +19 -21
  212. package/dist/src/telem/telem.d.ts.map +1 -0
  213. package/dist/{telem → src/telem}/telem.spec.d.ts.map +1 -1
  214. package/dist/src/toArray.d.ts.map +1 -0
  215. package/dist/src/transform.d.ts +6 -0
  216. package/dist/src/transform.d.ts.map +1 -0
  217. package/dist/src/unique.d.ts.map +1 -0
  218. package/dist/src/url/index.d.ts +2 -0
  219. package/dist/src/url/index.d.ts.map +1 -0
  220. package/dist/src/url/url.d.ts.map +1 -0
  221. package/dist/{url → src/url}/url.spec.d.ts.map +1 -1
  222. package/dist/src/worker/index.d.ts +2 -0
  223. package/dist/src/worker/index.d.ts.map +1 -0
  224. package/dist/{worker → src/worker}/worker.d.ts +4 -4
  225. package/dist/src/worker/worker.d.ts.map +1 -0
  226. package/dist/src/worker/worker.spec.d.ts.map +1 -0
  227. package/dist/src/zodutil/index.d.ts +2 -0
  228. package/dist/src/zodutil/index.d.ts.map +1 -0
  229. package/dist/src/zodutil/zodutil.d.ts +6 -0
  230. package/dist/src/zodutil/zodutil.d.ts.map +1 -0
  231. package/dist/src/zodutil/zodutil.spec.d.ts +2 -0
  232. package/dist/src/zodutil/zodutil.spec.d.ts.map +1 -0
  233. package/dist/telem.cjs +1 -0
  234. package/dist/telem.js +17 -0
  235. package/dist/toArray.cjs +1 -0
  236. package/dist/toArray.js +5 -0
  237. package/dist/unique.cjs +1 -0
  238. package/dist/unique.js +4 -0
  239. package/dist/url.cjs +1 -0
  240. package/dist/url.js +54 -0
  241. package/dist/worker.cjs +1 -0
  242. package/dist/worker.js +47 -0
  243. package/dist/xy-D1ZbIqpT.js +90 -0
  244. package/dist/xy-cP-FXJtR.cjs +1 -0
  245. package/dist/xy.cjs +1 -0
  246. package/dist/xy.js +4 -0
  247. package/dist/zodutil.cjs +1 -0
  248. package/dist/zodutil.js +21 -0
  249. package/eslint.config.js +12 -0
  250. package/package.json +157 -13
  251. package/src/binary/encoder.spec.ts +150 -7
  252. package/src/binary/encoder.ts +110 -9
  253. package/src/binary/index.ts +1 -1
  254. package/src/caseconv/caseconv.ts +31 -0
  255. package/src/caseconv/index.ts +10 -0
  256. package/src/change/change.ts +7 -6
  257. package/src/change/index.ts +1 -1
  258. package/src/{clamp.ts → clamp/clamp.ts} +1 -1
  259. package/src/clamp/index.ts +10 -0
  260. package/src/compare/compare.spec.ts +49 -0
  261. package/src/compare/compare.ts +37 -10
  262. package/src/compare/index.ts +1 -1
  263. package/src/control/control.ts +77 -0
  264. package/src/control/index.ts +1 -0
  265. package/src/debounce/debounce.spec.ts +52 -0
  266. package/src/{debounce.ts → debounce/debounce.ts} +4 -4
  267. package/src/debounce/index.ts +10 -0
  268. package/src/deep/copy.ts +2 -3
  269. package/src/deep/delete.spec.ts +2 -2
  270. package/src/deep/delete.ts +3 -2
  271. package/src/deep/difference.spec.ts +28 -27
  272. package/src/deep/difference.ts +13 -11
  273. package/src/deep/equal.spec.ts +4 -4
  274. package/src/deep/equal.ts +5 -5
  275. package/src/deep/external.ts +4 -5
  276. package/src/deep/index.ts +1 -1
  277. package/src/deep/merge.spec.ts +120 -4
  278. package/src/deep/merge.ts +50 -6
  279. package/src/deep/partial.ts +1 -1
  280. package/src/deep/path.spec.ts +91 -39
  281. package/src/deep/path.ts +111 -46
  282. package/src/destructor.ts +2 -2
  283. package/src/identity.ts +1 -1
  284. package/src/index.ts +23 -21
  285. package/src/invert.ts +9 -0
  286. package/src/join.ts +1 -1
  287. package/src/kv/index.ts +1 -1
  288. package/src/kv/types.ts +1 -1
  289. package/src/math/index.ts +10 -0
  290. package/src/math/math.ts +33 -0
  291. package/src/migrate/index.ts +9 -0
  292. package/src/migrate/migrate.spec.ts +65 -54
  293. package/src/migrate/migrate.ts +126 -17
  294. package/src/mock/MockGLBufferController.ts +6 -6
  295. package/src/mock/index.ts +1 -1
  296. package/src/observe/index.ts +1 -1
  297. package/src/observe/observe.ts +37 -6
  298. package/src/observe/obsever.spec.ts +56 -0
  299. package/src/optional.ts +3 -4
  300. package/src/primitive.ts +1 -1
  301. package/src/record.ts +10 -6
  302. package/src/renderable.ts +1 -1
  303. package/src/runtime/detect.ts +3 -3
  304. package/src/runtime/external.ts +1 -1
  305. package/src/runtime/index.ts +1 -1
  306. package/src/runtime/os.ts +17 -5
  307. package/src/search.ts +3 -1
  308. package/src/shallowCopy.ts +5 -6
  309. package/src/spatial/base.ts +13 -5
  310. package/src/spatial/bounds/bounds.spec.ts +259 -180
  311. package/src/spatial/bounds/bounds.ts +200 -85
  312. package/src/spatial/bounds/index.ts +2 -2
  313. package/src/spatial/box/box.spec.ts +211 -2
  314. package/src/spatial/box/box.ts +97 -49
  315. package/src/spatial/box/index.ts +2 -2
  316. package/src/spatial/dimensions/dimensions.spec.ts +1 -1
  317. package/src/spatial/dimensions/dimensions.ts +4 -4
  318. package/src/spatial/dimensions/index.ts +2 -2
  319. package/src/spatial/direction/direction.spec.ts +1 -1
  320. package/src/spatial/direction/direction.ts +7 -7
  321. package/src/spatial/direction/index.ts +2 -2
  322. package/src/spatial/external.ts +3 -3
  323. package/src/spatial/index.ts +1 -1
  324. package/src/spatial/location/index.ts +2 -2
  325. package/src/spatial/location/location.spec.ts +1 -1
  326. package/src/spatial/location/location.ts +21 -21
  327. package/src/spatial/position/index.ts +1 -1
  328. package/src/spatial/position/position.spec.ts +1 -1
  329. package/src/spatial/position/position.ts +3 -20
  330. package/src/spatial/scale/index.ts +2 -2
  331. package/src/spatial/scale/scale.spec.ts +3 -3
  332. package/src/spatial/scale/scale.ts +3 -3
  333. package/src/spatial/spatial.ts +5 -5
  334. package/src/spatial/xy/index.ts +2 -2
  335. package/src/spatial/xy/xy.spec.ts +93 -44
  336. package/src/spatial/xy/xy.ts +20 -27
  337. package/src/telem/generate.ts +1 -1
  338. package/src/telem/gl.ts +1 -1
  339. package/src/telem/index.ts +2 -2
  340. package/src/telem/series.spec.ts +64 -5
  341. package/src/telem/series.ts +47 -35
  342. package/src/telem/telem.spec.ts +130 -2
  343. package/src/telem/telem.ts +63 -23
  344. package/src/toArray.ts +2 -2
  345. package/src/transform.ts +9 -2
  346. package/src/unique.ts +1 -1
  347. package/src/url/index.ts +2 -2
  348. package/src/url/url.spec.ts +2 -2
  349. package/src/url/url.ts +4 -4
  350. package/src/worker/index.ts +10 -0
  351. package/src/worker/worker.spec.ts +2 -2
  352. package/src/worker/worker.ts +13 -13
  353. package/src/zodutil/index.ts +10 -0
  354. package/src/zodutil/zodutil.spec.ts +103 -0
  355. package/src/zodutil/zodutil.ts +44 -0
  356. package/tsconfig.json +1 -0
  357. package/tsconfig.tsbuildinfo +1 -0
  358. package/vite.config.ts +39 -3
  359. package/.eslintrc.cjs +0 -18
  360. package/dist/binary/encoder.d.ts.map +0 -1
  361. package/dist/binary/encoder.spec.d.ts.map +0 -1
  362. package/dist/binary/index.d.ts.map +0 -1
  363. package/dist/case.d.ts +0 -6
  364. package/dist/case.d.ts.map +0 -1
  365. package/dist/change/change.d.ts.map +0 -1
  366. package/dist/change/index.d.ts.map +0 -1
  367. package/dist/clamp.d.ts.map +0 -1
  368. package/dist/compare/compare.d.ts.map +0 -1
  369. package/dist/compare/index.d.ts.map +0 -1
  370. package/dist/debounce.d.ts.map +0 -1
  371. package/dist/deep/copy.d.ts.map +0 -1
  372. package/dist/deep/delete.d.ts.map +0 -1
  373. package/dist/deep/difference.d.ts.map +0 -1
  374. package/dist/deep/difference.spec.d.ts.map +0 -1
  375. package/dist/deep/equal.d.ts.map +0 -1
  376. package/dist/deep/external.d.ts.map +0 -1
  377. package/dist/deep/index.d.ts.map +0 -1
  378. package/dist/deep/memo.d.ts +0 -2
  379. package/dist/deep/memo.d.ts.map +0 -1
  380. package/dist/deep/merge.d.ts +0 -3
  381. package/dist/deep/merge.d.ts.map +0 -1
  382. package/dist/deep/partial.d.ts.map +0 -1
  383. package/dist/deep/path.d.ts +0 -37
  384. package/dist/deep/path.d.ts.map +0 -1
  385. package/dist/destructor.d.ts.map +0 -1
  386. package/dist/identity.d.ts.map +0 -1
  387. package/dist/index.d.ts.map +0 -1
  388. package/dist/invert.d.ts.map +0 -1
  389. package/dist/join.d.ts.map +0 -1
  390. package/dist/kv/index.d.ts.map +0 -1
  391. package/dist/kv/types.d.ts.map +0 -1
  392. package/dist/migrate/index.d.ts.map +0 -1
  393. package/dist/migrate/migrate.d.ts +0 -16
  394. package/dist/migrate/migrate.d.ts.map +0 -1
  395. package/dist/migrate/migrate.spec.d.ts.map +0 -1
  396. package/dist/mock/MockGLBufferController.d.ts.map +0 -1
  397. package/dist/mock/index.d.ts.map +0 -1
  398. package/dist/observe/index.d.ts.map +0 -1
  399. package/dist/observe/observe.d.ts +0 -12
  400. package/dist/observe/observe.d.ts.map +0 -1
  401. package/dist/optional.d.ts.map +0 -1
  402. package/dist/primitive.d.ts.map +0 -1
  403. package/dist/record.d.ts.map +0 -1
  404. package/dist/renderable.d.ts.map +0 -1
  405. package/dist/runtime/detect.d.ts.map +0 -1
  406. package/dist/runtime/external.d.ts.map +0 -1
  407. package/dist/runtime/index.d.ts.map +0 -1
  408. package/dist/runtime/os.d.ts +0 -10
  409. package/dist/runtime/os.d.ts.map +0 -1
  410. package/dist/search.d.ts.map +0 -1
  411. package/dist/shallowCopy.d.ts +0 -2
  412. package/dist/shallowCopy.d.ts.map +0 -1
  413. package/dist/spatial/base.d.ts.map +0 -1
  414. package/dist/spatial/bounds/bounds.d.ts +0 -71
  415. package/dist/spatial/bounds/bounds.d.ts.map +0 -1
  416. package/dist/spatial/bounds/bounds.spec.d.ts.map +0 -1
  417. package/dist/spatial/bounds/index.d.ts.map +0 -1
  418. package/dist/spatial/box/box.d.ts.map +0 -1
  419. package/dist/spatial/box/box.spec.d.ts.map +0 -1
  420. package/dist/spatial/box/index.d.ts.map +0 -1
  421. package/dist/spatial/dimensions/dimensions.d.ts.map +0 -1
  422. package/dist/spatial/dimensions/dimensions.spec.d.ts.map +0 -1
  423. package/dist/spatial/dimensions/index.d.ts.map +0 -1
  424. package/dist/spatial/direction/direction.d.ts.map +0 -1
  425. package/dist/spatial/direction/direction.spec.d.ts.map +0 -1
  426. package/dist/spatial/direction/index.d.ts.map +0 -1
  427. package/dist/spatial/external.d.ts.map +0 -1
  428. package/dist/spatial/index.d.ts.map +0 -1
  429. package/dist/spatial/location/index.d.ts.map +0 -1
  430. package/dist/spatial/location/location.d.ts.map +0 -1
  431. package/dist/spatial/location/location.spec.d.ts.map +0 -1
  432. package/dist/spatial/position/index.d.ts.map +0 -1
  433. package/dist/spatial/position/position.d.ts.map +0 -1
  434. package/dist/spatial/position/position.spec.d.ts.map +0 -1
  435. package/dist/spatial/scale/index.d.ts.map +0 -1
  436. package/dist/spatial/scale/scale.d.ts.map +0 -1
  437. package/dist/spatial/scale/scale.spec.d.ts.map +0 -1
  438. package/dist/spatial/spatial.d.ts +0 -2
  439. package/dist/spatial/spatial.d.ts.map +0 -1
  440. package/dist/spatial/xy/index.d.ts.map +0 -1
  441. package/dist/spatial/xy/xy.d.ts.map +0 -1
  442. package/dist/telem/generate.d.ts +0 -3
  443. package/dist/telem/generate.d.ts.map +0 -1
  444. package/dist/telem/gl.d.ts.map +0 -1
  445. package/dist/telem/index.d.ts.map +0 -1
  446. package/dist/telem/series.d.ts.map +0 -1
  447. package/dist/telem/telem.d.ts.map +0 -1
  448. package/dist/toArray.d.ts.map +0 -1
  449. package/dist/transform.d.ts +0 -2
  450. package/dist/transform.d.ts.map +0 -1
  451. package/dist/unique.d.ts.map +0 -1
  452. package/dist/url/index.d.ts +0 -2
  453. package/dist/url/index.d.ts.map +0 -1
  454. package/dist/url/url.d.ts.map +0 -1
  455. package/dist/worker/worker.d.ts.map +0 -1
  456. package/dist/worker/worker.spec.d.ts.map +0 -1
  457. package/dist/x.cjs +0 -12
  458. package/dist/x.cjs.map +0 -1
  459. package/dist/x.js +0 -5935
  460. package/dist/x.js.map +0 -1
  461. package/src/case.ts +0 -27
  462. package/src/deep/memo.ts +0 -24
  463. /package/dist/{binary → src/binary}/encoder.spec.d.ts +0 -0
  464. /package/dist/{binary → src/binary}/index.d.ts +0 -0
  465. /package/dist/{change → src/change}/index.d.ts +0 -0
  466. /package/dist/{clamp.d.ts → src/clamp/clamp.d.ts} +0 -0
  467. /package/dist/{compare → src/compare}/index.d.ts +0 -0
  468. /package/dist/{debounce.d.ts → src/debounce/debounce.d.ts} +0 -0
  469. /package/dist/{deep → src/deep}/copy.d.ts +0 -0
  470. /package/dist/{deep → src/deep}/delete.spec.d.ts +0 -0
  471. /package/dist/{deep → src/deep}/difference.d.ts +0 -0
  472. /package/dist/{deep → src/deep}/difference.spec.d.ts +0 -0
  473. /package/dist/{deep → src/deep}/equal.d.ts +0 -0
  474. /package/dist/{deep → src/deep}/equal.spec.d.ts +0 -0
  475. /package/dist/{deep → src/deep}/index.d.ts +0 -0
  476. /package/dist/{deep → src/deep}/merge.spec.d.ts +0 -0
  477. /package/dist/{deep → src/deep}/partial.d.ts +0 -0
  478. /package/dist/{deep → src/deep}/path.spec.d.ts +0 -0
  479. /package/dist/{destructor.d.ts → src/destructor.d.ts} +0 -0
  480. /package/dist/{invert.d.ts → src/invert.d.ts} +0 -0
  481. /package/dist/{join.d.ts → src/join.d.ts} +0 -0
  482. /package/dist/{kv → src/kv}/index.d.ts +0 -0
  483. /package/dist/{kv → src/kv}/types.d.ts +0 -0
  484. /package/dist/{migrate → src/migrate}/index.d.ts +0 -0
  485. /package/dist/{migrate → src/migrate}/migrate.spec.d.ts +0 -0
  486. /package/dist/{mock → src/mock}/index.d.ts +0 -0
  487. /package/dist/{observe → src/observe}/index.d.ts +0 -0
  488. /package/dist/{optional.d.ts → src/optional.d.ts} +0 -0
  489. /package/dist/{runtime → src/runtime}/detect.d.ts +0 -0
  490. /package/dist/{runtime → src/runtime}/external.d.ts +0 -0
  491. /package/dist/{runtime → src/runtime}/index.d.ts +0 -0
  492. /package/dist/{spatial → src/spatial}/bounds/bounds.spec.d.ts +0 -0
  493. /package/dist/{spatial → src/spatial}/bounds/index.d.ts +0 -0
  494. /package/dist/{spatial → src/spatial}/box/box.spec.d.ts +0 -0
  495. /package/dist/{spatial → src/spatial}/box/index.d.ts +0 -0
  496. /package/dist/{spatial → src/spatial}/dimensions/dimensions.spec.d.ts +0 -0
  497. /package/dist/{spatial → src/spatial}/dimensions/index.d.ts +0 -0
  498. /package/dist/{spatial → src/spatial}/direction/direction.spec.d.ts +0 -0
  499. /package/dist/{spatial → src/spatial}/direction/index.d.ts +0 -0
  500. /package/dist/{spatial → src/spatial}/index.d.ts +0 -0
  501. /package/dist/{spatial → src/spatial}/location/index.d.ts +0 -0
  502. /package/dist/{spatial → src/spatial}/location/location.spec.d.ts +0 -0
  503. /package/dist/{spatial → src/spatial}/position/index.d.ts +0 -0
  504. /package/dist/{spatial → src/spatial}/position/position.spec.d.ts +0 -0
  505. /package/dist/{spatial → src/spatial}/scale/index.d.ts +0 -0
  506. /package/dist/{spatial → src/spatial}/scale/scale.spec.d.ts +0 -0
  507. /package/dist/{spatial → src/spatial}/xy/index.d.ts +0 -0
  508. /package/dist/{spatial → src/spatial}/xy/xy.spec.d.ts +0 -0
  509. /package/dist/{telem → src/telem}/gl.d.ts +0 -0
  510. /package/dist/{telem → src/telem}/series.spec.d.ts +0 -0
  511. /package/dist/{telem → src/telem}/telem.spec.d.ts +0 -0
  512. /package/dist/{toArray.d.ts → src/toArray.d.ts} +0 -0
  513. /package/dist/{unique.d.ts → src/unique.d.ts} +0 -0
  514. /package/dist/{url → src/url}/url.d.ts +0 -0
  515. /package/dist/{url → src/url}/url.spec.d.ts +0 -0
  516. /package/dist/{worker → src/worker}/worker.spec.d.ts +0 -0
@@ -1,4 +1,4 @@
1
- // Copyright 2023 Synnax Labs, Inc.
1
+ // Copyright 2024 Synnax Labs, Inc.
2
2
  //
3
3
  // Use of this software is governed by the Business Source License included in the file
4
4
  // licenses/BSL.txt.
@@ -7,7 +7,8 @@
7
7
  // License, use of this software will be governed by the Apache License, Version 2.0,
8
8
  // included in the file licenses/APL.txt.
9
9
 
10
- import { describe, it, expect } from "vitest";
10
+ import { describe, expect,it } from "vitest";
11
+ import { z } from "zod";
11
12
 
12
13
  import { deep } from "@/deep";
13
14
 
@@ -40,7 +41,7 @@ describe("deepMerge", () => {
40
41
  d: 4,
41
42
  },
42
43
  };
43
- expect(deep.merge(a, b)).toEqual(c);
44
+ expect(deep.override(a, b)).toEqual(c);
44
45
  });
45
46
  it("Should set a value even when its parent is undefined", () => {
46
47
  const a: TestRecord = {
@@ -58,6 +59,121 @@ describe("deepMerge", () => {
58
59
  d: 4,
59
60
  },
60
61
  };
61
- expect(deep.merge(a, b)).toEqual(c);
62
+ expect(deep.override(a, b)).toEqual(c);
63
+ });
64
+
65
+ describe("overrideValidItems", () => {
66
+ it("should override valid items", () => {
67
+ const base = {
68
+ a: 1,
69
+ b: 2,
70
+ };
71
+ const override = {
72
+ a: 3,
73
+ };
74
+ const schema = z.object({
75
+ a: z.number(),
76
+ b: z.number(),
77
+ });
78
+ expect(deep.overrideValidItems(base, override, schema)).toEqual({
79
+ a: 3,
80
+ b: 2,
81
+ });
82
+ });
83
+ it("should ignore invalid items", () => {
84
+ const base = {
85
+ a: 1,
86
+ b: 2,
87
+ };
88
+ const override = {
89
+ a: "3",
90
+ };
91
+ const schema = z.object({
92
+ a: z.number(),
93
+ b: z.number(),
94
+ });
95
+ expect(deep.overrideValidItems(base, override, schema)).toEqual({
96
+ a: 1,
97
+ b: 2,
98
+ });
99
+ });
100
+ it("should merge deeply nested objects", () => {
101
+ const base = {
102
+ a: 1,
103
+ b: {
104
+ c: 2,
105
+ },
106
+ };
107
+ const override = {
108
+ a: 3,
109
+ b: {
110
+ c: 4,
111
+ },
112
+ };
113
+ const schema = z.object({
114
+ a: z.number(),
115
+ b: z.object({
116
+ c: z.number(),
117
+ }),
118
+ });
119
+ expect(deep.overrideValidItems(base, override, schema)).toEqual({
120
+ a: 3,
121
+ b: {
122
+ c: 4,
123
+ },
124
+ });
125
+ });
126
+ it("should ignore invalid nested objects", () => {
127
+ const base = {
128
+ a: 1,
129
+ b: {
130
+ c: 2,
131
+ },
132
+ };
133
+ const override = {
134
+ a: 3,
135
+ b: {
136
+ c: "4",
137
+ },
138
+ };
139
+ const schema = z.object({
140
+ a: z.number(),
141
+ b: z.object({
142
+ c: z.number(),
143
+ }),
144
+ });
145
+ expect(deep.overrideValidItems(base, override, schema)).toEqual({
146
+ a: 3,
147
+ b: {
148
+ c: 2,
149
+ },
150
+ });
151
+ });
152
+ it("should ignore nested objects that don't exist in the schema", () => {
153
+ const base = {
154
+ a: 1,
155
+ b: {
156
+ c: 2,
157
+ },
158
+ };
159
+ const override = {
160
+ a: 3,
161
+ f: {
162
+ d: 4,
163
+ },
164
+ };
165
+ const schema = z.object({
166
+ a: z.number(),
167
+ b: z.object({
168
+ c: z.number(),
169
+ }),
170
+ });
171
+ expect(deep.overrideValidItems(base, override, schema)).toEqual({
172
+ a: 3,
173
+ b: {
174
+ c: 2,
175
+ },
176
+ });
177
+ });
62
178
  });
63
179
  });
package/src/deep/merge.ts CHANGED
@@ -1,4 +1,4 @@
1
- // Copyright 2023 Synnax Labs, Inc.
1
+ // Copyright 2024 Synnax Labs, Inc.
2
2
  //
3
3
  // Use of this software is governed by the Business Source License included in the file
4
4
  // licenses/BSL.txt.
@@ -7,19 +7,27 @@
7
7
  // License, use of this software will be governed by the Apache License, Version 2.0,
8
8
  // included in the file licenses/APL.txt.
9
9
 
10
+ import { z } from "zod";
11
+
10
12
  import { type Partial } from "@/deep/partial";
11
13
  import { isObject } from "@/identity";
12
14
 
13
- export const merge = <T>(base: T, ...objects: Array<Partial<T>>): T => {
14
- if (objects.length === 0) return base;
15
- const source = objects.shift();
15
+ /**
16
+ * Overrides the properties of the base object with the existing properties of the provided
17
+ * object(s)
18
+ * @param base The base object to override
19
+ * @param overrides The object(s) to override the base object with
20
+ */
21
+ export const override = <T>(base: T, ...overrides: Array<Partial<T>>): T => {
22
+ if (overrides.length === 0) return base;
23
+ const source = overrides.shift();
16
24
 
17
25
  if (isObject(base) && isObject(source)) {
18
26
  for (const key in source) {
19
27
  try {
20
28
  if (isObject(source[key])) {
21
29
  if (!(key in base)) Object.assign(base, { [key]: {} });
22
- merge(base[key], source[key]);
30
+ override(base[key], source[key]);
23
31
  } else {
24
32
  Object.assign(base, { [key]: source[key] });
25
33
  }
@@ -32,5 +40,41 @@ export const merge = <T>(base: T, ...objects: Array<Partial<T>>): T => {
32
40
  }
33
41
  }
34
42
 
35
- return merge(base, ...objects);
43
+ return override(base, ...overrides);
44
+ };
45
+
46
+ export const overrideValidItems = <A, B>(
47
+ base: A,
48
+ override: B,
49
+ schema: z.ZodType<A, any, any>,
50
+ ): A => {
51
+ const mergeValidFields = (
52
+ baseObj: any,
53
+ overrideObj: any,
54
+ currentSchema: any,
55
+ ): any => {
56
+ // Iterate over each property in the override object
57
+ for (const key in overrideObj) {
58
+ const overrideValue = overrideObj[key];
59
+ // Check if the current key exists in the schema and if schema for this key is defined
60
+ if (currentSchema?.shape[key]) {
61
+ const result = currentSchema.shape[key].safeParse(overrideValue);
62
+ // Check if parsing succeeded
63
+ if (result.success) baseObj[key] = result.data;
64
+ } else if (
65
+ typeof overrideValue === "object" &&
66
+ !Array.isArray(overrideValue) &&
67
+ overrideValue !== null
68
+ ) {
69
+ // If it's a nested object, recurse into it only if a valid schema exists
70
+ if (currentSchema && currentSchema.shape && currentSchema.shape[key]) {
71
+ if (!baseObj[key]) baseObj[key] = {};
72
+ mergeValidFields(baseObj[key], overrideValue, currentSchema.shape[key]);
73
+ }
74
+ }
75
+ }
76
+ return baseObj;
77
+ };
78
+
79
+ return mergeValidFields({ ...base }, override, schema);
36
80
  };
@@ -1,4 +1,4 @@
1
- // Copyright 2023 Synnax Labs, Inc.
1
+ // Copyright 2024 Synnax Labs, Inc.
2
2
  //
3
3
  // Use of this software is governed by the Business Source License included in the file
4
4
  // licenses/BSL.txt.
@@ -1,4 +1,4 @@
1
- // Copyright 2023 Synnax Labs, Inc.
1
+ // Copyright 2024 Synnax Labs, Inc.
2
2
  //
3
3
  // Use of this software is governed by the Business Source License included in the file
4
4
  // licenses/BSL.txt.
@@ -7,9 +7,10 @@
7
7
  // License, use of this software will be governed by the Apache License, Version 2.0,
8
8
  // included in the file licenses/APL.txt.
9
9
 
10
- import { describe, it, expect, Test } from "vitest";
10
+ import { describe, expect, it } from "vitest";
11
11
 
12
12
  import { deep } from "@/deep";
13
+ import { UnknownRecord } from "@/record";
13
14
 
14
15
  interface TestRecord {
15
16
  a: number;
@@ -20,7 +21,6 @@ interface TestRecord {
20
21
  c: number[];
21
22
  }
22
23
 
23
-
24
24
  describe("path", () => {
25
25
  describe("get", () => {
26
26
  it("should get a key", () => {
@@ -29,30 +29,51 @@ describe("path", () => {
29
29
  b: {
30
30
  c: 2,
31
31
  },
32
- c: [1]
32
+ c: [1],
33
33
  };
34
34
  expect(deep.get(a, "b.c")).toEqual(2);
35
35
  });
36
36
  it("should get an array index", () => {
37
- const a: TestRecord = {
38
- a: 1,
39
- b: {
40
- c: 2,
41
- },
42
- c: [1, 2, 3],
43
- };
44
- expect(deep.get(a, "c.1")).toEqual(2);
37
+ const a: TestRecord = {
38
+ a: 1,
39
+ b: {
40
+ c: 2,
41
+ },
42
+ c: [1, 2, 3],
43
+ };
44
+ expect(deep.get(a, "c.1")).toEqual(2);
45
45
  });
46
46
  it("should return the object itself if the key is empty", () => {
47
- const a: TestRecord = {
48
- a: 1,
49
- b: {
50
- c: 2,
47
+ const a: TestRecord = {
48
+ a: 1,
49
+ b: {
50
+ c: 2,
51
+ },
52
+ c: [1, 2, 3],
53
+ };
54
+ expect(deep.get(a, "")).toStrictEqual(a);
55
+ });
56
+ describe("custom getter function", () => {
57
+ const v = {
58
+ a: {
59
+ value: () => ({
60
+ c: 0,
61
+ }),
62
+ },
63
+ };
64
+ it("should use the custom getter function", () => {
65
+ expect(
66
+ deep.get(v, "a.value().c", {
67
+ optional: false,
68
+ getter: (obj, key) => {
69
+ if (key === "value()")
70
+ return (obj as { value: () => { c: number } }).value();
71
+ return (obj as UnknownRecord)[key];
51
72
  },
52
- c: [1, 2, 3],
53
- };
54
- expect(deep.get(a, "")).toStrictEqual(a);
55
- })
73
+ }),
74
+ ).toEqual(0);
75
+ });
76
+ });
56
77
  });
57
78
  describe("set", () => {
58
79
  it("should set a key", () => {
@@ -61,35 +82,66 @@ describe("path", () => {
61
82
  b: {
62
83
  c: 2,
63
84
  },
64
- c: [1]
85
+ c: [1],
65
86
  };
66
87
  const b: TestRecord = {
67
88
  a: 1,
68
89
  b: {
69
90
  c: 3,
70
91
  },
71
- c: [1]
92
+ c: [1],
72
93
  };
73
94
  deep.set(a, "b.c", 3);
74
95
  expect(a).toEqual(b);
75
96
  });
76
97
  it("should set an array index", () => {
77
- const a: TestRecord = {
78
- a: 1,
79
- b: {
80
- c: 2,
81
- },
82
- c: [1, 2, 3],
83
- };
84
- const b: TestRecord = {
85
- a: 1,
86
- b: {
87
- c: 2,
88
- },
89
- c: [1, 4, 3],
90
- };
91
- deep.set(a, "c.1", 4);
92
- expect(a).toEqual(b);
93
- });
98
+ const a: TestRecord = {
99
+ a: 1,
100
+ b: {
101
+ c: 2,
102
+ },
103
+ c: [1, 2, 3],
104
+ };
105
+ const b: TestRecord = {
106
+ a: 1,
107
+ b: {
108
+ c: 2,
109
+ },
110
+ c: [1, 4, 3],
111
+ };
112
+ deep.set(a, "c.1", 4);
113
+ expect(a).toEqual(b);
114
+ });
115
+ });
116
+
117
+ describe("transformPath", () => {
118
+ it("should transform a path", () => {
119
+ expect(deep.transformPath("a.b.c", (part) => part.toUpperCase())).toEqual(
120
+ "A.B.C",
121
+ );
122
+ });
123
+ it("should inject additional parts into the path", () => {
124
+ expect(deep.transformPath("a.b.c", (p) => [p, "d"])).toEqual("a.d.b.d.c.d");
125
+ });
126
+ it("should remove parts from the path", () => {
127
+ expect(deep.transformPath("a.b.c", (p, i) => (i === 1 ? undefined : p))).toEqual(
128
+ "a.c",
129
+ );
130
+ });
131
+ });
132
+
133
+ describe("matches", () => {
134
+ it("should return true if two paths are equal", () => {
135
+ expect(deep.pathsMatch("a.b.c", "a.b.c")).toEqual(true);
136
+ });
137
+ it("should return true if the pattern is a prefix of the path", () => {
138
+ expect(deep.pathsMatch("a.b.c", "a.b")).toEqual(true);
139
+ });
140
+ it("should return true if the pattern has a wildcard", () => {
141
+ expect(deep.pathsMatch("a.b.c", "a.*.c")).toEqual(true);
142
+ });
143
+ it("should return true for an empty pattern", () => {
144
+ expect(deep.pathsMatch("a.b.c", "")).toEqual(true);
145
+ });
94
146
  });
95
147
  });
package/src/deep/path.ts CHANGED
@@ -1,4 +1,4 @@
1
- // Copyright 2023 Synnax Labs, Inc.
1
+ // Copyright 2024 Synnax Labs, Inc.
2
2
  //
3
3
  // Use of this software is governed by the Business Source License included in the file
4
4
  // licenses/BSL.txt.
@@ -7,8 +7,9 @@
7
7
  // License, use of this software will be governed by the Apache License, Version 2.0,
8
8
  // included in the file licenses/APL.txt.
9
9
 
10
+ import { caseconv } from "@/caseconv";
10
11
  import { type Join } from "@/join";
11
- import { UnknownRecord } from "@/record";
12
+ import { type UnknownRecord } from "@/record";
12
13
 
13
14
  type Prev = [
14
15
  never,
@@ -39,58 +40,122 @@ type Prev = [
39
40
  export type Key<T, D extends number = 5> = [D] extends [never]
40
41
  ? never
41
42
  : T extends object
42
- ? {
43
- [K in keyof T]-?: K extends string | number
44
- ? `${K}` | Join<K, Key<T[K], Prev[D]>>
45
- : never;
46
- }[keyof T]
47
- : "";
43
+ ? {
44
+ [K in keyof T]-?: K extends string | number
45
+ ? `${K}` | Join<K, Key<T[K], Prev[D]>>
46
+ : never;
47
+ }[keyof T]
48
+ : "";
48
49
 
49
- export type Get =
50
- &(<T>(obj: T, path: string, allowNull: true) => unknown | null)
51
- &(<T>(obj: T, path: string, allowNull?: boolean) => unknown)
50
+ export interface GetOptions<O extends boolean | undefined = boolean | undefined> {
51
+ optional: O;
52
+ getter?: (obj: UnknownRecord, key: string) => unknown;
53
+ }
52
54
 
53
- export const get: Get = <V>(obj: V, path: string, allowNull: boolean = false): unknown | null => {
54
- const parts = (path as string).split(".");
55
- if (parts.length === 1 && parts[0] === "") return obj;
56
- let result: UnknownRecord = obj as UnknownRecord;
57
- for (const part of parts) {
58
- const v = result[part];
59
- if (v == null) {
60
- if (allowNull) return null;
61
- throw new Error(`Path ${path} does not exist. ${part} is null`);
62
- }
63
- result = v as UnknownRecord;
64
- }
65
- return result;
55
+ export interface Get {
56
+ <V = unknown, T = UnknownRecord>(
57
+ obj: T,
58
+ path: string,
59
+ options?: GetOptions<false>,
60
+ ): V;
61
+ <V = unknown, T = UnknownRecord>(
62
+ obj: T,
63
+ path: string,
64
+ options?: GetOptions<boolean | undefined>,
65
+ ): V | null;
66
+ }
67
+
68
+ export interface TypedGet<V = unknown, T = UnknownRecord> {
69
+ (obj: T, path: string, options?: GetOptions<false>): V;
70
+ (obj: T, path: string, options?: GetOptions<boolean | undefined>): V | null;
66
71
  }
67
72
 
73
+ export const transformPath = (
74
+ path: string,
75
+ replacer: (
76
+ part: string,
77
+ index: number,
78
+ parts: string[],
79
+ ) => string | string[] | undefined,
80
+ ): string => {
81
+ const parts = path.split(".");
82
+ const result = parts
83
+ .map((part, index) => {
84
+ const r = replacer(part, index, parts);
85
+ if (r == null) return null;
86
+ if (typeof r === "string") return r;
87
+ return r.join(".");
88
+ })
89
+ .filter((part) => part != null) as string[];
90
+ return result.join(".");
91
+ };
92
+
93
+ export const pathToSnake = (path: string): string =>
94
+ transformPath(path, caseconv.stringToSnake);
95
+
96
+ export const pathToCamel = (path: string): string =>
97
+ transformPath(path, caseconv.stringToCamel);
98
+
99
+ export const get = (<V = unknown, T = UnknownRecord>(
100
+ obj: T,
101
+ path: string,
102
+ opts: GetOptions = { optional: false },
103
+ ): V | null => {
104
+ const { optional, getter = (obj, key) => (obj as UnknownRecord)[key] } = opts;
105
+ const parts = path.split(".");
106
+ if (parts.length === 1 && parts[0] === "") return obj as unknown as V;
107
+ let result: UnknownRecord = obj as UnknownRecord;
108
+ for (const part of parts) {
109
+ const v = getter(result, part);
110
+ if (v == null) {
111
+ if (optional) return null;
112
+ throw new Error(`Path ${path} does not exist. ${part} is null`);
113
+ }
114
+ result = v as UnknownRecord;
115
+ }
116
+ return result as V;
117
+ }) as unknown as Get;
118
+
68
119
  export const set = <V>(obj: V, path: string, value: unknown): void => {
69
- const parts = (path as string).split(".");
70
- let result: UnknownRecord = obj as UnknownRecord;
71
- for (let i = 0; i < parts.length - 1; i++) {
72
- const part = parts[i];
73
- if (result[part] == null) {
74
- throw new Error(`Path ${path} does not exist`);
75
- }
76
- result = result[part] as UnknownRecord;
120
+ const parts = path.split(".");
121
+ let result: UnknownRecord = obj as UnknownRecord;
122
+ for (let i = 0; i < parts.length - 1; i++) {
123
+ const part = parts[i];
124
+ if (result[part] == null) {
125
+ throw new Error(`Path ${path} does not exist`);
77
126
  }
78
- result[parts[parts.length - 1]] = value;
79
- }
127
+ result = result[part] as UnknownRecord;
128
+ }
129
+ result[parts[parts.length - 1]] = value;
130
+ };
80
131
 
81
132
  export const element = (path: string, index: number): string => {
82
- const parts = path.split(".");
83
- if (index < 0) return parts[parts.length + index];
84
- return parts[index];
85
- }
133
+ const parts = path.split(".");
134
+ if (index < 0) return parts[parts.length + index];
135
+ return parts[index];
136
+ };
86
137
 
87
138
  export const join = (path: string[]): string => path.join(".");
88
139
 
89
- export const has = <V>(obj: V, path: string): boolean => {
90
- try {
91
- get<V>(obj, path);
92
- return true;
93
- } catch {
94
- return false;
95
- }
96
- }
140
+ export const has = <V = unknown, T = UnknownRecord>(obj: T, path: string): boolean => {
141
+ try {
142
+ get<V, T>(obj, path);
143
+ return true;
144
+ } catch {
145
+ return false;
146
+ }
147
+ };
148
+
149
+ export const pathsMatch = (path: string, pattern: string): boolean => {
150
+ if (pattern.length === 0) return true;
151
+ const parts = path.split(".");
152
+ const patterns = pattern.split(".");
153
+ if (patterns.length > parts.length) return false;
154
+ for (let i = 0; i < patterns.length; i++) {
155
+ const part = parts[i];
156
+ const pattern = patterns[i];
157
+ if (pattern === "*") continue;
158
+ if (part !== pattern) return false;
159
+ }
160
+ return true;
161
+ };
package/src/destructor.ts CHANGED
@@ -1,4 +1,4 @@
1
- // Copyright 2023 Synnax Labs, Inc.
1
+ // Copyright 2024 Synnax Labs, Inc.
2
2
  //
3
3
  // Use of this software is governed by the Business Source License included in the file
4
4
  // licenses/BSL.txt.
@@ -9,4 +9,4 @@
9
9
 
10
10
  export type Destructor = () => void;
11
11
 
12
- export type AsyncDestructor = () => Promise<void>;
12
+ export type AsyncDestructor = () => Promise<void>;
package/src/identity.ts CHANGED
@@ -1,4 +1,4 @@
1
- // Copyright 2023 Synnax Labs, Inc.
1
+ // Copyright 2024 Synnax Labs, Inc.
2
2
  //
3
3
  // Use of this software is governed by the Business Source License included in the file
4
4
  // licenses/BSL.txt.
package/src/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- // Copyright 2023 Synnax Labs, Inc.
1
+ // Copyright 2024 Synnax Labs, Inc.
2
2
  //
3
3
  // Use of this software is governed by the Business Source License included in the file
4
4
  // licenses/BSL.txt.
@@ -7,31 +7,33 @@
7
7
  // License, use of this software will be governed by the Apache License, Version 2.0,
8
8
  // included in the file licenses/APL.txt.
9
9
 
10
- export * from "@/telem";
10
+ export * from "@/binary";
11
+ export * from "@/caseconv";
12
+ export * from "@/change";
13
+ export * from "@/clamp/clamp";
14
+ export * from "@/compare";
15
+ export * from "@/control";
16
+ export * from "@/debounce/debounce";
17
+ export * from "@/deep";
18
+ export * from "@/destructor";
19
+ export * from "@/identity";
20
+ export * from "@/invert";
21
+ export * from "@/kv";
22
+ export * from "@/math";
23
+ export * from "@/migrate";
24
+ export * from "@/observe";
25
+ export * from "@/optional";
11
26
  export * from "@/primitive";
12
27
  export * from "@/record";
13
28
  export * from "@/renderable";
14
- export * from "@/optional";
15
- export * from "@/identity";
16
29
  export * from "@/runtime";
17
- export * from "@/deep";
18
- export * from "@/debounce";
19
- export * from "@/clamp";
20
- export * from "@/compare";
21
30
  export * from "@/runtime";
22
- export * from "@/unique";
23
- export * from "@/kv";
31
+ export * from "@/search";
32
+ export * from "@/shallowCopy";
24
33
  export * from "@/spatial";
25
- export * from "@/url";
34
+ export * from "@/telem";
26
35
  export * from "@/toArray";
27
- export * from "@/case";
28
- export * from "@/search";
29
- export * from "@/destructor";
30
- export * from "@/worker/worker";
31
36
  export * from "@/transform";
32
- export * from "@/binary";
33
- export * from "@/observe";
34
- export * from "@/change";
35
- export * from "@/shallowCopy";
36
- export * from "@/invert";
37
- export * from "@/migrate";
37
+ export * from "@/unique";
38
+ export * from "@/url";
39
+ export * from "@/worker";
package/src/invert.ts CHANGED
@@ -1 +1,10 @@
1
+ // Copyright 2024 Synnax Labs, Inc.
2
+ //
3
+ // Use of this software is governed by the Business Source License included in the file
4
+ // licenses/BSL.txt.
5
+ //
6
+ // As of the Change Date specified in that file, in accordance with the Business Source
7
+ // License, use of this software will be governed by the Apache License, Version 2.0,
8
+ // included in the file licenses/APL.txt.
9
+
1
10
  export const invert = (condition: boolean): -1 | 1 => (condition ? -1 : 1);