spawn-term 1.1.7 → 2.0.0

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 (61) hide show
  1. package/dist/cjs/components/App.js +110 -9
  2. package/dist/cjs/components/App.js.map +1 -1
  3. package/dist/cjs/components/CompactProcessLine.js +153 -0
  4. package/dist/cjs/components/CompactProcessLine.js.map +1 -0
  5. package/dist/cjs/components/Divider.js +24 -0
  6. package/dist/cjs/components/Divider.js.map +1 -0
  7. package/dist/cjs/components/ErrorDetailModal.js +115 -0
  8. package/dist/cjs/components/ErrorDetailModal.js.map +1 -0
  9. package/dist/cjs/components/ErrorListModal.js +135 -0
  10. package/dist/cjs/components/ErrorListModal.js.map +1 -0
  11. package/dist/cjs/components/StatusBar.js +104 -0
  12. package/dist/cjs/components/StatusBar.js.map +1 -0
  13. package/dist/cjs/createApp.js +30 -33
  14. package/dist/cjs/createApp.js.map +1 -1
  15. package/dist/cjs/lib/figures.js +1 -1
  16. package/dist/cjs/lib/figures.js.map +1 -1
  17. package/dist/cjs/src/components/App.d.ts +1 -5
  18. package/dist/cjs/src/components/CompactProcessLine.d.ts +6 -0
  19. package/dist/cjs/src/components/Divider.d.ts +2 -0
  20. package/dist/cjs/src/components/ErrorDetailModal.d.ts +8 -0
  21. package/dist/cjs/src/components/ErrorListModal.d.ts +8 -0
  22. package/dist/cjs/src/components/StatusBar.d.ts +8 -0
  23. package/dist/cjs/src/createApp.d.ts +4 -5
  24. package/dist/cjs/src/state/processStore.d.ts +38 -0
  25. package/dist/cjs/state/processStore.js +241 -0
  26. package/dist/cjs/state/processStore.js.map +1 -0
  27. package/dist/cjs/worker.js +70 -108
  28. package/dist/cjs/worker.js.map +1 -1
  29. package/dist/esm/components/App.js +108 -8
  30. package/dist/esm/components/App.js.map +1 -1
  31. package/dist/esm/components/CompactProcessLine.js +134 -0
  32. package/dist/esm/components/CompactProcessLine.js.map +1 -0
  33. package/dist/esm/components/Divider.js +13 -0
  34. package/dist/esm/components/Divider.js.map +1 -0
  35. package/dist/esm/components/ErrorDetailModal.js +99 -0
  36. package/dist/esm/components/ErrorDetailModal.js.map +1 -0
  37. package/dist/esm/components/ErrorListModal.js +116 -0
  38. package/dist/esm/components/ErrorListModal.js.map +1 -0
  39. package/dist/esm/components/StatusBar.js +87 -0
  40. package/dist/esm/components/StatusBar.js.map +1 -0
  41. package/dist/esm/createApp.js +31 -32
  42. package/dist/esm/createApp.js.map +1 -1
  43. package/dist/esm/src/components/App.d.ts +1 -5
  44. package/dist/esm/src/components/CompactProcessLine.d.ts +6 -0
  45. package/dist/esm/src/components/Divider.d.ts +2 -0
  46. package/dist/esm/src/components/ErrorDetailModal.d.ts +8 -0
  47. package/dist/esm/src/components/ErrorListModal.d.ts +8 -0
  48. package/dist/esm/src/components/StatusBar.d.ts +8 -0
  49. package/dist/esm/src/createApp.d.ts +4 -5
  50. package/dist/esm/src/state/processStore.d.ts +38 -0
  51. package/dist/esm/state/processStore.js +149 -0
  52. package/dist/esm/state/processStore.js.map +1 -0
  53. package/dist/esm/worker.js +59 -91
  54. package/dist/esm/worker.js.map +1 -1
  55. package/package.json +1 -2
  56. package/dist/cjs/src/state/Store.d.ts +0 -11
  57. package/dist/cjs/state/Store.js +0 -40
  58. package/dist/cjs/state/Store.js.map +0 -1
  59. package/dist/esm/src/state/Store.d.ts +0 -11
  60. package/dist/esm/state/Store.js +0 -19
  61. package/dist/esm/state/Store.js.map +0 -1
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "default", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return _default;
9
+ }
10
+ });
11
+ var _jsxruntime = require("react/jsx-runtime");
12
+ var _ink = require("ink");
13
+ var _react = require("react");
14
+ var _figurests = /*#__PURE__*/ _interop_require_default(require("../lib/figures.js"));
15
+ var _Spinnerts = /*#__PURE__*/ _interop_require_default(require("./Spinner.js"));
16
+ function _define_property(obj, key, value) {
17
+ if (key in obj) {
18
+ Object.defineProperty(obj, key, {
19
+ value: value,
20
+ enumerable: true,
21
+ configurable: true,
22
+ writable: true
23
+ });
24
+ } else {
25
+ obj[key] = value;
26
+ }
27
+ return obj;
28
+ }
29
+ function _interop_require_default(obj) {
30
+ return obj && obj.__esModule ? obj : {
31
+ default: obj
32
+ };
33
+ }
34
+ function _object_spread(target) {
35
+ for(var i = 1; i < arguments.length; i++){
36
+ var source = arguments[i] != null ? arguments[i] : {};
37
+ var ownKeys = Object.keys(source);
38
+ if (typeof Object.getOwnPropertySymbols === "function") {
39
+ ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
40
+ return Object.getOwnPropertyDescriptor(source, sym).enumerable;
41
+ }));
42
+ }
43
+ ownKeys.forEach(function(key) {
44
+ _define_property(target, key, source[key]);
45
+ });
46
+ }
47
+ return target;
48
+ }
49
+ // From: https://github.com/sindresorhus/cli-spinners/blob/00de8fbeee16fa49502fa4f687449f70f2c8ca2c/spinners.json#L2
50
+ var SPINNER = {
51
+ interval: 80,
52
+ frames: [
53
+ '⠋',
54
+ '⠙',
55
+ '⠹',
56
+ '⠸',
57
+ '⠼',
58
+ '⠴',
59
+ '⠦',
60
+ '⠧',
61
+ '⠇',
62
+ '⠏'
63
+ ]
64
+ };
65
+ var _default = /*#__PURE__*/ (0, _react.memo)(function StatusBar(param) {
66
+ var running = param.running, done = param.done, errors = param.errors, errorLines = param.errorLines;
67
+ return /*#__PURE__*/ (0, _jsxruntime.jsxs)(_ink.Box, {
68
+ justifyContent: "space-between",
69
+ children: [
70
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Box, {
71
+ children: /*#__PURE__*/ (0, _jsxruntime.jsxs)(_ink.Text, {
72
+ children: [
73
+ running > 0 ? /*#__PURE__*/ (0, _jsxruntime.jsx)(_Spinnerts.default, _object_spread({}, SPINNER)) : /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
74
+ color: "green",
75
+ children: _figurests.default.tick
76
+ }),
77
+ " Running: ".concat(running, " "),
78
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
79
+ color: "green",
80
+ children: _figurests.default.tick
81
+ }),
82
+ " Done: ".concat(done, " "),
83
+ /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
84
+ color: "red",
85
+ children: _figurests.default.cross
86
+ }),
87
+ " Errors: ".concat(errors),
88
+ errorLines > 0 && /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
89
+ dimColor: true,
90
+ children: " (".concat(errorLines, " lines)")
91
+ })
92
+ ]
93
+ })
94
+ }),
95
+ errors > 0 && /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Box, {
96
+ children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_ink.Text, {
97
+ dimColor: true,
98
+ children: "[e]rrors"
99
+ })
100
+ })
101
+ ]
102
+ });
103
+ });
104
+ /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-term/src/components/StatusBar.tsx"],"sourcesContent":["import { Box, Text } from 'ink';\nimport { memo } from 'react';\nimport figures from '../lib/figures.ts';\nimport Spinner from './Spinner.ts';\n\n// From: https://github.com/sindresorhus/cli-spinners/blob/00de8fbeee16fa49502fa4f687449f70f2c8ca2c/spinners.json#L2\nconst SPINNER = {\n interval: 80,\n frames: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'],\n};\n\ntype Props = {\n running: number;\n done: number;\n errors: number;\n errorLines: number;\n};\n\nexport default memo(function StatusBar({ running, done, errors, errorLines }: Props) {\n return (\n <Box justifyContent=\"space-between\">\n <Box>\n <Text>\n {running > 0 ? <Spinner {...SPINNER} /> : <Text color=\"green\">{figures.tick}</Text>}\n {` Running: ${running} `}\n <Text color=\"green\">{figures.tick}</Text>\n {` Done: ${done} `}\n <Text color=\"red\">{figures.cross}</Text>\n {` Errors: ${errors}`}\n {errorLines > 0 && <Text dimColor>{` (${errorLines} lines)`}</Text>}\n </Text>\n </Box>\n {errors > 0 && (\n <Box>\n <Text dimColor>[e]rrors</Text>\n </Box>\n )}\n </Box>\n );\n});\n"],"names":["SPINNER","interval","frames","memo","StatusBar","running","done","errors","errorLines","Box","justifyContent","Text","Spinner","color","figures","tick","cross","dimColor"],"mappings":";;;;+BAkBA;;;eAAA;;;;mBAlB0B;qBACL;gEACD;gEACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEpB,oHAAoH;AACpH,IAAMA,UAAU;IACdC,UAAU;IACVC,QAAQ;QAAC;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;KAAI;AAC5D;IASA,yBAAeC,IAAAA,WAAI,EAAC,SAASC,UAAU,KAA4C;QAA1CC,UAAF,MAAEA,SAASC,OAAX,MAAWA,MAAMC,SAAjB,MAAiBA,QAAQC,aAAzB,MAAyBA;IAC9D,qBACE,sBAACC,QAAG;QAACC,gBAAe;;0BAClB,qBAACD,QAAG;0BACF,cAAA,sBAACE,SAAI;;wBACFN,UAAU,kBAAI,qBAACO,kBAAO,qBAAKZ,0BAAc,qBAACW,SAAI;4BAACE,OAAM;sCAASC,kBAAO,CAACC,IAAI;;wBACzE,aAAoB,OAARV,SAAQ;sCACtB,qBAACM,SAAI;4BAACE,OAAM;sCAASC,kBAAO,CAACC,IAAI;;wBAC/B,UAAc,OAALT,MAAK;sCAChB,qBAACK,SAAI;4BAACE,OAAM;sCAAOC,kBAAO,CAACE,KAAK;;wBAC9B,YAAkB,OAAPT;wBACZC,aAAa,mBAAK,qBAACG,SAAI;4BAACM,QAAQ;sCAAE,AAAC,KAAe,OAAXT,YAAW;;;;;YAGtDD,SAAS,mBACR,qBAACE,QAAG;0BACF,cAAA,qBAACE,SAAI;oBAACM,QAAQ;8BAAC;;;;;AAKzB"}
@@ -10,52 +10,49 @@ Object.defineProperty(exports, "default", {
10
10
  });
11
11
  var _jsxruntime = require("react/jsx-runtime");
12
12
  var _ink = require("ink");
13
- var _lodashthrottle = /*#__PURE__*/ _interop_require_default(require("lodash.throttle"));
14
13
  var _Appts = /*#__PURE__*/ _interop_require_default(require("./components/App.js"));
15
- var _Storets = /*#__PURE__*/ _interop_require_default(require("./state/Store.js"));
14
+ var _processStorets = require("./state/processStore.js");
16
15
  function _interop_require_default(obj) {
17
16
  return obj && obj.__esModule ? obj : {
18
17
  default: obj
19
18
  };
20
19
  }
21
- var THROTTLE = 100;
22
20
  function createApp() {
23
21
  var refCount = 0;
24
- var store = null;
25
22
  var inkApp = null;
26
- var previousData = null;
27
- var rerender = (0, _lodashthrottle.default)(function() {
28
- if (!inkApp || !store) return;
29
- if (store.data() === previousData) return;
30
- previousData = store.data();
31
- inkApp.rerender(/*#__PURE__*/ (0, _jsxruntime.jsx)(_Appts.default, {
32
- store: store
33
- }));
34
- }, THROTTLE, {
35
- leading: false
36
- });
37
23
  return {
38
- retain: function retain(fn) {
39
- if (++refCount > 1) return fn(store);
40
- if (store) throw new Error('Not expecting store');
41
- store = new _Storets.default(rerender);
42
- inkApp = (0, _ink.render)(/*#__PURE__*/ (0, _jsxruntime.jsx)(_Appts.default, {
43
- store: store
44
- }));
45
- fn(store);
24
+ retain: function retain() {
25
+ if (++refCount > 1) return _processStorets.processStore;
26
+ // Render once - React handles all subsequent updates via useSyncExternalStore
27
+ inkApp = (0, _ink.render)(/*#__PURE__*/ (0, _jsxruntime.jsx)(_Appts.default, {}));
28
+ return _processStorets.processStore;
46
29
  },
47
- release: function release(cb) {
48
- if (--refCount > 0) return cb();
49
- if (!store) throw new Error('Expecting store');
50
- rerender.flush();
51
- rerender.cancel();
30
+ release: function release(callback) {
31
+ if (--refCount > 0) {
32
+ callback();
33
+ return;
34
+ }
35
+ if (!inkApp) throw new Error('Expecting inkApp');
36
+ // Defer signalExit to allow React's reconciliation to complete fully
37
+ // Using setImmediate ensures we run after I/O callbacks and microtasks,
38
+ // preventing the Static component from outputting the last item twice
39
+ // (the second notify() from signalExit can race with Static's useLayoutEffect)
40
+ setImmediate(function() {
41
+ _processStorets.processStore.signalExit(function() {
42
+ _processStorets.processStore.reset();
43
+ process.stdout.write('\x1b[?25h'); // show cursor
44
+ callback();
45
+ });
46
+ });
47
+ // Wait for Ink to finish, then call the callback
52
48
  inkApp.waitUntilExit().then(function() {
53
- return cb();
54
- }).catch(cb);
55
- inkApp.unmount();
49
+ var cb = _processStorets.processStore.getExitCallback();
50
+ cb === null || cb === void 0 ? void 0 : cb();
51
+ }).catch(function() {
52
+ var cb = _processStorets.processStore.getExitCallback();
53
+ cb === null || cb === void 0 ? void 0 : cb();
54
+ });
56
55
  inkApp = null;
57
- store = null;
58
- process.stdout.write('\x1b[?25h'); // show cursor
59
56
  }
60
57
  };
61
58
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-term/src/createApp.tsx"],"sourcesContent":["import { type Instance, render } from 'ink';\nimport throttle from 'lodash.throttle';\nimport App from './components/App.ts';\nimport { default as Store, type StoreData } from './state/Store.ts';\n\nexport type RetainCallback = (app: Store) => undefined;\nexport type ReleaseCallback = () => undefined;\n\nconst THROTTLE = 100;\n\nexport default function createApp() {\n let refCount = 0;\n let store = null;\n let inkApp: Instance | null = null;\n\n let previousData: StoreData[] = null;\n const rerender = throttle(\n () => {\n if (!inkApp || !store) return;\n if (store.data() === previousData) return;\n previousData = store.data();\n inkApp.rerender(<App store={store} />);\n },\n THROTTLE,\n { leading: false }\n );\n\n return {\n retain(fn: RetainCallback): undefined {\n if (++refCount > 1) return fn(store);\n if (store) throw new Error('Not expecting store');\n\n store = new Store(rerender);\n inkApp = render(<App store={store} />);\n fn(store);\n },\n release(cb: ReleaseCallback): undefined {\n if (--refCount > 0) return cb();\n if (!store) throw new Error('Expecting store');\n\n rerender.flush();\n rerender.cancel();\n inkApp\n .waitUntilExit()\n .then(() => cb())\n .catch(cb);\n inkApp.unmount();\n inkApp = null;\n store = null;\n process.stdout.write('\\x1b[?25h'); // show cursor\n },\n };\n}\n"],"names":["createApp","THROTTLE","refCount","store","inkApp","previousData","rerender","throttle","data","App","leading","retain","fn","Error","Store","render","release","cb","flush","cancel","waitUntilExit","then","catch","unmount","process","stdout","write"],"mappings":";;;;+BAUA;;;eAAwBA;;;;mBAVc;qEACjB;4DACL;8DACiC;;;;;;AAKjD,IAAMC,WAAW;AAEF,SAASD;IACtB,IAAIE,WAAW;IACf,IAAIC,QAAQ;IACZ,IAAIC,SAA0B;IAE9B,IAAIC,eAA4B;IAChC,IAAMC,WAAWC,IAAAA,uBAAQ,EACvB;QACE,IAAI,CAACH,UAAU,CAACD,OAAO;QACvB,IAAIA,MAAMK,IAAI,OAAOH,cAAc;QACnCA,eAAeF,MAAMK,IAAI;QACzBJ,OAAOE,QAAQ,eAAC,qBAACG,cAAG;YAACN,OAAOA;;IAC9B,GACAF,UACA;QAAES,SAAS;IAAM;IAGnB,OAAO;QACLC,QAAAA,SAAAA,OAAOC,EAAkB;YACvB,IAAI,EAAEV,WAAW,GAAG,OAAOU,GAAGT;YAC9B,IAAIA,OAAO,MAAM,IAAIU,MAAM;YAE3BV,QAAQ,IAAIW,gBAAK,CAACR;YAClBF,SAASW,IAAAA,WAAM,gBAAC,qBAACN,cAAG;gBAACN,OAAOA;;YAC5BS,GAAGT;QACL;QACAa,SAAAA,SAAAA,QAAQC,EAAmB;YACzB,IAAI,EAAEf,WAAW,GAAG,OAAOe;YAC3B,IAAI,CAACd,OAAO,MAAM,IAAIU,MAAM;YAE5BP,SAASY,KAAK;YACdZ,SAASa,MAAM;YACff,OACGgB,aAAa,GACbC,IAAI,CAAC;uBAAMJ;eACXK,KAAK,CAACL;YACTb,OAAOmB,OAAO;YACdnB,SAAS;YACTD,QAAQ;YACRqB,QAAQC,MAAM,CAACC,KAAK,CAAC,cAAc,cAAc;QACnD;IACF;AACF"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-term/src/createApp.tsx"],"sourcesContent":["import { render } from 'ink';\nimport App from './components/App.ts';\nimport { type ProcessStore, processStore } from './state/processStore.ts';\n\nexport type ReleaseCallback = () => void;\n\nexport default function createApp() {\n let refCount = 0;\n let inkApp: ReturnType<typeof render> | null = null;\n\n return {\n retain(): ProcessStore {\n if (++refCount > 1) return processStore;\n\n // Render once - React handles all subsequent updates via useSyncExternalStore\n inkApp = render(<App />);\n return processStore;\n },\n\n release(callback: ReleaseCallback): void {\n if (--refCount > 0) {\n callback();\n return;\n }\n if (!inkApp) throw new Error('Expecting inkApp');\n\n // Defer signalExit to allow React's reconciliation to complete fully\n // Using setImmediate ensures we run after I/O callbacks and microtasks,\n // preventing the Static component from outputting the last item twice\n // (the second notify() from signalExit can race with Static's useLayoutEffect)\n setImmediate(() => {\n processStore.signalExit(() => {\n processStore.reset();\n process.stdout.write('\\x1b[?25h'); // show cursor\n callback();\n });\n });\n\n // Wait for Ink to finish, then call the callback\n inkApp\n .waitUntilExit()\n .then(() => {\n const cb = processStore.getExitCallback();\n cb?.();\n })\n .catch(() => {\n const cb = processStore.getExitCallback();\n cb?.();\n });\n\n inkApp = null;\n },\n };\n}\n"],"names":["createApp","refCount","inkApp","retain","processStore","render","App","release","callback","Error","setImmediate","signalExit","reset","process","stdout","write","waitUntilExit","then","cb","getExitCallback","catch"],"mappings":";;;;+BAMA;;;eAAwBA;;;;mBAND;4DACP;8BACgC;;;;;;AAIjC,SAASA;IACtB,IAAIC,WAAW;IACf,IAAIC,SAA2C;IAE/C,OAAO;QACLC,QAAAA,SAAAA;YACE,IAAI,EAAEF,WAAW,GAAG,OAAOG,4BAAY;YAEvC,8EAA8E;YAC9EF,SAASG,IAAAA,WAAM,gBAAC,qBAACC,cAAG;YACpB,OAAOF,4BAAY;QACrB;QAEAG,SAAAA,SAAAA,QAAQC,QAAyB;YAC/B,IAAI,EAAEP,WAAW,GAAG;gBAClBO;gBACA;YACF;YACA,IAAI,CAACN,QAAQ,MAAM,IAAIO,MAAM;YAE7B,qEAAqE;YACrE,wEAAwE;YACxE,sEAAsE;YACtE,+EAA+E;YAC/EC,aAAa;gBACXN,4BAAY,CAACO,UAAU,CAAC;oBACtBP,4BAAY,CAACQ,KAAK;oBAClBC,QAAQC,MAAM,CAACC,KAAK,CAAC,cAAc,cAAc;oBACjDP;gBACF;YACF;YAEA,iDAAiD;YACjDN,OACGc,aAAa,GACbC,IAAI,CAAC;gBACJ,IAAMC,KAAKd,4BAAY,CAACe,eAAe;gBACvCD,eAAAA,yBAAAA;YACF,GACCE,KAAK,CAAC;gBACL,IAAMF,KAAKd,4BAAY,CAACe,eAAe;gBACvCD,eAAAA,yBAAAA;YACF;YAEFhB,SAAS;QACX;IACF;AACF"}
@@ -1,4 +1,3 @@
1
- // From: https://github.com/sindresorhus/is-unicode-supported
2
1
  "use strict";
3
2
  Object.defineProperty(exports, "__esModule", {
4
3
  value: true
@@ -9,6 +8,7 @@ Object.defineProperty(exports, "default", {
9
8
  return _default;
10
9
  }
11
10
  });
11
+ // From: https://github.com/sindresorhus/is-unicode-supported
12
12
  function isUnicodeSupported() {
13
13
  var env = process.env;
14
14
  var TERM = env.TERM, TERM_PROGRAM = env.TERM_PROGRAM;
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-term/src/lib/figures.ts"],"sourcesContent":["// From: https://github.com/sindresorhus/is-unicode-supported\nfunction isUnicodeSupported() {\n const { env } = process;\n const { TERM, TERM_PROGRAM } = env;\n\n if (process.platform !== 'win32') {\n return TERM !== 'linux'; // Linux console (kernel)\n }\n\n return (\n Boolean(env.WT_SESSION) || // Windows Terminal\n Boolean(env.TERMINUS_SUBLIME) || // Terminus (<0.2.27)\n env.ConEmuTask === '{cmd::Cmder}' || // ConEmu and cmder\n TERM_PROGRAM === 'Terminus-Sublime' ||\n TERM_PROGRAM === 'vscode' ||\n TERM === 'xterm-256color' ||\n TERM === 'alacritty' ||\n TERM === 'rxvt-unicode' ||\n TERM === 'rxvt-unicode-256color' ||\n env.TERMINAL_EMULATOR === 'JetBrains-JediTerm'\n );\n}\n\n// From https://github.com/sindresorhus/figures\nconst symbols = {\n arrowRight: '→',\n tick: '✔',\n info: 'ℹ',\n warning: '⚠',\n cross: '✖',\n squareSmallFilled: '◼',\n pointer: '❯',\n};\n\nconst fallbackSymbols = {\n arrowRight: '→',\n tick: '√',\n info: 'i',\n warning: '‼',\n cross: '×',\n squareSmallFilled: '■',\n pointer: '>',\n};\n\nexport default isUnicodeSupported() ? symbols : fallbackSymbols;\n"],"names":["isUnicodeSupported","env","process","TERM","TERM_PROGRAM","platform","Boolean","WT_SESSION","TERMINUS_SUBLIME","ConEmuTask","TERMINAL_EMULATOR","symbols","arrowRight","tick","info","warning","cross","squareSmallFilled","pointer","fallbackSymbols"],"mappings":"AAAA,6DAA6D;;;;;+BA4C7D;;;eAAA;;;AA3CA,SAASA;IACP,IAAM,AAAEC,MAAQC,QAARD;IACR,IAAQE,OAAuBF,IAAvBE,MAAMC,eAAiBH,IAAjBG;IAEd,IAAIF,QAAQG,QAAQ,KAAK,SAAS;QAChC,OAAOF,SAAS,SAAS,yBAAyB;IACpD;IAEA,OACEG,QAAQL,IAAIM,UAAU,KAAK,mBAAmB;IAC9CD,QAAQL,IAAIO,gBAAgB,KAAK,qBAAqB;IACtDP,IAAIQ,UAAU,KAAK,kBAAkB,mBAAmB;IACxDL,iBAAiB,sBACjBA,iBAAiB,YACjBD,SAAS,oBACTA,SAAS,eACTA,SAAS,kBACTA,SAAS,2BACTF,IAAIS,iBAAiB,KAAK;AAE9B;AAEA,+CAA+C;AAC/C,IAAMC,UAAU;IACdC,YAAY;IACZC,MAAM;IACNC,MAAM;IACNC,SAAS;IACTC,OAAO;IACPC,mBAAmB;IACnBC,SAAS;AACX;AAEA,IAAMC,kBAAkB;IACtBP,YAAY;IACZC,MAAM;IACNC,MAAM;IACNC,SAAS;IACTC,OAAO;IACPC,mBAAmB;IACnBC,SAAS;AACX;IAEA,WAAelB,uBAAuBW,UAAUQ"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-term/src/lib/figures.ts"],"sourcesContent":["// From: https://github.com/sindresorhus/is-unicode-supported\nfunction isUnicodeSupported() {\n const { env } = process;\n const { TERM, TERM_PROGRAM } = env;\n\n if (process.platform !== 'win32') {\n return TERM !== 'linux'; // Linux console (kernel)\n }\n\n return (\n Boolean(env.WT_SESSION) || // Windows Terminal\n Boolean(env.TERMINUS_SUBLIME) || // Terminus (<0.2.27)\n env.ConEmuTask === '{cmd::Cmder}' || // ConEmu and cmder\n TERM_PROGRAM === 'Terminus-Sublime' ||\n TERM_PROGRAM === 'vscode' ||\n TERM === 'xterm-256color' ||\n TERM === 'alacritty' ||\n TERM === 'rxvt-unicode' ||\n TERM === 'rxvt-unicode-256color' ||\n env.TERMINAL_EMULATOR === 'JetBrains-JediTerm'\n );\n}\n\n// From https://github.com/sindresorhus/figures\nconst symbols = {\n arrowRight: '→',\n tick: '✔',\n info: 'ℹ',\n warning: '⚠',\n cross: '✖',\n squareSmallFilled: '◼',\n pointer: '❯',\n};\n\nconst fallbackSymbols = {\n arrowRight: '→',\n tick: '√',\n info: 'i',\n warning: '‼',\n cross: '×',\n squareSmallFilled: '■',\n pointer: '>',\n};\n\nexport default isUnicodeSupported() ? symbols : fallbackSymbols;\n"],"names":["isUnicodeSupported","env","process","TERM","TERM_PROGRAM","platform","Boolean","WT_SESSION","TERMINUS_SUBLIME","ConEmuTask","TERMINAL_EMULATOR","symbols","arrowRight","tick","info","warning","cross","squareSmallFilled","pointer","fallbackSymbols"],"mappings":";;;;+BA4CA;;;eAAA;;;AA5CA,6DAA6D;AAC7D,SAASA;IACP,IAAM,AAAEC,MAAQC,QAARD;IACR,IAAQE,OAAuBF,IAAvBE,MAAMC,eAAiBH,IAAjBG;IAEd,IAAIF,QAAQG,QAAQ,KAAK,SAAS;QAChC,OAAOF,SAAS,SAAS,yBAAyB;IACpD;IAEA,OACEG,QAAQL,IAAIM,UAAU,KAAK,mBAAmB;IAC9CD,QAAQL,IAAIO,gBAAgB,KAAK,qBAAqB;IACtDP,IAAIQ,UAAU,KAAK,kBAAkB,mBAAmB;IACxDL,iBAAiB,sBACjBA,iBAAiB,YACjBD,SAAS,oBACTA,SAAS,eACTA,SAAS,kBACTA,SAAS,2BACTF,IAAIS,iBAAiB,KAAK;AAE9B;AAEA,+CAA+C;AAC/C,IAAMC,UAAU;IACdC,YAAY;IACZC,MAAM;IACNC,MAAM;IACNC,SAAS;IACTC,OAAO;IACPC,mBAAmB;IACnBC,SAAS;AACX;AAEA,IAAMC,kBAAkB;IACtBP,YAAY;IACZC,MAAM;IACNC,MAAM;IACNC,SAAS;IACTC,OAAO;IACPC,mBAAmB;IACnBC,SAAS;AACX;IAEA,WAAelB,uBAAuBW,UAAUQ"}
@@ -1,5 +1 @@
1
- import type Store from '../state/Store.js';
2
- export interface AppProps {
3
- store: Store;
4
- }
5
- export default function App({ store }: AppProps): React.JSX.Element;
1
+ export default function App(): React.JSX.Element;
@@ -0,0 +1,6 @@
1
+ import type { ChildProcess } from '../types.js';
2
+ type Props = {
3
+ item: ChildProcess;
4
+ };
5
+ declare const _default: import("react").NamedExoticComponent<Props>;
6
+ export default _default;
@@ -0,0 +1,2 @@
1
+ declare const _default: import("react").NamedExoticComponent<object>;
2
+ export default _default;
@@ -0,0 +1,8 @@
1
+ import type { ChildProcess } from '../types.js';
2
+ type Props = {
3
+ error: ChildProcess;
4
+ currentIndex: number;
5
+ totalErrors: number;
6
+ };
7
+ declare const _default: import("react").NamedExoticComponent<Props>;
8
+ export default _default;
@@ -0,0 +1,8 @@
1
+ import type { ChildProcess } from '../types.js';
2
+ type Props = {
3
+ errors: ChildProcess[];
4
+ selectedIndex: number;
5
+ totalErrorLines: number;
6
+ };
7
+ declare const _default: import("react").NamedExoticComponent<Props>;
8
+ export default _default;
@@ -0,0 +1,8 @@
1
+ type Props = {
2
+ running: number;
3
+ done: number;
4
+ errors: number;
5
+ errorLines: number;
6
+ };
7
+ declare const _default: import("react").NamedExoticComponent<Props>;
8
+ export default _default;
@@ -1,7 +1,6 @@
1
- import { default as Store } from './state/Store.js';
2
- export type RetainCallback = (app: Store) => undefined;
3
- export type ReleaseCallback = () => undefined;
1
+ import { type ProcessStore } from './state/processStore.js';
2
+ export type ReleaseCallback = () => void;
4
3
  export default function createApp(): {
5
- retain(fn: RetainCallback): undefined;
6
- release(cb: ReleaseCallback): undefined;
4
+ retain(): ProcessStore;
5
+ release(callback: ReleaseCallback): void;
7
6
  };
@@ -0,0 +1,38 @@
1
+ import type { ChildProcess, Line } from '../types.js';
2
+ type Listener = () => void;
3
+ type Mode = 'normal' | 'errorList' | 'errorDetail';
4
+ declare class ProcessStore {
5
+ private processes;
6
+ private completedIds;
7
+ private listeners;
8
+ private shouldExit;
9
+ private exitCallback;
10
+ private mode;
11
+ private selectedErrorIndex;
12
+ subscribe: (listener: Listener) => (() => void);
13
+ getSnapshot: () => ChildProcess[];
14
+ getRunningProcesses: () => ChildProcess[];
15
+ getCompletedProcesses: () => ChildProcess[];
16
+ getFailedProcesses: () => ChildProcess[];
17
+ getRunningCount: () => number;
18
+ getDoneCount: () => number;
19
+ getErrorCount: () => number;
20
+ getErrorLineCount: () => number;
21
+ getMode: () => Mode;
22
+ getSelectedErrorIndex: () => number;
23
+ addProcess(process: ChildProcess): void;
24
+ updateProcess(id: string, update: Partial<ChildProcess>): void;
25
+ appendLines(id: string, newLines: Line[]): void;
26
+ getProcess(id: string): ChildProcess | undefined;
27
+ setMode(mode: Mode): void;
28
+ selectNextError(): void;
29
+ selectPrevError(): void;
30
+ getSelectedError(): ChildProcess | undefined;
31
+ signalExit(callback: () => void): void;
32
+ getShouldExit: () => boolean;
33
+ getExitCallback: () => (() => void) | null;
34
+ reset(): void;
35
+ private notify;
36
+ }
37
+ export declare const processStore: ProcessStore;
38
+ export type { ProcessStore };
@@ -0,0 +1,241 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "processStore", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return processStore;
9
+ }
10
+ });
11
+ var _typests = require("../types.js");
12
+ function _array_like_to_array(arr, len) {
13
+ if (len == null || len > arr.length) len = arr.length;
14
+ for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
15
+ return arr2;
16
+ }
17
+ function _array_without_holes(arr) {
18
+ if (Array.isArray(arr)) return _array_like_to_array(arr);
19
+ }
20
+ function _class_call_check(instance, Constructor) {
21
+ if (!(instance instanceof Constructor)) {
22
+ throw new TypeError("Cannot call a class as a function");
23
+ }
24
+ }
25
+ function _define_property(obj, key, value) {
26
+ if (key in obj) {
27
+ Object.defineProperty(obj, key, {
28
+ value: value,
29
+ enumerable: true,
30
+ configurable: true,
31
+ writable: true
32
+ });
33
+ } else {
34
+ obj[key] = value;
35
+ }
36
+ return obj;
37
+ }
38
+ function _iterable_to_array(iter) {
39
+ if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
40
+ }
41
+ function _non_iterable_spread() {
42
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
43
+ }
44
+ function _object_spread(target) {
45
+ for(var i = 1; i < arguments.length; i++){
46
+ var source = arguments[i] != null ? arguments[i] : {};
47
+ var ownKeys = Object.keys(source);
48
+ if (typeof Object.getOwnPropertySymbols === "function") {
49
+ ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
50
+ return Object.getOwnPropertyDescriptor(source, sym).enumerable;
51
+ }));
52
+ }
53
+ ownKeys.forEach(function(key) {
54
+ _define_property(target, key, source[key]);
55
+ });
56
+ }
57
+ return target;
58
+ }
59
+ function _to_consumable_array(arr) {
60
+ return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
61
+ }
62
+ function _unsupported_iterable_to_array(o, minLen) {
63
+ if (!o) return;
64
+ if (typeof o === "string") return _array_like_to_array(o, minLen);
65
+ var n = Object.prototype.toString.call(o).slice(8, -1);
66
+ if (n === "Object" && o.constructor) n = o.constructor.name;
67
+ if (n === "Map" || n === "Set") return Array.from(n);
68
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
69
+ }
70
+ var ProcessStore = /*#__PURE__*/ function() {
71
+ "use strict";
72
+ function ProcessStore() {
73
+ var _this = this;
74
+ _class_call_check(this, ProcessStore);
75
+ this.processes = [];
76
+ this.completedIds = []; // Track completion order
77
+ this.listeners = new Set();
78
+ this.shouldExit = false;
79
+ this.exitCallback = null;
80
+ // UI state
81
+ this.mode = 'normal';
82
+ this.selectedErrorIndex = 0;
83
+ // useSyncExternalStore API
84
+ this.subscribe = function(listener) {
85
+ _this.listeners.add(listener);
86
+ return function() {
87
+ return _this.listeners.delete(listener);
88
+ };
89
+ };
90
+ this.getSnapshot = function() {
91
+ return _this.processes;
92
+ };
93
+ // Filtered getters
94
+ this.getRunningProcesses = function() {
95
+ return _this.processes.filter(function(p) {
96
+ return p.state === 'running';
97
+ });
98
+ };
99
+ this.getCompletedProcesses = function() {
100
+ // Return in completion order
101
+ return _this.completedIds.map(function(id) {
102
+ return _this.processes.find(function(p) {
103
+ return p.id === id;
104
+ });
105
+ }).filter(function(p) {
106
+ return p !== undefined;
107
+ });
108
+ };
109
+ this.getFailedProcesses = function() {
110
+ return _this.processes.filter(function(p) {
111
+ return p.state === 'error';
112
+ });
113
+ };
114
+ // Counts
115
+ this.getRunningCount = function() {
116
+ return _this.processes.filter(function(p) {
117
+ return p.state === 'running';
118
+ }).length;
119
+ };
120
+ this.getDoneCount = function() {
121
+ return _this.processes.filter(function(p) {
122
+ return p.state !== 'running';
123
+ }).length;
124
+ };
125
+ this.getErrorCount = function() {
126
+ return _this.processes.filter(function(p) {
127
+ return p.state === 'error';
128
+ }).length;
129
+ };
130
+ this.getErrorLineCount = function() {
131
+ return _this.processes.filter(function(p) {
132
+ return p.state === 'error';
133
+ }).reduce(function(total, p) {
134
+ return total + p.lines.filter(function(l) {
135
+ return l.type === _typests.LineType.stderr;
136
+ }).length;
137
+ }, 0);
138
+ };
139
+ // UI state getters
140
+ this.getMode = function() {
141
+ return _this.mode;
142
+ };
143
+ this.getSelectedErrorIndex = function() {
144
+ return _this.selectedErrorIndex;
145
+ };
146
+ this.getShouldExit = function() {
147
+ return _this.shouldExit;
148
+ };
149
+ this.getExitCallback = function() {
150
+ return _this.exitCallback;
151
+ };
152
+ }
153
+ var _proto = ProcessStore.prototype;
154
+ // Mutations - Ink handles render throttling at 30 FPS
155
+ _proto.addProcess = function addProcess(process) {
156
+ this.processes = _to_consumable_array(this.processes).concat([
157
+ process
158
+ ]);
159
+ this.notify();
160
+ };
161
+ _proto.updateProcess = function updateProcess(id, update) {
162
+ var oldProcess = this.processes.find(function(p) {
163
+ return p.id === id;
164
+ });
165
+ var wasRunning = (oldProcess === null || oldProcess === void 0 ? void 0 : oldProcess.state) === 'running';
166
+ var isNowComplete = update.state && update.state !== 'running';
167
+ this.processes = this.processes.map(function(p) {
168
+ return p.id === id ? _object_spread({}, p, update) : p;
169
+ });
170
+ // Track completion order
171
+ if (wasRunning && isNowComplete && !this.completedIds.includes(id)) {
172
+ this.completedIds = _to_consumable_array(this.completedIds).concat([
173
+ id
174
+ ]);
175
+ }
176
+ this.notify();
177
+ };
178
+ _proto.appendLines = function appendLines(id, newLines) {
179
+ var process = this.processes.find(function(p) {
180
+ return p.id === id;
181
+ });
182
+ if (process) {
183
+ this.updateProcess(id, {
184
+ lines: process.lines.concat(newLines)
185
+ });
186
+ }
187
+ };
188
+ _proto.getProcess = function getProcess(id) {
189
+ return this.processes.find(function(p) {
190
+ return p.id === id;
191
+ });
192
+ };
193
+ // UI state mutations
194
+ _proto.setMode = function setMode(mode) {
195
+ this.mode = mode;
196
+ if (mode === 'errorList') {
197
+ this.selectedErrorIndex = 0;
198
+ }
199
+ this.notify();
200
+ };
201
+ _proto.selectNextError = function selectNextError() {
202
+ var failed = this.getFailedProcesses();
203
+ if (failed.length > 0) {
204
+ this.selectedErrorIndex = (this.selectedErrorIndex + 1) % failed.length;
205
+ this.notify();
206
+ }
207
+ };
208
+ _proto.selectPrevError = function selectPrevError() {
209
+ var failed = this.getFailedProcesses();
210
+ if (failed.length > 0) {
211
+ this.selectedErrorIndex = (this.selectedErrorIndex - 1 + failed.length) % failed.length;
212
+ this.notify();
213
+ }
214
+ };
215
+ _proto.getSelectedError = function getSelectedError() {
216
+ var failed = this.getFailedProcesses();
217
+ return failed[this.selectedErrorIndex];
218
+ };
219
+ // Exit signaling
220
+ _proto.signalExit = function signalExit(callback) {
221
+ this.shouldExit = true;
222
+ this.exitCallback = callback;
223
+ this.notify();
224
+ };
225
+ _proto.reset = function reset() {
226
+ this.processes = [];
227
+ this.completedIds = [];
228
+ this.shouldExit = false;
229
+ this.exitCallback = null;
230
+ this.mode = 'normal';
231
+ this.selectedErrorIndex = 0;
232
+ };
233
+ _proto.notify = function notify() {
234
+ this.listeners.forEach(function(l) {
235
+ l();
236
+ });
237
+ };
238
+ return ProcessStore;
239
+ }();
240
+ var processStore = new ProcessStore();
241
+ /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-term/src/state/processStore.ts"],"sourcesContent":["import type { ChildProcess, Line } from '../types.ts';\nimport { LineType } from '../types.ts';\n\ntype Listener = () => void;\ntype Mode = 'normal' | 'errorList' | 'errorDetail';\n\nclass ProcessStore {\n private processes: ChildProcess[] = [];\n private completedIds: string[] = []; // Track completion order\n private listeners = new Set<Listener>();\n private shouldExit = false;\n private exitCallback: (() => void) | null = null;\n\n // UI state\n private mode: Mode = 'normal';\n private selectedErrorIndex = 0;\n\n // useSyncExternalStore API\n subscribe = (listener: Listener): (() => void) => {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n };\n\n getSnapshot = (): ChildProcess[] => this.processes;\n\n // Filtered getters\n getRunningProcesses = (): ChildProcess[] => {\n return this.processes.filter((p) => p.state === 'running');\n };\n\n getCompletedProcesses = (): ChildProcess[] => {\n // Return in completion order\n return this.completedIds.map((id) => this.processes.find((p) => p.id === id)).filter((p): p is ChildProcess => p !== undefined);\n };\n\n getFailedProcesses = (): ChildProcess[] => {\n return this.processes.filter((p) => p.state === 'error');\n };\n\n // Counts\n getRunningCount = (): number => this.processes.filter((p) => p.state === 'running').length;\n getDoneCount = (): number => this.processes.filter((p) => p.state !== 'running').length;\n getErrorCount = (): number => this.processes.filter((p) => p.state === 'error').length;\n getErrorLineCount = (): number => {\n return this.processes.filter((p) => p.state === 'error').reduce((total, p) => total + p.lines.filter((l) => l.type === LineType.stderr).length, 0);\n };\n\n // UI state getters\n getMode = (): Mode => this.mode;\n getSelectedErrorIndex = (): number => this.selectedErrorIndex;\n\n // Mutations - Ink handles render throttling at 30 FPS\n addProcess(process: ChildProcess): void {\n this.processes = [...this.processes, process];\n this.notify();\n }\n\n updateProcess(id: string, update: Partial<ChildProcess>): void {\n const oldProcess = this.processes.find((p) => p.id === id);\n const wasRunning = oldProcess?.state === 'running';\n const isNowComplete = update.state && update.state !== 'running';\n\n this.processes = this.processes.map((p) => (p.id === id ? { ...p, ...update } : p));\n\n // Track completion order\n if (wasRunning && isNowComplete && !this.completedIds.includes(id)) {\n this.completedIds = [...this.completedIds, id];\n }\n\n this.notify();\n }\n\n appendLines(id: string, newLines: Line[]): void {\n const process = this.processes.find((p) => p.id === id);\n if (process) {\n this.updateProcess(id, { lines: process.lines.concat(newLines) });\n }\n }\n\n getProcess(id: string): ChildProcess | undefined {\n return this.processes.find((p) => p.id === id);\n }\n\n // UI state mutations\n setMode(mode: Mode): void {\n this.mode = mode;\n if (mode === 'errorList') {\n this.selectedErrorIndex = 0;\n }\n this.notify();\n }\n\n selectNextError(): void {\n const failed = this.getFailedProcesses();\n if (failed.length > 0) {\n this.selectedErrorIndex = (this.selectedErrorIndex + 1) % failed.length;\n this.notify();\n }\n }\n\n selectPrevError(): void {\n const failed = this.getFailedProcesses();\n if (failed.length > 0) {\n this.selectedErrorIndex = (this.selectedErrorIndex - 1 + failed.length) % failed.length;\n this.notify();\n }\n }\n\n getSelectedError(): ChildProcess | undefined {\n const failed = this.getFailedProcesses();\n return failed[this.selectedErrorIndex];\n }\n\n // Exit signaling\n signalExit(callback: () => void): void {\n this.shouldExit = true;\n this.exitCallback = callback;\n this.notify();\n }\n\n getShouldExit = (): boolean => this.shouldExit;\n getExitCallback = (): (() => void) | null => this.exitCallback;\n\n reset(): void {\n this.processes = [];\n this.completedIds = [];\n this.shouldExit = false;\n this.exitCallback = null;\n this.mode = 'normal';\n this.selectedErrorIndex = 0;\n }\n\n private notify(): void {\n this.listeners.forEach((l) => {\n l();\n });\n }\n}\n\nexport const processStore = new ProcessStore();\nexport type { ProcessStore };\n"],"names":["processStore","ProcessStore","processes","completedIds","listeners","Set","shouldExit","exitCallback","mode","selectedErrorIndex","subscribe","listener","add","delete","getSnapshot","getRunningProcesses","filter","p","state","getCompletedProcesses","map","id","find","undefined","getFailedProcesses","getRunningCount","length","getDoneCount","getErrorCount","getErrorLineCount","reduce","total","lines","l","type","LineType","stderr","getMode","getSelectedErrorIndex","getShouldExit","getExitCallback","addProcess","process","notify","updateProcess","update","oldProcess","wasRunning","isNowComplete","includes","appendLines","newLines","concat","getProcess","setMode","selectNextError","failed","selectPrevError","getSelectedError","signalExit","callback","reset","forEach"],"mappings":"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"}