zenstack 0.1.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 (103) hide show
  1. package/LICENSE +21 -0
  2. package/bin/cli +3 -0
  3. package/out/cli/cli-util.js +64 -0
  4. package/out/cli/cli-util.js.map +1 -0
  5. package/out/cli/generator.js +1 -0
  6. package/out/cli/generator.js.map +1 -0
  7. package/out/cli/index.js +90 -0
  8. package/out/cli/index.js.map +1 -0
  9. package/out/extension.js +81 -0
  10. package/out/extension.js.map +1 -0
  11. package/out/generator/data-server/index.js +1 -0
  12. package/out/generator/data-server/index.js.map +1 -0
  13. package/out/generator/next-auth/index.js +196 -0
  14. package/out/generator/next-auth/index.js.map +1 -0
  15. package/out/generator/prisma/index.js +212 -0
  16. package/out/generator/prisma/index.js.map +1 -0
  17. package/out/generator/prisma/prisma-builder.js +307 -0
  18. package/out/generator/prisma/prisma-builder.js.map +1 -0
  19. package/out/generator/react-hooks/index.js +258 -0
  20. package/out/generator/react-hooks/index.js.map +1 -0
  21. package/out/generator/server/data/data-generator.js +376 -0
  22. package/out/generator/server/data/data-generator.js.map +1 -0
  23. package/out/generator/server/data/expression-writer.js +281 -0
  24. package/out/generator/server/data/expression-writer.js.map +1 -0
  25. package/out/generator/server/data/plain-expression-builder.js +53 -0
  26. package/out/generator/server/data/plain-expression-builder.js.map +1 -0
  27. package/out/generator/server/data-generator.js +82 -0
  28. package/out/generator/server/data-generator.js.map +1 -0
  29. package/out/generator/server/expression-writer.js +1 -0
  30. package/out/generator/server/expression-writer.js.map +1 -0
  31. package/out/generator/server/function/function-generator.js +50 -0
  32. package/out/generator/server/function/function-generator.js.map +1 -0
  33. package/out/generator/server/function-generator.js +13 -0
  34. package/out/generator/server/function-generator.js.map +1 -0
  35. package/out/generator/server/index.js +88 -0
  36. package/out/generator/server/index.js.map +1 -0
  37. package/out/generator/server/js-expression-builder.js +1 -0
  38. package/out/generator/server/js-expression-builder.js.map +1 -0
  39. package/out/generator/server/plain-expression-builder.js +1 -0
  40. package/out/generator/server/plain-expression-builder.js.map +1 -0
  41. package/out/generator/server/server-code-generator.js +3 -0
  42. package/out/generator/server/server-code-generator.js.map +1 -0
  43. package/out/generator/server/server-code-writer.js +1 -0
  44. package/out/generator/server/server-code-writer.js.map +1 -0
  45. package/out/generator/service/index.js +72 -0
  46. package/out/generator/service/index.js.map +1 -0
  47. package/out/generator/types.js +10 -0
  48. package/out/generator/types.js.map +1 -0
  49. package/out/generator/utils.js +10 -0
  50. package/out/generator/utils.js.map +1 -0
  51. package/out/language-server/generated/ast.js +386 -0
  52. package/out/language-server/generated/ast.js.map +1 -0
  53. package/out/language-server/generated/grammar.js +2193 -0
  54. package/out/language-server/generated/grammar.js.map +1 -0
  55. package/out/language-server/generated/module.js +23 -0
  56. package/out/language-server/generated/module.js.map +1 -0
  57. package/out/language-server/main.js +12 -0
  58. package/out/language-server/main.js.map +1 -0
  59. package/out/language-server/stdlib.zmodel +21 -0
  60. package/out/language-server/types.js +3 -0
  61. package/out/language-server/types.js.map +1 -0
  62. package/out/language-server/zmodel-index.js +38 -0
  63. package/out/language-server/zmodel-index.js.map +1 -0
  64. package/out/language-server/zmodel-linker.js +239 -0
  65. package/out/language-server/zmodel-linker.js.map +1 -0
  66. package/out/language-server/zmodel-module.js +51 -0
  67. package/out/language-server/zmodel-module.js.map +1 -0
  68. package/out/language-server/zmodel-scope.js +30 -0
  69. package/out/language-server/zmodel-scope.js.map +1 -0
  70. package/out/language-server/zmodel-validator.js +25 -0
  71. package/out/language-server/zmodel-validator.js.map +1 -0
  72. package/out/utils/indent-string.js +25 -0
  73. package/out/utils/indent-string.js.map +1 -0
  74. package/package.json +94 -0
  75. package/src/cli/cli-util.ts +80 -0
  76. package/src/cli/index.ts +80 -0
  77. package/src/extension.ts +76 -0
  78. package/src/generator/next-auth/index.ts +183 -0
  79. package/src/generator/prisma/index.ts +323 -0
  80. package/src/generator/prisma/prisma-builder.ts +366 -0
  81. package/src/generator/react-hooks/index.ts +267 -0
  82. package/src/generator/server/data/data-generator.ts +483 -0
  83. package/src/generator/server/data/expression-writer.ts +350 -0
  84. package/src/generator/server/data/plain-expression-builder.ts +72 -0
  85. package/src/generator/server/function/function-generator.ts +32 -0
  86. package/src/generator/server/index.ts +57 -0
  87. package/src/generator/server/server-code-generator.ts +6 -0
  88. package/src/generator/service/index.ts +43 -0
  89. package/src/generator/types.ts +16 -0
  90. package/src/generator/utils.ts +9 -0
  91. package/src/language-server/generated/ast.ts +603 -0
  92. package/src/language-server/generated/grammar.ts +2190 -0
  93. package/src/language-server/generated/module.ts +24 -0
  94. package/src/language-server/main.ts +12 -0
  95. package/src/language-server/stdlib.zmodel +21 -0
  96. package/src/language-server/types.ts +9 -0
  97. package/src/language-server/zmodel-index.ts +33 -0
  98. package/src/language-server/zmodel-linker.ts +407 -0
  99. package/src/language-server/zmodel-module.ts +90 -0
  100. package/src/language-server/zmodel-scope.ts +21 -0
  101. package/src/language-server/zmodel-validator.ts +35 -0
  102. package/src/language-server/zmodel.langium +186 -0
  103. package/src/utils/indent-string.ts +41 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2022 zenstack-hq
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/bin/cli ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+
3
+ require("../out/cli").default();
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.extractDestinationAndName = exports.extractAstNode = exports.extractDocument = void 0;
16
+ const colors_1 = __importDefault(require("colors"));
17
+ const path_1 = __importDefault(require("path"));
18
+ const fs_1 = __importDefault(require("fs"));
19
+ const vscode_uri_1 = require("vscode-uri");
20
+ function extractDocument(fileName, services) {
21
+ var _a;
22
+ return __awaiter(this, void 0, void 0, function* () {
23
+ const extensions = services.LanguageMetaData.fileExtensions;
24
+ if (!extensions.includes(path_1.default.extname(fileName))) {
25
+ console.error(colors_1.default.yellow(`Please choose a file with one of these extensions: ${extensions}.`));
26
+ process.exit(1);
27
+ }
28
+ if (!fs_1.default.existsSync(fileName)) {
29
+ console.error(colors_1.default.red(`File ${fileName} does not exist.`));
30
+ process.exit(1);
31
+ }
32
+ const stdLib = services.shared.workspace.LangiumDocuments.getOrCreateDocument(vscode_uri_1.URI.file(path_1.default.join(__dirname, '../language-server/stdlib.zmodel')));
33
+ const document = services.shared.workspace.LangiumDocuments.getOrCreateDocument(vscode_uri_1.URI.file(path_1.default.resolve(fileName)));
34
+ yield services.shared.workspace.DocumentBuilder.build([stdLib, document], {
35
+ validationChecks: 'all',
36
+ });
37
+ const validationErrors = ((_a = document.diagnostics) !== null && _a !== void 0 ? _a : []).filter((e) => e.severity === 1);
38
+ if (validationErrors.length > 0) {
39
+ console.error(colors_1.default.red('There are validation errors:'));
40
+ for (const validationError of validationErrors) {
41
+ console.error(colors_1.default.red(`line ${validationError.range.start.line + 1}: ${validationError.message} [${document.textDocument.getText(validationError.range)}]`));
42
+ }
43
+ process.exit(1);
44
+ }
45
+ return document;
46
+ });
47
+ }
48
+ exports.extractDocument = extractDocument;
49
+ function extractAstNode(fileName, services) {
50
+ var _a;
51
+ return __awaiter(this, void 0, void 0, function* () {
52
+ return (_a = (yield extractDocument(fileName, services)).parseResult) === null || _a === void 0 ? void 0 : _a.value;
53
+ });
54
+ }
55
+ exports.extractAstNode = extractAstNode;
56
+ function extractDestinationAndName(filePath, destination) {
57
+ filePath = filePath.replace(/\..*$/, '').replace(/[.-]/g, '');
58
+ return {
59
+ destination: destination !== null && destination !== void 0 ? destination : path_1.default.join(path_1.default.dirname(filePath), 'generated'),
60
+ name: path_1.default.basename(filePath),
61
+ };
62
+ }
63
+ exports.extractDestinationAndName = extractDestinationAndName;
64
+ //# sourceMappingURL=cli-util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-util.js","sourceRoot":"","sources":["../../src/cli/cli-util.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ 'use strict';var __importDefault=this&&this.__importDefault||function(mod){return mod&&mod.__esModule?mod:{'default':mod};};Object.defineProperty(exports,'__esModule',{value:true});exports.generateJavaScript=void 0;const fs_1=__importDefault(require('fs'));const langium_1=require('langium');const path_1=__importDefault(require('path'));const cli_util_1=require('./cli-util');function generateJavaScript(model,filePath,destination){const data=(0,cli_util_1.extractDestinationAndName)(filePath,destination);const generatedFilePath=`${path_1.default.join(data.destination,data.name)}.js`;const fileNode=new langium_1.CompositeGeneratorNode();fileNode.append('"use strict";',langium_1.NL,langium_1.NL);if(!fs_1.default.existsSync(data.destination)){fs_1.default.mkdirSync(data.destination,{recursive:true});}fs_1.default.writeFileSync(generatedFilePath,(0,langium_1.processGeneratorNode)(fileNode));return generatedFilePath;}exports.generateJavaScript=generateJavaScript;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/cli/generator.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,qCAA2E;AAC3E,gDAAwB;AAExB,yCAAuD;AAEvD,SAAgB,kBAAkB,CAC9B,KAAY,EACZ,QAAgB,EAChB,WAA+B;IAE/B,MAAM,IAAI,GAAG,IAAA,oCAAyB,EAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC9D,MAAM,iBAAiB,GAAG,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;IAEzE,MAAM,QAAQ,GAAG,IAAI,gCAAsB,EAAE,CAAC;IAC9C,QAAQ,CAAC,MAAM,CAAC,eAAe,EAAE,YAAE,EAAE,YAAE,CAAC,CAAC;IACzC,oHAAoH;IAEpH,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;QAClC,YAAE,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;KACvD;IACD,YAAE,CAAC,aAAa,CAAC,iBAAiB,EAAE,IAAA,8BAAoB,EAAC,QAAQ,CAAC,CAAC,CAAC;IACpE,OAAO,iBAAiB,CAAC;AAC7B,CAAC;AAjBD,gDAiBC"}
@@ -0,0 +1,90 @@
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
+ exports.generateAction = void 0;
39
+ const commander_1 = require("commander");
40
+ const module_1 = require("../language-server/generated/module");
41
+ const zmodel_module_1 = require("../language-server/zmodel-module");
42
+ const cli_util_1 = require("./cli-util");
43
+ const path = __importStar(require("path"));
44
+ const fs = __importStar(require("fs"));
45
+ const colors_1 = __importDefault(require("colors"));
46
+ const prisma_1 = __importDefault(require("../generator/prisma"));
47
+ const service_1 = __importDefault(require("../generator/service"));
48
+ const react_hooks_1 = __importDefault(require("../generator/react-hooks"));
49
+ const next_auth_1 = __importDefault(require("../generator/next-auth"));
50
+ const server_1 = __importDefault(require("../generator/server"));
51
+ const generateAction = (fileName, opts) => __awaiter(void 0, void 0, void 0, function* () {
52
+ const services = (0, zmodel_module_1.createZModelServices)().ZModel;
53
+ const model = yield (0, cli_util_1.extractAstNode)(fileName, services);
54
+ const context = {
55
+ schema: model,
56
+ outDir: path.resolve(opts.destination),
57
+ };
58
+ if (!fs.existsSync(context.outDir)) {
59
+ fs.mkdirSync(context.outDir);
60
+ }
61
+ console.log(colors_1.default.bold('⌛️ Running ZenStack generators'));
62
+ const generators = [
63
+ new prisma_1.default(),
64
+ new service_1.default(),
65
+ new react_hooks_1.default(),
66
+ new server_1.default(),
67
+ new next_auth_1.default(),
68
+ ];
69
+ for (const generator of generators) {
70
+ yield generator.generate(context);
71
+ }
72
+ console.log(colors_1.default.green(colors_1.default.bold('👻 All generators completed successfully!')));
73
+ });
74
+ exports.generateAction = generateAction;
75
+ function default_1() {
76
+ const program = new commander_1.Command();
77
+ program
78
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
79
+ .version(require('../../package.json').version);
80
+ const fileExtensions = module_1.ZModelLanguageMetaData.fileExtensions.join(', ');
81
+ program
82
+ .command('generate')
83
+ .argument('<file>', `source file (possible file extensions: ${fileExtensions})`)
84
+ .option('-d, --destination <dir>', 'destination directory of generating', '.zenstack')
85
+ .description('generates JavaScript code that prints "Hello, {name}!" for each greeting in a source file')
86
+ .action(exports.generateAction);
87
+ program.parse(process.argv);
88
+ }
89
+ exports.default = default_1;
90
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yCAAoC;AAEpC,gEAA6E;AAC7E,oEAAwE;AACxE,yCAA4C;AAE5C,2CAA6B;AAC7B,uCAAyB;AACzB,oDAA4B;AAC5B,iEAAkD;AAClD,mEAAoD;AACpD,2EAA2D;AAC3D,uEAAuD;AACvD,iEAAkD;AAE3C,MAAM,cAAc,GAAG,CAC1B,QAAgB,EAChB,IAAqB,EACR,EAAE;IACf,MAAM,QAAQ,GAAG,IAAA,oCAAoB,GAAE,CAAC,MAAM,CAAC;IAC/C,MAAM,KAAK,GAAG,MAAM,IAAA,yBAAc,EAAQ,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAE9D,MAAM,OAAO,GAAY;QACrB,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;KACzC,CAAC;IAEF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QAChC,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;KAChC;IAED,OAAO,CAAC,GAAG,CAAC,gBAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;IAE3D,MAAM,UAAU,GAAG;QACf,IAAI,gBAAe,EAAE;QACrB,IAAI,iBAAgB,EAAE;QACtB,IAAI,qBAAmB,EAAE;QACzB,IAAI,gBAAe,EAAE;QACrB,IAAI,mBAAiB,EAAE;KAC1B,CAAC;IAEF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;QAChC,MAAM,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;KACrC;IAED,OAAO,CAAC,GAAG,CACP,gBAAM,CAAC,KAAK,CAAC,gBAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC,CACzE,CAAC;AACN,CAAC,CAAA,CAAC;AAjCW,QAAA,cAAc,kBAiCzB;AAMF;IACI,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;IAE9B,OAAO;QACH,8DAA8D;SAC7D,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC,CAAC;IAEpD,MAAM,cAAc,GAAG,+BAAsB,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxE,OAAO;SACF,OAAO,CAAC,UAAU,CAAC;SACnB,QAAQ,CACL,QAAQ,EACR,0CAA0C,cAAc,GAAG,CAC9D;SACA,MAAM,CACH,yBAAyB,EACzB,qCAAqC,EACrC,WAAW,CACd;SACA,WAAW,CACR,2FAA2F,CAC9F;SACA,MAAM,CAAC,sBAAc,CAAC,CAAC;IAE5B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAzBD,4BAyBC"}
@@ -0,0 +1,81 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.deactivate = exports.activate = void 0;
27
+ const vscode = __importStar(require("vscode"));
28
+ const path = __importStar(require("path"));
29
+ const node_1 = require("vscode-languageclient/node");
30
+ let client;
31
+ // This function is called when the extension is activated.
32
+ function activate(context) {
33
+ client = startLanguageClient(context);
34
+ }
35
+ exports.activate = activate;
36
+ // This function is called when the extension is deactivated.
37
+ function deactivate() {
38
+ if (client) {
39
+ return client.stop();
40
+ }
41
+ return undefined;
42
+ }
43
+ exports.deactivate = deactivate;
44
+ function startLanguageClient(context) {
45
+ const serverModule = context.asAbsolutePath(path.join('out', 'language-server', 'main'));
46
+ // The debug options for the server
47
+ // --inspect=6009: runs the server in Node's Inspector mode so VS Code can attach to the server for debugging.
48
+ // By setting `process.env.DEBUG_BREAK` to a truthy value, the language server will wait until a debugger is attached.
49
+ const debugOptions = {
50
+ execArgv: [
51
+ '--nolazy',
52
+ `--inspect${process.env.DEBUG_BREAK ? '-brk' : ''}=${process.env.DEBUG_SOCKET || '6009'}`,
53
+ ],
54
+ };
55
+ // If the extension is launched in debug mode then the debug server options are used
56
+ // Otherwise the run options are used
57
+ const serverOptions = {
58
+ run: { module: serverModule, transport: node_1.TransportKind.ipc },
59
+ debug: {
60
+ module: serverModule,
61
+ transport: node_1.TransportKind.ipc,
62
+ options: debugOptions,
63
+ },
64
+ };
65
+ const fileSystemWatcher = vscode.workspace.createFileSystemWatcher('**/*.zmodel');
66
+ context.subscriptions.push(fileSystemWatcher);
67
+ // Options to control the language client
68
+ const clientOptions = {
69
+ documentSelector: [{ scheme: 'file', language: 'zmodel' }],
70
+ synchronize: {
71
+ // Notify the server about file changes to files contained in the workspace
72
+ fileEvents: fileSystemWatcher,
73
+ },
74
+ };
75
+ // Create the language client and start the client.
76
+ const client = new node_1.LanguageClient('zmodel', 'ZenStack Model', serverOptions, clientOptions);
77
+ // Start the client. This will also launch the server
78
+ client.start();
79
+ return client;
80
+ }
81
+ //# sourceMappingURL=extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAiC;AACjC,2CAA6B;AAC7B,qDAKoC;AAEpC,IAAI,MAAsB,CAAC;AAE3B,2DAA2D;AAC3D,SAAgB,QAAQ,CAAC,OAAgC;IACrD,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC1C,CAAC;AAFD,4BAEC;AAED,6DAA6D;AAC7D,SAAgB,UAAU;IACtB,IAAI,MAAM,EAAE;QACR,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;KACxB;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AALD,gCAKC;AAED,SAAS,mBAAmB,CAAC,OAAgC;IACzD,MAAM,YAAY,GAAG,OAAO,CAAC,cAAc,CACvC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,iBAAiB,EAAE,MAAM,CAAC,CAC9C,CAAC;IACF,mCAAmC;IACnC,8GAA8G;IAC9G,sHAAsH;IACtH,MAAM,YAAY,GAAG;QACjB,QAAQ,EAAE;YACN,UAAU;YACV,YAAY,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAC7C,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,MAChC,EAAE;SACL;KACJ,CAAC;IAEF,oFAAoF;IACpF,qCAAqC;IACrC,MAAM,aAAa,GAAkB;QACjC,GAAG,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,oBAAa,CAAC,GAAG,EAAE;QAC3D,KAAK,EAAE;YACH,MAAM,EAAE,YAAY;YACpB,SAAS,EAAE,oBAAa,CAAC,GAAG;YAC5B,OAAO,EAAE,YAAY;SACxB;KACJ,CAAC;IAEF,MAAM,iBAAiB,GACnB,MAAM,CAAC,SAAS,CAAC,uBAAuB,CAAC,aAAa,CAAC,CAAC;IAC5D,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAE9C,yCAAyC;IACzC,MAAM,aAAa,GAA0B;QACzC,gBAAgB,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;QAC1D,WAAW,EAAE;YACT,2EAA2E;YAC3E,UAAU,EAAE,iBAAiB;SAChC;KACJ,CAAC;IAEF,mDAAmD;IACnD,MAAM,MAAM,GAAG,IAAI,qBAAc,CAC7B,QAAQ,EACR,gBAAgB,EAChB,aAAa,EACb,aAAa,CAChB,CAAC;IAEF,qDAAqD;IACrD,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,OAAO,MAAM,CAAC;AAClB,CAAC"}
@@ -0,0 +1 @@
1
+ 'use strict';var __awaiter=this&&this.__awaiter||function(thisArg,_arguments,P,generator){function adopt(value){return value instanceof P?value:new P(function(resolve){resolve(value);});}return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value));}catch(e){reject(e);}}function rejected(value){try{step(generator['throw'](value));}catch(e){reject(e);}}function step(result){result.done?resolve(result.value):adopt(result.value).then(fulfilled,rejected);}step((generator=generator.apply(thisArg,_arguments||[])).next());});};Object.defineProperty(exports,'__esModule',{value:true});class DataServerGenerator{generate(context){return __awaiter(this,void 0,void 0,function*(){throw new Error('Method not implemented.');});}}exports.default=DataServerGenerator;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/generator/data-server/index.ts"],"names":[],"mappings":";;;;;;;;;;;AAEA,MAAqB,mBAAmB;IAC9B,QAAQ,CAAC,OAAgB;;YAC3B,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC/C,CAAC;KAAA;CACJ;AAJD,sCAIC"}
@@ -0,0 +1,196 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
35
+ const ts_morph_1 = require("ts-morph");
36
+ const path = __importStar(require("path"));
37
+ class NextAuthGenerator {
38
+ generate(context) {
39
+ return __awaiter(this, void 0, void 0, function* () {
40
+ const project = new ts_morph_1.Project();
41
+ this.generateIndex(project, context);
42
+ this.generateAdapter(project, context);
43
+ this.generateAuthorize(project, context);
44
+ yield project.save();
45
+ });
46
+ }
47
+ generateIndex(project, context) {
48
+ const sf = project.createSourceFile(path.join(context.outDir, 'auth/index.ts'), undefined, { overwrite: true });
49
+ sf.addStatements([
50
+ `export * from './next-auth-adapter';`,
51
+ `export * from './authorize';`,
52
+ ]);
53
+ sf.formatText();
54
+ }
55
+ generateAdapter(project, context) {
56
+ const content = `
57
+ import { ZenStackService } from '../service';
58
+ import { Adapter } from 'next-auth/adapters';
59
+ import { Prisma } from '@zenstack/.prisma';
60
+
61
+ export function NextAuthAdapter(service: ZenStackService): Adapter {
62
+ const db = service.db;
63
+ return {
64
+ createUser: (data) => db.user.create({ data: data as Prisma.UserCreateInput }),
65
+ getUser: (id) => db.user.findUnique({ where: { id } }),
66
+ getUserByEmail: (email) => db.user.findUnique({ where: { email } }),
67
+ async getUserByAccount(provider_providerAccountId) {
68
+ const account = await db.account.findUnique({
69
+ where: { provider_providerAccountId },
70
+ select: { user: true },
71
+ });
72
+ return account?.user ?? null;
73
+ },
74
+ updateUser: (data) => db.user.update({ where: { id: data.id }, data: data as Prisma.UserUpdateInput }),
75
+ deleteUser: (id) => db.user.delete({ where: { id } }),
76
+ linkAccount: (data) => db.account.create({ data }) as any,
77
+ unlinkAccount: (provider_providerAccountId) =>
78
+ db.account.delete({ where: { provider_providerAccountId } }) as any,
79
+ async getSessionAndUser(sessionToken) {
80
+ const userAndSession = await db.session.findUnique({
81
+ where: { sessionToken },
82
+ include: { user: true },
83
+ });
84
+ if (!userAndSession) return null;
85
+ const { user, ...session } = userAndSession;
86
+ return { user, session };
87
+ },
88
+ createSession: (data) => db.session.create({ data }),
89
+ updateSession: (data) =>
90
+ db.session.update({
91
+ data,
92
+ where: { sessionToken: data.sessionToken },
93
+ }),
94
+ deleteSession: (sessionToken) =>
95
+ db.session.delete({ where: { sessionToken } }),
96
+ createVerificationToken: (data) => db.verificationToken.create({ data }),
97
+ async useVerificationToken(identifier_token) {
98
+ try {
99
+ return await db.verificationToken.delete({
100
+ where: { identifier_token },
101
+ });
102
+ } catch (error) {
103
+ // If token already used/deleted, just return null
104
+ // https://www.prisma.io/docs/reference/api-reference/error-reference#p2025
105
+ if (
106
+ (error as Prisma.PrismaClientKnownRequestError).code ===
107
+ 'P2025'
108
+ )
109
+ return null;
110
+ throw error;
111
+ }
112
+ },
113
+ };
114
+ }
115
+ `;
116
+ const sf = project.createSourceFile(path.join(context.outDir, 'auth/next-auth-adapter.ts'), content, { overwrite: true });
117
+ sf.formatText();
118
+ }
119
+ generateAuthorize(project, context) {
120
+ const content = `
121
+ import { ZenStackService } from '../service';
122
+ import { hash, compare } from 'bcryptjs';
123
+
124
+ async function hashPassword(password: string) {
125
+ const hashedPassword = await hash(password, 12);
126
+ return hashedPassword;
127
+ }
128
+
129
+ async function verifyPassword(password: string, hashedPassword: string) {
130
+ const isValid = await compare(password, hashedPassword);
131
+ return isValid;
132
+ }
133
+
134
+ export function authorize(service: ZenStackService) {
135
+ return async (
136
+ credentials: Record<'email' | 'password', string> | undefined
137
+ ) => {
138
+ try {
139
+ let maybeUser = await service.db.user.findFirst({
140
+ where: {
141
+ email: credentials!.email,
142
+ },
143
+ select: {
144
+ id: true,
145
+ email: true,
146
+ password: true,
147
+ name: true,
148
+ },
149
+ });
150
+
151
+ if (!maybeUser) {
152
+ if (!credentials!.password || !credentials!.email) {
153
+ throw new Error('Invalid Credentials');
154
+ }
155
+
156
+ maybeUser = await service.db.user.create({
157
+ data: {
158
+ email: credentials!.email,
159
+ password: await hashPassword(credentials!.password),
160
+ },
161
+ select: {
162
+ id: true,
163
+ email: true,
164
+ password: true,
165
+ name: true,
166
+ },
167
+ });
168
+ } else {
169
+ const isValid = await verifyPassword(
170
+ credentials!.password,
171
+ maybeUser.password
172
+ );
173
+
174
+ if (!isValid) {
175
+ throw new Error('Invalid Credentials');
176
+ }
177
+ }
178
+
179
+ return {
180
+ id: maybeUser.id,
181
+ email: maybeUser.email,
182
+ name: maybeUser.name,
183
+ };
184
+ } catch (error) {
185
+ console.log(error);
186
+ throw error;
187
+ }
188
+ };
189
+ }
190
+ `;
191
+ const sf = project.createSourceFile(path.join(context.outDir, 'auth/authorize.ts'), content, { overwrite: true });
192
+ sf.formatText();
193
+ }
194
+ }
195
+ exports.default = NextAuthGenerator;
196
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/generator/next-auth/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,uCAAmC;AACnC,2CAA6B;AAE7B,MAAqB,iBAAiB;IAC5B,QAAQ,CAAC,OAAgB;;YAC3B,MAAM,OAAO,GAAG,IAAI,kBAAO,EAAE,CAAC;YAE9B,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACrC,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACvC,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAEzC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QACzB,CAAC;KAAA;IAED,aAAa,CAAC,OAAgB,EAAE,OAAgB;QAC5C,MAAM,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAC/B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,EAC1C,SAAS,EACT,EAAE,SAAS,EAAE,IAAI,EAAE,CACtB,CAAC;QAEF,EAAE,CAAC,aAAa,CAAC;YACb,sCAAsC;YACtC,8BAA8B;SACjC,CAAC,CAAC;QAEH,EAAE,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAED,eAAe,CAAC,OAAgB,EAAE,OAAgB;QAC9C,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SA2Df,CAAC;QAEF,MAAM,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAC/B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,2BAA2B,CAAC,EACtD,OAAO,EACP,EAAE,SAAS,EAAE,IAAI,EAAE,CACtB,CAAC;QAEF,EAAE,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAED,iBAAiB,CAAC,OAAgB,EAAE,OAAgB;QAChD,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAsEf,CAAC;QAEF,MAAM,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAC/B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,EAC9C,OAAO,EACP,EAAE,SAAS,EAAE,IAAI,EAAE,CACtB,CAAC;QAEF,EAAE,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;CACJ;AAlLD,oCAkLC"}