Loading...
Loading...
Upgrade an existing ZenStack V2 project to V3. Use when renaming V2 packages (zenstack, @zenstackhq/runtime), moving access control to the policy plugin, converting future() to post-update/before(), replacing abstract models with types+mixins, updating server adapters (getPrisma → getClient), and migrating client-side TanStack Query hooks.
npx skill4agent add zenstackhq/skills zenstack-migrate-from-v2zenstack-project-setupzenstack-migrate-from-prismazenstack/schema.zmodelZenStackClientnpm uninstall zenstack @zenstackhq/runtime
npm install @zenstackhq/schema @zenstackhq/orm
npm install --save-dev @zenstackhq/cli| V2 | V3 |
|---|---|
| |
| |
| — | |
zenstack <cmd>zen <cmd>zen generateenhance(prisma)npm install @zenstackhq/plugin-policyplugin policy {
provider = '@zenstackhq/plugin-policy'
}import { ZenStackClient } from '@zenstackhq/orm';
import { PolicyPlugin } from '@zenstackhq/plugin-policy';
export const db = new ZenStackClient(schema, { dialect });
export const authDb = db.$use(new PolicyPlugin()); // was: enhance(prisma, { user })
// per request:
const userDb = authDb.$setAuth(user); // was: passing { user } to enhance()zenstack-access-controlfuture()post-updatebefore()future()updatepost-updatebefore()// V2
@@deny('update', future().ownerId != ownerId)
// V3
@@deny('post-update', ownerId != before().ownerId)abstract modelextendstypewithzenstack-schema-modeling// V2
abstract model Timestamped {
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Post extends Timestamped { title String }
// V3
type Timestamped {
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
model Post with Timestamped { title String }extends@@delegateapiHandlerRPCApiHandlerRestApiHandlergetPrismagetClient// V2
ZenStackMiddleware({ getPrisma: (req) => enhance(prisma, { user: getUser(req) }) });
// V3
ZenStackMiddleware({
apiHandler: new RPCApiHandler({ schema }),
getClient: (req) => authDb.$setAuth(getUser(req)),
});zenstack-crud-server// V2
import { useFindManyUser } from '~/hooks';
const { data } = useFindManyUser({ where: { ... } });
// V3
import { useClientQueries } from '@zenstackhq/tanstack-query/react';
import { schema } from '~/zenstack/schema';
const client = useClientQueries(schema);
const { data } = client.user.useFindMany({ where: { ... } });zenstack-crud-serverapiHandler.generateSpec()zenstack-crud-serverzen generate$use(new PolicyPlugin())$setAuth()enhance()references/