@jujulego/jill 2.0.0-alpha.1 → 2.0.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/dist/commands/list.d.ts.map +1 -1
  2. package/dist/commands/list.js +16 -15
  3. package/dist/commands/list.js.map +1 -1
  4. package/dist/commands/tree.d.ts +3 -0
  5. package/dist/commands/tree.d.ts.map +1 -0
  6. package/dist/commands/tree.js +35 -0
  7. package/dist/commands/tree.js.map +1 -0
  8. package/dist/index.d.ts +1 -1
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +1 -1
  11. package/dist/index.js.map +1 -1
  12. package/dist/main.d.ts.map +1 -1
  13. package/dist/main.js +5 -2
  14. package/dist/main.js.map +1 -1
  15. package/dist/middlewares/global-config.d.ts +5 -0
  16. package/dist/middlewares/global-config.d.ts.map +1 -0
  17. package/dist/middlewares/global-config.js +29 -0
  18. package/dist/middlewares/global-config.js.map +1 -0
  19. package/dist/{modifiers → middlewares}/index.d.ts +2 -1
  20. package/dist/middlewares/index.d.ts.map +1 -0
  21. package/dist/{modifiers → middlewares}/index.js +2 -1
  22. package/dist/middlewares/index.js.map +1 -0
  23. package/dist/{modifiers → middlewares}/load-project.d.ts +1 -2
  24. package/dist/middlewares/load-project.d.ts.map +1 -0
  25. package/dist/middlewares/load-project.js +41 -0
  26. package/dist/middlewares/load-project.js.map +1 -0
  27. package/dist/middlewares/load-workspace.d.ts +3 -0
  28. package/dist/middlewares/load-workspace.d.ts.map +1 -0
  29. package/dist/middlewares/load-workspace.js +42 -0
  30. package/dist/middlewares/load-workspace.js.map +1 -0
  31. package/dist/middlewares/setup-ink.d.ts +1 -0
  32. package/dist/middlewares/setup-ink.d.ts.map +1 -0
  33. package/dist/{modifiers → middlewares}/setup-ink.js +9 -6
  34. package/dist/middlewares/setup-ink.js.map +1 -0
  35. package/dist/services/inversify.config.d.ts +1 -1
  36. package/dist/services/inversify.config.d.ts.map +1 -1
  37. package/dist/services/inversify.config.js +2 -2
  38. package/dist/services/inversify.config.js.map +1 -1
  39. package/dist/services/logger.service.d.ts +3 -2
  40. package/dist/services/logger.service.d.ts.map +1 -1
  41. package/dist/services/logger.service.js +32 -15
  42. package/dist/services/logger.service.js.map +1 -1
  43. package/dist/services/spinner.service.d.ts +6 -2
  44. package/dist/services/spinner.service.d.ts.map +1 -1
  45. package/dist/services/spinner.service.js +22 -9
  46. package/dist/services/spinner.service.js.map +1 -1
  47. package/dist/ui/global-spinner.d.ts.map +1 -1
  48. package/dist/ui/global-spinner.js +31 -9
  49. package/dist/ui/global-spinner.js.map +1 -1
  50. package/dist/ui/index.d.ts +2 -1
  51. package/dist/ui/index.d.ts.map +1 -1
  52. package/dist/ui/index.js +2 -1
  53. package/dist/ui/index.js.map +1 -1
  54. package/dist/ui/layout.d.ts.map +1 -1
  55. package/dist/ui/layout.js +3 -2
  56. package/dist/ui/layout.js.map +1 -1
  57. package/dist/ui/list.d.ts +6 -0
  58. package/dist/ui/list.d.ts.map +1 -0
  59. package/dist/ui/list.js +30 -0
  60. package/dist/ui/list.js.map +1 -0
  61. package/dist/ui/static-logs.d.ts.map +1 -1
  62. package/dist/ui/static-logs.js +28 -44
  63. package/dist/ui/static-logs.js.map +1 -1
  64. package/dist/ui/workspace-tree.d.ts +8 -0
  65. package/dist/ui/workspace-tree.d.ts.map +1 -0
  66. package/dist/ui/workspace-tree.js +87 -0
  67. package/dist/ui/workspace-tree.js.map +1 -0
  68. package/dist/utils.d.ts +9 -3
  69. package/dist/utils.d.ts.map +1 -1
  70. package/dist/utils.js +16 -5
  71. package/dist/utils.js.map +1 -1
  72. package/package.json +3 -1
  73. package/dist/modifiers/global-config.d.ts +0 -6
  74. package/dist/modifiers/global-config.d.ts.map +0 -1
  75. package/dist/modifiers/global-config.js +0 -24
  76. package/dist/modifiers/global-config.js.map +0 -1
  77. package/dist/modifiers/index.d.ts.map +0 -1
  78. package/dist/modifiers/index.js.map +0 -1
  79. package/dist/modifiers/load-project.d.ts.map +0 -1
  80. package/dist/modifiers/load-project.js +0 -39
  81. package/dist/modifiers/load-project.js.map +0 -1
  82. package/dist/modifiers/setup-ink.d.ts +0 -2
  83. package/dist/modifiers/setup-ink.d.ts.map +0 -1
  84. package/dist/modifiers/setup-ink.js.map +0 -1
  85. package/dist/ui/cli-list.d.ts +0 -15
  86. package/dist/ui/cli-list.d.ts.map +0 -1
  87. package/dist/ui/cli-list.js +0 -66
  88. package/dist/ui/cli-list.js.map +0 -1
@@ -2,9 +2,15 @@
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
- Object.defineProperty(exports, "Logger", {
6
- enumerable: true,
7
- get: ()=>Logger
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
+ consoleFormat: ()=>consoleFormat,
13
+ Logger: ()=>Logger
8
14
  });
9
15
  const _chalk = /*#__PURE__*/ _interopRequireDefault(require("chalk"));
10
16
  const _inversify = require("inversify");
@@ -26,6 +32,28 @@ const VERBOSITY_LEVEL = {
26
32
  1: 'verbose',
27
33
  2: 'debug'
28
34
  };
35
+ const consoleFormat = _winston.default.format.combine(_winston.default.format.errors(), _winston.default.format.colorize({
36
+ message: true,
37
+ colors: {
38
+ debug: 'grey',
39
+ verbose: 'blue',
40
+ info: 'white',
41
+ error: 'red'
42
+ }
43
+ }), _winston.default.format.printf(({ label , message , ms })=>{
44
+ const lines = message.split('\n');
45
+ // Format
46
+ let spaces = '';
47
+ let formatted = `${lines[0]} ${_chalk.default.magenta(ms)}`;
48
+ if (label) {
49
+ spaces = ' '.repeat(label.length + 3);
50
+ formatted = `${_chalk.default.grey(`[${label}]`)} ${lines[0]} ${_chalk.default.magenta(ms)}`;
51
+ }
52
+ for(let i = 1; i < lines.length; ++i){
53
+ formatted += `\n${spaces}${lines[i]}`;
54
+ }
55
+ return formatted;
56
+ }));
29
57
  let Logger = class Logger {
30
58
  };
31
59
  Logger = __decorate([
@@ -38,18 +66,7 @@ _inversifyConfig.container.bind(Logger).toDynamicValue((context)=>{
38
66
  format: _winston.default.format.combine(_winston.default.format.timestamp(), _winston.default.format.ms()),
39
67
  transports: [
40
68
  new _winston.default.transports.Console({
41
- format: _winston.default.format.combine(_winston.default.format.errors(), _winston.default.format.colorize({
42
- message: true,
43
- colors: {
44
- debug: 'grey',
45
- verbose: 'blue',
46
- info: 'white',
47
- error: 'red'
48
- }
49
- }), _winston.default.format.printf(({ label , message })=>message.split('\n').map((line)=>[
50
- label && _chalk.default.grey(`[${label}]`),
51
- line
52
- ].filter((p)=>p).join(' ')).join('\n')))
69
+ format: consoleFormat
53
70
  })
54
71
  ]
55
72
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["services/logger.service.js"],"sourcesContent":["import chalk from 'chalk';\nimport { injectable } from 'inversify';\nimport winston from 'winston';\n\nimport { type GlobalConfig, GLOBAL_CONFIG, container } from './inversify.config';\n\n// Constants\nconst VERBOSITY_LEVEL: Record<number, string> = {\n 1: 'verbose',\n 2: 'debug',\n};\n\n// Types\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface Logger extends winston.Logger {}\n\n// Service\n@injectable()\nexport class Logger {}\n\ncontainer.bind(Logger)\n .toDynamicValue((context) => {\n const config = context.container.get<GlobalConfig>(GLOBAL_CONFIG);\n\n return winston.createLogger({\n level: VERBOSITY_LEVEL[Math.min(config.verbose, 2)],\n format: winston.format.combine(\n winston.format.timestamp(),\n winston.format.ms(),\n ),\n transports: [\n new winston.transports.Console({\n format: winston.format.combine(\n winston.format.errors(),\n winston.format.colorize({\n message: true,\n colors: { debug: 'grey', verbose: 'blue', info: 'white', error: 'red' }\n }),\n winston.format.printf(({ label, message }) => message.split('\\n').map(line => [label && chalk.grey(`[${label}]`), line].filter(p => p).join(' ')).join('\\n')),\n )\n })\n ]\n });\n })\n .inSingletonScope();\n"],"names":["Logger","VERBOSITY_LEVEL","injectable","container","bind","toDynamicValue","context","config","get","GLOBAL_CONFIG","winston","createLogger","level","Math","min","verbose","format","combine","timestamp","ms","transports","Console","errors","colorize","message","colors","debug","info","error","printf","label","split","map","line","chalk","grey","filter","p","join","inSingletonScope"],"mappings":"AAAA;;;;+BAkBaA;;aAAAA;;4DAlBK;2BACS;8DACP;iCAEwC;;;;;;;;;;;;AAE5D,YAAY;AACZ,MAAMC,kBAA0C;IAC9C,GAAG;IACH,GAAG;AACL;IAQaD,SAAN;AAAc;AAARA;IADZE,IAAAA,qBAAU;GACEF;AAEbG,0BAAS,CAACC,IAAI,CAACJ,QACZK,cAAc,CAAC,CAACC,UAAY;IAC3B,MAAMC,SAASD,QAAQH,SAAS,CAACK,GAAG,CAAeC,8BAAa;IAEhE,OAAOC,gBAAO,CAACC,YAAY,CAAC;QAC1BC,OAAOX,eAAe,CAACY,KAAKC,GAAG,CAACP,OAAOQ,OAAO,EAAE,GAAG;QACnDC,QAAQN,gBAAO,CAACM,MAAM,CAACC,OAAO,CAC5BP,gBAAO,CAACM,MAAM,CAACE,SAAS,IACxBR,gBAAO,CAACM,MAAM,CAACG,EAAE;QAEnBC,YAAY;YACV,IAAIV,gBAAO,CAACU,UAAU,CAACC,OAAO,CAAC;gBAC7BL,QAAQN,gBAAO,CAACM,MAAM,CAACC,OAAO,CAC5BP,gBAAO,CAACM,MAAM,CAACM,MAAM,IACrBZ,gBAAO,CAACM,MAAM,CAACO,QAAQ,CAAC;oBACtBC,SAAS,IAAI;oBACbC,QAAQ;wBAAEC,OAAO;wBAAQX,SAAS;wBAAQY,MAAM;wBAASC,OAAO;oBAAM;gBACxE,IACAlB,gBAAO,CAACM,MAAM,CAACa,MAAM,CAAC,CAAC,EAAEC,MAAK,EAAEN,QAAO,EAAE,GAAKA,QAAQO,KAAK,CAAC,MAAMC,GAAG,CAACC,CAAAA,OAAQ;4BAACH,SAASI,cAAK,CAACC,IAAI,CAAC,CAAC,CAAC,EAAEL,MAAM,CAAC,CAAC;4BAAGG;yBAAK,CAACG,MAAM,CAACC,CAAAA,IAAKA,GAAGC,IAAI,CAAC,MAAMA,IAAI,CAAC;YAE3J;SACD;IACH;AACF,GACCC,gBAAgB","file":"logger.service.js"}
1
+ {"version":3,"sources":["services/logger.service.js"],"sourcesContent":["import chalk from 'chalk';\nimport { injectable } from 'inversify';\nimport winston from 'winston';\n\nimport { type GlobalConfig, GLOBAL_CONFIG, container } from './inversify.config';\n\n// Constants\nconst VERBOSITY_LEVEL: Record<number, string> = {\n 1: 'verbose',\n 2: 'debug',\n};\n\n// Utils\nexport const consoleFormat = winston.format.combine(\n winston.format.errors(),\n winston.format.colorize({\n message: true,\n colors: { debug: 'grey', verbose: 'blue', info: 'white', error: 'red' }\n }),\n winston.format.printf(({ label, message, ms }) => {\n const lines = message.split('\\n');\n\n // Format\n let spaces = '';\n let formatted = `${lines[0]} ${chalk.magenta(ms)}`;\n\n if (label) {\n spaces = ' '.repeat(label.length + 3);\n formatted = `${chalk.grey(`[${label}]`)} ${lines[0]} ${chalk.magenta(ms)}`;\n }\n\n for (let i = 1; i < lines.length; ++i) {\n formatted += `\\n${spaces}${lines[i]}`;\n }\n\n return formatted;\n }),\n);\n\n// Service\n@injectable()\nexport class Logger {}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface Logger extends winston.Logger {}\n\ncontainer.bind(Logger)\n .toDynamicValue((context) => {\n const config = context.container.get<GlobalConfig>(GLOBAL_CONFIG);\n\n return winston.createLogger({\n level: VERBOSITY_LEVEL[Math.min(config.verbose, 2)],\n format: winston.format.combine(\n winston.format.timestamp(),\n winston.format.ms(),\n ),\n transports: [\n new winston.transports.Console({\n format: consoleFormat\n })\n ]\n });\n })\n .inSingletonScope();\n"],"names":["consoleFormat","Logger","VERBOSITY_LEVEL","winston","format","combine","errors","colorize","message","colors","debug","verbose","info","error","printf","label","ms","lines","split","spaces","formatted","chalk","magenta","repeat","length","grey","i","injectable","container","bind","toDynamicValue","context","config","get","GLOBAL_CONFIG","createLogger","level","Math","min","timestamp","transports","Console","inSingletonScope"],"mappings":"AAAA;;;;;;;;;;;IAaaA,aAAa,MAAbA;IA4BAC,MAAM,MAANA;;4DAzCK;2BACS;8DACP;iCAEwC;;;;;;;;;;;;AAE5D,YAAY;AACZ,MAAMC,kBAA0C;IAC9C,GAAG;IACH,GAAG;AACL;AAGO,MAAMF,gBAAgBG,gBAAO,CAACC,MAAM,CAACC,OAAO,CACjDF,gBAAO,CAACC,MAAM,CAACE,MAAM,IACrBH,gBAAO,CAACC,MAAM,CAACG,QAAQ,CAAC;IACtBC,SAAS,IAAI;IACbC,QAAQ;QAAEC,OAAO;QAAQC,SAAS;QAAQC,MAAM;QAASC,OAAO;IAAM;AACxE,IACAV,gBAAO,CAACC,MAAM,CAACU,MAAM,CAAC,CAAC,EAAEC,MAAK,EAAEP,QAAO,EAAEQ,GAAE,EAAE,GAAK;IAChD,MAAMC,QAAQT,QAAQU,KAAK,CAAC;IAE5B,SAAS;IACT,IAAIC,SAAS;IACb,IAAIC,YAAY,CAAC,EAAEH,KAAK,CAAC,EAAE,CAAC,CAAC,EAAEI,cAAK,CAACC,OAAO,CAACN,IAAI,CAAC;IAElD,IAAID,OAAO;QACTI,SAAS,IAAII,MAAM,CAACR,MAAMS,MAAM,GAAG;QACnCJ,YAAY,CAAC,EAAEC,cAAK,CAACI,IAAI,CAAC,CAAC,CAAC,EAAEV,MAAM,CAAC,CAAC,EAAE,CAAC,EAAEE,KAAK,CAAC,EAAE,CAAC,CAAC,EAAEI,cAAK,CAACC,OAAO,CAACN,IAAI,CAAC;IAC5E,CAAC;IAED,IAAK,IAAIU,IAAI,GAAGA,IAAIT,MAAMO,MAAM,EAAE,EAAEE,EAAG;QACrCN,aAAa,CAAC,EAAE,EAAED,OAAO,EAAEF,KAAK,CAACS,EAAE,CAAC,CAAC;IACvC;IAEA,OAAON;AACT;IAKWnB,SAAN;AAAc;AAARA;IADZ0B,IAAAA,qBAAU;GACE1B;AAKb2B,0BAAS,CAACC,IAAI,CAAC5B,QACZ6B,cAAc,CAAC,CAACC,UAAY;IAC3B,MAAMC,SAASD,QAAQH,SAAS,CAACK,GAAG,CAAeC,8BAAa;IAEhE,OAAO/B,gBAAO,CAACgC,YAAY,CAAC;QAC1BC,OAAOlC,eAAe,CAACmC,KAAKC,GAAG,CAACN,OAAOrB,OAAO,EAAE,GAAG;QACnDP,QAAQD,gBAAO,CAACC,MAAM,CAACC,OAAO,CAC5BF,gBAAO,CAACC,MAAM,CAACmC,SAAS,IACxBpC,gBAAO,CAACC,MAAM,CAACY,EAAE;QAEnBwB,YAAY;YACV,IAAIrC,gBAAO,CAACqC,UAAU,CAACC,OAAO,CAAC;gBAC7BrC,QAAQJ;YACV;SACD;IACH;AACF,GACC0C,gBAAgB","file":"logger.service.js"}
@@ -1,14 +1,18 @@
1
+ export declare type SpinnerStatus = 'spin' | 'stop' | 'success' | 'failed';
1
2
  export interface SpinnerState {
2
- spin: boolean;
3
+ status: SpinnerStatus;
3
4
  label: string;
4
5
  }
5
6
  export declare type SpinnerStateListener = (state: SpinnerState) => void;
6
7
  export declare class SpinnerService {
7
- private _spin;
8
+ private _status;
8
9
  private _label;
9
10
  private readonly _listeners;
11
+ private _propagate;
10
12
  subscribe(listener: SpinnerStateListener): () => void;
11
13
  spin(label: string): void;
14
+ success(label: string): void;
15
+ failed(label: string): void;
12
16
  stop(): void;
13
17
  get state(): SpinnerState;
14
18
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["services/spinner.service.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,oBAAY,oBAAoB,GAAG,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;AAGjE,qBACa,cAAc;IAEzB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAM;IAEpB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAmC;IAG9D,SAAS,CAAC,QAAQ,EAAE,oBAAoB;IAQxC,IAAI,CAAC,KAAK,EAAE,MAAM;IASlB,IAAI;IASJ,IAAI,KAAK,IAAI,YAAY,CAKxB;CACF","file":"spinner.service.d.ts","sourcesContent":["import { injectable } from 'inversify';\nimport { container } from './inversify.config';\n\n// Interface\nexport interface SpinnerState {\n spin: boolean;\n label: string;\n}\n\nexport type SpinnerStateListener = (state: SpinnerState) => void;\n\n// Service\n@injectable()\nexport class SpinnerService {\n // Attributes\n private _spin = false;\n private _label = '';\n\n private readonly _listeners = new Set<SpinnerStateListener>();\n\n // Methods\n subscribe(listener: SpinnerStateListener) {\n this._listeners.add(listener);\n\n return () => {\n this._listeners.delete(listener);\n };\n }\n\n spin(label: string) {\n this._spin = true;\n this._label = label;\n\n for (const listener of this._listeners) {\n listener(this.state);\n }\n }\n\n stop() {\n this._spin = false;\n\n for (const listener of this._listeners) {\n listener(this.state);\n }\n }\n\n // Properties\n get state(): SpinnerState {\n return {\n spin: this._spin,\n label: this._label,\n };\n }\n}\n\ncontainer.bind(SpinnerService)\n .toSelf()\n .inSingletonScope();\n"]}
1
+ {"version":3,"sources":["services/spinner.service.ts"],"names":[],"mappings":"AAKA,oBAAY,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AACnE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,oBAAY,oBAAoB,GAAG,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;AAGjE,qBACa,cAAc;IAEzB,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,MAAM,CAAM;IAEpB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAmC;IAG9D,OAAO,CAAC,UAAU;IAMlB,SAAS,CAAC,QAAQ,EAAE,oBAAoB;IAQxC,IAAI,CAAC,KAAK,EAAE,MAAM;IAOlB,OAAO,CAAC,KAAK,EAAE,MAAM;IAOrB,MAAM,CAAC,KAAK,EAAE,MAAM;IAOpB,IAAI;IASJ,IAAI,KAAK,IAAI,YAAY,CAKxB;CACF","file":"spinner.service.d.ts","sourcesContent":["import { injectable } from 'inversify';\n\nimport { container } from './inversify.config';\n\n// Interface\nexport type SpinnerStatus = 'spin' | 'stop' | 'success' | 'failed';\nexport interface SpinnerState {\n status: SpinnerStatus;\n label: string;\n}\n\nexport type SpinnerStateListener = (state: SpinnerState) => void;\n\n// Service\n@injectable()\nexport class SpinnerService {\n // Attributes\n private _status: SpinnerStatus = 'stop';\n private _label = '';\n\n private readonly _listeners = new Set<SpinnerStateListener>();\n\n // Methods\n private _propagate() {\n for (const listener of this._listeners) {\n listener(this.state);\n }\n }\n\n subscribe(listener: SpinnerStateListener) {\n this._listeners.add(listener);\n\n return () => {\n this._listeners.delete(listener);\n };\n }\n\n spin(label: string) {\n this._status = 'spin';\n this._label = label;\n\n this._propagate();\n }\n\n success(label: string) {\n this._status = 'success';\n this._label = label;\n\n this._propagate();\n }\n\n failed(label: string) {\n this._status = 'failed';\n this._label = label;\n\n this._propagate();\n }\n\n stop() {\n if (this._status === 'spin') {\n this._status = 'stop';\n\n this._propagate();\n }\n }\n\n // Properties\n get state(): SpinnerState {\n return {\n status: this._status,\n label: this._label,\n };\n }\n}\n\ncontainer.bind(SpinnerService)\n .toSelf()\n .inSingletonScope();\n"]}
@@ -16,10 +16,15 @@ var __decorate = (void 0) && (void 0).__decorate || function(decorators, target,
16
16
  };
17
17
  let SpinnerService = class SpinnerService {
18
18
  // Attributes
19
- _spin = false;
19
+ _status = 'stop';
20
20
  _label = '';
21
21
  _listeners = new Set();
22
22
  // Methods
23
+ _propagate() {
24
+ for (const listener of this._listeners){
25
+ listener(this.state);
26
+ }
27
+ }
23
28
  subscribe(listener) {
24
29
  this._listeners.add(listener);
25
30
  return ()=>{
@@ -27,22 +32,30 @@ let SpinnerService = class SpinnerService {
27
32
  };
28
33
  }
29
34
  spin(label) {
30
- this._spin = true;
35
+ this._status = 'spin';
31
36
  this._label = label;
32
- for (const listener of this._listeners){
33
- listener(this.state);
34
- }
37
+ this._propagate();
38
+ }
39
+ success(label) {
40
+ this._status = 'success';
41
+ this._label = label;
42
+ this._propagate();
43
+ }
44
+ failed(label) {
45
+ this._status = 'failed';
46
+ this._label = label;
47
+ this._propagate();
35
48
  }
36
49
  stop() {
37
- this._spin = false;
38
- for (const listener of this._listeners){
39
- listener(this.state);
50
+ if (this._status === 'spin') {
51
+ this._status = 'stop';
52
+ this._propagate();
40
53
  }
41
54
  }
42
55
  // Properties
43
56
  get state() {
44
57
  return {
45
- spin: this._spin,
58
+ status: this._status,
46
59
  label: this._label
47
60
  };
48
61
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["services/spinner.service.js"],"sourcesContent":["import { injectable } from 'inversify';\nimport { container } from './inversify.config';\n\n// Interface\nexport interface SpinnerState {\n spin: boolean;\n label: string;\n}\n\nexport type SpinnerStateListener = (state: SpinnerState) => void;\n\n// Service\n@injectable()\nexport class SpinnerService {\n // Attributes\n private _spin = false;\n private _label = '';\n\n private readonly _listeners = new Set<SpinnerStateListener>();\n\n // Methods\n subscribe(listener: SpinnerStateListener) {\n this._listeners.add(listener);\n\n return () => {\n this._listeners.delete(listener);\n };\n }\n\n spin(label: string) {\n this._spin = true;\n this._label = label;\n\n for (const listener of this._listeners) {\n listener(this.state);\n }\n }\n\n stop() {\n this._spin = false;\n\n for (const listener of this._listeners) {\n listener(this.state);\n }\n }\n\n // Properties\n get state(): SpinnerState {\n return {\n spin: this._spin,\n label: this._label,\n };\n }\n}\n\ncontainer.bind(SpinnerService)\n .toSelf()\n .inSingletonScope();\n"],"names":["SpinnerService","_spin","_label","_listeners","Set","subscribe","listener","add","delete","spin","label","state","stop","injectable","container","bind","toSelf","inSingletonScope"],"mappings":"AAAA;;;;+BAaaA;;aAAAA;;2BAbc;iCACD;;;;;;;IAYbA,iBAAN;IACL,aAAa;IACLC,QAAQ,KAAK,CAAC;IACdC,SAAS,GAAG;IAEHC,aAAa,IAAIC,MAA4B;IAE9D,UAAU;IACVC,UAAUC,QAA8B,EAAE;QACxC,IAAI,CAACH,UAAU,CAACI,GAAG,CAACD;QAEpB,OAAO,IAAM;YACX,IAAI,CAACH,UAAU,CAACK,MAAM,CAACF;QACzB;IACF;IAEAG,KAAKC,KAAa,EAAE;QAClB,IAAI,CAACT,KAAK,GAAG,IAAI;QACjB,IAAI,CAACC,MAAM,GAAGQ;QAEd,KAAK,MAAMJ,YAAY,IAAI,CAACH,UAAU,CAAE;YACtCG,SAAS,IAAI,CAACK,KAAK;QACrB;IACF;IAEAC,OAAO;QACL,IAAI,CAACX,KAAK,GAAG,KAAK;QAElB,KAAK,MAAMK,YAAY,IAAI,CAACH,UAAU,CAAE;YACtCG,SAAS,IAAI,CAACK,KAAK;QACrB;IACF;IAEA,aAAa;IACb,IAAIA,QAAsB;QACxB,OAAO;YACLF,MAAM,IAAI,CAACR,KAAK;YAChBS,OAAO,IAAI,CAACR,MAAM;QACpB;IACF;AACF;AAxCaF;IADZa,IAAAA,qBAAU;GACEb;AA0Cbc,0BAAS,CAACC,IAAI,CAACf,gBACZgB,MAAM,GACNC,gBAAgB","file":"spinner.service.js"}
1
+ {"version":3,"sources":["services/spinner.service.js"],"sourcesContent":["import { injectable } from 'inversify';\n\nimport { container } from './inversify.config';\n\n// Interface\nexport type SpinnerStatus = 'spin' | 'stop' | 'success' | 'failed';\nexport interface SpinnerState {\n status: SpinnerStatus;\n label: string;\n}\n\nexport type SpinnerStateListener = (state: SpinnerState) => void;\n\n// Service\n@injectable()\nexport class SpinnerService {\n // Attributes\n private _status: SpinnerStatus = 'stop';\n private _label = '';\n\n private readonly _listeners = new Set<SpinnerStateListener>();\n\n // Methods\n private _propagate() {\n for (const listener of this._listeners) {\n listener(this.state);\n }\n }\n\n subscribe(listener: SpinnerStateListener) {\n this._listeners.add(listener);\n\n return () => {\n this._listeners.delete(listener);\n };\n }\n\n spin(label: string) {\n this._status = 'spin';\n this._label = label;\n\n this._propagate();\n }\n\n success(label: string) {\n this._status = 'success';\n this._label = label;\n\n this._propagate();\n }\n\n failed(label: string) {\n this._status = 'failed';\n this._label = label;\n\n this._propagate();\n }\n\n stop() {\n if (this._status === 'spin') {\n this._status = 'stop';\n\n this._propagate();\n }\n }\n\n // Properties\n get state(): SpinnerState {\n return {\n status: this._status,\n label: this._label,\n };\n }\n}\n\ncontainer.bind(SpinnerService)\n .toSelf()\n .inSingletonScope();\n"],"names":["SpinnerService","_status","_label","_listeners","Set","_propagate","listener","state","subscribe","add","delete","spin","label","success","failed","stop","status","injectable","container","bind","toSelf","inSingletonScope"],"mappings":"AAAA;;;;+BAeaA;;aAAAA;;2BAfc;iCAED;;;;;;;IAabA,iBAAN;IACL,aAAa;IACLC,UAAyB,OAAO;IAChCC,SAAS,GAAG;IAEHC,aAAa,IAAIC,MAA4B;IAE9D,UAAU;IACFC,aAAa;QACnB,KAAK,MAAMC,YAAY,IAAI,CAACH,UAAU,CAAE;YACtCG,SAAS,IAAI,CAACC,KAAK;QACrB;IACF;IAEAC,UAAUF,QAA8B,EAAE;QACxC,IAAI,CAACH,UAAU,CAACM,GAAG,CAACH;QAEpB,OAAO,IAAM;YACX,IAAI,CAACH,UAAU,CAACO,MAAM,CAACJ;QACzB;IACF;IAEAK,KAAKC,KAAa,EAAE;QAClB,IAAI,CAACX,OAAO,GAAG;QACf,IAAI,CAACC,MAAM,GAAGU;QAEd,IAAI,CAACP,UAAU;IACjB;IAEAQ,QAAQD,KAAa,EAAE;QACrB,IAAI,CAACX,OAAO,GAAG;QACf,IAAI,CAACC,MAAM,GAAGU;QAEd,IAAI,CAACP,UAAU;IACjB;IAEAS,OAAOF,KAAa,EAAE;QACpB,IAAI,CAACX,OAAO,GAAG;QACf,IAAI,CAACC,MAAM,GAAGU;QAEd,IAAI,CAACP,UAAU;IACjB;IAEAU,OAAO;QACL,IAAI,IAAI,CAACd,OAAO,KAAK,QAAQ;YAC3B,IAAI,CAACA,OAAO,GAAG;YAEf,IAAI,CAACI,UAAU;QACjB,CAAC;IACH;IAEA,aAAa;IACb,IAAIE,QAAsB;QACxB,OAAO;YACLS,QAAQ,IAAI,CAACf,OAAO;YACpBW,OAAO,IAAI,CAACV,MAAM;QACpB;IACF;AACF;AA1DaF;IADZiB,IAAAA,qBAAU;GACEjB;AA4DbkB,0BAAS,CAACC,IAAI,CAACnB,gBACZoB,MAAM,GACNC,gBAAgB","file":"spinner.service.js"}
@@ -1 +1 @@
1
- {"version":3,"sources":["ui/global-spinner.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAA6B,MAAM,OAAO,CAAC;AAKtD,eAAO,MAAM,aAAa,EAAE,EAsB3B,CAAC","file":"global-spinner.d.ts","sourcesContent":["import { Text } from 'ink';\nimport Spinner from 'ink-spinner';\nimport { FC, useLayoutEffect, useState } from 'react';\n\nimport { container, SpinnerService, SpinnerState } from '../services';\n\n// Components\nexport const GlobalSpinner: FC = () => {\n // State\n const [state, setState] = useState<SpinnerState>({ spin: false, label: '' });\n\n // Effect\n useLayoutEffect(() => {\n const spinner = container.get(SpinnerService);\n setState(spinner.state);\n\n return spinner.subscribe(setState);\n }, []);\n\n // Render\n if (state.spin) {\n return (\n <Text>\n <Spinner />{' ' + state.label}\n </Text>\n );\n }\n\n return <></>;\n};\n"]}
1
+ {"version":3,"sources":["ui/global-spinner.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,EAAE,EAA6B,MAAM,OAAO,CAAC;AAKtD,eAAO,MAAM,aAAa,EAAE,EAuC3B,CAAC","file":"global-spinner.d.ts","sourcesContent":["import { Text } from 'ink';\nimport Spinner from 'ink-spinner';\nimport symbols from 'log-symbols';\nimport { FC, useLayoutEffect, useState } from 'react';\n\nimport { container, SpinnerService, SpinnerState } from '../services';\n\n// Components\nexport const GlobalSpinner: FC = () => {\n // State\n const [state, setState] = useState<SpinnerState>({ status: 'stop', label: '' });\n\n // Effect\n useLayoutEffect(() => {\n const spinner = container.get(SpinnerService);\n setState(spinner.state);\n\n return spinner.subscribe(setState);\n }, []);\n\n // Render\n switch (state.status) {\n case 'spin':\n return (\n <Text>\n <Spinner />{' ' + state.label}\n </Text>\n );\n\n case 'success':\n return (\n <Text color=\"green\">\n {symbols.success} {state.label}\n </Text>\n );\n\n case 'failed':\n return (\n <Text color=\"red\">\n {symbols.error} {state.label}\n </Text>\n );\n\n case 'stop':\n default:\n return null;\n }\n};\n"]}
@@ -9,6 +9,7 @@ Object.defineProperty(exports, "GlobalSpinner", {
9
9
  const _jsxRuntime = require("react/jsx-runtime");
10
10
  const _ink = require("ink");
11
11
  const _inkSpinner = /*#__PURE__*/ _interopRequireDefault(require("ink-spinner"));
12
+ const _logSymbols = /*#__PURE__*/ _interopRequireDefault(require("log-symbols"));
12
13
  const _react = require("react");
13
14
  const _services = require("../services");
14
15
  function _interopRequireDefault(obj) {
@@ -19,7 +20,7 @@ function _interopRequireDefault(obj) {
19
20
  const GlobalSpinner = ()=>{
20
21
  // State
21
22
  const [state, setState] = (0, _react.useState)({
22
- spin: false,
23
+ status: 'stop',
23
24
  label: ''
24
25
  });
25
26
  // Effect
@@ -29,15 +30,36 @@ const GlobalSpinner = ()=>{
29
30
  return spinner.subscribe(setState);
30
31
  }, []);
31
32
  // Render
32
- if (state.spin) {
33
- return /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Text, {
34
- children: [
35
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(_inkSpinner.default, {}),
36
- ' ' + state.label
37
- ]
38
- });
33
+ switch(state.status){
34
+ case 'spin':
35
+ return /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Text, {
36
+ children: [
37
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_inkSpinner.default, {}),
38
+ ' ' + state.label
39
+ ]
40
+ });
41
+ case 'success':
42
+ return /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Text, {
43
+ color: "green",
44
+ children: [
45
+ _logSymbols.default.success,
46
+ " ",
47
+ state.label
48
+ ]
49
+ });
50
+ case 'failed':
51
+ return /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Text, {
52
+ color: "red",
53
+ children: [
54
+ _logSymbols.default.error,
55
+ " ",
56
+ state.label
57
+ ]
58
+ });
59
+ case 'stop':
60
+ default:
61
+ return null;
39
62
  }
40
- return /*#__PURE__*/ (0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {});
41
63
  };
42
64
 
43
65
  //# sourceMappingURL=global-spinner.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["ui/global-spinner.js"],"sourcesContent":["import { Text } from 'ink';\nimport Spinner from 'ink-spinner';\nimport { FC, useLayoutEffect, useState } from 'react';\n\nimport { container, SpinnerService, SpinnerState } from '../services';\n\n// Components\nexport const GlobalSpinner: FC = () => {\n // State\n const [state, setState] = useState<SpinnerState>({ spin: false, label: '' });\n\n // Effect\n useLayoutEffect(() => {\n const spinner = container.get(SpinnerService);\n setState(spinner.state);\n\n return spinner.subscribe(setState);\n }, []);\n\n // Render\n if (state.spin) {\n return (\n <Text>\n <Spinner />{' ' + state.label}\n </Text>\n );\n }\n\n return <></>;\n};\n"],"names":["GlobalSpinner","state","setState","useState","spin","label","useLayoutEffect","spinner","container","get","SpinnerService","subscribe","Text","Spinner"],"mappings":"AAAA;;;;+BAOaA;;aAAAA;;;qBAPQ;iEACD;uBAC0B;0BAEU;;;;;;AAGjD,MAAMA,gBAAoB,IAAM;IACrC,QAAQ;IACR,MAAM,CAACC,OAAOC,SAAS,GAAGC,IAAAA,eAAQ,EAAe;QAAEC,MAAM,KAAK;QAAEC,OAAO;IAAG;IAE1E,SAAS;IACTC,IAAAA,sBAAe,EAAC,IAAM;QACpB,MAAMC,UAAUC,mBAAS,CAACC,GAAG,CAACC,wBAAc;QAC5CR,SAASK,QAAQN,KAAK;QAEtB,OAAOM,QAAQI,SAAS,CAACT;IAC3B,GAAG,EAAE;IAEL,SAAS;IACT,IAAID,MAAMG,IAAI,EAAE;QACd,qBACE,sBAACQ,SAAI;;8BACH,qBAACC,mBAAO;gBAAI,MAAMZ,MAAMI,KAAK;;;IAGnC,CAAC;IAED,qBAAO;AACT","file":"global-spinner.js"}
1
+ {"version":3,"sources":["ui/global-spinner.js"],"sourcesContent":["import { Text } from 'ink';\nimport Spinner from 'ink-spinner';\nimport symbols from 'log-symbols';\nimport { FC, useLayoutEffect, useState } from 'react';\n\nimport { container, SpinnerService, SpinnerState } from '../services';\n\n// Components\nexport const GlobalSpinner: FC = () => {\n // State\n const [state, setState] = useState<SpinnerState>({ status: 'stop', label: '' });\n\n // Effect\n useLayoutEffect(() => {\n const spinner = container.get(SpinnerService);\n setState(spinner.state);\n\n return spinner.subscribe(setState);\n }, []);\n\n // Render\n switch (state.status) {\n case 'spin':\n return (\n <Text>\n <Spinner />{' ' + state.label}\n </Text>\n );\n\n case 'success':\n return (\n <Text color=\"green\">\n {symbols.success} {state.label}\n </Text>\n );\n\n case 'failed':\n return (\n <Text color=\"red\">\n {symbols.error} {state.label}\n </Text>\n );\n\n case 'stop':\n default:\n return null;\n }\n};\n"],"names":["GlobalSpinner","state","setState","useState","status","label","useLayoutEffect","spinner","container","get","SpinnerService","subscribe","Text","Spinner","color","symbols","success","error"],"mappings":"AAAA;;;;+BAQaA;;aAAAA;;;qBARQ;iEACD;iEACA;uBAC0B;0BAEU;;;;;;AAGjD,MAAMA,gBAAoB,IAAM;IACrC,QAAQ;IACR,MAAM,CAACC,OAAOC,SAAS,GAAGC,IAAAA,eAAQ,EAAe;QAAEC,QAAQ;QAAQC,OAAO;IAAG;IAE7E,SAAS;IACTC,IAAAA,sBAAe,EAAC,IAAM;QACpB,MAAMC,UAAUC,mBAAS,CAACC,GAAG,CAACC,wBAAc;QAC5CR,SAASK,QAAQN,KAAK;QAEtB,OAAOM,QAAQI,SAAS,CAACT;IAC3B,GAAG,EAAE;IAEL,SAAS;IACT,OAAQD,MAAMG,MAAM;QAClB,KAAK;YACH,qBACE,sBAACQ,SAAI;;kCACH,qBAACC,mBAAO;oBAAI,MAAMZ,MAAMI,KAAK;;;QAInC,KAAK;YACH,qBACE,sBAACO,SAAI;gBAACE,OAAM;;oBACTC,mBAAO,CAACC,OAAO;oBAAC;oBAAEf,MAAMI,KAAK;;;QAIpC,KAAK;YACH,qBACE,sBAACO,SAAI;gBAACE,OAAM;;oBACTC,mBAAO,CAACE,KAAK;oBAAC;oBAAEhB,MAAMI,KAAK;;;QAIlC,KAAK;QACL;YACE,OAAO,IAAI;IACf;AACF","file":"global-spinner.js"}
@@ -1,4 +1,5 @@
1
- export * from './cli-list';
2
1
  export * from './global-spinner';
3
2
  export * from './layout';
3
+ export * from './list';
4
4
  export * from './static-logs';
5
+ export * from './workspace-tree';
@@ -1 +1 @@
1
- {"version":3,"sources":["ui/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC","file":"index.d.ts","sourcesContent":["export * from './cli-list';\nexport * from './global-spinner';\nexport * from './layout';\nexport * from './static-logs';\n"]}
1
+ {"version":3,"sources":["ui/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC","file":"index.d.ts","sourcesContent":["export * from './global-spinner';\nexport * from './layout';\nexport * from './list';\nexport * from './static-logs';\nexport * from './workspace-tree';\n"]}
package/dist/ui/index.js CHANGED
@@ -2,10 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
- _exportStar(require("./cli-list"), exports);
6
5
  _exportStar(require("./global-spinner"), exports);
7
6
  _exportStar(require("./layout"), exports);
7
+ _exportStar(require("./list"), exports);
8
8
  _exportStar(require("./static-logs"), exports);
9
+ _exportStar(require("./workspace-tree"), exports);
9
10
  function _exportStar(from, to) {
10
11
  Object.keys(from).forEach(function(k) {
11
12
  if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) Object.defineProperty(to, k, {
@@ -1 +1 @@
1
- {"version":3,"sources":["ui/index.js"],"sourcesContent":["export * from './cli-list';\nexport * from './global-spinner';\nexport * from './layout';\nexport * from './static-logs';\n"],"names":[],"mappings":"AAAA;;;;oBAAc;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 './workspace-tree';\n"],"names":[],"mappings":"AAAA;;;;oBAAc;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,EAKpB,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 = () => (\n <>\n <StaticLogs />\n <GlobalSpinner />\n </>\n);\n"]}
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"]}
package/dist/ui/layout.js CHANGED
@@ -9,10 +9,11 @@ Object.defineProperty(exports, "Layout", {
9
9
  const _jsxRuntime = require("react/jsx-runtime");
10
10
  const _globalSpinner = require("./global-spinner");
11
11
  const _staticLogs = require("./static-logs");
12
- const Layout = ()=>/*#__PURE__*/ (0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
12
+ const Layout = ({ children })=>/*#__PURE__*/ (0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
13
13
  children: [
14
14
  /*#__PURE__*/ (0, _jsxRuntime.jsx)(_staticLogs.StaticLogs, {}),
15
- /*#__PURE__*/ (0, _jsxRuntime.jsx)(_globalSpinner.GlobalSpinner, {})
15
+ /*#__PURE__*/ (0, _jsxRuntime.jsx)(_globalSpinner.GlobalSpinner, {}),
16
+ children
16
17
  ]
17
18
  });
18
19
 
@@ -1 +1 @@
1
- {"version":3,"sources":["ui/layout.js"],"sourcesContent":["import { FC } from 'react';\n\nimport { GlobalSpinner } from './global-spinner';\nimport { StaticLogs } from './static-logs';\n\n// Component\nexport const Layout: FC = () => (\n <>\n <StaticLogs />\n <GlobalSpinner />\n </>\n);\n"],"names":["Layout","StaticLogs","GlobalSpinner"],"mappings":"AAAA;;;;+BAMaA;;aAAAA;;;+BAJiB;4BACH;AAGpB,MAAMA,SAAa,kBACxB;;0BACE,qBAACC,sBAAU;0BACX,qBAACC,4BAAa","file":"layout.js"}
1
+ {"version":3,"sources":["ui/layout.js"],"sourcesContent":["import { FC } from 'react';\n\nimport { GlobalSpinner } from './global-spinner';\nimport { StaticLogs } from './static-logs';\n\n// Component\nexport const Layout: FC = ({ children }) => (\n <>\n <StaticLogs />\n <GlobalSpinner />\n { children }\n </>\n);\n"],"names":["Layout","children","StaticLogs","GlobalSpinner"],"mappings":"AAAA;;;;+BAMaA;;aAAAA;;;+BAJiB;4BACH;AAGpB,MAAMA,SAAa,CAAC,EAAEC,SAAQ,EAAE,iBACrC;;0BACE,qBAACC,sBAAU;0BACX,qBAACC,4BAAa;YACZF","file":"layout.js"}
@@ -0,0 +1,6 @@
1
+ import { ReactElement } from 'react';
2
+ export interface ListProps<T extends Record<string, unknown>> {
3
+ items: T[];
4
+ headers?: boolean;
5
+ }
6
+ export declare function List<T extends Record<string, unknown>>({ items, headers }: ListProps<T>): ReactElement;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["ui/list.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAKrC,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC1D,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAGD,wBAAgB,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,YAAY,CAetG","file":"list.d.ts","sourcesContent":["import { Box, Text } from 'ink';\nimport { ReactElement } from 'react';\n\nimport { capitalize } from '../utils';\n\n// Types\nexport interface ListProps<T extends Record<string, unknown>> {\n items: T[];\n headers?: boolean;\n}\n\n// Component\nexport function List<T extends Record<string, unknown>>({ items, headers }: ListProps<T>): ReactElement {\n return (\n <Box>\n { Object.keys(items[0]).map((key) => (\n <Box key={key} flexDirection=\"column\" marginRight={2}>\n { headers && (\n <Text bold>{ capitalize(key) }</Text>\n ) }\n { items.map((item, idx) => (\n <Text key={idx}>{ item[key] }</Text>\n )) }\n </Box>\n )) }\n </Box>\n );\n}\n"]}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "List", {
6
+ enumerable: true,
7
+ get: ()=>List
8
+ });
9
+ const _jsxRuntime = require("react/jsx-runtime");
10
+ const _ink = require("ink");
11
+ const _utils = require("../utils");
12
+ function List({ items , headers }) {
13
+ return /*#__PURE__*/ (0, _jsxRuntime.jsx)(_ink.Box, {
14
+ children: Object.keys(items[0]).map((key)=>/*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Box, {
15
+ flexDirection: "column",
16
+ marginRight: 2,
17
+ children: [
18
+ headers && /*#__PURE__*/ (0, _jsxRuntime.jsx)(_ink.Text, {
19
+ bold: true,
20
+ children: (0, _utils.capitalize)(key)
21
+ }),
22
+ items.map((item, idx)=>/*#__PURE__*/ (0, _jsxRuntime.jsx)(_ink.Text, {
23
+ children: item[key]
24
+ }, idx))
25
+ ]
26
+ }, key))
27
+ });
28
+ }
29
+
30
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["ui/list.js"],"sourcesContent":["import { Box, Text } from 'ink';\nimport { ReactElement } from 'react';\n\nimport { capitalize } from '../utils';\n\n// Types\nexport interface ListProps<T extends Record<string, unknown>> {\n items: T[];\n headers?: boolean;\n}\n\n// Component\nexport function List<T extends Record<string, unknown>>({ items, headers }: ListProps<T>): ReactElement {\n return (\n <Box>\n { Object.keys(items[0]).map((key) => (\n <Box key={key} flexDirection=\"column\" marginRight={2}>\n { headers && (\n <Text bold>{ capitalize(key) }</Text>\n ) }\n { items.map((item, idx) => (\n <Text key={idx}>{ item[key] }</Text>\n )) }\n </Box>\n )) }\n </Box>\n );\n}\n"],"names":["List","items","headers","Box","Object","keys","map","key","flexDirection","marginRight","Text","bold","capitalize","item","idx"],"mappings":"AAAA;;;;+BAYgBA;;aAAAA;;;qBAZU;uBAGC;AASpB,SAASA,KAAwC,EAAEC,MAAK,EAAEC,QAAO,EAAgB,EAAgB;IACtG,qBACE,qBAACC,QAAG;kBACAC,OAAOC,IAAI,CAACJ,KAAK,CAAC,EAAE,EAAEK,GAAG,CAAC,CAACC,oBAC3B,sBAACJ,QAAG;gBAAWK,eAAc;gBAASC,aAAa;;oBAC/CP,yBACA,qBAACQ,SAAI;wBAACC,IAAI;kCAAGC,IAAAA,iBAAU,EAACL;;oBAExBN,MAAMK,GAAG,CAAC,CAACO,MAAMC,oBACjB,qBAACJ,SAAI;sCAAaG,IAAI,CAACN,IAAI;2BAAhBO;;eALLP;;AAWlB","file":"list.js"}
@@ -1 +1 @@
1
- {"version":3,"sources":["ui/static-logs.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAA6B,MAAM,OAAO,CAAC;AAiBtD,eAAO,MAAM,UAAU,EAAE,EA0CxB,CAAC","file":"static-logs.d.ts","sourcesContent":["import { Static, Text } from 'ink';\nimport { FC, useLayoutEffect, useState } from 'react';\nimport Transport from 'winston-transport';\n\nimport { container, Logger } from '../services';\n\n// Constants\nconst COLORS: Record<string, string> = {\n debug: 'grey',\n verbose: 'blue',\n warn: 'yellow',\n error: 'red',\n};\n\n// Utils\nlet id = 0;\n\n// Component\nexport const StaticLogs: FC = () => {\n // State\n const [logs, setLogs] = useState<any[]>([]);\n\n // Effect\n useLayoutEffect(() => {\n const logger = container.get(Logger);\n const olds = logger.transports;\n\n logger.clear();\n logger.add(new class extends Transport {\n // Methods\n log(info: any, next: () => void): void {\n setTimeout(() => {\n this.emit('logged', info);\n }, 0);\n\n setLogs((old) => [...old, { id: ++id, ...info }]);\n\n next();\n }\n });\n\n return () => {\n logger.clear();\n\n for (const transport of olds) {\n logger.add(transport);\n }\n };\n }, []);\n\n return (\n <Static items={logs}>\n { (log) => (\n <Text key={log.id} color={COLORS[log.level]}>\n { log.label && <Text color=\"grey\">[{ log.label }]{' '}</Text> }\n { log.message }\n </Text>\n ) }\n </Static>\n );\n};\n"]}
1
+ {"version":3,"sources":["ui/static-logs.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAoB,MAAM,OAAO,CAAC;AAe7C,eAAO,MAAM,UAAU,EAAE,EA+CxB,CAAC","file":"static-logs.d.ts","sourcesContent":["import { useStderr } from 'ink';\nimport { FC, useLayoutEffect, } from 'react';\nimport Transport from 'winston-transport';\n\nimport { consoleFormat, container, Logger } from '../services';\nimport winston from 'winston';\n\n// Constants\nconst MESSAGE = Symbol.for('message');\n\n// Types\ninterface Info extends Record<string, unknown> {\n [MESSAGE]: string;\n}\n\n// Component\nexport const StaticLogs: FC = () => {\n // State\n const { write } = useStderr();\n\n // Effect\n useLayoutEffect(() => {\n const logger = container.get(Logger);\n\n // Remove Console transport\n for (const transport of logger.transports) {\n if (transport instanceof winston.transports.Console) {\n logger.remove(transport);\n }\n }\n\n // Add custom transport\n const transport = new class extends Transport {\n // Constructor\n constructor() {\n super({\n format: consoleFormat\n });\n }\n\n // Methods\n log(info: Info, next: () => void): void {\n setTimeout(() => {\n this.emit('logged', info);\n }, 0);\n\n write(info[MESSAGE] + '\\n');\n\n next();\n }\n };\n\n logger.add(transport);\n\n return () => {\n logger.remove(transport);\n logger.add(new winston.transports.Console({\n format: consoleFormat\n }));\n };\n }, [write]);\n\n return null;\n};\n"]}
@@ -6,74 +6,58 @@ Object.defineProperty(exports, "StaticLogs", {
6
6
  enumerable: true,
7
7
  get: ()=>StaticLogs
8
8
  });
9
- const _jsxRuntime = require("react/jsx-runtime");
10
9
  const _ink = require("ink");
11
10
  const _react = require("react");
12
11
  const _winstonTransport = /*#__PURE__*/ _interopRequireDefault(require("winston-transport"));
13
12
  const _services = require("../services");
13
+ const _winston = /*#__PURE__*/ _interopRequireDefault(require("winston"));
14
14
  function _interopRequireDefault(obj) {
15
15
  return obj && obj.__esModule ? obj : {
16
16
  default: obj
17
17
  };
18
18
  }
19
19
  // Constants
20
- const COLORS = {
21
- debug: 'grey',
22
- verbose: 'blue',
23
- warn: 'yellow',
24
- error: 'red'
25
- };
26
- // Utils
27
- let id = 0;
20
+ const MESSAGE = Symbol.for('message');
28
21
  const StaticLogs = ()=>{
29
22
  // State
30
- const [logs, setLogs] = (0, _react.useState)([]);
23
+ const { write } = (0, _ink.useStderr)();
31
24
  // Effect
32
25
  (0, _react.useLayoutEffect)(()=>{
33
26
  const logger = _services.container.get(_services.Logger);
34
- const olds = logger.transports;
35
- logger.clear();
36
- logger.add(new class extends _winstonTransport.default {
27
+ // Remove Console transport
28
+ for (const transport of logger.transports){
29
+ if (transport instanceof _winston.default.transports.Console) {
30
+ logger.remove(transport);
31
+ }
32
+ }
33
+ // Add custom transport
34
+ const transport1 = new class extends _winstonTransport.default {
35
+ // Constructor
36
+ constructor(){
37
+ super({
38
+ format: _services.consoleFormat
39
+ });
40
+ }
37
41
  // Methods
38
42
  log(info, next) {
39
43
  setTimeout(()=>{
40
44
  this.emit('logged', info);
41
45
  }, 0);
42
- setLogs((old)=>[
43
- ...old,
44
- {
45
- id: ++id,
46
- ...info
47
- }
48
- ]);
46
+ write(info[MESSAGE] + '\n');
49
47
  next();
50
48
  }
51
- });
49
+ };
50
+ logger.add(transport1);
52
51
  return ()=>{
53
- logger.clear();
54
- for (const transport of olds){
55
- logger.add(transport);
56
- }
52
+ logger.remove(transport1);
53
+ logger.add(new _winston.default.transports.Console({
54
+ format: _services.consoleFormat
55
+ }));
57
56
  };
58
- }, []);
59
- return /*#__PURE__*/ (0, _jsxRuntime.jsx)(_ink.Static, {
60
- items: logs,
61
- children: (log)=>/*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Text, {
62
- color: COLORS[log.level],
63
- children: [
64
- log.label && /*#__PURE__*/ (0, _jsxRuntime.jsxs)(_ink.Text, {
65
- color: "grey",
66
- children: [
67
- "[",
68
- log.label,
69
- "]",
70
- ' '
71
- ]
72
- }),
73
- log.message
74
- ]
75
- }, log.id)
76
- });
57
+ }, [
58
+ write
59
+ ]);
60
+ return null;
77
61
  };
78
62
 
79
63
  //# sourceMappingURL=static-logs.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["ui/static-logs.js"],"sourcesContent":["import { Static, Text } from 'ink';\nimport { FC, useLayoutEffect, useState } from 'react';\nimport Transport from 'winston-transport';\n\nimport { container, Logger } from '../services';\n\n// Constants\nconst COLORS: Record<string, string> = {\n debug: 'grey',\n verbose: 'blue',\n warn: 'yellow',\n error: 'red',\n};\n\n// Utils\nlet id = 0;\n\n// Component\nexport const StaticLogs: FC = () => {\n // State\n const [logs, setLogs] = useState<any[]>([]);\n\n // Effect\n useLayoutEffect(() => {\n const logger = container.get(Logger);\n const olds = logger.transports;\n\n logger.clear();\n logger.add(new class extends Transport {\n // Methods\n log(info: any, next: () => void): void {\n setTimeout(() => {\n this.emit('logged', info);\n }, 0);\n\n setLogs((old) => [...old, { id: ++id, ...info }]);\n\n next();\n }\n });\n\n return () => {\n logger.clear();\n\n for (const transport of olds) {\n logger.add(transport);\n }\n };\n }, []);\n\n return (\n <Static items={logs}>\n { (log) => (\n <Text key={log.id} color={COLORS[log.level]}>\n { log.label && <Text color=\"grey\">[{ log.label }]{' '}</Text> }\n { log.message }\n </Text>\n ) }\n </Static>\n );\n};\n"],"names":["StaticLogs","COLORS","debug","verbose","warn","error","id","logs","setLogs","useState","useLayoutEffect","logger","container","get","Logger","olds","transports","clear","add","Transport","log","info","next","setTimeout","emit","old","transport","Static","items","Text","color","level","label","message"],"mappings":"AAAA;;;;+BAkBaA;;aAAAA;;;qBAlBgB;uBACiB;uEACxB;0BAEY;;;;;;AAElC,YAAY;AACZ,MAAMC,SAAiC;IACrCC,OAAO;IACPC,SAAS;IACTC,MAAM;IACNC,OAAO;AACT;AAEA,QAAQ;AACR,IAAIC,KAAK;AAGF,MAAMN,aAAiB,IAAM;IAClC,QAAQ;IACR,MAAM,CAACO,MAAMC,QAAQ,GAAGC,IAAAA,eAAQ,EAAQ,EAAE;IAE1C,SAAS;IACTC,IAAAA,sBAAe,EAAC,IAAM;QACpB,MAAMC,SAASC,mBAAS,CAACC,GAAG,CAACC,gBAAM;QACnC,MAAMC,OAAOJ,OAAOK,UAAU;QAE9BL,OAAOM,KAAK;QACZN,OAAOO,GAAG,CAAC,IAAI,cAAcC,yBAAS;YACpC,UAAU;YACVC,IAAIC,IAAS,EAAEC,IAAgB,EAAQ;gBACrCC,WAAW,IAAM;oBACf,IAAI,CAACC,IAAI,CAAC,UAAUH;gBACtB,GAAG;gBAEHb,QAAQ,CAACiB,MAAQ;2BAAIA;wBAAK;4BAAEnB,IAAI,EAAEA;4BAAI,GAAGe,IAAI;wBAAC;qBAAE;gBAEhDC;YACF;QACF;QAEA,OAAO,IAAM;YACXX,OAAOM,KAAK;YAEZ,KAAK,MAAMS,aAAaX,KAAM;gBAC5BJ,OAAOO,GAAG,CAACQ;YACb;QACF;IACF,GAAG,EAAE;IAEL,qBACE,qBAACC,WAAM;QAACC,OAAOrB;kBACX,CAACa,oBACD,sBAACS,SAAI;gBAAcC,OAAO7B,MAAM,CAACmB,IAAIW,KAAK,CAAC;;oBACvCX,IAAIY,KAAK,kBAAI,sBAACH,SAAI;wBAACC,OAAM;;4BAAO;4BAAGV,IAAIY,KAAK;4BAAE;4BAAE;;;oBAChDZ,IAAIa,OAAO;;eAFJb,IAAId,EAAE;;AAOzB","file":"static-logs.js"}
1
+ {"version":3,"sources":["ui/static-logs.js"],"sourcesContent":["import { useStderr } from 'ink';\nimport { FC, useLayoutEffect, } from 'react';\nimport Transport from 'winston-transport';\n\nimport { consoleFormat, container, Logger } from '../services';\nimport winston from 'winston';\n\n// Constants\nconst MESSAGE = Symbol.for('message');\n\n// Types\ninterface Info extends Record<string, unknown> {\n [MESSAGE]: string;\n}\n\n// Component\nexport const StaticLogs: FC = () => {\n // State\n const { write } = useStderr();\n\n // Effect\n useLayoutEffect(() => {\n const logger = container.get(Logger);\n\n // Remove Console transport\n for (const transport of logger.transports) {\n if (transport instanceof winston.transports.Console) {\n logger.remove(transport);\n }\n }\n\n // Add custom transport\n const transport = new class extends Transport {\n // Constructor\n constructor() {\n super({\n format: consoleFormat\n });\n }\n\n // Methods\n log(info: Info, next: () => void): void {\n setTimeout(() => {\n this.emit('logged', info);\n }, 0);\n\n write(info[MESSAGE] + '\\n');\n\n next();\n }\n };\n\n logger.add(transport);\n\n return () => {\n logger.remove(transport);\n logger.add(new winston.transports.Console({\n format: consoleFormat\n }));\n };\n }, [write]);\n\n return null;\n};\n"],"names":["StaticLogs","MESSAGE","Symbol","for","write","useStderr","useLayoutEffect","logger","container","get","Logger","transport","transports","winston","Console","remove","Transport","constructor","format","consoleFormat","log","info","next","setTimeout","emit","add"],"mappings":"AAAA;;;;+BAgBaA;;aAAAA;;qBAhBa;uBACW;uEACf;0BAE2B;8DAC7B;;;;;;AAEpB,YAAY;AACZ,MAAMC,UAAUC,OAAOC,GAAG,CAAC;AAQpB,MAAMH,aAAiB,IAAM;IAClC,QAAQ;IACR,MAAM,EAAEI,MAAK,EAAE,GAAGC,IAAAA,cAAS;IAE3B,SAAS;IACTC,IAAAA,sBAAe,EAAC,IAAM;QACpB,MAAMC,SAASC,mBAAS,CAACC,GAAG,CAACC,gBAAM;QAEnC,2BAA2B;QAC3B,KAAK,MAAMC,aAAaJ,OAAOK,UAAU,CAAE;YACzC,IAAID,qBAAqBE,gBAAO,CAACD,UAAU,CAACE,OAAO,EAAE;gBACnDP,OAAOQ,MAAM,CAACJ;YAChB,CAAC;QACH;QAEA,uBAAuB;QACvB,MAAMA,aAAY,IAAI,cAAcK,yBAAS;YAC3C,cAAc;YACdC,aAAc;gBACZ,KAAK,CAAC;oBACJC,QAAQC,uBAAa;gBACvB;YACF;YAEA,UAAU;YACVC,IAAIC,IAAU,EAAEC,IAAgB,EAAQ;gBACtCC,WAAW,IAAM;oBACf,IAAI,CAACC,IAAI,CAAC,UAAUH;gBACtB,GAAG;gBAEHjB,MAAMiB,IAAI,CAACpB,QAAQ,GAAG;gBAEtBqB;YACF;QACF;QAEAf,OAAOkB,GAAG,CAACd;QAEX,OAAO,IAAM;YACXJ,OAAOQ,MAAM,CAACJ;YACdJ,OAAOkB,GAAG,CAAC,IAAIZ,gBAAO,CAACD,UAAU,CAACE,OAAO,CAAC;gBACxCI,QAAQC,uBAAa;YACvB;QACF;IACF,GAAG;QAACf;KAAM;IAEV,OAAO,IAAI;AACb","file":"static-logs.js"}
@@ -0,0 +1,8 @@
1
+ import { FC, ReactElement } from 'react';
2
+ import { Workspace } from '../project';
3
+ export interface WorkspaceTreeProps {
4
+ workspace: Workspace;
5
+ dev?: boolean;
6
+ level?: ReactElement;
7
+ }
8
+ export declare const WorkspaceTree: FC<WorkspaceTreeProps>;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["ui/workspace-tree.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,YAAY,EAAuB,MAAM,OAAO,CAAC;AAE9D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,SAAS,CAAC;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB;AAMD,eAAO,MAAM,aAAa,EAAE,EAAE,CAAC,kBAAkB,CAwChD,CAAC","file":"workspace-tree.d.ts","sourcesContent":["import { Newline, Text, TextProps } from 'ink';\nimport { FC, ReactElement, useEffect, useState } from 'react';\n\nimport { Workspace } from '../project';\n\n// Types\nexport interface WorkspaceTreeProps {\n workspace: Workspace;\n dev?: boolean;\n level?: ReactElement;\n}\n\n// Utils\nconst style = (dev: boolean): TextProps => ({ color: dev ? 'blue' : '' });\n\n// Component\nexport const WorkspaceTree: FC<WorkspaceTreeProps> = (props) => {\n const { workspace: wks, dev = false, level = '' } = props;\n\n // State\n const [deps, setDeps] = useState<[Workspace, boolean | null][]>([]);\n\n // Effects\n useEffect(() => void (async () => {\n const deps: [Workspace, boolean | null][] = [];\n\n for await (const dep of wks.dependencies()) {\n deps.push([dep, null]);\n }\n\n for await (const dep of wks.devDependencies()) {\n deps.push([dep, true]);\n }\n\n setDeps(deps);\n })(), [wks]);\n\n // Render\n return (\n <Text>\n <Text {...style(dev)}>{ wks.name }</Text>\n { wks.version && (<Text color=\"grey\">@{ wks.version }</Text>) }\n <Newline />\n\n { deps.map(([dep, isDev], idx) => (\n <Text key={dep.name}>\n { level }<Text {...style(dev)}>{ idx === deps.length - 1 ? '└' : '├'}─{' '}</Text>\n <WorkspaceTree\n workspace={dep}\n dev={isDev ?? dev}\n level={<>{ level }<Text {...style(dev)}>{ idx === deps.length - 1 ? ' ' : '│' }{' '}</Text></>}\n />\n </Text>\n )) }\n </Text>\n );\n};\n"]}