@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.
- package/lib/ai/qwen3vl/index.js +1 -1
- package/lib/ai/qwen3vl/utils.js +15 -15
- package/lib/ai/vision/DocLayoutElementTypeSchema.js +22 -22
- package/lib/ai/vision/ImageAnnotationSchema.js +63 -47
- package/lib/ai/vision/index.js +2 -2
- package/lib/ai/vision/resolveImageAnnotation.js +81 -95
- package/lib/cn/ChineseResidentIdNo.js +55 -41
- package/lib/cn/ChineseResidentIdNo.mod.js +6 -1
- package/lib/cn/ChineseResidentIdNo.test.js +22 -21
- package/lib/cn/DivisionCode.js +220 -235
- package/lib/cn/DivisionCode.mod.js +6 -1
- package/lib/cn/DivisionCode.test.js +92 -121
- package/lib/cn/Mod11.js +18 -37
- package/lib/cn/Mod31.js +23 -41
- package/lib/cn/UnifiedSocialCreditCode.js +143 -137
- package/lib/cn/UnifiedSocialCreditCode.mod.js +6 -1
- package/lib/cn/UnifiedSocialCreditCode.test.js +21 -15
- package/lib/cn/formatChineseAmount.js +46 -71
- package/lib/cn/index.js +6 -6
- package/lib/cn/mod.js +5 -3
- package/lib/cn/parseChineseNumber.js +81 -85
- package/lib/cn/parseChineseNumber.test.js +183 -261
- package/lib/cn/pinyin/cartesianProduct.js +19 -19
- package/lib/cn/pinyin/cartesianProduct.test.js +78 -178
- package/lib/cn/pinyin/loader.js +13 -11
- package/lib/cn/pinyin/preload.js +2 -1
- package/lib/cn/pinyin/toPinyin.test.js +149 -161
- package/lib/cn/pinyin/toPinyinPure.js +28 -23
- package/lib/cn/pinyin/transform.js +11 -11
- package/lib/cn/types.d.js +2 -2
- package/lib/consola/createStandardConsolaReporter.js +14 -15
- package/lib/consola/formatLogObject.js +149 -133
- package/lib/consola/formatLogObject.test.js +167 -178
- package/lib/consola/index.js +2 -2
- package/lib/data/formatSort.js +14 -12
- package/lib/data/formatSort.test.js +33 -33
- package/lib/data/index.js +3 -3
- package/lib/data/maybeNumber.js +23 -23
- package/lib/data/parseSort.js +75 -68
- package/lib/data/parseSort.test.js +196 -187
- package/lib/data/resolvePagination.js +38 -39
- package/lib/data/resolvePagination.test.js +228 -218
- package/lib/data/types.d.js +2 -2
- package/lib/dayjs/dayjs.js +20 -20
- package/lib/dayjs/formatDuration.js +56 -56
- package/lib/dayjs/formatDuration.test.js +63 -77
- package/lib/dayjs/index.js +4 -4
- package/lib/dayjs/parseDuration.js +21 -26
- package/lib/dayjs/parseRelativeTime.js +65 -66
- package/lib/dayjs/parseRelativeTime.test.js +227 -243
- package/lib/dayjs/resolveRelativeTime.js +73 -72
- package/lib/dayjs/resolveRelativeTime.test.js +296 -307
- package/lib/decimal/index.js +1 -1
- package/lib/decimal/parseDecimal.js +12 -12
- package/lib/drain3/Drain.js +303 -338
- package/lib/drain3/LogCluster.js +25 -25
- package/lib/drain3/Node.js +24 -24
- package/lib/drain3/TemplateMiner.js +197 -196
- package/lib/drain3/index.js +5 -5
- package/lib/drain3/persistence/FilePersistence.js +19 -19
- package/lib/drain3/persistence/MemoryPersistence.js +8 -8
- package/lib/drain3/persistence/PersistenceHandler.js +2 -2
- package/lib/drain3/types.js +2 -2
- package/lib/emittery/emitter.js +7 -7
- package/lib/emittery/index.js +1 -1
- package/lib/foundation/schema/SexType.js +15 -12
- package/lib/foundation/schema/index.js +1 -1
- package/lib/foundation/schema/parseSexType.js +15 -16
- package/lib/foundation/schema/types.js +8 -6
- package/lib/fs/FileSystemError.js +18 -18
- package/lib/fs/IFileSystem.d.js +2 -2
- package/lib/fs/MemoryFileSystem.test.js +172 -181
- package/lib/fs/createBrowserFileSystem.js +222 -235
- package/lib/fs/createMemoryFileSystem.js +472 -510
- package/lib/fs/createSandboxFileSystem.js +102 -101
- package/lib/fs/createWebDavFileSystem.js +162 -149
- package/lib/fs/createWebFileSystem.js +197 -220
- package/lib/fs/findMimeType.js +14 -14
- package/lib/fs/index.js +7 -7
- package/lib/fs/minio/createMinioFileSystem.js +959 -956
- package/lib/fs/minio/index.js +1 -1
- package/lib/fs/orpc/FileSystemContract.js +57 -57
- package/lib/fs/orpc/createContractClientFileSystem.js +88 -88
- package/lib/fs/orpc/index.js +2 -2
- package/lib/fs/orpc/server/createFileSystemContractImpl.js +62 -60
- package/lib/fs/orpc/server/index.js +1 -1
- package/lib/fs/s3/createS3MiniFileSystem.js +756 -737
- package/lib/fs/s3/index.js +1 -1
- package/lib/fs/s3/s3mini.test.js +524 -553
- package/lib/fs/scandir.js +56 -56
- package/lib/fs/server/createDatabaseFileSystem.js +834 -741
- package/lib/fs/server/createNodeFileSystem.js +407 -405
- package/lib/fs/server/dbfs.test.js +201 -214
- package/lib/fs/server/index.js +1 -1
- package/lib/fs/server/loadTestDatabase.js +40 -43
- package/lib/fs/tests/runFileSystemTest.js +352 -316
- package/lib/fs/types.js +17 -20
- package/lib/fs/utils/getFileUrl.js +24 -30
- package/lib/fs/utils.js +17 -17
- package/lib/fs/webdav/index.js +1 -1
- package/lib/index.js +2 -2
- package/lib/jsonschema/JsonSchema.js +216 -155
- package/lib/jsonschema/JsonSchema.test.js +123 -124
- package/lib/jsonschema/forEachJsonSchema.js +41 -41
- package/lib/jsonschema/index.js +2 -2
- package/lib/jsonschema/types.d.js +2 -2
- package/lib/meta/defineFileType.js +32 -38
- package/lib/meta/defineInit.js +39 -35
- package/lib/meta/defineMetadata.js +37 -34
- package/lib/meta/defineMetadata.test.js +13 -12
- package/lib/meta/index.js +3 -3
- package/lib/orpc/createOpenApiContractClient.js +26 -24
- package/lib/orpc/createRpcContractClient.js +37 -31
- package/lib/orpc/index.js +2 -2
- package/lib/orpc/resolveLinkPlugins.js +25 -25
- package/lib/password/PHC.js +187 -189
- package/lib/password/PHC.test.js +517 -535
- package/lib/password/Password.js +85 -80
- package/lib/password/Password.test.js +330 -364
- package/lib/password/createArgon2PasswordAlgorithm.js +50 -51
- package/lib/password/createBase64PasswordAlgorithm.js +11 -11
- package/lib/password/createBcryptPasswordAlgorithm.js +20 -18
- package/lib/password/createPBKDF2PasswordAlgorithm.js +65 -52
- package/lib/password/createScryptPasswordAlgorithm.js +74 -63
- package/lib/password/index.js +5 -5
- package/lib/password/server/index.js +1 -1
- package/lib/resource/Identifiable.js +2 -2
- package/lib/resource/ListQuery.js +42 -42
- package/lib/resource/getTitleOfResource.js +5 -5
- package/lib/resource/index.js +2 -2
- package/lib/resource/schema/AnyResourceSchema.js +91 -89
- package/lib/resource/schema/BaseResourceSchema.js +26 -26
- package/lib/resource/schema/ResourceActionType.js +117 -115
- package/lib/resource/schema/ResourceStatus.js +94 -92
- package/lib/resource/schema/ResourceType.js +25 -23
- package/lib/resource/schema/index.js +5 -5
- package/lib/resource/schema/types.js +86 -55
- package/lib/resource/schema/types.test.js +16 -13
- package/lib/s3/formatS3Url.js +60 -60
- package/lib/s3/formatS3Url.test.js +238 -261
- package/lib/s3/index.js +2 -2
- package/lib/s3/parseS3Url.js +61 -60
- package/lib/s3/parseS3Url.test.js +270 -269
- package/lib/schema/SchemaRegistry.js +41 -42
- package/lib/schema/SchemaRegistry.mod.js +1 -1
- package/lib/schema/TypeSchema.d.js +2 -2
- package/lib/schema/createSchemaData.js +113 -67
- package/lib/schema/findJsonSchemaByPath.js +28 -23
- package/lib/schema/formatZodError.js +112 -131
- package/lib/schema/formatZodError.test.js +192 -195
- package/lib/schema/getSchemaCache.js +7 -7
- package/lib/schema/getSchemaOptions.js +17 -16
- package/lib/schema/index.js +6 -6
- package/lib/schema/toJsonSchema.js +195 -189
- package/lib/schema/toJsonSchema.test.js +34 -26
- package/lib/schema/validate.js +105 -96
- package/lib/tools/generateSchema.js +40 -40
- package/lib/tools/renderJsonSchemaToMarkdownDoc.js +74 -74
- package/lib/utils/buildBaseUrl.js +8 -8
- package/lib/utils/buildRedactorFormSchema.js +54 -53
- package/lib/utils/getEstimateProcessTime.js +24 -19
- package/lib/utils/index.js +3 -3
- package/lib/utils/resolveFeatureOptions.js +9 -9
- package/package.json +14 -14
- package/src/ai/vision/index.ts +2 -2
- package/src/cn/index.ts +1 -2
- package/src/consola/index.ts +1 -1
- package/src/data/index.ts +3 -4
- package/src/data/resolvePagination.ts +2 -2
- package/src/dayjs/formatDuration.ts +8 -9
- package/src/dayjs/index.ts +1 -1
- package/src/dayjs/parseRelativeTime.ts +1 -1
- package/src/dayjs/resolveRelativeTime.ts +1 -1
- package/src/drain3/Drain.test.ts +2 -2
- package/src/drain3/index.ts +2 -4
- package/src/fs/createWebDavFileSystem.ts +2 -7
- package/src/fs/createWebFileSystem.ts +1 -1
- package/src/fs/index.ts +4 -4
- package/src/fs/minio/createMinioFileSystem.ts +2 -2
- package/src/fs/minio/index.ts +1 -1
- package/src/fs/s3/createS3MiniFileSystem.ts +1 -1
- package/src/fs/server/createDatabaseFileSystem.ts +84 -120
- package/src/fs/server/dbfs.test.ts +14 -10
- package/src/fs/server/index.ts +1 -0
- package/src/fs/server/loadTestDatabase.ts +8 -119
- package/src/jsonschema/index.ts +1 -1
- package/src/meta/index.ts +2 -3
- package/src/orm/createSqliteDialect.ts +17 -0
- package/src/orm/index.ts +1 -0
- package/src/orpc/createOpenApiContractClient.ts +1 -1
- package/src/orpc/index.ts +1 -1
- package/src/password/createArgon2PasswordAlgorithm.ts +1 -1
- package/src/password/index.ts +2 -2
- package/src/resource/index.ts +3 -3
- package/src/resource/schema/index.ts +4 -4
- package/src/s3/index.ts +1 -1
- package/src/schema/SchemaRegistry.ts +1 -1
- package/src/schema/createSchemaData.ts +1 -1
- package/src/schema/findJsonSchemaByPath.ts +1 -1
- package/src/schema/index.ts +5 -5
- package/src/schema/validate.ts +1 -1
- package/src/utils/buildRedactorFormSchema.ts +1 -1
- package/src/utils/formatNumber.ts +18 -0
- package/src/utils/formatPercent.ts +17 -0
- package/src/utils/index.ts +3 -3
- package/src/utils/resolveFeatureOptions.ts +1 -1
|
@@ -1,247 +1,231 @@
|
|
|
1
1
|
function _define_property(obj, key, value) {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
return obj;
|
|
2
|
+
if (key in obj) {
|
|
3
|
+
Object.defineProperty(obj, key, {
|
|
4
|
+
value: value,
|
|
5
|
+
enumerable: true,
|
|
6
|
+
configurable: true,
|
|
7
|
+
writable: true,
|
|
8
|
+
});
|
|
9
|
+
} else {
|
|
10
|
+
obj[key] = value;
|
|
11
|
+
}
|
|
12
|
+
return obj;
|
|
14
13
|
}
|
|
15
|
-
|
|
16
|
-
import
|
|
17
|
-
import
|
|
18
|
-
import {
|
|
14
|
+
|
|
15
|
+
import dayjs from 'dayjs';
|
|
16
|
+
import duration from 'dayjs/plugin/duration';
|
|
17
|
+
import { describe, expect, it } from 'vitest';
|
|
18
|
+
import { parseRelativeTime } from './parseRelativeTime.js';
|
|
19
|
+
|
|
19
20
|
dayjs.extend(duration);
|
|
20
|
-
describe(
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
});
|
|
231
|
-
expect(result2[1]).toEqual({
|
|
232
|
-
operator: "/",
|
|
233
|
-
unit: "M"
|
|
234
|
-
});
|
|
235
|
-
// Complex time ago
|
|
236
|
-
var result3 = parseRelativeTime("now-1w2d3h");
|
|
237
|
-
expect(result3).toHaveLength(1);
|
|
238
|
-
expect(result3[0]).toEqual({
|
|
239
|
-
operator: "-",
|
|
240
|
-
duration: dayjs.duration({
|
|
241
|
-
weeks: 1,
|
|
242
|
-
days: 2,
|
|
243
|
-
hours: 3
|
|
244
|
-
})
|
|
245
|
-
});
|
|
246
|
-
});
|
|
21
|
+
describe('parseRelativeTime', () => {
|
|
22
|
+
it('should return empty array for "now"', () => {
|
|
23
|
+
var result = parseRelativeTime('now');
|
|
24
|
+
expect(result).toEqual([]);
|
|
25
|
+
});
|
|
26
|
+
it('should parse simple addition operations', () => {
|
|
27
|
+
var result = parseRelativeTime('now+1h');
|
|
28
|
+
expect(result).toHaveLength(1);
|
|
29
|
+
expect(result[0]).toEqual({
|
|
30
|
+
operator: '+',
|
|
31
|
+
duration: dayjs.duration({
|
|
32
|
+
hours: 1,
|
|
33
|
+
}),
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
it('should parse simple subtraction operations', () => {
|
|
37
|
+
var result = parseRelativeTime('now-30m');
|
|
38
|
+
expect(result).toHaveLength(1);
|
|
39
|
+
expect(result[0]).toEqual({
|
|
40
|
+
operator: '-',
|
|
41
|
+
duration: dayjs.duration({
|
|
42
|
+
minutes: 30,
|
|
43
|
+
}),
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
it('should parse milliseconds', () => {
|
|
47
|
+
var result = parseRelativeTime('now+500ms');
|
|
48
|
+
expect(result).toHaveLength(1);
|
|
49
|
+
expect(result[0]).toEqual({
|
|
50
|
+
operator: '+',
|
|
51
|
+
duration: dayjs.duration({
|
|
52
|
+
milliseconds: 500,
|
|
53
|
+
}),
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
it('should parse complex duration combinations', () => {
|
|
57
|
+
var result = parseRelativeTime('now+1d6h30m');
|
|
58
|
+
expect(result).toHaveLength(1);
|
|
59
|
+
expect(result[0]).toEqual({
|
|
60
|
+
operator: '+',
|
|
61
|
+
duration: dayjs.duration({
|
|
62
|
+
days: 1,
|
|
63
|
+
hours: 6,
|
|
64
|
+
minutes: 30,
|
|
65
|
+
}),
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
it('should parse truncation operations', () => {
|
|
69
|
+
var result = parseRelativeTime('now/d');
|
|
70
|
+
expect(result).toHaveLength(1);
|
|
71
|
+
expect(result[0]).toEqual({
|
|
72
|
+
operator: '/',
|
|
73
|
+
unit: 'd',
|
|
74
|
+
});
|
|
75
|
+
var result2 = parseRelativeTime('now\\M');
|
|
76
|
+
expect(result2).toHaveLength(1);
|
|
77
|
+
expect(result2[0]).toEqual({
|
|
78
|
+
operator: '\\',
|
|
79
|
+
unit: 'M',
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
it('should parse multiple operations', () => {
|
|
83
|
+
var result = parseRelativeTime('now-1h+30m');
|
|
84
|
+
expect(result).toHaveLength(2);
|
|
85
|
+
expect(result[0]).toEqual({
|
|
86
|
+
operator: '-',
|
|
87
|
+
duration: dayjs.duration({
|
|
88
|
+
hours: 1,
|
|
89
|
+
}),
|
|
90
|
+
});
|
|
91
|
+
expect(result[1]).toEqual({
|
|
92
|
+
operator: '+',
|
|
93
|
+
duration: dayjs.duration({
|
|
94
|
+
minutes: 30,
|
|
95
|
+
}),
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
it('should parse mixed arithmetic and truncation operations', () => {
|
|
99
|
+
var result = parseRelativeTime('now-1M/M');
|
|
100
|
+
expect(result).toHaveLength(2);
|
|
101
|
+
expect(result[0]).toEqual({
|
|
102
|
+
operator: '-',
|
|
103
|
+
duration: dayjs.duration({
|
|
104
|
+
months: 1,
|
|
105
|
+
}),
|
|
106
|
+
});
|
|
107
|
+
expect(result[1]).toEqual({
|
|
108
|
+
operator: '/',
|
|
109
|
+
unit: 'M',
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
it('should handle all supported units', () => {
|
|
113
|
+
var units = ['ms', 's', 'm', 'h', 'd', 'w', 'M', 'Q', 'y'];
|
|
114
|
+
var _iteratorNormalCompletion = true,
|
|
115
|
+
_didIteratorError = false,
|
|
116
|
+
_iteratorError;
|
|
117
|
+
try {
|
|
118
|
+
for (
|
|
119
|
+
var _iterator = units[Symbol.iterator](), _step;
|
|
120
|
+
!(_iteratorNormalCompletion = (_step = _iterator.next()).done);
|
|
121
|
+
_iteratorNormalCompletion = true
|
|
122
|
+
) {
|
|
123
|
+
var unit = _step.value;
|
|
124
|
+
var result = parseRelativeTime('now+1'.concat(unit));
|
|
125
|
+
expect(result).toHaveLength(1);
|
|
126
|
+
expect(result[0]).toEqual({
|
|
127
|
+
operator: '+',
|
|
128
|
+
duration: dayjs.duration(_define_property({}, unit, 1)),
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
} catch (err) {
|
|
132
|
+
_didIteratorError = true;
|
|
133
|
+
_iteratorError = err;
|
|
134
|
+
} finally {
|
|
135
|
+
try {
|
|
136
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
137
|
+
_iterator.return();
|
|
138
|
+
}
|
|
139
|
+
} finally {
|
|
140
|
+
if (_didIteratorError) {
|
|
141
|
+
throw _iteratorError;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
it('should handle complex multi-unit expressions', () => {
|
|
147
|
+
var result = parseRelativeTime('now+1y2M3w4d5h6m7s8ms');
|
|
148
|
+
expect(result).toHaveLength(1);
|
|
149
|
+
expect(result[0]).toEqual({
|
|
150
|
+
operator: '+',
|
|
151
|
+
duration: dayjs.duration({
|
|
152
|
+
years: 1,
|
|
153
|
+
months: 2,
|
|
154
|
+
weeks: 3,
|
|
155
|
+
days: 4,
|
|
156
|
+
hours: 5,
|
|
157
|
+
minutes: 6,
|
|
158
|
+
seconds: 7,
|
|
159
|
+
milliseconds: 8,
|
|
160
|
+
}),
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
it('should handle same unit multiple times (should sum)', () => {
|
|
164
|
+
var result = parseRelativeTime('now+1h2h3h');
|
|
165
|
+
expect(result).toHaveLength(1);
|
|
166
|
+
expect(result[0]).toEqual({
|
|
167
|
+
operator: '+',
|
|
168
|
+
duration: dayjs.duration({
|
|
169
|
+
hours: 6,
|
|
170
|
+
}),
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
it('should throw error for invalid format', () => {
|
|
174
|
+
expect(() => parseRelativeTime('invalid')).toThrow('Invalid relative time format');
|
|
175
|
+
expect(() => parseRelativeTime('now+')).toThrow('Invalid relative time format');
|
|
176
|
+
expect(() => parseRelativeTime('now+abc')).toThrow('Invalid duration specification');
|
|
177
|
+
});
|
|
178
|
+
it('should throw error for invalid units in truncation', () => {
|
|
179
|
+
expect(() => parseRelativeTime('now/invalid')).toThrow('Invalid unit');
|
|
180
|
+
});
|
|
181
|
+
it('should throw error for invalid units in duration', () => {
|
|
182
|
+
expect(() => parseRelativeTime('now+1invalid')).toThrow('Invalid unit');
|
|
183
|
+
});
|
|
184
|
+
it('should handle whitespace correctly', () => {
|
|
185
|
+
// The regex should handle operands without extra whitespace issues
|
|
186
|
+
var result = parseRelativeTime('now+1h30m');
|
|
187
|
+
expect(result).toHaveLength(1);
|
|
188
|
+
expect(result[0]).toEqual({
|
|
189
|
+
operator: '+',
|
|
190
|
+
duration: dayjs.duration({
|
|
191
|
+
hours: 1,
|
|
192
|
+
minutes: 30,
|
|
193
|
+
}),
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
it('should parse real-world examples', () => {
|
|
197
|
+
// Last 24 hours
|
|
198
|
+
var result1 = parseRelativeTime('now-24h');
|
|
199
|
+
expect(result1).toHaveLength(1);
|
|
200
|
+
expect(result1[0]).toEqual({
|
|
201
|
+
operator: '-',
|
|
202
|
+
duration: dayjs.duration({
|
|
203
|
+
hours: 24,
|
|
204
|
+
}),
|
|
205
|
+
});
|
|
206
|
+
// Start of previous month
|
|
207
|
+
var result2 = parseRelativeTime('now-1M/M');
|
|
208
|
+
expect(result2).toHaveLength(2);
|
|
209
|
+
expect(result2[0]).toEqual({
|
|
210
|
+
operator: '-',
|
|
211
|
+
duration: dayjs.duration({
|
|
212
|
+
months: 1,
|
|
213
|
+
}),
|
|
214
|
+
});
|
|
215
|
+
expect(result2[1]).toEqual({
|
|
216
|
+
operator: '/',
|
|
217
|
+
unit: 'M',
|
|
218
|
+
});
|
|
219
|
+
// Complex time ago
|
|
220
|
+
var result3 = parseRelativeTime('now-1w2d3h');
|
|
221
|
+
expect(result3).toHaveLength(1);
|
|
222
|
+
expect(result3[0]).toEqual({
|
|
223
|
+
operator: '-',
|
|
224
|
+
duration: dayjs.duration({
|
|
225
|
+
weeks: 1,
|
|
226
|
+
days: 2,
|
|
227
|
+
hours: 3,
|
|
228
|
+
}),
|
|
229
|
+
});
|
|
230
|
+
});
|
|
247
231
|
});
|
|
@@ -1,77 +1,78 @@
|
|
|
1
|
-
import { parseDate } from
|
|
2
|
-
import dayjs from
|
|
3
|
-
import duration from
|
|
4
|
-
import quarterOfYear from
|
|
5
|
-
import weekOfYear from
|
|
1
|
+
import { parseDate } from '@wener/utils';
|
|
2
|
+
import dayjs from 'dayjs';
|
|
3
|
+
import duration from 'dayjs/plugin/duration';
|
|
4
|
+
import quarterOfYear from 'dayjs/plugin/quarterOfYear';
|
|
5
|
+
import weekOfYear from 'dayjs/plugin/weekOfYear';
|
|
6
|
+
|
|
6
7
|
dayjs.extend(duration);
|
|
7
8
|
dayjs.extend(quarterOfYear);
|
|
8
9
|
dayjs.extend(weekOfYear);
|
|
9
10
|
export function resolveRelativeTime(s, now) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
11
|
+
{
|
|
12
|
+
let out = parseDate(s);
|
|
13
|
+
if (out) {
|
|
14
|
+
return out;
|
|
15
|
+
}
|
|
16
|
+
if (s == null) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
if (typeof s === 'string' && s.startsWith('now')) {
|
|
21
|
+
// valid
|
|
22
|
+
} else {
|
|
23
|
+
throw new Error(`Invalid relative time format: ${s}`);
|
|
24
|
+
}
|
|
25
|
+
let current = dayjs(now);
|
|
26
|
+
const remaining = s.slice(3); // Remove 'now'
|
|
27
|
+
if (!remaining) {
|
|
28
|
+
return current.toDate();
|
|
29
|
+
}
|
|
30
|
+
// Split by operators while keeping them in the result
|
|
31
|
+
const parts = remaining.split(/([+\-/\\])/).filter((part) => part !== '');
|
|
32
|
+
for (let i = 0; i < parts.length; i += 2) {
|
|
33
|
+
const operator = parts[i];
|
|
34
|
+
const operand = parts[i + 1];
|
|
35
|
+
if (!operator || !operand) {
|
|
36
|
+
throw new Error(`Invalid relative time format: ${s}`);
|
|
37
|
+
}
|
|
38
|
+
if (operator === '/') {
|
|
39
|
+
// Truncation to start operation
|
|
40
|
+
checkDurationUnit(operand);
|
|
41
|
+
current = current.startOf(operand);
|
|
42
|
+
} else if (operator === '\\') {
|
|
43
|
+
// Truncation to end operation
|
|
44
|
+
checkDurationUnit(operand);
|
|
45
|
+
current = current.endOf(operand);
|
|
46
|
+
} else {
|
|
47
|
+
// Addition or subtraction operation
|
|
48
|
+
const match = operand.match(/^(\d+)([smhdwMQy])$/);
|
|
49
|
+
if (!match) {
|
|
50
|
+
throw new Error(`Invalid time operand: ${operand}`);
|
|
51
|
+
}
|
|
52
|
+
const [, amountStr, unit] = match;
|
|
53
|
+
checkDurationUnit(unit);
|
|
54
|
+
const amount = parseInt(amountStr, 10);
|
|
55
|
+
if (operator === '+') {
|
|
56
|
+
current = current.add(amount, unit);
|
|
57
|
+
} else if (operator === '-') {
|
|
58
|
+
current = current.subtract(amount, unit);
|
|
59
|
+
} else {
|
|
60
|
+
throw new Error(`Invalid operator: ${operator}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return current.toDate();
|
|
64
65
|
}
|
|
65
66
|
/** Array of all valid time units */ export const RelativeDurationUnits = [
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
67
|
+
'ms',
|
|
68
|
+
's',
|
|
69
|
+
'm',
|
|
70
|
+
'h',
|
|
71
|
+
'd',
|
|
72
|
+
'w',
|
|
73
|
+
'M',
|
|
74
|
+
'Q',
|
|
75
|
+
'y',
|
|
75
76
|
];
|
|
76
77
|
/**
|
|
77
78
|
* Type guard to validate and assert that a string is a valid time unit.
|
|
@@ -79,9 +80,9 @@ export function resolveRelativeTime(s, now) {
|
|
|
79
80
|
* @param u - The string to check
|
|
80
81
|
* @throws {Error} When the unit is not supported
|
|
81
82
|
*/ export function checkDurationUnit(u) {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
83
|
+
if (!RelativeDurationUnits.includes(u)) {
|
|
84
|
+
throw new Error(`Invalid unit: ${u}`);
|
|
85
|
+
}
|
|
85
86
|
}
|
|
86
87
|
|
|
87
|
-
//# sourceMappingURL=resolveRelativeTime.js.map
|
|
88
|
+
//# sourceMappingURL=resolveRelativeTime.js.map
|