summaryrefslogtreecommitdiffhomepage
path: root/packages/app/src/addons
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-02-06 10:02:31 -0600
committerGitHub <[email protected]>2026-02-06 10:02:31 -0600
commit2c58dd6203df7806f57ef6b29672091cb764e871 (patch)
tree10fca96d3098465b497f78e29de8d0a585c4dac3 /packages/app/src/addons
parenta4bc883595df9ea0f752079519081bc602408553 (diff)
downloadopencode-2c58dd6203df7806f57ef6b29672091cb764e871.tar.gz
opencode-2c58dd6203df7806f57ef6b29672091cb764e871.zip
chore: refactoring and tests, splitting up files (#12495)
Diffstat (limited to 'packages/app/src/addons')
-rw-r--r--packages/app/src/addons/serialize.test.ts2
-rw-r--r--packages/app/src/addons/serialize.ts43
2 files changed, 38 insertions, 7 deletions
diff --git a/packages/app/src/addons/serialize.test.ts b/packages/app/src/addons/serialize.test.ts
index 7fb1a61f3..7f6780557 100644
--- a/packages/app/src/addons/serialize.test.ts
+++ b/packages/app/src/addons/serialize.test.ts
@@ -36,7 +36,7 @@ function writeAndWait(term: Terminal, data: string): Promise<void> {
})
}
-describe.skip("SerializeAddon", () => {
+describe("SerializeAddon", () => {
describe("ANSI color preservation", () => {
test("should preserve text attributes (bold, italic, underline)", async () => {
const { term, addon } = createTerminal()
diff --git a/packages/app/src/addons/serialize.ts b/packages/app/src/addons/serialize.ts
index 3f0a8fb0a..4cab55b3f 100644
--- a/packages/app/src/addons/serialize.ts
+++ b/packages/app/src/addons/serialize.ts
@@ -56,6 +56,39 @@ interface IBufferCell {
isDim(): boolean
}
+type TerminalBuffers = {
+ active?: IBuffer
+ normal?: IBuffer
+ alternate?: IBuffer
+}
+
+const isRecord = (value: unknown): value is Record<string, unknown> => {
+ return typeof value === "object" && value !== null
+}
+
+const isBuffer = (value: unknown): value is IBuffer => {
+ if (!isRecord(value)) return false
+ if (typeof value.length !== "number") return false
+ if (typeof value.cursorX !== "number") return false
+ if (typeof value.cursorY !== "number") return false
+ if (typeof value.baseY !== "number") return false
+ if (typeof value.viewportY !== "number") return false
+ if (typeof value.getLine !== "function") return false
+ if (typeof value.getNullCell !== "function") return false
+ return true
+}
+
+const getTerminalBuffers = (value: ITerminalCore): TerminalBuffers | undefined => {
+ if (!isRecord(value)) return
+ const raw = value.buffer
+ if (!isRecord(raw)) return
+ const active = isBuffer(raw.active) ? raw.active : undefined
+ const normal = isBuffer(raw.normal) ? raw.normal : undefined
+ const alternate = isBuffer(raw.alternate) ? raw.alternate : undefined
+ if (!active && !normal) return
+ return { active, normal, alternate }
+}
+
// ============================================================================
// Types
// ============================================================================
@@ -498,14 +531,13 @@ export class SerializeAddon implements ITerminalAddon {
throw new Error("Cannot use addon until it has been loaded")
}
- const terminal = this._terminal as any
- const buffer = terminal.buffer
+ const buffer = getTerminalBuffers(this._terminal)
if (!buffer) {
return ""
}
- const normalBuffer = buffer.normal || buffer.active
+ const normalBuffer = buffer.normal ?? buffer.active
const altBuffer = buffer.alternate
if (!normalBuffer) {
@@ -533,14 +565,13 @@ export class SerializeAddon implements ITerminalAddon {
throw new Error("Cannot use addon until it has been loaded")
}
- const terminal = this._terminal as any
- const buffer = terminal.buffer
+ const buffer = getTerminalBuffers(this._terminal)
if (!buffer) {
return ""
}
- const activeBuffer = buffer.active || buffer.normal
+ const activeBuffer = buffer.active ?? buffer.normal
if (!activeBuffer) {
return ""
}