@usertour/helpers 0.0.34 → 0.0.36
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/dist/__tests__/attribute.test.cjs +10 -1
- package/dist/__tests__/attribute.test.js +2 -1
- package/dist/__tests__/condition.test.cjs +1008 -21
- package/dist/__tests__/condition.test.js +902 -4
- package/dist/__tests__/get-attribute-type.test.cjs +195 -0
- package/dist/__tests__/get-attribute-type.test.d.cts +2 -0
- package/dist/__tests__/get-attribute-type.test.d.ts +2 -0
- package/dist/__tests__/get-attribute-type.test.js +133 -0
- package/dist/__tests__/time.test.cjs +482 -42
- package/dist/__tests__/time.test.js +349 -28
- package/dist/attribute.cjs +111 -0
- package/dist/attribute.d.cts +5 -0
- package/dist/attribute.d.ts +5 -0
- package/dist/attribute.js +12 -0
- package/dist/{chunk-A4KMGXB3.js → chunk-3UOSPZEP.js} +4 -4
- package/dist/chunk-EEYZG4JJ.js +78 -0
- package/dist/chunk-JQWKLXW6.js +147 -0
- package/dist/{chunk-7JXEY4A2.js → chunk-KYDXF7SU.js} +5 -1
- package/dist/conditions/attribute.cjs +10 -1
- package/dist/conditions/attribute.js +2 -1
- package/dist/conditions/condition.cjs +110 -20
- package/dist/conditions/condition.js +4 -3
- package/dist/conditions/index.cjs +152 -19
- package/dist/conditions/index.d.cts +1 -1
- package/dist/conditions/index.d.ts +1 -1
- package/dist/conditions/index.js +14 -5
- package/dist/conditions/time.cjs +150 -18
- package/dist/conditions/time.d.cts +29 -2
- package/dist/conditions/time.d.ts +29 -2
- package/dist/conditions/time.js +12 -3
- package/dist/index.cjs +209 -19
- package/dist/index.d.cts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +20 -4
- package/package.json +2 -2
- package/dist/chunk-CEK3SCQO.js +0 -31
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
convertTimeConditionLegacyToV2,
|
|
3
|
+
evaluateTimeCondition,
|
|
4
|
+
isTimeConditionDataLegacy,
|
|
5
|
+
isTimeConditionDataV2,
|
|
6
|
+
normalizeTimeConditionData
|
|
7
|
+
} from "../chunk-JQWKLXW6.js";
|
|
8
|
+
import "../chunk-GFH3VWOC.js";
|
|
4
9
|
import "../chunk-XEO3YXBM.js";
|
|
5
10
|
|
|
6
11
|
// src/__tests__/time.test.ts
|
|
7
12
|
describe("Time Condition Evaluation", () => {
|
|
8
|
-
const mockNow =
|
|
13
|
+
const mockNow = new Date(2024, 0, 15, 12, 0, 0);
|
|
9
14
|
beforeAll(() => {
|
|
10
15
|
jest.useFakeTimers();
|
|
11
16
|
jest.setSystemTime(mockNow);
|
|
@@ -13,36 +18,352 @@ describe("Time Condition Evaluation", () => {
|
|
|
13
18
|
afterAll(() => {
|
|
14
19
|
jest.useRealTimers();
|
|
15
20
|
});
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
describe("Type Guards", () => {
|
|
22
|
+
test("isTimeConditionDataV2 should return true for new format", () => {
|
|
23
|
+
expect(isTimeConditionDataV2({ startTime: "2024-01-15T10:00:00Z" })).toBe(true);
|
|
24
|
+
expect(isTimeConditionDataV2({ endTime: "2024-01-15T14:00:00Z" })).toBe(true);
|
|
25
|
+
expect(
|
|
26
|
+
isTimeConditionDataV2({
|
|
27
|
+
startTime: "2024-01-15T10:00:00Z",
|
|
28
|
+
endTime: "2024-01-15T14:00:00Z"
|
|
29
|
+
})
|
|
30
|
+
).toBe(true);
|
|
31
|
+
});
|
|
32
|
+
test("isTimeConditionDataV2 should return false for legacy format", () => {
|
|
33
|
+
expect(isTimeConditionDataV2({ startDate: "01/15/2024" })).toBe(false);
|
|
34
|
+
expect(isTimeConditionDataV2({})).toBe(false);
|
|
35
|
+
});
|
|
36
|
+
test("isTimeConditionDataLegacy should return true for legacy format", () => {
|
|
37
|
+
expect(isTimeConditionDataLegacy({ startDate: "01/15/2024" })).toBe(true);
|
|
38
|
+
expect(isTimeConditionDataLegacy({ startDateHour: "10" })).toBe(true);
|
|
39
|
+
expect(
|
|
40
|
+
isTimeConditionDataLegacy({
|
|
41
|
+
startDate: "01/15/2024",
|
|
42
|
+
startDateHour: "10",
|
|
43
|
+
startDateMinute: "00"
|
|
44
|
+
})
|
|
45
|
+
).toBe(true);
|
|
46
|
+
});
|
|
47
|
+
test("isTimeConditionDataLegacy should return false for new format", () => {
|
|
48
|
+
expect(isTimeConditionDataLegacy({ startTime: "2024-01-15T10:00:00Z" })).toBe(false);
|
|
49
|
+
expect(isTimeConditionDataLegacy({})).toBe(false);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
describe("Format Conversion", () => {
|
|
53
|
+
test("convertTimeConditionLegacyToV2 should convert valid legacy data", () => {
|
|
54
|
+
const legacyData = {
|
|
55
|
+
startDate: "01/15/2024",
|
|
56
|
+
startDateHour: "10",
|
|
57
|
+
startDateMinute: "00",
|
|
58
|
+
endDate: "01/15/2024",
|
|
59
|
+
endDateHour: "14",
|
|
60
|
+
endDateMinute: "00"
|
|
61
|
+
};
|
|
62
|
+
const result = convertTimeConditionLegacyToV2(legacyData);
|
|
63
|
+
expect(result).not.toBeNull();
|
|
64
|
+
expect(result == null ? void 0 : result.startTime).toBeDefined();
|
|
65
|
+
expect(result == null ? void 0 : result.endTime).toBeDefined();
|
|
66
|
+
expect(result == null ? void 0 : result.startTime).toMatch(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/);
|
|
67
|
+
});
|
|
68
|
+
test("convertTimeConditionLegacyToV2 should convert legacy data without end time", () => {
|
|
69
|
+
const legacyData = {
|
|
70
|
+
startDate: "01/15/2024",
|
|
23
71
|
startDateHour: "10",
|
|
24
72
|
startDateMinute: "00",
|
|
25
73
|
endDate: "",
|
|
26
74
|
endDateHour: "",
|
|
27
75
|
endDateMinute: ""
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
76
|
+
};
|
|
77
|
+
const result = convertTimeConditionLegacyToV2(legacyData);
|
|
78
|
+
expect(result).not.toBeNull();
|
|
79
|
+
expect(result == null ? void 0 : result.startTime).toBeDefined();
|
|
80
|
+
expect(result == null ? void 0 : result.endTime).toBeUndefined();
|
|
81
|
+
});
|
|
82
|
+
test("convertTimeConditionLegacyToV2 should return null for invalid data", () => {
|
|
83
|
+
expect(
|
|
84
|
+
convertTimeConditionLegacyToV2({
|
|
85
|
+
startDate: "",
|
|
86
|
+
startDateHour: "10",
|
|
87
|
+
startDateMinute: "00"
|
|
88
|
+
})
|
|
89
|
+
).toBeNull();
|
|
90
|
+
expect(
|
|
91
|
+
convertTimeConditionLegacyToV2({
|
|
92
|
+
startDate: "01/15/2024",
|
|
93
|
+
startDateHour: "",
|
|
94
|
+
startDateMinute: "00"
|
|
95
|
+
})
|
|
96
|
+
).toBeNull();
|
|
97
|
+
expect(
|
|
98
|
+
convertTimeConditionLegacyToV2({
|
|
99
|
+
startDate: "01/15/2024",
|
|
100
|
+
startDateHour: "10",
|
|
101
|
+
startDateMinute: ""
|
|
102
|
+
})
|
|
103
|
+
).toBeNull();
|
|
104
|
+
});
|
|
105
|
+
test("normalizeTimeConditionData should return new format as-is", () => {
|
|
106
|
+
const newFormat = { startTime: "2024-01-15T10:00:00Z", endTime: "2024-01-15T14:00:00Z" };
|
|
107
|
+
expect(normalizeTimeConditionData(newFormat)).toEqual(newFormat);
|
|
108
|
+
});
|
|
109
|
+
test("normalizeTimeConditionData should convert legacy format", () => {
|
|
110
|
+
const legacyData = {
|
|
111
|
+
startDate: "01/15/2024",
|
|
39
112
|
startDateHour: "10",
|
|
40
|
-
startDateMinute: "00"
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
};
|
|
46
|
-
|
|
113
|
+
startDateMinute: "00"
|
|
114
|
+
};
|
|
115
|
+
const result = normalizeTimeConditionData(legacyData);
|
|
116
|
+
expect(result).not.toBeNull();
|
|
117
|
+
expect(result == null ? void 0 : result.startTime).toBeDefined();
|
|
118
|
+
});
|
|
119
|
+
test("normalizeTimeConditionData should return null for invalid data", () => {
|
|
120
|
+
expect(normalizeTimeConditionData(null)).toBeNull();
|
|
121
|
+
expect(normalizeTimeConditionData(void 0)).toBeNull();
|
|
122
|
+
expect(normalizeTimeConditionData({})).toBeNull();
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
describe("Legacy Format Evaluation", () => {
|
|
126
|
+
test("should return true when current time is after start time and no end time", () => {
|
|
127
|
+
const rules = {
|
|
128
|
+
id: "condition-1",
|
|
129
|
+
type: "time",
|
|
130
|
+
data: {
|
|
131
|
+
startDate: "01/15/2024",
|
|
132
|
+
startDateHour: "10",
|
|
133
|
+
startDateMinute: "00",
|
|
134
|
+
endDate: "",
|
|
135
|
+
endDateHour: "",
|
|
136
|
+
endDateMinute: ""
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
expect(evaluateTimeCondition(rules)).toBe(true);
|
|
140
|
+
});
|
|
141
|
+
test("should return true when current time is within start and end time range", () => {
|
|
142
|
+
const rules = {
|
|
143
|
+
id: "condition-2",
|
|
144
|
+
type: "time",
|
|
145
|
+
data: {
|
|
146
|
+
startDate: "01/15/2024",
|
|
147
|
+
startDateHour: "10",
|
|
148
|
+
startDateMinute: "00",
|
|
149
|
+
endDate: "01/15/2024",
|
|
150
|
+
endDateHour: "14",
|
|
151
|
+
endDateMinute: "00"
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
expect(evaluateTimeCondition(rules)).toBe(true);
|
|
155
|
+
});
|
|
156
|
+
test("should return false when current time is before start time", () => {
|
|
157
|
+
const rules = {
|
|
158
|
+
id: "condition-3",
|
|
159
|
+
type: "time",
|
|
160
|
+
data: {
|
|
161
|
+
startDate: "01/15/2024",
|
|
162
|
+
startDateHour: "15",
|
|
163
|
+
startDateMinute: "00",
|
|
164
|
+
endDate: "",
|
|
165
|
+
endDateHour: "",
|
|
166
|
+
endDateMinute: ""
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
expect(evaluateTimeCondition(rules)).toBe(false);
|
|
170
|
+
});
|
|
171
|
+
test("should return false when current time is after end time", () => {
|
|
172
|
+
const rules = {
|
|
173
|
+
id: "condition-4",
|
|
174
|
+
type: "time",
|
|
175
|
+
data: {
|
|
176
|
+
startDate: "01/15/2024",
|
|
177
|
+
startDateHour: "10",
|
|
178
|
+
startDateMinute: "00",
|
|
179
|
+
endDate: "01/15/2024",
|
|
180
|
+
endDateHour: "11",
|
|
181
|
+
endDateMinute: "00"
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
expect(evaluateTimeCondition(rules)).toBe(false);
|
|
185
|
+
});
|
|
186
|
+
test("should return false when start date is missing", () => {
|
|
187
|
+
const rules = {
|
|
188
|
+
id: "condition-5",
|
|
189
|
+
type: "time",
|
|
190
|
+
data: {
|
|
191
|
+
startDate: "",
|
|
192
|
+
startDateHour: "10",
|
|
193
|
+
startDateMinute: "00"
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
expect(evaluateTimeCondition(rules)).toBe(false);
|
|
197
|
+
});
|
|
198
|
+
test("should return false when start hour is missing", () => {
|
|
199
|
+
const rules = {
|
|
200
|
+
id: "condition-6",
|
|
201
|
+
type: "time",
|
|
202
|
+
data: {
|
|
203
|
+
startDate: "01/15/2024",
|
|
204
|
+
startDateHour: "",
|
|
205
|
+
startDateMinute: "00"
|
|
206
|
+
}
|
|
207
|
+
};
|
|
208
|
+
expect(evaluateTimeCondition(rules)).toBe(false);
|
|
209
|
+
});
|
|
210
|
+
test("should handle empty endDate string", () => {
|
|
211
|
+
const rules = {
|
|
212
|
+
id: "condition-7",
|
|
213
|
+
type: "time",
|
|
214
|
+
data: {
|
|
215
|
+
startDate: "01/15/2024",
|
|
216
|
+
startDateHour: "10",
|
|
217
|
+
startDateMinute: "00",
|
|
218
|
+
endDate: "",
|
|
219
|
+
endDateHour: "00",
|
|
220
|
+
endDateMinute: "00"
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
expect(evaluateTimeCondition(rules)).toBe(true);
|
|
224
|
+
});
|
|
225
|
+
test("should handle cross-day time range", () => {
|
|
226
|
+
const crossDayTime = new Date(2024, 0, 15, 23, 0, 0);
|
|
227
|
+
jest.setSystemTime(crossDayTime);
|
|
228
|
+
const rules = {
|
|
229
|
+
id: "condition-8",
|
|
230
|
+
type: "time",
|
|
231
|
+
data: {
|
|
232
|
+
startDate: "01/15/2024",
|
|
233
|
+
startDateHour: "22",
|
|
234
|
+
startDateMinute: "00",
|
|
235
|
+
endDate: "01/16/2024",
|
|
236
|
+
endDateHour: "02",
|
|
237
|
+
endDateMinute: "00"
|
|
238
|
+
}
|
|
239
|
+
};
|
|
240
|
+
expect(evaluateTimeCondition(rules)).toBe(true);
|
|
241
|
+
jest.setSystemTime(mockNow);
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
describe("New Format (ISO 8601) Evaluation", () => {
|
|
245
|
+
test("should return true when current time is after start time and no end time", () => {
|
|
246
|
+
const startTime = new Date(2024, 0, 15, 10, 0, 0).toISOString();
|
|
247
|
+
const rules = {
|
|
248
|
+
id: "condition-v2-1",
|
|
249
|
+
type: "time",
|
|
250
|
+
data: {
|
|
251
|
+
startTime
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
expect(evaluateTimeCondition(rules)).toBe(true);
|
|
255
|
+
});
|
|
256
|
+
test("should return true when current time is within start and end time range", () => {
|
|
257
|
+
const startTime = new Date(2024, 0, 15, 10, 0, 0).toISOString();
|
|
258
|
+
const endTime = new Date(2024, 0, 15, 14, 0, 0).toISOString();
|
|
259
|
+
const rules = {
|
|
260
|
+
id: "condition-v2-2",
|
|
261
|
+
type: "time",
|
|
262
|
+
data: {
|
|
263
|
+
startTime,
|
|
264
|
+
endTime
|
|
265
|
+
}
|
|
266
|
+
};
|
|
267
|
+
expect(evaluateTimeCondition(rules)).toBe(true);
|
|
268
|
+
});
|
|
269
|
+
test("should return false when current time is before start time", () => {
|
|
270
|
+
const startTime = new Date(2024, 0, 15, 15, 0, 0).toISOString();
|
|
271
|
+
const rules = {
|
|
272
|
+
id: "condition-v2-3",
|
|
273
|
+
type: "time",
|
|
274
|
+
data: {
|
|
275
|
+
startTime
|
|
276
|
+
}
|
|
277
|
+
};
|
|
278
|
+
expect(evaluateTimeCondition(rules)).toBe(false);
|
|
279
|
+
});
|
|
280
|
+
test("should return false when current time is after end time", () => {
|
|
281
|
+
const startTime = new Date(2024, 0, 15, 10, 0, 0).toISOString();
|
|
282
|
+
const endTime = new Date(2024, 0, 15, 11, 0, 0).toISOString();
|
|
283
|
+
const rules = {
|
|
284
|
+
id: "condition-v2-4",
|
|
285
|
+
type: "time",
|
|
286
|
+
data: {
|
|
287
|
+
startTime,
|
|
288
|
+
endTime
|
|
289
|
+
}
|
|
290
|
+
};
|
|
291
|
+
expect(evaluateTimeCondition(rules)).toBe(false);
|
|
292
|
+
});
|
|
293
|
+
test("should return false when startTime is missing", () => {
|
|
294
|
+
const endTime = new Date(2024, 0, 15, 14, 0, 0).toISOString();
|
|
295
|
+
const rules = {
|
|
296
|
+
id: "condition-v2-5",
|
|
297
|
+
type: "time",
|
|
298
|
+
data: {
|
|
299
|
+
endTime
|
|
300
|
+
}
|
|
301
|
+
};
|
|
302
|
+
expect(evaluateTimeCondition(rules)).toBe(false);
|
|
303
|
+
});
|
|
304
|
+
test("should return false when startTime is invalid", () => {
|
|
305
|
+
const rules = {
|
|
306
|
+
id: "condition-v2-6",
|
|
307
|
+
type: "time",
|
|
308
|
+
data: {
|
|
309
|
+
startTime: "invalid-date"
|
|
310
|
+
}
|
|
311
|
+
};
|
|
312
|
+
expect(evaluateTimeCondition(rules)).toBe(false);
|
|
313
|
+
});
|
|
314
|
+
test("should handle timezone in ISO format", () => {
|
|
315
|
+
const rules = {
|
|
316
|
+
id: "condition-v2-7",
|
|
317
|
+
type: "time",
|
|
318
|
+
data: {
|
|
319
|
+
startTime: "2024-01-15T10:00:00+08:00",
|
|
320
|
+
endTime: "2024-01-15T14:00:00+08:00"
|
|
321
|
+
}
|
|
322
|
+
};
|
|
323
|
+
expect(typeof evaluateTimeCondition(rules)).toBe("boolean");
|
|
324
|
+
});
|
|
325
|
+
});
|
|
326
|
+
describe("Edge Cases", () => {
|
|
327
|
+
test("should return false for empty data", () => {
|
|
328
|
+
const rules = {
|
|
329
|
+
id: "condition-edge-1",
|
|
330
|
+
type: "time",
|
|
331
|
+
data: {}
|
|
332
|
+
};
|
|
333
|
+
expect(evaluateTimeCondition(rules)).toBe(false);
|
|
334
|
+
});
|
|
335
|
+
test("should return false for null data", () => {
|
|
336
|
+
const rules = {
|
|
337
|
+
id: "condition-edge-2",
|
|
338
|
+
type: "time",
|
|
339
|
+
data: null
|
|
340
|
+
};
|
|
341
|
+
expect(evaluateTimeCondition(rules)).toBe(false);
|
|
342
|
+
});
|
|
343
|
+
test("should return false for invalid date format in legacy", () => {
|
|
344
|
+
const rules = {
|
|
345
|
+
id: "condition-edge-3",
|
|
346
|
+
type: "time",
|
|
347
|
+
data: {
|
|
348
|
+
startDate: "invalid-date",
|
|
349
|
+
startDateHour: "10",
|
|
350
|
+
startDateMinute: "00"
|
|
351
|
+
}
|
|
352
|
+
};
|
|
353
|
+
expect(evaluateTimeCondition(rules)).toBe(false);
|
|
354
|
+
});
|
|
355
|
+
test("should handle invalid month/day in legacy format", () => {
|
|
356
|
+
const rules = {
|
|
357
|
+
id: "condition-edge-4",
|
|
358
|
+
type: "time",
|
|
359
|
+
data: {
|
|
360
|
+
startDate: "13/32/2024",
|
|
361
|
+
// Invalid month and day
|
|
362
|
+
startDateHour: "10",
|
|
363
|
+
startDateMinute: "00"
|
|
364
|
+
}
|
|
365
|
+
};
|
|
366
|
+
expect(evaluateTimeCondition(rules)).toBe(false);
|
|
367
|
+
});
|
|
47
368
|
});
|
|
48
369
|
});
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/attribute.ts
|
|
21
|
+
var attribute_exports = {};
|
|
22
|
+
__export(attribute_exports, {
|
|
23
|
+
capitalizeFirstLetter: () => capitalizeFirstLetter,
|
|
24
|
+
filterNullAttributes: () => filterNullAttributes,
|
|
25
|
+
getAttributeType: () => getAttributeType
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(attribute_exports);
|
|
28
|
+
var import_types = require("@usertour/types");
|
|
29
|
+
var import_date_fns = require("date-fns");
|
|
30
|
+
|
|
31
|
+
// src/type-utils.ts
|
|
32
|
+
var nativeIsArray = Array.isArray;
|
|
33
|
+
var ObjProto = Object.prototype;
|
|
34
|
+
var objToString = ObjProto.toString;
|
|
35
|
+
var objHasOwn = ObjProto.hasOwnProperty;
|
|
36
|
+
var isNull = (x) => {
|
|
37
|
+
return x === null;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
// src/attribute.ts
|
|
41
|
+
var isValidYear = (date) => {
|
|
42
|
+
const year = date.getFullYear();
|
|
43
|
+
return year >= 1900 && year <= 2100;
|
|
44
|
+
};
|
|
45
|
+
var tryParseDate = (parser) => {
|
|
46
|
+
try {
|
|
47
|
+
const date = parser();
|
|
48
|
+
return (0, import_date_fns.isValid)(date) && isValidYear(date);
|
|
49
|
+
} catch {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
function isDateString(dateStr) {
|
|
54
|
+
if (!Number.isNaN(Number(dateStr)) || dateStr.length < 10) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
const dateFormats = [
|
|
58
|
+
"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",
|
|
59
|
+
"yyyy-MM-dd'T'HH:mm:ss'Z'",
|
|
60
|
+
"yyyy-MM-dd'T'HH:mm:ss.SSS",
|
|
61
|
+
"yyyy-MM-dd'T'HH:mm:ss",
|
|
62
|
+
"yyyy-MM-dd",
|
|
63
|
+
"MM/dd/yyyy",
|
|
64
|
+
"dd/MM/yyyy",
|
|
65
|
+
"yyyy/MM/dd",
|
|
66
|
+
"MM-dd-yyyy",
|
|
67
|
+
"dd-MM-yyyy"
|
|
68
|
+
];
|
|
69
|
+
if (tryParseDate(() => (0, import_date_fns.parseISO)(dateStr))) {
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
return dateFormats.some((format) => tryParseDate(() => (0, import_date_fns.parse)(dateStr, format, /* @__PURE__ */ new Date())));
|
|
73
|
+
}
|
|
74
|
+
var getAttributeType = (attribute) => {
|
|
75
|
+
const t = typeof attribute;
|
|
76
|
+
if (t === "number") {
|
|
77
|
+
return import_types.BizAttributeTypes.Number;
|
|
78
|
+
}
|
|
79
|
+
if (t === "string") {
|
|
80
|
+
if (isDateString(attribute)) {
|
|
81
|
+
return import_types.BizAttributeTypes.DateTime;
|
|
82
|
+
}
|
|
83
|
+
return import_types.BizAttributeTypes.String;
|
|
84
|
+
}
|
|
85
|
+
if (t === "boolean") {
|
|
86
|
+
return import_types.BizAttributeTypes.Boolean;
|
|
87
|
+
}
|
|
88
|
+
if (t === "object" && Array.isArray(attribute)) {
|
|
89
|
+
return import_types.BizAttributeTypes.List;
|
|
90
|
+
}
|
|
91
|
+
return import_types.BizAttributeTypes.Nil;
|
|
92
|
+
};
|
|
93
|
+
var capitalizeFirstLetter = (string) => {
|
|
94
|
+
return string.charAt(0).toUpperCase() + string.slice(1);
|
|
95
|
+
};
|
|
96
|
+
var filterNullAttributes = (attributes) => {
|
|
97
|
+
const attrs = {};
|
|
98
|
+
for (const key in attributes) {
|
|
99
|
+
const v = attributes[key];
|
|
100
|
+
if (!isNull(v)) {
|
|
101
|
+
attrs[key] = v;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return attrs;
|
|
105
|
+
};
|
|
106
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
107
|
+
0 && (module.exports = {
|
|
108
|
+
capitalizeFirstLetter,
|
|
109
|
+
filterNullAttributes,
|
|
110
|
+
getAttributeType
|
|
111
|
+
});
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
declare const getAttributeType: (attribute: any) => number;
|
|
2
|
+
declare const capitalizeFirstLetter: (string: string) => string;
|
|
3
|
+
declare const filterNullAttributes: (attributes: Record<string, any>) => Record<string, any>;
|
|
4
|
+
|
|
5
|
+
export { capitalizeFirstLetter, filterNullAttributes, getAttributeType };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
declare const getAttributeType: (attribute: any) => number;
|
|
2
|
+
declare const capitalizeFirstLetter: (string: string) => string;
|
|
3
|
+
declare const filterNullAttributes: (attributes: Record<string, any>) => Record<string, any>;
|
|
4
|
+
|
|
5
|
+
export { capitalizeFirstLetter, filterNullAttributes, getAttributeType };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import {
|
|
2
|
+
capitalizeFirstLetter,
|
|
3
|
+
filterNullAttributes,
|
|
4
|
+
getAttributeType
|
|
5
|
+
} from "./chunk-EEYZG4JJ.js";
|
|
6
|
+
import "./chunk-GFH3VWOC.js";
|
|
7
|
+
import "./chunk-XEO3YXBM.js";
|
|
8
|
+
export {
|
|
9
|
+
capitalizeFirstLetter,
|
|
10
|
+
filterNullAttributes,
|
|
11
|
+
getAttributeType
|
|
12
|
+
};
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
evaluateUrlCondition
|
|
3
3
|
} from "./chunk-YYIGUZNZ.js";
|
|
4
|
-
import {
|
|
5
|
-
evaluateAttributeCondition
|
|
6
|
-
} from "./chunk-7JXEY4A2.js";
|
|
7
4
|
import {
|
|
8
5
|
evaluateTimeCondition
|
|
9
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-JQWKLXW6.js";
|
|
7
|
+
import {
|
|
8
|
+
evaluateAttributeCondition
|
|
9
|
+
} from "./chunk-KYDXF7SU.js";
|
|
10
10
|
import {
|
|
11
11
|
cuid
|
|
12
12
|
} from "./chunk-3KG2HTZ3.js";
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isNull
|
|
3
|
+
} from "./chunk-GFH3VWOC.js";
|
|
4
|
+
|
|
5
|
+
// src/attribute.ts
|
|
6
|
+
import { BizAttributeTypes } from "@usertour/types";
|
|
7
|
+
import { isValid, parseISO, parse } from "date-fns";
|
|
8
|
+
var isValidYear = (date) => {
|
|
9
|
+
const year = date.getFullYear();
|
|
10
|
+
return year >= 1900 && year <= 2100;
|
|
11
|
+
};
|
|
12
|
+
var tryParseDate = (parser) => {
|
|
13
|
+
try {
|
|
14
|
+
const date = parser();
|
|
15
|
+
return isValid(date) && isValidYear(date);
|
|
16
|
+
} catch {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
function isDateString(dateStr) {
|
|
21
|
+
if (!Number.isNaN(Number(dateStr)) || dateStr.length < 10) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
const dateFormats = [
|
|
25
|
+
"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",
|
|
26
|
+
"yyyy-MM-dd'T'HH:mm:ss'Z'",
|
|
27
|
+
"yyyy-MM-dd'T'HH:mm:ss.SSS",
|
|
28
|
+
"yyyy-MM-dd'T'HH:mm:ss",
|
|
29
|
+
"yyyy-MM-dd",
|
|
30
|
+
"MM/dd/yyyy",
|
|
31
|
+
"dd/MM/yyyy",
|
|
32
|
+
"yyyy/MM/dd",
|
|
33
|
+
"MM-dd-yyyy",
|
|
34
|
+
"dd-MM-yyyy"
|
|
35
|
+
];
|
|
36
|
+
if (tryParseDate(() => parseISO(dateStr))) {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
return dateFormats.some((format) => tryParseDate(() => parse(dateStr, format, /* @__PURE__ */ new Date())));
|
|
40
|
+
}
|
|
41
|
+
var getAttributeType = (attribute) => {
|
|
42
|
+
const t = typeof attribute;
|
|
43
|
+
if (t === "number") {
|
|
44
|
+
return BizAttributeTypes.Number;
|
|
45
|
+
}
|
|
46
|
+
if (t === "string") {
|
|
47
|
+
if (isDateString(attribute)) {
|
|
48
|
+
return BizAttributeTypes.DateTime;
|
|
49
|
+
}
|
|
50
|
+
return BizAttributeTypes.String;
|
|
51
|
+
}
|
|
52
|
+
if (t === "boolean") {
|
|
53
|
+
return BizAttributeTypes.Boolean;
|
|
54
|
+
}
|
|
55
|
+
if (t === "object" && Array.isArray(attribute)) {
|
|
56
|
+
return BizAttributeTypes.List;
|
|
57
|
+
}
|
|
58
|
+
return BizAttributeTypes.Nil;
|
|
59
|
+
};
|
|
60
|
+
var capitalizeFirstLetter = (string) => {
|
|
61
|
+
return string.charAt(0).toUpperCase() + string.slice(1);
|
|
62
|
+
};
|
|
63
|
+
var filterNullAttributes = (attributes) => {
|
|
64
|
+
const attrs = {};
|
|
65
|
+
for (const key in attributes) {
|
|
66
|
+
const v = attributes[key];
|
|
67
|
+
if (!isNull(v)) {
|
|
68
|
+
attrs[key] = v;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return attrs;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
export {
|
|
75
|
+
getAttributeType,
|
|
76
|
+
capitalizeFirstLetter,
|
|
77
|
+
filterNullAttributes
|
|
78
|
+
};
|