@tabbio-technologies/cli 1.2.8
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.
- package/README.md +763 -0
- package/dist/chunks/chunk-7LNC3FIV.js +2019 -0
- package/dist/chunks/chunk-7LNC3FIV.js.map +7 -0
- package/dist/chunks/chunk-NAWA6NCZ.js +259 -0
- package/dist/chunks/chunk-NAWA6NCZ.js.map +7 -0
- package/dist/chunks/chunk-NK5RPNSV.js +15 -0
- package/dist/chunks/chunk-NK5RPNSV.js.map +7 -0
- package/dist/chunks/chunk-QVR5KIEQ.js +1976 -0
- package/dist/chunks/chunk-QVR5KIEQ.js.map +7 -0
- package/dist/chunks/chunk-VHHZFMIF.js +162 -0
- package/dist/chunks/chunk-VHHZFMIF.js.map +7 -0
- package/dist/chunks/chunk-Y6GWIFHI.js +227 -0
- package/dist/chunks/chunk-Y6GWIFHI.js.map +7 -0
- package/dist/chunks/entry-WENOOT6W.js +3492 -0
- package/dist/chunks/entry-WENOOT6W.js.map +7 -0
- package/dist/chunks/mount-NGUARMCL.js +79 -0
- package/dist/chunks/mount-NGUARMCL.js.map +7 -0
- package/dist/chunks/program-O2BA5L6Z.js +2755 -0
- package/dist/chunks/program-O2BA5L6Z.js.map +7 -0
- package/dist/chunks/status-I5UAQPBY.js +16 -0
- package/dist/chunks/status-I5UAQPBY.js.map +7 -0
- package/dist/cli.js +66 -0
- package/dist/cli.js.map +7 -0
- package/package.json +65 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { createRequire as __tabbioCreateRequire } from 'node:module';
|
|
2
|
+
const require = __tabbioCreateRequire(import.meta.url);
|
|
3
|
+
import {
|
|
4
|
+
Page,
|
|
5
|
+
SpinnerProvider,
|
|
6
|
+
contentWidth,
|
|
7
|
+
useTerminalSize
|
|
8
|
+
} from "./chunk-NAWA6NCZ.js";
|
|
9
|
+
import "./chunk-VHHZFMIF.js";
|
|
10
|
+
|
|
11
|
+
// src/ui/mount.tsx
|
|
12
|
+
import { render, useApp, useInput } from "ink";
|
|
13
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
14
|
+
import { jsx } from "react/jsx-runtime";
|
|
15
|
+
function Root(props) {
|
|
16
|
+
const { exit } = useApp();
|
|
17
|
+
const { columns, rows } = useTerminalSize();
|
|
18
|
+
const [closing, setClosing] = useState(null);
|
|
19
|
+
const settled = useRef(false);
|
|
20
|
+
const { onResult } = props;
|
|
21
|
+
const finish = useCallback(
|
|
22
|
+
(value, finalFrame) => {
|
|
23
|
+
if (settled.current) return;
|
|
24
|
+
settled.current = true;
|
|
25
|
+
onResult({ status: "done", value });
|
|
26
|
+
setClosing({ node: finalFrame ?? null });
|
|
27
|
+
},
|
|
28
|
+
[onResult]
|
|
29
|
+
);
|
|
30
|
+
useInput(
|
|
31
|
+
(input, key) => {
|
|
32
|
+
if (!(key.ctrl && input === "c") || settled.current) return;
|
|
33
|
+
settled.current = true;
|
|
34
|
+
onResult({ status: "interrupted" });
|
|
35
|
+
setClosing({ node: null });
|
|
36
|
+
},
|
|
37
|
+
{ isActive: props.interruptible && !closing }
|
|
38
|
+
);
|
|
39
|
+
useEffect(() => {
|
|
40
|
+
if (closing) exit();
|
|
41
|
+
}, [closing, exit]);
|
|
42
|
+
if (closing) return /* @__PURE__ */ jsx(Page, { columns, children: closing.node });
|
|
43
|
+
return /* @__PURE__ */ jsx(SpinnerProvider, { children: /* @__PURE__ */ jsx(Page, { columns, children: props.build({ finish, width: contentWidth(columns), height: Math.max(8, rows - 1) }) }) });
|
|
44
|
+
}
|
|
45
|
+
async function mountScreen(build, opts = {}) {
|
|
46
|
+
let outcome = { status: "interrupted" };
|
|
47
|
+
const stdout = opts.stdout ?? process.stdout;
|
|
48
|
+
if (stdout.isTTY && !stdout.rows) stdout.rows = 24;
|
|
49
|
+
if (stdout.isTTY && !stdout.columns) stdout.columns = 80;
|
|
50
|
+
const instance = render(
|
|
51
|
+
/* @__PURE__ */ jsx(
|
|
52
|
+
Root,
|
|
53
|
+
{
|
|
54
|
+
build,
|
|
55
|
+
interruptible: (opts.ctrlC ?? "interrupt") === "interrupt",
|
|
56
|
+
onResult: (value) => {
|
|
57
|
+
outcome = value;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
),
|
|
61
|
+
{
|
|
62
|
+
stdout,
|
|
63
|
+
stdin: opts.stdin ?? process.stdin,
|
|
64
|
+
stderr: opts.stderr ?? process.stderr,
|
|
65
|
+
exitOnCtrlC: false,
|
|
66
|
+
patchConsole: true
|
|
67
|
+
}
|
|
68
|
+
);
|
|
69
|
+
try {
|
|
70
|
+
await instance.waitUntilExit();
|
|
71
|
+
} finally {
|
|
72
|
+
instance.cleanup();
|
|
73
|
+
}
|
|
74
|
+
return outcome;
|
|
75
|
+
}
|
|
76
|
+
export {
|
|
77
|
+
mountScreen
|
|
78
|
+
};
|
|
79
|
+
//# sourceMappingURL=mount-NGUARMCL.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/ui/mount.tsx"],
|
|
4
|
+
"sourcesContent": ["import { render, useApp, useInput } from 'ink';\nimport { type ReactElement, type ReactNode, useCallback, useEffect, useRef, useState } from 'react';\nimport { SpinnerProvider } from './components/Spinner';\nimport { Page, contentWidth, useTerminalSize } from './layout';\n\nexport type MountOutcome<T> = { status: 'done'; value: T } | { status: 'interrupted' };\n\nexport type ScreenControls<T> = {\n /**\n * Resolve the screen. `finalFrame` is rendered once as the last frame and\n * stays in the scrollback (e.g. the collapsed approval row); omit it to\n * erase the screen.\n */\n finish(value: T, finalFrame?: ReactNode): void;\n /** Content width inside the page gutter, and rows the live region may use. */\n width: number;\n height: number;\n};\n\nexport type MountOptions = {\n /**\n * `interrupt` (default): Ctrl+C resolves `{ status: 'interrupted' }`.\n * `screen`: the screen handles Ctrl+C itself (chat and home: press twice).\n */\n ctrlC?: 'interrupt' | 'screen';\n stdout?: NodeJS.WriteStream;\n stdin?: NodeJS.ReadStream;\n stderr?: NodeJS.WriteStream;\n};\n\ntype Closing = { node: ReactNode } | null;\n\nfunction Root<T>(props: {\n build(controls: ScreenControls<T>): ReactElement;\n onResult(outcome: MountOutcome<T>): void;\n interruptible: boolean;\n}) {\n const { exit } = useApp();\n const { columns, rows } = useTerminalSize();\n const [closing, setClosing] = useState<Closing>(null);\n const settled = useRef(false);\n const { onResult } = props;\n\n const finish = useCallback(\n (value: T, finalFrame?: ReactNode) => {\n if (settled.current) return;\n settled.current = true;\n onResult({ status: 'done', value });\n setClosing({ node: finalFrame ?? null });\n },\n [onResult],\n );\n\n useInput(\n (input, key) => {\n if (!(key.ctrl && input === 'c') || settled.current) return;\n settled.current = true;\n onResult({ status: 'interrupted' });\n setClosing({ node: null });\n },\n { isActive: props.interruptible && !closing },\n );\n\n // Exit only after the final frame has been committed, so it is what stays on screen.\n useEffect(() => {\n if (closing) exit();\n }, [closing, exit]);\n\n if (closing) return <Page columns={columns}>{closing.node}</Page>;\n return (\n <SpinnerProvider>\n <Page columns={columns}>{props.build({ finish, width: contentWidth(columns), height: Math.max(8, rows - 1) })}</Page>\n </SpinnerProvider>\n );\n}\n\n/**\n * Renders a screen with Ink, waits for it to resolve, and unmounts cleanly\n * (raw mode off, cursor restored, listeners and timers gone). Never uses the\n * alternate screen: finished output stays in the normal scrollback.\n */\nexport async function mountScreen<T>(build: (controls: ScreenControls<T>) => ReactElement, opts: MountOptions = {}): Promise<MountOutcome<T>> {\n let outcome: MountOutcome<T> = { status: 'interrupted' };\n const stdout = opts.stdout ?? process.stdout;\n // A pty without a size (e.g. `script` fed from a pipe) reports 0 rows, and\n // Ink 6 then clears the whole terminal on every frame. Assume a classic size.\n if (stdout.isTTY && !stdout.rows) stdout.rows = 24;\n if (stdout.isTTY && !stdout.columns) stdout.columns = 80;\n const instance = render(\n <Root<T>\n build={build}\n interruptible={(opts.ctrlC ?? 'interrupt') === 'interrupt'}\n onResult={(value) => {\n outcome = value;\n }}\n />,\n {\n stdout,\n stdin: opts.stdin ?? process.stdin,\n stderr: opts.stderr ?? process.stderr,\n exitOnCtrlC: false,\n patchConsole: true,\n },\n );\n try {\n await instance.waitUntilExit();\n } finally {\n instance.cleanup();\n }\n return outcome;\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;AAAA,SAAS,QAAQ,QAAQ,gBAAgB;AACzC,SAA4C,aAAa,WAAW,QAAQ,gBAAgB;AAmEtE;AApCtB,SAAS,KAAQ,OAId;AACD,QAAM,EAAE,KAAK,IAAI,OAAO;AACxB,QAAM,EAAE,SAAS,KAAK,IAAI,gBAAgB;AAC1C,QAAM,CAAC,SAAS,UAAU,IAAI,SAAkB,IAAI;AACpD,QAAM,UAAU,OAAO,KAAK;AAC5B,QAAM,EAAE,SAAS,IAAI;AAErB,QAAM,SAAS;AAAA,IACb,CAAC,OAAU,eAA2B;AACpC,UAAI,QAAQ,QAAS;AACrB,cAAQ,UAAU;AAClB,eAAS,EAAE,QAAQ,QAAQ,MAAM,CAAC;AAClC,iBAAW,EAAE,MAAM,cAAc,KAAK,CAAC;AAAA,IACzC;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA;AAAA,IACE,CAAC,OAAO,QAAQ;AACd,UAAI,EAAE,IAAI,QAAQ,UAAU,QAAQ,QAAQ,QAAS;AACrD,cAAQ,UAAU;AAClB,eAAS,EAAE,QAAQ,cAAc,CAAC;AAClC,iBAAW,EAAE,MAAM,KAAK,CAAC;AAAA,IAC3B;AAAA,IACA,EAAE,UAAU,MAAM,iBAAiB,CAAC,QAAQ;AAAA,EAC9C;AAGA,YAAU,MAAM;AACd,QAAI,QAAS,MAAK;AAAA,EACpB,GAAG,CAAC,SAAS,IAAI,CAAC;AAElB,MAAI,QAAS,QAAO,oBAAC,QAAK,SAAmB,kBAAQ,MAAK;AAC1D,SACE,oBAAC,mBACC,8BAAC,QAAK,SAAmB,gBAAM,MAAM,EAAE,QAAQ,OAAO,aAAa,OAAO,GAAG,QAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,GAAE,GAChH;AAEJ;AAOA,eAAsB,YAAe,OAAsD,OAAqB,CAAC,GAA6B;AAC5I,MAAI,UAA2B,EAAE,QAAQ,cAAc;AACvD,QAAM,SAAS,KAAK,UAAU,QAAQ;AAGtC,MAAI,OAAO,SAAS,CAAC,OAAO,KAAM,QAAO,OAAO;AAChD,MAAI,OAAO,SAAS,CAAC,OAAO,QAAS,QAAO,UAAU;AACtD,QAAM,WAAW;AAAA,IACf;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,gBAAgB,KAAK,SAAS,iBAAiB;AAAA,QAC/C,UAAU,CAAC,UAAU;AACnB,oBAAU;AAAA,QACZ;AAAA;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA,OAAO,KAAK,SAAS,QAAQ;AAAA,MAC7B,QAAQ,KAAK,UAAU,QAAQ;AAAA,MAC/B,aAAa;AAAA,MACb,cAAc;AAAA,IAChB;AAAA,EACF;AACA,MAAI;AACF,UAAM,SAAS,cAAc;AAAA,EAC/B,UAAE;AACA,aAAS,QAAQ;AAAA,EACnB;AACA,SAAO;AACT;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|