@fieldia/chatter 0.8.0
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/LICENSE +21 -0
- package/README.md +32 -0
- package/package.json +39 -0
- package/src/index.d.mts +6 -0
- package/src/index.d.ts +6 -0
- package/src/index.js +10 -0
- package/src/index.js.map +1 -0
- package/src/index.mjs +7 -0
- package/src/index.mjs.map +1 -0
- package/src/lib/activities.d.mts +19 -0
- package/src/lib/activities.d.ts +19 -0
- package/src/lib/activities.js +145 -0
- package/src/lib/activities.js.map +1 -0
- package/src/lib/activities.mjs +140 -0
- package/src/lib/activities.mjs.map +1 -0
- package/src/lib/attachments.d.mts +19 -0
- package/src/lib/attachments.d.ts +19 -0
- package/src/lib/attachments.js +93 -0
- package/src/lib/attachments.js.map +1 -0
- package/src/lib/attachments.mjs +89 -0
- package/src/lib/attachments.mjs.map +1 -0
- package/src/lib/chatter.d.mts +45 -0
- package/src/lib/chatter.d.ts +45 -0
- package/src/lib/chatter.js +222 -0
- package/src/lib/chatter.js.map +1 -0
- package/src/lib/chatter.mjs +217 -0
- package/src/lib/chatter.mjs.map +1 -0
- package/src/lib/followers.d.mts +15 -0
- package/src/lib/followers.d.ts +15 -0
- package/src/lib/followers.js +96 -0
- package/src/lib/followers.js.map +1 -0
- package/src/lib/followers.mjs +93 -0
- package/src/lib/followers.mjs.map +1 -0
- package/src/lib/labels.d.mts +43 -0
- package/src/lib/labels.d.ts +43 -0
- package/src/lib/labels.js +166 -0
- package/src/lib/labels.js.map +1 -0
- package/src/lib/labels.mjs +163 -0
- package/src/lib/labels.mjs.map +1 -0
- package/src/lib/memory.d.mts +22 -0
- package/src/lib/memory.d.ts +22 -0
- package/src/lib/memory.js +131 -0
- package/src/lib/memory.js.map +1 -0
- package/src/lib/memory.mjs +128 -0
- package/src/lib/memory.mjs.map +1 -0
- package/src/lib/mentions.d.mts +18 -0
- package/src/lib/mentions.d.ts +18 -0
- package/src/lib/mentions.js +94 -0
- package/src/lib/mentions.js.map +1 -0
- package/src/lib/mentions.mjs +90 -0
- package/src/lib/mentions.mjs.map +1 -0
- package/src/lib/reactions.d.mts +10 -0
- package/src/lib/reactions.d.ts +10 -0
- package/src/lib/reactions.js +53 -0
- package/src/lib/reactions.js.map +1 -0
- package/src/lib/reactions.mjs +49 -0
- package/src/lib/reactions.mjs.map +1 -0
- package/src/lib/slot.d.mts +17 -0
- package/src/lib/slot.d.ts +17 -0
- package/src/lib/slot.js +37 -0
- package/src/lib/slot.js.map +1 -0
- package/src/lib/slot.mjs +34 -0
- package/src/lib/slot.mjs.map +1 -0
- package/src/lib/source.d.mts +114 -0
- package/src/lib/source.d.ts +114 -0
- package/src/lib/source.js +9 -0
- package/src/lib/source.js.map +1 -0
- package/src/lib/source.mjs +8 -0
- package/src/lib/source.mjs.map +1 -0
- package/src/lib/styles.d.mts +4 -0
- package/src/lib/styles.d.ts +4 -0
- package/src/lib/styles.js +108 -0
- package/src/lib/styles.js.map +1 -0
- package/src/lib/styles.mjs +104 -0
- package/src/lib/styles.mjs.map +1 -0
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CHATTER_LABELS = void 0;
|
|
4
|
+
exports.CHATTER_LABELS = {
|
|
5
|
+
en: {
|
|
6
|
+
conversation: 'Conversation',
|
|
7
|
+
sendMessage: 'Send message',
|
|
8
|
+
logNote: 'Log note',
|
|
9
|
+
send: 'Send',
|
|
10
|
+
log: 'Log',
|
|
11
|
+
cancel: 'Cancel',
|
|
12
|
+
note: 'Note',
|
|
13
|
+
forFollowers: 'Write to the followers…',
|
|
14
|
+
forTeam: 'Log an internal note…',
|
|
15
|
+
empty: 'No messages yet.',
|
|
16
|
+
notSaved: 'The conversation starts once the record is saved.',
|
|
17
|
+
attach: 'Attach a file',
|
|
18
|
+
removeAttachment: 'Remove {name}',
|
|
19
|
+
react: 'Add a reaction',
|
|
20
|
+
reply: 'Reply',
|
|
21
|
+
replyingTo: 'Replying to {name}',
|
|
22
|
+
activities: 'Activities',
|
|
23
|
+
scheduleActivity: 'Schedule activity',
|
|
24
|
+
activityType: 'Activity',
|
|
25
|
+
summary: 'Summary',
|
|
26
|
+
dueDate: 'Due date',
|
|
27
|
+
assignedTo: 'Assigned to',
|
|
28
|
+
schedule: 'Schedule',
|
|
29
|
+
markDone: 'Mark done',
|
|
30
|
+
whatHappened: 'What came of it?',
|
|
31
|
+
done: 'Done',
|
|
32
|
+
cancelActivity: 'Cancel activity',
|
|
33
|
+
overdue: 'Overdue',
|
|
34
|
+
today: 'Today',
|
|
35
|
+
planned: 'Planned',
|
|
36
|
+
dueOn: 'Due {date}',
|
|
37
|
+
followers: 'Followers',
|
|
38
|
+
addFollower: 'Add follower',
|
|
39
|
+
removeFollower: 'Stop {name} following',
|
|
40
|
+
noFollowers: 'No followers yet.',
|
|
41
|
+
search: 'Search…',
|
|
42
|
+
noOneFound: 'No one found',
|
|
43
|
+
couldNotSend: 'Not sent: {reason}',
|
|
44
|
+
},
|
|
45
|
+
ar: {
|
|
46
|
+
conversation: 'المحادثة',
|
|
47
|
+
sendMessage: 'إرسال رسالة',
|
|
48
|
+
logNote: 'تسجيل ملاحظة',
|
|
49
|
+
send: 'إرسال',
|
|
50
|
+
log: 'تسجيل',
|
|
51
|
+
cancel: 'إلغاء',
|
|
52
|
+
note: 'ملاحظة',
|
|
53
|
+
forFollowers: 'اكتب إلى المتابعين…',
|
|
54
|
+
forTeam: 'سجّل ملاحظة داخلية…',
|
|
55
|
+
empty: 'لا رسائل بعد.',
|
|
56
|
+
notSaved: 'تبدأ المحادثة بعد حفظ السجل.',
|
|
57
|
+
attach: 'إرفاق ملف',
|
|
58
|
+
removeAttachment: 'إزالة {name}',
|
|
59
|
+
react: 'أضف تفاعلًا',
|
|
60
|
+
reply: 'رد',
|
|
61
|
+
replyingTo: 'ردًا على {name}',
|
|
62
|
+
activities: 'الأنشطة',
|
|
63
|
+
scheduleActivity: 'جدولة نشاط',
|
|
64
|
+
activityType: 'النشاط',
|
|
65
|
+
summary: 'الملخص',
|
|
66
|
+
dueDate: 'تاريخ الاستحقاق',
|
|
67
|
+
assignedTo: 'مُسند إلى',
|
|
68
|
+
schedule: 'جدولة',
|
|
69
|
+
markDone: 'تم الإنجاز',
|
|
70
|
+
whatHappened: 'ما الذي نتج عنه؟',
|
|
71
|
+
done: 'تم',
|
|
72
|
+
cancelActivity: 'إلغاء النشاط',
|
|
73
|
+
overdue: 'متأخر',
|
|
74
|
+
today: 'اليوم',
|
|
75
|
+
planned: 'مخطط',
|
|
76
|
+
dueOn: 'يستحق في {date}',
|
|
77
|
+
followers: 'المتابعون',
|
|
78
|
+
addFollower: 'إضافة متابع',
|
|
79
|
+
removeFollower: 'إيقاف متابعة {name}',
|
|
80
|
+
noFollowers: 'لا متابعين بعد.',
|
|
81
|
+
search: 'بحث…',
|
|
82
|
+
noOneFound: 'لم يُعثر على أحد',
|
|
83
|
+
couldNotSend: 'لم يُرسل: {reason}',
|
|
84
|
+
},
|
|
85
|
+
de: {
|
|
86
|
+
conversation: 'Unterhaltung',
|
|
87
|
+
sendMessage: 'Nachricht senden',
|
|
88
|
+
logNote: 'Notiz erfassen',
|
|
89
|
+
send: 'Senden',
|
|
90
|
+
log: 'Erfassen',
|
|
91
|
+
cancel: 'Abbrechen',
|
|
92
|
+
note: 'Notiz',
|
|
93
|
+
forFollowers: 'An die Follower schreiben…',
|
|
94
|
+
forTeam: 'Eine interne Notiz erfassen…',
|
|
95
|
+
empty: 'Noch keine Nachrichten.',
|
|
96
|
+
notSaved: 'Die Unterhaltung beginnt, sobald der Datensatz gespeichert ist.',
|
|
97
|
+
attach: 'Datei anhängen',
|
|
98
|
+
removeAttachment: '{name} entfernen',
|
|
99
|
+
react: 'Reaktion hinzufügen',
|
|
100
|
+
reply: 'Antworten',
|
|
101
|
+
replyingTo: 'Antwort an {name}',
|
|
102
|
+
activities: 'Aktivitäten',
|
|
103
|
+
scheduleActivity: 'Aktivität planen',
|
|
104
|
+
activityType: 'Aktivität',
|
|
105
|
+
summary: 'Zusammenfassung',
|
|
106
|
+
dueDate: 'Fällig am',
|
|
107
|
+
assignedTo: 'Zugewiesen an',
|
|
108
|
+
schedule: 'Planen',
|
|
109
|
+
markDone: 'Als erledigt markieren',
|
|
110
|
+
whatHappened: 'Was ist daraus geworden?',
|
|
111
|
+
done: 'Erledigt',
|
|
112
|
+
cancelActivity: 'Aktivität streichen',
|
|
113
|
+
overdue: 'Überfällig',
|
|
114
|
+
today: 'Heute',
|
|
115
|
+
planned: 'Geplant',
|
|
116
|
+
dueOn: 'Fällig am {date}',
|
|
117
|
+
followers: 'Follower',
|
|
118
|
+
addFollower: 'Follower hinzufügen',
|
|
119
|
+
removeFollower: '{name} nicht mehr folgen lassen',
|
|
120
|
+
noFollowers: 'Noch keine Follower.',
|
|
121
|
+
search: 'Suchen…',
|
|
122
|
+
noOneFound: 'Niemand gefunden',
|
|
123
|
+
couldNotSend: 'Nicht gesendet: {reason}',
|
|
124
|
+
},
|
|
125
|
+
fr: {
|
|
126
|
+
conversation: 'Conversation',
|
|
127
|
+
sendMessage: 'Envoyer un message',
|
|
128
|
+
logNote: 'Noter',
|
|
129
|
+
send: 'Envoyer',
|
|
130
|
+
log: 'Noter',
|
|
131
|
+
cancel: 'Annuler',
|
|
132
|
+
note: 'Note',
|
|
133
|
+
forFollowers: 'Écrire aux abonnés…',
|
|
134
|
+
forTeam: 'Noter en interne…',
|
|
135
|
+
empty: 'Pas encore de message.',
|
|
136
|
+
notSaved: 'La conversation commence une fois l’enregistrement sauvegardé.',
|
|
137
|
+
attach: 'Joindre un fichier',
|
|
138
|
+
removeAttachment: 'Retirer {name}',
|
|
139
|
+
react: 'Réagir',
|
|
140
|
+
reply: 'Répondre',
|
|
141
|
+
replyingTo: 'En réponse à {name}',
|
|
142
|
+
activities: 'Activités',
|
|
143
|
+
scheduleActivity: 'Planifier une activité',
|
|
144
|
+
activityType: 'Activité',
|
|
145
|
+
summary: 'Résumé',
|
|
146
|
+
dueDate: 'Échéance',
|
|
147
|
+
assignedTo: 'Assignée à',
|
|
148
|
+
schedule: 'Planifier',
|
|
149
|
+
markDone: 'Marquer comme faite',
|
|
150
|
+
whatHappened: 'Qu’en est-il sorti ?',
|
|
151
|
+
done: 'Faite',
|
|
152
|
+
cancelActivity: 'Annuler l’activité',
|
|
153
|
+
overdue: 'En retard',
|
|
154
|
+
today: 'Aujourd’hui',
|
|
155
|
+
planned: 'Prévue',
|
|
156
|
+
dueOn: 'Échéance le {date}',
|
|
157
|
+
followers: 'Abonnés',
|
|
158
|
+
addFollower: 'Ajouter un abonné',
|
|
159
|
+
removeFollower: 'Désabonner {name}',
|
|
160
|
+
noFollowers: 'Pas encore d’abonné.',
|
|
161
|
+
search: 'Rechercher…',
|
|
162
|
+
noOneFound: 'Personne trouvée',
|
|
163
|
+
couldNotSend: 'Non envoyé : {reason}',
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
//# sourceMappingURL=labels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"labels.js","sourceRoot":"","sources":["../../../../../libs/chatter/src/lib/labels.ts"],"names":[],"mappings":";;;AA4Ca,QAAA,cAAc,GAAkC;IAC3D,EAAE,EAAE;QACF,YAAY,EAAE,cAAc;QAC5B,WAAW,EAAE,cAAc;QAC3B,OAAO,EAAE,UAAU;QACnB,IAAI,EAAE,MAAM;QACZ,GAAG,EAAE,KAAK;QACV,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,MAAM;QACZ,YAAY,EAAE,yBAAyB;QACvC,OAAO,EAAE,uBAAuB;QAChC,KAAK,EAAE,kBAAkB;QACzB,QAAQ,EAAE,mDAAmD;QAC7D,MAAM,EAAE,eAAe;QACvB,gBAAgB,EAAE,eAAe;QACjC,KAAK,EAAE,gBAAgB;QACvB,KAAK,EAAE,OAAO;QACd,UAAU,EAAE,oBAAoB;QAChC,UAAU,EAAE,YAAY;QACxB,gBAAgB,EAAE,mBAAmB;QACrC,YAAY,EAAE,UAAU;QACxB,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,UAAU;QACnB,UAAU,EAAE,aAAa;QACzB,QAAQ,EAAE,UAAU;QACpB,QAAQ,EAAE,WAAW;QACrB,YAAY,EAAE,kBAAkB;QAChC,IAAI,EAAE,MAAM;QACZ,cAAc,EAAE,iBAAiB;QACjC,OAAO,EAAE,SAAS;QAClB,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,SAAS;QAClB,KAAK,EAAE,YAAY;QACnB,SAAS,EAAE,WAAW;QACtB,WAAW,EAAE,cAAc;QAC3B,cAAc,EAAE,uBAAuB;QACvC,WAAW,EAAE,mBAAmB;QAChC,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE,cAAc;QAC1B,YAAY,EAAE,oBAAoB;KACnC;IACD,EAAE,EAAE;QACF,YAAY,EAAE,UAAU;QACxB,WAAW,EAAE,aAAa;QAC1B,OAAO,EAAE,cAAc;QACvB,IAAI,EAAE,OAAO;QACb,GAAG,EAAE,OAAO;QACZ,MAAM,EAAE,OAAO;QACf,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE,qBAAqB;QACnC,OAAO,EAAE,qBAAqB;QAC9B,KAAK,EAAE,eAAe;QACtB,QAAQ,EAAE,8BAA8B;QACxC,MAAM,EAAE,WAAW;QACnB,gBAAgB,EAAE,cAAc;QAChC,KAAK,EAAE,aAAa;QACpB,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,iBAAiB;QAC7B,UAAU,EAAE,SAAS;QACrB,gBAAgB,EAAE,YAAY;QAC9B,YAAY,EAAE,QAAQ;QACtB,OAAO,EAAE,QAAQ;QACjB,OAAO,EAAE,iBAAiB;QAC1B,UAAU,EAAE,WAAW;QACvB,QAAQ,EAAE,OAAO;QACjB,QAAQ,EAAE,YAAY;QACtB,YAAY,EAAE,kBAAkB;QAChC,IAAI,EAAE,IAAI;QACV,cAAc,EAAE,cAAc;QAC9B,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,iBAAiB;QACxB,SAAS,EAAE,WAAW;QACtB,WAAW,EAAE,aAAa;QAC1B,cAAc,EAAE,qBAAqB;QACrC,WAAW,EAAE,iBAAiB;QAC9B,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,kBAAkB;QAC9B,YAAY,EAAE,oBAAoB;KACnC;IACD,EAAE,EAAE;QACF,YAAY,EAAE,cAAc;QAC5B,WAAW,EAAE,kBAAkB;QAC/B,OAAO,EAAE,gBAAgB;QACzB,IAAI,EAAE,QAAQ;QACd,GAAG,EAAE,UAAU;QACf,MAAM,EAAE,WAAW;QACnB,IAAI,EAAE,OAAO;QACb,YAAY,EAAE,4BAA4B;QAC1C,OAAO,EAAE,8BAA8B;QACvC,KAAK,EAAE,yBAAyB;QAChC,QAAQ,EAAE,iEAAiE;QAC3E,MAAM,EAAE,gBAAgB;QACxB,gBAAgB,EAAE,kBAAkB;QACpC,KAAK,EAAE,qBAAqB;QAC5B,KAAK,EAAE,WAAW;QAClB,UAAU,EAAE,mBAAmB;QAC/B,UAAU,EAAE,aAAa;QACzB,gBAAgB,EAAE,kBAAkB;QACpC,YAAY,EAAE,WAAW;QACzB,OAAO,EAAE,iBAAiB;QAC1B,OAAO,EAAE,WAAW;QACpB,UAAU,EAAE,eAAe;QAC3B,QAAQ,EAAE,QAAQ;QAClB,QAAQ,EAAE,wBAAwB;QAClC,YAAY,EAAE,0BAA0B;QACxC,IAAI,EAAE,UAAU;QAChB,cAAc,EAAE,qBAAqB;QACrC,OAAO,EAAE,YAAY;QACrB,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,SAAS;QAClB,KAAK,EAAE,kBAAkB;QACzB,SAAS,EAAE,UAAU;QACrB,WAAW,EAAE,qBAAqB;QAClC,cAAc,EAAE,iCAAiC;QACjD,WAAW,EAAE,sBAAsB;QACnC,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE,kBAAkB;QAC9B,YAAY,EAAE,0BAA0B;KACzC;IACD,EAAE,EAAE;QACF,YAAY,EAAE,cAAc;QAC5B,WAAW,EAAE,oBAAoB;QACjC,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,SAAS;QACf,GAAG,EAAE,OAAO;QACZ,MAAM,EAAE,SAAS;QACjB,IAAI,EAAE,MAAM;QACZ,YAAY,EAAE,qBAAqB;QACnC,OAAO,EAAE,mBAAmB;QAC5B,KAAK,EAAE,wBAAwB;QAC/B,QAAQ,EAAE,gEAAgE;QAC1E,MAAM,EAAE,oBAAoB;QAC5B,gBAAgB,EAAE,gBAAgB;QAClC,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,UAAU;QACjB,UAAU,EAAE,qBAAqB;QACjC,UAAU,EAAE,WAAW;QACvB,gBAAgB,EAAE,wBAAwB;QAC1C,YAAY,EAAE,UAAU;QACxB,OAAO,EAAE,QAAQ;QACjB,OAAO,EAAE,UAAU;QACnB,UAAU,EAAE,YAAY;QACxB,QAAQ,EAAE,WAAW;QACrB,QAAQ,EAAE,qBAAqB;QAC/B,YAAY,EAAE,sBAAsB;QACpC,IAAI,EAAE,OAAO;QACb,cAAc,EAAE,oBAAoB;QACpC,OAAO,EAAE,WAAW;QACpB,KAAK,EAAE,aAAa;QACpB,OAAO,EAAE,QAAQ;QACjB,KAAK,EAAE,oBAAoB;QAC3B,SAAS,EAAE,SAAS;QACpB,WAAW,EAAE,mBAAmB;QAChC,cAAc,EAAE,mBAAmB;QACnC,WAAW,EAAE,sBAAsB;QACnC,MAAM,EAAE,aAAa;QACrB,UAAU,EAAE,kBAAkB;QAC9B,YAAY,EAAE,uBAAuB;KACtC;CACF,CAAC"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
export const CHATTER_LABELS = {
|
|
2
|
+
en: {
|
|
3
|
+
conversation: 'Conversation',
|
|
4
|
+
sendMessage: 'Send message',
|
|
5
|
+
logNote: 'Log note',
|
|
6
|
+
send: 'Send',
|
|
7
|
+
log: 'Log',
|
|
8
|
+
cancel: 'Cancel',
|
|
9
|
+
note: 'Note',
|
|
10
|
+
forFollowers: 'Write to the followers…',
|
|
11
|
+
forTeam: 'Log an internal note…',
|
|
12
|
+
empty: 'No messages yet.',
|
|
13
|
+
notSaved: 'The conversation starts once the record is saved.',
|
|
14
|
+
attach: 'Attach a file',
|
|
15
|
+
removeAttachment: 'Remove {name}',
|
|
16
|
+
react: 'Add a reaction',
|
|
17
|
+
reply: 'Reply',
|
|
18
|
+
replyingTo: 'Replying to {name}',
|
|
19
|
+
activities: 'Activities',
|
|
20
|
+
scheduleActivity: 'Schedule activity',
|
|
21
|
+
activityType: 'Activity',
|
|
22
|
+
summary: 'Summary',
|
|
23
|
+
dueDate: 'Due date',
|
|
24
|
+
assignedTo: 'Assigned to',
|
|
25
|
+
schedule: 'Schedule',
|
|
26
|
+
markDone: 'Mark done',
|
|
27
|
+
whatHappened: 'What came of it?',
|
|
28
|
+
done: 'Done',
|
|
29
|
+
cancelActivity: 'Cancel activity',
|
|
30
|
+
overdue: 'Overdue',
|
|
31
|
+
today: 'Today',
|
|
32
|
+
planned: 'Planned',
|
|
33
|
+
dueOn: 'Due {date}',
|
|
34
|
+
followers: 'Followers',
|
|
35
|
+
addFollower: 'Add follower',
|
|
36
|
+
removeFollower: 'Stop {name} following',
|
|
37
|
+
noFollowers: 'No followers yet.',
|
|
38
|
+
search: 'Search…',
|
|
39
|
+
noOneFound: 'No one found',
|
|
40
|
+
couldNotSend: 'Not sent: {reason}',
|
|
41
|
+
},
|
|
42
|
+
ar: {
|
|
43
|
+
conversation: 'المحادثة',
|
|
44
|
+
sendMessage: 'إرسال رسالة',
|
|
45
|
+
logNote: 'تسجيل ملاحظة',
|
|
46
|
+
send: 'إرسال',
|
|
47
|
+
log: 'تسجيل',
|
|
48
|
+
cancel: 'إلغاء',
|
|
49
|
+
note: 'ملاحظة',
|
|
50
|
+
forFollowers: 'اكتب إلى المتابعين…',
|
|
51
|
+
forTeam: 'سجّل ملاحظة داخلية…',
|
|
52
|
+
empty: 'لا رسائل بعد.',
|
|
53
|
+
notSaved: 'تبدأ المحادثة بعد حفظ السجل.',
|
|
54
|
+
attach: 'إرفاق ملف',
|
|
55
|
+
removeAttachment: 'إزالة {name}',
|
|
56
|
+
react: 'أضف تفاعلًا',
|
|
57
|
+
reply: 'رد',
|
|
58
|
+
replyingTo: 'ردًا على {name}',
|
|
59
|
+
activities: 'الأنشطة',
|
|
60
|
+
scheduleActivity: 'جدولة نشاط',
|
|
61
|
+
activityType: 'النشاط',
|
|
62
|
+
summary: 'الملخص',
|
|
63
|
+
dueDate: 'تاريخ الاستحقاق',
|
|
64
|
+
assignedTo: 'مُسند إلى',
|
|
65
|
+
schedule: 'جدولة',
|
|
66
|
+
markDone: 'تم الإنجاز',
|
|
67
|
+
whatHappened: 'ما الذي نتج عنه؟',
|
|
68
|
+
done: 'تم',
|
|
69
|
+
cancelActivity: 'إلغاء النشاط',
|
|
70
|
+
overdue: 'متأخر',
|
|
71
|
+
today: 'اليوم',
|
|
72
|
+
planned: 'مخطط',
|
|
73
|
+
dueOn: 'يستحق في {date}',
|
|
74
|
+
followers: 'المتابعون',
|
|
75
|
+
addFollower: 'إضافة متابع',
|
|
76
|
+
removeFollower: 'إيقاف متابعة {name}',
|
|
77
|
+
noFollowers: 'لا متابعين بعد.',
|
|
78
|
+
search: 'بحث…',
|
|
79
|
+
noOneFound: 'لم يُعثر على أحد',
|
|
80
|
+
couldNotSend: 'لم يُرسل: {reason}',
|
|
81
|
+
},
|
|
82
|
+
de: {
|
|
83
|
+
conversation: 'Unterhaltung',
|
|
84
|
+
sendMessage: 'Nachricht senden',
|
|
85
|
+
logNote: 'Notiz erfassen',
|
|
86
|
+
send: 'Senden',
|
|
87
|
+
log: 'Erfassen',
|
|
88
|
+
cancel: 'Abbrechen',
|
|
89
|
+
note: 'Notiz',
|
|
90
|
+
forFollowers: 'An die Follower schreiben…',
|
|
91
|
+
forTeam: 'Eine interne Notiz erfassen…',
|
|
92
|
+
empty: 'Noch keine Nachrichten.',
|
|
93
|
+
notSaved: 'Die Unterhaltung beginnt, sobald der Datensatz gespeichert ist.',
|
|
94
|
+
attach: 'Datei anhängen',
|
|
95
|
+
removeAttachment: '{name} entfernen',
|
|
96
|
+
react: 'Reaktion hinzufügen',
|
|
97
|
+
reply: 'Antworten',
|
|
98
|
+
replyingTo: 'Antwort an {name}',
|
|
99
|
+
activities: 'Aktivitäten',
|
|
100
|
+
scheduleActivity: 'Aktivität planen',
|
|
101
|
+
activityType: 'Aktivität',
|
|
102
|
+
summary: 'Zusammenfassung',
|
|
103
|
+
dueDate: 'Fällig am',
|
|
104
|
+
assignedTo: 'Zugewiesen an',
|
|
105
|
+
schedule: 'Planen',
|
|
106
|
+
markDone: 'Als erledigt markieren',
|
|
107
|
+
whatHappened: 'Was ist daraus geworden?',
|
|
108
|
+
done: 'Erledigt',
|
|
109
|
+
cancelActivity: 'Aktivität streichen',
|
|
110
|
+
overdue: 'Überfällig',
|
|
111
|
+
today: 'Heute',
|
|
112
|
+
planned: 'Geplant',
|
|
113
|
+
dueOn: 'Fällig am {date}',
|
|
114
|
+
followers: 'Follower',
|
|
115
|
+
addFollower: 'Follower hinzufügen',
|
|
116
|
+
removeFollower: '{name} nicht mehr folgen lassen',
|
|
117
|
+
noFollowers: 'Noch keine Follower.',
|
|
118
|
+
search: 'Suchen…',
|
|
119
|
+
noOneFound: 'Niemand gefunden',
|
|
120
|
+
couldNotSend: 'Nicht gesendet: {reason}',
|
|
121
|
+
},
|
|
122
|
+
fr: {
|
|
123
|
+
conversation: 'Conversation',
|
|
124
|
+
sendMessage: 'Envoyer un message',
|
|
125
|
+
logNote: 'Noter',
|
|
126
|
+
send: 'Envoyer',
|
|
127
|
+
log: 'Noter',
|
|
128
|
+
cancel: 'Annuler',
|
|
129
|
+
note: 'Note',
|
|
130
|
+
forFollowers: 'Écrire aux abonnés…',
|
|
131
|
+
forTeam: 'Noter en interne…',
|
|
132
|
+
empty: 'Pas encore de message.',
|
|
133
|
+
notSaved: 'La conversation commence une fois l’enregistrement sauvegardé.',
|
|
134
|
+
attach: 'Joindre un fichier',
|
|
135
|
+
removeAttachment: 'Retirer {name}',
|
|
136
|
+
react: 'Réagir',
|
|
137
|
+
reply: 'Répondre',
|
|
138
|
+
replyingTo: 'En réponse à {name}',
|
|
139
|
+
activities: 'Activités',
|
|
140
|
+
scheduleActivity: 'Planifier une activité',
|
|
141
|
+
activityType: 'Activité',
|
|
142
|
+
summary: 'Résumé',
|
|
143
|
+
dueDate: 'Échéance',
|
|
144
|
+
assignedTo: 'Assignée à',
|
|
145
|
+
schedule: 'Planifier',
|
|
146
|
+
markDone: 'Marquer comme faite',
|
|
147
|
+
whatHappened: 'Qu’en est-il sorti ?',
|
|
148
|
+
done: 'Faite',
|
|
149
|
+
cancelActivity: 'Annuler l’activité',
|
|
150
|
+
overdue: 'En retard',
|
|
151
|
+
today: 'Aujourd’hui',
|
|
152
|
+
planned: 'Prévue',
|
|
153
|
+
dueOn: 'Échéance le {date}',
|
|
154
|
+
followers: 'Abonnés',
|
|
155
|
+
addFollower: 'Ajouter un abonné',
|
|
156
|
+
removeFollower: 'Désabonner {name}',
|
|
157
|
+
noFollowers: 'Pas encore d’abonné.',
|
|
158
|
+
search: 'Rechercher…',
|
|
159
|
+
noOneFound: 'Personne trouvée',
|
|
160
|
+
couldNotSend: 'Non envoyé : {reason}',
|
|
161
|
+
},
|
|
162
|
+
};
|
|
163
|
+
//# sourceMappingURL=labels.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"labels.mjs","sourceRoot":"","sources":["../../../../../libs/chatter/src/lib/labels.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Activity, ActivityType, ChatterMessage, ChatterSource, Follower, Person } from './source.mjs';
|
|
2
|
+
export interface MemoryChatterOptions {
|
|
3
|
+
/** The person using the chatter: the author of what is posted, the one who reacts. */
|
|
4
|
+
me: Person;
|
|
5
|
+
people?: Person[];
|
|
6
|
+
activityTypes?: ActivityType[];
|
|
7
|
+
/** What each record starts with, by `model:id`. */
|
|
8
|
+
records?: Record<string, {
|
|
9
|
+
messages?: ChatterMessage[];
|
|
10
|
+
activities?: Activity[];
|
|
11
|
+
followers?: Follower[];
|
|
12
|
+
}>;
|
|
13
|
+
/** The clock; the real one unless a test pins it. */
|
|
14
|
+
now?: () => Date;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* A chatter source that keeps everything in memory: for demos, tests and
|
|
18
|
+
* prototypes, the way the memory data source is for records.
|
|
19
|
+
*/
|
|
20
|
+
export declare function createMemoryChatter(options: MemoryChatterOptions): ChatterSource & {
|
|
21
|
+
readonly posted: ChatterMessage[];
|
|
22
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Activity, ActivityType, ChatterMessage, ChatterSource, Follower, Person } from './source';
|
|
2
|
+
export interface MemoryChatterOptions {
|
|
3
|
+
/** The person using the chatter: the author of what is posted, the one who reacts. */
|
|
4
|
+
me: Person;
|
|
5
|
+
people?: Person[];
|
|
6
|
+
activityTypes?: ActivityType[];
|
|
7
|
+
/** What each record starts with, by `model:id`. */
|
|
8
|
+
records?: Record<string, {
|
|
9
|
+
messages?: ChatterMessage[];
|
|
10
|
+
activities?: Activity[];
|
|
11
|
+
followers?: Follower[];
|
|
12
|
+
}>;
|
|
13
|
+
/** The clock; the real one unless a test pins it. */
|
|
14
|
+
now?: () => Date;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* A chatter source that keeps everything in memory: for demos, tests and
|
|
18
|
+
* prototypes, the way the memory data source is for records.
|
|
19
|
+
*/
|
|
20
|
+
export declare function createMemoryChatter(options: MemoryChatterOptions): ChatterSource & {
|
|
21
|
+
readonly posted: ChatterMessage[];
|
|
22
|
+
};
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createMemoryChatter = createMemoryChatter;
|
|
4
|
+
const escape = (text) => text.replace(/[&<>"']/g, (c) => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' })[c]);
|
|
5
|
+
/**
|
|
6
|
+
* A chatter source that keeps everything in memory: for demos, tests and
|
|
7
|
+
* prototypes, the way the memory data source is for records.
|
|
8
|
+
*/
|
|
9
|
+
function createMemoryChatter(options) {
|
|
10
|
+
const now = options.now ?? (() => new Date());
|
|
11
|
+
const people = options.people ?? [options.me];
|
|
12
|
+
const types = options.activityTypes ?? [];
|
|
13
|
+
const records = new Map();
|
|
14
|
+
const posted = [];
|
|
15
|
+
let next = 1000;
|
|
16
|
+
const key = (record) => `${record.model}:${record.id}`;
|
|
17
|
+
const of = (record) => {
|
|
18
|
+
let found = records.get(key(record));
|
|
19
|
+
if (!found) {
|
|
20
|
+
const start = options.records?.[key(record)];
|
|
21
|
+
found = {
|
|
22
|
+
messages: [...(start?.messages ?? [])],
|
|
23
|
+
activities: [...(start?.activities ?? [])],
|
|
24
|
+
followers: [...(start?.followers ?? [])],
|
|
25
|
+
reactions: new Map(),
|
|
26
|
+
};
|
|
27
|
+
records.set(key(record), found);
|
|
28
|
+
}
|
|
29
|
+
return found;
|
|
30
|
+
};
|
|
31
|
+
const person = (id) => {
|
|
32
|
+
const found = people.find((p) => p.id === id);
|
|
33
|
+
if (!found)
|
|
34
|
+
throw new Error(`No person ${id}`);
|
|
35
|
+
return found;
|
|
36
|
+
};
|
|
37
|
+
const add = (record, message) => {
|
|
38
|
+
const made = { id: next++, author: options.me, date: now().toISOString(), ...message };
|
|
39
|
+
of(record).messages.unshift(made);
|
|
40
|
+
posted.push(made);
|
|
41
|
+
return made;
|
|
42
|
+
};
|
|
43
|
+
return {
|
|
44
|
+
posted,
|
|
45
|
+
async messages(record) {
|
|
46
|
+
const { messages, reactions } = of(record);
|
|
47
|
+
// Each message's reactions as the person asking sees them.
|
|
48
|
+
return messages.map((message) => {
|
|
49
|
+
const reactors = reactions.get(message.id);
|
|
50
|
+
if (!reactors)
|
|
51
|
+
return { ...message };
|
|
52
|
+
const list = [...reactors].filter(([, who]) => who.size).map(([emoji, who]) => ({ emoji, count: who.size, mine: who.has(options.me.id) }));
|
|
53
|
+
return { ...message, reactions: list };
|
|
54
|
+
});
|
|
55
|
+
},
|
|
56
|
+
async post(record, message) {
|
|
57
|
+
return add(record, { kind: message.kind, body: message.body, attachments: message.attachments ?? [], parentId: message.parentId ?? null, mentions: message.mentions ?? [] });
|
|
58
|
+
},
|
|
59
|
+
async upload(_record, file) {
|
|
60
|
+
// Kept as a data address, so a preview needs nothing else.
|
|
61
|
+
const url = await new Promise((resolve, reject) => {
|
|
62
|
+
const reader = new FileReader();
|
|
63
|
+
reader.onload = () => resolve(String(reader.result));
|
|
64
|
+
reader.onerror = () => reject(reader.error);
|
|
65
|
+
reader.readAsDataURL(file);
|
|
66
|
+
});
|
|
67
|
+
const stored = { id: next++, name: file.name, type: file.type || 'application/octet-stream', size: file.size, url };
|
|
68
|
+
return stored;
|
|
69
|
+
},
|
|
70
|
+
async react(record, messageId, emoji) {
|
|
71
|
+
const { reactions } = of(record);
|
|
72
|
+
const reactors = reactions.get(messageId) ?? new Map();
|
|
73
|
+
reactions.set(messageId, reactors);
|
|
74
|
+
const who = reactors.get(emoji) ?? new Set();
|
|
75
|
+
if (who.has(options.me.id))
|
|
76
|
+
who.delete(options.me.id);
|
|
77
|
+
else
|
|
78
|
+
who.add(options.me.id);
|
|
79
|
+
reactors.set(emoji, who);
|
|
80
|
+
return [...reactors].filter(([, set]) => set.size).map(([e, set]) => ({ emoji: e, count: set.size, mine: set.has(options.me.id) }));
|
|
81
|
+
},
|
|
82
|
+
async people(query) {
|
|
83
|
+
const typed = query.trim().toLowerCase();
|
|
84
|
+
return people.filter((p) => p.name.toLowerCase().includes(typed));
|
|
85
|
+
},
|
|
86
|
+
async activityTypes() {
|
|
87
|
+
return types;
|
|
88
|
+
},
|
|
89
|
+
async activities(record) {
|
|
90
|
+
return [...of(record).activities].sort((a, b) => a.due.localeCompare(b.due));
|
|
91
|
+
},
|
|
92
|
+
async schedule(record, activity) {
|
|
93
|
+
const type = types.find((t) => t.id === activity.typeId);
|
|
94
|
+
if (!type)
|
|
95
|
+
throw new Error(`No activity type ${activity.typeId}`);
|
|
96
|
+
const made = { id: next++, type, summary: activity.summary ?? null, note: activity.note ?? null, due: activity.due, assignee: person(activity.assigneeId) };
|
|
97
|
+
of(record).activities.push(made);
|
|
98
|
+
return made;
|
|
99
|
+
},
|
|
100
|
+
async markDone(record, activityId, feedback) {
|
|
101
|
+
const { activities } = of(record);
|
|
102
|
+
const done = activities.find((a) => a.id === activityId);
|
|
103
|
+
if (!done)
|
|
104
|
+
throw new Error(`No activity ${activityId}`);
|
|
105
|
+
activities.splice(activities.indexOf(done), 1);
|
|
106
|
+
const what = [done.type.name, done.summary].filter(Boolean).join(': ');
|
|
107
|
+
add(record, { kind: 'note', body: `<p>✓ ${escape(what)} done</p>${feedback ? `<p>${escape(feedback)}</p>` : ''}` });
|
|
108
|
+
},
|
|
109
|
+
async cancel(record, activityId) {
|
|
110
|
+
const { activities } = of(record);
|
|
111
|
+
const index = activities.findIndex((a) => a.id === activityId);
|
|
112
|
+
if (index >= 0)
|
|
113
|
+
activities.splice(index, 1);
|
|
114
|
+
},
|
|
115
|
+
async followers(record) {
|
|
116
|
+
return [...of(record).followers];
|
|
117
|
+
},
|
|
118
|
+
async follow(record, personId) {
|
|
119
|
+
const made = { id: next++, person: person(personId) };
|
|
120
|
+
of(record).followers.push(made);
|
|
121
|
+
return made;
|
|
122
|
+
},
|
|
123
|
+
async unfollow(record, followerId) {
|
|
124
|
+
const { followers } = of(record);
|
|
125
|
+
const index = followers.findIndex((f) => f.id === followerId);
|
|
126
|
+
if (index >= 0)
|
|
127
|
+
followers.splice(index, 1);
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../../../libs/chatter/src/lib/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
const escape = (text) => text.replace(/[&<>"']/g, (c) => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' })[c]);
|
|
2
|
+
/**
|
|
3
|
+
* A chatter source that keeps everything in memory: for demos, tests and
|
|
4
|
+
* prototypes, the way the memory data source is for records.
|
|
5
|
+
*/
|
|
6
|
+
export function createMemoryChatter(options) {
|
|
7
|
+
const now = options.now ?? (() => new Date());
|
|
8
|
+
const people = options.people ?? [options.me];
|
|
9
|
+
const types = options.activityTypes ?? [];
|
|
10
|
+
const records = new Map();
|
|
11
|
+
const posted = [];
|
|
12
|
+
let next = 1000;
|
|
13
|
+
const key = (record) => `${record.model}:${record.id}`;
|
|
14
|
+
const of = (record) => {
|
|
15
|
+
let found = records.get(key(record));
|
|
16
|
+
if (!found) {
|
|
17
|
+
const start = options.records?.[key(record)];
|
|
18
|
+
found = {
|
|
19
|
+
messages: [...(start?.messages ?? [])],
|
|
20
|
+
activities: [...(start?.activities ?? [])],
|
|
21
|
+
followers: [...(start?.followers ?? [])],
|
|
22
|
+
reactions: new Map(),
|
|
23
|
+
};
|
|
24
|
+
records.set(key(record), found);
|
|
25
|
+
}
|
|
26
|
+
return found;
|
|
27
|
+
};
|
|
28
|
+
const person = (id) => {
|
|
29
|
+
const found = people.find((p) => p.id === id);
|
|
30
|
+
if (!found)
|
|
31
|
+
throw new Error(`No person ${id}`);
|
|
32
|
+
return found;
|
|
33
|
+
};
|
|
34
|
+
const add = (record, message) => {
|
|
35
|
+
const made = { id: next++, author: options.me, date: now().toISOString(), ...message };
|
|
36
|
+
of(record).messages.unshift(made);
|
|
37
|
+
posted.push(made);
|
|
38
|
+
return made;
|
|
39
|
+
};
|
|
40
|
+
return {
|
|
41
|
+
posted,
|
|
42
|
+
async messages(record) {
|
|
43
|
+
const { messages, reactions } = of(record);
|
|
44
|
+
// Each message's reactions as the person asking sees them.
|
|
45
|
+
return messages.map((message) => {
|
|
46
|
+
const reactors = reactions.get(message.id);
|
|
47
|
+
if (!reactors)
|
|
48
|
+
return { ...message };
|
|
49
|
+
const list = [...reactors].filter(([, who]) => who.size).map(([emoji, who]) => ({ emoji, count: who.size, mine: who.has(options.me.id) }));
|
|
50
|
+
return { ...message, reactions: list };
|
|
51
|
+
});
|
|
52
|
+
},
|
|
53
|
+
async post(record, message) {
|
|
54
|
+
return add(record, { kind: message.kind, body: message.body, attachments: message.attachments ?? [], parentId: message.parentId ?? null, mentions: message.mentions ?? [] });
|
|
55
|
+
},
|
|
56
|
+
async upload(_record, file) {
|
|
57
|
+
// Kept as a data address, so a preview needs nothing else.
|
|
58
|
+
const url = await new Promise((resolve, reject) => {
|
|
59
|
+
const reader = new FileReader();
|
|
60
|
+
reader.onload = () => resolve(String(reader.result));
|
|
61
|
+
reader.onerror = () => reject(reader.error);
|
|
62
|
+
reader.readAsDataURL(file);
|
|
63
|
+
});
|
|
64
|
+
const stored = { id: next++, name: file.name, type: file.type || 'application/octet-stream', size: file.size, url };
|
|
65
|
+
return stored;
|
|
66
|
+
},
|
|
67
|
+
async react(record, messageId, emoji) {
|
|
68
|
+
const { reactions } = of(record);
|
|
69
|
+
const reactors = reactions.get(messageId) ?? new Map();
|
|
70
|
+
reactions.set(messageId, reactors);
|
|
71
|
+
const who = reactors.get(emoji) ?? new Set();
|
|
72
|
+
if (who.has(options.me.id))
|
|
73
|
+
who.delete(options.me.id);
|
|
74
|
+
else
|
|
75
|
+
who.add(options.me.id);
|
|
76
|
+
reactors.set(emoji, who);
|
|
77
|
+
return [...reactors].filter(([, set]) => set.size).map(([e, set]) => ({ emoji: e, count: set.size, mine: set.has(options.me.id) }));
|
|
78
|
+
},
|
|
79
|
+
async people(query) {
|
|
80
|
+
const typed = query.trim().toLowerCase();
|
|
81
|
+
return people.filter((p) => p.name.toLowerCase().includes(typed));
|
|
82
|
+
},
|
|
83
|
+
async activityTypes() {
|
|
84
|
+
return types;
|
|
85
|
+
},
|
|
86
|
+
async activities(record) {
|
|
87
|
+
return [...of(record).activities].sort((a, b) => a.due.localeCompare(b.due));
|
|
88
|
+
},
|
|
89
|
+
async schedule(record, activity) {
|
|
90
|
+
const type = types.find((t) => t.id === activity.typeId);
|
|
91
|
+
if (!type)
|
|
92
|
+
throw new Error(`No activity type ${activity.typeId}`);
|
|
93
|
+
const made = { id: next++, type, summary: activity.summary ?? null, note: activity.note ?? null, due: activity.due, assignee: person(activity.assigneeId) };
|
|
94
|
+
of(record).activities.push(made);
|
|
95
|
+
return made;
|
|
96
|
+
},
|
|
97
|
+
async markDone(record, activityId, feedback) {
|
|
98
|
+
const { activities } = of(record);
|
|
99
|
+
const done = activities.find((a) => a.id === activityId);
|
|
100
|
+
if (!done)
|
|
101
|
+
throw new Error(`No activity ${activityId}`);
|
|
102
|
+
activities.splice(activities.indexOf(done), 1);
|
|
103
|
+
const what = [done.type.name, done.summary].filter(Boolean).join(': ');
|
|
104
|
+
add(record, { kind: 'note', body: `<p>✓ ${escape(what)} done</p>${feedback ? `<p>${escape(feedback)}</p>` : ''}` });
|
|
105
|
+
},
|
|
106
|
+
async cancel(record, activityId) {
|
|
107
|
+
const { activities } = of(record);
|
|
108
|
+
const index = activities.findIndex((a) => a.id === activityId);
|
|
109
|
+
if (index >= 0)
|
|
110
|
+
activities.splice(index, 1);
|
|
111
|
+
},
|
|
112
|
+
async followers(record) {
|
|
113
|
+
return [...of(record).followers];
|
|
114
|
+
},
|
|
115
|
+
async follow(record, personId) {
|
|
116
|
+
const made = { id: next++, person: person(personId) };
|
|
117
|
+
of(record).followers.push(made);
|
|
118
|
+
return made;
|
|
119
|
+
},
|
|
120
|
+
async unfollow(record, followerId) {
|
|
121
|
+
const { followers } = of(record);
|
|
122
|
+
const index = followers.findIndex((f) => f.id === followerId);
|
|
123
|
+
if (index >= 0)
|
|
124
|
+
followers.splice(index, 1);
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=memory.mjs.map
|