@usertour/helpers 0.0.35 → 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.
@@ -129,27 +129,117 @@ var evaluateUrlCondition = (rules, url) => {
129
129
 
130
130
  // src/conditions/time.ts
131
131
  var import_date_fns = require("date-fns");
132
+
133
+ // src/type-utils.ts
134
+ var nativeIsArray = Array.isArray;
135
+ var ObjProto = Object.prototype;
136
+ var objToString = ObjProto.toString;
137
+ var objHasOwn = ObjProto.hasOwnProperty;
138
+ var isArray = nativeIsArray || ((obj) => objToString.call(obj) === "[object Array]");
139
+ var isUndefined = (x) => x === void 0;
140
+ var isString = (x) => {
141
+ return objToString.call(x) === "[object String]";
142
+ };
143
+ var isEmptyString = (x) => isString(x) && x.trim().length === 0;
144
+ var isNull = (x) => {
145
+ return x === null;
146
+ };
147
+ var isNullish = (x) => isUndefined(x) || isNull(x);
148
+
149
+ // src/conditions/time.ts
150
+ function isEmpty(value) {
151
+ return isNullish(value) || isEmptyString(value);
152
+ }
153
+ function hasRequiredFields(data, type) {
154
+ if (type === "start") {
155
+ return !isEmpty(data.startDate) && !isEmpty(data.startDateHour) && !isEmpty(data.startDateMinute);
156
+ }
157
+ return !isEmpty(data.endDate) && !isEmpty(data.endDateHour) && !isEmpty(data.endDateMinute);
158
+ }
159
+ function parseLegacyDate(dateStr) {
160
+ const [month, day, year] = dateStr.split("/");
161
+ if (!month || !day || !year) {
162
+ return null;
163
+ }
164
+ return {
165
+ month: Number.parseInt(month),
166
+ day: Number.parseInt(day),
167
+ year: Number.parseInt(year)
168
+ };
169
+ }
170
+ function createLegacyDateTime(data, type) {
171
+ const dateStr = type === "start" ? data.startDate : data.endDate;
172
+ const hourStr = type === "start" ? data.startDateHour : data.endDateHour;
173
+ const minuteStr = type === "start" ? data.startDateMinute : data.endDateMinute;
174
+ if (!dateStr || !hourStr || !minuteStr) {
175
+ return null;
176
+ }
177
+ const dateParts = parseLegacyDate(dateStr);
178
+ if (!dateParts) {
179
+ return null;
180
+ }
181
+ const dateTime = new Date(
182
+ dateParts.year,
183
+ dateParts.month - 1,
184
+ dateParts.day,
185
+ Number.parseInt(hourStr),
186
+ Number.parseInt(minuteStr),
187
+ 0
188
+ );
189
+ return (0, import_date_fns.isValid)(dateTime) ? dateTime : null;
190
+ }
191
+ function isTimeConditionDataV2(data) {
192
+ return data && ("startTime" in data || "endTime" in data);
193
+ }
194
+ function isTimeConditionDataLegacy(data) {
195
+ return data && ("startDate" in data || "startDateHour" in data);
196
+ }
197
+ function evaluateTimeConditionV2(data) {
198
+ if (!data.startTime) {
199
+ return false;
200
+ }
201
+ const startTime = (0, import_date_fns.parseISO)(data.startTime);
202
+ if (!(0, import_date_fns.isValid)(startTime)) {
203
+ return false;
204
+ }
205
+ const now = /* @__PURE__ */ new Date();
206
+ if (!data.endTime) {
207
+ return (0, import_date_fns.isAfter)(now, startTime);
208
+ }
209
+ const endTime = (0, import_date_fns.parseISO)(data.endTime);
210
+ if (!(0, import_date_fns.isValid)(endTime)) {
211
+ return false;
212
+ }
213
+ return (0, import_date_fns.isAfter)(now, startTime) && (0, import_date_fns.isBefore)(now, endTime);
214
+ }
215
+ function evaluateTimeConditionLegacy(data) {
216
+ if (!hasRequiredFields(data, "start")) {
217
+ return false;
218
+ }
219
+ const startDateTime = createLegacyDateTime(data, "start");
220
+ if (!startDateTime) {
221
+ return false;
222
+ }
223
+ const now = /* @__PURE__ */ new Date();
224
+ if (!hasRequiredFields(data, "end")) {
225
+ return (0, import_date_fns.isAfter)(now, startDateTime);
226
+ }
227
+ const endDateTime = createLegacyDateTime(data, "end");
228
+ if (!endDateTime) {
229
+ return false;
230
+ }
231
+ return (0, import_date_fns.isAfter)(now, startDateTime) && (0, import_date_fns.isBefore)(now, endDateTime);
232
+ }
132
233
  var evaluateTimeCondition = (rules) => {
133
234
  try {
134
- const { endDate, endDateHour, endDateMinute, startDate, startDateHour, startDateMinute } = rules.data || {};
135
- if (!startDate || !startDateHour || !startDateMinute) {
136
- return false;
137
- }
138
- const startTimeString = `${startDate}T${startDateHour.padStart(2, "0")}:${startDateMinute.padStart(2, "0")}:00`;
139
- const startTime = (0, import_date_fns.parseISO)(startTimeString);
140
- if (!(0, import_date_fns.isValid)(startTime)) {
141
- return false;
142
- }
143
- const now = /* @__PURE__ */ new Date();
144
- if (!endDate || !endDateHour || !endDateMinute) {
145
- return (0, import_date_fns.isAfter)(now, startTime);
235
+ const data = rules.data || {};
236
+ if (isTimeConditionDataV2(data)) {
237
+ return evaluateTimeConditionV2(data);
146
238
  }
147
- const endTimeString = `${endDate}T${endDateHour.padStart(2, "0")}:${endDateMinute.padStart(2, "0")}:00`;
148
- const endTime = (0, import_date_fns.parseISO)(endTimeString);
149
- if (!(0, import_date_fns.isValid)(endTime)) {
150
- return false;
239
+ if (isTimeConditionDataLegacy(data)) {
240
+ return evaluateTimeConditionLegacy(data);
151
241
  }
152
- return (0, import_date_fns.isAfter)(now, startTime) && (0, import_date_fns.isBefore)(now, endTime);
242
+ return false;
153
243
  } catch {
154
244
  return false;
155
245
  }
@@ -158,15 +248,6 @@ var evaluateTimeCondition = (rules) => {
158
248
  // src/conditions/attribute.ts
159
249
  var import_types = require("@usertour/types");
160
250
  var import_date_fns2 = require("date-fns");
161
-
162
- // src/type-utils.ts
163
- var nativeIsArray = Array.isArray;
164
- var ObjProto = Object.prototype;
165
- var objToString = ObjProto.toString;
166
- var objHasOwn = ObjProto.hasOwnProperty;
167
- var isArray = nativeIsArray || ((obj) => objToString.call(obj) === "[object Array]");
168
-
169
- // src/conditions/attribute.ts
170
251
  function evaluateAttributeCondition(condition, options) {
171
252
  const { data } = condition;
172
253
  if (!data) {
@@ -224,8 +305,8 @@ function evaluateStringCondition(logic, actualValue, expectedValue) {
224
305
  case "endsWith":
225
306
  return stringValue.endsWith(expectedValue);
226
307
  case "empty": {
227
- const isEmpty = !stringValue || stringValue === "";
228
- return isEmpty;
308
+ const isEmpty2 = !stringValue || stringValue === "";
309
+ return isEmpty2;
229
310
  }
230
311
  case "any":
231
312
  return Boolean(stringValue && stringValue !== "");
@@ -8,10 +8,10 @@ import {
8
8
  isConditionsActived,
9
9
  isEqual,
10
10
  regenerateConditionIds
11
- } from "../chunk-NVSDWUJP.js";
11
+ } from "../chunk-3UOSPZEP.js";
12
12
  import "../chunk-YYIGUZNZ.js";
13
13
  import "../chunk-PAESAL23.js";
14
- import "../chunk-CEK3SCQO.js";
14
+ import "../chunk-JQWKLXW6.js";
15
15
  import "../chunk-KYDXF7SU.js";
16
16
  import "../chunk-GFH3VWOC.js";
17
17
  import "../chunk-3KG2HTZ3.js";
@@ -33,6 +33,7 @@ __export(conditions_exports, {
33
33
  allConditionsHaveIds: () => allConditionsHaveIds,
34
34
  assignConditionIds: () => assignConditionIds,
35
35
  conditionsIsSame: () => conditionsIsSame,
36
+ convertTimeConditionLegacyToV2: () => convertTimeConditionLegacyToV2,
36
37
  evaluateAttributeCondition: () => evaluateAttributeCondition,
37
38
  evaluateRule: () => evaluateRule,
38
39
  evaluateRulesConditions: () => evaluateRulesConditions,
@@ -42,6 +43,9 @@ __export(conditions_exports, {
42
43
  isConditionsActived: () => isConditionsActived,
43
44
  isEqual: () => import_fast_deep_equal.default,
44
45
  isMatchUrlPattern: () => isMatchUrlPattern,
46
+ isTimeConditionDataLegacy: () => isTimeConditionDataLegacy,
47
+ isTimeConditionDataV2: () => isTimeConditionDataV2,
48
+ normalizeTimeConditionData: () => normalizeTimeConditionData,
45
49
  regenerateConditionIds: () => regenerateConditionIds
46
50
  });
47
51
  module.exports = __toCommonJS(conditions_exports);
@@ -135,27 +139,152 @@ var evaluateUrlCondition = (rules, url) => {
135
139
 
136
140
  // src/conditions/time.ts
137
141
  var import_date_fns = require("date-fns");
138
- var evaluateTimeCondition = (rules) => {
142
+
143
+ // src/type-utils.ts
144
+ var nativeIsArray = Array.isArray;
145
+ var ObjProto = Object.prototype;
146
+ var objToString = ObjProto.toString;
147
+ var objHasOwn = ObjProto.hasOwnProperty;
148
+ var isArray = nativeIsArray || ((obj) => objToString.call(obj) === "[object Array]");
149
+ var isUndefined = (x) => x === void 0;
150
+ var isString = (x) => {
151
+ return objToString.call(x) === "[object String]";
152
+ };
153
+ var isEmptyString = (x) => isString(x) && x.trim().length === 0;
154
+ var isNull = (x) => {
155
+ return x === null;
156
+ };
157
+ var isNullish = (x) => isUndefined(x) || isNull(x);
158
+
159
+ // src/conditions/time.ts
160
+ function isEmpty(value) {
161
+ return isNullish(value) || isEmptyString(value);
162
+ }
163
+ function hasRequiredFields(data, type) {
164
+ if (type === "start") {
165
+ return !isEmpty(data.startDate) && !isEmpty(data.startDateHour) && !isEmpty(data.startDateMinute);
166
+ }
167
+ return !isEmpty(data.endDate) && !isEmpty(data.endDateHour) && !isEmpty(data.endDateMinute);
168
+ }
169
+ function parseLegacyDate(dateStr) {
170
+ const [month, day, year] = dateStr.split("/");
171
+ if (!month || !day || !year) {
172
+ return null;
173
+ }
174
+ return {
175
+ month: Number.parseInt(month),
176
+ day: Number.parseInt(day),
177
+ year: Number.parseInt(year)
178
+ };
179
+ }
180
+ function createLegacyDateTime(data, type) {
181
+ const dateStr = type === "start" ? data.startDate : data.endDate;
182
+ const hourStr = type === "start" ? data.startDateHour : data.endDateHour;
183
+ const minuteStr = type === "start" ? data.startDateMinute : data.endDateMinute;
184
+ if (!dateStr || !hourStr || !minuteStr) {
185
+ return null;
186
+ }
187
+ const dateParts = parseLegacyDate(dateStr);
188
+ if (!dateParts) {
189
+ return null;
190
+ }
191
+ const dateTime = new Date(
192
+ dateParts.year,
193
+ dateParts.month - 1,
194
+ dateParts.day,
195
+ Number.parseInt(hourStr),
196
+ Number.parseInt(minuteStr),
197
+ 0
198
+ );
199
+ return (0, import_date_fns.isValid)(dateTime) ? dateTime : null;
200
+ }
201
+ function isTimeConditionDataV2(data) {
202
+ return data && ("startTime" in data || "endTime" in data);
203
+ }
204
+ function isTimeConditionDataLegacy(data) {
205
+ return data && ("startDate" in data || "startDateHour" in data);
206
+ }
207
+ function convertTimeConditionLegacyToV2(legacyData) {
139
208
  try {
140
- const { endDate, endDateHour, endDateMinute, startDate, startDateHour, startDateMinute } = rules.data || {};
141
- if (!startDate || !startDateHour || !startDateMinute) {
142
- return false;
209
+ if (!hasRequiredFields(legacyData, "start")) {
210
+ return null;
143
211
  }
144
- const startTimeString = `${startDate}T${startDateHour.padStart(2, "0")}:${startDateMinute.padStart(2, "0")}:00`;
145
- const startTime = (0, import_date_fns.parseISO)(startTimeString);
146
- if (!(0, import_date_fns.isValid)(startTime)) {
147
- return false;
212
+ const startDateTime = createLegacyDateTime(legacyData, "start");
213
+ if (!startDateTime) {
214
+ return null;
148
215
  }
149
- const now = /* @__PURE__ */ new Date();
150
- if (!endDate || !endDateHour || !endDateMinute) {
151
- return (0, import_date_fns.isAfter)(now, startTime);
216
+ const result = {
217
+ startTime: startDateTime.toISOString()
218
+ };
219
+ if (hasRequiredFields(legacyData, "end")) {
220
+ const endDateTime = createLegacyDateTime(legacyData, "end");
221
+ if (endDateTime) {
222
+ result.endTime = endDateTime.toISOString();
223
+ }
152
224
  }
153
- const endTimeString = `${endDate}T${endDateHour.padStart(2, "0")}:${endDateMinute.padStart(2, "0")}:00`;
154
- const endTime = (0, import_date_fns.parseISO)(endTimeString);
155
- if (!(0, import_date_fns.isValid)(endTime)) {
156
- return false;
225
+ return result;
226
+ } catch {
227
+ return null;
228
+ }
229
+ }
230
+ function normalizeTimeConditionData(data) {
231
+ if (!data) {
232
+ return null;
233
+ }
234
+ if (isTimeConditionDataV2(data)) {
235
+ return data;
236
+ }
237
+ if (isTimeConditionDataLegacy(data)) {
238
+ return convertTimeConditionLegacyToV2(data);
239
+ }
240
+ return null;
241
+ }
242
+ function evaluateTimeConditionV2(data) {
243
+ if (!data.startTime) {
244
+ return false;
245
+ }
246
+ const startTime = (0, import_date_fns.parseISO)(data.startTime);
247
+ if (!(0, import_date_fns.isValid)(startTime)) {
248
+ return false;
249
+ }
250
+ const now = /* @__PURE__ */ new Date();
251
+ if (!data.endTime) {
252
+ return (0, import_date_fns.isAfter)(now, startTime);
253
+ }
254
+ const endTime = (0, import_date_fns.parseISO)(data.endTime);
255
+ if (!(0, import_date_fns.isValid)(endTime)) {
256
+ return false;
257
+ }
258
+ return (0, import_date_fns.isAfter)(now, startTime) && (0, import_date_fns.isBefore)(now, endTime);
259
+ }
260
+ function evaluateTimeConditionLegacy(data) {
261
+ if (!hasRequiredFields(data, "start")) {
262
+ return false;
263
+ }
264
+ const startDateTime = createLegacyDateTime(data, "start");
265
+ if (!startDateTime) {
266
+ return false;
267
+ }
268
+ const now = /* @__PURE__ */ new Date();
269
+ if (!hasRequiredFields(data, "end")) {
270
+ return (0, import_date_fns.isAfter)(now, startDateTime);
271
+ }
272
+ const endDateTime = createLegacyDateTime(data, "end");
273
+ if (!endDateTime) {
274
+ return false;
275
+ }
276
+ return (0, import_date_fns.isAfter)(now, startDateTime) && (0, import_date_fns.isBefore)(now, endDateTime);
277
+ }
278
+ var evaluateTimeCondition = (rules) => {
279
+ try {
280
+ const data = rules.data || {};
281
+ if (isTimeConditionDataV2(data)) {
282
+ return evaluateTimeConditionV2(data);
157
283
  }
158
- return (0, import_date_fns.isAfter)(now, startTime) && (0, import_date_fns.isBefore)(now, endTime);
284
+ if (isTimeConditionDataLegacy(data)) {
285
+ return evaluateTimeConditionLegacy(data);
286
+ }
287
+ return false;
159
288
  } catch {
160
289
  return false;
161
290
  }
@@ -164,15 +293,6 @@ var evaluateTimeCondition = (rules) => {
164
293
  // src/conditions/attribute.ts
165
294
  var import_types = require("@usertour/types");
166
295
  var import_date_fns2 = require("date-fns");
167
-
168
- // src/type-utils.ts
169
- var nativeIsArray = Array.isArray;
170
- var ObjProto = Object.prototype;
171
- var objToString = ObjProto.toString;
172
- var objHasOwn = ObjProto.hasOwnProperty;
173
- var isArray = nativeIsArray || ((obj) => objToString.call(obj) === "[object Array]");
174
-
175
- // src/conditions/attribute.ts
176
296
  function evaluateAttributeCondition(condition, options) {
177
297
  const { data } = condition;
178
298
  if (!data) {
@@ -230,8 +350,8 @@ function evaluateStringCondition(logic, actualValue, expectedValue) {
230
350
  case "endsWith":
231
351
  return stringValue.endsWith(expectedValue);
232
352
  case "empty": {
233
- const isEmpty = !stringValue || stringValue === "";
234
- return isEmpty;
353
+ const isEmpty2 = !stringValue || stringValue === "";
354
+ return isEmpty2;
235
355
  }
236
356
  case "any":
237
357
  return Boolean(stringValue && stringValue !== "");
@@ -541,6 +661,7 @@ var allConditionsHaveIds = (conditions) => {
541
661
  allConditionsHaveIds,
542
662
  assignConditionIds,
543
663
  conditionsIsSame,
664
+ convertTimeConditionLegacyToV2,
544
665
  evaluateAttributeCondition,
545
666
  evaluateRule,
546
667
  evaluateRulesConditions,
@@ -550,5 +671,8 @@ var allConditionsHaveIds = (conditions) => {
550
671
  isConditionsActived,
551
672
  isEqual,
552
673
  isMatchUrlPattern,
674
+ isTimeConditionDataLegacy,
675
+ isTimeConditionDataV2,
676
+ normalizeTimeConditionData,
553
677
  regenerateConditionIds
554
678
  });
@@ -1,6 +1,6 @@
1
1
  export { allConditionsHaveIds, assignConditionIds, conditionsIsSame, evaluateRule, evaluateRulesConditions, filterConditionsByType, isConditionsActived, regenerateConditionIds } from './condition.cjs';
2
2
  export { evaluateUrlCondition, isMatchUrlPattern } from './url.cjs';
3
- export { evaluateTimeCondition } from './time.cjs';
3
+ export { convertTimeConditionLegacyToV2, evaluateTimeCondition, isTimeConditionDataLegacy, isTimeConditionDataV2, normalizeTimeConditionData } from './time.cjs';
4
4
  export { evaluateAttributeCondition } from './attribute.cjs';
5
5
  export { default as isEqual } from 'fast-deep-equal';
6
6
  import '@usertour/types';
@@ -1,6 +1,6 @@
1
1
  export { allConditionsHaveIds, assignConditionIds, conditionsIsSame, evaluateRule, evaluateRulesConditions, filterConditionsByType, isConditionsActived, regenerateConditionIds } from './condition.js';
2
2
  export { evaluateUrlCondition, isMatchUrlPattern } from './url.js';
3
- export { evaluateTimeCondition } from './time.js';
3
+ export { convertTimeConditionLegacyToV2, evaluateTimeCondition, isTimeConditionDataLegacy, isTimeConditionDataV2, normalizeTimeConditionData } from './time.js';
4
4
  export { evaluateAttributeCondition } from './attribute.js';
5
5
  export { default as isEqual } from 'fast-deep-equal';
6
6
  import '@usertour/types';
@@ -9,15 +9,19 @@ import {
9
9
  isConditionsActived,
10
10
  isEqual,
11
11
  regenerateConditionIds
12
- } from "../chunk-NVSDWUJP.js";
12
+ } from "../chunk-3UOSPZEP.js";
13
13
  import {
14
14
  evaluateUrlCondition,
15
15
  isMatchUrlPattern
16
16
  } from "../chunk-YYIGUZNZ.js";
17
17
  import "../chunk-PAESAL23.js";
18
18
  import {
19
- evaluateTimeCondition
20
- } from "../chunk-CEK3SCQO.js";
19
+ convertTimeConditionLegacyToV2,
20
+ evaluateTimeCondition,
21
+ isTimeConditionDataLegacy,
22
+ isTimeConditionDataV2,
23
+ normalizeTimeConditionData
24
+ } from "../chunk-JQWKLXW6.js";
21
25
  import {
22
26
  evaluateAttributeCondition
23
27
  } from "../chunk-KYDXF7SU.js";
@@ -28,6 +32,7 @@ export {
28
32
  allConditionsHaveIds,
29
33
  assignConditionIds,
30
34
  conditionsIsSame,
35
+ convertTimeConditionLegacyToV2,
31
36
  evaluateAttributeCondition,
32
37
  evaluateRule,
33
38
  evaluateRulesConditions,
@@ -37,5 +42,8 @@ export {
37
42
  isConditionsActived,
38
43
  isEqual,
39
44
  isMatchUrlPattern,
45
+ isTimeConditionDataLegacy,
46
+ isTimeConditionDataV2,
47
+ normalizeTimeConditionData,
40
48
  regenerateConditionIds
41
49
  };
@@ -20,36 +20,168 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/conditions/time.ts
21
21
  var time_exports = {};
22
22
  __export(time_exports, {
23
- evaluateTimeCondition: () => evaluateTimeCondition
23
+ convertTimeConditionLegacyToV2: () => convertTimeConditionLegacyToV2,
24
+ evaluateTimeCondition: () => evaluateTimeCondition,
25
+ isTimeConditionDataLegacy: () => isTimeConditionDataLegacy,
26
+ isTimeConditionDataV2: () => isTimeConditionDataV2,
27
+ normalizeTimeConditionData: () => normalizeTimeConditionData
24
28
  });
25
29
  module.exports = __toCommonJS(time_exports);
26
30
  var import_date_fns = require("date-fns");
27
- var evaluateTimeCondition = (rules) => {
31
+
32
+ // src/type-utils.ts
33
+ var nativeIsArray = Array.isArray;
34
+ var ObjProto = Object.prototype;
35
+ var objToString = ObjProto.toString;
36
+ var objHasOwn = ObjProto.hasOwnProperty;
37
+ var isUndefined = (x) => x === void 0;
38
+ var isString = (x) => {
39
+ return objToString.call(x) === "[object String]";
40
+ };
41
+ var isEmptyString = (x) => isString(x) && x.trim().length === 0;
42
+ var isNull = (x) => {
43
+ return x === null;
44
+ };
45
+ var isNullish = (x) => isUndefined(x) || isNull(x);
46
+
47
+ // src/conditions/time.ts
48
+ function isEmpty(value) {
49
+ return isNullish(value) || isEmptyString(value);
50
+ }
51
+ function hasRequiredFields(data, type) {
52
+ if (type === "start") {
53
+ return !isEmpty(data.startDate) && !isEmpty(data.startDateHour) && !isEmpty(data.startDateMinute);
54
+ }
55
+ return !isEmpty(data.endDate) && !isEmpty(data.endDateHour) && !isEmpty(data.endDateMinute);
56
+ }
57
+ function parseLegacyDate(dateStr) {
58
+ const [month, day, year] = dateStr.split("/");
59
+ if (!month || !day || !year) {
60
+ return null;
61
+ }
62
+ return {
63
+ month: Number.parseInt(month),
64
+ day: Number.parseInt(day),
65
+ year: Number.parseInt(year)
66
+ };
67
+ }
68
+ function createLegacyDateTime(data, type) {
69
+ const dateStr = type === "start" ? data.startDate : data.endDate;
70
+ const hourStr = type === "start" ? data.startDateHour : data.endDateHour;
71
+ const minuteStr = type === "start" ? data.startDateMinute : data.endDateMinute;
72
+ if (!dateStr || !hourStr || !minuteStr) {
73
+ return null;
74
+ }
75
+ const dateParts = parseLegacyDate(dateStr);
76
+ if (!dateParts) {
77
+ return null;
78
+ }
79
+ const dateTime = new Date(
80
+ dateParts.year,
81
+ dateParts.month - 1,
82
+ dateParts.day,
83
+ Number.parseInt(hourStr),
84
+ Number.parseInt(minuteStr),
85
+ 0
86
+ );
87
+ return (0, import_date_fns.isValid)(dateTime) ? dateTime : null;
88
+ }
89
+ function isTimeConditionDataV2(data) {
90
+ return data && ("startTime" in data || "endTime" in data);
91
+ }
92
+ function isTimeConditionDataLegacy(data) {
93
+ return data && ("startDate" in data || "startDateHour" in data);
94
+ }
95
+ function convertTimeConditionLegacyToV2(legacyData) {
28
96
  try {
29
- const { endDate, endDateHour, endDateMinute, startDate, startDateHour, startDateMinute } = rules.data || {};
30
- if (!startDate || !startDateHour || !startDateMinute) {
31
- return false;
97
+ if (!hasRequiredFields(legacyData, "start")) {
98
+ return null;
32
99
  }
33
- const startTimeString = `${startDate}T${startDateHour.padStart(2, "0")}:${startDateMinute.padStart(2, "0")}:00`;
34
- const startTime = (0, import_date_fns.parseISO)(startTimeString);
35
- if (!(0, import_date_fns.isValid)(startTime)) {
36
- return false;
100
+ const startDateTime = createLegacyDateTime(legacyData, "start");
101
+ if (!startDateTime) {
102
+ return null;
37
103
  }
38
- const now = /* @__PURE__ */ new Date();
39
- if (!endDate || !endDateHour || !endDateMinute) {
40
- return (0, import_date_fns.isAfter)(now, startTime);
104
+ const result = {
105
+ startTime: startDateTime.toISOString()
106
+ };
107
+ if (hasRequiredFields(legacyData, "end")) {
108
+ const endDateTime = createLegacyDateTime(legacyData, "end");
109
+ if (endDateTime) {
110
+ result.endTime = endDateTime.toISOString();
111
+ }
41
112
  }
42
- const endTimeString = `${endDate}T${endDateHour.padStart(2, "0")}:${endDateMinute.padStart(2, "0")}:00`;
43
- const endTime = (0, import_date_fns.parseISO)(endTimeString);
44
- if (!(0, import_date_fns.isValid)(endTime)) {
45
- return false;
113
+ return result;
114
+ } catch {
115
+ return null;
116
+ }
117
+ }
118
+ function normalizeTimeConditionData(data) {
119
+ if (!data) {
120
+ return null;
121
+ }
122
+ if (isTimeConditionDataV2(data)) {
123
+ return data;
124
+ }
125
+ if (isTimeConditionDataLegacy(data)) {
126
+ return convertTimeConditionLegacyToV2(data);
127
+ }
128
+ return null;
129
+ }
130
+ function evaluateTimeConditionV2(data) {
131
+ if (!data.startTime) {
132
+ return false;
133
+ }
134
+ const startTime = (0, import_date_fns.parseISO)(data.startTime);
135
+ if (!(0, import_date_fns.isValid)(startTime)) {
136
+ return false;
137
+ }
138
+ const now = /* @__PURE__ */ new Date();
139
+ if (!data.endTime) {
140
+ return (0, import_date_fns.isAfter)(now, startTime);
141
+ }
142
+ const endTime = (0, import_date_fns.parseISO)(data.endTime);
143
+ if (!(0, import_date_fns.isValid)(endTime)) {
144
+ return false;
145
+ }
146
+ return (0, import_date_fns.isAfter)(now, startTime) && (0, import_date_fns.isBefore)(now, endTime);
147
+ }
148
+ function evaluateTimeConditionLegacy(data) {
149
+ if (!hasRequiredFields(data, "start")) {
150
+ return false;
151
+ }
152
+ const startDateTime = createLegacyDateTime(data, "start");
153
+ if (!startDateTime) {
154
+ return false;
155
+ }
156
+ const now = /* @__PURE__ */ new Date();
157
+ if (!hasRequiredFields(data, "end")) {
158
+ return (0, import_date_fns.isAfter)(now, startDateTime);
159
+ }
160
+ const endDateTime = createLegacyDateTime(data, "end");
161
+ if (!endDateTime) {
162
+ return false;
163
+ }
164
+ return (0, import_date_fns.isAfter)(now, startDateTime) && (0, import_date_fns.isBefore)(now, endDateTime);
165
+ }
166
+ var evaluateTimeCondition = (rules) => {
167
+ try {
168
+ const data = rules.data || {};
169
+ if (isTimeConditionDataV2(data)) {
170
+ return evaluateTimeConditionV2(data);
46
171
  }
47
- return (0, import_date_fns.isAfter)(now, startTime) && (0, import_date_fns.isBefore)(now, endTime);
172
+ if (isTimeConditionDataLegacy(data)) {
173
+ return evaluateTimeConditionLegacy(data);
174
+ }
175
+ return false;
48
176
  } catch {
49
177
  return false;
50
178
  }
51
179
  };
52
180
  // Annotate the CommonJS export names for ESM import in node:
53
181
  0 && (module.exports = {
54
- evaluateTimeCondition
182
+ convertTimeConditionLegacyToV2,
183
+ evaluateTimeCondition,
184
+ isTimeConditionDataLegacy,
185
+ isTimeConditionDataV2,
186
+ normalizeTimeConditionData
55
187
  });
@@ -1,10 +1,37 @@
1
- import { RulesCondition } from '@usertour/types';
1
+ import { TimeConditionDataV2, TimeConditionDataLegacy, TimeConditionData, RulesCondition } from '@usertour/types';
2
2
 
3
+ /**
4
+ * Type guard to check if data is in new format (TimeConditionDataV2)
5
+ * @param data - The data to check
6
+ * @returns true if data has startTime or endTime fields
7
+ */
8
+ declare function isTimeConditionDataV2(data: any): data is TimeConditionDataV2;
9
+ /**
10
+ * Type guard to check if data is in legacy format (TimeConditionDataLegacy)
11
+ * @param data - The data to check
12
+ * @returns true if data has startDate or startDateHour fields
13
+ */
14
+ declare function isTimeConditionDataLegacy(data: any): data is TimeConditionDataLegacy;
15
+ /**
16
+ * Convert legacy format to new format (ISO 8601)
17
+ * @param legacyData - Legacy time condition data
18
+ * @returns New format time condition data, or null if conversion fails
19
+ */
20
+ declare function convertTimeConditionLegacyToV2(legacyData: TimeConditionDataLegacy): TimeConditionDataV2 | null;
21
+ /**
22
+ * Normalize time condition data to new format
23
+ * If data is already in new format, returns it as-is
24
+ * If data is in legacy format, converts it to new format
25
+ * @param data - Time condition data (either format)
26
+ * @returns New format time condition data, or null if conversion fails
27
+ */
28
+ declare function normalizeTimeConditionData(data: TimeConditionData | null | undefined): TimeConditionDataV2 | null;
3
29
  /**
4
30
  * Evaluate time condition based on start and end time rules
31
+ * Supports both new ISO 8601 format and legacy format for backward compatibility
5
32
  * @param rules - Time condition rules
6
33
  * @returns boolean indicating if current time matches the condition
7
34
  */
8
35
  declare const evaluateTimeCondition: (rules: RulesCondition) => boolean;
9
36
 
10
- export { evaluateTimeCondition };
37
+ export { convertTimeConditionLegacyToV2, evaluateTimeCondition, isTimeConditionDataLegacy, isTimeConditionDataV2, normalizeTimeConditionData };