@jujulego/jill 3.0.0-alpha.6 → 3.0.0-alpha.8

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jujulego/jill",
3
- "version": "3.0.0-alpha.6",
3
+ "version": "3.0.0-alpha.8",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -30,7 +30,7 @@
30
30
  },
31
31
  "dependencies": {
32
32
  "@jujulego/quick-tag": "^1.0.3",
33
- "@jujulego/tasks": "^3.0.0-alpha.3",
33
+ "@jujulego/tasks": "3.0.0-alpha.10",
34
34
  "@kyrielle/injector": "^1.1.0",
35
35
  "@kyrielle/logger": "^2.0.0",
36
36
  "@sentry/node": "^10.5.0",
@@ -55,39 +55,44 @@
55
55
  },
56
56
  "devDependencies": {
57
57
  "@codecov/rollup-plugin": "1.9.1",
58
- "@eslint/js": "9.35.0",
58
+ "@eslint/js": "9.39.1",
59
59
  "@jujulego/2d-maths": "1.6.0",
60
- "@jujulego/vite-plugin-swc": "1.2.0",
60
+ "@jujulego/vite-plugin-swc": "1.2.1",
61
61
  "@microsoft/eslint-formatter-sarif": "3.1.0",
62
62
  "@rollup/plugin-json": "6.1.0",
63
- "@rollup/plugin-node-resolve": "16.0.1",
64
- "@sentry/rollup-plugin": "4.3.0",
65
- "@swc/core": "1.13.5",
63
+ "@rollup/plugin-node-resolve": "16.0.3",
64
+ "@sentry/rollup-plugin": "4.6.0",
65
+ "@swc/core": "1.15.0",
66
66
  "@types/moo": "0.5.10",
67
- "@types/node": "22.18.1",
67
+ "@types/node": "24.10.0",
68
68
  "@types/normalize-package-data": "2.4.4",
69
- "@types/react": "19.1.12",
69
+ "@types/react": "19.2.2",
70
70
  "@types/semver": "7.7.1",
71
- "@types/yargs": "17.0.33",
72
- "@typescript-eslint/utils": "8.43.0",
71
+ "@types/yargs": "17.0.34",
72
+ "@typescript-eslint/utils": "8.46.3",
73
73
  "@vitest/coverage-v8": "3.2.4",
74
- "@vitest/eslint-plugin": "1.3.9",
74
+ "@vitest/eslint-plugin": "1.4.1",
75
75
  "@vitest/expect": "3.2.4",
76
- "eslint": "9.35.0",
76
+ "eslint": "9.39.1",
77
77
  "eslint-plugin-react": "7.37.5",
78
- "eslint-plugin-react-hooks": "5.2.0",
79
- "globals": "16.4.0",
78
+ "eslint-plugin-react-hooks": "7.0.1",
79
+ "globals": "16.5.0",
80
80
  "ink-testing-library": "4.0.0",
81
- "jiti": "2.5.1",
82
- "memfs": "4.39.0",
83
- "rollup": "4.50.1",
81
+ "jiti": "2.6.1",
82
+ "memfs": "4.50.0",
83
+ "rollup": "4.52.5",
84
84
  "shx": "0.4.0",
85
85
  "ts-node": "10.9.2",
86
- "typescript": "5.9.2",
87
- "typescript-eslint": "8.43.0",
88
- "vite": "7.1.5",
86
+ "typescript": "5.9.3",
87
+ "typescript-eslint": "8.46.3",
88
+ "vite": "7.2.0",
89
89
  "vite-tsconfig-paths": "5.1.4",
90
90
  "vitest": "3.2.4"
91
91
  },
92
- "packageManager": "yarn@4.9.4"
93
- }
92
+ "packageManager": "yarn@4.10.3",
93
+ "dependenciesMeta": {
94
+ "@jujulego/tasks@3.0.0-alpha.8": {
95
+ "unplugged": true
96
+ }
97
+ }
98
+ }
package/dist/TaskName.js DELETED
@@ -1,33 +0,0 @@
1
- ;{try{(function(){var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="fd2e6226-ad62-4a9b-9f23-9546c2242256",e._sentryDebugIdIdentifier="sentry-dbid-fd2e6226-ad62-4a9b-9f23-9546c2242256");})();}catch(e){}};!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{};e.SENTRY_RELEASE={id:"3.0.0-alpha.6"};}catch(e){}}();import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
- import { Text } from 'ink';
3
- import { a as isScriptCtx } from './main.js';
4
-
5
- // Components
6
- function TaskName({ task, withWorkspace }) {
7
- if (isScriptCtx(task.context)) {
8
- return /*#__PURE__*/ jsxs(Text, {
9
- children: [
10
- "Run ",
11
- /*#__PURE__*/ jsx(Text, {
12
- bold: true,
13
- children: task.context.script
14
- }),
15
- " script",
16
- withWorkspace && /*#__PURE__*/ jsxs(Fragment, {
17
- children: [
18
- ' ',
19
- "in ",
20
- task.context.workspace.name
21
- ]
22
- })
23
- ]
24
- });
25
- } else {
26
- return /*#__PURE__*/ jsx(Text, {
27
- children: task.name
28
- });
29
- }
30
- }
31
-
32
- export { TaskName as T };
33
- //# sourceMappingURL=TaskName.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TaskName.js","sources":["../src/cli/components/TaskName.tsx"],"sourcesContent":["import { type Task, type TaskSummary } from '@jujulego/tasks';\nimport { Text } from 'ink';\nimport { isScriptCtx } from '../../tasks/script-task.js';\n\n// Components\nexport default function TaskName({ task, withWorkspace }: TaskNameProps) {\n if (isScriptCtx(task.context)) {\n return (\n <Text>\n Run <Text bold>{ task.context.script }</Text> script{ withWorkspace && <>{' '}in { task.context.workspace.name }</> }\n </Text>\n );\n } else {\n return <Text>{ task.name }</Text>;\n }\n}\n\n// Types\nexport interface TaskNameProps {\n readonly task: Task | TaskSummary;\n readonly withWorkspace?: boolean;\n}\n"],"names":["TaskName","task","withWorkspace","isScriptCtx","context","_jsxs","Text","_jsx","bold","script","_Fragment","workspace","name"],"mappings":";;;;AAIA,CAAA,CAAA,CAAA,UAAA;AACe,QAAA,CAASA,QAAAA,CAAS,CAAA,CAAEC,IAAI,CAAA,CAAEC,aAAa,EAAiB,CAAA,CAAA,CAAA;IACrE,IAAIC,WAAAA,CAAYF,IAAAA,CAAKG,OAAO,CAAA,CAAA,CAAG,CAAA;AAC7B,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAA,CAAA,CAAA,CAAA,CAAA,QAAA,CAAA,CAAA,CACEC,IAAA,CAACC,IAAAA,CAAAA,CAAAA,CAAAA;;AAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA;8BACAC,GAAA,CAACD,IAAAA,CAAAA,CAAAA,CAAAA;oBAAKE,IAAI,EAAA,IAAA,CAAA;8BAAGP,IAAAA,CAAKG,OAAO,CAACK,MAAAA;;AAAe,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAA,CAAA,CAAA;gBAASP,aAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,QAAAA,CAAAA,CAAAA,CAAiBG,IAAA,CAAAK,QAAA,CAAA,CAAA,CAAA;;AAAG,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AAAI,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA;AAAKT,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,IAAAA,CAAKG,OAAO,CAACO,SAAS,CAACC,IAAAA;;;;;IAGhH,CAAA,CAAA,IAAA,CAAO,CAAA;AACL,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAA,CAAA,CAAA,CAAA,CAAA,QAAA,CAAA,CAAA,CAAOL,GAAA,CAACD,IAAAA,CAAAA,CAAAA,CAAAA;AAAOL,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,QAAAA,CAAAA,CAAAA,IAAAA,CAAKW,IAAAA;;AACtB,CAAA,CAAA,CAAA,CAAA,CAAA;AACF,CAAA;;"}
@@ -1,540 +0,0 @@
1
- ;{try{(function(){var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="dd733d81-c604-4bf4-9fd5-df0dbedef8a3",e._sentryDebugIdIdentifier="sentry-dbid-dd733d81-c604-4bf4-9fd5-df0dbedef8a3");})();}catch(e){}};!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{};e.SENTRY_RELEASE={id:"3.0.0-alpha.6"};}catch(e){}}();import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
- import { inject$ } from '@kyrielle/injector';
3
- import { waitFor$ } from 'kyrielle';
4
- import process from 'node:process';
5
- import { i as isCommandCtx, S as ScriptTask, C as CommandTask, a as isScriptCtx, T as TASK_MANAGER } from './main.js';
6
- import { Box, Text, Static, useStdout, useInput, useStdin } from 'ink';
7
- import { useState, useLayoutEffect, useMemo, useEffect } from 'react';
8
- import { GroupTask } from '@jujulego/tasks';
9
- import Spinner from 'ink-spinner';
10
- import ms from 'pretty-ms';
11
- import isUnicodeSupported from 'is-unicode-supported';
12
- import { T as TaskName } from './TaskName.js';
13
- import { i as inked } from './inked.js';
14
- import '@sentry/node';
15
- import 'yargs/helpers';
16
- import 'yargs';
17
- import '@kyrielle/logger';
18
- import 'node:fs';
19
- import 'path-scurry';
20
- import '@swc/helpers/_/_apply_decs_2203_r';
21
- import 'node:path';
22
- import 'glob';
23
- import 'normalize-package-data';
24
- import 'semver';
25
- import 'moo';
26
- import 'node:child_process';
27
- import 'chalk';
28
- import 'slugify';
29
- import '@jujulego/quick-tag';
30
- import 'ajv';
31
- import 'node:os';
32
- import 'cosmiconfig';
33
- import 'chalk-template';
34
-
35
- // Utils
36
- /**
37
- * Sorts tasks according to workspace and script, keeping command at the end
38
- */ function taskComparator(a, b) {
39
- // 1 - compare kind
40
- const kindA = a instanceof CommandTask ? 0 : 1;
41
- const kindB = b instanceof CommandTask ? 0 : 1;
42
- if (kindA !== kindB) {
43
- return kindB - kindA;
44
- }
45
- // 2 - compare workspaces
46
- const wksA = 'workspace' in a.context ? a.context.workspace.name : '\uffff';
47
- const wksB = 'workspace' in b.context ? b.context.workspace.name : '\uffff';
48
- const wksDiff = wksA.localeCompare(wksB);
49
- if (wksDiff !== 0) {
50
- return wksDiff;
51
- }
52
- // 1 - compare scripts
53
- const scriptA = 'script' in a.context ? a.context.script : '\uffff';
54
- const scriptB = 'script' in b.context ? b.context.script : '\uffff';
55
- return scriptA.localeCompare(scriptB);
56
- }
57
- /**
58
- * Extract tasks to be printed, with their level in the tree
59
- */ function* flatTasks(tasks, isVerbose, groupId, level = 0) {
60
- for (const task of tasks){
61
- if (task.group?.id !== groupId) {
62
- continue;
63
- }
64
- yield {
65
- task,
66
- level
67
- };
68
- if (task instanceof GroupTask) {
69
- const isCommandGroup = task.tasks.some((t)=>!isCommandCtx(t.context));
70
- const hasFailed = task.tasks.some((t)=>t.status === 'failed');
71
- const isStarted = task.status === 'running';
72
- if (isVerbose || isCommandGroup || hasFailed || isStarted) {
73
- let tasks = task.tasks;
74
- if (task instanceof ScriptTask) {
75
- tasks = [
76
- ...tasks
77
- ].sort(taskComparator);
78
- }
79
- yield* flatTasks(tasks, isVerbose, task.id, level + 1);
80
- }
81
- }
82
- }
83
- }
84
- // Hook
85
- function useFlatTaskTree(manager, isVerbose = false) {
86
- const [tasks, setTasks] = useState([
87
- ...manager.tasks
88
- ].sort(taskComparator));
89
- const [version, setVersion] = useState(0);
90
- useLayoutEffect(()=>{
91
- let dirty = false;
92
- return manager.events$.on('added', ()=>{
93
- if (!dirty) {
94
- dirty = true;
95
- queueMicrotask(()=>{
96
- setTasks([
97
- ...manager.tasks
98
- ].sort(taskComparator));
99
- dirty = false;
100
- });
101
- }
102
- }).unsubscribe;
103
- }, [
104
- manager
105
- ]);
106
- useLayoutEffect(()=>{
107
- let dirty = false;
108
- return manager.events$.on('started', ()=>{
109
- if (!dirty) {
110
- dirty = true;
111
- setTimeout(()=>{
112
- setVersion((old)=>++old);
113
- dirty = false;
114
- });
115
- }
116
- }).unsubscribe;
117
- }, [
118
- manager
119
- ]);
120
- useLayoutEffect(()=>{
121
- let dirty = false;
122
- return manager.events$.on('completed', ()=>{
123
- if (!dirty) {
124
- dirty = true;
125
- setTimeout(()=>{
126
- setVersion((old)=>++old);
127
- dirty = false;
128
- });
129
- }
130
- }).unsubscribe;
131
- }, [
132
- manager
133
- ]);
134
- return useMemo(()=>{
135
- return Array.from(flatTasks(tasks, isVerbose));
136
- }, [
137
- tasks,
138
- isVerbose,
139
- version
140
- ]); // eslint-disable-line react-hooks/exhaustive-deps
141
- }
142
-
143
- const isSupported = !isUnicodeSupported();
144
- const success = isSupported ? '✔' : '√';
145
- const error = isSupported ? '✖' : '×';
146
-
147
- // Components
148
- function TaskSpinner({ task }) {
149
- // State
150
- const [status, setStatus] = useState(task.status);
151
- const [time, setTime] = useState(task.duration);
152
- // Effects
153
- useLayoutEffect(()=>{
154
- return task.events$.on('status', (event)=>{
155
- setStatus(event.status);
156
- }).unsubscribe;
157
- }, [
158
- task
159
- ]);
160
- useLayoutEffect(()=>{
161
- return task.events$.on('completed', ({ duration })=>{
162
- setTime(duration);
163
- }).unsubscribe;
164
- }, [
165
- task
166
- ]);
167
- // Render
168
- const isScriptChild = (isCommandCtx(task.context) && task.group && isScriptCtx(task.group.context)) ?? false;
169
- switch(status){
170
- case 'blocked':
171
- case 'ready':
172
- case 'starting':
173
- return /*#__PURE__*/ jsxs(Box, {
174
- children: [
175
- /*#__PURE__*/ jsx(Text, {
176
- color: "grey",
177
- children: '\u00B7'
178
- }),
179
- /*#__PURE__*/ jsx(Box, {
180
- paddingLeft: 1,
181
- children: /*#__PURE__*/ jsx(Text, {
182
- color: "grey",
183
- wrap: "truncate",
184
- children: /*#__PURE__*/ jsx(TaskName, {
185
- task: task,
186
- withWorkspace: true
187
- })
188
- })
189
- })
190
- ]
191
- });
192
- case 'running':
193
- return /*#__PURE__*/ jsxs(Box, {
194
- children: [
195
- /*#__PURE__*/ jsx(Text, {
196
- dimColor: isScriptChild,
197
- children: /*#__PURE__*/ jsx(Spinner, {})
198
- }),
199
- /*#__PURE__*/ jsx(Box, {
200
- paddingLeft: 1,
201
- children: /*#__PURE__*/ jsx(Text, {
202
- dimColor: isScriptChild,
203
- wrap: "truncate",
204
- children: /*#__PURE__*/ jsx(TaskName, {
205
- task: task,
206
- withWorkspace: true
207
- })
208
- })
209
- })
210
- ]
211
- });
212
- case 'done':
213
- return /*#__PURE__*/ jsxs(Box, {
214
- children: [
215
- /*#__PURE__*/ jsx(Text, {
216
- color: "green",
217
- children: success
218
- }),
219
- /*#__PURE__*/ jsx(Box, {
220
- paddingLeft: 1,
221
- children: /*#__PURE__*/ jsx(Text, {
222
- dimColor: isScriptChild,
223
- wrap: "truncate",
224
- children: /*#__PURE__*/ jsx(TaskName, {
225
- task: task,
226
- withWorkspace: true
227
- })
228
- })
229
- }),
230
- /*#__PURE__*/ jsx(Box, {
231
- paddingLeft: 1,
232
- flexShrink: 0,
233
- children: /*#__PURE__*/ jsxs(Text, {
234
- color: isScriptChild ? 'grey' : 'dim',
235
- children: [
236
- "(took ",
237
- ms(time),
238
- ")"
239
- ]
240
- })
241
- })
242
- ]
243
- });
244
- case 'failed':
245
- return /*#__PURE__*/ jsxs(Box, {
246
- children: [
247
- /*#__PURE__*/ jsx(Text, {
248
- color: "red",
249
- children: error
250
- }),
251
- /*#__PURE__*/ jsx(Box, {
252
- paddingLeft: 1,
253
- children: /*#__PURE__*/ jsx(Text, {
254
- dimColor: isScriptChild,
255
- wrap: "truncate",
256
- children: /*#__PURE__*/ jsx(TaskName, {
257
- task: task,
258
- withWorkspace: true
259
- })
260
- })
261
- }),
262
- /*#__PURE__*/ jsx(Box, {
263
- paddingLeft: 1,
264
- flexShrink: 0,
265
- children: /*#__PURE__*/ jsxs(Text, {
266
- color: isScriptChild ? 'grey' : 'dim',
267
- children: [
268
- "(took ",
269
- ms(time),
270
- ")"
271
- ]
272
- })
273
- })
274
- ]
275
- });
276
- }
277
- }
278
-
279
- // Component
280
- function TaskTreeStats({ manager }) {
281
- // Follow stats
282
- const [stats, setStats] = useState(()=>{
283
- const base = {
284
- running: 0,
285
- done: 0,
286
- failed: 0
287
- };
288
- for (const task of manager.tasks){
289
- switch(task.status){
290
- case 'starting':
291
- case 'running':
292
- base.running += task.weight;
293
- break;
294
- case 'done':
295
- base.done += task.weight;
296
- break;
297
- case 'failed':
298
- base.failed += task.weight;
299
- break;
300
- }
301
- }
302
- return base;
303
- });
304
- useLayoutEffect(()=>{
305
- return manager.events$.on('started', (task)=>{
306
- setStats((old)=>({
307
- ...old,
308
- running: old.running + task.weight
309
- }));
310
- }).unsubscribe;
311
- }, [
312
- manager
313
- ]);
314
- useLayoutEffect(()=>{
315
- return manager.events$.on('completed', (task)=>{
316
- setStats((old)=>({
317
- running: old.running - task.weight,
318
- done: task.status === 'done' ? old.done + task.weight : old.done,
319
- failed: task.status === 'failed' ? old.failed + task.weight : old.failed
320
- }));
321
- }).unsubscribe;
322
- }, [
323
- manager
324
- ]);
325
- // Render
326
- return /*#__PURE__*/ jsxs(Text, {
327
- children: [
328
- stats.running !== 0 && /*#__PURE__*/ jsxs(Fragment, {
329
- children: [
330
- /*#__PURE__*/ jsx(Spinner, {
331
- type: "sand"
332
- }),
333
- " ",
334
- /*#__PURE__*/ jsx(Text, {
335
- bold: true,
336
- children: stats.running
337
- }),
338
- " running"
339
- ]
340
- }),
341
- stats.running !== 0 && stats.done !== 0 && /*#__PURE__*/ jsx(Fragment, {
342
- children: ", "
343
- }),
344
- stats.done !== 0 && /*#__PURE__*/ jsxs(Text, {
345
- color: "green",
346
- children: [
347
- success,
348
- " ",
349
- stats.done,
350
- " done"
351
- ]
352
- }),
353
- stats.running + stats.done !== 0 && stats.failed !== 0 && /*#__PURE__*/ jsx(Fragment, {
354
- children: ", "
355
- }),
356
- stats.failed !== 0 && /*#__PURE__*/ jsxs(Text, {
357
- color: "red",
358
- children: [
359
- error,
360
- " ",
361
- stats.failed,
362
- " failed"
363
- ]
364
- })
365
- ]
366
- });
367
- }
368
-
369
- // Component
370
- function TaskTreeCompleted({ manager, verbose }) {
371
- // Extract all tasks
372
- const flat = useMemo(()=>{
373
- return Array.from(flatTasks([
374
- ...manager.tasks
375
- ].sort(taskComparator), verbose ?? false));
376
- }, [
377
- manager,
378
- verbose
379
- ]);
380
- // Render
381
- return /*#__PURE__*/ jsxs(Fragment, {
382
- children: [
383
- /*#__PURE__*/ jsx(Static, {
384
- items: flat,
385
- children: ({ task, level })=>/*#__PURE__*/ jsx(Box, {
386
- marginLeft: level * 2,
387
- flexShrink: 0,
388
- children: /*#__PURE__*/ jsx(TaskSpinner, {
389
- task: task
390
- })
391
- }, task.id)
392
- }),
393
- /*#__PURE__*/ jsx(TaskTreeStats, {
394
- manager: manager
395
- })
396
- ]
397
- });
398
- }
399
-
400
- // Component
401
- function TaskTreeFullSpinner({ manager, verbose }) {
402
- const flat = useFlatTaskTree(manager, verbose);
403
- // Render
404
- return /*#__PURE__*/ jsxs(Fragment, {
405
- children: [
406
- /*#__PURE__*/ jsx(Box, {
407
- flexDirection: "column",
408
- children: flat.map(({ task, level })=>/*#__PURE__*/ jsx(Box, {
409
- marginLeft: level * 2,
410
- flexShrink: 0,
411
- children: /*#__PURE__*/ jsx(TaskSpinner, {
412
- task: task
413
- })
414
- }, task.id))
415
- }),
416
- /*#__PURE__*/ jsx(Text, {
417
- children: /*#__PURE__*/ jsx(TaskTreeStats, {
418
- manager: manager
419
- })
420
- })
421
- ]
422
- });
423
- }
424
-
425
- function useStdoutDimensions() {
426
- const { stdout } = useStdout();
427
- const [dimensions, setDimensions] = useState({
428
- columns: stdout.columns ?? Infinity,
429
- rows: stdout.rows ?? Infinity
430
- });
431
- useEffect(()=>{
432
- const handler = ()=>setDimensions({
433
- columns: stdout.columns ?? Infinity,
434
- rows: stdout.rows ?? Infinity
435
- });
436
- stdout.on('resize', handler);
437
- return ()=>{
438
- stdout.off('resize', handler);
439
- };
440
- }, [
441
- stdout
442
- ]);
443
- return dimensions;
444
- }
445
-
446
- // Component
447
- function TaskTreeScrollableSpinner({ manager, verbose }) {
448
- const { rows: termHeight } = useStdoutDimensions();
449
- // Extract all tasks
450
- const flat = useFlatTaskTree(manager, verbose);
451
- const maxHeight = useMemo(()=>Math.min(termHeight - 4, flat.length), [
452
- termHeight,
453
- flat
454
- ]);
455
- // Manage scroll
456
- const [start, setStart] = useState(0);
457
- const slice = useMemo(()=>flat.slice(start, start + maxHeight), [
458
- flat,
459
- start,
460
- maxHeight
461
- ]);
462
- useEffect(()=>{
463
- if (start + maxHeight > flat.length) {
464
- setStart(Math.max(flat.length - maxHeight, 0));
465
- }
466
- }, [
467
- start,
468
- flat,
469
- maxHeight
470
- ]);
471
- useInput((_, key)=>{
472
- if (key.upArrow) {
473
- setStart((old)=>Math.max(0, old - 1));
474
- } else if (key.downArrow) {
475
- setStart((old)=>Math.min(flat.length - maxHeight, old + 1));
476
- }
477
- });
478
- // Render
479
- return /*#__PURE__*/ jsxs(Fragment, {
480
- children: [
481
- /*#__PURE__*/ jsx(Box, {
482
- flexDirection: "column",
483
- children: slice.map(({ task, level })=>/*#__PURE__*/ jsx(Box, {
484
- marginLeft: level * 2,
485
- flexShrink: 0,
486
- children: /*#__PURE__*/ jsx(TaskSpinner, {
487
- task: task
488
- })
489
- }, task.id))
490
- }),
491
- /*#__PURE__*/ jsxs(Text, {
492
- children: [
493
- /*#__PURE__*/ jsx(TaskTreeStats, {
494
- manager: manager
495
- }),
496
- maxHeight < flat.length && /*#__PURE__*/ jsx(Text, {
497
- color: "grey",
498
- children: " - use keyboard arrows to scroll"
499
- })
500
- ]
501
- })
502
- ]
503
- });
504
- }
505
-
506
- // Component
507
- function TaskTreeSpinner({ manager, verbose }) {
508
- const stdin = useStdin();
509
- if (stdin.isRawModeSupported) {
510
- return /*#__PURE__*/ jsx(TaskTreeScrollableSpinner, {
511
- manager: manager,
512
- verbose: verbose
513
- });
514
- } else {
515
- return /*#__PURE__*/ jsx(TaskTreeFullSpinner, {
516
- manager: manager,
517
- verbose: verbose
518
- });
519
- }
520
- }
521
-
522
- const TaskExecInk = inked(async function*({ tasks, verbose }) {
523
- const manager = await inject$(TASK_MANAGER);
524
- yield /*#__PURE__*/ jsx(TaskTreeSpinner, {
525
- manager: manager,
526
- verbose: verbose
527
- });
528
- tasks.start(manager);
529
- const results = await waitFor$(tasks.events$, 'finished');
530
- yield /*#__PURE__*/ jsx(TaskTreeCompleted, {
531
- manager: manager,
532
- verbose: verbose
533
- });
534
- if (results.failed > 0) {
535
- process.exitCode = 1;
536
- }
537
- });
538
-
539
- export { TaskExecInk as default };
540
- //# sourceMappingURL=task-exec.ink.js.map