ZenStack es un kit de herramientas Node.js/TypeScript que simplifica el desarrollo del backend de una aplicación web. Mejora el prisma ORM con una capa de autorización flexible y API/ganchos de tipo auto generado, desbloqueando todo su potencial para el desarrollo de la pila completa.
¡Nuestro objetivo es permitirle ahorrar tiempo escribiendo el código de horario y centrarse en construir características reales!
Leer la documentación completa en? Zenstack.dev. Únase a Discord para comentarios y preguntas.
Zenstack extiende incrementalmente el poder de Prisma con las siguientes cuatro capas:
Zenstack presenta un lenguaje de modelado de datos llamado "ZModel", un superconjunto de lenguaje de esquema de Prisma. Extendió el esquema de prisma con atributos y funciones personalizados y, en base a eso, implementó una capa de control de acceso flexible en torno al prisma.
// base.zmodel
abstract model Base {
id String @ id
author User @ relation ( fields : [ authorId ] , references : [ id ] )
authorId String
// ? allow full CRUD by author
@@ allow ( 'all' , author == auth ( ) )
} // schema.zmodel
import "base"
model Post extends Base {
title String
published Boolean @ default ( false )
// ? allow logged-in users to read published posts
@@ allow ( 'read' , auth ( ) != null && published )
} La CLI zenstack transpila el ZModel en un esquema PRISMA estándar, que puede usar con los flujos de trabajo de Prisma regulares.
En tiempo de ejecución, los proxies transparentes se crean en torno a los clientes de Prisma para interceptar consultas y mutaciones para hacer cumplir las políticas de acceso.
import { enhance } from '@zenstackhq/runtime' ;
// a regular Prisma client
const prisma = new PrismaClient ( ) ;
async function getPosts ( userId : string ) {
// create an enhanced Prisma client that has access control enabled
const enhanced = enhance ( prisma , { user : userId } ) ;
// only posts that're visible to the user will be returned
return enhanced . post . findMany ( ) ;
}Los paquetes de adaptador del servidor lo ayudan a envolver un cliente Prisma habilitado para controlar acceso a las API de backend crud que se pueden llamar de forma segura desde el interfaz. Aquí hay un ejemplo para Next.js:
// pages/api/model/[...path].ts
import { requestHandler } from '@zenstackhq/next' ;
import { enhance } from '@zenstackhq/runtime' ;
import { getSessionUser } from '@lib/auth' ;
import { prisma } from '@lib/db' ;
// Mount Prisma-style APIs: "/api/model/post/findMany", "/api/model/post/create", etc.
// Can be configured to provide standard RESTful APIs (using JSON:API) instead.
export default requestHandler ( {
getPrisma : ( req , res ) => enhance ( prisma , { user : getSessionUser ( req , res ) } ) ,
} ) ;Los complementos pueden generar bibliotecas de clientes de tipo fuerte que hablan con las API antes mencionadas. Aquí hay un ejemplo para React:
// components/MyPosts.tsx
import { useFindManyPost } from '@lib/hooks' ;
const MyPosts = ( ) => {
// list all posts that're visible to the current user, together with their authors
const { data : posts } = useFindManyPost ( {
include : { author : true } ,
orderBy : { createdAt : 'desc' } ,
} ) ;
return (
< ul >
{ posts ?. map ( ( post ) => (
< li key = { post . id } >
{ post . title } by { post . author . name }
</ li >
) ) }
</ ul >
) ;
} ; El siguiente diagrama ofrece una descripción de arquitectura de alto nivel de Zenstack.
El repositorio de la muestra incluye los siguientes patrones:
Puede usar esta publicación de blog como introducción.
Echa un vistazo a la aplicación TODO de múltiples inquilinos para obtener un ejemplo en ejecución. Puede encontrar diferentes implementaciones a continuación:
¡Únase a nuestro servidor Discord para chat y actualizaciones!
Si te gusta Zenstack, ¡únete a nosotros para que sea una herramienta mejor! Utilice la guía de contribución para obtener detalles sobre cómo comenzar, y no dude en unirse a Discord para compartir sus pensamientos. Las documentos residen en un repositorio separado: Zenstack-Docs.
Considere también patrocinar nuestro trabajo para acelerar el desarrollo. Su contribución se utilizará al 100% como recompensa de la recompensa para alentar a los miembros de la comunidad a ayudar a arreglar errores, agregar características y mejorar la documentación.
¡Gracias por su generoso apoyo!
Marblismo | Gráfico de sirena | Moderno | Johann Rohn |
Benjamin Zecirovic | Ulric | Jocks de Fabian |
¡Gracias a todos los contribuyentes que han ayudado a mejorar a Zenstack!
MIT