@task-mcp/shared 1.0.20 → 1.0.21
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/package.json +1 -6
- package/dist/algorithms/critical-path.d.ts +0 -46
- package/dist/algorithms/critical-path.d.ts.map +0 -1
- package/dist/algorithms/critical-path.js +0 -320
- package/dist/algorithms/critical-path.js.map +0 -1
- package/dist/algorithms/critical-path.test.d.ts +0 -2
- package/dist/algorithms/critical-path.test.d.ts.map +0 -1
- package/dist/algorithms/critical-path.test.js +0 -194
- package/dist/algorithms/critical-path.test.js.map +0 -1
- package/dist/algorithms/dependency-integrity.d.ts +0 -81
- package/dist/algorithms/dependency-integrity.d.ts.map +0 -1
- package/dist/algorithms/dependency-integrity.js +0 -207
- package/dist/algorithms/dependency-integrity.js.map +0 -1
- package/dist/algorithms/dependency-integrity.test.d.ts +0 -2
- package/dist/algorithms/dependency-integrity.test.d.ts.map +0 -1
- package/dist/algorithms/dependency-integrity.test.js +0 -309
- package/dist/algorithms/dependency-integrity.test.js.map +0 -1
- package/dist/algorithms/index.d.ts +0 -5
- package/dist/algorithms/index.d.ts.map +0 -1
- package/dist/algorithms/index.js +0 -5
- package/dist/algorithms/index.js.map +0 -1
- package/dist/algorithms/tech-analysis.d.ts +0 -106
- package/dist/algorithms/tech-analysis.d.ts.map +0 -1
- package/dist/algorithms/tech-analysis.js +0 -344
- package/dist/algorithms/tech-analysis.js.map +0 -1
- package/dist/algorithms/tech-analysis.test.d.ts +0 -2
- package/dist/algorithms/tech-analysis.test.d.ts.map +0 -1
- package/dist/algorithms/tech-analysis.test.js +0 -338
- package/dist/algorithms/tech-analysis.test.js.map +0 -1
- package/dist/algorithms/topological-sort.d.ts +0 -41
- package/dist/algorithms/topological-sort.d.ts.map +0 -1
- package/dist/algorithms/topological-sort.js +0 -165
- package/dist/algorithms/topological-sort.js.map +0 -1
- package/dist/algorithms/topological-sort.test.d.ts +0 -2
- package/dist/algorithms/topological-sort.test.d.ts.map +0 -1
- package/dist/algorithms/topological-sort.test.js +0 -162
- package/dist/algorithms/topological-sort.test.js.map +0 -1
- package/dist/index.d.ts +0 -4
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -7
- package/dist/index.js.map +0 -1
- package/dist/schemas/inbox.d.ts +0 -55
- package/dist/schemas/inbox.d.ts.map +0 -1
- package/dist/schemas/inbox.js +0 -25
- package/dist/schemas/inbox.js.map +0 -1
- package/dist/schemas/index.d.ts +0 -7
- package/dist/schemas/index.d.ts.map +0 -1
- package/dist/schemas/index.js +0 -17
- package/dist/schemas/index.js.map +0 -1
- package/dist/schemas/project.d.ts +0 -177
- package/dist/schemas/project.d.ts.map +0 -1
- package/dist/schemas/project.js +0 -56
- package/dist/schemas/project.js.map +0 -1
- package/dist/schemas/response-format.d.ts +0 -148
- package/dist/schemas/response-format.d.ts.map +0 -1
- package/dist/schemas/response-format.js +0 -18
- package/dist/schemas/response-format.js.map +0 -1
- package/dist/schemas/response-schema.d.ts +0 -307
- package/dist/schemas/response-schema.d.ts.map +0 -1
- package/dist/schemas/response-schema.js +0 -75
- package/dist/schemas/response-schema.js.map +0 -1
- package/dist/schemas/response-schema.test.d.ts +0 -2
- package/dist/schemas/response-schema.test.d.ts.map +0 -1
- package/dist/schemas/response-schema.test.js +0 -256
- package/dist/schemas/response-schema.test.js.map +0 -1
- package/dist/schemas/state.d.ts +0 -17
- package/dist/schemas/state.d.ts.map +0 -1
- package/dist/schemas/state.js +0 -17
- package/dist/schemas/state.js.map +0 -1
- package/dist/schemas/task.d.ts +0 -881
- package/dist/schemas/task.d.ts.map +0 -1
- package/dist/schemas/task.js +0 -189
- package/dist/schemas/task.js.map +0 -1
- package/dist/schemas/view.d.ts +0 -143
- package/dist/schemas/view.d.ts.map +0 -1
- package/dist/schemas/view.js +0 -48
- package/dist/schemas/view.js.map +0 -1
- package/dist/utils/dashboard-renderer.d.ts +0 -93
- package/dist/utils/dashboard-renderer.d.ts.map +0 -1
- package/dist/utils/dashboard-renderer.js +0 -424
- package/dist/utils/dashboard-renderer.js.map +0 -1
- package/dist/utils/dashboard-renderer.test.d.ts +0 -2
- package/dist/utils/dashboard-renderer.test.d.ts.map +0 -1
- package/dist/utils/dashboard-renderer.test.js +0 -774
- package/dist/utils/dashboard-renderer.test.js.map +0 -1
- package/dist/utils/date.d.ts +0 -94
- package/dist/utils/date.d.ts.map +0 -1
- package/dist/utils/date.js +0 -323
- package/dist/utils/date.js.map +0 -1
- package/dist/utils/date.test.d.ts +0 -2
- package/dist/utils/date.test.d.ts.map +0 -1
- package/dist/utils/date.test.js +0 -276
- package/dist/utils/date.test.js.map +0 -1
- package/dist/utils/hierarchy.d.ts +0 -102
- package/dist/utils/hierarchy.d.ts.map +0 -1
- package/dist/utils/hierarchy.js +0 -236
- package/dist/utils/hierarchy.js.map +0 -1
- package/dist/utils/hierarchy.test.d.ts +0 -2
- package/dist/utils/hierarchy.test.d.ts.map +0 -1
- package/dist/utils/hierarchy.test.js +0 -436
- package/dist/utils/hierarchy.test.js.map +0 -1
- package/dist/utils/id.d.ts +0 -60
- package/dist/utils/id.d.ts.map +0 -1
- package/dist/utils/id.js +0 -118
- package/dist/utils/id.js.map +0 -1
- package/dist/utils/id.test.d.ts +0 -2
- package/dist/utils/id.test.d.ts.map +0 -1
- package/dist/utils/id.test.js +0 -193
- package/dist/utils/id.test.js.map +0 -1
- package/dist/utils/index.d.ts +0 -12
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -34
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/natural-language.d.ts +0 -57
- package/dist/utils/natural-language.d.ts.map +0 -1
- package/dist/utils/natural-language.js +0 -211
- package/dist/utils/natural-language.js.map +0 -1
- package/dist/utils/natural-language.test.d.ts +0 -2
- package/dist/utils/natural-language.test.d.ts.map +0 -1
- package/dist/utils/natural-language.test.js +0 -197
- package/dist/utils/natural-language.test.js.map +0 -1
- package/dist/utils/priority-queue.d.ts +0 -17
- package/dist/utils/priority-queue.d.ts.map +0 -1
- package/dist/utils/priority-queue.js +0 -62
- package/dist/utils/priority-queue.js.map +0 -1
- package/dist/utils/priority-queue.test.d.ts +0 -2
- package/dist/utils/priority-queue.test.d.ts.map +0 -1
- package/dist/utils/priority-queue.test.js +0 -82
- package/dist/utils/priority-queue.test.js.map +0 -1
- package/dist/utils/projection.d.ts +0 -65
- package/dist/utils/projection.d.ts.map +0 -1
- package/dist/utils/projection.js +0 -180
- package/dist/utils/projection.js.map +0 -1
- package/dist/utils/projection.test.d.ts +0 -2
- package/dist/utils/projection.test.d.ts.map +0 -1
- package/dist/utils/projection.test.js +0 -336
- package/dist/utils/projection.test.js.map +0 -1
- package/dist/utils/terminal-ui.d.ts +0 -208
- package/dist/utils/terminal-ui.d.ts.map +0 -1
- package/dist/utils/terminal-ui.js +0 -611
- package/dist/utils/terminal-ui.js.map +0 -1
- package/dist/utils/terminal-ui.test.d.ts +0 -2
- package/dist/utils/terminal-ui.test.d.ts.map +0 -1
- package/dist/utils/terminal-ui.test.js +0 -683
- package/dist/utils/terminal-ui.test.js.map +0 -1
- package/dist/utils/workspace.d.ts +0 -100
- package/dist/utils/workspace.d.ts.map +0 -1
- package/dist/utils/workspace.js +0 -173
- package/dist/utils/workspace.js.map +0 -1
- package/dist/utils/workspace.test.d.ts +0 -2
- package/dist/utils/workspace.test.d.ts.map +0 -1
- package/dist/utils/workspace.test.js +0 -97
- package/dist/utils/workspace.test.js.map +0 -1
- package/src/algorithms/critical-path.test.ts +0 -241
- package/src/algorithms/dependency-integrity.test.ts +0 -348
- package/src/algorithms/tech-analysis.test.ts +0 -413
- package/src/algorithms/topological-sort.test.ts +0 -190
- package/src/schemas/response-schema.test.ts +0 -314
- package/src/utils/dashboard-renderer.test.ts +0 -983
- package/src/utils/date.test.ts +0 -329
- package/src/utils/hierarchy.test.ts +0 -505
- package/src/utils/id.test.ts +0 -235
- package/src/utils/natural-language.test.ts +0 -242
- package/src/utils/priority-queue.test.ts +0 -103
- package/src/utils/projection.test.ts +0 -425
- package/src/utils/terminal-ui.test.ts +0 -831
- package/src/utils/workspace.test.ts +0 -125
package/dist/utils/date.test.js
DELETED
|
@@ -1,276 +0,0 @@
|
|
|
1
|
-
import { describe, test, expect } from "bun:test";
|
|
2
|
-
import { now, parseRelativeDate, parseRelativeDateSafe, parseDateString, formatDate, formatDisplayDate, isToday, isPastDue, isWithinDays, isValidDate, DateParseError, } from "./date.js";
|
|
3
|
-
describe("now", () => {
|
|
4
|
-
test("returns ISO timestamp string", () => {
|
|
5
|
-
const result = now();
|
|
6
|
-
expect(typeof result).toBe("string");
|
|
7
|
-
expect(result).toMatch(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/);
|
|
8
|
-
});
|
|
9
|
-
test("returns current time within tolerance", () => {
|
|
10
|
-
const before = Date.now();
|
|
11
|
-
const result = now();
|
|
12
|
-
const after = Date.now();
|
|
13
|
-
const resultTime = new Date(result).getTime();
|
|
14
|
-
expect(resultTime).toBeGreaterThanOrEqual(before);
|
|
15
|
-
expect(resultTime).toBeLessThanOrEqual(after);
|
|
16
|
-
});
|
|
17
|
-
});
|
|
18
|
-
describe("parseRelativeDate", () => {
|
|
19
|
-
test("parses 'today'", () => {
|
|
20
|
-
const result = parseRelativeDate("today");
|
|
21
|
-
expect(result).not.toBeNull();
|
|
22
|
-
const today = new Date();
|
|
23
|
-
expect(result.getDate()).toBe(today.getDate());
|
|
24
|
-
});
|
|
25
|
-
test("parses '오늘' (Korean today)", () => {
|
|
26
|
-
const result = parseRelativeDate("오늘");
|
|
27
|
-
expect(result).not.toBeNull();
|
|
28
|
-
const today = new Date();
|
|
29
|
-
expect(result.getDate()).toBe(today.getDate());
|
|
30
|
-
});
|
|
31
|
-
test("parses 'tomorrow'", () => {
|
|
32
|
-
const result = parseRelativeDate("tomorrow");
|
|
33
|
-
expect(result).not.toBeNull();
|
|
34
|
-
const tomorrow = new Date();
|
|
35
|
-
tomorrow.setDate(tomorrow.getDate() + 1);
|
|
36
|
-
expect(result.getDate()).toBe(tomorrow.getDate());
|
|
37
|
-
});
|
|
38
|
-
test("parses '내일' (Korean tomorrow)", () => {
|
|
39
|
-
const result = parseRelativeDate("내일");
|
|
40
|
-
expect(result).not.toBeNull();
|
|
41
|
-
const tomorrow = new Date();
|
|
42
|
-
tomorrow.setDate(tomorrow.getDate() + 1);
|
|
43
|
-
expect(result.getDate()).toBe(tomorrow.getDate());
|
|
44
|
-
});
|
|
45
|
-
test("parses 'yesterday'", () => {
|
|
46
|
-
const result = parseRelativeDate("yesterday");
|
|
47
|
-
expect(result).not.toBeNull();
|
|
48
|
-
const yesterday = new Date();
|
|
49
|
-
yesterday.setDate(yesterday.getDate() - 1);
|
|
50
|
-
expect(result.getDate()).toBe(yesterday.getDate());
|
|
51
|
-
});
|
|
52
|
-
test("parses 'next week'", () => {
|
|
53
|
-
const result = parseRelativeDate("next week");
|
|
54
|
-
expect(result).not.toBeNull();
|
|
55
|
-
const nextWeek = new Date();
|
|
56
|
-
nextWeek.setDate(nextWeek.getDate() + 7);
|
|
57
|
-
expect(result.getDate()).toBe(nextWeek.getDate());
|
|
58
|
-
});
|
|
59
|
-
test("parses 'in 3 days'", () => {
|
|
60
|
-
const result = parseRelativeDate("in 3 days");
|
|
61
|
-
expect(result).not.toBeNull();
|
|
62
|
-
const future = new Date();
|
|
63
|
-
future.setDate(future.getDate() + 3);
|
|
64
|
-
expect(result.getDate()).toBe(future.getDate());
|
|
65
|
-
});
|
|
66
|
-
test("parses '5일 후' (Korean days later)", () => {
|
|
67
|
-
const result = parseRelativeDate("5일 후");
|
|
68
|
-
expect(result).not.toBeNull();
|
|
69
|
-
const future = new Date();
|
|
70
|
-
future.setDate(future.getDate() + 5);
|
|
71
|
-
expect(result.getDate()).toBe(future.getDate());
|
|
72
|
-
});
|
|
73
|
-
test("parses weekday names", () => {
|
|
74
|
-
const result = parseRelativeDate("monday");
|
|
75
|
-
expect(result).not.toBeNull();
|
|
76
|
-
expect(result.getDay()).toBe(1); // Monday = 1
|
|
77
|
-
});
|
|
78
|
-
test("parses ISO date string", () => {
|
|
79
|
-
const result = parseRelativeDate("2025-12-31");
|
|
80
|
-
expect(result).not.toBeNull();
|
|
81
|
-
expect(result.getFullYear()).toBe(2025);
|
|
82
|
-
expect(result.getMonth()).toBe(11); // December = 11
|
|
83
|
-
expect(result.getDate()).toBe(31);
|
|
84
|
-
});
|
|
85
|
-
test("returns null for invalid input", () => {
|
|
86
|
-
const result = parseRelativeDate("invalid date string");
|
|
87
|
-
expect(result).toBeNull();
|
|
88
|
-
});
|
|
89
|
-
});
|
|
90
|
-
describe("parseRelativeDateSafe", () => {
|
|
91
|
-
test("returns success result for valid date", () => {
|
|
92
|
-
const result = parseRelativeDateSafe("tomorrow");
|
|
93
|
-
expect(result.success).toBe(true);
|
|
94
|
-
if (result.success === true) {
|
|
95
|
-
const tomorrow = new Date();
|
|
96
|
-
tomorrow.setDate(tomorrow.getDate() + 1);
|
|
97
|
-
expect(result.date.getDate()).toBe(tomorrow.getDate());
|
|
98
|
-
}
|
|
99
|
-
});
|
|
100
|
-
test("returns error for empty input", () => {
|
|
101
|
-
const result = parseRelativeDateSafe("");
|
|
102
|
-
expect(result.success).toBe(false);
|
|
103
|
-
if (result.success === false) {
|
|
104
|
-
expect(result.reason).toBe("empty_input");
|
|
105
|
-
expect(result.error).toContain("empty");
|
|
106
|
-
}
|
|
107
|
-
});
|
|
108
|
-
test("returns error for whitespace-only input", () => {
|
|
109
|
-
const result = parseRelativeDateSafe(" ");
|
|
110
|
-
expect(result.success).toBe(false);
|
|
111
|
-
if (result.success === false) {
|
|
112
|
-
expect(result.reason).toBe("empty_input");
|
|
113
|
-
}
|
|
114
|
-
});
|
|
115
|
-
test("returns error for invalid date format", () => {
|
|
116
|
-
const result = parseRelativeDateSafe("not a date");
|
|
117
|
-
expect(result.success).toBe(false);
|
|
118
|
-
if (result.success === false) {
|
|
119
|
-
expect(result.reason).toBe("invalid_format");
|
|
120
|
-
expect(result.error).toContain("Supported formats");
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
test("returns error for malformed ISO date", () => {
|
|
124
|
-
const result = parseRelativeDateSafe("2025-1-5");
|
|
125
|
-
expect(result.success).toBe(false);
|
|
126
|
-
if (result.success === false) {
|
|
127
|
-
expect(result.reason).toBe("invalid_format");
|
|
128
|
-
expect(result.error).toContain("zero-padded");
|
|
129
|
-
}
|
|
130
|
-
});
|
|
131
|
-
test("returns error for invalid date like Feb 30", () => {
|
|
132
|
-
const result = parseRelativeDateSafe("2025-02-30");
|
|
133
|
-
expect(result.success).toBe(false);
|
|
134
|
-
if (result.success === false) {
|
|
135
|
-
expect(result.reason).toBe("invalid_date");
|
|
136
|
-
expect(result.error).toContain("February 30");
|
|
137
|
-
}
|
|
138
|
-
});
|
|
139
|
-
test("returns error for year out of range", () => {
|
|
140
|
-
const result = parseRelativeDateSafe("1800-01-01");
|
|
141
|
-
expect(result.success).toBe(false);
|
|
142
|
-
if (result.success === false) {
|
|
143
|
-
expect(result.reason).toBe("out_of_range");
|
|
144
|
-
expect(result.error).toContain("1900-2100");
|
|
145
|
-
}
|
|
146
|
-
});
|
|
147
|
-
test("returns error for excessive day offset", () => {
|
|
148
|
-
const result = parseRelativeDateSafe("in 5000 days");
|
|
149
|
-
expect(result.success).toBe(false);
|
|
150
|
-
if (result.success === false) {
|
|
151
|
-
expect(result.reason).toBe("out_of_range");
|
|
152
|
-
expect(result.error).toContain("3650");
|
|
153
|
-
}
|
|
154
|
-
});
|
|
155
|
-
});
|
|
156
|
-
describe("isValidDate", () => {
|
|
157
|
-
test("returns true for valid Date", () => {
|
|
158
|
-
expect(isValidDate(new Date())).toBe(true);
|
|
159
|
-
expect(isValidDate(new Date("2025-01-01"))).toBe(true);
|
|
160
|
-
});
|
|
161
|
-
test("returns false for Invalid Date", () => {
|
|
162
|
-
expect(isValidDate(new Date("invalid"))).toBe(false);
|
|
163
|
-
expect(isValidDate(new Date(NaN))).toBe(false);
|
|
164
|
-
});
|
|
165
|
-
});
|
|
166
|
-
describe("parseDateString", () => {
|
|
167
|
-
test("parses valid date string", () => {
|
|
168
|
-
const result = parseDateString("2025-01-15");
|
|
169
|
-
expect(result).toBeInstanceOf(Date);
|
|
170
|
-
expect(result.getFullYear()).toBe(2025);
|
|
171
|
-
});
|
|
172
|
-
test("throws DateParseError for empty string", () => {
|
|
173
|
-
expect(() => parseDateString("")).toThrow(DateParseError);
|
|
174
|
-
try {
|
|
175
|
-
parseDateString("");
|
|
176
|
-
}
|
|
177
|
-
catch (e) {
|
|
178
|
-
expect(e).toBeInstanceOf(DateParseError);
|
|
179
|
-
expect(e.reason).toBe("empty_input");
|
|
180
|
-
}
|
|
181
|
-
});
|
|
182
|
-
test("throws DateParseError for invalid string", () => {
|
|
183
|
-
expect(() => parseDateString("not a date")).toThrow(DateParseError);
|
|
184
|
-
try {
|
|
185
|
-
parseDateString("not a date");
|
|
186
|
-
}
|
|
187
|
-
catch (e) {
|
|
188
|
-
expect(e).toBeInstanceOf(DateParseError);
|
|
189
|
-
expect(e.reason).toBe("invalid_format");
|
|
190
|
-
expect(e.input).toBe("not a date");
|
|
191
|
-
}
|
|
192
|
-
});
|
|
193
|
-
});
|
|
194
|
-
describe("formatDisplayDate error handling", () => {
|
|
195
|
-
test("throws DateParseError for invalid string", () => {
|
|
196
|
-
expect(() => formatDisplayDate("invalid")).toThrow(DateParseError);
|
|
197
|
-
});
|
|
198
|
-
test("throws DateParseError for Invalid Date object", () => {
|
|
199
|
-
expect(() => formatDisplayDate(new Date("invalid"))).toThrow(DateParseError);
|
|
200
|
-
});
|
|
201
|
-
test("formats valid string date", () => {
|
|
202
|
-
const result = formatDisplayDate("2025-06-15");
|
|
203
|
-
expect(typeof result).toBe("string");
|
|
204
|
-
expect(result).toMatch(/\d+\/\d+\/\d+/);
|
|
205
|
-
});
|
|
206
|
-
});
|
|
207
|
-
describe("formatDate", () => {
|
|
208
|
-
test("formats date as YYYY-MM-DD", () => {
|
|
209
|
-
const date = new Date("2025-06-15T10:30:00");
|
|
210
|
-
expect(formatDate(date)).toBe("2025-06-15");
|
|
211
|
-
});
|
|
212
|
-
});
|
|
213
|
-
describe("isToday", () => {
|
|
214
|
-
test("returns true for today", () => {
|
|
215
|
-
expect(isToday(new Date())).toBe(true);
|
|
216
|
-
});
|
|
217
|
-
test("returns false for tomorrow", () => {
|
|
218
|
-
const tomorrow = new Date();
|
|
219
|
-
tomorrow.setDate(tomorrow.getDate() + 1);
|
|
220
|
-
expect(isToday(tomorrow)).toBe(false);
|
|
221
|
-
});
|
|
222
|
-
test("accepts string input", () => {
|
|
223
|
-
expect(isToday(new Date().toISOString())).toBe(true);
|
|
224
|
-
});
|
|
225
|
-
test("returns false for invalid date string", () => {
|
|
226
|
-
expect(isToday("invalid")).toBe(false);
|
|
227
|
-
});
|
|
228
|
-
test("returns false for Invalid Date object", () => {
|
|
229
|
-
expect(isToday(new Date("invalid"))).toBe(false);
|
|
230
|
-
});
|
|
231
|
-
});
|
|
232
|
-
describe("isPastDue", () => {
|
|
233
|
-
test("returns true for yesterday", () => {
|
|
234
|
-
const yesterday = new Date();
|
|
235
|
-
yesterday.setDate(yesterday.getDate() - 1);
|
|
236
|
-
expect(isPastDue(yesterday)).toBe(true);
|
|
237
|
-
});
|
|
238
|
-
test("returns false for tomorrow", () => {
|
|
239
|
-
const tomorrow = new Date();
|
|
240
|
-
tomorrow.setDate(tomorrow.getDate() + 1);
|
|
241
|
-
expect(isPastDue(tomorrow)).toBe(false);
|
|
242
|
-
});
|
|
243
|
-
test("returns false for invalid date", () => {
|
|
244
|
-
expect(isPastDue("invalid")).toBe(false);
|
|
245
|
-
expect(isPastDue(new Date("invalid"))).toBe(false);
|
|
246
|
-
});
|
|
247
|
-
});
|
|
248
|
-
describe("isWithinDays", () => {
|
|
249
|
-
test("returns true for date within range", () => {
|
|
250
|
-
const inThreeDays = new Date();
|
|
251
|
-
inThreeDays.setDate(inThreeDays.getDate() + 3);
|
|
252
|
-
expect(isWithinDays(inThreeDays, 7)).toBe(true);
|
|
253
|
-
});
|
|
254
|
-
test("returns false for date outside range", () => {
|
|
255
|
-
const inTenDays = new Date();
|
|
256
|
-
inTenDays.setDate(inTenDays.getDate() + 10);
|
|
257
|
-
expect(isWithinDays(inTenDays, 7)).toBe(false);
|
|
258
|
-
});
|
|
259
|
-
test("returns false for past date", () => {
|
|
260
|
-
const yesterday = new Date();
|
|
261
|
-
yesterday.setDate(yesterday.getDate() - 1);
|
|
262
|
-
expect(isWithinDays(yesterday, 7)).toBe(false);
|
|
263
|
-
});
|
|
264
|
-
test("returns false for invalid date", () => {
|
|
265
|
-
expect(isWithinDays("invalid", 7)).toBe(false);
|
|
266
|
-
expect(isWithinDays(new Date("invalid"), 7)).toBe(false);
|
|
267
|
-
});
|
|
268
|
-
test("returns false for invalid days parameter", () => {
|
|
269
|
-
const tomorrow = new Date();
|
|
270
|
-
tomorrow.setDate(tomorrow.getDate() + 1);
|
|
271
|
-
expect(isWithinDays(tomorrow, -1)).toBe(false);
|
|
272
|
-
expect(isWithinDays(tomorrow, NaN)).toBe(false);
|
|
273
|
-
expect(isWithinDays(tomorrow, Infinity)).toBe(false);
|
|
274
|
-
});
|
|
275
|
-
});
|
|
276
|
-
//# sourceMappingURL=date.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"date.test.js","sourceRoot":"","sources":["../../src/utils/date.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EACL,GAAG,EACH,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,OAAO,EACP,SAAS,EACT,YAAY,EACZ,WAAW,EACX,cAAc,GACf,MAAM,WAAW,CAAC;AAEnB,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE;IACnB,IAAI,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACxC,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC;QACrB,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uCAAuC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEzB,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;QAC9C,MAAM,CAAC,UAAU,CAAC,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,CAAC,UAAU,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC1B,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC;QACzB,MAAM,CAAC,MAAO,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACtC,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC;QACzB,MAAM,CAAC,MAAO,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC7B,MAAM,MAAM,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;QAC5B,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,MAAO,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACzC,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;QAC5B,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,MAAO,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC9B,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC7B,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAO,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC9B,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;QAC5B,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,MAAO,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC9B,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QAC1B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,MAAO,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC7C,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QAC1B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,MAAO,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAChC,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,CAAC,MAAO,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa;IACjD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAClC,MAAM,MAAM,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,CAAC,MAAO,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,CAAC,MAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB;QACrD,MAAM,CAAC,MAAO,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAC1C,MAAM,MAAM,GAAG,iBAAiB,CAAC,qBAAqB,CAAC,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,IAAI,CAAC,uCAAuC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;YAC5B,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACzC,MAAM,MAAM,GAAG,qBAAqB,CAAC,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACnD,MAAM,MAAM,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uCAAuC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QACtD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAChD,MAAM,MAAM,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAChD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACtD,MAAM,MAAM,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAChD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC/C,MAAM,MAAM,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAClD,MAAM,MAAM,GAAG,qBAAqB,CAAC,cAAc,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,IAAI,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACpC,MAAM,MAAM,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAC1D,IAAI,CAAC;YACH,eAAe,CAAC,EAAE,CAAC,CAAC;QACtB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;YACzC,MAAM,CAAE,CAAoB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,0CAA0C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACpE,IAAI,CAAC;YACH,eAAe,CAAC,YAAY,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;YACzC,MAAM,CAAE,CAAoB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC5D,MAAM,CAAE,CAAoB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,IAAI,CAAC,0CAA0C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACrC,MAAM,MAAM,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;QAC/C,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,IAAI,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACtC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAC7C,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACvB,IAAI,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACtC,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;QAC5B,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAChC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uCAAuC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uCAAuC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,IAAI,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACtC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC7B,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACtC,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;QAC5B,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,IAAI,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC9C,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;QAC/B,WAAW,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAChD,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC7B,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5C,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACvC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC7B,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,0CAA0C,EAAE,GAAG,EAAE;QACpD,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;QAC5B,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
import type { Task } from "../schemas/task.js";
|
|
2
|
-
/**
|
|
3
|
-
* Maximum allowed hierarchy depth (0-indexed)
|
|
4
|
-
* 0 = root task
|
|
5
|
-
* 1 = subtask
|
|
6
|
-
* 2 = sub-subtask
|
|
7
|
-
* 3 = sub-sub-subtask (maximum)
|
|
8
|
-
*/
|
|
9
|
-
export declare const MAX_HIERARCHY_DEPTH = 3;
|
|
10
|
-
/**
|
|
11
|
-
* Calculates the hierarchy level of a task.
|
|
12
|
-
* Level 0 = root task (no parent)
|
|
13
|
-
* Level 1 = direct subtask
|
|
14
|
-
* Level 2 = sub-subtask
|
|
15
|
-
* etc.
|
|
16
|
-
*
|
|
17
|
-
* @param tasks - Array of all tasks
|
|
18
|
-
* @param taskId - ID of the task to get level for
|
|
19
|
-
* @returns The hierarchy level (0 for root), or -1 if task not found
|
|
20
|
-
*/
|
|
21
|
-
export declare function getTaskLevel(tasks: Task[], taskId: string): number;
|
|
22
|
-
/**
|
|
23
|
-
* Validates whether adding a child task under the given parent
|
|
24
|
-
* would exceed the maximum hierarchy depth.
|
|
25
|
-
*
|
|
26
|
-
* @param tasks - Array of all tasks
|
|
27
|
-
* @param parentId - ID of the proposed parent task
|
|
28
|
-
* @returns true if a child can be added, false if it would exceed max depth
|
|
29
|
-
*/
|
|
30
|
-
export declare function validateHierarchyDepth(tasks: Task[], parentId: string): boolean;
|
|
31
|
-
/**
|
|
32
|
-
* Gets all ancestor task IDs for a given task (from immediate parent to root).
|
|
33
|
-
*
|
|
34
|
-
* @param tasks - Array of all tasks
|
|
35
|
-
* @param taskId - ID of the task
|
|
36
|
-
* @returns Array of ancestor task IDs, ordered from immediate parent to root
|
|
37
|
-
*/
|
|
38
|
-
export declare function getAncestorIds(tasks: Task[], taskId: string): string[];
|
|
39
|
-
/**
|
|
40
|
-
* Gets all descendant task IDs for a given task (children, grandchildren, etc.).
|
|
41
|
-
*
|
|
42
|
-
* @param tasks - Array of all tasks
|
|
43
|
-
* @param taskId - ID of the parent task
|
|
44
|
-
* @returns Array of descendant task IDs
|
|
45
|
-
*/
|
|
46
|
-
export declare function getDescendantIds(tasks: Task[], taskId: string): string[];
|
|
47
|
-
/**
|
|
48
|
-
* Gets direct children of a task.
|
|
49
|
-
*
|
|
50
|
-
* @param tasks - Array of all tasks
|
|
51
|
-
* @param taskId - ID of the parent task
|
|
52
|
-
* @returns Array of direct child tasks
|
|
53
|
-
*/
|
|
54
|
-
export declare function getChildTasks(tasks: Task[], taskId: string): Task[];
|
|
55
|
-
/**
|
|
56
|
-
* Gets the root task of a hierarchy.
|
|
57
|
-
*
|
|
58
|
-
* @param tasks - Array of all tasks
|
|
59
|
-
* @param taskId - ID of any task in the hierarchy
|
|
60
|
-
* @returns The root task, or null if not found
|
|
61
|
-
*/
|
|
62
|
-
export declare function getRootTask(tasks: Task[], taskId: string): Task | null;
|
|
63
|
-
/**
|
|
64
|
-
* Builds a tree structure from flat task list.
|
|
65
|
-
*
|
|
66
|
-
* @param tasks - Array of all tasks
|
|
67
|
-
* @param rootId - Optional root task ID (if not provided, returns all root tasks)
|
|
68
|
-
* @returns Tree structure with children arrays
|
|
69
|
-
*/
|
|
70
|
-
export interface TaskTreeNode {
|
|
71
|
-
task: Task;
|
|
72
|
-
children: TaskTreeNode[];
|
|
73
|
-
}
|
|
74
|
-
export declare function buildTaskTree(tasks: Task[], rootId?: string, maxDepth?: number): TaskTreeNode[];
|
|
75
|
-
/**
|
|
76
|
-
* Result of hierarchy validation.
|
|
77
|
-
*/
|
|
78
|
-
export interface HierarchyValidationResult {
|
|
79
|
-
valid: boolean;
|
|
80
|
-
orphanedReferences: {
|
|
81
|
-
taskId: string;
|
|
82
|
-
parentId: string;
|
|
83
|
-
}[];
|
|
84
|
-
circularReferences: string[];
|
|
85
|
-
maxDepthExceeded: {
|
|
86
|
-
taskId: string;
|
|
87
|
-
depth: number;
|
|
88
|
-
}[];
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Validates the hierarchy integrity of a task list.
|
|
92
|
-
*
|
|
93
|
-
* Checks for:
|
|
94
|
-
* - Orphaned parent references (task references non-existent parent)
|
|
95
|
-
* - Circular references (task is its own ancestor)
|
|
96
|
-
* - Tasks exceeding maximum hierarchy depth
|
|
97
|
-
*
|
|
98
|
-
* @param tasks - Array of all tasks to validate
|
|
99
|
-
* @returns Validation result with details of any issues found
|
|
100
|
-
*/
|
|
101
|
-
export declare function validateHierarchy(tasks: Task[]): HierarchyValidationResult;
|
|
102
|
-
//# sourceMappingURL=hierarchy.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hierarchy.d.ts","sourceRoot":"","sources":["../../src/utils/hierarchy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE/C;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CA2BlE;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,IAAI,EAAE,EACb,QAAQ,EAAE,MAAM,GACf,OAAO,CAUT;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CA0BtE;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAyBxE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,CAEnE;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAiBtE;AAED;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,IAAI,EAAE,EACb,MAAM,CAAC,EAAE,MAAM,EACf,QAAQ,GAAE,MAAgC,GACzC,YAAY,EAAE,CA6ChB;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,OAAO,CAAC;IACf,kBAAkB,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC3D,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,gBAAgB,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACvD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,yBAAyB,CAsC1E"}
|
package/dist/utils/hierarchy.js
DELETED
|
@@ -1,236 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Maximum allowed hierarchy depth (0-indexed)
|
|
3
|
-
* 0 = root task
|
|
4
|
-
* 1 = subtask
|
|
5
|
-
* 2 = sub-subtask
|
|
6
|
-
* 3 = sub-sub-subtask (maximum)
|
|
7
|
-
*/
|
|
8
|
-
export const MAX_HIERARCHY_DEPTH = 3;
|
|
9
|
-
/**
|
|
10
|
-
* Calculates the hierarchy level of a task.
|
|
11
|
-
* Level 0 = root task (no parent)
|
|
12
|
-
* Level 1 = direct subtask
|
|
13
|
-
* Level 2 = sub-subtask
|
|
14
|
-
* etc.
|
|
15
|
-
*
|
|
16
|
-
* @param tasks - Array of all tasks
|
|
17
|
-
* @param taskId - ID of the task to get level for
|
|
18
|
-
* @returns The hierarchy level (0 for root), or -1 if task not found
|
|
19
|
-
*/
|
|
20
|
-
export function getTaskLevel(tasks, taskId) {
|
|
21
|
-
const taskMap = new Map(tasks.map((t) => [t.id, t]));
|
|
22
|
-
const task = taskMap.get(taskId);
|
|
23
|
-
if (!task) {
|
|
24
|
-
return -1;
|
|
25
|
-
}
|
|
26
|
-
let level = 0;
|
|
27
|
-
let currentTask = task;
|
|
28
|
-
while (currentTask.parentId) {
|
|
29
|
-
const parent = taskMap.get(currentTask.parentId);
|
|
30
|
-
if (!parent) {
|
|
31
|
-
console.warn(`[task-mcp] Orphaned parent reference: task "${currentTask.id}" references non-existent parent "${currentTask.parentId}"`);
|
|
32
|
-
break;
|
|
33
|
-
}
|
|
34
|
-
level++;
|
|
35
|
-
currentTask = parent;
|
|
36
|
-
// Safety check to prevent infinite loops
|
|
37
|
-
if (level > MAX_HIERARCHY_DEPTH + 1) {
|
|
38
|
-
break;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
return level;
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Validates whether adding a child task under the given parent
|
|
45
|
-
* would exceed the maximum hierarchy depth.
|
|
46
|
-
*
|
|
47
|
-
* @param tasks - Array of all tasks
|
|
48
|
-
* @param parentId - ID of the proposed parent task
|
|
49
|
-
* @returns true if a child can be added, false if it would exceed max depth
|
|
50
|
-
*/
|
|
51
|
-
export function validateHierarchyDepth(tasks, parentId) {
|
|
52
|
-
const parentLevel = getTaskLevel(tasks, parentId);
|
|
53
|
-
if (parentLevel === -1) {
|
|
54
|
-
return false; // Parent task not found
|
|
55
|
-
}
|
|
56
|
-
// Child would be at parentLevel + 1
|
|
57
|
-
// If parent is at level 3, child would be at level 4 which exceeds max
|
|
58
|
-
return parentLevel < MAX_HIERARCHY_DEPTH;
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Gets all ancestor task IDs for a given task (from immediate parent to root).
|
|
62
|
-
*
|
|
63
|
-
* @param tasks - Array of all tasks
|
|
64
|
-
* @param taskId - ID of the task
|
|
65
|
-
* @returns Array of ancestor task IDs, ordered from immediate parent to root
|
|
66
|
-
*/
|
|
67
|
-
export function getAncestorIds(tasks, taskId) {
|
|
68
|
-
const taskMap = new Map(tasks.map((t) => [t.id, t]));
|
|
69
|
-
const task = taskMap.get(taskId);
|
|
70
|
-
if (!task) {
|
|
71
|
-
return [];
|
|
72
|
-
}
|
|
73
|
-
const ancestors = [];
|
|
74
|
-
let currentTask = task;
|
|
75
|
-
while (currentTask.parentId) {
|
|
76
|
-
ancestors.push(currentTask.parentId);
|
|
77
|
-
const parent = taskMap.get(currentTask.parentId);
|
|
78
|
-
if (!parent) {
|
|
79
|
-
break;
|
|
80
|
-
}
|
|
81
|
-
currentTask = parent;
|
|
82
|
-
// Safety check
|
|
83
|
-
if (ancestors.length > MAX_HIERARCHY_DEPTH + 1) {
|
|
84
|
-
break;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
return ancestors;
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Gets all descendant task IDs for a given task (children, grandchildren, etc.).
|
|
91
|
-
*
|
|
92
|
-
* @param tasks - Array of all tasks
|
|
93
|
-
* @param taskId - ID of the parent task
|
|
94
|
-
* @returns Array of descendant task IDs
|
|
95
|
-
*/
|
|
96
|
-
export function getDescendantIds(tasks, taskId) {
|
|
97
|
-
const descendants = [];
|
|
98
|
-
const childrenMap = new Map();
|
|
99
|
-
// Build parent -> children map
|
|
100
|
-
for (const task of tasks) {
|
|
101
|
-
if (task.parentId) {
|
|
102
|
-
const children = childrenMap.get(task.parentId) || [];
|
|
103
|
-
children.push(task);
|
|
104
|
-
childrenMap.set(task.parentId, children);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
// BFS to collect all descendants
|
|
108
|
-
const queue = [taskId];
|
|
109
|
-
while (queue.length > 0) {
|
|
110
|
-
const currentId = queue.shift();
|
|
111
|
-
const children = childrenMap.get(currentId) || [];
|
|
112
|
-
for (const child of children) {
|
|
113
|
-
descendants.push(child.id);
|
|
114
|
-
queue.push(child.id);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
return descendants;
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* Gets direct children of a task.
|
|
121
|
-
*
|
|
122
|
-
* @param tasks - Array of all tasks
|
|
123
|
-
* @param taskId - ID of the parent task
|
|
124
|
-
* @returns Array of direct child tasks
|
|
125
|
-
*/
|
|
126
|
-
export function getChildTasks(tasks, taskId) {
|
|
127
|
-
return tasks.filter((t) => t.parentId === taskId);
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Gets the root task of a hierarchy.
|
|
131
|
-
*
|
|
132
|
-
* @param tasks - Array of all tasks
|
|
133
|
-
* @param taskId - ID of any task in the hierarchy
|
|
134
|
-
* @returns The root task, or null if not found
|
|
135
|
-
*/
|
|
136
|
-
export function getRootTask(tasks, taskId) {
|
|
137
|
-
const taskMap = new Map(tasks.map((t) => [t.id, t]));
|
|
138
|
-
let currentTask = taskMap.get(taskId);
|
|
139
|
-
if (!currentTask) {
|
|
140
|
-
return null;
|
|
141
|
-
}
|
|
142
|
-
while (currentTask.parentId) {
|
|
143
|
-
const parent = taskMap.get(currentTask.parentId);
|
|
144
|
-
if (!parent) {
|
|
145
|
-
break;
|
|
146
|
-
}
|
|
147
|
-
currentTask = parent;
|
|
148
|
-
}
|
|
149
|
-
return currentTask;
|
|
150
|
-
}
|
|
151
|
-
export function buildTaskTree(tasks, rootId, maxDepth = MAX_HIERARCHY_DEPTH + 1) {
|
|
152
|
-
const taskMap = new Map(tasks.map((t) => [t.id, t]));
|
|
153
|
-
const childrenMap = new Map();
|
|
154
|
-
// Build parent -> children map
|
|
155
|
-
for (const task of tasks) {
|
|
156
|
-
if (task.parentId) {
|
|
157
|
-
const children = childrenMap.get(task.parentId) || [];
|
|
158
|
-
children.push(task);
|
|
159
|
-
childrenMap.set(task.parentId, children);
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
function buildNode(task, depth, visited) {
|
|
163
|
-
// Guard against circular references
|
|
164
|
-
if (visited.has(task.id)) {
|
|
165
|
-
return { task, children: [] };
|
|
166
|
-
}
|
|
167
|
-
// Guard against exceeding max depth
|
|
168
|
-
if (depth >= maxDepth) {
|
|
169
|
-
return { task, children: [] };
|
|
170
|
-
}
|
|
171
|
-
const newVisited = new Set(visited);
|
|
172
|
-
newVisited.add(task.id);
|
|
173
|
-
const children = childrenMap.get(task.id) || [];
|
|
174
|
-
return {
|
|
175
|
-
task,
|
|
176
|
-
children: children.map((child) => buildNode(child, depth + 1, newVisited)),
|
|
177
|
-
};
|
|
178
|
-
}
|
|
179
|
-
if (rootId) {
|
|
180
|
-
const rootTask = taskMap.get(rootId);
|
|
181
|
-
if (!rootTask) {
|
|
182
|
-
return [];
|
|
183
|
-
}
|
|
184
|
-
return [buildNode(rootTask, 0, new Set())];
|
|
185
|
-
}
|
|
186
|
-
// Return all root tasks (no parent)
|
|
187
|
-
const rootTasks = tasks.filter((t) => !t.parentId);
|
|
188
|
-
return rootTasks.map((task) => buildNode(task, 0, new Set()));
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* Validates the hierarchy integrity of a task list.
|
|
192
|
-
*
|
|
193
|
-
* Checks for:
|
|
194
|
-
* - Orphaned parent references (task references non-existent parent)
|
|
195
|
-
* - Circular references (task is its own ancestor)
|
|
196
|
-
* - Tasks exceeding maximum hierarchy depth
|
|
197
|
-
*
|
|
198
|
-
* @param tasks - Array of all tasks to validate
|
|
199
|
-
* @returns Validation result with details of any issues found
|
|
200
|
-
*/
|
|
201
|
-
export function validateHierarchy(tasks) {
|
|
202
|
-
const taskMap = new Map(tasks.map((t) => [t.id, t]));
|
|
203
|
-
const result = {
|
|
204
|
-
valid: true,
|
|
205
|
-
orphanedReferences: [],
|
|
206
|
-
circularReferences: [],
|
|
207
|
-
maxDepthExceeded: [],
|
|
208
|
-
};
|
|
209
|
-
for (const task of tasks) {
|
|
210
|
-
// Check for orphaned parent references
|
|
211
|
-
if (task.parentId && !taskMap.has(task.parentId)) {
|
|
212
|
-
result.orphanedReferences.push({ taskId: task.id, parentId: task.parentId });
|
|
213
|
-
result.valid = false;
|
|
214
|
-
}
|
|
215
|
-
// Check for circular references
|
|
216
|
-
const visited = new Set();
|
|
217
|
-
let current = task;
|
|
218
|
-
while (current?.parentId) {
|
|
219
|
-
if (visited.has(current.id)) {
|
|
220
|
-
result.circularReferences.push(task.id);
|
|
221
|
-
result.valid = false;
|
|
222
|
-
break;
|
|
223
|
-
}
|
|
224
|
-
visited.add(current.id);
|
|
225
|
-
current = taskMap.get(current.parentId);
|
|
226
|
-
}
|
|
227
|
-
// Check for max depth exceeded
|
|
228
|
-
const level = getTaskLevel(tasks, task.id);
|
|
229
|
-
if (level > MAX_HIERARCHY_DEPTH) {
|
|
230
|
-
result.maxDepthExceeded.push({ taskId: task.id, depth: level });
|
|
231
|
-
result.valid = false;
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
return result;
|
|
235
|
-
}
|
|
236
|
-
//# sourceMappingURL=hierarchy.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hierarchy.js","sourceRoot":"","sources":["../../src/utils/hierarchy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hierarchy.test.d.ts","sourceRoot":"","sources":["../../src/utils/hierarchy.test.ts"],"names":[],"mappings":""}
|