@mikitasazan/notify 1.4.3 → 1.4.4

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/events.d.ts CHANGED
@@ -45,10 +45,19 @@ type Keyed = {
45
45
  * рендерится как обычная нумерованная/маркированная строка — так уже
46
46
  * работают дайджест-задачи и список выключенных workflow.
47
47
  */
48
+ /**
49
+ * `group` — имя блока, под которым позиция встанет. Тот же закон, что у
50
+ * `lines` и `stats`: без имени позиция идёт в общий список, как раньше.
51
+ *
52
+ * Заведено потому, что список импорта смешивал три РАЗНЫЕ вещи в одном
53
+ * перечне и различал их значком в начале строки: 🆕 вышло сегодня,
54
+ * 🔁 вышло из очереди, ⚠ не вышло совсем. Значок делал работу заголовка.
55
+ */
48
56
  export type Item = {
49
57
  text: string;
50
58
  url?: string;
51
59
  label?: string;
60
+ group?: string;
52
61
  };
53
62
  export type NotifyEvent = Keyed & (
54
63
  /** Выкатка кода на сервер. */
package/dist/render.js CHANGED
@@ -219,7 +219,27 @@ const join = (parts) => {
219
219
  return out.join('\n');
220
220
  };
221
221
  /** Плоский список позиций (без ярлыков) — job/report без групп. */
222
- const bullets = (items, numbered) => (items ?? []).map((it, i) => groupItem(it, i, numbered));
222
+ /**
223
+ * Позиции списка. Именованная группа ВСЕГДА печатает свой заголовок — тот же
224
+ * закон, что у `labelled`: карточка одного типа не должна выглядеть по-разному
225
+ * в разные дни. Нумерация идёт внутри блока, а не сквозная: «1, 2» под своим
226
+ * заголовком читается, сквозная «3, 4» под вторым — нет.
227
+ */
228
+ const bullets = (items, numbered) => {
229
+ const list = items ?? [];
230
+ const names = [...new Set(list.map((it) => it.group).filter((g) => !!g))];
231
+ if (names.length === 0) {
232
+ return list.map((it, i) => groupItem(it, i, numbered));
233
+ }
234
+ const out = [];
235
+ list.filter((it) => !it.group).forEach((it, i) => out.push(groupItem(it, i, numbered)));
236
+ for (const name of names) {
237
+ out.push('');
238
+ out.push(group(name));
239
+ list.filter((it) => it.group === name).forEach((it, i) => out.push(groupItem(it, i, numbered)));
240
+ }
241
+ return out;
242
+ };
223
243
  /** Именованная группа целиком: заголовок + позиции, разделены строкой пустоты внутри вызова через join. */
224
244
  const renderGroup = (g) => [
225
245
  group(g.name),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mikitasazan/notify",
3
- "version": "1.4.3",
3
+ "version": "1.4.4",
4
4
  "description": "Единая типизированная отправка Telegram-уведомлений (форум-темы, маршрутизация, ретраи) для всех проектов",
5
5
  "type": "module",
6
6
  "license": "MIT",