Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 13 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,18 +90,26 @@ async function getPosts(userId: string) {
Server adapter packages help you wrap an access-control-enabled Prisma client into backend CRUD APIs that can be safely called from the frontend. Here's an example for Next.js:

```ts
// pages/api/model/[...path].ts
// /src/app/api/model/[...path]/route.ts

import { requestHandler } from '@zenstackhq/next';
import { NextRequestHandler } from '@zenstackhq/server/next';
import type { NextRequest } from 'next/server';
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) }),
});

function getPrisma(req: NextRequest) {
// getSessionUser extracts the current session user from the request, its
// implementation depends on your auth solution
return enhance(prisma, { user: getSessionUser(req) });
}

const handler = NextRequestHandler({ getPrisma, useAppDir: true });

export { handler as GET, handler as POST, handler as PUT, handler as PATCH, handler as DELETE };
```

### 4. Generated client libraries (hooks) for data access
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "zenstack-monorepo",
"version": "2.17.1",
"version": "2.17.2",
"description": "",
"scripts": {
"build": "pnpm -r --filter=\"!./packages/ide/*\" build",
Expand Down
2 changes: 1 addition & 1 deletion packages/ide/jetbrains/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ plugins {
}

group = "dev.zenstack"
version = "2.17.1"
version = "2.17.2"

repositories {
mavenCentral()
Expand Down
2 changes: 1 addition & 1 deletion packages/ide/jetbrains/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "jetbrains",
"version": "2.17.1",
"version": "2.17.2",
"displayName": "ZenStack JetBrains IDE Plugin",
"description": "ZenStack JetBrains IDE plugin",
"homepage": "https://zenstack.dev",
Expand Down
2 changes: 1 addition & 1 deletion packages/language/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@zenstackhq/language",
"version": "2.17.1",
"version": "2.17.2",
"displayName": "ZenStack modeling language compiler",
"description": "ZenStack modeling language compiler",
"homepage": "https://zenstack.dev",
Expand Down
2 changes: 1 addition & 1 deletion packages/misc/redwood/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@zenstackhq/redwood",
"displayName": "ZenStack RedwoodJS Integration",
"version": "2.17.1",
"version": "2.17.2",
"description": "CLI and runtime for integrating ZenStack with RedwoodJS projects.",
"repository": {
"type": "git",
Expand Down
2 changes: 1 addition & 1 deletion packages/plugins/openapi/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@zenstackhq/openapi",
"displayName": "ZenStack Plugin and Runtime for OpenAPI",
"version": "2.17.1",
"version": "2.17.2",
"description": "ZenStack plugin and runtime supporting OpenAPI",
"main": "index.js",
"repository": {
Expand Down
2 changes: 1 addition & 1 deletion packages/plugins/swr/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@zenstackhq/swr",
"displayName": "ZenStack plugin for generating SWR hooks",
"version": "2.17.1",
"version": "2.17.2",
"description": "ZenStack plugin for generating SWR hooks",
"main": "index.js",
"repository": {
Expand Down
2 changes: 1 addition & 1 deletion packages/plugins/tanstack-query/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@zenstackhq/tanstack-query",
"displayName": "ZenStack plugin for generating tanstack-query hooks",
"version": "2.17.1",
"version": "2.17.2",
"description": "ZenStack plugin for generating tanstack-query hooks",
"main": "index.js",
"exports": {
Expand Down
2 changes: 1 addition & 1 deletion packages/plugins/trpc/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@zenstackhq/trpc",
"displayName": "ZenStack plugin for tRPC",
"version": "2.17.1",
"version": "2.17.2",
"description": "ZenStack plugin for tRPC",
"main": "index.js",
"repository": {
Expand Down
2 changes: 1 addition & 1 deletion packages/runtime/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@zenstackhq/runtime",
"displayName": "ZenStack Runtime Library",
"version": "2.17.1",
"version": "2.17.2",
"description": "Runtime of ZenStack for both client-side and server-side environments.",
"repository": {
"type": "git",
Expand Down
2 changes: 1 addition & 1 deletion packages/schema/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"publisher": "zenstack",
"displayName": "ZenStack Language Tools",
"description": "FullStack enhancement for Prisma ORM: seamless integration from database to UI",
"version": "2.17.1",
"version": "2.17.2",
"author": {
"name": "ZenStack Team"
},
Expand Down
49 changes: 48 additions & 1 deletion packages/schema/src/plugins/enhancer/enhance/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { DELEGATE_AUX_RELATION_PREFIX } from '@zenstackhq/runtime';
import { upperCaseFirst } from '@zenstackhq/runtime/local-helpers';
import { invariant, upperCaseFirst } from '@zenstackhq/runtime/local-helpers';
import {
PluginError,
getAttribute,
Expand Down Expand Up @@ -569,6 +569,32 @@ export type Enhanced<Client> =
private async processClientTypesNewPrismaGenerator(prismaClientDir: string, delegateInfo: DelegateInfo) {
const project = new Project();

// remove delegate_aux_* fields from the prismaNamespace.ts
const internalFilename = `${prismaClientDir}/internal/prismaNamespace.ts`
const internalFilenameFixed = `${prismaClientDir}/internal/prismaNamespace-fixed.ts`
const internalSf = project.addSourceFileAtPath(internalFilename);
const syntaxList = internalSf.getChildren()[0];
if (!Node.isSyntaxList(syntaxList)) {
throw new PluginError(name, `Unexpected syntax list structure in ${internalFilename}`);
}
const statements: (string | StatementStructures)[] = [];

syntaxList.getChildren().forEach((node) => {
if (Node.isVariableStatement(node)) {
statements.push(this.transformVariableStatementProps(node));
} else {
statements.push(node.getText());
}
});
const structure = internalSf.getStructure();
structure.statements = statements;

const internalSfNew = project.createSourceFile(internalFilenameFixed, structure, {
overwrite: true,
});
await internalSfNew.save();
fs.renameSync(internalFilenameFixed, internalFilename);

// Create a shared file for all JSON fields type definitions
const jsonFieldsFile = project.createSourceFile(path.join(this.outDir, 'json-types.ts'), undefined, {
overwrite: true,
Expand Down Expand Up @@ -727,6 +753,27 @@ export type Enhanced<Client> =
return structure;
}

private transformVariableStatementProps(variable: VariableStatement) {
const structure = variable.getStructure();

// remove `delegate_aux_*` fields from the variable's initializer
const auxFields = this.findAuxProps(variable);
if (auxFields.length > 0) {
structure.declarations.forEach((variable) => {
if (variable.initializer) {
let source = variable.initializer;
auxFields.forEach((f) => {
invariant(typeof source === 'string');
source = this.removeFromSource(source, f.getText());
});
variable.initializer = source;
}
});
}

return structure;
}

private transformInterface(iface: InterfaceDeclaration, delegateInfo: DelegateInfo) {
const structure = iface.getStructure();

Expand Down
2 changes: 1 addition & 1 deletion packages/sdk/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@zenstackhq/sdk",
"version": "2.17.1",
"version": "2.17.2",
"description": "ZenStack plugin development SDK",
"main": "index.js",
"scripts": {
Expand Down
2 changes: 1 addition & 1 deletion packages/server/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@zenstackhq/server",
"version": "2.17.1",
"version": "2.17.2",
"displayName": "ZenStack Server-side Adapters",
"description": "ZenStack server-side adapters",
"homepage": "https://zenstack.dev",
Expand Down
2 changes: 1 addition & 1 deletion packages/testtools/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@zenstackhq/testtools",
"version": "2.17.1",
"version": "2.17.2",
"description": "ZenStack Test Tools",
"main": "index.js",
"private": true,
Expand Down
Loading