@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.
@@ -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 };
@@ -1,7 +1,16 @@
1
1
  import {
2
- evaluateTimeCondition
3
- } from "../chunk-CEK3SCQO.js";
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
  export {
6
- evaluateTimeCondition
11
+ convertTimeConditionLegacyToV2,
12
+ evaluateTimeCondition,
13
+ isTimeConditionDataLegacy,
14
+ isTimeConditionDataV2,
15
+ normalizeTimeConditionData
7
16
  };
package/dist/index.cjs CHANGED
@@ -47,6 +47,7 @@ __export(src_exports, {
47
47
  cn: () => cn,
48
48
  conditionsIsSame: () => conditionsIsSame,
49
49
  convertSettings: () => convertSettings,
50
+ convertTimeConditionLegacyToV2: () => convertTimeConditionLegacyToV2,
50
51
  convertToCssVars: () => convertToCssVars,
51
52
  cuid: () => cuid,
52
53
  deepClone: () => deepClone,
@@ -105,6 +106,8 @@ __export(src_exports, {
105
106
  isPublishedAtLeastOneEnvironment: () => isPublishedAtLeastOneEnvironment,
106
107
  isPublishedInAllEnvironments: () => isPublishedInAllEnvironments,
107
108
  isString: () => isString,
109
+ isTimeConditionDataLegacy: () => isTimeConditionDataLegacy,
110
+ isTimeConditionDataV2: () => isTimeConditionDataV2,
108
111
  isUint8Array: () => isUint8Array,
109
112
  isUndefined: () => isUndefined,
110
113
  isUrl: () => isUrl,
@@ -114,6 +117,7 @@ __export(src_exports, {
114
117
  nativeForEach: () => nativeForEach,
115
118
  nativeIndexOf: () => nativeIndexOf,
116
119
  navigator: () => navigator,
120
+ normalizeTimeConditionData: () => normalizeTimeConditionData,
117
121
  parseUrlParams: () => parseUrlParams,
118
122
  regenerateConditionIds: () => regenerateConditionIds,
119
123
  removeAuthToken: () => removeAuthToken,
@@ -1103,27 +1107,134 @@ var evaluateUrlCondition = (rules, url) => {
1103
1107
 
1104
1108
  // src/conditions/time.ts
1105
1109
  var import_date_fns = require("date-fns");
1106
- var evaluateTimeCondition = (rules) => {
1110
+ function isEmpty(value) {
1111
+ return isNullish(value) || isEmptyString(value);
1112
+ }
1113
+ function hasRequiredFields(data, type) {
1114
+ if (type === "start") {
1115
+ return !isEmpty(data.startDate) && !isEmpty(data.startDateHour) && !isEmpty(data.startDateMinute);
1116
+ }
1117
+ return !isEmpty(data.endDate) && !isEmpty(data.endDateHour) && !isEmpty(data.endDateMinute);
1118
+ }
1119
+ function parseLegacyDate(dateStr) {
1120
+ const [month, day, year] = dateStr.split("/");
1121
+ if (!month || !day || !year) {
1122
+ return null;
1123
+ }
1124
+ return {
1125
+ month: Number.parseInt(month),
1126
+ day: Number.parseInt(day),
1127
+ year: Number.parseInt(year)
1128
+ };
1129
+ }
1130
+ function createLegacyDateTime(data, type) {
1131
+ const dateStr = type === "start" ? data.startDate : data.endDate;
1132
+ const hourStr = type === "start" ? data.startDateHour : data.endDateHour;
1133
+ const minuteStr = type === "start" ? data.startDateMinute : data.endDateMinute;
1134
+ if (!dateStr || !hourStr || !minuteStr) {
1135
+ return null;
1136
+ }
1137
+ const dateParts = parseLegacyDate(dateStr);
1138
+ if (!dateParts) {
1139
+ return null;
1140
+ }
1141
+ const dateTime = new Date(
1142
+ dateParts.year,
1143
+ dateParts.month - 1,
1144
+ dateParts.day,
1145
+ Number.parseInt(hourStr),
1146
+ Number.parseInt(minuteStr),
1147
+ 0
1148
+ );
1149
+ return (0, import_date_fns.isValid)(dateTime) ? dateTime : null;
1150
+ }
1151
+ function isTimeConditionDataV2(data) {
1152
+ return data && ("startTime" in data || "endTime" in data);
1153
+ }
1154
+ function isTimeConditionDataLegacy(data) {
1155
+ return data && ("startDate" in data || "startDateHour" in data);
1156
+ }
1157
+ function convertTimeConditionLegacyToV2(legacyData) {
1107
1158
  try {
1108
- const { endDate, endDateHour, endDateMinute, startDate, startDateHour, startDateMinute } = rules.data || {};
1109
- if (!startDate || !startDateHour || !startDateMinute) {
1110
- return false;
1159
+ if (!hasRequiredFields(legacyData, "start")) {
1160
+ return null;
1111
1161
  }
1112
- const startTimeString = `${startDate}T${startDateHour.padStart(2, "0")}:${startDateMinute.padStart(2, "0")}:00`;
1113
- const startTime = (0, import_date_fns.parseISO)(startTimeString);
1114
- if (!(0, import_date_fns.isValid)(startTime)) {
1115
- return false;
1162
+ const startDateTime = createLegacyDateTime(legacyData, "start");
1163
+ if (!startDateTime) {
1164
+ return null;
1116
1165
  }
1117
- const now = /* @__PURE__ */ new Date();
1118
- if (!endDate || !endDateHour || !endDateMinute) {
1119
- return (0, import_date_fns.isAfter)(now, startTime);
1166
+ const result = {
1167
+ startTime: startDateTime.toISOString()
1168
+ };
1169
+ if (hasRequiredFields(legacyData, "end")) {
1170
+ const endDateTime = createLegacyDateTime(legacyData, "end");
1171
+ if (endDateTime) {
1172
+ result.endTime = endDateTime.toISOString();
1173
+ }
1120
1174
  }
1121
- const endTimeString = `${endDate}T${endDateHour.padStart(2, "0")}:${endDateMinute.padStart(2, "0")}:00`;
1122
- const endTime = (0, import_date_fns.parseISO)(endTimeString);
1123
- if (!(0, import_date_fns.isValid)(endTime)) {
1124
- return false;
1175
+ return result;
1176
+ } catch {
1177
+ return null;
1178
+ }
1179
+ }
1180
+ function normalizeTimeConditionData(data) {
1181
+ if (!data) {
1182
+ return null;
1183
+ }
1184
+ if (isTimeConditionDataV2(data)) {
1185
+ return data;
1186
+ }
1187
+ if (isTimeConditionDataLegacy(data)) {
1188
+ return convertTimeConditionLegacyToV2(data);
1189
+ }
1190
+ return null;
1191
+ }
1192
+ function evaluateTimeConditionV2(data) {
1193
+ if (!data.startTime) {
1194
+ return false;
1195
+ }
1196
+ const startTime = (0, import_date_fns.parseISO)(data.startTime);
1197
+ if (!(0, import_date_fns.isValid)(startTime)) {
1198
+ return false;
1199
+ }
1200
+ const now = /* @__PURE__ */ new Date();
1201
+ if (!data.endTime) {
1202
+ return (0, import_date_fns.isAfter)(now, startTime);
1203
+ }
1204
+ const endTime = (0, import_date_fns.parseISO)(data.endTime);
1205
+ if (!(0, import_date_fns.isValid)(endTime)) {
1206
+ return false;
1207
+ }
1208
+ return (0, import_date_fns.isAfter)(now, startTime) && (0, import_date_fns.isBefore)(now, endTime);
1209
+ }
1210
+ function evaluateTimeConditionLegacy(data) {
1211
+ if (!hasRequiredFields(data, "start")) {
1212
+ return false;
1213
+ }
1214
+ const startDateTime = createLegacyDateTime(data, "start");
1215
+ if (!startDateTime) {
1216
+ return false;
1217
+ }
1218
+ const now = /* @__PURE__ */ new Date();
1219
+ if (!hasRequiredFields(data, "end")) {
1220
+ return (0, import_date_fns.isAfter)(now, startDateTime);
1221
+ }
1222
+ const endDateTime = createLegacyDateTime(data, "end");
1223
+ if (!endDateTime) {
1224
+ return false;
1225
+ }
1226
+ return (0, import_date_fns.isAfter)(now, startDateTime) && (0, import_date_fns.isBefore)(now, endDateTime);
1227
+ }
1228
+ var evaluateTimeCondition = (rules) => {
1229
+ try {
1230
+ const data = rules.data || {};
1231
+ if (isTimeConditionDataV2(data)) {
1232
+ return evaluateTimeConditionV2(data);
1233
+ }
1234
+ if (isTimeConditionDataLegacy(data)) {
1235
+ return evaluateTimeConditionLegacy(data);
1125
1236
  }
1126
- return (0, import_date_fns.isAfter)(now, startTime) && (0, import_date_fns.isBefore)(now, endTime);
1237
+ return false;
1127
1238
  } catch {
1128
1239
  return false;
1129
1240
  }
@@ -1189,8 +1300,8 @@ function evaluateStringCondition(logic, actualValue, expectedValue) {
1189
1300
  case "endsWith":
1190
1301
  return stringValue.endsWith(expectedValue);
1191
1302
  case "empty": {
1192
- const isEmpty = !stringValue || stringValue === "";
1193
- return isEmpty;
1303
+ const isEmpty2 = !stringValue || stringValue === "";
1304
+ return isEmpty2;
1194
1305
  }
1195
1306
  case "any":
1196
1307
  return Boolean(stringValue && stringValue !== "");
@@ -1510,6 +1621,7 @@ var filterNullAttributes = (attributes) => {
1510
1621
  cn,
1511
1622
  conditionsIsSame,
1512
1623
  convertSettings,
1624
+ convertTimeConditionLegacyToV2,
1513
1625
  convertToCssVars,
1514
1626
  cuid,
1515
1627
  deepClone,
@@ -1568,6 +1680,8 @@ var filterNullAttributes = (attributes) => {
1568
1680
  isPublishedAtLeastOneEnvironment,
1569
1681
  isPublishedInAllEnvironments,
1570
1682
  isString,
1683
+ isTimeConditionDataLegacy,
1684
+ isTimeConditionDataV2,
1571
1685
  isUint8Array,
1572
1686
  isUndefined,
1573
1687
  isUrl,
@@ -1577,6 +1691,7 @@ var filterNullAttributes = (attributes) => {
1577
1691
  nativeForEach,
1578
1692
  nativeIndexOf,
1579
1693
  navigator,
1694
+ normalizeTimeConditionData,
1580
1695
  parseUrlParams,
1581
1696
  regenerateConditionIds,
1582
1697
  removeAuthToken,
package/dist/index.d.cts CHANGED
@@ -11,7 +11,7 @@ export { generateAutoStateColors, hexToHSLString, hexToRGBStr } from './color.cj
11
11
  export { absoluteUrl, cn, cuid, evalCode, formatDate, getRandomColor, hexToRgb, isDark, uuidV4 } from './helper.cjs';
12
12
  export { allConditionsHaveIds, assignConditionIds, conditionsIsSame, evaluateRule, evaluateRulesConditions, filterConditionsByType, isConditionsActived, regenerateConditionIds } from './conditions/condition.cjs';
13
13
  export { evaluateUrlCondition, isMatchUrlPattern } from './conditions/url.cjs';
14
- export { evaluateTimeCondition } from './conditions/time.cjs';
14
+ export { convertTimeConditionLegacyToV2, evaluateTimeCondition, isTimeConditionDataLegacy, isTimeConditionDataV2, normalizeTimeConditionData } from './conditions/time.cjs';
15
15
  export { evaluateAttributeCondition } from './conditions/attribute.cjs';
16
16
  export { capitalizeFirstLetter, filterNullAttributes, getAttributeType } from './attribute.cjs';
17
17
  export { default as isEqual } from 'fast-deep-equal';
package/dist/index.d.ts CHANGED
@@ -11,7 +11,7 @@ export { generateAutoStateColors, hexToHSLString, hexToRGBStr } from './color.js
11
11
  export { absoluteUrl, cn, cuid, evalCode, formatDate, getRandomColor, hexToRgb, isDark, uuidV4 } from './helper.js';
12
12
  export { allConditionsHaveIds, assignConditionIds, conditionsIsSame, evaluateRule, evaluateRulesConditions, filterConditionsByType, isConditionsActived, regenerateConditionIds } from './conditions/condition.js';
13
13
  export { evaluateUrlCondition, isMatchUrlPattern } from './conditions/url.js';
14
- export { evaluateTimeCondition } from './conditions/time.js';
14
+ export { convertTimeConditionLegacyToV2, evaluateTimeCondition, isTimeConditionDataLegacy, isTimeConditionDataV2, normalizeTimeConditionData } from './conditions/time.js';
15
15
  export { evaluateAttributeCondition } from './conditions/attribute.js';
16
16
  export { capitalizeFirstLetter, filterNullAttributes, getAttributeType } from './attribute.js';
17
17
  export { default as isEqual } from 'fast-deep-equal';
package/dist/index.js CHANGED
@@ -20,15 +20,19 @@ import {
20
20
  isConditionsActived,
21
21
  isEqual,
22
22
  regenerateConditionIds
23
- } from "./chunk-NVSDWUJP.js";
23
+ } from "./chunk-3UOSPZEP.js";
24
24
  import {
25
25
  evaluateUrlCondition,
26
26
  isMatchUrlPattern
27
27
  } from "./chunk-YYIGUZNZ.js";
28
28
  import "./chunk-PAESAL23.js";
29
29
  import {
30
- evaluateTimeCondition
31
- } from "./chunk-CEK3SCQO.js";
30
+ convertTimeConditionLegacyToV2,
31
+ evaluateTimeCondition,
32
+ isTimeConditionDataLegacy,
33
+ isTimeConditionDataV2,
34
+ normalizeTimeConditionData
35
+ } from "./chunk-JQWKLXW6.js";
32
36
  import {
33
37
  evaluateAttributeCondition
34
38
  } from "./chunk-KYDXF7SU.js";
@@ -135,6 +139,7 @@ export {
135
139
  cn,
136
140
  conditionsIsSame,
137
141
  convertSettings,
142
+ convertTimeConditionLegacyToV2,
138
143
  convertToCssVars,
139
144
  cuid,
140
145
  deepClone,
@@ -193,6 +198,8 @@ export {
193
198
  isPublishedAtLeastOneEnvironment,
194
199
  isPublishedInAllEnvironments,
195
200
  isString,
201
+ isTimeConditionDataLegacy,
202
+ isTimeConditionDataV2,
196
203
  isUint8Array,
197
204
  isUndefined,
198
205
  isUrl,
@@ -202,6 +209,7 @@ export {
202
209
  nativeForEach,
203
210
  nativeIndexOf,
204
211
  navigator,
212
+ normalizeTimeConditionData,
205
213
  parseUrlParams,
206
214
  regenerateConditionIds,
207
215
  removeAuthToken,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@usertour/helpers",
3
- "version": "0.0.35",
3
+ "version": "0.0.36",
4
4
  "type": "module",
5
5
  "description": "Utility functions and helpers shared across the UserTour project",
6
6
  "homepage": "https://www.usertour.io",
@@ -29,7 +29,7 @@
29
29
  },
30
30
  "dependencies": {
31
31
  "@paralleldrive/cuid2": "^2.2.2",
32
- "@usertour/types": "^0.0.19",
32
+ "@usertour/types": "^0.0.26",
33
33
  "chroma-js": "^3.1.2",
34
34
  "class-variance-authority": "^0.4.0",
35
35
  "clsx": "^1.2.1",
@@ -1,31 +0,0 @@
1
- // src/conditions/time.ts
2
- import { isAfter, isBefore, isValid, parseISO } from "date-fns";
3
- var evaluateTimeCondition = (rules) => {
4
- try {
5
- const { endDate, endDateHour, endDateMinute, startDate, startDateHour, startDateMinute } = rules.data || {};
6
- if (!startDate || !startDateHour || !startDateMinute) {
7
- return false;
8
- }
9
- const startTimeString = `${startDate}T${startDateHour.padStart(2, "0")}:${startDateMinute.padStart(2, "0")}:00`;
10
- const startTime = parseISO(startTimeString);
11
- if (!isValid(startTime)) {
12
- return false;
13
- }
14
- const now = /* @__PURE__ */ new Date();
15
- if (!endDate || !endDateHour || !endDateMinute) {
16
- return isAfter(now, startTime);
17
- }
18
- const endTimeString = `${endDate}T${endDateHour.padStart(2, "0")}:${endDateMinute.padStart(2, "0")}:00`;
19
- const endTime = parseISO(endTimeString);
20
- if (!isValid(endTime)) {
21
- return false;
22
- }
23
- return isAfter(now, startTime) && isBefore(now, endTime);
24
- } catch {
25
- return false;
26
- }
27
- };
28
-
29
- export {
30
- evaluateTimeCondition
31
- };