@usertour/helpers 0.0.29 → 0.0.31

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.
@@ -143,20 +143,27 @@ var evaluateTimeCondition = (rules) => {
143
143
  // src/conditions/attribute.ts
144
144
  var import_types = require("@usertour/types");
145
145
  var import_date_fns2 = require("date-fns");
146
- function evaluateAttributeCondition(condition, attributes, userAttributes) {
146
+ function evaluateAttributeCondition(condition, options) {
147
147
  const { data } = condition;
148
148
  if (!data) {
149
149
  return false;
150
150
  }
151
151
  const { logic, value, attrId, value2, listValues = [] } = data;
152
- if (!attrId) {
152
+ const {
153
+ attributes,
154
+ userAttributes = {},
155
+ companyAttributes = {},
156
+ membershipAttributes = {}
157
+ } = options;
158
+ if (!attrId || !attributes) {
153
159
  return false;
154
160
  }
155
161
  const attr = attributes.find((attr2) => attr2.id === attrId);
156
162
  if (!attr) {
157
163
  return false;
158
164
  }
159
- const actualValue = getAttributeValue(attr.codeName, userAttributes);
165
+ const bizAttributes = attr.bizType === import_types.AttributeBizTypes.Company ? companyAttributes : attr.bizType === import_types.AttributeBizTypes.Membership ? membershipAttributes : userAttributes;
166
+ const actualValue = getAttributeValue(attr.codeName, bizAttributes);
160
167
  if (attr.dataType === import_types.BizAttributeTypes.String) {
161
168
  return evaluateStringCondition(logic, actualValue, value);
162
169
  }
@@ -174,8 +181,8 @@ function evaluateAttributeCondition(condition, attributes, userAttributes) {
174
181
  }
175
182
  return false;
176
183
  }
177
- function getAttributeValue(codeName, userAttributes) {
178
- return userAttributes == null ? void 0 : userAttributes[codeName];
184
+ function getAttributeValue(codeName, attributes) {
185
+ return attributes == null ? void 0 : attributes[codeName];
179
186
  }
180
187
  function evaluateStringCondition(logic, actualValue, expectedValue) {
181
188
  const stringValue = actualValue === null || actualValue === void 0 ? "" : String(actualValue);
@@ -320,6 +327,74 @@ function evaluateDateTimeCondition(logic, actualValue, expectedValue) {
320
327
  }
321
328
  }
322
329
 
330
+ // src/helper.ts
331
+ var import_clsx = require("clsx");
332
+ var import_tailwind_merge = require("tailwind-merge");
333
+ var import_uuid = require("uuid");
334
+ var import_cuid2 = require("@paralleldrive/cuid2");
335
+ function cn(...inputs) {
336
+ return (0, import_tailwind_merge.twMerge)((0, import_clsx.clsx)(inputs));
337
+ }
338
+ var cuid = () => {
339
+ return (0, import_cuid2.createId)();
340
+ };
341
+ function formatDate(input) {
342
+ const date = new Date(input);
343
+ return date.toLocaleDateString("en-US", {
344
+ month: "long",
345
+ day: "numeric",
346
+ year: "numeric"
347
+ });
348
+ }
349
+ function absoluteUrl(path) {
350
+ return `${path}`;
351
+ }
352
+ var uuidV4 = () => {
353
+ return (0, import_uuid.v4)();
354
+ };
355
+ function hexToRgb(hex) {
356
+ const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
357
+ return result ? {
358
+ r: Number.parseInt(result[1], 16),
359
+ g: Number.parseInt(result[2], 16),
360
+ b: Number.parseInt(result[3], 16)
361
+ } : null;
362
+ }
363
+ var isDark = (hex) => {
364
+ const rgb = hexToRgb(hex);
365
+ if (!rgb) {
366
+ return null;
367
+ }
368
+ const { r, g, b } = rgb;
369
+ if (r * 0.299 + g * 0.587 + b * 0.114 > 186) {
370
+ return true;
371
+ }
372
+ return false;
373
+ };
374
+ var evalCode = (code) => {
375
+ try {
376
+ return eval(code);
377
+ } catch (error) {
378
+ console.error("Usertour.js: Error evaluating code:", error);
379
+ return null;
380
+ }
381
+ };
382
+ var getRandomColor = () => {
383
+ const colors = [
384
+ "bg-red-500",
385
+ "bg-orange-500",
386
+ "bg-yellow-500",
387
+ "bg-green-500",
388
+ "bg-teal-500",
389
+ "bg-blue-500",
390
+ "bg-indigo-500",
391
+ "bg-purple-500",
392
+ "bg-pink-500",
393
+ "bg-rose-500"
394
+ ];
395
+ return colors[Math.floor(Math.random() * colors.length)];
396
+ };
397
+
323
398
  // src/conditions/condition.ts
324
399
  var isConditionsActived = (conditions) => {
325
400
  if (!conditions || conditions.length === 0) {
@@ -373,11 +448,7 @@ var evaluateRule = async (condition, options) => {
373
448
  case import_types2.RulesType.TIME:
374
449
  return evaluateTimeCondition(condition);
375
450
  case import_types2.RulesType.USER_ATTR:
376
- return evaluateAttributeCondition(
377
- condition,
378
- options.attributes || [],
379
- options.userAttributes || {}
380
- );
451
+ return evaluateAttributeCondition(condition, options);
381
452
  default:
382
453
  return condition.actived || false;
383
454
  }
@@ -649,8 +720,8 @@ describe("evaluateRulesConditions", () => {
649
720
  {
650
721
  id: "email",
651
722
  codeName: "email",
652
- dataType: 2
653
- // String
723
+ dataType: import_types3.BizAttributeTypes.String,
724
+ bizType: import_types3.AttributeBizTypes.User
654
725
  }
655
726
  ],
656
727
  userAttributes: {
@@ -2,15 +2,20 @@ import {
2
2
  evaluateRulesConditions,
3
3
  filterConditionsByType,
4
4
  isConditionsActived
5
- } from "../chunk-E2IJQFKH.js";
5
+ } from "../chunk-VBHUPKP7.js";
6
6
  import "../chunk-YYIGUZNZ.js";
7
7
  import "../chunk-PAESAL23.js";
8
- import "../chunk-PBZSPV5R.js";
8
+ import "../chunk-P46FJFKP.js";
9
9
  import "../chunk-CEK3SCQO.js";
10
+ import "../chunk-3KG2HTZ3.js";
10
11
  import "../chunk-XEO3YXBM.js";
11
12
 
12
13
  // src/__tests__/condition.test.ts
13
- import { RulesType } from "@usertour/types";
14
+ import {
15
+ RulesType,
16
+ BizAttributeTypes,
17
+ AttributeBizTypes
18
+ } from "@usertour/types";
14
19
  describe("filterConditionsByType", () => {
15
20
  test("should return empty array when no conditions provided", () => {
16
21
  const result = filterConditionsByType([], [RulesType.CURRENT_PAGE, RulesType.TIME]);
@@ -259,8 +264,8 @@ describe("evaluateRulesConditions", () => {
259
264
  {
260
265
  id: "email",
261
266
  codeName: "email",
262
- dataType: 2
263
- // String
267
+ dataType: BizAttributeTypes.String,
268
+ bizType: AttributeBizTypes.User
264
269
  }
265
270
  ],
266
271
  userAttributes: {
@@ -1,14 +1,17 @@
1
1
  // src/conditions/attribute.ts
2
- import { BizAttributeTypes } from "@usertour/types";
2
+ import {
3
+ BizAttributeTypes,
4
+ AttributeBizTypes
5
+ } from "@usertour/types";
3
6
  import { subDays, startOfDay, endOfDay } from "date-fns";
4
- function evaluateFilterConditions(conditions, attributes, userAttributes) {
7
+ function evaluateFilterConditions(conditions, options) {
5
8
  if (!conditions || !conditions.length) {
6
9
  return true;
7
10
  }
8
- const result = evaluateAttributeConditionsGroup(conditions, attributes, userAttributes);
11
+ const result = evaluateAttributeConditionsGroup(conditions, options);
9
12
  return evaluateFilterResult(result);
10
13
  }
11
- function evaluateAttributeConditionsGroup(conditions, attributes, userAttributes) {
14
+ function evaluateAttributeConditionsGroup(conditions, options) {
12
15
  if (!conditions || !conditions.length) {
13
16
  return false;
14
17
  }
@@ -16,7 +19,7 @@ function evaluateAttributeConditionsGroup(conditions, attributes, userAttributes
16
19
  const OR = [];
17
20
  for (const condition of conditions) {
18
21
  const { operators } = condition;
19
- const item = condition.type !== "group" ? evaluateAttributeCondition(condition, attributes, userAttributes) : evaluateAttributeConditionsGroup(condition.conditions || [], attributes, userAttributes);
22
+ const item = condition.type !== "group" ? evaluateAttributeCondition(condition, options) : evaluateAttributeConditionsGroup(condition.conditions || [], options);
20
23
  if (!item) {
21
24
  continue;
22
25
  }
@@ -38,20 +41,27 @@ function evaluateAttributeConditionsGroup(conditions, attributes, userAttributes
38
41
  }
39
42
  return filter;
40
43
  }
41
- function evaluateAttributeCondition(condition, attributes, userAttributes) {
44
+ function evaluateAttributeCondition(condition, options) {
42
45
  const { data } = condition;
43
46
  if (!data) {
44
47
  return false;
45
48
  }
46
49
  const { logic, value, attrId, value2, listValues = [] } = data;
47
- if (!attrId) {
50
+ const {
51
+ attributes,
52
+ userAttributes = {},
53
+ companyAttributes = {},
54
+ membershipAttributes = {}
55
+ } = options;
56
+ if (!attrId || !attributes) {
48
57
  return false;
49
58
  }
50
59
  const attr = attributes.find((attr2) => attr2.id === attrId);
51
60
  if (!attr) {
52
61
  return false;
53
62
  }
54
- const actualValue = getAttributeValue(attr.codeName, userAttributes);
63
+ const bizAttributes = attr.bizType === AttributeBizTypes.Company ? companyAttributes : attr.bizType === AttributeBizTypes.Membership ? membershipAttributes : userAttributes;
64
+ const actualValue = getAttributeValue(attr.codeName, bizAttributes);
55
65
  if (attr.dataType === BizAttributeTypes.String) {
56
66
  return evaluateStringCondition(logic, actualValue, value);
57
67
  }
@@ -69,8 +79,8 @@ function evaluateAttributeCondition(condition, attributes, userAttributes) {
69
79
  }
70
80
  return false;
71
81
  }
72
- function getAttributeValue(codeName, userAttributes) {
73
- return userAttributes == null ? void 0 : userAttributes[codeName];
82
+ function getAttributeValue(codeName, attributes) {
83
+ return attributes == null ? void 0 : attributes[codeName];
74
84
  }
75
85
  function evaluateStringCondition(logic, actualValue, expectedValue) {
76
86
  const stringValue = actualValue === null || actualValue === void 0 ? "" : String(actualValue);
@@ -3,10 +3,13 @@ import {
3
3
  } from "./chunk-YYIGUZNZ.js";
4
4
  import {
5
5
  evaluateAttributeCondition
6
- } from "./chunk-PBZSPV5R.js";
6
+ } from "./chunk-P46FJFKP.js";
7
7
  import {
8
8
  evaluateTimeCondition
9
9
  } from "./chunk-CEK3SCQO.js";
10
+ import {
11
+ cuid
12
+ } from "./chunk-3KG2HTZ3.js";
10
13
 
11
14
  // src/conditions/condition.ts
12
15
  import { RulesType } from "@usertour/types";
@@ -66,11 +69,7 @@ var evaluateRule = async (condition, options) => {
66
69
  case RulesType.TIME:
67
70
  return evaluateTimeCondition(condition);
68
71
  case RulesType.USER_ATTR:
69
- return evaluateAttributeCondition(
70
- condition,
71
- options.attributes || [],
72
- options.userAttributes || {}
73
- );
72
+ return evaluateAttributeCondition(condition, options);
74
73
  default:
75
74
  return condition.actived || false;
76
75
  }
@@ -92,6 +91,38 @@ var evaluateRulesConditions = async (conditions, options = {}) => {
92
91
  }
93
92
  return results;
94
93
  };
94
+ var regenerateConditionIds = (conditions) => {
95
+ return conditions.map((condition) => ({
96
+ ...condition,
97
+ id: cuid(),
98
+ conditions: condition.conditions ? regenerateConditionIds(condition.conditions) : void 0
99
+ }));
100
+ };
101
+ var assignConditionIds = (conditions) => {
102
+ return conditions.map((condition) => {
103
+ var _a;
104
+ return {
105
+ ...condition,
106
+ id: (_a = condition.id) != null ? _a : cuid(),
107
+ conditions: condition.conditions ? assignConditionIds(condition.conditions) : void 0
108
+ };
109
+ });
110
+ };
111
+ var allConditionsHaveIds = (conditions) => {
112
+ if (!conditions || conditions.length === 0)
113
+ return true;
114
+ for (const condition of conditions) {
115
+ if (!condition.id) {
116
+ return false;
117
+ }
118
+ if (condition.type === "group" && condition.conditions) {
119
+ if (!allConditionsHaveIds(condition.conditions)) {
120
+ return false;
121
+ }
122
+ }
123
+ }
124
+ return true;
125
+ };
95
126
 
96
127
  export {
97
128
  isEqual,
@@ -99,5 +130,8 @@ export {
99
130
  isConditionsActived,
100
131
  filterConditionsByType,
101
132
  evaluateRule,
102
- evaluateRulesConditions
133
+ evaluateRulesConditions,
134
+ regenerateConditionIds,
135
+ assignConditionIds,
136
+ allConditionsHaveIds
103
137
  };
@@ -4,25 +4,24 @@ import {
4
4
  } from "@usertour/types";
5
5
  import { deepmerge } from "deepmerge-ts";
6
6
  var isPublishedInAllEnvironments = (content, environmentList, version) => {
7
- const isPublishedInAllEnvironments2 = environmentList == null ? void 0 : environmentList.every(
7
+ var _a;
8
+ if (!((_a = content == null ? void 0 : content.contentOnEnvironments) == null ? void 0 : _a.length) || !(environmentList == null ? void 0 : environmentList.length) || !(version == null ? void 0 : version.id)) {
9
+ return false;
10
+ }
11
+ return environmentList.every(
8
12
  (env) => {
9
- var _a;
10
- return (_a = content == null ? void 0 : content.contentOnEnvironments) == null ? void 0 : _a.find(
11
- (item) => item.published && item.publishedVersionId === (version == null ? void 0 : version.id) && item.environment.id === env.id
13
+ var _a2;
14
+ return (_a2 = content == null ? void 0 : content.contentOnEnvironments) == null ? void 0 : _a2.some(
15
+ (item) => item.published && item.publishedVersionId === version.id && item.environment.id === env.id
12
16
  );
13
17
  }
14
18
  );
15
- const isPublishedInOneEnvironment = (content == null ? void 0 : content.published) && (content == null ? void 0 : content.publishedVersionId) === (version == null ? void 0 : version.id) && environmentList && (environmentList == null ? void 0 : environmentList.length) === 1;
16
- return (content == null ? void 0 : content.contentOnEnvironments) && (content == null ? void 0 : content.contentOnEnvironments.length) > 0 ? Boolean(isPublishedInAllEnvironments2) : Boolean(isPublishedInOneEnvironment);
17
19
  };
18
20
  var isPublishedAtLeastOneEnvironment = (content) => {
19
21
  var _a;
20
22
  if ((content == null ? void 0 : content.contentOnEnvironments) && ((_a = content == null ? void 0 : content.contentOnEnvironments) == null ? void 0 : _a.length) > 0) {
21
23
  return true;
22
24
  }
23
- if ((content == null ? void 0 : content.published) && (content == null ? void 0 : content.publishedVersionId)) {
24
- return true;
25
- }
26
25
  return false;
27
26
  };
28
27
  var rulesSetting = {
@@ -26,14 +26,14 @@ __export(attribute_exports, {
26
26
  module.exports = __toCommonJS(attribute_exports);
27
27
  var import_types = require("@usertour/types");
28
28
  var import_date_fns = require("date-fns");
29
- function evaluateFilterConditions(conditions, attributes, userAttributes) {
29
+ function evaluateFilterConditions(conditions, options) {
30
30
  if (!conditions || !conditions.length) {
31
31
  return true;
32
32
  }
33
- const result = evaluateAttributeConditionsGroup(conditions, attributes, userAttributes);
33
+ const result = evaluateAttributeConditionsGroup(conditions, options);
34
34
  return evaluateFilterResult(result);
35
35
  }
36
- function evaluateAttributeConditionsGroup(conditions, attributes, userAttributes) {
36
+ function evaluateAttributeConditionsGroup(conditions, options) {
37
37
  if (!conditions || !conditions.length) {
38
38
  return false;
39
39
  }
@@ -41,7 +41,7 @@ function evaluateAttributeConditionsGroup(conditions, attributes, userAttributes
41
41
  const OR = [];
42
42
  for (const condition of conditions) {
43
43
  const { operators } = condition;
44
- const item = condition.type !== "group" ? evaluateAttributeCondition(condition, attributes, userAttributes) : evaluateAttributeConditionsGroup(condition.conditions || [], attributes, userAttributes);
44
+ const item = condition.type !== "group" ? evaluateAttributeCondition(condition, options) : evaluateAttributeConditionsGroup(condition.conditions || [], options);
45
45
  if (!item) {
46
46
  continue;
47
47
  }
@@ -63,20 +63,27 @@ function evaluateAttributeConditionsGroup(conditions, attributes, userAttributes
63
63
  }
64
64
  return filter;
65
65
  }
66
- function evaluateAttributeCondition(condition, attributes, userAttributes) {
66
+ function evaluateAttributeCondition(condition, options) {
67
67
  const { data } = condition;
68
68
  if (!data) {
69
69
  return false;
70
70
  }
71
71
  const { logic, value, attrId, value2, listValues = [] } = data;
72
- if (!attrId) {
72
+ const {
73
+ attributes,
74
+ userAttributes = {},
75
+ companyAttributes = {},
76
+ membershipAttributes = {}
77
+ } = options;
78
+ if (!attrId || !attributes) {
73
79
  return false;
74
80
  }
75
81
  const attr = attributes.find((attr2) => attr2.id === attrId);
76
82
  if (!attr) {
77
83
  return false;
78
84
  }
79
- const actualValue = getAttributeValue(attr.codeName, userAttributes);
85
+ const bizAttributes = attr.bizType === import_types.AttributeBizTypes.Company ? companyAttributes : attr.bizType === import_types.AttributeBizTypes.Membership ? membershipAttributes : userAttributes;
86
+ const actualValue = getAttributeValue(attr.codeName, bizAttributes);
80
87
  if (attr.dataType === import_types.BizAttributeTypes.String) {
81
88
  return evaluateStringCondition(logic, actualValue, value);
82
89
  }
@@ -94,8 +101,8 @@ function evaluateAttributeCondition(condition, attributes, userAttributes) {
94
101
  }
95
102
  return false;
96
103
  }
97
- function getAttributeValue(codeName, userAttributes) {
98
- return userAttributes == null ? void 0 : userAttributes[codeName];
104
+ function getAttributeValue(codeName, attributes) {
105
+ return attributes == null ? void 0 : attributes[codeName];
99
106
  }
100
107
  function evaluateStringCondition(logic, actualValue, expectedValue) {
101
108
  const stringValue = actualValue === null || actualValue === void 0 ? "" : String(actualValue);
@@ -1,20 +1,18 @@
1
- import { RulesCondition, SimpleAttribute, UserTourTypes } from '@usertour/types';
1
+ import { RulesCondition, RulesEvaluationOptions } from '@usertour/types';
2
2
 
3
3
  /**
4
4
  * Evaluate filter conditions and return boolean result
5
5
  * @param conditions - Filter conditions to evaluate
6
- * @param attributes - Available attributes
7
- * @param context - Filter context with user attributes
6
+ * @param options - Evaluation options including attributes, user attributes, company attributes, and membership attributes
8
7
  * @returns boolean indicating if conditions are met
9
8
  */
10
- declare function evaluateFilterConditions(conditions: RulesCondition[], attributes: SimpleAttribute[], userAttributes: UserTourTypes.Attributes): boolean;
9
+ declare function evaluateFilterConditions(conditions: RulesCondition[], options: Pick<RulesEvaluationOptions, 'attributes' | 'userAttributes' | 'companyAttributes' | 'membershipAttributes'>): boolean;
11
10
  /**
12
11
  * Evaluate a single attribute condition
13
12
  * @param condition - Single attribute filter condition
14
- * @param attributes - Available attributes
15
- * @param context - Filter context with user attributes
13
+ * @param options - Evaluation options including attributes, user attributes, company attributes, and membership attributes
16
14
  * @returns Evaluation result (boolean or complex structure)
17
15
  */
18
- declare function evaluateAttributeCondition(condition: RulesCondition, attributes: SimpleAttribute[], userAttributes: UserTourTypes.Attributes): any;
16
+ declare function evaluateAttributeCondition(condition: RulesCondition, options: RulesEvaluationOptions): any;
19
17
 
20
18
  export { evaluateAttributeCondition, evaluateFilterConditions };
@@ -1,20 +1,18 @@
1
- import { RulesCondition, SimpleAttribute, UserTourTypes } from '@usertour/types';
1
+ import { RulesCondition, RulesEvaluationOptions } from '@usertour/types';
2
2
 
3
3
  /**
4
4
  * Evaluate filter conditions and return boolean result
5
5
  * @param conditions - Filter conditions to evaluate
6
- * @param attributes - Available attributes
7
- * @param context - Filter context with user attributes
6
+ * @param options - Evaluation options including attributes, user attributes, company attributes, and membership attributes
8
7
  * @returns boolean indicating if conditions are met
9
8
  */
10
- declare function evaluateFilterConditions(conditions: RulesCondition[], attributes: SimpleAttribute[], userAttributes: UserTourTypes.Attributes): boolean;
9
+ declare function evaluateFilterConditions(conditions: RulesCondition[], options: Pick<RulesEvaluationOptions, 'attributes' | 'userAttributes' | 'companyAttributes' | 'membershipAttributes'>): boolean;
11
10
  /**
12
11
  * Evaluate a single attribute condition
13
12
  * @param condition - Single attribute filter condition
14
- * @param attributes - Available attributes
15
- * @param context - Filter context with user attributes
13
+ * @param options - Evaluation options including attributes, user attributes, company attributes, and membership attributes
16
14
  * @returns Evaluation result (boolean or complex structure)
17
15
  */
18
- declare function evaluateAttributeCondition(condition: RulesCondition, attributes: SimpleAttribute[], userAttributes: UserTourTypes.Attributes): any;
16
+ declare function evaluateAttributeCondition(condition: RulesCondition, options: RulesEvaluationOptions): any;
19
17
 
20
18
  export { evaluateAttributeCondition, evaluateFilterConditions };
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  evaluateAttributeCondition,
3
3
  evaluateFilterConditions
4
- } from "../chunk-PBZSPV5R.js";
4
+ } from "../chunk-P46FJFKP.js";
5
5
  import "../chunk-XEO3YXBM.js";
6
6
  export {
7
7
  evaluateAttributeCondition,