zenstack 1.0.0 → 1.0.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.
Files changed (300) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +194 -1
  3. package/bin/cli +3 -0
  4. package/bin/post-install.js +24 -0
  5. package/cli/actions/generate.d.ts +13 -0
  6. package/cli/actions/generate.js +71 -0
  7. package/cli/actions/generate.js.map +1 -0
  8. package/cli/actions/index.d.ts +3 -0
  9. package/cli/actions/index.js +20 -0
  10. package/cli/actions/index.js.map +1 -0
  11. package/cli/actions/info.d.ts +4 -0
  12. package/cli/actions/info.js +63 -0
  13. package/cli/actions/info.js.map +1 -0
  14. package/cli/actions/init.d.ts +12 -0
  15. package/cli/actions/init.js +83 -0
  16. package/cli/actions/init.js.map +1 -0
  17. package/cli/cli-error.d.ts +5 -0
  18. package/cli/cli-error.js +10 -0
  19. package/cli/cli-error.js.map +1 -0
  20. package/cli/cli-util.d.ts +21 -0
  21. package/cli/cli-util.js +211 -0
  22. package/cli/cli-util.js.map +1 -0
  23. package/cli/config.d.ts +10 -0
  24. package/cli/config.js +62 -0
  25. package/cli/config.js.map +1 -0
  26. package/cli/index.d.ts +7 -0
  27. package/cli/index.js +128 -0
  28. package/cli/index.js.map +1 -0
  29. package/cli/plugin-runner.d.ts +24 -0
  30. package/cli/plugin-runner.js +229 -0
  31. package/cli/plugin-runner.js.map +1 -0
  32. package/constants.d.ts +1 -0
  33. package/constants.js +6 -0
  34. package/constants.js.map +1 -0
  35. package/language-server/constants.d.ts +22 -0
  36. package/language-server/constants.js +27 -0
  37. package/language-server/constants.js.map +1 -0
  38. package/language-server/main.d.ts +1 -0
  39. package/language-server/main.js +13 -0
  40. package/language-server/main.js.map +1 -0
  41. package/language-server/types.d.ts +10 -0
  42. package/language-server/types.js +3 -0
  43. package/language-server/types.js.map +1 -0
  44. package/language-server/utils.d.ts +5 -0
  45. package/language-server/utils.js +22 -0
  46. package/language-server/utils.js.map +1 -0
  47. package/language-server/validator/attribute-application-validator.d.ts +15 -0
  48. package/language-server/validator/attribute-application-validator.js +246 -0
  49. package/language-server/validator/attribute-application-validator.js.map +1 -0
  50. package/language-server/validator/attribute-validator.d.ts +9 -0
  51. package/language-server/validator/attribute-validator.js +14 -0
  52. package/language-server/validator/attribute-validator.js.map +1 -0
  53. package/language-server/validator/datamodel-validator.d.ts +22 -0
  54. package/language-server/validator/datamodel-validator.js +329 -0
  55. package/language-server/validator/datamodel-validator.js.map +1 -0
  56. package/language-server/validator/datasource-validator.d.ts +12 -0
  57. package/language-server/validator/datasource-validator.js +66 -0
  58. package/language-server/validator/datasource-validator.js.map +1 -0
  59. package/language-server/validator/enum-validator.d.ts +11 -0
  60. package/language-server/validator/enum-validator.js +25 -0
  61. package/language-server/validator/enum-validator.js.map +1 -0
  62. package/language-server/validator/expression-validator.d.ts +10 -0
  63. package/language-server/validator/expression-validator.js +135 -0
  64. package/language-server/validator/expression-validator.js.map +1 -0
  65. package/language-server/validator/function-decl-validator.d.ts +9 -0
  66. package/language-server/validator/function-decl-validator.js +13 -0
  67. package/language-server/validator/function-decl-validator.js.map +1 -0
  68. package/language-server/validator/function-invocation-validator.d.ts +11 -0
  69. package/language-server/validator/function-invocation-validator.js +135 -0
  70. package/language-server/validator/function-invocation-validator.js.map +1 -0
  71. package/language-server/validator/schema-validator.d.ts +13 -0
  72. package/language-server/validator/schema-validator.js +49 -0
  73. package/language-server/validator/schema-validator.js.map +1 -0
  74. package/language-server/validator/utils.d.ts +24 -0
  75. package/language-server/validator/utils.js +154 -0
  76. package/language-server/validator/utils.js.map +1 -0
  77. package/language-server/validator/zmodel-validator.d.ts +25 -0
  78. package/language-server/validator/zmodel-validator.js +83 -0
  79. package/language-server/validator/zmodel-validator.js.map +1 -0
  80. package/language-server/zmodel-code-action.d.ts +15 -0
  81. package/language-server/zmodel-code-action.js +118 -0
  82. package/language-server/zmodel-code-action.js.map +1 -0
  83. package/language-server/zmodel-definition.d.ts +7 -0
  84. package/language-server/zmodel-definition.js +31 -0
  85. package/language-server/zmodel-definition.js.map +1 -0
  86. package/language-server/zmodel-formatter.d.ts +9 -0
  87. package/language-server/zmodel-formatter.js +76 -0
  88. package/language-server/zmodel-formatter.js.map +1 -0
  89. package/language-server/zmodel-linker.d.ts +32 -0
  90. package/language-server/zmodel-linker.js +447 -0
  91. package/language-server/zmodel-linker.js.map +1 -0
  92. package/language-server/zmodel-module.d.ts +41 -0
  93. package/language-server/zmodel-module.js +83 -0
  94. package/language-server/zmodel-module.js.map +1 -0
  95. package/language-server/zmodel-scope.d.ts +16 -0
  96. package/language-server/zmodel-scope.js +100 -0
  97. package/language-server/zmodel-scope.js.map +1 -0
  98. package/language-server/zmodel-workspace-manager.d.ts +12 -0
  99. package/language-server/zmodel-workspace-manager.js +138 -0
  100. package/language-server/zmodel-workspace-manager.js.map +1 -0
  101. package/package.json +140 -8
  102. package/plugins/access-policy/expression-writer.d.ts +46 -0
  103. package/plugins/access-policy/expression-writer.js +580 -0
  104. package/plugins/access-policy/expression-writer.js.map +1 -0
  105. package/plugins/access-policy/index.d.ts +4 -0
  106. package/plugins/access-policy/index.js +22 -0
  107. package/plugins/access-policy/index.js.map +1 -0
  108. package/plugins/access-policy/policy-guard-generator.d.ts +22 -0
  109. package/plugins/access-policy/policy-guard-generator.js +634 -0
  110. package/plugins/access-policy/policy-guard-generator.js.map +1 -0
  111. package/plugins/model-meta/index.d.ts +4 -0
  112. package/plugins/model-meta/index.js +232 -0
  113. package/plugins/model-meta/index.js.map +1 -0
  114. package/plugins/plugin-utils.d.ts +17 -0
  115. package/plugins/plugin-utils.js +80 -0
  116. package/plugins/plugin-utils.js.map +1 -0
  117. package/plugins/prisma/indent-string.d.ts +4 -0
  118. package/plugins/prisma/indent-string.js +12 -0
  119. package/plugins/prisma/indent-string.js.map +1 -0
  120. package/plugins/prisma/index.d.ts +4 -0
  121. package/plugins/prisma/index.js +22 -0
  122. package/plugins/prisma/index.js.map +1 -0
  123. package/plugins/prisma/prisma-builder.d.ts +145 -0
  124. package/plugins/prisma/prisma-builder.js +358 -0
  125. package/plugins/prisma/prisma-builder.js.map +1 -0
  126. package/plugins/prisma/schema-generator.d.ts +29 -0
  127. package/plugins/prisma/schema-generator.js +336 -0
  128. package/plugins/prisma/schema-generator.js.map +1 -0
  129. package/plugins/prisma/zmodel-code-generator.d.ts +30 -0
  130. package/plugins/prisma/zmodel-code-generator.js +124 -0
  131. package/plugins/prisma/zmodel-code-generator.js.map +1 -0
  132. package/plugins/zod/generator.d.ts +4 -0
  133. package/plugins/zod/generator.js +254 -0
  134. package/plugins/zod/generator.js.map +1 -0
  135. package/plugins/zod/index.d.ts +4 -0
  136. package/plugins/zod/index.js +24 -0
  137. package/plugins/zod/index.js.map +1 -0
  138. package/plugins/zod/transformer.d.ts +68 -0
  139. package/plugins/zod/transformer.js +554 -0
  140. package/plugins/zod/transformer.js.map +1 -0
  141. package/plugins/zod/types.d.ts +25 -0
  142. package/plugins/zod/types.js +3 -0
  143. package/plugins/zod/types.js.map +1 -0
  144. package/plugins/zod/utils/removeDir.d.ts +1 -0
  145. package/plugins/zod/utils/removeDir.js +30 -0
  146. package/plugins/zod/utils/removeDir.js.map +1 -0
  147. package/plugins/zod/utils/schema-gen.d.ts +3 -0
  148. package/plugins/zod/utils/schema-gen.js +188 -0
  149. package/plugins/zod/utils/schema-gen.js.map +1 -0
  150. package/res/prism-zmodel.js +20 -0
  151. package/res/starter.zmodel +51 -0
  152. package/res/stdlib.zmodel +506 -0
  153. package/telemetry.d.ts +21 -0
  154. package/telemetry.js +129 -0
  155. package/telemetry.js.map +1 -0
  156. package/utils/ast-utils.d.ts +13 -0
  157. package/utils/ast-utils.js +136 -0
  158. package/utils/ast-utils.js.map +1 -0
  159. package/utils/exec-utils.d.ts +6 -0
  160. package/utils/exec-utils.js +13 -0
  161. package/utils/exec-utils.js.map +1 -0
  162. package/utils/pkg-utils.d.ts +3 -0
  163. package/utils/pkg-utils.js +64 -0
  164. package/utils/pkg-utils.js.map +1 -0
  165. package/utils/typescript-expression-transformer.d.ts +54 -0
  166. package/utils/typescript-expression-transformer.js +326 -0
  167. package/utils/typescript-expression-transformer.js.map +1 -0
  168. package/utils/version-utils.d.ts +1 -0
  169. package/utils/version-utils.js +20 -0
  170. package/utils/version-utils.js.map +1 -0
  171. package/.vscode/extensions.json +0 -7
  172. package/.vscode/launch.json +0 -49
  173. package/.vscode/settings.json +0 -4
  174. package/packages/internal/jest.config.ts +0 -32
  175. package/packages/internal/package.json +0 -42
  176. package/packages/internal/src/constants.ts +0 -1
  177. package/packages/internal/src/handler/data/guard-utils.ts +0 -7
  178. package/packages/internal/src/handler/data/handler.ts +0 -415
  179. package/packages/internal/src/handler/data/query-processor.ts +0 -504
  180. package/packages/internal/src/handler/index.ts +0 -1
  181. package/packages/internal/src/handler/types.ts +0 -20
  182. package/packages/internal/src/index.ts +0 -3
  183. package/packages/internal/src/request-handler.ts +0 -27
  184. package/packages/internal/src/request.ts +0 -101
  185. package/packages/internal/src/types.ts +0 -40
  186. package/packages/internal/tests/query-processor.test.ts +0 -172
  187. package/packages/internal/tsconfig.json +0 -21
  188. package/packages/runtime/auth.d.ts +0 -1
  189. package/packages/runtime/auth.js +0 -3
  190. package/packages/runtime/hooks.d.ts +0 -10
  191. package/packages/runtime/hooks.js +0 -3
  192. package/packages/runtime/index.d.ts +0 -3
  193. package/packages/runtime/index.js +0 -1
  194. package/packages/runtime/package-lock.json +0 -512
  195. package/packages/runtime/package.json +0 -16
  196. package/packages/runtime/server.d.ts +0 -1
  197. package/packages/runtime/server.js +0 -3
  198. package/packages/runtime/types.d.ts +0 -1
  199. package/packages/runtime/types.js +0 -3
  200. package/packages/schema/.eslintrc.json +0 -13
  201. package/packages/schema/.vscodeignore +0 -4
  202. package/packages/schema/asset/logo-dark.png +0 -0
  203. package/packages/schema/asset/logo-light.png +0 -0
  204. package/packages/schema/bin/cli +0 -3
  205. package/packages/schema/jest.config.ts +0 -32
  206. package/packages/schema/langium-config.json +0 -14
  207. package/packages/schema/langium-quickstart.md +0 -41
  208. package/packages/schema/language-configuration.json +0 -30
  209. package/packages/schema/package.json +0 -96
  210. package/packages/schema/src/cli/cli-util.ts +0 -80
  211. package/packages/schema/src/cli/index.ts +0 -64
  212. package/packages/schema/src/extension.ts +0 -76
  213. package/packages/schema/src/generator/constants.ts +0 -5
  214. package/packages/schema/src/generator/index.ts +0 -92
  215. package/packages/schema/src/generator/next-auth/index.ts +0 -197
  216. package/packages/schema/src/generator/package.template.json +0 -9
  217. package/packages/schema/src/generator/prisma/expression-writer.ts +0 -352
  218. package/packages/schema/src/generator/prisma/index.ts +0 -32
  219. package/packages/schema/src/generator/prisma/plain-expression-builder.ts +0 -91
  220. package/packages/schema/src/generator/prisma/prisma-builder.ts +0 -366
  221. package/packages/schema/src/generator/prisma/query-gard-generator.ts +0 -208
  222. package/packages/schema/src/generator/prisma/schema-generator.ts +0 -300
  223. package/packages/schema/src/generator/react-hooks/index.ts +0 -181
  224. package/packages/schema/src/generator/service/index.ts +0 -107
  225. package/packages/schema/src/generator/tsconfig.template.json +0 -17
  226. package/packages/schema/src/generator/types.ts +0 -17
  227. package/packages/schema/src/generator/utils.ts +0 -9
  228. package/packages/schema/src/language-server/generated/ast.ts +0 -603
  229. package/packages/schema/src/language-server/generated/grammar.ts +0 -2190
  230. package/packages/schema/src/language-server/generated/module.ts +0 -24
  231. package/packages/schema/src/language-server/main.ts +0 -12
  232. package/packages/schema/src/language-server/stdlib.zmodel +0 -22
  233. package/packages/schema/src/language-server/types.ts +0 -9
  234. package/packages/schema/src/language-server/zmodel-index.ts +0 -33
  235. package/packages/schema/src/language-server/zmodel-linker.ts +0 -409
  236. package/packages/schema/src/language-server/zmodel-module.ts +0 -90
  237. package/packages/schema/src/language-server/zmodel-scope.ts +0 -21
  238. package/packages/schema/src/language-server/zmodel-validator.ts +0 -35
  239. package/packages/schema/src/language-server/zmodel.langium +0 -186
  240. package/packages/schema/src/utils/exec-utils.ts +0 -5
  241. package/packages/schema/src/utils/indent-string.ts +0 -6
  242. package/packages/schema/syntaxes/zmodel.json +0 -57
  243. package/packages/schema/syntaxes/zmodel.tmLanguage.json +0 -57
  244. package/packages/schema/tests/generator/expression-writer.test.ts +0 -676
  245. package/packages/schema/tests/generator/prisma-builder.test.ts +0 -138
  246. package/packages/schema/tests/schema/parser.test.ts +0 -423
  247. package/packages/schema/tests/schema/sample-todo.test.ts +0 -14
  248. package/packages/schema/tests/utils.ts +0 -38
  249. package/packages/schema/tsconfig.json +0 -23
  250. package/pnpm-workspace.yaml +0 -3
  251. package/samples/todo/.env +0 -2
  252. package/samples/todo/.eslintrc.json +0 -3
  253. package/samples/todo/.vscode/launch.json +0 -11
  254. package/samples/todo/README.md +0 -34
  255. package/samples/todo/components/AuthGuard.tsx +0 -17
  256. package/samples/todo/components/Avatar.tsx +0 -22
  257. package/samples/todo/components/BreadCrumb.tsx +0 -44
  258. package/samples/todo/components/ManageMembers.tsx +0 -134
  259. package/samples/todo/components/NavBar.tsx +0 -57
  260. package/samples/todo/components/SpaceMembers.tsx +0 -76
  261. package/samples/todo/components/Spaces.tsx +0 -28
  262. package/samples/todo/components/TimeInfo.tsx +0 -17
  263. package/samples/todo/components/Todo.tsx +0 -72
  264. package/samples/todo/components/TodoList.tsx +0 -77
  265. package/samples/todo/lib/context.ts +0 -31
  266. package/samples/todo/next.config.js +0 -10
  267. package/samples/todo/package-lock.json +0 -7527
  268. package/samples/todo/package.json +0 -45
  269. package/samples/todo/pages/_app.tsx +0 -50
  270. package/samples/todo/pages/api/auth/[...nextauth].ts +0 -83
  271. package/samples/todo/pages/api/zenstack/[...path].ts +0 -16
  272. package/samples/todo/pages/create-space.tsx +0 -114
  273. package/samples/todo/pages/index.tsx +0 -32
  274. package/samples/todo/pages/space/[slug]/[listId]/index.tsx +0 -88
  275. package/samples/todo/pages/space/[slug]/index.tsx +0 -169
  276. package/samples/todo/postcss.config.js +0 -6
  277. package/samples/todo/public/avatar.jpg +0 -0
  278. package/samples/todo/public/favicon.ico +0 -0
  279. package/samples/todo/public/logo.png +0 -0
  280. package/samples/todo/public/vercel.svg +0 -4
  281. package/samples/todo/styles/globals.css +0 -7
  282. package/samples/todo/tailwind.config.js +0 -11
  283. package/samples/todo/tsconfig.json +0 -28
  284. package/samples/todo/types/next-auth.d.ts +0 -14
  285. package/samples/todo/types/next.d.ts +0 -16
  286. package/samples/todo/zenstack/migrations/20221014084317_init/migration.sql +0 -153
  287. package/samples/todo/zenstack/migrations/20221020094651_upate_cli/migration.sql +0 -23
  288. package/samples/todo/zenstack/migrations/migration_lock.toml +0 -3
  289. package/samples/todo/zenstack/schema.prisma +0 -126
  290. package/samples/todo/zenstack/schema.zmodel +0 -161
  291. package/tests/integration/jest.config.ts +0 -16
  292. package/tests/integration/package-lock.json +0 -1081
  293. package/tests/integration/package.json +0 -27
  294. package/tests/integration/tests/operation-coverate.test.ts +0 -563
  295. package/tests/integration/tests/operations.zmodel +0 -69
  296. package/tests/integration/tests/todo-e2e.test.ts +0 -577
  297. package/tests/integration/tests/todo.zmodel +0 -123
  298. package/tests/integration/tests/tsconfig.template.json +0 -10
  299. package/tests/integration/tests/utils.ts +0 -133
  300. package/tests/integration/tsconfig.json +0 -10
@@ -0,0 +1,229 @@
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.PluginRunner = void 0;
16
+ const ast_1 = require("@zenstackhq/language/ast");
17
+ const sdk_1 = require("@zenstackhq/sdk");
18
+ const colors_1 = __importDefault(require("colors"));
19
+ const fs_1 = __importDefault(require("fs"));
20
+ const ora_1 = __importDefault(require("ora"));
21
+ const path_1 = __importDefault(require("path"));
22
+ const plugin_utils_1 = require("../plugins/plugin-utils");
23
+ const telemetry_1 = __importDefault(require("../telemetry"));
24
+ const version_utils_1 = require("../utils/version-utils");
25
+ /**
26
+ * ZenStack plugin runner
27
+ */
28
+ class PluginRunner {
29
+ /**
30
+ * Runs a series of nested generators
31
+ */
32
+ run(options) {
33
+ return __awaiter(this, void 0, void 0, function* () {
34
+ const version = (0, version_utils_1.getVersion)();
35
+ console.log(colors_1.default.bold(`⌛️ ZenStack CLI v${version}, running plugins`));
36
+ (0, plugin_utils_1.ensureDefaultOutputFolder)(options);
37
+ const plugins = [];
38
+ const pluginDecls = options.schema.declarations.filter((d) => (0, ast_1.isPlugin)(d));
39
+ let prismaOutput = (0, sdk_1.resolvePath)('./prisma/schema.prisma', { schemaPath: options.schemaPath, name: '' });
40
+ for (const pluginDecl of pluginDecls) {
41
+ const pluginProvider = this.getPluginProvider(pluginDecl);
42
+ if (!pluginProvider) {
43
+ console.error(`Plugin ${pluginDecl.name} has invalid provider option`);
44
+ throw new sdk_1.PluginError('', `Plugin ${pluginDecl.name} has invalid provider option`);
45
+ }
46
+ const pluginModulePath = this.getPluginModulePath(pluginProvider);
47
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
48
+ let pluginModule;
49
+ try {
50
+ pluginModule = require(pluginModulePath);
51
+ }
52
+ catch (err) {
53
+ console.error(`Unable to load plugin module ${pluginProvider}: ${pluginModulePath}, ${err}`);
54
+ throw new sdk_1.PluginError('', `Unable to load plugin module ${pluginProvider}`);
55
+ }
56
+ if (!pluginModule.default || typeof pluginModule.default !== 'function') {
57
+ console.error(`Plugin provider ${pluginProvider} is missing a default function export`);
58
+ throw new sdk_1.PluginError('', `Plugin provider ${pluginProvider} is missing a default function export`);
59
+ }
60
+ const dependencies = this.getPluginDependencies(pluginModule);
61
+ const pluginName = this.getPluginName(pluginModule, pluginProvider);
62
+ const pluginOptions = { schemaPath: options.schemaPath, name: pluginName };
63
+ pluginDecl.fields.forEach((f) => {
64
+ var _a;
65
+ const value = (_a = (0, sdk_1.getLiteral)(f.value)) !== null && _a !== void 0 ? _a : (0, sdk_1.getLiteralArray)(f.value);
66
+ if (value === undefined) {
67
+ throw new sdk_1.PluginError(pluginName, `Invalid option value for ${f.name}`);
68
+ }
69
+ pluginOptions[f.name] = value;
70
+ });
71
+ plugins.push({
72
+ name: pluginName,
73
+ provider: pluginProvider,
74
+ dependencies,
75
+ options: pluginOptions,
76
+ run: pluginModule.default,
77
+ module: pluginModule,
78
+ });
79
+ if (pluginProvider === '@core/prisma' && typeof pluginOptions.output === 'string') {
80
+ // record custom prisma output path
81
+ prismaOutput = (0, sdk_1.resolvePath)(pluginOptions.output, pluginOptions);
82
+ }
83
+ }
84
+ // get core plugins that need to be enabled
85
+ const corePlugins = this.calculateCorePlugins(options, plugins);
86
+ // shift/insert core plugins to the front
87
+ for (const corePlugin of corePlugins.reverse()) {
88
+ const existingIdx = plugins.findIndex((p) => p.provider === corePlugin.provider);
89
+ if (existingIdx >= 0) {
90
+ // shift the plugin to the front
91
+ const existing = plugins[existingIdx];
92
+ plugins.splice(existingIdx, 1);
93
+ plugins.unshift(existing);
94
+ }
95
+ else {
96
+ // synthesize a plugin and insert front
97
+ const pluginModule = require(this.getPluginModulePath(corePlugin.provider));
98
+ const pluginName = this.getPluginName(pluginModule, corePlugin.provider);
99
+ plugins.unshift({
100
+ name: pluginName,
101
+ provider: corePlugin.provider,
102
+ dependencies: [],
103
+ options: Object.assign({ schemaPath: options.schemaPath, name: pluginName }, corePlugin.options),
104
+ run: pluginModule.default,
105
+ module: pluginModule,
106
+ });
107
+ }
108
+ }
109
+ // check dependencies
110
+ for (const plugin of plugins) {
111
+ for (const dep of plugin.dependencies) {
112
+ if (!plugins.find((p) => p.provider === dep)) {
113
+ console.error(`Plugin ${plugin.provider} depends on "${dep}" but it's not declared`);
114
+ throw new sdk_1.PluginError(plugin.name, `Plugin ${plugin.provider} depends on "${dep}" but it's not declared`);
115
+ }
116
+ }
117
+ }
118
+ if (plugins.length === 0) {
119
+ console.log(colors_1.default.yellow('No plugins configured.'));
120
+ return;
121
+ }
122
+ const warnings = [];
123
+ let dmmf = undefined;
124
+ for (const { name, provider, run, options: pluginOptions } of plugins) {
125
+ // const start = Date.now();
126
+ yield this.runPlugin(name, run, options, pluginOptions, dmmf, warnings);
127
+ // console.log(`✅ Plugin ${colors.bold(name)} (${provider}) completed in ${Date.now() - start}ms`);
128
+ if (provider === '@core/prisma') {
129
+ // load prisma DMMF
130
+ dmmf = yield (0, sdk_1.getDMMF)({
131
+ datamodel: fs_1.default.readFileSync(prismaOutput, { encoding: 'utf-8' }),
132
+ });
133
+ }
134
+ }
135
+ console.log(colors_1.default.green(colors_1.default.bold('\n👻 All plugins completed successfully!')));
136
+ warnings.forEach((w) => console.warn(colors_1.default.yellow(w)));
137
+ console.log(`Don't forget to restart your dev server to let the changes take effect.`);
138
+ });
139
+ }
140
+ calculateCorePlugins(options, plugins) {
141
+ const corePlugins = [];
142
+ if (options.defaultPlugins) {
143
+ corePlugins.push({ provider: '@core/prisma' }, { provider: '@core/model-meta' }, { provider: '@core/access-policy' });
144
+ }
145
+ else if (plugins.length > 0) {
146
+ // "@core/prisma" plugin is always enabled if any plugin is configured
147
+ corePlugins.push({ provider: '@core/prisma' });
148
+ }
149
+ // "@core/access-policy" has implicit requirements
150
+ if ([...plugins, ...corePlugins].find((p) => p.provider === '@core/access-policy')) {
151
+ // make sure "@core/model-meta" is enabled
152
+ if (!corePlugins.find((p) => p.provider === '@core/model-meta')) {
153
+ corePlugins.push({ provider: '@core/model-meta' });
154
+ }
155
+ // '@core/zod' plugin is auto-enabled by "@core/access-policy"
156
+ // if there're validation rules
157
+ if (!corePlugins.find((p) => p.provider === '@core/zod') && this.hasValidation(options.schema)) {
158
+ corePlugins.push({ provider: '@core/zod', options: { modelOnly: true } });
159
+ }
160
+ }
161
+ // core plugins introduced by dependencies
162
+ plugins
163
+ .flatMap((p) => p.dependencies)
164
+ .forEach((dep) => {
165
+ if (dep.startsWith('@core/')) {
166
+ const existing = corePlugins.find((p) => p.provider === dep);
167
+ if (existing) {
168
+ // reset options to default
169
+ existing.options = undefined;
170
+ }
171
+ else {
172
+ // add core dependency
173
+ corePlugins.push({ provider: dep });
174
+ }
175
+ }
176
+ });
177
+ return corePlugins;
178
+ }
179
+ hasValidation(schema) {
180
+ return (0, sdk_1.getDataModels)(schema).some((model) => (0, sdk_1.hasValidationAttributes)(model));
181
+ }
182
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
183
+ getPluginName(pluginModule, pluginProvider) {
184
+ return typeof pluginModule.name === 'string' ? pluginModule.name : pluginProvider;
185
+ }
186
+ getPluginDependencies(pluginModule) {
187
+ return Array.isArray(pluginModule.dependencies) ? pluginModule.dependencies : [];
188
+ }
189
+ getPluginProvider(plugin) {
190
+ const providerField = plugin.fields.find((f) => f.name === 'provider');
191
+ return (0, sdk_1.getLiteral)(providerField === null || providerField === void 0 ? void 0 : providerField.value);
192
+ }
193
+ runPlugin(name, run, runnerOptions, options, dmmf, warnings) {
194
+ return __awaiter(this, void 0, void 0, function* () {
195
+ const spinner = (0, ora_1.default)(`Running plugin ${colors_1.default.cyan(name)}`).start();
196
+ try {
197
+ yield telemetry_1.default.trackSpan('cli:plugin:start', 'cli:plugin:complete', 'cli:plugin:error', {
198
+ plugin: name,
199
+ options,
200
+ }, () => __awaiter(this, void 0, void 0, function* () {
201
+ let result = run(runnerOptions.schema, options, dmmf, {
202
+ output: runnerOptions.output,
203
+ compile: runnerOptions.compile,
204
+ });
205
+ if (result instanceof Promise) {
206
+ result = yield result;
207
+ }
208
+ if (Array.isArray(result)) {
209
+ warnings.push(...result);
210
+ }
211
+ }));
212
+ spinner.succeed();
213
+ }
214
+ catch (err) {
215
+ spinner.fail();
216
+ throw err;
217
+ }
218
+ });
219
+ }
220
+ getPluginModulePath(provider) {
221
+ let pluginModulePath = provider;
222
+ if (pluginModulePath.startsWith('@core/')) {
223
+ pluginModulePath = pluginModulePath.replace(/^@core/, path_1.default.join(__dirname, '../plugins'));
224
+ }
225
+ return pluginModulePath;
226
+ }
227
+ }
228
+ exports.PluginRunner = PluginRunner;
229
+ //# sourceMappingURL=plugin-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-runner.js","sourceRoot":"","sources":["../../src/cli/plugin-runner.ts"],"names":[],"mappings":"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"}
package/constants.d.ts ADDED
@@ -0,0 +1 @@
1
+ export declare const TELEMETRY_TRACKING_TOKEN = "<TELEMETRY_TRACKING_TOKEN>";
package/constants.js ADDED
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TELEMETRY_TRACKING_TOKEN = void 0;
4
+ // replaced at build time
5
+ exports.TELEMETRY_TRACKING_TOKEN = '74944eb779d7d3b4ce185be843fde9fc';
6
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAA,yBAAyB;AACZ,QAAA,wBAAwB,GAAG,4BAA4B,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Supported Prisma db providers
3
+ */
4
+ export declare const SUPPORTED_PROVIDERS: string[];
5
+ /**
6
+ * All scalar types
7
+ */
8
+ export declare const SCALAR_TYPES: string[];
9
+ /**
10
+ * Name of standard library module
11
+ */
12
+ export declare const STD_LIB_MODULE_NAME = "stdlib.zmodel";
13
+ /**
14
+ * Name of module contributed by plugins
15
+ */
16
+ export declare const PLUGIN_MODULE_NAME = "plugin.zmodel";
17
+ /**
18
+ * Validation issues
19
+ */
20
+ export declare enum IssueCodes {
21
+ MissingOppositeRelation = "miss-opposite-relation"
22
+ }
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IssueCodes = exports.PLUGIN_MODULE_NAME = exports.STD_LIB_MODULE_NAME = exports.SCALAR_TYPES = exports.SUPPORTED_PROVIDERS = void 0;
4
+ /**
5
+ * Supported Prisma db providers
6
+ */
7
+ exports.SUPPORTED_PROVIDERS = ['sqlite', 'postgresql', 'mysql', 'sqlserver', 'cockroachdb'];
8
+ /**
9
+ * All scalar types
10
+ */
11
+ exports.SCALAR_TYPES = ['String', 'Int', 'Float', 'Decimal', 'BigInt', 'Boolean', 'Bytes', 'DateTime'];
12
+ /**
13
+ * Name of standard library module
14
+ */
15
+ exports.STD_LIB_MODULE_NAME = 'stdlib.zmodel';
16
+ /**
17
+ * Name of module contributed by plugins
18
+ */
19
+ exports.PLUGIN_MODULE_NAME = 'plugin.zmodel';
20
+ /**
21
+ * Validation issues
22
+ */
23
+ var IssueCodes;
24
+ (function (IssueCodes) {
25
+ IssueCodes["MissingOppositeRelation"] = "miss-opposite-relation";
26
+ })(IssueCodes = exports.IssueCodes || (exports.IssueCodes = {}));
27
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/language-server/constants.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACU,QAAA,mBAAmB,GAAG,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;AAEjG;;GAEG;AACU,QAAA,YAAY,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;AAE5G;;GAEG;AACU,QAAA,mBAAmB,GAAG,eAAe,CAAC;AAEnD;;GAEG;AACU,QAAA,kBAAkB,GAAG,eAAe,CAAC;AAElD;;GAEG;AACH,IAAY,UAEX;AAFD,WAAY,UAAU;IAClB,gEAAkD,CAAA;AACtD,CAAC,EAFW,UAAU,GAAV,kBAAU,KAAV,kBAAU,QAErB"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const langium_1 = require("langium");
4
+ const node_1 = require("langium/node");
5
+ const node_2 = require("vscode-languageserver/node");
6
+ const zmodel_module_1 = require("./zmodel-module");
7
+ // Create a connection to the client
8
+ const connection = (0, node_2.createConnection)(node_2.ProposedFeatures.all);
9
+ // Inject the shared services and language-specific services
10
+ const { shared } = (0, zmodel_module_1.createZModelServices)(Object.assign({ connection }, node_1.NodeFileSystem));
11
+ // Start the language server with the shared services
12
+ (0, langium_1.startLanguageServer)(shared);
13
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/language-server/main.ts"],"names":[],"mappings":";;AAAA,qCAA8C;AAC9C,uCAA8C;AAC9C,qDAAgF;AAChF,mDAAuD;AAEvD,oCAAoC;AACpC,MAAM,UAAU,GAAG,IAAA,uBAAgB,EAAC,uBAAgB,CAAC,GAAG,CAAC,CAAC;AAE1D,4DAA4D;AAC5D,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,oCAAoB,kBAAG,UAAU,IAAK,qBAAc,EAAG,CAAC;AAE3E,qDAAqD;AACrD,IAAA,6BAAmB,EAAC,MAAM,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { AstNode, ValidationAcceptor } from 'langium';
2
+ /**
3
+ * AST validator contract
4
+ */
5
+ export interface AstValidator<T extends AstNode> {
6
+ /**
7
+ * Validates an AST node
8
+ */
9
+ validate(node: T, accept: ValidationAcceptor): void;
10
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/language-server/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import { DataModel, DataModelField } from '@zenstackhq/language/ast';
2
+ /**
3
+ * Gets lists of unique fields declared at the data model level
4
+ */
5
+ export declare function getUniqueFields(model: DataModel): DataModelField[][];
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getUniqueFields = void 0;
4
+ const ast_1 = require("@zenstackhq/language/ast");
5
+ const sdk_1 = require("@zenstackhq/sdk");
6
+ /**
7
+ * Gets lists of unique fields declared at the data model level
8
+ */
9
+ function getUniqueFields(model) {
10
+ const uniqueAttrs = model.attributes.filter((attr) => { var _a, _b; return ((_a = attr.decl.ref) === null || _a === void 0 ? void 0 : _a.name) === '@@unique' || ((_b = attr.decl.ref) === null || _b === void 0 ? void 0 : _b.name) === '@@id'; });
11
+ return uniqueAttrs.map((uniqueAttr) => {
12
+ const fieldsArg = uniqueAttr.args.find((a) => { var _a; return ((_a = a.$resolvedParam) === null || _a === void 0 ? void 0 : _a.name) === 'fields'; });
13
+ if (!fieldsArg || !(0, ast_1.isArrayExpr)(fieldsArg.value)) {
14
+ return [];
15
+ }
16
+ return fieldsArg.value.items
17
+ .filter((item) => (0, ast_1.isReferenceExpr)(item))
18
+ .map((item) => (0, sdk_1.resolved)(item.target));
19
+ });
20
+ }
21
+ exports.getUniqueFields = getUniqueFields;
22
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/language-server/utils.ts"],"names":[],"mappings":";;;AAAA,kDAAkH;AAClH,yCAA2C;AAE3C;;GAEG;AACH,SAAgB,eAAe,CAAC,KAAgB;IAC5C,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CACvC,CAAC,IAAI,EAAE,EAAE,eAAC,OAAA,CAAA,MAAA,IAAI,CAAC,IAAI,CAAC,GAAG,0CAAE,IAAI,MAAK,UAAU,IAAI,CAAA,MAAA,IAAI,CAAC,IAAI,CAAC,GAAG,0CAAE,IAAI,MAAK,MAAM,CAAA,EAAA,CACjF,CAAC;IACF,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE;QAClC,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,WAAC,OAAA,CAAA,MAAA,CAAC,CAAC,cAAc,0CAAE,IAAI,MAAK,QAAQ,CAAA,EAAA,CAAC,CAAC;QACnF,IAAI,CAAC,SAAS,IAAI,CAAC,IAAA,iBAAW,EAAC,SAAS,CAAC,KAAK,CAAC,EAAE;YAC7C,OAAO,EAAE,CAAC;SACb;QAED,OAAO,SAAS,CAAC,KAAK,CAAC,KAAK;aACvB,MAAM,CAAC,CAAC,IAAI,EAAyB,EAAE,CAAC,IAAA,qBAAe,EAAC,IAAI,CAAC,CAAC;aAC9D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAA,cAAQ,EAAC,IAAI,CAAC,MAAM,CAAmB,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;AACP,CAAC;AAdD,0CAcC"}
@@ -0,0 +1,15 @@
1
+ import { DataModelAttribute, DataModelFieldAttribute, InternalAttribute } from '@zenstackhq/language/ast';
2
+ import { ValidationAcceptor } from 'langium';
3
+ import { AstValidator } from '../types';
4
+ declare type AttributeApplication = DataModelAttribute | DataModelFieldAttribute | InternalAttribute;
5
+ /**
6
+ * Validates function declarations.
7
+ */
8
+ export default class AttributeApplicationValidator implements AstValidator<AttributeApplication> {
9
+ validate(attr: AttributeApplication, accept: ValidationAcceptor): void;
10
+ private _checkModelLevelPolicy;
11
+ private _checkFieldLevelPolicy;
12
+ private validatePolicyKinds;
13
+ }
14
+ export declare function validateAttributeApplication(attr: AttributeApplication, accept: ValidationAcceptor): void;
15
+ export {};
@@ -0,0 +1,246 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.validateAttributeApplication = void 0;
13
+ const ast_1 = require("@zenstackhq/language/ast");
14
+ const sdk_1 = require("@zenstackhq/sdk");
15
+ const langium_1 = require("langium");
16
+ const pluralize_1 = __importDefault(require("pluralize"));
17
+ const utils_1 = require("./utils");
18
+ // a registry of function handlers marked with @func
19
+ const attributeCheckers = new Map();
20
+ // function handler decorator
21
+ function check(name) {
22
+ return function (_target, _propertyKey, descriptor) {
23
+ if (!attributeCheckers.get(name)) {
24
+ attributeCheckers.set(name, descriptor);
25
+ }
26
+ return descriptor;
27
+ };
28
+ }
29
+ /**
30
+ * Validates function declarations.
31
+ */
32
+ class AttributeApplicationValidator {
33
+ validate(attr, accept) {
34
+ const decl = attr.decl.ref;
35
+ if (!decl) {
36
+ return;
37
+ }
38
+ const targetDecl = attr.$container;
39
+ if (decl.name === '@@@targetField' && !(0, ast_1.isAttribute)(targetDecl)) {
40
+ accept('error', `attribute "${decl.name}" can only be used on attribute declarations`, { node: attr });
41
+ return;
42
+ }
43
+ if ((0, ast_1.isDataModelField)(targetDecl) && !isValidAttributeTarget(decl, targetDecl)) {
44
+ accept('error', `attribute "${decl.name}" cannot be used on this type of field`, { node: attr });
45
+ }
46
+ const filledParams = new Set();
47
+ for (const arg of attr.args) {
48
+ let paramDecl;
49
+ if (!arg.name) {
50
+ paramDecl = decl.params.find((p) => p.default && !filledParams.has(p));
51
+ if (!paramDecl) {
52
+ accept('error', `Unexpected unnamed argument`, {
53
+ node: arg,
54
+ });
55
+ return;
56
+ }
57
+ }
58
+ else {
59
+ paramDecl = decl.params.find((p) => p.name === arg.name);
60
+ if (!paramDecl) {
61
+ accept('error', `Attribute "${decl.name}" doesn't have a parameter named "${arg.name}"`, {
62
+ node: arg,
63
+ });
64
+ return;
65
+ }
66
+ }
67
+ if (!assignableToAttributeParam(arg, paramDecl, attr)) {
68
+ accept('error', `Value is not assignable to parameter`, {
69
+ node: arg,
70
+ });
71
+ return;
72
+ }
73
+ if (filledParams.has(paramDecl)) {
74
+ accept('error', `Parameter "${paramDecl.name}" is already provided`, { node: arg });
75
+ return;
76
+ }
77
+ filledParams.add(paramDecl);
78
+ arg.$resolvedParam = paramDecl;
79
+ }
80
+ const missingParams = decl.params.filter((p) => !p.type.optional && !filledParams.has(p));
81
+ if (missingParams.length > 0) {
82
+ accept('error', `Required ${(0, pluralize_1.default)('parameter', missingParams.length)} not provided: ${missingParams
83
+ .map((p) => p.name)
84
+ .join(', ')}`, { node: attr });
85
+ return;
86
+ }
87
+ // run checkers for specific attributes
88
+ const checker = attributeCheckers.get(decl.name);
89
+ if (checker) {
90
+ checker.value.call(this, attr, accept);
91
+ }
92
+ }
93
+ _checkModelLevelPolicy(attr, accept) {
94
+ const kind = (0, utils_1.getStringLiteral)(attr.args[0].value);
95
+ if (!kind) {
96
+ accept('error', `expects a string literal`, { node: attr.args[0] });
97
+ return;
98
+ }
99
+ this.validatePolicyKinds(kind, ['create', 'read', 'update', 'delete', 'all'], attr, accept);
100
+ }
101
+ _checkFieldLevelPolicy(attr, accept) {
102
+ const kind = (0, utils_1.getStringLiteral)(attr.args[0].value);
103
+ if (!kind) {
104
+ accept('error', `expects a string literal`, { node: attr.args[0] });
105
+ return;
106
+ }
107
+ this.validatePolicyKinds(kind, ['read', 'update', 'all'], attr, accept);
108
+ const expr = attr.args[1].value;
109
+ if ((0, langium_1.streamAst)(expr).some((node) => (0, sdk_1.isFutureExpr)(node))) {
110
+ accept('error', `"future()" is not allowed in field-level policy rules`, { node: expr });
111
+ }
112
+ }
113
+ validatePolicyKinds(kind, candidates, attr, accept) {
114
+ const items = kind.split(',').map((x) => x.trim());
115
+ items.forEach((item) => {
116
+ if (!candidates.includes(item)) {
117
+ accept('error', `Invalid policy rule kind: "${item}", allowed: ${candidates.map((c) => '"' + c + '"').join(', ')}`, { node: attr });
118
+ }
119
+ });
120
+ }
121
+ }
122
+ __decorate([
123
+ check('@@allow'),
124
+ check('@@deny')
125
+ ], AttributeApplicationValidator.prototype, "_checkModelLevelPolicy", null);
126
+ __decorate([
127
+ check('@allow'),
128
+ check('@deny')
129
+ ], AttributeApplicationValidator.prototype, "_checkFieldLevelPolicy", null);
130
+ exports.default = AttributeApplicationValidator;
131
+ function assignableToAttributeParam(arg, param, attr) {
132
+ var _a, _b, _c, _d;
133
+ const argResolvedType = arg.$resolvedType;
134
+ if (!argResolvedType) {
135
+ return false;
136
+ }
137
+ let dstType = param.type.type;
138
+ let dstIsArray = param.type.array;
139
+ const dstRef = param.type.reference;
140
+ if (dstType === 'Any' && !dstIsArray) {
141
+ return true;
142
+ }
143
+ // destination is field reference or transitive field reference, check if
144
+ // argument is reference or array or reference
145
+ if (dstType === 'FieldReference' || dstType === 'TransitiveFieldReference') {
146
+ if (dstIsArray) {
147
+ return ((0, ast_1.isArrayExpr)(arg.value) &&
148
+ !arg.value.items.find((item) => !(0, ast_1.isReferenceExpr)(item) || !(0, ast_1.isDataModelField)(item.target.ref)));
149
+ }
150
+ else {
151
+ return (0, ast_1.isReferenceExpr)(arg.value) && (0, ast_1.isDataModelField)(arg.value.target.ref);
152
+ }
153
+ }
154
+ if ((0, ast_1.isEnum)(argResolvedType.decl)) {
155
+ // enum type
156
+ let attrArgDeclType = dstRef === null || dstRef === void 0 ? void 0 : dstRef.ref;
157
+ if (dstType === 'ContextType' && (0, ast_1.isDataModelField)(attr.$container) && ((_b = (_a = attr.$container) === null || _a === void 0 ? void 0 : _a.type) === null || _b === void 0 ? void 0 : _b.reference)) {
158
+ // attribute parameter type is ContextType, need to infer type from
159
+ // the attribute's container
160
+ attrArgDeclType = (0, sdk_1.resolved)(attr.$container.type.reference);
161
+ dstIsArray = attr.$container.type.array;
162
+ }
163
+ return attrArgDeclType === argResolvedType.decl && dstIsArray === argResolvedType.array;
164
+ }
165
+ else if (dstType) {
166
+ // scalar type
167
+ if (typeof (argResolvedType === null || argResolvedType === void 0 ? void 0 : argResolvedType.decl) !== 'string') {
168
+ // destination type is not a reference, so argument type must be a plain expression
169
+ return false;
170
+ }
171
+ if (dstType === 'ContextType') {
172
+ // attribute parameter type is ContextType, need to infer type from
173
+ // the attribute's container
174
+ if ((0, ast_1.isDataModelField)(attr.$container)) {
175
+ if (!((_d = (_c = attr.$container) === null || _c === void 0 ? void 0 : _c.type) === null || _d === void 0 ? void 0 : _d.type)) {
176
+ return false;
177
+ }
178
+ dstType = (0, utils_1.mapBuiltinTypeToExpressionType)(attr.$container.type.type);
179
+ dstIsArray = attr.$container.type.array;
180
+ }
181
+ else {
182
+ dstType = 'Any';
183
+ }
184
+ }
185
+ return (0, utils_1.typeAssignable)(dstType, argResolvedType.decl, arg.value) && dstIsArray === argResolvedType.array;
186
+ }
187
+ else {
188
+ // reference type
189
+ return ((dstRef === null || dstRef === void 0 ? void 0 : dstRef.ref) === argResolvedType.decl || dstType === 'Any') && dstIsArray === argResolvedType.array;
190
+ }
191
+ }
192
+ function isValidAttributeTarget(attrDecl, targetDecl) {
193
+ var _a;
194
+ const targetField = attrDecl.attributes.find((attr) => { var _a; return ((_a = attr.decl.ref) === null || _a === void 0 ? void 0 : _a.name) === '@@@targetField'; });
195
+ if (!targetField) {
196
+ // no field type constraint
197
+ return true;
198
+ }
199
+ const fieldTypes = targetField.args[0].value.items.map((item) => { var _a; return (_a = item.target.ref) === null || _a === void 0 ? void 0 : _a.name; });
200
+ let allowed = false;
201
+ for (const allowedType of fieldTypes) {
202
+ switch (allowedType) {
203
+ case 'StringField':
204
+ allowed = allowed || targetDecl.type.type === 'String';
205
+ break;
206
+ case 'IntField':
207
+ allowed = allowed || targetDecl.type.type === 'Int';
208
+ break;
209
+ case 'BigIntField':
210
+ allowed = allowed || targetDecl.type.type === 'BigInt';
211
+ break;
212
+ case 'FloatField':
213
+ allowed = allowed || targetDecl.type.type === 'Float';
214
+ break;
215
+ case 'DecimalField':
216
+ allowed = allowed || targetDecl.type.type === 'Decimal';
217
+ break;
218
+ case 'BooleanField':
219
+ allowed = allowed || targetDecl.type.type === 'Boolean';
220
+ break;
221
+ case 'DateTimeField':
222
+ allowed = allowed || targetDecl.type.type === 'DateTime';
223
+ break;
224
+ case 'JsonField':
225
+ allowed = allowed || targetDecl.type.type === 'Json';
226
+ break;
227
+ case 'BytesField':
228
+ allowed = allowed || targetDecl.type.type === 'Bytes';
229
+ break;
230
+ case 'ModelField':
231
+ allowed = allowed || (0, ast_1.isDataModel)((_a = targetDecl.type.reference) === null || _a === void 0 ? void 0 : _a.ref);
232
+ break;
233
+ default:
234
+ break;
235
+ }
236
+ if (allowed) {
237
+ break;
238
+ }
239
+ }
240
+ return allowed;
241
+ }
242
+ function validateAttributeApplication(attr, accept) {
243
+ new AttributeApplicationValidator().validate(attr, accept);
244
+ }
245
+ exports.validateAttributeApplication = validateAttributeApplication;
246
+ //# sourceMappingURL=attribute-application-validator.js.map