ZenStackは、Webアプリのバックエンドの開発を簡素化するNode.js/TypeScript Toolkitです。柔軟な承認レイヤーと自動生成されたタイプセーフAPI/フックでPrisma ORMを強化し、フルスタック開発の可能性を最大限に引き出します。
私たちの目標は、ボイラープレートコードの作成時間を節約し、リアル機能の構築に集中できるようにすることです。
で完全なドキュメントを読む? Zenstack.Dev。フィードバックと質問のためにDiscordに参加してください。
Zenstackは、次の4つの層でPrismaの力を徐々に拡張します。
Zenstackは、Prismaスキーマ言語のスーパーセットである「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に参加することをheしないでください。ドキュメントは別のレポで存在します:Zenstack-Docs。
また、開発をスピードアップするために、私たちの作業のスポンサーも検討してください。貢献は、コミュニティメンバーがバグの修正、機能の追加、ドキュメントの改善を支援することを奨励するために、賞金報酬として100%使用されます。
寛大なサポートをありがとう!
マーブリズム | 人魚チャート | Coderabbit | ヨハン・ローン |
ベンジャミン・ゼシロビッチ | ウルリック | ファビアンジョックス |
Zenstackをより良くするのを手伝ってくれたすべての貢献者に感謝します!
mit