@jujulego/jill 2.0.0 → 2.1.0-alpha.1
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/dist/commands/each.d.ts.map +1 -1
- package/dist/commands/each.js +1 -1
- package/dist/commands/each.js.map +1 -1
- package/dist/commands/group.d.ts +12 -0
- package/dist/commands/group.d.ts.map +1 -0
- package/dist/commands/group.js +93 -0
- package/dist/commands/group.js.map +1 -0
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +1 -1
- package/dist/commands/run.js.map +1 -1
- package/dist/git.d.ts +1 -1
- package/dist/git.d.ts.map +1 -1
- package/dist/git.js.map +1 -1
- package/dist/project/workspace.d.ts.map +1 -1
- package/dist/project/workspace.js +9 -3
- package/dist/project/workspace.js.map +1 -1
- package/dist/ui/group-task-spinner.d.ts +6 -0
- package/dist/ui/group-task-spinner.d.ts.map +1 -0
- package/dist/ui/group-task-spinner.js +54 -0
- package/dist/ui/group-task-spinner.js.map +1 -0
- package/dist/ui/index.d.ts +1 -1
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +1 -1
- package/dist/ui/index.js.map +1 -1
- package/dist/ui/{tasks-spinner.d.ts → task-manager-spinner.d.ts} +1 -1
- package/dist/ui/task-manager-spinner.d.ts.map +1 -0
- package/dist/ui/task-manager-spinner.js +39 -0
- package/dist/ui/task-manager-spinner.js.map +1 -0
- package/dist/ui/task-spinner.d.ts.map +1 -1
- package/dist/ui/task-spinner.js +3 -3
- package/dist/ui/task-spinner.js.map +1 -1
- package/package.json +17 -16
- package/dist/ui/tasks-spinner.d.ts.map +0 -1
- package/dist/ui/tasks-spinner.js +0 -39
- package/dist/ui/tasks-spinner.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["commands/each.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,EAA6B,iBAAiB,EAAE,MAAM,YAAY,CAAC;;;;;;;;;;;;;;AAM1E,wBAiHG","file":"each.d.ts","sourcesContent":["import { waitForEvent } from '@jujulego/event-tree';\nimport { TaskManager, TaskSet } from '@jujulego/tasks';\nimport ink from 'ink';\nimport yargs from 'yargs';\n\nimport { AffectedFilter, Pipeline, PrivateFilter, ScriptsFilter } from '../filters';\nimport { loadProject, setupInk } from '../middlewares';\nimport { Project, WorkspaceContext, WorkspaceDepsMode } from '../project';\nimport { container, CURRENT, INK_APP, SpinnerService } from '../services';\nimport { Layout,
|
|
1
|
+
{"version":3,"sources":["commands/each.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,EAA6B,iBAAiB,EAAE,MAAM,YAAY,CAAC;;;;;;;;;;;;;;AAM1E,wBAiHG","file":"each.d.ts","sourcesContent":["import { waitForEvent } from '@jujulego/event-tree';\nimport { TaskManager, TaskSet } from '@jujulego/tasks';\nimport ink from 'ink';\nimport yargs from 'yargs';\n\nimport { AffectedFilter, Pipeline, PrivateFilter, ScriptsFilter } from '../filters';\nimport { loadProject, setupInk } from '../middlewares';\nimport { Project, WorkspaceContext, WorkspaceDepsMode } from '../project';\nimport { container, CURRENT, INK_APP, SpinnerService } from '../services';\nimport { Layout, TaskManagerSpinner } from '../ui';\nimport { applyMiddlewares, defineCommand } from '../utils';\n\n// Command\nexport default defineCommand({\n command: 'each <script>',\n describe: 'Run script on many workspaces',\n builder: (yargs) =>\n applyMiddlewares(yargs, [\n setupInk,\n loadProject,\n ])\n // Run options\n .positional('script', { type: 'string', demandOption: true })\n .option('deps-mode', {\n choice: ['all', 'prod', 'none'],\n default: 'all' as WorkspaceDepsMode,\n desc: 'Dependency selection mode:\\n' +\n ' - all = dependencies AND devDependencies\\n' +\n ' - prod = dependencies\\n' +\n ' - none = nothing'\n })\n\n // Filters\n .option('private', {\n type: 'boolean',\n group: 'Filters:',\n desc: 'Print only private workspaces',\n })\n\n // Affected filter\n .option('affected', {\n alias: 'a',\n type: 'string',\n coerce: (rev: string) => rev === '' ? 'master' : rev,\n group: 'Affected:',\n desc: 'Print only affected workspaces towards given git revision. If no revision is given, it will check towards master.\\n' +\n 'Replaces %name by workspace name.',\n })\n .option('affected-rev-sort', {\n type: 'string',\n group: 'Affected:',\n desc: 'Sort applied to git tag / git branch command',\n })\n .option('affected-rev-fallback', {\n type: 'string',\n default: 'master',\n group: 'Affected:',\n desc: 'Fallback revision, used if no revision matching the given format is found',\n }),\n async handler(args) {\n const app = container.get<ink.Instance>(INK_APP);\n const project = container.getNamed(Project, CURRENT);\n const manager = container.get(TaskManager);\n const spinner = container.get(SpinnerService);\n\n try {\n spinner.spin('Loading workspaces ...');\n\n // Setup pipeline\n const pipeline = new Pipeline();\n pipeline.add(new ScriptsFilter([args.script]));\n\n if (args.private !== undefined) {\n pipeline.add(new PrivateFilter(args.private));\n }\n\n if (args.affected !== undefined) {\n pipeline.add(new AffectedFilter(\n args.affected,\n args.affectedRevFallback,\n args.affectedRevSort\n ));\n }\n\n // Extract arguments\n const rest = args._.map(arg => arg.toString());\n\n if (rest[0] === 'each') {\n rest.splice(0, 1);\n }\n\n // Create script tasks\n const tasks = new TaskSet(manager);\n\n for await (const wks of pipeline.filter(project.workspaces())) {\n tasks.add(await wks.run(args.script, rest, {\n buildDeps: args.depsMode,\n }));\n }\n\n if (tasks.tasks.length === 0) {\n spinner.failed('No workspace found !');\n return yargs.exit(1, new Error('No workspace found !'));\n }\n\n spinner.stop();\n\n // Render\n app.rerender(\n <Layout>\n <TaskManagerSpinner manager={manager} />\n </Layout>\n );\n\n // Start and wait for result\n tasks.start();\n\n const result = await waitForEvent(tasks, 'finished');\n\n if (result.failed > 0) {\n return yargs.exit(1, new Error('A tasks failed !'));\n }\n } finally {\n spinner.stop();\n }\n }\n});\n"]}
|
package/dist/commands/each.js
CHANGED
|
@@ -99,7 +99,7 @@ const _default = (0, _utils.defineCommand)({
|
|
|
99
99
|
spinner.stop();
|
|
100
100
|
// Render
|
|
101
101
|
app.rerender(/*#__PURE__*/ (0, _jsxRuntime.jsx)(_ui.Layout, {
|
|
102
|
-
children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_ui.
|
|
102
|
+
children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_ui.TaskManagerSpinner, {
|
|
103
103
|
manager: manager
|
|
104
104
|
})
|
|
105
105
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["commands/each.js"],"sourcesContent":["import { waitForEvent } from '@jujulego/event-tree';\nimport { TaskManager, TaskSet } from '@jujulego/tasks';\nimport ink from 'ink';\nimport yargs from 'yargs';\n\nimport { AffectedFilter, Pipeline, PrivateFilter, ScriptsFilter } from '../filters';\nimport { loadProject, setupInk } from '../middlewares';\nimport { Project, WorkspaceContext, WorkspaceDepsMode } from '../project';\nimport { container, CURRENT, INK_APP, SpinnerService } from '../services';\nimport { Layout,
|
|
1
|
+
{"version":3,"sources":["commands/each.js"],"sourcesContent":["import { waitForEvent } from '@jujulego/event-tree';\nimport { TaskManager, TaskSet } from '@jujulego/tasks';\nimport ink from 'ink';\nimport yargs from 'yargs';\n\nimport { AffectedFilter, Pipeline, PrivateFilter, ScriptsFilter } from '../filters';\nimport { loadProject, setupInk } from '../middlewares';\nimport { Project, WorkspaceContext, WorkspaceDepsMode } from '../project';\nimport { container, CURRENT, INK_APP, SpinnerService } from '../services';\nimport { Layout, TaskManagerSpinner } from '../ui';\nimport { applyMiddlewares, defineCommand } from '../utils';\n\n// Command\nexport default defineCommand({\n command: 'each <script>',\n describe: 'Run script on many workspaces',\n builder: (yargs) =>\n applyMiddlewares(yargs, [\n setupInk,\n loadProject,\n ])\n // Run options\n .positional('script', { type: 'string', demandOption: true })\n .option('deps-mode', {\n choice: ['all', 'prod', 'none'],\n default: 'all' as WorkspaceDepsMode,\n desc: 'Dependency selection mode:\\n' +\n ' - all = dependencies AND devDependencies\\n' +\n ' - prod = dependencies\\n' +\n ' - none = nothing'\n })\n\n // Filters\n .option('private', {\n type: 'boolean',\n group: 'Filters:',\n desc: 'Print only private workspaces',\n })\n\n // Affected filter\n .option('affected', {\n alias: 'a',\n type: 'string',\n coerce: (rev: string) => rev === '' ? 'master' : rev,\n group: 'Affected:',\n desc: 'Print only affected workspaces towards given git revision. If no revision is given, it will check towards master.\\n' +\n 'Replaces %name by workspace name.',\n })\n .option('affected-rev-sort', {\n type: 'string',\n group: 'Affected:',\n desc: 'Sort applied to git tag / git branch command',\n })\n .option('affected-rev-fallback', {\n type: 'string',\n default: 'master',\n group: 'Affected:',\n desc: 'Fallback revision, used if no revision matching the given format is found',\n }),\n async handler(args) {\n const app = container.get<ink.Instance>(INK_APP);\n const project = container.getNamed(Project, CURRENT);\n const manager = container.get(TaskManager);\n const spinner = container.get(SpinnerService);\n\n try {\n spinner.spin('Loading workspaces ...');\n\n // Setup pipeline\n const pipeline = new Pipeline();\n pipeline.add(new ScriptsFilter([args.script]));\n\n if (args.private !== undefined) {\n pipeline.add(new PrivateFilter(args.private));\n }\n\n if (args.affected !== undefined) {\n pipeline.add(new AffectedFilter(\n args.affected,\n args.affectedRevFallback,\n args.affectedRevSort\n ));\n }\n\n // Extract arguments\n const rest = args._.map(arg => arg.toString());\n\n if (rest[0] === 'each') {\n rest.splice(0, 1);\n }\n\n // Create script tasks\n const tasks = new TaskSet(manager);\n\n for await (const wks of pipeline.filter(project.workspaces())) {\n tasks.add(await wks.run(args.script, rest, {\n buildDeps: args.depsMode,\n }));\n }\n\n if (tasks.tasks.length === 0) {\n spinner.failed('No workspace found !');\n return yargs.exit(1, new Error('No workspace found !'));\n }\n\n spinner.stop();\n\n // Render\n app.rerender(\n <Layout>\n <TaskManagerSpinner manager={manager} />\n </Layout>\n );\n\n // Start and wait for result\n tasks.start();\n\n const result = await waitForEvent(tasks, 'finished');\n\n if (result.failed > 0) {\n return yargs.exit(1, new Error('A tasks failed !'));\n }\n } finally {\n spinner.stop();\n }\n }\n});\n"],"names":["defineCommand","command","describe","builder","yargs","applyMiddlewares","setupInk","loadProject","positional","type","demandOption","option","choice","default","desc","group","alias","coerce","rev","handler","args","app","container","get","INK_APP","project","getNamed","Project","CURRENT","manager","TaskManager","spinner","SpinnerService","spin","pipeline","Pipeline","add","ScriptsFilter","script","private","undefined","PrivateFilter","affected","AffectedFilter","affectedRevFallback","affectedRevSort","rest","_","map","arg","toString","splice","tasks","TaskSet","wks","filter","workspaces","run","buildDeps","depsMode","length","failed","exit","Error","stop","rerender","Layout","TaskManagerSpinner","start","result","waitForEvent"],"mappings":"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","file":"each.js"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import yargs from 'yargs';
|
|
2
|
+
import { WorkspaceDepsMode } from '../project';
|
|
3
|
+
declare const _default: yargs.CommandModule<unknown, {
|
|
4
|
+
scripts: string[];
|
|
5
|
+
} & {
|
|
6
|
+
"deps-mode": WorkspaceDepsMode;
|
|
7
|
+
} & {
|
|
8
|
+
parallel: boolean | undefined;
|
|
9
|
+
} & {
|
|
10
|
+
sequence: boolean | undefined;
|
|
11
|
+
}>;
|
|
12
|
+
export default _default;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["commands/group.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAa,iBAAiB,EAAE,MAAM,YAAY,CAAC;;;;;;;;;;AAM1D,wBA8EG","file":"group.d.ts","sourcesContent":["import { waitForEvent } from '@jujulego/event-tree';\nimport { GroupTask, ParallelGroup, SequenceGroup, TaskManager } from '@jujulego/tasks';\nimport ink from 'ink';\nimport yargs from 'yargs';\n\nimport { loadProject, loadWorkspace, setupInk } from '../middlewares';\nimport { Workspace, WorkspaceDepsMode } from '../project';\nimport { container, CURRENT, INK_APP, Logger } from '../services';\nimport { Layout, TaskManagerSpinner } from '../ui';\nimport { applyMiddlewares, defineCommand } from '../utils';\n\n// Command\nexport default defineCommand({\n command: 'group <scripts..>',\n describe: 'Run many scripts inside a workspace',\n builder: (yargs) =>\n applyMiddlewares(yargs, [\n setupInk,\n loadProject,\n loadWorkspace\n ])\n .positional('scripts', { type: 'string', demandOption: true, array: true })\n .option('deps-mode', {\n choice: ['all', 'prod', 'none'],\n default: 'all' as WorkspaceDepsMode,\n desc: 'Dependency selection mode:\\n' +\n ' - all = dependencies AND devDependencies\\n' +\n ' - prod = dependencies\\n' +\n ' - none = nothing'\n })\n .option('parallel', {\n type: 'boolean',\n desc: 'Runs given scripts in parallel'\n })\n .option('sequence', {\n type: 'boolean',\n desc: 'Runs given scripts in sequence'\n })\n .conflicts('parallel', 'sequence')\n .check((args) => {\n if (!args.parallel && !args.sequence) {\n throw new Error('You must at least set either --parallel or --sequence to select group management method');\n }\n\n return true;\n }),\n async handler(args) {\n const app = container.get<ink.Instance>(INK_APP);\n const workspace = container.getNamed(Workspace, CURRENT);\n const manager = container.get(TaskManager);\n\n // Run script in workspace\n let group: GroupTask;\n\n if (args.sequence) {\n group = new SequenceGroup('In sequence', {}, {\n logger: container.get(Logger),\n });\n } else if (args.parallel) {\n group = new ParallelGroup('In parallel', {}, {\n logger: container.get(Logger),\n });\n } else {\n throw new Error('You must at least set either --parallel or --sequence to select group management method');\n }\n\n for (const script of args.scripts) {\n const task = await workspace.run(script, [], {\n buildDeps: args.depsMode,\n });\n\n group.add(task);\n }\n\n manager.add(group);\n\n // Render\n app.rerender(\n <Layout>\n <TaskManagerSpinner manager={manager} />\n </Layout>\n );\n\n // Wait for result\n const result = await waitForEvent(group, 'completed');\n\n if (result.status === 'failed') {\n return yargs.exit(1, new Error('Task failed !'));\n }\n }\n});\n"]}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, // Command
|
|
6
|
+
"default", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: ()=>_default
|
|
9
|
+
});
|
|
10
|
+
const _jsxRuntime = require("react/jsx-runtime");
|
|
11
|
+
const _eventTree = require("@jujulego/event-tree");
|
|
12
|
+
const _tasks = require("@jujulego/tasks");
|
|
13
|
+
const _yargs = /*#__PURE__*/ _interopRequireDefault(require("yargs"));
|
|
14
|
+
const _middlewares = require("../middlewares");
|
|
15
|
+
const _project = require("../project");
|
|
16
|
+
const _services = require("../services");
|
|
17
|
+
const _ui = require("../ui");
|
|
18
|
+
const _utils = require("../utils");
|
|
19
|
+
function _interopRequireDefault(obj) {
|
|
20
|
+
return obj && obj.__esModule ? obj : {
|
|
21
|
+
default: obj
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
const _default = (0, _utils.defineCommand)({
|
|
25
|
+
command: 'group <scripts..>',
|
|
26
|
+
describe: 'Run many scripts inside a workspace',
|
|
27
|
+
builder: (yargs)=>(0, _utils.applyMiddlewares)(yargs, [
|
|
28
|
+
_middlewares.setupInk,
|
|
29
|
+
_middlewares.loadProject,
|
|
30
|
+
_middlewares.loadWorkspace
|
|
31
|
+
]).positional('scripts', {
|
|
32
|
+
type: 'string',
|
|
33
|
+
demandOption: true,
|
|
34
|
+
array: true
|
|
35
|
+
}).option('deps-mode', {
|
|
36
|
+
choice: [
|
|
37
|
+
'all',
|
|
38
|
+
'prod',
|
|
39
|
+
'none'
|
|
40
|
+
],
|
|
41
|
+
default: 'all',
|
|
42
|
+
desc: 'Dependency selection mode:\n' + ' - all = dependencies AND devDependencies\n' + ' - prod = dependencies\n' + ' - none = nothing'
|
|
43
|
+
}).option('parallel', {
|
|
44
|
+
type: 'boolean',
|
|
45
|
+
desc: 'Runs given scripts in parallel'
|
|
46
|
+
}).option('sequence', {
|
|
47
|
+
type: 'boolean',
|
|
48
|
+
desc: 'Runs given scripts in sequence'
|
|
49
|
+
}).conflicts('parallel', 'sequence').check((args)=>{
|
|
50
|
+
if (!args.parallel && !args.sequence) {
|
|
51
|
+
throw new Error('You must at least set either --parallel or --sequence to select group management method');
|
|
52
|
+
}
|
|
53
|
+
return true;
|
|
54
|
+
}),
|
|
55
|
+
async handler (args) {
|
|
56
|
+
const app = _services.container.get(_services.INK_APP);
|
|
57
|
+
const workspace = _services.container.getNamed(_project.Workspace, _services.CURRENT);
|
|
58
|
+
const manager = _services.container.get(_tasks.TaskManager);
|
|
59
|
+
// Run script in workspace
|
|
60
|
+
let group;
|
|
61
|
+
if (args.sequence) {
|
|
62
|
+
group = new _tasks.SequenceGroup('In sequence', {}, {
|
|
63
|
+
logger: _services.container.get(_services.Logger)
|
|
64
|
+
});
|
|
65
|
+
} else if (args.parallel) {
|
|
66
|
+
group = new _tasks.ParallelGroup('In parallel', {}, {
|
|
67
|
+
logger: _services.container.get(_services.Logger)
|
|
68
|
+
});
|
|
69
|
+
} else {
|
|
70
|
+
throw new Error('You must at least set either --parallel or --sequence to select group management method');
|
|
71
|
+
}
|
|
72
|
+
for (const script of args.scripts){
|
|
73
|
+
const task = await workspace.run(script, [], {
|
|
74
|
+
buildDeps: args.depsMode
|
|
75
|
+
});
|
|
76
|
+
group.add(task);
|
|
77
|
+
}
|
|
78
|
+
manager.add(group);
|
|
79
|
+
// Render
|
|
80
|
+
app.rerender(/*#__PURE__*/ (0, _jsxRuntime.jsx)(_ui.Layout, {
|
|
81
|
+
children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_ui.TaskManagerSpinner, {
|
|
82
|
+
manager: manager
|
|
83
|
+
})
|
|
84
|
+
}));
|
|
85
|
+
// Wait for result
|
|
86
|
+
const result = await (0, _eventTree.waitForEvent)(group, 'completed');
|
|
87
|
+
if (result.status === 'failed') {
|
|
88
|
+
return _yargs.default.exit(1, new Error('Task failed !'));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
//# sourceMappingURL=group.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["commands/group.js"],"sourcesContent":["import { waitForEvent } from '@jujulego/event-tree';\nimport { GroupTask, ParallelGroup, SequenceGroup, TaskManager } from '@jujulego/tasks';\nimport ink from 'ink';\nimport yargs from 'yargs';\n\nimport { loadProject, loadWorkspace, setupInk } from '../middlewares';\nimport { Workspace, WorkspaceDepsMode } from '../project';\nimport { container, CURRENT, INK_APP, Logger } from '../services';\nimport { Layout, TaskManagerSpinner } from '../ui';\nimport { applyMiddlewares, defineCommand } from '../utils';\n\n// Command\nexport default defineCommand({\n command: 'group <scripts..>',\n describe: 'Run many scripts inside a workspace',\n builder: (yargs) =>\n applyMiddlewares(yargs, [\n setupInk,\n loadProject,\n loadWorkspace\n ])\n .positional('scripts', { type: 'string', demandOption: true, array: true })\n .option('deps-mode', {\n choice: ['all', 'prod', 'none'],\n default: 'all' as WorkspaceDepsMode,\n desc: 'Dependency selection mode:\\n' +\n ' - all = dependencies AND devDependencies\\n' +\n ' - prod = dependencies\\n' +\n ' - none = nothing'\n })\n .option('parallel', {\n type: 'boolean',\n desc: 'Runs given scripts in parallel'\n })\n .option('sequence', {\n type: 'boolean',\n desc: 'Runs given scripts in sequence'\n })\n .conflicts('parallel', 'sequence')\n .check((args) => {\n if (!args.parallel && !args.sequence) {\n throw new Error('You must at least set either --parallel or --sequence to select group management method');\n }\n\n return true;\n }),\n async handler(args) {\n const app = container.get<ink.Instance>(INK_APP);\n const workspace = container.getNamed(Workspace, CURRENT);\n const manager = container.get(TaskManager);\n\n // Run script in workspace\n let group: GroupTask;\n\n if (args.sequence) {\n group = new SequenceGroup('In sequence', {}, {\n logger: container.get(Logger),\n });\n } else if (args.parallel) {\n group = new ParallelGroup('In parallel', {}, {\n logger: container.get(Logger),\n });\n } else {\n throw new Error('You must at least set either --parallel or --sequence to select group management method');\n }\n\n for (const script of args.scripts) {\n const task = await workspace.run(script, [], {\n buildDeps: args.depsMode,\n });\n\n group.add(task);\n }\n\n manager.add(group);\n\n // Render\n app.rerender(\n <Layout>\n <TaskManagerSpinner manager={manager} />\n </Layout>\n );\n\n // Wait for result\n const result = await waitForEvent(group, 'completed');\n\n if (result.status === 'failed') {\n return yargs.exit(1, new Error('Task failed !'));\n }\n }\n});\n"],"names":["defineCommand","command","describe","builder","yargs","applyMiddlewares","setupInk","loadProject","loadWorkspace","positional","type","demandOption","array","option","choice","default","desc","conflicts","check","args","parallel","sequence","Error","handler","app","container","get","INK_APP","workspace","getNamed","Workspace","CURRENT","manager","TaskManager","group","SequenceGroup","logger","Logger","ParallelGroup","script","scripts","task","run","buildDeps","depsMode","add","rerender","Layout","TaskManagerSpinner","result","waitForEvent","status","exit"],"mappings":"AAAA;;;;+BAWA,UAAU;AACV;;aAAA;;;2BAZ6B;uBACwC;4DAEnD;6BAEmC;yBACR;0BACO;oBACT;uBACK;;;;;;MAGhD,WAAeA,IAAAA,oBAAa,EAAC;IAC3BC,SAAS;IACTC,UAAU;IACVC,SAAS,CAACC,QACRC,IAAAA,uBAAgB,EAACD,OAAO;YACtBE,qBAAQ;YACRC,wBAAW;YACXC,0BAAa;SACd,EACEC,UAAU,CAAC,WAAW;YAAEC,MAAM;YAAUC,cAAc,IAAI;YAAEC,OAAO,IAAI;QAAC,GACxEC,MAAM,CAAC,aAAa;YACnBC,QAAQ;gBAAC;gBAAO;gBAAQ;aAAO;YAC/BC,SAAS;YACTC,MAAM,iCACJ,gDACA,6BACA;QACJ,GACCH,MAAM,CAAC,YAAY;YAClBH,MAAM;YACNM,MAAM;QACR,GACCH,MAAM,CAAC,YAAY;YAClBH,MAAM;YACNM,MAAM;QACR,GACCC,SAAS,CAAC,YAAY,YACtBC,KAAK,CAAC,CAACC,OAAS;YACf,IAAI,CAACA,KAAKC,QAAQ,IAAI,CAACD,KAAKE,QAAQ,EAAE;gBACpC,MAAM,IAAIC,MAAM,2FAA2F;YAC7G,CAAC;YAED,OAAO,IAAI;QACb;IACJ,MAAMC,SAAQJ,IAAI,EAAE;QAClB,MAAMK,MAAMC,mBAAS,CAACC,GAAG,CAAeC,iBAAO;QAC/C,MAAMC,YAAYH,mBAAS,CAACI,QAAQ,CAACC,kBAAS,EAAEC,iBAAO;QACvD,MAAMC,UAAUP,mBAAS,CAACC,GAAG,CAACO,kBAAW;QAEzC,0BAA0B;QAC1B,IAAIC;QAEJ,IAAIf,KAAKE,QAAQ,EAAE;YACjBa,QAAQ,IAAIC,oBAAa,CAAC,eAAe,CAAC,GAAG;gBAC3CC,QAAQX,mBAAS,CAACC,GAAG,CAACW,gBAAM;YAC9B;QACF,OAAO,IAAIlB,KAAKC,QAAQ,EAAE;YACxBc,QAAQ,IAAII,oBAAa,CAAC,eAAe,CAAC,GAAG;gBAC3CF,QAAQX,mBAAS,CAACC,GAAG,CAACW,gBAAM;YAC9B;QACF,OAAO;YACL,MAAM,IAAIf,MAAM,2FAA2F;QAC7G,CAAC;QAED,KAAK,MAAMiB,UAAUpB,KAAKqB,OAAO,CAAE;YACjC,MAAMC,OAAO,MAAMb,UAAUc,GAAG,CAACH,QAAQ,EAAE,EAAE;gBAC3CI,WAAWxB,KAAKyB,QAAQ;YAC1B;YAEAV,MAAMW,GAAG,CAACJ;QACZ;QAEAT,QAAQa,GAAG,CAACX;QAEZ,SAAS;QACTV,IAAIsB,QAAQ,eACV,qBAACC,UAAM;sBACL,cAAA,qBAACC,sBAAkB;gBAAChB,SAASA;;;QAIjC,kBAAkB;QAClB,MAAMiB,SAAS,MAAMC,IAAAA,uBAAY,EAAChB,OAAO;QAEzC,IAAIe,OAAOE,MAAM,KAAK,UAAU;YAC9B,OAAO/C,cAAK,CAACgD,IAAI,CAAC,GAAG,IAAI9B,MAAM;QACjC,CAAC;IACH;AACF","file":"group.js"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["commands/run.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAa,iBAAiB,EAAE,MAAM,YAAY,CAAC;;;;;;AAM1D,wBAkDG","file":"run.d.ts","sourcesContent":["import { waitForEvent } from '@jujulego/event-tree';\nimport { TaskManager } from '@jujulego/tasks';\nimport ink from 'ink';\nimport yargs from 'yargs';\n\nimport { loadProject, loadWorkspace, setupInk } from '../middlewares';\nimport { Workspace, WorkspaceDepsMode } from '../project';\nimport { container, CURRENT, INK_APP } from '../services';\nimport { Layout,
|
|
1
|
+
{"version":3,"sources":["commands/run.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAa,iBAAiB,EAAE,MAAM,YAAY,CAAC;;;;;;AAM1D,wBAkDG","file":"run.d.ts","sourcesContent":["import { waitForEvent } from '@jujulego/event-tree';\nimport { TaskManager } from '@jujulego/tasks';\nimport ink from 'ink';\nimport yargs from 'yargs';\n\nimport { loadProject, loadWorkspace, setupInk } from '../middlewares';\nimport { Workspace, WorkspaceDepsMode } from '../project';\nimport { container, CURRENT, INK_APP } from '../services';\nimport { Layout, TaskManagerSpinner } from '../ui';\nimport { applyMiddlewares, defineCommand } from '../utils';\n\n// Command\nexport default defineCommand({\n command: 'run <script>',\n describe: 'Run script inside workspace',\n builder: (yargs) =>\n applyMiddlewares(yargs, [\n setupInk,\n loadProject,\n loadWorkspace\n ])\n .positional('script', { type: 'string', demandOption: true })\n .option('deps-mode', {\n choice: ['all', 'prod', 'none'],\n default: 'all' as WorkspaceDepsMode,\n desc: 'Dependency selection mode:\\n' +\n ' - all = dependencies AND devDependencies\\n' +\n ' - prod = dependencies\\n' +\n ' - none = nothing'\n }),\n async handler(args) {\n const app = container.get<ink.Instance>(INK_APP);\n const workspace = container.getNamed(Workspace, CURRENT);\n const manager = container.get(TaskManager);\n\n // Extract arguments\n const rest = args._.map(arg => arg.toString());\n\n if (rest[0] === 'run') {\n rest.splice(0, 1);\n }\n\n // Run script in workspace\n const task = await workspace.run(args.script, rest, {\n buildDeps: args.depsMode,\n });\n manager.add(task);\n\n // Render\n app.rerender(\n <Layout>\n <TaskManagerSpinner manager={manager} />\n </Layout>\n );\n\n // Wait for result\n const result = await waitForEvent(task, 'completed');\n\n if (result.status === 'failed') {\n return yargs.exit(1, new Error('Task failed !'));\n }\n }\n});\n"]}
|
package/dist/commands/run.js
CHANGED
|
@@ -56,7 +56,7 @@ const _default = (0, _utils.defineCommand)({
|
|
|
56
56
|
manager.add(task);
|
|
57
57
|
// Render
|
|
58
58
|
app.rerender(/*#__PURE__*/ (0, _jsxRuntime.jsx)(_ui.Layout, {
|
|
59
|
-
children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_ui.
|
|
59
|
+
children: /*#__PURE__*/ (0, _jsxRuntime.jsx)(_ui.TaskManagerSpinner, {
|
|
60
60
|
manager: manager
|
|
61
61
|
})
|
|
62
62
|
}));
|
package/dist/commands/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["commands/run.js"],"sourcesContent":["import { waitForEvent } from '@jujulego/event-tree';\nimport { TaskManager } from '@jujulego/tasks';\nimport ink from 'ink';\nimport yargs from 'yargs';\n\nimport { loadProject, loadWorkspace, setupInk } from '../middlewares';\nimport { Workspace, WorkspaceDepsMode } from '../project';\nimport { container, CURRENT, INK_APP } from '../services';\nimport { Layout,
|
|
1
|
+
{"version":3,"sources":["commands/run.js"],"sourcesContent":["import { waitForEvent } from '@jujulego/event-tree';\nimport { TaskManager } from '@jujulego/tasks';\nimport ink from 'ink';\nimport yargs from 'yargs';\n\nimport { loadProject, loadWorkspace, setupInk } from '../middlewares';\nimport { Workspace, WorkspaceDepsMode } from '../project';\nimport { container, CURRENT, INK_APP } from '../services';\nimport { Layout, TaskManagerSpinner } from '../ui';\nimport { applyMiddlewares, defineCommand } from '../utils';\n\n// Command\nexport default defineCommand({\n command: 'run <script>',\n describe: 'Run script inside workspace',\n builder: (yargs) =>\n applyMiddlewares(yargs, [\n setupInk,\n loadProject,\n loadWorkspace\n ])\n .positional('script', { type: 'string', demandOption: true })\n .option('deps-mode', {\n choice: ['all', 'prod', 'none'],\n default: 'all' as WorkspaceDepsMode,\n desc: 'Dependency selection mode:\\n' +\n ' - all = dependencies AND devDependencies\\n' +\n ' - prod = dependencies\\n' +\n ' - none = nothing'\n }),\n async handler(args) {\n const app = container.get<ink.Instance>(INK_APP);\n const workspace = container.getNamed(Workspace, CURRENT);\n const manager = container.get(TaskManager);\n\n // Extract arguments\n const rest = args._.map(arg => arg.toString());\n\n if (rest[0] === 'run') {\n rest.splice(0, 1);\n }\n\n // Run script in workspace\n const task = await workspace.run(args.script, rest, {\n buildDeps: args.depsMode,\n });\n manager.add(task);\n\n // Render\n app.rerender(\n <Layout>\n <TaskManagerSpinner manager={manager} />\n </Layout>\n );\n\n // Wait for result\n const result = await waitForEvent(task, 'completed');\n\n if (result.status === 'failed') {\n return yargs.exit(1, new Error('Task failed !'));\n }\n }\n});\n"],"names":["defineCommand","command","describe","builder","yargs","applyMiddlewares","setupInk","loadProject","loadWorkspace","positional","type","demandOption","option","choice","default","desc","handler","args","app","container","get","INK_APP","workspace","getNamed","Workspace","CURRENT","manager","TaskManager","rest","_","map","arg","toString","splice","task","run","script","buildDeps","depsMode","add","rerender","Layout","TaskManagerSpinner","result","waitForEvent","status","exit","Error"],"mappings":"AAAA;;;;+BAWA,UAAU;AACV;;aAAA;;;2BAZ6B;uBACD;4DAEV;6BAEmC;yBACR;0BACD;oBACD;uBACK;;;;;;MAGhD,WAAeA,IAAAA,oBAAa,EAAC;IAC3BC,SAAS;IACTC,UAAU;IACVC,SAAS,CAACC,QACRC,IAAAA,uBAAgB,EAACD,OAAO;YACtBE,qBAAQ;YACRC,wBAAW;YACXC,0BAAa;SACd,EACEC,UAAU,CAAC,UAAU;YAAEC,MAAM;YAAUC,cAAc,IAAI;QAAC,GAC1DC,MAAM,CAAC,aAAa;YACnBC,QAAQ;gBAAC;gBAAO;gBAAQ;aAAO;YAC/BC,SAAS;YACTC,MAAM,iCACJ,gDACA,6BACA;QACJ;IACJ,MAAMC,SAAQC,IAAI,EAAE;QAClB,MAAMC,MAAMC,mBAAS,CAACC,GAAG,CAAeC,iBAAO;QAC/C,MAAMC,YAAYH,mBAAS,CAACI,QAAQ,CAACC,kBAAS,EAAEC,iBAAO;QACvD,MAAMC,UAAUP,mBAAS,CAACC,GAAG,CAACO,kBAAW;QAEzC,oBAAoB;QACpB,MAAMC,OAAOX,KAAKY,CAAC,CAACC,GAAG,CAACC,CAAAA,MAAOA,IAAIC,QAAQ;QAE3C,IAAIJ,IAAI,CAAC,EAAE,KAAK,OAAO;YACrBA,KAAKK,MAAM,CAAC,GAAG;QACjB,CAAC;QAED,0BAA0B;QAC1B,MAAMC,OAAO,MAAMZ,UAAUa,GAAG,CAAClB,KAAKmB,MAAM,EAAER,MAAM;YAClDS,WAAWpB,KAAKqB,QAAQ;QAC1B;QACAZ,QAAQa,GAAG,CAACL;QAEZ,SAAS;QACThB,IAAIsB,QAAQ,eACV,qBAACC,UAAM;sBACL,cAAA,qBAACC,sBAAkB;gBAAChB,SAASA;;;QAIjC,kBAAkB;QAClB,MAAMiB,SAAS,MAAMC,IAAAA,uBAAY,EAACV,MAAM;QAExC,IAAIS,OAAOE,MAAM,KAAK,UAAU;YAC9B,OAAOzC,cAAK,CAAC0C,IAAI,CAAC,GAAG,IAAIC,MAAM;QACjC,CAAC;IACH;AACF","file":"run.js"}
|
package/dist/git.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ export interface GitContext extends TaskContext {
|
|
|
4
4
|
command: string;
|
|
5
5
|
}
|
|
6
6
|
export declare class Git {
|
|
7
|
-
static readonly manager: TaskManager
|
|
7
|
+
static readonly manager: TaskManager;
|
|
8
8
|
static readonly logger: Logger;
|
|
9
9
|
static command(cmd: string, args: string[], options?: SpawnTaskOptions): SpawnTask<GitContext>;
|
|
10
10
|
static branch(args: string[], options?: SpawnTaskOptions): SpawnTask<GitContext>;
|
package/dist/git.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAExF,OAAO,EAAc,MAAM,EAAE,MAAM,YAAY,CAAC;AAIhD,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC7C,OAAO,EAAE,MAAM,CAAC;CACjB;AAGD,qBAAa,GAAG;IAGd,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC
|
|
1
|
+
{"version":3,"sources":["git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAExF,OAAO,EAAc,MAAM,EAAE,MAAM,YAAY,CAAC;AAIhD,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC7C,OAAO,EAAE,MAAM,CAAC;CACjB;AAGD,qBAAa,GAAG;IAGd,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAGrC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAG/B,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,gBAAqB,GAAG,SAAS,CAAC,UAAU,CAAC;IAalG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC,UAAU,CAAC;IAIhF,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC,UAAU,CAAC;IAI9E,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC,UAAU,CAAC;IAK7E,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;WAevF,YAAY,CAAC,IAAI,GAAE,MAAM,EAAO,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;WAW7E,QAAQ,CAAC,IAAI,GAAE,MAAM,EAAO,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAUvF","file":"git.d.ts","sourcesContent":["import { SpawnTask, SpawnTaskOptions, TaskContext, TaskManager } from '@jujulego/tasks';\n\nimport { lazyInject, Logger } from './services';\nimport { streamLines } from './utils';\n\n// Types\nexport interface GitContext extends TaskContext {\n command: string;\n}\n\n// Git commands\nexport class Git {\n // Services\n @lazyInject(TaskManager)\n static readonly manager: TaskManager;\n\n @lazyInject(Logger)\n static readonly logger: Logger;\n\n // commons\n static command(cmd: string, args: string[], options: SpawnTaskOptions = {}): SpawnTask<GitContext> {\n const opts = { logger: this.logger, ...options };\n\n // Create task\n const task = new SpawnTask('git', [cmd, ...args], { command: cmd }, opts);\n task.subscribe('stream', ({ data }) => opts.logger.debug(data.toString('utf-8')));\n\n this.manager.add(task);\n\n return task;\n }\n\n // commands\n static branch(args: string[], options?: SpawnTaskOptions): SpawnTask<GitContext> {\n return this.command('branch', args, options);\n }\n\n static diff(args: string[], options?: SpawnTaskOptions): SpawnTask<GitContext> {\n return this.command('diff', args, options);\n }\n\n static tag(args: string[], options?: SpawnTaskOptions): SpawnTask<GitContext> {\n return this.command('tag', args, options);\n }\n\n // high level\n static isAffected(reference: string, args: string[] = [], opts?: SpawnTaskOptions): Promise<boolean> {\n return new Promise((resolve, reject) => {\n const task = this.diff(['--quiet', reference, ...args], opts);\n\n task.subscribe('status.done', () => resolve(false));\n task.subscribe('status.failed', () => {\n if (task.exitCode) {\n resolve(true);\n } else {\n reject(new Error(`Task ${task.name} failed`));\n }\n });\n });\n }\n\n static async listBranches(args: string[] = [], opts?: SpawnTaskOptions): Promise<string[]> {\n const task = this.branch(['-l', ...args], opts);\n const result: string[] = [];\n\n for await (const line of streamLines(task, 'stdout')) {\n result.push(line.replace(/^[ *] /, ''));\n }\n\n return result;\n }\n\n static async listTags(args: string[] = [], opts?: SpawnTaskOptions): Promise<string[]> {\n const task = this.tag(['-l', ...args], opts);\n const result: string[] = [];\n\n for await (const line of streamLines(task, 'stdout')) {\n result.push(line);\n }\n\n return result;\n }\n}\n"]}
|
package/dist/git.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["git.js"],"sourcesContent":["import { SpawnTask, SpawnTaskOptions, TaskContext, TaskManager } from '@jujulego/tasks';\n\nimport { lazyInject, Logger } from './services';\nimport { streamLines } from './utils';\n\n// Types\nexport interface GitContext extends TaskContext {\n command: string;\n}\n\n// Git commands\nexport class Git {\n // Services\n @lazyInject(TaskManager)\n static readonly manager: TaskManager
|
|
1
|
+
{"version":3,"sources":["git.js"],"sourcesContent":["import { SpawnTask, SpawnTaskOptions, TaskContext, TaskManager } from '@jujulego/tasks';\n\nimport { lazyInject, Logger } from './services';\nimport { streamLines } from './utils';\n\n// Types\nexport interface GitContext extends TaskContext {\n command: string;\n}\n\n// Git commands\nexport class Git {\n // Services\n @lazyInject(TaskManager)\n static readonly manager: TaskManager;\n\n @lazyInject(Logger)\n static readonly logger: Logger;\n\n // commons\n static command(cmd: string, args: string[], options: SpawnTaskOptions = {}): SpawnTask<GitContext> {\n const opts = { logger: this.logger, ...options };\n\n // Create task\n const task = new SpawnTask('git', [cmd, ...args], { command: cmd }, opts);\n task.subscribe('stream', ({ data }) => opts.logger.debug(data.toString('utf-8')));\n\n this.manager.add(task);\n\n return task;\n }\n\n // commands\n static branch(args: string[], options?: SpawnTaskOptions): SpawnTask<GitContext> {\n return this.command('branch', args, options);\n }\n\n static diff(args: string[], options?: SpawnTaskOptions): SpawnTask<GitContext> {\n return this.command('diff', args, options);\n }\n\n static tag(args: string[], options?: SpawnTaskOptions): SpawnTask<GitContext> {\n return this.command('tag', args, options);\n }\n\n // high level\n static isAffected(reference: string, args: string[] = [], opts?: SpawnTaskOptions): Promise<boolean> {\n return new Promise((resolve, reject) => {\n const task = this.diff(['--quiet', reference, ...args], opts);\n\n task.subscribe('status.done', () => resolve(false));\n task.subscribe('status.failed', () => {\n if (task.exitCode) {\n resolve(true);\n } else {\n reject(new Error(`Task ${task.name} failed`));\n }\n });\n });\n }\n\n static async listBranches(args: string[] = [], opts?: SpawnTaskOptions): Promise<string[]> {\n const task = this.branch(['-l', ...args], opts);\n const result: string[] = [];\n\n for await (const line of streamLines(task, 'stdout')) {\n result.push(line.replace(/^[ *] /, ''));\n }\n\n return result;\n }\n\n static async listTags(args: string[] = [], opts?: SpawnTaskOptions): Promise<string[]> {\n const task = this.tag(['-l', ...args], opts);\n const result: string[] = [];\n\n for await (const line of streamLines(task, 'stdout')) {\n result.push(line);\n }\n\n return result;\n }\n}\n"],"names":["Git","command","cmd","args","options","opts","logger","task","SpawnTask","subscribe","data","debug","toString","manager","add","branch","diff","tag","isAffected","reference","Promise","resolve","reject","exitCode","Error","name","listBranches","result","line","streamLines","push","replace","listTags","lazyInject","TaskManager","Logger"],"mappings":"AAAA;;;;+BAWaA;;aAAAA;;uBAXyD;0BAEnC;uBACP;;;;;;;AAQrB,MAAMA;IAQX,UAAU;IACV,OAAOC,QAAQC,GAAW,EAAEC,IAAc,EAAEC,UAA4B,CAAC,CAAC,EAAyB;QACjG,MAAMC,OAAO;YAAEC,QAAQ,IAAI,CAACA,MAAM;YAAE,GAAGF,OAAO;QAAC;QAE/C,cAAc;QACd,MAAMG,OAAO,IAAIC,gBAAS,CAAC,OAAO;YAACN;eAAQC;SAAK,EAAE;YAAEF,SAASC;QAAI,GAAGG;QACpEE,KAAKE,SAAS,CAAC,UAAU,CAAC,EAAEC,KAAI,EAAE,GAAKL,KAAKC,MAAM,CAACK,KAAK,CAACD,KAAKE,QAAQ,CAAC;QAEvE,IAAI,CAACC,OAAO,CAACC,GAAG,CAACP;QAEjB,OAAOA;IACT;IAEA,WAAW;IACX,OAAOQ,OAAOZ,IAAc,EAAEC,OAA0B,EAAyB;QAC/E,OAAO,IAAI,CAACH,OAAO,CAAC,UAAUE,MAAMC;IACtC;IAEA,OAAOY,KAAKb,IAAc,EAAEC,OAA0B,EAAyB;QAC7E,OAAO,IAAI,CAACH,OAAO,CAAC,QAAQE,MAAMC;IACpC;IAEA,OAAOa,IAAId,IAAc,EAAEC,OAA0B,EAAyB;QAC5E,OAAO,IAAI,CAACH,OAAO,CAAC,OAAOE,MAAMC;IACnC;IAEA,aAAa;IACb,OAAOc,WAAWC,SAAiB,EAAEhB,OAAiB,EAAE,EAAEE,IAAuB,EAAoB;QACnG,OAAO,IAAIe,QAAQ,CAACC,SAASC,SAAW;YACtC,MAAMf,OAAO,IAAI,CAACS,IAAI,CAAC;gBAAC;gBAAWG;mBAAchB;aAAK,EAAEE;YAExDE,KAAKE,SAAS,CAAC,eAAe,IAAMY,QAAQ,KAAK;YACjDd,KAAKE,SAAS,CAAC,iBAAiB,IAAM;gBACpC,IAAIF,KAAKgB,QAAQ,EAAE;oBACjBF,QAAQ,IAAI;gBACd,OAAO;oBACLC,OAAO,IAAIE,MAAM,CAAC,KAAK,EAAEjB,KAAKkB,IAAI,CAAC,OAAO,CAAC;gBAC7C,CAAC;YACH;QACF;IACF;IAEA,aAAaC,aAAavB,OAAiB,EAAE,EAAEE,IAAuB,EAAqB;QACzF,MAAME,OAAO,IAAI,CAACQ,MAAM,CAAC;YAAC;eAASZ;SAAK,EAAEE;QAC1C,MAAMsB,SAAmB,EAAE;QAE3B,WAAW,MAAMC,QAAQC,IAAAA,kBAAW,EAACtB,MAAM,UAAW;YACpDoB,OAAOG,IAAI,CAACF,KAAKG,OAAO,CAAC,UAAU;QACrC;QAEA,OAAOJ;IACT;IAEA,aAAaK,SAAS7B,OAAiB,EAAE,EAAEE,IAAuB,EAAqB;QACrF,MAAME,OAAO,IAAI,CAACU,GAAG,CAAC;YAAC;eAASd;SAAK,EAAEE;QACvC,MAAMsB,SAAmB,EAAE;QAE3B,WAAW,MAAMC,QAAQC,IAAAA,kBAAW,EAACtB,MAAM,UAAW;YACpDoB,OAAOG,IAAI,CAACF;QACd;QAEA,OAAOD;IACT;AACF;;IArEGM,IAAAA,oBAAU,EAACC,kBAAW;GAFZlC;;IAKViC,IAAAA,oBAAU,EAACE,gBAAM;GALPnC","file":"git.js"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["project/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAmB,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE5F,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAOjD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,oBAAY,iBAAiB,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAExD,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAoB,SAAQ,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC;IACxE,SAAS,CAAC,EAAE,iBAAiB,CAAC;CAC/B;AAGD,qBAAa,SAAS;IAQlB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,QAAQ,CAAC,QAAQ,EAAE,OAAO;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO;IAR3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAuC;IACtE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkD;gBAItD,IAAI,EAAE,MAAM,EACpB,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,OAAO;IAO3B,OAAO,CAAC,UAAU;YAYJ,kBAAkB;YAuBlB,WAAW;IAqBnB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAWtC,iBAAiB;IAczB,YAAY,IAAI,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC;IAQ/C,eAAe,IAAI,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC;YAQ3C,WAAW;IAYnB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,EAAE,IAAI,GAAE,mBAAwB,GAAG,OAAO,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IA2B9G,KAAK,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAYlE,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,GAAG,IAAI,MAAM,CAEhB;CACF","file":"workspace.d.ts","sourcesContent":["import { SpawnTask, SpawnTaskOptions, SpawnTaskStream, TaskContext } from '@jujulego/tasks';\nimport path from 'node:path';\nimport { Package } from 'normalize-package-data';\nimport { satisfies } from 'semver';\nimport winston from 'winston';\n\nimport { Git } from '../git';\nimport { container, Logger } from '../services';\nimport { combine, streamLines } from '../utils';\nimport { Project } from './project';\n\n// Types\nexport type WorkspaceDepsMode = 'all' | 'prod' | 'none';\n\nexport interface WorkspaceContext extends TaskContext {\n workspace: Workspace;\n script: string;\n}\n\nexport interface WorkspaceRunOptions extends Omit<SpawnTaskOptions, 'cwd'> {\n buildDeps?: WorkspaceDepsMode;\n}\n\n// Class\nexport class Workspace {\n // Attributes\n private readonly _logger: winston.Logger;\n private readonly _affectedCache = new Map<string, Promise<boolean>>();\n private readonly _tasks = new Map<string, SpawnTask<WorkspaceContext>>();\n\n // Constructor\n constructor(\n private readonly _cwd: string,\n readonly manifest: Package,\n readonly project: Project\n ) {\n const logger = container.get(Logger);\n this._logger = logger.child({ label: this.manifest.name });\n }\n\n // Methods\n private _satisfies(from: Workspace, range: string): boolean {\n if (range.startsWith('file:')) {\n return path.resolve(from.cwd, range.substring(5)) === this.cwd;\n }\n\n if (range.startsWith('workspace:')) {\n range = range.substring(10);\n }\n\n return !this.version || satisfies(this.version, range);\n }\n\n private async _buildDependencies(task: SpawnTask, deps: WorkspaceDepsMode = 'all') {\n // Generators\n const generators: AsyncGenerator<Workspace, void>[] = [];\n\n switch (deps) {\n case 'all':\n generators.unshift(this.devDependencies());\n\n // eslint-disable-next no-fallthrough\n case 'prod':\n generators.unshift(this.dependencies());\n }\n\n // Build deps\n for await (const dep of combine(...generators)) {\n const build = await dep.build();\n\n if (build) {\n task.dependsOn(build);\n }\n }\n }\n\n private async _isAffected(reference: string): Promise<boolean> {\n const isAffected = await Git.isAffected(reference, ['--', this.cwd], {\n cwd: this.project.root,\n logger: this._logger,\n });\n\n if (isAffected) {\n return true;\n }\n\n // Test dependencies\n const proms: Promise<boolean>[] = [];\n\n for await (const dep of combine(this.dependencies(), this.devDependencies())) {\n proms.push(dep.isAffected(reference));\n }\n\n const results = await Promise.all(proms);\n return results.some(r => r);\n }\n\n async isAffected(reference: string): Promise<boolean> {\n let isAffected = this._affectedCache.get(reference);\n\n if (!isAffected) {\n isAffected = this._isAffected(reference);\n this._affectedCache.set(reference, isAffected);\n }\n\n return await isAffected;\n }\n\n private async* _loadDependencies(dependencies: Record<string, string>, kind: string): AsyncGenerator<Workspace, void> {\n for (const [dep, range] of Object.entries(dependencies)) {\n const ws = await this.project.workspace(dep);\n\n if (ws) {\n if (ws._satisfies(this, range)) {\n yield ws;\n } else {\n this._logger.verbose(`Ignoring ${kind} ${ws.reference} as it does not match requirement ${range}`);\n }\n }\n }\n }\n\n async* dependencies(): AsyncGenerator<Workspace, void> {\n if (!this.manifest.dependencies) return;\n\n for await (const ws of this._loadDependencies(this.manifest.dependencies, 'dependency')) {\n yield ws;\n }\n }\n\n async* devDependencies(): AsyncGenerator<Workspace, void> {\n if (!this.manifest.devDependencies) return;\n\n for await (const ws of this._loadDependencies(this.manifest.devDependencies, 'devDependency')) {\n yield ws;\n }\n }\n\n private async _streamLogs(task: SpawnTask<WorkspaceContext>, stream: SpawnTaskStream, level: string) {\n try {\n for await (const line of streamLines(task, stream)) {\n this._logger.log(level, line);\n }\n } catch (err) {\n if (err) {\n this._logger.warn(`Error while streaming task ${stream}`, err);\n }\n }\n }\n\n async run(script: string, args: string[] = [], opts: WorkspaceRunOptions = {}): Promise<SpawnTask<WorkspaceContext>> {\n let task = this._tasks.get(script);\n\n if (!task) {\n const pm = await this.project.packageManager();\n\n task = new SpawnTask(pm, ['run', script, ...args], { workspace: this, script }, {\n ...opts,\n cwd: this.cwd,\n logger: this._logger,\n env: {\n FORCE_COLOR: '1',\n ...opts.env\n }\n });\n\n this._streamLogs(task, 'stdout', 'info');\n this._streamLogs(task, 'stderr', 'info');\n\n await this._buildDependencies(task, opts.buildDeps);\n\n this._tasks.set(script, task);\n }\n\n return task;\n }\n\n async build(opts?: WorkspaceRunOptions): Promise<SpawnTask | null> {\n const { scripts = {} } = this.manifest;\n\n if (!scripts.build) {\n this._logger.warn('Will not be built (no build script)');\n return null;\n }\n\n return await this.run('build', [], opts);\n }\n\n // Properties\n get name(): string {\n return this.manifest.name;\n }\n\n get version(): string {\n return this.manifest.version;\n }\n\n get reference(): string {\n return this.version ? `${this.name}@${this.version}` : this.name;\n }\n\n get cwd(): string {\n return path.resolve(this.project.root, this._cwd);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["project/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAmB,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE5F,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAOjD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,oBAAY,iBAAiB,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAExD,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAoB,SAAQ,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC;IACxE,SAAS,CAAC,EAAE,iBAAiB,CAAC;CAC/B;AAGD,qBAAa,SAAS;IAQlB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,QAAQ,CAAC,QAAQ,EAAE,OAAO;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO;IAR3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAuC;IACtE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkD;gBAItD,IAAI,EAAE,MAAM,EACpB,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,OAAO;IAO3B,OAAO,CAAC,UAAU;YAYJ,kBAAkB;YAuBlB,WAAW;IAqBnB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAWtC,iBAAiB;IAczB,YAAY,IAAI,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC;IAQ/C,eAAe,IAAI,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC;YAQ3C,WAAW;IAYnB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,EAAE,IAAI,GAAE,mBAAwB,GAAG,OAAO,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IA2B9G,KAAK,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAYlE,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,GAAG,IAAI,MAAM,CAEhB;CACF","file":"workspace.d.ts","sourcesContent":["import { SpawnTask, SpawnTaskOptions, SpawnTaskStream, TaskContext } from '@jujulego/tasks';\nimport path from 'node:path';\nimport { Package } from 'normalize-package-data';\nimport { satisfies } from 'semver';\nimport winston from 'winston';\n\nimport { Git } from '../git';\nimport { container, Logger } from '../services';\nimport { combine, streamLines } from '../utils';\nimport { Project } from './project';\n\n// Types\nexport type WorkspaceDepsMode = 'all' | 'prod' | 'none';\n\nexport interface WorkspaceContext extends TaskContext {\n workspace: Workspace;\n script: string;\n}\n\nexport interface WorkspaceRunOptions extends Omit<SpawnTaskOptions, 'cwd'> {\n buildDeps?: WorkspaceDepsMode;\n}\n\n// Class\nexport class Workspace {\n // Attributes\n private readonly _logger: winston.Logger;\n private readonly _affectedCache = new Map<string, Promise<boolean>>();\n private readonly _tasks = new Map<string, SpawnTask<WorkspaceContext>>();\n\n // Constructor\n constructor(\n private readonly _cwd: string,\n readonly manifest: Package,\n readonly project: Project\n ) {\n const logger = container.get(Logger);\n this._logger = logger.child({ label: this.manifest.name });\n }\n\n // Methods\n private _satisfies(from: Workspace, range: string): boolean {\n if (range.startsWith('file:')) {\n return path.resolve(from.cwd, range.substring(5)) === this.cwd;\n }\n\n if (range.startsWith('workspace:')) {\n range = range.substring(10);\n }\n\n return !this.version || satisfies(this.version, range);\n }\n\n private async _buildDependencies(task: SpawnTask, deps: WorkspaceDepsMode = 'all') {\n // Generators\n const generators: AsyncGenerator<Workspace, void>[] = [];\n\n switch (deps) {\n case 'all':\n generators.unshift(this.devDependencies());\n\n // eslint-disable-next no-fallthrough\n case 'prod':\n generators.unshift(this.dependencies());\n }\n\n // Build deps\n for await (const dep of combine(...generators)) {\n const build = await dep.build();\n\n if (build) {\n task.dependsOn(build);\n }\n }\n }\n\n private async _isAffected(reference: string): Promise<boolean> {\n const isAffected = await Git.isAffected(reference, ['--', this.cwd], {\n cwd: this.project.root,\n logger: this._logger,\n });\n\n if (isAffected) {\n return true;\n }\n\n // Test dependencies\n const proms: Promise<boolean>[] = [];\n\n for await (const dep of combine(this.dependencies(), this.devDependencies())) {\n proms.push(dep.isAffected(reference));\n }\n\n const results = await Promise.all(proms);\n return results.some(r => r);\n }\n\n async isAffected(reference: string): Promise<boolean> {\n let isAffected = this._affectedCache.get(reference);\n\n if (!isAffected) {\n isAffected = this._isAffected(reference);\n this._affectedCache.set(reference, isAffected);\n }\n\n return await isAffected;\n }\n\n private async* _loadDependencies(dependencies: Record<string, string>, kind: string): AsyncGenerator<Workspace, void> {\n for (const [dep, range] of Object.entries(dependencies)) {\n const ws = await this.project.workspace(dep);\n\n if (ws) {\n if (ws._satisfies(this, range)) {\n yield ws;\n } else {\n this._logger.verbose(`Ignoring ${kind} ${ws.reference} as it does not match requirement ${range}`);\n }\n }\n }\n }\n\n async* dependencies(): AsyncGenerator<Workspace, void> {\n if (!this.manifest.dependencies) return;\n\n for await (const ws of this._loadDependencies(this.manifest.dependencies, 'dependency')) {\n yield ws;\n }\n }\n\n async* devDependencies(): AsyncGenerator<Workspace, void> {\n if (!this.manifest.devDependencies) return;\n\n for await (const ws of this._loadDependencies(this.manifest.devDependencies, 'devDependency')) {\n yield ws;\n }\n }\n\n private async _streamLogs(task: SpawnTask<WorkspaceContext>, stream: SpawnTaskStream, level: string) {\n try {\n for await (const line of streamLines(task, stream)) {\n this._logger.log(level, line, { label: `${this.name}#${task.context.script}` });\n }\n } catch (err) {\n if (err) {\n this._logger.warn(`Error while streaming task ${stream}`, err, { label: `${this.name}#${task.context.script}` });\n }\n }\n }\n\n async run(script: string, args: string[] = [], opts: WorkspaceRunOptions = {}): Promise<SpawnTask<WorkspaceContext>> {\n let task = this._tasks.get(script);\n\n if (!task) {\n const pm = await this.project.packageManager();\n\n task = new SpawnTask(pm, ['run', script, ...args], { workspace: this, script }, {\n ...opts,\n cwd: this.cwd,\n logger: this._logger.child({ label: `${this.name}#${script}`}),\n env: {\n FORCE_COLOR: '1',\n ...opts.env\n }\n });\n\n this._streamLogs(task, 'stdout', 'info');\n this._streamLogs(task, 'stderr', 'info');\n\n await this._buildDependencies(task, opts.buildDeps);\n\n this._tasks.set(script, task);\n }\n\n return task;\n }\n\n async build(opts?: WorkspaceRunOptions): Promise<SpawnTask | null> {\n const { scripts = {} } = this.manifest;\n\n if (!scripts.build) {\n this._logger.warn('Will not be built (no build script)');\n return null;\n }\n\n return await this.run('build', [], opts);\n }\n\n // Properties\n get name(): string {\n return this.manifest.name;\n }\n\n get version(): string {\n return this.manifest.version;\n }\n\n get reference(): string {\n return this.version ? `${this.name}@${this.version}` : this.name;\n }\n\n get cwd(): string {\n return path.resolve(this.project.root, this._cwd);\n }\n}\n"]}
|
|
@@ -112,11 +112,15 @@ class Workspace {
|
|
|
112
112
|
async _streamLogs(task, stream, level) {
|
|
113
113
|
try {
|
|
114
114
|
for await (const line of (0, _utils.streamLines)(task, stream)){
|
|
115
|
-
this._logger.log(level, line
|
|
115
|
+
this._logger.log(level, line, {
|
|
116
|
+
label: `${this.name}#${task.context.script}`
|
|
117
|
+
});
|
|
116
118
|
}
|
|
117
119
|
} catch (err) {
|
|
118
120
|
if (err) {
|
|
119
|
-
this._logger.warn(`Error while streaming task ${stream}`, err
|
|
121
|
+
this._logger.warn(`Error while streaming task ${stream}`, err, {
|
|
122
|
+
label: `${this.name}#${task.context.script}`
|
|
123
|
+
});
|
|
120
124
|
}
|
|
121
125
|
}
|
|
122
126
|
}
|
|
@@ -134,7 +138,9 @@ class Workspace {
|
|
|
134
138
|
}, {
|
|
135
139
|
...opts,
|
|
136
140
|
cwd: this.cwd,
|
|
137
|
-
logger: this._logger
|
|
141
|
+
logger: this._logger.child({
|
|
142
|
+
label: `${this.name}#${script}`
|
|
143
|
+
}),
|
|
138
144
|
env: {
|
|
139
145
|
FORCE_COLOR: '1',
|
|
140
146
|
...opts.env
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["project/workspace.js"],"sourcesContent":["import { SpawnTask, SpawnTaskOptions, SpawnTaskStream, TaskContext } from '@jujulego/tasks';\nimport path from 'node:path';\nimport { Package } from 'normalize-package-data';\nimport { satisfies } from 'semver';\nimport winston from 'winston';\n\nimport { Git } from '../git';\nimport { container, Logger } from '../services';\nimport { combine, streamLines } from '../utils';\nimport { Project } from './project';\n\n// Types\nexport type WorkspaceDepsMode = 'all' | 'prod' | 'none';\n\nexport interface WorkspaceContext extends TaskContext {\n workspace: Workspace;\n script: string;\n}\n\nexport interface WorkspaceRunOptions extends Omit<SpawnTaskOptions, 'cwd'> {\n buildDeps?: WorkspaceDepsMode;\n}\n\n// Class\nexport class Workspace {\n // Attributes\n private readonly _logger: winston.Logger;\n private readonly _affectedCache = new Map<string, Promise<boolean>>();\n private readonly _tasks = new Map<string, SpawnTask<WorkspaceContext>>();\n\n // Constructor\n constructor(\n private readonly _cwd: string,\n readonly manifest: Package,\n readonly project: Project\n ) {\n const logger = container.get(Logger);\n this._logger = logger.child({ label: this.manifest.name });\n }\n\n // Methods\n private _satisfies(from: Workspace, range: string): boolean {\n if (range.startsWith('file:')) {\n return path.resolve(from.cwd, range.substring(5)) === this.cwd;\n }\n\n if (range.startsWith('workspace:')) {\n range = range.substring(10);\n }\n\n return !this.version || satisfies(this.version, range);\n }\n\n private async _buildDependencies(task: SpawnTask, deps: WorkspaceDepsMode = 'all') {\n // Generators\n const generators: AsyncGenerator<Workspace, void>[] = [];\n\n switch (deps) {\n case 'all':\n generators.unshift(this.devDependencies());\n\n // eslint-disable-next no-fallthrough\n case 'prod':\n generators.unshift(this.dependencies());\n }\n\n // Build deps\n for await (const dep of combine(...generators)) {\n const build = await dep.build();\n\n if (build) {\n task.dependsOn(build);\n }\n }\n }\n\n private async _isAffected(reference: string): Promise<boolean> {\n const isAffected = await Git.isAffected(reference, ['--', this.cwd], {\n cwd: this.project.root,\n logger: this._logger,\n });\n\n if (isAffected) {\n return true;\n }\n\n // Test dependencies\n const proms: Promise<boolean>[] = [];\n\n for await (const dep of combine(this.dependencies(), this.devDependencies())) {\n proms.push(dep.isAffected(reference));\n }\n\n const results = await Promise.all(proms);\n return results.some(r => r);\n }\n\n async isAffected(reference: string): Promise<boolean> {\n let isAffected = this._affectedCache.get(reference);\n\n if (!isAffected) {\n isAffected = this._isAffected(reference);\n this._affectedCache.set(reference, isAffected);\n }\n\n return await isAffected;\n }\n\n private async* _loadDependencies(dependencies: Record<string, string>, kind: string): AsyncGenerator<Workspace, void> {\n for (const [dep, range] of Object.entries(dependencies)) {\n const ws = await this.project.workspace(dep);\n\n if (ws) {\n if (ws._satisfies(this, range)) {\n yield ws;\n } else {\n this._logger.verbose(`Ignoring ${kind} ${ws.reference} as it does not match requirement ${range}`);\n }\n }\n }\n }\n\n async* dependencies(): AsyncGenerator<Workspace, void> {\n if (!this.manifest.dependencies) return;\n\n for await (const ws of this._loadDependencies(this.manifest.dependencies, 'dependency')) {\n yield ws;\n }\n }\n\n async* devDependencies(): AsyncGenerator<Workspace, void> {\n if (!this.manifest.devDependencies) return;\n\n for await (const ws of this._loadDependencies(this.manifest.devDependencies, 'devDependency')) {\n yield ws;\n }\n }\n\n private async _streamLogs(task: SpawnTask<WorkspaceContext>, stream: SpawnTaskStream, level: string) {\n try {\n for await (const line of streamLines(task, stream)) {\n this._logger.log(level, line);\n }\n } catch (err) {\n if (err) {\n this._logger.warn(`Error while streaming task ${stream}`, err);\n }\n }\n }\n\n async run(script: string, args: string[] = [], opts: WorkspaceRunOptions = {}): Promise<SpawnTask<WorkspaceContext>> {\n let task = this._tasks.get(script);\n\n if (!task) {\n const pm = await this.project.packageManager();\n\n task = new SpawnTask(pm, ['run', script, ...args], { workspace: this, script }, {\n ...opts,\n cwd: this.cwd,\n logger: this._logger,\n env: {\n FORCE_COLOR: '1',\n ...opts.env\n }\n });\n\n this._streamLogs(task, 'stdout', 'info');\n this._streamLogs(task, 'stderr', 'info');\n\n await this._buildDependencies(task, opts.buildDeps);\n\n this._tasks.set(script, task);\n }\n\n return task;\n }\n\n async build(opts?: WorkspaceRunOptions): Promise<SpawnTask | null> {\n const { scripts = {} } = this.manifest;\n\n if (!scripts.build) {\n this._logger.warn('Will not be built (no build script)');\n return null;\n }\n\n return await this.run('build', [], opts);\n }\n\n // Properties\n get name(): string {\n return this.manifest.name;\n }\n\n get version(): string {\n return this.manifest.version;\n }\n\n get reference(): string {\n return this.version ? `${this.name}@${this.version}` : this.name;\n }\n\n get cwd(): string {\n return path.resolve(this.project.root, this._cwd);\n }\n}\n"],"names":["Workspace","constructor","_cwd","manifest","project","_affectedCache","Map","_tasks","logger","container","get","Logger","_logger","child","label","name","_satisfies","from","range","startsWith","path","resolve","cwd","substring","version","satisfies","_buildDependencies","task","deps","generators","unshift","devDependencies","dependencies","dep","combine","build","dependsOn","_isAffected","reference","isAffected","Git","root","proms","push","results","Promise","all","some","r","set","_loadDependencies","kind","Object","entries","ws","workspace","verbose","_streamLogs","stream","level","line","streamLines","log","err","warn","run","script","args","opts","pm","packageManager","SpawnTask","env","FORCE_COLOR","buildDeps","scripts"],"mappings":"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","file":"workspace.js"}
|
|
1
|
+
{"version":3,"sources":["project/workspace.js"],"sourcesContent":["import { SpawnTask, SpawnTaskOptions, SpawnTaskStream, TaskContext } from '@jujulego/tasks';\nimport path from 'node:path';\nimport { Package } from 'normalize-package-data';\nimport { satisfies } from 'semver';\nimport winston from 'winston';\n\nimport { Git } from '../git';\nimport { container, Logger } from '../services';\nimport { combine, streamLines } from '../utils';\nimport { Project } from './project';\n\n// Types\nexport type WorkspaceDepsMode = 'all' | 'prod' | 'none';\n\nexport interface WorkspaceContext extends TaskContext {\n workspace: Workspace;\n script: string;\n}\n\nexport interface WorkspaceRunOptions extends Omit<SpawnTaskOptions, 'cwd'> {\n buildDeps?: WorkspaceDepsMode;\n}\n\n// Class\nexport class Workspace {\n // Attributes\n private readonly _logger: winston.Logger;\n private readonly _affectedCache = new Map<string, Promise<boolean>>();\n private readonly _tasks = new Map<string, SpawnTask<WorkspaceContext>>();\n\n // Constructor\n constructor(\n private readonly _cwd: string,\n readonly manifest: Package,\n readonly project: Project\n ) {\n const logger = container.get(Logger);\n this._logger = logger.child({ label: this.manifest.name });\n }\n\n // Methods\n private _satisfies(from: Workspace, range: string): boolean {\n if (range.startsWith('file:')) {\n return path.resolve(from.cwd, range.substring(5)) === this.cwd;\n }\n\n if (range.startsWith('workspace:')) {\n range = range.substring(10);\n }\n\n return !this.version || satisfies(this.version, range);\n }\n\n private async _buildDependencies(task: SpawnTask, deps: WorkspaceDepsMode = 'all') {\n // Generators\n const generators: AsyncGenerator<Workspace, void>[] = [];\n\n switch (deps) {\n case 'all':\n generators.unshift(this.devDependencies());\n\n // eslint-disable-next no-fallthrough\n case 'prod':\n generators.unshift(this.dependencies());\n }\n\n // Build deps\n for await (const dep of combine(...generators)) {\n const build = await dep.build();\n\n if (build) {\n task.dependsOn(build);\n }\n }\n }\n\n private async _isAffected(reference: string): Promise<boolean> {\n const isAffected = await Git.isAffected(reference, ['--', this.cwd], {\n cwd: this.project.root,\n logger: this._logger,\n });\n\n if (isAffected) {\n return true;\n }\n\n // Test dependencies\n const proms: Promise<boolean>[] = [];\n\n for await (const dep of combine(this.dependencies(), this.devDependencies())) {\n proms.push(dep.isAffected(reference));\n }\n\n const results = await Promise.all(proms);\n return results.some(r => r);\n }\n\n async isAffected(reference: string): Promise<boolean> {\n let isAffected = this._affectedCache.get(reference);\n\n if (!isAffected) {\n isAffected = this._isAffected(reference);\n this._affectedCache.set(reference, isAffected);\n }\n\n return await isAffected;\n }\n\n private async* _loadDependencies(dependencies: Record<string, string>, kind: string): AsyncGenerator<Workspace, void> {\n for (const [dep, range] of Object.entries(dependencies)) {\n const ws = await this.project.workspace(dep);\n\n if (ws) {\n if (ws._satisfies(this, range)) {\n yield ws;\n } else {\n this._logger.verbose(`Ignoring ${kind} ${ws.reference} as it does not match requirement ${range}`);\n }\n }\n }\n }\n\n async* dependencies(): AsyncGenerator<Workspace, void> {\n if (!this.manifest.dependencies) return;\n\n for await (const ws of this._loadDependencies(this.manifest.dependencies, 'dependency')) {\n yield ws;\n }\n }\n\n async* devDependencies(): AsyncGenerator<Workspace, void> {\n if (!this.manifest.devDependencies) return;\n\n for await (const ws of this._loadDependencies(this.manifest.devDependencies, 'devDependency')) {\n yield ws;\n }\n }\n\n private async _streamLogs(task: SpawnTask<WorkspaceContext>, stream: SpawnTaskStream, level: string) {\n try {\n for await (const line of streamLines(task, stream)) {\n this._logger.log(level, line, { label: `${this.name}#${task.context.script}` });\n }\n } catch (err) {\n if (err) {\n this._logger.warn(`Error while streaming task ${stream}`, err, { label: `${this.name}#${task.context.script}` });\n }\n }\n }\n\n async run(script: string, args: string[] = [], opts: WorkspaceRunOptions = {}): Promise<SpawnTask<WorkspaceContext>> {\n let task = this._tasks.get(script);\n\n if (!task) {\n const pm = await this.project.packageManager();\n\n task = new SpawnTask(pm, ['run', script, ...args], { workspace: this, script }, {\n ...opts,\n cwd: this.cwd,\n logger: this._logger.child({ label: `${this.name}#${script}`}),\n env: {\n FORCE_COLOR: '1',\n ...opts.env\n }\n });\n\n this._streamLogs(task, 'stdout', 'info');\n this._streamLogs(task, 'stderr', 'info');\n\n await this._buildDependencies(task, opts.buildDeps);\n\n this._tasks.set(script, task);\n }\n\n return task;\n }\n\n async build(opts?: WorkspaceRunOptions): Promise<SpawnTask | null> {\n const { scripts = {} } = this.manifest;\n\n if (!scripts.build) {\n this._logger.warn('Will not be built (no build script)');\n return null;\n }\n\n return await this.run('build', [], opts);\n }\n\n // Properties\n get name(): string {\n return this.manifest.name;\n }\n\n get version(): string {\n return this.manifest.version;\n }\n\n get reference(): string {\n return this.version ? `${this.name}@${this.version}` : this.name;\n }\n\n get cwd(): string {\n return path.resolve(this.project.root, this._cwd);\n }\n}\n"],"names":["Workspace","constructor","_cwd","manifest","project","_affectedCache","Map","_tasks","logger","container","get","Logger","_logger","child","label","name","_satisfies","from","range","startsWith","path","resolve","cwd","substring","version","satisfies","_buildDependencies","task","deps","generators","unshift","devDependencies","dependencies","dep","combine","build","dependsOn","_isAffected","reference","isAffected","Git","root","proms","push","results","Promise","all","some","r","set","_loadDependencies","kind","Object","entries","ws","workspace","verbose","_streamLogs","stream","level","line","streamLines","log","context","script","err","warn","run","args","opts","pm","packageManager","SpawnTask","env","FORCE_COLOR","buildDeps","scripts"],"mappings":"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","file":"workspace.js"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["ui/group-task-spinner.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,EAAE,EAA6B,MAAM,OAAO,CAAC;AAKtD,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,SAAS,CAAC;CAClB;AAGD,eAAO,MAAM,gBAAgB,EAAE,EAAE,CAAC,qBAAqB,CAkCtD,CAAC","file":"group-task-spinner.d.ts","sourcesContent":["import { GroupTask } from '@jujulego/tasks';\nimport { Box } from 'ink';\nimport { FC, useLayoutEffect, useState } from 'react';\n\nimport { TaskSpinner } from './task-spinner';\n\n// Types\nexport interface GroupTaskSpinnerProps {\n group: GroupTask;\n}\n\n// Components\nexport const GroupTaskSpinner: FC<GroupTaskSpinnerProps> = ({ group }) => {\n const [tasks, setTasks] = useState([...group.tasks]);\n\n useLayoutEffect(() => {\n let dirty = false;\n\n return group.subscribe('task.added', () => {\n if (!dirty) {\n dirty = true;\n\n queueMicrotask(() => {\n setTasks([...group.tasks]);\n dirty = false;\n });\n }\n });\n }, [group]);\n\n return (\n <>\n <TaskSpinner task={group} />\n <Box flexDirection=\"column\" marginLeft={2}>\n { tasks.map((task) => (\n <Box key={task.id}>\n { (task instanceof GroupTask) ? (\n <GroupTaskSpinner group={task} />\n ) : (\n <TaskSpinner task={task} />\n ) }\n </Box>\n )) }\n </Box>\n </>\n );\n};\n"]}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "GroupTaskSpinner", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: ()=>GroupTaskSpinner
|
|
8
|
+
});
|
|
9
|
+
const _jsxRuntime = require("react/jsx-runtime");
|
|
10
|
+
const _tasks = require("@jujulego/tasks");
|
|
11
|
+
const _ink = require("ink");
|
|
12
|
+
const _react = require("react");
|
|
13
|
+
const _taskSpinner = require("./task-spinner");
|
|
14
|
+
const GroupTaskSpinner = ({ group })=>{
|
|
15
|
+
const [tasks, setTasks] = (0, _react.useState)([
|
|
16
|
+
...group.tasks
|
|
17
|
+
]);
|
|
18
|
+
(0, _react.useLayoutEffect)(()=>{
|
|
19
|
+
let dirty = false;
|
|
20
|
+
return group.subscribe('task.added', ()=>{
|
|
21
|
+
if (!dirty) {
|
|
22
|
+
dirty = true;
|
|
23
|
+
queueMicrotask(()=>{
|
|
24
|
+
setTasks([
|
|
25
|
+
...group.tasks
|
|
26
|
+
]);
|
|
27
|
+
dirty = false;
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}, [
|
|
32
|
+
group
|
|
33
|
+
]);
|
|
34
|
+
return /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
35
|
+
children: [
|
|
36
|
+
/*#__PURE__*/ (0, _jsxRuntime.jsx)(_taskSpinner.TaskSpinner, {
|
|
37
|
+
task: group
|
|
38
|
+
}),
|
|
39
|
+
/*#__PURE__*/ (0, _jsxRuntime.jsx)(_ink.Box, {
|
|
40
|
+
flexDirection: "column",
|
|
41
|
+
marginLeft: 2,
|
|
42
|
+
children: tasks.map((task)=>/*#__PURE__*/ (0, _jsxRuntime.jsx)(_ink.Box, {
|
|
43
|
+
children: task instanceof _tasks.GroupTask ? /*#__PURE__*/ (0, _jsxRuntime.jsx)(GroupTaskSpinner, {
|
|
44
|
+
group: task
|
|
45
|
+
}) : /*#__PURE__*/ (0, _jsxRuntime.jsx)(_taskSpinner.TaskSpinner, {
|
|
46
|
+
task: task
|
|
47
|
+
})
|
|
48
|
+
}, task.id))
|
|
49
|
+
})
|
|
50
|
+
]
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
//# sourceMappingURL=group-task-spinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["ui/group-task-spinner.js"],"sourcesContent":["import { GroupTask } from '@jujulego/tasks';\nimport { Box } from 'ink';\nimport { FC, useLayoutEffect, useState } from 'react';\n\nimport { TaskSpinner } from './task-spinner';\n\n// Types\nexport interface GroupTaskSpinnerProps {\n group: GroupTask;\n}\n\n// Components\nexport const GroupTaskSpinner: FC<GroupTaskSpinnerProps> = ({ group }) => {\n const [tasks, setTasks] = useState([...group.tasks]);\n\n useLayoutEffect(() => {\n let dirty = false;\n\n return group.subscribe('task.added', () => {\n if (!dirty) {\n dirty = true;\n\n queueMicrotask(() => {\n setTasks([...group.tasks]);\n dirty = false;\n });\n }\n });\n }, [group]);\n\n return (\n <>\n <TaskSpinner task={group} />\n <Box flexDirection=\"column\" marginLeft={2}>\n { tasks.map((task) => (\n <Box key={task.id}>\n { (task instanceof GroupTask) ? (\n <GroupTaskSpinner group={task} />\n ) : (\n <TaskSpinner task={task} />\n ) }\n </Box>\n )) }\n </Box>\n </>\n );\n};\n"],"names":["GroupTaskSpinner","group","tasks","setTasks","useState","useLayoutEffect","dirty","subscribe","queueMicrotask","TaskSpinner","task","Box","flexDirection","marginLeft","map","GroupTask","id"],"mappings":"AAAA;;;;+BAYaA;;aAAAA;;;uBAZa;qBACN;uBAC0B;6BAElB;AAQrB,MAAMA,mBAA8C,CAAC,EAAEC,MAAK,EAAE,GAAK;IACxE,MAAM,CAACC,OAAOC,SAAS,GAAGC,IAAAA,eAAQ,EAAC;WAAIH,MAAMC,KAAK;KAAC;IAEnDG,IAAAA,sBAAe,EAAC,IAAM;QACpB,IAAIC,QAAQ,KAAK;QAEjB,OAAOL,MAAMM,SAAS,CAAC,cAAc,IAAM;YACzC,IAAI,CAACD,OAAO;gBACVA,QAAQ,IAAI;gBAEZE,eAAe,IAAM;oBACnBL,SAAS;2BAAIF,MAAMC,KAAK;qBAAC;oBACzBI,QAAQ,KAAK;gBACf;YACF,CAAC;QACH;IACF,GAAG;QAACL;KAAM;IAEV,qBACE;;0BACE,qBAACQ,wBAAW;gBAACC,MAAMT;;0BACnB,qBAACU,QAAG;gBAACC,eAAc;gBAASC,YAAY;0BACpCX,MAAMY,GAAG,CAAC,CAACJ,qBACX,qBAACC,QAAG;kCACA,AAACD,gBAAgBK,gBAAS,iBAC1B,qBAACf;4BAAiBC,OAAOS;2CAEzB,qBAACD,wBAAW;4BAACC,MAAMA;0BACpB;uBALOA,KAAKM,EAAE;;;;AAW3B","file":"group-task-spinner.js"}
|
package/dist/ui/index.d.ts
CHANGED
package/dist/ui/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["ui/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,eAAe,CAAC;AAC9B,cAAc,
|
|
1
|
+
{"version":3,"sources":["ui/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC","file":"index.d.ts","sourcesContent":["export * from './global-spinner';\nexport * from './layout';\nexport * from './list';\nexport * from './static-logs';\nexport * from './task-manager-spinner';\nexport * from './task-spinner';\nexport * from './workspace-tree';\n"]}
|
package/dist/ui/index.js
CHANGED
|
@@ -6,7 +6,7 @@ _exportStar(require("./global-spinner"), exports);
|
|
|
6
6
|
_exportStar(require("./layout"), exports);
|
|
7
7
|
_exportStar(require("./list"), exports);
|
|
8
8
|
_exportStar(require("./static-logs"), exports);
|
|
9
|
-
_exportStar(require("./
|
|
9
|
+
_exportStar(require("./task-manager-spinner"), exports);
|
|
10
10
|
_exportStar(require("./task-spinner"), exports);
|
|
11
11
|
_exportStar(require("./workspace-tree"), exports);
|
|
12
12
|
function _exportStar(from, to) {
|
package/dist/ui/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["ui/index.js"],"sourcesContent":["export * from './global-spinner';\nexport * from './layout';\nexport * from './list';\nexport * from './static-logs';\nexport * from './
|
|
1
|
+
{"version":3,"sources":["ui/index.js"],"sourcesContent":["export * from './global-spinner';\nexport * from './layout';\nexport * from './list';\nexport * from './static-logs';\nexport * from './task-manager-spinner';\nexport * from './task-spinner';\nexport * from './workspace-tree';\n"],"names":[],"mappings":"AAAA;;;;oBAAc;oBACA;oBACA;oBACA;oBACA;oBACA;oBACA","file":"index.js"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["ui/task-manager-spinner.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAa,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,EAAE,EAA6B,MAAM,OAAO,CAAC;AAMtD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,WAAW,CAAC;CACtB;AAGD,eAAO,MAAM,kBAAkB,EAAE,EAAE,CAAC,iBAAiB,CA6BpD,CAAC","file":"task-manager-spinner.d.ts","sourcesContent":["import { GroupTask, TaskManager } from '@jujulego/tasks';\nimport { FC, useLayoutEffect, useState } from 'react';\n\nimport { TaskSpinner } from './task-spinner';\nimport { GroupTaskSpinner } from './group-task-spinner';\n\n// Types\nexport interface TasksSpinnerProps {\n manager: TaskManager;\n}\n\n// Components\nexport const TaskManagerSpinner: FC<TasksSpinnerProps> = ({ manager }) => {\n const [tasks, setTasks] = useState(manager.tasks.filter((tsk) => !tsk.context.groupTask));\n\n useLayoutEffect(() => {\n let dirty = false;\n\n return manager.subscribe('added', () => {\n if (!dirty) {\n dirty = true;\n\n queueMicrotask(() => {\n setTasks(manager.tasks.filter((tsk) => !tsk.context.groupTask));\n dirty = false;\n });\n }\n });\n }, [manager]);\n\n return (\n <>\n { tasks.map((task) =>\n (task instanceof GroupTask) ? (\n <GroupTaskSpinner key={task.id} group={task} />\n ) : (\n <TaskSpinner key={task.id} task={task} />\n )\n ) }\n </>\n );\n};\n"]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "TaskManagerSpinner", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: ()=>TaskManagerSpinner
|
|
8
|
+
});
|
|
9
|
+
const _jsxRuntime = require("react/jsx-runtime");
|
|
10
|
+
const _tasks = require("@jujulego/tasks");
|
|
11
|
+
const _react = require("react");
|
|
12
|
+
const _taskSpinner = require("./task-spinner");
|
|
13
|
+
const _groupTaskSpinner = require("./group-task-spinner");
|
|
14
|
+
const TaskManagerSpinner = ({ manager })=>{
|
|
15
|
+
const [tasks, setTasks] = (0, _react.useState)(manager.tasks.filter((tsk)=>!tsk.context.groupTask));
|
|
16
|
+
(0, _react.useLayoutEffect)(()=>{
|
|
17
|
+
let dirty = false;
|
|
18
|
+
return manager.subscribe('added', ()=>{
|
|
19
|
+
if (!dirty) {
|
|
20
|
+
dirty = true;
|
|
21
|
+
queueMicrotask(()=>{
|
|
22
|
+
setTasks(manager.tasks.filter((tsk)=>!tsk.context.groupTask));
|
|
23
|
+
dirty = false;
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
}, [
|
|
28
|
+
manager
|
|
29
|
+
]);
|
|
30
|
+
return /*#__PURE__*/ (0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
|
|
31
|
+
children: tasks.map((task)=>task instanceof _tasks.GroupTask ? /*#__PURE__*/ (0, _jsxRuntime.jsx)(_groupTaskSpinner.GroupTaskSpinner, {
|
|
32
|
+
group: task
|
|
33
|
+
}, task.id) : /*#__PURE__*/ (0, _jsxRuntime.jsx)(_taskSpinner.TaskSpinner, {
|
|
34
|
+
task: task
|
|
35
|
+
}, task.id))
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=task-manager-spinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["ui/task-manager-spinner.js"],"sourcesContent":["import { GroupTask, TaskManager } from '@jujulego/tasks';\nimport { FC, useLayoutEffect, useState } from 'react';\n\nimport { TaskSpinner } from './task-spinner';\nimport { GroupTaskSpinner } from './group-task-spinner';\n\n// Types\nexport interface TasksSpinnerProps {\n manager: TaskManager;\n}\n\n// Components\nexport const TaskManagerSpinner: FC<TasksSpinnerProps> = ({ manager }) => {\n const [tasks, setTasks] = useState(manager.tasks.filter((tsk) => !tsk.context.groupTask));\n\n useLayoutEffect(() => {\n let dirty = false;\n\n return manager.subscribe('added', () => {\n if (!dirty) {\n dirty = true;\n\n queueMicrotask(() => {\n setTasks(manager.tasks.filter((tsk) => !tsk.context.groupTask));\n dirty = false;\n });\n }\n });\n }, [manager]);\n\n return (\n <>\n { tasks.map((task) =>\n (task instanceof GroupTask) ? (\n <GroupTaskSpinner key={task.id} group={task} />\n ) : (\n <TaskSpinner key={task.id} task={task} />\n )\n ) }\n </>\n );\n};\n"],"names":["TaskManagerSpinner","manager","tasks","setTasks","useState","filter","tsk","context","groupTask","useLayoutEffect","dirty","subscribe","queueMicrotask","map","task","GroupTask","GroupTaskSpinner","group","id","TaskSpinner"],"mappings":"AAAA;;;;+BAYaA;;aAAAA;;;uBAZ0B;uBACO;6BAElB;kCACK;AAQ1B,MAAMA,qBAA4C,CAAC,EAAEC,QAAO,EAAE,GAAK;IACxE,MAAM,CAACC,OAAOC,SAAS,GAAGC,IAAAA,eAAQ,EAACH,QAAQC,KAAK,CAACG,MAAM,CAAC,CAACC,MAAQ,CAACA,IAAIC,OAAO,CAACC,SAAS;IAEvFC,IAAAA,sBAAe,EAAC,IAAM;QACpB,IAAIC,QAAQ,KAAK;QAEjB,OAAOT,QAAQU,SAAS,CAAC,SAAS,IAAM;YACtC,IAAI,CAACD,OAAO;gBACVA,QAAQ,IAAI;gBAEZE,eAAe,IAAM;oBACnBT,SAASF,QAAQC,KAAK,CAACG,MAAM,CAAC,CAACC,MAAQ,CAACA,IAAIC,OAAO,CAACC,SAAS;oBAC7DE,QAAQ,KAAK;gBACf;YACF,CAAC;QACH;IACF,GAAG;QAACT;KAAQ;IAEZ,qBACE;kBACIC,MAAMW,GAAG,CAAC,CAACC,OACX,AAACA,gBAAgBC,gBAAS,iBACxB,qBAACC,kCAAgB;gBAAeC,OAAOH;eAAhBA,KAAKI,EAAE,kBAE9B,qBAACC,wBAAW;gBAAeL,MAAMA;eAAfA,KAAKI,EAAE,CAC1B;;AAIT","file":"task-manager-spinner.js"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["ui/task-spinner.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAKvC,OAAO,EAAE,EAAE,EAA6B,MAAM,OAAO,CAAC;AAKtD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,IAAI,CAAC;CACZ;AAGD,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CAmD5C,CAAC","file":"task-spinner.d.ts","sourcesContent":["import { Task } from '@jujulego/tasks';\nimport { Text } from 'ink';\nimport Spinner from 'ink-spinner';\nimport symbols from 'log-symbols';\nimport ms from 'ms';\nimport { FC, useLayoutEffect, useState } from 'react';\n\nimport { TaskName } from './task-name';\n\n// Types\nexport interface TaskSpinnerProps {\n task: Task;\n}\n\n// Components\nexport const TaskSpinner: FC<TaskSpinnerProps> = ({ task }) => {\n // State\n const [status, setStatus] = useState(task.status);\n const [time, setTime] = useState(0);\n\n // Effects\n useLayoutEffect(() => {\n return task.subscribe('status', (event) => {\n setStatus(event.status);\n });\n }, [task]);\n\n useLayoutEffect(() => {\n return task.subscribe('completed', ({ duration }) => {\n setTime(duration);\n });\n }, [task]);\n\n // Render\n switch (status) {\n case 'blocked':\n case 'ready':\n return (\n <Text color=\"grey\">\n <Spinner type=\"line2\" />{' '}<TaskName task={task} />\n </Text>\n );\n\n case 'running':\n return (\n <Text>\n <Spinner />{' '}<TaskName task={task} />\n </Text>\n );\n\n case 'done':\n return (\n <Text>\n <Text color=\"green\">{ symbols.success }{' '}<TaskName task={task} /></Text>\n <Text color=\"magenta\">{' '}took { ms(time) }</Text>\n </Text>\n );\n\n case 'failed':\n return (\n <Text>\n <Text color=\"red\">{ symbols.error }{' '}<TaskName task={task} /></Text>\n <Text color=\"magenta\">{' '}took { ms(time) }</Text>\n </Text>\n );\n }\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["ui/task-spinner.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAKvC,OAAO,EAAE,EAAE,EAA6B,MAAM,OAAO,CAAC;AAKtD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,IAAI,CAAC;CACZ;AAGD,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CAmD5C,CAAC","file":"task-spinner.d.ts","sourcesContent":["import { Task } from '@jujulego/tasks';\nimport { Text } from 'ink';\nimport Spinner from 'ink-spinner';\nimport symbols from 'log-symbols';\nimport ms from 'pretty-ms';\nimport { FC, useLayoutEffect, useState } from 'react';\n\nimport { TaskName } from './task-name';\n\n// Types\nexport interface TaskSpinnerProps {\n task: Task;\n}\n\n// Components\nexport const TaskSpinner: FC<TaskSpinnerProps> = ({ task }) => {\n // State\n const [status, setStatus] = useState(task.status);\n const [time, setTime] = useState(0);\n\n // Effects\n useLayoutEffect(() => {\n return task.subscribe('status', (event) => {\n setStatus(event.status);\n });\n }, [task]);\n\n useLayoutEffect(() => {\n return task.subscribe('completed', ({ duration }) => {\n setTime(duration);\n });\n }, [task]);\n\n // Render\n switch (status) {\n case 'blocked':\n case 'ready':\n return (\n <Text color=\"grey\">\n <Spinner type=\"line2\" />{' '}<TaskName task={task} />\n </Text>\n );\n\n case 'running':\n return (\n <Text>\n <Spinner />{' '}<TaskName task={task} />\n </Text>\n );\n\n case 'done':\n return (\n <Text>\n <Text color=\"green\">{ symbols.success }{' '}<TaskName task={task} /></Text>\n <Text color=\"magenta\">{' '}took { ms(time) }</Text>\n </Text>\n );\n\n case 'failed':\n return (\n <Text>\n <Text color=\"red\">{ symbols.error }{' '}<TaskName task={task} /></Text>\n <Text color=\"magenta\">{' '}took { ms(time) }</Text>\n </Text>\n );\n }\n};\n"]}
|
package/dist/ui/task-spinner.js
CHANGED
|
@@ -10,7 +10,7 @@ const _jsxRuntime = require("react/jsx-runtime");
|
|
|
10
10
|
const _ink = require("ink");
|
|
11
11
|
const _inkSpinner = /*#__PURE__*/ _interopRequireDefault(require("ink-spinner"));
|
|
12
12
|
const _logSymbols = /*#__PURE__*/ _interopRequireDefault(require("log-symbols"));
|
|
13
|
-
const
|
|
13
|
+
const _prettyMs = /*#__PURE__*/ _interopRequireDefault(require("pretty-ms"));
|
|
14
14
|
const _react = require("react");
|
|
15
15
|
const _taskName = require("./task-name");
|
|
16
16
|
function _interopRequireDefault(obj) {
|
|
@@ -81,7 +81,7 @@ const TaskSpinner = ({ task })=>{
|
|
|
81
81
|
children: [
|
|
82
82
|
' ',
|
|
83
83
|
"took ",
|
|
84
|
-
(0,
|
|
84
|
+
(0, _prettyMs.default)(time)
|
|
85
85
|
]
|
|
86
86
|
})
|
|
87
87
|
]
|
|
@@ -104,7 +104,7 @@ const TaskSpinner = ({ task })=>{
|
|
|
104
104
|
children: [
|
|
105
105
|
' ',
|
|
106
106
|
"took ",
|
|
107
|
-
(0,
|
|
107
|
+
(0, _prettyMs.default)(time)
|
|
108
108
|
]
|
|
109
109
|
})
|
|
110
110
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["ui/task-spinner.js"],"sourcesContent":["import { Task } from '@jujulego/tasks';\nimport { Text } from 'ink';\nimport Spinner from 'ink-spinner';\nimport symbols from 'log-symbols';\nimport ms from 'ms';\nimport { FC, useLayoutEffect, useState } from 'react';\n\nimport { TaskName } from './task-name';\n\n// Types\nexport interface TaskSpinnerProps {\n task: Task;\n}\n\n// Components\nexport const TaskSpinner: FC<TaskSpinnerProps> = ({ task }) => {\n // State\n const [status, setStatus] = useState(task.status);\n const [time, setTime] = useState(0);\n\n // Effects\n useLayoutEffect(() => {\n return task.subscribe('status', (event) => {\n setStatus(event.status);\n });\n }, [task]);\n\n useLayoutEffect(() => {\n return task.subscribe('completed', ({ duration }) => {\n setTime(duration);\n });\n }, [task]);\n\n // Render\n switch (status) {\n case 'blocked':\n case 'ready':\n return (\n <Text color=\"grey\">\n <Spinner type=\"line2\" />{' '}<TaskName task={task} />\n </Text>\n );\n\n case 'running':\n return (\n <Text>\n <Spinner />{' '}<TaskName task={task} />\n </Text>\n );\n\n case 'done':\n return (\n <Text>\n <Text color=\"green\">{ symbols.success }{' '}<TaskName task={task} /></Text>\n <Text color=\"magenta\">{' '}took { ms(time) }</Text>\n </Text>\n );\n\n case 'failed':\n return (\n <Text>\n <Text color=\"red\">{ symbols.error }{' '}<TaskName task={task} /></Text>\n <Text color=\"magenta\">{' '}took { ms(time) }</Text>\n </Text>\n );\n }\n};\n"],"names":["TaskSpinner","task","status","setStatus","useState","time","setTime","useLayoutEffect","subscribe","event","duration","Text","color","Spinner","type","TaskName","symbols","success","ms","error"],"mappings":"AAAA;;;;+BAeaA;;aAAAA;;;qBAdQ;iEACD;iEACA;
|
|
1
|
+
{"version":3,"sources":["ui/task-spinner.js"],"sourcesContent":["import { Task } from '@jujulego/tasks';\nimport { Text } from 'ink';\nimport Spinner from 'ink-spinner';\nimport symbols from 'log-symbols';\nimport ms from 'pretty-ms';\nimport { FC, useLayoutEffect, useState } from 'react';\n\nimport { TaskName } from './task-name';\n\n// Types\nexport interface TaskSpinnerProps {\n task: Task;\n}\n\n// Components\nexport const TaskSpinner: FC<TaskSpinnerProps> = ({ task }) => {\n // State\n const [status, setStatus] = useState(task.status);\n const [time, setTime] = useState(0);\n\n // Effects\n useLayoutEffect(() => {\n return task.subscribe('status', (event) => {\n setStatus(event.status);\n });\n }, [task]);\n\n useLayoutEffect(() => {\n return task.subscribe('completed', ({ duration }) => {\n setTime(duration);\n });\n }, [task]);\n\n // Render\n switch (status) {\n case 'blocked':\n case 'ready':\n return (\n <Text color=\"grey\">\n <Spinner type=\"line2\" />{' '}<TaskName task={task} />\n </Text>\n );\n\n case 'running':\n return (\n <Text>\n <Spinner />{' '}<TaskName task={task} />\n </Text>\n );\n\n case 'done':\n return (\n <Text>\n <Text color=\"green\">{ symbols.success }{' '}<TaskName task={task} /></Text>\n <Text color=\"magenta\">{' '}took { ms(time) }</Text>\n </Text>\n );\n\n case 'failed':\n return (\n <Text>\n <Text color=\"red\">{ symbols.error }{' '}<TaskName task={task} /></Text>\n <Text color=\"magenta\">{' '}took { ms(time) }</Text>\n </Text>\n );\n }\n};\n"],"names":["TaskSpinner","task","status","setStatus","useState","time","setTime","useLayoutEffect","subscribe","event","duration","Text","color","Spinner","type","TaskName","symbols","success","ms","error"],"mappings":"AAAA;;;;+BAeaA;;aAAAA;;;qBAdQ;iEACD;iEACA;+DACL;uBAC+B;0BAErB;;;;;;AAQlB,MAAMA,cAAoC,CAAC,EAAEC,KAAI,EAAE,GAAK;IAC7D,QAAQ;IACR,MAAM,CAACC,QAAQC,UAAU,GAAGC,IAAAA,eAAQ,EAACH,KAAKC,MAAM;IAChD,MAAM,CAACG,MAAMC,QAAQ,GAAGF,IAAAA,eAAQ,EAAC;IAEjC,UAAU;IACVG,IAAAA,sBAAe,EAAC,IAAM;QACpB,OAAON,KAAKO,SAAS,CAAC,UAAU,CAACC,QAAU;YACzCN,UAAUM,MAAMP,MAAM;QACxB;IACF,GAAG;QAACD;KAAK;IAETM,IAAAA,sBAAe,EAAC,IAAM;QACpB,OAAON,KAAKO,SAAS,CAAC,aAAa,CAAC,EAAEE,SAAQ,EAAE,GAAK;YACnDJ,QAAQI;QACV;IACF,GAAG;QAACT;KAAK;IAET,SAAS;IACT,OAAQC;QACN,KAAK;QACL,KAAK;YACH,qBACE,sBAACS,SAAI;gBAACC,OAAM;;kCACV,qBAACC,mBAAO;wBAACC,MAAK;;oBAAW;kCAAI,qBAACC,kBAAQ;wBAACd,MAAMA;;;;QAInD,KAAK;YACH,qBACE,sBAACU,SAAI;;kCACH,qBAACE,mBAAO;oBAAI;kCAAI,qBAACE,kBAAQ;wBAACd,MAAMA;;;;QAItC,KAAK;YACH,qBACE,sBAACU,SAAI;;kCACH,sBAACA,SAAI;wBAACC,OAAM;;4BAAUI,mBAAO,CAACC,OAAO;4BAAG;0CAAI,qBAACF,kBAAQ;gCAACd,MAAMA;;;;kCAC5D,sBAACU,SAAI;wBAACC,OAAM;;4BAAW;4BAAI;4BAAOM,IAAAA,iBAAE,EAACb;;;;;QAI3C,KAAK;YACH,qBACE,sBAACM,SAAI;;kCACH,sBAACA,SAAI;wBAACC,OAAM;;4BAAQI,mBAAO,CAACG,KAAK;4BAAG;0CAAI,qBAACJ,kBAAQ;gCAACd,MAAMA;;;;kCACxD,sBAACU,SAAI;wBAACC,OAAM;;4BAAW;4BAAI;4BAAOM,IAAAA,iBAAE,EAACb;;;;;IAG7C;AACF","file":"task-spinner.js"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jujulego/jill",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.1.0-alpha.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -27,9 +27,10 @@
|
|
|
27
27
|
"engines": {
|
|
28
28
|
"node": "^16"
|
|
29
29
|
},
|
|
30
|
+
"packageManager": "yarn@3.2.4",
|
|
30
31
|
"dependencies": {
|
|
31
|
-
"@jujulego/event-tree": "^1.1.0
|
|
32
|
-
"@jujulego/tasks": "^1.
|
|
32
|
+
"@jujulego/event-tree": "^1.1.0",
|
|
33
|
+
"@jujulego/tasks": "^1.1.2",
|
|
33
34
|
"async-lock": "^1.3.1",
|
|
34
35
|
"chalk": "^4.1.2",
|
|
35
36
|
"ink": "^3.2.0",
|
|
@@ -37,8 +38,8 @@
|
|
|
37
38
|
"inversify": "^6.0.1",
|
|
38
39
|
"inversify-inject-decorators": "^3.1.0",
|
|
39
40
|
"log-symbols": "^4.1.0",
|
|
40
|
-
"
|
|
41
|
-
"
|
|
41
|
+
"normalize-package-data": "^5.0.0",
|
|
42
|
+
"pretty-ms": "^7.0.1",
|
|
42
43
|
"react": "^17.0.2",
|
|
43
44
|
"reflect-metadata": "^0.1.13",
|
|
44
45
|
"semver": "^7.3.5",
|
|
@@ -50,23 +51,23 @@
|
|
|
50
51
|
},
|
|
51
52
|
"devDependencies": {
|
|
52
53
|
"@jujulego/flow": "1.1.0",
|
|
53
|
-
"@swc/core": "1.3.
|
|
54
|
+
"@swc/core": "1.3.11",
|
|
54
55
|
"@swc/jest": "0.2.23",
|
|
55
|
-
"@types/async-lock": "1.
|
|
56
|
+
"@types/async-lock": "1.3.0",
|
|
56
57
|
"@types/gulp": "4.0.9",
|
|
57
58
|
"@types/gulp-sourcemaps": "0.0.35",
|
|
58
|
-
"@types/jest": "
|
|
59
|
+
"@types/jest": "29.2.0",
|
|
59
60
|
"@types/ms": "0.7.31",
|
|
60
|
-
"@types/node": "16.
|
|
61
|
+
"@types/node": "16.18.3",
|
|
61
62
|
"@types/normalize-package-data": "2.4.1",
|
|
62
|
-
"@types/react": "17.0.
|
|
63
|
-
"@types/semver": "7.3.
|
|
63
|
+
"@types/react": "17.0.52",
|
|
64
|
+
"@types/semver": "7.3.13",
|
|
64
65
|
"@types/yargs": "17.0.13",
|
|
65
|
-
"@typescript-eslint/eslint-plugin": "5.
|
|
66
|
-
"@typescript-eslint/parser": "5.
|
|
66
|
+
"@typescript-eslint/eslint-plugin": "5.41.0",
|
|
67
|
+
"@typescript-eslint/parser": "5.41.0",
|
|
67
68
|
"del": "6.1.1",
|
|
68
|
-
"eslint": "8.
|
|
69
|
-
"eslint-plugin-jest": "27.
|
|
69
|
+
"eslint": "8.26.0",
|
|
70
|
+
"eslint-plugin-jest": "27.1.3",
|
|
70
71
|
"eslint-plugin-react": "7.31.10",
|
|
71
72
|
"eslint-plugin-react-hooks": "4.6.0",
|
|
72
73
|
"eslint-plugin-workspaces": "0.7.0",
|
|
@@ -76,7 +77,7 @@
|
|
|
76
77
|
"gulp-swc": "1.2.3",
|
|
77
78
|
"gulp-typescript": "6.0.0-alpha.1",
|
|
78
79
|
"ink-testing-library": "2.1.0",
|
|
79
|
-
"jest": "
|
|
80
|
+
"jest": "29.2.2",
|
|
80
81
|
"ts-node": "10.9.1",
|
|
81
82
|
"typescript": "4.8.4",
|
|
82
83
|
"winston-transport": "4.5.0"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["ui/tasks-spinner.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,EAAE,EAA6B,MAAM,OAAO,CAAC;AAKtD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,WAAW,CAAC;CACtB;AAGD,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC,iBAAiB,CAyB9C,CAAC","file":"tasks-spinner.d.ts","sourcesContent":["import { TaskManager } from '@jujulego/tasks';\nimport { FC, useLayoutEffect, useState } from 'react';\n\nimport { TaskSpinner } from './task-spinner';\n\n// Types\nexport interface TasksSpinnerProps {\n manager: TaskManager;\n}\n\n// Components\nexport const TasksSpinner: FC<TasksSpinnerProps> = ({ manager }) => {\n const [tasks, setTasks] = useState([...manager.tasks]);\n\n useLayoutEffect(() => {\n let dirty = false;\n\n return manager.subscribe('added', () => {\n if (!dirty) {\n dirty = true;\n\n queueMicrotask(() => {\n setTasks([...manager.tasks]);\n dirty = false;\n });\n }\n });\n }, [manager]);\n\n return (\n <>\n { tasks.map((task) => (\n <TaskSpinner key={task.id} task={task}/>\n )) }\n </>\n );\n};\n"]}
|
package/dist/ui/tasks-spinner.js
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "TasksSpinner", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: ()=>TasksSpinner
|
|
8
|
-
});
|
|
9
|
-
const _jsxRuntime = require("react/jsx-runtime");
|
|
10
|
-
const _react = require("react");
|
|
11
|
-
const _taskSpinner = require("./task-spinner");
|
|
12
|
-
const TasksSpinner = ({ manager })=>{
|
|
13
|
-
const [tasks, setTasks] = (0, _react.useState)([
|
|
14
|
-
...manager.tasks
|
|
15
|
-
]);
|
|
16
|
-
(0, _react.useLayoutEffect)(()=>{
|
|
17
|
-
let dirty = false;
|
|
18
|
-
return manager.subscribe('added', ()=>{
|
|
19
|
-
if (!dirty) {
|
|
20
|
-
dirty = true;
|
|
21
|
-
queueMicrotask(()=>{
|
|
22
|
-
setTasks([
|
|
23
|
-
...manager.tasks
|
|
24
|
-
]);
|
|
25
|
-
dirty = false;
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
});
|
|
29
|
-
}, [
|
|
30
|
-
manager
|
|
31
|
-
]);
|
|
32
|
-
return /*#__PURE__*/ (0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
|
|
33
|
-
children: tasks.map((task)=>/*#__PURE__*/ (0, _jsxRuntime.jsx)(_taskSpinner.TaskSpinner, {
|
|
34
|
-
task: task
|
|
35
|
-
}, task.id))
|
|
36
|
-
});
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
//# sourceMappingURL=tasks-spinner.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["ui/tasks-spinner.js"],"sourcesContent":["import { TaskManager } from '@jujulego/tasks';\nimport { FC, useLayoutEffect, useState } from 'react';\n\nimport { TaskSpinner } from './task-spinner';\n\n// Types\nexport interface TasksSpinnerProps {\n manager: TaskManager;\n}\n\n// Components\nexport const TasksSpinner: FC<TasksSpinnerProps> = ({ manager }) => {\n const [tasks, setTasks] = useState([...manager.tasks]);\n\n useLayoutEffect(() => {\n let dirty = false;\n\n return manager.subscribe('added', () => {\n if (!dirty) {\n dirty = true;\n\n queueMicrotask(() => {\n setTasks([...manager.tasks]);\n dirty = false;\n });\n }\n });\n }, [manager]);\n\n return (\n <>\n { tasks.map((task) => (\n <TaskSpinner key={task.id} task={task}/>\n )) }\n </>\n );\n};\n"],"names":["TasksSpinner","manager","tasks","setTasks","useState","useLayoutEffect","dirty","subscribe","queueMicrotask","map","task","TaskSpinner","id"],"mappings":"AAAA;;;;+BAWaA;;aAAAA;;;uBAViC;6BAElB;AAQrB,MAAMA,eAAsC,CAAC,EAAEC,QAAO,EAAE,GAAK;IAClE,MAAM,CAACC,OAAOC,SAAS,GAAGC,IAAAA,eAAQ,EAAC;WAAIH,QAAQC,KAAK;KAAC;IAErDG,IAAAA,sBAAe,EAAC,IAAM;QACpB,IAAIC,QAAQ,KAAK;QAEjB,OAAOL,QAAQM,SAAS,CAAC,SAAS,IAAM;YACtC,IAAI,CAACD,OAAO;gBACVA,QAAQ,IAAI;gBAEZE,eAAe,IAAM;oBACnBL,SAAS;2BAAIF,QAAQC,KAAK;qBAAC;oBAC3BI,QAAQ,KAAK;gBACf;YACF,CAAC;QACH;IACF,GAAG;QAACL;KAAQ;IAEZ,qBACE;kBACIC,MAAMO,GAAG,CAAC,CAACC,qBACX,qBAACC,wBAAW;gBAAeD,MAAMA;eAAfA,KAAKE,EAAE;;AAIjC","file":"tasks-spinner.js"}
|