@jujulego/jill 2.0.0-beta.2 → 2.0.0-rc.2

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 (191) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +28 -0
  3. package/dist/commands/each.d.ts +16 -0
  4. package/dist/commands/each.d.ts.map +1 -0
  5. package/dist/commands/each.js +117 -0
  6. package/dist/commands/each.js.map +1 -0
  7. package/dist/commands/{list.command.d.ts → list.d.ts} +3 -5
  8. package/dist/commands/list.d.ts.map +1 -0
  9. package/dist/commands/list.js +170 -0
  10. package/dist/commands/list.js.map +1 -0
  11. package/dist/commands/run.d.ts +8 -0
  12. package/dist/commands/run.d.ts.map +1 -0
  13. package/dist/commands/run.js +59 -0
  14. package/dist/commands/run.js.map +1 -0
  15. package/dist/commands/tree.d.ts +3 -0
  16. package/dist/commands/tree.d.ts.map +1 -0
  17. package/dist/commands/tree.js +35 -0
  18. package/dist/commands/tree.js.map +1 -0
  19. package/dist/filters/affected.filter.d.ts +11 -0
  20. package/dist/filters/affected.filter.d.ts.map +1 -0
  21. package/dist/filters/affected.filter.js +82 -0
  22. package/dist/filters/affected.filter.js.map +1 -0
  23. package/dist/filters/index.d.ts +4 -0
  24. package/dist/filters/index.d.ts.map +1 -0
  25. package/dist/filters/index.js +21 -0
  26. package/dist/filters/index.js.map +1 -0
  27. package/dist/filters/pipeline.d.ts +11 -0
  28. package/dist/filters/pipeline.d.ts.map +1 -0
  29. package/dist/filters/pipeline.js +34 -0
  30. package/dist/filters/pipeline.js.map +1 -0
  31. package/dist/filters/private.filter.d.ts +7 -0
  32. package/dist/filters/private.filter.d.ts.map +1 -0
  33. package/dist/filters/private.filter.js +20 -0
  34. package/dist/filters/private.filter.js.map +1 -0
  35. package/dist/filters/scripts.filter.d.ts +7 -0
  36. package/dist/filters/scripts.filter.d.ts.map +1 -0
  37. package/dist/filters/scripts.filter.js +21 -0
  38. package/dist/filters/scripts.filter.js.map +1 -0
  39. package/dist/git.d.ts +16 -0
  40. package/dist/git.d.ts.map +1 -0
  41. package/dist/git.js +94 -0
  42. package/dist/git.js.map +1 -0
  43. package/dist/index.d.ts +7 -4
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +19 -33
  46. package/dist/index.js.map +1 -1
  47. package/dist/main.d.ts.map +1 -1
  48. package/dist/main.js +26 -62
  49. package/dist/main.js.map +1 -1
  50. package/dist/middlewares/global-config.d.ts +5 -0
  51. package/dist/middlewares/global-config.d.ts.map +1 -0
  52. package/dist/middlewares/global-config.js +29 -0
  53. package/dist/middlewares/global-config.js.map +1 -0
  54. package/dist/middlewares/index.d.ts +4 -0
  55. package/dist/middlewares/index.d.ts.map +1 -0
  56. package/dist/middlewares/index.js +21 -0
  57. package/dist/middlewares/index.js.map +1 -0
  58. package/dist/middlewares/load-project.d.ts +6 -0
  59. package/dist/middlewares/load-project.d.ts.map +1 -0
  60. package/dist/middlewares/load-project.js +41 -0
  61. package/dist/middlewares/load-project.js.map +1 -0
  62. package/dist/middlewares/load-workspace.d.ts +3 -0
  63. package/dist/middlewares/load-workspace.d.ts.map +1 -0
  64. package/dist/middlewares/load-workspace.js +42 -0
  65. package/dist/middlewares/load-workspace.js.map +1 -0
  66. package/dist/middlewares/setup-ink.d.ts +1 -0
  67. package/dist/middlewares/setup-ink.d.ts.map +1 -0
  68. package/dist/middlewares/setup-ink.js +22 -0
  69. package/dist/middlewares/setup-ink.js.map +1 -0
  70. package/dist/project/index.d.ts +2 -0
  71. package/dist/project/index.d.ts.map +1 -0
  72. package/dist/project/index.js +19 -0
  73. package/dist/project/index.js.map +1 -0
  74. package/dist/project/project.d.ts +25 -0
  75. package/dist/project/project.d.ts.map +1 -0
  76. package/dist/project/project.js +190 -0
  77. package/dist/project/project.js.map +1 -0
  78. package/dist/project/workspace.d.ts +34 -0
  79. package/dist/project/workspace.d.ts.map +1 -0
  80. package/dist/project/workspace.js +173 -0
  81. package/dist/project/workspace.js.map +1 -0
  82. package/dist/services/index.d.ts +4 -0
  83. package/dist/services/index.d.ts.map +1 -0
  84. package/dist/services/index.js +21 -0
  85. package/dist/services/index.js.map +1 -0
  86. package/dist/services/inversify.config.d.ts +11 -0
  87. package/dist/services/inversify.config.d.ts.map +1 -0
  88. package/dist/services/inversify.config.js +34 -0
  89. package/dist/services/inversify.config.js.map +1 -0
  90. package/dist/services/logger.service.d.ts +6 -0
  91. package/dist/services/logger.service.d.ts.map +1 -0
  92. package/dist/services/logger.service.js +75 -0
  93. package/dist/services/logger.service.js.map +1 -0
  94. package/dist/services/spinner.service.d.ts +18 -0
  95. package/dist/services/spinner.service.d.ts.map +1 -0
  96. package/dist/services/spinner.service.js +68 -0
  97. package/dist/services/spinner.service.js.map +1 -0
  98. package/dist/services/task-manager.service.d.ts +1 -0
  99. package/dist/services/task-manager.service.d.ts.map +1 -0
  100. package/dist/services/task-manager.service.js +18 -0
  101. package/dist/services/task-manager.service.js.map +1 -0
  102. package/dist/types.d.ts +1 -0
  103. package/dist/types.d.ts.map +1 -0
  104. package/dist/types.js +7 -0
  105. package/dist/types.js.map +1 -0
  106. package/dist/ui/global-spinner.d.ts +2 -0
  107. package/dist/ui/global-spinner.d.ts.map +1 -0
  108. package/dist/ui/global-spinner.js +65 -0
  109. package/dist/ui/global-spinner.js.map +1 -0
  110. package/dist/ui/index.d.ts +7 -0
  111. package/dist/ui/index.d.ts.map +1 -0
  112. package/dist/ui/index.js +24 -0
  113. package/dist/ui/index.js.map +1 -0
  114. package/dist/ui/layout.d.ts +2 -0
  115. package/dist/ui/layout.d.ts.map +1 -0
  116. package/dist/ui/layout.js +20 -0
  117. package/dist/ui/layout.js.map +1 -0
  118. package/dist/ui/list.d.ts +6 -0
  119. package/dist/ui/list.d.ts.map +1 -0
  120. package/dist/ui/list.js +30 -0
  121. package/dist/ui/list.js.map +1 -0
  122. package/dist/{components/StaticLogs.d.ts → ui/static-logs.d.ts} +0 -0
  123. package/dist/ui/static-logs.d.ts.map +1 -0
  124. package/dist/ui/static-logs.js +63 -0
  125. package/dist/ui/static-logs.js.map +1 -0
  126. package/dist/ui/task-name.d.ts +6 -0
  127. package/dist/ui/task-name.d.ts.map +1 -0
  128. package/dist/ui/task-name.js +35 -0
  129. package/dist/ui/task-name.js.map +1 -0
  130. package/dist/ui/task-spinner.d.ts +6 -0
  131. package/dist/ui/task-spinner.d.ts.map +1 -0
  132. package/dist/ui/task-spinner.js +143 -0
  133. package/dist/ui/task-spinner.js.map +1 -0
  134. package/dist/ui/tasks-spinner.d.ts +6 -0
  135. package/dist/ui/tasks-spinner.d.ts.map +1 -0
  136. package/dist/ui/tasks-spinner.js +17 -0
  137. package/dist/ui/tasks-spinner.js.map +1 -0
  138. package/dist/{components/WorkspaceTree.d.ts → ui/workspace-tree.d.ts} +1 -1
  139. package/dist/ui/workspace-tree.d.ts.map +1 -0
  140. package/dist/ui/workspace-tree.js +87 -0
  141. package/dist/ui/workspace-tree.js.map +1 -0
  142. package/dist/utils.d.ts +13 -0
  143. package/dist/utils.d.ts.map +1 -0
  144. package/dist/utils.js +72 -0
  145. package/dist/utils.js.map +1 -0
  146. package/package.json +55 -56
  147. package/dist/application.context.d.ts +0 -28
  148. package/dist/application.context.d.ts.map +0 -1
  149. package/dist/application.context.js +0 -30
  150. package/dist/application.context.js.map +0 -1
  151. package/dist/application.d.ts +0 -7
  152. package/dist/application.d.ts.map +0 -1
  153. package/dist/application.js +0 -125
  154. package/dist/application.js.map +0 -1
  155. package/dist/command.d.ts +0 -8
  156. package/dist/command.d.ts.map +0 -1
  157. package/dist/command.js +0 -24
  158. package/dist/command.js.map +0 -1
  159. package/dist/commands/each.command.d.ts +0 -18
  160. package/dist/commands/each.command.d.ts.map +0 -1
  161. package/dist/commands/each.command.js +0 -176
  162. package/dist/commands/each.command.js.map +0 -1
  163. package/dist/commands/list.command.d.ts.map +0 -1
  164. package/dist/commands/list.command.js +0 -252
  165. package/dist/commands/list.command.js.map +0 -1
  166. package/dist/commands/run.command.d.ts +0 -12
  167. package/dist/commands/run.command.d.ts.map +0 -1
  168. package/dist/commands/run.command.js +0 -94
  169. package/dist/commands/run.command.js.map +0 -1
  170. package/dist/commands/tree.command.d.ts +0 -7
  171. package/dist/commands/tree.command.d.ts.map +0 -1
  172. package/dist/commands/tree.command.js +0 -35
  173. package/dist/commands/tree.command.js.map +0 -1
  174. package/dist/components/StaticLogs.d.ts.map +0 -1
  175. package/dist/components/StaticLogs.js +0 -77
  176. package/dist/components/StaticLogs.js.map +0 -1
  177. package/dist/components/WorkspaceTree.d.ts.map +0 -1
  178. package/dist/components/WorkspaceTree.js +0 -151
  179. package/dist/components/WorkspaceTree.js.map +0 -1
  180. package/dist/wrapper.d.ts +0 -6
  181. package/dist/wrapper.d.ts.map +0 -1
  182. package/dist/wrapper.js +0 -30
  183. package/dist/wrapper.js.map +0 -1
  184. package/dist/wrappers/project.wrapper.d.ts +0 -7
  185. package/dist/wrappers/project.wrapper.d.ts.map +0 -1
  186. package/dist/wrappers/project.wrapper.js +0 -105
  187. package/dist/wrappers/project.wrapper.js.map +0 -1
  188. package/dist/wrappers/workspace.wrapper.d.ts +0 -5
  189. package/dist/wrappers/workspace.wrapper.d.ts.map +0 -1
  190. package/dist/wrappers/workspace.wrapper.js +0 -108
  191. package/dist/wrappers/workspace.wrapper.js.map +0 -1
@@ -0,0 +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,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"]}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ _exportStar(require("./global-spinner"), exports);
6
+ _exportStar(require("./layout"), exports);
7
+ _exportStar(require("./list"), exports);
8
+ _exportStar(require("./static-logs"), exports);
9
+ _exportStar(require("./tasks-spinner"), exports);
10
+ _exportStar(require("./task-spinner"), exports);
11
+ _exportStar(require("./workspace-tree"), exports);
12
+ function _exportStar(from, to) {
13
+ Object.keys(from).forEach(function(k) {
14
+ if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) Object.defineProperty(to, k, {
15
+ enumerable: true,
16
+ get: function() {
17
+ return from[k];
18
+ }
19
+ });
20
+ });
21
+ return from;
22
+ }
23
+
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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 './tasks-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,2 @@
1
+ import { FC } from 'react';
2
+ export declare const Layout: FC;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["ui/layout.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAM3B,eAAO,MAAM,MAAM,EAAE,EAMpB,CAAC","file":"layout.d.ts","sourcesContent":["import { FC } from 'react';\n\nimport { GlobalSpinner } from './global-spinner';\nimport { StaticLogs } from './static-logs';\n\n// Component\nexport const Layout: FC = ({ children }) => (\n <>\n <StaticLogs />\n <GlobalSpinner />\n { children }\n </>\n);\n"]}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "Layout", {
6
+ enumerable: true,
7
+ get: ()=>Layout
8
+ });
9
+ const _jsxRuntime = require("react/jsx-runtime");
10
+ const _globalSpinner = require("./global-spinner");
11
+ const _staticLogs = require("./static-logs");
12
+ const Layout = ({ children })=>/*#__PURE__*/ (0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
13
+ children: [
14
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_staticLogs.StaticLogs, {}),
15
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_globalSpinner.GlobalSpinner, {}),
16
+ children
17
+ ]
18
+ });
19
+
20
+ //# sourceMappingURL=layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["ui/layout.js"],"sourcesContent":["import { FC } from 'react';\n\nimport { GlobalSpinner } from './global-spinner';\nimport { StaticLogs } from './static-logs';\n\n// Component\nexport const Layout: FC = ({ children }) => (\n <>\n <StaticLogs />\n <GlobalSpinner />\n { children }\n </>\n);\n"],"names":["Layout","children","StaticLogs","GlobalSpinner"],"mappings":"AAAA;;;;+BAMaA;;aAAAA;;;+BAJiB;4BACH;AAGpB,MAAMA,SAAa,CAAC,EAAEC,SAAQ,EAAE,iBACrC;;0BACE,qBAACC,sBAAU;0BACX,qBAACC,4BAAa;YACZF","file":"layout.js"}
@@ -0,0 +1,6 @@
1
+ import { ReactElement } from 'react';
2
+ export interface ListProps<T extends Record<string, unknown>> {
3
+ items: T[];
4
+ headers?: boolean;
5
+ }
6
+ export declare function List<T extends Record<string, unknown>>({ items, headers }: ListProps<T>): ReactElement;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["ui/list.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAKrC,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC1D,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAGD,wBAAgB,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,YAAY,CAetG","file":"list.d.ts","sourcesContent":["import { Box, Text } from 'ink';\nimport { ReactElement } from 'react';\n\nimport { capitalize } from '../utils';\n\n// Types\nexport interface ListProps<T extends Record<string, unknown>> {\n items: T[];\n headers?: boolean;\n}\n\n// Component\nexport function List<T extends Record<string, unknown>>({ items, headers }: ListProps<T>): ReactElement {\n return (\n <Box>\n { Object.keys(items[0]).map((key) => (\n <Box key={key} flexDirection=\"column\" marginRight={2}>\n { headers && (\n <Text bold>{ capitalize(key) }</Text>\n ) }\n { items.map((item, idx) => (\n <Text key={idx}>{ item[key] }</Text>\n )) }\n </Box>\n )) }\n </Box>\n );\n}\n"]}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "List", {
6
+ enumerable: true,
7
+ get: ()=>List
8
+ });
9
+ const _jsxRuntime = require("react/jsx-runtime");
10
+ const _ink = require("ink");
11
+ const _utils = require("../utils");
12
+ function List({ items , headers }) {
13
+ return /*#__PURE__*/ (0, _jsxRuntime.jsx)(_ink.Box, {
14
+ children: Object.keys(items[0]).map((key)=>/*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Box, {
15
+ flexDirection: "column",
16
+ marginRight: 2,
17
+ children: [
18
+ headers && /*#__PURE__*/ (0, _jsxRuntime.jsx)(_ink.Text, {
19
+ bold: true,
20
+ children: (0, _utils.capitalize)(key)
21
+ }),
22
+ items.map((item, idx)=>/*#__PURE__*/ (0, _jsxRuntime.jsx)(_ink.Text, {
23
+ children: item[key]
24
+ }, idx))
25
+ ]
26
+ }, key))
27
+ });
28
+ }
29
+
30
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["ui/list.js"],"sourcesContent":["import { Box, Text } from 'ink';\nimport { ReactElement } from 'react';\n\nimport { capitalize } from '../utils';\n\n// Types\nexport interface ListProps<T extends Record<string, unknown>> {\n items: T[];\n headers?: boolean;\n}\n\n// Component\nexport function List<T extends Record<string, unknown>>({ items, headers }: ListProps<T>): ReactElement {\n return (\n <Box>\n { Object.keys(items[0]).map((key) => (\n <Box key={key} flexDirection=\"column\" marginRight={2}>\n { headers && (\n <Text bold>{ capitalize(key) }</Text>\n ) }\n { items.map((item, idx) => (\n <Text key={idx}>{ item[key] }</Text>\n )) }\n </Box>\n )) }\n </Box>\n );\n}\n"],"names":["List","items","headers","Box","Object","keys","map","key","flexDirection","marginRight","Text","bold","capitalize","item","idx"],"mappings":"AAAA;;;;+BAYgBA;;aAAAA;;;qBAZU;uBAGC;AASpB,SAASA,KAAwC,EAAEC,MAAK,EAAEC,QAAO,EAAgB,EAAgB;IACtG,qBACE,qBAACC,QAAG;kBACAC,OAAOC,IAAI,CAACJ,KAAK,CAAC,EAAE,EAAEK,GAAG,CAAC,CAACC,oBAC3B,sBAACJ,QAAG;gBAAWK,eAAc;gBAASC,aAAa;;oBAC/CP,yBACA,qBAACQ,SAAI;wBAACC,IAAI;kCAAGC,IAAAA,iBAAU,EAACL;;oBAExBN,MAAMK,GAAG,CAAC,CAACO,MAAMC,oBACjB,qBAACJ,SAAI;sCAAaG,IAAI,CAACN,IAAI;2BAAhBO;;eALLP;;AAWlB","file":"list.js"}
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "StaticLogs", {
6
+ enumerable: true,
7
+ get: ()=>StaticLogs
8
+ });
9
+ const _ink = require("ink");
10
+ const _react = require("react");
11
+ const _winstonTransport = /*#__PURE__*/ _interopRequireDefault(require("winston-transport"));
12
+ const _services = require("../services");
13
+ const _winston = /*#__PURE__*/ _interopRequireDefault(require("winston"));
14
+ function _interopRequireDefault(obj) {
15
+ return obj && obj.__esModule ? obj : {
16
+ default: obj
17
+ };
18
+ }
19
+ // Constants
20
+ const MESSAGE = Symbol.for('message');
21
+ const StaticLogs = ()=>{
22
+ // State
23
+ const { write } = (0, _ink.useStderr)();
24
+ // Effect
25
+ (0, _react.useLayoutEffect)(()=>{
26
+ const logger = _services.container.get(_services.Logger);
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 {
35
+ // Constructor
36
+ constructor(){
37
+ super({
38
+ format: _services.consoleFormat
39
+ });
40
+ }
41
+ // Methods
42
+ log(info, next) {
43
+ setTimeout(()=>{
44
+ this.emit('logged', info);
45
+ }, 0);
46
+ write(info[MESSAGE] + '\n');
47
+ next();
48
+ }
49
+ };
50
+ logger.add(transport1);
51
+ return ()=>{
52
+ logger.remove(transport1);
53
+ logger.add(new _winston.default.transports.Console({
54
+ format: _services.consoleFormat
55
+ }));
56
+ };
57
+ }, [
58
+ write
59
+ ]);
60
+ return null;
61
+ };
62
+
63
+ //# sourceMappingURL=static-logs.js.map
@@ -0,0 +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';\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 TaskNameProps {
4
+ task: Task;
5
+ }
6
+ export declare const TaskName: FC<TaskNameProps>;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["ui/task-name.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAe,MAAM,iBAAiB,CAAC;AAEpD,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAK3B,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,IAAI,CAAC;CACZ;AAQD,eAAO,MAAM,QAAQ,EAAE,EAAE,CAAC,aAAa,CAUtC,CAAC","file":"task-name.d.ts","sourcesContent":["import { Task, TaskContext } from '@jujulego/tasks';\nimport { Text } from 'ink';\nimport { FC } from 'react';\n\nimport { WorkspaceContext } from '../project';\n\n// Types\nexport interface TaskNameProps {\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 TaskName: FC<TaskNameProps> = ({ task }) => {\n if (isWorkspaceCtx(task.context)) {\n return (\n <Text>\n Running <Text bold>{ task.context.script }</Text> in { task.context.workspace.name }\n </Text>\n );\n } else {\n return <Text>{ task.name }</Text>;\n }\n};\n"]}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "TaskName", {
6
+ enumerable: true,
7
+ get: ()=>TaskName
8
+ });
9
+ const _jsxRuntime = require("react/jsx-runtime");
10
+ const _ink = require("ink");
11
+ // Utils
12
+ function isWorkspaceCtx(ctx) {
13
+ return 'workspace' in ctx;
14
+ }
15
+ const TaskName = ({ task })=>{
16
+ if (isWorkspaceCtx(task.context)) {
17
+ return /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Text, {
18
+ children: [
19
+ "Running ",
20
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_ink.Text, {
21
+ bold: true,
22
+ children: task.context.script
23
+ }),
24
+ " in ",
25
+ task.context.workspace.name
26
+ ]
27
+ });
28
+ } else {
29
+ return /*#__PURE__*/ (0, _jsxRuntime.jsx)(_ink.Text, {
30
+ children: task.name
31
+ });
32
+ }
33
+ };
34
+
35
+ //# sourceMappingURL=task-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["ui/task-name.js"],"sourcesContent":["import { Task, TaskContext } from '@jujulego/tasks';\nimport { Text } from 'ink';\nimport { FC } from 'react';\n\nimport { WorkspaceContext } from '../project';\n\n// Types\nexport interface TaskNameProps {\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 TaskName: FC<TaskNameProps> = ({ task }) => {\n if (isWorkspaceCtx(task.context)) {\n return (\n <Text>\n Running <Text bold>{ task.context.script }</Text> in { task.context.workspace.name }\n </Text>\n );\n } else {\n return <Text>{ task.name }</Text>;\n }\n};\n"],"names":["TaskName","isWorkspaceCtx","ctx","task","context","Text","bold","script","workspace","name"],"mappings":"AAAA;;;;+BAiBaA;;aAAAA;;;qBAhBQ;AAUrB,QAAQ;AACR,SAASC,eAAeC,GAA0B,EAAqC;IACrF,OAAO,eAAeA;AACxB;AAGO,MAAMF,WAA8B,CAAC,EAAEG,KAAI,EAAE,GAAK;IACvD,IAAIF,eAAeE,KAAKC,OAAO,GAAG;QAChC,qBACE,sBAACC,SAAI;;gBAAC;8BACI,qBAACA,SAAI;oBAACC,IAAI;8BAAGH,KAAKC,OAAO,CAACG,MAAM;;gBAAS;gBAAMJ,KAAKC,OAAO,CAACI,SAAS,CAACC,IAAI;;;IAGxF,OAAO;QACL,qBAAO,qBAACJ,SAAI;sBAAGF,KAAKM,IAAI;;IAC1B,CAAC;AACH","file":"task-name.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":"AACA,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,CA0E5C,CAAC","file":"task-spinner.d.ts","sourcesContent":["import { waitForEvent } from '@jujulego/event-tree';\nimport { 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 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) {\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\" />{' '}<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"]}
@@ -0,0 +1,143 @@
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 _eventTree = require("@jujulego/event-tree");
11
+ const _ink = require("ink");
12
+ const _inkSpinner = /*#__PURE__*/ _interopRequireDefault(require("ink-spinner"));
13
+ const _logSymbols = /*#__PURE__*/ _interopRequireDefault(require("log-symbols"));
14
+ const _ms = /*#__PURE__*/ _interopRequireDefault(require("ms"));
15
+ const _react = require("react");
16
+ const _taskName = require("./task-name");
17
+ function _interopRequireDefault(obj) {
18
+ return obj && obj.__esModule ? obj : {
19
+ default: obj
20
+ };
21
+ }
22
+ const TaskSpinner = ({ task })=>{
23
+ // State
24
+ const [status, setStatus] = (0, _react.useState)(task.status);
25
+ const [time, setTime] = (0, _react.useState)(0);
26
+ // Effects
27
+ (0, _react.useLayoutEffect)(()=>{
28
+ return task.subscribe('status', (event)=>{
29
+ setStatus(event.status);
30
+ });
31
+ }, [
32
+ task
33
+ ]);
34
+ (0, _react.useLayoutEffect)(()=>{
35
+ const ctrl = new AbortController();
36
+ (async ()=>{
37
+ try {
38
+ if ([
39
+ 'blocked',
40
+ 'ready'
41
+ ]?.includes(task.status)) {
42
+ await (0, _eventTree.waitForEvent)(task, 'status.running', {
43
+ signal: ctrl.signal
44
+ });
45
+ }
46
+ const start = Date.now();
47
+ if (task.status === 'running') {
48
+ await Promise.race([
49
+ (0, _eventTree.waitForEvent)(task, 'status.done', {
50
+ signal: ctrl.signal
51
+ }),
52
+ (0, _eventTree.waitForEvent)(task, 'status.failed', {
53
+ signal: ctrl.signal
54
+ })
55
+ ]);
56
+ }
57
+ setTime(Date.now() - start);
58
+ } catch (err) {
59
+ if (err) {
60
+ throw err;
61
+ }
62
+ }
63
+ })();
64
+ return ()=>ctrl.abort();
65
+ }, [
66
+ task
67
+ ]);
68
+ // Render
69
+ switch(status){
70
+ case 'blocked':
71
+ case 'ready':
72
+ return /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Text, {
73
+ color: "grey",
74
+ children: [
75
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_inkSpinner.default, {
76
+ type: "line2"
77
+ }),
78
+ ' ',
79
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_taskName.TaskName, {
80
+ task: task
81
+ })
82
+ ]
83
+ });
84
+ case 'running':
85
+ return /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Text, {
86
+ children: [
87
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_inkSpinner.default, {}),
88
+ ' ',
89
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_taskName.TaskName, {
90
+ task: task
91
+ })
92
+ ]
93
+ });
94
+ case 'done':
95
+ return /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Text, {
96
+ children: [
97
+ /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Text, {
98
+ color: "green",
99
+ children: [
100
+ _logSymbols.default.success,
101
+ ' ',
102
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_taskName.TaskName, {
103
+ task: task
104
+ })
105
+ ]
106
+ }),
107
+ /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Text, {
108
+ color: "magenta",
109
+ children: [
110
+ ' ',
111
+ "took ",
112
+ (0, _ms.default)(time)
113
+ ]
114
+ })
115
+ ]
116
+ });
117
+ case 'failed':
118
+ return /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Text, {
119
+ children: [
120
+ /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Text, {
121
+ color: "red",
122
+ children: [
123
+ _logSymbols.default.error,
124
+ ' ',
125
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_taskName.TaskName, {
126
+ task: task
127
+ })
128
+ ]
129
+ }),
130
+ /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Text, {
131
+ color: "magenta",
132
+ children: [
133
+ ' ',
134
+ "took ",
135
+ (0, _ms.default)(time)
136
+ ]
137
+ })
138
+ ]
139
+ });
140
+ }
141
+ };
142
+
143
+ //# sourceMappingURL=task-spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["ui/task-spinner.js"],"sourcesContent":["import { waitForEvent } from '@jujulego/event-tree';\nimport { 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 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) {\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\" />{' '}<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","ctrl","AbortController","includes","waitForEvent","signal","start","Date","now","Promise","race","err","abort","Text","color","Spinner","type","TaskName","symbols","success","ms","error"],"mappings":"AAAA;;;;+BAgBaA;;aAAAA;;;2BAhBgB;qBAER;iEACD;iEACA;yDACL;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,MAAMG,OAAO,IAAIC;QAEhB,CAAA,UAAY;YACX,IAAI;gBACF,IAAI;oBAAC;oBAAW;iBAAQ,EAAEC,SAASX,KAAKC,MAAM,GAAG;oBAC/C,MAAMW,IAAAA,uBAAY,EAACZ,MAAM,kBAAkB;wBAAEa,QAAQJ,KAAKI,MAAM;oBAAC;gBACnE,CAAC;gBAED,MAAMC,QAAQC,KAAKC,GAAG;gBAEtB,IAAIhB,KAAKC,MAAM,KAAK,WAAW;oBAC7B,MAAMgB,QAAQC,IAAI,CAAC;wBACjBN,IAAAA,uBAAY,EAACZ,MAAM,eAAe;4BAAEa,QAAQJ,KAAKI,MAAM;wBAAC;wBACxDD,IAAAA,uBAAY,EAACZ,MAAM,iBAAiB;4BAAEa,QAAQJ,KAAKI,MAAM;wBAAC;qBAC3D;gBACH,CAAC;gBAEDR,QAAQU,KAAKC,GAAG,KAAKF;YACvB,EAAE,OAAOK,KAAK;gBACZ,IAAIA,KAAK;oBACP,MAAMA,IAAI;gBACZ,CAAC;YACH;QACF,CAAA;QAEA,OAAO,IAAMV,KAAKW,KAAK;IACzB,GAAG;QAACpB;KAAK;IAET,SAAS;IACT,OAAQC;QACN,KAAK;QACL,KAAK;YACH,qBACE,sBAACoB,SAAI;gBAACC,OAAM;;kCACV,qBAACC,mBAAO;wBAACC,MAAK;;oBAAW;kCAAI,qBAACC,kBAAQ;wBAACzB,MAAMA;;;;QAInD,KAAK;YACH,qBACE,sBAACqB,SAAI;;kCACH,qBAACE,mBAAO;oBAAI;kCAAI,qBAACE,kBAAQ;wBAACzB,MAAMA;;;;QAItC,KAAK;YACH,qBACE,sBAACqB,SAAI;;kCACH,sBAACA,SAAI;wBAACC,OAAM;;4BAAUI,mBAAO,CAACC,OAAO;4BAAG;0CAAI,qBAACF,kBAAQ;gCAACzB,MAAMA;;;;kCAC5D,sBAACqB,SAAI;wBAACC,OAAM;;4BAAW;4BAAI;4BAAOM,IAAAA,WAAE,EAACxB;;;;;QAI3C,KAAK;YACH,qBACE,sBAACiB,SAAI;;kCACH,sBAACA,SAAI;wBAACC,OAAM;;4BAAQI,mBAAO,CAACG,KAAK;4BAAG;0CAAI,qBAACJ,kBAAQ;gCAACzB,MAAMA;;;;kCACxD,sBAACqB,SAAI;wBAACC,OAAM;;4BAAW;4BAAI;4BAAOM,IAAAA,WAAE,EAACxB;;;;;IAG7C;AACF","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"}
@@ -1,5 +1,5 @@
1
- import { Workspace } from '@jujulego/jill-core';
2
1
  import { FC, ReactElement } from 'react';
2
+ import { Workspace } from '../project';
3
3
  export interface WorkspaceTreeProps {
4
4
  workspace: Workspace;
5
5
  dev?: boolean;
@@ -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"}
@@ -0,0 +1,13 @@
1
+ import { SpawnTask, SpawnTaskStream } from '@jujulego/tasks';
2
+ import { Arguments, Argv, CommandModule } from 'yargs';
3
+ import { Awaitable } from './types';
4
+ export declare function combine<T>(...generators: AsyncGenerator<T>[]): AsyncGenerator<T>;
5
+ export declare function streamLines(task: SpawnTask, stream: SpawnTaskStream): AsyncGenerator<string>;
6
+ export interface Middleware<T = unknown, U = unknown> {
7
+ builder?: (yargs: Argv<T>) => Argv<U>;
8
+ handler(args: Arguments<U>): Awaitable<void>;
9
+ }
10
+ export declare function applyMiddlewares<T>(yargs: Argv<T>, middlewares: Middleware[]): Argv<T>;
11
+ export declare function defineCommand<T, U>(command: CommandModule<T, U>): CommandModule<T, U>;
12
+ export declare function defineMiddleware<T, U>(middleware: Middleware<T, U>): Middleware<T, U>;
13
+ export declare function capitalize(txt: string): string;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGpC,wBAAuB,OAAO,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC,CAIvF;AAED,wBAAuB,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,GAAG,cAAc,CAAC,MAAM,CAAC,CA8BnG;AAGD,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO;IAClD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;IACtC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;CAC9C;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAYtF;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAErF;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAErF;AAGD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9C","file":"utils.d.ts","sourcesContent":["import { streamEvents } from '@jujulego/event-tree';\nimport { SpawnTask, SpawnTaskStream } from '@jujulego/tasks';\nimport { Arguments, Argv, CommandModule } from 'yargs';\nimport { Awaitable } from './types';\n\n// Stream utils\nexport async function* combine<T>(...generators: AsyncGenerator<T>[]): AsyncGenerator<T> {\n for (const gen of generators) {\n yield* gen;\n }\n}\n\nexport async function *streamLines(task: SpawnTask, stream: SpawnTaskStream): AsyncGenerator<string> {\n // Abort\n const ctrl = new AbortController();\n\n task.subscribe('status.done', () => ctrl.abort());\n task.subscribe('status.failed', () => ctrl.abort());\n\n // Stream\n let current = '';\n\n try {\n for await (const chunk of streamEvents(task, `stream.${stream}`, { signal: ctrl.signal })) {\n const data = current + chunk.data.toString('utf-8');\n const lines = data.split(/\\r?\\n/g);\n\n current = lines.pop() ?? '';\n\n for (const line of lines) {\n yield line;\n }\n }\n } catch (err) {\n if (task.exitCode !== 0) {\n throw err;\n }\n\n if (current) {\n yield current;\n }\n }\n}\n\n// Command utils\nexport interface Middleware<T = unknown, U = unknown> {\n builder?: (yargs: Argv<T>) => Argv<U>;\n handler(args: Arguments<U>): Awaitable<void>;\n}\n\nexport function applyMiddlewares<T>(yargs: Argv<T>, middlewares: Middleware[]): Argv<T> {\n let tmp: Argv<unknown> = yargs;\n\n for (const middleware of middlewares) {\n if (middleware.builder) {\n tmp = middleware.builder(tmp);\n }\n\n tmp.middleware(middleware.handler);\n }\n\n return tmp as Argv<T>;\n}\n\nexport function defineCommand<T, U>(command: CommandModule<T, U>): CommandModule<T, U> {\n return command;\n}\n\nexport function defineMiddleware<T, U>(middleware: Middleware<T, U>): Middleware<T, U> {\n return middleware;\n}\n\n// String utils\nexport function capitalize(txt: string): string {\n return txt.charAt(0).toUpperCase() + txt.substring(1).toLowerCase();\n}\n"]}