Zenstack é um kit de ferramentas Node.js/TypeScript que simplifica o desenvolvimento do back -end de um aplicativo da web. Ele aprimora o Prisma ORM com uma camada de autorização flexível e APIs/ganchos gerados automaticamente e seguros de tipo, desbloqueando todo o seu potencial para o desenvolvimento de pilha completa.
Nosso objetivo é deixar você economizar tempo escrevendo código de caldeira e focar na criação de recursos reais!
Leia a documentação completa em? zenstack.dev. Junte -se à discórdia para obter feedback e perguntas.
Zenstack estende de forma incremental o poder de Prisma com as quatro camadas a seguir:
Zenstack apresenta uma linguagem de modelagem de dados chamada "Zmodel" - um superconjunto da linguagem do esquema PRISMA. Ele estendeu o esquema do PRISMA com atributos e funções personalizadas e, com base nisso, implementou uma camada flexível de controle de acesso ao redor do 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 )
} O zenstack CLI transpila o Zmodel em um esquema PRISMA padrão, que você pode usar com os fluxos de trabalho regulares do PRISMA.
Em tempo de execução, proxies transparentes são criados em torno dos clientes do Prisma para interceptar consultas e mutações para aplicar políticas de acesso.
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 ( ) ;
}Os pacotes de adaptadores de servidor ajudam a envolver um cliente PRISMA habilitado para controle de acesso às APIs CRUD de back-end que podem ser chamadas com segurança no front-end. Aqui está um exemplo 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 ) } ) ,
} ) ;Os plug-ins podem gerar bibliotecas de clientes fortes que conversam com as APIs acima mencionadas. Aqui está um exemplo para reagir:
// 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 >
) ;
} ; O diagrama a seguir fornece uma visão geral de arquitetura de alto nível do Zenstack.
O repositório de amostra inclui os seguintes padrões:
Você pode usar esta postagem do blog como uma introdução.
Confira o aplicativo TODO de vários inquilinos para obter um exemplo em execução. Você pode encontrar implementações diferentes abaixo:
Junte -se ao nosso servidor Discord para bate -papo e atualizações!
Se você gosta de Zenstack, junte -se a nós para torná -lo uma ferramenta melhor! Use o guia contribuinte para obter detalhes sobre como começar e não hesite em se juntar à Discord para compartilhar seus pensamentos. As documentações residem em um repo separado: Zenstack-Docs.
Considere também patrocinar nosso trabalho para acelerar o desenvolvimento. Sua contribuição será 100% usada como recompensa de recompensa para incentivar os membros da comunidade a ajudar a corrigir bugs, adicionar recursos e melhorar a documentação.
Obrigado pelo seu apoio generoso!
Marblismo | Gráfico de sereia | Coderabbit | Johann Rohn |
Benjamin Zecirovic | Ulric | Fabian Jocks |
Obrigado a todos os colaboradores que ajudaram a melhorar o Zenstack!
Mit