@escapenavigator/types 2.0.5 → 2.0.7

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.
@@ -19,6 +19,8 @@ const boolBucketizer = (raw) => {
19
19
  return raw === 'true' ? 'yes' : 'no';
20
20
  return null;
21
21
  };
22
+ /** Бакетер строкового enum'а: значение валидно, только если есть в списке. */
23
+ const enumBucketizer = (allowed) => (raw) => typeof raw === 'string' && allowed.includes(raw) ? raw : null;
22
24
  const YES_NO_BUCKETS = [
23
25
  { value: 'yes', label: 'Есть' },
24
26
  { value: 'no', label: 'Нет' },
@@ -55,6 +57,93 @@ exports.WIDGET_FUNNEL_DIMENSIONS = [
55
57
  buckets: YES_NO_BUCKETS,
56
58
  bucketize: boolBucketizer,
57
59
  },
60
+ {
61
+ /**
62
+ * Детализация seatsUrgency: КАКОЙ призыв показан. «Последний слот»
63
+ * и «осталось 2» — разные уровни дефицита с разной селекцией
64
+ * трафика (мало выбора времени ≠ эффект текста), а weekend-нудж —
65
+ * вообще не про дефицит. Агрегированный yes/no их смешивает.
66
+ */
67
+ id: 'seatsMessageKind',
68
+ kind: widget_funnel_kind_enum_1.WidgetFunnelKindEnum.BOOKING,
69
+ step: widget_funnel_step_enum_1.WidgetFunnelStepEnum.PLAYERS_STEP,
70
+ metaKey: 'seatsMessageKind',
71
+ label: 'Какой призыв показан на экране игроков',
72
+ buckets: [
73
+ { value: 'last-slot', label: '«Последний слот»' },
74
+ { value: 'two-slots', label: '«Осталось 2 слота»' },
75
+ { value: 'weekend-nudge', label: '«Бронируйте заранее» (выходной)' },
76
+ { value: 'none', label: 'Без призыва' },
77
+ ],
78
+ bucketize: enumBucketizer(['last-slot', 'two-slots', 'weekend-nudge', 'none']),
79
+ },
80
+ {
81
+ id: 'slotDiscount',
82
+ kind: widget_funnel_kind_enum_1.WidgetFunnelKindEnum.BOOKING,
83
+ step: widget_funnel_step_enum_1.WidgetFunnelStepEnum.PLAYERS_STEP,
84
+ metaKey: 'slotDiscount',
85
+ label: 'Скидка на слот',
86
+ buckets: YES_NO_BUCKETS,
87
+ bucketize: boolBucketizer,
88
+ },
89
+ {
90
+ /**
91
+ * Тест гипотезы «не знают, сколько человек»: чем шире выбор числа
92
+ * игроков (и чем сильнее от него зависит цена), тем выше
93
+ * неопределённость состава группы на этом шаге. Если бакеты «4+»
94
+ * проседают против «фиксировано» — неопределённость реальна.
95
+ */
96
+ id: 'playersChoiceCount',
97
+ kind: widget_funnel_kind_enum_1.WidgetFunnelKindEnum.BOOKING,
98
+ step: widget_funnel_step_enum_1.WidgetFunnelStepEnum.PLAYERS_STEP,
99
+ metaKey: 'playersChoiceCount',
100
+ label: 'Вариантов числа игроков',
101
+ buckets: [
102
+ { value: '1', label: 'Фиксировано (1 вариант)' },
103
+ { value: '2-3', label: '2–3 варианта' },
104
+ { value: '4+', label: '4 и более' },
105
+ ],
106
+ bucketize: numberBucketizer([
107
+ { test: (n) => n <= 1, value: '1' },
108
+ { test: (n) => n <= 3, value: '2-3' },
109
+ { test: () => true, value: '4+' },
110
+ ]),
111
+ },
112
+ {
113
+ id: 'flexPlayersSelect',
114
+ kind: widget_funnel_kind_enum_1.WidgetFunnelKindEnum.BOOKING,
115
+ step: widget_funnel_step_enum_1.WidgetFunnelStepEnum.PLAYERS_STEP,
116
+ metaKey: 'flexPlayersSelect',
117
+ label: 'Без выбора числа игроков (flex-квест)',
118
+ buckets: YES_NO_BUCKETS,
119
+ bucketize: boolBucketizer,
120
+ },
121
+ {
122
+ id: 'modesOffered',
123
+ kind: widget_funnel_kind_enum_1.WidgetFunnelKindEnum.BOOKING,
124
+ step: widget_funnel_step_enum_1.WidgetFunnelStepEnum.PLAYERS_STEP,
125
+ metaKey: 'modesOffered',
126
+ label: 'Есть выбор режима игры',
127
+ buckets: YES_NO_BUCKETS,
128
+ bucketize: boolBucketizer,
129
+ },
130
+ {
131
+ id: 'bookingLeadDays',
132
+ kind: widget_funnel_kind_enum_1.WidgetFunnelKindEnum.BOOKING,
133
+ step: widget_funnel_step_enum_1.WidgetFunnelStepEnum.PLAYERS_STEP,
134
+ metaKey: 'bookingLeadDays',
135
+ label: 'За сколько дней до игры бронируют',
136
+ buckets: [
137
+ { value: '0', label: 'В тот же день' },
138
+ { value: '1-3', label: 'За 1–3 дня' },
139
+ { value: '4+', label: 'За 4+ дней' },
140
+ ],
141
+ bucketize: numberBucketizer([
142
+ { test: (n) => n <= 0, value: '0' },
143
+ { test: (n) => n <= 3, value: '1-3' },
144
+ { test: () => true, value: '4+' },
145
+ ]),
146
+ },
58
147
  {
59
148
  id: 'clientFieldsCount',
60
149
  kind: widget_funnel_kind_enum_1.WidgetFunnelKindEnum.BOOKING,
@@ -107,6 +196,15 @@ exports.WIDGET_FUNNEL_DIMENSIONS = [
107
196
  buckets: YES_NO_BUCKETS,
108
197
  bucketize: boolBucketizer,
109
198
  },
199
+ {
200
+ id: 'onlinePaymentFee',
201
+ kind: widget_funnel_kind_enum_1.WidgetFunnelKindEnum.BOOKING,
202
+ step: widget_funnel_step_enum_1.WidgetFunnelStepEnum.PAYMENT_STEP,
203
+ metaKey: 'onlinePaymentFee',
204
+ label: 'Комиссия (наценка на онлайн-оплату)',
205
+ buckets: YES_NO_BUCKETS,
206
+ bucketize: boolBucketizer,
207
+ },
110
208
  ];
111
209
  /** Измерения, привязанные к конкретному виду воронки. */
112
210
  const getDimensionsForKind = (kind) => exports.WIDGET_FUNNEL_DIMENSIONS.filter((d) => d.kind === kind);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@escapenavigator/types",
3
- "version": "2.0.5",
3
+ "version": "2.0.7",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -23,7 +23,7 @@
23
23
  "reflect-metadata": "^0.1.13",
24
24
  "rxjs": "^7.5.5"
25
25
  },
26
- "gitHead": "353de6475e72710d92abfa449624c818719d7239",
26
+ "gitHead": "1205192b8db237aeb156697754bced60b39197f8",
27
27
  "devDependencies": {
28
28
  "@types/validator": "13.0.0",
29
29
  "typescript": "^5.6"