// Canonical Protestant Bible book list, in canonical (Genesis → Revelation) order. // // This is the single source of truth for book names/aliases, shared between the // client (src/App.tsx, for the Scripture Index page) and the server // (server/routes/bible-passage.js, for the BSB/bolls.life passage-fetch API). // Previously these lived as three independent, hand-maintained lists with // different key formats (spaced names + 3-letter ids in the client, unspaced // names + numeric ids on the server) that could silently drift out of sync. // // - `id` is the 3-letter USFM-style book id used by the bible.helloao.org API. // - bolls.life's book numbering is exactly this array's 1-based canonical order, // so no separate numeric-id table is needed — see bookNumberFor() below. // - `aliases` are additional short forms admins/users might type (abbreviations). export const BIBLE_BOOKS = [ { id: 'GEN', name: 'Genesis', aliases: ['gen'] }, { id: 'EXO', name: 'Exodus', aliases: ['exo'] }, { id: 'LEV', name: 'Leviticus', aliases: ['lev'] }, { id: 'NUM', name: 'Numbers', aliases: ['num'] }, { id: 'DEU', name: 'Deuteronomy', aliases: ['deut'] }, { id: 'JOS', name: 'Joshua', aliases: ['josh'] }, { id: 'JDG', name: 'Judges', aliases: ['judg'] }, { id: 'RUT', name: 'Ruth' }, { id: 'SA1', name: '1 Samuel', aliases: ['1 sam'] }, { id: 'SA2', name: '2 Samuel', aliases: ['2 sam'] }, { id: 'KI1', name: '1 Kings', aliases: ['1 kgs'] }, { id: 'KI2', name: '2 Kings', aliases: ['2 kgs'] }, { id: 'CH1', name: '1 Chronicles', aliases: ['1 chr'] }, { id: 'CH2', name: '2 Chronicles', aliases: ['2 chr'] }, { id: 'EZR', name: 'Ezra' }, { id: 'NEH', name: 'Nehemiah', aliases: ['neh'] }, { id: 'EST', name: 'Esther', aliases: ['esth'] }, { id: 'JOB', name: 'Job' }, { id: 'PSA', name: 'Psalms', aliases: ['ps', 'psa', 'psalm'] }, { id: 'PRO', name: 'Proverbs', aliases: ['prov'] }, { id: 'ECC', name: 'Ecclesiastes', aliases: ['eccl'] }, { id: 'SNG', name: 'Song of Solomon', aliases: ['song'] }, { id: 'ISA', name: 'Isaiah', aliases: ['isa'] }, { id: 'JER', name: 'Jeremiah', aliases: ['jer'] }, { id: 'LAM', name: 'Lamentations', aliases: ['lam'] }, { id: 'EZK', name: 'Ezekiel', aliases: ['ezek'] }, { id: 'DAN', name: 'Daniel', aliases: ['dan'] }, { id: 'HOS', name: 'Hosea', aliases: ['hos'] }, { id: 'JOL', name: 'Joel' }, { id: 'AMO', name: 'Amos' }, { id: 'OBA', name: 'Obadiah', aliases: ['obad'] }, { id: 'JNA', name: 'Jonah' }, { id: 'MIC', name: 'Micah', aliases: ['mic'] }, { id: 'NAH', name: 'Nahum', aliases: ['nah'] }, { id: 'HAB', name: 'Habakkuk', aliases: ['hab'] }, { id: 'ZEP', name: 'Zephaniah', aliases: ['zeph'] }, { id: 'HAG', name: 'Haggai', aliases: ['hag'] }, { id: 'ZEC', name: 'Zechariah', aliases: ['zech'] }, { id: 'MAL', name: 'Malachi', aliases: ['mal'] }, { id: 'MAT', name: 'Matthew', aliases: ['matt'] }, { id: 'MRK', name: 'Mark' }, { id: 'LUK', name: 'Luke' }, { id: 'JHN', name: 'John' }, { id: 'ACT', name: 'Acts' }, { id: 'ROM', name: 'Romans', aliases: ['rom'] }, { id: 'CO1', name: '1 Corinthians', aliases: ['1 cor'] }, { id: 'CO2', name: '2 Corinthians', aliases: ['2 cor'] }, { id: 'GAL', name: 'Galatians', aliases: ['gal'] }, { id: 'EPH', name: 'Ephesians', aliases: ['eph'] }, { id: 'PHP', name: 'Philippians', aliases: ['phil'] }, { id: 'COL', name: 'Colossians', aliases: ['col'] }, { id: 'TH1', name: '1 Thessalonians', aliases: ['1 thess'] }, { id: 'TH2', name: '2 Thessalonians', aliases: ['2 thess'] }, { id: 'TI1', name: '1 Timothy', aliases: ['1 tim'] }, { id: 'TI2', name: '2 Timothy', aliases: ['2 tim'] }, { id: 'TIT', name: 'Titus' }, { id: 'PHM', name: 'Philemon', aliases: ['philem'] }, { id: 'HEB', name: 'Hebrews', aliases: ['heb'] }, { id: 'JAM', name: 'James', aliases: ['jas'] }, { id: 'PE1', name: '1 Peter', aliases: ['1 pet'] }, { id: 'PE2', name: '2 Peter', aliases: ['2 pet'] }, { id: 'JO1', name: '1 John' }, { id: 'JO2', name: '2 John' }, { id: 'JO3', name: '3 John' }, { id: 'JDE', name: 'Jude', aliases: ['jude'] }, { id: 'REV', name: 'Revelation', aliases: ['rev'] }, ] /** bolls.life's numeric book id: just this list's 1-based canonical position. */ export function bookNumberFor(usfmId) { const index = BIBLE_BOOKS.findIndex(b => b.id === usfmId) return index === -1 ? null : index + 1 }