Skip to content

Commit e919bb0

Browse files
authored
feat(tanstack-query): new implementation of tanstack-query react hooks (#356)
* WIP * feat: tanstack-query/react CRUD hooks implementation * fix build * addressing PR comments * update * update * migrate tests * update * fix test environment * use happy-dom instead of jsdom
1 parent 310bbe9 commit e919bb0

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+7450
-360
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ Even without using advanced features, ZenStack offers the following benefits as
5151
5252
# Quick start
5353

54-
> You can also check the [blog sample](./samples/blog) for a complete example.
54+
- [ORM](./samples/orm): A simple example demonstrating ZenStack ORM usage.
55+
- [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.
5556

5657
## Installation
5758

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@
3131
"typescript": "catalog:",
3232
"typescript-eslint": "^8.34.1",
3333
"vitest": "^3.2.4",
34-
"yaml": "^2.8.0"
34+
"yaml": "^2.8.0",
35+
"prisma": "catalog:"
3536
},
3637
"pnpm": {
3738
"onlyBuiltDependencies": [

packages/cli/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
"prisma": "catalog:"
4646
},
4747
"devDependencies": {
48-
"@types/better-sqlite3": "^7.6.13",
48+
"@types/better-sqlite3": "catalog:",
4949
"@types/semver": "^7.7.0",
5050
"@types/tmp": "catalog:",
5151
"@zenstackhq/eslint-config": "workspace:*",
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
{
2+
"name": "@zenstackhq/tanstack-query",
3+
"version": "3.0.0-beta.15",
4+
"description": "TanStack Query Client for consuming ZenStack v3's CRUD service",
5+
"main": "index.js",
6+
"type": "module",
7+
"private": true,
8+
"scripts": {
9+
"build": "tsc --noEmit && tsup-node",
10+
"watch": "tsup-node --watch",
11+
"lint": "eslint src --ext ts",
12+
"test": "vitest run",
13+
"pack": "pnpm pack",
14+
"test:generate": "tsx scripts/generate.ts"
15+
},
16+
"keywords": [
17+
"tanstack-query",
18+
"react-query",
19+
"zenstack",
20+
"orm",
21+
"fullstack"
22+
],
23+
"author": "ZenStack Team",
24+
"license": "MIT",
25+
"exports": {
26+
"./react": {
27+
"import": {
28+
"types": "./dist/react.d.ts",
29+
"default": "./dist/react.js"
30+
},
31+
"require": {
32+
"types": "./dist/react.d.cts",
33+
"default": "./dist/react.cjs"
34+
}
35+
}
36+
},
37+
"dependencies": {
38+
"@zenstackhq/common-helpers": "workspace:*",
39+
"@zenstackhq/orm": "workspace:*",
40+
"@zenstackhq/schema": "workspace:*",
41+
"decimal.js": "catalog:",
42+
"superjson": "^2.2.3"
43+
},
44+
"devDependencies": {
45+
"@tanstack/react-query": "catalog:",
46+
"@testing-library/dom": "^10.4.1",
47+
"@testing-library/react": "^16.3.0",
48+
"@types/react": "catalog:",
49+
"@zenstackhq/eslint-config": "workspace:*",
50+
"@zenstackhq/language": "workspace:*",
51+
"@zenstackhq/sdk": "workspace:*",
52+
"@zenstackhq/typescript-config": "workspace:*",
53+
"@zenstackhq/vitest-config": "workspace:*",
54+
"happy-dom": "^20.0.10",
55+
"nock": "^14.0.10",
56+
"react": "catalog:"
57+
},
58+
"peerDependencies": {
59+
"@tanstack/react-query": "^5.0.0",
60+
"react": "^18 || ^19"
61+
},
62+
"peerDependenciesMeta": {
63+
"@tanstack/react-query": {
64+
"optional": true
65+
},
66+
"react": {
67+
"optional": true
68+
}
69+
}
70+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { loadDocument } from '@zenstackhq/language';
2+
import { TsSchemaGenerator } from '@zenstackhq/sdk';
3+
import { glob } from 'glob';
4+
import path from 'node:path';
5+
import { fileURLToPath } from 'node:url';
6+
7+
const dir = path.dirname(fileURLToPath(import.meta.url));
8+
9+
async function main() {
10+
const zmodelFiles = glob.sync(path.resolve(dir, '../test/**/*.zmodel'));
11+
for (const file of zmodelFiles) {
12+
console.log(`Generating TS schema for: ${file}`);
13+
await generate(file);
14+
}
15+
}
16+
17+
async function generate(schemaPath: string) {
18+
const generator = new TsSchemaGenerator();
19+
const outputDir = path.dirname(schemaPath);
20+
const result = await loadDocument(schemaPath);
21+
if (!result.success) {
22+
throw new Error(`Failed to load schema from ${schemaPath}: ${result.errors}`);
23+
}
24+
await generator.generate(result.model, outputDir);
25+
}
26+
27+
main();

0 commit comments

Comments
 (0)