@wener/utils 1.1.50 → 1.1.53

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 (506) hide show
  1. package/lib/arrays/MaybeArray.js +58 -8
  2. package/lib/arrays/arrayFromAsync.js +254 -6
  3. package/lib/asyncs/AsyncInterval.js +145 -9
  4. package/lib/asyncs/MaybePromise.js +0 -2
  5. package/lib/asyncs/Promises.js +95 -48
  6. package/lib/asyncs/createAsyncIterator.js +313 -23
  7. package/lib/asyncs/createLazyPromise.js +72 -31
  8. package/lib/asyncs/createLazyPromise.test.js +367 -0
  9. package/lib/asyncs/firstOfAsyncIterator.js +6 -6
  10. package/lib/asyncs/generatorOfStream.js +125 -14
  11. package/lib/asyncs/isIterator.js +1 -3
  12. package/lib/asyncs/isPromise.js +2 -4
  13. package/lib/asyncs/isThenable.js +0 -2
  14. package/lib/asyncs/nextOfAsyncIterator.js +15 -9
  15. package/lib/asyncs/promiseOfCallback.js +2 -4
  16. package/lib/asyncs/timeout.js +122 -13
  17. package/lib/browsers/copy.js +7 -8
  18. package/lib/browsers/download.js +215 -40
  19. package/lib/browsers/getFileFromDataTransfer.js +17 -14
  20. package/lib/browsers/loaders.js +251 -18
  21. package/lib/crypto/base.js +3 -3
  22. package/lib/crypto/getNodeCrypto.js +3 -5
  23. package/lib/crypto/hashing.js +236 -30
  24. package/lib/crypto/hashing.test.js +323 -0
  25. package/lib/crypto/md5.bench.js +11 -11
  26. package/lib/crypto/md5.d.js +0 -2
  27. package/lib/crypto/md5.js +0 -2
  28. package/lib/crypto/md5.test.js +7 -0
  29. package/lib/crypto/pem/pem.js +197 -35
  30. package/lib/crypto/pem/pem.test.js +104 -0
  31. package/lib/crypto/randomUUIDv7.js +0 -2
  32. package/lib/crypto/ulid.js +84 -48
  33. package/lib/crypto/ulid.test.js +115 -0
  34. package/lib/emitter/types.js +0 -2
  35. package/lib/errors/DetailError.js +297 -0
  36. package/lib/errors/Errors.js +2 -202
  37. package/lib/errors/Errors.mod.js +206 -0
  38. package/lib/errors/Errors.test.js +24 -0
  39. package/lib/fetch/HttpStatus.js +1 -3
  40. package/lib/fetch/createFetchWith.js +188 -19
  41. package/lib/fetch/createFetchWithLogging.js +17 -16
  42. package/lib/fetch/createFetchWithRetry.js +40 -24
  43. package/lib/fetch/dumpRequest.js +467 -41
  44. package/lib/fetch/dumpRequest.test.js +384 -0
  45. package/lib/fetch/dumpResponse.js +271 -16
  46. package/lib/fetch/dumpResponse.test.js +393 -0
  47. package/lib/fetch/http.types.js +0 -2
  48. package/lib/fetch/index.js +5 -7
  49. package/lib/fetch/isTextContentType.js +5 -0
  50. package/lib/fetch/resolveRequest.js +7 -0
  51. package/lib/fetch/types.js +0 -2
  52. package/lib/i18n/createTranslate.js +40 -20
  53. package/lib/i18n/createTranslate.test.js +177 -0
  54. package/lib/index.js +75 -75
  55. package/lib/io/AbstractEncoding.js +0 -2
  56. package/lib/io/ArrayBuffer.test-d.js +4 -6
  57. package/lib/io/ArrayBuffers.base64.test.js +60 -0
  58. package/lib/io/ArrayBuffers.js +2 -334
  59. package/lib/io/ArrayBuffers.mod.js +531 -0
  60. package/lib/io/ArrayBuffers.test.js +77 -0
  61. package/lib/io/Buffer.js +190 -20
  62. package/lib/io/Buffer.test.js +22 -0
  63. package/lib/io/ByteBuffer.js +752 -441
  64. package/lib/io/ByteBuffer.test.js +184 -0
  65. package/lib/io/base64.js +17 -19
  66. package/lib/io/dump.js +16 -16
  67. package/lib/io/isBuffer.js +2 -3
  68. package/lib/io/isBuffer.test.js +8 -0
  69. package/lib/io/isTransferable.js +16 -8
  70. package/lib/io/isTransferable.test.js +17 -0
  71. package/lib/io/parseDataUri.js +288 -40
  72. package/lib/io/parseDataUri.test.js +286 -0
  73. package/lib/io/types.js +1 -0
  74. package/lib/langs/AsyncCloser.js +276 -0
  75. package/lib/langs/Closer.js +100 -0
  76. package/lib/langs/MaybeFunction.js +38 -5
  77. package/lib/langs/classOf.js +0 -2
  78. package/lib/langs/deepEqual.js +82 -22
  79. package/lib/langs/deepEqual.test.js +11 -0
  80. package/lib/langs/deepFreeze.js +28 -9
  81. package/lib/langs/getGlobalStates.js +19 -7
  82. package/lib/langs/getObjectId.js +4 -6
  83. package/lib/langs/ifPresent.js +3 -0
  84. package/lib/langs/isClass.js +0 -2
  85. package/lib/langs/isDefined.js +0 -2
  86. package/lib/langs/isEmptyObject.js +1 -3
  87. package/lib/langs/isFunction.js +0 -2
  88. package/lib/langs/isNil.js +3 -0
  89. package/lib/langs/isPlainObject.js +2 -4
  90. package/lib/langs/langs.test.js +126 -0
  91. package/lib/langs/memoize.js +11 -7
  92. package/lib/langs/mixin.js +7 -4
  93. package/lib/langs/mixin.test.js +135 -0
  94. package/lib/langs/parseBoolean.js +11 -8
  95. package/lib/langs/shallowClone.js +5 -3
  96. package/lib/langs/shallowEqual.js +8 -6
  97. package/lib/libs/ms.js +28 -26
  98. package/lib/libs/ms.test.js +301 -0
  99. package/lib/logger/const.js +15 -0
  100. package/lib/logger/index.js +1 -0
  101. package/lib/logger/types.js +1 -0
  102. package/lib/maths/clamp.js +81 -12
  103. package/lib/maths/clamp.test.js +186 -0
  104. package/lib/maths/createRandom.test.js +36 -0
  105. package/lib/maths/random.js +162 -13
  106. package/lib/modules/isModule.js +0 -2
  107. package/lib/modules/parseModuleId.js +14 -15
  108. package/lib/modules/parseModuleId.test.js +153 -0
  109. package/lib/objects/computeIfAbsent.js +8 -3
  110. package/lib/objects/get.js +26 -8
  111. package/lib/objects/get.test-d.js +23 -25
  112. package/lib/objects/merge/index.js +1 -3
  113. package/lib/objects/merge/isMergeableObject.js +5 -3
  114. package/lib/objects/merge/merge.js +82 -26
  115. package/lib/objects/merge/merge.test.js +1397 -0
  116. package/lib/objects/parseObjectPath.js +47 -15
  117. package/lib/objects/parseObjectPath.test.js +138 -0
  118. package/lib/objects/set.js +25 -19
  119. package/lib/objects/set.test.js +522 -0
  120. package/lib/schema/typebox/index.js +2 -3
  121. package/lib/schema/typebox/typebox.js +6 -6
  122. package/lib/scripts/getGenerateContext.js +386 -76
  123. package/lib/server/crypto/md5.js +0 -2
  124. package/lib/server/fetch/createFetchWithProxy.js +2 -4
  125. package/lib/server/fetch/createFetchWithProxyByNodeFetch.js +258 -31
  126. package/lib/server/fetch/createFetchWithProxyByUndici.js +307 -49
  127. package/lib/server/getPackageDir.js +2 -3
  128. package/lib/server/index.js +5 -7
  129. package/lib/server/jsdom.js +1 -3
  130. package/lib/server/node-fetch.js +2 -4
  131. package/lib/server/polyfill/polyfillBrowser.js +163 -9
  132. package/lib/server/polyfill/polyfillBrowser.test.js +164 -0
  133. package/lib/server/polyfill/polyfillCrypto.js +157 -9
  134. package/lib/server/polyfill/polyfillFetch.js +13 -13
  135. package/lib/server/polyfill/polyfillJsDom.js +264 -58
  136. package/lib/server/polyfill/polyfillWebSocket.js +11 -11
  137. package/lib/server/ws.js +1 -3
  138. package/lib/strings/bytes.test.js +327 -0
  139. package/lib/strings/camelCase.js +23 -14
  140. package/lib/strings/formatBytes.js +29 -20
  141. package/lib/strings/parseBytes.js +54 -0
  142. package/lib/strings/renderTemplate.js +17 -12
  143. package/lib/strings/renderTemplate.test.js +104 -0
  144. package/lib/typedoc.js +2 -4
  145. package/lib/types.d.js +0 -2
  146. package/lib/validations/asserts.js +0 -2
  147. package/lib/validations/isUUID.js +0 -2
  148. package/lib/validations/isUUID.test.js +87 -0
  149. package/lib/validations/parseTimestamp.js +12 -7
  150. package/lib/validations/parseTimestamp.test.js +6 -0
  151. package/lib/{runtime → web}/getGlobalThis.js +3 -4
  152. package/lib/web/getRandomValues.js +44 -0
  153. package/lib/web/randomUUID.js +15 -0
  154. package/lib/web/requestIdleCallback.js +17 -0
  155. package/lib/{runtime → web}/structuredClone.js +35 -28
  156. package/lib/web/structuredClone.test.js +81 -0
  157. package/package.json +10 -18
  158. package/src/arrays/MaybeArray.ts +22 -22
  159. package/src/arrays/arrayFromAsync.ts +3 -3
  160. package/src/asyncs/AsyncInterval.ts +8 -8
  161. package/src/asyncs/Promises.ts +51 -51
  162. package/src/asyncs/createAsyncIterator.ts +34 -34
  163. package/src/asyncs/createLazyPromise.test.ts +73 -73
  164. package/src/asyncs/createLazyPromise.ts +68 -73
  165. package/src/asyncs/firstOfAsyncIterator.ts +5 -5
  166. package/src/asyncs/generatorOfStream.ts +12 -12
  167. package/src/asyncs/isIterator.ts +1 -1
  168. package/src/asyncs/isThenable.ts +2 -2
  169. package/src/asyncs/nextOfAsyncIterator.ts +20 -20
  170. package/src/asyncs/promiseOfCallback.ts +13 -13
  171. package/src/asyncs/timeout.ts +23 -23
  172. package/src/browsers/copy.ts +48 -48
  173. package/src/browsers/download.ts +38 -36
  174. package/src/browsers/getFileFromDataTransfer.ts +35 -35
  175. package/src/browsers/loaders.ts +49 -49
  176. package/src/crypto/base.ts +3 -3
  177. package/src/crypto/getNodeCrypto.ts +3 -3
  178. package/src/crypto/hashing.test.ts +34 -48
  179. package/src/crypto/hashing.ts +67 -67
  180. package/src/crypto/md5.bench.ts +20 -24
  181. package/src/crypto/md5.test.ts +3 -3
  182. package/src/crypto/pem/pem.test.ts +26 -42
  183. package/src/crypto/pem/pem.ts +65 -65
  184. package/src/crypto/ulid.test.ts +32 -32
  185. package/src/crypto/ulid.ts +117 -117
  186. package/src/emitter/types.ts +6 -6
  187. package/src/errors/DetailError.ts +151 -0
  188. package/src/errors/Errors.mod.ts +104 -0
  189. package/src/errors/Errors.test.ts +15 -15
  190. package/src/errors/Errors.ts +1 -247
  191. package/src/fetch/HttpStatus.ts +77 -77
  192. package/src/fetch/createFetchWith.ts +27 -27
  193. package/src/fetch/createFetchWithLogging.ts +13 -16
  194. package/src/fetch/createFetchWithRetry.ts +80 -80
  195. package/src/fetch/dumpRequest.test.ts +176 -0
  196. package/src/fetch/dumpRequest.ts +149 -52
  197. package/src/fetch/dumpResponse.test.ts +160 -0
  198. package/src/fetch/dumpResponse.ts +48 -20
  199. package/src/fetch/http.types.ts +35 -35
  200. package/src/fetch/isTextContentType.ts +12 -0
  201. package/src/fetch/resolveRequest.ts +1 -0
  202. package/src/fetch/types.ts +2 -2
  203. package/src/i18n/createTranslate.test.ts +90 -113
  204. package/src/i18n/createTranslate.ts +55 -55
  205. package/src/index.ts +26 -27
  206. package/src/io/AbstractEncoding.ts +12 -12
  207. package/src/io/ArrayBuffer.test-d.ts +1 -1
  208. package/src/io/ArrayBuffers.base64.test.ts +52 -52
  209. package/src/io/ArrayBuffers.mod.ts +670 -0
  210. package/src/io/ArrayBuffers.test.ts +14 -14
  211. package/src/io/ArrayBuffers.ts +1 -446
  212. package/src/io/Buffer.test.ts +17 -17
  213. package/src/io/Buffer.ts +17 -17
  214. package/src/io/ByteBuffer.test.ts +37 -37
  215. package/src/io/ByteBuffer.ts +574 -566
  216. package/src/io/base64.ts +46 -44
  217. package/src/io/dump.ts +22 -22
  218. package/src/io/isBuffer.test.ts +2 -2
  219. package/src/io/isBuffer.ts +1 -1
  220. package/src/io/isTransferable.test.ts +4 -4
  221. package/src/io/isTransferable.ts +30 -30
  222. package/src/io/parseDataUri.test.ts +22 -27
  223. package/src/io/parseDataUri.ts +57 -57
  224. package/src/io/types.ts +13 -0
  225. package/src/langs/AsyncCloser.ts +45 -0
  226. package/src/langs/Closer.ts +39 -0
  227. package/src/langs/MaybeFunction.ts +5 -5
  228. package/src/langs/classOf.ts +1 -1
  229. package/src/langs/deepEqual.test.ts +1 -12
  230. package/src/langs/deepEqual.ts +82 -82
  231. package/src/langs/deepFreeze.ts +11 -11
  232. package/src/langs/getGlobalStates.ts +21 -11
  233. package/src/langs/getObjectId.ts +10 -13
  234. package/src/langs/ifPresent.ts +3 -0
  235. package/src/langs/isClass.ts +1 -1
  236. package/src/langs/isDefined.ts +1 -1
  237. package/src/langs/isEmptyObject.ts +1 -1
  238. package/src/langs/isFunction.ts +1 -1
  239. package/src/langs/isNil.ts +3 -0
  240. package/src/langs/isPlainObject.ts +4 -4
  241. package/src/langs/langs.test.ts +18 -18
  242. package/src/langs/memoize.ts +21 -21
  243. package/src/langs/mixin.test.ts +22 -26
  244. package/src/langs/mixin.ts +6 -9
  245. package/src/langs/parseBoolean.ts +30 -26
  246. package/src/langs/shallowClone.ts +11 -11
  247. package/src/langs/shallowEqual.ts +19 -19
  248. package/src/libs/ms.test.ts +274 -274
  249. package/src/libs/ms.ts +137 -137
  250. package/src/logger/const.ts +18 -0
  251. package/src/logger/index.ts +2 -0
  252. package/src/logger/types.ts +10 -0
  253. package/src/maths/clamp.test.ts +18 -18
  254. package/src/maths/clamp.ts +17 -17
  255. package/src/maths/createRandom.test.ts +12 -0
  256. package/src/maths/random.ts +50 -14
  257. package/src/modules/isModule.ts +4 -4
  258. package/src/modules/parseModuleId.test.ts +61 -68
  259. package/src/modules/parseModuleId.ts +29 -43
  260. package/src/objects/computeIfAbsent.ts +10 -10
  261. package/src/objects/get.test-d.ts +33 -51
  262. package/src/objects/get.ts +31 -31
  263. package/src/objects/merge/isMergeableObject.ts +5 -5
  264. package/src/objects/merge/merge.test.ts +658 -880
  265. package/src/objects/merge/merge.ts +84 -84
  266. package/src/objects/parseObjectPath.test.ts +13 -13
  267. package/src/objects/parseObjectPath.ts +25 -25
  268. package/src/objects/set.test.ts +271 -366
  269. package/src/objects/set.ts +36 -36
  270. package/src/schema/typebox/typebox.ts +20 -26
  271. package/src/scripts/getGenerateContext.ts +82 -80
  272. package/src/server/crypto/md5.ts +1 -1
  273. package/src/server/fetch/createFetchWithProxyByNodeFetch.ts +30 -33
  274. package/src/server/fetch/createFetchWithProxyByUndici.ts +64 -70
  275. package/src/server/getPackageDir.ts +7 -7
  276. package/src/server/polyfill/polyfillBrowser.test.ts +10 -10
  277. package/src/server/polyfill/polyfillBrowser.ts +3 -3
  278. package/src/server/polyfill/polyfillCrypto.ts +7 -7
  279. package/src/server/polyfill/polyfillFetch.ts +11 -21
  280. package/src/server/polyfill/polyfillJsDom.ts +60 -72
  281. package/src/server/polyfill/polyfillWebSocket.ts +15 -15
  282. package/src/strings/bytes.test.ts +69 -0
  283. package/src/strings/camelCase.ts +58 -63
  284. package/src/strings/formatBytes.ts +50 -29
  285. package/src/strings/parseBytes.ts +66 -0
  286. package/src/strings/renderTemplate.test.ts +10 -17
  287. package/src/strings/renderTemplate.ts +19 -22
  288. package/src/types.d.ts +9 -9
  289. package/src/validations/asserts.ts +8 -8
  290. package/src/validations/isUUID.test.ts +9 -9
  291. package/src/validations/isUUID.ts +1 -1
  292. package/src/validations/parseTimestamp.test.ts +2 -2
  293. package/src/validations/parseTimestamp.ts +21 -21
  294. package/src/{runtime → web}/getGlobalThis.ts +6 -6
  295. package/src/web/getRandomValues.ts +41 -0
  296. package/src/web/randomUUID.ts +19 -0
  297. package/src/web/requestIdleCallback.ts +11 -0
  298. package/src/{runtime → web}/structuredClone.test.ts +8 -8
  299. package/src/web/structuredClone.ts +88 -0
  300. package/tsconfig.json +35 -34
  301. package/lib/arrays/MaybeArray.js.map +0 -1
  302. package/lib/arrays/arrayFromAsync.js.map +0 -1
  303. package/lib/asyncs/AsyncInterval.js.map +0 -1
  304. package/lib/asyncs/MaybePromise.js.map +0 -1
  305. package/lib/asyncs/Promises.js.map +0 -1
  306. package/lib/asyncs/createAsyncIterator.js.map +0 -1
  307. package/lib/asyncs/createLazyPromise.js.map +0 -1
  308. package/lib/asyncs/firstOfAsyncIterator.js.map +0 -1
  309. package/lib/asyncs/generatorOfStream.js.map +0 -1
  310. package/lib/asyncs/isIterator.js.map +0 -1
  311. package/lib/asyncs/isPromise.js.map +0 -1
  312. package/lib/asyncs/isThenable.js.map +0 -1
  313. package/lib/asyncs/nextOfAsyncIterator.js.map +0 -1
  314. package/lib/asyncs/promiseOfCallback.js.map +0 -1
  315. package/lib/asyncs/timeout.js.map +0 -1
  316. package/lib/browsers/copy.js.map +0 -1
  317. package/lib/browsers/download.js.map +0 -1
  318. package/lib/browsers/getFileFromDataTransfer.js.map +0 -1
  319. package/lib/browsers/loaders.js.map +0 -1
  320. package/lib/cn/division/DivisionCode.js +0 -209
  321. package/lib/cn/division/DivisionCode.js.map +0 -1
  322. package/lib/cn/division/binarySearch.js +0 -27
  323. package/lib/cn/division/binarySearch.js.map +0 -1
  324. package/lib/cn/formatChineseAmount.js +0 -77
  325. package/lib/cn/formatChineseAmount.js.map +0 -1
  326. package/lib/cn/id/Mod11.js +0 -43
  327. package/lib/cn/id/Mod11.js.map +0 -1
  328. package/lib/cn/id/ResidentIdNumber.js +0 -98
  329. package/lib/cn/id/ResidentIdNumber.js.map +0 -1
  330. package/lib/cn/id/types.js +0 -8
  331. package/lib/cn/id/types.js.map +0 -1
  332. package/lib/cn/index.js +0 -14
  333. package/lib/cn/index.js.map +0 -1
  334. package/lib/cn/parseChineseNumber.js +0 -94
  335. package/lib/cn/parseChineseNumber.js.map +0 -1
  336. package/lib/cn/pinyin/cartesianProduct.js +0 -22
  337. package/lib/cn/pinyin/cartesianProduct.js.map +0 -1
  338. package/lib/cn/pinyin/data.json +0 -413
  339. package/lib/cn/pinyin/loader.js +0 -15
  340. package/lib/cn/pinyin/loader.js.map +0 -1
  341. package/lib/cn/pinyin/preload.js +0 -4
  342. package/lib/cn/pinyin/preload.js.map +0 -1
  343. package/lib/cn/pinyin/toPinyinPure.js +0 -32
  344. package/lib/cn/pinyin/toPinyinPure.js.map +0 -1
  345. package/lib/cn/pinyin/transform.js +0 -14
  346. package/lib/cn/pinyin/transform.js.map +0 -1
  347. package/lib/cn/types.js +0 -3
  348. package/lib/cn/types.js.map +0 -1
  349. package/lib/cn/uscc/Mod31.js +0 -49
  350. package/lib/cn/uscc/Mod31.js.map +0 -1
  351. package/lib/cn/uscc/USCC.js +0 -94
  352. package/lib/cn/uscc/USCC.js.map +0 -1
  353. package/lib/cn/uscc/isUSCC.js +0 -8
  354. package/lib/cn/uscc/isUSCC.js.map +0 -1
  355. package/lib/crypto/base.js.map +0 -1
  356. package/lib/crypto/getNodeCrypto.js.map +0 -1
  357. package/lib/crypto/getRandomValues.js +0 -36
  358. package/lib/crypto/getRandomValues.js.map +0 -1
  359. package/lib/crypto/hashing.js.map +0 -1
  360. package/lib/crypto/md5.bench.js.map +0 -1
  361. package/lib/crypto/md5.d.js.map +0 -1
  362. package/lib/crypto/md5.js.map +0 -1
  363. package/lib/crypto/pem/pem.js.map +0 -1
  364. package/lib/crypto/randomUUID.js +0 -16
  365. package/lib/crypto/randomUUID.js.map +0 -1
  366. package/lib/crypto/randomUUIDv7.js.map +0 -1
  367. package/lib/crypto/ulid.js.map +0 -1
  368. package/lib/emitter/types.js.map +0 -1
  369. package/lib/errors/Errors.js.map +0 -1
  370. package/lib/fetch/HttpStatus.js.map +0 -1
  371. package/lib/fetch/createFetchWith.js.map +0 -1
  372. package/lib/fetch/createFetchWithLogging.js.map +0 -1
  373. package/lib/fetch/createFetchWithRetry.js.map +0 -1
  374. package/lib/fetch/dumpRequest.js.map +0 -1
  375. package/lib/fetch/dumpResponse.js.map +0 -1
  376. package/lib/fetch/http.types.js.map +0 -1
  377. package/lib/fetch/index.js.map +0 -1
  378. package/lib/fetch/types.js.map +0 -1
  379. package/lib/i18n/createTranslate.js.map +0 -1
  380. package/lib/index.js.map +0 -1
  381. package/lib/io/AbstractEncoding.js.map +0 -1
  382. package/lib/io/ArrayBuffer.test-d.js.map +0 -1
  383. package/lib/io/ArrayBuffers.js.map +0 -1
  384. package/lib/io/Buffer.js.map +0 -1
  385. package/lib/io/ByteBuffer.js.map +0 -1
  386. package/lib/io/base64.js.map +0 -1
  387. package/lib/io/dump.js.map +0 -1
  388. package/lib/io/isBuffer.js.map +0 -1
  389. package/lib/io/isTransferable.js.map +0 -1
  390. package/lib/io/parseDataUri.js.map +0 -1
  391. package/lib/langs/MaybeFunction.js.map +0 -1
  392. package/lib/langs/classOf.js.map +0 -1
  393. package/lib/langs/deepEqual.js.map +0 -1
  394. package/lib/langs/deepFreeze.js.map +0 -1
  395. package/lib/langs/getGlobalStates.js.map +0 -1
  396. package/lib/langs/getObjectId.js.map +0 -1
  397. package/lib/langs/isClass.js.map +0 -1
  398. package/lib/langs/isDefined.js.map +0 -1
  399. package/lib/langs/isEmptyObject.js.map +0 -1
  400. package/lib/langs/isFunction.js.map +0 -1
  401. package/lib/langs/isNullish.js +0 -5
  402. package/lib/langs/isNullish.js.map +0 -1
  403. package/lib/langs/isPlainObject.js.map +0 -1
  404. package/lib/langs/memoize.js.map +0 -1
  405. package/lib/langs/mixin.js.map +0 -1
  406. package/lib/langs/parseBoolean.js.map +0 -1
  407. package/lib/langs/shallowClone.js.map +0 -1
  408. package/lib/langs/shallowEqual.js.map +0 -1
  409. package/lib/libs/ms.js.map +0 -1
  410. package/lib/logging/Logger.js +0 -5
  411. package/lib/logging/Logger.js.map +0 -1
  412. package/lib/logging/createChildLogger.js +0 -16
  413. package/lib/logging/createChildLogger.js.map +0 -1
  414. package/lib/logging/createLogger.js +0 -63
  415. package/lib/logging/createLogger.js.map +0 -1
  416. package/lib/logging/createNoopLogger.js +0 -13
  417. package/lib/logging/createNoopLogger.js.map +0 -1
  418. package/lib/logging/slog.js +0 -143
  419. package/lib/logging/slog.js.map +0 -1
  420. package/lib/maths/clamp.js.map +0 -1
  421. package/lib/maths/random.js.map +0 -1
  422. package/lib/mitt/index.js +0 -77
  423. package/lib/mitt/index.js.map +0 -1
  424. package/lib/modules/isModule.js.map +0 -1
  425. package/lib/modules/parseModuleId.js.map +0 -1
  426. package/lib/objects/computeIfAbsent.js.map +0 -1
  427. package/lib/objects/get.js.map +0 -1
  428. package/lib/objects/get.test-d.js.map +0 -1
  429. package/lib/objects/merge/index.js.map +0 -1
  430. package/lib/objects/merge/isMergeableObject.js.map +0 -1
  431. package/lib/objects/merge/merge.js.map +0 -1
  432. package/lib/objects/parseObjectPath.js.map +0 -1
  433. package/lib/objects/set.js.map +0 -1
  434. package/lib/runtime/AsyncCloser.js +0 -40
  435. package/lib/runtime/AsyncCloser.js.map +0 -1
  436. package/lib/runtime/Closer.js +0 -34
  437. package/lib/runtime/Closer.js.map +0 -1
  438. package/lib/runtime/getGlobalThis.js.map +0 -1
  439. package/lib/runtime/structuredClone.js.map +0 -1
  440. package/lib/schema/typebox/index.js.map +0 -1
  441. package/lib/schema/typebox/typebox.js.map +0 -1
  442. package/lib/scripts/getGenerateContext.js.map +0 -1
  443. package/lib/server/crypto/md5.js.map +0 -1
  444. package/lib/server/fetch/createFetchWithProxy.js.map +0 -1
  445. package/lib/server/fetch/createFetchWithProxyByNodeFetch.js.map +0 -1
  446. package/lib/server/fetch/createFetchWithProxyByUndici.js.map +0 -1
  447. package/lib/server/getPackageDir.js.map +0 -1
  448. package/lib/server/index.js.map +0 -1
  449. package/lib/server/jsdom.js.map +0 -1
  450. package/lib/server/node-fetch.js.map +0 -1
  451. package/lib/server/polyfill/polyfillBrowser.js.map +0 -1
  452. package/lib/server/polyfill/polyfillCrypto.js.map +0 -1
  453. package/lib/server/polyfill/polyfillFetch.js.map +0 -1
  454. package/lib/server/polyfill/polyfillJsDom.js.map +0 -1
  455. package/lib/server/polyfill/polyfillWebSocket.js.map +0 -1
  456. package/lib/server/ws.js.map +0 -1
  457. package/lib/strings/camelCase.js.map +0 -1
  458. package/lib/strings/formatBytes.js.map +0 -1
  459. package/lib/strings/renderTemplate.js.map +0 -1
  460. package/lib/typedoc.js.map +0 -1
  461. package/lib/types.d.js.map +0 -1
  462. package/lib/validations/asserts.js.map +0 -1
  463. package/lib/validations/isUUID.js.map +0 -1
  464. package/lib/validations/parseTimestamp.js.map +0 -1
  465. package/src/cn/README.md +0 -3
  466. package/src/cn/division/DivisionCode.ts +0 -155
  467. package/src/cn/division/binarySearch.test.ts +0 -64
  468. package/src/cn/division/binarySearch.ts +0 -25
  469. package/src/cn/division/division.test.ts +0 -6
  470. package/src/cn/formatChineseAmount.ts +0 -61
  471. package/src/cn/id/Mod11.ts +0 -26
  472. package/src/cn/id/ResidentIdNumber.ts +0 -126
  473. package/src/cn/id/id.test.ts +0 -20
  474. package/src/cn/id/types.ts +0 -26
  475. package/src/cn/index.ts +0 -17
  476. package/src/cn/parseChineseNumber.test.ts +0 -159
  477. package/src/cn/parseChineseNumber.ts +0 -97
  478. package/src/cn/pinyin/cartesianProduct.test.ts +0 -64
  479. package/src/cn/pinyin/cartesianProduct.ts +0 -24
  480. package/src/cn/pinyin/data.json +0 -413
  481. package/src/cn/pinyin/loader.ts +0 -12
  482. package/src/cn/pinyin/preload.ts +0 -3
  483. package/src/cn/pinyin/toPinyin.test.ts +0 -12
  484. package/src/cn/pinyin/toPinyinPure.ts +0 -43
  485. package/src/cn/pinyin/transform.ts +0 -12
  486. package/src/cn/scripts/gen.test.ts +0 -131
  487. package/src/cn/types.ts +0 -11
  488. package/src/cn/uscc/Mod31.ts +0 -38
  489. package/src/cn/uscc/USCC.ts +0 -94
  490. package/src/cn/uscc/isUSCC.ts +0 -8
  491. package/src/cn/uscc/uscc.test.ts +0 -16
  492. package/src/crypto/getRandomValues.ts +0 -41
  493. package/src/crypto/randomUUID.ts +0 -19
  494. package/src/langs/isNullish.ts +0 -3
  495. package/src/logging/Logger.ts +0 -25
  496. package/src/logging/createChildLogger.ts +0 -16
  497. package/src/logging/createLogger.ts +0 -50
  498. package/src/logging/createNoopLogger.ts +0 -13
  499. package/src/logging/logger.test.ts +0 -36
  500. package/src/logging/slog.test.ts +0 -8
  501. package/src/logging/slog.ts +0 -221
  502. package/src/mitt/README.md +0 -1
  503. package/src/mitt/index.ts +0 -114
  504. package/src/runtime/AsyncCloser.ts +0 -45
  505. package/src/runtime/Closer.ts +0 -39
  506. package/src/runtime/structuredClone.ts +0 -88
@@ -1,912 +1,690 @@
1
1
  import { assert, describe, test } from 'vitest';
2
+ import { isPlainObject } from '../../langs/isPlainObject';
2
3
  import { merge, type MergeOptions } from './merge';
3
4
 
4
5
  describe('custom-array-merge', () => {
5
- test('custom merge array', () => {
6
- var mergeFunctionCalled = false;
7
-
8
- function overwriteMerge(_target: any, source: any, options: any) {
9
- mergeFunctionCalled = true;
10
- assert.equal(options.arrayMerge, overwriteMerge);
11
-
12
- return source;
13
- }
14
-
15
- const destination = {
16
- someArray: [1, 2],
17
- someObject: { what: 'yes' },
18
- };
19
- const source = {
20
- someArray: [1, 2, 3],
21
- };
22
-
23
- const actual = merge(destination, source, { arrayMerge: overwriteMerge });
24
- const expected = {
25
- someArray: [1, 2, 3],
26
- someObject: { what: 'yes' },
27
- };
28
- assert.isTrue(mergeFunctionCalled);
29
- assert.deepEqual(actual, expected);
30
- });
31
-
32
- test('merge top-level arrays', function () {
33
- function overwriteMerge(_a: any, b: any) {
34
- return b;
35
- }
36
-
37
- var actual = merge([1, 2], [1, 2], { arrayMerge: overwriteMerge });
38
- var expected = [1, 2];
39
-
40
- assert.deepEqual(actual, expected);
41
- });
42
-
43
- test('cloner function is available for merge functions to use', function () {
44
- var customMergeWasCalled = false;
45
-
46
- function cloneMerge(target: any, source: any, options: any) {
47
- customMergeWasCalled = true;
48
- assert.isTrue(!!options.cloneUnlessOtherwiseSpecified, 'cloner function is available');
49
- return target.concat(source).map(function (element: any) {
50
- return options.cloneUnlessOtherwiseSpecified(element, options);
51
- });
52
- }
53
-
54
- var src = {
55
- key1: ['one', 'three'],
56
- key2: ['four'],
57
- };
58
- var target = {
59
- key1: ['one', 'two'],
60
- };
61
-
62
- var expected = {
63
- key1: ['one', 'two', 'one', 'three'],
64
- key2: ['four'],
65
- };
66
-
67
- assert.deepEqual(merge(target, src, { arrayMerge: cloneMerge }), expected);
68
- assert.isTrue(customMergeWasCalled);
69
- assert.isTrue(Array.isArray(merge(target, src).key1));
70
- assert.isTrue(Array.isArray((merge(target, src) as any).key2));
71
- });
6
+ test('custom merge array', () => {
7
+ var mergeFunctionCalled = false;
8
+
9
+ function overwriteMerge(_target: any, source: any, options: any) {
10
+ mergeFunctionCalled = true;
11
+ assert.equal(options.arrayMerge, overwriteMerge);
12
+
13
+ return source;
14
+ }
15
+
16
+ const destination = { someArray: [1, 2], someObject: { what: 'yes' } };
17
+ const source = { someArray: [1, 2, 3] };
18
+
19
+ const actual = merge(destination, source, { arrayMerge: overwriteMerge });
20
+ const expected = { someArray: [1, 2, 3], someObject: { what: 'yes' } };
21
+ assert.isTrue(mergeFunctionCalled);
22
+ assert.deepEqual(actual, expected);
23
+ });
24
+
25
+ test('merge top-level arrays', function () {
26
+ function overwriteMerge(_a: any, b: any) {
27
+ return b;
28
+ }
29
+
30
+ var actual = merge([1, 2], [1, 2], { arrayMerge: overwriteMerge });
31
+ var expected = [1, 2];
32
+
33
+ assert.deepEqual(actual, expected);
34
+ });
35
+
36
+ test('cloner function is available for merge functions to use', function () {
37
+ var customMergeWasCalled = false;
38
+
39
+ function cloneMerge(target: any, source: any, options: any) {
40
+ customMergeWasCalled = true;
41
+ assert.isTrue(!!options.cloneUnlessOtherwiseSpecified, 'cloner function is available');
42
+ return target.concat(source).map(function (element: any) {
43
+ return options.cloneUnlessOtherwiseSpecified(element, options);
44
+ });
45
+ }
46
+
47
+ var src = { key1: ['one', 'three'], key2: ['four'] };
48
+ var target = { key1: ['one', 'two'] };
49
+
50
+ var expected = { key1: ['one', 'two', 'one', 'three'], key2: ['four'] };
51
+
52
+ assert.deepEqual(merge(target, src, { arrayMerge: cloneMerge }), expected);
53
+ assert.isTrue(customMergeWasCalled);
54
+ assert.isTrue(Array.isArray(merge(target, src).key1));
55
+ assert.isTrue(Array.isArray((merge(target, src) as any).key2));
56
+ });
72
57
  });
73
58
 
74
59
  describe('custom-is-mergeable-object', () => {
75
- test(`isMergeableObject function copying object over object`, () => {
76
- const src = { key: { isMergeable: false }, baz: `yes` };
77
- const target = { key: { foo: `wat` }, baz: `whatever` };
60
+ test(`isMergeableObject function copying object over object`, () => {
61
+ const src = { key: { isMergeable: false }, baz: `yes` };
62
+ const target = { key: { foo: `wat` }, baz: `whatever` };
78
63
 
79
- function isMergeableObject(object: any) {
80
- return object && typeof object === `object` && object.isMergeable !== false;
81
- }
64
+ function isMergeableObject(object: any) {
65
+ return object && typeof object === `object` && object.isMergeable !== false;
66
+ }
82
67
 
83
- const res = merge(target, src, {
84
- isMergeableObject,
85
- });
68
+ const res = merge(target, src, { isMergeableObject });
86
69
 
87
- assert.deepEqual(res, { key: { isMergeable: false }, baz: `yes` });
88
- assert.equal(res.key, src.key, `Object has the same identity and was not cloned`);
89
- });
70
+ assert.deepEqual(res, { key: { isMergeable: false }, baz: `yes` });
71
+ assert.equal(res.key, src.key, `Object has the same identity and was not cloned`);
72
+ });
90
73
 
91
- test(`isMergeableObject function copying object over nothing`, () => {
92
- const src = { key: { isMergeable: false, foo: `bar` }, baz: `yes` };
93
- const target = { baz: `whatever` };
74
+ test(`isMergeableObject function copying object over nothing`, () => {
75
+ const src = { key: { isMergeable: false, foo: `bar` }, baz: `yes` };
76
+ const target = { baz: `whatever` };
94
77
 
95
- function isMergeableObject(object: any) {
96
- return object && typeof object === `object` && object.isMergeable !== false;
97
- }
78
+ function isMergeableObject(object: any) {
79
+ return object && typeof object === `object` && object.isMergeable !== false;
80
+ }
98
81
 
99
- const res: any = merge(target, src, {
100
- isMergeableObject,
101
- });
82
+ const res: any = merge(target, src, { isMergeableObject });
102
83
 
103
- assert.deepEqual(res, { key: { isMergeable: false, foo: `bar` }, baz: `yes` });
104
- assert.equal(res.key, src.key, `Object has the same identity and was not cloned`);
105
- });
84
+ assert.deepEqual(res, { key: { isMergeable: false, foo: `bar` }, baz: `yes` });
85
+ assert.equal(res.key, src.key, `Object has the same identity and was not cloned`);
86
+ });
106
87
 
107
- test(`example from readme`, () => {
108
- const { isPlainObject } = require(`is-plain-object`);
88
+ test(`example from readme`, () => {
89
+ class SuperSpecial {
90
+ special = `oh yeah man totally`;
91
+ }
109
92
 
110
- class SuperSpecial {
111
- special = `oh yeah man totally`;
112
- }
93
+ const instantiatedSpecialObject: any = new SuperSpecial();
113
94
 
114
- const instantiatedSpecialObject: any = new SuperSpecial();
95
+ const target = { someProperty: { cool: `oh for sure` } };
115
96
 
116
- const target = {
117
- someProperty: {
118
- cool: `oh for sure`,
119
- },
120
- };
97
+ const source = { someProperty: instantiatedSpecialObject };
121
98
 
122
- const source = {
123
- someProperty: instantiatedSpecialObject,
124
- };
99
+ const defaultOutput = merge(target, source);
125
100
 
126
- const defaultOutput = merge(target, source);
101
+ assert.equal(defaultOutput.someProperty.cool, `oh for sure`);
102
+ assert.equal(defaultOutput.someProperty.special, `oh yeah man totally`);
103
+ assert.equal(defaultOutput.someProperty instanceof SuperSpecial, false);
127
104
 
128
- assert.equal(defaultOutput.someProperty.cool, `oh for sure`);
129
- assert.equal(defaultOutput.someProperty.special, `oh yeah man totally`);
130
- assert.equal(defaultOutput.someProperty instanceof SuperSpecial, false);
105
+ const customMergeOutput = merge(target, source, { isMergeableObject: isPlainObject });
131
106
 
132
- const customMergeOutput = merge(target, source, {
133
- isMergeableObject: isPlainObject,
134
- });
135
-
136
- assert.equal(customMergeOutput.someProperty.cool, undefined);
137
- assert.equal(customMergeOutput.someProperty.special, `oh yeah man totally`);
138
- assert.equal(customMergeOutput.someProperty instanceof SuperSpecial, true);
139
- });
107
+ assert.equal(customMergeOutput.someProperty.cool, undefined);
108
+ assert.equal(customMergeOutput.someProperty.special, `oh yeah man totally`);
109
+ assert.equal(customMergeOutput.someProperty instanceof SuperSpecial, true);
110
+ });
140
111
  });
141
112
 
142
113
  describe('merge-all', () => {
143
- test('throw error if first argument is not an array', function () {
144
- assert.throws(merge.all.bind(null, { example: true } as any, { another: '2' } as any), Error);
145
- });
146
-
147
- test('return an empty object if first argument is an array with no elements', function () {
148
- assert.deepEqual(merge.all([]), {});
149
- });
150
-
151
- test('Work just fine if first argument is an array with least than two elements', function () {
152
- var actual = merge.all([{ example: true }]);
153
- var expected = { example: true };
154
- assert.deepEqual(actual, expected);
155
- });
156
-
157
- test('execute correctly if options object were not passed', function () {
158
- var arrayToMerge = [{ example: true }, { another: '123' }];
159
- assert.doesNotThrow(merge.all.bind(null, arrayToMerge));
160
- });
161
-
162
- test('execute correctly if options object were passed', function () {
163
- var arrayToMerge = [{ example: true }, { another: '123' }];
164
- assert.doesNotThrow(merge.all.bind(null, arrayToMerge, { clone: true }));
165
- });
166
-
167
- test('invoke merge on every item in array should result with all props', function () {
168
- var firstObject = { first: true };
169
- var secondObject = { second: false };
170
- var thirdObject = { third: 123 };
171
- var fourthObject = { fourth: 'some string' };
172
-
173
- var mergedObject = merge.all([firstObject, secondObject, thirdObject, fourthObject]);
174
-
175
- assert.isTrue(mergedObject.first === true);
176
- assert.isTrue(mergedObject.second === false);
177
- assert.isTrue(mergedObject.third === 123);
178
- assert.isTrue(mergedObject.fourth === 'some string');
179
- });
180
-
181
- test('invoke merge on every item in array with clone should clone all elements', function () {
182
- var firstObject = { a: { d: 123 } };
183
- var secondObject = { b: { e: true } };
184
- var thirdObject = { c: { f: 'string' } };
185
-
186
- var mergedWithClone = merge.all([firstObject, secondObject, thirdObject], { clone: true });
187
-
188
- assert.notEqual(mergedWithClone.a, firstObject.a);
189
- assert.notEqual(mergedWithClone.b, secondObject.b);
190
- assert.notEqual(mergedWithClone.c, thirdObject.c);
191
- });
192
-
193
- test('invoke merge on every item in array clone=false should not clone all elements', function () {
194
- var firstObject = { a: { d: 123 } };
195
- var secondObject = { b: { e: true } };
196
- var thirdObject = { c: { f: 'string' } };
197
-
198
- var mergedWithoutClone = merge.all([firstObject, secondObject, thirdObject], { clone: false });
199
-
200
- assert.equal(mergedWithoutClone.a, firstObject.a);
201
- assert.equal(mergedWithoutClone.b, secondObject.b);
202
- assert.equal(mergedWithoutClone.c, thirdObject.c);
203
- });
204
-
205
- test('invoke merge on every item in array without clone should clone all elements', function () {
206
- var firstObject = { a: { d: 123 } };
207
- var secondObject = { b: { e: true } };
208
- var thirdObject = { c: { f: 'string' } };
209
-
210
- var mergedWithoutClone = merge.all([firstObject, secondObject, thirdObject]);
211
-
212
- assert.notEqual(mergedWithoutClone.a, firstObject.a);
213
- assert.notEqual(mergedWithoutClone.b, secondObject.b);
214
- assert.notEqual(mergedWithoutClone.c, thirdObject.c);
215
- });
114
+ test('throw error if first argument is not an array', function () {
115
+ assert.throws(merge.all.bind(null, { example: true } as any, { another: '2' } as any), Error);
116
+ });
117
+
118
+ test('return an empty object if first argument is an array with no elements', function () {
119
+ assert.deepEqual(merge.all([]), {});
120
+ });
121
+
122
+ test('Work just fine if first argument is an array with least than two elements', function () {
123
+ var actual = merge.all([{ example: true }]);
124
+ var expected = { example: true };
125
+ assert.deepEqual(actual, expected);
126
+ });
127
+
128
+ test('execute correctly if options object were not passed', function () {
129
+ var arrayToMerge = [{ example: true }, { another: '123' }];
130
+ assert.doesNotThrow(merge.all.bind(null, arrayToMerge));
131
+ });
132
+
133
+ test('execute correctly if options object were passed', function () {
134
+ var arrayToMerge = [{ example: true }, { another: '123' }];
135
+ assert.doesNotThrow(merge.all.bind(null, arrayToMerge, { clone: true }));
136
+ });
137
+
138
+ test('invoke merge on every item in array should result with all props', function () {
139
+ var firstObject = { first: true };
140
+ var secondObject = { second: false };
141
+ var thirdObject = { third: 123 };
142
+ var fourthObject = { fourth: 'some string' };
143
+
144
+ var mergedObject = merge.all([firstObject, secondObject, thirdObject, fourthObject]);
145
+
146
+ assert.isTrue(mergedObject.first === true);
147
+ assert.isTrue(mergedObject.second === false);
148
+ assert.isTrue(mergedObject.third === 123);
149
+ assert.isTrue(mergedObject.fourth === 'some string');
150
+ });
151
+
152
+ test('invoke merge on every item in array with clone should clone all elements', function () {
153
+ var firstObject = { a: { d: 123 } };
154
+ var secondObject = { b: { e: true } };
155
+ var thirdObject = { c: { f: 'string' } };
156
+
157
+ var mergedWithClone = merge.all([firstObject, secondObject, thirdObject], { clone: true });
158
+
159
+ assert.notEqual(mergedWithClone.a, firstObject.a);
160
+ assert.notEqual(mergedWithClone.b, secondObject.b);
161
+ assert.notEqual(mergedWithClone.c, thirdObject.c);
162
+ });
163
+
164
+ test('invoke merge on every item in array clone=false should not clone all elements', function () {
165
+ var firstObject = { a: { d: 123 } };
166
+ var secondObject = { b: { e: true } };
167
+ var thirdObject = { c: { f: 'string' } };
168
+
169
+ var mergedWithoutClone = merge.all([firstObject, secondObject, thirdObject], { clone: false });
170
+
171
+ assert.equal(mergedWithoutClone.a, firstObject.a);
172
+ assert.equal(mergedWithoutClone.b, secondObject.b);
173
+ assert.equal(mergedWithoutClone.c, thirdObject.c);
174
+ });
175
+
176
+ test('invoke merge on every item in array without clone should clone all elements', function () {
177
+ var firstObject = { a: { d: 123 } };
178
+ var secondObject = { b: { e: true } };
179
+ var thirdObject = { c: { f: 'string' } };
180
+
181
+ var mergedWithoutClone = merge.all([firstObject, secondObject, thirdObject]);
182
+
183
+ assert.notEqual(mergedWithoutClone.a, firstObject.a);
184
+ assert.notEqual(mergedWithoutClone.b, secondObject.b);
185
+ assert.notEqual(mergedWithoutClone.c, thirdObject.c);
186
+ });
216
187
  });
217
188
 
218
189
  describe('merge', () => {
219
- test('add keys in target that do not exist at the root', function () {
220
- var src = { key1: 'value1', key2: 'value2' };
221
- var target = {};
222
-
223
- var res = merge(target, src);
224
-
225
- assert.deepEqual(target, {}, 'merge should be immutable');
226
- assert.deepEqual(res, src);
227
- });
228
-
229
- test('merge existing simple keys in target at the roots', function () {
230
- var src = { key1: 'changed', key2: 'value2' };
231
- var target = { key1: 'value1', key3: 'value3' };
232
-
233
- var expected = {
234
- key1: 'changed',
235
- key2: 'value2',
236
- key3: 'value3',
237
- };
238
-
239
- assert.deepEqual(target, { key1: 'value1', key3: 'value3' });
240
- assert.deepEqual(merge(target, src), expected);
241
- });
242
-
243
- test('merge nested objects into target', function () {
244
- var src = {
245
- key1: {
246
- subkey1: 'changed',
247
- subkey3: 'added',
248
- },
249
- };
250
- var target = {
251
- key1: {
252
- subkey1: 'value1',
253
- subkey2: 'value2',
254
- },
255
- };
256
-
257
- var expected = {
258
- key1: {
259
- subkey1: 'changed',
260
- subkey2: 'value2',
261
- subkey3: 'added',
262
- },
263
- };
264
-
265
- assert.deepEqual(target, {
266
- key1: {
267
- subkey1: 'value1',
268
- subkey2: 'value2',
269
- },
270
- });
271
- assert.deepEqual(merge(target, src), expected);
272
- });
273
-
274
- test('replace simple key with nested object in target', function () {
275
- var src = {
276
- key1: {
277
- subkey1: 'subvalue1',
278
- subkey2: 'subvalue2',
279
- },
280
- };
281
- var target = {
282
- key1: 'value1',
283
- key2: 'value2',
284
- };
285
-
286
- var expected = {
287
- key1: {
288
- subkey1: 'subvalue1',
289
- subkey2: 'subvalue2',
290
- },
291
- key2: 'value2',
292
- };
293
-
294
- assert.deepEqual(target, { key1: 'value1', key2: 'value2' });
295
- assert.deepEqual(merge(target, src), expected);
296
- });
297
-
298
- test('should add nested object in target', function () {
299
- var src = {
300
- b: {
301
- c: {},
302
- },
303
- };
304
-
305
- var target = {
306
- a: {},
307
- };
308
-
309
- var expected = {
310
- a: {},
311
- b: {
312
- c: {},
313
- },
314
- };
315
-
316
- assert.deepEqual(merge(target, src), expected);
317
- });
318
-
319
- test('should clone source and target', function () {
320
- var src = {
321
- b: {
322
- c: 'foo',
323
- },
324
- };
325
-
326
- var target = {
327
- a: {
328
- d: 'bar',
329
- },
330
- };
331
-
332
- var expected = {
333
- a: {
334
- d: 'bar',
335
- },
336
- b: {
337
- c: 'foo',
338
- },
339
- };
340
-
341
- var merged = merge(target, src, { clone: true });
342
-
343
- assert.deepEqual(merged, expected);
344
-
345
- assert.notEqual(merged.a, target.a);
346
- assert.notEqual(merged.b, src.b);
347
- });
348
-
349
- test('should clone source and target', function () {
350
- var src = {
351
- b: {
352
- c: 'foo',
353
- },
354
- };
355
-
356
- var target = {
357
- a: {
358
- d: 'bar',
359
- },
360
- };
361
-
362
- var merged = merge(target, src);
363
- assert.notEqual(merged.a, target.a);
364
- assert.notEqual(merged.b, src.b);
365
- });
366
-
367
- test('should replace object with simple key in target', function () {
368
- var src = { key1: 'value1' };
369
- var target = {
370
- key1: {
371
- subkey1: 'subvalue1',
372
- subkey2: 'subvalue2',
373
- },
374
- key2: 'value2',
375
- };
376
-
377
- var expected = { key1: 'value1', key2: 'value2' };
378
-
379
- assert.deepEqual(target, {
380
- key1: {
381
- subkey1: 'subvalue1',
382
- subkey2: 'subvalue2',
383
- },
384
- key2: 'value2',
385
- });
386
- assert.deepEqual(merge(target, src), expected);
387
- });
388
-
389
- test('should replace objects with arrays', function () {
390
- var target = { key1: { subkey: 'one' } };
391
-
392
- var src = { key1: ['subkey'] };
393
-
394
- var expected = { key1: ['subkey'] };
395
-
396
- assert.deepEqual(merge(target, src), expected);
397
- });
398
-
399
- test('should replace arrays with objects', function () {
400
- var target = { key1: ['subkey'] };
401
-
402
- var src = { key1: { subkey: 'one' } };
403
-
404
- var expected = { key1: { subkey: 'one' } };
405
-
406
- assert.deepEqual(merge(target, src), expected);
407
- });
408
-
409
- test('should replace dates with arrays', function () {
410
- var target = { key1: new Date() };
411
-
412
- var src = { key1: ['subkey'] };
413
-
414
- var expected = { key1: ['subkey'] };
415
-
416
- assert.deepEqual(merge(target, src), expected);
417
- });
418
-
419
- test('should replace null with arrays', function () {
420
- var target = {
421
- key1: null,
422
- };
423
-
424
- var src = {
425
- key1: ['subkey'],
426
- };
427
-
428
- var expected = {
429
- key1: ['subkey'],
430
- };
431
-
432
- assert.deepEqual(merge(target, src), expected);
433
- });
434
-
435
- test('should work on simple array', function () {
436
- var src = ['one', 'three'];
437
- var target = ['one', 'two'];
438
-
439
- var expected = ['one', 'two', 'one', 'three'];
440
-
441
- assert.deepEqual(merge(target, src), expected);
442
- assert.isTrue(Array.isArray(merge(target, src)));
443
- });
444
-
445
- test('should work on another simple array', function () {
446
- var target = ['a1', 'a2', 'c1', 'f1', 'p1'];
447
- var src = ['t1', 's1', 'c2', 'r1', 'p2', 'p3'];
448
-
449
- var expected = ['a1', 'a2', 'c1', 'f1', 'p1', 't1', 's1', 'c2', 'r1', 'p2', 'p3'];
450
- assert.deepEqual(target, ['a1', 'a2', 'c1', 'f1', 'p1']);
451
- assert.deepEqual(merge(target, src), expected);
452
- assert.isTrue(Array.isArray(merge(target, src)));
453
- });
454
-
455
- test('should work on array properties', function () {
456
- var src = {
457
- key1: ['one', 'three'],
458
- key2: ['four'],
459
- };
460
- var target = {
461
- key1: ['one', 'two'],
462
- };
463
-
464
- var expected = {
465
- key1: ['one', 'two', 'one', 'three'],
466
- key2: ['four'],
467
- };
468
-
469
- assert.deepEqual(merge(target, src), expected);
470
- assert.isTrue(Array.isArray(merge(target, src).key1));
471
- assert.isTrue(Array.isArray(merge(target, src).key2));
472
- });
473
-
474
- test('should work on array properties with clone option', function () {
475
- var src = {
476
- key1: ['one', 'three'],
477
- key2: ['four'],
478
- };
479
- var target = {
480
- key1: ['one', 'two'],
481
- };
482
-
483
- assert.deepEqual(target, {
484
- key1: ['one', 'two'],
485
- });
486
- var merged = merge(target, src, { clone: true });
487
- assert.notEqual(merged.key1, src.key1);
488
- assert.notEqual(merged.key1, target.key1);
489
- assert.notEqual(merged.key2, src.key2);
490
- });
491
-
492
- test('should work on array of objects', function () {
493
- var src = [{ key1: ['one', 'three'], key2: ['one'] }, { key3: ['five'] }];
494
- var target = [{ key1: ['one', 'two'] }, { key3: ['four'] }];
495
-
496
- var expected = [
497
- { key1: ['one', 'two'] },
498
- { key3: ['four'] },
499
- { key1: ['one', 'three'], key2: ['one'] },
500
- { key3: ['five'] },
501
- ];
502
-
503
- assert.deepEqual(merge(target, src), expected);
504
- assert.isTrue(Array.isArray(merge(target, src)), 'result should be an array');
505
- assert.isTrue(Array.isArray(merge(target, src)[0].key1), 'subkey should be an array too');
506
- });
507
-
508
- test('should work on array of objects with clone option', function () {
509
- var src = [{ key1: ['one', 'three'], key2: ['one'] }, { key3: ['five'] }];
510
- var target = [{ key1: ['one', 'two'] }, { key3: ['four'] }];
511
-
512
- var expected = [
513
- { key1: ['one', 'two'] },
514
- { key3: ['four'] },
515
- { key1: ['one', 'three'], key2: ['one'] },
516
- { key3: ['five'] },
517
- ];
518
-
519
- var merged = merge(target, src, { clone: true });
520
- assert.deepEqual(merged, expected);
521
- assert.isTrue(Array.isArray(merge(target, src)), 'result should be an array');
522
- assert.isTrue(Array.isArray(merge(target, src)[0].key1), 'subkey should be an array too');
523
- assert.notEqual(merged[0].key1, src[0].key1);
524
- assert.notEqual(merged[0].key1, target[0].key1);
525
- assert.notEqual(merged[0].key2, src[0].key2);
526
- assert.notEqual(merged[1].key3, src[1].key3);
527
- assert.notEqual(merged[1].key3, target[1].key3);
528
- });
529
-
530
- test('should treat regular expressions like primitive values', function () {
531
- var target = { key1: /abc/ };
532
- var src = { key1: /efg/ };
533
- var expected = { key1: /efg/ };
534
-
535
- assert.deepEqual(merge(target, src), expected);
536
- assert.deepEqual(merge(target, src).key1.test('efg'), true);
537
- });
538
-
539
- test(
540
- 'should treat regular expressions like primitive values and should not' + ' clone even with clone option',
541
- function () {
542
- var target = { key1: /abc/ };
543
- var src = { key1: /efg/ };
544
-
545
- var output = merge(target, src, { clone: true });
546
-
547
- assert.equal(output.key1, src.key1);
548
- },
549
- );
550
-
551
- test('should treat dates like primitives', function () {
552
- var monday = new Date('2016-09-27T01:08:12.761Z');
553
- var tuesday = new Date('2016-09-28T01:18:12.761Z');
554
-
555
- var target = {
556
- key: monday,
557
- };
558
- var source = {
559
- key: tuesday,
560
- };
561
-
562
- var expected = {
563
- key: tuesday,
564
- };
565
- var actual = merge(target, source);
566
-
567
- assert.deepEqual(actual, expected);
568
- assert.equal(actual.key.valueOf(), tuesday.valueOf());
569
- });
570
-
571
- test('should treat dates like primitives and should not clone even with clone' + ' option', function () {
572
- var monday = new Date('2016-09-27T01:08:12.761Z');
573
- var tuesday = new Date('2016-09-28T01:18:12.761Z');
574
-
575
- var target = {
576
- key: monday,
577
- };
578
- var source = {
579
- key: tuesday,
580
- };
581
-
582
- var actual = merge(target, source, { clone: true });
583
-
584
- assert.equal(actual.key, tuesday);
585
- });
586
-
587
- test('should work on array with null in it', function () {
588
- var target: any[] = [];
589
-
590
- var src = [null];
591
-
592
- var expected = [null];
593
-
594
- assert.deepEqual(merge(target, src), expected);
595
- });
596
-
597
- test("should clone array's element if it is object", function () {
598
- var a = { key: 'yup' };
599
- var target: any[] = [];
600
- var source = [a];
601
-
602
- var output = merge(target, source, { clone: true });
603
-
604
- assert.notEqual(output[0], a);
605
- assert.equal(output[0].key, 'yup');
606
- });
607
-
608
- test('should clone an array property when there is no target array', function () {
609
- const someObject = {};
610
- var target = {};
611
- var source = { ary: [someObject] };
612
- var output = merge(target, source, { clone: true });
613
-
614
- assert.deepEqual(output, { ary: [{}] });
615
- assert.notEqual(output.ary[0], someObject);
616
- });
617
-
618
- test('should overwrite values when property is initialised but undefined', function () {
619
- var target1 = { value: [] };
620
- var target2 = { value: null };
621
- var target3 = { value: 2 };
622
-
623
- var src = { value: undefined };
624
-
625
- function hasUndefinedProperty(o: any) {
626
- assert.isTrue(o.hasOwnProperty('value'));
627
- assert.equal(typeof o.value, 'undefined');
628
- }
629
-
630
- hasUndefinedProperty(merge(target1, src));
631
- hasUndefinedProperty(merge(target2, src));
632
- hasUndefinedProperty(merge(target3, src));
633
- });
634
-
635
- test('dates should copy correctly in an array', function () {
636
- var monday = new Date('2016-09-27T01:08:12.761Z');
637
- var tuesday = new Date('2016-09-28T01:18:12.761Z');
638
-
639
- var target = [monday, 'dude'];
640
- var source = [tuesday, 'lol'];
641
-
642
- var expected = [monday, 'dude', tuesday, 'lol'];
643
- var actual = merge(target, source);
644
-
645
- assert.deepEqual(actual, expected);
646
- });
647
-
648
- test('should handle custom merge functions', function () {
649
- var target = {
650
- letters: ['a', 'b'],
651
- people: {
652
- first: 'Alex',
653
- second: 'Bert',
654
- },
655
- };
656
-
657
- var source = {
658
- letters: ['c'],
659
- people: {
660
- first: 'Smith',
661
- second: 'Bertson',
662
- third: 'Car',
663
- },
664
- };
665
-
666
- const mergePeople = (target: any, source: any) => {
667
- const keys = new Set(Object.keys(target).concat(Object.keys(source)));
668
- const destination: Record<string, any> = {};
669
- keys.forEach((key) => {
670
- if (key in target && key in source) {
671
- destination[key] = `${target[key]}-${source[key]}`;
672
- } else if (key in target) {
673
- destination[key] = target[key];
674
- } else {
675
- destination[key] = source[key];
676
- }
677
- });
678
- return destination;
679
- };
680
-
681
- const options: MergeOptions = {
682
- customMerge: (key: string) => {
683
- if (key === 'people') {
684
- return mergePeople;
685
- }
686
- return merge;
687
- },
688
- };
689
-
690
- var expected = {
691
- letters: ['a', 'b', 'c'],
692
- people: {
693
- first: 'Alex-Smith',
694
- second: 'Bert-Bertson',
695
- third: 'Car',
696
- },
697
- };
698
-
699
- var actual = merge(target, source, options);
700
- assert.deepEqual(actual, expected);
701
- });
702
-
703
- test('should handle custom merge functions', function () {
704
- var target = {
705
- letters: ['a', 'b'],
706
- people: {
707
- first: 'Alex',
708
- second: 'Bert',
709
- },
710
- };
711
-
712
- var source = {
713
- letters: ['c'],
714
- people: {
715
- first: 'Smith',
716
- second: 'Bertson',
717
- third: 'Car',
718
- },
719
- };
720
-
721
- const mergeLetters = () => {
722
- return 'merged letters';
723
- };
724
-
725
- const options: MergeOptions = {
726
- customMerge: (key: any) => {
727
- if (key === 'letters') {
728
- return mergeLetters;
729
- }
730
- return;
731
- },
732
- };
733
-
734
- const expected: any = {
735
- letters: 'merged letters',
736
- people: {
737
- first: 'Smith',
738
- second: 'Bertson',
739
- third: 'Car',
740
- },
741
- };
742
-
743
- var actual = merge(target, source, options);
744
- assert.deepEqual(actual, expected);
745
- });
746
-
747
- test('should merge correctly if custom merge is not a valid function', function () {
748
- var target = {
749
- letters: ['a', 'b'],
750
- people: {
751
- first: 'Alex',
752
- second: 'Bert',
753
- },
754
- };
755
-
756
- var source = {
757
- letters: ['c'],
758
- people: {
759
- first: 'Smith',
760
- second: 'Bertson',
761
- third: 'Car',
762
- },
763
- };
764
-
765
- const options: MergeOptions = {
766
- customMerge: () => {
767
- return false as any;
768
- },
769
- };
770
-
771
- const expected = {
772
- letters: ['a', 'b', 'c'],
773
- people: {
774
- first: 'Smith',
775
- second: 'Bertson',
776
- third: 'Car',
777
- },
778
- };
779
-
780
- var actual = merge(target, source, options);
781
- assert.deepEqual(actual, expected);
782
- });
783
-
784
- test('copy symbol keys in target that do not exist on the target', function () {
785
- var mySymbol = Symbol();
786
- var src = { [mySymbol]: 'value1' };
787
- var target = {};
788
-
789
- var res: any = merge(target, src);
790
-
791
- assert.equal(res[mySymbol], 'value1');
792
- assert.deepEqual(Object.getOwnPropertySymbols(res), Object.getOwnPropertySymbols(src));
793
- });
794
-
795
- test('copy symbol keys in target that do exist on the target', function () {
796
- var mySymbol = Symbol();
797
- var src = { [mySymbol]: 'value1' };
798
- var target = { [mySymbol]: 'wat' };
799
-
800
- var res: any = merge(target, src);
801
-
802
- assert.equal(res[mySymbol], 'value1');
803
- });
804
-
805
- test('Falsey properties should be mergeable', function () {
806
- var uniqueValue = {};
807
-
808
- var target = {
809
- wat: false,
810
- };
811
-
812
- var source = {
813
- wat: false,
814
- };
815
-
816
- var customMergeWasCalled = false;
817
-
818
- var result = merge(target, source, {
819
- isMergeableObject: function () {
820
- return true;
821
- },
822
- customMerge: function () {
823
- return function () {
824
- customMergeWasCalled = true;
825
- return uniqueValue;
826
- };
827
- },
828
- });
829
-
830
- assert.equal(result.wat, uniqueValue);
831
- assert.isTrue(customMergeWasCalled, 'custom merge function was called');
832
- });
190
+ test('add keys in target that do not exist at the root', function () {
191
+ var src = { key1: 'value1', key2: 'value2' };
192
+ var target = {};
193
+
194
+ var res = merge(target, src);
195
+
196
+ assert.deepEqual(target, {}, 'merge should be immutable');
197
+ assert.deepEqual(res, src);
198
+ });
199
+
200
+ test('merge existing simple keys in target at the roots', function () {
201
+ var src = { key1: 'changed', key2: 'value2' };
202
+ var target = { key1: 'value1', key3: 'value3' };
203
+
204
+ var expected = { key1: 'changed', key2: 'value2', key3: 'value3' };
205
+
206
+ assert.deepEqual(target, { key1: 'value1', key3: 'value3' });
207
+ assert.deepEqual(merge(target, src), expected);
208
+ });
209
+
210
+ test('merge nested objects into target', function () {
211
+ var src = { key1: { subkey1: 'changed', subkey3: 'added' } };
212
+ var target = { key1: { subkey1: 'value1', subkey2: 'value2' } };
213
+
214
+ var expected = { key1: { subkey1: 'changed', subkey2: 'value2', subkey3: 'added' } };
215
+
216
+ assert.deepEqual(target, { key1: { subkey1: 'value1', subkey2: 'value2' } });
217
+ assert.deepEqual(merge(target, src), expected);
218
+ });
219
+
220
+ test('replace simple key with nested object in target', function () {
221
+ var src = { key1: { subkey1: 'subvalue1', subkey2: 'subvalue2' } };
222
+ var target = { key1: 'value1', key2: 'value2' };
223
+
224
+ var expected = { key1: { subkey1: 'subvalue1', subkey2: 'subvalue2' }, key2: 'value2' };
225
+
226
+ assert.deepEqual(target, { key1: 'value1', key2: 'value2' });
227
+ assert.deepEqual(merge(target, src), expected);
228
+ });
229
+
230
+ test('should add nested object in target', function () {
231
+ var src = { b: { c: {} } };
232
+
233
+ var target = { a: {} };
234
+
235
+ var expected = { a: {}, b: { c: {} } };
236
+
237
+ assert.deepEqual(merge(target, src), expected);
238
+ });
239
+
240
+ test('should clone source and target', function () {
241
+ var src = { b: { c: 'foo' } };
242
+
243
+ var target = { a: { d: 'bar' } };
244
+
245
+ var expected = { a: { d: 'bar' }, b: { c: 'foo' } };
246
+
247
+ var merged = merge(target, src, { clone: true });
248
+
249
+ assert.deepEqual(merged, expected);
250
+
251
+ assert.notEqual(merged.a, target.a);
252
+ assert.notEqual(merged.b, src.b);
253
+ });
254
+
255
+ test('should clone source and target', function () {
256
+ var src = { b: { c: 'foo' } };
257
+
258
+ var target = { a: { d: 'bar' } };
259
+
260
+ var merged = merge(target, src);
261
+ assert.notEqual(merged.a, target.a);
262
+ assert.notEqual(merged.b, src.b);
263
+ });
264
+
265
+ test('should replace object with simple key in target', function () {
266
+ var src = { key1: 'value1' };
267
+ var target = { key1: { subkey1: 'subvalue1', subkey2: 'subvalue2' }, key2: 'value2' };
268
+
269
+ var expected = { key1: 'value1', key2: 'value2' };
270
+
271
+ assert.deepEqual(target, { key1: { subkey1: 'subvalue1', subkey2: 'subvalue2' }, key2: 'value2' });
272
+ assert.deepEqual(merge(target, src), expected);
273
+ });
274
+
275
+ test('should replace objects with arrays', function () {
276
+ var target = { key1: { subkey: 'one' } };
277
+
278
+ var src = { key1: ['subkey'] };
279
+
280
+ var expected = { key1: ['subkey'] };
281
+
282
+ assert.deepEqual(merge(target, src), expected);
283
+ });
284
+
285
+ test('should replace arrays with objects', function () {
286
+ var target = { key1: ['subkey'] };
287
+
288
+ var src = { key1: { subkey: 'one' } };
289
+
290
+ var expected = { key1: { subkey: 'one' } };
291
+
292
+ assert.deepEqual(merge(target, src), expected);
293
+ });
294
+
295
+ test('should replace dates with arrays', function () {
296
+ var target = { key1: new Date() };
297
+
298
+ var src = { key1: ['subkey'] };
299
+
300
+ var expected = { key1: ['subkey'] };
301
+
302
+ assert.deepEqual(merge(target, src), expected);
303
+ });
304
+
305
+ test('should replace null with arrays', function () {
306
+ var target = { key1: null };
307
+
308
+ var src = { key1: ['subkey'] };
309
+
310
+ var expected = { key1: ['subkey'] };
311
+
312
+ assert.deepEqual(merge(target, src), expected);
313
+ });
314
+
315
+ test('should work on simple array', function () {
316
+ var src = ['one', 'three'];
317
+ var target = ['one', 'two'];
318
+
319
+ var expected = ['one', 'two', 'one', 'three'];
320
+
321
+ assert.deepEqual(merge(target, src), expected);
322
+ assert.isTrue(Array.isArray(merge(target, src)));
323
+ });
324
+
325
+ test('should work on another simple array', function () {
326
+ var target = ['a1', 'a2', 'c1', 'f1', 'p1'];
327
+ var src = ['t1', 's1', 'c2', 'r1', 'p2', 'p3'];
328
+
329
+ var expected = ['a1', 'a2', 'c1', 'f1', 'p1', 't1', 's1', 'c2', 'r1', 'p2', 'p3'];
330
+ assert.deepEqual(target, ['a1', 'a2', 'c1', 'f1', 'p1']);
331
+ assert.deepEqual(merge(target, src), expected);
332
+ assert.isTrue(Array.isArray(merge(target, src)));
333
+ });
334
+
335
+ test('should work on array properties', function () {
336
+ var src = { key1: ['one', 'three'], key2: ['four'] };
337
+ var target = { key1: ['one', 'two'] };
338
+
339
+ var expected = { key1: ['one', 'two', 'one', 'three'], key2: ['four'] };
340
+
341
+ assert.deepEqual(merge(target, src), expected);
342
+ assert.isTrue(Array.isArray(merge(target, src).key1));
343
+ assert.isTrue(Array.isArray(merge(target, src).key2));
344
+ });
345
+
346
+ test('should work on array properties with clone option', function () {
347
+ var src = { key1: ['one', 'three'], key2: ['four'] };
348
+ var target = { key1: ['one', 'two'] };
349
+
350
+ assert.deepEqual(target, { key1: ['one', 'two'] });
351
+ var merged = merge(target, src, { clone: true });
352
+ assert.notEqual(merged.key1, src.key1);
353
+ assert.notEqual(merged.key1, target.key1);
354
+ assert.notEqual(merged.key2, src.key2);
355
+ });
356
+
357
+ test('should work on array of objects', function () {
358
+ var src = [{ key1: ['one', 'three'], key2: ['one'] }, { key3: ['five'] }];
359
+ var target = [{ key1: ['one', 'two'] }, { key3: ['four'] }];
360
+
361
+ var expected = [
362
+ { key1: ['one', 'two'] },
363
+ { key3: ['four'] },
364
+ { key1: ['one', 'three'], key2: ['one'] },
365
+ { key3: ['five'] },
366
+ ];
367
+
368
+ assert.deepEqual(merge(target, src), expected);
369
+ assert.isTrue(Array.isArray(merge(target, src)), 'result should be an array');
370
+ assert.isTrue(Array.isArray(merge(target, src)[0].key1), 'subkey should be an array too');
371
+ });
372
+
373
+ test('should work on array of objects with clone option', function () {
374
+ var src = [{ key1: ['one', 'three'], key2: ['one'] }, { key3: ['five'] }];
375
+ var target = [{ key1: ['one', 'two'] }, { key3: ['four'] }];
376
+
377
+ var expected = [
378
+ { key1: ['one', 'two'] },
379
+ { key3: ['four'] },
380
+ { key1: ['one', 'three'], key2: ['one'] },
381
+ { key3: ['five'] },
382
+ ];
383
+
384
+ var merged = merge(target, src, { clone: true });
385
+ assert.deepEqual(merged, expected);
386
+ assert.isTrue(Array.isArray(merge(target, src)), 'result should be an array');
387
+ assert.isTrue(Array.isArray(merge(target, src)[0].key1), 'subkey should be an array too');
388
+ assert.notEqual(merged[0].key1, src[0].key1);
389
+ assert.notEqual(merged[0].key1, target[0].key1);
390
+ assert.notEqual(merged[0].key2, src[0].key2);
391
+ assert.notEqual(merged[1].key3, src[1].key3);
392
+ assert.notEqual(merged[1].key3, target[1].key3);
393
+ });
394
+
395
+ test('should treat regular expressions like primitive values', function () {
396
+ var target = { key1: /abc/ };
397
+ var src = { key1: /efg/ };
398
+ var expected = { key1: /efg/ };
399
+
400
+ assert.deepEqual(merge(target, src), expected);
401
+ assert.deepEqual(merge(target, src).key1.test('efg'), true);
402
+ });
403
+
404
+ test(
405
+ 'should treat regular expressions like primitive values and should not' + ' clone even with clone option',
406
+ function () {
407
+ var target = { key1: /abc/ };
408
+ var src = { key1: /efg/ };
409
+
410
+ var output = merge(target, src, { clone: true });
411
+
412
+ assert.equal(output.key1, src.key1);
413
+ },
414
+ );
415
+
416
+ test('should treat dates like primitives', function () {
417
+ var monday = new Date('2016-09-27T01:08:12.761Z');
418
+ var tuesday = new Date('2016-09-28T01:18:12.761Z');
419
+
420
+ var target = { key: monday };
421
+ var source = { key: tuesday };
422
+
423
+ var expected = { key: tuesday };
424
+ var actual = merge(target, source);
425
+
426
+ assert.deepEqual(actual, expected);
427
+ assert.equal(actual.key.valueOf(), tuesday.valueOf());
428
+ });
429
+
430
+ test('should treat dates like primitives and should not clone even with clone' + ' option', function () {
431
+ var monday = new Date('2016-09-27T01:08:12.761Z');
432
+ var tuesday = new Date('2016-09-28T01:18:12.761Z');
433
+
434
+ var target = { key: monday };
435
+ var source = { key: tuesday };
436
+
437
+ var actual = merge(target, source, { clone: true });
438
+
439
+ assert.equal(actual.key, tuesday);
440
+ });
441
+
442
+ test('should work on array with null in it', function () {
443
+ var target: any[] = [];
444
+
445
+ var src = [null];
446
+
447
+ var expected = [null];
448
+
449
+ assert.deepEqual(merge(target, src), expected);
450
+ });
451
+
452
+ test("should clone array's element if it is object", function () {
453
+ var a = { key: 'yup' };
454
+ var target: any[] = [];
455
+ var source = [a];
456
+
457
+ var output = merge(target, source, { clone: true });
458
+
459
+ assert.notEqual(output[0], a);
460
+ assert.equal(output[0].key, 'yup');
461
+ });
462
+
463
+ test('should clone an array property when there is no target array', function () {
464
+ const someObject = {};
465
+ var target = {};
466
+ var source = { ary: [someObject] };
467
+ var output = merge(target, source, { clone: true });
468
+
469
+ assert.deepEqual(output, { ary: [{}] });
470
+ assert.notEqual(output.ary[0], someObject);
471
+ });
472
+
473
+ test('should overwrite values when property is initialised but undefined', function () {
474
+ var target1 = { value: [] };
475
+ var target2 = { value: null };
476
+ var target3 = { value: 2 };
477
+
478
+ var src = { value: undefined };
479
+
480
+ function hasUndefinedProperty(o: any) {
481
+ assert.isTrue(o.hasOwnProperty('value'));
482
+ assert.equal(typeof o.value, 'undefined');
483
+ }
484
+
485
+ hasUndefinedProperty(merge(target1, src));
486
+ hasUndefinedProperty(merge(target2, src));
487
+ hasUndefinedProperty(merge(target3, src));
488
+ });
489
+
490
+ test('dates should copy correctly in an array', function () {
491
+ var monday = new Date('2016-09-27T01:08:12.761Z');
492
+ var tuesday = new Date('2016-09-28T01:18:12.761Z');
493
+
494
+ var target = [monday, 'dude'];
495
+ var source = [tuesday, 'lol'];
496
+
497
+ var expected = [monday, 'dude', tuesday, 'lol'];
498
+ var actual = merge(target, source);
499
+
500
+ assert.deepEqual(actual, expected);
501
+ });
502
+
503
+ test('should handle custom merge functions', function () {
504
+ var target = { letters: ['a', 'b'], people: { first: 'Alex', second: 'Bert' } };
505
+
506
+ var source = { letters: ['c'], people: { first: 'Smith', second: 'Bertson', third: 'Car' } };
507
+
508
+ const mergePeople = (target: any, source: any) => {
509
+ const keys = new Set(Object.keys(target).concat(Object.keys(source)));
510
+ const destination: Record<string, any> = {};
511
+ keys.forEach((key) => {
512
+ if (key in target && key in source) {
513
+ destination[key] = `${target[key]}-${source[key]}`;
514
+ } else if (key in target) {
515
+ destination[key] = target[key];
516
+ } else {
517
+ destination[key] = source[key];
518
+ }
519
+ });
520
+ return destination;
521
+ };
522
+
523
+ const options: MergeOptions = {
524
+ customMerge: (key: string) => {
525
+ if (key === 'people') {
526
+ return mergePeople;
527
+ }
528
+ return merge;
529
+ },
530
+ };
531
+
532
+ var expected = { letters: ['a', 'b', 'c'], people: { first: 'Alex-Smith', second: 'Bert-Bertson', third: 'Car' } };
533
+
534
+ var actual = merge(target, source, options);
535
+ assert.deepEqual(actual, expected);
536
+ });
537
+
538
+ test('should handle custom merge functions', function () {
539
+ var target = { letters: ['a', 'b'], people: { first: 'Alex', second: 'Bert' } };
540
+
541
+ var source = { letters: ['c'], people: { first: 'Smith', second: 'Bertson', third: 'Car' } };
542
+
543
+ const mergeLetters = () => {
544
+ return 'merged letters';
545
+ };
546
+
547
+ const options: MergeOptions = {
548
+ customMerge: (key: any) => {
549
+ if (key === 'letters') {
550
+ return mergeLetters;
551
+ }
552
+ return;
553
+ },
554
+ };
555
+
556
+ const expected: any = { letters: 'merged letters', people: { first: 'Smith', second: 'Bertson', third: 'Car' } };
557
+
558
+ var actual = merge(target, source, options);
559
+ assert.deepEqual(actual, expected);
560
+ });
561
+
562
+ test('should merge correctly if custom merge is not a valid function', function () {
563
+ var target = { letters: ['a', 'b'], people: { first: 'Alex', second: 'Bert' } };
564
+
565
+ var source = { letters: ['c'], people: { first: 'Smith', second: 'Bertson', third: 'Car' } };
566
+
567
+ const options: MergeOptions = {
568
+ customMerge: () => {
569
+ return false as any;
570
+ },
571
+ };
572
+
573
+ const expected = { letters: ['a', 'b', 'c'], people: { first: 'Smith', second: 'Bertson', third: 'Car' } };
574
+
575
+ var actual = merge(target, source, options);
576
+ assert.deepEqual(actual, expected);
577
+ });
578
+
579
+ test('copy symbol keys in target that do not exist on the target', function () {
580
+ var mySymbol = Symbol();
581
+ var src = { [mySymbol]: 'value1' };
582
+ var target = {};
583
+
584
+ var res: any = merge(target, src);
585
+
586
+ assert.equal(res[mySymbol], 'value1');
587
+ assert.deepEqual(Object.getOwnPropertySymbols(res), Object.getOwnPropertySymbols(src));
588
+ });
589
+
590
+ test('copy symbol keys in target that do exist on the target', function () {
591
+ var mySymbol = Symbol();
592
+ var src = { [mySymbol]: 'value1' };
593
+ var target = { [mySymbol]: 'wat' };
594
+
595
+ var res: any = merge(target, src);
596
+
597
+ assert.equal(res[mySymbol], 'value1');
598
+ });
599
+
600
+ test('Falsey properties should be mergeable', function () {
601
+ var uniqueValue = {};
602
+
603
+ var target = { wat: false };
604
+
605
+ var source = { wat: false };
606
+
607
+ var customMergeWasCalled = false;
608
+
609
+ var result = merge(target, source, {
610
+ isMergeableObject: function () {
611
+ return true;
612
+ },
613
+ customMerge: function () {
614
+ return function () {
615
+ customMergeWasCalled = true;
616
+ return uniqueValue;
617
+ };
618
+ },
619
+ });
620
+
621
+ assert.equal(result.wat, uniqueValue);
622
+ assert.isTrue(customMergeWasCalled, 'custom merge function was called');
623
+ });
833
624
  });
834
625
 
835
626
  describe('prototype-poisoning', async () => {
836
- const { isMergeableObject } = await import('./isMergeableObject');
837
- test('merging objects with own __proto__', function () {
838
- var user = {};
839
- var malicious = JSON.parse('{ "__proto__": { "admin": true } }');
840
- var mergedObject: any = merge(user, malicious);
841
- assert.isFalse(!!mergedObject.__proto__.admin, 'non-plain properties should not be merged');
842
- assert.isFalse(!!mergedObject.admin, 'the destination should have an unmodified prototype');
843
- });
844
-
845
- test('merging objects with plain and non-plain properties', function () {
846
- var plainSymbolKey = Symbol('plainSymbolKey');
847
- var parent = {
848
- parentKey: 'should be undefined',
849
- };
850
-
851
- var target = Object.create(parent);
852
- target.plainKey = 'should be replaced';
853
- target[plainSymbolKey] = 'should also be replaced';
854
-
855
- var source = {
856
- parentKey: 'foo',
857
- plainKey: 'bar',
858
- newKey: 'baz',
859
- [plainSymbolKey]: 'qux',
860
- };
861
-
862
- var mergedObject: any = merge(target, source);
863
- assert.equal(
864
- undefined,
865
- mergedObject.parentKey,
866
- 'inherited properties of target should be removed, not merged or ignored',
867
- );
868
- assert.equal('bar', mergedObject.plainKey, 'enumerable own properties of target should be merged');
869
- assert.equal('baz', mergedObject.newKey, 'properties not yet on target should be merged');
870
- assert.equal('qux', mergedObject[plainSymbolKey], 'enumerable own symbol properties of target should be merged');
871
- });
872
-
873
- // the following cases come from the thread here: https://github.com/TehShrike/deepmerge/pull/164
874
- test('merging strings works with a custom string merge', function () {
875
- var target = { name: 'Alexander' };
876
- var source = { name: 'Hamilton' };
877
-
878
- function customMerge(key: any): any {
879
- if (key === 'name') {
880
- return function (target: any, source: any) {
881
- return target[0] + '. ' + source.substring(0, 3);
882
- };
883
- } else {
884
- return merge;
885
- }
886
- }
887
-
888
- function mergeable(target: any) {
889
- return isMergeableObject(target) || (typeof target === 'string' && target.length > 1);
890
- }
891
-
892
- assert.equal('A. Ham', merge(target, source, { customMerge: customMerge, isMergeableObject: mergeable }).name);
893
- });
894
-
895
- test('merging objects with null prototype', function () {
896
- var target = Object.create(null);
897
- var source = Object.create(null);
898
- target.wheels = 4;
899
- target.trunk = { toolbox: ['hammer'] };
900
- source.trunk = { toolbox: ['wrench'] };
901
- source.engine = 'v8';
902
- var expected = {
903
- wheels: 4,
904
- engine: 'v8',
905
- trunk: {
906
- toolbox: ['hammer', 'wrench'],
907
- },
908
- };
909
-
910
- assert.deepEqual(expected, merge(target, source));
911
- });
627
+ const { isMergeableObject } = await import('./isMergeableObject');
628
+ test('merging objects with own __proto__', function () {
629
+ var user = {};
630
+ var malicious = JSON.parse('{ "__proto__": { "admin": true } }');
631
+ var mergedObject: any = merge(user, malicious);
632
+ assert.isFalse(!!mergedObject.__proto__.admin, 'non-plain properties should not be merged');
633
+ assert.isFalse(!!mergedObject.admin, 'the destination should have an unmodified prototype');
634
+ });
635
+
636
+ test('merging objects with plain and non-plain properties', function () {
637
+ var plainSymbolKey = Symbol('plainSymbolKey');
638
+ var parent = { parentKey: 'should be undefined' };
639
+
640
+ var target = Object.create(parent);
641
+ target.plainKey = 'should be replaced';
642
+ target[plainSymbolKey] = 'should also be replaced';
643
+
644
+ var source = { parentKey: 'foo', plainKey: 'bar', newKey: 'baz', [plainSymbolKey]: 'qux' };
645
+
646
+ var mergedObject: any = merge(target, source);
647
+ assert.equal(
648
+ undefined,
649
+ mergedObject.parentKey,
650
+ 'inherited properties of target should be removed, not merged or ignored',
651
+ );
652
+ assert.equal('bar', mergedObject.plainKey, 'enumerable own properties of target should be merged');
653
+ assert.equal('baz', mergedObject.newKey, 'properties not yet on target should be merged');
654
+ assert.equal('qux', mergedObject[plainSymbolKey], 'enumerable own symbol properties of target should be merged');
655
+ });
656
+
657
+ // the following cases come from the thread here: https://github.com/TehShrike/deepmerge/pull/164
658
+ test('merging strings works with a custom string merge', function () {
659
+ var target = { name: 'Alexander' };
660
+ var source = { name: 'Hamilton' };
661
+
662
+ function customMerge(key: any): any {
663
+ if (key === 'name') {
664
+ return function (target: any, source: any) {
665
+ return target[0] + '. ' + source.substring(0, 3);
666
+ };
667
+ } else {
668
+ return merge;
669
+ }
670
+ }
671
+
672
+ function mergeable(target: any) {
673
+ return isMergeableObject(target) || (typeof target === 'string' && target.length > 1);
674
+ }
675
+
676
+ assert.equal('A. Ham', merge(target, source, { customMerge: customMerge, isMergeableObject: mergeable }).name);
677
+ });
678
+
679
+ test('merging objects with null prototype', function () {
680
+ var target = Object.create(null);
681
+ var source = Object.create(null);
682
+ target.wheels = 4;
683
+ target.trunk = { toolbox: ['hammer'] };
684
+ source.trunk = { toolbox: ['wrench'] };
685
+ source.engine = 'v8';
686
+ var expected = { wheels: 4, engine: 'v8', trunk: { toolbox: ['hammer', 'wrench'] } };
687
+
688
+ assert.deepEqual(expected, merge(target, source));
689
+ });
912
690
  });