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
4 changes: 4 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,10 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
- Kysely query builder as escape hatch instead of raw SQL
- Schema-first approach with ZModel DSL extension of Prisma schema language

## Pull Requests

- Always target the `dev` branch (not `main`) when creating PRs

## Development Notes

- Always run `zenstack generate` after modifying ZModel schemas
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-v3",
"version": "3.4.2",
"version": "3.4.3",
"description": "ZenStack",
"packageManager": "pnpm@10.23.0",
"type": "module",
Expand Down
2 changes: 1 addition & 1 deletion packages/auth-adapters/better-auth/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@zenstackhq/better-auth",
"version": "3.4.2",
"version": "3.4.3",
"description": "ZenStack Better Auth Adapter. This adapter is modified from better-auth's Prisma adapter.",
"type": "module",
"scripts": {
Expand Down
2 changes: 1 addition & 1 deletion packages/cli/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"publisher": "zenstack",
"displayName": "ZenStack CLI",
"description": "FullStack database toolkit with built-in access control and automatic API generation.",
"version": "3.4.2",
"version": "3.4.3",
"type": "module",
"author": {
"name": "ZenStack Team"
Expand Down
1 change: 1 addition & 0 deletions packages/cli/src/actions/init.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import { STARTER_ZMODEL } from './templates';
export async function run(projectPath: string) {
const packages = [
{ name: '@zenstackhq/cli@latest', dev: true },
{ name: '@zenstackhq/schema@latest', dev: false },
{ name: '@zenstackhq/orm@latest', dev: false },
];
let pm = await detect();
Expand Down
5 changes: 3 additions & 2 deletions packages/cli/src/actions/pull/provider/sqlite.ts
Original file line number Diff line number Diff line change
Expand Up @@ -134,10 +134,11 @@ export const sqlite: IntrospectionProvider = {

// List user tables and views from sqlite_schema (the master catalog).
// sqlite_schema contains one row per table, view, index, and trigger.
// We filter to only tables/views and exclude internal sqlite_* objects.
// We filter to only tables/views and exclude internal sqlite_* objects
// and the Prisma migration tracking table.
// The 'sql' column contains the original CREATE TABLE/VIEW statement.
const tablesRaw = all<{ name: string; type: 'table' | 'view'; definition: string | null }>(
"SELECT name, type, sql AS definition FROM sqlite_schema WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%' ORDER BY name",
"SELECT name, type, sql AS definition FROM sqlite_schema WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%' AND name <> '_prisma_migrations' ORDER BY name",
);

// Detect AUTOINCREMENT by parsing the CREATE TABLE statement
Expand Down
2 changes: 1 addition & 1 deletion packages/clients/client-helpers/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@zenstackhq/client-helpers",
"version": "3.4.2",
"version": "3.4.3",
"description": "Helpers for implementing clients that consume ZenStack's CRUD service",
"type": "module",
"scripts": {
Expand Down
2 changes: 1 addition & 1 deletion packages/clients/tanstack-query/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@zenstackhq/tanstack-query",
"version": "3.4.2",
"version": "3.4.3",
"description": "TanStack Query Client for consuming ZenStack v3's CRUD service",
"type": "module",
"scripts": {
Expand Down
2 changes: 1 addition & 1 deletion packages/common-helpers/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@zenstackhq/common-helpers",
"version": "3.4.2",
"version": "3.4.3",
"description": "ZenStack Common Helpers",
"type": "module",
"scripts": {
Expand Down
2 changes: 1 addition & 1 deletion packages/config/eslint-config/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@zenstackhq/eslint-config",
"version": "3.4.2",
"version": "3.4.3",
"type": "module",
"private": true,
"license": "MIT"
Expand Down
2 changes: 1 addition & 1 deletion packages/config/typescript-config/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@zenstackhq/typescript-config",
"version": "3.4.2",
"version": "3.4.3",
"private": true,
"license": "MIT"
}
2 changes: 1 addition & 1 deletion packages/config/vitest-config/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@zenstackhq/vitest-config",
"type": "module",
"version": "3.4.2",
"version": "3.4.3",
"private": true,
"license": "MIT",
"exports": {
Expand Down
2 changes: 1 addition & 1 deletion packages/create-zenstack/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "create-zenstack",
"version": "3.4.2",
"version": "3.4.3",
"description": "Create a new ZenStack project",
"type": "module",
"scripts": {
Expand Down
1 change: 1 addition & 0 deletions packages/create-zenstack/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ function initProject(name: string) {
// install packages
const packages = [
{ name: '@zenstackhq/cli@latest', dev: true },
{ name: '@zenstackhq/schema@latest', dev: false },
{ name: '@zenstackhq/orm@latest', dev: false },
{ name: 'better-sqlite3', dev: false },
{ name: '@types/better-sqlite3', dev: true },
Expand Down
2 changes: 1 addition & 1 deletion packages/ide/vscode/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "zenstack-v3",
"publisher": "zenstack",
"version": "3.4.2",
"version": "3.4.3",
"displayName": "ZenStack V3 Language Tools",
"description": "VSCode extension for ZenStack (v3) ZModel language",
"private": true,
Expand Down
2 changes: 1 addition & 1 deletion packages/language/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@zenstackhq/language",
"description": "ZenStack ZModel language specification",
"version": "3.4.2",
"version": "3.4.3",
"license": "MIT",
"author": "ZenStack Team",
"files": [
Expand Down
2 changes: 1 addition & 1 deletion packages/orm/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@zenstackhq/orm",
"version": "3.4.2",
"version": "3.4.3",
"description": "ZenStack ORM",
"type": "module",
"scripts": {
Expand Down
2 changes: 1 addition & 1 deletion packages/plugins/policy/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@zenstackhq/plugin-policy",
"version": "3.4.2",
"version": "3.4.3",
"description": "ZenStack Policy Plugin",
"type": "module",
"scripts": {
Expand Down
6 changes: 5 additions & 1 deletion packages/schema/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@zenstackhq/schema",
"version": "3.4.2",
"version": "3.4.3",
"description": "ZenStack Runtime Schema",
"type": "module",
"scripts": {
Expand All @@ -27,6 +27,10 @@
"types": "./dist/index.d.cts",
"default": "./dist/index.cjs"
}
},
"./package.json": {
"import": "./package.json",
"require": "./package.json"
}
},
"dependencies": {
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": "3.4.2",
"version": "3.4.3",
"description": "ZenStack SDK",
"type": "module",
"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": "3.4.2",
"version": "3.4.3",
"description": "ZenStack automatic CRUD API handlers and server adapters",
"type": "module",
"scripts": {
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": "3.4.2",
"version": "3.4.3",
"description": "ZenStack Test Tools",
"type": "module",
"scripts": {
Expand Down
2 changes: 1 addition & 1 deletion packages/zod/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@zenstackhq/zod",
"version": "3.4.2",
"version": "3.4.3",
"description": "ZenStack Zod integration",
"type": "module",
"scripts": {
Expand Down
8 changes: 4 additions & 4 deletions packages/zod/src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,11 @@ export function addStringValidation(
for (const attr of attributes) {
switch (attr.name) {
case '@length': {
const min = getArgValue<number>(attr.args?.[0]?.value);
const min = getArgValue<number>(attr.args?.find((a) => a.name === 'min')?.value);
if (min !== undefined) {
result = result.min(min);
}
const max = getArgValue<number>(attr.args?.[1]?.value);
const max = getArgValue<number>(attr.args?.find((a) => a.name === 'max')?.value);
if (max !== undefined) {
result = result.max(max);
}
Expand Down Expand Up @@ -248,11 +248,11 @@ export function addListValidation(
let result = schema;
for (const attr of attributes) {
if (attr.name === '@length') {
const min = getArgValue<number>(attr.args?.[0]?.value);
const min = getArgValue<number>(attr.args?.find((a) => a.name === 'min')?.value);
if (min !== undefined) {
result = result.min(min);
}
const max = getArgValue<number>(attr.args?.[1]?.value);
const max = getArgValue<number>(attr.args?.find((a) => a.name === 'max')?.value);
if (max !== undefined) {
result = result.max(max);
}
Expand Down
2 changes: 1 addition & 1 deletion samples/orm/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "sample-orm",
"version": "3.4.2",
"version": "3.4.3",
"description": "",
"main": "index.js",
"private": true,
Expand Down
2 changes: 1 addition & 1 deletion tests/e2e/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "e2e",
"version": "3.4.2",
"version": "3.4.3",
"private": true,
"type": "module",
"scripts": {
Expand Down
2 changes: 1 addition & 1 deletion tests/regression/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "regression",
"version": "3.4.2",
"version": "3.4.3",
"private": true,
"type": "module",
"scripts": {
Expand Down
43 changes: 43 additions & 0 deletions tests/regression/test/issue-2433.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import { createTestClient } from '@zenstackhq/testtools';
import { describe, expect, it } from 'vitest';

// https://github.com/zenstackhq/zenstack/issues/2433
describe('Regression for issue 2433', () => {
it('should accept short string when only @length(max: N) is specified', async () => {
const db = await createTestClient(
`
model Post {
id String @id @default(cuid())
content String @length(max: 10000)
}
`,
);
// Should succeed: short content is within max limit
await expect(db.post.create({ data: { content: 'hello' } })).resolves.toMatchObject({
content: 'hello',
});
// Should fail validation: content exceeds max
await expect(
db.post.create({ data: { content: 'x'.repeat(10001) } }),
).toBeRejectedByValidation();
});

it('should reject short string when only @length(min: N) is specified', async () => {
const db = await createTestClient(
`
model Post {
id String @id @default(cuid())
content String @length(min: 5)
}
`,
);
// Should succeed: content meets min length
await expect(db.post.create({ data: { content: 'hello world' } })).resolves.toMatchObject({
content: 'hello world',
});
// Should fail validation: content is too short
await expect(
db.post.create({ data: { content: 'hi' } }),
).toBeRejectedByValidation();
});
});
2 changes: 1 addition & 1 deletion tests/runtimes/bun/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "bun-e2e",
"version": "3.4.2",
"version": "3.4.3",
"private": true,
"type": "module",
"scripts": {
Expand Down
2 changes: 1 addition & 1 deletion tests/runtimes/edge-runtime/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "edge-runtime-e2e",
"version": "3.4.2",
"version": "3.4.3",
"private": true,
"type": "module",
"scripts": {
Expand Down
Loading