hyper-pm-web 0.1.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/README.md +49 -0
- package/dist/server.mjs +4512 -0
- package/env.example +8 -0
- package/package.json +44 -0
- package/public/app.js +2326 -0
- package/public/audit-event-summary.js +182 -0
- package/public/index.html +1261 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var HyperPmAuditSummary = (() => {
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
20
|
+
|
|
21
|
+
// src/audit-event-summary.ts
|
|
22
|
+
var audit_event_summary_exports = {};
|
|
23
|
+
__export(audit_event_summary_exports, {
|
|
24
|
+
summarizeAuditEventForWeb: () => summarizeAuditEventForWeb
|
|
25
|
+
});
|
|
26
|
+
var isRecord = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
|
|
27
|
+
var pickStr = (p, key) => {
|
|
28
|
+
const v = p[key];
|
|
29
|
+
return typeof v === "string" ? v : void 0;
|
|
30
|
+
};
|
|
31
|
+
var quoteStatus = (s) => JSON.stringify(s);
|
|
32
|
+
var normalizeStrList = (raw) => {
|
|
33
|
+
if (!Array.isArray(raw)) return [];
|
|
34
|
+
return raw.filter((x) => typeof x === "string" && x.length > 0);
|
|
35
|
+
};
|
|
36
|
+
var branchesPhrase = (branches) => {
|
|
37
|
+
const usable = branches.filter((b) => b.length > 0 && b.length <= 40);
|
|
38
|
+
if (usable.length === 0 || usable.length > 3) {
|
|
39
|
+
return "updated linked branches";
|
|
40
|
+
}
|
|
41
|
+
return `updated linked branches (${usable.join(", ")})`;
|
|
42
|
+
};
|
|
43
|
+
var workItemUpdateAspects = (kind, payload) => {
|
|
44
|
+
const aspects = [];
|
|
45
|
+
const idOnly = Object.keys(payload).filter((k) => k !== "id");
|
|
46
|
+
if (idOnly.length === 0) {
|
|
47
|
+
return [];
|
|
48
|
+
}
|
|
49
|
+
if (payload["status"] !== void 0) {
|
|
50
|
+
aspects.push(`Status set to ${quoteStatus(String(payload["status"]))}.`);
|
|
51
|
+
}
|
|
52
|
+
if (kind === "ticket" && payload["assignee"] !== void 0) {
|
|
53
|
+
const a = payload["assignee"];
|
|
54
|
+
if (a === null) {
|
|
55
|
+
aspects.push("Assignee cleared.");
|
|
56
|
+
} else if (typeof a === "string" && a.length > 0) {
|
|
57
|
+
aspects.push(`Assignee set to ${quoteStatus(a)}.`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (kind === "ticket" && payload["storyId"] !== void 0) {
|
|
61
|
+
aspects.push(`Story link: ${String(payload["storyId"])}.`);
|
|
62
|
+
}
|
|
63
|
+
if (kind === "ticket" && payload["branches"] !== void 0) {
|
|
64
|
+
aspects.push(branchesPhrase(normalizeStrList(payload["branches"])));
|
|
65
|
+
}
|
|
66
|
+
if (kind === "ticket" && payload["labels"] !== void 0) {
|
|
67
|
+
if (payload["labels"] === null) {
|
|
68
|
+
aspects.push("Labels cleared.");
|
|
69
|
+
} else {
|
|
70
|
+
const lb = normalizeStrList(payload["labels"]);
|
|
71
|
+
aspects.push(
|
|
72
|
+
lb.length > 0 ? `Labels: ${lb.join(", ")}.` : "Labels cleared."
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (kind === "ticket" && payload["priority"] !== void 0) {
|
|
77
|
+
aspects.push(
|
|
78
|
+
payload["priority"] === null ? "Priority cleared." : `Priority: ${quoteStatus(String(payload["priority"]))}.`
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
if (kind === "ticket" && payload["size"] !== void 0) {
|
|
82
|
+
aspects.push(
|
|
83
|
+
payload["size"] === null ? "Size cleared." : `Size: ${quoteStatus(String(payload["size"]))}.`
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
if (kind === "ticket" && payload["estimate"] !== void 0) {
|
|
87
|
+
aspects.push(
|
|
88
|
+
payload["estimate"] === null ? "Estimate cleared." : `Estimate: ${String(payload["estimate"])}.`
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
if (payload["title"] !== void 0) {
|
|
92
|
+
aspects.push("Title changed.");
|
|
93
|
+
}
|
|
94
|
+
if (payload["body"] !== void 0) {
|
|
95
|
+
aspects.push("Description updated.");
|
|
96
|
+
}
|
|
97
|
+
return aspects;
|
|
98
|
+
};
|
|
99
|
+
var EVENT_TITLE = {
|
|
100
|
+
EpicCreated: "Epic created",
|
|
101
|
+
EpicUpdated: "Epic updated",
|
|
102
|
+
EpicDeleted: "Epic deleted",
|
|
103
|
+
StoryCreated: "Story created",
|
|
104
|
+
StoryUpdated: "Story updated",
|
|
105
|
+
StoryDeleted: "Story deleted",
|
|
106
|
+
TicketCreated: "Ticket created",
|
|
107
|
+
TicketUpdated: "Ticket updated",
|
|
108
|
+
TicketDeleted: "Ticket deleted",
|
|
109
|
+
TicketCommentAdded: "Comment added",
|
|
110
|
+
SyncCursor: "Sync cursor",
|
|
111
|
+
GithubInboundUpdate: "GitHub inbound update",
|
|
112
|
+
GithubIssueLinked: "GitHub issue linked",
|
|
113
|
+
GithubPrActivity: "Pull request activity"
|
|
114
|
+
};
|
|
115
|
+
var summarizeAuditEventForWeb = (evt) => {
|
|
116
|
+
if (!isRecord(evt)) {
|
|
117
|
+
return { title: "Unknown event", detailLines: [] };
|
|
118
|
+
}
|
|
119
|
+
const type = typeof evt["type"] === "string" ? evt["type"] : "";
|
|
120
|
+
const payload = isRecord(evt["payload"]) ? evt["payload"] : {};
|
|
121
|
+
const title = EVENT_TITLE[type] ?? (type.length > 0 ? type : "Unknown event");
|
|
122
|
+
const details = [];
|
|
123
|
+
switch (type) {
|
|
124
|
+
case "EpicUpdated":
|
|
125
|
+
details.push(...workItemUpdateAspects("epic", payload));
|
|
126
|
+
break;
|
|
127
|
+
case "StoryUpdated":
|
|
128
|
+
details.push(...workItemUpdateAspects("story", payload));
|
|
129
|
+
break;
|
|
130
|
+
case "TicketUpdated":
|
|
131
|
+
details.push(...workItemUpdateAspects("ticket", payload));
|
|
132
|
+
break;
|
|
133
|
+
case "TicketCommentAdded": {
|
|
134
|
+
const body = pickStr(payload, "body");
|
|
135
|
+
if (body !== void 0 && body.trim().length > 0) {
|
|
136
|
+
const one = body.trim().replace(/\s+/g, " ");
|
|
137
|
+
details.push(
|
|
138
|
+
one.length > 200 ? `${one.slice(0, 197).trimEnd()}\u2026` : one
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
case "GithubPrActivity": {
|
|
144
|
+
const pr = payload["prNumber"];
|
|
145
|
+
const kind = pickStr(payload, "kind");
|
|
146
|
+
const prn = typeof pr === "number" ? String(pr) : String(pr ?? "");
|
|
147
|
+
if (prn || kind) {
|
|
148
|
+
details.push(
|
|
149
|
+
[prn ? `PR #${prn}` : "", kind ?? ""].filter(Boolean).join(" \xB7 ")
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
break;
|
|
153
|
+
}
|
|
154
|
+
case "GithubIssueLinked": {
|
|
155
|
+
const n = payload["issueNumber"];
|
|
156
|
+
if (typeof n === "number") {
|
|
157
|
+
details.push(`Issue #${n}`);
|
|
158
|
+
}
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
case "GithubInboundUpdate": {
|
|
162
|
+
const parts = [];
|
|
163
|
+
if (payload["title"] !== void 0) parts.push("title");
|
|
164
|
+
if (payload["body"] !== void 0) parts.push("description");
|
|
165
|
+
if (payload["status"] !== void 0) parts.push("status");
|
|
166
|
+
if (parts.length > 0) {
|
|
167
|
+
details.push(`Fields: ${parts.join(", ")}.`);
|
|
168
|
+
}
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
case "SyncCursor": {
|
|
172
|
+
const c = pickStr(payload, "cursor");
|
|
173
|
+
if (c !== void 0) details.push(`Cursor: ${c}`);
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
default:
|
|
177
|
+
break;
|
|
178
|
+
}
|
|
179
|
+
return { title, detailLines: details };
|
|
180
|
+
};
|
|
181
|
+
return __toCommonJS(audit_event_summary_exports);
|
|
182
|
+
})();
|