@jujulego/jill 2.0.0-alpha.2 → 2.0.0-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/dist/commands/list.d.ts.map +1 -1
  2. package/dist/commands/list.js +2 -1
  3. package/dist/commands/list.js.map +1 -1
  4. package/dist/commands/run.d.ts +8 -0
  5. package/dist/commands/run.d.ts.map +1 -0
  6. package/dist/commands/run.js +59 -0
  7. package/dist/commands/run.js.map +1 -0
  8. package/dist/commands/tree.d.ts +3 -0
  9. package/dist/commands/tree.d.ts.map +1 -0
  10. package/dist/commands/tree.js +35 -0
  11. package/dist/commands/tree.js.map +1 -0
  12. package/dist/middlewares/global-config.d.ts.map +1 -1
  13. package/dist/middlewares/global-config.js +4 -1
  14. package/dist/middlewares/global-config.js.map +1 -1
  15. package/dist/middlewares/index.d.ts +2 -1
  16. package/dist/middlewares/index.d.ts.map +1 -1
  17. package/dist/middlewares/index.js +2 -1
  18. package/dist/middlewares/index.js.map +1 -1
  19. package/dist/middlewares/load-project.d.ts.map +1 -1
  20. package/dist/middlewares/load-project.js +2 -2
  21. package/dist/middlewares/load-project.js.map +1 -1
  22. package/dist/middlewares/load-workspace.d.ts +3 -0
  23. package/dist/middlewares/load-workspace.d.ts.map +1 -0
  24. package/dist/middlewares/load-workspace.js +42 -0
  25. package/dist/middlewares/load-workspace.js.map +1 -0
  26. package/dist/project/workspace.d.ts.map +1 -1
  27. package/dist/project/workspace.js +2 -0
  28. package/dist/project/workspace.js.map +1 -1
  29. package/dist/services/inversify.config.d.ts +1 -1
  30. package/dist/services/inversify.config.d.ts.map +1 -1
  31. package/dist/services/inversify.config.js +2 -2
  32. package/dist/services/inversify.config.js.map +1 -1
  33. package/dist/services/spinner.service.d.ts +6 -2
  34. package/dist/services/spinner.service.d.ts.map +1 -1
  35. package/dist/services/spinner.service.js +22 -9
  36. package/dist/services/spinner.service.js.map +1 -1
  37. package/dist/ui/global-spinner.d.ts.map +1 -1
  38. package/dist/ui/global-spinner.js +31 -9
  39. package/dist/ui/global-spinner.js.map +1 -1
  40. package/dist/ui/index.d.ts +3 -1
  41. package/dist/ui/index.d.ts.map +1 -1
  42. package/dist/ui/index.js +3 -1
  43. package/dist/ui/index.js.map +1 -1
  44. package/dist/ui/static-logs.d.ts.map +1 -1
  45. package/dist/ui/static-logs.js +15 -8
  46. package/dist/ui/static-logs.js.map +1 -1
  47. package/dist/ui/task-spinner.d.ts +6 -0
  48. package/dist/ui/task-spinner.d.ts.map +1 -0
  49. package/dist/ui/task-spinner.js +163 -0
  50. package/dist/ui/task-spinner.js.map +1 -0
  51. package/dist/ui/tasks-spinner.d.ts +6 -0
  52. package/dist/ui/tasks-spinner.d.ts.map +1 -0
  53. package/dist/ui/tasks-spinner.js +17 -0
  54. package/dist/ui/tasks-spinner.js.map +1 -0
  55. package/dist/ui/workspace-tree.d.ts +8 -0
  56. package/dist/ui/workspace-tree.d.ts.map +1 -0
  57. package/dist/ui/workspace-tree.js +87 -0
  58. package/dist/ui/workspace-tree.js.map +1 -0
  59. package/dist/utils.d.ts +1 -0
  60. package/dist/utils.d.ts.map +1 -1
  61. package/dist/utils.js +6 -0
  62. package/dist/utils.js.map +1 -1
  63. package/package.json +3 -3
  64. package/dist/ui/cli-list.d.ts +0 -15
  65. package/dist/ui/cli-list.d.ts.map +0 -1
  66. package/dist/ui/cli-list.js +0 -66
  67. package/dist/ui/cli-list.js.map +0 -1
@@ -16,10 +16,15 @@ var __decorate = (void 0) && (void 0).__decorate || function(decorators, target,
16
16
  };
17
17
  let SpinnerService = class SpinnerService {
18
18
  // Attributes
19
- _spin = false;
19
+ _status = 'stop';
20
20
  _label = '';
21
21
  _listeners = new Set();
22
22
  // Methods
23
+ _propagate() {
24
+ for (const listener of this._listeners){
25
+ listener(this.state);
26
+ }
27
+ }
23
28
  subscribe(listener) {
24
29
  this._listeners.add(listener);
25
30
  return ()=>{
@@ -27,22 +32,30 @@ let SpinnerService = class SpinnerService {
27
32
  };
28
33
  }
29
34
  spin(label) {
30
- this._spin = true;
35
+ this._status = 'spin';
31
36
  this._label = label;
32
- for (const listener of this._listeners){
33
- listener(this.state);
34
- }
37
+ this._propagate();
38
+ }
39
+ success(label) {
40
+ this._status = 'success';
41
+ this._label = label;
42
+ this._propagate();
43
+ }
44
+ failed(label) {
45
+ this._status = 'failed';
46
+ this._label = label;
47
+ this._propagate();
35
48
  }
36
49
  stop() {
37
- this._spin = false;
38
- for (const listener of this._listeners){
39
- listener(this.state);
50
+ if (this._status === 'spin') {
51
+ this._status = 'stop';
52
+ this._propagate();
40
53
  }
41
54
  }
42
55
  // Properties
43
56
  get state() {
44
57
  return {
45
- spin: this._spin,
58
+ status: this._status,
46
59
  label: this._label
47
60
  };
48
61
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["services/spinner.service.js"],"sourcesContent":["import { injectable } from 'inversify';\nimport { container } from './inversify.config';\n\n// Interface\nexport interface SpinnerState {\n spin: boolean;\n label: string;\n}\n\nexport type SpinnerStateListener = (state: SpinnerState) => void;\n\n// Service\n@injectable()\nexport class SpinnerService {\n // Attributes\n private _spin = false;\n private _label = '';\n\n private readonly _listeners = new Set<SpinnerStateListener>();\n\n // Methods\n subscribe(listener: SpinnerStateListener) {\n this._listeners.add(listener);\n\n return () => {\n this._listeners.delete(listener);\n };\n }\n\n spin(label: string) {\n this._spin = true;\n this._label = label;\n\n for (const listener of this._listeners) {\n listener(this.state);\n }\n }\n\n stop() {\n this._spin = false;\n\n for (const listener of this._listeners) {\n listener(this.state);\n }\n }\n\n // Properties\n get state(): SpinnerState {\n return {\n spin: this._spin,\n label: this._label,\n };\n }\n}\n\ncontainer.bind(SpinnerService)\n .toSelf()\n .inSingletonScope();\n"],"names":["SpinnerService","_spin","_label","_listeners","Set","subscribe","listener","add","delete","spin","label","state","stop","injectable","container","bind","toSelf","inSingletonScope"],"mappings":"AAAA;;;;+BAaaA;;aAAAA;;2BAbc;iCACD;;;;;;;IAYbA,iBAAN;IACL,aAAa;IACLC,QAAQ,KAAK,CAAC;IACdC,SAAS,GAAG;IAEHC,aAAa,IAAIC,MAA4B;IAE9D,UAAU;IACVC,UAAUC,QAA8B,EAAE;QACxC,IAAI,CAACH,UAAU,CAACI,GAAG,CAACD;QAEpB,OAAO,IAAM;YACX,IAAI,CAACH,UAAU,CAACK,MAAM,CAACF;QACzB;IACF;IAEAG,KAAKC,KAAa,EAAE;QAClB,IAAI,CAACT,KAAK,GAAG,IAAI;QACjB,IAAI,CAACC,MAAM,GAAGQ;QAEd,KAAK,MAAMJ,YAAY,IAAI,CAACH,UAAU,CAAE;YACtCG,SAAS,IAAI,CAACK,KAAK;QACrB;IACF;IAEAC,OAAO;QACL,IAAI,CAACX,KAAK,GAAG,KAAK;QAElB,KAAK,MAAMK,YAAY,IAAI,CAACH,UAAU,CAAE;YACtCG,SAAS,IAAI,CAACK,KAAK;QACrB;IACF;IAEA,aAAa;IACb,IAAIA,QAAsB;QACxB,OAAO;YACLF,MAAM,IAAI,CAACR,KAAK;YAChBS,OAAO,IAAI,CAACR,MAAM;QACpB;IACF;AACF;AAxCaF;IADZa,IAAAA,qBAAU;GACEb;AA0Cbc,0BAAS,CAACC,IAAI,CAACf,gBACZgB,MAAM,GACNC,gBAAgB","file":"spinner.service.js"}
1
+ {"version":3,"sources":["services/spinner.service.js"],"sourcesContent":["import { injectable } from 'inversify';\n\nimport { container } from './inversify.config';\n\n// Interface\nexport type SpinnerStatus = 'spin' | 'stop' | 'success' | 'failed';\nexport interface SpinnerState {\n status: SpinnerStatus;\n label: string;\n}\n\nexport type SpinnerStateListener = (state: SpinnerState) => void;\n\n// Service\n@injectable()\nexport class SpinnerService {\n // Attributes\n private _status: SpinnerStatus = 'stop';\n private _label = '';\n\n private readonly _listeners = new Set<SpinnerStateListener>();\n\n // Methods\n private _propagate() {\n for (const listener of this._listeners) {\n listener(this.state);\n }\n }\n\n subscribe(listener: SpinnerStateListener) {\n this._listeners.add(listener);\n\n return () => {\n this._listeners.delete(listener);\n };\n }\n\n spin(label: string) {\n this._status = 'spin';\n this._label = label;\n\n this._propagate();\n }\n\n success(label: string) {\n this._status = 'success';\n this._label = label;\n\n this._propagate();\n }\n\n failed(label: string) {\n this._status = 'failed';\n this._label = label;\n\n this._propagate();\n }\n\n stop() {\n if (this._status === 'spin') {\n this._status = 'stop';\n\n this._propagate();\n }\n }\n\n // Properties\n get state(): SpinnerState {\n return {\n status: this._status,\n label: this._label,\n };\n }\n}\n\ncontainer.bind(SpinnerService)\n .toSelf()\n .inSingletonScope();\n"],"names":["SpinnerService","_status","_label","_listeners","Set","_propagate","listener","state","subscribe","add","delete","spin","label","success","failed","stop","status","injectable","container","bind","toSelf","inSingletonScope"],"mappings":"AAAA;;;;+BAeaA;;aAAAA;;2BAfc;iCAED;;;;;;;IAabA,iBAAN;IACL,aAAa;IACLC,UAAyB,OAAO;IAChCC,SAAS,GAAG;IAEHC,aAAa,IAAIC,MAA4B;IAE9D,UAAU;IACFC,aAAa;QACnB,KAAK,MAAMC,YAAY,IAAI,CAACH,UAAU,CAAE;YACtCG,SAAS,IAAI,CAACC,KAAK;QACrB;IACF;IAEAC,UAAUF,QAA8B,EAAE;QACxC,IAAI,CAACH,UAAU,CAACM,GAAG,CAACH;QAEpB,OAAO,IAAM;YACX,IAAI,CAACH,UAAU,CAACO,MAAM,CAACJ;QACzB;IACF;IAEAK,KAAKC,KAAa,EAAE;QAClB,IAAI,CAACX,OAAO,GAAG;QACf,IAAI,CAACC,MAAM,GAAGU;QAEd,IAAI,CAACP,UAAU;IACjB;IAEAQ,QAAQD,KAAa,EAAE;QACrB,IAAI,CAACX,OAAO,GAAG;QACf,IAAI,CAACC,MAAM,GAAGU;QAEd,IAAI,CAACP,UAAU;IACjB;IAEAS,OAAOF,KAAa,EAAE;QACpB,IAAI,CAACX,OAAO,GAAG;QACf,IAAI,CAACC,MAAM,GAAGU;QAEd,IAAI,CAACP,UAAU;IACjB;IAEAU,OAAO;QACL,IAAI,IAAI,CAACd,OAAO,KAAK,QAAQ;YAC3B,IAAI,CAACA,OAAO,GAAG;YAEf,IAAI,CAACI,UAAU;QACjB,CAAC;IACH;IAEA,aAAa;IACb,IAAIE,QAAsB;QACxB,OAAO;YACLS,QAAQ,IAAI,CAACf,OAAO;YACpBW,OAAO,IAAI,CAACV,MAAM;QACpB;IACF;AACF;AA1DaF;IADZiB,IAAAA,qBAAU;GACEjB;AA4DbkB,0BAAS,CAACC,IAAI,CAACnB,gBACZoB,MAAM,GACNC,gBAAgB","file":"spinner.service.js"}
@@ -1 +1 @@
1
- {"version":3,"sources":["ui/global-spinner.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAA6B,MAAM,OAAO,CAAC;AAKtD,eAAO,MAAM,aAAa,EAAE,EAsB3B,CAAC","file":"global-spinner.d.ts","sourcesContent":["import { Text } from 'ink';\nimport Spinner from 'ink-spinner';\nimport { FC, useLayoutEffect, useState } from 'react';\n\nimport { container, SpinnerService, SpinnerState } from '../services';\n\n// Components\nexport const GlobalSpinner: FC = () => {\n // State\n const [state, setState] = useState<SpinnerState>({ spin: false, label: '' });\n\n // Effect\n useLayoutEffect(() => {\n const spinner = container.get(SpinnerService);\n setState(spinner.state);\n\n return spinner.subscribe(setState);\n }, []);\n\n // Render\n if (state.spin) {\n return (\n <Text>\n <Spinner />{' ' + state.label}\n </Text>\n );\n }\n\n return <></>;\n};\n"]}
1
+ {"version":3,"sources":["ui/global-spinner.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,EAAE,EAA6B,MAAM,OAAO,CAAC;AAKtD,eAAO,MAAM,aAAa,EAAE,EAuC3B,CAAC","file":"global-spinner.d.ts","sourcesContent":["import { Text } from 'ink';\nimport Spinner from 'ink-spinner';\nimport symbols from 'log-symbols';\nimport { FC, useLayoutEffect, useState } from 'react';\n\nimport { container, SpinnerService, SpinnerState } from '../services';\n\n// Components\nexport const GlobalSpinner: FC = () => {\n // State\n const [state, setState] = useState<SpinnerState>({ status: 'stop', label: '' });\n\n // Effect\n useLayoutEffect(() => {\n const spinner = container.get(SpinnerService);\n setState(spinner.state);\n\n return spinner.subscribe(setState);\n }, []);\n\n // Render\n switch (state.status) {\n case 'spin':\n return (\n <Text>\n <Spinner />{' ' + state.label}\n </Text>\n );\n\n case 'success':\n return (\n <Text color=\"green\">\n {symbols.success} {state.label}\n </Text>\n );\n\n case 'failed':\n return (\n <Text color=\"red\">\n {symbols.error} {state.label}\n </Text>\n );\n\n case 'stop':\n default:\n return null;\n }\n};\n"]}
@@ -9,6 +9,7 @@ Object.defineProperty(exports, "GlobalSpinner", {
9
9
  const _jsxRuntime = require("react/jsx-runtime");
10
10
  const _ink = require("ink");
11
11
  const _inkSpinner = /*#__PURE__*/ _interopRequireDefault(require("ink-spinner"));
12
+ const _logSymbols = /*#__PURE__*/ _interopRequireDefault(require("log-symbols"));
12
13
  const _react = require("react");
13
14
  const _services = require("../services");
14
15
  function _interopRequireDefault(obj) {
@@ -19,7 +20,7 @@ function _interopRequireDefault(obj) {
19
20
  const GlobalSpinner = ()=>{
20
21
  // State
21
22
  const [state, setState] = (0, _react.useState)({
22
- spin: false,
23
+ status: 'stop',
23
24
  label: ''
24
25
  });
25
26
  // Effect
@@ -29,15 +30,36 @@ const GlobalSpinner = ()=>{
29
30
  return spinner.subscribe(setState);
30
31
  }, []);
31
32
  // Render
32
- if (state.spin) {
33
- return /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Text, {
34
- children: [
35
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(_inkSpinner.default, {}),
36
- ' ' + state.label
37
- ]
38
- });
33
+ switch(state.status){
34
+ case 'spin':
35
+ return /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Text, {
36
+ children: [
37
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_inkSpinner.default, {}),
38
+ ' ' + state.label
39
+ ]
40
+ });
41
+ case 'success':
42
+ return /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Text, {
43
+ color: "green",
44
+ children: [
45
+ _logSymbols.default.success,
46
+ " ",
47
+ state.label
48
+ ]
49
+ });
50
+ case 'failed':
51
+ return /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Text, {
52
+ color: "red",
53
+ children: [
54
+ _logSymbols.default.error,
55
+ " ",
56
+ state.label
57
+ ]
58
+ });
59
+ case 'stop':
60
+ default:
61
+ return null;
39
62
  }
40
- return /*#__PURE__*/ (0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {});
41
63
  };
42
64
 
43
65
  //# sourceMappingURL=global-spinner.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["ui/global-spinner.js"],"sourcesContent":["import { Text } from 'ink';\nimport Spinner from 'ink-spinner';\nimport { FC, useLayoutEffect, useState } from 'react';\n\nimport { container, SpinnerService, SpinnerState } from '../services';\n\n// Components\nexport const GlobalSpinner: FC = () => {\n // State\n const [state, setState] = useState<SpinnerState>({ spin: false, label: '' });\n\n // Effect\n useLayoutEffect(() => {\n const spinner = container.get(SpinnerService);\n setState(spinner.state);\n\n return spinner.subscribe(setState);\n }, []);\n\n // Render\n if (state.spin) {\n return (\n <Text>\n <Spinner />{' ' + state.label}\n </Text>\n );\n }\n\n return <></>;\n};\n"],"names":["GlobalSpinner","state","setState","useState","spin","label","useLayoutEffect","spinner","container","get","SpinnerService","subscribe","Text","Spinner"],"mappings":"AAAA;;;;+BAOaA;;aAAAA;;;qBAPQ;iEACD;uBAC0B;0BAEU;;;;;;AAGjD,MAAMA,gBAAoB,IAAM;IACrC,QAAQ;IACR,MAAM,CAACC,OAAOC,SAAS,GAAGC,IAAAA,eAAQ,EAAe;QAAEC,MAAM,KAAK;QAAEC,OAAO;IAAG;IAE1E,SAAS;IACTC,IAAAA,sBAAe,EAAC,IAAM;QACpB,MAAMC,UAAUC,mBAAS,CAACC,GAAG,CAACC,wBAAc;QAC5CR,SAASK,QAAQN,KAAK;QAEtB,OAAOM,QAAQI,SAAS,CAACT;IAC3B,GAAG,EAAE;IAEL,SAAS;IACT,IAAID,MAAMG,IAAI,EAAE;QACd,qBACE,sBAACQ,SAAI;;8BACH,qBAACC,mBAAO;gBAAI,MAAMZ,MAAMI,KAAK;;;IAGnC,CAAC;IAED,qBAAO;AACT","file":"global-spinner.js"}
1
+ {"version":3,"sources":["ui/global-spinner.js"],"sourcesContent":["import { Text } from 'ink';\nimport Spinner from 'ink-spinner';\nimport symbols from 'log-symbols';\nimport { FC, useLayoutEffect, useState } from 'react';\n\nimport { container, SpinnerService, SpinnerState } from '../services';\n\n// Components\nexport const GlobalSpinner: FC = () => {\n // State\n const [state, setState] = useState<SpinnerState>({ status: 'stop', label: '' });\n\n // Effect\n useLayoutEffect(() => {\n const spinner = container.get(SpinnerService);\n setState(spinner.state);\n\n return spinner.subscribe(setState);\n }, []);\n\n // Render\n switch (state.status) {\n case 'spin':\n return (\n <Text>\n <Spinner />{' ' + state.label}\n </Text>\n );\n\n case 'success':\n return (\n <Text color=\"green\">\n {symbols.success} {state.label}\n </Text>\n );\n\n case 'failed':\n return (\n <Text color=\"red\">\n {symbols.error} {state.label}\n </Text>\n );\n\n case 'stop':\n default:\n return null;\n }\n};\n"],"names":["GlobalSpinner","state","setState","useState","status","label","useLayoutEffect","spinner","container","get","SpinnerService","subscribe","Text","Spinner","color","symbols","success","error"],"mappings":"AAAA;;;;+BAQaA;;aAAAA;;;qBARQ;iEACD;iEACA;uBAC0B;0BAEU;;;;;;AAGjD,MAAMA,gBAAoB,IAAM;IACrC,QAAQ;IACR,MAAM,CAACC,OAAOC,SAAS,GAAGC,IAAAA,eAAQ,EAAe;QAAEC,QAAQ;QAAQC,OAAO;IAAG;IAE7E,SAAS;IACTC,IAAAA,sBAAe,EAAC,IAAM;QACpB,MAAMC,UAAUC,mBAAS,CAACC,GAAG,CAACC,wBAAc;QAC5CR,SAASK,QAAQN,KAAK;QAEtB,OAAOM,QAAQI,SAAS,CAACT;IAC3B,GAAG,EAAE;IAEL,SAAS;IACT,OAAQD,MAAMG,MAAM;QAClB,KAAK;YACH,qBACE,sBAACQ,SAAI;;kCACH,qBAACC,mBAAO;oBAAI,MAAMZ,MAAMI,KAAK;;;QAInC,KAAK;YACH,qBACE,sBAACO,SAAI;gBAACE,OAAM;;oBACTC,mBAAO,CAACC,OAAO;oBAAC;oBAAEf,MAAMI,KAAK;;;QAIpC,KAAK;YACH,qBACE,sBAACO,SAAI;gBAACE,OAAM;;oBACTC,mBAAO,CAACE,KAAK;oBAAC;oBAAEhB,MAAMI,KAAK;;;QAIlC,KAAK;QACL;YACE,OAAO,IAAI;IACf;AACF","file":"global-spinner.js"}
@@ -1,5 +1,7 @@
1
- export * from './cli-list';
2
1
  export * from './global-spinner';
3
2
  export * from './layout';
4
3
  export * from './list';
5
4
  export * from './static-logs';
5
+ export * from './tasks-spinner';
6
+ export * from './task-spinner';
7
+ export * from './workspace-tree';
@@ -1 +1 @@
1
- {"version":3,"sources":["ui/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,eAAe,CAAC","file":"index.d.ts","sourcesContent":["export * from './cli-list';\nexport * from './global-spinner';\nexport * from './layout';\nexport * from './list';\nexport * from './static-logs';\n"]}
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,iBAAiB,CAAC;AAChC,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 './tasks-spinner';\nexport * from './task-spinner';\nexport * from './workspace-tree';\n"]}
package/dist/ui/index.js CHANGED
@@ -2,11 +2,13 @@
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
- _exportStar(require("./cli-list"), exports);
6
5
  _exportStar(require("./global-spinner"), exports);
7
6
  _exportStar(require("./layout"), exports);
8
7
  _exportStar(require("./list"), exports);
9
8
  _exportStar(require("./static-logs"), exports);
9
+ _exportStar(require("./tasks-spinner"), exports);
10
+ _exportStar(require("./task-spinner"), exports);
11
+ _exportStar(require("./workspace-tree"), exports);
10
12
  function _exportStar(from, to) {
11
13
  Object.keys(from).forEach(function(k) {
12
14
  if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) Object.defineProperty(to, k, {
@@ -1 +1 @@
1
- {"version":3,"sources":["ui/index.js"],"sourcesContent":["export * from './cli-list';\nexport * from './global-spinner';\nexport * from './layout';\nexport * from './list';\nexport * from './static-logs';\n"],"names":[],"mappings":"AAAA;;;;oBAAc;oBACA;oBACA;oBACA;oBACA","file":"index.js"}
1
+ {"version":3,"sources":["ui/index.js"],"sourcesContent":["export * from './global-spinner';\nexport * from './layout';\nexport * from './list';\nexport * from './static-logs';\nexport * from './tasks-spinner';\nexport * from './task-spinner';\nexport * from './workspace-tree';\n"],"names":[],"mappings":"AAAA;;;;oBAAc;oBACA;oBACA;oBACA;oBACA;oBACA;oBACA","file":"index.js"}
@@ -1 +1 @@
1
- {"version":3,"sources":["ui/static-logs.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAoB,MAAM,OAAO,CAAC;AAc7C,eAAO,MAAM,UAAU,EAAE,EAwCxB,CAAC","file":"static-logs.d.ts","sourcesContent":["import { useStderr } from 'ink';\nimport { FC, useLayoutEffect, } from 'react';\nimport Transport from 'winston-transport';\n\nimport { consoleFormat, container, Logger } from '../services';\n\n// Constants\nconst MESSAGE = Symbol.for('message');\n\n// Types\ninterface Info extends Record<string, unknown> {\n [MESSAGE]: string;\n}\n\n// Component\nexport const StaticLogs: FC = () => {\n // State\n const { write } = useStderr();\n\n // Effect\n useLayoutEffect(() => {\n const logger = container.get(Logger);\n const olds = logger.transports;\n\n logger.clear();\n logger.add(new class extends Transport {\n // Constructor\n constructor() {\n super({\n format: consoleFormat\n });\n }\n\n // Methods\n log(info: Info, next: () => void): void {\n setTimeout(() => {\n this.emit('logged', info);\n }, 0);\n\n write(info[MESSAGE] + '\\n');\n\n next();\n }\n });\n\n return () => {\n logger.clear();\n\n for (const transport of olds) {\n logger.add(transport);\n }\n };\n }, [write]);\n\n return null;\n};\n"]}
1
+ {"version":3,"sources":["ui/static-logs.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAoB,MAAM,OAAO,CAAC;AAe7C,eAAO,MAAM,UAAU,EAAE,EA+CxB,CAAC","file":"static-logs.d.ts","sourcesContent":["import { useStderr } from 'ink';\nimport { FC, useLayoutEffect, } from 'react';\nimport Transport from 'winston-transport';\n\nimport { consoleFormat, container, Logger } from '../services';\nimport winston from 'winston';\n\n// Constants\nconst MESSAGE = Symbol.for('message');\n\n// Types\ninterface Info extends Record<string, unknown> {\n [MESSAGE]: string;\n}\n\n// Component\nexport const StaticLogs: FC = () => {\n // State\n const { write } = useStderr();\n\n // Effect\n useLayoutEffect(() => {\n const logger = container.get(Logger);\n\n // Remove Console transport\n for (const transport of logger.transports) {\n if (transport instanceof winston.transports.Console) {\n logger.remove(transport);\n }\n }\n\n // Add custom transport\n const transport = new class extends Transport {\n // Constructor\n constructor() {\n super({\n format: consoleFormat\n });\n }\n\n // Methods\n log(info: Info, next: () => void): void {\n setTimeout(() => {\n this.emit('logged', info);\n }, 0);\n\n write(info[MESSAGE] + '\\n');\n\n next();\n }\n };\n\n logger.add(transport);\n\n return () => {\n logger.remove(transport);\n logger.add(new winston.transports.Console({\n format: consoleFormat\n }));\n };\n }, [write]);\n\n return null;\n};\n"]}
@@ -10,6 +10,7 @@ const _ink = require("ink");
10
10
  const _react = require("react");
11
11
  const _winstonTransport = /*#__PURE__*/ _interopRequireDefault(require("winston-transport"));
12
12
  const _services = require("../services");
13
+ const _winston = /*#__PURE__*/ _interopRequireDefault(require("winston"));
13
14
  function _interopRequireDefault(obj) {
14
15
  return obj && obj.__esModule ? obj : {
15
16
  default: obj
@@ -23,9 +24,14 @@ const StaticLogs = ()=>{
23
24
  // Effect
24
25
  (0, _react.useLayoutEffect)(()=>{
25
26
  const logger = _services.container.get(_services.Logger);
26
- const olds = logger.transports;
27
- logger.clear();
28
- logger.add(new class extends _winstonTransport.default {
27
+ // Remove Console transport
28
+ for (const transport of logger.transports){
29
+ if (transport instanceof _winston.default.transports.Console) {
30
+ logger.remove(transport);
31
+ }
32
+ }
33
+ // Add custom transport
34
+ const transport1 = new class extends _winstonTransport.default {
29
35
  // Constructor
30
36
  constructor(){
31
37
  super({
@@ -40,12 +46,13 @@ const StaticLogs = ()=>{
40
46
  write(info[MESSAGE] + '\n');
41
47
  next();
42
48
  }
43
- });
49
+ };
50
+ logger.add(transport1);
44
51
  return ()=>{
45
- logger.clear();
46
- for (const transport of olds){
47
- logger.add(transport);
48
- }
52
+ logger.remove(transport1);
53
+ logger.add(new _winston.default.transports.Console({
54
+ format: _services.consoleFormat
55
+ }));
49
56
  };
50
57
  }, [
51
58
  write
@@ -1 +1 @@
1
- {"version":3,"sources":["ui/static-logs.js"],"sourcesContent":["import { useStderr } from 'ink';\nimport { FC, useLayoutEffect, } from 'react';\nimport Transport from 'winston-transport';\n\nimport { consoleFormat, container, Logger } from '../services';\n\n// Constants\nconst MESSAGE = Symbol.for('message');\n\n// Types\ninterface Info extends Record<string, unknown> {\n [MESSAGE]: string;\n}\n\n// Component\nexport const StaticLogs: FC = () => {\n // State\n const { write } = useStderr();\n\n // Effect\n useLayoutEffect(() => {\n const logger = container.get(Logger);\n const olds = logger.transports;\n\n logger.clear();\n logger.add(new class extends Transport {\n // Constructor\n constructor() {\n super({\n format: consoleFormat\n });\n }\n\n // Methods\n log(info: Info, next: () => void): void {\n setTimeout(() => {\n this.emit('logged', info);\n }, 0);\n\n write(info[MESSAGE] + '\\n');\n\n next();\n }\n });\n\n return () => {\n logger.clear();\n\n for (const transport of olds) {\n logger.add(transport);\n }\n };\n }, [write]);\n\n return null;\n};\n"],"names":["StaticLogs","MESSAGE","Symbol","for","write","useStderr","useLayoutEffect","logger","container","get","Logger","olds","transports","clear","add","Transport","constructor","format","consoleFormat","log","info","next","setTimeout","emit","transport"],"mappings":"AAAA;;;;+BAeaA;;aAAAA;;qBAfa;uBACW;uEACf;0BAE2B;;;;;;AAEjD,YAAY;AACZ,MAAMC,UAAUC,OAAOC,GAAG,CAAC;AAQpB,MAAMH,aAAiB,IAAM;IAClC,QAAQ;IACR,MAAM,EAAEI,MAAK,EAAE,GAAGC,IAAAA,cAAS;IAE3B,SAAS;IACTC,IAAAA,sBAAe,EAAC,IAAM;QACpB,MAAMC,SAASC,mBAAS,CAACC,GAAG,CAACC,gBAAM;QACnC,MAAMC,OAAOJ,OAAOK,UAAU;QAE9BL,OAAOM,KAAK;QACZN,OAAOO,GAAG,CAAC,IAAI,cAAcC,yBAAS;YACpC,cAAc;YACdC,aAAc;gBACZ,KAAK,CAAC;oBACJC,QAAQC,uBAAa;gBACvB;YACF;YAEA,UAAU;YACVC,IAAIC,IAAU,EAAEC,IAAgB,EAAQ;gBACtCC,WAAW,IAAM;oBACf,IAAI,CAACC,IAAI,CAAC,UAAUH;gBACtB,GAAG;gBAEHhB,MAAMgB,IAAI,CAACnB,QAAQ,GAAG;gBAEtBoB;YACF;QACF;QAEA,OAAO,IAAM;YACXd,OAAOM,KAAK;YAEZ,KAAK,MAAMW,aAAab,KAAM;gBAC5BJ,OAAOO,GAAG,CAACU;YACb;QACF;IACF,GAAG;QAACpB;KAAM;IAEV,OAAO,IAAI;AACb","file":"static-logs.js"}
1
+ {"version":3,"sources":["ui/static-logs.js"],"sourcesContent":["import { useStderr } from 'ink';\nimport { FC, useLayoutEffect, } from 'react';\nimport Transport from 'winston-transport';\n\nimport { consoleFormat, container, Logger } from '../services';\nimport winston from 'winston';\n\n// Constants\nconst MESSAGE = Symbol.for('message');\n\n// Types\ninterface Info extends Record<string, unknown> {\n [MESSAGE]: string;\n}\n\n// Component\nexport const StaticLogs: FC = () => {\n // State\n const { write } = useStderr();\n\n // Effect\n useLayoutEffect(() => {\n const logger = container.get(Logger);\n\n // Remove Console transport\n for (const transport of logger.transports) {\n if (transport instanceof winston.transports.Console) {\n logger.remove(transport);\n }\n }\n\n // Add custom transport\n const transport = new class extends Transport {\n // Constructor\n constructor() {\n super({\n format: consoleFormat\n });\n }\n\n // Methods\n log(info: Info, next: () => void): void {\n setTimeout(() => {\n this.emit('logged', info);\n }, 0);\n\n write(info[MESSAGE] + '\\n');\n\n next();\n }\n };\n\n logger.add(transport);\n\n return () => {\n logger.remove(transport);\n logger.add(new winston.transports.Console({\n format: consoleFormat\n }));\n };\n }, [write]);\n\n return null;\n};\n"],"names":["StaticLogs","MESSAGE","Symbol","for","write","useStderr","useLayoutEffect","logger","container","get","Logger","transport","transports","winston","Console","remove","Transport","constructor","format","consoleFormat","log","info","next","setTimeout","emit","add"],"mappings":"AAAA;;;;+BAgBaA;;aAAAA;;qBAhBa;uBACW;uEACf;0BAE2B;8DAC7B;;;;;;AAEpB,YAAY;AACZ,MAAMC,UAAUC,OAAOC,GAAG,CAAC;AAQpB,MAAMH,aAAiB,IAAM;IAClC,QAAQ;IACR,MAAM,EAAEI,MAAK,EAAE,GAAGC,IAAAA,cAAS;IAE3B,SAAS;IACTC,IAAAA,sBAAe,EAAC,IAAM;QACpB,MAAMC,SAASC,mBAAS,CAACC,GAAG,CAACC,gBAAM;QAEnC,2BAA2B;QAC3B,KAAK,MAAMC,aAAaJ,OAAOK,UAAU,CAAE;YACzC,IAAID,qBAAqBE,gBAAO,CAACD,UAAU,CAACE,OAAO,EAAE;gBACnDP,OAAOQ,MAAM,CAACJ;YAChB,CAAC;QACH;QAEA,uBAAuB;QACvB,MAAMA,aAAY,IAAI,cAAcK,yBAAS;YAC3C,cAAc;YACdC,aAAc;gBACZ,KAAK,CAAC;oBACJC,QAAQC,uBAAa;gBACvB;YACF;YAEA,UAAU;YACVC,IAAIC,IAAU,EAAEC,IAAgB,EAAQ;gBACtCC,WAAW,IAAM;oBACf,IAAI,CAACC,IAAI,CAAC,UAAUH;gBACtB,GAAG;gBAEHjB,MAAMiB,IAAI,CAACpB,QAAQ,GAAG;gBAEtBqB;YACF;QACF;QAEAf,OAAOkB,GAAG,CAACd;QAEX,OAAO,IAAM;YACXJ,OAAOQ,MAAM,CAACJ;YACdJ,OAAOkB,GAAG,CAAC,IAAIZ,gBAAO,CAACD,UAAU,CAACE,OAAO,CAAC;gBACxCI,QAAQC,uBAAa;YACvB;QACF;IACF,GAAG;QAACf;KAAM;IAEV,OAAO,IAAI;AACb","file":"static-logs.js"}
@@ -0,0 +1,6 @@
1
+ import { Task } from '@jujulego/tasks';
2
+ import { FC } from 'react';
3
+ export interface TaskSpinnerProps {
4
+ task: Task;
5
+ }
6
+ export declare const TaskSpinner: FC<TaskSpinnerProps>;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["ui/task-spinner.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAe,MAAM,iBAAiB,CAAC;AAIpD,OAAO,EAAE,EAAE,EAAsC,MAAM,OAAO,CAAC;AAM/D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,IAAI,CAAC;CACZ;AAQD,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CAyF5C,CAAC","file":"task-spinner.d.ts","sourcesContent":["import { Task, TaskContext } from '@jujulego/tasks';\nimport { Text } from 'ink';\nimport Spinner from 'ink-spinner';\nimport symbols from 'log-symbols';\nimport { FC, useLayoutEffect, useMemo, useState } from 'react';\n\nimport { WorkspaceContext } from '../project';\nimport { waitForEvent } from '@jujulego/event-tree';\n\n// Types\nexport interface TaskSpinnerProps {\n task: Task;\n}\n\n// Utils\nfunction isWorkspaceCtx(ctx: Readonly<TaskContext>): ctx is Readonly<WorkspaceContext> {\n return 'workspace' in ctx;\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 // Memos\n const label = useMemo(() => {\n const ctx = task.context;\n\n if (isWorkspaceCtx(ctx)) {\n return `in ${ctx.workspace.name}`;\n }\n\n return null;\n }, [task]);\n\n // Effects\n useLayoutEffect(() => {\n return task.subscribe('status', (event) => {\n setStatus(event.status);\n });\n }, [task]);\n\n useLayoutEffect(() => {\n const ctrl = new AbortController();\n\n (async () => {\n try {\n if (['blocked', 'ready']?.includes(task.status)) {\n await waitForEvent(task, 'status.running', { signal: ctrl.signal });\n }\n\n const start = Date.now();\n\n if (task.status === 'running') {\n await Promise.race([\n waitForEvent(task, 'status.done', { signal: ctrl.signal }),\n waitForEvent(task, 'status.failed', { signal: ctrl.signal })\n ]);\n }\n\n setTime(Date.now() - start);\n } catch (err) {\n if (err.name !== 'AbortError') {\n throw err;\n }\n }\n })();\n\n return () => ctrl.abort();\n }, [task]);\n\n // Render\n switch (status) {\n case 'blocked':\n case 'ready':\n return (\n <Text color=\"grey\">\n <Spinner type=\"line2\" />{ ' ' + task.name }\n { label && <Text color=\"grey\">{ ' ' + label }</Text> }\n </Text>\n );\n\n case 'running':\n return (\n <Text>\n <Spinner />{ ' ' + task.name }\n { label && <Text color=\"grey\">{ ' ' + label }</Text> }\n </Text>\n );\n\n case 'done':\n return (\n <Text>\n <Text color=\"green\">{ symbols.success } { task.name }</Text>\n { label && <Text color=\"grey\">{ ' ' + label }</Text> }\n <Text color=\"magenta\">{' '}took { time }ms</Text>\n </Text>\n );\n\n case 'failed':\n return (\n <Text>\n <Text color=\"red\">{ symbols.error } { task.name }</Text>\n { label && <Text color=\"grey\">{ ' ' + label }</Text> }\n <Text color=\"magenta\">{' '}took { time }ms</Text>\n </Text>\n );\n }\n};\n"]}
@@ -0,0 +1,163 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "TaskSpinner", {
6
+ enumerable: true,
7
+ get: ()=>TaskSpinner
8
+ });
9
+ const _jsxRuntime = require("react/jsx-runtime");
10
+ const _ink = require("ink");
11
+ const _inkSpinner = /*#__PURE__*/ _interopRequireDefault(require("ink-spinner"));
12
+ const _logSymbols = /*#__PURE__*/ _interopRequireDefault(require("log-symbols"));
13
+ const _react = require("react");
14
+ const _eventTree = require("@jujulego/event-tree");
15
+ function _interopRequireDefault(obj) {
16
+ return obj && obj.__esModule ? obj : {
17
+ default: obj
18
+ };
19
+ }
20
+ // Utils
21
+ function isWorkspaceCtx(ctx) {
22
+ return 'workspace' in ctx;
23
+ }
24
+ const TaskSpinner = ({ task })=>{
25
+ // State
26
+ const [status, setStatus] = (0, _react.useState)(task.status);
27
+ const [time, setTime] = (0, _react.useState)(0);
28
+ // Memos
29
+ const label = (0, _react.useMemo)(()=>{
30
+ const ctx = task.context;
31
+ if (isWorkspaceCtx(ctx)) {
32
+ return `in ${ctx.workspace.name}`;
33
+ }
34
+ return null;
35
+ }, [
36
+ task
37
+ ]);
38
+ // Effects
39
+ (0, _react.useLayoutEffect)(()=>{
40
+ return task.subscribe('status', (event)=>{
41
+ setStatus(event.status);
42
+ });
43
+ }, [
44
+ task
45
+ ]);
46
+ (0, _react.useLayoutEffect)(()=>{
47
+ const ctrl = new AbortController();
48
+ (async ()=>{
49
+ try {
50
+ if ([
51
+ 'blocked',
52
+ 'ready'
53
+ ]?.includes(task.status)) {
54
+ await (0, _eventTree.waitForEvent)(task, 'status.running', {
55
+ signal: ctrl.signal
56
+ });
57
+ }
58
+ const start = Date.now();
59
+ if (task.status === 'running') {
60
+ await Promise.race([
61
+ (0, _eventTree.waitForEvent)(task, 'status.done', {
62
+ signal: ctrl.signal
63
+ }),
64
+ (0, _eventTree.waitForEvent)(task, 'status.failed', {
65
+ signal: ctrl.signal
66
+ })
67
+ ]);
68
+ }
69
+ setTime(Date.now() - start);
70
+ } catch (err) {
71
+ if (err.name !== 'AbortError') {
72
+ throw err;
73
+ }
74
+ }
75
+ })();
76
+ return ()=>ctrl.abort();
77
+ }, [
78
+ task
79
+ ]);
80
+ // Render
81
+ switch(status){
82
+ case 'blocked':
83
+ case 'ready':
84
+ return /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Text, {
85
+ color: "grey",
86
+ children: [
87
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_inkSpinner.default, {
88
+ type: "line2"
89
+ }),
90
+ ' ' + task.name,
91
+ label && /*#__PURE__*/ (0, _jsxRuntime.jsx)(_ink.Text, {
92
+ color: "grey",
93
+ children: ' ' + label
94
+ })
95
+ ]
96
+ });
97
+ case 'running':
98
+ return /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Text, {
99
+ children: [
100
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_inkSpinner.default, {}),
101
+ ' ' + task.name,
102
+ label && /*#__PURE__*/ (0, _jsxRuntime.jsx)(_ink.Text, {
103
+ color: "grey",
104
+ children: ' ' + label
105
+ })
106
+ ]
107
+ });
108
+ case 'done':
109
+ return /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Text, {
110
+ children: [
111
+ /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Text, {
112
+ color: "green",
113
+ children: [
114
+ _logSymbols.default.success,
115
+ " ",
116
+ task.name
117
+ ]
118
+ }),
119
+ label && /*#__PURE__*/ (0, _jsxRuntime.jsx)(_ink.Text, {
120
+ color: "grey",
121
+ children: ' ' + label
122
+ }),
123
+ /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Text, {
124
+ color: "magenta",
125
+ children: [
126
+ ' ',
127
+ "took ",
128
+ time,
129
+ "ms"
130
+ ]
131
+ })
132
+ ]
133
+ });
134
+ case 'failed':
135
+ return /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Text, {
136
+ children: [
137
+ /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Text, {
138
+ color: "red",
139
+ children: [
140
+ _logSymbols.default.error,
141
+ " ",
142
+ task.name
143
+ ]
144
+ }),
145
+ label && /*#__PURE__*/ (0, _jsxRuntime.jsx)(_ink.Text, {
146
+ color: "grey",
147
+ children: ' ' + label
148
+ }),
149
+ /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Text, {
150
+ color: "magenta",
151
+ children: [
152
+ ' ',
153
+ "took ",
154
+ time,
155
+ "ms"
156
+ ]
157
+ })
158
+ ]
159
+ });
160
+ }
161
+ };
162
+
163
+ //# sourceMappingURL=task-spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["ui/task-spinner.js"],"sourcesContent":["import { Task, TaskContext } from '@jujulego/tasks';\nimport { Text } from 'ink';\nimport Spinner from 'ink-spinner';\nimport symbols from 'log-symbols';\nimport { FC, useLayoutEffect, useMemo, useState } from 'react';\n\nimport { WorkspaceContext } from '../project';\nimport { waitForEvent } from '@jujulego/event-tree';\n\n// Types\nexport interface TaskSpinnerProps {\n task: Task;\n}\n\n// Utils\nfunction isWorkspaceCtx(ctx: Readonly<TaskContext>): ctx is Readonly<WorkspaceContext> {\n return 'workspace' in ctx;\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 // Memos\n const label = useMemo(() => {\n const ctx = task.context;\n\n if (isWorkspaceCtx(ctx)) {\n return `in ${ctx.workspace.name}`;\n }\n\n return null;\n }, [task]);\n\n // Effects\n useLayoutEffect(() => {\n return task.subscribe('status', (event) => {\n setStatus(event.status);\n });\n }, [task]);\n\n useLayoutEffect(() => {\n const ctrl = new AbortController();\n\n (async () => {\n try {\n if (['blocked', 'ready']?.includes(task.status)) {\n await waitForEvent(task, 'status.running', { signal: ctrl.signal });\n }\n\n const start = Date.now();\n\n if (task.status === 'running') {\n await Promise.race([\n waitForEvent(task, 'status.done', { signal: ctrl.signal }),\n waitForEvent(task, 'status.failed', { signal: ctrl.signal })\n ]);\n }\n\n setTime(Date.now() - start);\n } catch (err) {\n if (err.name !== 'AbortError') {\n throw err;\n }\n }\n })();\n\n return () => ctrl.abort();\n }, [task]);\n\n // Render\n switch (status) {\n case 'blocked':\n case 'ready':\n return (\n <Text color=\"grey\">\n <Spinner type=\"line2\" />{ ' ' + task.name }\n { label && <Text color=\"grey\">{ ' ' + label }</Text> }\n </Text>\n );\n\n case 'running':\n return (\n <Text>\n <Spinner />{ ' ' + task.name }\n { label && <Text color=\"grey\">{ ' ' + label }</Text> }\n </Text>\n );\n\n case 'done':\n return (\n <Text>\n <Text color=\"green\">{ symbols.success } { task.name }</Text>\n { label && <Text color=\"grey\">{ ' ' + label }</Text> }\n <Text color=\"magenta\">{' '}took { time }ms</Text>\n </Text>\n );\n\n case 'failed':\n return (\n <Text>\n <Text color=\"red\">{ symbols.error } { task.name }</Text>\n { label && <Text color=\"grey\">{ ' ' + label }</Text> }\n <Text color=\"magenta\">{' '}took { time }ms</Text>\n </Text>\n );\n }\n};\n"],"names":["TaskSpinner","isWorkspaceCtx","ctx","task","status","setStatus","useState","time","setTime","label","useMemo","context","workspace","name","useLayoutEffect","subscribe","event","ctrl","AbortController","includes","waitForEvent","signal","start","Date","now","Promise","race","err","abort","Text","color","Spinner","type","symbols","success","error"],"mappings":"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","file":"task-spinner.js"}
@@ -0,0 +1,6 @@
1
+ import { TaskManager } from '@jujulego/tasks';
2
+ import { FC } from 'react';
3
+ export interface TasksSpinnerProps {
4
+ manager: TaskManager;
5
+ }
6
+ export declare const TasksSpinner: FC<TasksSpinnerProps>;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["ui/tasks-spinner.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAK3B,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,WAAW,CAAC;CACtB;AAGD,eAAO,MAAM,YAAY,EAAE,EAAE,CAAC,iBAAiB,CAM9C,CAAC","file":"tasks-spinner.d.ts","sourcesContent":["import { TaskManager } from '@jujulego/tasks';\nimport { FC } 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 <>\n { manager.tasks.map((task, idx) => (\n <TaskSpinner key={idx} task={task}/>\n )) }\n </>\n);\n"]}
@@ -0,0 +1,17 @@
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 _taskSpinner = require("./task-spinner");
11
+ const TasksSpinner = ({ manager })=>/*#__PURE__*/ (0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
12
+ children: manager.tasks.map((task, idx)=>/*#__PURE__*/ (0, _jsxRuntime.jsx)(_taskSpinner.TaskSpinner, {
13
+ task: task
14
+ }, idx))
15
+ });
16
+
17
+ //# sourceMappingURL=tasks-spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["ui/tasks-spinner.js"],"sourcesContent":["import { TaskManager } from '@jujulego/tasks';\nimport { FC } 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 <>\n { manager.tasks.map((task, idx) => (\n <TaskSpinner key={idx} task={task}/>\n )) }\n </>\n);\n"],"names":["TasksSpinner","manager","tasks","map","task","idx","TaskSpinner"],"mappings":"AAAA;;;;+BAWaA;;aAAAA;;;6BARe;AAQrB,MAAMA,eAAsC,CAAC,EAAEC,QAAO,EAAE,iBAC7D;kBACIA,QAAQC,KAAK,CAACC,GAAG,CAAC,CAACC,MAAMC,oBACzB,qBAACC,wBAAW;gBAAWF,MAAMA;eAAXC","file":"tasks-spinner.js"}
@@ -0,0 +1,8 @@
1
+ import { FC, ReactElement } from 'react';
2
+ import { Workspace } from '../project';
3
+ export interface WorkspaceTreeProps {
4
+ workspace: Workspace;
5
+ dev?: boolean;
6
+ level?: ReactElement;
7
+ }
8
+ export declare const WorkspaceTree: FC<WorkspaceTreeProps>;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["ui/workspace-tree.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,YAAY,EAAuB,MAAM,OAAO,CAAC;AAE9D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,SAAS,CAAC;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB;AAMD,eAAO,MAAM,aAAa,EAAE,EAAE,CAAC,kBAAkB,CAwChD,CAAC","file":"workspace-tree.d.ts","sourcesContent":["import { Newline, Text, TextProps } from 'ink';\nimport { FC, ReactElement, useEffect, useState } from 'react';\n\nimport { Workspace } from '../project';\n\n// Types\nexport interface WorkspaceTreeProps {\n workspace: Workspace;\n dev?: boolean;\n level?: ReactElement;\n}\n\n// Utils\nconst style = (dev: boolean): TextProps => ({ color: dev ? 'blue' : '' });\n\n// Component\nexport const WorkspaceTree: FC<WorkspaceTreeProps> = (props) => {\n const { workspace: wks, dev = false, level = '' } = props;\n\n // State\n const [deps, setDeps] = useState<[Workspace, boolean | null][]>([]);\n\n // Effects\n useEffect(() => void (async () => {\n const deps: [Workspace, boolean | null][] = [];\n\n for await (const dep of wks.dependencies()) {\n deps.push([dep, null]);\n }\n\n for await (const dep of wks.devDependencies()) {\n deps.push([dep, true]);\n }\n\n setDeps(deps);\n })(), [wks]);\n\n // Render\n return (\n <Text>\n <Text {...style(dev)}>{ wks.name }</Text>\n { wks.version && (<Text color=\"grey\">@{ wks.version }</Text>) }\n <Newline />\n\n { deps.map(([dep, isDev], idx) => (\n <Text key={dep.name}>\n { level }<Text {...style(dev)}>{ idx === deps.length - 1 ? '└' : '├'}─{' '}</Text>\n <WorkspaceTree\n workspace={dep}\n dev={isDev ?? dev}\n level={<>{ level }<Text {...style(dev)}>{ idx === deps.length - 1 ? ' ' : '│' }{' '}</Text></>}\n />\n </Text>\n )) }\n </Text>\n );\n};\n"]}
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "WorkspaceTree", {
6
+ enumerable: true,
7
+ get: ()=>WorkspaceTree
8
+ });
9
+ const _jsxRuntime = require("react/jsx-runtime");
10
+ const _ink = require("ink");
11
+ const _react = require("react");
12
+ // Utils
13
+ const style = (dev)=>({
14
+ color: dev ? 'blue' : ''
15
+ });
16
+ const WorkspaceTree = (props)=>{
17
+ const { workspace: wks , dev =false , level ='' } = props;
18
+ // State
19
+ const [deps, setDeps] = (0, _react.useState)([]);
20
+ // Effects
21
+ (0, _react.useEffect)(()=>void (async ()=>{
22
+ const deps = [];
23
+ for await (const dep of wks.dependencies()){
24
+ deps.push([
25
+ dep,
26
+ null
27
+ ]);
28
+ }
29
+ for await (const dep1 of wks.devDependencies()){
30
+ deps.push([
31
+ dep1,
32
+ true
33
+ ]);
34
+ }
35
+ setDeps(deps);
36
+ })(), [
37
+ wks
38
+ ]);
39
+ // Render
40
+ return /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Text, {
41
+ children: [
42
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_ink.Text, {
43
+ ...style(dev),
44
+ children: wks.name
45
+ }),
46
+ wks.version && /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Text, {
47
+ color: "grey",
48
+ children: [
49
+ "@",
50
+ wks.version
51
+ ]
52
+ }),
53
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_ink.Newline, {}),
54
+ deps.map(([dep, isDev], idx)=>/*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Text, {
55
+ children: [
56
+ level,
57
+ /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Text, {
58
+ ...style(dev),
59
+ children: [
60
+ idx === deps.length - 1 ? '└' : '├',
61
+ "─",
62
+ ' '
63
+ ]
64
+ }),
65
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(WorkspaceTree, {
66
+ workspace: dep,
67
+ dev: isDev ?? dev,
68
+ level: /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
69
+ children: [
70
+ level,
71
+ /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Text, {
72
+ ...style(dev),
73
+ children: [
74
+ idx === deps.length - 1 ? ' ' : '│',
75
+ ' '
76
+ ]
77
+ })
78
+ ]
79
+ })
80
+ })
81
+ ]
82
+ }, dep.name))
83
+ ]
84
+ });
85
+ };
86
+
87
+ //# sourceMappingURL=workspace-tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["ui/workspace-tree.js"],"sourcesContent":["import { Newline, Text, TextProps } from 'ink';\nimport { FC, ReactElement, useEffect, useState } from 'react';\n\nimport { Workspace } from '../project';\n\n// Types\nexport interface WorkspaceTreeProps {\n workspace: Workspace;\n dev?: boolean;\n level?: ReactElement;\n}\n\n// Utils\nconst style = (dev: boolean): TextProps => ({ color: dev ? 'blue' : '' });\n\n// Component\nexport const WorkspaceTree: FC<WorkspaceTreeProps> = (props) => {\n const { workspace: wks, dev = false, level = '' } = props;\n\n // State\n const [deps, setDeps] = useState<[Workspace, boolean | null][]>([]);\n\n // Effects\n useEffect(() => void (async () => {\n const deps: [Workspace, boolean | null][] = [];\n\n for await (const dep of wks.dependencies()) {\n deps.push([dep, null]);\n }\n\n for await (const dep of wks.devDependencies()) {\n deps.push([dep, true]);\n }\n\n setDeps(deps);\n })(), [wks]);\n\n // Render\n return (\n <Text>\n <Text {...style(dev)}>{ wks.name }</Text>\n { wks.version && (<Text color=\"grey\">@{ wks.version }</Text>) }\n <Newline />\n\n { deps.map(([dep, isDev], idx) => (\n <Text key={dep.name}>\n { level }<Text {...style(dev)}>{ idx === deps.length - 1 ? '└' : '├'}─{' '}</Text>\n <WorkspaceTree\n workspace={dep}\n dev={isDev ?? dev}\n level={<>{ level }<Text {...style(dev)}>{ idx === deps.length - 1 ? ' ' : '│' }{' '}</Text></>}\n />\n </Text>\n )) }\n </Text>\n );\n};\n"],"names":["WorkspaceTree","style","dev","color","props","workspace","wks","level","deps","setDeps","useState","useEffect","dep","dependencies","push","devDependencies","Text","name","version","Newline","map","isDev","idx","length"],"mappings":"AAAA;;;;+BAgBaA;;aAAAA;;;qBAhB4B;uBACa;AAWtD,QAAQ;AACR,MAAMC,QAAQ,CAACC,MAA6B,CAAA;QAAEC,OAAOD,MAAM,SAAS,EAAE;IAAC,CAAA;AAGhE,MAAMF,gBAAwC,CAACI,QAAU;IAC9D,MAAM,EAAEC,WAAWC,IAAG,EAAEJ,KAAM,KAAK,CAAA,EAAEK,OAAQ,GAAE,EAAE,GAAGH;IAEpD,QAAQ;IACR,MAAM,CAACI,MAAMC,QAAQ,GAAGC,IAAAA,eAAQ,EAAgC,EAAE;IAElE,UAAU;IACVC,IAAAA,gBAAS,EAAC,IAAM,KAAK,AAAC,CAAA,UAAY;YAChC,MAAMH,OAAsC,EAAE;YAE9C,WAAW,MAAMI,OAAON,IAAIO,YAAY,GAAI;gBAC1CL,KAAKM,IAAI,CAAC;oBAACF;oBAAK,IAAI;iBAAC;YACvB;YAEA,WAAW,MAAMA,QAAON,IAAIS,eAAe,GAAI;gBAC7CP,KAAKM,IAAI,CAAC;oBAACF;oBAAK,IAAI;iBAAC;YACvB;YAEAH,QAAQD;QACV,CAAA,KAAM;QAACF;KAAI;IAEX,SAAS;IACT,qBACE,sBAACU,SAAI;;0BACH,qBAACA,SAAI;gBAAE,GAAGf,MAAMC,IAAI;0BAAII,IAAIW,IAAI;;YAC9BX,IAAIY,OAAO,kBAAK,sBAACF,SAAI;gBAACb,OAAM;;oBAAO;oBAAGG,IAAIY,OAAO;;;0BACnD,qBAACC,YAAO;YAENX,KAAKY,GAAG,CAAC,CAAC,CAACR,KAAKS,MAAM,EAAEC,oBACxB,sBAACN,SAAI;;wBACDT;sCAAO,sBAACS,SAAI;4BAAE,GAAGf,MAAMC,IAAI;;gCAAIoB,QAAQd,KAAKe,MAAM,GAAG,IAAI,MAAM,GAAG;gCAAC;gCAAE;;;sCACvE,qBAACvB;4BACCK,WAAWO;4BACXV,KAAKmB,SAASnB;4BACdK,qBAAO;;oCAAIA;kDAAO,sBAACS,SAAI;wCAAE,GAAGf,MAAMC,IAAI;;4CAAIoB,QAAQd,KAAKe,MAAM,GAAG,IAAI,MAAM,GAAG;4CAAG;;;;;;;mBALzEX,IAAIK,IAAI;;;AAW3B","file":"workspace-tree.js"}
package/dist/utils.d.ts CHANGED
@@ -3,6 +3,7 @@ import { Arguments, Argv, CommandModule } from 'yargs';
3
3
  import { Awaitable } from './types';
4
4
  export declare function combine<T>(...generators: AsyncGenerator<T>[]): AsyncGenerator<T>;
5
5
  export declare function streamLines(task: SpawnTask, stream: SpawnTaskStream): AsyncGenerator<string>;
6
+ export declare function each<T>(generator: AsyncGenerator<T>, callback: (val: T) => void): Promise<void>;
6
7
  export interface Middleware<T = unknown, U = unknown> {
7
8
  builder?: (yargs: Argv<T>) => Argv<U>;
8
9
  handler(args: Arguments<U>): Awaitable<void>;