Zenstack은 웹 앱의 백엔드 개발을 단순화하는 node.js/typescript 툴킷입니다. 유연한 인증 계층과 자동 생성 된 유형-안전 API/후크로 Prisma ORM을 향상시켜 전체 스택 개발 가능성을 최대한 발휘할 수 있습니다.
우리의 목표는 보일러 플레이트 코드 작성에 시간을 절약하고 실제 기능을 구축하는 데 집중할 수 있도록하는 것입니다!
전체 문서를 읽으시겠습니까? Zenstack.dev. 피드백과 질문에 대한 불화에 가입하십시오.
Zenstack은 다음 4 개의 레이어로 Prisma의 힘을 점진적으로 확장합니다.
Zenstack은 Prisma Schema 언어의 슈퍼 세트 인 "zmodel"이라는 데이터 모델링 언어를 소개합니다. 사용자 지정 속성 및 기능으로 Prisma 스키마를 확장했으며이를 기반으로 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 )
} zenstack CLI는 Zmodel을 표준 Prisma 스키마로 전환하여 일반 Prisma 워크 플로우와 함께 사용할 수 있습니다.
런타임에 액세스 정책을 시행하기 위해 쿼리와 돌연변이를 가로 채기 위해 Prisma 클라이언트 주변에서 투명한 프록시가 생성됩니다.
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 ( ) ;
}서버 어댑터 패키지를 사용하면 액세스 제어 지원 PRISMA 클라이언트를 프론트 엔드에서 안전하게 호출 할 수있는 CRUD API로 래핑 할 수 있습니다. 다음은 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 ) } ) ,
} ) ;플러그인은 위에서 언급 한 API와 대화하는 강력한 클라이언트 라이브러리를 생성 할 수 있습니다. 다음은 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 >
) ;
} ; 다음 다이어그램은 Zenstack의 높은 수준의 아키텍처 개요를 제공합니다.
샘플 리포에는 다음 패턴이 포함됩니다.
이 블로그 게시물을 소개로 사용할 수 있습니다.
실행중인 예제는 멀티 테넌트 TODO 앱을 확인하십시오. 아래에서 다른 구현을 찾을 수 있습니다.
채팅 및 업데이트를 위해 Discord 서버에 가입하십시오!
Zenstack을 좋아한다면 우리와 함께 더 나은 도구가 되십시오! 시작 방법에 대한 자세한 내용은 기고 가이드를 사용하고 주저하지 말고 Discord에 참여하여 생각을 공유하십시오. 문서는 별도의 리포지어에 있습니다 : Zenstack-Docs.
또한 개발 속도를 높이기 위해 우리의 작업을 후원하는 것을 고려하십시오. 귀하의 기부금은 100%가 현상금 보상으로 사용하여 커뮤니티 회원이 버그를 수정하고 기능을 추가하며 문서화를 개선하도록 장려합니다.
당신의 관대 한 지원에 감사드립니다!
마블 리즘 | 인어 차트 | CoderAbbit | 요한 로른 |
벤자민 제시로 비치 | ulric | 파비안 농담 |
Zenstack을 개선하는 데 도움을 준 모든 기고자들에게 감사합니다!
MIT