@wener/common 2.0.5 → 2.0.6

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 (206) hide show
  1. package/lib/ai/qwen3vl/index.js +1 -1
  2. package/lib/ai/qwen3vl/utils.js +15 -15
  3. package/lib/ai/vision/DocLayoutElementTypeSchema.js +22 -22
  4. package/lib/ai/vision/ImageAnnotationSchema.js +63 -47
  5. package/lib/ai/vision/index.js +2 -2
  6. package/lib/ai/vision/resolveImageAnnotation.js +81 -95
  7. package/lib/cn/ChineseResidentIdNo.js +55 -41
  8. package/lib/cn/ChineseResidentIdNo.mod.js +6 -1
  9. package/lib/cn/ChineseResidentIdNo.test.js +22 -21
  10. package/lib/cn/DivisionCode.js +220 -235
  11. package/lib/cn/DivisionCode.mod.js +6 -1
  12. package/lib/cn/DivisionCode.test.js +92 -121
  13. package/lib/cn/Mod11.js +18 -37
  14. package/lib/cn/Mod31.js +23 -41
  15. package/lib/cn/UnifiedSocialCreditCode.js +143 -137
  16. package/lib/cn/UnifiedSocialCreditCode.mod.js +6 -1
  17. package/lib/cn/UnifiedSocialCreditCode.test.js +21 -15
  18. package/lib/cn/formatChineseAmount.js +46 -71
  19. package/lib/cn/index.js +6 -6
  20. package/lib/cn/mod.js +5 -3
  21. package/lib/cn/parseChineseNumber.js +81 -85
  22. package/lib/cn/parseChineseNumber.test.js +183 -261
  23. package/lib/cn/pinyin/cartesianProduct.js +19 -19
  24. package/lib/cn/pinyin/cartesianProduct.test.js +78 -178
  25. package/lib/cn/pinyin/loader.js +13 -11
  26. package/lib/cn/pinyin/preload.js +2 -1
  27. package/lib/cn/pinyin/toPinyin.test.js +149 -161
  28. package/lib/cn/pinyin/toPinyinPure.js +28 -23
  29. package/lib/cn/pinyin/transform.js +11 -11
  30. package/lib/cn/types.d.js +2 -2
  31. package/lib/consola/createStandardConsolaReporter.js +14 -15
  32. package/lib/consola/formatLogObject.js +149 -133
  33. package/lib/consola/formatLogObject.test.js +167 -178
  34. package/lib/consola/index.js +2 -2
  35. package/lib/data/formatSort.js +14 -12
  36. package/lib/data/formatSort.test.js +33 -33
  37. package/lib/data/index.js +3 -3
  38. package/lib/data/maybeNumber.js +23 -23
  39. package/lib/data/parseSort.js +75 -68
  40. package/lib/data/parseSort.test.js +196 -187
  41. package/lib/data/resolvePagination.js +38 -39
  42. package/lib/data/resolvePagination.test.js +228 -218
  43. package/lib/data/types.d.js +2 -2
  44. package/lib/dayjs/dayjs.js +20 -20
  45. package/lib/dayjs/formatDuration.js +56 -56
  46. package/lib/dayjs/formatDuration.test.js +63 -77
  47. package/lib/dayjs/index.js +4 -4
  48. package/lib/dayjs/parseDuration.js +21 -26
  49. package/lib/dayjs/parseRelativeTime.js +65 -66
  50. package/lib/dayjs/parseRelativeTime.test.js +227 -243
  51. package/lib/dayjs/resolveRelativeTime.js +73 -72
  52. package/lib/dayjs/resolveRelativeTime.test.js +296 -307
  53. package/lib/decimal/index.js +1 -1
  54. package/lib/decimal/parseDecimal.js +12 -12
  55. package/lib/drain3/Drain.js +303 -338
  56. package/lib/drain3/LogCluster.js +25 -25
  57. package/lib/drain3/Node.js +24 -24
  58. package/lib/drain3/TemplateMiner.js +197 -196
  59. package/lib/drain3/index.js +5 -5
  60. package/lib/drain3/persistence/FilePersistence.js +19 -19
  61. package/lib/drain3/persistence/MemoryPersistence.js +8 -8
  62. package/lib/drain3/persistence/PersistenceHandler.js +2 -2
  63. package/lib/drain3/types.js +2 -2
  64. package/lib/emittery/emitter.js +7 -7
  65. package/lib/emittery/index.js +1 -1
  66. package/lib/foundation/schema/SexType.js +15 -12
  67. package/lib/foundation/schema/index.js +1 -1
  68. package/lib/foundation/schema/parseSexType.js +15 -16
  69. package/lib/foundation/schema/types.js +8 -6
  70. package/lib/fs/FileSystemError.js +18 -18
  71. package/lib/fs/IFileSystem.d.js +2 -2
  72. package/lib/fs/MemoryFileSystem.test.js +172 -181
  73. package/lib/fs/createBrowserFileSystem.js +222 -235
  74. package/lib/fs/createMemoryFileSystem.js +472 -510
  75. package/lib/fs/createSandboxFileSystem.js +102 -101
  76. package/lib/fs/createWebDavFileSystem.js +162 -149
  77. package/lib/fs/createWebFileSystem.js +197 -220
  78. package/lib/fs/findMimeType.js +14 -14
  79. package/lib/fs/index.js +7 -7
  80. package/lib/fs/minio/createMinioFileSystem.js +959 -956
  81. package/lib/fs/minio/index.js +1 -1
  82. package/lib/fs/orpc/FileSystemContract.js +57 -57
  83. package/lib/fs/orpc/createContractClientFileSystem.js +88 -88
  84. package/lib/fs/orpc/index.js +2 -2
  85. package/lib/fs/orpc/server/createFileSystemContractImpl.js +62 -60
  86. package/lib/fs/orpc/server/index.js +1 -1
  87. package/lib/fs/s3/createS3MiniFileSystem.js +756 -737
  88. package/lib/fs/s3/index.js +1 -1
  89. package/lib/fs/s3/s3mini.test.js +524 -553
  90. package/lib/fs/scandir.js +56 -56
  91. package/lib/fs/server/createDatabaseFileSystem.js +834 -741
  92. package/lib/fs/server/createNodeFileSystem.js +407 -405
  93. package/lib/fs/server/dbfs.test.js +201 -214
  94. package/lib/fs/server/index.js +1 -1
  95. package/lib/fs/server/loadTestDatabase.js +40 -43
  96. package/lib/fs/tests/runFileSystemTest.js +352 -316
  97. package/lib/fs/types.js +17 -20
  98. package/lib/fs/utils/getFileUrl.js +24 -30
  99. package/lib/fs/utils.js +17 -17
  100. package/lib/fs/webdav/index.js +1 -1
  101. package/lib/index.js +2 -2
  102. package/lib/jsonschema/JsonSchema.js +216 -155
  103. package/lib/jsonschema/JsonSchema.test.js +123 -124
  104. package/lib/jsonschema/forEachJsonSchema.js +41 -41
  105. package/lib/jsonschema/index.js +2 -2
  106. package/lib/jsonschema/types.d.js +2 -2
  107. package/lib/meta/defineFileType.js +32 -38
  108. package/lib/meta/defineInit.js +39 -35
  109. package/lib/meta/defineMetadata.js +37 -34
  110. package/lib/meta/defineMetadata.test.js +13 -12
  111. package/lib/meta/index.js +3 -3
  112. package/lib/orpc/createOpenApiContractClient.js +26 -24
  113. package/lib/orpc/createRpcContractClient.js +37 -31
  114. package/lib/orpc/index.js +2 -2
  115. package/lib/orpc/resolveLinkPlugins.js +25 -25
  116. package/lib/password/PHC.js +187 -189
  117. package/lib/password/PHC.test.js +517 -535
  118. package/lib/password/Password.js +85 -80
  119. package/lib/password/Password.test.js +330 -364
  120. package/lib/password/createArgon2PasswordAlgorithm.js +50 -51
  121. package/lib/password/createBase64PasswordAlgorithm.js +11 -11
  122. package/lib/password/createBcryptPasswordAlgorithm.js +20 -18
  123. package/lib/password/createPBKDF2PasswordAlgorithm.js +65 -52
  124. package/lib/password/createScryptPasswordAlgorithm.js +74 -63
  125. package/lib/password/index.js +5 -5
  126. package/lib/password/server/index.js +1 -1
  127. package/lib/resource/Identifiable.js +2 -2
  128. package/lib/resource/ListQuery.js +42 -42
  129. package/lib/resource/getTitleOfResource.js +5 -5
  130. package/lib/resource/index.js +2 -2
  131. package/lib/resource/schema/AnyResourceSchema.js +91 -89
  132. package/lib/resource/schema/BaseResourceSchema.js +26 -26
  133. package/lib/resource/schema/ResourceActionType.js +117 -115
  134. package/lib/resource/schema/ResourceStatus.js +94 -92
  135. package/lib/resource/schema/ResourceType.js +25 -23
  136. package/lib/resource/schema/index.js +5 -5
  137. package/lib/resource/schema/types.js +86 -55
  138. package/lib/resource/schema/types.test.js +16 -13
  139. package/lib/s3/formatS3Url.js +60 -60
  140. package/lib/s3/formatS3Url.test.js +238 -261
  141. package/lib/s3/index.js +2 -2
  142. package/lib/s3/parseS3Url.js +61 -60
  143. package/lib/s3/parseS3Url.test.js +270 -269
  144. package/lib/schema/SchemaRegistry.js +41 -42
  145. package/lib/schema/SchemaRegistry.mod.js +1 -1
  146. package/lib/schema/TypeSchema.d.js +2 -2
  147. package/lib/schema/createSchemaData.js +113 -67
  148. package/lib/schema/findJsonSchemaByPath.js +28 -23
  149. package/lib/schema/formatZodError.js +112 -131
  150. package/lib/schema/formatZodError.test.js +192 -195
  151. package/lib/schema/getSchemaCache.js +7 -7
  152. package/lib/schema/getSchemaOptions.js +17 -16
  153. package/lib/schema/index.js +6 -6
  154. package/lib/schema/toJsonSchema.js +195 -189
  155. package/lib/schema/toJsonSchema.test.js +34 -26
  156. package/lib/schema/validate.js +105 -96
  157. package/lib/tools/generateSchema.js +40 -40
  158. package/lib/tools/renderJsonSchemaToMarkdownDoc.js +74 -74
  159. package/lib/utils/buildBaseUrl.js +8 -8
  160. package/lib/utils/buildRedactorFormSchema.js +54 -53
  161. package/lib/utils/getEstimateProcessTime.js +24 -19
  162. package/lib/utils/index.js +3 -3
  163. package/lib/utils/resolveFeatureOptions.js +9 -9
  164. package/package.json +14 -14
  165. package/src/ai/vision/index.ts +2 -2
  166. package/src/cn/index.ts +1 -2
  167. package/src/consola/index.ts +1 -1
  168. package/src/data/index.ts +3 -4
  169. package/src/data/resolvePagination.ts +2 -2
  170. package/src/dayjs/formatDuration.ts +8 -9
  171. package/src/dayjs/index.ts +1 -1
  172. package/src/dayjs/parseRelativeTime.ts +1 -1
  173. package/src/dayjs/resolveRelativeTime.ts +1 -1
  174. package/src/drain3/Drain.test.ts +2 -2
  175. package/src/drain3/index.ts +2 -4
  176. package/src/fs/createWebDavFileSystem.ts +2 -7
  177. package/src/fs/createWebFileSystem.ts +1 -1
  178. package/src/fs/index.ts +4 -4
  179. package/src/fs/minio/createMinioFileSystem.ts +2 -2
  180. package/src/fs/minio/index.ts +1 -1
  181. package/src/fs/s3/createS3MiniFileSystem.ts +1 -1
  182. package/src/fs/server/createDatabaseFileSystem.ts +84 -120
  183. package/src/fs/server/dbfs.test.ts +14 -10
  184. package/src/fs/server/index.ts +1 -0
  185. package/src/fs/server/loadTestDatabase.ts +8 -119
  186. package/src/jsonschema/index.ts +1 -1
  187. package/src/meta/index.ts +2 -3
  188. package/src/orm/createSqliteDialect.ts +17 -0
  189. package/src/orm/index.ts +1 -0
  190. package/src/orpc/createOpenApiContractClient.ts +1 -1
  191. package/src/orpc/index.ts +1 -1
  192. package/src/password/createArgon2PasswordAlgorithm.ts +1 -1
  193. package/src/password/index.ts +2 -2
  194. package/src/resource/index.ts +3 -3
  195. package/src/resource/schema/index.ts +4 -4
  196. package/src/s3/index.ts +1 -1
  197. package/src/schema/SchemaRegistry.ts +1 -1
  198. package/src/schema/createSchemaData.ts +1 -1
  199. package/src/schema/findJsonSchemaByPath.ts +1 -1
  200. package/src/schema/index.ts +5 -5
  201. package/src/schema/validate.ts +1 -1
  202. package/src/utils/buildRedactorFormSchema.ts +1 -1
  203. package/src/utils/formatNumber.ts +18 -0
  204. package/src/utils/formatPercent.ts +17 -0
  205. package/src/utils/index.ts +3 -3
  206. package/src/utils/resolveFeatureOptions.ts +1 -1
@@ -1,310 +1,299 @@
1
- import dayjs from "dayjs";
2
- import quarterOfYear from "dayjs/plugin/quarterOfYear";
3
- import weekOfYear from "dayjs/plugin/weekOfYear";
4
- import { describe, expect, it } from "vitest";
5
- import { resolveRelativeTime } from "./resolveRelativeTime.js";
1
+ import dayjs from 'dayjs';
2
+ import quarterOfYear from 'dayjs/plugin/quarterOfYear';
3
+ import weekOfYear from 'dayjs/plugin/weekOfYear';
4
+ import { describe, expect, it } from 'vitest';
5
+ import { resolveRelativeTime } from './resolveRelativeTime.js';
6
+
6
7
  dayjs.extend(quarterOfYear);
7
8
  dayjs.extend(weekOfYear);
8
- describe("resolveRelativeTime", function () {
9
- var fixedDate = new Date("2024-03-15T14:30:45.123Z");
10
- describe("basic cases", function () {
11
- it("should handle \"now\"", function () {
12
- var result = resolveRelativeTime("now", fixedDate);
13
- expect(result).toEqual(fixedDate);
14
- });
15
- it("should handle \"now\" without reference date", function () {
16
- var result = resolveRelativeTime("now", undefined);
17
- expect(result).toBeInstanceOf(Date);
18
- });
19
- });
20
- describe("subtraction operations", function () {
21
- it("should subtract seconds", function () {
22
- var result = resolveRelativeTime("now-30s", fixedDate);
23
- var expected = dayjs(fixedDate).subtract(30, "second").toDate();
24
- expect(result).toEqual(expected);
25
- });
26
- it("should subtract minutes", function () {
27
- var result = resolveRelativeTime("now-15m", fixedDate);
28
- var expected = dayjs(fixedDate).subtract(15, "minute").toDate();
29
- expect(result).toEqual(expected);
30
- });
31
- it("should subtract hours", function () {
32
- var result = resolveRelativeTime("now-2h", fixedDate);
33
- var expected = dayjs(fixedDate).subtract(2, "hour").toDate();
34
- expect(result).toEqual(expected);
35
- });
36
- it("should subtract days", function () {
37
- var result = resolveRelativeTime("now-7d", fixedDate);
38
- var expected = dayjs(fixedDate).subtract(7, "day").toDate();
39
- expect(result).toEqual(expected);
40
- });
41
- it("should subtract weeks", function () {
42
- var result = resolveRelativeTime("now-2w", fixedDate);
43
- var expected = dayjs(fixedDate).subtract(2, "week").toDate();
44
- expect(result).toEqual(expected);
45
- });
46
- it("should subtract months", function () {
47
- var result = resolveRelativeTime("now-1M", fixedDate);
48
- var expected = dayjs(fixedDate).subtract(1, "month").toDate();
49
- expect(result).toEqual(expected);
50
- });
51
- it("should subtract quarters", function () {
52
- var result = resolveRelativeTime("now-1Q", fixedDate);
53
- var expected = dayjs(fixedDate).subtract(1, "quarter").toDate();
54
- expect(result).toEqual(expected);
55
- });
56
- it("should subtract years", function () {
57
- var result = resolveRelativeTime("now-1y", fixedDate);
58
- var expected = dayjs(fixedDate).subtract(1, "year").toDate();
59
- expect(result).toEqual(expected);
60
- });
61
- });
62
- describe("addition operations", function () {
63
- it("should add seconds", function () {
64
- var result = resolveRelativeTime("now+30s", fixedDate);
65
- var expected = dayjs(fixedDate).add(30, "second").toDate();
66
- expect(result).toEqual(expected);
67
- });
68
- it("should add minutes", function () {
69
- var result = resolveRelativeTime("now+15m", fixedDate);
70
- var expected = dayjs(fixedDate).add(15, "minute").toDate();
71
- expect(result).toEqual(expected);
72
- });
73
- it("should add hours", function () {
74
- var result = resolveRelativeTime("now+3h", fixedDate);
75
- var expected = dayjs(fixedDate).add(3, "hour").toDate();
76
- expect(result).toEqual(expected);
77
- });
78
- it("should add days", function () {
79
- var result = resolveRelativeTime("now+5d", fixedDate);
80
- var expected = dayjs(fixedDate).add(5, "day").toDate();
81
- expect(result).toEqual(expected);
82
- });
83
- it("should add weeks", function () {
84
- var result = resolveRelativeTime("now+2w", fixedDate);
85
- var expected = dayjs(fixedDate).add(2, "week").toDate();
86
- expect(result).toEqual(expected);
87
- });
88
- it("should add months", function () {
89
- var result = resolveRelativeTime("now+2M", fixedDate);
90
- var expected = dayjs(fixedDate).add(2, "month").toDate();
91
- expect(result).toEqual(expected);
92
- });
93
- it("should add quarters", function () {
94
- var result = resolveRelativeTime("now+1Q", fixedDate);
95
- var expected = dayjs(fixedDate).add(1, "quarter").toDate();
96
- expect(result).toEqual(expected);
97
- });
98
- it("should add years", function () {
99
- var result = resolveRelativeTime("now+1y", fixedDate);
100
- var expected = dayjs(fixedDate).add(1, "year").toDate();
101
- expect(result).toEqual(expected);
102
- });
103
- });
104
- describe("truncation operations", function () {
105
- it("should truncate to start of second", function () {
106
- var result = resolveRelativeTime("now/s", fixedDate);
107
- var expected = dayjs(fixedDate).startOf("second").toDate();
108
- expect(result).toEqual(expected);
109
- });
110
- it("should truncate to start of minute", function () {
111
- var result = resolveRelativeTime("now/m", fixedDate);
112
- var expected = dayjs(fixedDate).startOf("minute").toDate();
113
- expect(result).toEqual(expected);
114
- });
115
- it("should truncate to start of hour", function () {
116
- var result = resolveRelativeTime("now/h", fixedDate);
117
- var expected = dayjs(fixedDate).startOf("hour").toDate();
118
- expect(result).toEqual(expected);
119
- });
120
- it("should truncate to start of day", function () {
121
- var result = resolveRelativeTime("now/d", fixedDate);
122
- var expected = dayjs(fixedDate).startOf("day").toDate();
123
- expect(result).toEqual(expected);
124
- });
125
- it("should truncate to start of week", function () {
126
- var result = resolveRelativeTime("now/w", fixedDate);
127
- var expected = dayjs(fixedDate).startOf("week").toDate();
128
- expect(result).toEqual(expected);
129
- });
130
- it("should truncate to start of month", function () {
131
- var result = resolveRelativeTime("now/M", fixedDate);
132
- var expected = dayjs(fixedDate).startOf("month").toDate();
133
- expect(result).toEqual(expected);
134
- });
135
- it("should truncate to start of quarter", function () {
136
- var result = resolveRelativeTime("now/Q", fixedDate);
137
- var expected = dayjs(fixedDate).startOf("quarter").toDate();
138
- expect(result).toEqual(expected);
139
- });
140
- it("should truncate to start of year", function () {
141
- var result = resolveRelativeTime("now/y", fixedDate);
142
- var expected = dayjs(fixedDate).startOf("year").toDate();
143
- expect(result).toEqual(expected);
144
- });
145
- });
146
- describe("endOf truncation operations (backslash)", function () {
147
- it("should truncate to end of second", function () {
148
- var result = resolveRelativeTime("now\\s", fixedDate);
149
- var expected = dayjs(fixedDate).endOf("second").toDate();
150
- expect(result).toEqual(expected);
151
- });
152
- it("should truncate to end of minute", function () {
153
- var result = resolveRelativeTime("now\\m", fixedDate);
154
- var expected = dayjs(fixedDate).endOf("minute").toDate();
155
- expect(result).toEqual(expected);
156
- });
157
- it("should truncate to end of hour", function () {
158
- var result = resolveRelativeTime("now\\h", fixedDate);
159
- var expected = dayjs(fixedDate).endOf("hour").toDate();
160
- expect(result).toEqual(expected);
161
- });
162
- it("should truncate to end of day", function () {
163
- var result = resolveRelativeTime("now\\d", fixedDate);
164
- var expected = dayjs(fixedDate).endOf("day").toDate();
165
- expect(result).toEqual(expected);
166
- });
167
- it("should truncate to end of week", function () {
168
- var result = resolveRelativeTime("now\\w", fixedDate);
169
- var expected = dayjs(fixedDate).endOf("week").toDate();
170
- expect(result).toEqual(expected);
171
- });
172
- it("should truncate to end of month", function () {
173
- var result = resolveRelativeTime("now\\M", fixedDate);
174
- var expected = dayjs(fixedDate).endOf("month").toDate();
175
- expect(result).toEqual(expected);
176
- });
177
- it("should truncate to end of quarter", function () {
178
- var result = resolveRelativeTime("now\\Q", fixedDate);
179
- var expected = dayjs(fixedDate).endOf("quarter").toDate();
180
- expect(result).toEqual(expected);
181
- });
182
- it("should truncate to end of year", function () {
183
- var result = resolveRelativeTime("now\\y", fixedDate);
184
- var expected = dayjs(fixedDate).endOf("year").toDate();
185
- expect(result).toEqual(expected);
186
- });
187
- });
188
- describe("complex combinations", function () {
189
- it("should handle \"now-1M/M\" (start of previous month)", function () {
190
- var result = resolveRelativeTime("now-1M/M", fixedDate);
191
- var expected = dayjs(fixedDate).subtract(1, "month").startOf("month").toDate();
192
- expect(result).toEqual(expected);
193
- });
194
- it("should handle \"now/d+1d-1s\" (end of current day)", function () {
195
- var result = resolveRelativeTime("now/d+1d-1s", fixedDate);
196
- var expected = dayjs(fixedDate).startOf("day").add(1, "day").subtract(1, "second").toDate();
197
- expect(result).toEqual(expected);
198
- });
199
- it("should handle multiple operations \"now-1w+2d-3h\"", function () {
200
- var result = resolveRelativeTime("now-1w+2d-3h", fixedDate);
201
- var expected = dayjs(fixedDate).subtract(1, "week").add(2, "day").subtract(3, "hour").toDate();
202
- expect(result).toEqual(expected);
203
- });
204
- it("should handle \"now-1M\\M\" (end of previous month)", function () {
205
- var result = resolveRelativeTime("now-1M\\M", fixedDate);
206
- var expected = dayjs(fixedDate).subtract(1, "month").endOf("month").toDate();
207
- expect(result).toEqual(expected);
208
- });
209
- it("should handle \"now\\d\" vs \"now/d+1d-1s\" (both end of current day)", function () {
210
- var resultBackslash = resolveRelativeTime("now\\d", fixedDate);
211
- var resultAlternative = resolveRelativeTime("now/d+1d-1s", fixedDate);
212
- var expectedBackslash = dayjs(fixedDate).endOf("day").toDate();
213
- var expectedAlternative = dayjs(fixedDate).startOf("day").add(1, "day").subtract(1, "second").toDate();
214
- expect(resultBackslash).toEqual(expectedBackslash);
215
- expect(resultAlternative).toEqual(expectedAlternative);
216
- // Note: endOf gives millisecond precision (.999), while alternative gives second precision (.000)
217
- // Both represent end of day, but endOf is more precise
218
- expect(resultBackslash.getTime()).toBeGreaterThan(resultAlternative.getTime());
219
- });
220
- it("should handle \"now-1y\\y\" (end of previous year)", function () {
221
- var result = resolveRelativeTime("now-1y\\y", fixedDate);
222
- var expected = dayjs(fixedDate).subtract(1, "year").endOf("year").toDate();
223
- expect(result).toEqual(expected);
224
- });
225
- it("should handle \"now/y+6M\" (middle of current year)", function () {
226
- var result = resolveRelativeTime("now/y+6M", fixedDate);
227
- var expected = dayjs(fixedDate).startOf("year").add(6, "month").toDate();
228
- expect(result).toEqual(expected);
229
- });
230
- });
231
- describe("error cases", function () {
232
- it("should throw error for invalid format", function () {
233
- expect(function () {
234
- return resolveRelativeTime("invalid", fixedDate);
235
- }).toThrow("Invalid");
236
- });
237
- it("should throw error for non-now start", function () {
238
- expect(function () {
239
- return resolveRelativeTime("then-1h", fixedDate);
240
- }).toThrow("Invalid");
241
- });
242
- it("should throw error for invalid time unit", function () {
243
- expect(function () {
244
- return resolveRelativeTime("now-1x", fixedDate);
245
- }).toThrow("Invalid time operand");
246
- });
247
- it("should throw error for invalid operator", function () {
248
- expect(function () {
249
- return resolveRelativeTime("now*1h", fixedDate);
250
- }).toThrow("Invalid relative time format");
251
- });
252
- it("should throw error for invalid truncation unit", function () {
253
- expect(function () {
254
- return resolveRelativeTime("now/z", fixedDate);
255
- }).toThrow();
256
- });
257
- it("should throw error for incomplete operation", function () {
258
- expect(function () {
259
- return resolveRelativeTime("now-", fixedDate);
260
- }).toThrow("Invalid relative time format");
261
- });
262
- });
263
- describe("Grafana examples from comments", function () {
264
- it("should handle \"now-24h\" (last 24 hours)", function () {
265
- var result = resolveRelativeTime("now-24h", fixedDate);
266
- var expected = dayjs(fixedDate).subtract(24, "hour").toDate();
267
- expect(result).toEqual(expected);
268
- });
269
- it("should handle \"now/M\" (start of current month)", function () {
270
- var result = resolveRelativeTime("now/M", fixedDate);
271
- var expected = dayjs(fixedDate).startOf("month").toDate();
272
- expect(result).toEqual(expected);
273
- });
274
- it("should handle \"now-7d\" (last 7 days)", function () {
275
- var result = resolveRelativeTime("now-7d", fixedDate);
276
- var expected = dayjs(fixedDate).subtract(7, "day").toDate();
277
- expect(result).toEqual(expected);
278
- });
279
- it("should handle \"now/y\" (start of current year)", function () {
280
- var result = resolveRelativeTime("now/y", fixedDate);
281
- var expected = dayjs(fixedDate).startOf("year").toDate();
282
- expect(result).toEqual(expected);
283
- });
284
- it("should handle \"now/w\" (start of current week)", function () {
285
- var result = resolveRelativeTime("now/w", fixedDate);
286
- var expected = dayjs(fixedDate).startOf("week").toDate();
287
- expect(result).toEqual(expected);
288
- });
289
- it("should handle \"now\\d\" (end of current day)", function () {
290
- var result = resolveRelativeTime("now\\d", fixedDate);
291
- var expected = dayjs(fixedDate).endOf("day").toDate();
292
- expect(result).toEqual(expected);
293
- });
294
- it("should handle \"now\\M\" (end of current month)", function () {
295
- var result = resolveRelativeTime("now\\M", fixedDate);
296
- var expected = dayjs(fixedDate).endOf("month").toDate();
297
- expect(result).toEqual(expected);
298
- });
299
- it("should handle \"now\\w\" (end of current week)", function () {
300
- var result = resolveRelativeTime("now\\w", fixedDate);
301
- var expected = dayjs(fixedDate).endOf("week").toDate();
302
- expect(result).toEqual(expected);
303
- });
304
- it("should handle \"now\\y\" (end of current year)", function () {
305
- var result = resolveRelativeTime("now\\y", fixedDate);
306
- var expected = dayjs(fixedDate).endOf("year").toDate();
307
- expect(result).toEqual(expected);
308
- });
309
- });
9
+ describe('resolveRelativeTime', () => {
10
+ var fixedDate = new Date('2024-03-15T14:30:45.123Z');
11
+ describe('basic cases', () => {
12
+ it('should handle "now"', () => {
13
+ var result = resolveRelativeTime('now', fixedDate);
14
+ expect(result).toEqual(fixedDate);
15
+ });
16
+ it('should handle "now" without reference date', () => {
17
+ var result = resolveRelativeTime('now', undefined);
18
+ expect(result).toBeInstanceOf(Date);
19
+ });
20
+ });
21
+ describe('subtraction operations', () => {
22
+ it('should subtract seconds', () => {
23
+ var result = resolveRelativeTime('now-30s', fixedDate);
24
+ var expected = dayjs(fixedDate).subtract(30, 'second').toDate();
25
+ expect(result).toEqual(expected);
26
+ });
27
+ it('should subtract minutes', () => {
28
+ var result = resolveRelativeTime('now-15m', fixedDate);
29
+ var expected = dayjs(fixedDate).subtract(15, 'minute').toDate();
30
+ expect(result).toEqual(expected);
31
+ });
32
+ it('should subtract hours', () => {
33
+ var result = resolveRelativeTime('now-2h', fixedDate);
34
+ var expected = dayjs(fixedDate).subtract(2, 'hour').toDate();
35
+ expect(result).toEqual(expected);
36
+ });
37
+ it('should subtract days', () => {
38
+ var result = resolveRelativeTime('now-7d', fixedDate);
39
+ var expected = dayjs(fixedDate).subtract(7, 'day').toDate();
40
+ expect(result).toEqual(expected);
41
+ });
42
+ it('should subtract weeks', () => {
43
+ var result = resolveRelativeTime('now-2w', fixedDate);
44
+ var expected = dayjs(fixedDate).subtract(2, 'week').toDate();
45
+ expect(result).toEqual(expected);
46
+ });
47
+ it('should subtract months', () => {
48
+ var result = resolveRelativeTime('now-1M', fixedDate);
49
+ var expected = dayjs(fixedDate).subtract(1, 'month').toDate();
50
+ expect(result).toEqual(expected);
51
+ });
52
+ it('should subtract quarters', () => {
53
+ var result = resolveRelativeTime('now-1Q', fixedDate);
54
+ var expected = dayjs(fixedDate).subtract(1, 'quarter').toDate();
55
+ expect(result).toEqual(expected);
56
+ });
57
+ it('should subtract years', () => {
58
+ var result = resolveRelativeTime('now-1y', fixedDate);
59
+ var expected = dayjs(fixedDate).subtract(1, 'year').toDate();
60
+ expect(result).toEqual(expected);
61
+ });
62
+ });
63
+ describe('addition operations', () => {
64
+ it('should add seconds', () => {
65
+ var result = resolveRelativeTime('now+30s', fixedDate);
66
+ var expected = dayjs(fixedDate).add(30, 'second').toDate();
67
+ expect(result).toEqual(expected);
68
+ });
69
+ it('should add minutes', () => {
70
+ var result = resolveRelativeTime('now+15m', fixedDate);
71
+ var expected = dayjs(fixedDate).add(15, 'minute').toDate();
72
+ expect(result).toEqual(expected);
73
+ });
74
+ it('should add hours', () => {
75
+ var result = resolveRelativeTime('now+3h', fixedDate);
76
+ var expected = dayjs(fixedDate).add(3, 'hour').toDate();
77
+ expect(result).toEqual(expected);
78
+ });
79
+ it('should add days', () => {
80
+ var result = resolveRelativeTime('now+5d', fixedDate);
81
+ var expected = dayjs(fixedDate).add(5, 'day').toDate();
82
+ expect(result).toEqual(expected);
83
+ });
84
+ it('should add weeks', () => {
85
+ var result = resolveRelativeTime('now+2w', fixedDate);
86
+ var expected = dayjs(fixedDate).add(2, 'week').toDate();
87
+ expect(result).toEqual(expected);
88
+ });
89
+ it('should add months', () => {
90
+ var result = resolveRelativeTime('now+2M', fixedDate);
91
+ var expected = dayjs(fixedDate).add(2, 'month').toDate();
92
+ expect(result).toEqual(expected);
93
+ });
94
+ it('should add quarters', () => {
95
+ var result = resolveRelativeTime('now+1Q', fixedDate);
96
+ var expected = dayjs(fixedDate).add(1, 'quarter').toDate();
97
+ expect(result).toEqual(expected);
98
+ });
99
+ it('should add years', () => {
100
+ var result = resolveRelativeTime('now+1y', fixedDate);
101
+ var expected = dayjs(fixedDate).add(1, 'year').toDate();
102
+ expect(result).toEqual(expected);
103
+ });
104
+ });
105
+ describe('truncation operations', () => {
106
+ it('should truncate to start of second', () => {
107
+ var result = resolveRelativeTime('now/s', fixedDate);
108
+ var expected = dayjs(fixedDate).startOf('second').toDate();
109
+ expect(result).toEqual(expected);
110
+ });
111
+ it('should truncate to start of minute', () => {
112
+ var result = resolveRelativeTime('now/m', fixedDate);
113
+ var expected = dayjs(fixedDate).startOf('minute').toDate();
114
+ expect(result).toEqual(expected);
115
+ });
116
+ it('should truncate to start of hour', () => {
117
+ var result = resolveRelativeTime('now/h', fixedDate);
118
+ var expected = dayjs(fixedDate).startOf('hour').toDate();
119
+ expect(result).toEqual(expected);
120
+ });
121
+ it('should truncate to start of day', () => {
122
+ var result = resolveRelativeTime('now/d', fixedDate);
123
+ var expected = dayjs(fixedDate).startOf('day').toDate();
124
+ expect(result).toEqual(expected);
125
+ });
126
+ it('should truncate to start of week', () => {
127
+ var result = resolveRelativeTime('now/w', fixedDate);
128
+ var expected = dayjs(fixedDate).startOf('week').toDate();
129
+ expect(result).toEqual(expected);
130
+ });
131
+ it('should truncate to start of month', () => {
132
+ var result = resolveRelativeTime('now/M', fixedDate);
133
+ var expected = dayjs(fixedDate).startOf('month').toDate();
134
+ expect(result).toEqual(expected);
135
+ });
136
+ it('should truncate to start of quarter', () => {
137
+ var result = resolveRelativeTime('now/Q', fixedDate);
138
+ var expected = dayjs(fixedDate).startOf('quarter').toDate();
139
+ expect(result).toEqual(expected);
140
+ });
141
+ it('should truncate to start of year', () => {
142
+ var result = resolveRelativeTime('now/y', fixedDate);
143
+ var expected = dayjs(fixedDate).startOf('year').toDate();
144
+ expect(result).toEqual(expected);
145
+ });
146
+ });
147
+ describe('endOf truncation operations (backslash)', () => {
148
+ it('should truncate to end of second', () => {
149
+ var result = resolveRelativeTime('now\\s', fixedDate);
150
+ var expected = dayjs(fixedDate).endOf('second').toDate();
151
+ expect(result).toEqual(expected);
152
+ });
153
+ it('should truncate to end of minute', () => {
154
+ var result = resolveRelativeTime('now\\m', fixedDate);
155
+ var expected = dayjs(fixedDate).endOf('minute').toDate();
156
+ expect(result).toEqual(expected);
157
+ });
158
+ it('should truncate to end of hour', () => {
159
+ var result = resolveRelativeTime('now\\h', fixedDate);
160
+ var expected = dayjs(fixedDate).endOf('hour').toDate();
161
+ expect(result).toEqual(expected);
162
+ });
163
+ it('should truncate to end of day', () => {
164
+ var result = resolveRelativeTime('now\\d', fixedDate);
165
+ var expected = dayjs(fixedDate).endOf('day').toDate();
166
+ expect(result).toEqual(expected);
167
+ });
168
+ it('should truncate to end of week', () => {
169
+ var result = resolveRelativeTime('now\\w', fixedDate);
170
+ var expected = dayjs(fixedDate).endOf('week').toDate();
171
+ expect(result).toEqual(expected);
172
+ });
173
+ it('should truncate to end of month', () => {
174
+ var result = resolveRelativeTime('now\\M', fixedDate);
175
+ var expected = dayjs(fixedDate).endOf('month').toDate();
176
+ expect(result).toEqual(expected);
177
+ });
178
+ it('should truncate to end of quarter', () => {
179
+ var result = resolveRelativeTime('now\\Q', fixedDate);
180
+ var expected = dayjs(fixedDate).endOf('quarter').toDate();
181
+ expect(result).toEqual(expected);
182
+ });
183
+ it('should truncate to end of year', () => {
184
+ var result = resolveRelativeTime('now\\y', fixedDate);
185
+ var expected = dayjs(fixedDate).endOf('year').toDate();
186
+ expect(result).toEqual(expected);
187
+ });
188
+ });
189
+ describe('complex combinations', () => {
190
+ it('should handle "now-1M/M" (start of previous month)', () => {
191
+ var result = resolveRelativeTime('now-1M/M', fixedDate);
192
+ var expected = dayjs(fixedDate).subtract(1, 'month').startOf('month').toDate();
193
+ expect(result).toEqual(expected);
194
+ });
195
+ it('should handle "now/d+1d-1s" (end of current day)', () => {
196
+ var result = resolveRelativeTime('now/d+1d-1s', fixedDate);
197
+ var expected = dayjs(fixedDate).startOf('day').add(1, 'day').subtract(1, 'second').toDate();
198
+ expect(result).toEqual(expected);
199
+ });
200
+ it('should handle multiple operations "now-1w+2d-3h"', () => {
201
+ var result = resolveRelativeTime('now-1w+2d-3h', fixedDate);
202
+ var expected = dayjs(fixedDate).subtract(1, 'week').add(2, 'day').subtract(3, 'hour').toDate();
203
+ expect(result).toEqual(expected);
204
+ });
205
+ it('should handle "now-1M\\M" (end of previous month)', () => {
206
+ var result = resolveRelativeTime('now-1M\\M', fixedDate);
207
+ var expected = dayjs(fixedDate).subtract(1, 'month').endOf('month').toDate();
208
+ expect(result).toEqual(expected);
209
+ });
210
+ it('should handle "now\\d" vs "now/d+1d-1s" (both end of current day)', () => {
211
+ var resultBackslash = resolveRelativeTime('now\\d', fixedDate);
212
+ var resultAlternative = resolveRelativeTime('now/d+1d-1s', fixedDate);
213
+ var expectedBackslash = dayjs(fixedDate).endOf('day').toDate();
214
+ var expectedAlternative = dayjs(fixedDate).startOf('day').add(1, 'day').subtract(1, 'second').toDate();
215
+ expect(resultBackslash).toEqual(expectedBackslash);
216
+ expect(resultAlternative).toEqual(expectedAlternative);
217
+ // Note: endOf gives millisecond precision (.999), while alternative gives second precision (.000)
218
+ // Both represent end of day, but endOf is more precise
219
+ expect(resultBackslash.getTime()).toBeGreaterThan(resultAlternative.getTime());
220
+ });
221
+ it('should handle "now-1y\\y" (end of previous year)', () => {
222
+ var result = resolveRelativeTime('now-1y\\y', fixedDate);
223
+ var expected = dayjs(fixedDate).subtract(1, 'year').endOf('year').toDate();
224
+ expect(result).toEqual(expected);
225
+ });
226
+ it('should handle "now/y+6M" (middle of current year)', () => {
227
+ var result = resolveRelativeTime('now/y+6M', fixedDate);
228
+ var expected = dayjs(fixedDate).startOf('year').add(6, 'month').toDate();
229
+ expect(result).toEqual(expected);
230
+ });
231
+ });
232
+ describe('error cases', () => {
233
+ it('should throw error for invalid format', () => {
234
+ expect(() => resolveRelativeTime('invalid', fixedDate)).toThrow('Invalid');
235
+ });
236
+ it('should throw error for non-now start', () => {
237
+ expect(() => resolveRelativeTime('then-1h', fixedDate)).toThrow('Invalid');
238
+ });
239
+ it('should throw error for invalid time unit', () => {
240
+ expect(() => resolveRelativeTime('now-1x', fixedDate)).toThrow('Invalid time operand');
241
+ });
242
+ it('should throw error for invalid operator', () => {
243
+ expect(() => resolveRelativeTime('now*1h', fixedDate)).toThrow('Invalid relative time format');
244
+ });
245
+ it('should throw error for invalid truncation unit', () => {
246
+ expect(() => resolveRelativeTime('now/z', fixedDate)).toThrow();
247
+ });
248
+ it('should throw error for incomplete operation', () => {
249
+ expect(() => resolveRelativeTime('now-', fixedDate)).toThrow('Invalid relative time format');
250
+ });
251
+ });
252
+ describe('Grafana examples from comments', () => {
253
+ it('should handle "now-24h" (last 24 hours)', () => {
254
+ var result = resolveRelativeTime('now-24h', fixedDate);
255
+ var expected = dayjs(fixedDate).subtract(24, 'hour').toDate();
256
+ expect(result).toEqual(expected);
257
+ });
258
+ it('should handle "now/M" (start of current month)', () => {
259
+ var result = resolveRelativeTime('now/M', fixedDate);
260
+ var expected = dayjs(fixedDate).startOf('month').toDate();
261
+ expect(result).toEqual(expected);
262
+ });
263
+ it('should handle "now-7d" (last 7 days)', () => {
264
+ var result = resolveRelativeTime('now-7d', fixedDate);
265
+ var expected = dayjs(fixedDate).subtract(7, 'day').toDate();
266
+ expect(result).toEqual(expected);
267
+ });
268
+ it('should handle "now/y" (start of current year)', () => {
269
+ var result = resolveRelativeTime('now/y', fixedDate);
270
+ var expected = dayjs(fixedDate).startOf('year').toDate();
271
+ expect(result).toEqual(expected);
272
+ });
273
+ it('should handle "now/w" (start of current week)', () => {
274
+ var result = resolveRelativeTime('now/w', fixedDate);
275
+ var expected = dayjs(fixedDate).startOf('week').toDate();
276
+ expect(result).toEqual(expected);
277
+ });
278
+ it('should handle "now\\d" (end of current day)', () => {
279
+ var result = resolveRelativeTime('now\\d', fixedDate);
280
+ var expected = dayjs(fixedDate).endOf('day').toDate();
281
+ expect(result).toEqual(expected);
282
+ });
283
+ it('should handle "now\\M" (end of current month)', () => {
284
+ var result = resolveRelativeTime('now\\M', fixedDate);
285
+ var expected = dayjs(fixedDate).endOf('month').toDate();
286
+ expect(result).toEqual(expected);
287
+ });
288
+ it('should handle "now\\w" (end of current week)', () => {
289
+ var result = resolveRelativeTime('now\\w', fixedDate);
290
+ var expected = dayjs(fixedDate).endOf('week').toDate();
291
+ expect(result).toEqual(expected);
292
+ });
293
+ it('should handle "now\\y" (end of current year)', () => {
294
+ var result = resolveRelativeTime('now\\y', fixedDate);
295
+ var expected = dayjs(fixedDate).endOf('year').toDate();
296
+ expect(result).toEqual(expected);
297
+ });
298
+ });
310
299
  });