@doist/todoist-cli 1.1.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.
Files changed (170) hide show
  1. package/README.md +76 -0
  2. package/dist/commands/activity.d.ts +3 -0
  3. package/dist/commands/activity.d.ts.map +1 -0
  4. package/dist/commands/activity.js +193 -0
  5. package/dist/commands/activity.js.map +1 -0
  6. package/dist/commands/add.d.ts +3 -0
  7. package/dist/commands/add.d.ts.map +1 -0
  8. package/dist/commands/add.js +28 -0
  9. package/dist/commands/add.js.map +1 -0
  10. package/dist/commands/auth.d.ts +3 -0
  11. package/dist/commands/auth.d.ts.map +1 -0
  12. package/dist/commands/auth.js +62 -0
  13. package/dist/commands/auth.js.map +1 -0
  14. package/dist/commands/comment.d.ts +3 -0
  15. package/dist/commands/comment.d.ts.map +1 -0
  16. package/dist/commands/comment.js +251 -0
  17. package/dist/commands/comment.js.map +1 -0
  18. package/dist/commands/completed.d.ts +3 -0
  19. package/dist/commands/completed.d.ts.map +1 -0
  20. package/dist/commands/completed.js +74 -0
  21. package/dist/commands/completed.js.map +1 -0
  22. package/dist/commands/filter.d.ts +3 -0
  23. package/dist/commands/filter.d.ts.map +1 -0
  24. package/dist/commands/filter.js +249 -0
  25. package/dist/commands/filter.js.map +1 -0
  26. package/dist/commands/inbox.d.ts +3 -0
  27. package/dist/commands/inbox.d.ts.map +1 -0
  28. package/dist/commands/inbox.js +23 -0
  29. package/dist/commands/inbox.js.map +1 -0
  30. package/dist/commands/label.d.ts +3 -0
  31. package/dist/commands/label.d.ts.map +1 -0
  32. package/dist/commands/label.js +196 -0
  33. package/dist/commands/label.js.map +1 -0
  34. package/dist/commands/notification.d.ts +3 -0
  35. package/dist/commands/notification.d.ts.map +1 -0
  36. package/dist/commands/notification.js +274 -0
  37. package/dist/commands/notification.js.map +1 -0
  38. package/dist/commands/project.d.ts +3 -0
  39. package/dist/commands/project.d.ts.map +1 -0
  40. package/dist/commands/project.js +364 -0
  41. package/dist/commands/project.js.map +1 -0
  42. package/dist/commands/reminder.d.ts +3 -0
  43. package/dist/commands/reminder.d.ts.map +1 -0
  44. package/dist/commands/reminder.js +225 -0
  45. package/dist/commands/reminder.js.map +1 -0
  46. package/dist/commands/section.d.ts +3 -0
  47. package/dist/commands/section.d.ts.map +1 -0
  48. package/dist/commands/section.js +138 -0
  49. package/dist/commands/section.js.map +1 -0
  50. package/dist/commands/settings.d.ts +3 -0
  51. package/dist/commands/settings.d.ts.map +1 -0
  52. package/dist/commands/settings.js +250 -0
  53. package/dist/commands/settings.js.map +1 -0
  54. package/dist/commands/stats.d.ts +3 -0
  55. package/dist/commands/stats.d.ts.map +1 -0
  56. package/dist/commands/stats.js +151 -0
  57. package/dist/commands/stats.js.map +1 -0
  58. package/dist/commands/task.d.ts +3 -0
  59. package/dist/commands/task.d.ts.map +1 -0
  60. package/dist/commands/task.js +363 -0
  61. package/dist/commands/task.js.map +1 -0
  62. package/dist/commands/today.d.ts +3 -0
  63. package/dist/commands/today.d.ts.map +1 -0
  64. package/dist/commands/today.js +97 -0
  65. package/dist/commands/today.js.map +1 -0
  66. package/dist/commands/upcoming.d.ts +3 -0
  67. package/dist/commands/upcoming.d.ts.map +1 -0
  68. package/dist/commands/upcoming.js +121 -0
  69. package/dist/commands/upcoming.js.map +1 -0
  70. package/dist/commands/workspace.d.ts +3 -0
  71. package/dist/commands/workspace.d.ts.map +1 -0
  72. package/dist/commands/workspace.js +289 -0
  73. package/dist/commands/workspace.js.map +1 -0
  74. package/dist/index.d.ts +3 -0
  75. package/dist/index.d.ts.map +1 -0
  76. package/dist/index.js +53 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/lib/api/core.d.ts +40 -0
  79. package/dist/lib/api/core.d.ts.map +1 -0
  80. package/dist/lib/api/core.js +142 -0
  81. package/dist/lib/api/core.js.map +1 -0
  82. package/dist/lib/api/filters.d.ts +26 -0
  83. package/dist/lib/api/filters.d.ts.map +1 -0
  84. package/dist/lib/api/filters.js +86 -0
  85. package/dist/lib/api/filters.js.map +1 -0
  86. package/dist/lib/api/notifications.d.ts +33 -0
  87. package/dist/lib/api/notifications.d.ts.map +1 -0
  88. package/dist/lib/api/notifications.js +112 -0
  89. package/dist/lib/api/notifications.js.map +1 -0
  90. package/dist/lib/api/reminders.d.ts +30 -0
  91. package/dist/lib/api/reminders.d.ts.map +1 -0
  92. package/dist/lib/api/reminders.js +79 -0
  93. package/dist/lib/api/reminders.js.map +1 -0
  94. package/dist/lib/api/stats.d.ts +41 -0
  95. package/dist/lib/api/stats.d.ts.map +1 -0
  96. package/dist/lib/api/stats.js +79 -0
  97. package/dist/lib/api/stats.js.map +1 -0
  98. package/dist/lib/api/uploads.d.ts +10 -0
  99. package/dist/lib/api/uploads.d.ts.map +1 -0
  100. package/dist/lib/api/uploads.js +31 -0
  101. package/dist/lib/api/uploads.js.map +1 -0
  102. package/dist/lib/api/user-settings.d.ts +33 -0
  103. package/dist/lib/api/user-settings.d.ts.map +1 -0
  104. package/dist/lib/api/user-settings.js +90 -0
  105. package/dist/lib/api/user-settings.js.map +1 -0
  106. package/dist/lib/api/workspaces.d.ts +23 -0
  107. package/dist/lib/api/workspaces.d.ts.map +1 -0
  108. package/dist/lib/api/workspaces.js +67 -0
  109. package/dist/lib/api/workspaces.js.map +1 -0
  110. package/dist/lib/auth.d.ts +4 -0
  111. package/dist/lib/auth.d.ts.map +1 -0
  112. package/dist/lib/auth.js +66 -0
  113. package/dist/lib/auth.js.map +1 -0
  114. package/dist/lib/browser.d.ts +2 -0
  115. package/dist/lib/browser.d.ts.map +1 -0
  116. package/dist/lib/browser.js +6 -0
  117. package/dist/lib/browser.js.map +1 -0
  118. package/dist/lib/collaborators.d.ts +29 -0
  119. package/dist/lib/collaborators.d.ts.map +1 -0
  120. package/dist/lib/collaborators.js +184 -0
  121. package/dist/lib/collaborators.js.map +1 -0
  122. package/dist/lib/dates.d.ts +3 -0
  123. package/dist/lib/dates.d.ts.map +1 -0
  124. package/dist/lib/dates.js +20 -0
  125. package/dist/lib/dates.js.map +1 -0
  126. package/dist/lib/duration.d.ts +14 -0
  127. package/dist/lib/duration.d.ts.map +1 -0
  128. package/dist/lib/duration.js +58 -0
  129. package/dist/lib/duration.js.map +1 -0
  130. package/dist/lib/markdown.d.ts +2 -0
  131. package/dist/lib/markdown.d.ts.map +1 -0
  132. package/dist/lib/markdown.js +14 -0
  133. package/dist/lib/markdown.js.map +1 -0
  134. package/dist/lib/oauth-server.d.ts +6 -0
  135. package/dist/lib/oauth-server.d.ts.map +1 -0
  136. package/dist/lib/oauth-server.js +141 -0
  137. package/dist/lib/oauth-server.js.map +1 -0
  138. package/dist/lib/oauth.d.ts +3 -0
  139. package/dist/lib/oauth.d.ts.map +1 -0
  140. package/dist/lib/oauth.js +38 -0
  141. package/dist/lib/oauth.js.map +1 -0
  142. package/dist/lib/output.d.ts +36 -0
  143. package/dist/lib/output.d.ts.map +1 -0
  144. package/dist/lib/output.js +293 -0
  145. package/dist/lib/output.js.map +1 -0
  146. package/dist/lib/pagination.d.ts +23 -0
  147. package/dist/lib/pagination.d.ts.map +1 -0
  148. package/dist/lib/pagination.js +26 -0
  149. package/dist/lib/pagination.js.map +1 -0
  150. package/dist/lib/pkce.d.ts +4 -0
  151. package/dist/lib/pkce.d.ts.map +1 -0
  152. package/dist/lib/pkce.js +19 -0
  153. package/dist/lib/pkce.js.map +1 -0
  154. package/dist/lib/refs.d.ts +13 -0
  155. package/dist/lib/refs.d.ts.map +1 -0
  156. package/dist/lib/refs.js +117 -0
  157. package/dist/lib/refs.js.map +1 -0
  158. package/dist/lib/spinner.d.ts +20 -0
  159. package/dist/lib/spinner.d.ts.map +1 -0
  160. package/dist/lib/spinner.js +70 -0
  161. package/dist/lib/spinner.js.map +1 -0
  162. package/dist/lib/task-list.d.ts +28 -0
  163. package/dist/lib/task-list.d.ts.map +1 -0
  164. package/dist/lib/task-list.js +234 -0
  165. package/dist/lib/task-list.js.map +1 -0
  166. package/dist/lib/urls.d.ts +8 -0
  167. package/dist/lib/urls.d.ts.map +1 -0
  168. package/dist/lib/urls.js +26 -0
  169. package/dist/lib/urls.js.map +1 -0
  170. package/package.json +66 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/lib/pagination.ts"],"names":[],"mappings":"AAgBA,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC1B,SAAuB,EACvB,OAAwB;IAExB,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,GAAG,EAAE,WAAW,EAAE,GAAG,OAAO,CAAA;IACrD,MAAM,GAAG,GAAQ,EAAE,CAAA;IACnB,IAAI,MAAM,GAAkB,WAAW,IAAI,IAAI,CAAA;IAE/C,OAAO,GAAG,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,KAAK,GAAG,GAAG,CAAC,MAAM,CAAA;QACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QAE7C,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QAClD,GAAG,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAA;QAC7B,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAA;QAE5B,IAAI,CAAC,MAAM;YAAE,MAAK;IACtB,CAAC;IAED,OAAO;QACH,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;QAC5B,UAAU,EAAE,MAAM;KACrB,CAAA;AACL,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IAClB,KAAK,EAAE,GAAG;IACV,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,GAAG;IACb,MAAM,EAAE,GAAG;IACX,QAAQ,EAAE,EAAE;CACN,CAAA"}
@@ -0,0 +1,4 @@
1
+ export declare function generateCodeVerifier(): string;
2
+ export declare function generateCodeChallenge(verifier: string): string;
3
+ export declare function generateState(): string;
4
+ //# sourceMappingURL=pkce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkce.d.ts","sourceRoot":"","sources":["../../src/lib/pkce.ts"],"names":[],"mappings":"AAKA,wBAAgB,oBAAoB,IAAI,MAAM,CAO7C;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG9D;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
@@ -0,0 +1,19 @@
1
+ import { createHash, randomBytes } from 'node:crypto';
2
+ const VERIFIER_CHARSET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~';
3
+ const VERIFIER_LENGTH = 64;
4
+ export function generateCodeVerifier() {
5
+ const bytes = randomBytes(VERIFIER_LENGTH);
6
+ let verifier = '';
7
+ for (let i = 0; i < VERIFIER_LENGTH; i++) {
8
+ verifier += VERIFIER_CHARSET[bytes[i] % VERIFIER_CHARSET.length];
9
+ }
10
+ return verifier;
11
+ }
12
+ export function generateCodeChallenge(verifier) {
13
+ const hash = createHash('sha256').update(verifier).digest();
14
+ return hash.toString('base64url');
15
+ }
16
+ export function generateState() {
17
+ return randomBytes(16).toString('hex');
18
+ }
19
+ //# sourceMappingURL=pkce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkce.js","sourceRoot":"","sources":["../../src/lib/pkce.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAErD,MAAM,gBAAgB,GAAG,oEAAoE,CAAA;AAC7F,MAAM,eAAe,GAAG,EAAE,CAAA;AAE1B,MAAM,UAAU,oBAAoB;IAChC,MAAM,KAAK,GAAG,WAAW,CAAC,eAAe,CAAC,CAAA;IAC1C,IAAI,QAAQ,GAAG,EAAE,CAAA;IACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,QAAQ,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAA;IACpE,CAAC;IACD,OAAO,QAAQ,CAAA;AACnB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,QAAgB;IAClD,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAA;IAC3D,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;AACrC,CAAC;AAED,MAAM,UAAU,aAAa;IACzB,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;AAC1C,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { TodoistApi } from '@doist/todoist-api-typescript';
2
+ import type { Project, Task } from './api/core.js';
3
+ import { type Workspace } from './api/workspaces.js';
4
+ export declare function isIdRef(ref: string): boolean;
5
+ export declare function extractId(ref: string): string;
6
+ export declare function requireIdRef(ref: string, entityName: string): string;
7
+ export declare function resolveTaskRef(api: TodoistApi, ref: string): Promise<Task>;
8
+ export declare function resolveProjectRef(api: TodoistApi, ref: string): Promise<Project>;
9
+ export declare function resolveProjectId(api: TodoistApi, ref: string): Promise<string>;
10
+ export declare function resolveSectionId(api: TodoistApi, ref: string, projectId: string): Promise<string>;
11
+ export declare function resolveParentTaskId(api: TodoistApi, ref: string, projectId: string, sectionId?: string): Promise<string>;
12
+ export declare function resolveWorkspaceRef(ref: string): Promise<Workspace>;
13
+ //# sourceMappingURL=refs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refs.d.ts","sourceRoot":"","sources":["../../src/lib/refs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAA;AAC1D,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAGrE,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE5C;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CASpE;AAoCD,wBAAsB,cAAc,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQhF;AAED,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQtF;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGpF;AAED,wBAAsB,gBAAgB,CAClC,GAAG,EAAE,UAAU,EACf,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CAkCjB;AAED,wBAAsB,mBAAmB,CACrC,GAAG,EAAE,UAAU,EACf,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,CA0CjB;AAED,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CA6BzE"}
@@ -0,0 +1,117 @@
1
+ import { fetchWorkspaces } from './api/workspaces.js';
2
+ import { formatError } from './output.js';
3
+ export function isIdRef(ref) {
4
+ return ref.startsWith('id:');
5
+ }
6
+ export function extractId(ref) {
7
+ return ref.slice(3);
8
+ }
9
+ export function requireIdRef(ref, entityName) {
10
+ if (!isIdRef(ref)) {
11
+ throw new Error(formatError('INVALID_REF', `Invalid ${entityName} reference "${ref}".`, [
12
+ `Use id:xxx format (e.g., id:${ref})`,
13
+ ]));
14
+ }
15
+ return extractId(ref);
16
+ }
17
+ async function resolveRef(ref, fetchById, fetchAll, getName, entityType) {
18
+ if (isIdRef(ref)) {
19
+ return fetchById(extractId(ref));
20
+ }
21
+ const { results } = await fetchAll();
22
+ const lower = ref.toLowerCase();
23
+ const exact = results.find((item) => getName(item).toLowerCase() === lower);
24
+ if (exact)
25
+ return exact;
26
+ const partial = results.filter((item) => getName(item).toLowerCase().includes(lower));
27
+ if (partial.length === 1)
28
+ return partial[0];
29
+ if (partial.length > 1) {
30
+ throw new Error(formatError(`AMBIGUOUS_${entityType.toUpperCase()}`, `Multiple ${entityType}s match "${ref}":`, partial.slice(0, 5).map((item) => `"${getName(item)}" (id:${item.id})`)));
31
+ }
32
+ throw new Error(formatError(`${entityType.toUpperCase()}_NOT_FOUND`, `${entityType} "${ref}" not found.`));
33
+ }
34
+ export async function resolveTaskRef(api, ref) {
35
+ return resolveRef(ref, (id) => api.getTask(id), () => api.getTasks(), (t) => t.content, 'task');
36
+ }
37
+ export async function resolveProjectRef(api, ref) {
38
+ return resolveRef(ref, (id) => api.getProject(id), () => api.getProjects(), (p) => p.name, 'project');
39
+ }
40
+ export async function resolveProjectId(api, ref) {
41
+ const project = await resolveProjectRef(api, ref);
42
+ return project.id;
43
+ }
44
+ export async function resolveSectionId(api, ref, projectId) {
45
+ const { results: sections } = await api.getSections({ projectId });
46
+ if (isIdRef(ref)) {
47
+ const id = extractId(ref);
48
+ const section = sections.find((s) => s.id === id);
49
+ if (!section) {
50
+ throw new Error(formatError('SECTION_NOT_IN_PROJECT', `Section id:${id} does not belong to this project.`));
51
+ }
52
+ return id;
53
+ }
54
+ const lower = ref.toLowerCase();
55
+ const exact = sections.find((s) => s.name.toLowerCase() === lower);
56
+ if (exact)
57
+ return exact.id;
58
+ const partial = sections.filter((s) => s.name.toLowerCase().includes(lower));
59
+ if (partial.length === 1)
60
+ return partial[0].id;
61
+ if (partial.length > 1) {
62
+ throw new Error(formatError('AMBIGUOUS_SECTION', `Multiple sections match "${ref}":`, partial.slice(0, 5).map((s) => `"${s.name}" (id:${s.id})`)));
63
+ }
64
+ throw new Error(formatError('SECTION_NOT_FOUND', `Section "${ref}" not found in project.`));
65
+ }
66
+ export async function resolveParentTaskId(api, ref, projectId, sectionId) {
67
+ if (isIdRef(ref)) {
68
+ return extractId(ref);
69
+ }
70
+ const lower = ref.toLowerCase();
71
+ if (sectionId) {
72
+ const { results: sectionTasks } = await api.getTasks({ sectionId });
73
+ const exact = sectionTasks.find((t) => t.content.toLowerCase() === lower);
74
+ if (exact)
75
+ return exact.id;
76
+ const partial = sectionTasks.filter((t) => t.content.toLowerCase().includes(lower));
77
+ if (partial.length === 1)
78
+ return partial[0].id;
79
+ if (partial.length > 1) {
80
+ throw new Error(formatError('AMBIGUOUS_PARENT', `Multiple tasks match "${ref}" in section:`, partial.slice(0, 5).map((t) => `"${t.content}" (id:${t.id})`)));
81
+ }
82
+ }
83
+ const { results: projectTasks } = await api.getTasks({ projectId });
84
+ const exact = projectTasks.find((t) => t.content.toLowerCase() === lower);
85
+ if (exact)
86
+ return exact.id;
87
+ const partial = projectTasks.filter((t) => t.content.toLowerCase().includes(lower));
88
+ if (partial.length === 1)
89
+ return partial[0].id;
90
+ if (partial.length > 1) {
91
+ throw new Error(formatError('AMBIGUOUS_PARENT', `Multiple tasks match "${ref}" in project:`, partial.slice(0, 5).map((t) => `"${t.content}" (id:${t.id})`)));
92
+ }
93
+ throw new Error(formatError('PARENT_NOT_FOUND', `Parent task "${ref}" not found in project.`));
94
+ }
95
+ export async function resolveWorkspaceRef(ref) {
96
+ const workspaces = await fetchWorkspaces();
97
+ if (isIdRef(ref)) {
98
+ const id = extractId(ref);
99
+ const workspace = workspaces.find((w) => w.id === id);
100
+ if (!workspace) {
101
+ throw new Error(formatError('WORKSPACE_NOT_FOUND', `Workspace id:${id} not found.`));
102
+ }
103
+ return workspace;
104
+ }
105
+ const lower = ref.toLowerCase();
106
+ const exact = workspaces.find((w) => w.name.toLowerCase() === lower);
107
+ if (exact)
108
+ return exact;
109
+ const partial = workspaces.filter((w) => w.name.toLowerCase().includes(lower));
110
+ if (partial.length === 1)
111
+ return partial[0];
112
+ if (partial.length > 1) {
113
+ throw new Error(formatError('AMBIGUOUS_WORKSPACE', `Multiple workspaces match "${ref}":`, partial.slice(0, 5).map((w) => `"${w.name}" (id:${w.id})`)));
114
+ }
115
+ throw new Error(formatError('WORKSPACE_NOT_FOUND', `Workspace "${ref}" not found.`));
116
+ }
117
+ //# sourceMappingURL=refs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refs.js","sourceRoot":"","sources":["../../src/lib/refs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ interface SpinnerOptions {
2
+ text: string;
3
+ color?: 'green' | 'yellow' | 'blue' | 'red' | 'gray' | 'cyan' | 'magenta';
4
+ noSpinner?: boolean;
5
+ }
6
+ declare class LoadingSpinner {
7
+ private spinnerInstance;
8
+ start(options: SpinnerOptions): this;
9
+ succeed(text?: string): void;
10
+ fail(text?: string): void;
11
+ stop(): void;
12
+ private shouldDisableSpinner;
13
+ }
14
+ /**
15
+ * High-level wrapper function for running async operations with a loading spinner.
16
+ * Automatically handles success/failure states and cleanup.
17
+ */
18
+ export declare function withSpinner<T>(options: SpinnerOptions, asyncOperation: () => Promise<T>): Promise<T>;
19
+ export { LoadingSpinner, type SpinnerOptions };
20
+ //# sourceMappingURL=spinner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../src/lib/spinner.ts"],"names":[],"mappings":"AAGA,UAAU,cAAc;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IACzE,SAAS,CAAC,EAAE,OAAO,CAAA;CACtB;AAED,cAAM,cAAc;IAChB,OAAO,CAAC,eAAe,CAA+C;IAEtE,KAAK,CAAC,OAAO,EAAE,cAAc;IAe7B,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM;IAOrB,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM;IAOlB,IAAI;IAOJ,OAAO,CAAC,oBAAoB;CAmB/B;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,CAAC,EAC/B,OAAO,EAAE,cAAc,EACvB,cAAc,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACjC,OAAO,CAAC,CAAC,CAAC,CAWZ;AAED,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,CAAA"}
@@ -0,0 +1,70 @@
1
+ import chalk from 'chalk';
2
+ import yoctoSpinner from 'yocto-spinner';
3
+ class LoadingSpinner {
4
+ spinnerInstance = null;
5
+ start(options) {
6
+ // Don't show spinner in non-interactive environments, when disabled via options, or when JSON output is expected
7
+ if (!process.stdout.isTTY || options.noSpinner || this.shouldDisableSpinner()) {
8
+ return this;
9
+ }
10
+ const colorFn = chalk[options.color || 'blue'];
11
+ this.spinnerInstance = yoctoSpinner({
12
+ text: colorFn(options.text),
13
+ // yocto-spinner uses dots spinner by default which matches NPM's braille pattern
14
+ });
15
+ this.spinnerInstance.start();
16
+ return this;
17
+ }
18
+ succeed(text) {
19
+ if (this.spinnerInstance) {
20
+ this.spinnerInstance.success(text ? chalk.green(`✓ ${text}`) : undefined);
21
+ this.spinnerInstance = null;
22
+ }
23
+ }
24
+ fail(text) {
25
+ if (this.spinnerInstance) {
26
+ this.spinnerInstance.error(text ? chalk.red(`✗ ${text}`) : undefined);
27
+ this.spinnerInstance = null;
28
+ }
29
+ }
30
+ stop() {
31
+ if (this.spinnerInstance) {
32
+ this.spinnerInstance.stop();
33
+ this.spinnerInstance = null;
34
+ }
35
+ }
36
+ shouldDisableSpinner() {
37
+ // Check for environment variables that should disable spinners
38
+ if (process.env.TD_SPINNER === 'false') {
39
+ return true;
40
+ }
41
+ // Check if we're in CI environment
42
+ if (process.env.CI) {
43
+ return true;
44
+ }
45
+ // Check process arguments for JSON output flags and --no-spinner
46
+ const args = process.argv;
47
+ if (args.includes('--json') || args.includes('--ndjson') || args.includes('--no-spinner')) {
48
+ return true;
49
+ }
50
+ return false;
51
+ }
52
+ }
53
+ /**
54
+ * High-level wrapper function for running async operations with a loading spinner.
55
+ * Automatically handles success/failure states and cleanup.
56
+ */
57
+ export async function withSpinner(options, asyncOperation) {
58
+ const loadingSpinner = new LoadingSpinner().start(options);
59
+ try {
60
+ const result = await asyncOperation();
61
+ loadingSpinner.stop(); // Don't show success message by default - let the command handle its own output
62
+ return result;
63
+ }
64
+ catch (error) {
65
+ loadingSpinner.fail();
66
+ throw error;
67
+ }
68
+ }
69
+ export { LoadingSpinner };
70
+ //# sourceMappingURL=spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/lib/spinner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,YAAY,MAAM,eAAe,CAAA;AAQxC,MAAM,cAAc;IACR,eAAe,GAA2C,IAAI,CAAA;IAEtE,KAAK,CAAC,OAAuB;QACzB,iHAAiH;QACjH,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC;YAC5E,OAAO,IAAI,CAAA;QACf,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,CAAA;QAC9C,IAAI,CAAC,eAAe,GAAG,YAAY,CAAC;YAChC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;YAC3B,iFAAiF;SACpF,CAAC,CAAA;QACF,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAA;QAC5B,OAAO,IAAI,CAAA;IACf,CAAC;IAED,OAAO,CAAC,IAAa;QACjB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;YACzE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAA;QAC/B,CAAC;IACL,CAAC;IAED,IAAI,CAAC,IAAa;QACd,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;YACrE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAA;QAC/B,CAAC;IACL,CAAC;IAED,IAAI;QACA,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAA;YAC3B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAA;QAC/B,CAAC;IACL,CAAC;IAEO,oBAAoB;QACxB,+DAA+D;QAC/D,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,OAAO,EAAE,CAAC;YACrC,OAAO,IAAI,CAAA;QACf,CAAC;QAED,mCAAmC;QACnC,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,IAAI,CAAA;QACf,CAAC;QAED,iEAAiE;QACjE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAA;QACzB,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YACxF,OAAO,IAAI,CAAA;QACf,CAAC;QAED,OAAO,KAAK,CAAA;IAChB,CAAC;CACJ;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC7B,OAAuB,EACvB,cAAgC;IAEhC,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAE1D,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAA;QACrC,cAAc,CAAC,IAAI,EAAE,CAAA,CAAC,gFAAgF;QACtG,OAAO,MAAM,CAAA;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,cAAc,CAAC,IAAI,EAAE,CAAA;QACrB,MAAM,KAAK,CAAA;IACf,CAAC;AACL,CAAC;AAED,OAAO,EAAE,cAAc,EAAuB,CAAA"}
@@ -0,0 +1,28 @@
1
+ import type { Task, TodoistApi } from '@doist/todoist-api-typescript';
2
+ import { type Project } from './api/core.js';
3
+ export declare function filterByWorkspaceOrPersonal(api: TodoistApi, tasks: Task[], workspace: string | undefined, personal: boolean | undefined): Promise<{
4
+ tasks: Task[];
5
+ projects: Map<string, Project>;
6
+ }>;
7
+ export interface TaskListOptions {
8
+ priority?: string;
9
+ due?: string;
10
+ filter?: string;
11
+ label?: string;
12
+ parent?: string;
13
+ assignee?: string;
14
+ unassigned?: boolean;
15
+ workspace?: string;
16
+ personal?: boolean;
17
+ limit?: string;
18
+ cursor?: string;
19
+ all?: boolean;
20
+ json?: boolean;
21
+ ndjson?: boolean;
22
+ full?: boolean;
23
+ raw?: boolean;
24
+ showUrls?: boolean;
25
+ }
26
+ export declare function parsePriority(p: string): number;
27
+ export declare function listTasksForProject(projectId: string | null, options: TaskListOptions): Promise<void>;
28
+ //# sourceMappingURL=task-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-list.d.ts","sourceRoot":"","sources":["../../src/lib/task-list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAA;AAErE,OAAO,EAIH,KAAK,OAAO,EAEf,MAAM,eAAe,CAAA;AAYtB,wBAAsB,2BAA2B,CAC7C,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,IAAI,EAAE,EACb,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,QAAQ,EAAE,OAAO,GAAG,SAAS,GAC9B,OAAO,CAAC;IAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,CAgC5D;AAED,MAAM,WAAW,eAAe;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,QAAQ,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ/C;AA2ID,wBAAsB,mBAAmB,CACrC,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,OAAO,EAAE,eAAe,GACzB,OAAO,CAAC,IAAI,CAAC,CAoJf"}
@@ -0,0 +1,234 @@
1
+ import chalk from 'chalk';
2
+ import { getApi, getCurrentUserId, isWorkspaceProject, } from './api/core.js';
3
+ import { CollaboratorCache, formatAssignee } from './collaborators.js';
4
+ import { formatError, formatNextCursorFooter, formatPaginatedJson, formatPaginatedNdjson, formatTaskRow, } from './output.js';
5
+ import { LIMITS, paginate } from './pagination.js';
6
+ import { resolveWorkspaceRef } from './refs.js';
7
+ export async function filterByWorkspaceOrPersonal(api, tasks, workspace, personal) {
8
+ if (workspace && personal) {
9
+ throw new Error(formatError('CONFLICTING_FILTERS', '--workspace and --personal are mutually exclusive.'));
10
+ }
11
+ const { results: allProjects } = await api.getProjects();
12
+ const projects = new Map(allProjects.map((p) => [p.id, p]));
13
+ if (!workspace && !personal) {
14
+ return { tasks, projects };
15
+ }
16
+ let filtered = tasks;
17
+ if (workspace) {
18
+ const ws = await resolveWorkspaceRef(workspace);
19
+ filtered = tasks.filter((t) => {
20
+ const project = projects.get(t.projectId);
21
+ return project && isWorkspaceProject(project) && project.workspaceId === ws.id;
22
+ });
23
+ }
24
+ else if (personal) {
25
+ filtered = tasks.filter((t) => {
26
+ const project = projects.get(t.projectId);
27
+ return project && !isWorkspaceProject(project);
28
+ });
29
+ }
30
+ return { tasks: filtered, projects };
31
+ }
32
+ export function parsePriority(p) {
33
+ const match = /^p([1-4])$/.exec(p.toLowerCase());
34
+ if (!match) {
35
+ throw new Error(formatError('INVALID_PRIORITY', `Invalid priority "${p}". Use p1, p2, p3, or p4.`));
36
+ }
37
+ return 5 - parseInt(match[1], 10);
38
+ }
39
+ function getLocalToday() {
40
+ const now = new Date();
41
+ return `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}`;
42
+ }
43
+ function formatGroupedTaskList({ tasks, project, sections, projects, collaboratorCache, raw = false, showUrl = false, }) {
44
+ if (tasks.length === 0) {
45
+ return 'No tasks found.';
46
+ }
47
+ const taskIds = new Set(tasks.map((t) => t.id));
48
+ const childrenMap = new Map();
49
+ for (const task of tasks) {
50
+ if (task.parentId && taskIds.has(task.parentId)) {
51
+ const children = childrenMap.get(task.parentId) || [];
52
+ children.push(task);
53
+ childrenMap.set(task.parentId, children);
54
+ }
55
+ }
56
+ function renderTask(task, indent) {
57
+ const assignee = formatAssignee({
58
+ userId: task.responsibleUid,
59
+ projectId: task.projectId,
60
+ projects,
61
+ cache: collaboratorCache,
62
+ });
63
+ lines.push(formatTaskRow({
64
+ task,
65
+ assignee: assignee ?? undefined,
66
+ raw,
67
+ indent,
68
+ showUrl,
69
+ }));
70
+ lines.push('');
71
+ const children = childrenMap.get(task.id) || [];
72
+ for (const child of children) {
73
+ renderTask(child, indent + 1);
74
+ }
75
+ }
76
+ const lines = [];
77
+ const noSection = tasks.filter((t) => !t.sectionId);
78
+ const bySectionId = new Map();
79
+ for (const task of tasks) {
80
+ if (task.sectionId) {
81
+ const list = bySectionId.get(task.sectionId) || [];
82
+ list.push(task);
83
+ bySectionId.set(task.sectionId, list);
84
+ }
85
+ }
86
+ lines.push(chalk.bold(`${project.name} (${tasks.length})`));
87
+ lines.push('');
88
+ if (noSection.length > 0) {
89
+ lines.push(chalk.italic.dim(`(no section) (${noSection.length})`));
90
+ const topLevel = noSection.filter((t) => !t.parentId || !taskIds.has(t.parentId));
91
+ for (const task of topLevel) {
92
+ renderTask(task, 0);
93
+ }
94
+ }
95
+ for (const section of sections) {
96
+ const sectionTasks = bySectionId.get(section.id);
97
+ if (sectionTasks && sectionTasks.length > 0) {
98
+ lines.push(`${section.name} (${sectionTasks.length})`);
99
+ const topLevel = sectionTasks.filter((t) => !t.parentId || !taskIds.has(t.parentId));
100
+ for (const task of topLevel) {
101
+ renderTask(task, 0);
102
+ }
103
+ }
104
+ }
105
+ return lines.join('\n').trimEnd();
106
+ }
107
+ function formatFlatTaskList({ tasks, projects, collaboratorCache, raw = false, showUrl = false, }) {
108
+ if (tasks.length === 0) {
109
+ return 'No tasks found.';
110
+ }
111
+ const blocks = tasks.map((task) => {
112
+ const projectName = projects.get(task.projectId)?.name;
113
+ const assignee = formatAssignee({
114
+ userId: task.responsibleUid,
115
+ projectId: task.projectId,
116
+ projects,
117
+ cache: collaboratorCache,
118
+ });
119
+ return formatTaskRow({
120
+ task,
121
+ projectName,
122
+ assignee: assignee ?? undefined,
123
+ raw,
124
+ showUrl,
125
+ });
126
+ });
127
+ return blocks.join('\n\n');
128
+ }
129
+ export async function listTasksForProject(projectId, options) {
130
+ const api = await getApi();
131
+ const targetLimit = options.all
132
+ ? Number.MAX_SAFE_INTEGER
133
+ : options.limit
134
+ ? parseInt(options.limit, 10)
135
+ : LIMITS.tasks;
136
+ let tasks;
137
+ let nextCursor;
138
+ if (options.filter) {
139
+ const filter = options.filter;
140
+ const result = await paginate((cursor, limit) => api.getTasksByFilter({
141
+ query: filter,
142
+ cursor: cursor ?? undefined,
143
+ limit,
144
+ }), { limit: targetLimit, startCursor: options.cursor });
145
+ tasks = result.results;
146
+ nextCursor = result.nextCursor;
147
+ }
148
+ else {
149
+ const result = await paginate((cursor, limit) => projectId
150
+ ? api.getTasks({ projectId, cursor: cursor ?? undefined, limit })
151
+ : api.getTasks({ cursor: cursor ?? undefined, limit }), { limit: targetLimit, startCursor: options.cursor });
152
+ tasks = result.results;
153
+ nextCursor = result.nextCursor;
154
+ }
155
+ let filtered = tasks;
156
+ if (options.priority) {
157
+ const priority = parsePriority(options.priority);
158
+ filtered = filtered.filter((t) => t.priority === priority);
159
+ }
160
+ if (options.due) {
161
+ const today = getLocalToday();
162
+ if (options.due === 'today') {
163
+ filtered = filtered.filter((t) => t.due?.date === today);
164
+ }
165
+ else if (options.due === 'overdue') {
166
+ filtered = filtered.filter((t) => t.due && t.due.date < today);
167
+ }
168
+ else {
169
+ filtered = filtered.filter((t) => t.due?.date === options.due);
170
+ }
171
+ }
172
+ if (options.parent) {
173
+ filtered = filtered.filter((t) => t.parentId === options.parent);
174
+ }
175
+ if (options.label) {
176
+ const labels = options.label.split(',').map((l) => l.trim().toLowerCase());
177
+ filtered = filtered.filter((t) => t.labels.some((tl) => labels.includes(tl.toLowerCase())));
178
+ }
179
+ if (options.unassigned) {
180
+ filtered = filtered.filter((t) => !t.responsibleUid);
181
+ }
182
+ else if (options.assignee) {
183
+ let assigneeId;
184
+ if (options.assignee.toLowerCase() === 'me') {
185
+ assigneeId = await getCurrentUserId();
186
+ }
187
+ else if (options.assignee.startsWith('id:')) {
188
+ assigneeId = options.assignee.slice(3);
189
+ }
190
+ else {
191
+ throw new Error(formatError('INVALID_ASSIGNEE_FILTER', 'Assignee filter requires "me" or "id:xxx" format.', ['Use --assignee me or --assignee id:12345']));
192
+ }
193
+ filtered = filtered.filter((t) => t.responsibleUid === assigneeId);
194
+ }
195
+ const filterResult = await filterByWorkspaceOrPersonal(api, filtered, options.workspace, options.personal);
196
+ filtered = filterResult.tasks;
197
+ if (options.json) {
198
+ console.log(formatPaginatedJson({ results: filtered, nextCursor }, 'task', options.full, options.showUrls));
199
+ return;
200
+ }
201
+ if (options.ndjson) {
202
+ console.log(formatPaginatedNdjson({ results: filtered, nextCursor }, 'task', options.full, options.showUrls));
203
+ return;
204
+ }
205
+ const { projects } = filterResult;
206
+ const collaboratorCache = new CollaboratorCache();
207
+ await collaboratorCache.preload(api, filtered, projects);
208
+ if (projectId) {
209
+ const [projectRes, sectionsRes] = await Promise.all([
210
+ api.getProject(projectId),
211
+ api.getSections({ projectId }),
212
+ ]);
213
+ console.log(formatGroupedTaskList({
214
+ tasks: filtered,
215
+ project: projectRes,
216
+ sections: sectionsRes.results,
217
+ projects,
218
+ collaboratorCache,
219
+ raw: options.raw,
220
+ showUrl: options.showUrls,
221
+ }));
222
+ }
223
+ else {
224
+ console.log(formatFlatTaskList({
225
+ tasks: filtered,
226
+ projects,
227
+ collaboratorCache,
228
+ raw: options.raw,
229
+ showUrl: options.showUrls,
230
+ }));
231
+ }
232
+ console.log(formatNextCursorFooter(nextCursor));
233
+ }
234
+ //# sourceMappingURL=task-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-list.js","sourceRoot":"","sources":["../../src/lib/task-list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare function taskUrl(taskId: string): string;
2
+ export declare function projectUrl(projectId: string): string;
3
+ export declare function labelUrl(labelId: string): string;
4
+ export declare function filterUrl(filterId: string): string;
5
+ export declare function sectionUrl(sectionId: string): string;
6
+ export declare function commentUrl(taskId: string, commentId: string): string;
7
+ export declare function projectCommentUrl(projectId: string, commentId: string): string;
8
+ //# sourceMappingURL=urls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urls.d.ts","sourceRoot":"","sources":["../../src/lib/urls.ts"],"names":[],"mappings":"AAQA,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE9E"}
@@ -0,0 +1,26 @@
1
+ const BASE_URL = 'https://app.todoist.com/app';
2
+ function entityUrl(path, id) {
3
+ return `${BASE_URL}/${path}/${id}`;
4
+ }
5
+ export function taskUrl(taskId) {
6
+ return entityUrl('task', taskId);
7
+ }
8
+ export function projectUrl(projectId) {
9
+ return entityUrl('project', projectId);
10
+ }
11
+ export function labelUrl(labelId) {
12
+ return entityUrl('label', labelId);
13
+ }
14
+ export function filterUrl(filterId) {
15
+ return entityUrl('filter', filterId);
16
+ }
17
+ export function sectionUrl(sectionId) {
18
+ return entityUrl('section', sectionId);
19
+ }
20
+ export function commentUrl(taskId, commentId) {
21
+ return `${entityUrl('task', taskId)}#comment-${commentId}`;
22
+ }
23
+ export function projectCommentUrl(projectId, commentId) {
24
+ return `${entityUrl('project', projectId)}/comments#comment-${commentId}`;
25
+ }
26
+ //# sourceMappingURL=urls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"urls.js","sourceRoot":"","sources":["../../src/lib/urls.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAG,6BAA6B,CAAA;AAI9C,SAAS,SAAS,CAAC,IAAgB,EAAE,EAAU;IAC3C,OAAO,GAAG,QAAQ,IAAI,IAAI,IAAI,EAAE,EAAE,CAAA;AACtC,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,MAAc;IAClC,OAAO,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AACpC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,SAAiB;IACxC,OAAO,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;AAC1C,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAe;IACpC,OAAO,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;AACtC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,QAAgB;IACtC,OAAO,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;AACxC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,SAAiB;IACxC,OAAO,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;AAC1C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAc,EAAE,SAAiB;IACxD,OAAO,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,SAAS,EAAE,CAAA;AAC9D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,SAAiB,EAAE,SAAiB;IAClE,OAAO,GAAG,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,qBAAqB,SAAS,EAAE,CAAA;AAC7E,CAAC"}