@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 +181 -0
- package/dist/esm/index.js.map +3 -3
- package/dist/types/helpers/csat-emoji-helper.d.ts +52 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/schemas/api/fetch-feedback-schema.d.ts +2 -0
- package/dist/types/schemas/fields/app-props-schema.d.ts +1 -0
- package/dist/types/schemas/fields/field-schema.d.ts +2 -0
- package/dist/types/schemas/fields/form-properties-schema.d.ts +1 -0
- package/package.json +1 -1
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,
|