zenstack 0.1.41 → 1.0.0

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.
Files changed (215) hide show
  1. package/.vscode/extensions.json +7 -0
  2. package/.vscode/launch.json +49 -0
  3. package/.vscode/settings.json +4 -0
  4. package/README.md +1 -0
  5. package/package.json +8 -90
  6. package/packages/internal/jest.config.ts +32 -0
  7. package/packages/internal/package.json +42 -0
  8. package/packages/internal/src/constants.ts +1 -0
  9. package/packages/internal/src/handler/data/guard-utils.ts +7 -0
  10. package/packages/internal/src/handler/data/handler.ts +415 -0
  11. package/packages/internal/src/handler/data/query-processor.ts +504 -0
  12. package/packages/internal/src/handler/index.ts +1 -0
  13. package/packages/internal/src/handler/types.ts +20 -0
  14. package/packages/internal/src/index.ts +3 -0
  15. package/packages/internal/src/request-handler.ts +27 -0
  16. package/packages/internal/src/request.ts +101 -0
  17. package/packages/internal/src/types.ts +40 -0
  18. package/packages/internal/tests/query-processor.test.ts +172 -0
  19. package/{out/cli/tsconfig.template.json → packages/internal/tsconfig.json} +7 -3
  20. package/packages/runtime/auth.d.ts +1 -0
  21. package/packages/runtime/auth.js +3 -0
  22. package/packages/runtime/hooks.d.ts +10 -0
  23. package/packages/runtime/hooks.js +3 -0
  24. package/packages/runtime/index.d.ts +3 -0
  25. package/packages/runtime/index.js +1 -0
  26. package/packages/runtime/package-lock.json +512 -0
  27. package/packages/runtime/package.json +16 -0
  28. package/packages/runtime/server.d.ts +1 -0
  29. package/packages/runtime/server.js +3 -0
  30. package/packages/runtime/types.d.ts +1 -0
  31. package/packages/runtime/types.js +3 -0
  32. package/packages/schema/.eslintrc.json +13 -0
  33. package/packages/schema/.vscodeignore +4 -0
  34. package/packages/schema/asset/logo-dark.png +0 -0
  35. package/packages/schema/asset/logo-light.png +0 -0
  36. package/{bin → packages/schema/bin}/cli +0 -0
  37. package/packages/schema/jest.config.ts +32 -0
  38. package/packages/schema/langium-config.json +14 -0
  39. package/packages/schema/langium-quickstart.md +41 -0
  40. package/packages/schema/language-configuration.json +30 -0
  41. package/packages/schema/package.json +96 -0
  42. package/packages/schema/src/cli/cli-util.ts +80 -0
  43. package/packages/schema/src/cli/index.ts +64 -0
  44. package/packages/schema/src/extension.ts +76 -0
  45. package/packages/schema/src/generator/constants.ts +5 -0
  46. package/packages/schema/src/generator/index.ts +92 -0
  47. package/{out/generator/next-auth/index.js → packages/schema/src/generator/next-auth/index.ts} +46 -58
  48. package/{out → packages/schema/src}/generator/package.template.json +0 -0
  49. package/packages/schema/src/generator/prisma/expression-writer.ts +352 -0
  50. package/packages/schema/src/generator/prisma/index.ts +32 -0
  51. package/packages/schema/src/generator/prisma/plain-expression-builder.ts +91 -0
  52. package/packages/schema/src/generator/prisma/prisma-builder.ts +366 -0
  53. package/packages/schema/src/generator/prisma/query-gard-generator.ts +208 -0
  54. package/packages/schema/src/generator/prisma/schema-generator.ts +300 -0
  55. package/packages/schema/src/generator/react-hooks/index.ts +181 -0
  56. package/packages/schema/src/generator/service/index.ts +107 -0
  57. package/{out → packages/schema/src}/generator/tsconfig.template.json +0 -0
  58. package/packages/schema/src/generator/types.ts +17 -0
  59. package/packages/schema/src/generator/utils.ts +9 -0
  60. package/packages/schema/src/language-server/generated/ast.ts +603 -0
  61. package/{out/language-server/generated/grammar.js → packages/schema/src/language-server/generated/grammar.ts} +5 -8
  62. package/packages/schema/src/language-server/generated/module.ts +24 -0
  63. package/packages/schema/src/language-server/main.ts +12 -0
  64. package/{out → packages/schema/src}/language-server/stdlib.zmodel +0 -0
  65. package/packages/schema/src/language-server/types.ts +9 -0
  66. package/packages/schema/src/language-server/zmodel-index.ts +33 -0
  67. package/packages/schema/src/language-server/zmodel-linker.ts +409 -0
  68. package/packages/schema/src/language-server/zmodel-module.ts +90 -0
  69. package/packages/schema/src/language-server/zmodel-scope.ts +21 -0
  70. package/packages/schema/src/language-server/zmodel-validator.ts +35 -0
  71. package/packages/schema/src/language-server/zmodel.langium +186 -0
  72. package/packages/schema/src/utils/exec-utils.ts +5 -0
  73. package/packages/schema/src/utils/indent-string.ts +6 -0
  74. package/packages/schema/syntaxes/zmodel.json +57 -0
  75. package/packages/schema/syntaxes/zmodel.tmLanguage.json +57 -0
  76. package/packages/schema/tests/generator/expression-writer.test.ts +676 -0
  77. package/packages/schema/tests/generator/prisma-builder.test.ts +138 -0
  78. package/packages/schema/tests/schema/parser.test.ts +423 -0
  79. package/packages/schema/tests/schema/sample-todo.test.ts +14 -0
  80. package/packages/schema/tests/utils.ts +38 -0
  81. package/packages/schema/tsconfig.json +23 -0
  82. package/pnpm-workspace.yaml +3 -0
  83. package/samples/todo/.env +2 -0
  84. package/samples/todo/.eslintrc.json +3 -0
  85. package/samples/todo/.vscode/launch.json +11 -0
  86. package/samples/todo/README.md +34 -0
  87. package/samples/todo/components/AuthGuard.tsx +17 -0
  88. package/samples/todo/components/Avatar.tsx +22 -0
  89. package/samples/todo/components/BreadCrumb.tsx +44 -0
  90. package/samples/todo/components/ManageMembers.tsx +134 -0
  91. package/samples/todo/components/NavBar.tsx +57 -0
  92. package/samples/todo/components/SpaceMembers.tsx +76 -0
  93. package/samples/todo/components/Spaces.tsx +28 -0
  94. package/samples/todo/components/TimeInfo.tsx +17 -0
  95. package/samples/todo/components/Todo.tsx +72 -0
  96. package/samples/todo/components/TodoList.tsx +77 -0
  97. package/samples/todo/lib/context.ts +31 -0
  98. package/samples/todo/next.config.js +10 -0
  99. package/samples/todo/package-lock.json +7527 -0
  100. package/samples/todo/package.json +45 -0
  101. package/samples/todo/pages/_app.tsx +50 -0
  102. package/samples/todo/pages/api/auth/[...nextauth].ts +83 -0
  103. package/samples/todo/pages/api/zenstack/[...path].ts +16 -0
  104. package/samples/todo/pages/create-space.tsx +114 -0
  105. package/samples/todo/pages/index.tsx +32 -0
  106. package/samples/todo/pages/space/[slug]/[listId]/index.tsx +88 -0
  107. package/samples/todo/pages/space/[slug]/index.tsx +169 -0
  108. package/samples/todo/postcss.config.js +6 -0
  109. package/samples/todo/public/avatar.jpg +0 -0
  110. package/samples/todo/public/favicon.ico +0 -0
  111. package/samples/todo/public/logo.png +0 -0
  112. package/samples/todo/public/vercel.svg +4 -0
  113. package/samples/todo/styles/globals.css +7 -0
  114. package/samples/todo/tailwind.config.js +11 -0
  115. package/samples/todo/tsconfig.json +28 -0
  116. package/samples/todo/types/next-auth.d.ts +14 -0
  117. package/samples/todo/types/next.d.ts +16 -0
  118. package/samples/todo/zenstack/migrations/20221014084317_init/migration.sql +153 -0
  119. package/samples/todo/zenstack/migrations/20221020094651_upate_cli/migration.sql +23 -0
  120. package/samples/todo/zenstack/migrations/migration_lock.toml +3 -0
  121. package/samples/todo/zenstack/schema.prisma +126 -0
  122. package/samples/todo/zenstack/schema.zmodel +161 -0
  123. package/tests/integration/jest.config.ts +16 -0
  124. package/tests/integration/package-lock.json +1081 -0
  125. package/tests/integration/package.json +27 -0
  126. package/tests/integration/tests/operation-coverate.test.ts +563 -0
  127. package/tests/integration/tests/operations.zmodel +69 -0
  128. package/tests/integration/tests/todo-e2e.test.ts +577 -0
  129. package/tests/integration/tests/todo.zmodel +123 -0
  130. package/tests/integration/tests/tsconfig.template.json +10 -0
  131. package/tests/integration/tests/utils.ts +133 -0
  132. package/tests/integration/tsconfig.json +10 -0
  133. package/out/cli/cli-util.js +0 -64
  134. package/out/cli/cli-util.js.map +0 -1
  135. package/out/cli/generator.js +0 -1
  136. package/out/cli/generator.js.map +0 -1
  137. package/out/cli/index.js +0 -46
  138. package/out/cli/index.js.map +0 -1
  139. package/out/cli/package.template.json +0 -10
  140. package/out/extension.js +0 -81
  141. package/out/extension.js.map +0 -1
  142. package/out/generator/constants.js +0 -9
  143. package/out/generator/constants.js.map +0 -1
  144. package/out/generator/data-server/index.js +0 -1
  145. package/out/generator/data-server/index.js.map +0 -1
  146. package/out/generator/index.js +0 -98
  147. package/out/generator/index.js.map +0 -1
  148. package/out/generator/next-auth/index.js.map +0 -1
  149. package/out/generator/prisma/expression-writer.js +0 -287
  150. package/out/generator/prisma/expression-writer.js.map +0 -1
  151. package/out/generator/prisma/index.js +0 -38
  152. package/out/generator/prisma/index.js.map +0 -1
  153. package/out/generator/prisma/plain-expression-builder.js +0 -69
  154. package/out/generator/prisma/plain-expression-builder.js.map +0 -1
  155. package/out/generator/prisma/prisma-builder.js +0 -307
  156. package/out/generator/prisma/prisma-builder.js.map +0 -1
  157. package/out/generator/prisma/query-gard-generator.js +0 -159
  158. package/out/generator/prisma/query-gard-generator.js.map +0 -1
  159. package/out/generator/prisma/schema-generator.js +0 -201
  160. package/out/generator/prisma/schema-generator.js.map +0 -1
  161. package/out/generator/query-guard/index.js +0 -2
  162. package/out/generator/query-guard/index.js.map +0 -1
  163. package/out/generator/react-hooks/index.js +0 -179
  164. package/out/generator/react-hooks/index.js.map +0 -1
  165. package/out/generator/server/data/data-generator.js +0 -376
  166. package/out/generator/server/data/data-generator.js.map +0 -1
  167. package/out/generator/server/data/expression-writer.js +0 -287
  168. package/out/generator/server/data/expression-writer.js.map +0 -1
  169. package/out/generator/server/data/plain-expression-builder.js +0 -69
  170. package/out/generator/server/data/plain-expression-builder.js.map +0 -1
  171. package/out/generator/server/data-generator.js +0 -82
  172. package/out/generator/server/data-generator.js.map +0 -1
  173. package/out/generator/server/expression-writer.js +0 -1
  174. package/out/generator/server/expression-writer.js.map +0 -1
  175. package/out/generator/server/function/function-generator.js +0 -50
  176. package/out/generator/server/function/function-generator.js.map +0 -1
  177. package/out/generator/server/function-generator.js +0 -13
  178. package/out/generator/server/function-generator.js.map +0 -1
  179. package/out/generator/server/index.js +0 -88
  180. package/out/generator/server/index.js.map +0 -1
  181. package/out/generator/server/js-expression-builder.js +0 -1
  182. package/out/generator/server/js-expression-builder.js.map +0 -1
  183. package/out/generator/server/plain-expression-builder.js +0 -1
  184. package/out/generator/server/plain-expression-builder.js.map +0 -1
  185. package/out/generator/server/server-code-generator.js +0 -3
  186. package/out/generator/server/server-code-generator.js.map +0 -1
  187. package/out/generator/server/server-code-writer.js +0 -1
  188. package/out/generator/server/server-code-writer.js.map +0 -1
  189. package/out/generator/service/index.js +0 -133
  190. package/out/generator/service/index.js.map +0 -1
  191. package/out/generator/types.js +0 -10
  192. package/out/generator/types.js.map +0 -1
  193. package/out/generator/utils.js +0 -10
  194. package/out/generator/utils.js.map +0 -1
  195. package/out/language-server/generated/ast.js +0 -386
  196. package/out/language-server/generated/ast.js.map +0 -1
  197. package/out/language-server/generated/grammar.js.map +0 -1
  198. package/out/language-server/generated/module.js +0 -23
  199. package/out/language-server/generated/module.js.map +0 -1
  200. package/out/language-server/main.js +0 -12
  201. package/out/language-server/main.js.map +0 -1
  202. package/out/language-server/types.js +0 -3
  203. package/out/language-server/types.js.map +0 -1
  204. package/out/language-server/zmodel-index.js +0 -38
  205. package/out/language-server/zmodel-index.js.map +0 -1
  206. package/out/language-server/zmodel-linker.js +0 -241
  207. package/out/language-server/zmodel-linker.js.map +0 -1
  208. package/out/language-server/zmodel-module.js +0 -51
  209. package/out/language-server/zmodel-module.js.map +0 -1
  210. package/out/language-server/zmodel-scope.js +0 -30
  211. package/out/language-server/zmodel-scope.js.map +0 -1
  212. package/out/language-server/zmodel-validator.js +0 -25
  213. package/out/language-server/zmodel-validator.js.map +0 -1
  214. package/out/utils/indent-string.js +0 -9
  215. package/out/utils/indent-string.js.map +0 -1
@@ -0,0 +1,30 @@
1
+ {
2
+ "comments": {
3
+ // symbol used for single line comment. Remove this entry if your language does not support line comments
4
+ "lineComment": "//",
5
+ // symbols used for start and end a block comment. Remove this entry if your language does not support block comments
6
+ "blockComment": [ "/*", "*/" ]
7
+ },
8
+ // symbols used as brackets
9
+ "brackets": [
10
+ ["{", "}"],
11
+ ["[", "]"],
12
+ ["(", ")"]
13
+ ],
14
+ // symbols that are auto closed when typing
15
+ "autoClosingPairs": [
16
+ ["{", "}"],
17
+ ["[", "]"],
18
+ ["(", ")"],
19
+ ["\"", "\""],
20
+ ["'", "'"]
21
+ ],
22
+ // symbols that can be used to surround a selection
23
+ "surroundingPairs": [
24
+ ["{", "}"],
25
+ ["[", "]"],
26
+ ["(", ")"],
27
+ ["\"", "\""],
28
+ ["'", "'"]
29
+ ]
30
+ }
@@ -0,0 +1,96 @@
1
+ {
2
+ "name": "zenstack",
3
+ "displayName": "ZenStack CLI and Language Tools",
4
+ "description": "ZenStack CLI and Language Tools",
5
+ "version": "0.1.43",
6
+ "engines": {
7
+ "vscode": "^1.56.0"
8
+ },
9
+ "categories": [
10
+ "Programming Languages"
11
+ ],
12
+ "contributes": {
13
+ "languages": [
14
+ {
15
+ "id": "zmodel",
16
+ "aliases": [
17
+ "ZenStack Model",
18
+ "zmodel"
19
+ ],
20
+ "extensions": [
21
+ ".zmodel"
22
+ ],
23
+ "configuration": "./language-configuration.json",
24
+ "icon": {
25
+ "light": "./asset/logo-light.png",
26
+ "dark": "./asset/logo-dark.png"
27
+ }
28
+ }
29
+ ],
30
+ "grammars": [
31
+ {
32
+ "language": "zmodel",
33
+ "scopeName": "source.zmodel",
34
+ "path": "./syntaxes/zmodel.tmLanguage.json"
35
+ }
36
+ ]
37
+ },
38
+ "activationEvents": [
39
+ "onLanguage:zmodel"
40
+ ],
41
+ "files": [
42
+ "bin",
43
+ "out"
44
+ ],
45
+ "bin": {
46
+ "zenstack": "./bin/cli"
47
+ },
48
+ "main": "./out/extension.js",
49
+ "scripts": {
50
+ "vscode:prepublish": "npm run build && npm run lint",
51
+ "build": "tsc && tsc-alias && cp src/language-server/stdlib.zmodel ./out/language-server/ && cp src/generator/*.template.json ./out/generator/",
52
+ "ts:watch": "tsc --watch",
53
+ "tsc-alias:watch": "tsc-alias --watch",
54
+ "lint": "eslint src --ext ts",
55
+ "langium:generate": "langium generate",
56
+ "langium:watch": "langium generate --watch",
57
+ "watch": "concurrently --kill-others \"npm:langium:watch\" \"npm:ts:watch\" \"npm:tsc-alias:watch\"",
58
+ "test": "jest",
59
+ "prepublishOnly": "pnpm build"
60
+ },
61
+ "dependencies": {
62
+ "@zenstackhq/internal": "workspace:*",
63
+ "change-case": "^4.1.2",
64
+ "chevrotain": "^9.1.0",
65
+ "colors": "^1.4.0",
66
+ "commander": "^8.0.0",
67
+ "langium": "^0.4.0",
68
+ "prisma": "^4.4.0",
69
+ "promisify": "^0.0.3",
70
+ "ts-morph": "^16.0.0",
71
+ "vscode-jsonrpc": "^8.0.2",
72
+ "vscode-languageclient": "^7.0.0",
73
+ "vscode-languageserver": "^7.0.0",
74
+ "vscode-uri": "^3.0.2"
75
+ },
76
+ "devDependencies": {
77
+ "@prisma/internals": "^4.4.0",
78
+ "@types/jest": "^29.0.3",
79
+ "@types/node": "^14.18.29",
80
+ "@types/tmp": "^0.2.3",
81
+ "@types/uuid": "^8.3.4",
82
+ "@types/vscode": "^1.56.0",
83
+ "@typescript-eslint/eslint-plugin": "^4.14.1",
84
+ "@typescript-eslint/parser": "^4.14.1",
85
+ "concurrently": "^7.4.0",
86
+ "eslint": "^7.19.0",
87
+ "jest": "^29.0.3",
88
+ "langium-cli": "^0.4.0",
89
+ "tmp": "^0.2.1",
90
+ "ts-jest": "^29.0.1",
91
+ "ts-node": "^10.9.1",
92
+ "tsc-alias": "^1.7.0",
93
+ "tsconfig-paths-jest": "^0.0.1",
94
+ "typescript": "^4.6.2"
95
+ }
96
+ }
@@ -0,0 +1,80 @@
1
+ import colors from 'colors';
2
+ import path from 'path';
3
+ import fs from 'fs';
4
+ import { AstNode, LangiumDocument, LangiumServices } from 'langium';
5
+ import { URI } from 'vscode-uri';
6
+
7
+ export async function extractDocument(
8
+ fileName: string,
9
+ services: LangiumServices
10
+ ): Promise<LangiumDocument> {
11
+ const extensions = services.LanguageMetaData.fileExtensions;
12
+ if (!extensions.includes(path.extname(fileName))) {
13
+ console.error(
14
+ colors.yellow(
15
+ `Please choose a file with one of these extensions: ${extensions}.`
16
+ )
17
+ );
18
+ process.exit(1);
19
+ }
20
+
21
+ if (!fs.existsSync(fileName)) {
22
+ console.error(colors.red(`File ${fileName} does not exist.`));
23
+ process.exit(1);
24
+ }
25
+
26
+ const stdLib =
27
+ services.shared.workspace.LangiumDocuments.getOrCreateDocument(
28
+ URI.file(path.join(__dirname, '../language-server/stdlib.zmodel'))
29
+ );
30
+ const document =
31
+ services.shared.workspace.LangiumDocuments.getOrCreateDocument(
32
+ URI.file(path.resolve(fileName))
33
+ );
34
+ await services.shared.workspace.DocumentBuilder.build([stdLib, document], {
35
+ validationChecks: 'all',
36
+ });
37
+
38
+ const validationErrors = (document.diagnostics ?? []).filter(
39
+ (e) => e.severity === 1
40
+ );
41
+ if (validationErrors.length > 0) {
42
+ console.error(colors.red('There are validation errors:'));
43
+ for (const validationError of validationErrors) {
44
+ console.error(
45
+ colors.red(
46
+ `line ${validationError.range.start.line + 1}: ${
47
+ validationError.message
48
+ } [${document.textDocument.getText(validationError.range)}]`
49
+ )
50
+ );
51
+ }
52
+ process.exit(1);
53
+ }
54
+
55
+ return document;
56
+ }
57
+
58
+ export async function extractAstNode<T extends AstNode>(
59
+ fileName: string,
60
+ services: LangiumServices
61
+ ): Promise<T> {
62
+ return (await extractDocument(fileName, services)).parseResult?.value as T;
63
+ }
64
+
65
+ interface FilePathData {
66
+ destination: string;
67
+ name: string;
68
+ }
69
+
70
+ export function extractDestinationAndName(
71
+ filePath: string,
72
+ destination: string | undefined
73
+ ): FilePathData {
74
+ filePath = filePath.replace(/\..*$/, '').replace(/[.-]/g, '');
75
+ return {
76
+ destination:
77
+ destination ?? path.join(path.dirname(filePath), 'generated'),
78
+ name: path.basename(filePath),
79
+ };
80
+ }
@@ -0,0 +1,64 @@
1
+ import { Command } from 'commander';
2
+ import { Model } from '../language-server/generated/ast';
3
+ import { ZModelLanguageMetaData } from '../language-server/generated/module';
4
+ import { createZModelServices } from '../language-server/zmodel-module';
5
+ import { extractAstNode } from './cli-util';
6
+ import { Context, GeneratorError } from '../generator/types';
7
+ import { ZenStackGenerator } from '../generator';
8
+ import { GENERATED_CODE_PATH } from '../generator/constants';
9
+ import colors from 'colors';
10
+
11
+ export const generateAction = async (
12
+ fileName: string,
13
+ opts: GenerateOptions
14
+ ): Promise<void> => {
15
+ const services = createZModelServices().ZModel;
16
+ const model = await extractAstNode<Model>(fileName, services);
17
+
18
+ const context: Context = {
19
+ schema: model,
20
+ outDir: opts.destination || './zenstack',
21
+ // TODO: make this configurable
22
+ generatedCodeDir: GENERATED_CODE_PATH,
23
+ };
24
+
25
+ try {
26
+ await new ZenStackGenerator().generate(context);
27
+ } catch (err) {
28
+ if (err instanceof GeneratorError) {
29
+ console.error(colors.red(err.message));
30
+ process.exit(-1);
31
+ }
32
+ }
33
+ };
34
+
35
+ export type GenerateOptions = {
36
+ destination?: string;
37
+ };
38
+
39
+ export default function (): void {
40
+ const program = new Command('zenstack');
41
+
42
+ program.version(
43
+ require('../../package.json').version,
44
+ '-v --version',
45
+ 'display CLI version'
46
+ );
47
+
48
+ program.description(
49
+ `${colors.bold.blue(
50
+ 'ζ'
51
+ )} ZenStack simplifies fullstack development by generating backend services and Typescript clients from a data model.\n\nDocumentation: https://zenstack.dev/doc.`
52
+ );
53
+
54
+ const fileExtensions = ZModelLanguageMetaData.fileExtensions.join(', ');
55
+ program
56
+ .command('generate')
57
+ .argument('<file>', `source file (with extension ${fileExtensions})`)
58
+ .description(
59
+ 'generates RESTful API and Typescript client for your data model'
60
+ )
61
+ .action(generateAction);
62
+
63
+ program.parse(process.argv);
64
+ }
@@ -0,0 +1,76 @@
1
+ import * as vscode from 'vscode';
2
+ import * as path from 'path';
3
+ import {
4
+ LanguageClient,
5
+ LanguageClientOptions,
6
+ ServerOptions,
7
+ TransportKind,
8
+ } from 'vscode-languageclient/node';
9
+
10
+ let client: LanguageClient;
11
+
12
+ // This function is called when the extension is activated.
13
+ export function activate(context: vscode.ExtensionContext): void {
14
+ client = startLanguageClient(context);
15
+ }
16
+
17
+ // This function is called when the extension is deactivated.
18
+ export function deactivate(): Thenable<void> | undefined {
19
+ if (client) {
20
+ return client.stop();
21
+ }
22
+ return undefined;
23
+ }
24
+
25
+ function startLanguageClient(context: vscode.ExtensionContext): LanguageClient {
26
+ const serverModule = context.asAbsolutePath(
27
+ path.join('out', 'language-server', 'main')
28
+ );
29
+ // The debug options for the server
30
+ // --inspect=6009: runs the server in Node's Inspector mode so VS Code can attach to the server for debugging.
31
+ // By setting `process.env.DEBUG_BREAK` to a truthy value, the language server will wait until a debugger is attached.
32
+ const debugOptions = {
33
+ execArgv: [
34
+ '--nolazy',
35
+ `--inspect${process.env.DEBUG_BREAK ? '-brk' : ''}=${
36
+ process.env.DEBUG_SOCKET || '6009'
37
+ }`,
38
+ ],
39
+ };
40
+
41
+ // If the extension is launched in debug mode then the debug server options are used
42
+ // Otherwise the run options are used
43
+ const serverOptions: ServerOptions = {
44
+ run: { module: serverModule, transport: TransportKind.ipc },
45
+ debug: {
46
+ module: serverModule,
47
+ transport: TransportKind.ipc,
48
+ options: debugOptions,
49
+ },
50
+ };
51
+
52
+ const fileSystemWatcher =
53
+ vscode.workspace.createFileSystemWatcher('**/*.zmodel');
54
+ context.subscriptions.push(fileSystemWatcher);
55
+
56
+ // Options to control the language client
57
+ const clientOptions: LanguageClientOptions = {
58
+ documentSelector: [{ scheme: 'file', language: 'zmodel' }],
59
+ synchronize: {
60
+ // Notify the server about file changes to files contained in the workspace
61
+ fileEvents: fileSystemWatcher,
62
+ },
63
+ };
64
+
65
+ // Create the language client and start the client.
66
+ const client = new LanguageClient(
67
+ 'zmodel',
68
+ 'ZenStack Model',
69
+ serverOptions,
70
+ clientOptions
71
+ );
72
+
73
+ // Start the client. This will also launch the server
74
+ client.start();
75
+ return client;
76
+ }
@@ -0,0 +1,5 @@
1
+ export const INTERNAL_PACKAGE = '@zenstackhq/internal';
2
+ export const GUARD_FIELD_NAME = 'zenstack_guard';
3
+ export const TRANSACTION_FIELD_NAME = 'zenstack_transaction';
4
+ export const API_ROUTE_NAME = 'zenstack';
5
+ export const GENERATED_CODE_PATH = 'node_modules/.zenstack';
@@ -0,0 +1,92 @@
1
+ import { Context, GeneratorError } from './types';
2
+ import * as fs from 'fs';
3
+ import colors from 'colors';
4
+ import PrismaGenerator from './prisma';
5
+ import ServiceGenerator from './service';
6
+ import ReactHooksGenerator from './react-hooks';
7
+ import NextAuthGenerator from './next-auth';
8
+ import path from 'path';
9
+ import { execSync } from '../utils/exec-utils';
10
+
11
+ export class ZenStackGenerator {
12
+ async generate(context: Context) {
13
+ // folder that stores generated prisma schema and migrations
14
+ if (!fs.existsSync(context.outDir)) {
15
+ fs.mkdirSync(context.outDir);
16
+ }
17
+
18
+ // folder that stores generated zenstack code
19
+ if (fs.existsSync(context.generatedCodeDir)) {
20
+ fs.rmSync(context.generatedCodeDir, {
21
+ force: true,
22
+ recursive: true,
23
+ });
24
+ }
25
+ fs.mkdirSync(context.generatedCodeDir);
26
+
27
+ const version = require('../../package.json').version;
28
+ console.log(colors.bold(`⌛️ Running ZenStack generator v${version}`));
29
+
30
+ const generators = [
31
+ new PrismaGenerator(),
32
+ new ServiceGenerator(),
33
+ new ReactHooksGenerator(),
34
+ ];
35
+
36
+ try {
37
+ require('next-auth');
38
+ generators.push(new NextAuthGenerator());
39
+ } catch {
40
+ console.warn(
41
+ colors.yellow(
42
+ 'Next-auth module is not installed, skipping generating adapter.'
43
+ )
44
+ );
45
+ }
46
+
47
+ for (const generator of generators) {
48
+ await generator.generate(context);
49
+ }
50
+
51
+ // generate package.json
52
+ const packageJson = require(path.join(
53
+ __dirname,
54
+ 'package.template.json'
55
+ ));
56
+ fs.writeFileSync(
57
+ path.join(context.generatedCodeDir, 'package.json'),
58
+ JSON.stringify(packageJson, undefined, 4)
59
+ );
60
+
61
+ // compile ts sources
62
+ const tsConfig = require(path.join(
63
+ __dirname,
64
+ 'tsconfig.template.json'
65
+ ));
66
+ fs.writeFileSync(
67
+ path.join(context.generatedCodeDir, 'tsconfig.json'),
68
+ JSON.stringify(tsConfig, undefined, 4)
69
+ );
70
+
71
+ try {
72
+ execSync(
73
+ `npx tsc -p "${path.join(
74
+ context.generatedCodeDir,
75
+ 'tsconfig.json'
76
+ )}"`
77
+ );
78
+ } catch {
79
+ throw new GeneratorError(
80
+ 'Something went wrong, generated runtime code failed to compile...\nPlease check errors above.'
81
+ );
82
+ }
83
+
84
+ console.log(colors.blue(' ✔️ Typescript source files transpiled'));
85
+
86
+ console.log(
87
+ colors.green(
88
+ colors.bold('👻 All generators completed successfully!')
89
+ )
90
+ );
91
+ }
92
+ }
@@ -1,63 +1,37 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
- return new (P || (P = Promise))(function (resolve, reject) {
28
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
- step((generator = generator.apply(thisArg, _arguments || [])).next());
32
- });
33
- };
34
- var __importDefault = (this && this.__importDefault) || function (mod) {
35
- return (mod && mod.__esModule) ? mod : { "default": mod };
36
- };
37
- Object.defineProperty(exports, "__esModule", { value: true });
38
- const ts_morph_1 = require("ts-morph");
39
- const path = __importStar(require("path"));
40
- const colors_1 = __importDefault(require("colors"));
41
- class NextAuthGenerator {
42
- generate(context) {
43
- return __awaiter(this, void 0, void 0, function* () {
44
- const project = new ts_morph_1.Project();
45
- this.generateIndex(project, context);
46
- this.generateAdapter(project, context);
47
- this.generateAuthorize(project, context);
48
- yield project.save();
49
- console.log(colors_1.default.blue(` ✔️ Next-auth adapter generated`));
50
- });
1
+ import { Context, Generator } from '../types';
2
+ import { Project } from 'ts-morph';
3
+ import * as path from 'path';
4
+ import colors from 'colors';
5
+
6
+ export default class NextAuthGenerator implements Generator {
7
+ async generate(context: Context) {
8
+ const project = new Project();
9
+
10
+ this.generateIndex(project, context);
11
+ this.generateAdapter(project, context);
12
+ this.generateAuthorize(project, context);
13
+
14
+ await project.save();
15
+
16
+ console.log(colors.blue(` ✔️ Next-auth adapter generated`));
51
17
  }
52
- generateIndex(project, context) {
53
- const sf = project.createSourceFile(path.join(context.generatedCodeDir, 'src/auth/index.ts'), undefined, { overwrite: true });
18
+
19
+ generateIndex(project: Project, context: Context) {
20
+ const sf = project.createSourceFile(
21
+ path.join(context.generatedCodeDir, 'src/auth/index.ts'),
22
+ undefined,
23
+ { overwrite: true }
24
+ );
25
+
54
26
  sf.addStatements([
55
27
  `export * from './next-auth-adapter';`,
56
28
  `export * from './authorize';`,
57
29
  ]);
30
+
58
31
  sf.formatText();
59
32
  }
60
- generateAdapter(project, context) {
33
+
34
+ generateAdapter(project: Project, context: Context) {
61
35
  const content = `
62
36
  import { ZenStackService } from '..';
63
37
  import { Adapter } from 'next-auth/adapters';
@@ -118,10 +92,20 @@ class NextAuthGenerator {
118
92
  };
119
93
  }
120
94
  `;
121
- const sf = project.createSourceFile(path.join(context.generatedCodeDir, 'src/auth/next-auth-adapter.ts'), content, { overwrite: true });
95
+
96
+ const sf = project.createSourceFile(
97
+ path.join(
98
+ context.generatedCodeDir,
99
+ 'src/auth/next-auth-adapter.ts'
100
+ ),
101
+ content,
102
+ { overwrite: true }
103
+ );
104
+
122
105
  sf.formatText();
123
106
  }
124
- generateAuthorize(project, context) {
107
+
108
+ generateAuthorize(project: Project, context: Context) {
125
109
  const content = `
126
110
  import { ZenStackService } from '..';
127
111
  import { hash, compare } from 'bcryptjs';
@@ -201,9 +185,13 @@ class NextAuthGenerator {
201
185
  };
202
186
  }
203
187
  `;
204
- const sf = project.createSourceFile(path.join(context.generatedCodeDir, 'src/auth/authorize.ts'), content, { overwrite: true });
188
+
189
+ const sf = project.createSourceFile(
190
+ path.join(context.generatedCodeDir, 'src/auth/authorize.ts'),
191
+ content,
192
+ { overwrite: true }
193
+ );
194
+
205
195
  sf.formatText();
206
196
  }
207
197
  }
208
- exports.default = NextAuthGenerator;
209
- //# sourceMappingURL=index.js.map