@uss-stargazer/job-queue 0.0.1 → 0.0.3
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/README.md +55 -3
- package/dist/actions.js +5 -1
- package/dist/actions.js.map +1 -0
- package/dist/data/config.js +64 -50
- package/dist/data/config.js.map +1 -0
- package/dist/data/index.js +43 -1
- package/dist/data/index.js.map +1 -0
- package/dist/data/jobqueue.js +14 -3
- package/dist/data/jobqueue.js.map +1 -0
- package/dist/data/projectpool.js +24 -3
- package/dist/data/projectpool.js.map +1 -0
- package/dist/index.js +124 -32
- package/dist/index.js.map +1 -0
- package/dist/utils/gistData.js +117 -0
- package/dist/utils/gistData.js.map +1 -0
- package/dist/utils/gistData.test.js +188 -0
- package/dist/utils/gistData.test.js.map +1 -0
- package/dist/utils/index.js +13 -68
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/jsonData.js +13 -10
- package/dist/utils/jsonData.js.map +1 -0
- package/dist/utils/jsonData.test.js +58 -0
- package/dist/utils/jsonData.test.js.map +1 -0
- package/dist/utils/promptUser.js +211 -0
- package/dist/utils/promptUser.js.map +1 -0
- package/dist/utils/sortableCheckbox.js +4 -0
- package/dist/utils/sortableCheckbox.js.map +1 -0
- package/index.js +6 -5
- package/package.json +10 -2
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# job-queue
|
|
2
2
|
|
|
3
3
|
The concept is modeling your todo-list as bite-sized jobs in a First-In, First-Out (FIFO) queue.
|
|
4
4
|
The goal is to increase productivity.
|
|
@@ -8,7 +8,7 @@ The goal is to increase productivity.
|
|
|
8
8
|
|
|
9
9
|
## Install
|
|
10
10
|
|
|
11
|
-
Can be installed system-wide if you have
|
|
11
|
+
Can be installed system-wide if you have NodeJS installed:
|
|
12
12
|
|
|
13
13
|
```
|
|
14
14
|
npm install --global @uss-stargazer/job-queue
|
|
@@ -22,7 +22,59 @@ job-queue --help
|
|
|
22
22
|
jobq --help
|
|
23
23
|
```
|
|
24
24
|
|
|
25
|
-
##
|
|
25
|
+
## Usage
|
|
26
|
+
|
|
27
|
+
***TLDR***: The CLI tries to be user friendly, so just use it...
|
|
28
|
+
|
|
29
|
+
It's just based on a few files: config.json, jobqueue.json, and projectpool.json. Strives to be
|
|
30
|
+
a bit like Git in the sense that it opens data structures in the user's editor for updating data.
|
|
31
|
+
|
|
32
|
+
### JSON schemas
|
|
33
|
+
|
|
34
|
+
It's recommended that you use an editor or editor plugin with some sort of intellisense for JSON
|
|
35
|
+
schemas, as it makes it much easier to work with.
|
|
36
|
+
|
|
37
|
+
If this isn't available, the expected structures can be found in the Zod schemas in
|
|
38
|
+
`src/data/$TARGET.ts` (at the top of each).
|
|
39
|
+
|
|
40
|
+
### Config options
|
|
41
|
+
|
|
42
|
+
- `editor`: string to edit file when filepath is appended. If not specified, is infered from
|
|
43
|
+
environment vars or from your Git configuration, if you have that installed.
|
|
44
|
+
- `confirmGistUpdates`: whether it should check before pushing or pulling gists from GitHub, if you
|
|
45
|
+
have any set up (see [here](#syncing-with-gists)).
|
|
46
|
+
- `confirmOffline`: whether to check before going into offline mode when there are gists configured
|
|
47
|
+
and `github.com` cannot be resolved.
|
|
48
|
+
- `showBanner`: whether to show ASCII art banner on start
|
|
49
|
+
|
|
50
|
+
### Syncing with gists
|
|
51
|
+
|
|
52
|
+
`job-queue` allows you to sync data files with a gist/gists on your GitHub account. This provides
|
|
53
|
+
cloud storage and makes the program more portable.
|
|
54
|
+
|
|
55
|
+
To link to a gist, provide the gist ID and a GitHub access token in config.json, like:
|
|
56
|
+
|
|
57
|
+
```json
|
|
58
|
+
{
|
|
59
|
+
"$schema": "/job-queue/schemas/config.schema.json",
|
|
60
|
+
"jobqueue": {
|
|
61
|
+
"local": "/job-queue/jobqueue.json",
|
|
62
|
+
"ghGistId": "00000000000000000000000000000000",
|
|
63
|
+
"ghAccessToken": "ghp_000000000000000000000000000000000000"
|
|
64
|
+
},
|
|
65
|
+
"projectpool": {
|
|
66
|
+
"local": "/job-queue/projectpool.json",
|
|
67
|
+
"ghGistId": "00000000000000000000000000000000",
|
|
68
|
+
"ghAccessToken": "ghp_000000000000000000000000000000000000"
|
|
69
|
+
},
|
|
70
|
+
"schemas": "/job-queue/schemas",
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Your gist ID can be copied easily from the URL; usually something like `https://gist.github.com/USERNAME/GIST_ID`.
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
## Sample Workflow
|
|
26
78
|
|
|
27
79
|
- _\[Daemon\]_ Spontaneous, not fleshed out ideas get immediately added to the project pool as "inactive".
|
|
28
80
|
- You should generally have an idea of a few projects you want to focus on at a time. For each, push
|
package/dist/actions.js
CHANGED
|
@@ -86,6 +86,7 @@ const actions = {
|
|
|
86
86
|
});
|
|
87
87
|
reorder(queue, reorderedQueueIdxs.map(({ value: jobIdx }) => jobIdx));
|
|
88
88
|
console.log(chalk.green('✔'), 'Queue reordered.');
|
|
89
|
+
// Open checked activities for editing
|
|
89
90
|
const checkedActivities = reorderedQueueIdxs
|
|
90
91
|
.map(({ checked }, jobIdx) => ({ checked, jobIdx }))
|
|
91
92
|
.filter(({ checked }) => checked);
|
|
@@ -144,6 +145,7 @@ const actions = {
|
|
|
144
145
|
console.log(chalk.red('[e]'), 'No projects in pool.');
|
|
145
146
|
return;
|
|
146
147
|
}
|
|
148
|
+
// Get project name to edit
|
|
147
149
|
const projectName = await search({
|
|
148
150
|
message: 'Enter the name of the project to edit',
|
|
149
151
|
source: (partialProjectName) => {
|
|
@@ -158,6 +160,7 @@ const actions = {
|
|
|
158
160
|
if (projectIdx < 0)
|
|
159
161
|
throw new Error('Invalid project name');
|
|
160
162
|
const [project] = pool.splice(projectIdx, 1);
|
|
163
|
+
// Do the editing
|
|
161
164
|
try {
|
|
162
165
|
const updatedProject = await updateProject(project, projectpool, jobqueue, config.data);
|
|
163
166
|
if (updatedProject !== 'deleted') {
|
|
@@ -170,7 +173,7 @@ const actions = {
|
|
|
170
173
|
await projectpool.sync();
|
|
171
174
|
}
|
|
172
175
|
catch (error) {
|
|
173
|
-
if (error instanceof AbortError)
|
|
176
|
+
if (!(error instanceof AbortError))
|
|
174
177
|
throw error;
|
|
175
178
|
console.log(chalk.red('[e]'), error.message);
|
|
176
179
|
pool.push(project);
|
|
@@ -178,3 +181,4 @@ const actions = {
|
|
|
178
181
|
},
|
|
179
182
|
};
|
|
180
183
|
export default actions;
|
|
184
|
+
//# sourceMappingURL=actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,gBAAgB,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAO,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAW,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAG/D,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,YAAY;IACZ,YAAY;IACZ,WAAW;IACX,YAAY;IACZ,aAAa;CACL,CAAC;AAIX,MAAM,CAAC,MAAM,sBAAsB,GAAiB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;AAChF,MAAM,CAAC,MAAM,0BAA0B,GAAiB;IACtD,YAAY;IACZ,aAAa;CACd,CAAC;AAEF,MAAM,OAAO,GAET;IACF,UAAU,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE;QACtD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;QAClC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAE1B,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,mBAAmB,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAClE,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC7B,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,2BAA2B,CAAC,CAAC;YAC7D,CAAC;YAED,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACxB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,CAAC,KAAK,YAAY,UAAU,CAAC;gBAAE,MAAM,KAAK,CAAC;YAEhD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7C,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,UAAU,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE;QACtD,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,sCAAsC,CAAC,CAAC;YACtE,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;QAClC,MAAM,cAAc,GAAQ;YAC1B,IAAI,EAAE,eAAe;YACrB,WAAW,EAAE;gBACX,6BAA6B;gBAC7B,6BAA6B;aAC9B;YACD,OAAO,EAAE,gBAAgB;YACzB,OAAO,EAAE,iBAAiB;SAC3B,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,cAAc,EAAE,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YACtE,IAAI,GAAG,KAAK,SAAS;gBAAE,MAAM,IAAI,UAAU,CAAC,iBAAiB,CAAC,CAAC;YAE/D,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,cAAc,CAAC,CAAC;YAC9C,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACxB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,CAAC,KAAK,YAAY,UAAU,CAAC;gBAAE,MAAM,KAAK,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,SAAS,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE;QACrD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;QAClC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,mBAAmB,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QAED,MAAM,kBAAkB,GAAG,MAAM,gBAAgB,CAAC;YAChD,OAAO,EAAE,0CAA0C;YACnD,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;gBACnC,IAAI,EAAE,IAAI,GAAG,CAAC,OAAO,KAAK,GAAG,CAAC,IAAI,EAAE;gBACpC,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;SACJ,CAAC,CAAC;QAEH,OAAO,CACL,KAAK,EACL,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CACtD,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAElD,sCAAsC;QAEtC,MAAM,iBAAiB,GAAG,kBAAkB;aACzC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;aACnD,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;QAEpC,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,KACE,IAAI,UAAU,GAAG,CAAC,EAClB,UAAU,GAAG,iBAAiB,CAAC,MAAM,EACrC,UAAU,EAAE,EACZ,CAAC;gBACD,MAAM,MAAM,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;gBAEpD,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;oBAC1B,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;oBAClE,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;wBAC7B,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;wBACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,QAAQ,GAAG,CAAC,IAAI,YAAY,CAAC,CAAC;oBAC9D,CAAC;yBAAM,CAAC;wBACN,KAAK,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC;wBAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,QAAQ,UAAU,CAAC,IAAI,WAAW,CAAC,CAAC;oBACpE,CAAC;oBAED,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACxB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,CAAC,KAAK,YAAY,UAAU,CAAC;wBAAE,MAAM,KAAK,CAAC;oBAEhD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;oBAC7C,IACE,UAAU,GAAG,CAAC,GAAG,iBAAiB,CAAC,MAAM;wBACzC,CAAC,MAAM,OAAO,CAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAC;wBAEhD,MAAM;gBACV,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,UAAU,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE;QACtD,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;QACnC,MAAM,kBAAkB,GAAY;YAClC,IAAI,EAAE,gBAAgB;YACtB,WAAW,EAAE,gCAAgC;YAC7C,IAAI,EAAE,kCAAkC;YACxC,MAAM,EAAE,UAAU;SACnB,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,aAAa,CACjC,kBAAkB,EAClB,WAAW,EACX,QAAQ,EACR,MAAM,CAAC,IAAI,CACZ,CAAC;YACF,IAAI,OAAO,KAAK,SAAS;gBAAE,MAAM,IAAI,UAAU,CAAC,qBAAqB,CAAC,CAAC;YAEvE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,mBAAmB,CAAC,CAAC;YACnD,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,CAAC,KAAK,YAAY,UAAU,CAAC;gBAAE,MAAM,KAAK,CAAC;YAEhD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,WAAW,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE;QACvD,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;QACnC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,sBAAsB,CAAC,CAAC;YACtD,OAAO;QACT,CAAC;QAED,2BAA2B;QAE3B,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC;YAC/B,OAAO,EAAE,uCAAuC;YAChD,MAAM,EAAE,CAAC,kBAAkB,EAAE,EAAE;gBAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACzD,IAAI,CAAC,kBAAkB;oBAAE,OAAO,YAAY,CAAC;gBAE7C,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC;gBACpD,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CACzC,UAAU,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CACjD,CAAC;YACJ,CAAC;SACF,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAC/B,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,CAC1C,CAAC;QACF,IAAI,UAAU,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC5D,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAE7C,iBAAiB;QAEjB,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,MAAM,aAAa,CACxC,OAAO,EACP,WAAW,EACX,QAAQ,EACR,MAAM,CAAC,IAAI,CACZ,CAAC;YACF,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;gBACjC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,gBAAgB,CAAC,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,iBAAiB,CAAC,CAAC;YACnD,CAAC;YAED,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,CAAC,KAAK,YAAY,UAAU,CAAC;gBAAE,MAAM,KAAK,CAAC;YAEhD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;CACO,CAAC;AAEX,eAAe,OAAO,CAAC"}
|
package/dist/data/config.js
CHANGED
|
@@ -3,13 +3,14 @@ import envPaths from 'env-paths';
|
|
|
3
3
|
import path from 'path';
|
|
4
4
|
import fs from 'fs/promises';
|
|
5
5
|
import { existsSync } from 'fs';
|
|
6
|
-
import { makeJsonData } from '../utils/jsonData.js';
|
|
7
6
|
import chalk from 'chalk';
|
|
8
7
|
import { JobQueueSchema, JobSchema } from './jobqueue.js';
|
|
9
|
-
import { ProjectPoolSchema, ProjectSchema
|
|
8
|
+
import { ProjectPoolSchema, ProjectSchema } from './projectpool.js';
|
|
10
9
|
import { confirm } from '@inquirer/prompts';
|
|
11
10
|
import { fileURLToPath, pathToFileURL } from 'url';
|
|
12
11
|
import pkg from '../../package.json' with { type: 'json' };
|
|
12
|
+
import { getDataTargetNicely } from '../utils/promptUser.js';
|
|
13
|
+
// Types / Schemas
|
|
13
14
|
const jsonSchemaNames = [
|
|
14
15
|
'job',
|
|
15
16
|
'jobqueue',
|
|
@@ -18,12 +19,41 @@ const jsonSchemaNames = [
|
|
|
18
19
|
'config',
|
|
19
20
|
];
|
|
20
21
|
const NonemptyString = z.string().nonempty();
|
|
22
|
+
// prettier-ignore
|
|
23
|
+
const GistDataObject = z.object({
|
|
24
|
+
local: NonemptyString.meta({ title: "Local JSON path", description: "Path to local JSON file for data linked to the Gist." }),
|
|
25
|
+
ghGistId: NonemptyString.regex(/^[A-Fa-f0-9]{32}$/, { error: "Is not valid GitHub gist ID" }).meta({ title: "Gist ID", description: "ID of gist to link (can get from URL of the gist you created)." }),
|
|
26
|
+
ghAccessToken: NonemptyString.regex(/^(gh[ps]_[a-zA-Z0-9]{36}|github_pat_[a-zA-Z0-9]{22}_[a-zA-Z0-9]{59})$/, { error: "Is not valid GitHub access token" }).meta({ title: "Gist Access Token", description: "GitHub access token for read/write access to your gist." })
|
|
27
|
+
}).meta({ title: "Gist-Linked JSON", description: "Data for a configuration/data file linked to a GitHub gist." });
|
|
28
|
+
// !!! NOTE !!! Whenever you change this schema, PLEASE update package.json version (so JSON schemas will get updated automatically)
|
|
29
|
+
// prettier-ignore
|
|
21
30
|
export const ConfigSchema = z.object({
|
|
22
|
-
jobqueue:
|
|
23
|
-
|
|
24
|
-
|
|
31
|
+
jobqueue: z.union([
|
|
32
|
+
NonemptyString.meta({ title: "Jobqueue path", description: "Path to local jobqueue.json." }),
|
|
33
|
+
GistDataObject.meta({ title: "Gist-Linked Jobqueue", description: "Data for jobqueue.json locally and linked to gist on GitHub." })
|
|
34
|
+
]),
|
|
35
|
+
projectpool: z.union([
|
|
36
|
+
NonemptyString.meta({ title: "Projectpool path", description: "Path to local projectpool.json." }),
|
|
37
|
+
GistDataObject.meta({ title: "Gist-Linked Jobqueue", description: "Data for projectpool.json locally and linked to gist on GitHub." })
|
|
38
|
+
]),
|
|
39
|
+
// schemas stored as path to schemas dir, but expanded on parse
|
|
25
40
|
schemas: NonemptyString.meta({ title: "Schemas directory", description: `Path to directory containing: ${jsonSchemaNames.map(base => `${base}.schema.json`).join(", ")}.` }).transform((schemasDir) => Object.fromEntries(jsonSchemaNames.map((base) => [base, pathToFileURL(path.resolve(schemasDir, `${base}.schema.json`)).href]))),
|
|
41
|
+
editor: NonemptyString.optional().meta({ title: "Editor command", description: "Command to run editor. Will be run like `<editor> /some/data.json` so make sure it waits." }),
|
|
42
|
+
confirmGistUpdates: z.boolean().optional().describe("Whether to prompt before pushing or pulling a gist from GitHub."),
|
|
43
|
+
confirmOffline: z.boolean().optional().describe("Whether to confirm before using offline (if there are gists in config)."),
|
|
44
|
+
showBanner: z.boolean().optional().describe("Show ASCII art banner on start.")
|
|
26
45
|
});
|
|
46
|
+
export const toInputConfig = (outputData) => {
|
|
47
|
+
const schemaDir = Object.values(outputData.schemas).reduce((schemaDir, schemaPath) => {
|
|
48
|
+
const thisSchemaDir = path.dirname(fileURLToPath(schemaPath));
|
|
49
|
+
return schemaDir === null || schemaDir === thisSchemaDir
|
|
50
|
+
? thisSchemaDir
|
|
51
|
+
: (() => {
|
|
52
|
+
throw new Error('Decoded invidual schemas are not in the same directory.');
|
|
53
|
+
})();
|
|
54
|
+
}, null);
|
|
55
|
+
return { ...outputData, schemas: schemaDir };
|
|
56
|
+
};
|
|
27
57
|
const jsonSchemas = {
|
|
28
58
|
job: JobSchema,
|
|
29
59
|
jobqueue: JobQueueSchema,
|
|
@@ -31,7 +61,9 @@ const jsonSchemas = {
|
|
|
31
61
|
projectpool: ProjectPoolSchema,
|
|
32
62
|
config: ConfigSchema,
|
|
33
63
|
};
|
|
34
|
-
|
|
64
|
+
// Methods
|
|
65
|
+
const updateNestedObject = async (// eslint-disable-line @typescript-eslint/no-explicit-any
|
|
66
|
+
base, update) => {
|
|
35
67
|
const keys = [...Object.keys(update)];
|
|
36
68
|
for (const key of keys) {
|
|
37
69
|
if (typeof base[key] === 'object' &&
|
|
@@ -48,11 +80,14 @@ const updateNestedObject = async (base, update) => {
|
|
|
48
80
|
}
|
|
49
81
|
}
|
|
50
82
|
};
|
|
83
|
+
// JSON schema methods
|
|
51
84
|
const getJsonSchemaId = (schemaFileUrl) => path.posix.join(pkg.version, path.basename(fileURLToPath(schemaFileUrl)));
|
|
52
85
|
const versionFromJsonSchemaId = (id) => path.dirname(id);
|
|
53
86
|
const updateJsonSchema = async (schemaSchema, schemaFileUrl) => {
|
|
54
87
|
const schemaPath = fileURLToPath(schemaFileUrl);
|
|
55
|
-
|
|
88
|
+
const schemaDir = path.dirname(schemaPath);
|
|
89
|
+
if (!existsSync(schemaDir))
|
|
90
|
+
await fs.mkdir(schemaDir, { recursive: true });
|
|
56
91
|
return await fs.writeFile(schemaPath, JSON.stringify({
|
|
57
92
|
$id: getJsonSchemaId(schemaFileUrl),
|
|
58
93
|
...schemaSchema.toJSONSchema({
|
|
@@ -61,10 +96,8 @@ const updateJsonSchema = async (schemaSchema, schemaFileUrl) => {
|
|
|
61
96
|
}),
|
|
62
97
|
}, undefined, ' '));
|
|
63
98
|
};
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
projectpool: { pool: [] },
|
|
67
|
-
};
|
|
99
|
+
// Config methods
|
|
100
|
+
export const getDataPathFromConfig = (data) => (typeof data === 'string' ? data : data.local);
|
|
68
101
|
const createConfig = async (configDir, override) => {
|
|
69
102
|
const config = {
|
|
70
103
|
jobqueue: path.resolve(configDir, 'jobqueue.json'),
|
|
@@ -73,39 +106,20 @@ const createConfig = async (configDir, override) => {
|
|
|
73
106
|
...override,
|
|
74
107
|
};
|
|
75
108
|
const decodedConfig = ConfigSchema.decode(config);
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
await fs.writeFile(config[key], JSON.stringify({
|
|
80
|
-
$schema: decodedConfig.schemas[key],
|
|
81
|
-
...defaultData[key],
|
|
82
|
-
}, undefined, ' '));
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
await fs.mkdir(config.schemas);
|
|
109
|
+
// schemas
|
|
110
|
+
if (!existsSync(config.schemas))
|
|
111
|
+
await fs.mkdir(config.schemas);
|
|
86
112
|
for (const schema of jsonSchemaNames) {
|
|
87
113
|
if (!existsSync(decodedConfig.schemas[schema])) {
|
|
88
114
|
console.log(chalk.blue('[i]'), `Creating ${path.join('{config}', path.relative(configDir, fileURLToPath(decodedConfig.schemas[schema])))}...`);
|
|
89
115
|
await updateJsonSchema(jsonSchemas[schema], decodedConfig.schemas[schema]);
|
|
90
116
|
}
|
|
91
117
|
}
|
|
92
|
-
return { encoded: config,
|
|
118
|
+
return { encoded: config, jsonSchemaUrl: decodedConfig.schemas.config };
|
|
93
119
|
};
|
|
94
|
-
const
|
|
120
|
+
const checkConfigSchemas = async (config, configPath) => {
|
|
95
121
|
try {
|
|
96
|
-
|
|
97
|
-
if (!existsSync(config[key]))
|
|
98
|
-
if (['jobqueue', 'projectpool'].includes(key) &&
|
|
99
|
-
(await confirm({
|
|
100
|
-
message: `File at config.${key} does not exist. Want to create it?`,
|
|
101
|
-
})))
|
|
102
|
-
await fs.writeFile(config[key], JSON.stringify({
|
|
103
|
-
$schema: config.schemas[key],
|
|
104
|
-
...defaultData[key],
|
|
105
|
-
}, undefined, ' '));
|
|
106
|
-
else
|
|
107
|
-
throw new Error(`File '${config[key]}' in config does not exist`);
|
|
108
|
-
}
|
|
122
|
+
// Make sure each schema exists and is the correct version
|
|
109
123
|
const outdatedSchemas = [];
|
|
110
124
|
for (const schema of Object.keys(config.schemas)) {
|
|
111
125
|
const schemaPath = fileURLToPath(config.schemas[schema]);
|
|
@@ -115,7 +129,7 @@ const checkConfig = async (config, configPath) => {
|
|
|
115
129
|
}));
|
|
116
130
|
const version = schemaJson.$id && versionFromJsonSchemaId(schemaJson.$id);
|
|
117
131
|
if (!version || !/^\d+\.\d+\.\d+$/.test(version)) {
|
|
118
|
-
console.log(chalk.yellow('[w]'), `${path.join('{
|
|
132
|
+
console.log(chalk.yellow('[w]'), `${path.join('{schemas}', path.basename(config.schemas[schema]))} is malformed. Overwriting...`);
|
|
119
133
|
await updateJsonSchema(jsonSchemas[schema], config.schemas[schema]);
|
|
120
134
|
}
|
|
121
135
|
else if (version !== pkg.version) {
|
|
@@ -123,7 +137,7 @@ const checkConfig = async (config, configPath) => {
|
|
|
123
137
|
}
|
|
124
138
|
}
|
|
125
139
|
else {
|
|
126
|
-
console.log(chalk.blue('[i]'), `${path.join('{
|
|
140
|
+
console.log(chalk.blue('[i]'), `${path.join('{schemas}', path.basename(config.schemas[schema]))} does not exist. Creating...`);
|
|
127
141
|
await updateJsonSchema(jsonSchemas[schema], config.schemas[schema]);
|
|
128
142
|
}
|
|
129
143
|
}
|
|
@@ -142,17 +156,17 @@ const checkConfig = async (config, configPath) => {
|
|
|
142
156
|
export const getConfig = async (overrideConfigDir, overrideConfig) => {
|
|
143
157
|
const configDir = overrideConfigDir ?? path.resolve(envPaths('job-queue').config);
|
|
144
158
|
const configPath = path.resolve(configDir, 'config.json');
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
$schema: decodedConfig.schemas['config'],
|
|
151
|
-
...config,
|
|
152
|
-
}, undefined, ' '));
|
|
153
|
-
}
|
|
154
|
-
const configData = await makeJsonData(configPath, ConfigSchema);
|
|
155
|
-
await checkConfig(configData.data, configPath);
|
|
159
|
+
if (!existsSync(configDir))
|
|
160
|
+
await fs.mkdir(configDir, { recursive: true });
|
|
161
|
+
// Get config data
|
|
162
|
+
const { data: configData, hadToCreate } = await getDataTargetNicely(ConfigSchema, { name: 'config.json', expectedPath: configPath }, () => createConfig(configDir, overrideConfig), false, toInputConfig);
|
|
163
|
+
// Validate and apply config data contents
|
|
156
164
|
await updateNestedObject(configData.data, ConfigSchema.partial().decode(overrideConfig));
|
|
157
|
-
|
|
165
|
+
await checkConfigSchemas(configData.data, configPath);
|
|
166
|
+
return {
|
|
167
|
+
config: configData,
|
|
168
|
+
path: configPath,
|
|
169
|
+
hadToCreate,
|
|
170
|
+
};
|
|
158
171
|
};
|
|
172
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/data/config.ts"],"names":[],"mappings":"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"}
|
package/dist/data/index.js
CHANGED
|
@@ -1,9 +1,51 @@
|
|
|
1
1
|
import { JobQueueSchema } from './jobqueue.js';
|
|
2
2
|
import { ProjectPoolSchema } from './projectpool.js';
|
|
3
|
-
import { ConfigSchema } from './config.js';
|
|
3
|
+
import { ConfigSchema, getDataPathFromConfig, toInputConfig, } from './config.js';
|
|
4
|
+
import { select } from '@inquirer/prompts';
|
|
5
|
+
import { ExitPromptError } from '@inquirer/core';
|
|
6
|
+
import { AbortError } from '../utils/index.js';
|
|
7
|
+
import chalk from 'chalk';
|
|
8
|
+
import { haveUserUpdateData } from '../utils/promptUser.js';
|
|
4
9
|
export const dataNames = ['jobqueue', 'projectpool', 'config'];
|
|
5
10
|
export const dataSchemas = {
|
|
6
11
|
jobqueue: JobQueueSchema,
|
|
7
12
|
projectpool: ProjectPoolSchema,
|
|
8
13
|
config: ConfigSchema,
|
|
9
14
|
};
|
|
15
|
+
export async function editData(data, configPath) {
|
|
16
|
+
try {
|
|
17
|
+
const target = await select({
|
|
18
|
+
message: 'Select data to edit',
|
|
19
|
+
choices: [
|
|
20
|
+
{ name: 'jobqueue.json', value: 'jobqueue' },
|
|
21
|
+
{ name: 'projectpool.json', value: 'projectpool' },
|
|
22
|
+
{ name: 'config.json', value: 'config' },
|
|
23
|
+
],
|
|
24
|
+
});
|
|
25
|
+
const targetSchema = dataSchemas[target];
|
|
26
|
+
const targetPath = target === 'config'
|
|
27
|
+
? configPath
|
|
28
|
+
: getDataPathFromConfig(data.config.data[target]);
|
|
29
|
+
await haveUserUpdateData(targetSchema, target === 'config'
|
|
30
|
+
? toInputConfig(data[target].data)
|
|
31
|
+
: data[target].data, {
|
|
32
|
+
editor: data.config.data.editor,
|
|
33
|
+
errorHead: 'Edit data failed',
|
|
34
|
+
jsonSchemaUrl: data.config.data.schemas[target],
|
|
35
|
+
file: { type: 'abs', path: targetPath },
|
|
36
|
+
}, {
|
|
37
|
+
preparse(raw) {
|
|
38
|
+
return raw.trim().length === 0
|
|
39
|
+
? { errMessage: 'Cannot delete data file.' }
|
|
40
|
+
: 'continue';
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
if (error instanceof AbortError || error instanceof ExitPromptError)
|
|
46
|
+
console.log(chalk.red('[e]'), error.message);
|
|
47
|
+
else
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/data/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,aAAa,GACd,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAG5D,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,UAAU,EAAE,aAAa,EAAE,QAAQ,CAAU,CAAC;AAExE,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,QAAQ,EAAE,cAAc;IACxB,WAAW,EAAE,iBAAiB;IAC9B,MAAM,EAAE,YAAY;CAC6B,CAAC;AAWpD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,IAAiB,EACjB,UAAkB;IAElB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC;YAC1B,OAAO,EAAE,qBAAqB;YAC9B,OAAO,EAAE;gBACP,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,EAAE;gBAC5C,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,aAAa,EAAE;gBAClD,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE;aAChC;SACX,CAAC,CAAC;QACH,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QACzC,MAAM,UAAU,GACd,MAAM,KAAK,QAAQ;YACjB,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAEtD,MAAM,kBAAkB,CACtB,YAAY,EACZ,MAAM,KAAK,QAAQ;YACjB,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;YAClC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EACrB;YACE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM;YAC/B,SAAS,EAAE,kBAAkB;YAC7B,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YAC/C,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE;SACxC,EACD;YACE,QAAQ,CAAC,GAAG;gBACV,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;oBAC5B,CAAC,CAAC,EAAE,UAAU,EAAE,0BAA0B,EAAE;oBAC5C,CAAC,CAAC,UAAU,CAAC;YACjB,CAAC;SACF,CACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,UAAU,IAAI,KAAK,YAAY,eAAe;YACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;;YAC1C,MAAM,KAAK,CAAC;IACnB,CAAC;AACH,CAAC"}
|
package/dist/data/jobqueue.js
CHANGED
|
@@ -1,17 +1,25 @@
|
|
|
1
1
|
import * as z from 'zod';
|
|
2
|
-
import { makeJsonData } from '../utils/jsonData.js';
|
|
3
2
|
import { checkProjectName } from './projectpool.js';
|
|
4
|
-
import {
|
|
3
|
+
import { makeGistData } from '../utils/gistData.js';
|
|
4
|
+
import { getDataTargetNicely, handleInvalidGist, haveUserUpdateData, makeGistConflictHandler, } from '../utils/promptUser.js';
|
|
5
|
+
// Types / Schemas
|
|
6
|
+
// prettier-ignore
|
|
5
7
|
export const JobSchema = z.object({
|
|
6
8
|
name: z.string().trim().nonempty().meta({ title: 'Job name', description: 'Short name of the job (think a single commit message). Used as job identifier.' }),
|
|
7
9
|
objectivies: z.array(z.string().trim().nonempty()).meta({ title: 'Job objectivies', description: 'A list of objectives to complete for this job. Purely for your benefit.' }),
|
|
8
10
|
updates: z.string().optional().meta({ title: 'Job updates', description: "Put any notes/updates to the job here while you're working. Optional." }),
|
|
9
11
|
project: z.string().trim().nonempty().meta({ title: 'Associated project', description: 'Corresponding project ID in projectpool.json.' }),
|
|
10
12
|
}).meta({ title: 'Job', description: 'A single job entry for JobQueue.' });
|
|
13
|
+
// prettier-ignore
|
|
11
14
|
export const JobQueueSchema = z.object({
|
|
12
15
|
queue: z.array(JobSchema).meta({ title: 'Job queue' }),
|
|
13
16
|
}).meta({ title: 'Job queue root', description: 'Root object for jobs/tasks FIFO queue model.' });
|
|
14
|
-
|
|
17
|
+
const defaultJobQueue = { queue: [] };
|
|
18
|
+
// Methods
|
|
19
|
+
export const getJobQueue = async (jsonPath, jsonSchemaUrl, autoCreateFiles = false, editor) => {
|
|
20
|
+
const { data } = await getDataTargetNicely(JobQueueSchema, { name: 'jobqueue.json', expectedPath: jsonPath, jsonSchemaUrl }, async () => ({ encoded: defaultJobQueue }), autoCreateFiles);
|
|
21
|
+
return await makeGistData(JobQueueSchema, data, 'jobqueue.json', makeGistConflictHandler(JobQueueSchema, editor), handleInvalidGist, "JSON to keep track of `jobqueue` data for this user's job-queue implementation (this is probably autogenerated).");
|
|
22
|
+
};
|
|
15
23
|
export const updateJob = async (job, projectPool, config) => {
|
|
16
24
|
const pool = projectPool.data.pool;
|
|
17
25
|
let userDeletedJob = false;
|
|
@@ -26,6 +34,7 @@ export const updateJob = async (job, projectPool, config) => {
|
|
|
26
34
|
jsonSchemaUrl: config.schemas.job,
|
|
27
35
|
}, {
|
|
28
36
|
preparse(rawContents) {
|
|
37
|
+
// Check if user deleted the job
|
|
29
38
|
if (rawContents.trim().length === 0) {
|
|
30
39
|
userDeletedJob = true;
|
|
31
40
|
return 'pass';
|
|
@@ -41,6 +50,7 @@ export const updateJob = async (job, projectPool, config) => {
|
|
|
41
50
|
},
|
|
42
51
|
});
|
|
43
52
|
if (!userDeletedJob) {
|
|
53
|
+
// Make sure corresponding project is set to active
|
|
44
54
|
const jobProject = pool.find((project) => project.name === updatedJob.project);
|
|
45
55
|
if (jobProject.status !== 'active') {
|
|
46
56
|
jobProject.status = 'active';
|
|
@@ -49,3 +59,4 @@ export const updateJob = async (job, projectPool, config) => {
|
|
|
49
59
|
}
|
|
50
60
|
return userDeletedJob ? 'deleted' : updatedJob;
|
|
51
61
|
};
|
|
62
|
+
//# sourceMappingURL=jobqueue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobqueue.js","sourceRoot":"","sources":["../../src/data/jobqueue.ts"],"names":[],"mappings":"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"}
|
package/dist/data/projectpool.js
CHANGED
|
@@ -1,17 +1,25 @@
|
|
|
1
1
|
import { confirm } from '@inquirer/prompts';
|
|
2
2
|
import * as z from 'zod';
|
|
3
|
-
import {
|
|
4
|
-
import { haveUserUpdateData } from '../utils/
|
|
3
|
+
import { makeGistData } from '../utils/gistData.js';
|
|
4
|
+
import { getDataTargetNicely, handleInvalidGist, haveUserUpdateData, makeGistConflictHandler, } from '../utils/promptUser.js';
|
|
5
|
+
// Types / Schemas
|
|
6
|
+
// prettier-ignore
|
|
5
7
|
export const ProjectSchema = z.object({
|
|
6
8
|
name: z.string().trim().nonempty().meta({ title: 'Project name', description: 'Name of the project. Used as identifier.' }),
|
|
7
9
|
description: z.string().optional().meta({ title: 'Project description', description: 'Longer description of the project. For your benefit, optional.' }),
|
|
8
10
|
repo: z.url().optional().meta({ title: 'Project repository', description: 'URL to project repository. For your benefit, optional.' }),
|
|
9
11
|
status: z.enum(['active', 'inactive', 'complete']).meta({ title: 'Project status', description: "Status of this project. 'active': they are referenced in jobqueue.json, 'inactive': they aren't referenced anywhere and aren't done, 'complete': they're done." }),
|
|
10
12
|
}).meta({ title: 'Project', description: 'A single project entry for JobQueue (usually matches up with a GitHub repo, if you use that).' });
|
|
13
|
+
// prettier-ignore
|
|
11
14
|
export const ProjectPoolSchema = z.object({
|
|
12
15
|
pool: z.array(ProjectSchema).meta({ description: 'Set of projects, works in progress or just ideas.' }),
|
|
13
16
|
}).meta({ title: 'Root project pool', description: 'Root object for pool of projects.' });
|
|
14
|
-
|
|
17
|
+
const defaultProjectPool = { pool: [] };
|
|
18
|
+
// Methods
|
|
19
|
+
export const getProjectPool = async (jsonPath, jsonSchemaUrl, autoCreateFiles = false, editor) => {
|
|
20
|
+
const { data } = await getDataTargetNicely(ProjectPoolSchema, { name: 'projectpool.json', expectedPath: jsonPath, jsonSchemaUrl }, async () => ({ encoded: defaultProjectPool }), autoCreateFiles);
|
|
21
|
+
return await makeGistData(ProjectPoolSchema, data, 'projectpool.json', makeGistConflictHandler(ProjectPoolSchema, editor), handleInvalidGist, "JSON to keep track of `projectpool` data for this user's job-queue implementation (this is probably autogenerated).");
|
|
22
|
+
};
|
|
15
23
|
export const checkProjectName = (name, projects) => projects.some((project) => project.name === name);
|
|
16
24
|
export const updateProject = async (project, projectPool, jobQueue, config) => {
|
|
17
25
|
const pool = projectPool.data.pool;
|
|
@@ -28,6 +36,7 @@ export const updateProject = async (project, projectPool, jobQueue, config) => {
|
|
|
28
36
|
jsonSchemaUrl: config.schemas.project,
|
|
29
37
|
}, {
|
|
30
38
|
preparse(rawContents) {
|
|
39
|
+
// Check if user deleted the project
|
|
31
40
|
if (rawContents.trim().length === 0) {
|
|
32
41
|
userDeletedProject = true;
|
|
33
42
|
return 'pass';
|
|
@@ -48,6 +57,7 @@ export const updateProject = async (project, projectPool, jobQueue, config) => {
|
|
|
48
57
|
return 'continue';
|
|
49
58
|
},
|
|
50
59
|
});
|
|
60
|
+
// Check if user wants to rename referencing jobs
|
|
51
61
|
if (!userDeletedProject &&
|
|
52
62
|
updatedProject.name !== project.name &&
|
|
53
63
|
jobsReferencingProject.length > 0) {
|
|
@@ -61,5 +71,16 @@ export const updateProject = async (project, projectPool, jobQueue, config) => {
|
|
|
61
71
|
await jobQueue.sync();
|
|
62
72
|
}
|
|
63
73
|
}
|
|
74
|
+
// Check if user wants to delete referencing jobs
|
|
75
|
+
if (userDeletedProject && jobsReferencingProject.length > 0) {
|
|
76
|
+
const deleteJobReferences = await confirm({
|
|
77
|
+
message: `You are deleting this project. Would you like to delete all referencing jobs, too?`,
|
|
78
|
+
});
|
|
79
|
+
if (deleteJobReferences) {
|
|
80
|
+
jobQueue.data.queue = jobQueue.data.queue.filter((job) => job.project !== project.name);
|
|
81
|
+
await jobQueue.sync();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
64
84
|
return userDeletedProject ? 'deleted' : updatedProject;
|
|
65
85
|
};
|
|
86
|
+
//# sourceMappingURL=projectpool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectpool.js","sourceRoot":"","sources":["../../src/data/projectpool.ts"],"names":[],"mappings":"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"}
|