@andrestobelem/clone 0.2.0 → 0.2.2

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/seed.js ADDED
@@ -0,0 +1,498 @@
1
+ import { run, scalar, sql } from "./database.js";
2
+ import { issueStatuses, schema } from "./schema.js";
3
+ import { now } from "./time.js";
4
+ export function initializeSchema(database) {
5
+ database.exec(schema);
6
+ }
7
+ export function createMemberActors(database) {
8
+ database.exec(`INSERT INTO actors(id,kind,name,active,member_id,avatar_color,created_at)
9
+ SELECT id,'member',name,active,id,avatar_color,created_at FROM members`);
10
+ }
11
+ export function seedEmpty(database) {
12
+ initializeSchema(database);
13
+ if (scalar(database, "SELECT COUNT(*) FROM workspace"))
14
+ return;
15
+ const stamp = now();
16
+ run(database, "INSERT INTO workspace(id,name,icon,created_at) VALUES(1,?,?,?)", "My Workspace", "M", stamp);
17
+ run(database, "INSERT INTO members(id,name,email,role,avatar_color,created_at) VALUES(1,?,?,?,?,?)", "Local User", "local@clone.local", "Workspace admin", "#88a8ce", stamp);
18
+ createMemberActors(database);
19
+ updateSetting(database, "preferences", {
20
+ defaultHome: "Issues",
21
+ theme: "Light",
22
+ sidebar: {},
23
+ });
24
+ updateSetting(database, "workspace", {
25
+ name: "My Workspace",
26
+ timezone: "UTC",
27
+ issueIdentifier: "ISS",
28
+ inviteDomain: null,
29
+ });
30
+ }
31
+ export function seedDemo(database) {
32
+ initializeSchema(database);
33
+ if (scalar(database, "SELECT COUNT(*) FROM workspace"))
34
+ return;
35
+ const stamp = now();
36
+ run(database, "INSERT INTO workspace(id,name,icon,created_at) VALUES(1,?,?,?)", "Acme Studio", "A", stamp);
37
+ const people = [
38
+ [1, "Alex Morgan", "alex@acme.local", "Workspace admin", "#cda58f"],
39
+ [2, "Maya Chen", "maya@acme.local", "Member", "#ac95d4"],
40
+ [3, "Sam Rivera", "sam@acme.local", "Member", "#79a99b"],
41
+ [4, "Jordan Lee", "jordan@acme.local", "Member", "#d79da5"],
42
+ [5, "Taylor Kim", "taylor@acme.local", "Member", "#88a8ce"],
43
+ ];
44
+ for (const person of people) {
45
+ run(database, "INSERT INTO members(id,name,email,role,avatar_color,created_at) VALUES(?,?,?,?,?,?)", ...person, stamp);
46
+ }
47
+ createMemberActors(database);
48
+ run(database, "INSERT INTO teams(id,name,key,description,icon,created_at) VALUES(1,'Product','PRO','Build a product people love.','✳',?)", stamp);
49
+ run(database, "INSERT INTO teams(id,name,key,description,icon,created_at) VALUES(2,'Design','DSN','Shape a clear, considered experience.','◇',?)", stamp);
50
+ for (const [teamId, memberId, role] of [
51
+ [1, 1, "Lead"],
52
+ [1, 2, "Member"],
53
+ [1, 3, "Member"],
54
+ [1, 4, "Member"],
55
+ [2, 1, "Lead"],
56
+ [2, 2, "Member"],
57
+ [2, 4, "Member"],
58
+ [2, 5, "Member"],
59
+ ]) {
60
+ run(database, "INSERT INTO team_members(team_id,member_id,role) VALUES(?,?,?)", teamId, memberId, role);
61
+ }
62
+ const colors = {
63
+ Backlog: "#a3a3ad",
64
+ Todo: "#6e9dd5",
65
+ "In Progress": "#8584dd",
66
+ "In Review": "#b881d2",
67
+ Done: "#54b58b",
68
+ Canceled: "#8b8b93",
69
+ Duplicate: "#8b8b93",
70
+ };
71
+ for (const teamId of [1, 2]) {
72
+ issueStatuses.forEach(([name, category], position) => run(database, "INSERT INTO issue_statuses(team_id,name,category,position,color,is_default) VALUES(?,?,?,?,?,?)", teamId, name, category, position, colors[name], name === "Backlog" ? 1 : 0));
73
+ }
74
+ seedDemoContent(database, stamp);
75
+ }
76
+ function seedDemoContent(database, stamp) {
77
+ const labels = [
78
+ [1, "Feature", "#7c78d8", 1],
79
+ [2, "Bug", "#d96c68", 1],
80
+ [3, "Improvement", "#6394d4", 1],
81
+ [4, "Design", "#c27ad2", 1],
82
+ [5, "Urgent", "#e3a74f", 1],
83
+ [6, "Accessibility", "#58a88d", 1],
84
+ [7, "Frontend", "#7496d4", 1],
85
+ [8, "Research", "#c58e58", 2],
86
+ ];
87
+ for (const item of labels)
88
+ run(database, "INSERT INTO labels(id,name,color,team_id) VALUES(?,?,?,?)", ...item);
89
+ const cycles = [
90
+ [1, 1, "Cycle 24", "2026-10-24", "2026-11-07", "Active", 24],
91
+ [2, 1, "Cycle 25", "2026-11-07", "2026-11-21", "Upcoming", 24],
92
+ [3, 2, "Design cycle 12", "2026-10-28", "2026-11-11", "Active", 18],
93
+ ];
94
+ for (const item of cycles)
95
+ run(database, "INSERT INTO cycles(id,team_id,name,starts_at,ends_at,status,capacity,created_at) VALUES(?,?,?,?,?,?,?,?)", ...item, stamp);
96
+ const projects = [
97
+ [
98
+ 1,
99
+ "Workspace foundations",
100
+ "Make everyday project work feel fast and clear.",
101
+ "Improve the core planning experience for teams.",
102
+ "In Progress",
103
+ 2,
104
+ "◈",
105
+ 1,
106
+ "2026-09-15",
107
+ "2026-10-18",
108
+ ],
109
+ [
110
+ 2,
111
+ "Spring product launch",
112
+ "Bring the next version of Acme to every team.",
113
+ "Prepare the product launch across product and design.",
114
+ "In Progress",
115
+ 1,
116
+ "✳",
117
+ 1,
118
+ "2026-09-20",
119
+ "2026-11-02",
120
+ ],
121
+ [
122
+ 3,
123
+ "Design system refresh",
124
+ "A sharper, more consistent UI across the product.",
125
+ "Refresh components, tokens, and documentation.",
126
+ "Planned",
127
+ 3,
128
+ "⬡",
129
+ 4,
130
+ "2026-10-05",
131
+ "2026-12-01",
132
+ ],
133
+ ];
134
+ for (const item of projects)
135
+ run(database, "INSERT INTO projects(id,name,summary,description,status,priority,icon,lead_id,start_date,target_date,created_at,updated_at) VALUES(?,?,?,?,?,?,?,?,?,?,?,?)", ...item, stamp, stamp);
136
+ for (const item of [
137
+ [1, 1],
138
+ [1, 2],
139
+ [2, 1],
140
+ [2, 2],
141
+ [3, 2],
142
+ ])
143
+ run(database, "INSERT INTO project_teams(project_id,team_id) VALUES(?,?)", ...item);
144
+ for (const item of [
145
+ [1, 1],
146
+ [1, 2],
147
+ [1, 3],
148
+ [2, 1],
149
+ [2, 2],
150
+ [2, 4],
151
+ [3, 4],
152
+ [3, 5],
153
+ ])
154
+ run(database, "INSERT INTO project_members(project_id,member_id) VALUES(?,?)", ...item);
155
+ run(database, "INSERT INTO project_dependencies(project_id,depends_on_id,dependency_type) VALUES(2,1,'blocks')");
156
+ const milestones = [
157
+ [1, 1, "Prototype review", "2026-10-04", "Done", 0],
158
+ [2, 1, "Team beta", "2026-10-12", "In Progress", 1],
159
+ [3, 1, "General availability", "2026-10-18", "Todo", 2],
160
+ [4, 2, "Launch readiness", "2026-10-22", "Todo", 0],
161
+ [5, 3, "Token audit", "2026-10-20", "Todo", 0],
162
+ ];
163
+ for (const item of milestones)
164
+ run(database, "INSERT INTO milestones(id,project_id,name,due_date,status,position) VALUES(?,?,?,?,?,?)", ...item);
165
+ const issueData = [
166
+ [
167
+ 248,
168
+ 1,
169
+ "Add keyboard shortcuts to command menu",
170
+ "Make command navigation available without leaving the keyboard.",
171
+ "In Progress",
172
+ 0,
173
+ 1,
174
+ 2,
175
+ 1,
176
+ 1,
177
+ "2026-10-05",
178
+ 3,
179
+ ],
180
+ [
181
+ 246,
182
+ 1,
183
+ "Support custom issue labels",
184
+ "Let teams add, color, and filter their own labels.",
185
+ "In Progress",
186
+ 1,
187
+ 2,
188
+ 1,
189
+ 1,
190
+ 1,
191
+ "2026-10-08",
192
+ 5,
193
+ ],
194
+ [
195
+ 241,
196
+ 1,
197
+ "Fix layout shift on the project overview",
198
+ "Prevent cards jumping while progress data loads.",
199
+ "In Progress",
200
+ 2,
201
+ 4,
202
+ 1,
203
+ 1,
204
+ 1,
205
+ "2026-10-09",
206
+ 2,
207
+ ],
208
+ [
209
+ 239,
210
+ 1,
211
+ "Add a compact sidebar density option",
212
+ "Offer a narrower navigation layout.",
213
+ "Todo",
214
+ 1,
215
+ 3,
216
+ 1,
217
+ 1,
218
+ 2,
219
+ "2026-10-12",
220
+ null,
221
+ ],
222
+ [
223
+ 237,
224
+ 1,
225
+ "Remember the last selected team view",
226
+ "Restore the last active view on the next visit.",
227
+ "Todo",
228
+ 2,
229
+ 1,
230
+ 1,
231
+ 1,
232
+ 2,
233
+ null,
234
+ 2,
235
+ ],
236
+ [
237
+ 232,
238
+ 2,
239
+ "Improve keyboard focus in issue details",
240
+ "Keep focus visible when navigating issue properties.",
241
+ "Backlog",
242
+ 3,
243
+ 2,
244
+ 1,
245
+ 3,
246
+ 3,
247
+ null,
248
+ null,
249
+ ],
250
+ [
251
+ 229,
252
+ 2,
253
+ "Create project update templates",
254
+ "Start project updates from reusable templates.",
255
+ "Backlog",
256
+ 4,
257
+ 3,
258
+ 1,
259
+ 2,
260
+ 3,
261
+ null,
262
+ null,
263
+ ],
264
+ [
265
+ 226,
266
+ 2,
267
+ "Polish empty states across the workspace",
268
+ "Add helpful next steps to empty product views.",
269
+ "Done",
270
+ 2,
271
+ 4,
272
+ 1,
273
+ 1,
274
+ 3,
275
+ null,
276
+ null,
277
+ ],
278
+ [
279
+ 218,
280
+ 2,
281
+ "Document color token usage",
282
+ "Record accessibility contrast constraints for the palette.",
283
+ "In Review",
284
+ 3,
285
+ 5,
286
+ 2,
287
+ 3,
288
+ 3,
289
+ "2026-10-14",
290
+ null,
291
+ ],
292
+ [
293
+ 216,
294
+ 1,
295
+ "Add keyboard shortcuts help panel",
296
+ "Show discoverable shortcuts from the help menu.",
297
+ "Backlog",
298
+ 4,
299
+ 1,
300
+ 1,
301
+ null,
302
+ 2,
303
+ null,
304
+ null,
305
+ ],
306
+ [
307
+ 95,
308
+ 2,
309
+ "Audit empty state illustrations",
310
+ "Review illustration consistency across feature areas.",
311
+ "Todo",
312
+ 3,
313
+ 4,
314
+ 2,
315
+ 3,
316
+ 3,
317
+ "2026-10-16",
318
+ null,
319
+ ],
320
+ [
321
+ 93,
322
+ 1,
323
+ "Add issue dependency indicators",
324
+ "Show blocked-by relationships in list and detail views.",
325
+ "Backlog",
326
+ 2,
327
+ 2,
328
+ 1,
329
+ 1,
330
+ 2,
331
+ null,
332
+ 3,
333
+ ],
334
+ ];
335
+ for (const item of issueData) {
336
+ const [number, team, title, description, status, priority, assignee, creator, project, cycle, due, estimate,] = item;
337
+ const statusId = scalar(database, "SELECT id FROM issue_statuses WHERE team_id=? AND name=?", team, status);
338
+ run(database, "INSERT INTO issues(identifier,number,team_id,title,description,status_id,priority,assignee_id,creator_id,project_id,cycle_id,due_date,estimate,created_at,updated_at) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", `${team === 1 ? "PRO" : "DSN"}-${number}`, number, team, title, description, sql(statusId), priority, assignee, creator, project, cycle, due, estimate, stamp, stamp);
339
+ }
340
+ const issueId = (identifier) => Number(scalar(database, "SELECT id FROM issues WHERE identifier=?", identifier));
341
+ const issueLabels = {
342
+ "PRO-248": [1, 7],
343
+ "PRO-246": [1],
344
+ "PRO-241": [2, 7],
345
+ "PRO-239": [3],
346
+ "DSN-232": [6],
347
+ "DSN-218": [4, 8],
348
+ "DSN-95": [4],
349
+ };
350
+ for (const [identifier, labelIds] of Object.entries(issueLabels))
351
+ for (const labelId of labelIds)
352
+ run(database, "INSERT INTO issue_labels(issue_id,label_id) VALUES(?,?)", issueId(identifier), labelId);
353
+ for (const item of [
354
+ ["PRO-248", 1],
355
+ ["PRO-248", 2],
356
+ ["PRO-246", 1],
357
+ ["DSN-218", 1],
358
+ ])
359
+ run(database, "INSERT INTO issue_subscribers(issue_id,member_id) VALUES(?,?)", issueId(item[0]), item[1]);
360
+ run(database, "INSERT INTO issue_relations(issue_id,related_issue_id,relation_type) VALUES(?,?,?)", issueId("PRO-241"), issueId("PRO-93"), "blocked by");
361
+ run(database, "INSERT INTO issue_relations(issue_id,related_issue_id,relation_type) VALUES(?,?,?)", issueId("PRO-248"), issueId("PRO-216"), "relates to");
362
+ run(database, "INSERT INTO comments(issue_id,author_id,body,created_at) VALUES(?,?,?,?)", issueId("PRO-248"), 2, "I drafted the shortcut map; we can review the final keys with the team.", stamp);
363
+ run(database, "INSERT INTO team_resources(team_id,section,title,url) VALUES(1,'Resources','Product principles','https://example.local/principles')");
364
+ const notifications = [
365
+ [
366
+ 1,
367
+ 1,
368
+ "comment",
369
+ "Maya commented on PRO-248",
370
+ "I drafted the shortcut map; we can review the final keys with the team.",
371
+ "issue",
372
+ issueId("PRO-248"),
373
+ 0,
374
+ ],
375
+ [
376
+ 2,
377
+ 1,
378
+ "assignment",
379
+ "PRO-237 was assigned to you",
380
+ "Remember the last selected team view",
381
+ "issue",
382
+ issueId("PRO-237"),
383
+ 0,
384
+ ],
385
+ [
386
+ 3,
387
+ 1,
388
+ "project_update",
389
+ "Workspace foundations update",
390
+ "Prototype review is complete. The team beta is next.",
391
+ "project",
392
+ 1,
393
+ 1,
394
+ ],
395
+ [
396
+ 4,
397
+ 2,
398
+ "mention",
399
+ "Alex mentioned you in PRO-246",
400
+ "Can you review the labels proposal?",
401
+ "issue",
402
+ issueId("PRO-246"),
403
+ 0,
404
+ ],
405
+ ];
406
+ for (const item of notifications)
407
+ run(database, "INSERT INTO notifications(id,recipient_id,kind,title,body,entity_type,entity_id,is_read,created_at) VALUES(?,?,?,?,?,?,?,?,?)", ...item, stamp);
408
+ const views = [
409
+ [
410
+ 1,
411
+ "All issues",
412
+ "Everything in the Product team",
413
+ "◈",
414
+ "issues",
415
+ "Team",
416
+ null,
417
+ 1,
418
+ { status: "all" },
419
+ { layout: "List", groupBy: "Status", orderBy: "Priority" },
420
+ 1,
421
+ ],
422
+ [
423
+ 2,
424
+ "My open issues",
425
+ "Assigned to Alex and not completed",
426
+ "◎",
427
+ "issues",
428
+ "Personal",
429
+ 1,
430
+ 1,
431
+ { assignee: "Alex Morgan", completed: false },
432
+ { layout: "List", groupBy: "Status", orderBy: "Updated" },
433
+ 1,
434
+ ],
435
+ [
436
+ 3,
437
+ "Project tracking",
438
+ "Active project delivery",
439
+ "✳",
440
+ "projects",
441
+ "Workspace",
442
+ null,
443
+ null,
444
+ { status: "In Progress" },
445
+ { layout: "Board", groupBy: "Status", orderBy: "Target date" },
446
+ 0,
447
+ ],
448
+ ];
449
+ for (const item of views) {
450
+ const [id, name, description, icon, entity, scope, owner, team, filters, display, favorite,] = item;
451
+ run(database, "INSERT INTO views(id,name,description,icon,entity,scope,owner_id,team_id,filters_json,display_json,is_favorite,created_at,updated_at) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)", id, name, description, icon, entity, scope, owner, team, JSON.stringify(filters), JSON.stringify(display), favorite, stamp, stamp);
452
+ }
453
+ const settings = {
454
+ preferences: {
455
+ defaultHome: "Issues",
456
+ displayNames: "Full name",
457
+ firstDayOfWeek: "Monday",
458
+ commentSubmit: "Enter",
459
+ fontSize: "Default",
460
+ theme: "Light",
461
+ spelling: true,
462
+ autoAssignToSelf: false,
463
+ sidebar: { Inbox: true, "My issues": true, Projects: true, Views: true },
464
+ orderCompletedByRecency: false,
465
+ },
466
+ workspace: {
467
+ name: "Acme Studio",
468
+ timezone: "America/Argentina/Buenos_Aires",
469
+ issueIdentifier: "PRO",
470
+ inviteDomain: null,
471
+ },
472
+ integrations: [
473
+ { name: "GitHub", connected: false },
474
+ { name: "Slack", connected: false },
475
+ ],
476
+ featureFlags: {
477
+ cycles: true,
478
+ triage: true,
479
+ automations: true,
480
+ customerRequests: false,
481
+ releases: true,
482
+ initiatives: true,
483
+ pulse: false,
484
+ asks: false,
485
+ },
486
+ };
487
+ for (const [key, value] of Object.entries(settings))
488
+ updateSetting(database, key, value);
489
+ const nextRun = new Date(Date.now() + 7 * 86400000)
490
+ .toISOString()
491
+ .slice(0, 10);
492
+ run(database, "INSERT INTO recurring_rules(team_id,title,description,cadence,next_run,enabled,created_at) VALUES(1,?,?,?,?,1,?)", "Weekly planning reminder", "Review open issues before cycle planning.", "Weekly", nextRun, stamp);
493
+ run(database, "INSERT INTO automations(team_id,name,trigger_json,condition_json,action_json,enabled,created_at,updated_at) VALUES(1,?,?,?,?,1,?,?)", "Assign urgent bugs", JSON.stringify({ event: "issue.created" }), JSON.stringify({ label: "Bug", priority: "Urgent" }), JSON.stringify({ assignTo: 1 }), stamp, stamp);
494
+ }
495
+ function updateSetting(database, key, value) {
496
+ run(database, "INSERT INTO app_settings(key,value_json,updated_at) VALUES(?,?,?) ON CONFLICT(key) DO UPDATE SET value_json=excluded.value_json,updated_at=excluded.updated_at", key, JSON.stringify(value), now());
497
+ }
498
+ //# sourceMappingURL=seed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed.js","sourceRoot":"","sources":["../src/seed.ts"],"names":[],"mappings":"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"}
package/dist/teams.js ADDED
@@ -0,0 +1,77 @@
1
+ import { lastInsertId, one, rows, run, scalar, sql, } from "./database.js";
2
+ import { issueStatuses } from "./schema.js";
3
+ import { array, fail, replaceLinks, text, updateFields, } from "./workspace-helpers.js";
4
+ export function mutateTeam(database, method, route, data, stamp, actor) {
5
+ if (route === "/api/teams" && method === "POST") {
6
+ const name = text(data.name, "Team name is required");
7
+ const key = String(data.key ?? name.slice(0, 3))
8
+ .replace(/[^A-Za-z0-9]/g, "")
9
+ .toUpperCase()
10
+ .slice(0, 5);
11
+ if (!key)
12
+ fail("Team key must contain letters or digits");
13
+ run(database, "INSERT INTO teams(name,key,description,icon,created_at) VALUES(?,?,?,?,?)", name, key, sql(data.description ?? ""), sql(data.icon ?? "✳"), stamp);
14
+ const teamId = lastInsertId(database);
15
+ run(database, "INSERT INTO team_members(team_id,member_id,role) VALUES(?,?,'Lead')", teamId, actor);
16
+ for (const participant of array(data.memberIds))
17
+ run(database, "INSERT OR IGNORE INTO team_members(team_id,member_id) VALUES(?,?)", teamId, sql(participant));
18
+ issueStatuses.forEach(([status, category], position) => run(database, "INSERT INTO issue_statuses(team_id,name,category,position,color,is_default) VALUES(?,?,?,?,?,?)", teamId, status, category, position, "#8e8e98", status === "Backlog" ? 1 : 0));
19
+ return { teamId, _status: 201 };
20
+ }
21
+ if (route === "/api/statuses" && method === "POST") {
22
+ const teamId = Number(data.teamId ?? 1);
23
+ const name = text(data.name, "Status name is required");
24
+ const position = Number(scalar(database, "SELECT COALESCE(MAX(position),-1)+1 FROM issue_statuses WHERE team_id=?", teamId));
25
+ run(database, "INSERT INTO issue_statuses(team_id,name,category,position,color) VALUES(?,?,?,?,?)", teamId, name, sql(data.category ?? "Unstarted"), position, sql(data.color ?? "#8989a1"));
26
+ return { statusId: lastInsertId(database), _status: 201 };
27
+ }
28
+ if (route === "/api/labels" && method === "POST") {
29
+ run(database, "INSERT INTO labels(name,color,team_id) VALUES(?,?,?)", text(data.name, "Label name is required"), sql(data.color ?? "#8585cc"), sql(data.teamId ?? 1));
30
+ return { labelId: lastInsertId(database), _status: 201 };
31
+ }
32
+ const team = route.match(/^\/api\/teams\/(\d+)$/);
33
+ if (team && ["PUT", "PATCH"].includes(method)) {
34
+ const teamId = Number(team[1]);
35
+ if (!one(database, "SELECT id FROM teams WHERE id=?", teamId))
36
+ fail("Team not found");
37
+ updateFields(database, "teams", "id", teamId, data, {
38
+ name: "name",
39
+ description: "description",
40
+ icon: "icon",
41
+ timezone: "timezone",
42
+ estimateType: "estimate_type",
43
+ });
44
+ if ("memberIds" in data)
45
+ replaceLinks(database, "team_members", "team_id", teamId, "member_id", array(data.memberIds));
46
+ return { ok: true };
47
+ }
48
+ const resources = route.match(/^\/api\/teams\/(\d+)\/resources(?:\/(\d+))?$/);
49
+ if (resources && !resources[2] && method === "POST") {
50
+ const url = String(data.url ?? "").trim();
51
+ if (!/^https?:\/\//i.test(url))
52
+ fail("Resource links must start with http:// or https://");
53
+ run(database, "INSERT INTO team_resources(team_id,section,title,url) VALUES(?,?,?,?)", Number(resources[1]), String(data.section ?? "Resources").trim() || "Resources", text(data.title, "Resource title is required"), url);
54
+ return { resourceId: lastInsertId(database), _status: 201 };
55
+ }
56
+ if (resources?.[2] && method === "DELETE") {
57
+ run(database, "DELETE FROM team_resources WHERE team_id=? AND id=?", Number(resources[1]), Number(resources[2]));
58
+ return { ok: true };
59
+ }
60
+ return null;
61
+ }
62
+ export function cycleRecord(database, cycle) {
63
+ const stats = rows(database, "SELECT s.category,COUNT(*) AS total,COALESCE(SUM(COALESCE(i.estimate,0)),0) AS points FROM issues i JOIN issue_statuses s ON s.id=i.status_id WHERE i.cycle_id=? AND i.archived=0 GROUP BY s.category", sql(cycle.id));
64
+ const count = stats.reduce((n, r) => n + Number(r.total), 0);
65
+ const complete = stats
66
+ .filter((r) => r.category === "Completed")
67
+ .reduce((n, r) => n + Number(r.total), 0);
68
+ return {
69
+ ...cycle,
70
+ issue_count: count,
71
+ completed_count: complete,
72
+ estimate_points: stats.reduce((n, r) => n + Number(r.points), 0),
73
+ progress: count ? Math.round((complete * 100) / count) : 0,
74
+ issues: rows(database, "SELECT identifier,title FROM issues WHERE cycle_id=? AND archived=0 ORDER BY number", sql(cycle.id)),
75
+ };
76
+ }
77
+ //# sourceMappingURL=teams.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"teams.js","sourceRoot":"","sources":["../src/teams.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,GAAG,EACH,IAAI,EACJ,GAAG,EACH,MAAM,EACN,GAAG,GAEJ,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EACL,KAAK,EACL,IAAI,EACJ,YAAY,EACZ,IAAI,EACJ,YAAY,GACb,MAAM,wBAAwB,CAAC;AAEhC,MAAM,UAAU,UAAU,CACxB,QAAkB,EAClB,MAAc,EACd,KAAa,EACb,IAAgB,EAChB,KAAa,EACb,KAAa;IAEb,IAAI,KAAK,KAAK,YAAY,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,uBAAuB,CAAC,CAAC;QACtD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;aAC7C,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;aAC5B,WAAW,EAAE;aACb,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACf,IAAI,CAAC,GAAG;YAAE,IAAI,CAAC,yCAAyC,CAAC,CAAC;QAC1D,GAAG,CACD,QAAQ,EACR,2EAA2E,EAC3E,IAAI,EACJ,GAAG,EACH,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,EAC3B,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,EACrB,KAAK,CACN,CAAC;QACF,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QACtC,GAAG,CACD,QAAQ,EACR,qEAAqE,EACrE,MAAM,EACN,KAAK,CACN,CAAC;QACF,KAAK,MAAM,WAAW,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;YAC7C,GAAG,CACD,QAAQ,EACR,mEAAmE,EACnE,MAAM,EACN,GAAG,CAAC,WAAW,CAAC,CACjB,CAAC;QACJ,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAE,CACrD,GAAG,CACD,QAAQ,EACR,iGAAiG,EACjG,MAAM,EACN,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC7B,CACF,CAAC;QACF,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;IAClC,CAAC;IACD,IAAI,KAAK,KAAK,eAAe,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,yBAAyB,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,MAAM,CACrB,MAAM,CACJ,QAAQ,EACR,yEAAyE,EACzE,MAAM,CACP,CACF,CAAC;QACF,GAAG,CACD,QAAQ,EACR,oFAAoF,EACpF,MAAM,EACN,IAAI,EACJ,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,WAAW,CAAC,EACjC,QAAQ,EACR,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC,CAC7B,CAAC;QACF,OAAO,EAAE,QAAQ,EAAE,YAAY,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;IAC5D,CAAC;IACD,IAAI,KAAK,KAAK,aAAa,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACjD,GAAG,CACD,QAAQ,EACR,sDAAsD,EACtD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,wBAAwB,CAAC,EACzC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC,EAC5B,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CACtB,CAAC;QACF,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;IAC3D,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAClD,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,iCAAiC,EAAE,MAAM,CAAC;YAC3D,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACzB,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;YAClD,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,aAAa;YAC1B,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,UAAU;YACpB,YAAY,EAAE,eAAe;SAC9B,CAAC,CAAC;QACH,IAAI,WAAW,IAAI,IAAI;YACrB,YAAY,CACV,QAAQ,EACR,cAAc,EACd,SAAS,EACT,MAAM,EACN,WAAW,EACX,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CACtB,CAAC;QACJ,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IACD,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAC9E,IAAI,SAAS,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACpD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1C,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;YAC5B,IAAI,CAAC,oDAAoD,CAAC,CAAC;QAC7D,GAAG,CACD,QAAQ,EACR,uEAAuE,EACvE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EACpB,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,WAAW,CAAC,CAAC,IAAI,EAAE,IAAI,WAAW,EACzD,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,4BAA4B,CAAC,EAC9C,GAAG,CACJ,CAAC;QACF,OAAO,EAAE,UAAU,EAAE,YAAY,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;IAC9D,CAAC;IACD,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,GAAG,CACD,QAAQ,EACR,qDAAqD,EACrD,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EACpB,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CACrB,CAAC;QACF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,QAAkB,EAClB,KAAU;IAEV,MAAM,KAAK,GAAG,IAAI,CAChB,QAAQ,EACR,uMAAuM,EACvM,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CACd,CAAC;IACF,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,KAAK;SACnB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,WAAW,CAAC;SACzC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5C,OAAO;QACL,GAAG,KAAK;QACR,WAAW,EAAE,KAAK;QAClB,eAAe,EAAE,QAAQ;QACzB,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAChE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,MAAM,EAAE,IAAI,CACV,QAAQ,EACR,qFAAqF,EACrF,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CACd;KACF,CAAC;AACJ,CAAC"}
package/dist/time.js ADDED
@@ -0,0 +1,4 @@
1
+ export function now() {
2
+ return new Date().toISOString().replace(/\.\d{3}Z$/, "+00:00");
3
+ }
4
+ //# sourceMappingURL=time.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.js","sourceRoot":"","sources":["../src/time.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,GAAG;IACjB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;AACjE,CAAC"}