npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@javalabs/prisma-client

v1.0.31

Published

Shared Prisma client for Tupay microservices

Downloads

208

Readme

@javalabs/prisma-client

Cliente Prisma compartido para los microservicios de Tupay. Este paquete proporciona una capa de abstracción sobre Prisma ORM con soporte para multi-tenancy (usando esquemas de base de datos separados por tenant) y utilidades de migración y gestión de base de datos.

Instalación

npm i @javalabs/prisma-client

Características

  • Cliente Prisma Singleton: Implementación eficiente del cliente Prisma () para el esquema public.
  • Soporte Multi-tenant: Conexión a diferentes esquemas de base de datos para diferentes inquilinos a través de . Los tenants suelen identificarse por su API Key, que se usa como nombre del esquema.
  • Integración con NestJS: Módulo global () para facilitar la inyección en aplicaciones NestJS.
  • Utilidades de Migración: Scripts para migración de esquemas y datos entre entornos.
  • Herramientas de Gestión de BD: Scripts para crear esquemas de tenants, sincronizar estructuras, resetear bases de datos y corregir tipos de datos.

Diagramas

Arquitectura Multi-tenant

graph TD
    A[Aplicación] --> B(PrismaFactoryService);
    B -- Obtener cliente para Tenant X --> C{Cliente Prisma - Tenant X};
    B -- Obtener cliente para Tenant Y --> D{Cliente Prisma - Tenant Y};
    C --> E[(Base de Datos - Schema Tenant X)];
    D --> F[(Base de Datos - Schema Tenant Y)];
    A --> G(PrismaService);
    G -- Cliente por defecto --> H{Cliente Prisma - Public};
    H --> I[(Base de Datos - Schema Public)];

Flujo de Migración de Datos

sequenceDiagram
    participant S as Base de Datos Origen (SOURCE_DATABASE_URL)
    participant M as Script de Migración (`migrate:data`)
    participant T as Base de Datos Destino (DATABASE_URL - Tenants)

    M->>S: Consulta datos de origen
    S-->>M: Retorna datos
    M->>M: Procesa y transforma datos (considerando dependencias)
    M->>T: Migra datos a esquemas de tenants en destino
    T-->>M: Confirma migración

    Note over M: Ordenamiento por dependencias (ForeignKeyManager)
    Note over M: Manejo de tipos de datos
    Note over M: Migración por fases (si aplica)

Estructura del Proyecto

graph LR
    A[@javalabs/prisma-client] --> B[src];
    A --> C[prisma];
    B --> D[scripts];
    B --> E[index.ts];
    B --> F[prisma.module.ts];
    B --> G[prisma.service.ts];
    B --> H[prisma-factory.service.ts];
    D --> I[data-migration];
    D --> J[reset-database.ts];
    D --> K[schema-sync.ts];
    D --> L[create-tenant-schemas.ts];
    D --> M[migrate-schema-structure.ts];
    D --> N[fix-data-types.ts];
    I --> O[dependency-manager.ts];
    I --> P[schema-utils.ts];
    I --> Q[migration-phases.ts];

Uso Básico

En aplicaciones NestJS

Importa el PrismaModule en tu módulo principal:

import { Module } from "@nestjs/common";
import { PrismaModule } from "@javalabs/prisma-client"; // <--- Updated import path

@Module({
  imports: [PrismaModule],
})
export class AppModule {}

Luego, inyecta los servicios donde los necesites:

import { Injectable } from "@nestjs/common";
import { PrismaService, PrismaFactoryService } from "@javalabs/prisma-client"; // <--- Updated import path

@Injectable()
export class MyService {
  constructor(
    private prismaService: PrismaService, // Cliente para el schema 'public'
    private prismaFactoryService: PrismaFactoryService // Fábrica para clientes de tenants
  ) {}

  // Usar el cliente principal (schema public)
  async findAllPublicData() {
    // Asume que tienes un modelo 'PublicData' en tu schema.prisma
    // return this.prismaService.client.publicData.findMany();
    return "Ejemplo: Accediendo a datos públicos";
  }

  // Usar un cliente específico para un tenant
  async findTenantUsers(tenantId: string) {
    // tenantId suele ser la API Key que identifica al schema
    const tenantClient = this.prismaFactoryService.getClient(tenantId);
    // Asume que tienes un modelo 'users' en tu schema.prisma
    return tenantClient.users.findMany();
  }
}

En aplicaciones no-NestJS (o scripts)

Puedes importar directamente la instancia prisma (cliente para el schema public). Para acceder a tenants, necesitarías instanciar PrismaFactoryService manualmente o usar los scripts proporcionados.

import { prisma } from "@javalabs/prisma-client"; // <--- Updated import path

async function main() {
  // Ejemplo: Acceder a datos del schema 'public'
  // const publicData = await prisma.publicData.findMany();
  // console.log(publicData);
  console.log("Ejemplo: Accediendo a datos públicos desde script");
}

main()
  .catch(console.error)
  .finally(async () => {
      await prisma.$disconnect();
  });

Scripts de Utilidad

Estos scripts se ejecutan generalmente con npm run <script_name> o node dist/scripts/<script_file>.js después de compilar (npm run build).

Migración de Datos

Migra datos desde SOURCE_DATABASE_URL a los esquemas de tenants en DATABASE_URL.

# Migrar datos (requiere confirmación)
npm run migrate:data

# Migrar datos forzando la operación (sin confirmación)
npm run migrate:data:force

# Migrar datos con confirmación automática 'yes'
npm run migrate:data:yes

Gestión de Esquemas (Prisma Migrate)

Gestiona la evolución del esquema de la base de datos usando Prisma Migrate. Estos comandos aplican los cambios definidos en prisma/migrations al schema public. Para aplicar a tenants, ver "Scripts Avanzados".

# Generar cliente Prisma basado en schema.prisma
npm run generate

# Crear una nueva migración SQL basada en cambios al schema.prisma (desarrollo)
npm run migrate:dev

# Aplicar migraciones pendientes a la base de datos (producción/despliegue)
npm run migrate:deploy

Scripts Avanzados

Scripts para tareas más complejas de administración multi-tenant. Ejecutar con node dist/scripts/<script_file>.js después de npm run build.

Creación de Esquemas para Tenants

Crea los esquemas de base de datos para cada tenant (basado en API Keys encontradas en SOURCE_DATABASE_URL).

# Compilar el proyecto si no está compilado
npm run build

# Ejecutar el script para crear esquemas de tenant
node dist/scripts/create-tenant-schemas.js

Migración de Estructura de Esquemas (Tenants)

Aplica la estructura definida en prisma/schema.prisma a todos los esquemas de tenants existentes en DATABASE_URL usando prisma db push. Útil para asegurar que todos los tenants tengan la misma estructura base.

# Compilar el proyecto si no está compilado
npm run build

# Ejecutar el script para aplicar la estructura a los schemas de tenants
node dist/scripts/migrate-schema-structure.js

Sincronización de Esquemas

Genera un script SQL para sincronizar esquemas (potencialmente entre public y tenants, o entre tenants). Revisa el script antes de aplicarlo.

# Compilar el proyecto si no está compilado
npm run build

# Generar el script SQL de sincronización
node dist/scripts/schema-sync.js

Reseteo de Base de Datos

Resetea la base de datos (¡CUIDADO: Borra datos!).

# Compilar el proyecto si no está compilado
npm run build

# Resetear la base de datos (schema public y potencialmente tenants, revisar script)
node dist/scripts/reset-database.js

# Resetear y recrear la base de datos
node dist/scripts/reset-database.js --recreate

Corrección de Tipos de Datos

Intenta corregir inconsistencias en tipos de datos (ej. numéricos almacenados como texto, valores de enums inválidos) en los esquemas de los tenants.

# Compilar el proyecto si no está compilado
npm run build

# Ejecutar el script para corregir tipos de datos
node dist/scripts/fix-data-types.js

Variables de Entorno

El paquete y sus scripts dependen de las siguientes variables de entorno (generalmente definidas en un archivo .env):

  • DATABASE_URL: URL de conexión a la base de datos principal (PostgreSQL) donde residen los esquemas public y de los tenants.
    • Ejemplo: postgresql://user:password@host:port/database
  • SOURCE_DATABASE_URL: URL de conexión a la base de datos de origen, utilizada principalmente por los scripts de migración de datos y creación de esquemas.
    • Ejemplo: postgresql://user:password@source_host:port/source_database

Desarrollo

# Instalar dependencias
npm install

# Compilar el proyecto (genera archivos en dist/)
npm run build

# Generar cliente Prisma (después de cambios en schema.prisma)
npm run generate

Licencia

ISC