@cloudcome/utils-core 1.1.1 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (293) hide show
  1. package/README.md +18 -0
  2. package/dist/array.cjs +129 -0
  3. package/dist/array.cjs.map +1 -0
  4. package/dist/array.d.ts +171 -0
  5. package/dist/array.mjs +129 -0
  6. package/dist/array.mjs.map +1 -0
  7. package/dist/async.cjs +219 -0
  8. package/dist/async.cjs.map +1 -0
  9. package/dist/async.d.ts +137 -0
  10. package/dist/async.mjs +219 -0
  11. package/dist/async.mjs.map +1 -0
  12. package/dist/base64.cjs +16 -0
  13. package/dist/base64.cjs.map +1 -0
  14. package/dist/base64.d.ts +7 -0
  15. package/dist/base64.mjs +16 -0
  16. package/dist/base64.mjs.map +1 -0
  17. package/dist/cache.cjs +79 -0
  18. package/dist/cache.cjs.map +1 -0
  19. package/dist/cache.d.ts +90 -0
  20. package/dist/cache.mjs +79 -0
  21. package/dist/cache.mjs.map +1 -0
  22. package/{src/color/contrast.ts → dist/color/contrast.d.ts} +2 -12
  23. package/dist/color/distance.d.ts +8 -0
  24. package/dist/color/helpers.d.ts +2 -0
  25. package/dist/color/hex-hsl.d.ts +3 -0
  26. package/{src/color/hex-hsv.ts → dist/color/hex-hsv.d.ts} +3 -11
  27. package/{src/color/hex-hwb.ts → dist/color/hex-hwb.d.ts} +3 -11
  28. package/dist/color/hex-rgb.d.ts +18 -0
  29. package/{src/color/hsl-lighten.ts → dist/color/hsl-lighten.d.ts} +2 -7
  30. package/{src/color/hsv-brighten.ts → dist/color/hsv-brighten.d.ts} +2 -7
  31. package/{src/color/luminance.ts → dist/color/luminance.d.ts} +2 -9
  32. package/{src/color/mix.ts → dist/color/mix.d.ts} +2 -10
  33. package/dist/color/rgb-hsl.d.ts +23 -0
  34. package/{src/color/rgb-hsv.ts → dist/color/rgb-hsv.d.ts} +3 -30
  35. package/dist/color/rgb-hwb.d.ts +29 -0
  36. package/{src/color/rgb-lab.ts → dist/color/rgb-lab.d.ts} +3 -11
  37. package/dist/color/rgb-whiter.d.ts +12 -0
  38. package/dist/color/rgb-xyz.d.ts +22 -0
  39. package/{src/color/types.ts → dist/color/types.d.ts} +30 -12
  40. package/{src/color/xyz-lab.ts → dist/color/xyz-lab.d.ts} +3 -32
  41. package/dist/color.cjs +250 -0
  42. package/dist/color.cjs.map +1 -0
  43. package/dist/color.mjs +250 -0
  44. package/dist/color.mjs.map +1 -0
  45. package/dist/const.cjs +14 -0
  46. package/dist/const.cjs.map +1 -0
  47. package/dist/const.mjs +15 -0
  48. package/dist/const.mjs.map +1 -0
  49. package/dist/core.cjs +250 -0
  50. package/dist/core.cjs.map +1 -0
  51. package/dist/core.mjs +251 -0
  52. package/dist/core.mjs.map +1 -0
  53. package/dist/crypto/md5.d.mts +1 -0
  54. package/dist/crypto/sha1.d.mts +1 -0
  55. package/dist/crypto/sha256.d.mts +1 -0
  56. package/dist/crypto/sha512.d.mts +1 -0
  57. package/dist/crypto.cjs +812 -0
  58. package/dist/crypto.cjs.map +1 -0
  59. package/{src/crypto.ts → dist/crypto.d.ts} +4 -20
  60. package/dist/crypto.mjs +812 -0
  61. package/dist/crypto.mjs.map +1 -0
  62. package/dist/date/const.d.ts +6 -0
  63. package/dist/date/core.d.ts +52 -0
  64. package/dist/date/days.d.ts +23 -0
  65. package/{src/date/is.ts → dist/date/is.d.ts} +8 -102
  66. package/dist/date/relative.d.ts +44 -0
  67. package/dist/date/start-end.d.ts +73 -0
  68. package/dist/date/timezone.d.ts +67 -0
  69. package/dist/date/weeks.d.ts +72 -0
  70. package/dist/date.cjs +239 -0
  71. package/dist/date.cjs.map +1 -0
  72. package/dist/date.mjs +241 -0
  73. package/dist/date.mjs.map +1 -0
  74. package/dist/dict.cjs +2 -0
  75. package/dist/dict.cjs.map +1 -0
  76. package/dist/dict.mjs +2 -0
  77. package/dist/dict.mjs.map +1 -0
  78. package/dist/each.cjs +18 -0
  79. package/dist/each.cjs.map +1 -0
  80. package/dist/each.mjs +19 -0
  81. package/dist/each.mjs.map +1 -0
  82. package/dist/easing.cjs +151 -0
  83. package/dist/easing.cjs.map +1 -0
  84. package/dist/easing.d.ts +46 -0
  85. package/dist/easing.mjs +151 -0
  86. package/dist/easing.mjs.map +1 -0
  87. package/dist/emitter.cjs +94 -0
  88. package/dist/emitter.cjs.map +1 -0
  89. package/dist/emitter.d.ts +68 -0
  90. package/dist/emitter.mjs +94 -0
  91. package/dist/emitter.mjs.map +1 -0
  92. package/dist/enum.cjs +58 -0
  93. package/dist/enum.cjs.map +1 -0
  94. package/dist/enum.d.ts +68 -0
  95. package/dist/enum.mjs +58 -0
  96. package/dist/enum.mjs.map +1 -0
  97. package/dist/env.cjs +28 -0
  98. package/dist/env.cjs.map +1 -0
  99. package/{src/env.ts → dist/env.d.ts} +6 -30
  100. package/dist/env.mjs +28 -0
  101. package/dist/env.mjs.map +1 -0
  102. package/dist/error.cjs +12 -0
  103. package/dist/error.cjs.map +1 -0
  104. package/{src/error.ts → dist/error.d.ts} +3 -12
  105. package/dist/error.mjs +12 -0
  106. package/dist/error.mjs.map +1 -0
  107. package/dist/exception.cjs +22 -0
  108. package/dist/exception.cjs.map +1 -0
  109. package/dist/exception.d.ts +31 -0
  110. package/dist/exception.mjs +22 -0
  111. package/dist/exception.mjs.map +1 -0
  112. package/dist/fn.cjs +76 -0
  113. package/dist/fn.cjs.map +1 -0
  114. package/dist/fn.d.ts +102 -0
  115. package/dist/fn.mjs +76 -0
  116. package/dist/fn.mjs.map +1 -0
  117. package/dist/index.cjs +5 -0
  118. package/dist/index.cjs.map +1 -0
  119. package/dist/index.d.ts +1 -0
  120. package/dist/index.mjs +5 -0
  121. package/dist/index.mjs.map +1 -0
  122. package/dist/merge.cjs +87 -0
  123. package/dist/merge.cjs.map +1 -0
  124. package/dist/merge.mjs +88 -0
  125. package/dist/merge.mjs.map +1 -0
  126. package/dist/number.cjs +14 -0
  127. package/dist/number.cjs.map +1 -0
  128. package/dist/number.d.ts +153 -0
  129. package/dist/number.mjs +14 -0
  130. package/dist/number.mjs.map +1 -0
  131. package/{src/object/each.ts → dist/object/each.d.ts} +3 -23
  132. package/dist/object/get-set.d.ts +111 -0
  133. package/dist/object/is.d.ts +32 -0
  134. package/dist/object/merge.d.ts +72 -0
  135. package/{src/object/process.ts → dist/object/process.d.ts} +4 -38
  136. package/dist/object.cjs +130 -0
  137. package/dist/object.cjs.map +1 -0
  138. package/dist/object.mjs +130 -0
  139. package/dist/object.mjs.map +1 -0
  140. package/dist/path.cjs +77 -0
  141. package/dist/path.cjs.map +1 -0
  142. package/dist/path.d.ts +82 -0
  143. package/dist/path.mjs +77 -0
  144. package/dist/path.mjs.map +1 -0
  145. package/dist/promise.cjs +62 -0
  146. package/dist/promise.cjs.map +1 -0
  147. package/{src/promise.ts → dist/promise.d.ts} +6 -67
  148. package/dist/promise.mjs +62 -0
  149. package/dist/promise.mjs.map +1 -0
  150. package/dist/qs.cjs +47 -0
  151. package/dist/qs.cjs.map +1 -0
  152. package/{src/qs.ts → dist/qs.d.ts} +3 -60
  153. package/dist/qs.mjs +47 -0
  154. package/dist/qs.mjs.map +1 -0
  155. package/dist/regexp.cjs +66 -0
  156. package/dist/regexp.cjs.map +1 -0
  157. package/dist/regexp.d.ts +65 -0
  158. package/dist/regexp.mjs +66 -0
  159. package/dist/regexp.mjs.map +1 -0
  160. package/dist/string.cjs +16 -0
  161. package/dist/string.cjs.map +1 -0
  162. package/dist/string.d.ts +80 -0
  163. package/dist/string.mjs +16 -0
  164. package/dist/string.mjs.map +1 -0
  165. package/dist/string2.cjs +157 -0
  166. package/dist/string2.cjs.map +1 -0
  167. package/dist/string2.mjs +158 -0
  168. package/dist/string2.mjs.map +1 -0
  169. package/dist/time/from.d.ts +14 -0
  170. package/dist/time/to.d.ts +38 -0
  171. package/dist/time.cjs +82 -0
  172. package/dist/time.cjs.map +1 -0
  173. package/dist/time.mjs +82 -0
  174. package/dist/time.mjs.map +1 -0
  175. package/dist/timer.cjs +119 -0
  176. package/dist/timer.cjs.map +1 -0
  177. package/dist/timer.d.ts +96 -0
  178. package/{src/timer.ts → dist/timer.mjs} +17 -124
  179. package/dist/timer.mjs.map +1 -0
  180. package/dist/tree.cjs +125 -0
  181. package/dist/tree.cjs.map +1 -0
  182. package/dist/tree.d.ts +210 -0
  183. package/dist/tree.mjs +125 -0
  184. package/dist/tree.mjs.map +1 -0
  185. package/dist/type.cjs +78 -0
  186. package/dist/type.cjs.map +1 -0
  187. package/{src/type.ts → dist/type.d.ts} +20 -96
  188. package/dist/type.mjs +78 -0
  189. package/dist/type.mjs.map +1 -0
  190. package/dist/types.cjs +2 -0
  191. package/dist/types.cjs.map +1 -0
  192. package/{src/types.ts → dist/types.d.ts} +12 -33
  193. package/dist/types.mjs +2 -0
  194. package/dist/types.mjs.map +1 -0
  195. package/dist/unique.cjs +46 -0
  196. package/dist/unique.cjs.map +1 -0
  197. package/dist/unique.d.ts +22 -0
  198. package/dist/unique.mjs +46 -0
  199. package/dist/unique.mjs.map +1 -0
  200. package/dist/url.cjs +37 -0
  201. package/dist/url.cjs.map +1 -0
  202. package/dist/url.d.ts +53 -0
  203. package/dist/url.mjs +37 -0
  204. package/dist/url.mjs.map +1 -0
  205. package/dist/version.cjs +33 -0
  206. package/dist/version.cjs.map +1 -0
  207. package/dist/version.d.ts +32 -0
  208. package/dist/version.mjs +33 -0
  209. package/dist/version.mjs.map +1 -0
  210. package/package.json +8 -2
  211. package/CHANGELOG.md +0 -52
  212. package/src/array.ts +0 -312
  213. package/src/async.ts +0 -379
  214. package/src/base64.ts +0 -20
  215. package/src/cache.ts +0 -146
  216. package/src/color/distance.ts +0 -28
  217. package/src/color/helpers.ts +0 -23
  218. package/src/color/hex-hsl.ts +0 -11
  219. package/src/color/hex-rgb.ts +0 -39
  220. package/src/color/rgb-hsl.ts +0 -53
  221. package/src/color/rgb-hwb.ts +0 -56
  222. package/src/color/rgb-whiter.ts +0 -22
  223. package/src/color/rgb-xyz.ts +0 -62
  224. package/src/crypto/md5.mjs +0 -357
  225. package/src/crypto/sha1.mjs +0 -300
  226. package/src/crypto/sha256.mjs +0 -310
  227. package/src/crypto/sha512.mjs +0 -459
  228. package/src/date/const.ts +0 -6
  229. package/src/date/core.ts +0 -162
  230. package/src/date/days.ts +0 -51
  231. package/src/date/relative.ts +0 -92
  232. package/src/date/start-end.ts +0 -246
  233. package/src/date/timezone.ts +0 -220
  234. package/src/date/weeks.ts +0 -100
  235. package/src/dts/global.d.ts +0 -27
  236. package/src/easing.ts +0 -166
  237. package/src/emitter.ts +0 -117
  238. package/src/enum.ts +0 -171
  239. package/src/exception.ts +0 -68
  240. package/src/fn.ts +0 -197
  241. package/src/index.ts +0 -1
  242. package/src/number.ts +0 -236
  243. package/src/object/get-set.ts +0 -273
  244. package/src/object/is.ts +0 -128
  245. package/src/object/merge.ts +0 -180
  246. package/src/path.ts +0 -188
  247. package/src/regexp.ts +0 -156
  248. package/src/string.ts +0 -146
  249. package/src/time/from.ts +0 -57
  250. package/src/time/to.ts +0 -106
  251. package/src/tree.ts +0 -394
  252. package/src/unique.ts +0 -77
  253. package/src/url.ts +0 -93
  254. package/src/version.ts +0 -71
  255. package/test/array.test.ts +0 -332
  256. package/test/async-real.test.ts +0 -39
  257. package/test/async.test.ts +0 -375
  258. package/test/base64.test.ts +0 -32
  259. package/test/cache.test.ts +0 -83
  260. package/test/color.test.ts +0 -163
  261. package/test/crypto.test.ts +0 -34
  262. package/test/date-tz.test.ts +0 -206
  263. package/test/date.test.ts +0 -353
  264. package/test/easing.test.ts +0 -33
  265. package/test/emitter.test.ts +0 -71
  266. package/test/enum.test.ts +0 -113
  267. package/test/env.test.ts +0 -69
  268. package/test/error.test.ts +0 -58
  269. package/test/exception.test.ts +0 -43
  270. package/test/fn.test.ts +0 -263
  271. package/test/helpers.ts +0 -23
  272. package/test/index.test.ts +0 -6
  273. package/test/number.test.ts +0 -213
  274. package/test/object.test.ts +0 -309
  275. package/test/path.test.ts +0 -156
  276. package/test/promise.test.ts +0 -199
  277. package/test/qs.test.ts +0 -79
  278. package/test/regexp.test.ts +0 -97
  279. package/test/string.test.ts +0 -150
  280. package/test/time.test.ts +0 -214
  281. package/test/timer.test.ts +0 -114
  282. package/test/tree.test.ts +0 -348
  283. package/test/type.test.ts +0 -226
  284. package/test/unique.test.ts +0 -71
  285. package/test/url.test.ts +0 -136
  286. package/test/version.test.ts +0 -52
  287. package/tsconfig.json +0 -31
  288. package/vite.config.mts +0 -114
  289. /package/{src/color.ts → dist/color.d.ts} +0 -0
  290. /package/{src/date.ts → dist/date.d.ts} +0 -0
  291. /package/{src/dict.ts → dist/dict.d.ts} +0 -0
  292. /package/{src/object.ts → dist/object.d.ts} +0 -0
  293. /package/{src/time.ts → dist/time.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date.mjs","sources":["../src/date/start-end.ts","../src/date/days.ts","../src/date/relative.ts","../src/date/is.ts","../src/date/weeks.ts"],"sourcesContent":["import { type DateLike, type DateValue, dateParse } from './core';\n\n/**\n * 时间单位符号枚举\n * - 'Y': 年\n * - 'M': 月\n * - 'D': 天\n * - 'W': 周\n * - 'h': 小时\n * - 'm': 分钟\n * - 's': 秒\n */\ntype _TDateOfSymbol = 'Y' | 'M' | 'D' | 'W' | 'h' | 'm' | 's';\n\n/**\n * 各时间单位起始时间映射表\n * 包含将日期设置到单位起始时间的函数\n */\nconst dateOfStartMap: [_TDateOfSymbol, (date: DateLike) => unknown][] = [\n ['s', (d) => d.setMilliseconds(0)],\n ['m', (d) => d.setSeconds(0)],\n ['h', (d) => d.setMinutes(0)],\n ['D', (d) => d.setHours(0)],\n ['W', (d) => d.setHours(0)],\n ['M', (d) => d.setDate(1)],\n ['Y', (d) => d.setMonth(0)],\n];\n\n/**\n * 返回指定时间单位的起始时间\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @param symbol - 时间单位符号,可选值为 'Y'(年)、'M'(月)、'D'(天)、'h'(小时)、'm'(分钟)、's'(秒),默认为 'D'\n * @returns 返回指定时间单位的起始时间\n * @example\n * ```typescript\n * const date = new Date(2023, 5, 15, 12, 30, 45, 500); // 2023-06-15 12:30:45.500\n *\n * // 返回秒级起始时间\n * dateOfStart(date, 's'); // 2023-06-15 12:30:45.000\n *\n * // 返回分钟级起始时间\n * dateOfStart(date, 'm'); // 2023-06-15 12:30:00.000\n *\n * // 返回小时级起始时间\n * dateOfStart(date, 'h'); // 2023-06-15 12:00:00.000\n *\n * // 返回天级起始时间\n * dateOfStart(date, 'D'); // 2023-06-15 00:00:00.000\n *\n * // 返回月级起始时间\n * dateOfStart(date, 'M'); // 2023-06-01 00:00:00.000\n *\n * // 返回年级起始时间\n * dateOfStart(date, 'Y'); // 2023-01-01 00:00:00.000\n *\n * // 默认返回天级起始时间\n * dateOfStart(date); // 2023-06-15 00:00:00.000\n * ```\n */\nfunction _dateStart(dateValue: DateValue, symbol: _TDateOfSymbol = 'D') {\n const date = dateParse(dateValue);\n\n for (const [sym, fn] of dateOfStartMap) {\n fn(date);\n if (symbol === sym) break;\n }\n\n return date;\n}\n\n/**\n * 返回秒级起始时间\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @returns 返回秒级起始时间,毫秒部分为 0\n */\nexport function dateStartInSecond(dateValue: DateValue) {\n return _dateStart(dateValue, 's');\n}\n\n/**\n * 返回分钟级起始时间\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @returns 返回分钟级起始时间,秒和毫秒部分为 0\n */\nexport function dateStartInMinute(dateValue: DateValue) {\n return _dateStart(dateValue, 'm');\n}\n\n/**\n * 返回小时级起始时间\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @returns 返回小时级起始时间,分钟、秒和毫秒部分为 0\n */\nexport function dateStartInHour(dateValue: DateValue) {\n return _dateStart(dateValue, 'h');\n}\n\n/**\n * 返回天级起始时间\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @returns 返回天级起始时间,小时、分钟、秒和毫秒部分为 0\n */\nexport function dateStartInDay(dateValue: DateValue) {\n return _dateStart(dateValue, 'D');\n}\n\n/**\n * 返回月级起始时间\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @returns 返回月级起始时间,日期为当月第一天,时间部分为 0\n */\nexport function dateStartInMonth(dateValue: DateValue) {\n return _dateStart(dateValue, 'M');\n}\n\n/**\n * 返回年级起始时间\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @returns 返回年级起始时间,月份为 1 月,日期为 1 日,时间部分为 0\n */\nexport function dateStartInYear(dateValue: DateValue) {\n return _dateStart(dateValue, 'Y');\n}\n\n/**\n * 各时间单位结束时间映射表\n * 包含将日期设置到单位结束时间的函数\n */\nconst dateOfEndMap: [_TDateOfSymbol, (date: DateLike) => unknown][] = [\n ['s', (d) => d.setMilliseconds(999)],\n ['m', (d) => d.setSeconds(59)],\n ['h', (d) => d.setMinutes(59)],\n ['D', (d) => d.setHours(23)],\n [\n 'M',\n (d) => {\n const d2 = dateParse(d);\n d2.setMonth(d.getMonth() + 1);\n d2.setDate(0);\n d.setDate(d2.getDate());\n },\n ],\n [\n 'Y',\n (d) => {\n d.setMonth(11);\n d.setDate(31);\n },\n ],\n];\n\n/**\n * 返回指定时间单位的结束时间\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @param symbol - 时间单位符号,可选值为 'Y'(年)、'M'(月)、'D'(天)、'h'(小时)、'm'(分钟)、's'(秒),默认为 'D'\n * @returns 返回指定时间单位的结束时间\n * @example\n * ```typescript\n * const date = new Date(2023, 5, 15, 12, 30, 45, 500); // 2023-06-15 12:30:45.500\n *\n * // 返回秒级结束时间\n * dateOfEnd(date, 's'); // 2023-06-15 12:30:45.999\n *\n * // 返回分钟级结束时间\n * dateOfEnd(date, 'm'); // 2023-06-15 12:30:59.999\n *\n * // 返回小时级结束时间\n * dateOfEnd(date, 'h'); // 2023-06-15 12:59:59.999\n *\n * // 返回天级结束时间\n * dateOfEnd(date, 'D'); // 2023-06-15 23:59:59.999\n *\n * // 返回月级结束时间\n * dateOfEnd(date, 'M'); // 2023-06-30 23:59:59.999\n *\n * // 返回年级结束时间\n * dateOfEnd(date, 'Y'); // 2023-12-31 23:59:59.999\n *\n * // 默认返回天级结束时间\n * dateOfEnd(date); // 2023-06-15 23:59:59.999\n * ```\n */\nfunction _dateEnd(dateValue: DateValue, symbol: _TDateOfSymbol = 'D') {\n const date = dateParse(dateValue);\n\n for (const [sym, fn] of dateOfEndMap) {\n fn(date);\n if (symbol === sym) break;\n }\n\n return date;\n}\n\n/**\n * 返回秒级结束时间\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @returns 返回秒级结束时间,毫秒部分为 999\n */\nexport function dateEndInSecond(dateValue: DateValue) {\n return _dateEnd(dateValue, 's');\n}\n\n/**\n * 返回分钟级结束时间\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @returns 返回分钟级结束时间,秒为 59,毫秒为 999\n */\nexport function dateEndInMinute(dateValue: DateValue) {\n return _dateEnd(dateValue, 'm');\n}\n\n/**\n * 返回小时级结束时间\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @returns 返回小时级结束时间,分钟为 59,秒为 59,毫秒为 999\n */\nexport function dateEndInHour(dateValue: DateValue) {\n return _dateEnd(dateValue, 'h');\n}\n\n/**\n * 返回天级结束时间\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @returns 返回天级结束时间,小时为 23,分钟为 59,秒为 59,毫秒为 999\n */\nexport function dateEndInDay(dateValue: DateValue) {\n return _dateEnd(dateValue, 'D');\n}\n\n/**\n * 返回月级结束时间\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @returns 返回月级结束时间,日期为当月最后一天,时间为 23:59:59.999\n */\nexport function dateEndInMonth(dateValue: DateValue) {\n return _dateEnd(dateValue, 'M');\n}\n\n/**\n * 返回年级结束时间\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @returns 返回年级结束时间,月份为 12 月,日期为 31 日,时间为 23:59:59.999\n */\nexport function dateEndInYear(dateValue: DateValue) {\n return _dateEnd(dateValue, 'Y');\n}\n","import { DATE_DAY_MS } from './const';\nimport { type DateValue, dateParse } from './core';\nimport { dateEndInMonth, dateEndInYear, dateStartInMonth, dateStartInYear } from './start-end';\n\n/**\n * 计算指定日期所在年或月的天数\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @param unit - 时间单位符号,可选值为 'Y'(年)、'M'(月),默认为 'M'\n * @returns 返回指定日期所在年或月的天数\n * @example\n * ```typescript\n * dateDays(new Date('2023-02-15')); // 28\n * dateDays(new Date('2024-02-15')); // 29 (闰年)\n * dateDays(new Date('2023-02-15'), 'Y'); // 365\n * dateDays(new Date('2024-02-15'), 'Y'); // 366 (闰年)\n * ```\n */\nfunction _dateDays(dateValue: DateValue, unit: 'Y' | 'M') {\n const d = dateParse(dateValue);\n const ds = unit === 'M' ? dateStartInMonth(d) : dateStartInYear(d);\n const de = unit === 'M' ? dateEndInMonth(d) : dateEndInYear(d);\n return Math.ceil((de.getTime() - ds.getTime()) / DATE_DAY_MS);\n}\n\n/**\n * 计算指定日期所在月份的天数\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @returns 返回指定日期所在月份的天数\n * @example\n * ```typescript\n * dateDaysInMonth(new Date('2023-02-15')); // 28\n * dateDaysInMonth(new Date('2024-02-15')); // 29 (闰年)\n * ```\n */\nexport function dateDaysInMonth(dateValue: DateValue) {\n return _dateDays(dateValue, 'M');\n}\n\n/**\n * 计算指定日期所在年份的天数\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @returns 返回指定日期所在年份的天数\n * @example\n * ```typescript\n * dateDaysInYear(new Date('2023-02-15')); // 365\n * dateDaysInYear(new Date('2024-02-15')); // 366 (闰年)\n * ```\n */\nexport function dateDaysInYear(dateValue: DateValue) {\n return _dateDays(dateValue, 'Y');\n}\n","import { stringFormat } from '@/string';\nimport { isArray } from '@/type';\nimport { type DateValue, dateFormat, dateParse } from './core';\n\nexport type DateRelativeTemplate = [\n number /*单位时间差,为 0 表示不计算单位差值,单位秒*/,\n number /*最大时间差,单位:秒*/,\n string /*过去模板字符串,%d 表述单位差值*/,\n string? /*将来模板字符串,%d 表述单位差值,可选*/,\n];\nexport type DateRelativeTemplates = DateRelativeTemplate[];\n\nconst defaultDiffTemplates: DateRelativeTemplates = [\n [0, 10, '刚刚'],\n [1, 60, '{n} 秒前', '{n} 秒后'],\n [60, 60 * 60, '{n} 分钟前', '{n} 分钟后'],\n [60 * 60, 60 * 60 * 24, '{n} 小时前', '{n} 小时后'],\n [0, 60 * 60 * 24 * 2, '昨天', '明天'],\n [0, 60 * 60 * 24 * 3, '前天', '后天'],\n [60 * 60 * 24, 60 * 60 * 24 * 30, '{n} 天前', '{n} 天后'],\n [0, Number.POSITIVE_INFINITY, 'YYYY年MM月DD日'],\n];\n\n/**\n * 相对时间\n * @param {DateValue} dateValue 比较的时间\n * @param {DateValue} [refDateValue] 相对的时间,默认为当前\n * @param {DateRelativeTemplates} [templates] 模板\n * @returns {string} 格式化后的相对时间字符串\n * @example\n * ```typescript\n * // 默认模板\n * dateRelative(new Date('2023-01-01')); // '刚刚'\n * dateRelative(new Date('2023-01-01'), new Date('2023-01-02')); // '昨天'\n * dateRelative(new Date('2023-01-01'), new Date('2023-01-04')); // '3 天前'\n * dateRelative(new Date('2023-01-01'), new Date('2023-02-01')); // '2023年01月01日'\n * ```\n * @example\n * ```typescript\n * // 自定义模板\n * const templates: DateRelativeTemplates = [\n * [0, 10, '刚刚'],\n * [1, 60, '{n} 秒前', '{n} 秒后'],\n * [60, 60 * 60, '{n} 分钟前', '{n} 分钟后'],\n * [60 * 60, 60 * 60 * 24, '{n} 小时前', '{n} 小时后'],\n * [0, 60 * 60 * 24 * 2, '昨天', '明天'],\n * [0, 60 * 60 * 24 * 3, '前天', '后天'],\n * [60 * 60 * 24, 60 * 60 * 24 * 30, '{n} 天前', '{n} 天后'],\n * [0, Number.POSITIVE_INFINITY, 'YYYY年MM月DD日'],\n * ];\n * dateRelative(new Date('2023-01-01'), new Date('2023-01-02'), templates); // '昨天'\n * dateRelative(new Date('2023-01-01'), new Date('2023-01-04'), templates); // '3 天前'\n * dateRelative(new Date('2023-01-01'), new Date('2023-02-01'), templates); // '2023年01月01日'\n * ```\n */\nexport function dateRelative(dateValue: DateValue, refDateValue: DateValue, templates: DateRelativeTemplates): string;\nexport function dateRelative(dateValue: DateValue, refDateValue: DateValue): string;\nexport function dateRelative(dateValue: DateValue, templates: DateRelativeTemplates): string;\nexport function dateRelative(dateValue: DateValue): string;\nexport function dateRelative(\n dateValue: DateValue,\n refDateValue?: DateValue | DateRelativeTemplates,\n templates?: DateRelativeTemplates,\n): string {\n const now = Date.now();\n const refDateValueFinal = isArray(refDateValue) ? now : refDateValue || now;\n const templatesFinal = isArray(templates) ? templates : isArray(refDateValue) ? refDateValue : defaultDiffTemplates;\n const d1 = dateParse(dateValue);\n const d2 = dateParse(refDateValueFinal);\n const diff = d1.getTime() - d2.getTime();\n const isAgo = diff < 0;\n const absDiff = Math.abs(diff);\n let relative = '';\n\n for (const [base, max, agoTemplate, featureTemplate] of templatesFinal) {\n const unitFinal = base * 1000;\n const maxFinal = max * 1000;\n\n if (absDiff < maxFinal) {\n const template = isAgo ? agoTemplate : featureTemplate || agoTemplate;\n const length = unitFinal === 0 ? 0 : Math.max(Math.floor(absDiff / unitFinal), 1);\n relative = unitFinal === 0 ? dateFormat(dateValue, template) : stringFormat(template, { n: length });\n break;\n }\n }\n\n return relative;\n}\n","import { type DateLike, type DateValue, dateParse } from './core';\n\n/**\n * 判断给定的年份是否为闰年\n * @param year - 需要判断的年份\n * @returns 如果年份是闰年则返回 true,否则返回 false\n * @example\n * ```typescript\n * isLeapYear(2020); // true\n * isLeapYear(2021); // false\n * isLeapYear(2000); // true\n * isLeapYear(1900); // false\n * ```\n */\nexport function isLeapYear(year: number): boolean {\n if (year % 4 !== 0) return false;\n if (year % 100 !== 0) return true;\n if (year % 400 !== 0) return false;\n return true;\n}\n\n/**\n * 日期比较精度枚举类型\n * - Y = 年\n * - M = 月\n * - D = 天\n * - h = 小时\n * - m = 分钟\n * - s = 秒\n * - S = 毫秒\n */\ntype _DateSameSymbol = 'Y' | 'M' | 'D' | 'h' | 'm' | 's' | 'S';\n\n/**\n * 比较两个日期在指定精度下是否相同\n * @param date1 - 第一个日期,可以是数值、字符串或 Date 对象\n * @param date2 - 第二个日期,可以是数值、字符串或 Date 对象\n * @param sameSymbol - 比较精度,默认为 'D'(天,即年月日天都相同)\n * @returns 如果两个日期在指定精度下相同则返回 true,否则返回 false\n * @example\n * ```typescript\n * const date1 = new Date(2023, 5, 15, 12, 30, 45, 500);\n * const date2 = new Date(2023, 5, 15, 13, 30, 45, 500);\n *\n * // 比较年份\n * isSameDate(date1, date2, 'Y'); // true\n *\n * // 比较月份(年份也要相同)\n * isSameDate(date1, date2, 'M'); // true\n *\n * // 比较日期(默认,年份、月份也要相同)\n * isSameDate(date1, date2); // true\n *\n * // 比较小时(年、月、日也要相同)\n * isSameDate(date1, date2, 'h'); // false\n *\n * // 比较分钟(年、月、日、小时也要相同)\n * isSameDate(date1, date2, 'm'); // false\n *\n * // 比较秒(年、月、日、小时、分钟也要相同)\n * isSameDate(date1, date2, 's'); // false\n *\n * // 比较毫秒(年、月、日、小时、分钟、秒数也要相同)\n * isSameDate(date1, date2, 'S'); // false\n * ```\n */\nfunction _isSameDateIn(date1: DateValue, date2: DateValue, sameSymbol: _DateSameSymbol = 'D') {\n const defines = [\n ['Y', (d: DateLike) => d.getFullYear()],\n ['M', (d: DateLike) => d.getMonth()],\n ['D', (d: DateLike) => d.getDate()],\n ['h', (d: DateLike) => d.getHours()],\n ['m', (d: DateLike) => d.getMinutes()],\n ['s', (d: DateLike) => d.getSeconds()],\n ['S', (d: DateLike) => d.getMilliseconds()],\n ] as const;\n\n const d1 = dateParse(date1);\n const d2 = dateParse(date2);\n\n for (const [sym, fn] of defines) {\n if (fn(d1) !== fn(d2)) {\n return false;\n }\n\n if (sym === sameSymbol) break;\n }\n\n return true;\n}\n\n/**\n * 比较两个日期的年份是否相同\n * @param date1 - 第一个日期,可以是数值、字符串或 Date 对象\n * @param date2 - 第二个日期,可以是数值、字符串或 Date 对象\n * @returns 如果两个日期的年份相同则返回 true,否则返回 false\n * @example\n * ```typescript\n * const date1 = new Date(2023, 5, 15);\n * const date2 = new Date(2023, 6, 20);\n * isSameDateInYear(date1, date2); // true\n * ```\n */\nexport function isSameDateInYear(date1: DateValue, date2: DateValue) {\n return _isSameDateIn(date1, date2, 'Y');\n}\n\n/**\n * 比较两个日期的年份和月份是否相同\n * @param date1 - 第一个日期,可以是数值、字符串或 Date 对象\n * @param date2 - 第二个日期,可以是数值、字符串或 Date 对象\n * @returns 如果两个日期的年份和月份相同则返回 true,否则返回 false\n * @example\n * ```typescript\n * const date1 = new Date(2023, 5, 15);\n * const date2 = new Date(2023, 5, 20);\n * isSameDateInMonth(date1, date2); // true\n * ```\n */\nexport function isSameDateInMonth(date1: DateValue, date2: DateValue) {\n return _isSameDateIn(date1, date2, 'M');\n}\n\n/**\n * 比较两个日期的年份、月份和天数是否相同\n * @param date1 - 第一个日期,可以是数值、字符串或 Date 对象\n * @param date2 - 第二个日期,可以是数值、字符串或 Date 对象\n * @returns 如果两个日期的年份、月份和天数相同则返回 true,否则返回 false\n * @example\n * ```typescript\n * const date1 = new Date(2023, 5, 15);\n * const date2 = new Date(2023, 5, 15);\n * isSameDateInDay(date1, date2); // true\n * ```\n */\nexport function isSameDateInDay(date1: DateValue, date2: DateValue) {\n return _isSameDateIn(date1, date2, 'D');\n}\n\n/**\n * 比较两个日期的年份、月份、天数和小时是否相同\n * @param date1 - 第一个日期,可以是数值、字符串或 Date 对象\n * @param date2 - 第二个日期,可以是数值、字符串或 Date 对象\n * @returns 如果两个日期的年份、月份、天数和小时相同则返回 true,否则返回 false\n * @example\n * ```typescript\n * const date1 = new Date(2023, 5, 15, 12);\n * const date2 = new Date(2023, 5, 15, 12);\n * isSameDateInHour(date1, date2); // true\n * ```\n */\nexport function isSameDateInHour(date1: DateValue, date2: DateValue) {\n return _isSameDateIn(date1, date2, 'h');\n}\n\n/**\n * 比较两个日期的年份、月份、天数、小时和分钟是否相同\n * @param date1 - 第一个日期,可以是数值、字符串或 Date 对象\n * @param date2 - 第二个日期,可以是数值、字符串或 Date 对象\n * @returns 如果两个日期的年份、月份、天数、小时和分钟相同则返回 true,否则返回 false\n * @example\n * ```typescript\n * const date1 = new Date(2023, 5, 15, 12, 30);\n * const date2 = new Date(2023, 5, 15, 12, 30);\n * isSameDateInMinute(date1, date2); // true\n * ```\n */\nexport function isSameDateInMinute(date1: DateValue, date2: DateValue) {\n return _isSameDateIn(date1, date2, 'm');\n}\n\n/**\n * 比较两个日期的年份、月份、天数、小时、分钟和秒数是否相同\n * @param date1 - 第一个日期,可以是数值、字符串或 Date 对象\n * @param date2 - 第二个日期,可以是数值、字符串或 Date 对象\n * @returns 如果两个日期的年份、月份、天数、小时、分钟和秒数相同则返回 true,否则返回 false\n * @example\n * ```typescript\n * const date1 = new Date(2023, 5, 15, 12, 30, 45);\n * const date2 = new Date(2023, 5, 15, 12, 30, 45);\n * isSameDateInSecond(date1, date2); // true\n * ```\n */\nexport function isSameDateInSecond(date1: DateValue, date2: DateValue) {\n return _isSameDateIn(date1, date2, 's');\n}\n","import { DATE_DAY_MS } from './const';\nimport { type DateValue, dateParse } from './core';\n\nexport enum EWeekStart {\n /**\n * 周日作为一周的起始日\n */\n sunday = 0,\n /**\n * 周一作为一周的起始日\n */\n monday = 1,\n /**\n * 周二作为一周的起始日\n */\n tuesday = 2,\n /**\n * 周三作为一周的起始日\n */\n wednesday = 3,\n /**\n * 周四作为一周的起始日\n */\n thursday = 4,\n /**\n * 周五作为一周的起始日\n */\n friday = 5,\n /**\n * 周六作为一周的起始日\n */\n saturday = 6,\n // /**\n // * 1号所在的周为第一周\n // */\n // firstDate = 7,\n // /**\n // * 完整7天表示第一周\n // */\n // firstFullWeek = 8,\n}\n\n/**\n * 计算指定日期所在年份或月份的周数\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @param type - 计算范围,'Y' 表示年份,'M' 表示月份\n * @param weekStart - 一周的起始日,默认为 0(周日)\n * @returns 返回指定日期所在年份或月份的周数\n * @example\n * ```typescript\n * const date = new Date(2023, 0, 1); // 2023-01-01\n * _dateWeeks(date, 'Y'); // 1 (计算年份的周数)\n * _dateWeeks(date, 'M'); // 1 (计算月份的周数)\n * _dateWeeks(date, 'Y', 1); // 1 (周一作为一周的起始日,计算年份的周数)\n * ```\n */\nexport function _dateWeeks(dateValue: DateValue, type: 'Y' | 'M', weekStart: EWeekStart = 0) {\n const date = dateParse(dateValue);\n\n const year = date.getFullYear();\n const month = date.getMonth();\n\n const firstDate = type === 'Y' ? new Date(year, 0, 1) : new Date(year, month, 1);\n const firstWeek = firstDate.getDay();\n const days = Math.ceil((date.getTime() - firstDate.getTime()) / DATE_DAY_MS);\n\n return Math.ceil((firstWeek + days - weekStart) / 7);\n}\n\n/**\n * 计算指定日期所在年份的周数\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @param weekStart - 一周的起始日,默认为 0(周日)\n * @returns 返回指定日期所在年份的周数\n * @example\n * ```typescript\n * const date = new Date(2023, 0, 1); // 2023-01-01\n * weeksOfYear(date); // 1\n * weeksOfYear(date, 1); // 1 (周一作为一周的起始日)\n * ```\n */\nexport function weeksOfYear(dateValue: DateValue, weekStart: EWeekStart = 0) {\n return _dateWeeks(dateValue, 'Y', weekStart);\n}\n\n/**\n * 计算指定日期所在月份的周数\n * @param dateValue - 可以是数值、字符串或 Date 对象\n * @param weekStart - 一周的起始日,默认为 0(周日)\n * @returns 返回指定日期所在月份的周数\n * @example\n * ```typescript\n * const date = new Date(2023, 0, 1); // 2023-01-01\n * weeksOfMonth(date); // 1\n * weeksOfMonth(date, 1); // 1 (周一作为一周的起始日)\n * ```\n */\nexport function weeksOfMonth(dateValue: DateValue, weekStart: EWeekStart = 0) {\n return _dateWeeks(dateValue, 'M', weekStart);\n}\n"],"names":["d","d2","EWeekStart"],"mappings":"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"}
package/dist/dict.cjs ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=dict.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dict.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
package/dist/dict.mjs ADDED
@@ -0,0 +1,2 @@
1
+
2
+ //# sourceMappingURL=dict.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dict.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
package/dist/each.cjs ADDED
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ function objectEach(obj, iterator) {
3
+ for (const [key, val] of Object.entries(obj)) {
4
+ if (iterator.call(obj, val, key) === false) {
5
+ break;
6
+ }
7
+ }
8
+ }
9
+ async function objectEachAsync(obj, iterator) {
10
+ for (const [key, val] of Object.entries(obj)) {
11
+ if (await iterator.call(obj, val, key) === false) {
12
+ break;
13
+ }
14
+ }
15
+ }
16
+ exports.objectEach = objectEach;
17
+ exports.objectEachAsync = objectEachAsync;
18
+ //# sourceMappingURL=each.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"each.cjs","sources":["../src/object/each.ts"],"sourcesContent":["import type { AnyObject, MaybePromise } from '@/types';\n\n/**\n * 遍历对象的每个键值对,并对每个键值对执行提供的回调函数。\n *\n * @param obj - 要遍历的对象。\n * @param iterator - 对每个键值对执行的回调函数。如果回调函数返回 false,则提前终止遍历。\n *\n * @example\n * ```typescript\n * const obj = { a: 1, b: 2, c: 3 };\n * const results: [string, number][] = [];\n * objectEach(obj, (val, key) => {\n * results.push([key, val]);\n * });\n * console.log(results); // [['a', 1], ['b', 2], ['c', 3]]\n * ```\n */\nexport function objectEach<O extends AnyObject, K extends keyof O & (string | number)>(\n obj: O,\n iterator: (this: O, val: O[K], key: K) => false | unknown,\n): void {\n for (const [key, val] of Object.entries(obj)) {\n if (iterator.call(obj, val as O[K], key as K) === false) {\n break;\n }\n }\n}\n\n/**\n * 异步遍历对象的每个键值对,并对每个键值对执行提供的回调函数。\n *\n * @param obj - 要遍历的对象。\n * @param iterator - 对每个键值对执行的异步回调函数。如果回调函数返回 false,则提前终止遍历。\n * @returns 返回一个 Promise,当所有异步操作完成后,Promise 会被 resolve。\n *\n * @example\n * ```typescript\n * const obj = { a: 1, b: 2, c: 3 };\n * const results: [string, number][] = [];\n * await objectEachAsync(obj, async (val, key) => {\n * results.push([key, val]);\n * });\n * console.log(results); // [['a', 1], ['b', 2], ['c', 3]]\n * ```\n */\nexport async function objectEachAsync<O extends AnyObject, K extends keyof O & (string | number)>(\n obj: O,\n iterator: (this: O, val: O[K], key: K) => MaybePromise<false | unknown>,\n): Promise<void> {\n for (const [key, val] of Object.entries(obj)) {\n if ((await iterator.call(obj, val as O[K], key as K)) === false) {\n break;\n }\n }\n}\n"],"names":[],"mappings":";AAkBgB,SAAA,WACd,KACA,UACM;AACN,aAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC5C,QAAI,SAAS,KAAK,KAAK,KAAa,GAAQ,MAAM,OAAO;AACvD;AAAA,IAAA;AAAA,EACF;AAEJ;AAmBsB,eAAA,gBACpB,KACA,UACe;AACf,aAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC5C,QAAK,MAAM,SAAS,KAAK,KAAK,KAAa,GAAQ,MAAO,OAAO;AAC/D;AAAA,IAAA;AAAA,EACF;AAEJ;;;"}
package/dist/each.mjs ADDED
@@ -0,0 +1,19 @@
1
+ function objectEach(obj, iterator) {
2
+ for (const [key, val] of Object.entries(obj)) {
3
+ if (iterator.call(obj, val, key) === false) {
4
+ break;
5
+ }
6
+ }
7
+ }
8
+ async function objectEachAsync(obj, iterator) {
9
+ for (const [key, val] of Object.entries(obj)) {
10
+ if (await iterator.call(obj, val, key) === false) {
11
+ break;
12
+ }
13
+ }
14
+ }
15
+ export {
16
+ objectEachAsync as a,
17
+ objectEach as o
18
+ };
19
+ //# sourceMappingURL=each.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"each.mjs","sources":["../src/object/each.ts"],"sourcesContent":["import type { AnyObject, MaybePromise } from '@/types';\n\n/**\n * 遍历对象的每个键值对,并对每个键值对执行提供的回调函数。\n *\n * @param obj - 要遍历的对象。\n * @param iterator - 对每个键值对执行的回调函数。如果回调函数返回 false,则提前终止遍历。\n *\n * @example\n * ```typescript\n * const obj = { a: 1, b: 2, c: 3 };\n * const results: [string, number][] = [];\n * objectEach(obj, (val, key) => {\n * results.push([key, val]);\n * });\n * console.log(results); // [['a', 1], ['b', 2], ['c', 3]]\n * ```\n */\nexport function objectEach<O extends AnyObject, K extends keyof O & (string | number)>(\n obj: O,\n iterator: (this: O, val: O[K], key: K) => false | unknown,\n): void {\n for (const [key, val] of Object.entries(obj)) {\n if (iterator.call(obj, val as O[K], key as K) === false) {\n break;\n }\n }\n}\n\n/**\n * 异步遍历对象的每个键值对,并对每个键值对执行提供的回调函数。\n *\n * @param obj - 要遍历的对象。\n * @param iterator - 对每个键值对执行的异步回调函数。如果回调函数返回 false,则提前终止遍历。\n * @returns 返回一个 Promise,当所有异步操作完成后,Promise 会被 resolve。\n *\n * @example\n * ```typescript\n * const obj = { a: 1, b: 2, c: 3 };\n * const results: [string, number][] = [];\n * await objectEachAsync(obj, async (val, key) => {\n * results.push([key, val]);\n * });\n * console.log(results); // [['a', 1], ['b', 2], ['c', 3]]\n * ```\n */\nexport async function objectEachAsync<O extends AnyObject, K extends keyof O & (string | number)>(\n obj: O,\n iterator: (this: O, val: O[K], key: K) => MaybePromise<false | unknown>,\n): Promise<void> {\n for (const [key, val] of Object.entries(obj)) {\n if ((await iterator.call(obj, val as O[K], key as K)) === false) {\n break;\n }\n }\n}\n"],"names":[],"mappings":"AAkBgB,SAAA,WACd,KACA,UACM;AACN,aAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC5C,QAAI,SAAS,KAAK,KAAK,KAAa,GAAQ,MAAM,OAAO;AACvD;AAAA,IAAA;AAAA,EACF;AAEJ;AAmBsB,eAAA,gBACpB,KACA,UACe;AACf,aAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC5C,QAAK,MAAM,SAAS,KAAK,KAAK,KAAa,GAAQ,MAAO,OAAO;AAC/D;AAAA,IAAA;AAAA,EACF;AAEJ;"}
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const NEWTON_ITERATIONS = 4;
4
+ const NEWTON_MIN_SLOPE = 1e-3;
5
+ const SUBDIVISION_PRECISION = 1e-7;
6
+ const SUBDIVISION_MAX_ITERATIONS = 10;
7
+ const kSplineTableSize = 11;
8
+ const kSampleStepSize = 1 / (kSplineTableSize - 1);
9
+ const float32ArraySupported = typeof Float32Array === "function";
10
+ function A(aA1, aA2) {
11
+ return 1 - 3 * aA2 + 3 * aA1;
12
+ }
13
+ function B(aA1, aA2) {
14
+ return 3 * aA2 - 6 * aA1;
15
+ }
16
+ function C(aA1) {
17
+ return 3 * aA1;
18
+ }
19
+ function calcBezier(aT, aA1, aA2) {
20
+ return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT;
21
+ }
22
+ function getSlope(aT, aA1, aA2) {
23
+ return 3 * A(aA1, aA2) * aT * aT + 2 * B(aA1, aA2) * aT + C(aA1);
24
+ }
25
+ function binarySubdivide(aX, aA, aB, mX1, mX2) {
26
+ let currentX;
27
+ let currentT;
28
+ let i = 0;
29
+ let aBFinal = aB;
30
+ let aAFinal = aA;
31
+ do {
32
+ currentT = aAFinal + (aBFinal - aAFinal) / 2;
33
+ currentX = calcBezier(currentT, mX1, mX2) - aX;
34
+ if (currentX > 0) {
35
+ aBFinal = currentT;
36
+ } else {
37
+ aAFinal = currentT;
38
+ }
39
+ } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);
40
+ return currentT;
41
+ }
42
+ function newtonRaphsonIterate(aX, aGuessT, mX1, mX2) {
43
+ let aGuessTFinal = aGuessT;
44
+ for (let i = 0; i < NEWTON_ITERATIONS; ++i) {
45
+ const currentSlope = getSlope(aGuessTFinal, mX1, mX2);
46
+ if (currentSlope === 0) {
47
+ return aGuessTFinal;
48
+ }
49
+ const currentX = calcBezier(aGuessTFinal, mX1, mX2) - aX;
50
+ aGuessTFinal -= currentX / currentSlope;
51
+ }
52
+ return aGuessTFinal;
53
+ }
54
+ function LinearEasing(x) {
55
+ return x;
56
+ }
57
+ function createEasingFn(x1, y1, x2, y2) {
58
+ if (!(0 <= x1 && x1 <= 1 && 0 <= x2 && x2 <= 1)) {
59
+ throw new Error("bezier x values must be in [0, 1] range");
60
+ }
61
+ if (x1 === y1 && x2 === y2) {
62
+ return LinearEasing;
63
+ }
64
+ const sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);
65
+ for (let i = 0; i < kSplineTableSize; ++i) {
66
+ sampleValues[i] = calcBezier(i * kSampleStepSize, x1, x2);
67
+ }
68
+ function getTForX(aX) {
69
+ let intervalStart = 0;
70
+ let currentSample = 1;
71
+ const lastSample = kSplineTableSize - 1;
72
+ for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {
73
+ intervalStart += kSampleStepSize;
74
+ }
75
+ --currentSample;
76
+ const dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]);
77
+ const guessForT = intervalStart + dist * kSampleStepSize;
78
+ const initialSlope = getSlope(guessForT, x1, x2);
79
+ if (initialSlope >= NEWTON_MIN_SLOPE) {
80
+ return newtonRaphsonIterate(aX, guessForT, x1, x2);
81
+ }
82
+ if (initialSlope === 0) {
83
+ return guessForT;
84
+ }
85
+ return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, x1, x2);
86
+ }
87
+ return function easingFunc(x) {
88
+ if (x === 0 || x === 1) {
89
+ return x;
90
+ }
91
+ return calcBezier(getTForX(x), y1, y2);
92
+ };
93
+ }
94
+ const easingEase = createEasingFn(0.25, 0.1, 0.25, 1);
95
+ const easingLinear = createEasingFn(0, 0, 1, 1);
96
+ const easingSnap = createEasingFn(0, 1, 0.5, 1);
97
+ const easingIn = createEasingFn(0.42, 0, 1, 1);
98
+ const easingOut = createEasingFn(0, 0, 0.58, 1);
99
+ const easingInOut = createEasingFn(0.42, 0, 0.58, 1);
100
+ const easingInQuad = createEasingFn(0.55, 0.085, 0.68, 0.53);
101
+ const easingInCubic = createEasingFn(0.55, 0.055, 0.675, 0.19);
102
+ const easingInQuart = createEasingFn(0.895, 0.03, 0.685, 0.22);
103
+ const easingInQuint = createEasingFn(0.755, 0.05, 0.855, 0.06);
104
+ const easingInSine = createEasingFn(0.47, 0, 0.745, 0.715);
105
+ const easingInExpo = createEasingFn(0.95, 0.05, 0.795, 0.035);
106
+ const easingInCirc = createEasingFn(0.6, 0.04, 0.98, 0.335);
107
+ const easingInBack = createEasingFn(0.6, -0.28, 0.735, 0.045);
108
+ const easingOutQuad = createEasingFn(0.25, 0.46, 0.45, 0.94);
109
+ const easingOutCubic = createEasingFn(0.215, 0.61, 0.355, 1);
110
+ const easingOutQuart = createEasingFn(0.165, 0.84, 0.44, 1);
111
+ const easingOutQuint = createEasingFn(0.23, 1, 0.32, 1);
112
+ const easingOutSine = createEasingFn(0.39, 0.575, 0.565, 1);
113
+ const easingOutExpo = createEasingFn(0.19, 1, 0.22, 1);
114
+ const easingOutCirc = createEasingFn(0.075, 0.82, 0.165, 1);
115
+ const easingOutBack = createEasingFn(0.175, 0.885, 0.32, 1.275);
116
+ const easingInOutQuart = createEasingFn(0.77, 0, 0.175, 1);
117
+ const easingInOutQuint = createEasingFn(0.86, 0, 0.07, 1);
118
+ const easingInOutSine = createEasingFn(0.445, 0.05, 0.55, 0.95);
119
+ const easingInOutExpo = createEasingFn(1, 0, 0, 1);
120
+ const easingInOutCirc = createEasingFn(0.785, 0.135, 0.15, 0.86);
121
+ const easingInOutBack = createEasingFn(0.68, -0.55, 0.265, 1.55);
122
+ exports.createEasingFn = createEasingFn;
123
+ exports.easingEase = easingEase;
124
+ exports.easingIn = easingIn;
125
+ exports.easingInBack = easingInBack;
126
+ exports.easingInCirc = easingInCirc;
127
+ exports.easingInCubic = easingInCubic;
128
+ exports.easingInExpo = easingInExpo;
129
+ exports.easingInOut = easingInOut;
130
+ exports.easingInOutBack = easingInOutBack;
131
+ exports.easingInOutCirc = easingInOutCirc;
132
+ exports.easingInOutExpo = easingInOutExpo;
133
+ exports.easingInOutQuart = easingInOutQuart;
134
+ exports.easingInOutQuint = easingInOutQuint;
135
+ exports.easingInOutSine = easingInOutSine;
136
+ exports.easingInQuad = easingInQuad;
137
+ exports.easingInQuart = easingInQuart;
138
+ exports.easingInQuint = easingInQuint;
139
+ exports.easingInSine = easingInSine;
140
+ exports.easingLinear = easingLinear;
141
+ exports.easingOut = easingOut;
142
+ exports.easingOutBack = easingOutBack;
143
+ exports.easingOutCirc = easingOutCirc;
144
+ exports.easingOutCubic = easingOutCubic;
145
+ exports.easingOutExpo = easingOutExpo;
146
+ exports.easingOutQuad = easingOutQuad;
147
+ exports.easingOutQuart = easingOutQuart;
148
+ exports.easingOutQuint = easingOutQuint;
149
+ exports.easingOutSine = easingOutSine;
150
+ exports.easingSnap = easingSnap;
151
+ //# sourceMappingURL=easing.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"easing.cjs","sources":["../src/easing.ts"],"sourcesContent":["/**\n * https://github.com/gre/bezier-easing\n * BezierEasing - use bezier curve for transition easing function\n * by Gaëtan Renaudeau 2014 - 2015 – MIT License\n */\n\n// These values are established by empiricism with tests (tradeoff: performance VS precision)\nconst NEWTON_ITERATIONS = 4;\nconst NEWTON_MIN_SLOPE = 0.001;\nconst SUBDIVISION_PRECISION = 0.0000001;\nconst SUBDIVISION_MAX_ITERATIONS = 10;\n\nconst kSplineTableSize = 11;\nconst kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);\n\nconst float32ArraySupported = typeof Float32Array === 'function';\n\nfunction A(aA1: number, aA2: number) {\n return 1.0 - 3.0 * aA2 + 3.0 * aA1;\n}\nfunction B(aA1: number, aA2: number) {\n return 3.0 * aA2 - 6.0 * aA1;\n}\nfunction C(aA1: number) {\n return 3.0 * aA1;\n}\n\n// Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.\nfunction calcBezier(aT: number, aA1: number, aA2: number) {\n return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT;\n}\n\n// Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.\nfunction getSlope(aT: number, aA1: number, aA2: number) {\n return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1);\n}\n\nfunction binarySubdivide(aX: number, aA: number, aB: number, mX1: number, mX2: number) {\n let currentX: number;\n let currentT: number;\n let i = 0;\n let aBFinal = aB;\n let aAFinal = aA;\n\n do {\n currentT = aAFinal + (aBFinal - aAFinal) / 2.0;\n currentX = calcBezier(currentT, mX1, mX2) - aX;\n if (currentX > 0.0) {\n aBFinal = currentT;\n } else {\n aAFinal = currentT;\n }\n } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);\n return currentT;\n}\n\nfunction newtonRaphsonIterate(aX: number, aGuessT: number, mX1: number, mX2: number) {\n let aGuessTFinal = aGuessT;\n for (let i = 0; i < NEWTON_ITERATIONS; ++i) {\n const currentSlope = getSlope(aGuessTFinal, mX1, mX2);\n if (currentSlope === 0.0) {\n return aGuessTFinal;\n }\n const currentX = calcBezier(aGuessTFinal, mX1, mX2) - aX;\n aGuessTFinal -= currentX / currentSlope;\n }\n return aGuessTFinal;\n}\n\nfunction LinearEasing(x: number) {\n return x;\n}\n\n/**\n * 创建一个基于贝塞尔曲线的缓动函数。\n *\n * @param x1 - 贝塞尔曲线的第一个控制点的 X 坐标,必须在 [0, 1] 范围内。\n * @param y1 - 贝塞尔曲线的第一个控制点的 Y 坐标,必须在 [0, 1] 范围内。\n * @param x2 - 贝塞尔曲线的第二个控制点的 X 坐标,必须在 [0, 1] 范围内。\n * @param y2 - 贝塞尔曲线的第二个控制点的 Y 坐标,必须在 [0, 1] 范围内。\n * @returns 返回一个缓动函数,该函数接受一个参数 x(范围在 0 到 1 之间),并返回相应的缓动值。\n * @throws 如果 mX1 或 mX2 不在 [0, 1] 范围内,则抛出错误。\n */\nexport function createEasingFn(x1: number, y1: number, x2: number, y2: number) {\n if (!(0 <= x1 && x1 <= 1 && 0 <= x2 && x2 <= 1)) {\n throw new Error('bezier x values must be in [0, 1] range');\n }\n\n if (x1 === y1 && x2 === y2) {\n return LinearEasing;\n }\n\n // Precompute samples table\n const sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);\n for (let i = 0; i < kSplineTableSize; ++i) {\n sampleValues[i] = calcBezier(i * kSampleStepSize, x1, x2);\n }\n\n function getTForX(aX: number) {\n let intervalStart = 0.0;\n let currentSample = 1;\n const lastSample = kSplineTableSize - 1;\n\n for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {\n intervalStart += kSampleStepSize;\n }\n --currentSample;\n\n // Interpolate to provide an initial guess for t\n const dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]);\n const guessForT = intervalStart + dist * kSampleStepSize;\n const initialSlope = getSlope(guessForT, x1, x2);\n\n if (initialSlope >= NEWTON_MIN_SLOPE) {\n return newtonRaphsonIterate(aX, guessForT, x1, x2);\n }\n\n if (initialSlope === 0.0) {\n return guessForT;\n }\n\n return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, x1, x2);\n }\n\n /**\n * 贝塞尔曲线方程\n * @param x {number} 0~1\n */\n return function easingFunc(x: number) {\n // Because JavaScript number are imprecise, we should guarantee the extremes are right.\n if (x === 0 || x === 1) {\n return x;\n }\n\n return calcBezier(getTForX(x), y1, y2);\n };\n}\n\nexport const easingEase = createEasingFn(0.25, 0.1, 0.25, 1);\nexport const easingLinear = createEasingFn(0, 0, 1, 1);\nexport const easingSnap = createEasingFn(0, 1, 0.5, 1);\nexport const easingIn = createEasingFn(0.42, 0, 1, 1);\nexport const easingOut = createEasingFn(0, 0, 0.58, 1);\nexport const easingInOut = createEasingFn(0.42, 0, 0.58, 1);\nexport const easingInQuad = createEasingFn(0.55, 0.085, 0.68, 0.53);\nexport const easingInCubic = createEasingFn(0.55, 0.055, 0.675, 0.19);\nexport const easingInQuart = createEasingFn(0.895, 0.03, 0.685, 0.22);\nexport const easingInQuint = createEasingFn(0.755, 0.05, 0.855, 0.06);\nexport const easingInSine = createEasingFn(0.47, 0, 0.745, 0.715);\nexport const easingInExpo = createEasingFn(0.95, 0.05, 0.795, 0.035);\nexport const easingInCirc = createEasingFn(0.6, 0.04, 0.98, 0.335);\nexport const easingInBack = createEasingFn(0.6, -0.28, 0.735, 0.045);\nexport const easingOutQuad = createEasingFn(0.25, 0.46, 0.45, 0.94);\nexport const easingOutCubic = createEasingFn(0.215, 0.61, 0.355, 1);\nexport const easingOutQuart = createEasingFn(0.165, 0.84, 0.44, 1);\nexport const easingOutQuint = createEasingFn(0.23, 1, 0.32, 1);\nexport const easingOutSine = createEasingFn(0.39, 0.575, 0.565, 1);\nexport const easingOutExpo = createEasingFn(0.19, 1, 0.22, 1);\nexport const easingOutCirc = createEasingFn(0.075, 0.82, 0.165, 1);\nexport const easingOutBack = createEasingFn(0.175, 0.885, 0.32, 1.275);\nexport const easingInOutQuart = createEasingFn(0.77, 0, 0.175, 1);\nexport const easingInOutQuint = createEasingFn(0.86, 0, 0.07, 1);\nexport const easingInOutSine = createEasingFn(0.445, 0.05, 0.55, 0.95);\nexport const easingInOutExpo = createEasingFn(1, 0, 0, 1);\nexport const easingInOutCirc = createEasingFn(0.785, 0.135, 0.15, 0.86);\nexport const easingInOutBack = createEasingFn(0.68, -0.55, 0.265, 1.55);\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * https://github.com/gre/bezier-easing
3
+ * BezierEasing - use bezier curve for transition easing function
4
+ * by Gaëtan Renaudeau 2014 - 2015 – MIT License
5
+ */
6
+ declare function LinearEasing(x: number): number;
7
+ /**
8
+ * 创建一个基于贝塞尔曲线的缓动函数。
9
+ *
10
+ * @param x1 - 贝塞尔曲线的第一个控制点的 X 坐标,必须在 [0, 1] 范围内。
11
+ * @param y1 - 贝塞尔曲线的第一个控制点的 Y 坐标,必须在 [0, 1] 范围内。
12
+ * @param x2 - 贝塞尔曲线的第二个控制点的 X 坐标,必须在 [0, 1] 范围内。
13
+ * @param y2 - 贝塞尔曲线的第二个控制点的 Y 坐标,必须在 [0, 1] 范围内。
14
+ * @returns 返回一个缓动函数,该函数接受一个参数 x(范围在 0 到 1 之间),并返回相应的缓动值。
15
+ * @throws 如果 mX1 或 mX2 不在 [0, 1] 范围内,则抛出错误。
16
+ */
17
+ export declare function createEasingFn(x1: number, y1: number, x2: number, y2: number): typeof LinearEasing;
18
+ export declare const easingEase: typeof LinearEasing;
19
+ export declare const easingLinear: typeof LinearEasing;
20
+ export declare const easingSnap: typeof LinearEasing;
21
+ export declare const easingIn: typeof LinearEasing;
22
+ export declare const easingOut: typeof LinearEasing;
23
+ export declare const easingInOut: typeof LinearEasing;
24
+ export declare const easingInQuad: typeof LinearEasing;
25
+ export declare const easingInCubic: typeof LinearEasing;
26
+ export declare const easingInQuart: typeof LinearEasing;
27
+ export declare const easingInQuint: typeof LinearEasing;
28
+ export declare const easingInSine: typeof LinearEasing;
29
+ export declare const easingInExpo: typeof LinearEasing;
30
+ export declare const easingInCirc: typeof LinearEasing;
31
+ export declare const easingInBack: typeof LinearEasing;
32
+ export declare const easingOutQuad: typeof LinearEasing;
33
+ export declare const easingOutCubic: typeof LinearEasing;
34
+ export declare const easingOutQuart: typeof LinearEasing;
35
+ export declare const easingOutQuint: typeof LinearEasing;
36
+ export declare const easingOutSine: typeof LinearEasing;
37
+ export declare const easingOutExpo: typeof LinearEasing;
38
+ export declare const easingOutCirc: typeof LinearEasing;
39
+ export declare const easingOutBack: typeof LinearEasing;
40
+ export declare const easingInOutQuart: typeof LinearEasing;
41
+ export declare const easingInOutQuint: typeof LinearEasing;
42
+ export declare const easingInOutSine: typeof LinearEasing;
43
+ export declare const easingInOutExpo: typeof LinearEasing;
44
+ export declare const easingInOutCirc: typeof LinearEasing;
45
+ export declare const easingInOutBack: typeof LinearEasing;
46
+ export {};
@@ -0,0 +1,151 @@
1
+ const NEWTON_ITERATIONS = 4;
2
+ const NEWTON_MIN_SLOPE = 1e-3;
3
+ const SUBDIVISION_PRECISION = 1e-7;
4
+ const SUBDIVISION_MAX_ITERATIONS = 10;
5
+ const kSplineTableSize = 11;
6
+ const kSampleStepSize = 1 / (kSplineTableSize - 1);
7
+ const float32ArraySupported = typeof Float32Array === "function";
8
+ function A(aA1, aA2) {
9
+ return 1 - 3 * aA2 + 3 * aA1;
10
+ }
11
+ function B(aA1, aA2) {
12
+ return 3 * aA2 - 6 * aA1;
13
+ }
14
+ function C(aA1) {
15
+ return 3 * aA1;
16
+ }
17
+ function calcBezier(aT, aA1, aA2) {
18
+ return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT;
19
+ }
20
+ function getSlope(aT, aA1, aA2) {
21
+ return 3 * A(aA1, aA2) * aT * aT + 2 * B(aA1, aA2) * aT + C(aA1);
22
+ }
23
+ function binarySubdivide(aX, aA, aB, mX1, mX2) {
24
+ let currentX;
25
+ let currentT;
26
+ let i = 0;
27
+ let aBFinal = aB;
28
+ let aAFinal = aA;
29
+ do {
30
+ currentT = aAFinal + (aBFinal - aAFinal) / 2;
31
+ currentX = calcBezier(currentT, mX1, mX2) - aX;
32
+ if (currentX > 0) {
33
+ aBFinal = currentT;
34
+ } else {
35
+ aAFinal = currentT;
36
+ }
37
+ } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);
38
+ return currentT;
39
+ }
40
+ function newtonRaphsonIterate(aX, aGuessT, mX1, mX2) {
41
+ let aGuessTFinal = aGuessT;
42
+ for (let i = 0; i < NEWTON_ITERATIONS; ++i) {
43
+ const currentSlope = getSlope(aGuessTFinal, mX1, mX2);
44
+ if (currentSlope === 0) {
45
+ return aGuessTFinal;
46
+ }
47
+ const currentX = calcBezier(aGuessTFinal, mX1, mX2) - aX;
48
+ aGuessTFinal -= currentX / currentSlope;
49
+ }
50
+ return aGuessTFinal;
51
+ }
52
+ function LinearEasing(x) {
53
+ return x;
54
+ }
55
+ function createEasingFn(x1, y1, x2, y2) {
56
+ if (!(0 <= x1 && x1 <= 1 && 0 <= x2 && x2 <= 1)) {
57
+ throw new Error("bezier x values must be in [0, 1] range");
58
+ }
59
+ if (x1 === y1 && x2 === y2) {
60
+ return LinearEasing;
61
+ }
62
+ const sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);
63
+ for (let i = 0; i < kSplineTableSize; ++i) {
64
+ sampleValues[i] = calcBezier(i * kSampleStepSize, x1, x2);
65
+ }
66
+ function getTForX(aX) {
67
+ let intervalStart = 0;
68
+ let currentSample = 1;
69
+ const lastSample = kSplineTableSize - 1;
70
+ for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {
71
+ intervalStart += kSampleStepSize;
72
+ }
73
+ --currentSample;
74
+ const dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]);
75
+ const guessForT = intervalStart + dist * kSampleStepSize;
76
+ const initialSlope = getSlope(guessForT, x1, x2);
77
+ if (initialSlope >= NEWTON_MIN_SLOPE) {
78
+ return newtonRaphsonIterate(aX, guessForT, x1, x2);
79
+ }
80
+ if (initialSlope === 0) {
81
+ return guessForT;
82
+ }
83
+ return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, x1, x2);
84
+ }
85
+ return function easingFunc(x) {
86
+ if (x === 0 || x === 1) {
87
+ return x;
88
+ }
89
+ return calcBezier(getTForX(x), y1, y2);
90
+ };
91
+ }
92
+ const easingEase = createEasingFn(0.25, 0.1, 0.25, 1);
93
+ const easingLinear = createEasingFn(0, 0, 1, 1);
94
+ const easingSnap = createEasingFn(0, 1, 0.5, 1);
95
+ const easingIn = createEasingFn(0.42, 0, 1, 1);
96
+ const easingOut = createEasingFn(0, 0, 0.58, 1);
97
+ const easingInOut = createEasingFn(0.42, 0, 0.58, 1);
98
+ const easingInQuad = createEasingFn(0.55, 0.085, 0.68, 0.53);
99
+ const easingInCubic = createEasingFn(0.55, 0.055, 0.675, 0.19);
100
+ const easingInQuart = createEasingFn(0.895, 0.03, 0.685, 0.22);
101
+ const easingInQuint = createEasingFn(0.755, 0.05, 0.855, 0.06);
102
+ const easingInSine = createEasingFn(0.47, 0, 0.745, 0.715);
103
+ const easingInExpo = createEasingFn(0.95, 0.05, 0.795, 0.035);
104
+ const easingInCirc = createEasingFn(0.6, 0.04, 0.98, 0.335);
105
+ const easingInBack = createEasingFn(0.6, -0.28, 0.735, 0.045);
106
+ const easingOutQuad = createEasingFn(0.25, 0.46, 0.45, 0.94);
107
+ const easingOutCubic = createEasingFn(0.215, 0.61, 0.355, 1);
108
+ const easingOutQuart = createEasingFn(0.165, 0.84, 0.44, 1);
109
+ const easingOutQuint = createEasingFn(0.23, 1, 0.32, 1);
110
+ const easingOutSine = createEasingFn(0.39, 0.575, 0.565, 1);
111
+ const easingOutExpo = createEasingFn(0.19, 1, 0.22, 1);
112
+ const easingOutCirc = createEasingFn(0.075, 0.82, 0.165, 1);
113
+ const easingOutBack = createEasingFn(0.175, 0.885, 0.32, 1.275);
114
+ const easingInOutQuart = createEasingFn(0.77, 0, 0.175, 1);
115
+ const easingInOutQuint = createEasingFn(0.86, 0, 0.07, 1);
116
+ const easingInOutSine = createEasingFn(0.445, 0.05, 0.55, 0.95);
117
+ const easingInOutExpo = createEasingFn(1, 0, 0, 1);
118
+ const easingInOutCirc = createEasingFn(0.785, 0.135, 0.15, 0.86);
119
+ const easingInOutBack = createEasingFn(0.68, -0.55, 0.265, 1.55);
120
+ export {
121
+ createEasingFn,
122
+ easingEase,
123
+ easingIn,
124
+ easingInBack,
125
+ easingInCirc,
126
+ easingInCubic,
127
+ easingInExpo,
128
+ easingInOut,
129
+ easingInOutBack,
130
+ easingInOutCirc,
131
+ easingInOutExpo,
132
+ easingInOutQuart,
133
+ easingInOutQuint,
134
+ easingInOutSine,
135
+ easingInQuad,
136
+ easingInQuart,
137
+ easingInQuint,
138
+ easingInSine,
139
+ easingLinear,
140
+ easingOut,
141
+ easingOutBack,
142
+ easingOutCirc,
143
+ easingOutCubic,
144
+ easingOutExpo,
145
+ easingOutQuad,
146
+ easingOutQuart,
147
+ easingOutQuint,
148
+ easingOutSine,
149
+ easingSnap
150
+ };
151
+ //# sourceMappingURL=easing.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"easing.mjs","sources":["../src/easing.ts"],"sourcesContent":["/**\n * https://github.com/gre/bezier-easing\n * BezierEasing - use bezier curve for transition easing function\n * by Gaëtan Renaudeau 2014 - 2015 – MIT License\n */\n\n// These values are established by empiricism with tests (tradeoff: performance VS precision)\nconst NEWTON_ITERATIONS = 4;\nconst NEWTON_MIN_SLOPE = 0.001;\nconst SUBDIVISION_PRECISION = 0.0000001;\nconst SUBDIVISION_MAX_ITERATIONS = 10;\n\nconst kSplineTableSize = 11;\nconst kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);\n\nconst float32ArraySupported = typeof Float32Array === 'function';\n\nfunction A(aA1: number, aA2: number) {\n return 1.0 - 3.0 * aA2 + 3.0 * aA1;\n}\nfunction B(aA1: number, aA2: number) {\n return 3.0 * aA2 - 6.0 * aA1;\n}\nfunction C(aA1: number) {\n return 3.0 * aA1;\n}\n\n// Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.\nfunction calcBezier(aT: number, aA1: number, aA2: number) {\n return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT;\n}\n\n// Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.\nfunction getSlope(aT: number, aA1: number, aA2: number) {\n return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1);\n}\n\nfunction binarySubdivide(aX: number, aA: number, aB: number, mX1: number, mX2: number) {\n let currentX: number;\n let currentT: number;\n let i = 0;\n let aBFinal = aB;\n let aAFinal = aA;\n\n do {\n currentT = aAFinal + (aBFinal - aAFinal) / 2.0;\n currentX = calcBezier(currentT, mX1, mX2) - aX;\n if (currentX > 0.0) {\n aBFinal = currentT;\n } else {\n aAFinal = currentT;\n }\n } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);\n return currentT;\n}\n\nfunction newtonRaphsonIterate(aX: number, aGuessT: number, mX1: number, mX2: number) {\n let aGuessTFinal = aGuessT;\n for (let i = 0; i < NEWTON_ITERATIONS; ++i) {\n const currentSlope = getSlope(aGuessTFinal, mX1, mX2);\n if (currentSlope === 0.0) {\n return aGuessTFinal;\n }\n const currentX = calcBezier(aGuessTFinal, mX1, mX2) - aX;\n aGuessTFinal -= currentX / currentSlope;\n }\n return aGuessTFinal;\n}\n\nfunction LinearEasing(x: number) {\n return x;\n}\n\n/**\n * 创建一个基于贝塞尔曲线的缓动函数。\n *\n * @param x1 - 贝塞尔曲线的第一个控制点的 X 坐标,必须在 [0, 1] 范围内。\n * @param y1 - 贝塞尔曲线的第一个控制点的 Y 坐标,必须在 [0, 1] 范围内。\n * @param x2 - 贝塞尔曲线的第二个控制点的 X 坐标,必须在 [0, 1] 范围内。\n * @param y2 - 贝塞尔曲线的第二个控制点的 Y 坐标,必须在 [0, 1] 范围内。\n * @returns 返回一个缓动函数,该函数接受一个参数 x(范围在 0 到 1 之间),并返回相应的缓动值。\n * @throws 如果 mX1 或 mX2 不在 [0, 1] 范围内,则抛出错误。\n */\nexport function createEasingFn(x1: number, y1: number, x2: number, y2: number) {\n if (!(0 <= x1 && x1 <= 1 && 0 <= x2 && x2 <= 1)) {\n throw new Error('bezier x values must be in [0, 1] range');\n }\n\n if (x1 === y1 && x2 === y2) {\n return LinearEasing;\n }\n\n // Precompute samples table\n const sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);\n for (let i = 0; i < kSplineTableSize; ++i) {\n sampleValues[i] = calcBezier(i * kSampleStepSize, x1, x2);\n }\n\n function getTForX(aX: number) {\n let intervalStart = 0.0;\n let currentSample = 1;\n const lastSample = kSplineTableSize - 1;\n\n for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {\n intervalStart += kSampleStepSize;\n }\n --currentSample;\n\n // Interpolate to provide an initial guess for t\n const dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]);\n const guessForT = intervalStart + dist * kSampleStepSize;\n const initialSlope = getSlope(guessForT, x1, x2);\n\n if (initialSlope >= NEWTON_MIN_SLOPE) {\n return newtonRaphsonIterate(aX, guessForT, x1, x2);\n }\n\n if (initialSlope === 0.0) {\n return guessForT;\n }\n\n return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, x1, x2);\n }\n\n /**\n * 贝塞尔曲线方程\n * @param x {number} 0~1\n */\n return function easingFunc(x: number) {\n // Because JavaScript number are imprecise, we should guarantee the extremes are right.\n if (x === 0 || x === 1) {\n return x;\n }\n\n return calcBezier(getTForX(x), y1, y2);\n };\n}\n\nexport const easingEase = createEasingFn(0.25, 0.1, 0.25, 1);\nexport const easingLinear = createEasingFn(0, 0, 1, 1);\nexport const easingSnap = createEasingFn(0, 1, 0.5, 1);\nexport const easingIn = createEasingFn(0.42, 0, 1, 1);\nexport const easingOut = createEasingFn(0, 0, 0.58, 1);\nexport const easingInOut = createEasingFn(0.42, 0, 0.58, 1);\nexport const easingInQuad = createEasingFn(0.55, 0.085, 0.68, 0.53);\nexport const easingInCubic = createEasingFn(0.55, 0.055, 0.675, 0.19);\nexport const easingInQuart = createEasingFn(0.895, 0.03, 0.685, 0.22);\nexport const easingInQuint = createEasingFn(0.755, 0.05, 0.855, 0.06);\nexport const easingInSine = createEasingFn(0.47, 0, 0.745, 0.715);\nexport const easingInExpo = createEasingFn(0.95, 0.05, 0.795, 0.035);\nexport const easingInCirc = createEasingFn(0.6, 0.04, 0.98, 0.335);\nexport const easingInBack = createEasingFn(0.6, -0.28, 0.735, 0.045);\nexport const easingOutQuad = createEasingFn(0.25, 0.46, 0.45, 0.94);\nexport const easingOutCubic = createEasingFn(0.215, 0.61, 0.355, 1);\nexport const easingOutQuart = createEasingFn(0.165, 0.84, 0.44, 1);\nexport const easingOutQuint = createEasingFn(0.23, 1, 0.32, 1);\nexport const easingOutSine = createEasingFn(0.39, 0.575, 0.565, 1);\nexport const easingOutExpo = createEasingFn(0.19, 1, 0.22, 1);\nexport const easingOutCirc = createEasingFn(0.075, 0.82, 0.165, 1);\nexport const easingOutBack = createEasingFn(0.175, 0.885, 0.32, 1.275);\nexport const easingInOutQuart = createEasingFn(0.77, 0, 0.175, 1);\nexport const easingInOutQuint = createEasingFn(0.86, 0, 0.07, 1);\nexport const easingInOutSine = createEasingFn(0.445, 0.05, 0.55, 0.95);\nexport const easingInOutExpo = createEasingFn(1, 0, 0, 1);\nexport const easingInOutCirc = createEasingFn(0.785, 0.135, 0.15, 0.86);\nexport const easingInOutBack = createEasingFn(0.68, -0.55, 0.265, 1.55);\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ var __typeError = (msg) => {
3
+ throw TypeError(msg);
4
+ };
5
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
6
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
7
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
8
+ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
9
+ var _events, _Emitter_instances, offAll_fn, offEvent_fn, offListener_fn;
10
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
11
+ class Emitter {
12
+ constructor() {
13
+ __privateAdd(this, _Emitter_instances);
14
+ __privateAdd(this, _events, /* @__PURE__ */ new Map());
15
+ }
16
+ /**
17
+ * 注册事件监听器
18
+ * @param event - 要监听的事件名称
19
+ * @param listener - 事件监听器函数
20
+ * @example
21
+ * emitter.on('click', (x, y) => {
22
+ * console.log(`Clicked at (${x}, ${y})`);
23
+ * });
24
+ */
25
+ on(event, listener) {
26
+ const listeners = __privateGet(this, _events).get(event);
27
+ if (listeners) {
28
+ listeners.add(listener);
29
+ } else {
30
+ __privateGet(this, _events).set(event, /* @__PURE__ */ new Set([listener]));
31
+ }
32
+ }
33
+ /**
34
+ * 移除事件监听器,有三种使用方式:
35
+ * 1. 移除特定事件的特定监听器
36
+ * 2. 移除特定事件的所有监听器
37
+ * 3. 移除所有事件的所有监听器
38
+ * @param event - 要移除的事件名称(可选)
39
+ * @param listener - 要移除的监听器函数(可选)
40
+ * @example
41
+ * // 移除特定事件的特定监听器
42
+ * emitter.off('click', clickHandler);
43
+ *
44
+ * // 移除特定事件的所有监听器
45
+ * emitter.off('click');
46
+ *
47
+ * // 移除所有事件的所有监听器
48
+ * emitter.off();
49
+ */
50
+ off(event, listener) {
51
+ if (event && listener) {
52
+ __privateMethod(this, _Emitter_instances, offListener_fn).call(this, event, listener);
53
+ } else if (event) {
54
+ __privateMethod(this, _Emitter_instances, offEvent_fn).call(this, event);
55
+ } else {
56
+ __privateMethod(this, _Emitter_instances, offAll_fn).call(this);
57
+ }
58
+ }
59
+ /**
60
+ * 触发指定事件,调用所有注册的监听器
61
+ * @param event - 要触发的事件名称
62
+ * @param payloads - 传递给监听器的参数
63
+ * @remarks
64
+ * 监听器会按照注册的顺序依次执行,如果某个监听器返回 false,
65
+ * 则后续监听器将不会被执行
66
+ * @example
67
+ * emitter.emit('click', 10, 20);
68
+ */
69
+ emit(event, ...payloads) {
70
+ const listeners = __privateGet(this, _events).get(event);
71
+ if (!listeners) return;
72
+ for (const listener of [...listeners]) {
73
+ if (listener(...payloads) === false) {
74
+ break;
75
+ }
76
+ }
77
+ }
78
+ }
79
+ _events = new WeakMap();
80
+ _Emitter_instances = new WeakSet();
81
+ offAll_fn = function() {
82
+ __privateGet(this, _events).clear();
83
+ };
84
+ offEvent_fn = function(event) {
85
+ __privateGet(this, _events).delete(event);
86
+ };
87
+ offListener_fn = function(event, listener) {
88
+ const listeners = __privateGet(this, _events).get(event);
89
+ if (listeners) {
90
+ listeners.delete(listener);
91
+ }
92
+ };
93
+ exports.Emitter = Emitter;
94
+ //# sourceMappingURL=emitter.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter.cjs","sources":["../src/emitter.ts"],"sourcesContent":["import type { AnyFunction, AnyObject } from './types';\n\n/**\n * 事件类型映射,key 为事件名称,value 为事件参数类型数组\n */\nexport type EmitterMap = Record<string, unknown[]>;\n\n/**\n * 事件监听器函数类型\n * @template E - EmitterMap 类型\n * @template K - 事件名称类型\n */\nexport type EmitterListener<E extends EmitterMap, K extends keyof E> = (...payloads: E[K]) => false | unknown;\n\n/**\n * 事件发射器类,用于管理事件监听和触发\n * @template E - 事件类型映射\n *\n * @example\n * type MyEvents = {\n * 'click': [x: number, y: number];\n * 'change': [value: string];\n * };\n *\n * const emitter = new Emitter<MyEvents>();\n * emitter.on('click', (x, y) => {\n * console.log(`Clicked at (${x}, ${y})`);\n * });\n * emitter.emit('click', 10, 20);\n */\nexport class Emitter<E extends EmitterMap> {\n #events: Map<keyof E, Set<AnyFunction>> = new Map();\n\n /**\n * 注册事件监听器\n * @param event - 要监听的事件名称\n * @param listener - 事件监听器函数\n * @example\n * emitter.on('click', (x, y) => {\n * console.log(`Clicked at (${x}, ${y})`);\n * });\n */\n on<K extends keyof E>(event: K, listener: EmitterListener<E, K>) {\n const listeners = this.#events.get(event);\n if (listeners) {\n listeners.add(listener);\n } else {\n this.#events.set(event, new Set([listener]));\n }\n }\n\n /**\n * 移除事件监听器,有三种使用方式:\n * 1. 移除特定事件的特定监听器\n * 2. 移除特定事件的所有监听器\n * 3. 移除所有事件的所有监听器\n * @param event - 要移除的事件名称(可选)\n * @param listener - 要移除的监听器函数(可选)\n * @example\n * // 移除特定事件的特定监听器\n * emitter.off('click', clickHandler);\n *\n * // 移除特定事件的所有监听器\n * emitter.off('click');\n *\n * // 移除所有事件的所有监听器\n * emitter.off();\n */\n off<K extends keyof E>(event?: K, listener?: EmitterListener<E, K>) {\n if (event && listener) {\n this.#offListener(event, listener);\n } else if (event) {\n this.#offEvent(event);\n } else {\n this.#offAll();\n }\n }\n\n #offAll() {\n this.#events.clear();\n }\n\n #offEvent<K extends keyof E>(event: K) {\n this.#events.delete(event);\n }\n\n #offListener<K extends keyof E>(event: K, listener: EmitterListener<E, K>) {\n const listeners = this.#events.get(event);\n\n if (listeners) {\n listeners.delete(listener);\n }\n }\n\n /**\n * 触发指定事件,调用所有注册的监听器\n * @param event - 要触发的事件名称\n * @param payloads - 传递给监听器的参数\n * @remarks\n * 监听器会按照注册的顺序依次执行,如果某个监听器返回 false,\n * 则后续监听器将不会被执行\n * @example\n * emitter.emit('click', 10, 20);\n */\n emit<K extends keyof E>(event: K, ...payloads: Parameters<EmitterListener<E, K>>) {\n const listeners = this.#events.get(event) as Set<EmitterListener<E, K>> | undefined;\n\n if (!listeners) return;\n\n // 避免在 emit、on 的过程中改变 listeners 从而影响本次 emit\n for (const listener of [...listeners]) {\n if (listener(...payloads) === false) {\n break;\n }\n }\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;AA8BO,MAAM,QAA8B;AAAA,EAApC;AAAA;AACL,oDAA8C,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWlD,GAAsB,OAAU,UAAiC;AAC/D,UAAM,YAAY,mBAAK,SAAQ,IAAI,KAAK;AACxC,QAAI,WAAW;AACb,gBAAU,IAAI,QAAQ;AAAA,IAAA,OACjB;AACA,yBAAA,SAAQ,IAAI,OAAO,oBAAI,IAAI,CAAC,QAAQ,CAAC,CAAC;AAAA,IAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoBF,IAAuB,OAAW,UAAkC;AAClE,QAAI,SAAS,UAAU;AAChB,4BAAA,oCAAA,WAAa,OAAO;AAAA,eAChB,OAAO;AAChB,4BAAK,iCAAL,WAAe;AAAA,IAAK,OACf;AACL,4BAAK,+BAAL;AAAA,IAAa;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6BF,KAAwB,UAAa,UAA6C;AAChF,UAAM,YAAY,mBAAK,SAAQ,IAAI,KAAK;AAExC,QAAI,CAAC,UAAW;AAGhB,eAAW,YAAY,CAAC,GAAG,SAAS,GAAG;AACrC,UAAI,SAAS,GAAG,QAAQ,MAAM,OAAO;AACnC;AAAA,MAAA;AAAA,IACF;AAAA,EACF;AAEJ;AArFE;AADK;AAgDL,YAAU,WAAA;AACR,qBAAK,SAAQ,MAAM;AAAA;AAGrB,uBAA6B,OAAU;AAChC,qBAAA,SAAQ,OAAO,KAAK;AAAA;AAG3B,iBAAA,SAAgC,OAAU,UAAiC;AACzE,QAAM,YAAY,mBAAK,SAAQ,IAAI,KAAK;AAExC,MAAI,WAAW;AACb,cAAU,OAAO,QAAQ;AAAA,EAAA;AAC3B;;"}