@jujulego/jill 2.1.0-alpha.2 → 2.1.0-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/group.d.ts +1 -5
- package/dist/commands/group.d.ts.map +1 -1
- package/dist/commands/group.js +11 -34
- package/dist/commands/group.js.map +1 -1
- package/dist/middlewares/load-project.d.ts.map +1 -1
- package/dist/middlewares/load-project.js +0 -1
- package/dist/middlewares/load-project.js.map +1 -1
- package/dist/services/index.d.ts +1 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +1 -0
- package/dist/services/index.js.map +1 -1
- package/dist/services/task-expr.service.d.ts +19 -0
- package/dist/services/task-expr.service.d.ts.map +1 -0
- package/dist/services/task-expr.service.js +172 -0
- package/dist/services/task-expr.service.js.map +1 -0
- package/dist/ui/group-task-spinner.d.ts.map +1 -1
- package/dist/ui/group-task-spinner.js +1 -1
- package/dist/ui/group-task-spinner.js.map +1 -1
- package/package.json +3 -1
package/dist/commands/group.d.ts
CHANGED
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
import yargs from 'yargs';
|
|
2
2
|
import { WorkspaceDepsMode } from '../project';
|
|
3
3
|
declare const _default: yargs.CommandModule<unknown, {
|
|
4
|
-
|
|
4
|
+
script: import("../services").TaskNode | import("../services").GroupNode;
|
|
5
5
|
} & {
|
|
6
6
|
"deps-mode": WorkspaceDepsMode;
|
|
7
|
-
} & {
|
|
8
|
-
parallel: boolean | undefined;
|
|
9
|
-
} & {
|
|
10
|
-
sequence: boolean | undefined;
|
|
11
7
|
}>;
|
|
12
8
|
export default _default;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/group.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAa,iBAAiB,EAAE,MAAM,YAAY,CAAC
|
|
1
|
+
{"version":3,"sources":["../../src/commands/group.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAa,iBAAiB,EAAE,MAAM,YAAY,CAAC;;;;;;AAM1D,wBAmDG","file":"group.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, TaskExprService } from '../services';\nimport { Layout, TaskManagerSpinner } from '../ui';\nimport { applyMiddlewares, defineCommand } from '../utils';\n\n// Command\nexport default defineCommand({\n command: 'group <script..>',\n describe: 'Run many scripts inside a workspace',\n builder: (yargs) =>\n applyMiddlewares(yargs, [\n setupInk,\n loadProject,\n loadWorkspace\n ])\n .positional('script', {\n demandOption: true,\n coerce(expr: string[]) {\n const parser = container.get(TaskExprService);\n return parser.parse(expr.join(' ')).roots[0];\n }\n })\n .option('deps-mode', {\n choices: ['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 const parser = container.get(TaskExprService);\n\n // Run script in workspace\n const group = await parser.buildTask(args.script, workspace, {\n buildDeps: args.depsMode,\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"]}
|
package/dist/commands/group.js
CHANGED
|
@@ -22,59 +22,36 @@ function _interopRequireDefault(obj) {
|
|
|
22
22
|
};
|
|
23
23
|
}
|
|
24
24
|
const _default = (0, _utils.defineCommand)({
|
|
25
|
-
command: 'group <
|
|
25
|
+
command: 'group <script..>',
|
|
26
26
|
describe: 'Run many scripts inside a workspace',
|
|
27
27
|
builder: (yargs)=>(0, _utils.applyMiddlewares)(yargs, [
|
|
28
28
|
_middlewares.setupInk,
|
|
29
29
|
_middlewares.loadProject,
|
|
30
30
|
_middlewares.loadWorkspace
|
|
31
|
-
]).positional('
|
|
32
|
-
type: 'string',
|
|
31
|
+
]).positional('script', {
|
|
33
32
|
demandOption: true,
|
|
34
|
-
|
|
33
|
+
coerce (expr) {
|
|
34
|
+
const parser = _services.container.get(_services.TaskExprService);
|
|
35
|
+
return parser.parse(expr.join(' ')).roots[0];
|
|
36
|
+
}
|
|
35
37
|
}).option('deps-mode', {
|
|
36
|
-
|
|
38
|
+
choices: [
|
|
37
39
|
'all',
|
|
38
40
|
'prod',
|
|
39
41
|
'none'
|
|
40
42
|
],
|
|
41
43
|
default: 'all',
|
|
42
44
|
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
45
|
}),
|
|
55
46
|
async handler (args) {
|
|
56
47
|
const app = _services.container.get(_services.INK_APP);
|
|
57
48
|
const workspace = _services.container.getNamed(_project.Workspace, _services.CURRENT);
|
|
58
49
|
const manager = _services.container.get(_tasks.TaskManager);
|
|
50
|
+
const parser = _services.container.get(_services.TaskExprService);
|
|
59
51
|
// Run script in workspace
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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
|
-
}
|
|
52
|
+
const group = await parser.buildTask(args.script, workspace, {
|
|
53
|
+
buildDeps: args.depsMode
|
|
54
|
+
});
|
|
78
55
|
manager.add(group);
|
|
79
56
|
// Render
|
|
80
57
|
app.rerender(/*#__PURE__*/ (0, _jsxRuntime.jsx)(_ui.Layout, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["commands/group.js"],"sourcesContent":["import { waitForEvent } from '@jujulego/event-tree';\nimport {
|
|
1
|
+
{"version":3,"sources":["commands/group.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, TaskExprService } from '../services';\nimport { Layout, TaskManagerSpinner } from '../ui';\nimport { applyMiddlewares, defineCommand } from '../utils';\n\n// Command\nexport default defineCommand({\n command: 'group <script..>',\n describe: 'Run many scripts inside a workspace',\n builder: (yargs) =>\n applyMiddlewares(yargs, [\n setupInk,\n loadProject,\n loadWorkspace\n ])\n .positional('script', {\n demandOption: true,\n coerce(expr: string[]) {\n const parser = container.get(TaskExprService);\n return parser.parse(expr.join(' ')).roots[0];\n }\n })\n .option('deps-mode', {\n choices: ['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 const parser = container.get(TaskExprService);\n\n // Run script in workspace\n const group = await parser.buildTask(args.script, workspace, {\n buildDeps: args.depsMode,\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","demandOption","coerce","expr","parser","container","get","TaskExprService","parse","join","roots","option","choices","default","desc","handler","args","app","INK_APP","workspace","getNamed","Workspace","CURRENT","manager","TaskManager","group","buildTask","script","buildDeps","depsMode","add","rerender","Layout","TaskManagerSpinner","result","waitForEvent","status","exit","Error"],"mappings":"AAAA;;;;+BAWA,UAAU;AACV;;aAAA;;;2BAZ6B;uBACD;4DAEV;6BAEmC;yBACR;0BACgB;oBAClB;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;YACpBC,cAAc,IAAI;YAClBC,QAAOC,IAAc,EAAE;gBACrB,MAAMC,SAASC,mBAAS,CAACC,GAAG,CAACC,yBAAe;gBAC5C,OAAOH,OAAOI,KAAK,CAACL,KAAKM,IAAI,CAAC,MAAMC,KAAK,CAAC,EAAE;YAC9C;QACF,GACCC,MAAM,CAAC,aAAa;YACnBC,SAAS;gBAAC;gBAAO;gBAAQ;aAAO;YAChCC,SAAS;YACTC,MAAM,iCACJ,gDACA,6BACA;QACJ;IACJ,MAAMC,SAAQC,IAAI,EAAE;QAClB,MAAMC,MAAMZ,mBAAS,CAACC,GAAG,CAAeY,iBAAO;QAC/C,MAAMC,YAAYd,mBAAS,CAACe,QAAQ,CAACC,kBAAS,EAAEC,iBAAO;QACvD,MAAMC,UAAUlB,mBAAS,CAACC,GAAG,CAACkB,kBAAW;QACzC,MAAMpB,SAASC,mBAAS,CAACC,GAAG,CAACC,yBAAe;QAE5C,0BAA0B;QAC1B,MAAMkB,QAAQ,MAAMrB,OAAOsB,SAAS,CAACV,KAAKW,MAAM,EAAER,WAAW;YAC3DS,WAAWZ,KAAKa,QAAQ;QAC1B;QAEAN,QAAQO,GAAG,CAACL;QAEZ,SAAS;QACTR,IAAIc,QAAQ,eACV,qBAACC,UAAM;sBACL,cAAA,qBAACC,sBAAkB;gBAACV,SAASA;;;QAIjC,kBAAkB;QAClB,MAAMW,SAAS,MAAMC,IAAAA,uBAAY,EAACV,OAAO;QAEzC,IAAIS,OAAOE,MAAM,KAAK,UAAU;YAC9B,OAAOzC,cAAK,CAAC0C,IAAI,CAAC,GAAG,IAAIC,MAAM;QACjC,CAAC;IACH;AACF","file":"group.js"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/middlewares/load-project.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAW,MAAM,YAAY,CAAC;AAIrD,eAAO,MAAM,WAAW;;;;
|
|
1
|
+
{"version":3,"sources":["../../src/middlewares/load-project.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAW,MAAM,YAAY,CAAC;AAIrD,eAAO,MAAM,WAAW;;;;EA6BtB,CAAC","file":"load-project.d.ts","sourcesContent":["import { container, CURRENT, SpinnerService } from '../services';\nimport { PackageManager, Project } from '../project';\nimport { defineMiddleware } from '../utils';\n\n// Middleware\nexport const loadProject = defineMiddleware({\n builder: (yargs) => yargs\n .option('project', {\n alias: 'p',\n type: 'string',\n default: process.cwd(),\n description: 'Project root directory'\n })\n .option('package-manager', {\n choices: ['yarn', 'npm'],\n default: undefined as PackageManager | undefined,\n description: 'Force package manager'\n }),\n async handler(args) {\n const spinner = container.get(SpinnerService);\n\n try {\n spinner.spin('Loading project ...');\n const root = args.project = await Project.searchProjectRoot(args.project);\n\n container.bind(Project)\n .toDynamicValue(() => new Project(root, {\n packageManager: args['package-manager']\n }))\n .whenTargetNamed(CURRENT);\n } finally {\n spinner.stop();\n }\n }\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["middlewares/load-project.js"],"sourcesContent":["import { container, CURRENT, SpinnerService } from '../services';\nimport { PackageManager, Project } from '../project';\nimport { defineMiddleware } from '../utils';\n\n// Middleware\nexport const loadProject = defineMiddleware({\n builder: (yargs) => yargs\n .option('project', {\n alias: 'p',\n type: 'string',\n default: process.cwd(),\n description: 'Project root directory'\n })\n .option('package-manager', {\n choices: ['yarn', 'npm'],\n default: undefined as PackageManager | undefined,\n
|
|
1
|
+
{"version":3,"sources":["middlewares/load-project.js"],"sourcesContent":["import { container, CURRENT, SpinnerService } from '../services';\nimport { PackageManager, Project } from '../project';\nimport { defineMiddleware } from '../utils';\n\n// Middleware\nexport const loadProject = defineMiddleware({\n builder: (yargs) => yargs\n .option('project', {\n alias: 'p',\n type: 'string',\n default: process.cwd(),\n description: 'Project root directory'\n })\n .option('package-manager', {\n choices: ['yarn', 'npm'],\n default: undefined as PackageManager | undefined,\n description: 'Force package manager'\n }),\n async handler(args) {\n const spinner = container.get(SpinnerService);\n\n try {\n spinner.spin('Loading project ...');\n const root = args.project = await Project.searchProjectRoot(args.project);\n\n container.bind(Project)\n .toDynamicValue(() => new Project(root, {\n packageManager: args['package-manager']\n }))\n .whenTargetNamed(CURRENT);\n } finally {\n spinner.stop();\n }\n }\n});\n"],"names":["loadProject","defineMiddleware","builder","yargs","option","alias","type","default","process","cwd","description","choices","undefined","handler","args","spinner","container","get","SpinnerService","spin","root","project","Project","searchProjectRoot","bind","toDynamicValue","packageManager","whenTargetNamed","CURRENT","stop"],"mappings":"AAAA;;;;+BAKaA;;aAAAA;;0BALsC;yBACX;uBACP;AAG1B,MAAMA,cAAcC,IAAAA,uBAAgB,EAAC;IAC1CC,SAAS,CAACC,QAAUA,MACjBC,MAAM,CAAC,WAAW;YACjBC,OAAO;YACPC,MAAM;YACNC,SAASC,QAAQC,GAAG;YACpBC,aAAa;QACf,GACCN,MAAM,CAAC,mBAAmB;YACzBO,SAAS;gBAAC;gBAAQ;aAAM;YACxBJ,SAASK;YACTF,aAAa;QACf;IACF,MAAMG,SAAQC,IAAI,EAAE;QAClB,MAAMC,UAAUC,mBAAS,CAACC,GAAG,CAACC,wBAAc;QAE5C,IAAI;YACFH,QAAQI,IAAI,CAAC;YACb,MAAMC,OAAON,KAAKO,OAAO,GAAG,MAAMC,gBAAO,CAACC,iBAAiB,CAACT,KAAKO,OAAO;YAExEL,mBAAS,CAACQ,IAAI,CAACF,gBAAO,EACnBG,cAAc,CAAC,IAAM,IAAIH,gBAAO,CAACF,MAAM;oBACtCM,gBAAgBZ,IAAI,CAAC,kBAAkB;gBACzC,IACCa,eAAe,CAACC,iBAAO;QAC5B,SAAU;YACRb,QAAQc,IAAI;QACd;IACF;AACF","file":"load-project.js"}
|
package/dist/services/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC","file":"index.d.ts","sourcesContent":["export * from './inversify.config';\nexport * from './logger.service';\nexport * from './spinner.service';\nexport * from './task-manager.service';\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC","file":"index.d.ts","sourcesContent":["export * from './inversify.config';\nexport * from './logger.service';\nexport * from './task-expr.service';\nexport * from './spinner.service';\nexport * from './task-manager.service';\n"]}
|
package/dist/services/index.js
CHANGED
|
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
});
|
|
5
5
|
_exportStar(require("./inversify.config"), exports);
|
|
6
6
|
_exportStar(require("./logger.service"), exports);
|
|
7
|
+
_exportStar(require("./task-expr.service"), exports);
|
|
7
8
|
_exportStar(require("./spinner.service"), exports);
|
|
8
9
|
_exportStar(require("./task-manager.service"), exports);
|
|
9
10
|
function _exportStar(from, to) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["services/index.js"],"sourcesContent":["export * from './inversify.config';\nexport * from './logger.service';\nexport * from './spinner.service';\nexport * from './task-manager.service';\n"],"names":[],"mappings":"AAAA;;;;oBAAc;oBACA;oBACA;oBACA","file":"index.js"}
|
|
1
|
+
{"version":3,"sources":["services/index.js"],"sourcesContent":["export * from './inversify.config';\nexport * from './logger.service';\nexport * from './task-expr.service';\nexport * from './spinner.service';\nexport * from './task-manager.service';\n"],"names":[],"mappings":"AAAA;;;;oBAAc;oBACA;oBACA;oBACA;oBACA","file":"index.js"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Task } from '@jujulego/tasks';
|
|
2
|
+
import { Workspace, WorkspaceRunOptions } from '../project';
|
|
3
|
+
export interface TaskNode {
|
|
4
|
+
script: string;
|
|
5
|
+
}
|
|
6
|
+
export interface GroupNode {
|
|
7
|
+
operator: string;
|
|
8
|
+
tasks: (TaskNode | GroupNode)[];
|
|
9
|
+
}
|
|
10
|
+
export interface TaskTree {
|
|
11
|
+
roots: (TaskNode | GroupNode)[];
|
|
12
|
+
}
|
|
13
|
+
export declare class TaskExprService {
|
|
14
|
+
static isTaskNode(node: TaskNode | GroupNode): node is TaskNode;
|
|
15
|
+
private _lexer;
|
|
16
|
+
private _nextNode;
|
|
17
|
+
parse(expr: string): TaskTree;
|
|
18
|
+
buildTask(node: TaskNode | GroupNode, workspace: Workspace, opts?: WorkspaceRunOptions): Promise<Task>;
|
|
19
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/services/task-expr.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2C,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAMhF,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAG5D,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,CAAC,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,CAAC,QAAQ,GAAG,SAAS,CAAC,EAAE,CAAC;CACjC;AAGD,qBACa,eAAe;IAE1B,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,IAAI,IAAI,QAAQ;IAK/D,OAAO,CAAC,MAAM;IA8Bd,OAAO,CAAC,SAAS;IA8DjB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ;IAqBvB,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,GAAE,mBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;CAuBjH","file":"task-expr.service.d.ts","sourcesContent":["import { GroupTask, ParallelGroup, SequenceGroup, Task } from '@jujulego/tasks';\nimport { injectable } from 'inversify';\nimport moo from 'moo';\n\nimport { container } from './inversify.config';\nimport { Logger } from './logger.service';\nimport { Workspace, WorkspaceRunOptions } from '../project';\n\n// Interfaces\nexport interface TaskNode {\n script: string;\n}\n\nexport interface GroupNode {\n operator: string;\n tasks: (TaskNode | GroupNode)[];\n}\n\nexport interface TaskTree {\n roots: (TaskNode | GroupNode)[];\n}\n\n// Service\n@injectable()\nexport class TaskExprService {\n // Statics\n static isTaskNode(node: TaskNode | GroupNode): node is TaskNode {\n return 'script' in node;\n }\n\n // Methods\n private _lexer(): moo.Lexer {\n return moo.states({\n task: {\n lparen: '(',\n whitespace: /[ \\t]+/,\n string: [\n // inline\n { match: /[:a-zA-Z0-9]+/, push: 'operator' },\n // single cotted\n {\n match: /'(?:\\\\['\\\\]|[^\\n'\\\\])+'/,\n push: 'operator',\n value: x => x.slice(1, -1).replace(/\\\\(['\\\\])/g, '$1')\n },\n // double cotted\n {\n match: /\"(?:\\\\[\"\\\\]|[^\\n\"\\\\])+\"/,\n push: 'operator',\n value: x => x.slice(1, -1).replace(/\\\\([\"\\\\])/g, '$1')\n }\n ],\n },\n operator: {\n whitespace: /[ \\t]+/,\n rparen: ')',\n operator: { match: ['->', '//'], pop: 1 },\n }\n });\n }\n\n private _nextNode(lexer: moo.Lexer, i = 0): TaskNode | GroupNode | null {\n let node: TaskNode | GroupNode | null = null;\n\n for (const token of lexer) {\n // Ignore whitespaces\n if (token.type === 'whitespace') {\n continue;\n }\n\n // rparen = end of group\n if (token.type === 'rparen') {\n break;\n }\n\n // Handle operator\n if (token.type === 'operator') {\n const operator = token.value;\n\n if (!node) {\n throw new Error(lexer.formatError(token, 'Unexpected operator'));\n } else if (TaskExprService.isTaskNode(node)) {\n node = { operator, tasks: [node] };\n\n continue;\n } else {\n if (node.operator !== operator) {\n node = { operator, tasks: [node] };\n }\n\n continue;\n }\n }\n\n // Build \"child\"\n let child: TaskNode | GroupNode;\n\n if (token.type === 'string') {\n child = { script: token.value };\n } else if (token.type === 'lparen') {\n const res = this._nextNode(lexer, i+1);\n\n if (!res) {\n throw new Error(lexer.formatError(token, 'Empty group found'));\n }\n\n child = res;\n } else {\n throw new Error(lexer.formatError(token, 'Unexpected token'));\n }\n\n if (!node) {\n node = child;\n } else if (TaskExprService.isTaskNode(node)) {\n throw new Error(lexer.formatError(token, 'Unexpected token, expected an operator'));\n } else {\n node.tasks.push(child);\n }\n }\n\n return node;\n }\n\n parse(expr: string): TaskTree {\n const lexer = this._lexer().reset(expr);\n\n const tree: TaskTree = {\n roots: [],\n };\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const node = this._nextNode(lexer);\n\n if (node) {\n tree.roots.push(node);\n } else {\n break;\n }\n }\n\n return tree;\n }\n\n async buildTask(node: TaskNode | GroupNode, workspace: Workspace, opts: WorkspaceRunOptions = {}): Promise<Task> {\n if (TaskExprService.isTaskNode(node)) {\n return workspace.run(node.script, [], opts);\n } else {\n let group: GroupTask;\n\n if (node.operator === '//') {\n group = new ParallelGroup('In parallel', {}, {\n logger: container.get(Logger),\n });\n } else {\n group = new SequenceGroup('In sequence', {}, {\n logger: container.get(Logger),\n });\n }\n\n for (const child of node.tasks) {\n group.add(await this.buildTask(child, workspace, opts));\n }\n\n return group;\n }\n }\n}\n\ncontainer.bind(TaskExprService)\n .toSelf();\n"]}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "TaskExprService", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: ()=>TaskExprService
|
|
8
|
+
});
|
|
9
|
+
const _tasks = require("@jujulego/tasks");
|
|
10
|
+
const _inversify = require("inversify");
|
|
11
|
+
const _moo = /*#__PURE__*/ _interopRequireDefault(require("moo"));
|
|
12
|
+
const _inversifyConfig = require("./inversify.config");
|
|
13
|
+
const _loggerService = require("./logger.service");
|
|
14
|
+
function _interopRequireDefault(obj) {
|
|
15
|
+
return obj && obj.__esModule ? obj : {
|
|
16
|
+
default: obj
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
var __decorate = (void 0) && (void 0).__decorate || function(decorators, target, key, desc) {
|
|
20
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
21
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
22
|
+
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
23
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
24
|
+
};
|
|
25
|
+
let TaskExprService = class TaskExprService1 {
|
|
26
|
+
// Statics
|
|
27
|
+
static isTaskNode(node) {
|
|
28
|
+
return 'script' in node;
|
|
29
|
+
}
|
|
30
|
+
// Methods
|
|
31
|
+
_lexer() {
|
|
32
|
+
return _moo.default.states({
|
|
33
|
+
task: {
|
|
34
|
+
lparen: '(',
|
|
35
|
+
whitespace: /[ \t]+/,
|
|
36
|
+
string: [
|
|
37
|
+
// inline
|
|
38
|
+
{
|
|
39
|
+
match: /[:a-zA-Z0-9]+/,
|
|
40
|
+
push: 'operator'
|
|
41
|
+
},
|
|
42
|
+
// single cotted
|
|
43
|
+
{
|
|
44
|
+
match: /'(?:\\['\\]|[^\n'\\])+'/,
|
|
45
|
+
push: 'operator',
|
|
46
|
+
value: (x)=>x.slice(1, -1).replace(/\\(['\\])/g, '$1')
|
|
47
|
+
},
|
|
48
|
+
// double cotted
|
|
49
|
+
{
|
|
50
|
+
match: /"(?:\\["\\]|[^\n"\\])+"/,
|
|
51
|
+
push: 'operator',
|
|
52
|
+
value: (x)=>x.slice(1, -1).replace(/\\(["\\])/g, '$1')
|
|
53
|
+
}
|
|
54
|
+
]
|
|
55
|
+
},
|
|
56
|
+
operator: {
|
|
57
|
+
whitespace: /[ \t]+/,
|
|
58
|
+
rparen: ')',
|
|
59
|
+
operator: {
|
|
60
|
+
match: [
|
|
61
|
+
'->',
|
|
62
|
+
'//'
|
|
63
|
+
],
|
|
64
|
+
pop: 1
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
_nextNode(lexer, i = 0) {
|
|
70
|
+
let node = null;
|
|
71
|
+
for (const token of lexer){
|
|
72
|
+
// Ignore whitespaces
|
|
73
|
+
if (token.type === 'whitespace') {
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
// rparen = end of group
|
|
77
|
+
if (token.type === 'rparen') {
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
// Handle operator
|
|
81
|
+
if (token.type === 'operator') {
|
|
82
|
+
const operator = token.value;
|
|
83
|
+
if (!node) {
|
|
84
|
+
throw new Error(lexer.formatError(token, 'Unexpected operator'));
|
|
85
|
+
} else if (TaskExprService.isTaskNode(node)) {
|
|
86
|
+
node = {
|
|
87
|
+
operator,
|
|
88
|
+
tasks: [
|
|
89
|
+
node
|
|
90
|
+
]
|
|
91
|
+
};
|
|
92
|
+
continue;
|
|
93
|
+
} else {
|
|
94
|
+
if (node.operator !== operator) {
|
|
95
|
+
node = {
|
|
96
|
+
operator,
|
|
97
|
+
tasks: [
|
|
98
|
+
node
|
|
99
|
+
]
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Build "child"
|
|
106
|
+
let child;
|
|
107
|
+
if (token.type === 'string') {
|
|
108
|
+
child = {
|
|
109
|
+
script: token.value
|
|
110
|
+
};
|
|
111
|
+
} else if (token.type === 'lparen') {
|
|
112
|
+
const res = this._nextNode(lexer, i + 1);
|
|
113
|
+
if (!res) {
|
|
114
|
+
throw new Error(lexer.formatError(token, 'Empty group found'));
|
|
115
|
+
}
|
|
116
|
+
child = res;
|
|
117
|
+
} else {
|
|
118
|
+
throw new Error(lexer.formatError(token, 'Unexpected token'));
|
|
119
|
+
}
|
|
120
|
+
if (!node) {
|
|
121
|
+
node = child;
|
|
122
|
+
} else if (TaskExprService.isTaskNode(node)) {
|
|
123
|
+
throw new Error(lexer.formatError(token, 'Unexpected token, expected an operator'));
|
|
124
|
+
} else {
|
|
125
|
+
node.tasks.push(child);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return node;
|
|
129
|
+
}
|
|
130
|
+
parse(expr) {
|
|
131
|
+
const lexer = this._lexer().reset(expr);
|
|
132
|
+
const tree = {
|
|
133
|
+
roots: []
|
|
134
|
+
};
|
|
135
|
+
// eslint-disable-next-line no-constant-condition
|
|
136
|
+
while(true){
|
|
137
|
+
const node = this._nextNode(lexer);
|
|
138
|
+
if (node) {
|
|
139
|
+
tree.roots.push(node);
|
|
140
|
+
} else {
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return tree;
|
|
145
|
+
}
|
|
146
|
+
async buildTask(node, workspace, opts = {}) {
|
|
147
|
+
if (TaskExprService.isTaskNode(node)) {
|
|
148
|
+
return workspace.run(node.script, [], opts);
|
|
149
|
+
} else {
|
|
150
|
+
let group;
|
|
151
|
+
if (node.operator === '//') {
|
|
152
|
+
group = new _tasks.ParallelGroup('In parallel', {}, {
|
|
153
|
+
logger: _inversifyConfig.container.get(_loggerService.Logger)
|
|
154
|
+
});
|
|
155
|
+
} else {
|
|
156
|
+
group = new _tasks.SequenceGroup('In sequence', {}, {
|
|
157
|
+
logger: _inversifyConfig.container.get(_loggerService.Logger)
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
for (const child of node.tasks){
|
|
161
|
+
group.add(await this.buildTask(child, workspace, opts));
|
|
162
|
+
}
|
|
163
|
+
return group;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
};
|
|
167
|
+
TaskExprService = __decorate([
|
|
168
|
+
(0, _inversify.injectable)()
|
|
169
|
+
], TaskExprService);
|
|
170
|
+
_inversifyConfig.container.bind(TaskExprService).toSelf();
|
|
171
|
+
|
|
172
|
+
//# sourceMappingURL=task-expr.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["services/task-expr.service.js"],"sourcesContent":["import { GroupTask, ParallelGroup, SequenceGroup, Task } from '@jujulego/tasks';\nimport { injectable } from 'inversify';\nimport moo from 'moo';\n\nimport { container } from './inversify.config';\nimport { Logger } from './logger.service';\nimport { Workspace, WorkspaceRunOptions } from '../project';\n\n// Interfaces\nexport interface TaskNode {\n script: string;\n}\n\nexport interface GroupNode {\n operator: string;\n tasks: (TaskNode | GroupNode)[];\n}\n\nexport interface TaskTree {\n roots: (TaskNode | GroupNode)[];\n}\n\n// Service\n@injectable()\nexport class TaskExprService {\n // Statics\n static isTaskNode(node: TaskNode | GroupNode): node is TaskNode {\n return 'script' in node;\n }\n\n // Methods\n private _lexer(): moo.Lexer {\n return moo.states({\n task: {\n lparen: '(',\n whitespace: /[ \\t]+/,\n string: [\n // inline\n { match: /[:a-zA-Z0-9]+/, push: 'operator' },\n // single cotted\n {\n match: /'(?:\\\\['\\\\]|[^\\n'\\\\])+'/,\n push: 'operator',\n value: x => x.slice(1, -1).replace(/\\\\(['\\\\])/g, '$1')\n },\n // double cotted\n {\n match: /\"(?:\\\\[\"\\\\]|[^\\n\"\\\\])+\"/,\n push: 'operator',\n value: x => x.slice(1, -1).replace(/\\\\([\"\\\\])/g, '$1')\n }\n ],\n },\n operator: {\n whitespace: /[ \\t]+/,\n rparen: ')',\n operator: { match: ['->', '//'], pop: 1 },\n }\n });\n }\n\n private _nextNode(lexer: moo.Lexer, i = 0): TaskNode | GroupNode | null {\n let node: TaskNode | GroupNode | null = null;\n\n for (const token of lexer) {\n // Ignore whitespaces\n if (token.type === 'whitespace') {\n continue;\n }\n\n // rparen = end of group\n if (token.type === 'rparen') {\n break;\n }\n\n // Handle operator\n if (token.type === 'operator') {\n const operator = token.value;\n\n if (!node) {\n throw new Error(lexer.formatError(token, 'Unexpected operator'));\n } else if (TaskExprService.isTaskNode(node)) {\n node = { operator, tasks: [node] };\n\n continue;\n } else {\n if (node.operator !== operator) {\n node = { operator, tasks: [node] };\n }\n\n continue;\n }\n }\n\n // Build \"child\"\n let child: TaskNode | GroupNode;\n\n if (token.type === 'string') {\n child = { script: token.value };\n } else if (token.type === 'lparen') {\n const res = this._nextNode(lexer, i+1);\n\n if (!res) {\n throw new Error(lexer.formatError(token, 'Empty group found'));\n }\n\n child = res;\n } else {\n throw new Error(lexer.formatError(token, 'Unexpected token'));\n }\n\n if (!node) {\n node = child;\n } else if (TaskExprService.isTaskNode(node)) {\n throw new Error(lexer.formatError(token, 'Unexpected token, expected an operator'));\n } else {\n node.tasks.push(child);\n }\n }\n\n return node;\n }\n\n parse(expr: string): TaskTree {\n const lexer = this._lexer().reset(expr);\n\n const tree: TaskTree = {\n roots: [],\n };\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const node = this._nextNode(lexer);\n\n if (node) {\n tree.roots.push(node);\n } else {\n break;\n }\n }\n\n return tree;\n }\n\n async buildTask(node: TaskNode | GroupNode, workspace: Workspace, opts: WorkspaceRunOptions = {}): Promise<Task> {\n if (TaskExprService.isTaskNode(node)) {\n return workspace.run(node.script, [], opts);\n } else {\n let group: GroupTask;\n\n if (node.operator === '//') {\n group = new ParallelGroup('In parallel', {}, {\n logger: container.get(Logger),\n });\n } else {\n group = new SequenceGroup('In sequence', {}, {\n logger: container.get(Logger),\n });\n }\n\n for (const child of node.tasks) {\n group.add(await this.buildTask(child, workspace, opts));\n }\n\n return group;\n }\n }\n}\n\ncontainer.bind(TaskExprService)\n .toSelf();\n"],"names":["TaskExprService","isTaskNode","node","_lexer","moo","states","task","lparen","whitespace","string","match","push","value","x","slice","replace","operator","rparen","pop","_nextNode","lexer","i","token","type","Error","formatError","tasks","child","script","res","parse","expr","reset","tree","roots","buildTask","workspace","opts","run","group","ParallelGroup","logger","container","get","Logger","SequenceGroup","add","injectable","bind","toSelf"],"mappings":"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","file":"task-expr.service.js"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/ui/group-task-spinner.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,EAAE,
|
|
1
|
+
{"version":3,"sources":["../../src/ui/group-task-spinner.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,EAAE,EAAuC,MAAM,OAAO,CAAC;AAKhE,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, Fragment, 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 <Fragment key={task.id}>\n { (task instanceof GroupTask) ? (\n <GroupTaskSpinner group={task} />\n ) : (\n <TaskSpinner task={task} />\n ) }\n </Fragment>\n )) }\n </Box>\n </>\n );\n};\n"]}
|
|
@@ -39,7 +39,7 @@ const GroupTaskSpinner = ({ group })=>{
|
|
|
39
39
|
/*#__PURE__*/ (0, _jsxRuntime.jsx)(_ink.Box, {
|
|
40
40
|
flexDirection: "column",
|
|
41
41
|
marginLeft: 2,
|
|
42
|
-
children: tasks.map((task)=>/*#__PURE__*/ (0, _jsxRuntime.jsx)(
|
|
42
|
+
children: tasks.map((task)=>/*#__PURE__*/ (0, _jsxRuntime.jsx)(_react.Fragment, {
|
|
43
43
|
children: task instanceof _tasks.GroupTask ? /*#__PURE__*/ (0, _jsxRuntime.jsx)(GroupTaskSpinner, {
|
|
44
44
|
group: task
|
|
45
45
|
}) : /*#__PURE__*/ (0, _jsxRuntime.jsx)(_taskSpinner.TaskSpinner, {
|
|
@@ -1 +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 <
|
|
1
|
+
{"version":3,"sources":["ui/group-task-spinner.js"],"sourcesContent":["import { GroupTask } from '@jujulego/tasks';\nimport { Box } from 'ink';\nimport { FC, Fragment, 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 <Fragment key={task.id}>\n { (task instanceof GroupTask) ? (\n <GroupTaskSpinner group={task} />\n ) : (\n <TaskSpinner task={task} />\n ) }\n </Fragment>\n )) }\n </Box>\n </>\n );\n};\n"],"names":["GroupTaskSpinner","group","tasks","setTasks","useState","useLayoutEffect","dirty","subscribe","queueMicrotask","TaskSpinner","task","Box","flexDirection","marginLeft","map","Fragment","GroupTask","id"],"mappings":"AAAA;;;;+BAYaA;;aAAAA;;;uBAZa;qBACN;uBACoC;6BAE5B;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,qBAACK,eAAQ;kCACL,AAACL,gBAAgBM,gBAAS,iBAC1B,qBAAChB;4BAAiBC,OAAOS;2CAEzB,qBAACD,wBAAW;4BAACC,MAAMA;0BACpB;uBALYA,KAAKO,EAAE;;;;AAWhC","file":"group-task-spinner.js"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jujulego/jill",
|
|
3
|
-
"version": "2.1.0-alpha.
|
|
3
|
+
"version": "2.1.0-alpha.3",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -33,6 +33,7 @@
|
|
|
33
33
|
"inversify": "^6.0.1",
|
|
34
34
|
"inversify-inject-decorators": "^3.1.0",
|
|
35
35
|
"log-symbols": "^4.1.0",
|
|
36
|
+
"moo": "^0.5.2",
|
|
36
37
|
"normalize-package-data": "^5.0.0",
|
|
37
38
|
"pretty-ms": "^7.0.1",
|
|
38
39
|
"react": "^17.0.2",
|
|
@@ -52,6 +53,7 @@
|
|
|
52
53
|
"@types/gulp": "4.0.9",
|
|
53
54
|
"@types/gulp-sourcemaps": "0.0.35",
|
|
54
55
|
"@types/jest": "29.2.2",
|
|
56
|
+
"@types/moo": "0.5.5",
|
|
55
57
|
"@types/ms": "0.7.31",
|
|
56
58
|
"@types/node": "16.18.3",
|
|
57
59
|
"@types/normalize-package-data": "2.4.1",
|