Node.js
Un cliente de JavaScript/TypeScript para BibleQL. Requiere Node.js 18 o superior.
- Paquete:
bibleql-jsen npm - Código: github.com/lporras/bibleql-js
- Licencia: MIT
Instalación
npm install bibleql-js
Configuración
import { BibleQLClient } from "bibleql-js";
const client = new BibleQLClient({
apiKey: process.env.BIBLEQL_API_KEY!,
apiUrl: "https://bibleql.org/graphql",
defaultTranslation: "spa-rv1909",
timeout: 30000,
});
También hay valores por defecto globales:
import { configure } from "bibleql-js";
configure({
apiKey: process.env.BIBLEQL_API_KEY!,
defaultTranslation: "spa-rv1909",
});
Este paquete nunca debe ejecutarse en código de navegador: empaquetarlo expone tu API key. El propio README del paquete lo advierte. Llámalo desde un servidor, una función serverless o un paso de build, y reenvía los resultados a tu frontend.
apiUrl explícitamenteEl valor por defecto apunta a una URL alojada en Render en lugar de a
https://bibleql.org/graphql.
Para saber dónde poner esto en una aplicación Next.js, en serverless o en un módulo compartido, consulta Configurar los SDKs.
Todos los ejemplos siguientes asumen un client creado como arriba.
Leer pasajes
const passage = await client.passage("Juan 3:16");
console.log(passage.reference); // "Juan 3:16"
console.log(passage.text);
// Traducción por llamada
await client.passage("John 3:16", { translation: "eng-web" });
Versículos y capítulos
const verse = await client.verse("GEN", 1, 1);
console.log(verse.bookId, verse.bookName, verse.chapter, verse.verse, verse.text);
const verses = await client.chapter("GEN", 1);
Búsqueda
const results = await client.search("amor", { limit: 10 });
results.forEach((v) => {
console.log(`${v.bookName} ${v.chapter}:${v.verse}`, v.text);
});
Coincidencia de subcadenas, no stemming — consulta Buscar en la Biblia.
Búsqueda semántica
Aquí sí está disponible, a diferencia de la gema de Ruby:
const results = await client.semanticSearch("el amor de Dios", {
translation: "spa-rv1909",
limit: 10,
});
results.forEach((r) => console.log(r.similarity, r.verse.text));
Solo spa-rv1909 tiene embeddings; cualquier otra devuelve un arreglo vacío. Consulta
Búsqueda semántica.
Versículo aleatorio
await client.randomVerse();
await client.randomVerse({ testament: "OT" });
await client.randomVerse({ books: "GEN,EXO" });
Versículo del día
await client.verseOfTheDay();
await client.verseOfTheDay({ date: "2026-01-01" });
Descubrimiento
await client.translations();
await client.translation("spa-rv1909");
await client.books();
await client.languages();
await client.bibleIndex();
Gestión de errores
import {
AuthenticationError,
ConnectionError,
NotFoundError,
RateLimitError,
TimeoutError,
} from "bibleql-js";
try {
const passage = await client.passage("Nonexistent 1:1");
} catch (error) {
if (error instanceof NotFoundError) {
console.error("No encontrado:", error.message);
} else if (error instanceof AuthenticationError) {
console.error("Revisa BIBLEQL_API_KEY");
} else if (error instanceof RateLimitError) {
console.error("Límite superado — espera antes de reintentar");
} else if (error instanceof TimeoutError || error instanceof ConnectionError) {
console.error("Problema de red transitorio:", error.message);
} else {
throw error;
}
}
La jerarquía:
BibleQLError
├── ConfigurationError
├── ConnectionError
│ └── TimeoutError
├── APIError (status, body)
│ ├── AuthenticationError (401)
│ ├── RateLimitError (429)
│ └── ServerError (5xx)
└── QueryError (errors[])
└── NotFoundError
Tipos de TypeScript
import type {
BibleQLConfig,
Book,
Chapter,
Language,
LocalizedBook,
Passage,
SearchResult,
SemanticSearchResult,
Translation,
Verse,
} from "bibleql-js";
No cubierto por el paquete
concordance y concordanceIndex todavía no tienen métodos. Usa los documentos GraphQL de
Concordancia con fetch o cualquier cliente HTTP.