@beauraines/rtm-cli 1.5.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 (51) hide show
  1. package/.github/FUNDING.yml +12 -0
  2. package/LICENSE +21 -0
  3. package/README.md +143 -0
  4. package/build.js +86 -0
  5. package/config.json +40 -0
  6. package/package.json +58 -0
  7. package/screens/ls.png +0 -0
  8. package/screens/lsd.png +0 -0
  9. package/screens/lsp.png +0 -0
  10. package/screens/planner.png +0 -0
  11. package/src/cli.js +434 -0
  12. package/src/cmd/add.js +100 -0
  13. package/src/cmd/addList.js +92 -0
  14. package/src/cmd/addTags.js +85 -0
  15. package/src/cmd/archiveList.js +78 -0
  16. package/src/cmd/comp.js +82 -0
  17. package/src/cmd/decPri.js +82 -0
  18. package/src/cmd/due.js +82 -0
  19. package/src/cmd/edit.js +82 -0
  20. package/src/cmd/incPri.js +82 -0
  21. package/src/cmd/lists.js +60 -0
  22. package/src/cmd/login.js +27 -0
  23. package/src/cmd/logout.js +31 -0
  24. package/src/cmd/ls.js +181 -0
  25. package/src/cmd/lsd.js +193 -0
  26. package/src/cmd/lsp.js +171 -0
  27. package/src/cmd/move.js +83 -0
  28. package/src/cmd/notes.js +150 -0
  29. package/src/cmd/planner.js +510 -0
  30. package/src/cmd/postpone.js +82 -0
  31. package/src/cmd/pri.js +82 -0
  32. package/src/cmd/remove.js +82 -0
  33. package/src/cmd/removeList.js +79 -0
  34. package/src/cmd/removeTags.js +85 -0
  35. package/src/cmd/renameList.js +80 -0
  36. package/src/cmd/reset.js +35 -0
  37. package/src/cmd/setUrl.js +99 -0
  38. package/src/cmd/tags.js +101 -0
  39. package/src/cmd/uncomp.js +82 -0
  40. package/src/cmd/url.js +92 -0
  41. package/src/cmd/whoami.js +36 -0
  42. package/src/interactive.js +65 -0
  43. package/src/utils/config.js +236 -0
  44. package/src/utils/filter.js +43 -0
  45. package/src/utils/finish.js +21 -0
  46. package/src/utils/index.js +10 -0
  47. package/src/utils/log.js +163 -0
  48. package/src/utils/login.js +69 -0
  49. package/src/utils/printIndicator.js +43 -0
  50. package/src/utils/prompt.js +126 -0
  51. package/src/utils/sort.js +283 -0
package/src/cmd/ls.js ADDED
@@ -0,0 +1,181 @@
1
+ 'use strict';
2
+
3
+ const df = require('dateformat');
4
+ const sort = require('../utils/sort.js');
5
+ const log = require('../utils/log.js');
6
+ const finish = require('../utils/finish.js');
7
+ const parseFilter = require('../utils/filter.js');
8
+ const config = require('../utils/config.js');
9
+ const printIndicator = require('../utils/printIndicator.js')
10
+
11
+
12
+ /**
13
+ * This command will display all of the User's tasks sorted first by list,
14
+ * then completed status, then priority, then due date
15
+ */
16
+ function action(args, env) {
17
+ let filter = parseFilter(args.length > 0 ? args[0].join(' ') : '');
18
+
19
+ // Get the authenticated User
20
+ config.user(function(user) {
21
+
22
+ // Start Spinner
23
+ log.spinner.start("Getting Tasks...");
24
+
25
+ // Get User Tasks
26
+ user.tasks.get(filter, function (err, tasks) {
27
+ if ( err ) {
28
+ log.spinner.error("Could not get tasks (" + err.msg + ")");
29
+ return finish();
30
+ }
31
+ else if ( tasks.length === 0 ) {
32
+ log.spinner.error("No tasks returned");
33
+ return finish();
34
+ }
35
+ log.spinner.stop();
36
+
37
+ // Get Display Styles
38
+ let styles = config.get().styles;
39
+
40
+ // Get max task number
41
+ tasks.sort(sort.tasks.index);
42
+ let MAX_INDEX = tasks[tasks.length - 1].index;
43
+
44
+ // Sort Tasks
45
+ tasks.sort(sort.tasks.ls);
46
+
47
+ // Last List Name
48
+ let listname = "";
49
+
50
+ // Parse each task
51
+ for ( let i = 0; i < tasks.length; i++ ) {
52
+ let task = tasks[i];
53
+
54
+
55
+ // ==== PRINT LIST NAME ==== //
56
+
57
+ // Print New List Name
58
+ if ( task._list.name !== listname ) {
59
+ if ( listname !== "" ) {
60
+ log();
61
+ }
62
+ listname = task._list.name;
63
+ for ( let i = 0; i < MAX_INDEX.toString().length + 1; i++ ) {
64
+ log(' ', false);
65
+ }
66
+ log.style(listname, styles.list, true);
67
+ }
68
+
69
+
70
+ // ==== PRINT TASK INFORMATION ==== //
71
+
72
+ // Print Task Index
73
+ log.style(_pad(task.index, MAX_INDEX), styles.index);
74
+ log.style(' ');
75
+
76
+ // Add the Task Priority
77
+ let namestyle = '';
78
+ if ( !task.completed ) {
79
+ namestyle = styles.priority[task.priority.toString()];
80
+ if ( task.priority === 0 ) {
81
+ log.style(' ');
82
+ }
83
+ else {
84
+ log.style('(' + task.priority + ')', namestyle);
85
+ log.style(' ');
86
+ }
87
+ }
88
+ else {
89
+ namestyle = styles.completed;
90
+ log.style(' ');
91
+ log.style('x', namestyle);
92
+ log.style(' ');
93
+ }
94
+
95
+ // Display subtask indicator
96
+ if (task.isSubtask) {
97
+ printIndicator('subtask',task);
98
+ }
99
+
100
+ // Add the Task Name
101
+ log.style(task.name+' ', namestyle);
102
+
103
+ // Print URL Indicator
104
+ if ( task.url !== undefined ) {
105
+ printIndicator('url',task);
106
+ }
107
+
108
+ // Print Note Indicators
109
+ for ( let i = 0; i < task.notes.length; i++ ) {
110
+ printIndicator('notes',task);
111
+ }
112
+
113
+ // Print recurring indicator
114
+ if (task.isRecurring) {
115
+ printIndicator('recurring',task);
116
+ }
117
+
118
+ // Print Tags
119
+ let tagstyle = task.isCompleted ? styles.completed : styles.tags;
120
+ for ( let i = 0; i < task.tags.length; i++ ) {
121
+ log.style(' ');
122
+ log.style('#' + task.tags[i], tagstyle);
123
+ }
124
+
125
+ // Print Due Date / Completed Date
126
+ if ( !task.isCompleted ) {
127
+ if ( task.due ) {
128
+ log.style(' ');
129
+ log.style('|', styles.due);
130
+ log.style(' ');
131
+ log.style(df(task.due, config.get().dateformat), styles.due);
132
+ }
133
+ }
134
+ else {
135
+ if ( task.completed ) {
136
+ log.style(' ');
137
+ log.style('x', styles.completed);
138
+ log.style(' ');
139
+ log.style(df(task.completed, config.get().dateformat), styles.completed);
140
+ }
141
+ }
142
+
143
+ // Finish line
144
+ log('');
145
+
146
+ }
147
+
148
+ // Finish
149
+ return finish();
150
+
151
+ });
152
+
153
+ });
154
+
155
+ }
156
+
157
+
158
+ /**
159
+ * Pad the Index number with leading 0s
160
+ * @param index Task Index Number
161
+ * @param maxIndex Max Task Index
162
+ * @returns {string}
163
+ * @private
164
+ */
165
+ function _pad(index, maxIndex) {
166
+ let max = maxIndex.toString().length;
167
+ let digits = index.toString().length;
168
+ let delta = max - digits;
169
+ for ( let i = 0; i < delta; i++ ) {
170
+ index = '0' + index;
171
+ }
172
+ return index;
173
+ }
174
+
175
+
176
+
177
+ module.exports = {
178
+ command: 'ls [filter...]',
179
+ description: 'List all tasks sorted first by list then by priority',
180
+ action: action
181
+ };
package/src/cmd/lsd.js ADDED
@@ -0,0 +1,193 @@
1
+ 'use strict';
2
+
3
+ const df = require('dateformat');
4
+ const login = require('../utils/login.js');
5
+ const sort = require('../utils/sort.js');
6
+ const log = require('../utils/log.js');
7
+ const finish = require('../utils/finish.js');
8
+ const parseFilter = require('../utils/filter.js');
9
+ const config = require('../utils/config.js');
10
+ const printIndicator = require('../utils/printIndicator.js')
11
+
12
+
13
+ /**
14
+ * This command will display all of the User's tasks sorted first by list,
15
+ * then completed status, then priority, then due date.
16
+ */
17
+ function action(args, env) {
18
+ let filter = parseFilter(args.length > 0 ? args[0].join(' ') : '');
19
+
20
+ // Get the authenticated User
21
+ config.user(function(user) {
22
+
23
+ // Start Spinner
24
+ log.spinner.start("Getting Tasks...");
25
+
26
+ // Get User Tasks
27
+ user.tasks.get(filter, function(err, tasks) {
28
+ if ( err ) {
29
+ log.spinner.error("Could not get tasks (" + err.msg + ")");
30
+ return finish();
31
+ }
32
+ else if ( tasks.length === 0 ) {
33
+ log.spinner.error("No tasks returned");
34
+ return finish();
35
+ }
36
+ log.spinner.stop();
37
+
38
+ // Get Display Styles
39
+ let styles = config.get().styles;
40
+
41
+ // Get max task number
42
+ tasks.sort(sort.tasks.index);
43
+ let MAX_INDEX = tasks[tasks.length-1].index;
44
+
45
+ // Sort Tasks
46
+ tasks.sort(sort.tasks.lsd);
47
+
48
+ // Last Due Date
49
+ let lastDue = undefined;
50
+
51
+ // Parse each task
52
+ for ( let i = 0; i < tasks.length; i++ ) {
53
+ let task = tasks[i];
54
+ let taskDue = task.due === undefined ? 0 : task.due.getDate();
55
+ let taskDueTime = task.due === undefined ? 0 : task.due.getTime();
56
+
57
+ // ==== PRINT DUE DATE ==== //
58
+
59
+ // Print New Due Date
60
+ if ( lastDue !== taskDue ) {
61
+ if ( lastDue !== undefined ) {
62
+ log();
63
+ }
64
+ // lastDue = task.due === undefined ? 0 : task.due.getTime();
65
+ lastDue = taskDue;
66
+
67
+ for ( let i = 0; i < MAX_INDEX.toString().length+1; i++ ) {
68
+ log(' ', false);
69
+ }
70
+
71
+ if ( task.due !== undefined ) {
72
+ log.style(df(task.due, config.get().dateformat), styles.due, true);
73
+ }
74
+ else {
75
+ log.style("No Due Date", styles.due, true);
76
+ }
77
+ }
78
+
79
+
80
+
81
+ // ==== PRINT TASK INFORMATION ==== //
82
+
83
+ // Print Task Index
84
+ log.style(_pad(task.index, MAX_INDEX), styles.index);
85
+ log.style(' ');
86
+
87
+ // Print the Task Priority
88
+ let priStyle = '';
89
+ if ( !task.completed ) {
90
+ priStyle = styles.priority[task.priority.toString()];
91
+ if ( task.priority === 0 ) {
92
+ log.style(' ');
93
+ }
94
+ else {
95
+ log.style('(' + task.priority + ')', priStyle);
96
+ log.style(' ');
97
+ }
98
+ }
99
+ else {
100
+ priStyle = styles.completed;
101
+ log.style(' ');
102
+ log.style('x', priStyle);
103
+ log.style(' ');
104
+ }
105
+
106
+ // Print the Task List Name
107
+ let listStyle = task.isCompleted ? styles.completed : styles.list;
108
+ log.style(task.list.name + ':', listStyle);
109
+
110
+ // Display subtask indicator
111
+ if (task.isSubtask) {
112
+ log.style(' ');
113
+ printIndicator('subtask',task);
114
+ }
115
+
116
+ // Print the Task Name
117
+ log.style(' ');
118
+ log.style(task.name + ' ', priStyle);
119
+
120
+ // Print URL Indicator
121
+ if ( task.url !== undefined ) {
122
+ printIndicator('url',task);
123
+ }
124
+
125
+ // Print Note Indicators
126
+ for ( let i = 0; i < task.notes.length; i++ ) {
127
+ printIndicator('notes',task);
128
+ }
129
+
130
+ // Print recurring indicator
131
+ if (task.isRecurring) {
132
+ printIndicator('recurring',task);
133
+ }
134
+
135
+ // Print Tags
136
+ let tagstyle = task.isCompleted ? styles.completed : styles.tags;
137
+ for ( let i = 0; i < task.tags.length; i++ ) {
138
+ log.style(' ');
139
+ log.style('#' + task.tags[i], tagstyle);
140
+ }
141
+
142
+ // Print Completed Date or Due Time
143
+ if ( task.completed ) {
144
+ log.style(' ');
145
+ log.style('x', styles.completed);
146
+ log.style(' ');
147
+ log.style(df(task.completed, config.get().dateformat), styles.completed);
148
+ } else {
149
+ // Prints due time for incomplete tasks that have a time set
150
+ df(taskDueTime,'shortTime') != '12:00 AM' && taskDueTime!= 0
151
+ ? log.style(' '+df(taskDueTime,'shortTime'),styles.due)
152
+ : null;
153
+ }
154
+
155
+ // Finish line
156
+ log('');
157
+
158
+ }
159
+
160
+ // Finish
161
+ return finish();
162
+
163
+ });
164
+
165
+ });
166
+
167
+ }
168
+
169
+
170
+ /**
171
+ * Pad the Index number with leading 0s
172
+ * @param index Task Index Number
173
+ * @param maxIndex Max Task Index
174
+ * @returns {string}
175
+ * @private
176
+ */
177
+ function _pad(index, maxIndex) {
178
+ let max = maxIndex.toString().length;
179
+ let digits = index.toString().length;
180
+ let delta = max - digits;
181
+ for ( let i = 0; i < delta; i++ ) {
182
+ index = '0' + index;
183
+ }
184
+ return index;
185
+ }
186
+
187
+
188
+
189
+ module.exports = {
190
+ command: 'lsd [filter...]',
191
+ description: 'List all tasks sorted first by due date then by priority',
192
+ action: action
193
+ };
package/src/cmd/lsp.js ADDED
@@ -0,0 +1,171 @@
1
+ 'use strict';
2
+
3
+ const df = require('dateformat');
4
+ const login = require('../utils/login.js');
5
+ const sort = require('../utils/sort.js');
6
+ const log = require('../utils/log.js');
7
+ const finish = require('../utils/finish.js');
8
+ const parseFilter = require('../utils/filter.js');
9
+ const config = require('../utils/config.js');
10
+ const styles = config.get().styles;
11
+ const printIndicator = require('../utils/printIndicator.js')
12
+
13
+
14
+ /**
15
+ * This command will display all of the User's tasks sorted first by priority,
16
+ * then due date.
17
+ */
18
+ function action(args, env) {
19
+ let filter = parseFilter(args.length > 0 ? args[0].join(' ') : '');
20
+
21
+ // Get the authenticated User
22
+ config.user(function(user) {
23
+
24
+ // Start Spinner
25
+ log.spinner.start("Getting Tasks...");
26
+
27
+ // Get User Tasks
28
+ user.tasks.get(filter, function(err, tasks) {
29
+ if ( err ) {
30
+ log.spinner.error("Could not get tasks (" + err.msg + ")");
31
+ return finish();
32
+ }
33
+ else if ( tasks.length === 0 ) {
34
+ log.spinner.error("No tasks returned");
35
+ return finish();
36
+ }
37
+ log.spinner.stop();
38
+
39
+ // Get Display Styles
40
+ let styles = config.get().styles;
41
+
42
+ // Get max task number
43
+ tasks.sort(sort.tasks.index);
44
+ let MAX_INDEX = tasks[tasks.length-1].index;
45
+
46
+ // Sort Tasks
47
+ tasks.sort(sort.tasks.lsp);
48
+
49
+ // Parse each task
50
+ for ( let i = 0; i < tasks.length; i++ ) {
51
+ let task = tasks[i];
52
+
53
+
54
+ // ==== PRINT TASK INFORMATION ==== //
55
+
56
+ // Print Task Index
57
+ log.style(_pad(task.index, MAX_INDEX), styles.index);
58
+ log.style(' ');
59
+
60
+ // Print the Task Priority
61
+ let priStyle = '';
62
+ if ( !task.completed ) {
63
+ priStyle = styles.priority[task.priority.toString()];
64
+ if ( task.priority === 0 ) {
65
+ log.style(' ');
66
+ }
67
+ else {
68
+ log.style('(' + task.priority + ')', priStyle);
69
+ log.style(' ');
70
+ }
71
+ }
72
+ else {
73
+ priStyle = styles.completed;
74
+ log.style(' ');
75
+ log.style('x', priStyle);
76
+ log.style(' ');
77
+ }
78
+
79
+ // Print the Task List Name
80
+ let listStyle = task.isCompleted ? styles.completed : styles.list;
81
+ log.style(task.list.name + ':', listStyle);
82
+
83
+ // Display subtask indicator
84
+ if (task.isSubtask) {
85
+ log.style(' ');
86
+ printIndicator('subtask',task);
87
+ }
88
+
89
+ // Print the Task Name
90
+ log.style(' ');
91
+ log.style(task.name + ' ', priStyle);
92
+
93
+ // Print URL Indicator
94
+ if ( task.url !== undefined ) {
95
+ printIndicator('url',task);
96
+ }
97
+
98
+ // Print Note Indicators
99
+ for ( let i = 0; i < task.notes.length; i++ ) {
100
+ printIndicator('notes',task);
101
+ }
102
+
103
+ // Print recurring indicator
104
+ if (task.isRecurring) {
105
+ printIndicator('recurring',task);
106
+ }
107
+
108
+ // Print Tags
109
+ let tagstyle = task.isCompleted ? styles.completed : styles.tags;
110
+ for ( let i = 0; i < task.tags.length; i++ ) {
111
+ log.style(' ');
112
+ log.style('#' + task.tags[i], tagstyle);
113
+ }
114
+
115
+ // Print Due Date / Completed Date
116
+ if ( !task.isCompleted ) {
117
+ if ( task.due ) {
118
+ log.style(' ');
119
+ log.style('|', styles.due);
120
+ log.style(' ');
121
+ log.style(df(task.due, config.get().dateformat), styles.due);
122
+ }
123
+ }
124
+ else {
125
+ if ( task.completed ) {
126
+ log.style(' ');
127
+ log.style('x', styles.completed);
128
+ log.style(' ');
129
+ log.style(df(task.completed, config.get().dateformat), styles.completed);
130
+ }
131
+ }
132
+
133
+ // Finish line
134
+ log('');
135
+
136
+ }
137
+
138
+ // Finish
139
+ return finish();
140
+
141
+ });
142
+
143
+ });
144
+
145
+ }
146
+
147
+
148
+ /**
149
+ * Pad the Index number with leading 0s
150
+ * @param index Task Index Number
151
+ * @param maxIndex Max Task Index
152
+ * @returns {string}
153
+ * @private
154
+ */
155
+ function _pad(index, maxIndex) {
156
+ let max = maxIndex.toString().length;
157
+ let digits = index.toString().length;
158
+ let delta = max - digits;
159
+ for ( let i = 0; i < delta; i++ ) {
160
+ index = '0' + index;
161
+ }
162
+ return index;
163
+ }
164
+
165
+
166
+
167
+ module.exports = {
168
+ command: 'lsp [filter...]',
169
+ description: 'List all tasks sorted first by priority then due date',
170
+ action: action
171
+ };
@@ -0,0 +1,83 @@
1
+ 'use strict';
2
+
3
+ const log = require('../utils/log.js');
4
+ const config = require('../utils/config.js');
5
+ const { prompt } = require('../utils/prompt.js');
6
+
7
+ const finish = require('../utils/finish.js');
8
+
9
+
10
+ /**
11
+ * This command moves the Task to a different list
12
+ * @param args index list
13
+ * @param env
14
+ */
15
+ function action(args, env) {
16
+
17
+ // Prompt for List
18
+ if ( args.length < 2 ) {
19
+ prompt('Task:', 'List:', _promptFinished);
20
+ }
21
+
22
+ // Use provided args
23
+ else {
24
+ _process(args[0], args[1].join(' '));
25
+ }
26
+
27
+ }
28
+
29
+
30
+ /**
31
+ * Process the returned answers
32
+ * @private
33
+ */
34
+ function _promptFinished(answers) {
35
+ for ( let i = 0; i < answers.length; i++ ) {
36
+ let answer = answers[i];
37
+ _process(answer[0], answer[1], i+1, answers.length);
38
+ }
39
+ }
40
+
41
+
42
+ /**
43
+ * Process the request
44
+ * @private
45
+ */
46
+ function _process(task, list, count=1, max=1) {
47
+ log.spinner.start("Moving Task(s)...");
48
+ config.user(function(user) {
49
+
50
+ // Parse arguments
51
+ task = parseInt(task.trim());
52
+ list = list.trim();
53
+
54
+ // Set Name
55
+ user.tasks.move(task, list, function(err) {
56
+ if ( err ) {
57
+ log.spinner.error("Could not move Task #" + task + " (" + err.msg + ")");
58
+ }
59
+ _processFinished(count, max);
60
+ });
61
+
62
+ });
63
+ }
64
+
65
+ /**
66
+ * Request Callback
67
+ * @private
68
+ */
69
+ function _processFinished(count, max) {
70
+ log.spinner.start("Moving Task [" + count + "/" + max + "]...");
71
+ if ( count === max ) {
72
+ log.spinner.success("Task(s) Moved");
73
+ return finish();
74
+ }
75
+ }
76
+
77
+
78
+ module.exports = {
79
+ command: 'move [index] [list...]',
80
+ alias: 'mv',
81
+ description: 'Move Task to a different List',
82
+ action: action
83
+ };