@jujulego/jill 2.1.0-alpha.1 → 2.1.0-alpha.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 (75) hide show
  1. package/dist/commands/each.d.ts.map +1 -1
  2. package/dist/commands/each.js +1 -1
  3. package/dist/commands/each.js.map +1 -1
  4. package/dist/commands/group.d.ts.map +1 -1
  5. package/dist/commands/list.d.ts.map +1 -1
  6. package/dist/commands/run.d.ts.map +1 -1
  7. package/dist/commands/tree.d.ts.map +1 -1
  8. package/dist/filters/affected.filter.d.ts.map +1 -1
  9. package/dist/filters/index.d.ts.map +1 -1
  10. package/dist/filters/pipeline.d.ts.map +1 -1
  11. package/dist/filters/private.filter.d.ts.map +1 -1
  12. package/dist/filters/scripts.filter.d.ts.map +1 -1
  13. package/dist/git.d.ts.map +1 -1
  14. package/dist/main.d.ts.map +1 -1
  15. package/dist/middlewares/global-config.d.ts +1 -1
  16. package/dist/middlewares/global-config.d.ts.map +1 -1
  17. package/dist/middlewares/global-config.js +7 -0
  18. package/dist/middlewares/global-config.js.map +1 -1
  19. package/dist/middlewares/index.d.ts.map +1 -1
  20. package/dist/middlewares/load-project.d.ts.map +1 -1
  21. package/dist/middlewares/load-workspace.d.ts.map +1 -1
  22. package/dist/middlewares/setup-ink.d.ts.map +1 -1
  23. package/dist/project/index.d.ts.map +1 -1
  24. package/dist/project/project.d.ts.map +1 -1
  25. package/dist/project/workspace.d.ts.map +1 -1
  26. package/dist/services/index.d.ts.map +1 -1
  27. package/dist/services/inversify.config.d.ts.map +1 -1
  28. package/dist/services/logger.service.d.ts.map +1 -1
  29. package/dist/services/spinner.service.d.ts +3 -5
  30. package/dist/services/spinner.service.d.ts.map +1 -1
  31. package/dist/services/spinner.service.js +6 -17
  32. package/dist/services/spinner.service.js.map +1 -1
  33. package/dist/services/task-manager.service.d.ts.map +1 -1
  34. package/dist/types.d.ts.map +1 -1
  35. package/dist/ui/global-spinner.d.ts.map +1 -1
  36. package/dist/ui/global-spinner.js +1 -1
  37. package/dist/ui/global-spinner.js.map +1 -1
  38. package/dist/ui/group-task-spinner.d.ts.map +1 -1
  39. package/dist/ui/index.d.ts +1 -0
  40. package/dist/ui/index.d.ts.map +1 -1
  41. package/dist/ui/index.js +1 -0
  42. package/dist/ui/index.js.map +1 -1
  43. package/dist/ui/layout.d.ts.map +1 -1
  44. package/dist/ui/list.d.ts.map +1 -1
  45. package/dist/ui/static-logs.d.ts.map +1 -1
  46. package/dist/ui/task-manager-spinner.d.ts.map +1 -1
  47. package/dist/ui/task-name.d.ts.map +1 -1
  48. package/dist/ui/task-spinner.d.ts.map +1 -1
  49. package/dist/ui/task-spinner.js +6 -4
  50. package/dist/ui/task-spinner.js.map +1 -1
  51. package/dist/ui/workspace-tree.d.ts.map +1 -1
  52. package/dist/ui/workspace-tree.js +3 -2
  53. package/dist/ui/workspace-tree.js.map +1 -1
  54. package/dist/utils/index.d.ts +3 -0
  55. package/dist/utils/index.d.ts.map +1 -0
  56. package/dist/{index.js → utils/index.js} +3 -7
  57. package/dist/utils/index.js.map +1 -0
  58. package/dist/utils/streams.d.ts +3 -0
  59. package/dist/utils/streams.d.ts.map +1 -0
  60. package/dist/{utils.js → utils/streams.js} +6 -28
  61. package/dist/utils/streams.js.map +1 -0
  62. package/dist/utils/string.d.ts +1 -0
  63. package/dist/utils/string.d.ts.map +1 -0
  64. package/dist/utils/string.js +14 -0
  65. package/dist/utils/string.js.map +1 -0
  66. package/dist/{utils.d.ts → utils/yargs.d.ts} +2 -6
  67. package/dist/utils/yargs.d.ts.map +1 -0
  68. package/dist/utils/yargs.js +33 -0
  69. package/dist/utils/yargs.js.map +1 -0
  70. package/package.json +8 -13
  71. package/dist/index.d.ts +0 -7
  72. package/dist/index.d.ts.map +0 -1
  73. package/dist/index.js.map +0 -1
  74. package/dist/utils.d.ts.map +0 -1
  75. package/dist/utils.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["ui/global-spinner.js"],"sourcesContent":["import { Text } from 'ink';\nimport Spinner from 'ink-spinner';\nimport symbols from 'log-symbols';\nimport { FC, useLayoutEffect, useState } from 'react';\n\nimport { container, SpinnerService, SpinnerState } from '../services';\n\n// Components\nexport const GlobalSpinner: FC = () => {\n // State\n const [state, setState] = useState<SpinnerState>({ status: 'stop', label: '' });\n\n // Effect\n useLayoutEffect(() => {\n const spinner = container.get(SpinnerService);\n setState(spinner.state);\n\n return spinner.subscribe(setState);\n }, []);\n\n // Render\n switch (state.status) {\n case 'spin':\n return (\n <Text>\n <Spinner />{' ' + state.label}\n </Text>\n );\n\n case 'success':\n return (\n <Text color=\"green\">\n {symbols.success} {state.label}\n </Text>\n );\n\n case 'failed':\n return (\n <Text color=\"red\">\n {symbols.error} {state.label}\n </Text>\n );\n\n case 'stop':\n default:\n return null;\n }\n};\n"],"names":["GlobalSpinner","state","setState","useState","status","label","useLayoutEffect","spinner","container","get","SpinnerService","subscribe","Text","Spinner","color","symbols","success","error"],"mappings":"AAAA;;;;+BAQaA;;aAAAA;;;qBARQ;iEACD;iEACA;uBAC0B;0BAEU;;;;;;AAGjD,MAAMA,gBAAoB,IAAM;IACrC,QAAQ;IACR,MAAM,CAACC,OAAOC,SAAS,GAAGC,IAAAA,eAAQ,EAAe;QAAEC,QAAQ;QAAQC,OAAO;IAAG;IAE7E,SAAS;IACTC,IAAAA,sBAAe,EAAC,IAAM;QACpB,MAAMC,UAAUC,mBAAS,CAACC,GAAG,CAACC,wBAAc;QAC5CR,SAASK,QAAQN,KAAK;QAEtB,OAAOM,QAAQI,SAAS,CAACT;IAC3B,GAAG,EAAE;IAEL,SAAS;IACT,OAAQD,MAAMG,MAAM;QAClB,KAAK;YACH,qBACE,sBAACQ,SAAI;;kCACH,qBAACC,mBAAO;oBAAI,MAAMZ,MAAMI,KAAK;;;QAInC,KAAK;YACH,qBACE,sBAACO,SAAI;gBAACE,OAAM;;oBACTC,mBAAO,CAACC,OAAO;oBAAC;oBAAEf,MAAMI,KAAK;;;QAIpC,KAAK;YACH,qBACE,sBAACO,SAAI;gBAACE,OAAM;;oBACTC,mBAAO,CAACE,KAAK;oBAAC;oBAAEhB,MAAMI,KAAK;;;QAIlC,KAAK;QACL;YACE,OAAO,IAAI;IACf;AACF","file":"global-spinner.js"}
1
+ {"version":3,"sources":["ui/global-spinner.js"],"sourcesContent":["import { Text } from 'ink';\nimport Spinner from 'ink-spinner';\nimport symbols from 'log-symbols';\nimport { FC, useLayoutEffect, useState } from 'react';\n\nimport { container, SpinnerService, SpinnerState } from '../services';\n\n// Components\nexport const GlobalSpinner: FC = () => {\n // State\n const [state, setState] = useState<SpinnerState>({ status: 'stop', label: '' });\n\n // Effect\n useLayoutEffect(() => {\n const spinner = container.get(SpinnerService);\n setState(spinner.state);\n\n return spinner.subscribe('update', setState);\n }, []);\n\n // Render\n switch (state.status) {\n case 'spin':\n return (\n <Text>\n <Spinner />{' ' + state.label}\n </Text>\n );\n\n case 'success':\n return (\n <Text color=\"green\">\n {symbols.success} {state.label}\n </Text>\n );\n\n case 'failed':\n return (\n <Text color=\"red\">\n {symbols.error} {state.label}\n </Text>\n );\n\n case 'stop':\n default:\n return null;\n }\n};\n"],"names":["GlobalSpinner","state","setState","useState","status","label","useLayoutEffect","spinner","container","get","SpinnerService","subscribe","Text","Spinner","color","symbols","success","error"],"mappings":"AAAA;;;;+BAQaA;;aAAAA;;;qBARQ;iEACD;iEACA;uBAC0B;0BAEU;;;;;;AAGjD,MAAMA,gBAAoB,IAAM;IACrC,QAAQ;IACR,MAAM,CAACC,OAAOC,SAAS,GAAGC,IAAAA,eAAQ,EAAe;QAAEC,QAAQ;QAAQC,OAAO;IAAG;IAE7E,SAAS;IACTC,IAAAA,sBAAe,EAAC,IAAM;QACpB,MAAMC,UAAUC,mBAAS,CAACC,GAAG,CAACC,wBAAc;QAC5CR,SAASK,QAAQN,KAAK;QAEtB,OAAOM,QAAQI,SAAS,CAAC,UAAUT;IACrC,GAAG,EAAE;IAEL,SAAS;IACT,OAAQD,MAAMG,MAAM;QAClB,KAAK;YACH,qBACE,sBAACQ,SAAI;;kCACH,qBAACC,mBAAO;oBAAI,MAAMZ,MAAMI,KAAK;;;QAInC,KAAK;YACH,qBACE,sBAACO,SAAI;gBAACE,OAAM;;oBACTC,mBAAO,CAACC,OAAO;oBAAC;oBAAEf,MAAMI,KAAK;;;QAIpC,KAAK;YACH,qBACE,sBAACO,SAAI;gBAACE,OAAM;;oBACTC,mBAAO,CAACE,KAAK;oBAAC;oBAAEhB,MAAMI,KAAK;;;QAIlC,KAAK;QACL;YACE,OAAO,IAAI;IACf;AACF","file":"global-spinner.js"}
@@ -1 +1 @@
1
- {"version":3,"sources":["ui/group-task-spinner.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,EAAE,EAA6B,MAAM,OAAO,CAAC;AAKtD,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,SAAS,CAAC;CAClB;AAGD,eAAO,MAAM,gBAAgB,EAAE,EAAE,CAAC,qBAAqB,CAkCtD,CAAC","file":"group-task-spinner.d.ts","sourcesContent":["import { GroupTask } from '@jujulego/tasks';\nimport { Box } from 'ink';\nimport { FC, useLayoutEffect, useState } from 'react';\n\nimport { TaskSpinner } from './task-spinner';\n\n// Types\nexport interface GroupTaskSpinnerProps {\n group: GroupTask;\n}\n\n// Components\nexport const GroupTaskSpinner: FC<GroupTaskSpinnerProps> = ({ group }) => {\n const [tasks, setTasks] = useState([...group.tasks]);\n\n useLayoutEffect(() => {\n let dirty = false;\n\n return group.subscribe('task.added', () => {\n if (!dirty) {\n dirty = true;\n\n queueMicrotask(() => {\n setTasks([...group.tasks]);\n dirty = false;\n });\n }\n });\n }, [group]);\n\n return (\n <>\n <TaskSpinner task={group} />\n <Box flexDirection=\"column\" marginLeft={2}>\n { tasks.map((task) => (\n <Box key={task.id}>\n { (task instanceof GroupTask) ? (\n <GroupTaskSpinner group={task} />\n ) : (\n <TaskSpinner task={task} />\n ) }\n </Box>\n )) }\n </Box>\n </>\n );\n};\n"]}
1
+ {"version":3,"sources":["../../src/ui/group-task-spinner.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,EAAE,EAA6B,MAAM,OAAO,CAAC;AAKtD,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,SAAS,CAAC;CAClB;AAGD,eAAO,MAAM,gBAAgB,EAAE,EAAE,CAAC,qBAAqB,CAkCtD,CAAC","file":"group-task-spinner.d.ts","sourcesContent":["import { GroupTask } from '@jujulego/tasks';\nimport { Box } from 'ink';\nimport { FC, useLayoutEffect, useState } from 'react';\n\nimport { TaskSpinner } from './task-spinner';\n\n// Types\nexport interface GroupTaskSpinnerProps {\n group: GroupTask;\n}\n\n// Components\nexport const GroupTaskSpinner: FC<GroupTaskSpinnerProps> = ({ group }) => {\n const [tasks, setTasks] = useState([...group.tasks]);\n\n useLayoutEffect(() => {\n let dirty = false;\n\n return group.subscribe('task.added', () => {\n if (!dirty) {\n dirty = true;\n\n queueMicrotask(() => {\n setTasks([...group.tasks]);\n dirty = false;\n });\n }\n });\n }, [group]);\n\n return (\n <>\n <TaskSpinner task={group} />\n <Box flexDirection=\"column\" marginLeft={2}>\n { tasks.map((task) => (\n <Box key={task.id}>\n { (task instanceof GroupTask) ? (\n <GroupTaskSpinner group={task} />\n ) : (\n <TaskSpinner task={task} />\n ) }\n </Box>\n )) }\n </Box>\n </>\n );\n};\n"]}
@@ -3,5 +3,6 @@ export * from './layout';
3
3
  export * from './list';
4
4
  export * from './static-logs';
5
5
  export * from './task-manager-spinner';
6
+ export * from './task-name';
6
7
  export * from './task-spinner';
7
8
  export * from './workspace-tree';
@@ -1 +1 @@
1
- {"version":3,"sources":["ui/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC","file":"index.d.ts","sourcesContent":["export * from './global-spinner';\nexport * from './layout';\nexport * from './list';\nexport * from './static-logs';\nexport * from './task-manager-spinner';\nexport * from './task-spinner';\nexport * from './workspace-tree';\n"]}
1
+ {"version":3,"sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC","file":"index.d.ts","sourcesContent":["export * from './global-spinner';\nexport * from './layout';\nexport * from './list';\nexport * from './static-logs';\nexport * from './task-manager-spinner';\nexport * from './task-name';\nexport * from './task-spinner';\nexport * from './workspace-tree';\n"]}
package/dist/ui/index.js CHANGED
@@ -7,6 +7,7 @@ _exportStar(require("./layout"), exports);
7
7
  _exportStar(require("./list"), exports);
8
8
  _exportStar(require("./static-logs"), exports);
9
9
  _exportStar(require("./task-manager-spinner"), exports);
10
+ _exportStar(require("./task-name"), exports);
10
11
  _exportStar(require("./task-spinner"), exports);
11
12
  _exportStar(require("./workspace-tree"), exports);
12
13
  function _exportStar(from, to) {
@@ -1 +1 @@
1
- {"version":3,"sources":["ui/index.js"],"sourcesContent":["export * from './global-spinner';\nexport * from './layout';\nexport * from './list';\nexport * from './static-logs';\nexport * from './task-manager-spinner';\nexport * from './task-spinner';\nexport * from './workspace-tree';\n"],"names":[],"mappings":"AAAA;;;;oBAAc;oBACA;oBACA;oBACA;oBACA;oBACA;oBACA","file":"index.js"}
1
+ {"version":3,"sources":["ui/index.js"],"sourcesContent":["export * from './global-spinner';\nexport * from './layout';\nexport * from './list';\nexport * from './static-logs';\nexport * from './task-manager-spinner';\nexport * from './task-name';\nexport * from './task-spinner';\nexport * from './workspace-tree';\n"],"names":[],"mappings":"AAAA;;;;oBAAc;oBACA;oBACA;oBACA;oBACA;oBACA;oBACA;oBACA","file":"index.js"}
@@ -1 +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"]}
1
+ {"version":3,"sources":["../../src/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"]}
@@ -1 +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"]}
1
+ {"version":3,"sources":["../../src/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"]}
@@ -1 +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"]}
1
+ {"version":3,"sources":["../../src/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"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["ui/task-manager-spinner.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAa,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,EAAE,EAA6B,MAAM,OAAO,CAAC;AAMtD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,WAAW,CAAC;CACtB;AAGD,eAAO,MAAM,kBAAkB,EAAE,EAAE,CAAC,iBAAiB,CA6BpD,CAAC","file":"task-manager-spinner.d.ts","sourcesContent":["import { GroupTask, TaskManager } from '@jujulego/tasks';\nimport { FC, useLayoutEffect, useState } from 'react';\n\nimport { TaskSpinner } from './task-spinner';\nimport { GroupTaskSpinner } from './group-task-spinner';\n\n// Types\nexport interface TasksSpinnerProps {\n manager: TaskManager;\n}\n\n// Components\nexport const TaskManagerSpinner: FC<TasksSpinnerProps> = ({ manager }) => {\n const [tasks, setTasks] = useState(manager.tasks.filter((tsk) => !tsk.context.groupTask));\n\n useLayoutEffect(() => {\n let dirty = false;\n\n return manager.subscribe('added', () => {\n if (!dirty) {\n dirty = true;\n\n queueMicrotask(() => {\n setTasks(manager.tasks.filter((tsk) => !tsk.context.groupTask));\n dirty = false;\n });\n }\n });\n }, [manager]);\n\n return (\n <>\n { tasks.map((task) =>\n (task instanceof GroupTask) ? (\n <GroupTaskSpinner key={task.id} group={task} />\n ) : (\n <TaskSpinner key={task.id} task={task} />\n )\n ) }\n </>\n );\n};\n"]}
1
+ {"version":3,"sources":["../../src/ui/task-manager-spinner.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAa,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,EAAE,EAA6B,MAAM,OAAO,CAAC;AAMtD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,WAAW,CAAC;CACtB;AAGD,eAAO,MAAM,kBAAkB,EAAE,EAAE,CAAC,iBAAiB,CA6BpD,CAAC","file":"task-manager-spinner.d.ts","sourcesContent":["import { GroupTask, TaskManager } from '@jujulego/tasks';\nimport { FC, useLayoutEffect, useState } from 'react';\n\nimport { TaskSpinner } from './task-spinner';\nimport { GroupTaskSpinner } from './group-task-spinner';\n\n// Types\nexport interface TasksSpinnerProps {\n manager: TaskManager;\n}\n\n// Components\nexport const TaskManagerSpinner: FC<TasksSpinnerProps> = ({ manager }) => {\n const [tasks, setTasks] = useState(manager.tasks.filter((tsk) => !tsk.context.groupTask));\n\n useLayoutEffect(() => {\n let dirty = false;\n\n return manager.subscribe('added', () => {\n if (!dirty) {\n dirty = true;\n\n queueMicrotask(() => {\n setTasks(manager.tasks.filter((tsk) => !tsk.context.groupTask));\n dirty = false;\n });\n }\n });\n }, [manager]);\n\n return (\n <>\n { tasks.map((task) =>\n (task instanceof GroupTask) ? (\n <GroupTaskSpinner key={task.id} group={task} />\n ) : (\n <TaskSpinner key={task.id} task={task} />\n )\n ) }\n </>\n );\n};\n"]}
@@ -1 +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"]}
1
+ {"version":3,"sources":["../../src/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"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["ui/task-spinner.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAKvC,OAAO,EAAE,EAAE,EAA6B,MAAM,OAAO,CAAC;AAKtD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,IAAI,CAAC;CACZ;AAGD,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CAmD5C,CAAC","file":"task-spinner.d.ts","sourcesContent":["import { Task } from '@jujulego/tasks';\nimport { Text } from 'ink';\nimport Spinner from 'ink-spinner';\nimport symbols from 'log-symbols';\nimport ms from 'pretty-ms';\nimport { FC, useLayoutEffect, useState } from 'react';\n\nimport { TaskName } from './task-name';\n\n// Types\nexport interface TaskSpinnerProps {\n task: Task;\n}\n\n// Components\nexport const TaskSpinner: FC<TaskSpinnerProps> = ({ task }) => {\n // State\n const [status, setStatus] = useState(task.status);\n const [time, setTime] = useState(0);\n\n // Effects\n useLayoutEffect(() => {\n return task.subscribe('status', (event) => {\n setStatus(event.status);\n });\n }, [task]);\n\n useLayoutEffect(() => {\n return task.subscribe('completed', ({ duration }) => {\n setTime(duration);\n });\n }, [task]);\n\n // Render\n switch (status) {\n case 'blocked':\n case 'ready':\n return (\n <Text color=\"grey\">\n <Spinner type=\"line2\" />{' '}<TaskName task={task} />\n </Text>\n );\n\n case 'running':\n return (\n <Text>\n <Spinner />{' '}<TaskName task={task} />\n </Text>\n );\n\n case 'done':\n return (\n <Text>\n <Text color=\"green\">{ symbols.success }{' '}<TaskName task={task} /></Text>\n <Text color=\"magenta\">{' '}took { ms(time) }</Text>\n </Text>\n );\n\n case 'failed':\n return (\n <Text>\n <Text color=\"red\">{ symbols.error }{' '}<TaskName task={task} /></Text>\n <Text color=\"magenta\">{' '}took { ms(time) }</Text>\n </Text>\n );\n }\n};\n"]}
1
+ {"version":3,"sources":["../../src/ui/task-spinner.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAKvC,OAAO,EAAE,EAAE,EAA6B,MAAM,OAAO,CAAC;AAKtD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,IAAI,CAAC;CACZ;AAGD,eAAO,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CAmD5C,CAAC","file":"task-spinner.d.ts","sourcesContent":["import { Task } from '@jujulego/tasks';\nimport { Text } from 'ink';\nimport Spinner from 'ink-spinner';\nimport symbols from 'log-symbols';\nimport ms from 'pretty-ms';\nimport { FC, useLayoutEffect, useState } from 'react';\n\nimport { TaskName } from './task-name';\n\n// Types\nexport interface TaskSpinnerProps {\n task: Task;\n}\n\n// Components\nexport const TaskSpinner: FC<TaskSpinnerProps> = ({ task }) => {\n // State\n const [status, setStatus] = useState(task.status);\n const [time, setTime] = useState(0);\n\n // Effects\n useLayoutEffect(() => {\n return task.subscribe('status', (event) => {\n setStatus(event.status);\n });\n }, [task]);\n\n useLayoutEffect(() => {\n return task.subscribe('completed', ({ duration }) => {\n setTime(duration);\n });\n }, [task]);\n\n // Render\n switch (status) {\n case 'blocked':\n case 'ready':\n return (\n <Text color=\"grey\">\n <Spinner type=\"line2\" />{' '}<TaskName task={task} />\n </Text>\n );\n\n case 'running':\n return (\n <Text>\n <Spinner />{' '}<TaskName task={task} />\n </Text>\n );\n\n case 'done':\n return (\n <Text>\n <Text color=\"green\">{ symbols.success }{' '}<TaskName task={task} /></Text>\n <Text color=\"magenta\">{' '}(took { ms(time) })</Text>\n </Text>\n );\n\n case 'failed':\n return (\n <Text>\n <Text color=\"red\">{ symbols.error }{' '}<TaskName task={task} /></Text>\n <Text color=\"magenta\">{' '}(took { ms(time) })</Text>\n </Text>\n );\n }\n};\n"]}
@@ -80,8 +80,9 @@ const TaskSpinner = ({ task })=>{
80
80
  color: "magenta",
81
81
  children: [
82
82
  ' ',
83
- "took ",
84
- (0, _prettyMs.default)(time)
83
+ "(took ",
84
+ (0, _prettyMs.default)(time),
85
+ ")"
85
86
  ]
86
87
  })
87
88
  ]
@@ -103,8 +104,9 @@ const TaskSpinner = ({ task })=>{
103
104
  color: "magenta",
104
105
  children: [
105
106
  ' ',
106
- "took ",
107
- (0, _prettyMs.default)(time)
107
+ "(took ",
108
+ (0, _prettyMs.default)(time),
109
+ ")"
108
110
  ]
109
111
  })
110
112
  ]
@@ -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 'pretty-ms';\nimport { FC, useLayoutEffect, useState } from 'react';\n\nimport { TaskName } from './task-name';\n\n// Types\nexport interface TaskSpinnerProps {\n task: Task;\n}\n\n// Components\nexport const TaskSpinner: FC<TaskSpinnerProps> = ({ task }) => {\n // State\n const [status, setStatus] = useState(task.status);\n const [time, setTime] = useState(0);\n\n // Effects\n useLayoutEffect(() => {\n return task.subscribe('status', (event) => {\n setStatus(event.status);\n });\n }, [task]);\n\n useLayoutEffect(() => {\n return task.subscribe('completed', ({ duration }) => {\n setTime(duration);\n });\n }, [task]);\n\n // Render\n switch (status) {\n case 'blocked':\n case 'ready':\n return (\n <Text color=\"grey\">\n <Spinner type=\"line2\" />{' '}<TaskName task={task} />\n </Text>\n );\n\n case 'running':\n return (\n <Text>\n <Spinner />{' '}<TaskName task={task} />\n </Text>\n );\n\n case 'done':\n return (\n <Text>\n <Text color=\"green\">{ symbols.success }{' '}<TaskName task={task} /></Text>\n <Text color=\"magenta\">{' '}took { ms(time) }</Text>\n </Text>\n );\n\n case 'failed':\n return (\n <Text>\n <Text color=\"red\">{ symbols.error }{' '}<TaskName task={task} /></Text>\n <Text color=\"magenta\">{' '}took { ms(time) }</Text>\n </Text>\n );\n }\n};\n"],"names":["TaskSpinner","task","status","setStatus","useState","time","setTime","useLayoutEffect","subscribe","event","duration","Text","color","Spinner","type","TaskName","symbols","success","ms","error"],"mappings":"AAAA;;;;+BAeaA;;aAAAA;;;qBAdQ;iEACD;iEACA;+DACL;uBAC+B;0BAErB;;;;;;AAQlB,MAAMA,cAAoC,CAAC,EAAEC,KAAI,EAAE,GAAK;IAC7D,QAAQ;IACR,MAAM,CAACC,QAAQC,UAAU,GAAGC,IAAAA,eAAQ,EAACH,KAAKC,MAAM;IAChD,MAAM,CAACG,MAAMC,QAAQ,GAAGF,IAAAA,eAAQ,EAAC;IAEjC,UAAU;IACVG,IAAAA,sBAAe,EAAC,IAAM;QACpB,OAAON,KAAKO,SAAS,CAAC,UAAU,CAACC,QAAU;YACzCN,UAAUM,MAAMP,MAAM;QACxB;IACF,GAAG;QAACD;KAAK;IAETM,IAAAA,sBAAe,EAAC,IAAM;QACpB,OAAON,KAAKO,SAAS,CAAC,aAAa,CAAC,EAAEE,SAAQ,EAAE,GAAK;YACnDJ,QAAQI;QACV;IACF,GAAG;QAACT;KAAK;IAET,SAAS;IACT,OAAQC;QACN,KAAK;QACL,KAAK;YACH,qBACE,sBAACS,SAAI;gBAACC,OAAM;;kCACV,qBAACC,mBAAO;wBAACC,MAAK;;oBAAW;kCAAI,qBAACC,kBAAQ;wBAACd,MAAMA;;;;QAInD,KAAK;YACH,qBACE,sBAACU,SAAI;;kCACH,qBAACE,mBAAO;oBAAI;kCAAI,qBAACE,kBAAQ;wBAACd,MAAMA;;;;QAItC,KAAK;YACH,qBACE,sBAACU,SAAI;;kCACH,sBAACA,SAAI;wBAACC,OAAM;;4BAAUI,mBAAO,CAACC,OAAO;4BAAG;0CAAI,qBAACF,kBAAQ;gCAACd,MAAMA;;;;kCAC5D,sBAACU,SAAI;wBAACC,OAAM;;4BAAW;4BAAI;4BAAOM,IAAAA,iBAAE,EAACb;;;;;QAI3C,KAAK;YACH,qBACE,sBAACM,SAAI;;kCACH,sBAACA,SAAI;wBAACC,OAAM;;4BAAQI,mBAAO,CAACG,KAAK;4BAAG;0CAAI,qBAACJ,kBAAQ;gCAACd,MAAMA;;;;kCACxD,sBAACU,SAAI;wBAACC,OAAM;;4BAAW;4BAAI;4BAAOM,IAAAA,iBAAE,EAACb;;;;;IAG7C;AACF","file":"task-spinner.js"}
1
+ {"version":3,"sources":["ui/task-spinner.js"],"sourcesContent":["import { Task } from '@jujulego/tasks';\nimport { Text } from 'ink';\nimport Spinner from 'ink-spinner';\nimport symbols from 'log-symbols';\nimport ms from 'pretty-ms';\nimport { FC, useLayoutEffect, useState } from 'react';\n\nimport { TaskName } from './task-name';\n\n// Types\nexport interface TaskSpinnerProps {\n task: Task;\n}\n\n// Components\nexport const TaskSpinner: FC<TaskSpinnerProps> = ({ task }) => {\n // State\n const [status, setStatus] = useState(task.status);\n const [time, setTime] = useState(0);\n\n // Effects\n useLayoutEffect(() => {\n return task.subscribe('status', (event) => {\n setStatus(event.status);\n });\n }, [task]);\n\n useLayoutEffect(() => {\n return task.subscribe('completed', ({ duration }) => {\n setTime(duration);\n });\n }, [task]);\n\n // Render\n switch (status) {\n case 'blocked':\n case 'ready':\n return (\n <Text color=\"grey\">\n <Spinner type=\"line2\" />{' '}<TaskName task={task} />\n </Text>\n );\n\n case 'running':\n return (\n <Text>\n <Spinner />{' '}<TaskName task={task} />\n </Text>\n );\n\n case 'done':\n return (\n <Text>\n <Text color=\"green\">{ symbols.success }{' '}<TaskName task={task} /></Text>\n <Text color=\"magenta\">{' '}(took { ms(time) })</Text>\n </Text>\n );\n\n case 'failed':\n return (\n <Text>\n <Text color=\"red\">{ symbols.error }{' '}<TaskName task={task} /></Text>\n <Text color=\"magenta\">{' '}(took { ms(time) })</Text>\n </Text>\n );\n }\n};\n"],"names":["TaskSpinner","task","status","setStatus","useState","time","setTime","useLayoutEffect","subscribe","event","duration","Text","color","Spinner","type","TaskName","symbols","success","ms","error"],"mappings":"AAAA;;;;+BAeaA;;aAAAA;;;qBAdQ;iEACD;iEACA;+DACL;uBAC+B;0BAErB;;;;;;AAQlB,MAAMA,cAAoC,CAAC,EAAEC,KAAI,EAAE,GAAK;IAC7D,QAAQ;IACR,MAAM,CAACC,QAAQC,UAAU,GAAGC,IAAAA,eAAQ,EAACH,KAAKC,MAAM;IAChD,MAAM,CAACG,MAAMC,QAAQ,GAAGF,IAAAA,eAAQ,EAAC;IAEjC,UAAU;IACVG,IAAAA,sBAAe,EAAC,IAAM;QACpB,OAAON,KAAKO,SAAS,CAAC,UAAU,CAACC,QAAU;YACzCN,UAAUM,MAAMP,MAAM;QACxB;IACF,GAAG;QAACD;KAAK;IAETM,IAAAA,sBAAe,EAAC,IAAM;QACpB,OAAON,KAAKO,SAAS,CAAC,aAAa,CAAC,EAAEE,SAAQ,EAAE,GAAK;YACnDJ,QAAQI;QACV;IACF,GAAG;QAACT;KAAK;IAET,SAAS;IACT,OAAQC;QACN,KAAK;QACL,KAAK;YACH,qBACE,sBAACS,SAAI;gBAACC,OAAM;;kCACV,qBAACC,mBAAO;wBAACC,MAAK;;oBAAW;kCAAI,qBAACC,kBAAQ;wBAACd,MAAMA;;;;QAInD,KAAK;YACH,qBACE,sBAACU,SAAI;;kCACH,qBAACE,mBAAO;oBAAI;kCAAI,qBAACE,kBAAQ;wBAACd,MAAMA;;;;QAItC,KAAK;YACH,qBACE,sBAACU,SAAI;;kCACH,sBAACA,SAAI;wBAACC,OAAM;;4BAAUI,mBAAO,CAACC,OAAO;4BAAG;0CAAI,qBAACF,kBAAQ;gCAACd,MAAMA;;;;kCAC5D,sBAACU,SAAI;wBAACC,OAAM;;4BAAW;4BAAI;4BAAQM,IAAAA,iBAAE,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,iBAAE,EAACb;4BAAO;;;;;IAGrD;AACF","file":"task-spinner.js"}
@@ -1 +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"]}
1
+ {"version":3,"sources":["../../src/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,CAyChD,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 { (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"]}
@@ -50,7 +50,7 @@ const WorkspaceTree = (props)=>{
50
50
  wks.version
51
51
  ]
52
52
  }),
53
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(_ink.Newline, {}),
53
+ deps.length > 0 && /*#__PURE__*/ (0, _jsxRuntime.jsx)(_ink.Newline, {}),
54
54
  deps.map(([dep, isDev], idx)=>/*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Text, {
55
55
  children: [
56
56
  level,
@@ -77,7 +77,8 @@ const WorkspaceTree = (props)=>{
77
77
  })
78
78
  ]
79
79
  })
80
- })
80
+ }),
81
+ idx < deps.length - 1 && /*#__PURE__*/ (0, _jsxRuntime.jsx)(_ink.Newline, {})
81
82
  ]
82
83
  }, dep.name))
83
84
  ]
@@ -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 <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"}
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"}
@@ -0,0 +1,3 @@
1
+ export * from './streams';
2
+ export * from './string';
3
+ export * from './yargs';
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC","file":"index.d.ts","sourcesContent":["export * from './streams';\nexport * from './string';\nexport * from './yargs';\n"]}
@@ -2,13 +2,9 @@
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
- _exportStar(require("./filters"), exports);
6
- _exportStar(require("./git"), exports);
7
- _exportStar(require("./middlewares"), exports);
8
- _exportStar(require("./project"), exports);
9
- _exportStar(require("./services"), exports);
10
- _exportStar(require("./ui"), exports);
11
- _exportStar(require("./utils"), exports);
5
+ _exportStar(require("./streams"), exports);
6
+ _exportStar(require("./string"), exports);
7
+ _exportStar(require("./yargs"), exports);
12
8
  function _exportStar(from, to) {
13
9
  Object.keys(from).forEach(function(k) {
14
10
  if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) Object.defineProperty(to, k, {
@@ -0,0 +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"}
@@ -0,0 +1,3 @@
1
+ import { SpawnTask, SpawnTaskStream } from '@jujulego/tasks';
2
+ export declare function combine<T>(...generators: AsyncGenerator<T>[]): AsyncGenerator<T>;
3
+ export declare function streamLines(task: SpawnTask, stream: SpawnTaskStream): AsyncGenerator<string>;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/streams.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAI7D,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","file":"streams.d.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"]}
@@ -10,11 +10,7 @@ function _export(target, all) {
10
10
  }
11
11
  _export(exports, {
12
12
  combine: ()=>combine,
13
- streamLines: ()=>streamLines,
14
- applyMiddlewares: ()=>applyMiddlewares,
15
- defineCommand: ()=>defineCommand,
16
- defineMiddleware: ()=>defineMiddleware,
17
- capitalize: ()=>capitalize
13
+ streamLines: ()=>streamLines
18
14
  });
19
15
  const _eventTree = require("@jujulego/event-tree");
20
16
  async function* combine(...generators) {
@@ -25,7 +21,8 @@ async function* combine(...generators) {
25
21
  async function* streamLines(task, stream) {
26
22
  // Abort
27
23
  const ctrl = new AbortController();
28
- task.subscribe('completed', ()=>ctrl.abort());
24
+ const reason = new Error('aborted');
25
+ task.subscribe('completed', ()=>ctrl.abort(reason));
29
26
  // Stream
30
27
  let current = '';
31
28
  try {
@@ -33,14 +30,14 @@ async function* streamLines(task, stream) {
33
30
  signal: ctrl.signal
34
31
  })){
35
32
  const data = current + chunk.data.toString('utf-8');
36
- const lines = data.split(/\r?\n/g);
33
+ const lines = data.split(/\r?\n/);
37
34
  current = lines.pop() ?? '';
38
35
  for (const line of lines){
39
36
  yield line;
40
37
  }
41
38
  }
42
39
  } catch (err) {
43
- if (task.exitCode !== 0) {
40
+ if (err !== reason) {
44
41
  throw err;
45
42
  }
46
43
  if (current) {
@@ -48,24 +45,5 @@ async function* streamLines(task, stream) {
48
45
  }
49
46
  }
50
47
  }
51
- function applyMiddlewares(yargs, middlewares) {
52
- let tmp = yargs;
53
- for (const middleware of middlewares){
54
- if (middleware.builder) {
55
- tmp = middleware.builder(tmp);
56
- }
57
- tmp.middleware(middleware.handler);
58
- }
59
- return tmp;
60
- }
61
- function defineCommand(command) {
62
- return command;
63
- }
64
- function defineMiddleware(middleware) {
65
- return middleware;
66
- }
67
- function capitalize(txt) {
68
- return txt.charAt(0).toUpperCase() + txt.substring(1).toLowerCase();
69
- }
70
48
 
71
- //# sourceMappingURL=utils.js.map
49
+ //# sourceMappingURL=streams.js.map
@@ -0,0 +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"}
@@ -0,0 +1 @@
1
+ export declare function capitalize(txt: string): string;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/string.ts"],"names":[],"mappings":"AACA,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9C","file":"string.d.ts","sourcesContent":["// Utils\nexport function capitalize(txt: string): string {\n return txt.charAt(0).toUpperCase() + txt.substring(1).toLowerCase();\n}\n"]}
@@ -0,0 +1,14 @@
1
+ // Utils
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "capitalize", {
7
+ enumerable: true,
8
+ get: ()=>capitalize
9
+ });
10
+ function capitalize(txt) {
11
+ return txt.charAt(0).toUpperCase() + txt.substring(1).toLowerCase();
12
+ }
13
+
14
+ //# sourceMappingURL=string.js.map
@@ -0,0 +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,13 +1,9 @@
1
- import { SpawnTask, SpawnTaskStream } from '@jujulego/tasks';
2
1
  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>;
2
+ import { Awaitable } from '../types';
6
3
  export interface Middleware<T = unknown, U = unknown> {
7
4
  builder?: (yargs: Argv<T>) => Argv<U>;
8
5
  handler(args: Arguments<U>): Awaitable<void>;
9
6
  }
10
- export declare function applyMiddlewares<T>(yargs: Argv<T>, middlewares: Middleware[]): Argv<T>;
11
7
  export declare function defineCommand<T, U>(command: CommandModule<T, U>): CommandModule<T, U>;
12
8
  export declare function defineMiddleware<T, U>(middleware: Middleware<T, U>): Middleware<T, U>;
13
- export declare function capitalize(txt: string): string;
9
+ export declare function applyMiddlewares<T>(yargs: Argv<T>, middlewares: Middleware[]): Argv<T>;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/yargs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEvD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGrC,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;AAGD,wBAAgB,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAErF;AAGD,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAErF;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAYtF","file":"yargs.d.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"]}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: all[name]
9
+ });
10
+ }
11
+ _export(exports, {
12
+ defineCommand: ()=>defineCommand,
13
+ defineMiddleware: ()=>defineMiddleware,
14
+ applyMiddlewares: ()=>applyMiddlewares
15
+ });
16
+ function defineCommand(command) {
17
+ return command;
18
+ }
19
+ function defineMiddleware(middleware) {
20
+ return middleware;
21
+ }
22
+ function applyMiddlewares(yargs, middlewares) {
23
+ let tmp = yargs;
24
+ for (const middleware of middlewares){
25
+ if (middleware.builder) {
26
+ tmp = middleware.builder(tmp);
27
+ }
28
+ tmp.middleware(middleware.handler);
29
+ }
30
+ return tmp;
31
+ }
32
+
33
+ //# sourceMappingURL=yargs.js.map
@@ -0,0 +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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jujulego/jill",
3
- "version": "2.1.0-alpha.1",
3
+ "version": "2.1.0-alpha.2",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -11,12 +11,7 @@
11
11
  "dist"
12
12
  ],
13
13
  "bin": "./bin/jill.js",
14
- "main": "./dist/index.js",
15
- "types": "./dist/index.d.ts",
16
- "exports": {
17
- "require": "./dist/index.js",
18
- "types": "./dist/index.d.ts"
19
- },
14
+ "main": "./dist/main.js",
20
15
  "scripts": {
21
16
  "lint": "eslint .",
22
17
  "clean": "gulp clean",
@@ -51,23 +46,23 @@
51
46
  },
52
47
  "devDependencies": {
53
48
  "@jujulego/flow": "1.1.0",
54
- "@swc/core": "1.3.11",
49
+ "@swc/core": "1.3.14",
55
50
  "@swc/jest": "0.2.23",
56
51
  "@types/async-lock": "1.3.0",
57
52
  "@types/gulp": "4.0.9",
58
53
  "@types/gulp-sourcemaps": "0.0.35",
59
- "@types/jest": "29.2.0",
54
+ "@types/jest": "29.2.2",
60
55
  "@types/ms": "0.7.31",
61
56
  "@types/node": "16.18.3",
62
57
  "@types/normalize-package-data": "2.4.1",
63
58
  "@types/react": "17.0.52",
64
59
  "@types/semver": "7.3.13",
65
60
  "@types/yargs": "17.0.13",
66
- "@typescript-eslint/eslint-plugin": "5.41.0",
67
- "@typescript-eslint/parser": "5.41.0",
61
+ "@typescript-eslint/eslint-plugin": "5.42.0",
62
+ "@typescript-eslint/parser": "5.42.0",
68
63
  "del": "6.1.1",
69
- "eslint": "8.26.0",
70
- "eslint-plugin-jest": "27.1.3",
64
+ "eslint": "8.27.0",
65
+ "eslint-plugin-jest": "27.1.4",
71
66
  "eslint-plugin-react": "7.31.10",
72
67
  "eslint-plugin-react-hooks": "4.6.0",
73
68
  "eslint-plugin-workspaces": "0.7.0",
package/dist/index.d.ts DELETED
@@ -1,7 +0,0 @@
1
- export * from './filters';
2
- export * from './git';
3
- export * from './middlewares';
4
- export * from './project';
5
- export * from './services';
6
- export * from './ui';
7
- export * from './utils';
@@ -1 +0,0 @@
1
- {"version":3,"sources":["index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,OAAO,CAAC;AACtB,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,MAAM,CAAC;AACrB,cAAc,SAAS,CAAC","file":"index.d.ts","sourcesContent":["export * from './filters';\nexport * from './git';\nexport * from './middlewares';\nexport * from './project';\nexport * from './services';\nexport * from './ui';\nexport * from './utils';\n"]}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["index.js"],"sourcesContent":["export * from './filters';\nexport * from './git';\nexport * from './middlewares';\nexport * from './project';\nexport * from './services';\nexport * from './ui';\nexport * from './utils';\n"],"names":[],"mappings":"AAAA;;;;oBAAc;oBACA;oBACA;oBACA;oBACA;oBACA;oBACA","file":"index.js"}
@@ -1 +0,0 @@
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,CA6BnG;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('completed', () => 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"]}
package/dist/utils.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["utils.js"],"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('completed', () => 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"],"names":["combine","streamLines","applyMiddlewares","defineCommand","defineMiddleware","capitalize","generators","gen","task","stream","ctrl","AbortController","subscribe","abort","current","chunk","streamEvents","signal","data","toString","lines","split","pop","line","err","exitCode","yargs","middlewares","tmp","middleware","builder","handler","command","txt","charAt","toUpperCase","substring","toLowerCase"],"mappings":"AAAA;;;;;;;;;;;IAMuBA,OAAO,MAAPA;IAMAC,WAAW,MAAXA;IAqCPC,gBAAgB,MAAhBA;IAcAC,aAAa,MAAbA;IAIAC,gBAAgB,MAAhBA;IAKAC,UAAU,MAAVA;;2BAxEa;AAMtB,gBAAgBL,QAAW,GAAGM,UAA+B,EAAqB;IACvF,KAAK,MAAMC,OAAOD,WAAY;QAC5B,OAAOC;IACT;AACF;AAEO,gBAAgBN,YAAYO,IAAe,EAAEC,MAAuB,EAA0B;IACnG,QAAQ;IACR,MAAMC,OAAO,IAAIC;IAEjBH,KAAKI,SAAS,CAAC,aAAa,IAAMF,KAAKG,KAAK;IAE5C,SAAS;IACT,IAAIC,UAAU;IAEd,IAAI;QACF,WAAW,MAAMC,SAASC,IAAAA,uBAAY,EAACR,MAAM,CAAC,OAAO,EAAEC,OAAO,CAAC,EAAE;YAAEQ,QAAQP,KAAKO,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,IAAIhB,KAAKiB,QAAQ,KAAK,GAAG;YACvB,MAAMD,IAAI;QACZ,CAAC;QAED,IAAIV,SAAS;YACX,MAAMA;QACR,CAAC;IACH;AACF;AAQO,SAASZ,iBAAoBwB,KAAc,EAAEC,WAAyB,EAAW;IACtF,IAAIC,MAAqBF;IAEzB,KAAK,MAAMG,cAAcF,YAAa;QACpC,IAAIE,WAAWC,OAAO,EAAE;YACtBF,MAAMC,WAAWC,OAAO,CAACF;QAC3B,CAAC;QAEDA,IAAIC,UAAU,CAACA,WAAWE,OAAO;IACnC;IAEA,OAAOH;AACT;AAEO,SAASzB,cAAoB6B,OAA4B,EAAuB;IACrF,OAAOA;AACT;AAEO,SAAS5B,iBAAuByB,UAA4B,EAAoB;IACrF,OAAOA;AACT;AAGO,SAASxB,WAAW4B,GAAW,EAAU;IAC9C,OAAOA,IAAIC,MAAM,CAAC,GAAGC,WAAW,KAAKF,IAAIG,SAAS,CAAC,GAAGC,WAAW;AACnE","file":"utils.js"}