zenstack 0.5.0 → 0.6.0-pre.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{LICENSE.md → LICENSE} +0 -0
- package/bin/cli +1 -1
- package/package.json +17 -13
- package/bin/post-install.js +0 -0
- package/bundle/asset/logo-256-bg.png +0 -0
- package/bundle/asset/logo-dark-256.png +0 -0
- package/bundle/asset/logo-light-256.png +0 -0
- package/bundle/cli/index.js +0 -6952
- package/bundle/extension.js +0 -39
- package/bundle/language-server/main.js +0 -6208
- package/bundle/res/package.template.json +0 -9
- package/bundle/res/prism-zmodel.js +0 -22
- package/bundle/res/stdlib.zmodel +0 -218
- package/bundle/res/tsconfig.template.json +0 -17
- package/src/cli/cli-error.ts +0 -4
- package/src/cli/cli-util.ts +0 -214
- package/src/cli/index.ts +0 -246
- package/src/extension.ts +0 -76
- package/src/generator/ast-utils.ts +0 -18
- package/src/generator/constants.ts +0 -6
- package/src/generator/field-constraint/index.ts +0 -304
- package/src/generator/index.ts +0 -86
- package/src/generator/prisma/expression-writer.ts +0 -360
- package/src/generator/prisma/index.ts +0 -44
- package/src/generator/prisma/prisma-builder.ts +0 -370
- package/src/generator/prisma/query-guard-generator.ts +0 -249
- package/src/generator/prisma/schema-generator.ts +0 -313
- package/src/generator/prisma/typescript-expression-transformer.ts +0 -108
- package/src/generator/react-hooks/index.ts +0 -273
- package/src/generator/service/index.ts +0 -113
- package/src/generator/tsc/index.ts +0 -59
- package/src/generator/types.ts +0 -20
- package/src/global.d.ts +0 -3
- package/src/language-server/constants.ts +0 -29
- package/src/language-server/generated/ast.ts +0 -643
- package/src/language-server/generated/grammar.ts +0 -2492
- package/src/language-server/generated/module.ts +0 -24
- package/src/language-server/langium-ext.d.ts +0 -22
- package/src/language-server/main.ts +0 -13
- package/src/language-server/types.ts +0 -25
- package/src/language-server/utils.ts +0 -21
- package/src/language-server/validator/attribute-validator.ts +0 -11
- package/src/language-server/validator/datamodel-validator.ts +0 -426
- package/src/language-server/validator/datasource-validator.ts +0 -102
- package/src/language-server/validator/enum-validator.ts +0 -14
- package/src/language-server/validator/expression-validator.ts +0 -48
- package/src/language-server/validator/schema-validator.ts +0 -31
- package/src/language-server/validator/utils.ts +0 -158
- package/src/language-server/validator/zmodel-validator.ts +0 -91
- package/src/language-server/zmodel-linker.ts +0 -453
- package/src/language-server/zmodel-module.ts +0 -131
- package/src/language-server/zmodel-scope.ts +0 -45
- package/src/language-server/zmodel-workspace-manager.ts +0 -23
- package/src/language-server/zmodel.langium +0 -207
- package/src/res/package.template.json +0 -9
- package/src/res/prism-zmodel.js +0 -22
- package/src/res/stdlib.zmodel +0 -218
- package/src/res/tsconfig.template.json +0 -17
- package/src/telemetry.ts +0 -119
- package/src/utils/exec-utils.ts +0 -8
- package/src/utils/indent-string.ts +0 -9
- package/src/utils/pkg-utils.ts +0 -63
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
import { DataModel, isDataModel } from '@lang/generated/ast';
|
|
2
|
-
import { camelCase } from 'change-case';
|
|
3
|
-
import * as path from 'path';
|
|
4
|
-
import { Project } from 'ts-morph';
|
|
5
|
-
import { RUNTIME_PACKAGE } from '../constants';
|
|
6
|
-
import { Context, Generator } from '../types';
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Generates ZenStack service code
|
|
10
|
-
*/
|
|
11
|
-
export default class ServiceGenerator implements Generator {
|
|
12
|
-
get name() {
|
|
13
|
-
return 'service';
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
get startMessage() {
|
|
17
|
-
return 'Generating ZenStack service...';
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
get successMessage() {
|
|
21
|
-
return 'Successfully generated ZenStack service';
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
async generate(context: Context) {
|
|
25
|
-
const project = new Project();
|
|
26
|
-
const sf = project.createSourceFile(
|
|
27
|
-
path.join(context.generatedCodeDir, 'src/index.ts'),
|
|
28
|
-
undefined,
|
|
29
|
-
{ overwrite: true }
|
|
30
|
-
);
|
|
31
|
-
|
|
32
|
-
const models = context.schema.declarations.filter((d): d is DataModel =>
|
|
33
|
-
isDataModel(d)
|
|
34
|
-
);
|
|
35
|
-
|
|
36
|
-
sf.addStatements([
|
|
37
|
-
`import { Prisma as P, PrismaClient } from "../.prisma";`,
|
|
38
|
-
`import { DefaultService } from "${RUNTIME_PACKAGE}/lib/service";`,
|
|
39
|
-
`import { CRUD } from "${RUNTIME_PACKAGE}/lib/handler/data/crud";`,
|
|
40
|
-
`import type { QueryContext } from "${RUNTIME_PACKAGE}/lib/types";`,
|
|
41
|
-
`import type { ${models
|
|
42
|
-
.map((m) => m.name)
|
|
43
|
-
.join(', ')} } from "../.prisma";`,
|
|
44
|
-
]);
|
|
45
|
-
|
|
46
|
-
const cls = sf.addClass({
|
|
47
|
-
name: 'ZenStackService',
|
|
48
|
-
isExported: true,
|
|
49
|
-
extends: 'DefaultService<PrismaClient>',
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
cls.addProperty({
|
|
53
|
-
name: 'private crud',
|
|
54
|
-
initializer: `new CRUD<PrismaClient>(this)`,
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
cls.addMethod({
|
|
58
|
-
name: 'initializePrisma',
|
|
59
|
-
}).setBodyText(`
|
|
60
|
-
const logConfig = (this.config.log || [])
|
|
61
|
-
.filter(item => typeof item === 'string' ? ['info', 'warn', 'error', 'query'].includes(item): ['info', 'warn', 'error', 'query'].includes(item.level));
|
|
62
|
-
return new PrismaClient({log: logConfig as any });
|
|
63
|
-
`);
|
|
64
|
-
|
|
65
|
-
cls.addMethod({
|
|
66
|
-
name: 'loadGuardModule',
|
|
67
|
-
isAsync: true,
|
|
68
|
-
}).setBodyText(`
|
|
69
|
-
return import('./query/guard');
|
|
70
|
-
`);
|
|
71
|
-
|
|
72
|
-
cls.addMethod({
|
|
73
|
-
name: 'loadFieldConstraintModule',
|
|
74
|
-
isAsync: true,
|
|
75
|
-
}).setBodyText(`
|
|
76
|
-
return import('./field-constraint');
|
|
77
|
-
`);
|
|
78
|
-
|
|
79
|
-
// server-side CRUD operations per model
|
|
80
|
-
for (const model of models) {
|
|
81
|
-
cls.addGetAccessor({
|
|
82
|
-
name: camelCase(model.name),
|
|
83
|
-
}).setBodyText(`
|
|
84
|
-
return {
|
|
85
|
-
get: <T extends P.${model.name}FindFirstArgs>(context: QueryContext, id: string, args?: P.SelectSubset<T, P.Subset<P.${model.name}FindFirstArgs, 'select' | 'include'>>) =>
|
|
86
|
-
this.crud.get('${model.name}', id, args, context) as Promise<P.CheckSelect<T, ${model.name}, P.${model.name}GetPayload<T>> | undefined>,
|
|
87
|
-
find: <T extends P.${model.name}FindManyArgs>(context: QueryContext, args?: P.SelectSubset<T, P.${model.name}FindManyArgs>) =>
|
|
88
|
-
this.crud.find('${model.name}', args, context) as Promise<P.CheckSelect<T, Array<${model.name}>, Array<P.${model.name}GetPayload<T>>>>,
|
|
89
|
-
create: <T extends P.${model.name}CreateArgs>(context: QueryContext, args: P.${model.name}CreateArgs) =>
|
|
90
|
-
this.crud.create('${model.name}', args, context) as Promise<P.CheckSelect<T, ${model.name}, P.${model.name}GetPayload<T>>>,
|
|
91
|
-
update: <T extends Omit<P.${model.name}UpdateArgs, 'where'>>(context: QueryContext, id: string, args: Omit<P.${model.name}UpdateArgs, 'where'>) =>
|
|
92
|
-
this.crud.update('${model.name}', id, args, context) as Promise<P.CheckSelect<T, ${model.name}, P.${model.name}GetPayload<T>>>,
|
|
93
|
-
del: <T extends Omit<P.${model.name}DeleteArgs, 'where'>>(context: QueryContext, id: string, args?: Omit<P.${model.name}DeleteArgs, 'where'>) =>
|
|
94
|
-
this.crud.del('${model.name}', id, args, context) as Promise<P.CheckSelect<T, ${model.name}, P.${model.name}GetPayload<T>>>,
|
|
95
|
-
}
|
|
96
|
-
`);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// Recommended by Prisma for Next.js
|
|
100
|
-
// https://www.prisma.io/docs/guides/database/troubleshooting-orm/help-articles/nextjs-prisma-client-dev-practices#problem
|
|
101
|
-
sf.addStatements([
|
|
102
|
-
'declare global { var zenstackService: ZenStackService | undefined}',
|
|
103
|
-
'const service = global.zenstackService || new ZenStackService();',
|
|
104
|
-
'export default service;',
|
|
105
|
-
`if (process.env.NODE_ENV !== 'production') global.zenstackService = service;`,
|
|
106
|
-
]);
|
|
107
|
-
|
|
108
|
-
sf.formatText();
|
|
109
|
-
await project.save();
|
|
110
|
-
|
|
111
|
-
return [];
|
|
112
|
-
}
|
|
113
|
-
}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-var-requires */
|
|
2
|
-
import * as fs from 'fs';
|
|
3
|
-
import path from 'path';
|
|
4
|
-
import { execSync } from '../../utils/exec-utils';
|
|
5
|
-
import { Context, Generator, GeneratorError } from '../types';
|
|
6
|
-
|
|
7
|
-
export class TypescriptCompilation implements Generator {
|
|
8
|
-
get name(): string {
|
|
9
|
-
return 'tsc';
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
get startMessage() {
|
|
13
|
-
return 'Transpiling generated code...';
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
get successMessage() {
|
|
17
|
-
return 'Successfully transpiled all generated code';
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
async generate(context: Context) {
|
|
21
|
-
// generate package.json
|
|
22
|
-
const packageJson = require(path.join(
|
|
23
|
-
__dirname,
|
|
24
|
-
'../res',
|
|
25
|
-
'package.template.json'
|
|
26
|
-
));
|
|
27
|
-
|
|
28
|
-
fs.writeFileSync(
|
|
29
|
-
path.join(context.generatedCodeDir, 'package.json'),
|
|
30
|
-
JSON.stringify(packageJson, undefined, 4)
|
|
31
|
-
);
|
|
32
|
-
|
|
33
|
-
// compile ts sources
|
|
34
|
-
const tsConfig = require(path.join(
|
|
35
|
-
__dirname,
|
|
36
|
-
'../res',
|
|
37
|
-
'tsconfig.template.json'
|
|
38
|
-
));
|
|
39
|
-
fs.writeFileSync(
|
|
40
|
-
path.join(context.generatedCodeDir, 'tsconfig.json'),
|
|
41
|
-
JSON.stringify(tsConfig, undefined, 4)
|
|
42
|
-
);
|
|
43
|
-
|
|
44
|
-
try {
|
|
45
|
-
execSync(
|
|
46
|
-
`npx tsc -p "${path.join(
|
|
47
|
-
context.generatedCodeDir,
|
|
48
|
-
'tsconfig.json'
|
|
49
|
-
)}"`
|
|
50
|
-
);
|
|
51
|
-
} catch {
|
|
52
|
-
throw new GeneratorError(
|
|
53
|
-
'Something went wrong, generated runtime code failed to compile...\nPlease check errors above.'
|
|
54
|
-
);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
return [];
|
|
58
|
-
}
|
|
59
|
-
}
|
package/src/generator/types.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { Model } from '@lang/generated/ast';
|
|
2
|
-
|
|
3
|
-
export interface Context {
|
|
4
|
-
schema: Model;
|
|
5
|
-
outDir: string;
|
|
6
|
-
generatedCodeDir: string;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export interface Generator {
|
|
10
|
-
get name(): string;
|
|
11
|
-
get startMessage(): string;
|
|
12
|
-
get successMessage(): string;
|
|
13
|
-
generate(context: Context): Promise<string[]>;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export class GeneratorError extends Error {
|
|
17
|
-
constructor(message: string) {
|
|
18
|
-
super(message);
|
|
19
|
-
}
|
|
20
|
-
}
|
package/src/global.d.ts
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Supported Prisma db providers
|
|
3
|
-
*/
|
|
4
|
-
export const SUPPORTED_PROVIDERS = [
|
|
5
|
-
'sqlite',
|
|
6
|
-
'postgresql',
|
|
7
|
-
'mysql',
|
|
8
|
-
'sqlserver',
|
|
9
|
-
'cockroachdb',
|
|
10
|
-
];
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* All scalar types
|
|
14
|
-
*/
|
|
15
|
-
export const SCALAR_TYPES = [
|
|
16
|
-
'String',
|
|
17
|
-
'Int',
|
|
18
|
-
'Float',
|
|
19
|
-
'Decimal',
|
|
20
|
-
'BigInt',
|
|
21
|
-
'Boolean',
|
|
22
|
-
'Bytes',
|
|
23
|
-
'DateTime',
|
|
24
|
-
];
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Name of standard library module
|
|
28
|
-
*/
|
|
29
|
-
export const STD_LIB_MODULE_NAME = 'stdlib.zmodel';
|