Files
vue-tui/packages/runtime-tests/integration/pty/fixtures/use-paste.tsx
T
Yunfei He bfd680490f refactor(runtime)!: rename useAppContext() to useApp() (full Ink alignment) (#73)
#69 added `useAppContext()` as a Vue-native rename of Ink's `useApp()`,
qualified to avoid reading as the Vue application instance. On reflection the
"Context" suffix borrowed the name of an internal grab-bag context and slightly
mislabels the hook — it returns app lifecycle controls, not that context. The
collision worry doesn't hold up: Vue has no `useApp()`, the returned
`{ exit, waitUntilRenderFlush }` is clearly not the Vue app instance, and "App"
in vue-tui already means the `TuiApp` from `createApp()`.

Rename to `useApp()` for full Ink fidelity (same name + same shape), and drop
the now-defunct "App composable" entry from ink-divergences.md — it ceases to
be a divergence.

Internal context cleanup (the grab-bag `AppContext` + the `StdinContext`
duplication) is intentionally out of scope here, tracked separately.

BREAKING CHANGE: `useAppContext()` is renamed to `useApp()`. Replace
`const { exit } = useAppContext()` with `const { exit } = useApp()`.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-30 23:32:22 +08:00

71 lines
1.5 KiB
TypeScript

import process from "node:process";
import { createApp, useApp, useInput, usePaste } from "@vue-tui/runtime";
import { defineComponent, onMounted } from "vue";
const PasteDemo = defineComponent({
props: {
test: { type: String, default: undefined },
},
setup(props) {
const { exit } = useApp();
usePaste((text) => {
if (props.test === "basic" && text === "hello world") {
exit();
return;
}
if (props.test === "escapeSequences" && text === "helloworld") {
exit();
return;
}
if (props.test === "noUseInput" && text === "hello") {
exit();
}
});
useInput(
(input) => {
throw new Error(`useInput received input during paste: ${JSON.stringify(input)}`);
},
{ isActive: props.test === "noUseInput" },
);
onMounted(() => {
process.stdout.write("__READY__");
});
return () => null;
},
});
const MultipleHooksDemo = defineComponent(() => {
const { exit } = useApp();
let receivedCount = 0;
const onPaste = (text: string) => {
if (text === "hello") {
receivedCount++;
if (receivedCount >= 2) {
exit();
}
}
};
usePaste(onPaste);
usePaste(onPaste);
onMounted(() => {
process.stdout.write("__READY__");
});
return () => null;
});
const test = process.argv[2];
const app = createApp(test === "multipleHooks" ? MultipleHooksDemo : PasteDemo, { test });
app.mount();
await app.waitUntilExit();
console.log("exited");