Skip to content

Commit 77ea76c

Browse files
authored
Merge pull request #29 from zenstackhq/dev
merge dev to main
2 parents a43be54 + 6cd7e2e commit 77ea76c

29 files changed

+470
-492
lines changed

README.md

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ Even without using advanced features, ZenStack offers the following benefits as
4848
4949
# Get started
5050

51+
> You can also check the [blog sample](./samples/blog) for a complete example.
52+
5153
## Installation
5254

5355
### 1. Creating a new project
@@ -136,7 +138,9 @@ Now you can use the compiled TypeScript schema to instantiate a database client:
136138
import { ZenStackClient } from '@zenstackhq/runtime';
137139
import { schema } from './zenstack/schema';
138140

139-
const client = new ZenStackClient(schema);
141+
const client = new ZenStackClient(schema, {
142+
dialectConfig: { ... }
143+
});
140144
```
141145

142146
## Using `ZenStackClient`
@@ -207,14 +211,15 @@ ZenStack v3 allows you to define database-evaluated computed fields with the fol
207211
model User {
208212
...
209213
/// number of posts owned by the user
210-
postCount Int @computed
214+
postCount Int @computed
211215
}
212216
```
213217
214218
2. Provide its implementation using query builder when constructing `ZenStackClient`
215219
216220
```ts
217221
const client = new ZenStackClient(schema, {
222+
...
218223
computedFields: {
219224
User: {
220225
postCount: (eb) =>
@@ -367,7 +372,7 @@ See [Prisma Migrate](https://www.prisma.io/docs/orm/prisma-migrate) documentatio
367372
1. Install "better-sqlite3" or "pg" based on database type
368373
1. Move "schema.prisma" to "zenstack" folder and rename it to "schema.zmodel"
369374
1. Run `npx zenstack generate`
370-
1. Replace `new PrismaClient()` with `new ZenStackClient(schema)`
375+
1. Replace `new PrismaClient()` with `new ZenStackClient(schema, { ... })`
371376
372377
# Limitations
373378

TODO.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
- [x] Custom table name
6767
- [x] Custom field name
6868
- [ ] Strict undefined check
69+
- [ ] Implement changesets
6970
- [ ] Polymorphism
7071
- [ ] Validation
7172
- [ ] Access Policy

packages/cli/src/actions/generate.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@ export async function run(options: Options) {
4040
import { ZenStackClient } from '@zenstackhq/runtime';
4141
import { schema } from '${outputPath}/schema';
4242
43-
const client = new ZenStackClient(schema);
43+
const client = new ZenStackClient(schema, {
44+
dialectConfig: { ... }
45+
});
4446
\`\`\`
4547
`);
4648
}

packages/cli/src/actions/templates.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,14 @@ model Post {
2828

2929
export const STARTER_MAIN_TS = `import { ZenStackClient } from '@zenstackhq/runtime';
3030
import { schema } from './zenstack/schema';
31+
import SQLite from 'better-sqlite3';
3132
3233
async function main() {
33-
const client = new ZenStackClient(schema);
34+
const client = new ZenStackClient(schema, {
35+
dialectConfig: {
36+
database: new SQLite('./zenstack/dev.db'),
37+
},
38+
});
3439
const user = await client.user.create({
3540
data: {
3641
email: 'test@zenstack.dev',

packages/cli/test/ts-schema-gen.test.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ model Post {
2727

2828
expect(schema.provider).toMatchObject({
2929
type: 'sqlite',
30-
dialectConfigProvider: expect.any(Function),
3130
});
3231

3332
expect(schema.models).toMatchObject({

packages/create-zenstack/src/index.ts

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,18 @@ import { STARTER_MAIN_TS, STARTER_ZMODEL } from './templates';
99
const npmAgent = process.env['npm_config_user_agent'];
1010
let agent = 'npm';
1111
let agentExec = 'npx';
12-
let initCommand = 'npm init -y';
1312
let saveDev = '--save-dev';
1413

1514
if (npmAgent?.includes('pnpm')) {
1615
agent = 'pnpm';
17-
initCommand = 'pnpm init';
1816
agentExec = 'pnpm';
1917
} else if (npmAgent?.includes('yarn')) {
2018
agent = 'yarn';
21-
initCommand = 'yarn init';
2219
agentExec = 'npx';
2320
saveDev = '--dev';
2421
} else if (npmAgent?.includes('bun')) {
2522
agent = 'bun';
2623
agentExec = 'bun';
27-
initCommand = 'bun init -y -m';
2824
}
2925

3026
const program = new Command('create-zenstack');
@@ -46,20 +42,60 @@ function initProject(name: string) {
4642

4743
console.log(colors.gray(`Using package manager: ${agent}`));
4844

49-
// initialize project
50-
execSync(initCommand);
45+
// create package.json
46+
fs.writeFileSync(
47+
'package.json',
48+
JSON.stringify(
49+
{
50+
name: 'zenstack-app',
51+
version: '1.0.0',
52+
description: 'Scaffolded with create-zenstack',
53+
type: 'module',
54+
scripts: {
55+
dev: 'tsx main.ts',
56+
},
57+
license: 'ISC',
58+
},
59+
null,
60+
2
61+
)
62+
);
5163

5264
// install packages
5365
const packages = [
5466
{ name: '@zenstackhq/cli@next', dev: true },
5567
{ name: '@zenstackhq/runtime@next', dev: false },
5668
{ name: 'better-sqlite3', dev: false },
69+
{ name: '@types/better-sqlite3', dev: true },
70+
{ name: 'typescript', dev: true },
5771
{ name: 'tsx', dev: true },
72+
{ name: '@types/node', dev: true },
5873
];
5974
for (const pkg of packages) {
6075
installPackage(pkg);
6176
}
6277

78+
// create tsconfig.json
79+
fs.writeFileSync(
80+
'tsconfig.json',
81+
JSON.stringify(
82+
{
83+
compilerOptions: {
84+
module: 'esnext',
85+
target: 'esnext',
86+
moduleResolution: 'bundler',
87+
sourceMap: true,
88+
outDir: 'dist',
89+
strict: true,
90+
skipLibCheck: true,
91+
esModuleInterop: true,
92+
},
93+
},
94+
null,
95+
2
96+
)
97+
);
98+
6399
// create schema.zmodel
64100
fs.mkdirSync('zenstack');
65101
fs.writeFileSync('zenstack/schema.zmodel', STARTER_ZMODEL);

packages/runtime/package.json

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -59,26 +59,6 @@
5959
"default": "./dist/plugins/policy.cjs"
6060
}
6161
},
62-
"./utils/pg-utils": {
63-
"import": {
64-
"types": "./dist/utils/pg-utils.d.ts",
65-
"default": "./dist/utils/pg-utils.js"
66-
},
67-
"require": {
68-
"types": "./dist/utils/pg-utils.d.cts",
69-
"default": "./dist/utils/pg-utils.cjs"
70-
}
71-
},
72-
"./utils/sqlite-utils": {
73-
"import": {
74-
"types": "./dist/utils/sqlite-utils.d.ts",
75-
"default": "./dist/utils/sqlite-utils.js"
76-
},
77-
"require": {
78-
"types": "./dist/utils/sqlite-utils.d.cts",
79-
"default": "./dist/utils/sqlite-utils.cjs"
80-
}
81-
},
8262
"./package.json": {
8363
"import": "./package.json",
8464
"require": "./package.json"
@@ -91,7 +71,6 @@
9171
"json-stable-stringify": "^1.3.0",
9272
"kysely": "^0.27.5",
9373
"nanoid": "^5.0.9",
94-
"pg-connection-string": "^2.9.0",
9574
"tiny-invariant": "^1.3.3",
9675
"ts-pattern": "^5.6.0",
9776
"ulid": "^3.0.0",

packages/runtime/src/client/client-impl.ts

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { SqliteDialectConfig } from 'kysely';
12
import {
23
DefaultConnectionProvider,
34
DefaultQueryExecutor,
@@ -7,7 +8,6 @@ import {
78
SqliteDialect,
89
type KyselyProps,
910
type PostgresDialectConfig,
10-
type SqliteDialectConfig,
1111
} from 'kysely';
1212
import { match } from 'ts-pattern';
1313
import type { GetModels, ProcedureDef, SchemaDef } from '../schema';
@@ -41,7 +41,7 @@ import { ResultProcessor } from './result-processor';
4141
export const ZenStackClient = function <Schema extends SchemaDef>(
4242
this: any,
4343
schema: any,
44-
options?: ClientOptions<Schema>
44+
options: ClientOptions<Schema>
4545
) {
4646
return new ClientImpl<Schema>(schema, options);
4747
} as unknown as ClientConstructor;
@@ -56,7 +56,7 @@ export class ClientImpl<Schema extends SchemaDef> {
5656

5757
constructor(
5858
private readonly schema: Schema,
59-
private options?: ClientOptions<Schema>,
59+
private options: ClientOptions<Schema>,
6060
baseClient?: ClientImpl<Schema>
6161
) {
6262
this.$schema = schema;
@@ -140,21 +140,15 @@ export class ClientImpl<Schema extends SchemaDef> {
140140
}
141141

142142
private makePostgresKyselyDialect(): PostgresDialect {
143-
const { dialectConfigProvider } = this.schema.provider;
144-
const mergedConfig = {
145-
...dialectConfigProvider(),
146-
...this.options?.dialectConfig,
147-
} as PostgresDialectConfig;
148-
return new PostgresDialect(mergedConfig);
143+
return new PostgresDialect(
144+
this.options.dialectConfig as PostgresDialectConfig
145+
);
149146
}
150147

151148
private makeSqliteKyselyDialect(): SqliteDialect {
152-
const { dialectConfigProvider } = this.schema.provider;
153-
const mergedConfig = {
154-
...dialectConfigProvider(),
155-
...this.options?.dialectConfig,
156-
} as SqliteDialectConfig;
157-
return new SqliteDialect(mergedConfig);
149+
return new SqliteDialect(
150+
this.options.dialectConfig as SqliteDialectConfig
151+
);
158152
}
159153

160154
async $transaction<T>(

packages/runtime/src/client/options.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export type ClientOptions<Schema extends SchemaDef> = {
4747
/**
4848
* Database dialect configuration.
4949
*/
50-
dialectConfig?: DialectConfig<Schema['provider']>;
50+
dialectConfig: DialectConfig<Schema['provider']>;
5151

5252
/**
5353
* Custom function definitions.

packages/runtime/src/utils/pg-utils.ts

Lines changed: 0 additions & 12 deletions
This file was deleted.

0 commit comments

Comments
 (0)