@jujulego/jill 2.0.1 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/dist/commands/each.js +7 -7
  2. package/dist/commands/each.js.map +1 -1
  3. package/dist/commands/list.js +8 -8
  4. package/dist/commands/list.js.map +1 -1
  5. package/dist/commands/run.js +6 -6
  6. package/dist/commands/run.js.map +1 -1
  7. package/dist/commands/tree.js +6 -6
  8. package/dist/commands/tree.js.map +1 -1
  9. package/dist/filters/affected.filter.js +2 -2
  10. package/dist/filters/affected.filter.js.map +1 -1
  11. package/dist/filters/index.js +1 -1
  12. package/dist/filters/index.js.map +1 -1
  13. package/dist/filters/pipeline.js +1 -1
  14. package/dist/filters/pipeline.js.map +1 -1
  15. package/dist/filters/private.filter.js +1 -1
  16. package/dist/filters/private.filter.js.map +1 -1
  17. package/dist/filters/scripts.filter.js +1 -1
  18. package/dist/filters/scripts.filter.js.map +1 -1
  19. package/dist/git.js +3 -3
  20. package/dist/git.js.map +1 -1
  21. package/dist/main.js +3 -3
  22. package/dist/main.js.map +1 -1
  23. package/dist/middlewares/global-config.js +3 -3
  24. package/dist/middlewares/global-config.js.map +1 -1
  25. package/dist/middlewares/index.js +1 -1
  26. package/dist/middlewares/index.js.map +1 -1
  27. package/dist/middlewares/load-project.js +4 -4
  28. package/dist/middlewares/load-project.js.map +1 -1
  29. package/dist/middlewares/load-workspace.js +4 -4
  30. package/dist/middlewares/load-workspace.js.map +1 -1
  31. package/dist/middlewares/setup-ink.js +4 -4
  32. package/dist/middlewares/setup-ink.js.map +1 -1
  33. package/dist/project/index.js +1 -1
  34. package/dist/project/index.js.map +1 -1
  35. package/dist/project/project.js +4 -4
  36. package/dist/project/project.js.map +1 -1
  37. package/dist/project/workspace.js +3 -3
  38. package/dist/project/workspace.js.map +1 -1
  39. package/dist/services/index.js +1 -1
  40. package/dist/services/index.js.map +1 -1
  41. package/dist/services/inversify.config.js +1 -1
  42. package/dist/services/inversify.config.js.map +1 -1
  43. package/dist/services/logger.service.js +1 -1
  44. package/dist/services/logger.service.js.map +1 -1
  45. package/dist/services/spinner.service.js +1 -1
  46. package/dist/services/spinner.service.js.map +1 -1
  47. package/dist/services/task-manager.service.js +1 -1
  48. package/dist/services/task-manager.service.js.map +1 -1
  49. package/dist/tsconfig.tsbuildinfo +1 -0
  50. package/dist/types.js +1 -1
  51. package/dist/types.js.map +1 -1
  52. package/dist/ui/global-spinner.js +2 -2
  53. package/dist/ui/global-spinner.js.map +1 -1
  54. package/dist/ui/index.js +1 -1
  55. package/dist/ui/index.js.map +1 -1
  56. package/dist/ui/layout.js +1 -1
  57. package/dist/ui/layout.js.map +1 -1
  58. package/dist/ui/list.js +3 -3
  59. package/dist/ui/list.js.map +1 -1
  60. package/dist/ui/static-logs.js +2 -2
  61. package/dist/ui/static-logs.js.map +1 -1
  62. package/dist/ui/task-name.js +1 -1
  63. package/dist/ui/task-name.js.map +1 -1
  64. package/dist/ui/task-spinner.js +1 -1
  65. package/dist/ui/task-spinner.js.map +1 -1
  66. package/dist/ui/tasks-spinner.js +1 -1
  67. package/dist/ui/tasks-spinner.js.map +1 -1
  68. package/dist/ui/workspace-tree.js +1 -1
  69. package/dist/ui/workspace-tree.js.map +1 -1
  70. package/dist/utils/index.js +1 -1
  71. package/dist/utils/index.js.map +1 -1
  72. package/dist/utils/streams.js +1 -1
  73. package/dist/utils/streams.js.map +1 -1
  74. package/dist/utils/string.js +1 -1
  75. package/dist/utils/string.js.map +1 -1
  76. package/dist/utils/yargs.js +1 -1
  77. package/dist/utils/yargs.js.map +1 -1
  78. package/package.json +28 -26
  79. package/dist/commands/each.d.ts +0 -16
  80. package/dist/commands/each.d.ts.map +0 -1
  81. package/dist/commands/list.d.ts +0 -23
  82. package/dist/commands/list.d.ts.map +0 -1
  83. package/dist/commands/run.d.ts +0 -8
  84. package/dist/commands/run.d.ts.map +0 -1
  85. package/dist/commands/tree.d.ts +0 -3
  86. package/dist/commands/tree.d.ts.map +0 -1
  87. package/dist/filters/affected.filter.d.ts +0 -11
  88. package/dist/filters/affected.filter.d.ts.map +0 -1
  89. package/dist/filters/index.d.ts +0 -4
  90. package/dist/filters/index.d.ts.map +0 -1
  91. package/dist/filters/pipeline.d.ts +0 -11
  92. package/dist/filters/pipeline.d.ts.map +0 -1
  93. package/dist/filters/private.filter.d.ts +0 -7
  94. package/dist/filters/private.filter.d.ts.map +0 -1
  95. package/dist/filters/scripts.filter.d.ts +0 -7
  96. package/dist/filters/scripts.filter.d.ts.map +0 -1
  97. package/dist/git.d.ts +0 -16
  98. package/dist/git.d.ts.map +0 -1
  99. package/dist/main.d.ts +0 -1
  100. package/dist/main.d.ts.map +0 -1
  101. package/dist/middlewares/global-config.d.ts +0 -5
  102. package/dist/middlewares/global-config.d.ts.map +0 -1
  103. package/dist/middlewares/index.d.ts +0 -4
  104. package/dist/middlewares/index.d.ts.map +0 -1
  105. package/dist/middlewares/load-project.d.ts +0 -6
  106. package/dist/middlewares/load-project.d.ts.map +0 -1
  107. package/dist/middlewares/load-workspace.d.ts +0 -3
  108. package/dist/middlewares/load-workspace.d.ts.map +0 -1
  109. package/dist/middlewares/setup-ink.d.ts +0 -1
  110. package/dist/middlewares/setup-ink.d.ts.map +0 -1
  111. package/dist/project/index.d.ts +0 -2
  112. package/dist/project/index.d.ts.map +0 -1
  113. package/dist/project/project.d.ts +0 -25
  114. package/dist/project/project.d.ts.map +0 -1
  115. package/dist/project/workspace.d.ts +0 -34
  116. package/dist/project/workspace.d.ts.map +0 -1
  117. package/dist/services/index.d.ts +0 -4
  118. package/dist/services/index.d.ts.map +0 -1
  119. package/dist/services/inversify.config.d.ts +0 -11
  120. package/dist/services/inversify.config.d.ts.map +0 -1
  121. package/dist/services/logger.service.d.ts +0 -6
  122. package/dist/services/logger.service.d.ts.map +0 -1
  123. package/dist/services/spinner.service.d.ts +0 -16
  124. package/dist/services/spinner.service.d.ts.map +0 -1
  125. package/dist/services/task-manager.service.d.ts +0 -1
  126. package/dist/services/task-manager.service.d.ts.map +0 -1
  127. package/dist/types.d.ts +0 -1
  128. package/dist/types.d.ts.map +0 -1
  129. package/dist/ui/global-spinner.d.ts +0 -2
  130. package/dist/ui/global-spinner.d.ts.map +0 -1
  131. package/dist/ui/index.d.ts +0 -8
  132. package/dist/ui/index.d.ts.map +0 -1
  133. package/dist/ui/layout.d.ts +0 -2
  134. package/dist/ui/layout.d.ts.map +0 -1
  135. package/dist/ui/list.d.ts +0 -6
  136. package/dist/ui/list.d.ts.map +0 -1
  137. package/dist/ui/static-logs.d.ts +0 -2
  138. package/dist/ui/static-logs.d.ts.map +0 -1
  139. package/dist/ui/task-name.d.ts +0 -6
  140. package/dist/ui/task-name.d.ts.map +0 -1
  141. package/dist/ui/task-spinner.d.ts +0 -6
  142. package/dist/ui/task-spinner.d.ts.map +0 -1
  143. package/dist/ui/tasks-spinner.d.ts +0 -6
  144. package/dist/ui/tasks-spinner.d.ts.map +0 -1
  145. package/dist/ui/workspace-tree.d.ts +0 -8
  146. package/dist/ui/workspace-tree.d.ts.map +0 -1
  147. package/dist/utils/index.d.ts +0 -3
  148. package/dist/utils/index.d.ts.map +0 -1
  149. package/dist/utils/streams.d.ts +0 -3
  150. package/dist/utils/streams.d.ts.map +0 -1
  151. package/dist/utils/string.d.ts +0 -1
  152. package/dist/utils/string.d.ts.map +0 -1
  153. package/dist/utils/yargs.d.ts +0 -9
  154. package/dist/utils/yargs.d.ts.map +0 -1
@@ -9,7 +9,7 @@ Object.defineProperty(exports, "StaticLogs", {
9
9
  const _ink = require("ink");
10
10
  const _react = require("react");
11
11
  const _winstonTransport = /*#__PURE__*/ _interopRequireDefault(require("winston-transport"));
12
- const _services = require("../services");
12
+ const _services = require("../services/index");
13
13
  const _winston = /*#__PURE__*/ _interopRequireDefault(require("winston"));
14
14
  function _interopRequireDefault(obj) {
15
15
  return obj && obj.__esModule ? obj : {
@@ -60,4 +60,4 @@ const StaticLogs = ()=>{
60
60
  return null;
61
61
  };
62
62
 
63
- //# sourceMappingURL=static-logs.js.map
63
+ //# sourceMappingURL=static-logs.js.map
@@ -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';\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"}
1
+ {"version":3,"sources":["../../src/ui/static-logs.tsx"],"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"}
@@ -32,4 +32,4 @@ const TaskName = ({ task })=>{
32
32
  }
33
33
  };
34
34
 
35
- //# sourceMappingURL=task-name.js.map
35
+ //# sourceMappingURL=task-name.js.map
@@ -1 +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"}
1
+ {"version":3,"sources":["../../src/ui/task-name.tsx"],"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"}
@@ -114,4 +114,4 @@ const TaskSpinner = ({ task })=>{
114
114
  }
115
115
  };
116
116
 
117
- //# sourceMappingURL=task-spinner.js.map
117
+ //# sourceMappingURL=task-spinner.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["ui/task-spinner.js"],"sourcesContent":["import { Task } from '@jujulego/tasks';\nimport { Text } from 'ink';\nimport Spinner from 'ink-spinner';\nimport symbols from 'log-symbols';\nimport ms from 'ms';\nimport { FC, useLayoutEffect, useState } from 'react';\n\nimport { TaskName } from './task-name';\n\n// Types\nexport interface TaskSpinnerProps {\n task: Task;\n}\n\n// Components\nexport const TaskSpinner: FC<TaskSpinnerProps> = ({ task }) => {\n // State\n const [status, setStatus] = useState(task.status);\n const [time, setTime] = useState(0);\n\n // Effects\n useLayoutEffect(() => {\n return task.subscribe('status', (event) => {\n setStatus(event.status);\n });\n }, [task]);\n\n useLayoutEffect(() => {\n return task.subscribe('completed', ({ duration }) => {\n setTime(duration);\n });\n }, [task]);\n\n // Render\n switch (status) {\n case 'blocked':\n case 'ready':\n return (\n <Text color=\"grey\">\n <Spinner type=\"line2\" />{' '}<TaskName task={task} />\n </Text>\n );\n\n case 'running':\n return (\n <Text>\n <Spinner />{' '}<TaskName task={task} />\n </Text>\n );\n\n case 'done':\n return (\n <Text>\n <Text color=\"green\">{ symbols.success }{' '}<TaskName task={task} /></Text>\n <Text color=\"magenta\">{' '}(took { ms(time) })</Text>\n </Text>\n );\n\n case 'failed':\n return (\n <Text>\n <Text color=\"red\">{ symbols.error }{' '}<TaskName task={task} /></Text>\n <Text color=\"magenta\">{' '}(took { ms(time) })</Text>\n </Text>\n );\n }\n};\n"],"names":["TaskSpinner","task","status","setStatus","useState","time","setTime","useLayoutEffect","subscribe","event","duration","Text","color","Spinner","type","TaskName","symbols","success","ms","error"],"mappings":"AAAA;;;;+BAeaA;;aAAAA;;;qBAdQ;iEACD;iEACA;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,OAAON,KAAKO,SAAS,CAAC,aAAa,CAAC,EAAEE,SAAQ,EAAE,GAAK;YACnDJ,QAAQI;QACV;IACF,GAAG;QAACT;KAAK;IAET,SAAS;IACT,OAAQC;QACN,KAAK;QACL,KAAK;YACH,qBACE,sBAACS,SAAI;gBAACC,OAAM;;kCACV,qBAACC,mBAAO;wBAACC,MAAK;;oBAAW;kCAAI,qBAACC,kBAAQ;wBAACd,MAAMA;;;;QAInD,KAAK;YACH,qBACE,sBAACU,SAAI;;kCACH,qBAACE,mBAAO;oBAAI;kCAAI,qBAACE,kBAAQ;wBAACd,MAAMA;;;;QAItC,KAAK;YACH,qBACE,sBAACU,SAAI;;kCACH,sBAACA,SAAI;wBAACC,OAAM;;4BAAUI,mBAAO,CAACC,OAAO;4BAAG;0CAAI,qBAACF,kBAAQ;gCAACd,MAAMA;;;;kCAC5D,sBAACU,SAAI;wBAACC,OAAM;;4BAAW;4BAAI;4BAAQM,IAAAA,WAAE,EAACb;4BAAO;;;;;QAInD,KAAK;YACH,qBACE,sBAACM,SAAI;;kCACH,sBAACA,SAAI;wBAACC,OAAM;;4BAAQI,mBAAO,CAACG,KAAK;4BAAG;0CAAI,qBAACJ,kBAAQ;gCAACd,MAAMA;;;;kCACxD,sBAACU,SAAI;wBAACC,OAAM;;4BAAW;4BAAI;4BAAQM,IAAAA,WAAE,EAACb;4BAAO;;;;;IAGrD;AACF","file":"task-spinner.js"}
1
+ {"version":3,"sources":["../../src/ui/task-spinner.tsx"],"sourcesContent":["import { Task } from '@jujulego/tasks';\nimport { Text } from 'ink';\nimport Spinner from 'ink-spinner';\nimport symbols from 'log-symbols';\nimport ms from 'ms';\nimport { FC, useLayoutEffect, useState } from 'react';\n\nimport { TaskName } from './task-name';\n\n// Types\nexport interface TaskSpinnerProps {\n task: Task;\n}\n\n// Components\nexport const TaskSpinner: FC<TaskSpinnerProps> = ({ task }) => {\n // State\n const [status, setStatus] = useState(task.status);\n const [time, setTime] = useState(0);\n\n // Effects\n useLayoutEffect(() => {\n return task.subscribe('status', (event) => {\n setStatus(event.status);\n });\n }, [task]);\n\n useLayoutEffect(() => {\n return task.subscribe('completed', ({ duration }) => {\n setTime(duration);\n });\n }, [task]);\n\n // Render\n switch (status) {\n case 'blocked':\n case 'ready':\n return (\n <Text color=\"grey\">\n <Spinner type=\"line2\" />{' '}<TaskName task={task} />\n </Text>\n );\n\n case 'running':\n return (\n <Text>\n <Spinner />{' '}<TaskName task={task} />\n </Text>\n );\n\n case 'done':\n return (\n <Text>\n <Text color=\"green\">{ symbols.success }{' '}<TaskName task={task} /></Text>\n <Text color=\"magenta\">{' '}(took { ms(time) })</Text>\n </Text>\n );\n\n case 'failed':\n return (\n <Text>\n <Text color=\"red\">{ symbols.error }{' '}<TaskName task={task} /></Text>\n <Text color=\"magenta\">{' '}(took { ms(time) })</Text>\n </Text>\n );\n }\n};\n"],"names":["TaskSpinner","task","status","setStatus","useState","time","setTime","useLayoutEffect","subscribe","event","duration","Text","color","Spinner","type","TaskName","symbols","success","ms","error"],"mappings":"AAAA;;;;+BAeaA;;aAAAA;;;qBAdQ;iEACD;iEACA;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,OAAON,KAAKO,SAAS,CAAC,aAAa,CAAC,EAAEE,SAAQ,EAAE,GAAK;YACnDJ,QAAQI;QACV;IACF,GAAG;QAACT;KAAK;IAET,SAAS;IACT,OAAQC;QACN,KAAK;QACL,KAAK;YACH,qBACE,sBAACS,SAAI;gBAACC,OAAM;;kCACV,qBAACC,mBAAO;wBAACC,MAAK;;oBAAW;kCAAI,qBAACC,kBAAQ;wBAACd,MAAMA;;;;QAInD,KAAK;YACH,qBACE,sBAACU,SAAI;;kCACH,qBAACE,mBAAO;oBAAI;kCAAI,qBAACE,kBAAQ;wBAACd,MAAMA;;;;QAItC,KAAK;YACH,qBACE,sBAACU,SAAI;;kCACH,sBAACA,SAAI;wBAACC,OAAM;;4BAAUI,mBAAO,CAACC,OAAO;4BAAG;0CAAI,qBAACF,kBAAQ;gCAACd,MAAMA;;;;kCAC5D,sBAACU,SAAI;wBAACC,OAAM;;4BAAW;4BAAI;4BAAQM,IAAAA,WAAE,EAACb;4BAAO;;;;;QAInD,KAAK;YACH,qBACE,sBAACM,SAAI;;kCACH,sBAACA,SAAI;wBAACC,OAAM;;4BAAQI,mBAAO,CAACG,KAAK;4BAAG;0CAAI,qBAACJ,kBAAQ;gCAACd,MAAMA;;;;kCACxD,sBAACU,SAAI;wBAACC,OAAM;;4BAAW;4BAAI;4BAAQM,IAAAA,WAAE,EAACb;4BAAO;;;;;IAGrD;AACF"}
@@ -36,4 +36,4 @@ const TasksSpinner = ({ manager })=>{
36
36
  });
37
37
  };
38
38
 
39
- //# sourceMappingURL=tasks-spinner.js.map
39
+ //# sourceMappingURL=tasks-spinner.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["ui/tasks-spinner.js"],"sourcesContent":["import { TaskManager } from '@jujulego/tasks';\nimport { FC, useLayoutEffect, useState } from 'react';\n\nimport { TaskSpinner } from './task-spinner';\n\n// Types\nexport interface TasksSpinnerProps {\n manager: TaskManager;\n}\n\n// Components\nexport const TasksSpinner: FC<TasksSpinnerProps> = ({ manager }) => {\n const [tasks, setTasks] = useState([...manager.tasks]);\n\n useLayoutEffect(() => {\n let dirty = false;\n\n return manager.subscribe('added', () => {\n if (!dirty) {\n dirty = true;\n\n queueMicrotask(() => {\n setTasks([...manager.tasks]);\n dirty = false;\n });\n }\n });\n }, [manager]);\n\n return (\n <>\n { tasks.map((task) => (\n <TaskSpinner key={task.id} task={task}/>\n )) }\n </>\n );\n};\n"],"names":["TasksSpinner","manager","tasks","setTasks","useState","useLayoutEffect","dirty","subscribe","queueMicrotask","map","task","TaskSpinner","id"],"mappings":"AAAA;;;;+BAWaA;;aAAAA;;;uBAViC;6BAElB;AAQrB,MAAMA,eAAsC,CAAC,EAAEC,QAAO,EAAE,GAAK;IAClE,MAAM,CAACC,OAAOC,SAAS,GAAGC,IAAAA,eAAQ,EAAC;WAAIH,QAAQC,KAAK;KAAC;IAErDG,IAAAA,sBAAe,EAAC,IAAM;QACpB,IAAIC,QAAQ,KAAK;QAEjB,OAAOL,QAAQM,SAAS,CAAC,SAAS,IAAM;YACtC,IAAI,CAACD,OAAO;gBACVA,QAAQ,IAAI;gBAEZE,eAAe,IAAM;oBACnBL,SAAS;2BAAIF,QAAQC,KAAK;qBAAC;oBAC3BI,QAAQ,KAAK;gBACf;YACF,CAAC;QACH;IACF,GAAG;QAACL;KAAQ;IAEZ,qBACE;kBACIC,MAAMO,GAAG,CAAC,CAACC,qBACX,qBAACC,wBAAW;gBAAeD,MAAMA;eAAfA,KAAKE,EAAE;;AAIjC","file":"tasks-spinner.js"}
1
+ {"version":3,"sources":["../../src/ui/tasks-spinner.tsx"],"sourcesContent":["import { TaskManager } from '@jujulego/tasks';\nimport { FC, useLayoutEffect, useState } from 'react';\n\nimport { TaskSpinner } from './task-spinner';\n\n// Types\nexport interface TasksSpinnerProps {\n manager: TaskManager;\n}\n\n// Components\nexport const TasksSpinner: FC<TasksSpinnerProps> = ({ manager }) => {\n const [tasks, setTasks] = useState([...manager.tasks]);\n\n useLayoutEffect(() => {\n let dirty = false;\n\n return manager.subscribe('added', () => {\n if (!dirty) {\n dirty = true;\n\n queueMicrotask(() => {\n setTasks([...manager.tasks]);\n dirty = false;\n });\n }\n });\n }, [manager]);\n\n return (\n <>\n { tasks.map((task) => (\n <TaskSpinner key={task.id} task={task}/>\n )) }\n </>\n );\n};\n"],"names":["TasksSpinner","manager","tasks","setTasks","useState","useLayoutEffect","dirty","subscribe","queueMicrotask","map","task","TaskSpinner","id"],"mappings":"AAAA;;;;+BAWaA;;aAAAA;;;uBAViC;6BAElB;AAQrB,MAAMA,eAAsC,CAAC,EAAEC,QAAO,EAAE,GAAK;IAClE,MAAM,CAACC,OAAOC,SAAS,GAAGC,IAAAA,eAAQ,EAAC;WAAIH,QAAQC,KAAK;KAAC;IAErDG,IAAAA,sBAAe,EAAC,IAAM;QACpB,IAAIC,QAAQ,KAAK;QAEjB,OAAOL,QAAQM,SAAS,CAAC,SAAS,IAAM;YACtC,IAAI,CAACD,OAAO;gBACVA,QAAQ,IAAI;gBAEZE,eAAe,IAAM;oBACnBL,SAAS;2BAAIF,QAAQC,KAAK;qBAAC;oBAC3BI,QAAQ,KAAK;gBACf;YACF,CAAC;QACH;IACF,GAAG;QAACL;KAAQ;IAEZ,qBACE;kBACIC,MAAMO,GAAG,CAAC,CAACC,qBACX,qBAACC,wBAAW;gBAAeD,MAAMA;eAAfA,KAAKE,EAAE;;AAIjC"}
@@ -85,4 +85,4 @@ const WorkspaceTree = (props)=>{
85
85
  });
86
86
  };
87
87
 
88
- //# sourceMappingURL=workspace-tree.js.map
88
+ //# sourceMappingURL=workspace-tree.js.map
@@ -1 +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 { (deps.length > 0) && <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 { (idx < deps.length - 1) && <Newline /> }\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","length","Newline","map","isDev","idx"],"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,kBAAI,sBAACF,SAAI;gBAACb,OAAM;;oBAAO;oBAAGG,IAAIY,OAAO;;;YAC/CV,KAAKW,MAAM,GAAG,mBAAM,qBAACC,YAAO;YAE7BZ,KAAKa,GAAG,CAAC,CAAC,CAACT,KAAKU,MAAM,EAAEC,oBACxB,sBAACP,SAAI;;wBACDT;sCAAO,sBAACS,SAAI;4BAAE,GAAGf,MAAMC,IAAI;;gCAAIqB,QAAQf,KAAKW,MAAM,GAAG,IAAI,MAAM,GAAG;gCAAC;gCAAE;;;sCACvE,qBAACnB;4BACCK,WAAWO;4BACXV,KAAKoB,SAASpB;4BACdK,qBAAO;;oCAAIA;kDAAO,sBAACS,SAAI;wCAAE,GAAGf,MAAMC,IAAI;;4CAAIqB,QAAQf,KAAKW,MAAM,GAAG,IAAI,MAAM,GAAG;4CAAG;;;;;;wBAE/EI,MAAMf,KAAKW,MAAM,GAAG,mBAAM,qBAACC,YAAO;;mBAP5BR,IAAIK,IAAI;;;AAY3B","file":"workspace-tree.js"}
1
+ {"version":3,"sources":["../../src/ui/workspace-tree.tsx"],"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 { (deps.length > 0) && <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 { (idx < deps.length - 1) && <Newline /> }\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","length","Newline","map","isDev","idx"],"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,kBAAI,sBAACF,SAAI;gBAACb,OAAM;;oBAAO;oBAAGG,IAAIY,OAAO;;;YAC/CV,KAAKW,MAAM,GAAG,mBAAM,qBAACC,YAAO;YAE7BZ,KAAKa,GAAG,CAAC,CAAC,CAACT,KAAKU,MAAM,EAAEC,oBACxB,sBAACP,SAAI;;wBACDT;sCAAO,sBAACS,SAAI;4BAAE,GAAGf,MAAMC,IAAI;;gCAAIqB,QAAQf,KAAKW,MAAM,GAAG,IAAI,MAAM,GAAG;gCAAC;gCAAE;;;sCACvE,qBAACnB;4BACCK,WAAWO;4BACXV,KAAKoB,SAASpB;4BACdK,qBAAO;;oCAAIA;kDAAO,sBAACS,SAAI;wCAAE,GAAGf,MAAMC,IAAI;;4CAAIqB,QAAQf,KAAKW,MAAM,GAAG,IAAI,MAAM,GAAG;4CAAG;;;;;;wBAE/EI,MAAMf,KAAKW,MAAM,GAAG,mBAAM,qBAACC,YAAO;;mBAP5BR,IAAIK,IAAI;;;AAY3B"}
@@ -17,4 +17,4 @@ function _exportStar(from, to) {
17
17
  return from;
18
18
  }
19
19
 
20
- //# sourceMappingURL=index.js.map
20
+ //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["utils/index.js"],"sourcesContent":["export * from './streams';\nexport * from './string';\nexport * from './yargs';\n"],"names":[],"mappings":"AAAA;;;;oBAAc;oBACA;oBACA","file":"index.js"}
1
+ {"version":3,"sources":["../../src/utils/index.ts"],"sourcesContent":["export * from './streams';\nexport * from './string';\nexport * from './yargs';\n"],"names":[],"mappings":"AAAA;;;;oBAAc;oBACA;oBACA"}
@@ -46,4 +46,4 @@ async function* streamLines(task, stream) {
46
46
  }
47
47
  }
48
48
 
49
- //# sourceMappingURL=streams.js.map
49
+ //# sourceMappingURL=streams.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["utils/streams.js"],"sourcesContent":["import { SpawnTask, SpawnTaskStream } from '@jujulego/tasks';\nimport { streamEvents } from '@jujulego/event-tree';\n\n// 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 const reason = new Error('aborted');\n\n task.subscribe('completed', () => ctrl.abort(reason));\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/);\n\n current = lines.pop() ?? '';\n\n for (const line of lines) {\n yield line;\n }\n }\n } catch (err) {\n if (err !== reason) {\n throw err;\n }\n\n if (current) {\n yield current;\n }\n }\n}\n"],"names":["combine","streamLines","generators","gen","task","stream","ctrl","AbortController","reason","Error","subscribe","abort","current","chunk","streamEvents","signal","data","toString","lines","split","pop","line","err"],"mappings":"AAAA;;;;;;;;;;;IAIuBA,OAAO,MAAPA;IAMAC,WAAW,MAAXA;;2BATM;AAGtB,gBAAgBD,QAAW,GAAGE,UAA+B,EAAqB;IACvF,KAAK,MAAMC,OAAOD,WAAY;QAC5B,OAAOC;IACT;AACF;AAEO,gBAAgBF,YAAYG,IAAe,EAAEC,MAAuB,EAA0B;IACnG,QAAQ;IACR,MAAMC,OAAO,IAAIC;IACjB,MAAMC,SAAS,IAAIC,MAAM;IAEzBL,KAAKM,SAAS,CAAC,aAAa,IAAMJ,KAAKK,KAAK,CAACH;IAE7C,SAAS;IACT,IAAII,UAAU;IAEd,IAAI;QACF,WAAW,MAAMC,SAASC,IAAAA,uBAAY,EAACV,MAAM,CAAC,OAAO,EAAEC,OAAO,CAAC,EAAE;YAAEU,QAAQT,KAAKS,MAAM;QAAC,GAAI;YACzF,MAAMC,OAAOJ,UAAUC,MAAMG,IAAI,CAACC,QAAQ,CAAC;YAC3C,MAAMC,QAAQF,KAAKG,KAAK,CAAC;YAEzBP,UAAUM,MAAME,GAAG,MAAM;YAEzB,KAAK,MAAMC,QAAQH,MAAO;gBACxB,MAAMG;YACR;QACF;IACF,EAAE,OAAOC,KAAK;QACZ,IAAIA,QAAQd,QAAQ;YAClB,MAAMc,IAAI;QACZ,CAAC;QAED,IAAIV,SAAS;YACX,MAAMA;QACR,CAAC;IACH;AACF","file":"streams.js"}
1
+ {"version":3,"sources":["../../src/utils/streams.ts"],"sourcesContent":["import { SpawnTask, SpawnTaskStream } from '@jujulego/tasks';\nimport { streamEvents } from '@jujulego/event-tree';\n\n// 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 const reason = new Error('aborted');\n\n task.subscribe('completed', () => ctrl.abort(reason));\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/);\n\n current = lines.pop() ?? '';\n\n for (const line of lines) {\n yield line;\n }\n }\n } catch (err) {\n if (err !== reason) {\n throw err;\n }\n\n if (current) {\n yield current;\n }\n }\n}\n"],"names":["combine","streamLines","generators","gen","task","stream","ctrl","AbortController","reason","Error","subscribe","abort","current","chunk","streamEvents","signal","data","toString","lines","split","pop","line","err"],"mappings":"AAAA;;;;;;;;;;;IAIuBA,OAAO,MAAPA;IAMAC,WAAW,MAAXA;;2BATM;AAGtB,gBAAgBD,QAAW,GAAGE,UAA+B,EAAqB;IACvF,KAAK,MAAMC,OAAOD,WAAY;QAC5B,OAAOC;IACT;AACF;AAEO,gBAAgBF,YAAYG,IAAe,EAAEC,MAAuB,EAA0B;IACnG,QAAQ;IACR,MAAMC,OAAO,IAAIC;IACjB,MAAMC,SAAS,IAAIC,MAAM;IAEzBL,KAAKM,SAAS,CAAC,aAAa,IAAMJ,KAAKK,KAAK,CAACH;IAE7C,SAAS;IACT,IAAII,UAAU;IAEd,IAAI;QACF,WAAW,MAAMC,SAASC,IAAAA,uBAAY,EAACV,MAAM,CAAC,OAAO,EAAEC,OAAO,CAAC,EAAE;YAAEU,QAAQT,KAAKS,MAAM;QAAC,GAAI;YACzF,MAAMC,OAAOJ,UAAUC,MAAMG,IAAI,CAACC,QAAQ,CAAC;YAC3C,MAAMC,QAAQF,KAAKG,KAAK,CAAC;YAEzBP,UAAUM,MAAME,GAAG,MAAM;YAEzB,KAAK,MAAMC,QAAQH,MAAO;gBACxB,MAAMG;YACR;QACF;IACF,EAAE,OAAOC,KAAK;QACZ,IAAIA,QAAQd,QAAQ;YAClB,MAAMc,IAAI;QACZ,CAAC;QAED,IAAIV,SAAS;YACX,MAAMA;QACR,CAAC;IACH;AACF"}
@@ -11,4 +11,4 @@ function capitalize(txt) {
11
11
  return txt.charAt(0).toUpperCase() + txt.substring(1).toLowerCase();
12
12
  }
13
13
 
14
- //# sourceMappingURL=string.js.map
14
+ //# sourceMappingURL=string.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["utils/string.js"],"sourcesContent":["// Utils\nexport function capitalize(txt: string): string {\n return txt.charAt(0).toUpperCase() + txt.substring(1).toLowerCase();\n}\n"],"names":["capitalize","txt","charAt","toUpperCase","substring","toLowerCase"],"mappings":"AAAA,QAAQ;AACR;;;;+BAAgBA;;aAAAA;;AAAT,SAASA,WAAWC,GAAW,EAAU;IAC9C,OAAOA,IAAIC,MAAM,CAAC,GAAGC,WAAW,KAAKF,IAAIG,SAAS,CAAC,GAAGC,WAAW;AACnE","file":"string.js"}
1
+ {"version":3,"sources":["../../src/utils/string.ts"],"sourcesContent":["// Utils\nexport function capitalize(txt: string): string {\n return txt.charAt(0).toUpperCase() + txt.substring(1).toLowerCase();\n}\n"],"names":["capitalize","txt","charAt","toUpperCase","substring","toLowerCase"],"mappings":"AAAA,QAAQ;AACR;;;;+BAAgBA;;aAAAA;;AAAT,SAASA,WAAWC,GAAW,EAAU;IAC9C,OAAOA,IAAIC,MAAM,CAAC,GAAGC,WAAW,KAAKF,IAAIG,SAAS,CAAC,GAAGC,WAAW;AACnE"}
@@ -30,4 +30,4 @@ function applyMiddlewares(yargs, middlewares) {
30
30
  return tmp;
31
31
  }
32
32
 
33
- //# sourceMappingURL=yargs.js.map
33
+ //# sourceMappingURL=yargs.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["utils/yargs.js"],"sourcesContent":["import { Arguments, Argv, CommandModule } from 'yargs';\n\nimport { Awaitable } from '../types';\n\n// Types\nexport interface Middleware<T = unknown, U = unknown> {\n builder?: (yargs: Argv<T>) => Argv<U>;\n handler(args: Arguments<U>): Awaitable<void>;\n}\n\n// Command utils\nexport function defineCommand<T, U>(command: CommandModule<T, U>): CommandModule<T, U> {\n return command;\n}\n\n// Middleware utils\nexport function defineMiddleware<T, U>(middleware: Middleware<T, U>): Middleware<T, U> {\n return middleware;\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"],"names":["defineCommand","defineMiddleware","applyMiddlewares","command","middleware","yargs","middlewares","tmp","builder","handler"],"mappings":"AAAA;;;;;;;;;;;IAWgBA,aAAa,MAAbA;IAKAC,gBAAgB,MAAhBA;IAIAC,gBAAgB,MAAhBA;;AATT,SAASF,cAAoBG,OAA4B,EAAuB;IACrF,OAAOA;AACT;AAGO,SAASF,iBAAuBG,UAA4B,EAAoB;IACrF,OAAOA;AACT;AAEO,SAASF,iBAAoBG,KAAc,EAAEC,WAAyB,EAAW;IACtF,IAAIC,MAAqBF;IAEzB,KAAK,MAAMD,cAAcE,YAAa;QACpC,IAAIF,WAAWI,OAAO,EAAE;YACtBD,MAAMH,WAAWI,OAAO,CAACD;QAC3B,CAAC;QAEDA,IAAIH,UAAU,CAACA,WAAWK,OAAO;IACnC;IAEA,OAAOF;AACT","file":"yargs.js"}
1
+ {"version":3,"sources":["../../src/utils/yargs.ts"],"sourcesContent":["import { Arguments, Argv, CommandModule } from 'yargs';\n\nimport { Awaitable } from '../types';\n\n// Types\nexport interface Middleware<T = unknown, U = unknown> {\n builder?: (yargs: Argv<T>) => Argv<U>;\n handler(args: Arguments<U>): Awaitable<void>;\n}\n\n// Command utils\nexport function defineCommand<T, U>(command: CommandModule<T, U>): CommandModule<T, U> {\n return command;\n}\n\n// Middleware utils\nexport function defineMiddleware<T, U>(middleware: Middleware<T, U>): Middleware<T, U> {\n return middleware;\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"],"names":["defineCommand","defineMiddleware","applyMiddlewares","command","middleware","yargs","middlewares","tmp","builder","handler"],"mappings":"AAAA;;;;;;;;;;;IAWgBA,aAAa,MAAbA;IAKAC,gBAAgB,MAAhBA;IAIAC,gBAAgB,MAAhBA;;AATT,SAASF,cAAoBG,OAA4B,EAAuB;IACrF,OAAOA;AACT;AAGO,SAASF,iBAAuBG,UAA4B,EAAoB;IACrF,OAAOA;AACT;AAEO,SAASF,iBAAoBG,KAAc,EAAEC,WAAyB,EAAW;IACtF,IAAIC,MAAqBF;IAEzB,KAAK,MAAMD,cAAcE,YAAa;QACpC,IAAIF,WAAWI,OAAO,EAAE;YACtBD,MAAMH,WAAWI,OAAO,CAACD;QAC3B,CAAC;QAEDA,IAAIH,UAAU,CAACA,WAAWK,OAAO;IACnC;IAEA,OAAOF;AACT"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jujulego/jill",
3
- "version": "2.0.1",
3
+ "version": "2.0.3",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -14,10 +14,14 @@
14
14
  "main": "./dist/main.js",
15
15
  "scripts": {
16
16
  "lint": "eslint .",
17
- "clean": "gulp clean",
18
- "build": "gulp build",
19
- "watch": "gulp watch",
20
- "test": "jest"
17
+ "clean": "shx rm -rf dist",
18
+ "build": "yarn run build:swc && yarn run build:types",
19
+ "build:swc": "swc src -d dist",
20
+ "build:types": "tsc",
21
+ "watch": "yarn run watch:swc",
22
+ "watch:swc": "swc src -d dist -w",
23
+ "test": "jest",
24
+ "test:e2e": "jest -c jest-e2e.config.ts"
21
25
  },
22
26
  "engines": {
23
27
  "node": "^16"
@@ -44,36 +48,34 @@
44
48
  "yargs": "^17.6.0"
45
49
  },
46
50
  "devDependencies": {
47
- "@jujulego/flow": "1.1.0",
48
- "@swc/core": "1.3.14",
49
- "@swc/jest": "0.2.23",
51
+ "@jujulego/2d-maths": "1.5.1",
52
+ "@swc/cli": "0.1.57",
53
+ "@swc/core": "1.3.22",
54
+ "@swc/jest": "0.2.24",
50
55
  "@types/async-lock": "1.3.0",
51
- "@types/gulp": "4.0.9",
52
- "@types/gulp-sourcemaps": "0.0.35",
53
- "@types/jest": "29.2.2",
56
+ "@types/jest": "29.2.4",
54
57
  "@types/ms": "0.7.31",
55
- "@types/node": "16.18.3",
58
+ "@types/node": "16.18.8",
56
59
  "@types/normalize-package-data": "2.4.1",
57
60
  "@types/react": "17.0.52",
58
61
  "@types/semver": "7.3.13",
59
62
  "@types/yargs": "17.0.13",
60
- "@typescript-eslint/eslint-plugin": "5.42.0",
61
- "@typescript-eslint/parser": "5.42.0",
62
- "del": "6.1.1",
63
- "eslint": "8.26.0",
64
- "eslint-plugin-jest": "27.1.4",
65
- "eslint-plugin-react": "7.31.10",
63
+ "@typescript-eslint/eslint-plugin": "5.46.0",
64
+ "@typescript-eslint/parser": "5.46.0",
65
+ "c8": "7.12.0",
66
+ "chokidar": "3.5.3",
67
+ "eslint": "8.29.0",
68
+ "eslint-plugin-jest": "27.1.6",
69
+ "eslint-plugin-react": "7.31.11",
66
70
  "eslint-plugin-react-hooks": "4.6.0",
67
71
  "eslint-plugin-workspaces": "0.7.0",
68
- "gulp": "4.0.2",
69
- "gulp-cli": "2.3.0",
70
- "gulp-sourcemaps": "3.0.0",
71
- "gulp-swc": "1.2.3",
72
- "gulp-typescript": "6.0.0-alpha.1",
73
72
  "ink-testing-library": "2.1.0",
74
- "jest": "29.2.2",
73
+ "jest": "29.3.1",
74
+ "memfs": "3.4.12",
75
+ "shx": "0.3.4",
75
76
  "ts-node": "10.9.1",
76
- "typescript": "4.8.4",
77
+ "typescript": "4.9.3",
77
78
  "winston-transport": "4.5.0"
78
- }
79
+ },
80
+ "packageManager": "yarn@3.3.0"
79
81
  }
@@ -1,16 +0,0 @@
1
- import yargs from 'yargs';
2
- import { WorkspaceDepsMode } from '../project';
3
- declare const _default: yargs.CommandModule<unknown, {
4
- script: string;
5
- } & {
6
- "deps-mode": WorkspaceDepsMode;
7
- } & {
8
- private: boolean | undefined;
9
- } & {
10
- affected: string | undefined;
11
- } & {
12
- "affected-rev-sort": string | undefined;
13
- } & {
14
- "affected-rev-fallback": string;
15
- }>;
16
- export default _default;
@@ -1 +0,0 @@
1
- {"version":3,"sources":["commands/each.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,EAAW,iBAAiB,EAAE,MAAM,YAAY,CAAC;;;;;;;;;;;;;;AAMxD,wBAiHG","file":"each.d.ts","sourcesContent":["import { waitForEvent } from '@jujulego/event-tree';\nimport { TaskManager, TaskSet } from '@jujulego/tasks';\nimport ink from 'ink';\nimport yargs from 'yargs';\n\nimport { AffectedFilter, Pipeline, PrivateFilter, ScriptsFilter } from '../filters';\nimport { loadProject, setupInk } from '../middlewares';\nimport { Project, WorkspaceDepsMode } from '../project';\nimport { container, CURRENT, INK_APP, SpinnerService } from '../services';\nimport { Layout, TasksSpinner } from '../ui';\nimport { applyMiddlewares, defineCommand } from '../utils';\n\n// Command\nexport default defineCommand({\n command: 'each <script>',\n describe: 'Run script on many workspaces',\n builder: (yargs) =>\n applyMiddlewares(yargs, [\n setupInk,\n loadProject,\n ])\n // Run options\n .positional('script', { type: 'string', demandOption: true })\n .option('deps-mode', {\n choice: ['all', 'prod', 'none'],\n default: 'all' as WorkspaceDepsMode,\n desc: 'Dependency selection mode:\\n' +\n ' - all = dependencies AND devDependencies\\n' +\n ' - prod = dependencies\\n' +\n ' - none = nothing'\n })\n\n // Filters\n .option('private', {\n type: 'boolean',\n group: 'Filters:',\n desc: 'Print only private workspaces',\n })\n\n // Affected filter\n .option('affected', {\n alias: 'a',\n type: 'string',\n coerce: (rev: string) => rev === '' ? 'master' : rev,\n group: 'Affected:',\n desc: 'Print only affected workspaces towards given git revision. If no revision is given, it will check towards master.\\n' +\n 'Replaces %name by workspace name.',\n })\n .option('affected-rev-sort', {\n type: 'string',\n group: 'Affected:',\n desc: 'Sort applied to git tag / git branch command',\n })\n .option('affected-rev-fallback', {\n type: 'string',\n default: 'master',\n group: 'Affected:',\n desc: 'Fallback revision, used if no revision matching the given format is found',\n }),\n async handler(args) {\n const app = container.get<ink.Instance>(INK_APP);\n const project = container.getNamed(Project, CURRENT);\n const manager = container.get(TaskManager);\n const spinner = container.get(SpinnerService);\n\n try {\n spinner.spin('Loading workspaces ...');\n\n // Setup pipeline\n const pipeline = new Pipeline();\n pipeline.add(new ScriptsFilter([args.script]));\n\n if (args.private !== undefined) {\n pipeline.add(new PrivateFilter(args.private));\n }\n\n if (args.affected !== undefined) {\n pipeline.add(new AffectedFilter(\n args.affected,\n args.affectedRevFallback,\n args.affectedRevSort\n ));\n }\n\n // Extract arguments\n const rest = args._.map(arg => arg.toString());\n\n if (rest[0] === 'each') {\n rest.splice(0, 1);\n }\n\n // Create script tasks\n const tasks = new TaskSet(manager);\n\n for await (const wks of pipeline.filter(project.workspaces())) {\n tasks.add(await wks.run(args.script, rest, {\n buildDeps: args.depsMode,\n }));\n }\n\n if (tasks.tasks.length === 0) {\n spinner.failed('No workspace found !');\n return yargs.exit(1, new Error('No workspace found !'));\n }\n\n spinner.stop();\n\n // Render\n app.rerender(\n <Layout>\n <TasksSpinner manager={manager} />\n </Layout>\n );\n\n // Start and wait for result\n tasks.start();\n\n const result = await waitForEvent(tasks, 'finished');\n\n if (result.failed > 0) {\n return yargs.exit(1, new Error(`${result.failed} tasks failed !`));\n }\n } finally {\n spinner.stop();\n }\n }\n});\n"]}
@@ -1,23 +0,0 @@
1
- /// <reference types="yargs" />
2
- export declare type Attribute = 'name' | 'version' | 'root' | 'slug';
3
- export declare type Data = Partial<Record<Attribute, string>>;
4
- declare const _default: import("yargs").CommandModule<unknown, {
5
- private: boolean | undefined;
6
- } & {
7
- "with-script": string[] | undefined;
8
- } & {
9
- affected: string | undefined;
10
- } & {
11
- "affected-rev-sort": string | undefined;
12
- } & {
13
- "affected-rev-fallback": string;
14
- } & {
15
- attrs: Attribute[];
16
- } & {
17
- headers: boolean | undefined;
18
- } & {
19
- long: boolean | undefined;
20
- } & {
21
- json: boolean | undefined;
22
- }>;
23
- export default _default;
@@ -1 +0,0 @@
1
- {"version":3,"sources":["commands/list.tsx"],"names":[],"mappings":";AAaA,oBAAY,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;AAC7D,oBAAY,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;AA8BtD,wBAkIG","file":"list.d.ts","sourcesContent":["import chalk from 'chalk';\nimport path from 'node:path';\nimport ink from 'ink';\nimport slugify from 'slugify';\n\nimport { AffectedFilter, Pipeline, PrivateFilter, ScriptsFilter } from '../filters';\nimport { loadProject, setupInk } from '../middlewares';\nimport { Project, Workspace } from '../project';\nimport { container, CURRENT, INK_APP } from '../services';\nimport { Layout, List } from '../ui';\nimport { applyMiddlewares, defineCommand } from '../utils';\n\n// Types\nexport type Attribute = 'name' | 'version' | 'root' | 'slug';\nexport type Data = Partial<Record<Attribute, string>>;\n\ntype Extractor<T> = (wks: Workspace, json: boolean) => T;\n\n// Constants\nconst LONG_ATTRIBUTES: Attribute[] = ['name', 'version', 'root'];\nconst JSON_ATTRIBUTES: Attribute[] = ['name', 'version', 'slug', 'root'];\nconst DEFAULT_ATTRIBUTES: Attribute[] = ['name'];\n\nconst EXTRACTORS: Record<Attribute, Extractor<string | undefined>> = {\n name: wks => wks.name,\n version: (wks, json) => wks.manifest.version || (json ? undefined : chalk.grey('unset')),\n root: wks => wks.cwd,\n slug: wks => slugify(wks.name)\n};\n\n// Utils\nfunction buildExtractor(attrs: Attribute[]): Extractor<Data> {\n return (wks, json: boolean) => {\n const data: Data = {};\n\n for (const attr of attrs) {\n data[attr] = EXTRACTORS[attr](wks, json);\n }\n\n return data;\n };\n}\n\n// Command\nexport default defineCommand({\n command: ['list', 'ls'],\n describe: 'List workspaces',\n builder: (yargs) =>\n applyMiddlewares(yargs, [\n setupInk,\n loadProject,\n ])\n // Filters\n .option('private', {\n type: 'boolean',\n group: 'Filters:',\n desc: 'Print only private workspaces',\n })\n .option('with-script', {\n type: 'array',\n string: true,\n group: 'Filters:',\n desc: 'Print only workspaces having the given script',\n })\n\n // Affected filter\n .option('affected', {\n alias: 'a',\n type: 'string',\n coerce: (rev: string) => rev === '' ? 'master' : rev,\n group: 'Affected:',\n desc: 'Print only affected workspaces towards given git revision. If no revision is given, it will check towards master.\\n' +\n 'Replaces %name by workspace name.',\n })\n .option('affected-rev-sort', {\n type: 'string',\n group: 'Affected:',\n desc: 'Sort applied to git tag / git branch command',\n })\n .option('affected-rev-fallback', {\n type: 'string',\n default: 'master',\n group: 'Affected:',\n desc: 'Fallback revision, used if no revision matching the given format is found',\n })\n .option('attrs', {\n type: 'array',\n choices: ['name', 'version', 'root', 'slug'],\n default: [] as Attribute[],\n group: 'Format:',\n desc: 'Select printed attributes'\n })\n .option('headers', {\n type: 'boolean',\n group: 'Format:',\n desc: 'Prints columns headers'\n })\n .option('long', {\n alias: 'l',\n type: 'boolean',\n group: 'Format:',\n desc: 'Prints name, version and root of all workspaces',\n })\n .option('json', {\n type: 'boolean',\n group: 'Format:',\n desc: 'Prints data as a JSON array',\n }),\n async handler(args) {\n // Setup pipeline\n const pipeline = new Pipeline();\n\n if (args.private !== undefined) {\n pipeline.add(new PrivateFilter(args.private));\n }\n\n if (args.withScript) {\n pipeline.add(new ScriptsFilter(args.withScript));\n }\n\n if (args.affected !== undefined) {\n pipeline.add(new AffectedFilter(\n args.affected,\n args.affectedRevFallback,\n args.affectedRevSort\n ));\n }\n\n // Load workspaces\n const project = container.getNamed(Project, CURRENT);\n const workspaces: Workspace[] = [];\n\n for await (const wks of pipeline.filter(project.workspaces())) {\n workspaces.push(wks);\n }\n\n // Build data\n let attrs = args.attrs;\n\n if (args.attrs.length === 0) {\n if (args.long) {\n attrs = LONG_ATTRIBUTES;\n } else if (args.json) {\n attrs = JSON_ATTRIBUTES;\n } else {\n attrs = DEFAULT_ATTRIBUTES;\n }\n }\n\n const data = workspaces.map(wks => buildExtractor(attrs)(wks, args.json || false));\n\n // Print list\n if (args.json) {\n if (process.stdout.isTTY) { // Pretty print for ttys\n console.log(JSON.stringify(data, null, 2));\n } else {\n process.stdout.write(JSON.stringify(data));\n }\n } else {\n const app = container.get<ink.Instance>(INK_APP);\n\n for (const d of data) {\n if (d.root) {\n d.root = path.relative(process.cwd(), d.root) ?? '.';\n }\n }\n\n app.rerender(\n <Layout>\n <List items={data} headers={args.headers ?? (attrs.length > 1)} />\n </Layout>\n );\n }\n }\n});\n"]}
@@ -1,8 +0,0 @@
1
- import yargs from 'yargs';
2
- import { WorkspaceDepsMode } from '../project';
3
- declare const _default: yargs.CommandModule<unknown, {
4
- script: string;
5
- } & {
6
- "deps-mode": WorkspaceDepsMode;
7
- }>;
8
- export default _default;
@@ -1 +0,0 @@
1
- {"version":3,"sources":["commands/run.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAa,iBAAiB,EAAE,MAAM,YAAY,CAAC;;;;;;AAM1D,wBAkDG","file":"run.d.ts","sourcesContent":["import { waitForEvent } from '@jujulego/event-tree';\nimport { TaskManager } from '@jujulego/tasks';\nimport ink from 'ink';\nimport yargs from 'yargs';\n\nimport { loadProject, loadWorkspace, setupInk } from '../middlewares';\nimport { Workspace, WorkspaceDepsMode } from '../project';\nimport { container, CURRENT, INK_APP } from '../services';\nimport { Layout, TasksSpinner } from '../ui';\nimport { applyMiddlewares, defineCommand } from '../utils';\n\n// Command\nexport default defineCommand({\n command: 'run <script>',\n describe: 'Run script inside workspace',\n builder: (yargs) =>\n applyMiddlewares(yargs, [\n setupInk,\n loadProject,\n loadWorkspace\n ])\n .positional('script', { type: 'string', demandOption: true })\n .option('deps-mode', {\n choice: ['all', 'prod', 'none'],\n default: 'all' as WorkspaceDepsMode,\n desc: 'Dependency selection mode:\\n' +\n ' - all = dependencies AND devDependencies\\n' +\n ' - prod = dependencies\\n' +\n ' - none = nothing'\n }),\n async handler(args) {\n const app = container.get<ink.Instance>(INK_APP);\n const workspace = container.getNamed(Workspace, CURRENT);\n const manager = container.get(TaskManager);\n\n // Extract arguments\n const rest = args._.map(arg => arg.toString());\n\n if (rest[0] === 'run') {\n rest.splice(0, 1);\n }\n\n // Run script in workspace\n const task = await workspace.run(args.script, rest, {\n buildDeps: args.depsMode,\n });\n manager.add(task);\n\n // Render\n app.rerender(\n <Layout>\n <TasksSpinner manager={manager} />\n </Layout>\n );\n\n // Wait for result\n const result = await waitForEvent(task, 'completed');\n\n if (result.status === 'failed') {\n return yargs.exit(1, new Error('Task failed !'));\n }\n }\n});\n"]}
@@ -1,3 +0,0 @@
1
- /// <reference types="yargs" />
2
- declare const _default: import("yargs").CommandModule<unknown, unknown>;
3
- export default _default;
@@ -1 +0,0 @@
1
- {"version":3,"sources":["commands/tree.tsx"],"names":[],"mappings":";;AASA,wBAmBG","file":"tree.d.ts","sourcesContent":["import ink from 'ink';\n\nimport { loadProject, loadWorkspace, setupInk } from '../middlewares';\nimport { Workspace } from '../project';\nimport { container, CURRENT, INK_APP } from '../services';\nimport { Layout, WorkspaceTree } from '../ui';\nimport { applyMiddlewares, defineCommand } from '../utils';\n\n// Command\nexport default defineCommand({\n command: 'tree',\n describe: 'Print workspace dependency tree',\n builder: (yargs) =>\n applyMiddlewares(yargs, [\n setupInk,\n loadProject,\n loadWorkspace\n ]),\n handler: () => {\n const app = container.get<ink.Instance>(INK_APP);\n const workspace = container.getNamed(Workspace, CURRENT);\n\n app.rerender(\n <Layout>\n <WorkspaceTree workspace={workspace} />\n </Layout>\n );\n }\n});\n"]}
@@ -1,11 +0,0 @@
1
- import { Workspace } from '../project';
2
- import { PipelineFilter } from './pipeline';
3
- export declare class AffectedFilter implements PipelineFilter {
4
- readonly format: string;
5
- readonly fallback: string;
6
- readonly sort?: string | undefined;
7
- private readonly _logger;
8
- constructor(format: string, fallback: string, sort?: string | undefined);
9
- private _formatRevision;
10
- test(workspace: Workspace): Promise<boolean>;
11
- }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["filters/affected.filter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C,qBAAa,cAAe,YAAW,cAAc;IAOjD,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM;IACzB,QAAQ,CAAC,IAAI,CAAC;IANhB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAItB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,oBAAQ;YAIV,eAAe;IA0CvB,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;CAInD","file":"affected.filter.d.ts","sourcesContent":["import { Git } from '../git';\nimport { lazyInject, Logger } from '../services';\nimport { Workspace } from '../project';\n\nimport { PipelineFilter } from './pipeline';\n\n// Class\nexport class AffectedFilter implements PipelineFilter {\n // Properties\n @lazyInject(Logger)\n private readonly _logger: Logger;\n\n // Constructor\n constructor(\n readonly format: string,\n readonly fallback: string,\n readonly sort?: string,\n ) {}\n\n // Methods\n private async _formatRevision(wks: Workspace): Promise<string> {\n const logger = this._logger.child({ label: wks.name });\n\n // Format revision\n let result = this.format;\n result = result.replace(/(?<!\\\\)((?:\\\\\\\\)*)%name/g, `$1${wks.name}`);\n result = result.replace(/\\\\(.)/g, '$1');\n\n // Ask git to complete it\n const sortArgs = this.sort ? ['--sort', this.sort] : [];\n\n // - search in branches\n if (result.includes('*')) {\n const branches = await Git.listBranches([...sortArgs, result], { cwd: wks.cwd, logger: logger });\n\n if (branches.length > 0) {\n result = branches[branches.length - 1];\n }\n }\n\n // - search in tags\n if (result.includes('*')) {\n const tags = await Git.listTags([...sortArgs, result], { cwd: wks.cwd, logger: logger });\n\n if (tags.length > 0) {\n result = tags[tags.length - 1];\n }\n }\n\n if (result !== this.format) {\n logger.verbose(`Resolved ${this.format} into ${result}`);\n }\n\n if (result.includes('*')) {\n logger.warn(`No revision found matching ${result}, using fallback ${this.fallback}`);\n\n return this.fallback;\n }\n\n return result;\n }\n\n async test(workspace: Workspace): Promise<boolean> {\n const rev = await this._formatRevision(workspace);\n return await workspace.isAffected(rev);\n }\n}\n"]}
@@ -1,4 +0,0 @@
1
- export * from './affected.filter';
2
- export * from './pipeline';
3
- export * from './private.filter';
4
- export * from './scripts.filter';
@@ -1 +0,0 @@
1
- {"version":3,"sources":["filters/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC","file":"index.d.ts","sourcesContent":["export * from './affected.filter';\nexport * from './pipeline';\nexport * from './private.filter';\nexport * from './scripts.filter';\n"]}
@@ -1,11 +0,0 @@
1
- import { Workspace } from '../project';
2
- import { Awaitable } from '../types';
3
- export interface PipelineFilter {
4
- test(workspace: Workspace): Awaitable<boolean>;
5
- }
6
- export declare class Pipeline {
7
- private _filters;
8
- add(filter: PipelineFilter): void;
9
- private _test;
10
- filter(workspaces: Iterable<Workspace> | AsyncIterable<Workspace>): AsyncGenerator<Workspace>;
11
- }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["filters/pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGrC,MAAM,WAAW,cAAc;IAE7B,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;CAChD;AAGD,qBAAa,QAAQ;IAEnB,OAAO,CAAC,QAAQ,CAAwB;IAGxC,GAAG,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;YAInB,KAAK;IAYZ,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,aAAa,CAAC,SAAS,CAAC,GAAG,cAAc,CAAC,SAAS,CAAC;CAOrG","file":"pipeline.d.ts","sourcesContent":["import { Workspace } from '../project';\nimport { Awaitable } from '../types';\n\n// Interface\nexport interface PipelineFilter {\n // Methods\n test(workspace: Workspace): Awaitable<boolean>;\n}\n\n// Class\nexport class Pipeline {\n // Attributes\n private _filters: PipelineFilter[] = [];\n\n // Methods\n add(filter: PipelineFilter): void {\n this._filters.push(filter);\n }\n\n private async _test(workspace: Workspace): Promise<boolean> {\n for (const filter of this._filters) {\n const res = await filter.test(workspace);\n\n if (!res) {\n return false;\n }\n }\n\n return true;\n }\n\n async *filter(workspaces: Iterable<Workspace> | AsyncIterable<Workspace>): AsyncGenerator<Workspace> {\n for await (const wks of workspaces) {\n if (await this._test(wks)) {\n yield wks;\n }\n }\n }\n}\n"]}
@@ -1,7 +0,0 @@
1
- import { Workspace } from '../project';
2
- import { PipelineFilter } from './pipeline';
3
- export declare class PrivateFilter implements PipelineFilter {
4
- readonly value: boolean;
5
- constructor(value: boolean);
6
- test(workspace: Workspace): boolean;
7
- }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["filters/private.filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C,qBAAa,aAAc,YAAW,cAAc;IAEtC,QAAQ,CAAC,KAAK,EAAE,OAAO;gBAAd,KAAK,EAAE,OAAO;IAGnC,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO;CAGpC","file":"private.filter.d.ts","sourcesContent":["import { Workspace } from '../project';\n\nimport { PipelineFilter } from './pipeline';\n\n// Filter\nexport class PrivateFilter implements PipelineFilter {\n // Constructor\n constructor(readonly value: boolean) {}\n\n // Methods\n test(workspace: Workspace): boolean {\n return (workspace.manifest.private ?? false) === this.value;\n }\n}\n"]}
@@ -1,7 +0,0 @@
1
- import { Workspace } from '../project';
2
- import { PipelineFilter } from './pipeline';
3
- export declare class ScriptsFilter implements PipelineFilter {
4
- readonly scripts: string[];
5
- constructor(scripts: string[]);
6
- test(workspace: Workspace): boolean;
7
- }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["filters/scripts.filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C,qBAAa,aAAc,YAAW,cAAc;IAEtC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE;gBAAjB,OAAO,EAAE,MAAM,EAAE;IAGtC,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO;CAIpC","file":"scripts.filter.d.ts","sourcesContent":["import { Workspace } from '../project';\n\nimport { PipelineFilter } from './pipeline';\n\n// Filter\nexport class ScriptsFilter implements PipelineFilter {\n // Constructor\n constructor(readonly scripts: string[]) {}\n\n // Methods\n test(workspace: Workspace): boolean {\n const scripts = Object.keys(workspace.manifest.scripts || {});\n return this.scripts.some((scr) => scripts.includes(scr));\n }\n}\n"]}
package/dist/git.d.ts DELETED
@@ -1,16 +0,0 @@
1
- import { SpawnTask, SpawnTaskOptions, TaskContext, TaskManager } from '@jujulego/tasks';
2
- import { Logger } from './services';
3
- export interface GitContext extends TaskContext {
4
- command: string;
5
- }
6
- export declare class Git {
7
- static readonly manager: TaskManager;
8
- static readonly logger: Logger;
9
- static command(cmd: string, args: string[], options?: SpawnTaskOptions): SpawnTask<GitContext>;
10
- static branch(args: string[], options?: SpawnTaskOptions): SpawnTask<GitContext>;
11
- static diff(args: string[], options?: SpawnTaskOptions): SpawnTask<GitContext>;
12
- static tag(args: string[], options?: SpawnTaskOptions): SpawnTask<GitContext>;
13
- static isAffected(reference: string, args?: string[], opts?: SpawnTaskOptions): Promise<boolean>;
14
- static listBranches(args?: string[], opts?: SpawnTaskOptions): Promise<string[]>;
15
- static listTags(args?: string[], opts?: SpawnTaskOptions): Promise<string[]>;
16
- }
package/dist/git.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAExF,OAAO,EAAc,MAAM,EAAE,MAAM,YAAY,CAAC;AAIhD,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC7C,OAAO,EAAE,MAAM,CAAC;CACjB;AAGD,qBAAa,GAAG;IAGd,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAGrC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAG/B,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,gBAAqB,GAAG,SAAS,CAAC,UAAU,CAAC;IAalG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC,UAAU,CAAC;IAIhF,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC,UAAU,CAAC;IAI9E,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC,UAAU,CAAC;IAK7E,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;WAevF,YAAY,CAAC,IAAI,GAAE,MAAM,EAAO,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;WAW7E,QAAQ,CAAC,IAAI,GAAE,MAAM,EAAO,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAUvF","file":"git.d.ts","sourcesContent":["import { SpawnTask, SpawnTaskOptions, TaskContext, TaskManager } from '@jujulego/tasks';\n\nimport { lazyInject, Logger } from './services';\nimport { streamLines } from './utils';\n\n// Types\nexport interface GitContext extends TaskContext {\n command: string;\n}\n\n// Git commands\nexport class Git {\n // Services\n @lazyInject(TaskManager)\n static readonly manager: TaskManager;\n\n @lazyInject(Logger)\n static readonly logger: Logger;\n\n // commons\n static command(cmd: string, args: string[], options: SpawnTaskOptions = {}): SpawnTask<GitContext> {\n const opts = { logger: this.logger, ...options };\n\n // Create task\n const task = new SpawnTask('git', [cmd, ...args], { command: cmd }, opts);\n task.subscribe('stream', ({ data }) => opts.logger.debug(data.toString('utf-8')));\n\n this.manager.add(task);\n\n return task;\n }\n\n // commands\n static branch(args: string[], options?: SpawnTaskOptions): SpawnTask<GitContext> {\n return this.command('branch', args, options);\n }\n\n static diff(args: string[], options?: SpawnTaskOptions): SpawnTask<GitContext> {\n return this.command('diff', args, options);\n }\n\n static tag(args: string[], options?: SpawnTaskOptions): SpawnTask<GitContext> {\n return this.command('tag', args, options);\n }\n\n // high level\n static isAffected(reference: string, args: string[] = [], opts?: SpawnTaskOptions): Promise<boolean> {\n return new Promise((resolve, reject) => {\n const task = this.diff(['--quiet', reference, ...args], opts);\n\n task.subscribe('status.done', () => resolve(false));\n task.subscribe('status.failed', () => {\n if (task.exitCode) {\n resolve(true);\n } else {\n reject(new Error(`Task ${task.name} failed`));\n }\n });\n });\n }\n\n static async listBranches(args: string[] = [], opts?: SpawnTaskOptions): Promise<string[]> {\n const task = this.branch(['-l', ...args], opts);\n const result: string[] = [];\n\n for await (const line of streamLines(task, 'stdout')) {\n result.push(line.replace(/^[ *] /, ''));\n }\n\n return result;\n }\n\n static async listTags(args: string[] = [], opts?: SpawnTaskOptions): Promise<string[]> {\n const task = this.tag(['-l', ...args], opts);\n const result: string[] = [];\n\n for await (const line of streamLines(task, 'stdout')) {\n result.push(line);\n }\n\n return result;\n }\n}\n"]}
package/dist/main.d.ts DELETED
@@ -1 +0,0 @@
1
- export {};
@@ -1 +0,0 @@
1
- {"version":3,"sources":["main.ts"],"names":[],"mappings":"","file":"main.d.ts","sourcesContent":["import yargs from 'yargs';\nimport { hideBin } from 'yargs/helpers';\n\nimport pkg from '../package.json';\nimport { globalConfig } from './middlewares';\nimport { applyMiddlewares } from './utils';\n\n// Bootstrap\n(async () => {\n // Setup yargs\n const parser = yargs(hideBin(process.argv))\n .scriptName('jill')\n .completion('completion', 'Generate bash completion script')\n .help('help', 'Show help for a command')\n .version('version', 'Show version', pkg.version)\n .wrap(yargs.terminalWidth());\n\n // Middlewares\n applyMiddlewares(parser, [globalConfig]);\n\n // Parse !\n await parser\n .commandDir('commands', {\n visit: obj => obj.default\n })\n .demandCommand()\n .recommendCommands()\n .strict()\n .parse();\n})();\n"]}
@@ -1,5 +0,0 @@
1
- export declare const globalConfig: import("../utils").Middleware<unknown, {
2
- verbose: number;
3
- } & {
4
- jobs: number;
5
- }>;
@@ -1 +0,0 @@
1
- {"version":3,"sources":["middlewares/global-config.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,YAAY;;;;EAmBvB,CAAC","file":"global-config.d.ts","sourcesContent":["import os from 'node:os';\n\nimport { container, GLOBAL_CONFIG } from '../services';\nimport { defineMiddleware } from '../utils';\n\n// Middleware\nexport const globalConfig = defineMiddleware({\n builder: (yargs) => yargs\n .option('verbose', {\n alias: 'v',\n type: 'count',\n description: 'Set verbosity level',\n })\n .option('jobs', {\n alias: 'j',\n type: 'number',\n default: os.cpus().length - 1,\n description: 'Set maximum parallel job number',\n }),\n handler(args) {\n container.bind(GLOBAL_CONFIG).toConstantValue({\n verbose: args.verbose,\n jobs: args.jobs,\n });\n }\n});\n"]}
@@ -1,4 +0,0 @@
1
- export * from './global-config';
2
- export * from './load-project';
3
- export * from './load-workspace';
4
- export * from './setup-ink';
@@ -1 +0,0 @@
1
- {"version":3,"sources":["middlewares/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC","file":"index.d.ts","sourcesContent":["export * from './global-config';\nexport * from './load-project';\nexport * from './load-workspace';\nexport * from './setup-ink';\n"]}
@@ -1,6 +0,0 @@
1
- import { PackageManager } from '../project';
2
- export declare const loadProject: import("../utils").Middleware<unknown, {
3
- project: string;
4
- } & {
5
- "package-manager": PackageManager | undefined;
6
- }>;
@@ -1 +0,0 @@
1
- {"version":3,"sources":["middlewares/load-project.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAW,MAAM,YAAY,CAAC;AAIrD,eAAO,MAAM,WAAW;;;;EA8BtB,CAAC","file":"load-project.d.ts","sourcesContent":["import { container, CURRENT, SpinnerService } from '../services';\nimport { PackageManager, Project } from '../project';\nimport { defineMiddleware } from '../utils';\n\n// Middleware\nexport const loadProject = defineMiddleware({\n builder: (yargs) => yargs\n .option('project', {\n alias: 'p',\n type: 'string',\n default: process.cwd(),\n description: 'Project root directory'\n })\n .option('package-manager', {\n choices: ['yarn', 'npm'],\n default: undefined as PackageManager | undefined,\n type: 'string',\n description: 'Force package manager'\n }),\n async handler(args) {\n const spinner = container.get(SpinnerService);\n\n try {\n spinner.spin('Loading project ...');\n const root = args.project = await Project.searchProjectRoot(args.project);\n\n container.bind(Project)\n .toDynamicValue(() => new Project(root, {\n packageManager: args['package-manager']\n }))\n .whenTargetNamed(CURRENT);\n } finally {\n spinner.stop();\n }\n }\n});\n"]}
@@ -1,3 +0,0 @@
1
- export declare const loadWorkspace: import("../utils").Middleware<unknown, {
2
- workspace: string | undefined;
3
- }>;
@@ -1 +0,0 @@
1
- {"version":3,"sources":["middlewares/load-workspace.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,aAAa;;EA2BxB,CAAC","file":"load-workspace.d.ts","sourcesContent":["import yargs from 'yargs';\n\nimport { container, CURRENT, SpinnerService } from '../services';\nimport { Project, Workspace } from '../project';\nimport { defineMiddleware } from '../utils';\n\n// Middleware\nexport const loadWorkspace = defineMiddleware({\n builder: (yargs) => yargs\n .option('workspace', {\n alias: 'w',\n type: 'string',\n desc: 'Workspace to use'\n }),\n async handler(args): Promise<void> {\n const spinner = container.get(SpinnerService);\n const project = container.getNamed(Project, CURRENT);\n\n try {\n spinner.spin(`Loading \"${args.workspace || '.'}\" workspace ...`);\n const workspace = await project.workspace(args.workspace);\n\n if (!workspace) {\n spinner.failed(`Workspace \"${args.workspace || '.'}\" not found`);\n yargs.exit(1, new Error('Workspace not found'));\n } else {\n container.bind(Workspace)\n .toConstantValue(workspace)\n .whenTargetNamed(CURRENT);\n }\n } finally {\n spinner.stop();\n }\n }\n});\n"]}
@@ -1 +0,0 @@
1
- export declare const setupInk: import("../utils").Middleware<unknown, unknown>;
@@ -1 +0,0 @@
1
- {"version":3,"sources":["middlewares/setup-ink.tsx"],"names":[],"mappings":"AAOA,eAAO,MAAM,QAAQ,iDAOnB,CAAC","file":"setup-ink.d.ts","sourcesContent":["import { render } from 'ink';\n\nimport { container, INK_APP } from '../services';\nimport { Layout } from '../ui';\nimport { defineMiddleware } from '../utils';\n\n// Middleware\nexport const setupInk = defineMiddleware({\n handler() {\n container.bind(INK_APP)\n .toConstantValue(render(<Layout/>, {\n stdout: process.stdout.isTTY ? process.stdout : process.stderr,\n }));\n }\n});\n"]}
@@ -1,2 +0,0 @@
1
- export * from './project';
2
- export * from './workspace';
@@ -1 +0,0 @@
1
- {"version":3,"sources":["project/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC","file":"index.d.ts","sourcesContent":["export * from './project';\nexport * from './workspace';\n"]}
@@ -1,25 +0,0 @@
1
- import { Workspace } from './workspace';
2
- export declare type PackageManager = 'npm' | 'yarn';
3
- export interface ProjectOptions {
4
- packageManager?: PackageManager | undefined;
5
- }
6
- export declare class Project {
7
- private readonly _root;
8
- private _mainWorkspace?;
9
- private readonly _names;
10
- private readonly _workspaces;
11
- private _packageManager?;
12
- private _isFullyLoaded;
13
- private _lock;
14
- private readonly _logger;
15
- constructor(_root: string, opts?: ProjectOptions);
16
- static searchProjectRoot(dir: string): Promise<string>;
17
- private _loadManifest;
18
- private _loadWorkspace;
19
- packageManager(): Promise<PackageManager>;
20
- mainWorkspace(): Promise<Workspace>;
21
- currentWorkspace(cwd?: string): Promise<Workspace | null>;
22
- workspaces(): AsyncGenerator<Workspace, void>;
23
- workspace(name?: string): Promise<Workspace | null>;
24
- get root(): string;
25
- }