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
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ ZenStack is a TypeScript database toolkit for developing full-stack or backend N
- Automatic CRUD web APIs with adapters for popular frameworks (coming soon)
- Automatic [TanStack Query](https://github.com/TanStack/query) hooks for easy CRUD from the frontend (coming soon)

# What's new with V3
# What's New in V3

ZenStack V3 is a major rewrite of [V2](https://github.com/zenstackhq/zenstack). The biggest change is V3 doesn't have a runtime dependency to Prisma anymore. Instead of working as a big wrapper of Prisma as in V2, V3 made a bold move and implemented the entire ORM engine using [Kysely](https://github.com/kysely-org/kysely), while keeping the query API fully compatible with Prisma.

Expand All @@ -49,7 +49,7 @@ Even without using advanced features, ZenStack offers the following benefits as

> Although ZenStack v3's ORM runtime doesn't depend on Prisma anymore (specifically, `@prisma/client`), it still relies on Prisma to handle database migration. See [database migration](https://zenstack.dev/docs/3.x/orm/migration) for more details.

# Quick start
# Quick Start

- [ORM](./samples/orm): A simple example demonstrating ZenStack ORM usage.
- [Next.js + TanStack Query](./samples/next.js): A full-stack sample demonstrating using TanStack Query to consume ZenStack's automatic CRUD services in a Next.js app.
Expand All @@ -72,7 +72,7 @@ Or, if you have an existing project, use the CLI to initialize it:
npx @zenstackhq/cli@next init
```

### 3. Manual setup
### 3. Setting up manually

Alternatively, you can set it up manually:

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.0.0-beta.19",
"version": "3.0.0-beta.20",
"description": "ZenStack",
"packageManager": "pnpm@10.20.0",
"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.0.0-beta.19",
"version": "3.0.0-beta.20",
"type": "module",
"author": {
"name": "ZenStack Team"
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.0.0-beta.19",
"version": "3.0.0-beta.20",
"description": "TanStack Query Client for consuming ZenStack v3's CRUD service",
"main": "index.js",
"type": "module",
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.0.0-beta.19",
"version": "3.0.0-beta.20",
"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.0.0-beta.19",
"version": "3.0.0-beta.20",
"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.0.0-beta.19",
"version": "3.0.0-beta.20",
"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.0.0-beta.19",
"version": "3.0.0-beta.20",
"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.0.0-beta.19",
"version": "3.0.0-beta.20",
"description": "Create a new ZenStack project",
"type": "module",
"scripts": {
Expand Down
2 changes: 1 addition & 1 deletion packages/dialects/sql.js/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@zenstackhq/kysely-sql-js",
"version": "3.0.0-beta.19",
"version": "3.0.0-beta.20",
"description": "Kysely dialect for sql.js",
"type": "module",
"scripts": {
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.0.11",
"version": "3.0.12",
"displayName": "ZenStack V3 Language Tools",
"description": "VSCode extension for ZenStack (v3) ZModel language",
"private": true,
Expand Down
5 changes: 3 additions & 2 deletions 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.0.0-beta.19",
"version": "3.0.0-beta.20",
"license": "MIT",
"author": "ZenStack Team",
"files": [
Expand Down Expand Up @@ -57,7 +57,8 @@
"dependencies": {
"langium": "catalog:",
"pluralize": "^8.0.0",
"ts-pattern": "catalog:"
"ts-pattern": "catalog:",
"vscode-languageserver": "^9.0.1"
},
"devDependencies": {
"@types/pluralize": "^0.0.33",
Expand Down
6 changes: 4 additions & 2 deletions packages/language/res/stdlib.zmodel
Original file line number Diff line number Diff line change
Expand Up @@ -382,12 +382,14 @@ attribute @map(_ name: String) @@@prisma
attribute @@map(_ name: String) @@@prisma

/**
* Exclude a field from the Prisma Client (for example, a field that you do not want Prisma users to update).
* Exclude a field from the ORM Client (for example, a field that you do not want Prisma users to update).
* The field is still recognized by database schema migrations.
*/
attribute @ignore() @@@prisma

/**
* Exclude a model from the Prisma Client (for example, a model that you do not want Prisma users to update).
* Exclude a model from the ORM Client (for example, a model that you do not want Prisma users to update).
* The model is still recognized by database schema migrations.
*/
attribute @@ignore() @@@prisma

Expand Down
1 change: 1 addition & 0 deletions packages/language/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
export { loadDocument } from './document';
export * from './module';
export { ZModelCodeGenerator } from './zmodel-code-generator';
37 changes: 29 additions & 8 deletions packages/language/src/module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,15 @@ import type { Model } from './ast';
import { ZModelGeneratedModule, ZModelGeneratedSharedModule, ZModelLanguageMetaData } from './generated/module';
import { getPluginDocuments } from './utils';
import { registerValidationChecks, ZModelValidator } from './validator';
import { ZModelCommentProvider } from './zmodel-comment-provider';
import { ZModelCompletionProvider } from './zmodel-completion-provider';
import { ZModelDefinitionProvider } from './zmodel-definition';
import { ZModelDocumentBuilder } from './zmodel-document-builder';
import { ZModelDocumentationProvider } from './zmodel-documentation-provider';
import { ZModelFormatter } from './zmodel-formatter';
import { ZModelLinker } from './zmodel-linker';
import { ZModelScopeComputation, ZModelScopeProvider } from './zmodel-scope';
import { ZModelSemanticTokenProvider } from './zmodel-semantic';
import { ZModelWorkspaceManager } from './zmodel-workspace-manager';
export { ZModelLanguageMetaData };

Expand Down Expand Up @@ -49,6 +55,16 @@ export const ZModelLanguageModule: Module<ZModelServices, PartialLangiumServices
validation: {
ZModelValidator: (services) => new ZModelValidator(services),
},
lsp: {
Formatter: (services) => new ZModelFormatter(services),
DefinitionProvider: (services) => new ZModelDefinitionProvider(services),
CompletionProvider: (services) => new ZModelCompletionProvider(services),
SemanticTokenProvider: (services) => new ZModelSemanticTokenProvider(services),
},
documentation: {
CommentProvider: (services) => new ZModelCommentProvider(services),
DocumentationProvider: (services) => new ZModelDocumentationProvider(services),
},
};

export type ZModelSharedServices = LangiumSharedServices;
Expand Down Expand Up @@ -109,15 +125,20 @@ export function createZModelLanguageServices(

const schemaPath = fileURLToPath(doc.uri.toString());
const pluginSchemas = getPluginDocuments(doc.parseResult.value as Model, schemaPath);

// ensure plugin docs are loaded
for (const plugin of pluginSchemas) {
// load the plugin model document
const pluginDoc = await shared.workspace.LangiumDocuments.getOrCreateDocument(
URI.file(path.resolve(plugin)),
);
// add to indexer so the plugin model's definitions are globally visible
shared.workspace.IndexManager.updateContent(pluginDoc);
if (logToConsole) {
console.log(`Loaded plugin model: ${plugin}`);
const pluginDocUri = URI.file(path.resolve(plugin));
let pluginDoc = shared.workspace.LangiumDocuments.getDocument(pluginDocUri);
if (!pluginDoc) {
pluginDoc = await shared.workspace.LangiumDocuments.getOrCreateDocument(pluginDocUri);
if (pluginDoc) {
// add to indexer so the plugin model's definitions are globally visible
shared.workspace.IndexManager.updateContent(pluginDoc);
if (logToConsole) {
console.log(`Loaded plugin model: ${plugin}`);
}
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,6 @@ export default class AttributeApplicationValidator implements AstValidator<Attri
// TODO: design a way to let plugin register validation
@check('@@allow')
@check('@@deny')
// @ts-expect-error
private _checkModelLevelPolicy(attr: AttributeApplication, accept: ValidationAcceptor) {
const kind = getStringLiteral(attr.args[0]?.value);
if (!kind) {
Expand Down Expand Up @@ -247,7 +246,6 @@ export default class AttributeApplicationValidator implements AstValidator<Attri
// TODO: design a way to let plugin register validation
@check('@allow')
@check('@deny')
// @ts-expect-error
private _checkFieldLevelPolicy(attr: AttributeApplication, accept: ValidationAcceptor) {
const kind = getStringLiteral(attr.args[0]?.value);
if (!kind) {
Expand Down Expand Up @@ -277,7 +275,6 @@ export default class AttributeApplicationValidator implements AstValidator<Attri
}

@check('@@validate')
// @ts-expect-error
private _checkValidate(attr: AttributeApplication, accept: ValidationAcceptor) {
const condition = attr.args[0]?.value;
if (
Expand All @@ -293,7 +290,6 @@ export default class AttributeApplicationValidator implements AstValidator<Attri
@check('@@id')
@check('@@index')
@check('@@unique')
// @ts-expect-error
private _checkConstraint(attr: AttributeApplication, accept: ValidationAcceptor) {
const fields = attr.args[0]?.value;
const attrName = attr.decl.ref?.name;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,6 @@ export default class FunctionInvocationValidator implements AstValidator<Express
}

@func('length')
// @ts-expect-error
private _checkLength(expr: InvocationExpr, accept: ValidationAcceptor) {
const msg = 'argument must be a string or list field';
const fieldArg = expr.args[0]!.value;
Expand All @@ -206,7 +205,6 @@ export default class FunctionInvocationValidator implements AstValidator<Express
}

@func('regex')
// @ts-expect-error
private _checkRegex(expr: InvocationExpr, accept: ValidationAcceptor) {
const regex = expr.args[1]?.value;
if (!isStringLiteral(regex)) {
Expand All @@ -228,7 +226,6 @@ export default class FunctionInvocationValidator implements AstValidator<Express

// TODO: move this to policy plugin
@func('check')
// @ts-expect-error
private _checkCheck(expr: InvocationExpr, accept: ValidationAcceptor) {
let valid = true;

Expand Down
Loading
Loading