spawn-term 0.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 (36) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +11 -0
  3. package/dist/esm/index.mjs +11 -0
  4. package/dist/esm/index.mjs.map +1 -0
  5. package/dist/esm/lib/addLines.mjs +19 -0
  6. package/dist/esm/lib/addLines.mjs.map +1 -0
  7. package/dist/esm/lib/concatWritable.mjs +12 -0
  8. package/dist/esm/lib/concatWritable.mjs.map +1 -0
  9. package/dist/esm/terminal/components/App.mjs +32 -0
  10. package/dist/esm/terminal/components/App.mjs.map +1 -0
  11. package/dist/esm/terminal/components/ChildProcess.mjs +53 -0
  12. package/dist/esm/terminal/components/ChildProcess.mjs.map +1 -0
  13. package/dist/esm/terminal/createApp.mjs +43 -0
  14. package/dist/esm/terminal/createApp.mjs.map +1 -0
  15. package/dist/esm/terminal/lib/RenderSpinner.mjs +21 -0
  16. package/dist/esm/terminal/lib/RenderSpinner.mjs.map +1 -0
  17. package/dist/esm/terminal/lib/figures.mjs +21 -0
  18. package/dist/esm/terminal/lib/figures.mjs.map +1 -0
  19. package/dist/esm/terminal/lib/uuid.mjs +16 -0
  20. package/dist/esm/terminal/lib/uuid.mjs.map +1 -0
  21. package/dist/esm/types.mjs +2 -0
  22. package/dist/esm/types.mjs.map +1 -0
  23. package/dist/esm/worker.mjs +85 -0
  24. package/dist/esm/worker.mjs.map +1 -0
  25. package/dist/types/index.d.ts +3 -0
  26. package/dist/types/lib/addLines.d.ts +1 -0
  27. package/dist/types/lib/concatWritable.d.ts +1 -0
  28. package/dist/types/terminal/components/App.d.ts +5 -0
  29. package/dist/types/terminal/components/ChildProcess.d.ts +9 -0
  30. package/dist/types/terminal/createApp.d.ts +7 -0
  31. package/dist/types/terminal/lib/RenderSpinner.d.ts +9 -0
  32. package/dist/types/terminal/lib/figures.d.ts +10 -0
  33. package/dist/types/terminal/lib/uuid.d.ts +1 -0
  34. package/dist/types/types.d.ts +9 -0
  35. package/dist/types/worker.d.ts +2 -0
  36. package/package.json +65 -0
package/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2020 Kevin Malakoff
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ wof this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
package/README.md ADDED
@@ -0,0 +1,11 @@
1
+ ## spawn-term
2
+
3
+ Formats spawn with prefix and colors
4
+
5
+ ```
6
+ import spawn from 'spawn-term'
7
+
8
+ await spawn('npm', ['install'], { stdio: 'inherit' });
9
+ await spawn('npm', ['test'], { stdio: 'inherit' });
10
+
11
+ ```
@@ -0,0 +1,11 @@
1
+ import worker from './worker.mjs';
2
+ export * from './types.mjs';
3
+ export default function spawnTerminal(command, args, spawnOptions, options, callback) {
4
+ if (typeof options === 'function') {
5
+ callback = options;
6
+ options = {};
7
+ }
8
+ options = options || {};
9
+ if (typeof callback === 'function') return worker(command, args, spawnOptions, options, callback);
10
+ return new Promise((resolve, reject)=>worker(command, args, spawnOptions, options, (err, result)=>err ? reject(err) : resolve(result)));
11
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-terminal/src/index.ts"],"sourcesContent":["import worker from './worker.js';\n\nimport type { SpawnCallback, SpawnOptions, TerminalOptions } from './types.js';\n\nexport * from './types.js';\nexport default function spawnTerminal(command: string, args: string[], spawnOptions: SpawnOptions, options?: TerminalOptions | SpawnCallback, callback?: SpawnCallback) {\n if (typeof options === 'function') {\n callback = options as SpawnCallback;\n options = {};\n }\n options = options || {};\n\n if (typeof callback === 'function') return worker(command, args, spawnOptions, options, callback);\n return new Promise((resolve, reject) => worker(command, args, spawnOptions, options, (err, result) => (err ? reject(err) : resolve(result))));\n}\n"],"names":["worker","spawnTerminal","command","args","spawnOptions","options","callback","Promise","resolve","reject","err","result"],"mappings":"AAAA,OAAOA,YAAY,cAAc;AAIjC,cAAc,aAAa;AAC3B,eAAe,SAASC,cAAcC,OAAe,EAAEC,IAAc,EAAEC,YAA0B,EAAEC,OAAyC,EAAEC,QAAwB;IACpK,IAAI,OAAOD,YAAY,YAAY;QACjCC,WAAWD;QACXA,UAAU,CAAC;IACb;IACAA,UAAUA,WAAW,CAAC;IAEtB,IAAI,OAAOC,aAAa,YAAY,OAAON,OAAOE,SAASC,MAAMC,cAAcC,SAASC;IACxF,OAAO,IAAIC,QAAQ,CAACC,SAASC,SAAWT,OAAOE,SAASC,MAAMC,cAAcC,SAAS,CAACK,KAAKC,SAAYD,MAAMD,OAAOC,OAAOF,QAAQG;AACrI"}
@@ -0,0 +1,19 @@
1
+ import { Writable } from 'readable-stream';
2
+ const regEx = /\r\n|[\n\v\f\r\x85\u2028\u2029]/g;
3
+ export default function addLines(addLine) {
4
+ let last = '';
5
+ const stream = new Writable({
6
+ write (chunk, _enc, callback) {
7
+ const more = last + chunk.toString('utf8');
8
+ const lines = more.split(regEx);
9
+ last = lines.pop();
10
+ lines.forEach((line)=>addLine(line));
11
+ callback();
12
+ }
13
+ });
14
+ stream.on('finish', ()=>{
15
+ if (last.length) addLine(last);
16
+ last = '';
17
+ });
18
+ return stream;
19
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-terminal/src/lib/addLines.ts"],"sourcesContent":["import { Writable } from 'readable-stream';\n\nconst regEx = /\\r\\n|[\\n\\v\\f\\r\\x85\\u2028\\u2029]/g;\n\nexport default function addLines(addLine) {\n let last = '';\n\n const stream = new Writable({\n write(chunk, _enc, callback) {\n const more = last + chunk.toString('utf8');\n const lines = more.split(regEx);\n last = lines.pop();\n lines.forEach((line) => addLine(line));\n callback();\n },\n });\n stream.on('finish', () => {\n if (last.length) addLine(last);\n last = '';\n });\n return stream;\n}\n"],"names":["Writable","regEx","addLines","addLine","last","stream","write","chunk","_enc","callback","more","toString","lines","split","pop","forEach","line","on","length"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,kBAAkB;AAE3C,MAAMC,QAAQ;AAEd,eAAe,SAASC,SAASC,OAAO;IACtC,IAAIC,OAAO;IAEX,MAAMC,SAAS,IAAIL,SAAS;QAC1BM,OAAMC,KAAK,EAAEC,IAAI,EAAEC,QAAQ;YACzB,MAAMC,OAAON,OAAOG,MAAMI,QAAQ,CAAC;YACnC,MAAMC,QAAQF,KAAKG,KAAK,CAACZ;YACzBG,OAAOQ,MAAME,GAAG;YAChBF,MAAMG,OAAO,CAAC,CAACC,OAASb,QAAQa;YAChCP;QACF;IACF;IACAJ,OAAOY,EAAE,CAAC,UAAU;QAClB,IAAIb,KAAKc,MAAM,EAAEf,QAAQC;QACzBA,OAAO;IACT;IACA,OAAOC;AACT"}
@@ -0,0 +1,12 @@
1
+ import { Writable } from 'readable-stream';
2
+ export default function concatWritable(callback) {
3
+ const chunks = [];
4
+ const stream = new Writable({
5
+ write: (chunk, _encoding, next)=>{
6
+ chunks.push(chunk);
7
+ next();
8
+ }
9
+ });
10
+ stream.on('finish', ()=>callback(Buffer.concat(chunks.splice(0))));
11
+ return stream;
12
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-terminal/src/lib/concatWritable.ts"],"sourcesContent":["import { Writable } from 'readable-stream';\n\nexport default function concatWritable(callback) {\n const chunks = [];\n\n const stream = new Writable({\n write: (chunk, _encoding, next) => {\n chunks.push(chunk);\n next();\n },\n });\n stream.on('finish', () => callback(Buffer.concat(chunks.splice(0))));\n return stream;\n}\n"],"names":["Writable","concatWritable","callback","chunks","stream","write","chunk","_encoding","next","push","on","Buffer","concat","splice"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,kBAAkB;AAE3C,eAAe,SAASC,eAAeC,QAAQ;IAC7C,MAAMC,SAAS,EAAE;IAEjB,MAAMC,SAAS,IAAIJ,SAAS;QAC1BK,OAAO,CAACC,OAAOC,WAAWC;YACxBL,OAAOM,IAAI,CAACH;YACZE;QACF;IACF;IACAJ,OAAOM,EAAE,CAAC,UAAU,IAAMR,SAASS,OAAOC,MAAM,CAACT,OAAOU,MAAM,CAAC;IAC/D,OAAOT;AACT"}
@@ -0,0 +1,32 @@
1
+ // @ts-ignore
2
+ import { Box } from 'ink';
3
+ import React from 'react';
4
+ import ChildProcess from './ChildProcess.mjs';
5
+ export default function App({ list }) {
6
+ const running = list.filter((x)=>[
7
+ 'running'
8
+ ].indexOf(x.state) >= 0);
9
+ const done = list.filter((x)=>[
10
+ 'error',
11
+ 'success'
12
+ ].indexOf(x.state) >= 0);
13
+ return /*#__PURE__*/ React.createElement(React.Fragment, null, /*#__PURE__*/ React.createElement(Box, {
14
+ flexDirection: "column"
15
+ }, running.map((item)=>/*#__PURE__*/ React.createElement(ChildProcess, {
16
+ key: item.id,
17
+ ...item
18
+ }))), /*#__PURE__*/ React.createElement(Box, {
19
+ flexDirection: "column",
20
+ borderStyle: "single",
21
+ borderColor: "black",
22
+ borderBottom: true,
23
+ borderTop: false,
24
+ borderLeft: false,
25
+ borderRight: false
26
+ }), /*#__PURE__*/ React.createElement(Box, {
27
+ flexDirection: "column"
28
+ }, done.map((item)=>/*#__PURE__*/ React.createElement(ChildProcess, {
29
+ key: item.id,
30
+ ...item
31
+ }))));
32
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-terminal/src/terminal/components/App.tsx"],"sourcesContent":["// @ts-ignore\nimport { Box } from 'ink';\nimport React from 'react';\nimport type { ChildProcess as ChildProcessT } from '../../types.js';\nimport ChildProcess from './ChildProcess.js';\n\nexport interface AppProps {\n list: ChildProcessT[];\n}\n\nexport default function App({ list }: AppProps) {\n const running = list.filter((x) => ['running'].indexOf(x.state) >= 0);\n const done = list.filter((x) => ['error', 'success'].indexOf(x.state) >= 0);\n\n return (\n <>\n <Box flexDirection=\"column\">\n {running.map((item: ChildProcessT) => (\n <ChildProcess key={item.id} {...item} />\n ))}\n </Box>\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor=\"black\" borderBottom={true} borderTop={false} borderLeft={false} borderRight={false} />\n <Box flexDirection=\"column\">\n {done.map((item: ChildProcessT) => (\n <ChildProcess key={item.id} {...item} />\n ))}\n </Box>\n </>\n );\n}\n"],"names":["Box","React","ChildProcess","App","list","running","filter","x","indexOf","state","done","flexDirection","map","item","key","id","borderStyle","borderColor","borderBottom","borderTop","borderLeft","borderRight"],"mappings":"AAAA,aAAa;AACb,SAASA,GAAG,QAAQ,MAAM;AAC1B,OAAOC,WAAW,QAAQ;AAE1B,OAAOC,kBAAkB,oBAAoB;AAM7C,eAAe,SAASC,IAAI,EAAEC,IAAI,EAAY;IAC5C,MAAMC,UAAUD,KAAKE,MAAM,CAAC,CAACC,IAAM;YAAC;SAAU,CAACC,OAAO,CAACD,EAAEE,KAAK,KAAK;IACnE,MAAMC,OAAON,KAAKE,MAAM,CAAC,CAACC,IAAM;YAAC;YAAS;SAAU,CAACC,OAAO,CAACD,EAAEE,KAAK,KAAK;IAEzE,qBACE,wDACE,oBAACT;QAAIW,eAAc;OAChBN,QAAQO,GAAG,CAAC,CAACC,qBACZ,oBAACX;YAAaY,KAAKD,KAAKE,EAAE;YAAG,GAAGF,IAAI;4BAGxC,oBAACb;QAAIW,eAAc;QAASK,aAAY;QAASC,aAAY;QAAQC,cAAc;QAAMC,WAAW;QAAOC,YAAY;QAAOC,aAAa;sBAC3I,oBAACrB;QAAIW,eAAc;OAChBD,KAAKE,GAAG,CAAC,CAACC,qBACT,oBAACX;YAAaY,KAAKD,KAAKE,EAAE;YAAG,GAAGF,IAAI;;AAK9C"}
@@ -0,0 +1,53 @@
1
+ // @ts-ignore
2
+ import { Box, Text } from 'ink';
3
+ import React from 'react';
4
+ import RenderSpinner from '../lib/RenderSpinner.mjs';
5
+ import figures from '../lib/figures.mjs';
6
+ // From: https://github.com/sindresorhus/cli-spinners/blob/00de8fbeee16fa49502fa4f687449f70f2c8ca2c/spinners.json#L2
7
+ const spinner = {
8
+ interval: 80,
9
+ frames: [
10
+ '⠋',
11
+ '⠙',
12
+ '⠹',
13
+ '⠸',
14
+ '⠼',
15
+ '⠴',
16
+ '⠦',
17
+ '⠧',
18
+ '⠇',
19
+ '⠏'
20
+ ]
21
+ };
22
+ const ICONS = {
23
+ error: /*#__PURE__*/ React.createElement(Text, {
24
+ color: "red"
25
+ }, figures.cross),
26
+ success: /*#__PURE__*/ React.createElement(Text, {
27
+ color: "green"
28
+ }, figures.tick),
29
+ running: /*#__PURE__*/ React.createElement(RenderSpinner, {
30
+ spinner: spinner
31
+ })
32
+ };
33
+ const POINTERS = {
34
+ error: /*#__PURE__*/ React.createElement(Text, {
35
+ color: "red"
36
+ }, figures.pointer),
37
+ default: /*#__PURE__*/ React.createElement(Text, {
38
+ color: "yellow"
39
+ }, figures.pointer)
40
+ };
41
+ export default function ChildProcess({ title, state, lines, isExpanded }) {
42
+ const icon = isExpanded ? POINTERS[state] || POINTERS.default : ICONS[state];
43
+ const output = state === 'running' && lines.length ? lines[lines.length - 1] : undefined;
44
+ return /*#__PURE__*/ React.createElement(Box, {
45
+ flexDirection: "column"
46
+ }, /*#__PURE__*/ React.createElement(Box, null, /*#__PURE__*/ React.createElement(Box, {
47
+ marginRight: 1
48
+ }, /*#__PURE__*/ React.createElement(Text, null, icon)), /*#__PURE__*/ React.createElement(Text, null, title)), output ? /*#__PURE__*/ React.createElement(Box, {
49
+ marginLeft: 2
50
+ }, /*#__PURE__*/ React.createElement(Text, {
51
+ color: "gray"
52
+ }, `${figures.arrowRight} ${output}`)) : undefined);
53
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-terminal/src/terminal/components/ChildProcess.tsx"],"sourcesContent":["// @ts-ignore\nimport { Box, Text } from 'ink';\nimport React from 'react';\nimport RenderSpinner from '../lib/RenderSpinner.js';\nimport figures from '../lib/figures.js';\n\ntype State = 'running' | 'success' | 'error';\n\n// From: https://github.com/sindresorhus/cli-spinners/blob/00de8fbeee16fa49502fa4f687449f70f2c8ca2c/spinners.json#L2\nconst spinner = {\n interval: 80,\n frames: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'],\n};\n\nconst ICONS = {\n error: <Text color=\"red\">{figures.cross}</Text>,\n success: <Text color=\"green\">{figures.tick}</Text>,\n running: <RenderSpinner spinner={spinner} />,\n};\n\nconst POINTERS = {\n error: <Text color=\"red\">{figures.pointer}</Text>,\n default: <Text color=\"yellow\">{figures.pointer}</Text>,\n};\n\ntype ChildProcessProps = {\n title: string;\n state: State;\n lines: string[];\n isExpanded?: boolean;\n};\n\nexport default function ChildProcess({ title, state, lines, isExpanded }: ChildProcessProps) {\n const icon = isExpanded ? POINTERS[state] || POINTERS.default : ICONS[state];\n const output = state === 'running' && lines.length ? lines[lines.length - 1] : undefined;\n\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Box marginRight={1}>\n <Text>{icon}</Text>\n </Box>\n <Text>{title}</Text>\n </Box>\n {output ? (\n <Box marginLeft={2}>\n <Text color=\"gray\">{`${figures.arrowRight} ${output}`}</Text>\n </Box>\n ) : undefined}\n {/* {state === 'running' && lines.length > 0 && (\n <Box flexDirection=\"column\" marginLeft={2}>\n {lines.map((line, index) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: <explanation>\n <Box key={index} flexDirection=\"column\" height={1}>\n <Text>{line}</Text>\n </Box>\n ))}\n </Box>\n )} */}\n </Box>\n );\n}\n"],"names":["Box","Text","React","RenderSpinner","figures","spinner","interval","frames","ICONS","error","color","cross","success","tick","running","POINTERS","pointer","default","ChildProcess","title","state","lines","isExpanded","icon","output","length","undefined","flexDirection","marginRight","marginLeft","arrowRight"],"mappings":"AAAA,aAAa;AACb,SAASA,GAAG,EAAEC,IAAI,QAAQ,MAAM;AAChC,OAAOC,WAAW,QAAQ;AAC1B,OAAOC,mBAAmB,0BAA0B;AACpD,OAAOC,aAAa,oBAAoB;AAIxC,oHAAoH;AACpH,MAAMC,UAAU;IACdC,UAAU;IACVC,QAAQ;QAAC;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;QAAK;KAAI;AAC5D;AAEA,MAAMC,QAAQ;IACZC,qBAAO,oBAACR;QAAKS,OAAM;OAAON,QAAQO,KAAK;IACvCC,uBAAS,oBAACX;QAAKS,OAAM;OAASN,QAAQS,IAAI;IAC1CC,uBAAS,oBAACX;QAAcE,SAASA;;AACnC;AAEA,MAAMU,WAAW;IACfN,qBAAO,oBAACR;QAAKS,OAAM;OAAON,QAAQY,OAAO;IACzCC,uBAAS,oBAAChB;QAAKS,OAAM;OAAUN,QAAQY,OAAO;AAChD;AASA,eAAe,SAASE,aAAa,EAAEC,KAAK,EAAEC,KAAK,EAAEC,KAAK,EAAEC,UAAU,EAAqB;IACzF,MAAMC,OAAOD,aAAaP,QAAQ,CAACK,MAAM,IAAIL,SAASE,OAAO,GAAGT,KAAK,CAACY,MAAM;IAC5E,MAAMI,SAASJ,UAAU,aAAaC,MAAMI,MAAM,GAAGJ,KAAK,CAACA,MAAMI,MAAM,GAAG,EAAE,GAAGC;IAE/E,qBACE,oBAAC1B;QAAI2B,eAAc;qBACjB,oBAAC3B,yBACC,oBAACA;QAAI4B,aAAa;qBAChB,oBAAC3B,YAAMsB,sBAET,oBAACtB,YAAMkB,SAERK,uBACC,oBAACxB;QAAI6B,YAAY;qBACf,oBAAC5B;QAAKS,OAAM;OAAQ,GAAGN,QAAQ0B,UAAU,CAAC,CAAC,EAAEN,QAAQ,KAErDE;AAaV"}
@@ -0,0 +1,43 @@
1
+ import { render } from 'ink';
2
+ import React from 'react';
3
+ import App from './components/App.mjs';
4
+ import uuid from './lib/uuid.mjs';
5
+ export default function createApp() {
6
+ let refCount = 0;
7
+ let list = null;
8
+ let inkApp = null;
9
+ return {
10
+ addItem (data) {
11
+ if (!list) throw new Error('Expecting list');
12
+ const item = {
13
+ id: uuid(),
14
+ title: '',
15
+ state: 'pending',
16
+ lines: [],
17
+ ...data
18
+ };
19
+ list.push(item);
20
+ return item;
21
+ },
22
+ rerender () {
23
+ if (inkApp) inkApp.rerender(/*#__PURE__*/ React.createElement(App, {
24
+ list: list
25
+ }));
26
+ },
27
+ retain () {
28
+ if (++refCount > 1) return;
29
+ if (inkApp) throw new Error('Not expecting app');
30
+ list = [];
31
+ inkApp = render(/*#__PURE__*/ React.createElement(App, {
32
+ list: list
33
+ }));
34
+ },
35
+ release () {
36
+ if (--refCount > 0) return;
37
+ if (!inkApp) throw new Error('Expecting app');
38
+ inkApp.unmount();
39
+ inkApp = null;
40
+ list = null;
41
+ }
42
+ };
43
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-terminal/src/terminal/createApp.tsx"],"sourcesContent":["import { type Instance, render } from 'ink';\nimport React from 'react';\nimport type { ChildProcess } from '../types.js';\nimport App from './components/App.js';\nimport uuid from './lib/uuid.js';\n\nexport default function createApp() {\n let refCount = 0;\n let list: ChildProcess[] | null = null;\n let inkApp: Instance | null = null;\n\n return {\n addItem(data: Partial<ChildProcess>) {\n if (!list) throw new Error('Expecting list');\n const item = { id: uuid(), title: '', state: 'pending', lines: [], ...data } as ChildProcess;\n list.push(item);\n return item;\n },\n rerender() {\n if (inkApp) inkApp.rerender(<App list={list} />);\n },\n retain() {\n if (++refCount > 1) return;\n if (inkApp) throw new Error('Not expecting app');\n list = [];\n inkApp = render(<App list={list} />);\n },\n release() {\n if (--refCount > 0) return;\n if (!inkApp) throw new Error('Expecting app');\n inkApp.unmount();\n inkApp = null;\n list = null;\n },\n };\n}\n"],"names":["render","React","App","uuid","createApp","refCount","list","inkApp","addItem","data","Error","item","id","title","state","lines","push","rerender","retain","release","unmount"],"mappings":"AAAA,SAAwBA,MAAM,QAAQ,MAAM;AAC5C,OAAOC,WAAW,QAAQ;AAE1B,OAAOC,SAAS,sBAAsB;AACtC,OAAOC,UAAU,gBAAgB;AAEjC,eAAe,SAASC;IACtB,IAAIC,WAAW;IACf,IAAIC,OAA8B;IAClC,IAAIC,SAA0B;IAE9B,OAAO;QACLC,SAAQC,IAA2B;YACjC,IAAI,CAACH,MAAM,MAAM,IAAII,MAAM;YAC3B,MAAMC,OAAO;gBAAEC,IAAIT;gBAAQU,OAAO;gBAAIC,OAAO;gBAAWC,OAAO,EAAE;gBAAE,GAAGN,IAAI;YAAC;YAC3EH,KAAKU,IAAI,CAACL;YACV,OAAOA;QACT;QACAM;YACE,IAAIV,QAAQA,OAAOU,QAAQ,eAAC,oBAACf;gBAAII,MAAMA;;QACzC;QACAY;YACE,IAAI,EAAEb,WAAW,GAAG;YACpB,IAAIE,QAAQ,MAAM,IAAIG,MAAM;YAC5BJ,OAAO,EAAE;YACTC,SAASP,qBAAO,oBAACE;gBAAII,MAAMA;;QAC7B;QACAa;YACE,IAAI,EAAEd,WAAW,GAAG;YACpB,IAAI,CAACE,QAAQ,MAAM,IAAIG,MAAM;YAC7BH,OAAOa,OAAO;YACdb,SAAS;YACTD,OAAO;QACT;IACF;AACF"}
@@ -0,0 +1,21 @@
1
+ // Fork of https://github.com/vadimdemedes/ink-spinner
2
+ import { Text } from 'ink';
3
+ import React, { useState, useEffect } from 'react';
4
+ const RenderSpinner = ({ spinner })=>{
5
+ const [frameIndex, setFrameIndex] = useState(0);
6
+ useEffect(()=>{
7
+ const timer = setInterval(()=>{
8
+ setFrameIndex((currentFrameIndex)=>{
9
+ const isLastFrame = currentFrameIndex === spinner.frames.length - 1;
10
+ return isLastFrame ? 0 : currentFrameIndex + 1;
11
+ });
12
+ }, spinner.interval);
13
+ return ()=>{
14
+ clearInterval(timer);
15
+ };
16
+ }, [
17
+ spinner
18
+ ]);
19
+ return /*#__PURE__*/ React.createElement(Text, null, spinner.frames[frameIndex]);
20
+ };
21
+ export default RenderSpinner;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-terminal/src/terminal/lib/RenderSpinner.tsx"],"sourcesContent":["// Fork of https://github.com/vadimdemedes/ink-spinner\n\nimport { Text } from 'ink';\nimport React, { useState, useEffect } from 'react';\nimport type { FC } from 'react';\n\nexport type Spinner = {\n interval: number;\n frames: string[];\n};\n\nconst RenderSpinner: FC<{\n spinner: Spinner;\n}> = ({ spinner }) => {\n const [frameIndex, setFrameIndex] = useState(0);\n\n useEffect(() => {\n const timer = setInterval(() => {\n setFrameIndex((currentFrameIndex) => {\n const isLastFrame = currentFrameIndex === spinner.frames.length - 1;\n return isLastFrame ? 0 : currentFrameIndex + 1;\n });\n }, spinner.interval);\n\n return () => {\n clearInterval(timer);\n };\n }, [spinner]);\n\n return <Text>{spinner.frames[frameIndex]}</Text>;\n};\n\nexport default RenderSpinner;\n"],"names":["Text","React","useState","useEffect","RenderSpinner","spinner","frameIndex","setFrameIndex","timer","setInterval","currentFrameIndex","isLastFrame","frames","length","interval","clearInterval"],"mappings":"AAAA,sDAAsD;AAEtD,SAASA,IAAI,QAAQ,MAAM;AAC3B,OAAOC,SAASC,QAAQ,EAAEC,SAAS,QAAQ,QAAQ;AAQnD,MAAMC,gBAED,CAAC,EAAEC,OAAO,EAAE;IACf,MAAM,CAACC,YAAYC,cAAc,GAAGL,SAAS;IAE7CC,UAAU;QACR,MAAMK,QAAQC,YAAY;YACxBF,cAAc,CAACG;gBACb,MAAMC,cAAcD,sBAAsBL,QAAQO,MAAM,CAACC,MAAM,GAAG;gBAClE,OAAOF,cAAc,IAAID,oBAAoB;YAC/C;QACF,GAAGL,QAAQS,QAAQ;QAEnB,OAAO;YACLC,cAAcP;QAChB;IACF,GAAG;QAACH;KAAQ;IAEZ,qBAAO,oBAACL,YAAMK,QAAQO,MAAM,CAACN,WAAW;AAC1C;AAEA,eAAeF,cAAc"}
@@ -0,0 +1,21 @@
1
+ // Fork of https://github.com/sindresorhus/figures
2
+ import isUnicodeSupported from 'is-unicode-supported';
3
+ const symbols = {
4
+ arrowRight: '→',
5
+ tick: '✔',
6
+ info: 'ℹ',
7
+ warning: '⚠',
8
+ cross: '✖',
9
+ squareSmallFilled: '◼',
10
+ pointer: '❯'
11
+ };
12
+ const fallbackSymbols = {
13
+ arrowRight: '→',
14
+ tick: '√',
15
+ info: 'i',
16
+ warning: '‼',
17
+ cross: '×',
18
+ squareSmallFilled: '■',
19
+ pointer: '>'
20
+ };
21
+ export default isUnicodeSupported() ? symbols : fallbackSymbols;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-terminal/src/terminal/lib/figures.ts"],"sourcesContent":["// Fork of https://github.com/sindresorhus/figures\nimport isUnicodeSupported from 'is-unicode-supported';\n\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","symbols","arrowRight","tick","info","warning","cross","squareSmallFilled","pointer","fallbackSymbols"],"mappings":"AAAA,kDAAkD;AAClD,OAAOA,wBAAwB,uBAAuB;AAEtD,MAAMC,UAAU;IACdC,YAAY;IACZC,MAAM;IACNC,MAAM;IACNC,SAAS;IACTC,OAAO;IACPC,mBAAmB;IACnBC,SAAS;AACX;AAEA,MAAMC,kBAAkB;IACtBP,YAAY;IACZC,MAAM;IACNC,MAAM;IACNC,SAAS;IACTC,OAAO;IACPC,mBAAmB;IACnBC,SAAS;AACX;AAEA,eAAeR,uBAAuBC,UAAUQ,gBAAgB"}
@@ -0,0 +1,16 @@
1
+ // https://stackoverflow.com/a/8809472/3150390
2
+ export default function uuid() {
3
+ let d = new Date().getTime();
4
+ let d2 = typeof performance !== 'undefined' && performance.now && performance.now() * 1000 || 0;
5
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c)=>{
6
+ let r = Math.random() * 16;
7
+ if (d > 0) {
8
+ r = (d + r) % 16 | 0;
9
+ d = Math.floor(d / 16);
10
+ } else {
11
+ r = (d2 + r) % 16 | 0;
12
+ d2 = Math.floor(d2 / 16);
13
+ }
14
+ return (c === 'x' ? r : r & 0x7 | 0x8).toString(16);
15
+ });
16
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-terminal/src/terminal/lib/uuid.ts"],"sourcesContent":["// https://stackoverflow.com/a/8809472/3150390\nexport default function uuid() {\n let d = new Date().getTime();\n let d2 = (typeof performance !== 'undefined' && performance.now && performance.now() * 1000) || 0;\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n let r = Math.random() * 16;\n if (d > 0) {\n r = ((d + r) % 16) | 0;\n d = Math.floor(d / 16);\n } else {\n r = ((d2 + r) % 16) | 0;\n d2 = Math.floor(d2 / 16);\n }\n return (c === 'x' ? r : (r & 0x7) | 0x8).toString(16);\n });\n}\n"],"names":["uuid","d","Date","getTime","d2","performance","now","replace","c","r","Math","random","floor","toString"],"mappings":"AAAA,8CAA8C;AAC9C,eAAe,SAASA;IACtB,IAAIC,IAAI,IAAIC,OAAOC,OAAO;IAC1B,IAAIC,KAAK,AAAC,OAAOC,gBAAgB,eAAeA,YAAYC,GAAG,IAAID,YAAYC,GAAG,KAAK,QAAS;IAChG,OAAO,uCAAuCC,OAAO,CAAC,SAAS,CAACC;QAC9D,IAAIC,IAAIC,KAAKC,MAAM,KAAK;QACxB,IAAIV,IAAI,GAAG;YACTQ,IAAI,AAAER,CAAAA,IAAIQ,CAAAA,IAAK,KAAM;YACrBR,IAAIS,KAAKE,KAAK,CAACX,IAAI;QACrB,OAAO;YACLQ,IAAI,AAAEL,CAAAA,KAAKK,CAAAA,IAAK,KAAM;YACtBL,KAAKM,KAAKE,KAAK,CAACR,KAAK;QACvB;QACA,OAAO,AAACI,CAAAA,MAAM,MAAMC,IAAI,AAACA,IAAI,MAAO,GAAE,EAAGI,QAAQ,CAAC;IACpD;AACF"}
@@ -0,0 +1,2 @@
1
+ // @ts-ignore
2
+ export { };
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-terminal/src/types.ts"],"sourcesContent":["// @ts-ignore\nexport type { SpawnOptions, SpawnCallback, SpawnResult } from 'cross-spawn-cb';\n\nexport type TerminalOptions = object;\n\nexport type State = 'running' | 'error' | 'success';\n\nexport type ChildProcess = {\n id: string;\n title: string;\n state: State;\n lines: string[];\n};\n"],"names":[],"mappings":"AAAA,aAAa;AAOb,WAKE"}
@@ -0,0 +1,85 @@
1
+ // @ts-ignore
2
+ import spawn, { crossSpawn } from 'cross-spawn-cb';
3
+ import eos from 'end-of-stream';
4
+ import Queue from 'queue-cb';
5
+ import addLines from './lib/addLines.mjs';
6
+ import concatWritable from './lib/concatWritable.mjs';
7
+ import createApp from './terminal/createApp.mjs';
8
+ const terminal = createApp();
9
+ import throttle from 'lodash.throttle';
10
+ const THROTTLE = 100;
11
+ const rerender = throttle(()=>{
12
+ terminal.rerender();
13
+ }, THROTTLE);
14
+ export default function spawnTerminal(command, args, spawnOptions, _options, callback) {
15
+ const { encoding, stdio, ...csOptions } = spawnOptions;
16
+ terminal.retain();
17
+ const item = terminal.addItem({
18
+ title: [
19
+ command
20
+ ].concat(args).join(' '),
21
+ state: 'running'
22
+ });
23
+ terminal.rerender();
24
+ const cp = crossSpawn(command, args, csOptions);
25
+ const outputs = {
26
+ stdout: null,
27
+ stderr: null
28
+ };
29
+ if (cp.stdout && process.stdout.getMaxListeners) {
30
+ process.stdout.setMaxListeners(process.stdout.getMaxListeners() + 1);
31
+ process.stderr.setMaxListeners(process.stderr.getMaxListeners() + 1);
32
+ }
33
+ const queue = new Queue();
34
+ if (cp.stdout) {
35
+ if (stdio === 'inherit') {
36
+ outputs.stdout = addLines((line)=>{
37
+ item.lines.push(line);
38
+ rerender();
39
+ });
40
+ queue.defer(eos.bind(null, cp.stdout.pipe(outputs.stdout)));
41
+ } else {
42
+ outputs.stdout = concatWritable((output)=>{
43
+ outputs.stdout.output = output.toString(encoding || 'utf8');
44
+ });
45
+ queue.defer(eos.bind(null, cp.stdout.pipe(outputs.stdout)));
46
+ }
47
+ }
48
+ if (cp.stderr) {
49
+ if (stdio === 'inherit') {
50
+ outputs.stderr = addLines((line)=>{
51
+ item.lines.push(line);
52
+ rerender();
53
+ });
54
+ cp.stderr.pipe(outputs.stderr);
55
+ queue.defer(eos.bind(null, cp.stderr.pipe(outputs.stderr)));
56
+ } else {
57
+ outputs.stderr = concatWritable((output)=>{
58
+ outputs.stderr.output = output.toString(encoding || 'utf8');
59
+ });
60
+ queue.defer(eos.bind(null, cp.stderr.pipe(outputs.stderr)));
61
+ }
62
+ }
63
+ queue.defer(spawn.worker.bind(null, cp, {
64
+ ...csOptions,
65
+ encoding: 'utf8'
66
+ }));
67
+ queue.await((err)=>{
68
+ if (cp.stdout && process.stdout.getMaxListeners) {
69
+ process.stdout.setMaxListeners(process.stdout.getMaxListeners() - 1);
70
+ process.stderr.setMaxListeners(process.stderr.getMaxListeners() - 1);
71
+ }
72
+ const res = err ? err : {};
73
+ res.stdout = outputs.stdout ? outputs.stdout.output : null;
74
+ res.stderr = outputs.stderr ? outputs.stderr.output : null;
75
+ res.output = [
76
+ res.stdout,
77
+ res.stderr,
78
+ null
79
+ ];
80
+ item.state = err ? 'error' : 'success';
81
+ terminal.rerender();
82
+ terminal.release();
83
+ err ? callback(err) : callback(null, res);
84
+ });
85
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/node/spawn-terminal/src/worker.ts"],"sourcesContent":["// @ts-ignore\nimport spawn, { crossSpawn, type SpawnResult } from 'cross-spawn-cb';\nimport eos from 'end-of-stream';\nimport Queue from 'queue-cb';\n\nimport addLines from './lib/addLines.js';\nimport concatWritable from './lib/concatWritable.js';\nimport createApp from './terminal/createApp.js';\n\nimport type { SpawnOptions, TerminalOptions } from './types.js';\n\nconst terminal = createApp();\n\nimport throttle from 'lodash.throttle';\nconst THROTTLE = 100;\nconst rerender = throttle(() => {\n terminal.rerender();\n}, THROTTLE);\n\nexport default function spawnTerminal(command: string, args: string[], spawnOptions: SpawnOptions, _options: TerminalOptions, callback) {\n const { encoding, stdio, ...csOptions } = spawnOptions;\n\n terminal.retain();\n const item = terminal.addItem({ title: [command].concat(args).join(' '), state: 'running' });\n terminal.rerender();\n\n const cp = crossSpawn(command, args, csOptions);\n const outputs = { stdout: null, stderr: null };\n\n if (cp.stdout && process.stdout.getMaxListeners) {\n process.stdout.setMaxListeners(process.stdout.getMaxListeners() + 1);\n process.stderr.setMaxListeners(process.stderr.getMaxListeners() + 1);\n }\n\n const queue = new Queue();\n if (cp.stdout) {\n if (stdio === 'inherit') {\n outputs.stdout = addLines((line) => {\n item.lines.push(line);\n rerender();\n });\n queue.defer(eos.bind(null, cp.stdout.pipe(outputs.stdout)));\n } else {\n outputs.stdout = concatWritable((output) => {\n outputs.stdout.output = output.toString(encoding || 'utf8');\n });\n queue.defer(eos.bind(null, cp.stdout.pipe(outputs.stdout)));\n }\n }\n if (cp.stderr) {\n if (stdio === 'inherit') {\n outputs.stderr = addLines((line) => {\n item.lines.push(line);\n rerender();\n });\n cp.stderr.pipe(outputs.stderr);\n queue.defer(eos.bind(null, cp.stderr.pipe(outputs.stderr)));\n } else {\n outputs.stderr = concatWritable((output) => {\n outputs.stderr.output = output.toString(encoding || 'utf8');\n });\n queue.defer(eos.bind(null, cp.stderr.pipe(outputs.stderr)));\n }\n }\n queue.defer(spawn.worker.bind(null, cp, { ...csOptions, encoding: 'utf8' }));\n queue.await((err) => {\n if (cp.stdout && process.stdout.getMaxListeners) {\n process.stdout.setMaxListeners(process.stdout.getMaxListeners() - 1);\n process.stderr.setMaxListeners(process.stderr.getMaxListeners() - 1);\n }\n\n const res = (err ? err : {}) as SpawnResult;\n res.stdout = outputs.stdout ? outputs.stdout.output : null;\n res.stderr = outputs.stderr ? outputs.stderr.output : null;\n res.output = [res.stdout, res.stderr, null];\n item.state = err ? 'error' : 'success';\n terminal.rerender();\n terminal.release();\n err ? callback(err) : callback(null, res);\n });\n}\n"],"names":["spawn","crossSpawn","eos","Queue","addLines","concatWritable","createApp","terminal","throttle","THROTTLE","rerender","spawnTerminal","command","args","spawnOptions","_options","callback","encoding","stdio","csOptions","retain","item","addItem","title","concat","join","state","cp","outputs","stdout","stderr","process","getMaxListeners","setMaxListeners","queue","line","lines","push","defer","bind","pipe","output","toString","worker","await","err","res","release"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { SpawnCallback, SpawnOptions, TerminalOptions } from './types.js';
2
+ export * from './types.js';
3
+ export default function spawnTerminal(command: string, args: string[], spawnOptions: SpawnOptions, options?: TerminalOptions | SpawnCallback, callback?: SpawnCallback): void | Promise<unknown>;
@@ -0,0 +1 @@
1
+ export default function addLines(addLine: any): any;
@@ -0,0 +1 @@
1
+ export default function concatWritable(callback: any): any;
@@ -0,0 +1,5 @@
1
+ import type { ChildProcess as ChildProcessT } from '../../types.js';
2
+ export interface AppProps {
3
+ list: ChildProcessT[];
4
+ }
5
+ export default function App({ list }: AppProps): any;
@@ -0,0 +1,9 @@
1
+ type State = 'running' | 'success' | 'error';
2
+ type ChildProcessProps = {
3
+ title: string;
4
+ state: State;
5
+ lines: string[];
6
+ isExpanded?: boolean;
7
+ };
8
+ export default function ChildProcess({ title, state, lines, isExpanded }: ChildProcessProps): any;
9
+ export {};
@@ -0,0 +1,7 @@
1
+ import type { ChildProcess } from '../types.js';
2
+ export default function createApp(): {
3
+ addItem(data: Partial<ChildProcess>): ChildProcess;
4
+ rerender(): void;
5
+ retain(): void;
6
+ release(): void;
7
+ };
@@ -0,0 +1,9 @@
1
+ import type { FC } from 'react';
2
+ export type Spinner = {
3
+ interval: number;
4
+ frames: string[];
5
+ };
6
+ declare const RenderSpinner: FC<{
7
+ spinner: Spinner;
8
+ }>;
9
+ export default RenderSpinner;
@@ -0,0 +1,10 @@
1
+ declare const _default: {
2
+ arrowRight: string;
3
+ tick: string;
4
+ info: string;
5
+ warning: string;
6
+ cross: string;
7
+ squareSmallFilled: string;
8
+ pointer: string;
9
+ };
10
+ export default _default;
@@ -0,0 +1 @@
1
+ export default function uuid(): string;
@@ -0,0 +1,9 @@
1
+ export type { SpawnOptions, SpawnCallback, SpawnResult } from 'cross-spawn-cb';
2
+ export type TerminalOptions = object;
3
+ export type State = 'running' | 'error' | 'success';
4
+ export type ChildProcess = {
5
+ id: string;
6
+ title: string;
7
+ state: State;
8
+ lines: string[];
9
+ };
@@ -0,0 +1,2 @@
1
+ import type { SpawnOptions, TerminalOptions } from './types.js';
2
+ export default function spawnTerminal(command: string, args: string[], spawnOptions: SpawnOptions, _options: TerminalOptions, callback: any): void;
package/package.json ADDED
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "spawn-term",
3
+ "version": "0.0.0",
4
+ "description": "Formats spawn with for terminal grouping",
5
+ "keywords": [
6
+ "spawn",
7
+ "cross-spawn",
8
+ "cross-spawn-cb",
9
+ "streaming",
10
+ "format",
11
+ "terminal",
12
+ "groups",
13
+ "grouping",
14
+ "group"
15
+ ],
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+ssh://git@github.com/kmalakoff/spawn-term.git"
19
+ },
20
+ "license": "MIT",
21
+ "type": "module",
22
+ "exports": {
23
+ "import": "./dist/esm/index.mjs",
24
+ "types": "./dist/types/index.d.ts"
25
+ },
26
+ "module": "dist/esm/index.mjs",
27
+ "types": "dist/types/index.d.ts",
28
+ "files": [
29
+ "dist"
30
+ ],
31
+ "scripts": {
32
+ "build": "tsds build",
33
+ "format": "biome check --write --unsafe src/ test/",
34
+ "test": "tsds test:node --no-timeouts",
35
+ "test:engines": "nvu engines npm test",
36
+ "version": "tsds version"
37
+ },
38
+ "dependencies": {
39
+ "cross-spawn-cb": "^2.1.8",
40
+ "end-of-stream": "^1.4.4",
41
+ "ink": "^5.1.0",
42
+ "is-unicode-supported": "^2.1.0",
43
+ "lodash.throttle": "^4.1.1",
44
+ "queue-cb": "^1.4.13",
45
+ "react": "^18.3.1",
46
+ "readable-stream": "^2.3.8"
47
+ },
48
+ "devDependencies": {
49
+ "@types/mocha": "*",
50
+ "@types/node": "*",
51
+ "@types/react": "*",
52
+ "cr": "*",
53
+ "is-version": "*",
54
+ "pinkie-promise": "*"
55
+ },
56
+ "engines": {
57
+ "node": ">=16"
58
+ },
59
+ "tsds": {
60
+ "source": "src/index.ts",
61
+ "targets": [
62
+ "esm"
63
+ ]
64
+ }
65
+ }