Skip to content

Commit 10a38b1

Browse files
committed
plugin: refactor query schema and parsing
So we are generic over the query schema and we can extend or add new query schemas
1 parent bc3e2be commit 10a38b1

23 files changed

+295
-282
lines changed

plugin/src/data/transformations/grouping.test.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import type { Project } from "@/api/domain/project";
77
import type { Section } from "@/api/domain/section";
88
import type { Task } from "@/data/task";
99
import { type GroupedTasks, groupBy } from "@/data/transformations/grouping";
10-
import { GroupVariant } from "@/query/query";
1110

1211
vi.mock("../../infra/time.ts", () => {
1312
return {
@@ -185,7 +184,7 @@ describe("group by priority", () => {
185184

186185
for (const tc of testcases) {
187186
it(tc.description, () => {
188-
const groups = groupBy(tc.input, GroupVariant.Priority);
187+
const groups = groupBy(tc.input, "priority");
189188
expect(groups).toStrictEqual(tc.expected);
190189
});
191190
}
@@ -241,7 +240,7 @@ describe("group by project", () => {
241240

242241
for (const tc of testcases) {
243242
it(tc.description, () => {
244-
const groups = groupBy(tc.input, GroupVariant.Project);
243+
const groups = groupBy(tc.input, "project");
245244
expect(groups).toStrictEqual(tc.expected);
246245
});
247246
}
@@ -328,7 +327,7 @@ describe("group by section", () => {
328327

329328
for (const tc of testcases) {
330329
it(tc.description, () => {
331-
const groups = groupBy(tc.input, GroupVariant.Section);
330+
const groups = groupBy(tc.input, "section");
332331
expect(groups).toStrictEqual(tc.expected);
333332
});
334333
}
@@ -498,7 +497,7 @@ describe("group by date", () => {
498497

499498
for (const tc of testcases) {
500499
it(tc.description, () => {
501-
const groups = groupBy(tc.input, GroupVariant.Date);
500+
const groups = groupBy(tc.input, "due");
502501
expect(groups).toStrictEqual(tc.expected);
503502
});
504503
}
@@ -614,7 +613,7 @@ describe("group by label", () => {
614613

615614
for (const tc of testcases) {
616615
it(tc.description, () => {
617-
const groups = groupBy(tc.input, GroupVariant.Label);
616+
const groups = groupBy(tc.input, "label");
618617
expect(groups).toStrictEqual(tc.expected);
619618
});
620619
}

plugin/src/data/transformations/grouping.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,24 @@ import type { Priority } from "@/api/domain/task";
44
import { DueDate } from "@/data/dueDate";
55
import type { Task } from "@/data/task";
66
import { t } from "@/i18n";
7-
import { GroupVariant } from "@/query/query";
7+
import type { GroupingKey } from "@/query/schema/grouping";
88

99
export type GroupedTasks = {
1010
header: string;
1111
tasks: Task[];
1212
};
1313

14-
export function groupBy(tasks: Task[], groupBy: GroupVariant): GroupedTasks[] {
14+
export function groupBy(tasks: Task[], groupBy: GroupingKey): GroupedTasks[] {
1515
switch (groupBy) {
16-
case GroupVariant.Priority:
16+
case "priority":
1717
return groupByPriority(tasks);
18-
case GroupVariant.Project:
18+
case "project":
1919
return groupByProject(tasks);
20-
case GroupVariant.Section:
20+
case "section":
2121
return groupBySection(tasks);
22-
case GroupVariant.Date:
22+
case "due":
2323
return groupByDate(tasks);
24-
case GroupVariant.Label:
24+
case "label":
2525
return groupByLabel(tasks);
2626
default:
2727
throw new Error(`Cannot group by ${groupBy}`);

plugin/src/data/transformations/sorting.test.ts

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { describe, expect, it } from "vitest";
22

33
import type { Task } from "@/data/task";
44
import { sortTasks } from "@/data/transformations/sorting";
5-
import { SortingVariant } from "@/query/query";
5+
import type { SortingKey } from "@/query/schema/sorting";
66

77
function makeTask(id: string, opts?: Partial<Task>): Task {
88
return {
@@ -35,15 +35,15 @@ describe("sortTasks", () => {
3535
type Testcase = {
3636
description: string;
3737
input: Task[];
38-
sortingOpts: SortingVariant[];
38+
sortingOpts: SortingKey[];
3939
expectedOutput: Task[];
4040
};
4141

4242
const testcases: Testcase[] = [
4343
{
4444
description: "should not error for empty input",
4545
input: [],
46-
sortingOpts: [SortingVariant.Priority],
46+
sortingOpts: ["priority"],
4747
expectedOutput: [],
4848
},
4949
{
@@ -59,7 +59,7 @@ describe("sortTasks", () => {
5959
priority: 4,
6060
}),
6161
],
62-
sortingOpts: [SortingVariant.Priority],
62+
sortingOpts: ["priority"],
6363
expectedOutput: [
6464
makeTask("c", {
6565
priority: 4,
@@ -85,7 +85,7 @@ describe("sortTasks", () => {
8585
priority: 4,
8686
}),
8787
],
88-
sortingOpts: [SortingVariant.PriorityAscending],
88+
sortingOpts: ["priorityAscending"],
8989
expectedOutput: [
9090
makeTask("b", {
9191
priority: 1,
@@ -111,7 +111,7 @@ describe("sortTasks", () => {
111111
order: 1,
112112
}),
113113
],
114-
sortingOpts: [SortingVariant.Order],
114+
sortingOpts: ["order"],
115115
expectedOutput: [
116116
makeTask("c", {
117117
order: 1,
@@ -153,7 +153,7 @@ describe("sortTasks", () => {
153153
},
154154
}),
155155
],
156-
sortingOpts: [SortingVariant.Date],
156+
sortingOpts: ["dateAscending"],
157157
expectedOutput: [
158158
makeTask("e", {
159159
due: {
@@ -211,7 +211,7 @@ describe("sortTasks", () => {
211211
}),
212212
makeTask("a"),
213213
],
214-
sortingOpts: [SortingVariant.DateDescending],
214+
sortingOpts: ["dateDescending"],
215215
expectedOutput: [
216216
makeTask("a"),
217217
makeTask("b", {
@@ -253,7 +253,7 @@ describe("sortTasks", () => {
253253
createdAt: "2020-03-02T12:00:00Z",
254254
}),
255255
],
256-
sortingOpts: [SortingVariant.DateAdded],
256+
sortingOpts: ["dateAddedAscending"],
257257
expectedOutput: [
258258
makeTask("b", {
259259
createdAt: "2020-03-02T11:00:00Z",
@@ -279,7 +279,7 @@ describe("sortTasks", () => {
279279
createdAt: "2020-03-02T12:00:00Z",
280280
}),
281281
],
282-
sortingOpts: [SortingVariant.DateAddedDescending],
282+
sortingOpts: ["dateAddedDescending"],
283283
expectedOutput: [
284284
makeTask("b", {
285285
createdAt: "2020-03-03T13:00:00Z",
@@ -317,7 +317,7 @@ describe("sortTasks", () => {
317317
},
318318
}),
319319
],
320-
sortingOpts: [SortingVariant.Priority, SortingVariant.Date],
320+
sortingOpts: ["priority", "dateAscending"],
321321
expectedOutput: [
322322
makeTask("c", {
323323
priority: 3,
@@ -350,7 +350,7 @@ describe("sortTasks", () => {
350350
makeTask("c", { content: "Banana" }),
351351
makeTask("d", { content: "cherry" }),
352352
],
353-
sortingOpts: [SortingVariant.Alphabetical],
353+
sortingOpts: ["alphabeticalAscending"],
354354
expectedOutput: [
355355
makeTask("b", { content: "apple" }),
356356
makeTask("c", { content: "Banana" }),
@@ -365,7 +365,7 @@ describe("sortTasks", () => {
365365
makeTask("b", { content: "Banana" }),
366366
makeTask("c", { content: "zebra" }),
367367
],
368-
sortingOpts: [SortingVariant.AlphabeticalDescending],
368+
sortingOpts: ["alphabeticalDescending"],
369369
expectedOutput: [
370370
makeTask("c", { content: "zebra" }),
371371
makeTask("b", { content: "Banana" }),
@@ -380,7 +380,7 @@ describe("sortTasks", () => {
380380
makeTask("c", { content: "Apple" }),
381381
makeTask("d", { content: "BANANA" }),
382382
],
383-
sortingOpts: [SortingVariant.Alphabetical],
383+
sortingOpts: ["alphabeticalAscending"],
384384
expectedOutput: [
385385
makeTask("a", { content: "APPLE" }),
386386
makeTask("c", { content: "Apple" }),
@@ -396,7 +396,7 @@ describe("sortTasks", () => {
396396
makeTask("c", { content: "@mention task" }),
397397
makeTask("d", { content: "#hashtag task" }),
398398
],
399-
sortingOpts: [SortingVariant.Alphabetical],
399+
sortingOpts: ["alphabeticalAscending"],
400400
expectedOutput: [
401401
makeTask("c", { content: "@mention task" }),
402402
makeTask("d", { content: "#hashtag task" }),
@@ -411,7 +411,7 @@ describe("sortTasks", () => {
411411
makeTask("b", { content: "apple" }),
412412
makeTask("c", { content: "" }),
413413
],
414-
sortingOpts: [SortingVariant.Alphabetical],
414+
sortingOpts: ["alphabeticalAscending"],
415415
expectedOutput: [
416416
makeTask("a", { content: "" }),
417417
makeTask("c", { content: "" }),
@@ -425,7 +425,7 @@ describe("sortTasks", () => {
425425
makeTask("b", { content: "Task A", priority: 2 }),
426426
makeTask("c", { content: "Task C", priority: 3 }),
427427
],
428-
sortingOpts: [SortingVariant.Priority, SortingVariant.Alphabetical],
428+
sortingOpts: ["priority", "alphabeticalAscending"],
429429
expectedOutput: [
430430
makeTask("c", { content: "Task C", priority: 3 }),
431431
makeTask("b", { content: "Task A", priority: 2 }),

plugin/src/data/transformations/sorting.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ import { parseAbsoluteToLocal } from "@internationalized/date";
22

33
import type { Task } from "@/data//task";
44
import { DueDate } from "@/data/dueDate";
5-
import { SortingVariant } from "@/query/query";
5+
import type { SortingKey } from "@/query/schema/sorting";
66

7-
export function sortTasks<T extends Task>(tasks: T[], sort: SortingVariant[]) {
7+
export function sortTasks<T extends Task>(tasks: T[], sort: SortingKey[]) {
88
tasks.sort((first, second) => {
99
for (const sorting of sort) {
1010
const cmp = compareTask(first, second, sorting);
@@ -22,26 +22,26 @@ export function sortTasks<T extends Task>(tasks: T[], sort: SortingVariant[]) {
2222
// Result of "LT zero" means that self is before other,
2323
// Result of '0' means that they are equal
2424
// Result of "GT zero" means that self is after other
25-
function compareTask<T extends Task>(self: T, other: T, sorting: SortingVariant): number {
25+
function compareTask<T extends Task>(self: T, other: T, sorting: SortingKey): number {
2626
switch (sorting) {
27-
case SortingVariant.Priority:
27+
case "priority":
2828
// Note that priority in the API is reversed to that of in the app.
2929
return other.priority - self.priority;
30-
case SortingVariant.PriorityAscending:
30+
case "priorityAscending":
3131
return self.priority - other.priority;
32-
case SortingVariant.Date:
32+
case "dateAscending":
3333
return compareTaskDate(self, other);
34-
case SortingVariant.DateDescending:
34+
case "dateDescending":
3535
return -compareTaskDate(self, other);
36-
case SortingVariant.Order:
36+
case "order":
3737
return self.order - other.order;
38-
case SortingVariant.DateAdded:
38+
case "dateAddedAscending":
3939
return compareTaskDateAdded(self, other);
40-
case SortingVariant.DateAddedDescending:
40+
case "dateAddedDescending":
4141
return -compareTaskDateAdded(self, other);
42-
case SortingVariant.Alphabetical:
42+
case "alphabeticalAscending":
4343
return compareTaskAlphabetical(self, other);
44-
case SortingVariant.AlphabeticalDescending:
44+
case "alphabeticalDescending":
4545
return -compareTaskAlphabetical(self, other);
4646
default:
4747
throw new Error(`Unexpected sorting type: '${sorting}'`);

plugin/src/query/injector.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import type TodoistPlugin from "@/index";
88
import { debug } from "@/log";
99
import { parseQuery } from "@/query/parser";
1010
import { applyReplacements } from "@/query/replacements";
11+
import { taskQueryDefinition } from "@/query/schema/tasks";
1112
import {
1213
type MarkdownEditButton,
1314
MarkdownEditButtonContext,
@@ -27,7 +28,7 @@ export class QueryInjector {
2728
let child: MarkdownRenderChild;
2829

2930
try {
30-
const [query, warnings] = parseQuery(source);
31+
const [query, warnings] = parseQuery(source, taskQueryDefinition);
3132
applyReplacements(query, ctx);
3233

3334
debug({

0 commit comments

Comments
 (0)