@andrestobelem/clone 0.1.2 → 0.2.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.
@@ -0,0 +1,254 @@
1
+ import { InvalidInputError } from "./errors.js";
2
+ const cadences = new Set(["Daily", "Weekly", "Every 2 weeks", "Monthly"]);
3
+ const statusCategories = new Set([
4
+ "Backlog",
5
+ "Unstarted",
6
+ "Started",
7
+ "Completed",
8
+ "Canceled",
9
+ "Duplicate",
10
+ ]);
11
+ export function mutationPayload(value, route) {
12
+ if (!isObject(value)) {
13
+ throw new InvalidInputError("Request body must be an object");
14
+ }
15
+ assertJson(value);
16
+ const result = structuredClone(value);
17
+ const textFields = [
18
+ "title",
19
+ "name",
20
+ "body",
21
+ "description",
22
+ "summary",
23
+ "status",
24
+ "health",
25
+ "key",
26
+ "icon",
27
+ "color",
28
+ "category",
29
+ "timezone",
30
+ "estimateType",
31
+ "cadence",
32
+ "scope",
33
+ "entity",
34
+ "section",
35
+ "url",
36
+ "type",
37
+ "externalUrl",
38
+ "relatedIssueId",
39
+ ];
40
+ for (const field of textFields) {
41
+ if (!(field in result))
42
+ continue;
43
+ if ((field === "externalUrl" || field === "url") && result[field] === null)
44
+ continue;
45
+ if (typeof result[field] !== "string")
46
+ fail(`${field} must be text`);
47
+ }
48
+ for (const field of ["title", "name", "body", "key"]) {
49
+ if (!(field in result))
50
+ continue;
51
+ const text = result[field].trim();
52
+ if (!text)
53
+ fail(`${field} must not be empty`);
54
+ result[field] = text;
55
+ }
56
+ for (const field of [
57
+ "teamId",
58
+ "projectId",
59
+ "cycleId",
60
+ "milestoneId",
61
+ "parentId",
62
+ "dependsOnId",
63
+ ]) {
64
+ if (!(field in result))
65
+ continue;
66
+ const candidate = result[field];
67
+ const nullable = ["projectId", "cycleId", "milestoneId", "parentId"].includes(field) ||
68
+ (field === "teamId" && /^\/api\/(labels|views)(\/\d+)?$/.test(route));
69
+ if (candidate === null && nullable)
70
+ continue;
71
+ if (!Number.isInteger(candidate) || Number(candidate) < 1)
72
+ fail(`${field} must be a positive integer`);
73
+ }
74
+ for (const field of ["labelIds", "teamIds", "dependencies", "ids"]) {
75
+ if (!(field in result))
76
+ continue;
77
+ const values = result[field];
78
+ if (!Array.isArray(values) ||
79
+ values.some((item) => !Number.isInteger(item) || Number(item) < 1)) {
80
+ fail(`${field} must be an array of positive integers`);
81
+ }
82
+ result[field] = [...new Set(values)];
83
+ }
84
+ for (const field of [
85
+ "filters",
86
+ "display",
87
+ "trigger",
88
+ "condition",
89
+ "action",
90
+ ]) {
91
+ if (field in result && !isObject(result[field]))
92
+ fail(`${field} must be an object`);
93
+ }
94
+ for (const field of ["issues", "files", "milestones"]) {
95
+ if (!(field in result))
96
+ continue;
97
+ const values = result[field];
98
+ if (!Array.isArray(values) || values.some((item) => !isObject(item))) {
99
+ fail(`${field} must be an array of objects`);
100
+ }
101
+ }
102
+ for (const field of ["estimate", "capacity"]) {
103
+ if (!(field in result))
104
+ continue;
105
+ const candidate = result[field];
106
+ if (field === "estimate" && candidate === null)
107
+ continue;
108
+ if (typeof candidate !== "number" ||
109
+ !Number.isFinite(candidate) ||
110
+ candidate < 0) {
111
+ fail(`${field} must be a finite number of zero or more`);
112
+ }
113
+ }
114
+ for (const field of ["dueDate", "startDate", "targetDate"]) {
115
+ if (field in result)
116
+ result[field] = dateValue(result[field], field, true);
117
+ }
118
+ validateRouteFields(result, route);
119
+ return result;
120
+ }
121
+ function validateRouteFields(result, route) {
122
+ if (route === "/api/cycles") {
123
+ const start = timestampValue(result.startsAt, "startsAt");
124
+ const end = timestampValue(result.endsAt, "endsAt");
125
+ if (end < start)
126
+ fail("Cycle end must not be before its start");
127
+ }
128
+ if (route === "/api/recurring") {
129
+ if (!cadences.has(String(result.cadence ?? "Weekly")))
130
+ fail("Unknown recurring cadence");
131
+ if ("nextRun" in result)
132
+ result.nextRun = dateValue(result.nextRun, "nextRun", false);
133
+ }
134
+ if (route === "/api/statuses" &&
135
+ !statusCategories.has(String(result.category ?? "Unstarted"))) {
136
+ fail("Unknown workflow status category");
137
+ }
138
+ if (/^\/api\/projects(?:\/\d+)?$/.test(route) &&
139
+ "status" in result &&
140
+ !["Backlog", "Planned", "In Progress", "Completed", "Canceled"].includes(String(result.status))) {
141
+ fail("Unknown project status");
142
+ }
143
+ if (/^\/api\/views(?:\/\d+)?$/.test(route)) {
144
+ if ("entity" in result &&
145
+ !["issues", "projects"].includes(String(result.entity)))
146
+ fail("Unknown view entity");
147
+ if ("scope" in result &&
148
+ !["Personal", "Workspace", "Team"].includes(String(result.scope)))
149
+ fail("Unknown view scope");
150
+ if ("isFavorite" in result &&
151
+ typeof result.isFavorite !== "boolean" &&
152
+ result.isFavorite !== 0 &&
153
+ result.isFavorite !== 1) {
154
+ fail("isFavorite must be a boolean or 0 or 1");
155
+ }
156
+ }
157
+ if (route === "/api/automations") {
158
+ const trigger = (result.trigger ?? {});
159
+ const condition = (result.condition ?? {});
160
+ const action = (result.action ?? {});
161
+ if ("event" in trigger &&
162
+ !["issue.created", "issue.updated", "issue.completed"].includes(String(trigger.event)))
163
+ fail("Unknown automation event");
164
+ if ("priority" in condition &&
165
+ ![
166
+ null,
167
+ "",
168
+ "Any",
169
+ "Urgent",
170
+ "High",
171
+ "Medium",
172
+ "Low",
173
+ "No priority",
174
+ ].includes(condition.priority))
175
+ fail("Unknown automation priority condition");
176
+ if ("label" in condition &&
177
+ condition.label !== null &&
178
+ typeof condition.label !== "string")
179
+ fail("Automation label condition must be text");
180
+ if ("name" in action && typeof action.name !== "string")
181
+ fail("Automation action name must be text");
182
+ }
183
+ if (route === "/api/preferences") {
184
+ if ("sidebar" in result &&
185
+ (!isObject(result.sidebar) ||
186
+ Object.values(result.sidebar).some((value) => typeof value !== "boolean")))
187
+ fail("sidebar must be an object of booleans");
188
+ for (const field of ["autoAssignToSelf", "spelling"])
189
+ if (field in result && typeof result[field] !== "boolean")
190
+ fail(`${field} must be a boolean`);
191
+ }
192
+ if (route === "/api/settings") {
193
+ const key = result.key;
194
+ const value = result.value ?? {};
195
+ if (key === "preferences" || key === "workspace") {
196
+ if (!isObject(value))
197
+ fail(`${key} must be an object`);
198
+ if (key === "preferences")
199
+ mutationPayload(value, "/api/preferences");
200
+ if (key === "workspace" &&
201
+ "name" in value &&
202
+ (typeof value.name !== "string" || !value.name.trim()))
203
+ fail("Workspace name must not be empty");
204
+ }
205
+ if (key === "integrations" &&
206
+ (!Array.isArray(value) || value.some((item) => !isObject(item))))
207
+ fail("integrations must be an array of objects");
208
+ }
209
+ if ("milestones" in result) {
210
+ result.milestones = result.milestones.map((item) => mutationPayload(item, "/api/milestones"));
211
+ }
212
+ if ("recurringRule" in result && result.recurringRule !== null) {
213
+ if (isObject(result.recurringRule))
214
+ result.recurringRule = JSON.stringify(result.recurringRule);
215
+ else if (typeof result.recurringRule !== "string")
216
+ fail("recurringRule must be an object, text, or null");
217
+ }
218
+ }
219
+ function dateValue(value, field, optional) {
220
+ if (optional && (value === null || value === ""))
221
+ return null;
222
+ if (typeof value !== "string" || !/^\d{4}-\d{2}-\d{2}$/.test(value))
223
+ fail(`${field} must use YYYY-MM-DD with a valid date`);
224
+ const date = new Date(`${value}T00:00:00.000Z`);
225
+ if (!Number.isFinite(date.getTime()) ||
226
+ date.toISOString().slice(0, 10) !== value)
227
+ fail(`${field} must use YYYY-MM-DD with a valid date`);
228
+ return value;
229
+ }
230
+ function timestampValue(value, field) {
231
+ if (typeof value !== "string")
232
+ fail(`${field} must be a date or timestamp`);
233
+ const parsed = Date.parse(value);
234
+ if (!Number.isFinite(parsed))
235
+ fail(`${field} must be a valid ISO date or timestamp`);
236
+ return parsed;
237
+ }
238
+ function assertJson(value) {
239
+ try {
240
+ const encoded = JSON.stringify(value);
241
+ if (encoded === undefined || /(?:NaN|Infinity)/.test(encoded))
242
+ throw new Error();
243
+ }
244
+ catch {
245
+ fail("Request body must contain JSON values with finite numbers");
246
+ }
247
+ }
248
+ function isObject(value) {
249
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
250
+ }
251
+ function fail(message) {
252
+ throw new InvalidInputError(message);
253
+ }
254
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}