@pokit/tabs-ink 0.0.21 → 0.0.23

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.
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAwB,QAAQ,EAAE,MAAM,aAAa,CAAC;AAK/E;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,WAAW,CA+G/C;AAMD,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,QAAQ,EACb,OAAO,GAAE,mBAAwB,GAChC;IAAE,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,CA2EzB"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAwB,QAAQ,EAAE,MAAM,aAAa,CAAC;AAK/E;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,WAAW,CAoH/C;AAMD,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,QAAQ,EACb,OAAO,GAAE,mBAAwB,GAChC;IAAE,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,CAgFzB"}
package/dist/adapter.js CHANGED
@@ -49,6 +49,7 @@ export function createTabsAdapter() {
49
49
  return;
50
50
  resolved = true;
51
51
  // Remove signal handlers
52
+ process.removeListener('SIGINT', handleSignal);
52
53
  process.removeListener('SIGTERM', handleSignal);
53
54
  process.removeListener('SIGQUIT', handleSignal);
54
55
  process.removeListener('uncaughtException', handleUncaughtException);
@@ -75,6 +76,7 @@ export function createTabsAdapter() {
75
76
  process.exit(1);
76
77
  };
77
78
  // Register signal handlers
79
+ process.on('SIGINT', handleSignal);
78
80
  process.on('SIGTERM', handleSignal);
79
81
  process.on('SIGQUIT', handleSignal);
80
82
  process.on('uncaughtException', handleUncaughtException);
@@ -82,8 +84,11 @@ export function createTabsAdapter() {
82
84
  const handleFatalError = () => {
83
85
  cleanup();
84
86
  };
85
- const result = render(_jsx(TabsErrorBoundary, { onFatalError: handleFatalError, children: _jsx(TabsApp, { items: items, options: options, onExit: () => {
87
+ const result = render(_jsx(TabsErrorBoundary, { onFatalError: handleFatalError, children: _jsx(TabsApp, { items: items, options: options, onExit: (code) => {
86
88
  cleanup();
89
+ if (code === 130) {
90
+ process.exit(130);
91
+ }
87
92
  } }) }), {
88
93
  exitOnCtrlC: false, // We handle quit ourselves
89
94
  incrementalRendering: true, // Only update changed lines to reduce flicker
@@ -123,6 +128,7 @@ export function createEventAdapter(bus, options = {}) {
123
128
  return;
124
129
  isCleanedUp = true;
125
130
  // Remove signal handlers
131
+ process.removeListener('SIGINT', handleSignal);
126
132
  process.removeListener('SIGTERM', handleSignal);
127
133
  process.removeListener('SIGQUIT', handleSignal);
128
134
  process.removeListener('uncaughtException', handleUncaughtException);
@@ -148,12 +154,16 @@ export function createEventAdapter(bus, options = {}) {
148
154
  process.exit(1);
149
155
  };
150
156
  // Register signal handlers
157
+ process.on('SIGINT', handleSignal);
151
158
  process.on('SIGTERM', handleSignal);
152
159
  process.on('SIGQUIT', handleSignal);
153
160
  process.on('uncaughtException', handleUncaughtException);
154
161
  const handleExit = (code) => {
155
162
  cleanup();
156
163
  options.onExit?.(code);
164
+ if (code === 130) {
165
+ process.exit(130);
166
+ }
157
167
  };
158
168
  // Handle fatal errors from error boundary
159
169
  const handleFatalError = () => {
@@ -3,7 +3,7 @@ type TabbedViewProps = {
3
3
  tabs: TabProcess[];
4
4
  activeIndex: number;
5
5
  onActiveIndexChange: (index: number) => void;
6
- onQuit: () => void;
6
+ onQuit: (reason: 'user' | 'interrupt') => void;
7
7
  onQuitRequest: () => void;
8
8
  onRestart: (index: number) => void;
9
9
  onKill: (index: number) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"tabbed-view.d.ts","sourceRoot":"","sources":["../src/tabbed-view.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAWnD,KAAK,eAAe,GAAG;IACrB,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB,CAAC;AAyMF,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,WAAW,EACX,mBAAmB,EACnB,MAAM,EACN,aAAa,EACb,SAAS,EACT,MAAM,EACN,kBAAkB,EAClB,SAAS,EACT,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,WAAW,EACX,YAAY,EACZ,WAAW,GACZ,EAAE,eAAe,2CAqGjB"}
1
+ {"version":3,"file":"tabbed-view.d.ts","sourceRoot":"","sources":["../src/tabbed-view.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAWnD,KAAK,eAAe,GAAG;IACrB,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,KAAK,IAAI,CAAC;IAC/C,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB,CAAC;AAyMF,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,WAAW,EACX,mBAAmB,EACnB,MAAM,EACN,aAAa,EACb,SAAS,EACT,MAAM,EACN,kBAAkB,EAClB,SAAS,EACT,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,WAAW,EACX,YAAY,EACZ,WAAW,GACZ,EAAE,eAAe,2CAqGjB"}
@@ -1 +1 @@
1
- {"version":3,"file":"tabs-app.d.ts","sourceRoot":"","sources":["../src/tabs-app.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAIxD,KAAK,YAAY,GAAG;IAClB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC,CAAC;AAOF,wBAAgB,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,YAAY,2CA+R/D"}
1
+ {"version":3,"file":"tabs-app.d.ts","sourceRoot":"","sources":["../src/tabs-app.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAIxD,KAAK,YAAY,GAAG;IAClB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC,CAAC;AAOF,wBAAgB,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,YAAY,2CAkS/D"}
package/dist/tabs-app.js CHANGED
@@ -200,9 +200,9 @@ export function TabsApp({ items, options, onExit }) {
200
200
  const handleQuitRequest = useCallback(() => {
201
201
  setQuitConfirmPending((prev) => !prev);
202
202
  }, []);
203
- const handleQuit = useCallback(() => {
203
+ const handleQuit = useCallback((reason) => {
204
204
  killAll();
205
- onExit(0);
205
+ onExit(reason === 'interrupt' ? 130 : 0);
206
206
  }, [killAll, onExit]);
207
207
  const handleEnterFocusMode = useCallback(() => {
208
208
  const proc = processesRef.current[activeIndex];
package/dist/types.d.ts CHANGED
@@ -20,7 +20,7 @@ export type TabProcess = BaseTabProcess & {
20
20
  */
21
21
  export type TabbedViewProps = {
22
22
  tabs: TabProcess[];
23
- onQuit: () => void;
23
+ onQuit: (reason: 'user' | 'interrupt') => void;
24
24
  onQuitRequest: () => void;
25
25
  quitConfirmPending: boolean;
26
26
  };
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAMrE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAE7F,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAMpD;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG;IACxC,4DAA4D;IAC5D,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,kBAAkB,EAAE,OAAO,CAAC;CAC7B,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAMrE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAE7F,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAMpD;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG;IACxC,4DAA4D;IAC5D,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,KAAK,IAAI,CAAC;IAC/C,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,kBAAkB,EAAE,OAAO,CAAC;CAC7B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pokit/tabs-ink",
3
- "version": "0.0.21",
3
+ "version": "0.0.23",
4
4
  "description": "Ink-based tab renderer for pok CLI applications",
5
5
  "keywords": [
6
6
  "cli",
@@ -51,12 +51,12 @@
51
51
  "devDependencies": {
52
52
  "@types/bun": "latest",
53
53
  "@types/react": "^19.2.0",
54
- "@pokit/core": "0.0.21",
55
- "@pokit/tabs-core": "0.0.21"
54
+ "@pokit/core": "0.0.23",
55
+ "@pokit/tabs-core": "0.0.23"
56
56
  },
57
57
  "peerDependencies": {
58
- "@pokit/core": "0.0.21",
59
- "@pokit/tabs-core": "0.0.21"
58
+ "@pokit/core": "0.0.23",
59
+ "@pokit/tabs-core": "0.0.23"
60
60
  },
61
61
  "engines": {
62
62
  "bun": ">=1.0.0"
package/src/adapter.tsx CHANGED
@@ -57,6 +57,7 @@ export function createTabsAdapter(): TabsAdapter {
57
57
  resolved = true;
58
58
 
59
59
  // Remove signal handlers
60
+ process.removeListener('SIGINT', handleSignal);
60
61
  process.removeListener('SIGTERM', handleSignal);
61
62
  process.removeListener('SIGQUIT', handleSignal);
62
63
  process.removeListener('uncaughtException', handleUncaughtException);
@@ -87,6 +88,7 @@ export function createTabsAdapter(): TabsAdapter {
87
88
  };
88
89
 
89
90
  // Register signal handlers
91
+ process.on('SIGINT', handleSignal);
90
92
  process.on('SIGTERM', handleSignal);
91
93
  process.on('SIGQUIT', handleSignal);
92
94
  process.on('uncaughtException', handleUncaughtException);
@@ -101,8 +103,11 @@ export function createTabsAdapter(): TabsAdapter {
101
103
  <TabsApp
102
104
  items={items}
103
105
  options={options}
104
- onExit={() => {
106
+ onExit={(code) => {
105
107
  cleanup();
108
+ if (code === 130) {
109
+ process.exit(130);
110
+ }
106
111
  }}
107
112
  />
108
113
  </TabsErrorBoundary>,
@@ -164,6 +169,7 @@ export function createEventAdapter(
164
169
  isCleanedUp = true;
165
170
 
166
171
  // Remove signal handlers
172
+ process.removeListener('SIGINT', handleSignal);
167
173
  process.removeListener('SIGTERM', handleSignal);
168
174
  process.removeListener('SIGQUIT', handleSignal);
169
175
  process.removeListener('uncaughtException', handleUncaughtException);
@@ -193,6 +199,7 @@ export function createEventAdapter(
193
199
  };
194
200
 
195
201
  // Register signal handlers
202
+ process.on('SIGINT', handleSignal);
196
203
  process.on('SIGTERM', handleSignal);
197
204
  process.on('SIGQUIT', handleSignal);
198
205
  process.on('uncaughtException', handleUncaughtException);
@@ -200,6 +207,9 @@ export function createEventAdapter(
200
207
  const handleExit = (code: number) => {
201
208
  cleanup();
202
209
  options.onExit?.(code);
210
+ if (code === 130) {
211
+ process.exit(130);
212
+ }
203
213
  };
204
214
 
205
215
  // Handle fatal errors from error boundary
@@ -14,7 +14,7 @@ type TabbedViewProps = {
14
14
  tabs: TabProcess[];
15
15
  activeIndex: number;
16
16
  onActiveIndexChange: (index: number) => void;
17
- onQuit: () => void;
17
+ onQuit: (reason: 'user' | 'interrupt') => void;
18
18
  onQuitRequest: () => void;
19
19
  onRestart: (index: number) => void;
20
20
  onKill: (index: number) => void;
package/src/tabs-app.tsx CHANGED
@@ -251,10 +251,13 @@ export function TabsApp({ items, options, onExit }: TabsAppProps) {
251
251
  setQuitConfirmPending((prev) => !prev);
252
252
  }, []);
253
253
 
254
- const handleQuit = useCallback(() => {
255
- killAll();
256
- onExit(0);
257
- }, [killAll, onExit]);
254
+ const handleQuit = useCallback(
255
+ (reason: 'user' | 'interrupt') => {
256
+ killAll();
257
+ onExit(reason === 'interrupt' ? 130 : 0);
258
+ },
259
+ [killAll, onExit]
260
+ );
258
261
 
259
262
  const handleEnterFocusMode = useCallback(() => {
260
263
  const proc = processesRef.current[activeIndex];
package/src/types.ts CHANGED
@@ -33,7 +33,7 @@ export type TabProcess = BaseTabProcess & {
33
33
  */
34
34
  export type TabbedViewProps = {
35
35
  tabs: TabProcess[];
36
- onQuit: () => void;
36
+ onQuit: (reason: 'user' | 'interrupt') => void;
37
37
  onQuitRequest: () => void;
38
38
  quitConfirmPending: boolean;
39
39
  };