@doist/todoist-cli 1.29.4 → 1.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/__mocks__/chalk.d.ts +3 -0
- package/dist/__mocks__/chalk.d.ts.map +1 -0
- package/dist/__mocks__/chalk.js +8 -0
- package/dist/__mocks__/chalk.js.map +1 -0
- package/dist/commands/activity.d.ts +3 -0
- package/dist/commands/activity.d.ts.map +1 -0
- package/dist/commands/activity.js +267 -0
- package/dist/commands/activity.js.map +1 -0
- package/dist/commands/add.d.ts +3 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +36 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/attachment.d.ts +3 -0
- package/dist/commands/attachment.d.ts.map +1 -0
- package/dist/commands/attachment.js +156 -0
- package/dist/commands/attachment.js.map +1 -0
- package/dist/commands/auth.d.ts +3 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +124 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/changelog.d.ts +8 -0
- package/dist/commands/changelog.d.ts.map +1 -0
- package/dist/commands/changelog.js +92 -0
- package/dist/commands/changelog.js.map +1 -0
- package/dist/commands/comment.d.ts +3 -0
- package/dist/commands/comment.d.ts.map +1 -0
- package/dist/commands/comment.js +301 -0
- package/dist/commands/comment.js.map +1 -0
- package/dist/commands/completed.d.ts +3 -0
- package/dist/commands/completed.d.ts.map +1 -0
- package/dist/commands/completed.js +107 -0
- package/dist/commands/completed.js.map +1 -0
- package/dist/commands/completion.d.ts +3 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +107 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/filter.d.ts +5 -0
- package/dist/commands/filter.d.ts.map +1 -0
- package/dist/commands/filter.js +287 -0
- package/dist/commands/filter.js.map +1 -0
- package/dist/commands/inbox.d.ts +3 -0
- package/dist/commands/inbox.d.ts.map +1 -0
- package/dist/commands/inbox.js +25 -0
- package/dist/commands/inbox.js.map +1 -0
- package/dist/commands/label.d.ts +5 -0
- package/dist/commands/label.d.ts.map +1 -0
- package/dist/commands/label.js +328 -0
- package/dist/commands/label.js.map +1 -0
- package/dist/commands/notification.d.ts +3 -0
- package/dist/commands/notification.d.ts.map +1 -0
- package/dist/commands/notification.js +274 -0
- package/dist/commands/notification.js.map +1 -0
- package/dist/commands/project.d.ts +7 -0
- package/dist/commands/project.d.ts.map +1 -0
- package/dist/commands/project.js +714 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/commands/reminder.d.ts +3 -0
- package/dist/commands/reminder.d.ts.map +1 -0
- package/dist/commands/reminder.js +271 -0
- package/dist/commands/reminder.js.map +1 -0
- package/dist/commands/section.d.ts +3 -0
- package/dist/commands/section.d.ts.map +1 -0
- package/dist/commands/section.js +216 -0
- package/dist/commands/section.js.map +1 -0
- package/dist/commands/settings.d.ts +12 -0
- package/dist/commands/settings.d.ts.map +1 -0
- package/dist/commands/settings.js +312 -0
- package/dist/commands/settings.js.map +1 -0
- package/dist/commands/skill.d.ts +3 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +127 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/stats.d.ts +3 -0
- package/dist/commands/stats.d.ts.map +1 -0
- package/dist/commands/stats.js +151 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/task.d.ts +5 -0
- package/dist/commands/task.d.ts.map +1 -0
- package/dist/commands/task.js +559 -0
- package/dist/commands/task.js.map +1 -0
- package/dist/commands/today.d.ts +18 -0
- package/dist/commands/today.d.ts.map +1 -0
- package/dist/commands/today.js +108 -0
- package/dist/commands/today.js.map +1 -0
- package/dist/commands/upcoming.d.ts +17 -0
- package/dist/commands/upcoming.d.ts.map +1 -0
- package/dist/commands/upcoming.js +129 -0
- package/dist/commands/upcoming.js.map +1 -0
- package/dist/commands/update.d.ts +6 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +90 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/view.d.ts +3 -0
- package/dist/commands/view.d.ts.map +1 -0
- package/dist/commands/view.js +79 -0
- package/dist/commands/view.js.map +1 -0
- package/dist/commands/workspace.d.ts +3 -0
- package/dist/commands/workspace.d.ts.map +1 -0
- package/dist/commands/workspace.js +309 -0
- package/dist/commands/workspace.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +176 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api/core.d.ts +13 -0
- package/dist/lib/api/core.d.ts.map +1 -0
- package/dist/lib/api/core.js +176 -0
- package/dist/lib/api/core.js.map +1 -0
- package/dist/lib/api/filters.d.ts +19 -0
- package/dist/lib/api/filters.d.ts.map +1 -0
- package/dist/lib/api/filters.js +60 -0
- package/dist/lib/api/filters.js.map +1 -0
- package/dist/lib/api/notifications.d.ts +33 -0
- package/dist/lib/api/notifications.d.ts.map +1 -0
- package/dist/lib/api/notifications.js +94 -0
- package/dist/lib/api/notifications.js.map +1 -0
- package/dist/lib/api/reminders.d.ts +30 -0
- package/dist/lib/api/reminders.d.ts.map +1 -0
- package/dist/lib/api/reminders.js +65 -0
- package/dist/lib/api/reminders.js.map +1 -0
- package/dist/lib/api/stats.d.ts +41 -0
- package/dist/lib/api/stats.d.ts.map +1 -0
- package/dist/lib/api/stats.js +74 -0
- package/dist/lib/api/stats.js.map +1 -0
- package/dist/lib/api/uploads.d.ts +10 -0
- package/dist/lib/api/uploads.d.ts.map +1 -0
- package/dist/lib/api/uploads.js +31 -0
- package/dist/lib/api/uploads.js.map +1 -0
- package/dist/lib/api/user-settings.d.ts +34 -0
- package/dist/lib/api/user-settings.d.ts.map +1 -0
- package/dist/lib/api/user-settings.js +58 -0
- package/dist/lib/api/user-settings.js.map +1 -0
- package/dist/lib/api/workspaces.d.ts +23 -0
- package/dist/lib/api/workspaces.d.ts.map +1 -0
- package/dist/lib/api/workspaces.js +61 -0
- package/dist/lib/api/workspaces.js.map +1 -0
- package/dist/lib/auth.d.ts +14 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +182 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/browser.d.ts +2 -0
- package/dist/lib/browser.d.ts.map +1 -0
- package/dist/lib/browser.js +6 -0
- package/dist/lib/browser.js.map +1 -0
- package/dist/lib/collaborators.d.ts +29 -0
- package/dist/lib/collaborators.d.ts.map +1 -0
- package/dist/lib/collaborators.js +184 -0
- package/dist/lib/collaborators.js.map +1 -0
- package/dist/lib/completion.d.ts +41 -0
- package/dist/lib/completion.d.ts.map +1 -0
- package/dist/lib/completion.js +191 -0
- package/dist/lib/completion.js.map +1 -0
- package/dist/lib/dates.d.ts +16 -0
- package/dist/lib/dates.d.ts.map +1 -0
- package/dist/lib/dates.js +45 -0
- package/dist/lib/dates.js.map +1 -0
- package/dist/lib/duration.d.ts +14 -0
- package/dist/lib/duration.d.ts.map +1 -0
- package/dist/lib/duration.js +58 -0
- package/dist/lib/duration.js.map +1 -0
- package/dist/lib/logger.d.ts +42 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +227 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/markdown.d.ts +3 -0
- package/dist/lib/markdown.d.ts.map +1 -0
- package/dist/lib/markdown.js +22 -0
- package/dist/lib/markdown.js.map +1 -0
- package/dist/lib/oauth-server.d.ts +6 -0
- package/dist/lib/oauth-server.d.ts.map +1 -0
- package/dist/lib/oauth-server.js +773 -0
- package/dist/lib/oauth-server.js.map +1 -0
- package/dist/lib/oauth.d.ts +3 -0
- package/dist/lib/oauth.d.ts.map +1 -0
- package/dist/lib/oauth.js +38 -0
- package/dist/lib/oauth.js.map +1 -0
- package/dist/lib/options.d.ts +16 -0
- package/dist/lib/options.d.ts.map +1 -0
- package/dist/lib/options.js +2 -0
- package/dist/lib/options.js.map +1 -0
- package/dist/lib/output.d.ts +39 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +311 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/pagination.d.ts +23 -0
- package/dist/lib/pagination.d.ts.map +1 -0
- package/dist/lib/pagination.js +26 -0
- package/dist/lib/pagination.js.map +1 -0
- package/dist/lib/pkce.d.ts +4 -0
- package/dist/lib/pkce.d.ts.map +1 -0
- package/dist/lib/pkce.js +19 -0
- package/dist/lib/pkce.js.map +1 -0
- package/dist/lib/progress.d.ts +29 -0
- package/dist/lib/progress.d.ts.map +1 -0
- package/dist/lib/progress.js +101 -0
- package/dist/lib/progress.js.map +1 -0
- package/dist/lib/refs.d.ts +52 -0
- package/dist/lib/refs.d.ts.map +1 -0
- package/dist/lib/refs.js +225 -0
- package/dist/lib/refs.js.map +1 -0
- package/dist/lib/secure-store.d.ts +11 -0
- package/dist/lib/secure-store.d.ts.map +1 -0
- package/dist/lib/secure-store.js +57 -0
- package/dist/lib/secure-store.js.map +1 -0
- package/dist/lib/skills/content.d.ts +4 -0
- package/dist/lib/skills/content.d.ts.map +1 -0
- package/dist/lib/skills/content.js +429 -0
- package/dist/lib/skills/content.js.map +1 -0
- package/dist/lib/skills/create-installer.d.ts +10 -0
- package/dist/lib/skills/create-installer.d.ts.map +1 -0
- package/dist/lib/skills/create-installer.js +77 -0
- package/dist/lib/skills/create-installer.js.map +1 -0
- package/dist/lib/skills/index.d.ts +6 -0
- package/dist/lib/skills/index.d.ts.map +1 -0
- package/dist/lib/skills/index.js +40 -0
- package/dist/lib/skills/index.js.map +1 -0
- package/dist/lib/skills/types.d.ts +11 -0
- package/dist/lib/skills/types.d.ts.map +1 -0
- package/dist/lib/skills/types.js +2 -0
- package/dist/lib/skills/types.js.map +1 -0
- package/dist/lib/skills/update-installed.d.ts +7 -0
- package/dist/lib/skills/update-installed.d.ts.map +1 -0
- package/dist/lib/skills/update-installed.js +23 -0
- package/dist/lib/skills/update-installed.js.map +1 -0
- package/dist/lib/spinner.d.ts +23 -0
- package/dist/lib/spinner.d.ts.map +1 -0
- package/dist/lib/spinner.js +138 -0
- package/dist/lib/spinner.js.map +1 -0
- package/dist/lib/stdin.d.ts +2 -0
- package/dist/lib/stdin.d.ts.map +1 -0
- package/dist/lib/stdin.js +12 -0
- package/dist/lib/stdin.js.map +1 -0
- package/dist/lib/task-list.d.ts +31 -0
- package/dist/lib/task-list.d.ts.map +1 -0
- package/dist/lib/task-list.js +271 -0
- package/dist/lib/task-list.js.map +1 -0
- package/dist/lib/urls.d.ts +8 -0
- package/dist/lib/urls.d.ts.map +1 -0
- package/dist/lib/urls.js +26 -0
- package/dist/lib/urls.js.map +1 -0
- package/dist/postinstall.d.ts +2 -0
- package/dist/postinstall.d.ts.map +1 -0
- package/dist/postinstall.js +3 -0
- package/dist/postinstall.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
interface SpinnerOptions {
|
|
2
|
+
text: string;
|
|
3
|
+
color?: 'green' | 'yellow' | 'blue' | 'red' | 'gray' | 'cyan' | 'magenta';
|
|
4
|
+
noSpinner?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare function startEarlySpinner(): void;
|
|
7
|
+
export declare function stopEarlySpinner(): void;
|
|
8
|
+
export declare function resetEarlySpinner(): void;
|
|
9
|
+
declare class LoadingSpinner {
|
|
10
|
+
private spinnerInstance;
|
|
11
|
+
private adopted;
|
|
12
|
+
start(options: SpinnerOptions): this;
|
|
13
|
+
succeed(text?: string): void;
|
|
14
|
+
fail(text?: string): void;
|
|
15
|
+
stop(): void;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* High-level wrapper function for running async operations with a loading spinner.
|
|
19
|
+
* Automatically handles success/failure states and cleanup.
|
|
20
|
+
*/
|
|
21
|
+
export declare function withSpinner<T>(options: SpinnerOptions, asyncOperation: () => Promise<T>): Promise<T>;
|
|
22
|
+
export { LoadingSpinner, type SpinnerOptions };
|
|
23
|
+
//# 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;AAsCD,wBAAgB,iBAAiB,IAAI,IAAI,CAkBxC;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CASvC;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAMxC;AAED,cAAM,cAAc;IAChB,OAAO,CAAC,eAAe,CAA+C;IACtE,OAAO,CAAC,OAAO,CAAQ;IAEvB,KAAK,CAAC,OAAO,EAAE,cAAc;IAyB7B,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM;IAcrB,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM;IAQlB,IAAI;CAaP;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,138 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import yoctoSpinner from 'yocto-spinner';
|
|
3
|
+
function shouldDisableSpinner() {
|
|
4
|
+
// Check for environment variables that should disable spinners
|
|
5
|
+
if (process.env.TD_SPINNER === 'false') {
|
|
6
|
+
return true;
|
|
7
|
+
}
|
|
8
|
+
// Check if we're in CI environment
|
|
9
|
+
if (process.env.CI) {
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
// Check process arguments for flags that should disable spinner
|
|
13
|
+
const args = process.argv;
|
|
14
|
+
const spinnerDisablingFlags = [
|
|
15
|
+
'--json',
|
|
16
|
+
'--ndjson',
|
|
17
|
+
'--no-spinner',
|
|
18
|
+
'--progress-jsonl',
|
|
19
|
+
'--verbose',
|
|
20
|
+
'-v',
|
|
21
|
+
];
|
|
22
|
+
// Check for both exact matches and prefix matches (to handle --flag=value variants)
|
|
23
|
+
return spinnerDisablingFlags.some((flag) => args.includes(flag) || // exact match
|
|
24
|
+
args.some((arg) => arg.startsWith(`${flag}=`)));
|
|
25
|
+
}
|
|
26
|
+
// Early spinner singleton — shown instantly before command modules load.
|
|
27
|
+
// Stays running through all API calls (via release-back on stop) and is
|
|
28
|
+
// auto-cleared the moment stdout is written to (command output starting).
|
|
29
|
+
let earlySpinnerInstance = null;
|
|
30
|
+
let originalStdoutWrite = null;
|
|
31
|
+
export function startEarlySpinner() {
|
|
32
|
+
if (!process.stdout.isTTY || shouldDisableSpinner()) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
earlySpinnerInstance = yoctoSpinner({ text: chalk.blue('Loading...') });
|
|
36
|
+
earlySpinnerInstance.start();
|
|
37
|
+
// Intercept stdout so the spinner is cleared before any command output
|
|
38
|
+
const savedWrite = process.stdout.write.bind(process.stdout);
|
|
39
|
+
originalStdoutWrite = savedWrite;
|
|
40
|
+
process.stdout.write = function (...args) {
|
|
41
|
+
stopEarlySpinner();
|
|
42
|
+
return savedWrite.apply(this, args);
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export function stopEarlySpinner() {
|
|
46
|
+
if (originalStdoutWrite) {
|
|
47
|
+
process.stdout.write = originalStdoutWrite;
|
|
48
|
+
originalStdoutWrite = null;
|
|
49
|
+
}
|
|
50
|
+
if (earlySpinnerInstance) {
|
|
51
|
+
earlySpinnerInstance.stop();
|
|
52
|
+
earlySpinnerInstance = null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export function resetEarlySpinner() {
|
|
56
|
+
earlySpinnerInstance = null;
|
|
57
|
+
if (originalStdoutWrite) {
|
|
58
|
+
process.stdout.write = originalStdoutWrite;
|
|
59
|
+
originalStdoutWrite = null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
class LoadingSpinner {
|
|
63
|
+
spinnerInstance = null;
|
|
64
|
+
adopted = false;
|
|
65
|
+
start(options) {
|
|
66
|
+
// Don't show spinner in non-interactive environments, when disabled via options, or when JSON output is expected
|
|
67
|
+
if (!process.stdout.isTTY || options.noSpinner || shouldDisableSpinner()) {
|
|
68
|
+
return this;
|
|
69
|
+
}
|
|
70
|
+
// If an early spinner is running, adopt it instead of creating a new one
|
|
71
|
+
if (earlySpinnerInstance) {
|
|
72
|
+
this.spinnerInstance = earlySpinnerInstance;
|
|
73
|
+
this.adopted = true;
|
|
74
|
+
earlySpinnerInstance = null;
|
|
75
|
+
const colorFn = chalk[options.color || 'blue'];
|
|
76
|
+
this.spinnerInstance.text = colorFn(options.text);
|
|
77
|
+
return this;
|
|
78
|
+
}
|
|
79
|
+
const colorFn = chalk[options.color || 'blue'];
|
|
80
|
+
this.spinnerInstance = yoctoSpinner({
|
|
81
|
+
text: colorFn(options.text),
|
|
82
|
+
// yocto-spinner uses dots spinner by default which matches NPM's braille pattern
|
|
83
|
+
});
|
|
84
|
+
this.spinnerInstance.start();
|
|
85
|
+
return this;
|
|
86
|
+
}
|
|
87
|
+
succeed(text) {
|
|
88
|
+
if (this.spinnerInstance) {
|
|
89
|
+
if (this.adopted) {
|
|
90
|
+
// Release back so subsequent API calls can re-adopt
|
|
91
|
+
earlySpinnerInstance = this.spinnerInstance;
|
|
92
|
+
this.spinnerInstance = null;
|
|
93
|
+
this.adopted = false;
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
this.spinnerInstance.success(text ? chalk.green(`✓ ${text}`) : undefined);
|
|
97
|
+
this.spinnerInstance = null;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
fail(text) {
|
|
101
|
+
if (this.spinnerInstance) {
|
|
102
|
+
this.spinnerInstance.error(text ? chalk.red(`✗ ${text}`) : undefined);
|
|
103
|
+
this.spinnerInstance = null;
|
|
104
|
+
this.adopted = false;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
stop() {
|
|
108
|
+
if (this.spinnerInstance) {
|
|
109
|
+
if (this.adopted) {
|
|
110
|
+
// Release back so subsequent API calls can re-adopt
|
|
111
|
+
earlySpinnerInstance = this.spinnerInstance;
|
|
112
|
+
this.spinnerInstance = null;
|
|
113
|
+
this.adopted = false;
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
this.spinnerInstance.stop();
|
|
117
|
+
this.spinnerInstance = null;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* High-level wrapper function for running async operations with a loading spinner.
|
|
123
|
+
* Automatically handles success/failure states and cleanup.
|
|
124
|
+
*/
|
|
125
|
+
export async function withSpinner(options, asyncOperation) {
|
|
126
|
+
const loadingSpinner = new LoadingSpinner().start(options);
|
|
127
|
+
try {
|
|
128
|
+
const result = await asyncOperation();
|
|
129
|
+
loadingSpinner.stop(); // Don't show success message by default - let the command handle its own output
|
|
130
|
+
return result;
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
loadingSpinner.fail();
|
|
134
|
+
throw error;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
export { LoadingSpinner };
|
|
138
|
+
//# sourceMappingURL=spinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/lib/spinner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdin.d.ts","sourceRoot":"","sources":["../../src/lib/stdin.ts"],"names":[],"mappings":"AAAA,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAUjD"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export async function readStdin() {
|
|
2
|
+
return new Promise((resolve, reject) => {
|
|
3
|
+
let data = '';
|
|
4
|
+
process.stdin.setEncoding('utf8');
|
|
5
|
+
process.stdin.on('data', (chunk) => {
|
|
6
|
+
data += chunk;
|
|
7
|
+
});
|
|
8
|
+
process.stdin.on('end', () => resolve(data));
|
|
9
|
+
process.stdin.on('error', reject);
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=stdin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdin.js","sourceRoot":"","sources":["../../src/lib/stdin.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,SAAS;IAC3B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnC,IAAI,IAAI,GAAG,EAAE,CAAA;QACb,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;QACjC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YAC/B,IAAI,IAAI,KAAK,CAAA;QACjB,CAAC,CAAC,CAAA;QACF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;QAC5C,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;AACN,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Task, TodoistApi } from '@doist/todoist-api-typescript';
|
|
2
|
+
import { type Project } from './api/core.js';
|
|
3
|
+
import type { PaginatedViewOptions } from './options.js';
|
|
4
|
+
export declare function fetchProjects(api: TodoistApi): Promise<Map<string, Project>>;
|
|
5
|
+
interface FilterByWorkspaceOrPersonalOptions {
|
|
6
|
+
api: TodoistApi;
|
|
7
|
+
tasks: Task[];
|
|
8
|
+
workspace?: string;
|
|
9
|
+
personal?: boolean;
|
|
10
|
+
prefetchedProjects?: Map<string, Project>;
|
|
11
|
+
}
|
|
12
|
+
export declare function filterByWorkspaceOrPersonal({ api, tasks, workspace, personal, prefetchedProjects, }: FilterByWorkspaceOrPersonalOptions): Promise<{
|
|
13
|
+
tasks: Task[];
|
|
14
|
+
projects: Map<string, Project>;
|
|
15
|
+
}>;
|
|
16
|
+
export type TaskListOptions = PaginatedViewOptions & {
|
|
17
|
+
priority?: string;
|
|
18
|
+
due?: string;
|
|
19
|
+
filter?: string;
|
|
20
|
+
label?: string;
|
|
21
|
+
parent?: string;
|
|
22
|
+
assignee?: string;
|
|
23
|
+
unassigned?: boolean;
|
|
24
|
+
workspace?: string;
|
|
25
|
+
personal?: boolean;
|
|
26
|
+
};
|
|
27
|
+
export declare const PRIORITY_CHOICES: string[];
|
|
28
|
+
export declare function parsePriority(p: string): number;
|
|
29
|
+
export declare function listTasksForProject(projectId: string | null, options: TaskListOptions): Promise<void>;
|
|
30
|
+
export {};
|
|
31
|
+
//# 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,EAA8B,KAAK,OAAO,EAAgB,MAAM,eAAe,CAAA;AAEtF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAWxD,wBAAsB,aAAa,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAGlF;AAED,UAAU,kCAAkC;IACxC,GAAG,EAAE,UAAU,CAAA;IACf,KAAK,EAAE,IAAI,EAAE,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC5C;AAED,wBAAsB,2BAA2B,CAAC,EAC9C,GAAG,EACH,KAAK,EACL,SAAS,EACT,QAAQ,EACR,kBAAkB,GACrB,EAAE,kCAAkC,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,CA+BjG;AAED,MAAM,MAAM,eAAe,GAAG,oBAAoB,GAAG;IACjD,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;CACrB,CAAA;AAUD,eAAO,MAAM,gBAAgB,UAA4B,CAAA;AAEzD,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAI/C;AA2LD,wBAAsB,mBAAmB,CACrC,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,OAAO,EAAE,eAAe,GACzB,OAAO,CAAC,IAAI,CAAC,CA4Hf"}
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { getApi, 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 fetchProjects(api) {
|
|
8
|
+
const { results: allProjects } = await api.getProjects();
|
|
9
|
+
return new Map(allProjects.map((p) => [p.id, p]));
|
|
10
|
+
}
|
|
11
|
+
export async function filterByWorkspaceOrPersonal({ api, tasks, workspace, personal, prefetchedProjects, }) {
|
|
12
|
+
if (workspace && personal) {
|
|
13
|
+
throw new Error(formatError('CONFLICTING_FILTERS', '--workspace and --personal are mutually exclusive.'));
|
|
14
|
+
}
|
|
15
|
+
const projects = prefetchedProjects ?? (await fetchProjects(api));
|
|
16
|
+
if (!workspace && !personal) {
|
|
17
|
+
return { tasks, projects };
|
|
18
|
+
}
|
|
19
|
+
let filtered = tasks;
|
|
20
|
+
if (workspace) {
|
|
21
|
+
const ws = await resolveWorkspaceRef(workspace);
|
|
22
|
+
filtered = tasks.filter((t) => {
|
|
23
|
+
const project = projects.get(t.projectId);
|
|
24
|
+
return project && isWorkspaceProject(project) && project.workspaceId === ws.id;
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
else if (personal) {
|
|
28
|
+
filtered = tasks.filter((t) => {
|
|
29
|
+
const project = projects.get(t.projectId);
|
|
30
|
+
return project && !isWorkspaceProject(project);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return { tasks: filtered, projects };
|
|
34
|
+
}
|
|
35
|
+
/** CLI value → Todoist API priority (p1=urgent maps to API 4, p4=low maps to API 1) */
|
|
36
|
+
const PRIORITY_MAP = {
|
|
37
|
+
p1: 4,
|
|
38
|
+
p2: 3,
|
|
39
|
+
p3: 2,
|
|
40
|
+
p4: 1,
|
|
41
|
+
};
|
|
42
|
+
export const PRIORITY_CHOICES = Object.keys(PRIORITY_MAP);
|
|
43
|
+
export function parsePriority(p) {
|
|
44
|
+
const result = PRIORITY_MAP[p.toLowerCase()];
|
|
45
|
+
if (result !== undefined)
|
|
46
|
+
return result;
|
|
47
|
+
throw new Error(formatError('INVALID_PRIORITY', `Invalid priority "${p}".`));
|
|
48
|
+
}
|
|
49
|
+
function buildFilterQuery(options) {
|
|
50
|
+
const parts = [];
|
|
51
|
+
if (options.label) {
|
|
52
|
+
const labels = options.label.split(',').map((l) => l.trim());
|
|
53
|
+
if (labels.length === 1) {
|
|
54
|
+
parts.push(`@${labels[0]}`);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
parts.push(`(${labels.map((l) => `@${l}`).join(' | ')})`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (options.priority) {
|
|
61
|
+
parsePriority(options.priority); // Validate format
|
|
62
|
+
parts.push(options.priority);
|
|
63
|
+
}
|
|
64
|
+
if (options.due) {
|
|
65
|
+
if (options.due === 'today') {
|
|
66
|
+
parts.push('today');
|
|
67
|
+
}
|
|
68
|
+
else if (options.due === 'overdue') {
|
|
69
|
+
parts.push('overdue');
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
parts.push(`${options.due}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (options.assignee) {
|
|
76
|
+
if (options.assignee.toLowerCase() === 'me') {
|
|
77
|
+
parts.push('assigned to: me');
|
|
78
|
+
}
|
|
79
|
+
else if (options.assignee.startsWith('id:')) {
|
|
80
|
+
// ID-based assignee filters are done client-side, separately
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
// Email or name provided directly
|
|
84
|
+
parts.push(`assigned to: ${options.assignee}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (options.unassigned) {
|
|
88
|
+
parts.push('!assigned');
|
|
89
|
+
}
|
|
90
|
+
if (options.workspace) {
|
|
91
|
+
parts.push(`workspace: ${options.workspace}`);
|
|
92
|
+
}
|
|
93
|
+
if (options.personal) {
|
|
94
|
+
parts.push('workspace: personal');
|
|
95
|
+
}
|
|
96
|
+
return parts.length > 0 ? parts.join(' & ') : null;
|
|
97
|
+
}
|
|
98
|
+
function formatGroupedTaskList({ tasks, project, sections, projects, collaboratorCache, raw = false, showUrl = false, }) {
|
|
99
|
+
if (tasks.length === 0) {
|
|
100
|
+
return 'No tasks found.';
|
|
101
|
+
}
|
|
102
|
+
const taskIds = new Set(tasks.map((t) => t.id));
|
|
103
|
+
const childrenMap = new Map();
|
|
104
|
+
for (const task of tasks) {
|
|
105
|
+
if (task.parentId && taskIds.has(task.parentId)) {
|
|
106
|
+
const children = childrenMap.get(task.parentId) || [];
|
|
107
|
+
children.push(task);
|
|
108
|
+
childrenMap.set(task.parentId, children);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function renderTask(task, indent) {
|
|
112
|
+
const assignee = formatAssignee({
|
|
113
|
+
userId: task.responsibleUid,
|
|
114
|
+
projectId: task.projectId,
|
|
115
|
+
projects,
|
|
116
|
+
cache: collaboratorCache,
|
|
117
|
+
});
|
|
118
|
+
lines.push(formatTaskRow({
|
|
119
|
+
task,
|
|
120
|
+
assignee: assignee ?? undefined,
|
|
121
|
+
raw,
|
|
122
|
+
indent,
|
|
123
|
+
showUrl,
|
|
124
|
+
}));
|
|
125
|
+
lines.push('');
|
|
126
|
+
const children = childrenMap.get(task.id) || [];
|
|
127
|
+
for (const child of children) {
|
|
128
|
+
renderTask(child, indent + 1);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const lines = [];
|
|
132
|
+
const noSection = tasks.filter((t) => !t.sectionId);
|
|
133
|
+
const bySectionId = new Map();
|
|
134
|
+
for (const task of tasks) {
|
|
135
|
+
if (task.sectionId) {
|
|
136
|
+
const list = bySectionId.get(task.sectionId) || [];
|
|
137
|
+
list.push(task);
|
|
138
|
+
bySectionId.set(task.sectionId, list);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
lines.push(chalk.bold(`${project.name} (${tasks.length})`));
|
|
142
|
+
lines.push('');
|
|
143
|
+
if (noSection.length > 0) {
|
|
144
|
+
lines.push(chalk.italic.dim(`(no section) (${noSection.length})`));
|
|
145
|
+
const topLevel = noSection.filter((t) => !t.parentId || !taskIds.has(t.parentId));
|
|
146
|
+
for (const task of topLevel) {
|
|
147
|
+
renderTask(task, 0);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
for (const section of sections) {
|
|
151
|
+
const sectionTasks = bySectionId.get(section.id);
|
|
152
|
+
if (sectionTasks && sectionTasks.length > 0) {
|
|
153
|
+
lines.push(`${section.name} (${sectionTasks.length})`);
|
|
154
|
+
const topLevel = sectionTasks.filter((t) => !t.parentId || !taskIds.has(t.parentId));
|
|
155
|
+
for (const task of topLevel) {
|
|
156
|
+
renderTask(task, 0);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return lines.join('\n').trimEnd();
|
|
161
|
+
}
|
|
162
|
+
function formatFlatTaskList({ tasks, projects, collaboratorCache, raw = false, showUrl = false, }) {
|
|
163
|
+
if (tasks.length === 0) {
|
|
164
|
+
return 'No tasks found.';
|
|
165
|
+
}
|
|
166
|
+
const blocks = tasks.map((task) => {
|
|
167
|
+
const projectName = projects.get(task.projectId)?.name;
|
|
168
|
+
const assignee = formatAssignee({
|
|
169
|
+
userId: task.responsibleUid,
|
|
170
|
+
projectId: task.projectId,
|
|
171
|
+
projects,
|
|
172
|
+
cache: collaboratorCache,
|
|
173
|
+
});
|
|
174
|
+
return formatTaskRow({
|
|
175
|
+
task,
|
|
176
|
+
projectName,
|
|
177
|
+
assignee: assignee ?? undefined,
|
|
178
|
+
raw,
|
|
179
|
+
showUrl,
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
return blocks.join('\n\n');
|
|
183
|
+
}
|
|
184
|
+
export async function listTasksForProject(projectId, options) {
|
|
185
|
+
const api = await getApi();
|
|
186
|
+
const targetLimit = options.all
|
|
187
|
+
? Number.MAX_SAFE_INTEGER
|
|
188
|
+
: options.limit
|
|
189
|
+
? parseInt(options.limit, 10)
|
|
190
|
+
: LIMITS.tasks;
|
|
191
|
+
let tasks;
|
|
192
|
+
let nextCursor;
|
|
193
|
+
const builtFilter = buildFilterQuery(options);
|
|
194
|
+
const filterQuery = options.filter
|
|
195
|
+
? builtFilter
|
|
196
|
+
? `(${options.filter}) & (${builtFilter})`
|
|
197
|
+
: options.filter
|
|
198
|
+
: builtFilter;
|
|
199
|
+
if (filterQuery) {
|
|
200
|
+
const result = await paginate((cursor, limit) => api.getTasksByFilter({
|
|
201
|
+
query: filterQuery,
|
|
202
|
+
cursor: cursor ?? undefined,
|
|
203
|
+
limit,
|
|
204
|
+
}), { limit: targetLimit, startCursor: options.cursor });
|
|
205
|
+
tasks = result.results;
|
|
206
|
+
nextCursor = result.nextCursor;
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
const scope = options.parent ? { parentId: options.parent } : projectId ? { projectId } : {};
|
|
210
|
+
const result = await paginate((cursor, limit) => api.getTasks({ ...scope, cursor: cursor ?? undefined, limit }), { limit: targetLimit, startCursor: options.cursor });
|
|
211
|
+
tasks = result.results;
|
|
212
|
+
nextCursor = result.nextCursor;
|
|
213
|
+
}
|
|
214
|
+
let filtered = tasks;
|
|
215
|
+
// getTasksByFilter doesn't support parentId or projectId scoping,
|
|
216
|
+
// so apply client-side when using the filter query path
|
|
217
|
+
if (options.parent) {
|
|
218
|
+
filtered = filtered.filter((t) => t.parentId === options.parent);
|
|
219
|
+
}
|
|
220
|
+
if (projectId) {
|
|
221
|
+
filtered = filtered.filter((t) => t.projectId === projectId);
|
|
222
|
+
}
|
|
223
|
+
// ID-based assignee filtering requires client-side filtering
|
|
224
|
+
// (name/email-based assignee filtering is done server-side via filter query)
|
|
225
|
+
if (options.assignee?.startsWith('id:')) {
|
|
226
|
+
const assigneeId = options.assignee.slice(3);
|
|
227
|
+
filtered = filtered.filter((t) => t.responsibleUid === assigneeId);
|
|
228
|
+
}
|
|
229
|
+
if (options.json) {
|
|
230
|
+
console.log(formatPaginatedJson({ results: filtered, nextCursor }, 'task', options.full, options.showUrls));
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
if (options.ndjson) {
|
|
234
|
+
console.log(formatPaginatedNdjson({ results: filtered, nextCursor }, 'task', options.full, options.showUrls));
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
const collaboratorCache = new CollaboratorCache();
|
|
238
|
+
if (projectId) {
|
|
239
|
+
// When listing tasks for a specific project, we only need that project's info
|
|
240
|
+
const [projectRes, sectionsRes] = await Promise.all([
|
|
241
|
+
api.getProject(projectId),
|
|
242
|
+
api.getSections({ projectId }),
|
|
243
|
+
]);
|
|
244
|
+
const projects = new Map([[projectRes.id, projectRes]]);
|
|
245
|
+
await collaboratorCache.preload(api, filtered, projects);
|
|
246
|
+
console.log(formatGroupedTaskList({
|
|
247
|
+
tasks: filtered,
|
|
248
|
+
project: projectRes,
|
|
249
|
+
sections: sectionsRes.results,
|
|
250
|
+
projects,
|
|
251
|
+
collaboratorCache,
|
|
252
|
+
raw: options.raw,
|
|
253
|
+
showUrl: options.showUrls,
|
|
254
|
+
}));
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
// When listing tasks across all projects, we need all projects for formatting
|
|
258
|
+
const { results: allProjects } = await api.getProjects();
|
|
259
|
+
const projects = new Map(allProjects.map((p) => [p.id, p]));
|
|
260
|
+
await collaboratorCache.preload(api, filtered, projects);
|
|
261
|
+
console.log(formatFlatTaskList({
|
|
262
|
+
tasks: filtered,
|
|
263
|
+
projects,
|
|
264
|
+
collaboratorCache,
|
|
265
|
+
raw: options.raw,
|
|
266
|
+
showUrl: options.showUrls,
|
|
267
|
+
}));
|
|
268
|
+
}
|
|
269
|
+
console.log(formatNextCursorFooter(nextCursor));
|
|
270
|
+
}
|
|
271
|
+
//# 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"}
|
package/dist/lib/urls.js
ADDED
|
@@ -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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postinstall.d.ts","sourceRoot":"","sources":["../src/postinstall.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postinstall.js","sourceRoot":"","sources":["../src/postinstall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAA;AAE3E,wBAAwB,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@doist/todoist-cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.30.0",
|
|
4
4
|
"description": "TypeScript CLI for Todoist",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -20,7 +20,8 @@
|
|
|
20
20
|
"check:skill-sync": "node scripts/check-skill-sync.js",
|
|
21
21
|
"sync:skill": "node scripts/sync-skill.js",
|
|
22
22
|
"test": "vitest run",
|
|
23
|
-
"test:watch": "vitest"
|
|
23
|
+
"test:watch": "vitest",
|
|
24
|
+
"prepublishOnly": "npm run build && npm test"
|
|
24
25
|
},
|
|
25
26
|
"keywords": [
|
|
26
27
|
"todoist",
|