@terreno/announcements 57.4.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 +50 -0
- package/biome.jsonc +20 -0
- package/bunfig.toml +2 -0
- package/dist/announcementsApp.d.ts +9 -0
- package/dist/announcementsApp.js +820 -0
- package/dist/help.d.ts +30 -0
- package/dist/help.js +72 -0
- package/dist/helpRoutes.d.ts +8 -0
- package/dist/helpRoutes.js +233 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +34 -0
- package/dist/models/announcement.d.ts +3 -0
- package/dist/models/announcement.js +214 -0
- package/dist/models/announcementAcknowledgement.d.ts +2 -0
- package/dist/models/announcementAcknowledgement.js +41 -0
- package/dist/models/announcementClickEvent.d.ts +3 -0
- package/dist/models/announcementClickEvent.js +56 -0
- package/dist/models/announcementImpression.d.ts +3 -0
- package/dist/models/announcementImpression.js +50 -0
- package/dist/overview.d.ts +14 -0
- package/dist/overview.js +310 -0
- package/dist/pending.d.ts +64 -0
- package/dist/pending.js +242 -0
- package/dist/types.d.ts +135 -0
- package/dist/types.js +2 -0
- package/package.json +57 -0
- package/src/announcementsApp.ts +722 -0
- package/src/help.ts +98 -0
- package/src/helpRoutes.ts +160 -0
- package/src/index.ts +45 -0
- package/src/models/announcement.ts +189 -0
- package/src/models/announcementAcknowledgement.ts +50 -0
- package/src/models/announcementClickEvent.ts +68 -0
- package/src/models/announcementImpression.ts +62 -0
- package/src/overview.ts +228 -0
- package/src/pending.ts +286 -0
- package/src/tests/announcementsApp.test.ts +844 -0
- package/src/tests/bunSetup.ts +9 -0
- package/src/tests/help.test.ts +29 -0
- package/src/tests/helpRoutes.test.ts +291 -0
- package/src/tests/index.test.ts +57 -0
- package/src/tests/overview.test.ts +351 -0
- package/src/tests/pending.test.ts +262 -0
- package/src/types.ts +157 -0
- package/tsconfig.json +33 -0
package/dist/pending.js
ADDED
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
13
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
39
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
40
|
+
if (!m) return o;
|
|
41
|
+
var i = m.call(o), r, ar = [], e;
|
|
42
|
+
try {
|
|
43
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
44
|
+
}
|
|
45
|
+
catch (error) { e = { error: error }; }
|
|
46
|
+
finally {
|
|
47
|
+
try {
|
|
48
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
49
|
+
}
|
|
50
|
+
finally { if (e) throw e.error; }
|
|
51
|
+
}
|
|
52
|
+
return ar;
|
|
53
|
+
};
|
|
54
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
55
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
56
|
+
if (ar || !(i in from)) {
|
|
57
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
58
|
+
ar[i] = from[i];
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
62
|
+
};
|
|
63
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
64
|
+
exports.isAnnouncementVisibleToUser = exports.selectPendingAnnouncements = exports.sortAnnouncementsForQueue = exports.isAnnouncementPendingForUser = exports.matchesPlatform = exports.isAnnouncementVisibleNow = exports.isInterruptDisplayMode = exports.passesMinBuildNumber = exports.parseQueryVersion = exports.matchAudienceByType = exports.resolveAudienceType = exports.resolveDisplayMode = exports.requiresAcknowledgementForAnnouncement = exports.resolveAcknowledgementPolicy = void 0;
|
|
65
|
+
var luxon_1 = require("luxon");
|
|
66
|
+
var resolveAcknowledgementPolicy = function (_a) {
|
|
67
|
+
var announcement = _a.announcement, _b = _a.defaultAcknowledgementPolicy, defaultAcknowledgementPolicy = _b === void 0 ? "dismiss-only" : _b;
|
|
68
|
+
if (announcement.acknowledgementPolicy) {
|
|
69
|
+
return announcement.acknowledgementPolicy;
|
|
70
|
+
}
|
|
71
|
+
var legacyRequiresAck = announcement.requiresAcknowledgement;
|
|
72
|
+
if (legacyRequiresAck === true) {
|
|
73
|
+
return "required";
|
|
74
|
+
}
|
|
75
|
+
return defaultAcknowledgementPolicy;
|
|
76
|
+
};
|
|
77
|
+
exports.resolveAcknowledgementPolicy = resolveAcknowledgementPolicy;
|
|
78
|
+
var requiresAcknowledgementForAnnouncement = function (_a) {
|
|
79
|
+
var announcement = _a.announcement, _b = _a.defaultAcknowledgementPolicy, defaultAcknowledgementPolicy = _b === void 0 ? "dismiss-only" : _b;
|
|
80
|
+
var policy = (0, exports.resolveAcknowledgementPolicy)({ announcement: announcement, defaultAcknowledgementPolicy: defaultAcknowledgementPolicy });
|
|
81
|
+
return policy === "required";
|
|
82
|
+
};
|
|
83
|
+
exports.requiresAcknowledgementForAnnouncement = requiresAcknowledgementForAnnouncement;
|
|
84
|
+
var resolveDisplayMode = function (announcement) {
|
|
85
|
+
var mode = announcement.displayMode;
|
|
86
|
+
if (mode === "modal" || mode === "banner" || mode === "feed") {
|
|
87
|
+
return mode;
|
|
88
|
+
}
|
|
89
|
+
return "modal";
|
|
90
|
+
};
|
|
91
|
+
exports.resolveDisplayMode = resolveDisplayMode;
|
|
92
|
+
var resolveAudienceType = function (announcement) {
|
|
93
|
+
var audienceType = announcement.audienceType;
|
|
94
|
+
if (audienceType === "staff" || audienceType === "patient" || audienceType === "all") {
|
|
95
|
+
return audienceType;
|
|
96
|
+
}
|
|
97
|
+
return "all";
|
|
98
|
+
};
|
|
99
|
+
exports.resolveAudienceType = resolveAudienceType;
|
|
100
|
+
var matchAudienceByType = function (_a) {
|
|
101
|
+
var announcement = _a.announcement, isStaff = _a.isStaff, user = _a.user;
|
|
102
|
+
var audienceType = (0, exports.resolveAudienceType)(announcement);
|
|
103
|
+
if (audienceType === "all") {
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
var staff = isStaff(user);
|
|
107
|
+
if (audienceType === "staff") {
|
|
108
|
+
return staff;
|
|
109
|
+
}
|
|
110
|
+
return !staff;
|
|
111
|
+
};
|
|
112
|
+
exports.matchAudienceByType = matchAudienceByType;
|
|
113
|
+
var parseQueryVersion = function (raw) {
|
|
114
|
+
if (raw === undefined || raw === null || raw === "") {
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
var parsed = Number(raw);
|
|
118
|
+
if (!Number.isFinite(parsed) || !Number.isInteger(parsed)) {
|
|
119
|
+
return undefined;
|
|
120
|
+
}
|
|
121
|
+
return parsed;
|
|
122
|
+
};
|
|
123
|
+
exports.parseQueryVersion = parseQueryVersion;
|
|
124
|
+
var passesMinBuildNumber = function (_a) {
|
|
125
|
+
var announcement = _a.announcement, queryVersion = _a.queryVersion;
|
|
126
|
+
var minBuildNumber = announcement.minBuildNumber;
|
|
127
|
+
if (minBuildNumber === undefined || minBuildNumber === null || minBuildNumber === 0) {
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
if (queryVersion === undefined) {
|
|
131
|
+
return true;
|
|
132
|
+
}
|
|
133
|
+
return queryVersion >= minBuildNumber;
|
|
134
|
+
};
|
|
135
|
+
exports.passesMinBuildNumber = passesMinBuildNumber;
|
|
136
|
+
var isInterruptDisplayMode = function (announcement) {
|
|
137
|
+
var displayMode = (0, exports.resolveDisplayMode)(announcement);
|
|
138
|
+
return displayMode === "modal" || displayMode === "banner";
|
|
139
|
+
};
|
|
140
|
+
exports.isInterruptDisplayMode = isInterruptDisplayMode;
|
|
141
|
+
var isAnnouncementVisibleNow = function (_a) {
|
|
142
|
+
var announcement = _a.announcement, _b = _a.now, now = _b === void 0 ? luxon_1.DateTime.utc() : _b;
|
|
143
|
+
if (announcement.status !== "published") {
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
if (announcement.publishAt) {
|
|
147
|
+
var publishAt = luxon_1.DateTime.fromJSDate(announcement.publishAt);
|
|
148
|
+
if (publishAt > now) {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
if (announcement.expiresAt) {
|
|
153
|
+
var expiresAt = luxon_1.DateTime.fromJSDate(announcement.expiresAt);
|
|
154
|
+
if (expiresAt <= now) {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return true;
|
|
159
|
+
};
|
|
160
|
+
exports.isAnnouncementVisibleNow = isAnnouncementVisibleNow;
|
|
161
|
+
var matchesPlatform = function (_a) {
|
|
162
|
+
var _b;
|
|
163
|
+
var announcement = _a.announcement, platform = _a.platform;
|
|
164
|
+
var platforms = ((_b = announcement.platforms) === null || _b === void 0 ? void 0 : _b.length)
|
|
165
|
+
? announcement.platforms
|
|
166
|
+
: ["ios", "android", "web"];
|
|
167
|
+
return platforms.includes(platform);
|
|
168
|
+
};
|
|
169
|
+
exports.matchesPlatform = matchesPlatform;
|
|
170
|
+
var isAnnouncementPendingForUser = function (_a) {
|
|
171
|
+
var acknowledgements = _a.acknowledgements, announcement = _a.announcement, _b = _a.defaultAcknowledgementPolicy, defaultAcknowledgementPolicy = _b === void 0 ? "dismiss-only" : _b, impressions = _a.impressions;
|
|
172
|
+
var announcementId = announcement._id.toString();
|
|
173
|
+
var needsAck = (0, exports.requiresAcknowledgementForAnnouncement)({
|
|
174
|
+
announcement: announcement,
|
|
175
|
+
defaultAcknowledgementPolicy: defaultAcknowledgementPolicy,
|
|
176
|
+
});
|
|
177
|
+
if (needsAck) {
|
|
178
|
+
var hasAck = acknowledgements.some(function (ack) { return ack.announcementId === announcementId && ack.version === announcement.version; });
|
|
179
|
+
return !hasAck;
|
|
180
|
+
}
|
|
181
|
+
var hasImpression = impressions.some(function (impression) {
|
|
182
|
+
return impression.announcementId === announcementId && impression.version === announcement.version;
|
|
183
|
+
});
|
|
184
|
+
return !hasImpression;
|
|
185
|
+
};
|
|
186
|
+
exports.isAnnouncementPendingForUser = isAnnouncementPendingForUser;
|
|
187
|
+
var sortAnnouncementsForQueue = function (announcements) {
|
|
188
|
+
return __spreadArray([], __read(announcements), false).sort(function (left, right) {
|
|
189
|
+
var _a, _b, _c, _d;
|
|
190
|
+
if (right.priority !== left.priority) {
|
|
191
|
+
return right.priority - left.priority;
|
|
192
|
+
}
|
|
193
|
+
var rightPublished = (_b = (_a = right.publishedAt) === null || _a === void 0 ? void 0 : _a.getTime()) !== null && _b !== void 0 ? _b : 0;
|
|
194
|
+
var leftPublished = (_d = (_c = left.publishedAt) === null || _c === void 0 ? void 0 : _c.getTime()) !== null && _d !== void 0 ? _d : 0;
|
|
195
|
+
return rightPublished - leftPublished;
|
|
196
|
+
});
|
|
197
|
+
};
|
|
198
|
+
exports.sortAnnouncementsForQueue = sortAnnouncementsForQueue;
|
|
199
|
+
var selectPendingAnnouncements = function (_a) {
|
|
200
|
+
var acknowledgements = _a.acknowledgements, announcements = _a.announcements, _b = _a.defaultAcknowledgementPolicy, defaultAcknowledgementPolicy = _b === void 0 ? "dismiss-only" : _b, impressions = _a.impressions, now = _a.now, platform = _a.platform, queryVersion = _a.queryVersion;
|
|
201
|
+
var visible = announcements.filter(function (announcement) {
|
|
202
|
+
if (!(0, exports.isAnnouncementVisibleNow)({ announcement: announcement, now: now })) {
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
if (!(0, exports.matchesPlatform)({ announcement: announcement, platform: platform })) {
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
if (!(0, exports.isInterruptDisplayMode)(announcement)) {
|
|
209
|
+
return false;
|
|
210
|
+
}
|
|
211
|
+
if (!(0, exports.passesMinBuildNumber)({ announcement: announcement, queryVersion: queryVersion })) {
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
return (0, exports.isAnnouncementPendingForUser)({
|
|
215
|
+
acknowledgements: acknowledgements,
|
|
216
|
+
announcement: announcement,
|
|
217
|
+
defaultAcknowledgementPolicy: defaultAcknowledgementPolicy,
|
|
218
|
+
impressions: impressions,
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
return (0, exports.sortAnnouncementsForQueue)(visible);
|
|
222
|
+
};
|
|
223
|
+
exports.selectPendingAnnouncements = selectPendingAnnouncements;
|
|
224
|
+
var isAnnouncementVisibleToUser = function (_a) { return __awaiter(void 0, [_a], void 0, function (_b) {
|
|
225
|
+
var announcement = _b.announcement, isStaff = _b.isStaff, matchAudience = _b.matchAudience, now = _b.now, platform = _b.platform, queryVersion = _b.queryVersion, user = _b.user;
|
|
226
|
+
return __generator(this, function (_c) {
|
|
227
|
+
if (!(0, exports.isAnnouncementVisibleNow)({ announcement: announcement, now: now })) {
|
|
228
|
+
return [2 /*return*/, false];
|
|
229
|
+
}
|
|
230
|
+
if (!(0, exports.matchesPlatform)({ announcement: announcement, platform: platform })) {
|
|
231
|
+
return [2 /*return*/, false];
|
|
232
|
+
}
|
|
233
|
+
if (!(0, exports.passesMinBuildNumber)({ announcement: announcement, queryVersion: queryVersion })) {
|
|
234
|
+
return [2 /*return*/, false];
|
|
235
|
+
}
|
|
236
|
+
if (!(0, exports.matchAudienceByType)({ announcement: announcement, isStaff: isStaff, user: user })) {
|
|
237
|
+
return [2 /*return*/, false];
|
|
238
|
+
}
|
|
239
|
+
return [2 /*return*/, matchAudience(user, announcement)];
|
|
240
|
+
});
|
|
241
|
+
}); };
|
|
242
|
+
exports.isAnnouncementVisibleToUser = isAnnouncementVisibleToUser;
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import type { PermissionMethod } from "@terreno/api";
|
|
2
|
+
import type { Model, Types } from "mongoose";
|
|
3
|
+
export type AnnouncementStatus = "draft" | "published" | "archived";
|
|
4
|
+
export type AnnouncementPlatform = "ios" | "android" | "web";
|
|
5
|
+
export type AnnouncementDisplayMode = "modal" | "banner" | "feed";
|
|
6
|
+
export type AnnouncementAudienceType = "staff" | "patient" | "all";
|
|
7
|
+
export type AcknowledgementPolicy = "required" | "dismiss-only";
|
|
8
|
+
export interface AnnouncementPrimaryAction {
|
|
9
|
+
label: string;
|
|
10
|
+
url: string;
|
|
11
|
+
}
|
|
12
|
+
export interface AnnouncementDocument {
|
|
13
|
+
_id: Types.ObjectId;
|
|
14
|
+
title: string;
|
|
15
|
+
body: string;
|
|
16
|
+
status: AnnouncementStatus;
|
|
17
|
+
version: number;
|
|
18
|
+
priority: number;
|
|
19
|
+
acknowledgementPolicy?: AcknowledgementPolicy;
|
|
20
|
+
audience: unknown;
|
|
21
|
+
audienceType?: AnnouncementAudienceType;
|
|
22
|
+
displayMode?: AnnouncementDisplayMode;
|
|
23
|
+
minBuildNumber?: number;
|
|
24
|
+
publishAt?: Date;
|
|
25
|
+
expiresAt?: Date;
|
|
26
|
+
platforms: AnnouncementPlatform[];
|
|
27
|
+
primaryAction?: AnnouncementPrimaryAction;
|
|
28
|
+
publishedAt?: Date;
|
|
29
|
+
archivedAt?: Date;
|
|
30
|
+
created: Date;
|
|
31
|
+
updated: Date;
|
|
32
|
+
}
|
|
33
|
+
export type AnnouncementModel = Model<AnnouncementDocument>;
|
|
34
|
+
export interface AnnouncementAcknowledgementDocument {
|
|
35
|
+
_id: Types.ObjectId;
|
|
36
|
+
userId: Types.ObjectId;
|
|
37
|
+
announcementId: Types.ObjectId;
|
|
38
|
+
version: number;
|
|
39
|
+
acknowledgedAt: Date;
|
|
40
|
+
created: Date;
|
|
41
|
+
updated: Date;
|
|
42
|
+
}
|
|
43
|
+
export type AnnouncementAcknowledgementModel = Model<AnnouncementAcknowledgementDocument>;
|
|
44
|
+
export interface AnnouncementImpressionDocument {
|
|
45
|
+
_id: Types.ObjectId;
|
|
46
|
+
userId: Types.ObjectId;
|
|
47
|
+
announcementId: Types.ObjectId;
|
|
48
|
+
version: number;
|
|
49
|
+
viewedAt: Date;
|
|
50
|
+
platform?: AnnouncementPlatform;
|
|
51
|
+
created: Date;
|
|
52
|
+
updated: Date;
|
|
53
|
+
}
|
|
54
|
+
export type AnnouncementImpressionModel = Model<AnnouncementImpressionDocument>;
|
|
55
|
+
export type AnnouncementClickAction = "primaryAction";
|
|
56
|
+
export interface AnnouncementClickEventDocument {
|
|
57
|
+
_id: Types.ObjectId;
|
|
58
|
+
userId: Types.ObjectId;
|
|
59
|
+
announcementId: Types.ObjectId;
|
|
60
|
+
version: number;
|
|
61
|
+
action: AnnouncementClickAction;
|
|
62
|
+
clickedAt: Date;
|
|
63
|
+
platform?: AnnouncementPlatform;
|
|
64
|
+
created: Date;
|
|
65
|
+
updated: Date;
|
|
66
|
+
}
|
|
67
|
+
export type AnnouncementClickEventModel = Model<AnnouncementClickEventDocument>;
|
|
68
|
+
export interface AnnouncementPublic {
|
|
69
|
+
id: string;
|
|
70
|
+
title: string;
|
|
71
|
+
body: string;
|
|
72
|
+
version: number;
|
|
73
|
+
priority: number;
|
|
74
|
+
displayMode: AnnouncementDisplayMode;
|
|
75
|
+
requiresAcknowledgement: boolean;
|
|
76
|
+
primaryAction?: AnnouncementPrimaryAction;
|
|
77
|
+
publishedAt?: string;
|
|
78
|
+
}
|
|
79
|
+
export type MatchAudienceFunction = (user: unknown, announcement: AnnouncementDocument) => boolean | Promise<boolean>;
|
|
80
|
+
export interface AnnouncementsHelpOptions {
|
|
81
|
+
/** When true, registers GET /announcements/help/search and GET /announcements/help/:id for MCP and in-app help. */
|
|
82
|
+
enabled?: boolean;
|
|
83
|
+
}
|
|
84
|
+
export interface AnnouncementsOptions {
|
|
85
|
+
/** Permission methods for the aggregate admin overview. Defaults to IsAdmin. */
|
|
86
|
+
adminOverviewPermissions?: PermissionMethod<AnnouncementDocument>[];
|
|
87
|
+
basePath?: string;
|
|
88
|
+
defaultAcknowledgementPolicy?: AcknowledgementPolicy;
|
|
89
|
+
help?: AnnouncementsHelpOptions;
|
|
90
|
+
/** When omitted, staff targeting uses `user.admin === true`. */
|
|
91
|
+
isStaff?: (user: unknown) => boolean;
|
|
92
|
+
matchAudience?: MatchAudienceFunction;
|
|
93
|
+
permissions?: Partial<{
|
|
94
|
+
create: PermissionMethod<AnnouncementDocument>[];
|
|
95
|
+
delete: PermissionMethod<AnnouncementDocument>[];
|
|
96
|
+
list: PermissionMethod<AnnouncementDocument>[];
|
|
97
|
+
read: PermissionMethod<AnnouncementDocument>[];
|
|
98
|
+
update: PermissionMethod<AnnouncementDocument>[];
|
|
99
|
+
}>;
|
|
100
|
+
}
|
|
101
|
+
export interface AnnouncementOverviewMetrics {
|
|
102
|
+
impressions: number;
|
|
103
|
+
acknowledgements: number;
|
|
104
|
+
clicks: number;
|
|
105
|
+
}
|
|
106
|
+
export interface AnnouncementOverviewRow {
|
|
107
|
+
_id: string;
|
|
108
|
+
title: string;
|
|
109
|
+
status: AnnouncementStatus;
|
|
110
|
+
displayMode: AnnouncementDisplayMode;
|
|
111
|
+
audienceType: AnnouncementAudienceType;
|
|
112
|
+
acknowledgementPolicy: AcknowledgementPolicy;
|
|
113
|
+
priority: number;
|
|
114
|
+
version: number;
|
|
115
|
+
publishedAt?: string;
|
|
116
|
+
expiresAt?: string;
|
|
117
|
+
metrics: AnnouncementOverviewMetrics;
|
|
118
|
+
}
|
|
119
|
+
export interface AnnouncementOverviewTotals {
|
|
120
|
+
announcements: number;
|
|
121
|
+
published: number;
|
|
122
|
+
draft: number;
|
|
123
|
+
archived: number;
|
|
124
|
+
impressions: number;
|
|
125
|
+
acknowledgements: number;
|
|
126
|
+
clicks: number;
|
|
127
|
+
}
|
|
128
|
+
export interface AnnouncementOverviewResponse {
|
|
129
|
+
data: AnnouncementOverviewRow[];
|
|
130
|
+
totals: AnnouncementOverviewTotals;
|
|
131
|
+
page: number;
|
|
132
|
+
limit: number;
|
|
133
|
+
total: number;
|
|
134
|
+
more: boolean;
|
|
135
|
+
}
|
package/dist/types.js
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"author": "Josh Gachnang",
|
|
3
|
+
"bugs": {
|
|
4
|
+
"url": "https://github.com/FlourishHealth/terreno/issues"
|
|
5
|
+
},
|
|
6
|
+
"dependencies": {
|
|
7
|
+
"@terreno/api": "57.4.0",
|
|
8
|
+
"express": "^5.2.1",
|
|
9
|
+
"luxon": "^3.7.2"
|
|
10
|
+
},
|
|
11
|
+
"description": "In-app product update announcements plugin for @terreno/api — part of Terreno, the batteries-included TypeScript framework for universal apps.",
|
|
12
|
+
"devDependencies": {
|
|
13
|
+
"@biomejs/biome": "^2.3.6",
|
|
14
|
+
"@terreno/test": "57.4.0",
|
|
15
|
+
"@types/bun": "^1.4.0",
|
|
16
|
+
"@types/express": "^5.0.6",
|
|
17
|
+
"@types/supertest": "^7.2.0",
|
|
18
|
+
"chai": "^6.2.2",
|
|
19
|
+
"passport-local-mongoose": "^9.0.1",
|
|
20
|
+
"supertest": "^7.2.2",
|
|
21
|
+
"typescript": "~6.0.3"
|
|
22
|
+
},
|
|
23
|
+
"homepage": "https://github.com/FlourishHealth/terreno#readme",
|
|
24
|
+
"keywords": [
|
|
25
|
+
"announcements",
|
|
26
|
+
"api",
|
|
27
|
+
"changelog",
|
|
28
|
+
"express",
|
|
29
|
+
"terreno"
|
|
30
|
+
],
|
|
31
|
+
"license": "MIT",
|
|
32
|
+
"main": "dist/index.js",
|
|
33
|
+
"name": "@terreno/announcements",
|
|
34
|
+
"peerDependencies": {
|
|
35
|
+
"mongoose": "^8.0.0 || ^9.0.0"
|
|
36
|
+
},
|
|
37
|
+
"publishConfig": {
|
|
38
|
+
"access": "public"
|
|
39
|
+
},
|
|
40
|
+
"repository": {
|
|
41
|
+
"type": "git",
|
|
42
|
+
"url": "git+ssh://git@github.com/FlourishHealth/terreno.git"
|
|
43
|
+
},
|
|
44
|
+
"scripts": {
|
|
45
|
+
"compile": "bun tsc",
|
|
46
|
+
"compile:watch": "bun tsc -w",
|
|
47
|
+
"dev": "bun tsc -w",
|
|
48
|
+
"lint": "biome check ./src",
|
|
49
|
+
"lint:fix": "biome check --write ./src",
|
|
50
|
+
"test": "bun test",
|
|
51
|
+
"test:agent": "AGENT=1 bun test --only-failures",
|
|
52
|
+
"test:ci": "bun test",
|
|
53
|
+
"test:coverage": "bun run ../scripts/check-coverage.ts"
|
|
54
|
+
},
|
|
55
|
+
"types": "dist/index.d.ts",
|
|
56
|
+
"version": "57.4.0"
|
|
57
|
+
}
|