@iflow-mcp/kdcokenny-lsbible 0.3.0

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.
@@ -0,0 +1,1157 @@
1
+ import { z } from 'zod';
2
+
3
+ /**
4
+ * Cache provider interface for LSBible SDK.
5
+ *
6
+ * Allows users to implement custom caching strategies for different
7
+ * deployment environments (Cloudflare Workers, Redis, in-memory, etc.)
8
+ */
9
+ /**
10
+ * Cache provider interface.
11
+ *
12
+ * Implement this interface to provide custom caching for the LSBible client.
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * class RedisCacheProvider implements CacheProvider {
17
+ * async get<T>(key: string): Promise<T | undefined> {
18
+ * const value = await redis.get(key);
19
+ * return value ? JSON.parse(value) : undefined;
20
+ * }
21
+ *
22
+ * async set<T>(key: string, value: T, ttl: number): Promise<void> {
23
+ * await redis.set(key, JSON.stringify(value), 'EX', ttl);
24
+ * }
25
+ * }
26
+ * ```
27
+ */
28
+ interface CacheProvider {
29
+ /**
30
+ * Get a value from the cache.
31
+ *
32
+ * @param key - Cache key
33
+ * @returns Cached value or undefined if not found/expired
34
+ */
35
+ get<T>(key: string): Promise<T | undefined>;
36
+ /**
37
+ * Set a value in the cache.
38
+ *
39
+ * @param key - Cache key
40
+ * @param value - Value to cache
41
+ * @param ttl - Time to live in seconds
42
+ */
43
+ set<T>(key: string, value: T, ttl: number): Promise<void>;
44
+ }
45
+ /**
46
+ * Cache configuration options.
47
+ */
48
+ interface CacheOptions {
49
+ /**
50
+ * Cache provider implementation.
51
+ *
52
+ * If not provided, caching is disabled.
53
+ */
54
+ provider?: CacheProvider;
55
+ /**
56
+ * Default TTL for cache entries (in seconds).
57
+ *
58
+ * Can be overridden per-operation.
59
+ * @default 2592000 (30 days)
60
+ */
61
+ defaultTtl?: number;
62
+ /**
63
+ * Per-operation TTL overrides.
64
+ */
65
+ ttl?: {
66
+ /** TTL for verse lookups */
67
+ verse?: number;
68
+ /** TTL for passage lookups */
69
+ passage?: number;
70
+ /** TTL for chapter lookups */
71
+ chapter?: number;
72
+ /** TTL for search queries */
73
+ search?: number;
74
+ };
75
+ }
76
+ /**
77
+ * Recommended cache TTL values (in seconds).
78
+ */
79
+ declare const CacheTTL: {
80
+ /** 1 month - for immutable Bible content (verses, passages, chapters) */
81
+ readonly BIBLE_CONTENT: 2592000;
82
+ /** 1 week - for search results that may change with API updates */
83
+ readonly SEARCH_RESULTS: 604800;
84
+ /** 1 year - for static resources that never change */
85
+ readonly STATIC: 31536000;
86
+ };
87
+
88
+ /**
89
+ * Zod schemas and TypeScript types for LSBible API data structures.
90
+ *
91
+ * Provides runtime validation and type inference for all API responses.
92
+ */
93
+
94
+ /**
95
+ * Enumeration of all 66 Bible books for type-safe API calls.
96
+ */
97
+ declare enum BookName {
98
+ GENESIS = "Genesis",
99
+ EXODUS = "Exodus",
100
+ LEVITICUS = "Leviticus",
101
+ NUMBERS = "Numbers",
102
+ DEUTERONOMY = "Deuteronomy",
103
+ JOSHUA = "Joshua",
104
+ JUDGES = "Judges",
105
+ RUTH = "Ruth",
106
+ SAMUEL_1 = "1 Samuel",
107
+ SAMUEL_2 = "2 Samuel",
108
+ KINGS_1 = "1 Kings",
109
+ KINGS_2 = "2 Kings",
110
+ CHRONICLES_1 = "1 Chronicles",
111
+ CHRONICLES_2 = "2 Chronicles",
112
+ EZRA = "Ezra",
113
+ NEHEMIAH = "Nehemiah",
114
+ ESTHER = "Esther",
115
+ JOB = "Job",
116
+ PSALMS = "Psalms",
117
+ PROVERBS = "Proverbs",
118
+ ECCLESIASTES = "Ecclesiastes",
119
+ SONG_OF_SONGS = "Song of Songs",
120
+ ISAIAH = "Isaiah",
121
+ JEREMIAH = "Jeremiah",
122
+ LAMENTATIONS = "Lamentations",
123
+ EZEKIEL = "Ezekiel",
124
+ DANIEL = "Daniel",
125
+ HOSEA = "Hosea",
126
+ JOEL = "Joel",
127
+ AMOS = "Amos",
128
+ OBADIAH = "Obadiah",
129
+ JONAH = "Jonah",
130
+ MICAH = "Micah",
131
+ NAHUM = "Nahum",
132
+ HABAKKUK = "Habakkuk",
133
+ ZEPHANIAH = "Zephaniah",
134
+ HAGGAI = "Haggai",
135
+ ZECHARIAH = "Zechariah",
136
+ MALACHI = "Malachi",
137
+ MATTHEW = "Matthew",
138
+ MARK = "Mark",
139
+ LUKE = "Luke",
140
+ JOHN = "John",
141
+ ACTS = "Acts",
142
+ ROMANS = "Romans",
143
+ CORINTHIANS_1 = "1 Corinthians",
144
+ CORINTHIANS_2 = "2 Corinthians",
145
+ GALATIANS = "Galatians",
146
+ EPHESIANS = "Ephesians",
147
+ PHILIPPIANS = "Philippians",
148
+ COLOSSIANS = "Colossians",
149
+ THESSALONIANS_1 = "1 Thessalonians",
150
+ THESSALONIANS_2 = "2 Thessalonians",
151
+ TIMOTHY_1 = "1 Timothy",
152
+ TIMOTHY_2 = "2 Timothy",
153
+ TITUS = "Titus",
154
+ PHILEMON = "Philemon",
155
+ HEBREWS = "Hebrews",
156
+ JAMES = "James",
157
+ PETER_1 = "1 Peter",
158
+ PETER_2 = "2 Peter",
159
+ JOHN_1 = "1 John",
160
+ JOHN_2 = "2 John",
161
+ JOHN_3 = "3 John",
162
+ JUDE = "Jude",
163
+ REVELATION = "Revelation"
164
+ }
165
+ /**
166
+ * Zod schema for VerseReference with validation.
167
+ *
168
+ * Validates that:
169
+ * - Book number is 1-66
170
+ * - Chapter exists in the book
171
+ * - Verse exists in the chapter
172
+ */
173
+ declare const VerseReferenceSchema: z.ZodEffects<z.ZodEffects<z.ZodObject<{
174
+ bookNumber: z.ZodNumber;
175
+ chapter: z.ZodNumber;
176
+ verse: z.ZodNumber;
177
+ }, "strip", z.ZodTypeAny, {
178
+ bookNumber: number;
179
+ chapter: number;
180
+ verse: number;
181
+ }, {
182
+ bookNumber: number;
183
+ chapter: number;
184
+ verse: number;
185
+ }>, {
186
+ bookNumber: number;
187
+ chapter: number;
188
+ verse: number;
189
+ }, {
190
+ bookNumber: number;
191
+ chapter: number;
192
+ verse: number;
193
+ }>, {
194
+ bookNumber: number;
195
+ chapter: number;
196
+ verse: number;
197
+ }, {
198
+ bookNumber: number;
199
+ chapter: number;
200
+ verse: number;
201
+ }>;
202
+ /** Type for VerseReference inferred from Zod schema */
203
+ type VerseReference = z.infer<typeof VerseReferenceSchema> & {
204
+ /** Get the book name from the book number */
205
+ readonly bookName: BookName;
206
+ /** String representation (e.g., "John 3:16") */
207
+ toString(): string;
208
+ };
209
+ /**
210
+ * Zod schema for TextSegment.
211
+ */
212
+ declare const TextSegmentSchema: z.ZodObject<{
213
+ text: z.ZodString;
214
+ isRedLetter: z.ZodDefault<z.ZodBoolean>;
215
+ isItalic: z.ZodDefault<z.ZodBoolean>;
216
+ isBold: z.ZodDefault<z.ZodBoolean>;
217
+ isSmallCaps: z.ZodDefault<z.ZodBoolean>;
218
+ }, "strip", z.ZodTypeAny, {
219
+ text: string;
220
+ isRedLetter: boolean;
221
+ isItalic: boolean;
222
+ isBold: boolean;
223
+ isSmallCaps: boolean;
224
+ }, {
225
+ text: string;
226
+ isRedLetter?: boolean | undefined;
227
+ isItalic?: boolean | undefined;
228
+ isBold?: boolean | undefined;
229
+ isSmallCaps?: boolean | undefined;
230
+ }>;
231
+ /** Type for TextSegment */
232
+ type TextSegment = z.infer<typeof TextSegmentSchema>;
233
+ /**
234
+ * Zod schema for VerseContent.
235
+ */
236
+ declare const VerseContentSchema: z.ZodObject<{
237
+ reference: z.ZodEffects<z.ZodEffects<z.ZodObject<{
238
+ bookNumber: z.ZodNumber;
239
+ chapter: z.ZodNumber;
240
+ verse: z.ZodNumber;
241
+ }, "strip", z.ZodTypeAny, {
242
+ bookNumber: number;
243
+ chapter: number;
244
+ verse: number;
245
+ }, {
246
+ bookNumber: number;
247
+ chapter: number;
248
+ verse: number;
249
+ }>, {
250
+ bookNumber: number;
251
+ chapter: number;
252
+ verse: number;
253
+ }, {
254
+ bookNumber: number;
255
+ chapter: number;
256
+ verse: number;
257
+ }>, {
258
+ bookNumber: number;
259
+ chapter: number;
260
+ verse: number;
261
+ }, {
262
+ bookNumber: number;
263
+ chapter: number;
264
+ verse: number;
265
+ }>;
266
+ verseNumber: z.ZodNumber;
267
+ segments: z.ZodArray<z.ZodObject<{
268
+ text: z.ZodString;
269
+ isRedLetter: z.ZodDefault<z.ZodBoolean>;
270
+ isItalic: z.ZodDefault<z.ZodBoolean>;
271
+ isBold: z.ZodDefault<z.ZodBoolean>;
272
+ isSmallCaps: z.ZodDefault<z.ZodBoolean>;
273
+ }, "strip", z.ZodTypeAny, {
274
+ text: string;
275
+ isRedLetter: boolean;
276
+ isItalic: boolean;
277
+ isBold: boolean;
278
+ isSmallCaps: boolean;
279
+ }, {
280
+ text: string;
281
+ isRedLetter?: boolean | undefined;
282
+ isItalic?: boolean | undefined;
283
+ isBold?: boolean | undefined;
284
+ isSmallCaps?: boolean | undefined;
285
+ }>, "many">;
286
+ hasSubheading: z.ZodDefault<z.ZodBoolean>;
287
+ subheadingText: z.ZodDefault<z.ZodNullable<z.ZodString>>;
288
+ isPoetry: z.ZodDefault<z.ZodBoolean>;
289
+ isProse: z.ZodDefault<z.ZodBoolean>;
290
+ chapterStart: z.ZodDefault<z.ZodBoolean>;
291
+ }, "strip", z.ZodTypeAny, {
292
+ reference: {
293
+ bookNumber: number;
294
+ chapter: number;
295
+ verse: number;
296
+ };
297
+ verseNumber: number;
298
+ segments: {
299
+ text: string;
300
+ isRedLetter: boolean;
301
+ isItalic: boolean;
302
+ isBold: boolean;
303
+ isSmallCaps: boolean;
304
+ }[];
305
+ hasSubheading: boolean;
306
+ subheadingText: string | null;
307
+ isPoetry: boolean;
308
+ isProse: boolean;
309
+ chapterStart: boolean;
310
+ }, {
311
+ reference: {
312
+ bookNumber: number;
313
+ chapter: number;
314
+ verse: number;
315
+ };
316
+ verseNumber: number;
317
+ segments: {
318
+ text: string;
319
+ isRedLetter?: boolean | undefined;
320
+ isItalic?: boolean | undefined;
321
+ isBold?: boolean | undefined;
322
+ isSmallCaps?: boolean | undefined;
323
+ }[];
324
+ hasSubheading?: boolean | undefined;
325
+ subheadingText?: string | null | undefined;
326
+ isPoetry?: boolean | undefined;
327
+ isProse?: boolean | undefined;
328
+ chapterStart?: boolean | undefined;
329
+ }>;
330
+ /** Type for VerseContent with computed properties */
331
+ type VerseContent = Omit<z.infer<typeof VerseContentSchema>, "reference"> & {
332
+ reference: VerseReference;
333
+ /** Get plain text without formatting */
334
+ readonly plainText: string;
335
+ /** Get text with simple formatting markers */
336
+ readonly formattedText: string;
337
+ };
338
+ /**
339
+ * Zod schema for Passage.
340
+ */
341
+ declare const PassageSchema: z.ZodObject<{
342
+ fromRef: z.ZodEffects<z.ZodEffects<z.ZodObject<{
343
+ bookNumber: z.ZodNumber;
344
+ chapter: z.ZodNumber;
345
+ verse: z.ZodNumber;
346
+ }, "strip", z.ZodTypeAny, {
347
+ bookNumber: number;
348
+ chapter: number;
349
+ verse: number;
350
+ }, {
351
+ bookNumber: number;
352
+ chapter: number;
353
+ verse: number;
354
+ }>, {
355
+ bookNumber: number;
356
+ chapter: number;
357
+ verse: number;
358
+ }, {
359
+ bookNumber: number;
360
+ chapter: number;
361
+ verse: number;
362
+ }>, {
363
+ bookNumber: number;
364
+ chapter: number;
365
+ verse: number;
366
+ }, {
367
+ bookNumber: number;
368
+ chapter: number;
369
+ verse: number;
370
+ }>;
371
+ toRef: z.ZodEffects<z.ZodEffects<z.ZodObject<{
372
+ bookNumber: z.ZodNumber;
373
+ chapter: z.ZodNumber;
374
+ verse: z.ZodNumber;
375
+ }, "strip", z.ZodTypeAny, {
376
+ bookNumber: number;
377
+ chapter: number;
378
+ verse: number;
379
+ }, {
380
+ bookNumber: number;
381
+ chapter: number;
382
+ verse: number;
383
+ }>, {
384
+ bookNumber: number;
385
+ chapter: number;
386
+ verse: number;
387
+ }, {
388
+ bookNumber: number;
389
+ chapter: number;
390
+ verse: number;
391
+ }>, {
392
+ bookNumber: number;
393
+ chapter: number;
394
+ verse: number;
395
+ }, {
396
+ bookNumber: number;
397
+ chapter: number;
398
+ verse: number;
399
+ }>;
400
+ title: z.ZodString;
401
+ verses: z.ZodArray<z.ZodObject<{
402
+ reference: z.ZodEffects<z.ZodEffects<z.ZodObject<{
403
+ bookNumber: z.ZodNumber;
404
+ chapter: z.ZodNumber;
405
+ verse: z.ZodNumber;
406
+ }, "strip", z.ZodTypeAny, {
407
+ bookNumber: number;
408
+ chapter: number;
409
+ verse: number;
410
+ }, {
411
+ bookNumber: number;
412
+ chapter: number;
413
+ verse: number;
414
+ }>, {
415
+ bookNumber: number;
416
+ chapter: number;
417
+ verse: number;
418
+ }, {
419
+ bookNumber: number;
420
+ chapter: number;
421
+ verse: number;
422
+ }>, {
423
+ bookNumber: number;
424
+ chapter: number;
425
+ verse: number;
426
+ }, {
427
+ bookNumber: number;
428
+ chapter: number;
429
+ verse: number;
430
+ }>;
431
+ verseNumber: z.ZodNumber;
432
+ segments: z.ZodArray<z.ZodObject<{
433
+ text: z.ZodString;
434
+ isRedLetter: z.ZodDefault<z.ZodBoolean>;
435
+ isItalic: z.ZodDefault<z.ZodBoolean>;
436
+ isBold: z.ZodDefault<z.ZodBoolean>;
437
+ isSmallCaps: z.ZodDefault<z.ZodBoolean>;
438
+ }, "strip", z.ZodTypeAny, {
439
+ text: string;
440
+ isRedLetter: boolean;
441
+ isItalic: boolean;
442
+ isBold: boolean;
443
+ isSmallCaps: boolean;
444
+ }, {
445
+ text: string;
446
+ isRedLetter?: boolean | undefined;
447
+ isItalic?: boolean | undefined;
448
+ isBold?: boolean | undefined;
449
+ isSmallCaps?: boolean | undefined;
450
+ }>, "many">;
451
+ hasSubheading: z.ZodDefault<z.ZodBoolean>;
452
+ subheadingText: z.ZodDefault<z.ZodNullable<z.ZodString>>;
453
+ isPoetry: z.ZodDefault<z.ZodBoolean>;
454
+ isProse: z.ZodDefault<z.ZodBoolean>;
455
+ chapterStart: z.ZodDefault<z.ZodBoolean>;
456
+ }, "strip", z.ZodTypeAny, {
457
+ reference: {
458
+ bookNumber: number;
459
+ chapter: number;
460
+ verse: number;
461
+ };
462
+ verseNumber: number;
463
+ segments: {
464
+ text: string;
465
+ isRedLetter: boolean;
466
+ isItalic: boolean;
467
+ isBold: boolean;
468
+ isSmallCaps: boolean;
469
+ }[];
470
+ hasSubheading: boolean;
471
+ subheadingText: string | null;
472
+ isPoetry: boolean;
473
+ isProse: boolean;
474
+ chapterStart: boolean;
475
+ }, {
476
+ reference: {
477
+ bookNumber: number;
478
+ chapter: number;
479
+ verse: number;
480
+ };
481
+ verseNumber: number;
482
+ segments: {
483
+ text: string;
484
+ isRedLetter?: boolean | undefined;
485
+ isItalic?: boolean | undefined;
486
+ isBold?: boolean | undefined;
487
+ isSmallCaps?: boolean | undefined;
488
+ }[];
489
+ hasSubheading?: boolean | undefined;
490
+ subheadingText?: string | null | undefined;
491
+ isPoetry?: boolean | undefined;
492
+ isProse?: boolean | undefined;
493
+ chapterStart?: boolean | undefined;
494
+ }>, "many">;
495
+ }, "strip", z.ZodTypeAny, {
496
+ fromRef: {
497
+ bookNumber: number;
498
+ chapter: number;
499
+ verse: number;
500
+ };
501
+ toRef: {
502
+ bookNumber: number;
503
+ chapter: number;
504
+ verse: number;
505
+ };
506
+ title: string;
507
+ verses: {
508
+ reference: {
509
+ bookNumber: number;
510
+ chapter: number;
511
+ verse: number;
512
+ };
513
+ verseNumber: number;
514
+ segments: {
515
+ text: string;
516
+ isRedLetter: boolean;
517
+ isItalic: boolean;
518
+ isBold: boolean;
519
+ isSmallCaps: boolean;
520
+ }[];
521
+ hasSubheading: boolean;
522
+ subheadingText: string | null;
523
+ isPoetry: boolean;
524
+ isProse: boolean;
525
+ chapterStart: boolean;
526
+ }[];
527
+ }, {
528
+ fromRef: {
529
+ bookNumber: number;
530
+ chapter: number;
531
+ verse: number;
532
+ };
533
+ toRef: {
534
+ bookNumber: number;
535
+ chapter: number;
536
+ verse: number;
537
+ };
538
+ title: string;
539
+ verses: {
540
+ reference: {
541
+ bookNumber: number;
542
+ chapter: number;
543
+ verse: number;
544
+ };
545
+ verseNumber: number;
546
+ segments: {
547
+ text: string;
548
+ isRedLetter?: boolean | undefined;
549
+ isItalic?: boolean | undefined;
550
+ isBold?: boolean | undefined;
551
+ isSmallCaps?: boolean | undefined;
552
+ }[];
553
+ hasSubheading?: boolean | undefined;
554
+ subheadingText?: string | null | undefined;
555
+ isPoetry?: boolean | undefined;
556
+ isProse?: boolean | undefined;
557
+ chapterStart?: boolean | undefined;
558
+ }[];
559
+ }>;
560
+ /** Type for Passage with computed properties */
561
+ type Passage = Omit<z.infer<typeof PassageSchema>, "fromRef" | "toRef" | "verses"> & {
562
+ fromRef: VerseReference;
563
+ toRef: VerseReference;
564
+ verses: VerseContent[];
565
+ /** Check if this passage is a single verse */
566
+ readonly isSingleVerse: boolean;
567
+ /** Get the number of verses in this passage */
568
+ readonly verseCount: number;
569
+ };
570
+ /**
571
+ * Zod schema for SearchResponse.
572
+ *
573
+ * For text searches, includes rich metadata about result distribution across
574
+ * Bible sections and books. For Bible reference lookups, these fields are undefined.
575
+ */
576
+ declare const SearchResponseSchema: z.ZodObject<{
577
+ query: z.ZodString;
578
+ matchCount: z.ZodNumber;
579
+ passages: z.ZodArray<z.ZodObject<{
580
+ fromRef: z.ZodEffects<z.ZodEffects<z.ZodObject<{
581
+ bookNumber: z.ZodNumber;
582
+ chapter: z.ZodNumber;
583
+ verse: z.ZodNumber;
584
+ }, "strip", z.ZodTypeAny, {
585
+ bookNumber: number;
586
+ chapter: number;
587
+ verse: number;
588
+ }, {
589
+ bookNumber: number;
590
+ chapter: number;
591
+ verse: number;
592
+ }>, {
593
+ bookNumber: number;
594
+ chapter: number;
595
+ verse: number;
596
+ }, {
597
+ bookNumber: number;
598
+ chapter: number;
599
+ verse: number;
600
+ }>, {
601
+ bookNumber: number;
602
+ chapter: number;
603
+ verse: number;
604
+ }, {
605
+ bookNumber: number;
606
+ chapter: number;
607
+ verse: number;
608
+ }>;
609
+ toRef: z.ZodEffects<z.ZodEffects<z.ZodObject<{
610
+ bookNumber: z.ZodNumber;
611
+ chapter: z.ZodNumber;
612
+ verse: z.ZodNumber;
613
+ }, "strip", z.ZodTypeAny, {
614
+ bookNumber: number;
615
+ chapter: number;
616
+ verse: number;
617
+ }, {
618
+ bookNumber: number;
619
+ chapter: number;
620
+ verse: number;
621
+ }>, {
622
+ bookNumber: number;
623
+ chapter: number;
624
+ verse: number;
625
+ }, {
626
+ bookNumber: number;
627
+ chapter: number;
628
+ verse: number;
629
+ }>, {
630
+ bookNumber: number;
631
+ chapter: number;
632
+ verse: number;
633
+ }, {
634
+ bookNumber: number;
635
+ chapter: number;
636
+ verse: number;
637
+ }>;
638
+ title: z.ZodString;
639
+ verses: z.ZodArray<z.ZodObject<{
640
+ reference: z.ZodEffects<z.ZodEffects<z.ZodObject<{
641
+ bookNumber: z.ZodNumber;
642
+ chapter: z.ZodNumber;
643
+ verse: z.ZodNumber;
644
+ }, "strip", z.ZodTypeAny, {
645
+ bookNumber: number;
646
+ chapter: number;
647
+ verse: number;
648
+ }, {
649
+ bookNumber: number;
650
+ chapter: number;
651
+ verse: number;
652
+ }>, {
653
+ bookNumber: number;
654
+ chapter: number;
655
+ verse: number;
656
+ }, {
657
+ bookNumber: number;
658
+ chapter: number;
659
+ verse: number;
660
+ }>, {
661
+ bookNumber: number;
662
+ chapter: number;
663
+ verse: number;
664
+ }, {
665
+ bookNumber: number;
666
+ chapter: number;
667
+ verse: number;
668
+ }>;
669
+ verseNumber: z.ZodNumber;
670
+ segments: z.ZodArray<z.ZodObject<{
671
+ text: z.ZodString;
672
+ isRedLetter: z.ZodDefault<z.ZodBoolean>;
673
+ isItalic: z.ZodDefault<z.ZodBoolean>;
674
+ isBold: z.ZodDefault<z.ZodBoolean>;
675
+ isSmallCaps: z.ZodDefault<z.ZodBoolean>;
676
+ }, "strip", z.ZodTypeAny, {
677
+ text: string;
678
+ isRedLetter: boolean;
679
+ isItalic: boolean;
680
+ isBold: boolean;
681
+ isSmallCaps: boolean;
682
+ }, {
683
+ text: string;
684
+ isRedLetter?: boolean | undefined;
685
+ isItalic?: boolean | undefined;
686
+ isBold?: boolean | undefined;
687
+ isSmallCaps?: boolean | undefined;
688
+ }>, "many">;
689
+ hasSubheading: z.ZodDefault<z.ZodBoolean>;
690
+ subheadingText: z.ZodDefault<z.ZodNullable<z.ZodString>>;
691
+ isPoetry: z.ZodDefault<z.ZodBoolean>;
692
+ isProse: z.ZodDefault<z.ZodBoolean>;
693
+ chapterStart: z.ZodDefault<z.ZodBoolean>;
694
+ }, "strip", z.ZodTypeAny, {
695
+ reference: {
696
+ bookNumber: number;
697
+ chapter: number;
698
+ verse: number;
699
+ };
700
+ verseNumber: number;
701
+ segments: {
702
+ text: string;
703
+ isRedLetter: boolean;
704
+ isItalic: boolean;
705
+ isBold: boolean;
706
+ isSmallCaps: boolean;
707
+ }[];
708
+ hasSubheading: boolean;
709
+ subheadingText: string | null;
710
+ isPoetry: boolean;
711
+ isProse: boolean;
712
+ chapterStart: boolean;
713
+ }, {
714
+ reference: {
715
+ bookNumber: number;
716
+ chapter: number;
717
+ verse: number;
718
+ };
719
+ verseNumber: number;
720
+ segments: {
721
+ text: string;
722
+ isRedLetter?: boolean | undefined;
723
+ isItalic?: boolean | undefined;
724
+ isBold?: boolean | undefined;
725
+ isSmallCaps?: boolean | undefined;
726
+ }[];
727
+ hasSubheading?: boolean | undefined;
728
+ subheadingText?: string | null | undefined;
729
+ isPoetry?: boolean | undefined;
730
+ isProse?: boolean | undefined;
731
+ chapterStart?: boolean | undefined;
732
+ }>, "many">;
733
+ }, "strip", z.ZodTypeAny, {
734
+ fromRef: {
735
+ bookNumber: number;
736
+ chapter: number;
737
+ verse: number;
738
+ };
739
+ toRef: {
740
+ bookNumber: number;
741
+ chapter: number;
742
+ verse: number;
743
+ };
744
+ title: string;
745
+ verses: {
746
+ reference: {
747
+ bookNumber: number;
748
+ chapter: number;
749
+ verse: number;
750
+ };
751
+ verseNumber: number;
752
+ segments: {
753
+ text: string;
754
+ isRedLetter: boolean;
755
+ isItalic: boolean;
756
+ isBold: boolean;
757
+ isSmallCaps: boolean;
758
+ }[];
759
+ hasSubheading: boolean;
760
+ subheadingText: string | null;
761
+ isPoetry: boolean;
762
+ isProse: boolean;
763
+ chapterStart: boolean;
764
+ }[];
765
+ }, {
766
+ fromRef: {
767
+ bookNumber: number;
768
+ chapter: number;
769
+ verse: number;
770
+ };
771
+ toRef: {
772
+ bookNumber: number;
773
+ chapter: number;
774
+ verse: number;
775
+ };
776
+ title: string;
777
+ verses: {
778
+ reference: {
779
+ bookNumber: number;
780
+ chapter: number;
781
+ verse: number;
782
+ };
783
+ verseNumber: number;
784
+ segments: {
785
+ text: string;
786
+ isRedLetter?: boolean | undefined;
787
+ isItalic?: boolean | undefined;
788
+ isBold?: boolean | undefined;
789
+ isSmallCaps?: boolean | undefined;
790
+ }[];
791
+ hasSubheading?: boolean | undefined;
792
+ subheadingText?: string | null | undefined;
793
+ isPoetry?: boolean | undefined;
794
+ isProse?: boolean | undefined;
795
+ chapterStart?: boolean | undefined;
796
+ }[];
797
+ }>, "many">;
798
+ durationMs: z.ZodNumber;
799
+ timestamp: z.ZodNumber;
800
+ totalCount: z.ZodOptional<z.ZodNumber>;
801
+ filteredCount: z.ZodOptional<z.ZodNumber>;
802
+ countsByBook: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodNumber>>;
803
+ countsBySection: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodNumber>>;
804
+ }, "strip", z.ZodTypeAny, {
805
+ query: string;
806
+ matchCount: number;
807
+ passages: {
808
+ fromRef: {
809
+ bookNumber: number;
810
+ chapter: number;
811
+ verse: number;
812
+ };
813
+ toRef: {
814
+ bookNumber: number;
815
+ chapter: number;
816
+ verse: number;
817
+ };
818
+ title: string;
819
+ verses: {
820
+ reference: {
821
+ bookNumber: number;
822
+ chapter: number;
823
+ verse: number;
824
+ };
825
+ verseNumber: number;
826
+ segments: {
827
+ text: string;
828
+ isRedLetter: boolean;
829
+ isItalic: boolean;
830
+ isBold: boolean;
831
+ isSmallCaps: boolean;
832
+ }[];
833
+ hasSubheading: boolean;
834
+ subheadingText: string | null;
835
+ isPoetry: boolean;
836
+ isProse: boolean;
837
+ chapterStart: boolean;
838
+ }[];
839
+ }[];
840
+ durationMs: number;
841
+ timestamp: number;
842
+ totalCount?: number | undefined;
843
+ filteredCount?: number | undefined;
844
+ countsByBook?: Record<string, number> | undefined;
845
+ countsBySection?: Record<string, number> | undefined;
846
+ }, {
847
+ query: string;
848
+ matchCount: number;
849
+ passages: {
850
+ fromRef: {
851
+ bookNumber: number;
852
+ chapter: number;
853
+ verse: number;
854
+ };
855
+ toRef: {
856
+ bookNumber: number;
857
+ chapter: number;
858
+ verse: number;
859
+ };
860
+ title: string;
861
+ verses: {
862
+ reference: {
863
+ bookNumber: number;
864
+ chapter: number;
865
+ verse: number;
866
+ };
867
+ verseNumber: number;
868
+ segments: {
869
+ text: string;
870
+ isRedLetter?: boolean | undefined;
871
+ isItalic?: boolean | undefined;
872
+ isBold?: boolean | undefined;
873
+ isSmallCaps?: boolean | undefined;
874
+ }[];
875
+ hasSubheading?: boolean | undefined;
876
+ subheadingText?: string | null | undefined;
877
+ isPoetry?: boolean | undefined;
878
+ isProse?: boolean | undefined;
879
+ chapterStart?: boolean | undefined;
880
+ }[];
881
+ }[];
882
+ durationMs: number;
883
+ timestamp: number;
884
+ totalCount?: number | undefined;
885
+ filteredCount?: number | undefined;
886
+ countsByBook?: Record<string, number> | undefined;
887
+ countsBySection?: Record<string, number> | undefined;
888
+ }>;
889
+ /** Type for SearchResponse with computed properties */
890
+ type SearchResponse = Omit<z.infer<typeof SearchResponseSchema>, "passages"> & {
891
+ passages: Passage[];
892
+ /** Get the number of passages returned */
893
+ readonly passageCount: number;
894
+ /** Get total number of verses across all passages */
895
+ readonly totalVerses: number;
896
+ /** Check if this response includes search distribution metadata */
897
+ readonly hasSearchMetadata: boolean;
898
+ };
899
+
900
+ /**
901
+ * LSBible API client.
902
+ */
903
+
904
+ /** Client configuration options */
905
+ interface LSBibleClientOptions {
906
+ /** Request timeout in seconds (default: 30) */
907
+ timeout?: number;
908
+ /** Optional build ID (auto-detected if not provided) */
909
+ buildId?: string;
910
+ /** Optional custom headers */
911
+ headers?: Record<string, string>;
912
+ /** Optional cache configuration */
913
+ cache?: CacheOptions;
914
+ }
915
+ /**
916
+ * Client for interacting with the LSBible API.
917
+ *
918
+ * @example
919
+ * ```ts
920
+ * const client = new LSBibleClient();
921
+ *
922
+ * // Get a single verse
923
+ * const verse = await client.getVerse(BookName.JOHN, 3, 16);
924
+ *
925
+ * // Search for text
926
+ * const results = await client.search("love");
927
+ * ```
928
+ */
929
+ declare class LSBibleClient {
930
+ private static readonly BASE_URL;
931
+ private cacheProvider;
932
+ private cacheTtls;
933
+ private timeout;
934
+ private buildId;
935
+ private buildIdFetched;
936
+ private headers;
937
+ /**
938
+ * Create a new LSBible client.
939
+ *
940
+ * @param options - Client configuration options
941
+ */
942
+ constructor(options?: LSBibleClientOptions);
943
+ /**
944
+ * Get the Next.js build ID.
945
+ *
946
+ * Strategies:
947
+ * 1. Use cached/provided build ID
948
+ * 2. Extract from homepage HTML (__NEXT_DATA__ script)
949
+ * 3. Try to find it in script tags
950
+ *
951
+ * @throws BuildIDError if build ID cannot be determined
952
+ */
953
+ private getBuildId;
954
+ /**
955
+ * Cache wrapper for async operations.
956
+ *
957
+ * @param key - Cache key
958
+ * @param ttl - Time to live in seconds
959
+ * @param fetcher - Function to fetch fresh data
960
+ * @returns Cached or fresh data
961
+ */
962
+ private withCache;
963
+ /**
964
+ * Make a request to the LSBible API.
965
+ *
966
+ * @param query - Search query or verse reference
967
+ * @returns API response JSON
968
+ * @throws APIError if request fails
969
+ */
970
+ private makeRequest;
971
+ /**
972
+ * Detect if response is from text search or Bible reference lookup.
973
+ *
974
+ * Text searches have initialItems array with metadata.
975
+ * Bible reference lookups have passages array with full HTML.
976
+ */
977
+ private isTextSearch;
978
+ /**
979
+ * Parse text search results from initialItems format.
980
+ */
981
+ private parseSearchResults;
982
+ /**
983
+ * Parse Bible reference lookup results from passages format.
984
+ */
985
+ private parseReferenceResults;
986
+ /**
987
+ * Parse API response into SearchResponse.
988
+ */
989
+ private parseResponse;
990
+ /**
991
+ * Search for passages containing text.
992
+ *
993
+ * @param query - Search text (e.g., "love", "faith")
994
+ * @returns SearchResponse with structured passage data
995
+ * @throws APIError if API request fails
996
+ */
997
+ search(query: string): Promise<SearchResponse>;
998
+ /**
999
+ * Get a specific verse with validated parameters.
1000
+ *
1001
+ * @param book - Book name as enum or string
1002
+ * @param chapter - Chapter number (validated against book)
1003
+ * @param verse - Verse number (validated against chapter)
1004
+ * @returns Single Passage containing the verse
1005
+ * @throws InvalidReferenceError if book/chapter/verse combination is invalid
1006
+ * @throws APIError if API request fails
1007
+ *
1008
+ * @example
1009
+ * ```ts
1010
+ * // Using enum (recommended - type-safe with autocomplete)
1011
+ * const passage = await client.getVerse(BookName.JOHN, 3, 16);
1012
+ *
1013
+ * // Using string (validated at runtime)
1014
+ * const passage2 = await client.getVerse("John", 3, 16);
1015
+ * ```
1016
+ */
1017
+ getVerse(book: BookName | string, chapter: number, verse: number): Promise<Passage>;
1018
+ /**
1019
+ * Get a passage spanning multiple verses.
1020
+ *
1021
+ * @param fromBook - Starting book
1022
+ * @param fromChapter - Starting chapter
1023
+ * @param fromVerse - Starting verse
1024
+ * @param toBook - Ending book
1025
+ * @param toChapter - Ending chapter
1026
+ * @param toVerse - Ending verse
1027
+ * @returns Passage containing all verses in range
1028
+ * @throws InvalidReferenceError if any reference is invalid
1029
+ * @throws APIError if API request fails
1030
+ *
1031
+ * @example
1032
+ * ```ts
1033
+ * // Get John 3:16-18
1034
+ * const passage = await client.getPassage(
1035
+ * BookName.JOHN, 3, 16,
1036
+ * BookName.JOHN, 3, 18
1037
+ * );
1038
+ * ```
1039
+ */
1040
+ getPassage(fromBook: BookName | string, fromChapter: number, fromVerse: number, toBook: BookName | string, toChapter: number, toVerse: number): Promise<Passage>;
1041
+ /**
1042
+ * Get an entire chapter.
1043
+ *
1044
+ * @param book - Book name
1045
+ * @param chapter - Chapter number
1046
+ * @returns Passage containing all verses in the chapter
1047
+ * @throws InvalidReferenceError if book/chapter is invalid
1048
+ * @throws APIError if API request fails
1049
+ *
1050
+ * @example
1051
+ * ```ts
1052
+ * // Get all of John chapter 3
1053
+ * const passage = await client.getChapter(BookName.JOHN, 3);
1054
+ * ```
1055
+ */
1056
+ getChapter(book: BookName | string, chapter: number): Promise<Passage>;
1057
+ /**
1058
+ * Clear all cached data.
1059
+ *
1060
+ * This method calls the cache provider's clear method if one is configured.
1061
+ * If the cache provider doesn't implement a clear method, this is a no-op.
1062
+ *
1063
+ * @example
1064
+ * ```ts
1065
+ * const client = new LSBibleClient({
1066
+ * cache: { provider: new MemoryCacheProvider() }
1067
+ * });
1068
+ *
1069
+ * // Clear all cached data
1070
+ * client.clearCache();
1071
+ * ```
1072
+ */
1073
+ clearCache(): void;
1074
+ }
1075
+
1076
+ /**
1077
+ * In-memory cache provider for local development and testing.
1078
+ *
1079
+ * Stores cache entries in a Map with TTL support. Cache is not
1080
+ * shared across processes or requests.
1081
+ */
1082
+
1083
+ /**
1084
+ * In-memory cache provider using Map.
1085
+ *
1086
+ * Suitable for:
1087
+ * - Local development
1088
+ * - Testing
1089
+ * - Single-process applications
1090
+ * - MCP stdio servers
1091
+ *
1092
+ * Not suitable for:
1093
+ * - Multi-process applications
1094
+ * - Cloudflare Workers (use CloudflareCacheProvider)
1095
+ * - Production high-traffic servers (use Redis/Memcached)
1096
+ *
1097
+ * @example
1098
+ * ```ts
1099
+ * import { LSBibleClient, MemoryCacheProvider } from 'lsbible';
1100
+ *
1101
+ * const client = new LSBibleClient({
1102
+ * cache: {
1103
+ * provider: new MemoryCacheProvider()
1104
+ * }
1105
+ * });
1106
+ * ```
1107
+ */
1108
+ declare class MemoryCacheProvider implements CacheProvider {
1109
+ private cache;
1110
+ get<T>(key: string): Promise<T | undefined>;
1111
+ set<T>(key: string, value: T, ttl: number): Promise<void>;
1112
+ /**
1113
+ * Clear all cache entries.
1114
+ *
1115
+ * Useful for testing or manual cache invalidation.
1116
+ */
1117
+ clear(): void;
1118
+ /**
1119
+ * Get the number of entries in the cache.
1120
+ *
1121
+ * Includes expired entries that haven't been accessed yet.
1122
+ */
1123
+ size(): number;
1124
+ }
1125
+
1126
+ /**
1127
+ * No-op cache provider that disables caching.
1128
+ *
1129
+ * Use this when you want to disable caching entirely.
1130
+ */
1131
+
1132
+ /**
1133
+ * No-op cache provider.
1134
+ *
1135
+ * All get() calls return undefined (cache miss).
1136
+ * All set() calls do nothing.
1137
+ *
1138
+ * Use when you want to disable caching for testing,
1139
+ * debugging, or when caching isn't beneficial for your use case.
1140
+ *
1141
+ * @example
1142
+ * ```ts
1143
+ * import { LSBibleClient, NoopCacheProvider } from 'lsbible';
1144
+ *
1145
+ * const client = new LSBibleClient({
1146
+ * cache: {
1147
+ * provider: new NoopCacheProvider()
1148
+ * }
1149
+ * });
1150
+ * ```
1151
+ */
1152
+ declare class NoopCacheProvider implements CacheProvider {
1153
+ get<T>(_key: string): Promise<T | undefined>;
1154
+ set<T>(_key: string, _value: T, _ttl: number): Promise<void>;
1155
+ }
1156
+
1157
+ export { BookName as B, type CacheOptions as C, LSBibleClient as L, MemoryCacheProvider as M, NoopCacheProvider as N, type Passage as P, type SearchResponse as S, type TextSegment as T, type VerseContent as V, type CacheProvider as a, CacheTTL as b, type LSBibleClientOptions as c, type VerseReference as d };