diff --git a/bun.lock b/bun.lock index 00dc95b..4c47ed7 100644 --- a/bun.lock +++ b/bun.lock @@ -10,7 +10,9 @@ "zod": "^3.23.8", }, "devDependencies": { + "@types/bun": "^1.3.13", "@types/figlet": "^1.7.0", + "@types/node": "^25.7.0", "@types/react": "^19.2.14", "figlet": "^1.11.0", }, @@ -33,14 +35,20 @@ "@opentui/react": ["@opentui/react@0.2.6", "", { "dependencies": { "@opentui/core": "0.2.6", "react-reconciler": "^0.33.0" }, "peerDependencies": { "react": ">=19.2.0", "react-devtools-core": "^7.0.1", "ws": "^8.18.0" } }, "sha512-pZfgKVZ0G46jS/KyHvfUB/jDGDuuhfLgDG8ue0qQ6/2jm0e2JqNoLjdkHsN5MzVJhjnTyWLsjVYc3nSAamC12Q=="], + "@types/bun": ["@types/bun@1.3.13", "", { "dependencies": { "bun-types": "1.3.13" } }, "sha512-9fqXWk5YIHGGnUau9TEi+qdlTYDAnOj+xLCmSTwXfAIqXr2x4tytJb43E9uCvt09zJURKXwAtkoH4nLQfzeTXw=="], + "@types/figlet": ["@types/figlet@1.7.0", "", {}, "sha512-KwrT7p/8Eo3Op/HBSIwGXOsTZKYiM9NpWRBJ5sVjWP/SmlS+oxxRvJht/FNAtliJvja44N3ul1yATgohnVBV0Q=="], + "@types/node": ["@types/node@25.7.0", "", { "dependencies": { "undici-types": "~7.21.0" } }, "sha512-z+pdZyxE+RTQE9AcboAZCb4otwcrvgHD+GlBpPgn0emDVt0ohrTMhAwlr2Wd9nZ+nihhYFxO2pThz3C5qSu2Eg=="], + "@types/react": ["@types/react@19.2.14", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w=="], "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], "bun-ffi-structs": ["bun-ffi-structs@0.2.2", "", { "peerDependencies": { "typescript": "^5" } }, "sha512-N/ZWtyN0piZlrXQT7TO0V+q952orYqkfhXRXM1Hcbb+R3QSiBH4vLnib187Mrs1H7pWIYECAmPeapGYDOMCl+w=="], + "bun-types": ["bun-types@1.3.13", "", { "dependencies": { "@types/node": "*" } }, "sha512-QXKeHLlOLqQX9LgYaHJfzdBaV21T63HhFJnvuRCcjZiaUDpbs5ED1MgxbMra71CsryN/1dAoXuJJJwIv/2drVA=="], + "commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="], "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], @@ -71,6 +79,8 @@ "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + "undici-types": ["undici-types@7.21.0", "", {}, "sha512-w9IMgQrz4O0YN1LtB7K5P63vhlIOvC7opSmouCJ+ZywlPAlO9gIkJ+otk6LvGpAs2wg4econaCz3TvQ9xPoyuQ=="], + "web-tree-sitter": ["web-tree-sitter@0.25.10", "", { "peerDependencies": { "@types/emscripten": "^1.40.0" }, "optionalPeers": ["@types/emscripten"] }, "sha512-Y09sF44/13XvgVKgO2cNDw5rGk6s26MgoZPXLESvMXeefBf7i6/73eFurre0IsTW6E14Y0ArIzhUMmjoc7xyzA=="], "ws": ["ws@8.20.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA=="], diff --git a/package.json b/package.json index 41a9911..03d4628 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,9 @@ "zod": "^3.23.8" }, "devDependencies": { + "@types/bun": "^1.3.13", "@types/figlet": "^1.7.0", + "@types/node": "^25.7.0", "@types/react": "^19.2.14", "figlet": "^1.11.0" } diff --git a/src/cli/render.test.ts b/src/cli/render.test.ts index 179a851..154e82b 100644 --- a/src/cli/render.test.ts +++ b/src/cli/render.test.ts @@ -5,11 +5,23 @@ import { describe, it, expect, beforeEach, afterEach } from "bun:test"; import { renderPassage, renderParseError, renderRepoError } from "./render"; import type { ParseError, RepoError } from "@/domain/errors"; import type { Passage } from "@/domain/passage"; +import type { Reference } from "@/domain/reference"; +import { makeBookId } from "@/domain/book-id"; // --- Fixtures --- +const jhnResult = makeBookId("JHN"); +if (!jhnResult.ok) throw new Error("test fixture: JHN must be a valid BookId"); + +const johnRef: Reference = { + book: jhnResult.value, + chapter: 3, + verses: { start: 16, end: 16 }, +}; + const passage: Passage = { - verses: [{ text: "For God so loved the world." }], + reference: johnRef, + verses: [{ number: 16, text: "For God so loved the world." }], }; const PASSAGE_PLAIN = "For God so loved the world."; diff --git a/src/domain/book-id.test.ts b/src/domain/book-id.test.ts index 0459d56..dab9baf 100644 --- a/src/domain/book-id.test.ts +++ b/src/domain/book-id.test.ts @@ -6,7 +6,7 @@ describe("makeBookId", () => { const result = makeBookId("JHN"); expect(result.ok).toBe(true); if (!result.ok) return; - expect(result.value).toBe("JHN"); + expect(result.value as string).toBe("JHN"); }); it("accepts GEN — first book in the canonical set", () => { diff --git a/src/domain/reference.test.ts b/src/domain/reference.test.ts index 673d1eb..9f77fae 100644 --- a/src/domain/reference.test.ts +++ b/src/domain/reference.test.ts @@ -6,7 +6,7 @@ describe("parseReference", () => { const result = parseReference("john 3:16"); expect(result.ok).toBe(true); if (!result.ok) return; - expect(result.value.book).toBe("JHN"); + expect(result.value.book as string).toBe("JHN"); expect(result.value.chapter).toBe(3); expect(result.value.verses).toEqual({ start: 16, end: 16 }); }); @@ -15,7 +15,7 @@ describe("parseReference", () => { const result = parseReference("JOHN 3:16"); expect(result.ok).toBe(true); if (!result.ok) return; - expect(result.value.book).toBe("JHN"); + expect(result.value.book as string).toBe("JHN"); expect(result.value.chapter).toBe(3); expect(result.value.verses).toEqual({ start: 16, end: 16 }); }); @@ -24,7 +24,7 @@ describe("parseReference", () => { const result = parseReference("Jn 3:16"); expect(result.ok).toBe(true); if (!result.ok) return; - expect(result.value.book).toBe("JHN"); + expect(result.value.book as string).toBe("JHN"); }); it("returns unknown_book for 'xyzzy 99:99' — SCN-3", () => { diff --git a/tsconfig.json b/tsconfig.json index c195119..3ba949b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "target": "ES2022", - "module": "ES2022", + "module": "ESNext", "moduleResolution": "bundler", "strict": true, "jsx": "react-jsx",