@encatch/schema 1.3.0-beta.7 → 1.3.0-beta.8

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/esm/index.js CHANGED
@@ -4,6 +4,130 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
4
4
  // src/schemas/fields/field-schema.ts
5
5
  import { z as z4 } from "zod";
6
6
 
7
+ // src/helpers/csat-emoji-helper.ts
8
+ var CSAT_DEFAULT_EMOJIS_BY_SCALE = {
9
+ 2: ["\u{1F621}", "\u{1F604}"],
10
+ 3: ["\u{1F621}", "\u{1F610}", "\u{1F604}"],
11
+ 4: ["\u{1F621}", "\u{1F615}", "\u{1F642}", "\u{1F604}"],
12
+ 5: ["\u{1F621}", "\u{1F615}", "\u{1F610}", "\u{1F642}", "\u{1F604}"]
13
+ };
14
+ var CSAT_EMOJI_CATEGORIES = [
15
+ {
16
+ id: "unhappy",
17
+ label: "Unhappy",
18
+ emojis: ["\u{1F621}", "\u{1F620}", "\u{1F624}", "\u{1F61E}", "\u{1F615}", "\u{1F61F}", "\u{1F622}", "\u{1F62D}", "\u{1F630}", "\u{1F628}"]
19
+ },
20
+ {
21
+ id: "neutral",
22
+ label: "Neutral",
23
+ emojis: ["\u{1F610}", "\u{1F611}", "\u{1F643}", "\u{1F636}", "\u{1F972}"]
24
+ },
25
+ {
26
+ id: "happy",
27
+ label: "Happy",
28
+ emojis: ["\u{1F642}", "\u{1F60A}", "\u{1F604}", "\u{1F601}", "\u{1F606}", "\u{1F929}", "\u{1F60D}", "\u{1F970}", "\u{1F60E}"]
29
+ },
30
+ {
31
+ id: "gestures",
32
+ label: "Gestures",
33
+ emojis: ["\u{1F44D}", "\u{1F44E}", "\u{1F44F}", "\u{1F64C}", "\u{1F91D}", "\u270C\uFE0F"]
34
+ },
35
+ {
36
+ id: "hearts",
37
+ label: "Hearts",
38
+ emojis: ["\u2764\uFE0F", "\u{1F9E1}", "\u{1F49B}", "\u{1F49A}", "\u{1F499}", "\u{1F49C}", "\u{1F494}"]
39
+ },
40
+ {
41
+ id: "symbols",
42
+ label: "Symbols",
43
+ emojis: ["\u2B50", "\u{1F31F}", "\u{1F4AF}", "\u2705", "\u274C", "\u26A0\uFE0F"]
44
+ },
45
+ {
46
+ id: "celebration",
47
+ label: "Celebration",
48
+ emojis: ["\u{1F389}", "\u{1F973}", "\u{1F38A}", "\u{1F3C6}", "\u{1F525}"]
49
+ }
50
+ ];
51
+ var CSAT_EMOJI_PALETTE = [
52
+ ...new Set(CSAT_EMOJI_CATEGORIES.flatMap((category) => category.emojis))
53
+ ];
54
+ var PALETTE_SET = new Set(CSAT_EMOJI_PALETTE);
55
+ function isCsatEmojiPaletteItem(value) {
56
+ return PALETTE_SET.has(value);
57
+ }
58
+ __name(isCsatEmojiPaletteItem, "isCsatEmojiPaletteItem");
59
+ function getDefaultOverrideEmojiForScale(scale) {
60
+ const normalizedScale = [2, 3, 4, 5].includes(scale) ? scale : 5;
61
+ const defaults = CSAT_DEFAULT_EMOJIS_BY_SCALE[normalizedScale] ?? CSAT_DEFAULT_EMOJIS_BY_SCALE[5];
62
+ return defaults.map(
63
+ (emoji) => isCsatEmojiPaletteItem(emoji) ? emoji : CSAT_EMOJI_PALETTE[0] ?? "\u{1F610}"
64
+ );
65
+ }
66
+ __name(getDefaultOverrideEmojiForScale, "getDefaultOverrideEmojiForScale");
67
+ function parseOverrideEmoji(overrideEmoji) {
68
+ if (overrideEmoji == null || overrideEmoji.trim() === "") return null;
69
+ try {
70
+ const parsed = JSON.parse(overrideEmoji);
71
+ if (!Array.isArray(parsed)) return null;
72
+ if (!parsed.every((item) => typeof item === "string")) return null;
73
+ return parsed;
74
+ } catch {
75
+ return null;
76
+ }
77
+ }
78
+ __name(parseOverrideEmoji, "parseOverrideEmoji");
79
+ function serializeOverrideEmoji(emojis) {
80
+ return JSON.stringify([...emojis]);
81
+ }
82
+ __name(serializeOverrideEmoji, "serializeOverrideEmoji");
83
+ function validateOverrideEmojiForScale(overrideEmoji, scale) {
84
+ if (overrideEmoji == null || overrideEmoji.trim() === "") {
85
+ return { valid: true, emojis: null };
86
+ }
87
+ const emojis = parseOverrideEmoji(overrideEmoji);
88
+ if (!emojis) {
89
+ return { valid: false, emojis: null, error: "overrideEmoji must be a valid JSON array of strings" };
90
+ }
91
+ if (emojis.length !== scale) {
92
+ return {
93
+ valid: false,
94
+ emojis: null,
95
+ error: `overrideEmoji must contain exactly ${scale} emoji(s) for a ${scale}-point scale`
96
+ };
97
+ }
98
+ for (const emoji of emojis) {
99
+ if (!isCsatEmojiPaletteItem(emoji)) {
100
+ return {
101
+ valid: false,
102
+ emojis: null,
103
+ error: `Emoji "${emoji}" is not in the allowed CSAT palette`
104
+ };
105
+ }
106
+ }
107
+ return { valid: true, emojis };
108
+ }
109
+ __name(validateOverrideEmojiForScale, "validateOverrideEmojiForScale");
110
+ function resolveCsatEmojis(scale, overrideEmoji) {
111
+ const normalizedScale = [2, 3, 4, 5].includes(scale) ? scale : 5;
112
+ const { emojis } = validateOverrideEmojiForScale(overrideEmoji, normalizedScale);
113
+ if (emojis) return emojis;
114
+ return [...CSAT_DEFAULT_EMOJIS_BY_SCALE[normalizedScale] ?? CSAT_DEFAULT_EMOJIS_BY_SCALE[5]];
115
+ }
116
+ __name(resolveCsatEmojis, "resolveCsatEmojis");
117
+ function getCsatEmojiForPoint(point, scale, overrideEmoji) {
118
+ const emojis = resolveCsatEmojis(scale, overrideEmoji);
119
+ return emojis[point - 1] ?? emojis[emojis.length - 1] ?? "\u{1F610}";
120
+ }
121
+ __name(getCsatEmojiForPoint, "getCsatEmojiForPoint");
122
+ function trimOverrideEmojiForScale(overrideEmoji, newScale) {
123
+ const parsed = parseOverrideEmoji(overrideEmoji);
124
+ if (!parsed) return void 0;
125
+ const trimmed = parsed.slice(0, newScale);
126
+ if (trimmed.length === 0) return void 0;
127
+ return serializeOverrideEmoji(trimmed);
128
+ }
129
+ __name(trimOverrideEmojiForScale, "trimOverrideEmojiForScale");
130
+
7
131
  // src/schemas/fields/translations-schema.ts
8
132
  import { z } from "zod";
9
133
  var translationEntrySchema = z.string().min(1).describe("Translated text content");
@@ -1405,7 +1529,53 @@ var csatQuestionSchema = questionSchema.extend({
1405
1529
  ),
1406
1530
  scaleLabels: z4.record(z4.string(), z4.string().max(100)).optional().describe(
1407
1531
  "Per-point label text keyed by value string ('1'\u2013'5'); keys must match the chosen scale size"
1532
+ ),
1533
+ overrideEmoji: z4.string().max(500).optional().describe(
1534
+ "JSON string array of emoji characters ordered low\u2192high (index 0 = point 1); length must match scale when set; values must be from the allowed CSAT emoji palette"
1408
1535
  )
1536
+ }).superRefine((data, ctx) => {
1537
+ if (data.overrideEmoji == null || data.overrideEmoji.trim() === "") {
1538
+ return;
1539
+ }
1540
+ const scale = data.scale ?? 5;
1541
+ let parsed;
1542
+ try {
1543
+ parsed = JSON.parse(data.overrideEmoji);
1544
+ } catch {
1545
+ ctx.addIssue({
1546
+ code: z4.ZodIssueCode.custom,
1547
+ message: "overrideEmoji must be a valid JSON array of strings",
1548
+ path: ["overrideEmoji"]
1549
+ });
1550
+ return;
1551
+ }
1552
+ if (!Array.isArray(parsed) || !parsed.every((item) => typeof item === "string")) {
1553
+ ctx.addIssue({
1554
+ code: z4.ZodIssueCode.custom,
1555
+ message: "overrideEmoji must be a JSON array of strings",
1556
+ path: ["overrideEmoji"]
1557
+ });
1558
+ return;
1559
+ }
1560
+ if (parsed.length !== scale) {
1561
+ ctx.addIssue({
1562
+ code: z4.ZodIssueCode.custom,
1563
+ message: `overrideEmoji must contain exactly ${scale} emoji(s) for a ${scale}-point scale`,
1564
+ path: ["overrideEmoji"]
1565
+ });
1566
+ return;
1567
+ }
1568
+ const allowed = new Set(CSAT_EMOJI_PALETTE);
1569
+ for (const emoji of parsed) {
1570
+ if (!allowed.has(emoji)) {
1571
+ ctx.addIssue({
1572
+ code: z4.ZodIssueCode.custom,
1573
+ message: `Emoji "${emoji}" is not in the allowed CSAT palette`,
1574
+ path: ["overrideEmoji"]
1575
+ });
1576
+ return;
1577
+ }
1578
+ }
1409
1579
  }).describe(
1410
1580
  "Schema for a CSAT (Customer Satisfaction Score) question using an industry-standard 1-to-N positive scale (N = 2\u20135)"
1411
1581
  );
@@ -2719,6 +2889,9 @@ export {
2719
2889
  AnnotationSchema,
2720
2890
  AnswerItemSchema,
2721
2891
  AnswerSchema,
2892
+ CSAT_DEFAULT_EMOJIS_BY_SCALE,
2893
+ CSAT_EMOJI_CATEGORIES,
2894
+ CSAT_EMOJI_PALETTE,
2722
2895
  ChoiceOrderOptions,
2723
2896
  CsatDisplayStyles,
2724
2897
  CsatScales,
@@ -2816,9 +2989,12 @@ export {
2816
2989
  formConfigurationResponseSchema,
2817
2990
  formDetailsSchema,
2818
2991
  formPropertiesSchema,
2992
+ getCsatEmojiForPoint,
2993
+ getDefaultOverrideEmojiForScale,
2819
2994
  gradientAttachmentSchema,
2820
2995
  imageAttachmentSchema,
2821
2996
  inAppDisplayTypeSchema,
2997
+ isCsatEmojiPaletteItem,
2822
2998
  layoutAttachmentSchema,
2823
2999
  layoutSurfaceSchema,
2824
3000
  logicJumpRuleSchema,
@@ -2851,6 +3027,7 @@ export {
2851
3027
  objectToSnake,
2852
3028
  opinionScaleQuestionSchema,
2853
3029
  otherConfigurationPropertiesSchema,
3030
+ parseOverrideEmoji,
2854
3031
  partialFeedbackSchema,
2855
3032
  paymentsUpiAmountConfigSchema,
2856
3033
  paymentsUpiQuestionSchema,
@@ -2887,6 +3064,7 @@ export {
2887
3064
  refineTextDataSchema,
2888
3065
  refineTextParamsSchema,
2889
3066
  refineTextResponseSchema,
3067
+ resolveCsatEmojis,
2890
3068
  responseSchema,
2891
3069
  schedulerProviderSchema,
2892
3070
  schedulerQuestionSchema,
@@ -2896,6 +3074,7 @@ export {
2896
3074
  sectionSchema,
2897
3075
  sectionTranslationSchema,
2898
3076
  sectionTranslationsByLanguageSchema,
3077
+ serializeOverrideEmoji,
2899
3078
  sessionInfoSchema,
2900
3079
  shareableModeSchema,
2901
3080
  shortAnswerQuestionSchema,
@@ -2920,8 +3099,10 @@ export {
2920
3099
  translationEntrySchema,
2921
3100
  translationsSchema,
2922
3101
  triggerActionSchema,
3102
+ trimOverrideEmojiForScale,
2923
3103
  userInfoSchema,
2924
3104
  userPropertiesSchema,
3105
+ validateOverrideEmojiForScale,
2925
3106
  validationRuleSchema,
2926
3107
  validationRuleTypeSchema,
2927
3108
  videoAttachmentSchema,