@contember/schema-utils 2.1.0-alpha.9 → 2.1.0-beta.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 (261) hide show
  1. package/CLAUDE.md +30 -0
  2. package/dist/development/index.cjs.map +1 -1
  3. package/dist/development/index.js.map +1 -1
  4. package/dist/development/src/acl/AllowAllPermissionFactory.cjs.map +1 -1
  5. package/dist/development/src/acl/AllowAllPermissionFactory.js.map +1 -1
  6. package/dist/development/src/acl/PredicateDefinitionProcessor.cjs +1 -3
  7. package/dist/development/src/acl/PredicateDefinitionProcessor.cjs.map +1 -1
  8. package/dist/development/src/acl/PredicateDefinitionProcessor.js +1 -3
  9. package/dist/development/src/acl/PredicateDefinitionProcessor.js.map +1 -1
  10. package/dist/development/src/acl/schemaUtils.cjs.map +1 -1
  11. package/dist/development/src/acl/schemaUtils.js.map +1 -1
  12. package/dist/development/src/dataUtils.cjs.map +1 -1
  13. package/dist/development/src/dataUtils.js.map +1 -1
  14. package/dist/development/src/definition-generator/AclDefinitionCodeGenerator.cjs +8 -7
  15. package/dist/development/src/definition-generator/AclDefinitionCodeGenerator.cjs.map +1 -1
  16. package/dist/development/src/definition-generator/AclDefinitionCodeGenerator.js +8 -7
  17. package/dist/development/src/definition-generator/AclDefinitionCodeGenerator.js.map +1 -1
  18. package/dist/development/src/definition-generator/DefinitionCodeGenerator.cjs.map +1 -1
  19. package/dist/development/src/definition-generator/DefinitionCodeGenerator.js.map +1 -1
  20. package/dist/development/src/definition-generator/DefinitionNamingConventions.cjs +50 -1
  21. package/dist/development/src/definition-generator/DefinitionNamingConventions.cjs.map +1 -1
  22. package/dist/development/src/definition-generator/DefinitionNamingConventions.js +50 -1
  23. package/dist/development/src/definition-generator/DefinitionNamingConventions.js.map +1 -1
  24. package/dist/development/src/definition-generator/TsDefinitionGenerator.cjs.map +1 -1
  25. package/dist/development/src/definition-generator/TsDefinitionGenerator.js.map +1 -1
  26. package/dist/development/src/lax/LaxSchemaConverter.cjs.map +1 -1
  27. package/dist/development/src/lax/LaxSchemaConverter.js.map +1 -1
  28. package/dist/development/src/lax/schema.cjs.map +1 -1
  29. package/dist/development/src/lax/schema.js.map +1 -1
  30. package/dist/development/src/model/NamingConventions.cjs.map +1 -1
  31. package/dist/development/src/model/NamingConventions.js.map +1 -1
  32. package/dist/development/src/model/modelUtils.cjs +7 -9
  33. package/dist/development/src/model/modelUtils.cjs.map +1 -1
  34. package/dist/development/src/model/modelUtils.js +7 -9
  35. package/dist/development/src/model/modelUtils.js.map +1 -1
  36. package/dist/development/src/model/resolveDefaultColumnType.cjs.map +1 -1
  37. package/dist/development/src/model/resolveDefaultColumnType.js.map +1 -1
  38. package/dist/development/src/schemaChecksum.cjs.map +1 -1
  39. package/dist/development/src/schemaChecksum.js.map +1 -1
  40. package/dist/development/src/schemaFilter.cjs.map +1 -1
  41. package/dist/development/src/schemaFilter.js.map +1 -1
  42. package/dist/development/src/schemaNormalizer.cjs.map +1 -1
  43. package/dist/development/src/schemaNormalizer.js.map +1 -1
  44. package/dist/development/src/type-schema/acl.cjs +15 -12
  45. package/dist/development/src/type-schema/acl.cjs.map +1 -1
  46. package/dist/development/src/type-schema/acl.js +15 -12
  47. package/dist/development/src/type-schema/acl.js.map +1 -1
  48. package/dist/development/src/type-schema/actions.cjs +2 -1
  49. package/dist/development/src/type-schema/actions.cjs.map +1 -1
  50. package/dist/development/src/type-schema/actions.js +2 -1
  51. package/dist/development/src/type-schema/actions.js.map +1 -1
  52. package/dist/development/src/type-schema/condition.cjs +4 -1
  53. package/dist/development/src/type-schema/condition.cjs.map +1 -1
  54. package/dist/development/src/type-schema/condition.js +4 -1
  55. package/dist/development/src/type-schema/condition.js.map +1 -1
  56. package/dist/development/src/type-schema/model.cjs +10 -5
  57. package/dist/development/src/type-schema/model.cjs.map +1 -1
  58. package/dist/development/src/type-schema/model.js +10 -5
  59. package/dist/development/src/type-schema/model.js.map +1 -1
  60. package/dist/development/src/type-schema/settings.cjs +3 -0
  61. package/dist/development/src/type-schema/settings.cjs.map +1 -1
  62. package/dist/development/src/type-schema/settings.js +3 -0
  63. package/dist/development/src/type-schema/settings.js.map +1 -1
  64. package/dist/development/src/type-schema/validation.cjs.map +1 -1
  65. package/dist/development/src/type-schema/validation.js.map +1 -1
  66. package/dist/development/src/type-schema/where.cjs +11 -9
  67. package/dist/development/src/type-schema/where.cjs.map +1 -1
  68. package/dist/development/src/type-schema/where.js +11 -9
  69. package/dist/development/src/type-schema/where.js.map +1 -1
  70. package/dist/development/src/utils/assertNever.cjs.map +1 -1
  71. package/dist/development/src/utils/assertNever.js.map +1 -1
  72. package/dist/development/src/utils/deepCompare.cjs +1 -1
  73. package/dist/development/src/utils/deepCompare.cjs.map +1 -1
  74. package/dist/development/src/utils/deepCompare.js +1 -1
  75. package/dist/development/src/utils/deepCompare.js.map +1 -1
  76. package/dist/development/src/utils/isIt.cjs.map +1 -1
  77. package/dist/development/src/utils/isIt.js.map +1 -1
  78. package/dist/development/src/utils/printJsValue.cjs.map +1 -1
  79. package/dist/development/src/utils/printJsValue.js.map +1 -1
  80. package/dist/development/src/validation/AclValidator.cjs.map +1 -1
  81. package/dist/development/src/validation/AclValidator.js.map +1 -1
  82. package/dist/development/src/validation/ActionsValidator.cjs.map +1 -1
  83. package/dist/development/src/validation/ActionsValidator.js.map +1 -1
  84. package/dist/development/src/validation/MembershipResolver.cjs +10 -7
  85. package/dist/development/src/validation/MembershipResolver.cjs.map +1 -1
  86. package/dist/development/src/validation/MembershipResolver.js +10 -7
  87. package/dist/development/src/validation/MembershipResolver.js.map +1 -1
  88. package/dist/development/src/validation/ModelValidator.cjs +20 -5
  89. package/dist/development/src/validation/ModelValidator.cjs.map +1 -1
  90. package/dist/development/src/validation/ModelValidator.js +20 -5
  91. package/dist/development/src/validation/ModelValidator.js.map +1 -1
  92. package/dist/development/src/validation/SchemaValidator.cjs.map +1 -1
  93. package/dist/development/src/validation/SchemaValidator.js.map +1 -1
  94. package/dist/development/src/validation/ValidationValidator.cjs.map +1 -1
  95. package/dist/development/src/validation/ValidationValidator.js.map +1 -1
  96. package/dist/development/src/validation/errors.cjs.map +1 -1
  97. package/dist/development/src/validation/errors.js.map +1 -1
  98. package/dist/production/index.cjs.map +1 -1
  99. package/dist/production/index.js.map +1 -1
  100. package/dist/production/src/acl/AllowAllPermissionFactory.cjs.map +1 -1
  101. package/dist/production/src/acl/AllowAllPermissionFactory.js.map +1 -1
  102. package/dist/production/src/acl/PredicateDefinitionProcessor.cjs +1 -3
  103. package/dist/production/src/acl/PredicateDefinitionProcessor.cjs.map +1 -1
  104. package/dist/production/src/acl/PredicateDefinitionProcessor.js +1 -3
  105. package/dist/production/src/acl/PredicateDefinitionProcessor.js.map +1 -1
  106. package/dist/production/src/acl/schemaUtils.cjs.map +1 -1
  107. package/dist/production/src/acl/schemaUtils.js.map +1 -1
  108. package/dist/production/src/dataUtils.cjs.map +1 -1
  109. package/dist/production/src/dataUtils.js.map +1 -1
  110. package/dist/production/src/definition-generator/AclDefinitionCodeGenerator.cjs +8 -7
  111. package/dist/production/src/definition-generator/AclDefinitionCodeGenerator.cjs.map +1 -1
  112. package/dist/production/src/definition-generator/AclDefinitionCodeGenerator.js +8 -7
  113. package/dist/production/src/definition-generator/AclDefinitionCodeGenerator.js.map +1 -1
  114. package/dist/production/src/definition-generator/DefinitionCodeGenerator.cjs.map +1 -1
  115. package/dist/production/src/definition-generator/DefinitionCodeGenerator.js.map +1 -1
  116. package/dist/production/src/definition-generator/DefinitionNamingConventions.cjs +50 -1
  117. package/dist/production/src/definition-generator/DefinitionNamingConventions.cjs.map +1 -1
  118. package/dist/production/src/definition-generator/DefinitionNamingConventions.js +50 -1
  119. package/dist/production/src/definition-generator/DefinitionNamingConventions.js.map +1 -1
  120. package/dist/production/src/definition-generator/TsDefinitionGenerator.cjs.map +1 -1
  121. package/dist/production/src/definition-generator/TsDefinitionGenerator.js.map +1 -1
  122. package/dist/production/src/lax/LaxSchemaConverter.cjs.map +1 -1
  123. package/dist/production/src/lax/LaxSchemaConverter.js.map +1 -1
  124. package/dist/production/src/lax/schema.cjs.map +1 -1
  125. package/dist/production/src/lax/schema.js.map +1 -1
  126. package/dist/production/src/model/NamingConventions.cjs.map +1 -1
  127. package/dist/production/src/model/NamingConventions.js.map +1 -1
  128. package/dist/production/src/model/modelUtils.cjs +7 -9
  129. package/dist/production/src/model/modelUtils.cjs.map +1 -1
  130. package/dist/production/src/model/modelUtils.js +7 -9
  131. package/dist/production/src/model/modelUtils.js.map +1 -1
  132. package/dist/production/src/model/resolveDefaultColumnType.cjs.map +1 -1
  133. package/dist/production/src/model/resolveDefaultColumnType.js.map +1 -1
  134. package/dist/production/src/schemaChecksum.cjs.map +1 -1
  135. package/dist/production/src/schemaChecksum.js.map +1 -1
  136. package/dist/production/src/schemaFilter.cjs.map +1 -1
  137. package/dist/production/src/schemaFilter.js.map +1 -1
  138. package/dist/production/src/schemaNormalizer.cjs.map +1 -1
  139. package/dist/production/src/schemaNormalizer.js.map +1 -1
  140. package/dist/production/src/type-schema/acl.cjs +15 -12
  141. package/dist/production/src/type-schema/acl.cjs.map +1 -1
  142. package/dist/production/src/type-schema/acl.js +15 -12
  143. package/dist/production/src/type-schema/acl.js.map +1 -1
  144. package/dist/production/src/type-schema/actions.cjs +2 -1
  145. package/dist/production/src/type-schema/actions.cjs.map +1 -1
  146. package/dist/production/src/type-schema/actions.js +2 -1
  147. package/dist/production/src/type-schema/actions.js.map +1 -1
  148. package/dist/production/src/type-schema/condition.cjs +4 -1
  149. package/dist/production/src/type-schema/condition.cjs.map +1 -1
  150. package/dist/production/src/type-schema/condition.js +4 -1
  151. package/dist/production/src/type-schema/condition.js.map +1 -1
  152. package/dist/production/src/type-schema/model.cjs +10 -5
  153. package/dist/production/src/type-schema/model.cjs.map +1 -1
  154. package/dist/production/src/type-schema/model.js +10 -5
  155. package/dist/production/src/type-schema/model.js.map +1 -1
  156. package/dist/production/src/type-schema/settings.cjs +3 -0
  157. package/dist/production/src/type-schema/settings.cjs.map +1 -1
  158. package/dist/production/src/type-schema/settings.js +3 -0
  159. package/dist/production/src/type-schema/settings.js.map +1 -1
  160. package/dist/production/src/type-schema/validation.cjs.map +1 -1
  161. package/dist/production/src/type-schema/validation.js.map +1 -1
  162. package/dist/production/src/type-schema/where.cjs +11 -9
  163. package/dist/production/src/type-schema/where.cjs.map +1 -1
  164. package/dist/production/src/type-schema/where.js +11 -9
  165. package/dist/production/src/type-schema/where.js.map +1 -1
  166. package/dist/production/src/utils/assertNever.cjs.map +1 -1
  167. package/dist/production/src/utils/assertNever.js.map +1 -1
  168. package/dist/production/src/utils/deepCompare.cjs +1 -1
  169. package/dist/production/src/utils/deepCompare.cjs.map +1 -1
  170. package/dist/production/src/utils/deepCompare.js +1 -1
  171. package/dist/production/src/utils/deepCompare.js.map +1 -1
  172. package/dist/production/src/utils/isIt.cjs.map +1 -1
  173. package/dist/production/src/utils/isIt.js.map +1 -1
  174. package/dist/production/src/utils/printJsValue.cjs.map +1 -1
  175. package/dist/production/src/utils/printJsValue.js.map +1 -1
  176. package/dist/production/src/validation/AclValidator.cjs.map +1 -1
  177. package/dist/production/src/validation/AclValidator.js.map +1 -1
  178. package/dist/production/src/validation/ActionsValidator.cjs.map +1 -1
  179. package/dist/production/src/validation/ActionsValidator.js.map +1 -1
  180. package/dist/production/src/validation/MembershipResolver.cjs +10 -7
  181. package/dist/production/src/validation/MembershipResolver.cjs.map +1 -1
  182. package/dist/production/src/validation/MembershipResolver.js +10 -7
  183. package/dist/production/src/validation/MembershipResolver.js.map +1 -1
  184. package/dist/production/src/validation/ModelValidator.cjs +20 -5
  185. package/dist/production/src/validation/ModelValidator.cjs.map +1 -1
  186. package/dist/production/src/validation/ModelValidator.js +20 -5
  187. package/dist/production/src/validation/ModelValidator.js.map +1 -1
  188. package/dist/production/src/validation/SchemaValidator.cjs.map +1 -1
  189. package/dist/production/src/validation/SchemaValidator.js.map +1 -1
  190. package/dist/production/src/validation/ValidationValidator.cjs.map +1 -1
  191. package/dist/production/src/validation/ValidationValidator.js.map +1 -1
  192. package/dist/production/src/validation/errors.cjs.map +1 -1
  193. package/dist/production/src/validation/errors.js.map +1 -1
  194. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  195. package/dist/types/acl/PredicateDefinitionProcessor.d.ts.map +1 -1
  196. package/dist/types/definition-generator/AclDefinitionCodeGenerator.d.ts.map +1 -1
  197. package/dist/types/definition-generator/DefinitionCodeGenerator.d.ts.map +1 -1
  198. package/dist/types/definition-generator/DefinitionNamingConventions.d.ts.map +1 -1
  199. package/dist/types/index.d.ts +1 -1
  200. package/dist/types/index.d.ts.map +1 -1
  201. package/dist/types/lax/LaxSchemaConverter.d.ts.map +1 -1
  202. package/dist/types/lax/schema.d.ts.map +1 -1
  203. package/dist/types/model/modelUtils.d.ts.map +1 -1
  204. package/dist/types/schemaChecksum.d.ts.map +1 -1
  205. package/dist/types/tsconfig.tsbuildinfo +1 -1
  206. package/dist/types/type-schema/acl.d.ts.map +1 -1
  207. package/dist/types/type-schema/actions.d.ts +1 -0
  208. package/dist/types/type-schema/actions.d.ts.map +1 -1
  209. package/dist/types/type-schema/model.d.ts.map +1 -1
  210. package/dist/types/type-schema/settings.d.ts +11 -0
  211. package/dist/types/type-schema/settings.d.ts.map +1 -1
  212. package/dist/types/type-schema/validation.d.ts.map +1 -1
  213. package/dist/types/type-schema/where.d.ts.map +1 -1
  214. package/dist/types/utils/printJsValue.d.ts.map +1 -1
  215. package/dist/types/validation/AclValidator.d.ts.map +1 -1
  216. package/dist/types/validation/ActionsValidator.d.ts.map +1 -1
  217. package/dist/types/validation/MembershipResolver.d.ts +1 -1
  218. package/dist/types/validation/MembershipResolver.d.ts.map +1 -1
  219. package/dist/types/validation/ModelValidator.d.ts.map +1 -1
  220. package/dist/types/validation/SchemaValidator.d.ts.map +1 -1
  221. package/dist/types/validation/ValidationValidator.d.ts.map +1 -1
  222. package/dist/types/validation/errors.d.ts.map +1 -1
  223. package/package.json +11 -6
  224. package/src/acl/AllowAllPermissionFactory.ts +1 -1
  225. package/src/acl/PredicateDefinitionProcessor.ts +5 -7
  226. package/src/dataUtils.ts +1 -1
  227. package/src/definition-generator/AclDefinitionCodeGenerator.ts +7 -8
  228. package/src/definition-generator/DefinitionCodeGenerator.ts +8 -14
  229. package/src/definition-generator/DefinitionNamingConventions.ts +50 -1
  230. package/src/index.ts +2 -2
  231. package/src/lax/LaxSchemaConverter.ts +0 -4
  232. package/src/lax/schema.ts +4 -1
  233. package/src/model/modelUtils.ts +2 -4
  234. package/src/schemaChecksum.ts +0 -1
  235. package/src/schemaFilter.ts +1 -1
  236. package/src/type-schema/acl.ts +15 -12
  237. package/src/type-schema/actions.ts +1 -2
  238. package/src/type-schema/condition.ts +25 -20
  239. package/src/type-schema/model.ts +12 -8
  240. package/src/type-schema/settings.ts +3 -0
  241. package/src/type-schema/validation.ts +5 -4
  242. package/src/type-schema/where.ts +11 -9
  243. package/src/utils/deepCompare.ts +1 -1
  244. package/src/utils/printJsValue.ts +23 -25
  245. package/src/validation/AclValidator.ts +0 -2
  246. package/src/validation/ActionsValidator.ts +7 -7
  247. package/src/validation/MembershipResolver.ts +10 -9
  248. package/src/validation/ModelValidator.ts +43 -32
  249. package/src/validation/SchemaValidator.ts +7 -6
  250. package/src/validation/ValidationValidator.ts +1 -3
  251. package/src/validation/errors.ts +0 -3
  252. package/tests/cases/unit/conditionSchema.test.ts +1 -2
  253. package/tests/cases/unit/deepCompare.test.ts +2 -3
  254. package/tests/cases/unit/laxSchemaConverter.test.ts +0 -4
  255. package/tests/cases/unit/membershipResolver.test.ts +136 -49
  256. package/tests/cases/unit/modelSchema.test.ts +4 -4
  257. package/tests/cases/unit/modelValidator.test.ts +0 -1
  258. package/tests/cases/unit/printJsvalue.test.ts +11 -7
  259. package/tests/cases/unit/whereSchema.test.ts +19 -18
  260. package/tests/cases/unit/schemas/.eslintignore +0 -1
  261. package/vitest.config.ts +0 -3
@@ -12,7 +12,7 @@ var __defProp = Object.defineProperty;
12
12
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
13
13
  var __publicField = (obj, key, value) => __defNormalProp(obj, key + "", value);
14
14
  class MembershipResolver {
15
- resolve(acl, memberships, identity) {
15
+ resolve(acl, memberships, identity, isAssumed) {
16
16
  const errors = [];
17
17
  const parsed = [];
18
18
  const roles = acl.roles;
@@ -27,7 +27,7 @@ class MembershipResolver {
27
27
  }
28
28
  const roleVariables = schemaUtils.getRoleVariables(membership.role, acl);
29
29
  for (const variable of membership.variables) {
30
- if (!roleVariables[variable.name] || roleVariables[variable.name].type === schema.Acl.VariableType.predefined) {
30
+ if (!roleVariables[variable.name] || !isAssumed && roleVariables[variable.name].type === schema.Acl.VariableType.predefined) {
31
31
  errors.push(
32
32
  new MembershipValidationError(
33
33
  membership.role,
@@ -37,7 +37,7 @@ class MembershipResolver {
37
37
  );
38
38
  }
39
39
  }
40
- const [membershipErrors, parsedVariables] = this.readMembershipVariables(roleVariables, membership, identity);
40
+ const [membershipErrors, parsedVariables] = this.readMembershipVariables(roleVariables, membership, identity, isAssumed);
41
41
  errors.push(...membershipErrors);
42
42
  parsed.push({
43
43
  role: membership.role,
@@ -46,19 +46,23 @@ class MembershipResolver {
46
46
  }
47
47
  return new MembershipReadResult(errors, parsed);
48
48
  }
49
- readMembershipVariables(roleVariables, membership, identity) {
49
+ readMembershipVariables(roleVariables, membership, identity, isAssumed) {
50
50
  const errors = [];
51
51
  const parsedVariables = [];
52
52
  for (const [name, variable] of Object.entries(roleVariables)) {
53
+ const inputVariable = membership.variables.find((it) => it.name === name);
53
54
  if (variable.type === schema.Acl.VariableType.predefined) {
54
55
  switch (variable.value) {
55
56
  case "identityID":
56
- parsedVariables.push({ name, condition: { in: [identity.identityId] } });
57
+ parsedVariables.push({
58
+ name,
59
+ condition: { in: isAssumed && inputVariable ? inputVariable.values : [identity.identityId] }
60
+ });
57
61
  break;
58
62
  case "personID":
59
63
  parsedVariables.push({
60
64
  name,
61
- condition: { in: identity.personId ? [identity.personId] : [] }
65
+ condition: { in: isAssumed && inputVariable ? inputVariable.values : identity.personId ? [identity.personId] : [] }
62
66
  });
63
67
  break;
64
68
  default:
@@ -68,7 +72,6 @@ class MembershipResolver {
68
72
  }
69
73
  continue;
70
74
  }
71
- const inputVariable = membership.variables.find((it) => it.name === name);
72
75
  if (!inputVariable) {
73
76
  if (variable.fallback) {
74
77
  parsedVariables.push({ name, condition: variable.fallback });
@@ -1 +1 @@
1
- {"version":3,"file":"MembershipResolver.cjs","sources":["../../../../../packages/schema-utils/src/validation/MembershipResolver.ts"],"sourcesContent":["import { Acl, Input } from '@contember/schema'\nimport { getRoleVariables } from '../acl'\nimport { conditionSchema } from '../type-schema'\nimport { assertNever } from '../utils'\n\n\nexport class MembershipResolver {\n\tpublic static UnknownIdentity = { identityId: '00000000-0000-0000-0000-000000000000' }\n\n\tresolve(\n\t\tacl: Acl.Schema,\n\t\tmemberships: readonly Acl.Membership[],\n\t\tidentity: {\n\t\t\tidentityId: string\n\t\t\tpersonId?: string\n\t\t},\n\t): MembershipReadResult {\n\t\tconst errors: MembershipValidationError[] = []\n\t\tconst parsed: ParsedMembership[] = []\n\t\tconst roles = acl.roles\n\t\tfor (const membership of memberships) {\n\t\t\tif (!roles[membership.role]) {\n\t\t\t\terrors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.ROLE_NOT_FOUND))\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst roleVariables = getRoleVariables(membership.role, acl)\n\t\t\tfor (const variable of membership.variables) {\n\t\t\t\tif (!roleVariables[variable.name] || roleVariables[variable.name].type === Acl.VariableType.predefined) {\n\t\t\t\t\terrors.push(\n\t\t\t\t\t\tnew MembershipValidationError(\n\t\t\t\t\t\t\tmembership.role,\n\t\t\t\t\t\t\tMembershipValidationErrorType.VARIABLE_NOT_FOUND,\n\t\t\t\t\t\t\tvariable.name,\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst [membershipErrors, parsedVariables] = this.readMembershipVariables(roleVariables, membership, identity)\n\t\t\terrors.push(...membershipErrors)\n\t\t\tparsed.push({\n\t\t\t\trole: membership.role,\n\t\t\t\tvariables: parsedVariables,\n\t\t\t})\n\t\t}\n\t\treturn new MembershipReadResult(errors, parsed)\n\t}\n\n\tprivate readMembershipVariables(roleVariables: Acl.Variables, membership: Acl.Membership, identity: {\n\t\tidentityId: string\n\t\tpersonId?: string\n\t}): [MembershipValidationError[], ParsedMembershipVariable[]] {\n\t\tconst errors: MembershipValidationError[] = []\n\t\tconst parsedVariables: ParsedMembershipVariable[] = []\n\t\tfor (const [name, variable] of Object.entries(roleVariables)) {\n\t\t\tif (variable.type === Acl.VariableType.predefined) {\n\t\t\t\tswitch (variable.value) {\n\t\t\t\t\tcase 'identityID':\n\t\t\t\t\t\tparsedVariables.push({ name, condition: { in: [identity.identityId] } })\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'personID':\n\t\t\t\t\t\tparsedVariables.push({\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tcondition: { in: identity.personId ? [identity.personId] : [] },\n\t\t\t\t\t\t})\n\t\t\t\t\t\tbreak\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tparsedVariables.push({ name, condition: { never: true } })\n\t\t\t\t\t\terrors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.VARIABLE_INVALID, name))\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst inputVariable = membership.variables.find(it => it.name === name)\n\t\t\tif (!inputVariable) {\n\t\t\t\tif (variable.fallback) {\n\t\t\t\t\tparsedVariables.push({ name, condition: variable.fallback })\n\t\t\t\t} else {\n\t\t\t\t\terrors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.VARIABLE_EMPTY, name))\n\t\t\t\t\tparsedVariables.push({ name, condition: { never: true } })\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (variable.type === Acl.VariableType.entity) {\n\t\t\t\tparsedVariables.push({ name, condition: { in: inputVariable.values } }) // todo: cast to int where primary is int\n\n\t\t\t} else if (variable.type === Acl.VariableType.condition) {\n\t\t\t\ttry {\n\t\t\t\t\tconst conditions = inputVariable.values.map(it => conditionSchema()(JSON.parse(it)))\n\t\t\t\t\tparsedVariables.push({\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tcondition: conditions.length === 1 ? conditions[0] : { or: conditions },\n\t\t\t\t\t})\n\t\t\t\t} catch {\n\t\t\t\t\terrors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.VARIABLE_INVALID, name))\n\t\t\t\t\tparsedVariables.push({ name, condition: { never: true } })\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tassertNever(variable)\n\t\t\t}\n\t\t}\n\t\treturn [errors, parsedVariables]\n\t}\n}\n\nexport class MembershipReadResult {\n\tconstructor(\n\t\tpublic readonly errors: MembershipValidationError[],\n\t\tpublic readonly memberships: ParsedMembership[],\n\t) {\n\t}\n}\n\nexport class MembershipValidationError {\n\tconstructor(\n\t\tpublic readonly role: string,\n\t\tpublic readonly error: MembershipValidationErrorType,\n\t\tpublic readonly variable?: string,\n\t) {\n\t}\n}\n\nexport enum MembershipValidationErrorType {\n\tROLE_NOT_FOUND = 'roleNotFound',\n\tVARIABLE_NOT_FOUND = 'variableNotFound',\n\tVARIABLE_EMPTY = 'variableEmpty',\n\tVARIABLE_INVALID = 'variableInvalid',\n}\n\n\nexport interface ParsedMembershipVariable {\n\treadonly name: string\n\treadonly condition: Input.Condition\n}\n\nexport interface ParsedMembership {\n\treadonly role: string\n\treadonly variables: readonly ParsedMembershipVariable[]\n}\n"],"names":["getRoleVariables","Acl","conditionSchema","assertNever","MembershipValidationErrorType"],"mappings":"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"}
1
+ {"version":3,"file":"MembershipResolver.cjs","sources":["../../../../../packages/schema-utils/src/validation/MembershipResolver.ts"],"sourcesContent":["import { Acl, Input } from '@contember/schema'\nimport { getRoleVariables } from '../acl'\nimport { conditionSchema } from '../type-schema'\nimport { assertNever } from '../utils'\n\nexport class MembershipResolver {\n\tpublic static UnknownIdentity = { identityId: '00000000-0000-0000-0000-000000000000' }\n\n\tresolve(\n\t\tacl: Acl.Schema,\n\t\tmemberships: readonly Acl.Membership[],\n\t\tidentity: {\n\t\t\tidentityId: string\n\t\t\tpersonId?: string\n\t\t},\n\t\tisAssumed: boolean,\n\t): MembershipReadResult {\n\t\tconst errors: MembershipValidationError[] = []\n\t\tconst parsed: ParsedMembership[] = []\n\t\tconst roles = acl.roles\n\t\tfor (const membership of memberships) {\n\t\t\tif (!roles[membership.role]) {\n\t\t\t\terrors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.ROLE_NOT_FOUND))\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst roleVariables = getRoleVariables(membership.role, acl)\n\t\t\tfor (const variable of membership.variables) {\n\t\t\t\tif (!roleVariables[variable.name] || (!isAssumed && roleVariables[variable.name].type === Acl.VariableType.predefined)) {\n\t\t\t\t\terrors.push(\n\t\t\t\t\t\tnew MembershipValidationError(\n\t\t\t\t\t\t\tmembership.role,\n\t\t\t\t\t\t\tMembershipValidationErrorType.VARIABLE_NOT_FOUND,\n\t\t\t\t\t\t\tvariable.name,\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst [membershipErrors, parsedVariables] = this.readMembershipVariables(roleVariables, membership, identity, isAssumed)\n\t\t\terrors.push(...membershipErrors)\n\t\t\tparsed.push({\n\t\t\t\trole: membership.role,\n\t\t\t\tvariables: parsedVariables,\n\t\t\t})\n\t\t}\n\t\treturn new MembershipReadResult(errors, parsed)\n\t}\n\n\tprivate readMembershipVariables(roleVariables: Acl.Variables, membership: Acl.Membership, identity: {\n\t\tidentityId: string\n\t\tpersonId?: string\n\t}, isAssumed: boolean): [MembershipValidationError[], ParsedMembershipVariable[]] {\n\t\tconst errors: MembershipValidationError[] = []\n\t\tconst parsedVariables: ParsedMembershipVariable[] = []\n\t\tfor (const [name, variable] of Object.entries(roleVariables)) {\n\t\t\tconst inputVariable = membership.variables.find(it => it.name === name)\n\t\t\tif (variable.type === Acl.VariableType.predefined) {\n\t\t\t\tswitch (variable.value) {\n\t\t\t\t\tcase 'identityID':\n\t\t\t\t\t\tparsedVariables.push({\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tcondition: { in: isAssumed && inputVariable ? inputVariable.values : [identity.identityId] },\n\t\t\t\t\t\t})\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'personID':\n\t\t\t\t\t\tparsedVariables.push({\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tcondition: { in: isAssumed && inputVariable ? inputVariable.values : identity.personId ? [identity.personId] : [] },\n\t\t\t\t\t\t})\n\t\t\t\t\t\tbreak\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tparsedVariables.push({ name, condition: { never: true } })\n\t\t\t\t\t\terrors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.VARIABLE_INVALID, name))\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (!inputVariable) {\n\t\t\t\tif (variable.fallback) {\n\t\t\t\t\tparsedVariables.push({ name, condition: variable.fallback })\n\t\t\t\t} else {\n\t\t\t\t\terrors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.VARIABLE_EMPTY, name))\n\t\t\t\t\tparsedVariables.push({ name, condition: { never: true } })\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (variable.type === Acl.VariableType.entity) {\n\t\t\t\tparsedVariables.push({ name, condition: { in: inputVariable.values } }) // todo: cast to int where primary is int\n\t\t\t} else if (variable.type === Acl.VariableType.condition) {\n\t\t\t\ttry {\n\t\t\t\t\tconst conditions = inputVariable.values.map(it => conditionSchema()(JSON.parse(it)))\n\t\t\t\t\tparsedVariables.push({\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tcondition: conditions.length === 1 ? conditions[0] : { or: conditions },\n\t\t\t\t\t})\n\t\t\t\t} catch {\n\t\t\t\t\terrors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.VARIABLE_INVALID, name))\n\t\t\t\t\tparsedVariables.push({ name, condition: { never: true } })\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tassertNever(variable)\n\t\t\t}\n\t\t}\n\t\treturn [errors, parsedVariables]\n\t}\n}\n\nexport class MembershipReadResult {\n\tconstructor(\n\t\tpublic readonly errors: MembershipValidationError[],\n\t\tpublic readonly memberships: ParsedMembership[],\n\t) {\n\t}\n}\n\nexport class MembershipValidationError {\n\tconstructor(\n\t\tpublic readonly role: string,\n\t\tpublic readonly error: MembershipValidationErrorType,\n\t\tpublic readonly variable?: string,\n\t) {\n\t}\n}\n\nexport enum MembershipValidationErrorType {\n\tROLE_NOT_FOUND = 'roleNotFound',\n\tVARIABLE_NOT_FOUND = 'variableNotFound',\n\tVARIABLE_EMPTY = 'variableEmpty',\n\tVARIABLE_INVALID = 'variableInvalid',\n}\n\nexport interface ParsedMembershipVariable {\n\treadonly name: string\n\treadonly condition: Input.Condition\n}\n\nexport interface ParsedMembership {\n\treadonly role: string\n\treadonly variables: readonly ParsedMembershipVariable[]\n}\n"],"names":["getRoleVariables","Acl","conditionSchema","assertNever","MembershipValidationErrorType"],"mappings":";;;;;;;;;;;;;AAKO,MAAM,mBAAmB;AAAA,EAG/B,QACC,KACA,aACA,UAIA,WACuB;AACvB,UAAM,SAAsC,CAAA;AAC5C,UAAM,SAA6B,CAAA;AACnC,UAAM,QAAQ,IAAI;AAClB,eAAW,cAAc,aAAa;AACrC,UAAI,CAAC,MAAM,WAAW,IAAI,GAAG;AAC5B,eAAO,KAAK,IAAI;AAAA,UAA0B,WAAW;AAAA,UAAM;AAAA;AAAA,SAA6C;AACxG;AAAA,MACD;AACA,YAAM,gBAAgBA,YAAAA,iBAAiB,WAAW,MAAM,GAAG;AAC3D,iBAAW,YAAY,WAAW,WAAW;AAC5C,YAAI,CAAC,cAAc,SAAS,IAAI,KAAM,CAAC,aAAa,cAAc,SAAS,IAAI,EAAE,SAASC,OAAAA,IAAI,aAAa,YAAa;AACvH,iBAAO;AAAA,YACN,IAAI;AAAA,cACH,WAAW;AAAA,cACX;AAAA,cACA,SAAS;AAAA,YAAA;AAAA,UACV;AAAA,QAEF;AAAA,MACD;AACA,YAAM,CAAC,kBAAkB,eAAe,IAAI,KAAK,wBAAwB,eAAe,YAAY,UAAU,SAAS;AACvH,aAAO,KAAK,GAAG,gBAAgB;AAC/B,aAAO,KAAK;AAAA,QACX,MAAM,WAAW;AAAA,QACjB,WAAW;AAAA,MAAA,CACX;AAAA,IACF;AACA,WAAO,IAAI,qBAAqB,QAAQ,MAAM;AAAA,EAC/C;AAAA,EAEQ,wBAAwB,eAA8B,YAA4B,UAGvF,WAA+E;AACjF,UAAM,SAAsC,CAAA;AAC5C,UAAM,kBAA8C,CAAA;AACpD,eAAW,CAAC,MAAM,QAAQ,KAAK,OAAO,QAAQ,aAAa,GAAG;AAC7D,YAAM,gBAAgB,WAAW,UAAU,KAAK,CAAA,OAAM,GAAG,SAAS,IAAI;AACtE,UAAI,SAAS,SAASA,WAAI,aAAa,YAAY;AAClD,gBAAQ,SAAS,OAAA;AAAA,UAChB,KAAK;AACJ,4BAAgB,KAAK;AAAA,cACpB;AAAA,cACA,WAAW,EAAE,IAAI,aAAa,gBAAgB,cAAc,SAAS,CAAC,SAAS,UAAU,EAAA;AAAA,YAAE,CAC3F;AACD;AAAA,UACD,KAAK;AACJ,4BAAgB,KAAK;AAAA,cACpB;AAAA,cACA,WAAW,EAAE,IAAI,aAAa,gBAAgB,cAAc,SAAS,SAAS,WAAW,CAAC,SAAS,QAAQ,IAAI,CAAA,EAAC;AAAA,YAAE,CAClH;AACD;AAAA,UACD;AACC,4BAAgB,KAAK,EAAE,MAAM,WAAW,EAAE,OAAO,KAAA,GAAQ;AACzD,mBAAO,KAAK,IAAI,0BAA0B,WAAW,MAAM,mBAAgD,IAAI,CAAC;AAChH;AAAA,QAAA;AAEF;AAAA,MACD;AAEA,UAAI,CAAC,eAAe;AACnB,YAAI,SAAS,UAAU;AACtB,0BAAgB,KAAK,EAAE,MAAM,WAAW,SAAS,UAAU;AAAA,QAC5D,OAAO;AACN,iBAAO,KAAK,IAAI,0BAA0B,WAAW,MAAM,iBAA8C,IAAI,CAAC;AAC9G,0BAAgB,KAAK,EAAE,MAAM,WAAW,EAAE,OAAO,KAAA,GAAQ;AAAA,QAC1D;AACA;AAAA,MACD;AAEA,UAAI,SAAS,SAASA,WAAI,aAAa,QAAQ;AAC9C,wBAAgB,KAAK,EAAE,MAAM,WAAW,EAAE,IAAI,cAAc,OAAA,GAAU;AAAA,MACvE,WAAW,SAAS,SAASA,OAAAA,IAAI,aAAa,WAAW;AACxD,YAAI;AACH,gBAAM,aAAa,cAAc,OAAO,IAAI,CAAA,OAAMC,UAAAA,gBAAA,EAAkB,KAAK,MAAM,EAAE,CAAC,CAAC;AACnF,0BAAgB,KAAK;AAAA,YACpB;AAAA,YACA,WAAW,WAAW,WAAW,IAAI,WAAW,CAAC,IAAI,EAAE,IAAI,WAAA;AAAA,UAAW,CACtE;AAAA,QACF,QAAQ;AACP,iBAAO,KAAK,IAAI,0BAA0B,WAAW,MAAM,mBAAgD,IAAI,CAAC;AAChH,0BAAgB,KAAK,EAAE,MAAM,WAAW,EAAE,OAAO,KAAA,GAAQ;AAAA,QAC1D;AAAA,MACD,OAAO;AACNC,oBAAAA,YAAoB;AAAA,MACrB;AAAA,IACD;AACA,WAAO,CAAC,QAAQ,eAAe;AAAA,EAChC;AACD;AApGC,cADY,oBACE,mBAAkB,EAAE,YAAY,uCAAA,CAAuC;AAsG/E,MAAM,qBAAqB;AAAA,EACjC,YACiB,QACA,aACf;AAFe,SAAA,SAAA;AACA,SAAA,cAAA;AAAA,EAEjB;AACD;AAEO,MAAM,0BAA0B;AAAA,EACtC,YACiB,MACA,OACA,UACf;AAHe,SAAA,OAAA;AACA,SAAA,QAAA;AACA,SAAA,WAAA;AAAA,EAEjB;AACD;AAEO,IAAK,kDAAAC,mCAAL;AACNA,iCAAA,gBAAA,IAAiB;AACjBA,iCAAA,oBAAA,IAAqB;AACrBA,iCAAA,gBAAA,IAAiB;AACjBA,iCAAA,kBAAA,IAAmB;AAJR,SAAAA;AAAA,GAAA,iCAAA,CAAA,CAAA;;;;;"}
@@ -10,7 +10,7 @@ var __defProp = Object.defineProperty;
10
10
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
11
11
  var __publicField = (obj, key, value) => __defNormalProp(obj, key + "", value);
12
12
  class MembershipResolver {
13
- resolve(acl, memberships, identity) {
13
+ resolve(acl, memberships, identity, isAssumed) {
14
14
  const errors = [];
15
15
  const parsed = [];
16
16
  const roles = acl.roles;
@@ -25,7 +25,7 @@ class MembershipResolver {
25
25
  }
26
26
  const roleVariables = getRoleVariables(membership.role, acl);
27
27
  for (const variable of membership.variables) {
28
- if (!roleVariables[variable.name] || roleVariables[variable.name].type === Acl.VariableType.predefined) {
28
+ if (!roleVariables[variable.name] || !isAssumed && roleVariables[variable.name].type === Acl.VariableType.predefined) {
29
29
  errors.push(
30
30
  new MembershipValidationError(
31
31
  membership.role,
@@ -35,7 +35,7 @@ class MembershipResolver {
35
35
  );
36
36
  }
37
37
  }
38
- const [membershipErrors, parsedVariables] = this.readMembershipVariables(roleVariables, membership, identity);
38
+ const [membershipErrors, parsedVariables] = this.readMembershipVariables(roleVariables, membership, identity, isAssumed);
39
39
  errors.push(...membershipErrors);
40
40
  parsed.push({
41
41
  role: membership.role,
@@ -44,19 +44,23 @@ class MembershipResolver {
44
44
  }
45
45
  return new MembershipReadResult(errors, parsed);
46
46
  }
47
- readMembershipVariables(roleVariables, membership, identity) {
47
+ readMembershipVariables(roleVariables, membership, identity, isAssumed) {
48
48
  const errors = [];
49
49
  const parsedVariables = [];
50
50
  for (const [name, variable] of Object.entries(roleVariables)) {
51
+ const inputVariable = membership.variables.find((it) => it.name === name);
51
52
  if (variable.type === Acl.VariableType.predefined) {
52
53
  switch (variable.value) {
53
54
  case "identityID":
54
- parsedVariables.push({ name, condition: { in: [identity.identityId] } });
55
+ parsedVariables.push({
56
+ name,
57
+ condition: { in: isAssumed && inputVariable ? inputVariable.values : [identity.identityId] }
58
+ });
55
59
  break;
56
60
  case "personID":
57
61
  parsedVariables.push({
58
62
  name,
59
- condition: { in: identity.personId ? [identity.personId] : [] }
63
+ condition: { in: isAssumed && inputVariable ? inputVariable.values : identity.personId ? [identity.personId] : [] }
60
64
  });
61
65
  break;
62
66
  default:
@@ -66,7 +70,6 @@ class MembershipResolver {
66
70
  }
67
71
  continue;
68
72
  }
69
- const inputVariable = membership.variables.find((it) => it.name === name);
70
73
  if (!inputVariable) {
71
74
  if (variable.fallback) {
72
75
  parsedVariables.push({ name, condition: variable.fallback });
@@ -1 +1 @@
1
- {"version":3,"file":"MembershipResolver.js","sources":["../../../../../packages/schema-utils/src/validation/MembershipResolver.ts"],"sourcesContent":["import { Acl, Input } from '@contember/schema'\nimport { getRoleVariables } from '../acl'\nimport { conditionSchema } from '../type-schema'\nimport { assertNever } from '../utils'\n\n\nexport class MembershipResolver {\n\tpublic static UnknownIdentity = { identityId: '00000000-0000-0000-0000-000000000000' }\n\n\tresolve(\n\t\tacl: Acl.Schema,\n\t\tmemberships: readonly Acl.Membership[],\n\t\tidentity: {\n\t\t\tidentityId: string\n\t\t\tpersonId?: string\n\t\t},\n\t): MembershipReadResult {\n\t\tconst errors: MembershipValidationError[] = []\n\t\tconst parsed: ParsedMembership[] = []\n\t\tconst roles = acl.roles\n\t\tfor (const membership of memberships) {\n\t\t\tif (!roles[membership.role]) {\n\t\t\t\terrors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.ROLE_NOT_FOUND))\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst roleVariables = getRoleVariables(membership.role, acl)\n\t\t\tfor (const variable of membership.variables) {\n\t\t\t\tif (!roleVariables[variable.name] || roleVariables[variable.name].type === Acl.VariableType.predefined) {\n\t\t\t\t\terrors.push(\n\t\t\t\t\t\tnew MembershipValidationError(\n\t\t\t\t\t\t\tmembership.role,\n\t\t\t\t\t\t\tMembershipValidationErrorType.VARIABLE_NOT_FOUND,\n\t\t\t\t\t\t\tvariable.name,\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst [membershipErrors, parsedVariables] = this.readMembershipVariables(roleVariables, membership, identity)\n\t\t\terrors.push(...membershipErrors)\n\t\t\tparsed.push({\n\t\t\t\trole: membership.role,\n\t\t\t\tvariables: parsedVariables,\n\t\t\t})\n\t\t}\n\t\treturn new MembershipReadResult(errors, parsed)\n\t}\n\n\tprivate readMembershipVariables(roleVariables: Acl.Variables, membership: Acl.Membership, identity: {\n\t\tidentityId: string\n\t\tpersonId?: string\n\t}): [MembershipValidationError[], ParsedMembershipVariable[]] {\n\t\tconst errors: MembershipValidationError[] = []\n\t\tconst parsedVariables: ParsedMembershipVariable[] = []\n\t\tfor (const [name, variable] of Object.entries(roleVariables)) {\n\t\t\tif (variable.type === Acl.VariableType.predefined) {\n\t\t\t\tswitch (variable.value) {\n\t\t\t\t\tcase 'identityID':\n\t\t\t\t\t\tparsedVariables.push({ name, condition: { in: [identity.identityId] } })\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'personID':\n\t\t\t\t\t\tparsedVariables.push({\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tcondition: { in: identity.personId ? [identity.personId] : [] },\n\t\t\t\t\t\t})\n\t\t\t\t\t\tbreak\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tparsedVariables.push({ name, condition: { never: true } })\n\t\t\t\t\t\terrors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.VARIABLE_INVALID, name))\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst inputVariable = membership.variables.find(it => it.name === name)\n\t\t\tif (!inputVariable) {\n\t\t\t\tif (variable.fallback) {\n\t\t\t\t\tparsedVariables.push({ name, condition: variable.fallback })\n\t\t\t\t} else {\n\t\t\t\t\terrors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.VARIABLE_EMPTY, name))\n\t\t\t\t\tparsedVariables.push({ name, condition: { never: true } })\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (variable.type === Acl.VariableType.entity) {\n\t\t\t\tparsedVariables.push({ name, condition: { in: inputVariable.values } }) // todo: cast to int where primary is int\n\n\t\t\t} else if (variable.type === Acl.VariableType.condition) {\n\t\t\t\ttry {\n\t\t\t\t\tconst conditions = inputVariable.values.map(it => conditionSchema()(JSON.parse(it)))\n\t\t\t\t\tparsedVariables.push({\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tcondition: conditions.length === 1 ? conditions[0] : { or: conditions },\n\t\t\t\t\t})\n\t\t\t\t} catch {\n\t\t\t\t\terrors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.VARIABLE_INVALID, name))\n\t\t\t\t\tparsedVariables.push({ name, condition: { never: true } })\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tassertNever(variable)\n\t\t\t}\n\t\t}\n\t\treturn [errors, parsedVariables]\n\t}\n}\n\nexport class MembershipReadResult {\n\tconstructor(\n\t\tpublic readonly errors: MembershipValidationError[],\n\t\tpublic readonly memberships: ParsedMembership[],\n\t) {\n\t}\n}\n\nexport class MembershipValidationError {\n\tconstructor(\n\t\tpublic readonly role: string,\n\t\tpublic readonly error: MembershipValidationErrorType,\n\t\tpublic readonly variable?: string,\n\t) {\n\t}\n}\n\nexport enum MembershipValidationErrorType {\n\tROLE_NOT_FOUND = 'roleNotFound',\n\tVARIABLE_NOT_FOUND = 'variableNotFound',\n\tVARIABLE_EMPTY = 'variableEmpty',\n\tVARIABLE_INVALID = 'variableInvalid',\n}\n\n\nexport interface ParsedMembershipVariable {\n\treadonly name: string\n\treadonly condition: Input.Condition\n}\n\nexport interface ParsedMembership {\n\treadonly role: string\n\treadonly variables: readonly ParsedMembershipVariable[]\n}\n"],"names":["MembershipValidationErrorType"],"mappings":"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"}
1
+ {"version":3,"file":"MembershipResolver.js","sources":["../../../../../packages/schema-utils/src/validation/MembershipResolver.ts"],"sourcesContent":["import { Acl, Input } from '@contember/schema'\nimport { getRoleVariables } from '../acl'\nimport { conditionSchema } from '../type-schema'\nimport { assertNever } from '../utils'\n\nexport class MembershipResolver {\n\tpublic static UnknownIdentity = { identityId: '00000000-0000-0000-0000-000000000000' }\n\n\tresolve(\n\t\tacl: Acl.Schema,\n\t\tmemberships: readonly Acl.Membership[],\n\t\tidentity: {\n\t\t\tidentityId: string\n\t\t\tpersonId?: string\n\t\t},\n\t\tisAssumed: boolean,\n\t): MembershipReadResult {\n\t\tconst errors: MembershipValidationError[] = []\n\t\tconst parsed: ParsedMembership[] = []\n\t\tconst roles = acl.roles\n\t\tfor (const membership of memberships) {\n\t\t\tif (!roles[membership.role]) {\n\t\t\t\terrors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.ROLE_NOT_FOUND))\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst roleVariables = getRoleVariables(membership.role, acl)\n\t\t\tfor (const variable of membership.variables) {\n\t\t\t\tif (!roleVariables[variable.name] || (!isAssumed && roleVariables[variable.name].type === Acl.VariableType.predefined)) {\n\t\t\t\t\terrors.push(\n\t\t\t\t\t\tnew MembershipValidationError(\n\t\t\t\t\t\t\tmembership.role,\n\t\t\t\t\t\t\tMembershipValidationErrorType.VARIABLE_NOT_FOUND,\n\t\t\t\t\t\t\tvariable.name,\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst [membershipErrors, parsedVariables] = this.readMembershipVariables(roleVariables, membership, identity, isAssumed)\n\t\t\terrors.push(...membershipErrors)\n\t\t\tparsed.push({\n\t\t\t\trole: membership.role,\n\t\t\t\tvariables: parsedVariables,\n\t\t\t})\n\t\t}\n\t\treturn new MembershipReadResult(errors, parsed)\n\t}\n\n\tprivate readMembershipVariables(roleVariables: Acl.Variables, membership: Acl.Membership, identity: {\n\t\tidentityId: string\n\t\tpersonId?: string\n\t}, isAssumed: boolean): [MembershipValidationError[], ParsedMembershipVariable[]] {\n\t\tconst errors: MembershipValidationError[] = []\n\t\tconst parsedVariables: ParsedMembershipVariable[] = []\n\t\tfor (const [name, variable] of Object.entries(roleVariables)) {\n\t\t\tconst inputVariable = membership.variables.find(it => it.name === name)\n\t\t\tif (variable.type === Acl.VariableType.predefined) {\n\t\t\t\tswitch (variable.value) {\n\t\t\t\t\tcase 'identityID':\n\t\t\t\t\t\tparsedVariables.push({\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tcondition: { in: isAssumed && inputVariable ? inputVariable.values : [identity.identityId] },\n\t\t\t\t\t\t})\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'personID':\n\t\t\t\t\t\tparsedVariables.push({\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tcondition: { in: isAssumed && inputVariable ? inputVariable.values : identity.personId ? [identity.personId] : [] },\n\t\t\t\t\t\t})\n\t\t\t\t\t\tbreak\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tparsedVariables.push({ name, condition: { never: true } })\n\t\t\t\t\t\terrors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.VARIABLE_INVALID, name))\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (!inputVariable) {\n\t\t\t\tif (variable.fallback) {\n\t\t\t\t\tparsedVariables.push({ name, condition: variable.fallback })\n\t\t\t\t} else {\n\t\t\t\t\terrors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.VARIABLE_EMPTY, name))\n\t\t\t\t\tparsedVariables.push({ name, condition: { never: true } })\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (variable.type === Acl.VariableType.entity) {\n\t\t\t\tparsedVariables.push({ name, condition: { in: inputVariable.values } }) // todo: cast to int where primary is int\n\t\t\t} else if (variable.type === Acl.VariableType.condition) {\n\t\t\t\ttry {\n\t\t\t\t\tconst conditions = inputVariable.values.map(it => conditionSchema()(JSON.parse(it)))\n\t\t\t\t\tparsedVariables.push({\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tcondition: conditions.length === 1 ? conditions[0] : { or: conditions },\n\t\t\t\t\t})\n\t\t\t\t} catch {\n\t\t\t\t\terrors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.VARIABLE_INVALID, name))\n\t\t\t\t\tparsedVariables.push({ name, condition: { never: true } })\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tassertNever(variable)\n\t\t\t}\n\t\t}\n\t\treturn [errors, parsedVariables]\n\t}\n}\n\nexport class MembershipReadResult {\n\tconstructor(\n\t\tpublic readonly errors: MembershipValidationError[],\n\t\tpublic readonly memberships: ParsedMembership[],\n\t) {\n\t}\n}\n\nexport class MembershipValidationError {\n\tconstructor(\n\t\tpublic readonly role: string,\n\t\tpublic readonly error: MembershipValidationErrorType,\n\t\tpublic readonly variable?: string,\n\t) {\n\t}\n}\n\nexport enum MembershipValidationErrorType {\n\tROLE_NOT_FOUND = 'roleNotFound',\n\tVARIABLE_NOT_FOUND = 'variableNotFound',\n\tVARIABLE_EMPTY = 'variableEmpty',\n\tVARIABLE_INVALID = 'variableInvalid',\n}\n\nexport interface ParsedMembershipVariable {\n\treadonly name: string\n\treadonly condition: Input.Condition\n}\n\nexport interface ParsedMembership {\n\treadonly role: string\n\treadonly variables: readonly ParsedMembershipVariable[]\n}\n"],"names":["MembershipValidationErrorType"],"mappings":"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"}
@@ -156,7 +156,10 @@ class ModelValidator {
156
156
  return errors2.add("MODEL_RELATION_REQUIRED", `${relationDescription} not a relation`);
157
157
  }
158
158
  if (targetField.target !== entityName) {
159
- return errors2.add("MODEL_INVALID_RELATION_DEFINITION", `${relationDescription} back reference to entity ${entityName} expected, but ${targetField.target} given`);
159
+ return errors2.add(
160
+ "MODEL_INVALID_RELATION_DEFINITION",
161
+ `${relationDescription} back reference to entity ${entityName} expected, but ${targetField.target} given`
162
+ );
160
163
  }
161
164
  if (!modelUtils.isOwningRelation(targetField)) {
162
165
  errors2.add("MODEL_INVALID_RELATION_DEFINITION", `${relationDescription} not an owning relation`);
@@ -166,7 +169,10 @@ class ModelValidator {
166
169
  return errors2.add("MODEL_INVALID_RELATION_DEFINITION", `${relationDescription} inverse relation is not set`);
167
170
  }
168
171
  if (targetField.inversedBy !== field.name) {
169
- return errors2.add("MODEL_INVALID_RELATION_DEFINITION", `${relationDescription} back reference ${entityName}::${field.name} expected, ${targetField.target}::${targetField.inversedBy} given`);
172
+ return errors2.add(
173
+ "MODEL_INVALID_RELATION_DEFINITION",
174
+ `${relationDescription} back reference ${entityName}::${field.name} expected, ${targetField.target}::${targetField.inversedBy} given`
175
+ );
170
176
  }
171
177
  if (field.type === schema.Model.RelationType.OneHasOne && targetField.type !== schema.Model.RelationType.OneHasOne) {
172
178
  return errors2.add("MODEL_INVALID_RELATION_DEFINITION", `${relationDescription} "OneHasOne" type expected, "${targetField.type}" given`);
@@ -189,7 +195,10 @@ class ModelValidator {
189
195
  return errors2.add("MODEL_RELATION_REQUIRED", `${relationDescription} not a relation`);
190
196
  }
191
197
  if (targetField.target !== entityName) {
192
- return errors2.add("MODEL_INVALID_RELATION_DEFINITION", `${relationDescription} back reference to entity ${entityName} expected, but ${targetField.target} given`);
198
+ return errors2.add(
199
+ "MODEL_INVALID_RELATION_DEFINITION",
200
+ `${relationDescription} back reference to entity ${entityName} expected, but ${targetField.target} given`
201
+ );
193
202
  }
194
203
  if (!modelUtils.isInverseRelation(targetField)) {
195
204
  return errors2.add("MODEL_INVALID_RELATION_DEFINITION", `${relationDescription} not an inverse relation`);
@@ -198,7 +207,10 @@ class ModelValidator {
198
207
  return errors2.add("MODEL_INVALID_RELATION_DEFINITION", `${relationDescription} owning relation is not set`);
199
208
  }
200
209
  if (targetField.ownedBy !== field.name) {
201
- return errors2.add("MODEL_INVALID_RELATION_DEFINITION", `${relationDescription} back reference ${entityName}::${field.name} expected, ${targetField.target}::${targetField.ownedBy} given`);
210
+ return errors2.add(
211
+ "MODEL_INVALID_RELATION_DEFINITION",
212
+ `${relationDescription} back reference ${entityName}::${field.name} expected, ${targetField.target}::${targetField.ownedBy} given`
213
+ );
202
214
  }
203
215
  if (field.type === schema.Model.RelationType.OneHasOne && targetField.type !== schema.Model.RelationType.OneHasOne) {
204
216
  return errors2.add("MODEL_INVALID_RELATION_DEFINITION", `${relationDescription} "OneHasOne" type expected, "${targetField.type}" given`);
@@ -231,7 +243,10 @@ class ModelValidator {
231
243
  if (entity.name.endsWith("Meta")) {
232
244
  const baseName = entity.name.substring(0, entity.name.length - 4);
233
245
  if (entityNames.has(baseName)) {
234
- errorBuilder.for(entity.name).add("MODEL_NAME_COLLISION", `entity ${entity.name} collides with entity ${baseName}, because a GraphQL type with "Meta" suffix is created for every entity`);
246
+ errorBuilder.for(entity.name).add(
247
+ "MODEL_NAME_COLLISION",
248
+ `entity ${entity.name} collides with entity ${baseName}, because a GraphQL type with "Meta" suffix is created for every entity`
249
+ );
235
250
  }
236
251
  }
237
252
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ModelValidator.cjs","sources":["../../../../../packages/schema-utils/src/validation/ModelValidator.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { ErrorBuilder, ValidationError } from './errors'\nimport { acceptEveryFieldVisitor, getTargetEntity, isColumn, isInverseRelation, isOwningRelation } from '../model'\n\nconst IDENTIFIER_PATTERN = /^[_a-zA-Z][_a-zA-Z0-9]*$/\nconst RESERVED_WORDS = ['and', 'or', 'not']\n\n\nexport class ModelValidator {\n\tconstructor(private readonly model: Model.Schema) { }\n\n\tpublic validate(): ValidationError[] {\n\t\tconst errorBuilder = new ErrorBuilder([], [])\n\t\tthis.validateEnums(this.model.enums, errorBuilder.for('enums'))\n\t\tthis.validateEntities(this.model.entities, errorBuilder.for('entities'))\n\n\t\treturn errorBuilder.errors\n\t}\n\n\tprivate validateEnums(enums: Model.Schema['enums'], errors: ErrorBuilder): void {\n\t\tfor (const [enumName, enumValues] of Object.entries(enums)) {\n\t\t\tfor (const value of enumValues) {\n\t\t\t\tconst valueErrors = errors.for(enumName, value)\n\t\t\t\tthis.validateIdentifier(value, valueErrors)\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateEntities(entities: Model.Schema['entities'], errors: ErrorBuilder): void {\n\t\tfor (const [entityName, entity] of Object.entries(entities)) {\n\t\t\tconst entityErrors = errors.for(entityName)\n\t\t\tif (entity.name !== entityName) {\n\t\t\t\tentityErrors.add('MODEL_NAME_MISMATCH', `Entity name \"${entity.name}\" does not match the name in a map \"${entityName}\"`)\n\t\t\t}\n\t\t\tthis.validateEntity(entity, entityErrors)\n\t\t}\n\t\tconst entitiesArr = Object.values(this.model.entities)\n\t\tthis.validateMetaSuffixCollisions(entitiesArr, errors)\n\t\tthis.validateTableNameCollisions(entitiesArr, errors)\n\t\tthis.validateAliasedTypesCollision(entitiesArr, errors)\n\t}\n\n\tprivate validateEntity(entity: Model.Entity, errors: ErrorBuilder): void {\n\t\tthis.validateIdentifier(entity.name, errors)\n\t\tthis.validateEntityName(entity.name, errors)\n\n\t\tfor (const [fieldName, field] of Object.entries(entity.fields)) {\n\t\t\tconst fieldErrors = errors.for(fieldName)\n\t\t\tthis.validateField(entity, field, fieldErrors)\n\t\t\tif (field.name !== fieldName) {\n\t\t\t\tfieldErrors.add('MODEL_NAME_MISMATCH', `Field name \"${field.name}\" does not match the name in a map \"${fieldName}\"`)\n\t\t\t}\n\t\t}\n\t\tthis.validateUniqueConstraints(\n\t\t\tentity,\n\t\t\terrors.for('unique'),\n\t\t)\n\t\tthis.validateColumnNamesCollision(entity, errors)\n\t}\n\n\tprivate validateUniqueConstraints(entity: Model.Entity, errors: ErrorBuilder): void {\n\t\tfor (const constraint of entity.unique) {\n\t\t\tif (entity.view?.materialized && !constraint.index) {\n\t\t\t\terrors.add('MODEL_INVALID_CONSTRAINT', 'For materialized views, Unique must be defined as an index. Please set index: true.')\n\t\t\t}\n\t\t\tfor (const field of constraint.fields) {\n\t\t\t\tconst fieldDef = entity.fields[field]\n\t\t\t\tif (!fieldDef) {\n\t\t\t\t\terrors.add('MODEL_UNDEFINED_FIELD', `Referenced field ${field} in a constraint does not exists`)\n\t\t\t\t} else if (isColumn(fieldDef) && fieldDef.list) {\n\t\t\t\t\terrors.add('MODEL_INVALID_FIELD', `Field ${field} in a unique constraint cannot be an array`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateColumnNamesCollision(entity: Model.Entity, errors: ErrorBuilder): void {\n\t\tconst existingColumnNames = new Map<string, string>()\n\t\tconst addColumnName = (fieldName: string, columnName: string) => {\n\t\t\tif (existingColumnNames.has(columnName)) {\n\t\t\t\tconst exitingName = existingColumnNames.get(columnName)\n\t\t\t\terrors\n\t\t\t\t\t.for(fieldName)\n\t\t\t\t\t.add('MODEL_NAME_COLLISION', `Column name \"${columnName}\" on field \"${fieldName}\" collides with a column name on field \"${exitingName}\".`)\n\t\t\t}\n\t\t\texistingColumnNames.set(columnName, fieldName)\n\t\t}\n\t\tacceptEveryFieldVisitor(this.model, entity, {\n\t\t\tvisitColumn: ({ column }) => {\n\t\t\t\taddColumnName(column.name, column.columnName)\n\t\t\t},\n\t\t\tvisitOneHasOneOwning: ({ relation }) => {\n\t\t\t\taddColumnName(relation.name, relation.joiningColumn.columnName)\n\t\t\t},\n\t\t\tvisitManyHasOne: ({ relation }) => {\n\t\t\t\taddColumnName(relation.name, relation.joiningColumn.columnName)\n\t\t\t},\n\t\t\tvisitOneHasOneInverse: () => {},\n\t\t\tvisitOneHasMany: () => {},\n\t\t\tvisitManyHasManyInverse: () => {},\n\t\t\tvisitManyHasManyOwning: () => {},\n\t\t})\n\t}\n\n\tprivate validateField(partialEntity: Model.Entity, field: Model.AnyField, errors: ErrorBuilder): void {\n\t\tthis.validateIdentifier(field.name, errors)\n\t\tif (isRelation(field)) {\n\t\t\tthis.validateRelation(partialEntity, field, errors)\n\t\t} else {\n\t\t\tif (field.sequence && field.nullable) {\n\t\t\t\terrors.add('MODEL_INVALID_COLUMN_DEFINITION', 'Column with sequence cannot be nullable.')\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateRelation(partialEntity: Model.Entity, field: Model.AnyRelation, errors: ErrorBuilder): void {\n\t\tconst entityName = partialEntity.name\n\t\tconst targetEntityName = field.target\n\t\tconst targetEntity = this.model.entities[targetEntityName] || undefined\n\t\tif (!targetEntity) {\n\t\t\treturn errors.add('MODEL_UNDEFINED_ENTITY', `Target entity ${targetEntityName} not found`)\n\t\t}\n\t\tif (((it: Model.AnyRelation): it is Model.AnyRelation & Model.OrderableRelation => 'orderBy' in it)(field)) {\n\t\t\t(field as Model.OrderableRelation).orderBy?.forEach(it => {\n\t\t\t\tlet entity = targetEntity\n\n\t\t\t\tfor (let i = 0; i < it.path.length; i++) {\n\t\t\t\t\tconst orderByField = entity.fields[it.path[i]]\n\t\t\t\t\tconst pathStr = it.path.slice(0, i + 1).join('.')\n\t\t\t\t\tif (!orderByField) {\n\t\t\t\t\t\terrors.add('MODEL_UNDEFINED_FIELD', `Invalid orderBy of ${entityName}::${field.name}: field ${pathStr} is not defined`)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif (i + 1 < it.path.length) {\n\t\t\t\t\t\tconst targetEntity = getTargetEntity(this.model, entity, orderByField.name)\n\t\t\t\t\t\tif (!targetEntity) {\n\t\t\t\t\t\t\terrors.add('MODEL_RELATION_REQUIRED', `Invalid orderBy of ${entityName}::${field.name}: field ${pathStr} is not a relation`)\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tentity = targetEntity\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t\tif (partialEntity.view) {\n\t\t\tif (field.type === Model.RelationType.ManyHasMany) {\n\t\t\t\treturn errors.add('MODEL_INVALID_VIEW_USAGE', 'Many-has-many relation is not allowed on a view entity.')\n\t\t\t}\n\t\t\tif (\n\t\t\t\t!targetEntity.view &&\n\t\t\t\tfield.type === Model.RelationType.OneHasMany\n\t\t\t) {\n\t\t\t\treturn errors.add('MODEL_INVALID_VIEW_USAGE', 'One-has-many relation fields on views must point to a view entity.')\n\t\t\t}\n\t\t\tif (\n\t\t\t\t!targetEntity.view &&\n\t\t\t\tfield.type === Model.RelationType.OneHasOne &&\n\t\t\t\t!('joiningColumn' in field)\n\t\t\t) {\n\t\t\t\treturn errors.add('MODEL_INVALID_VIEW_USAGE', 'One-has-one relation fields on views must be owning or point to a view entity.')\n\t\t\t}\n\t\t}\n\t\tif (isInverseRelation(field)) {\n\t\t\tconst ownedBy = field.ownedBy\n\t\t\tconst targetField = targetEntity.fields[ownedBy]\n\t\t\tconst relationDescription = `Target relation ${targetEntityName}::${ownedBy}:`\n\t\t\tif (!targetField) {\n\t\t\t\treturn errors.add('MODEL_UNDEFINED_FIELD', `${relationDescription} not exists`)\n\t\t\t}\n\n\t\t\tif (!isRelation(targetField)) {\n\t\t\t\treturn errors.add('MODEL_RELATION_REQUIRED', `${relationDescription} not a relation`)\n\t\t\t}\n\t\t\tif (targetField.target !== entityName) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} back reference to entity ${entityName} expected, but ${targetField.target} given`)\n\t\t\t}\n\t\t\tif (!isOwningRelation(targetField)) {\n\t\t\t\terrors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} not an owning relation`)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (!targetField.inversedBy) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} inverse relation is not set`)\n\t\t\t}\n\t\t\tif (targetField.inversedBy !== field.name) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} back reference ${entityName}::${field.name} expected, ${targetField.target}::${targetField.inversedBy} given`)\n\t\t\t}\n\t\t\tif (field.type === Model.RelationType.OneHasOne && targetField.type !== Model.RelationType.OneHasOne) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"OneHasOne\" type expected, \"${targetField.type}\" given`)\n\t\t\t}\n\t\t\tif (field.type === Model.RelationType.OneHasMany && targetField.type !== Model.RelationType.ManyHasOne) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"ManyHasOne\" type expected, \"${targetField.type}\" given`)\n\t\t\t}\n\t\t\tif (field.type === Model.RelationType.ManyHasMany && targetField.type !== Model.RelationType.ManyHasMany) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"ManyHasMany\" type expected, \"${targetField.type}\" given`)\n\t\t\t}\n\t\t} else {\n\t\t\tconst inversedBy = field.inversedBy\n\t\t\tif (inversedBy) {\n\t\t\t\tconst targetField = targetEntity.fields[inversedBy]\n\t\t\t\tconst relationDescription = `Target relation ${targetEntityName}::${inversedBy}:`\n\t\t\t\tif (!targetField) {\n\t\t\t\t\treturn errors.add('MODEL_UNDEFINED_FIELD', `${relationDescription} not exists`)\n\t\t\t\t}\n\t\t\t\tif (!isRelation(targetField)) {\n\t\t\t\t\treturn errors.add('MODEL_RELATION_REQUIRED', `${relationDescription} not a relation`)\n\t\t\t\t}\n\t\t\t\tif (targetField.target !== entityName) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} back reference to entity ${entityName} expected, but ${targetField.target} given`)\n\t\t\t\t}\n\t\t\t\tif (!isInverseRelation(targetField)) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} not an inverse relation`)\n\t\t\t\t}\n\t\t\t\tif (!targetField.ownedBy) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} owning relation is not set`)\n\t\t\t\t}\n\t\t\t\tif (targetField.ownedBy !== field.name) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} back reference ${entityName}::${field.name} expected, ${targetField.target}::${targetField.ownedBy} given`)\n\t\t\t\t}\n\t\t\t\tif (field.type === Model.RelationType.OneHasOne && targetField.type !== Model.RelationType.OneHasOne) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"OneHasOne\" type expected, \"${targetField.type}\" given`)\n\t\t\t\t}\n\t\t\t\tif (field.type === Model.RelationType.ManyHasOne && targetField.type !== Model.RelationType.OneHasMany) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"ManyHasOne\" type expected, \"${targetField.type}\" given`)\n\t\t\t\t}\n\t\t\t\tif (field.type === Model.RelationType.ManyHasMany && targetField.type !== Model.RelationType.ManyHasMany) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"ManyHasMany\" type expected, \"${targetField.type}\" given`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateIdentifier(value: string, errorBuilder: ErrorBuilder) {\n\t\tif (!value.match(IDENTIFIER_PATTERN)) {\n\t\t\treturn errorBuilder.add('MODEL_INVALID_IDENTIFIER', `${value} must match pattern ${IDENTIFIER_PATTERN.source}`)\n\t\t}\n\t\tif (RESERVED_WORDS.includes(value)) {\n\t\t\terrorBuilder.add('MODEL_INVALID_IDENTIFIER', `${value} is reserved word`)\n\t\t}\n\t}\n\n\tprivate validateEntityName(value: string, errorBuilder: ErrorBuilder) {\n\t\tif (['Query', 'Mutation'].includes(value)) {\n\t\t\terrorBuilder.add('MODEL_INVALID_ENTITY_NAME', `${value} is reserved word`)\n\t\t}\n\t}\n\n\n\tprivate validateMetaSuffixCollisions(entities: Model.Entity[], errorBuilder: ErrorBuilder) {\n\t\tconst entityNames = new Set(entities.map(it => it.name))\n\t\tfor (const entity of entities) {\n\t\t\tif (entity.name.endsWith('Meta')) {\n\t\t\t\tconst baseName = entity.name.substring(0, entity.name.length - 4)\n\t\t\t\tif (entityNames.has(baseName)) {\n\t\t\t\t\terrorBuilder.for(entity.name)\n\t\t\t\t\t\t.add('MODEL_NAME_COLLISION', `entity ${entity.name} collides with entity ${baseName}, because a GraphQL type with \"Meta\" suffix is created for every entity`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\n\tprivate validateTableNameCollisions(entities: Model.Entity[], errorBuilder: ErrorBuilder) {\n\t\tconst relationNames: Record<string, string> = {}\n\t\tfor (const entity of entities) {\n\t\t\tconst description = `table name ${entity.tableName} of entity ${entity.name}`\n\t\t\tif (relationNames[entity.tableName]) {\n\t\t\t\terrorBuilder\n\t\t\t\t\t.for(entity.name)\n\t\t\t\t\t.add('MODEL_NAME_COLLISION', `${description} collides with a ${relationNames[entity.tableName]}`)\n\t\t\t} else {\n\t\t\t\trelationNames[entity.tableName] = description\n\t\t\t}\n\t\t}\n\t\tfor (const entity of entities) {\n\t\t\tconst entityErrorBuilder = errorBuilder.for(entity.name)\n\t\t\tacceptEveryFieldVisitor(this.model, entity, {\n\t\t\t\tvisitManyHasManyOwning: ({ entity, relation }) => {\n\t\t\t\t\tconst joiningTable = relation.joiningTable\n\t\t\t\t\tconst description = `joining table name ${joiningTable.tableName} of relation ${entity.name}::${relation.name}`\n\t\t\t\t\tif (relationNames[joiningTable.tableName]) {\n\t\t\t\t\t\tentityErrorBuilder\n\t\t\t\t\t\t\t.for(relation.name)\n\t\t\t\t\t\t\t.add('MODEL_NAME_COLLISION',\n\t\t\t\t\t\t\t\t`${description} collides with a ${relationNames[joiningTable.tableName]}.` +\n\t\t\t\t\t\t\t\t'Consider using plural for a relation name or change the joining table name using .joiningTable(...) in schema definition.',\n\t\t\t\t\t\t\t)\n\t\t\t\t\t} else {\n\t\t\t\t\t\trelationNames[joiningTable.tableName] = description\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitColumn: () => {},\n\t\t\t\tvisitManyHasManyInverse: () => { },\n\t\t\t\tvisitOneHasMany: () => { },\n\t\t\t\tvisitOneHasOneInverse: () => { },\n\t\t\t\tvisitOneHasOneOwning: () => { },\n\t\t\t\tvisitManyHasOne: () => { },\n\t\t\t})\n\t\t}\n\t}\n\n\n\tprivate validateAliasedTypesCollision(entities: Model.Entity[], errorBuilder: ErrorBuilder) {\n\t\tconst aliasedTypes = new Map<string, Model.ColumnType>()\n\t\tfor (const entity of entities) {\n\t\t\tacceptEveryFieldVisitor(this.model, entity, {\n\t\t\t\tvisitColumn: ({ column }) => {\n\t\t\t\t\tif (!column.typeAlias) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif (aliasedTypes.has(column.typeAlias) && aliasedTypes.get(column.typeAlias) !== column.type) {\n\t\t\t\t\t\terrorBuilder\n\t\t\t\t\t\t\t.for(column.name)\n\t\t\t\t\t\t\t.add('MODEL_NAME_COLLISION', `Type alias ${column.typeAlias} already exists for base type ${column.type}`)\n\t\t\t\t\t}\n\t\t\t\t\taliasedTypes.set(column.typeAlias, column.type)\n\t\t\t\t},\n\t\t\t\tvisitManyHasManyOwning: () => { },\n\t\t\t\tvisitManyHasManyInverse: () => { },\n\t\t\t\tvisitOneHasMany: () => { },\n\t\t\t\tvisitOneHasOneInverse: () => { },\n\t\t\t\tvisitOneHasOneOwning: () => { },\n\t\t\t\tvisitManyHasOne: () => { },\n\t\t\t})\n\t\t}\n\t}\n}\n\nconst isRelation = (field: Model.AnyField): field is Model.AnyRelation =>\n\tObject.values(Model.RelationType).includes(field.type as Model.RelationType)\n"],"names":["ErrorBuilder","errors","isColumn","acceptEveryFieldVisitor","targetEntity","getTargetEntity","Model","isInverseRelation","isOwningRelation","entity"],"mappings":"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"}
1
+ {"version":3,"file":"ModelValidator.cjs","sources":["../../../../../packages/schema-utils/src/validation/ModelValidator.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { ErrorBuilder, ValidationError } from './errors'\nimport { acceptEveryFieldVisitor, getTargetEntity, isColumn, isInverseRelation, isOwningRelation } from '../model'\n\nconst IDENTIFIER_PATTERN = /^[_a-zA-Z][_a-zA-Z0-9]*$/\nconst RESERVED_WORDS = ['and', 'or', 'not']\n\nexport class ModelValidator {\n\tconstructor(private readonly model: Model.Schema) {}\n\n\tpublic validate(): ValidationError[] {\n\t\tconst errorBuilder = new ErrorBuilder([], [])\n\t\tthis.validateEnums(this.model.enums, errorBuilder.for('enums'))\n\t\tthis.validateEntities(this.model.entities, errorBuilder.for('entities'))\n\n\t\treturn errorBuilder.errors\n\t}\n\n\tprivate validateEnums(enums: Model.Schema['enums'], errors: ErrorBuilder): void {\n\t\tfor (const [enumName, enumValues] of Object.entries(enums)) {\n\t\t\tfor (const value of enumValues) {\n\t\t\t\tconst valueErrors = errors.for(enumName, value)\n\t\t\t\tthis.validateIdentifier(value, valueErrors)\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateEntities(entities: Model.Schema['entities'], errors: ErrorBuilder): void {\n\t\tfor (const [entityName, entity] of Object.entries(entities)) {\n\t\t\tconst entityErrors = errors.for(entityName)\n\t\t\tif (entity.name !== entityName) {\n\t\t\t\tentityErrors.add('MODEL_NAME_MISMATCH', `Entity name \"${entity.name}\" does not match the name in a map \"${entityName}\"`)\n\t\t\t}\n\t\t\tthis.validateEntity(entity, entityErrors)\n\t\t}\n\t\tconst entitiesArr = Object.values(this.model.entities)\n\t\tthis.validateMetaSuffixCollisions(entitiesArr, errors)\n\t\tthis.validateTableNameCollisions(entitiesArr, errors)\n\t\tthis.validateAliasedTypesCollision(entitiesArr, errors)\n\t}\n\n\tprivate validateEntity(entity: Model.Entity, errors: ErrorBuilder): void {\n\t\tthis.validateIdentifier(entity.name, errors)\n\t\tthis.validateEntityName(entity.name, errors)\n\n\t\tfor (const [fieldName, field] of Object.entries(entity.fields)) {\n\t\t\tconst fieldErrors = errors.for(fieldName)\n\t\t\tthis.validateField(entity, field, fieldErrors)\n\t\t\tif (field.name !== fieldName) {\n\t\t\t\tfieldErrors.add('MODEL_NAME_MISMATCH', `Field name \"${field.name}\" does not match the name in a map \"${fieldName}\"`)\n\t\t\t}\n\t\t}\n\t\tthis.validateUniqueConstraints(\n\t\t\tentity,\n\t\t\terrors.for('unique'),\n\t\t)\n\t\tthis.validateColumnNamesCollision(entity, errors)\n\t}\n\n\tprivate validateUniqueConstraints(entity: Model.Entity, errors: ErrorBuilder): void {\n\t\tfor (const constraint of entity.unique) {\n\t\t\tif (entity.view?.materialized && !constraint.index) {\n\t\t\t\terrors.add('MODEL_INVALID_CONSTRAINT', 'For materialized views, Unique must be defined as an index. Please set index: true.')\n\t\t\t}\n\t\t\tfor (const field of constraint.fields) {\n\t\t\t\tconst fieldDef = entity.fields[field]\n\t\t\t\tif (!fieldDef) {\n\t\t\t\t\terrors.add('MODEL_UNDEFINED_FIELD', `Referenced field ${field} in a constraint does not exists`)\n\t\t\t\t} else if (isColumn(fieldDef) && fieldDef.list) {\n\t\t\t\t\terrors.add('MODEL_INVALID_FIELD', `Field ${field} in a unique constraint cannot be an array`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateColumnNamesCollision(entity: Model.Entity, errors: ErrorBuilder): void {\n\t\tconst existingColumnNames = new Map<string, string>()\n\t\tconst addColumnName = (fieldName: string, columnName: string) => {\n\t\t\tif (existingColumnNames.has(columnName)) {\n\t\t\t\tconst exitingName = existingColumnNames.get(columnName)\n\t\t\t\terrors\n\t\t\t\t\t.for(fieldName)\n\t\t\t\t\t.add('MODEL_NAME_COLLISION', `Column name \"${columnName}\" on field \"${fieldName}\" collides with a column name on field \"${exitingName}\".`)\n\t\t\t}\n\t\t\texistingColumnNames.set(columnName, fieldName)\n\t\t}\n\t\tacceptEveryFieldVisitor(this.model, entity, {\n\t\t\tvisitColumn: ({ column }) => {\n\t\t\t\taddColumnName(column.name, column.columnName)\n\t\t\t},\n\t\t\tvisitOneHasOneOwning: ({ relation }) => {\n\t\t\t\taddColumnName(relation.name, relation.joiningColumn.columnName)\n\t\t\t},\n\t\t\tvisitManyHasOne: ({ relation }) => {\n\t\t\t\taddColumnName(relation.name, relation.joiningColumn.columnName)\n\t\t\t},\n\t\t\tvisitOneHasOneInverse: () => {},\n\t\t\tvisitOneHasMany: () => {},\n\t\t\tvisitManyHasManyInverse: () => {},\n\t\t\tvisitManyHasManyOwning: () => {},\n\t\t})\n\t}\n\n\tprivate validateField(partialEntity: Model.Entity, field: Model.AnyField, errors: ErrorBuilder): void {\n\t\tthis.validateIdentifier(field.name, errors)\n\t\tif (isRelation(field)) {\n\t\t\tthis.validateRelation(partialEntity, field, errors)\n\t\t} else {\n\t\t\tif (field.sequence && field.nullable) {\n\t\t\t\terrors.add('MODEL_INVALID_COLUMN_DEFINITION', 'Column with sequence cannot be nullable.')\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateRelation(partialEntity: Model.Entity, field: Model.AnyRelation, errors: ErrorBuilder): void {\n\t\tconst entityName = partialEntity.name\n\t\tconst targetEntityName = field.target\n\t\tconst targetEntity = this.model.entities[targetEntityName] || undefined\n\t\tif (!targetEntity) {\n\t\t\treturn errors.add('MODEL_UNDEFINED_ENTITY', `Target entity ${targetEntityName} not found`)\n\t\t}\n\t\tif (((it: Model.AnyRelation): it is Model.AnyRelation & Model.OrderableRelation => 'orderBy' in it)(field)) {\n\t\t\t;(field as Model.OrderableRelation).orderBy?.forEach(it => {\n\t\t\t\tlet entity = targetEntity\n\n\t\t\t\tfor (let i = 0; i < it.path.length; i++) {\n\t\t\t\t\tconst orderByField = entity.fields[it.path[i]]\n\t\t\t\t\tconst pathStr = it.path.slice(0, i + 1).join('.')\n\t\t\t\t\tif (!orderByField) {\n\t\t\t\t\t\terrors.add('MODEL_UNDEFINED_FIELD', `Invalid orderBy of ${entityName}::${field.name}: field ${pathStr} is not defined`)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif (i + 1 < it.path.length) {\n\t\t\t\t\t\tconst targetEntity = getTargetEntity(this.model, entity, orderByField.name)\n\t\t\t\t\t\tif (!targetEntity) {\n\t\t\t\t\t\t\terrors.add('MODEL_RELATION_REQUIRED', `Invalid orderBy of ${entityName}::${field.name}: field ${pathStr} is not a relation`)\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tentity = targetEntity\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t\tif (partialEntity.view) {\n\t\t\tif (field.type === Model.RelationType.ManyHasMany) {\n\t\t\t\treturn errors.add('MODEL_INVALID_VIEW_USAGE', 'Many-has-many relation is not allowed on a view entity.')\n\t\t\t}\n\t\t\tif (\n\t\t\t\t!targetEntity.view\n\t\t\t\t&& field.type === Model.RelationType.OneHasMany\n\t\t\t) {\n\t\t\t\treturn errors.add('MODEL_INVALID_VIEW_USAGE', 'One-has-many relation fields on views must point to a view entity.')\n\t\t\t}\n\t\t\tif (\n\t\t\t\t!targetEntity.view\n\t\t\t\t&& field.type === Model.RelationType.OneHasOne\n\t\t\t\t&& !('joiningColumn' in field)\n\t\t\t) {\n\t\t\t\treturn errors.add('MODEL_INVALID_VIEW_USAGE', 'One-has-one relation fields on views must be owning or point to a view entity.')\n\t\t\t}\n\t\t}\n\t\tif (isInverseRelation(field)) {\n\t\t\tconst ownedBy = field.ownedBy\n\t\t\tconst targetField = targetEntity.fields[ownedBy]\n\t\t\tconst relationDescription = `Target relation ${targetEntityName}::${ownedBy}:`\n\t\t\tif (!targetField) {\n\t\t\t\treturn errors.add('MODEL_UNDEFINED_FIELD', `${relationDescription} not exists`)\n\t\t\t}\n\n\t\t\tif (!isRelation(targetField)) {\n\t\t\t\treturn errors.add('MODEL_RELATION_REQUIRED', `${relationDescription} not a relation`)\n\t\t\t}\n\t\t\tif (targetField.target !== entityName) {\n\t\t\t\treturn errors.add(\n\t\t\t\t\t'MODEL_INVALID_RELATION_DEFINITION',\n\t\t\t\t\t`${relationDescription} back reference to entity ${entityName} expected, but ${targetField.target} given`,\n\t\t\t\t)\n\t\t\t}\n\t\t\tif (!isOwningRelation(targetField)) {\n\t\t\t\terrors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} not an owning relation`)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (!targetField.inversedBy) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} inverse relation is not set`)\n\t\t\t}\n\t\t\tif (targetField.inversedBy !== field.name) {\n\t\t\t\treturn errors.add(\n\t\t\t\t\t'MODEL_INVALID_RELATION_DEFINITION',\n\t\t\t\t\t`${relationDescription} back reference ${entityName}::${field.name} expected, ${targetField.target}::${targetField.inversedBy} given`,\n\t\t\t\t)\n\t\t\t}\n\t\t\tif (field.type === Model.RelationType.OneHasOne && targetField.type !== Model.RelationType.OneHasOne) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"OneHasOne\" type expected, \"${targetField.type}\" given`)\n\t\t\t}\n\t\t\tif (field.type === Model.RelationType.OneHasMany && targetField.type !== Model.RelationType.ManyHasOne) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"ManyHasOne\" type expected, \"${targetField.type}\" given`)\n\t\t\t}\n\t\t\tif (field.type === Model.RelationType.ManyHasMany && targetField.type !== Model.RelationType.ManyHasMany) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"ManyHasMany\" type expected, \"${targetField.type}\" given`)\n\t\t\t}\n\t\t} else {\n\t\t\tconst inversedBy = field.inversedBy\n\t\t\tif (inversedBy) {\n\t\t\t\tconst targetField = targetEntity.fields[inversedBy]\n\t\t\t\tconst relationDescription = `Target relation ${targetEntityName}::${inversedBy}:`\n\t\t\t\tif (!targetField) {\n\t\t\t\t\treturn errors.add('MODEL_UNDEFINED_FIELD', `${relationDescription} not exists`)\n\t\t\t\t}\n\t\t\t\tif (!isRelation(targetField)) {\n\t\t\t\t\treturn errors.add('MODEL_RELATION_REQUIRED', `${relationDescription} not a relation`)\n\t\t\t\t}\n\t\t\t\tif (targetField.target !== entityName) {\n\t\t\t\t\treturn errors.add(\n\t\t\t\t\t\t'MODEL_INVALID_RELATION_DEFINITION',\n\t\t\t\t\t\t`${relationDescription} back reference to entity ${entityName} expected, but ${targetField.target} given`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tif (!isInverseRelation(targetField)) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} not an inverse relation`)\n\t\t\t\t}\n\t\t\t\tif (!targetField.ownedBy) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} owning relation is not set`)\n\t\t\t\t}\n\t\t\t\tif (targetField.ownedBy !== field.name) {\n\t\t\t\t\treturn errors.add(\n\t\t\t\t\t\t'MODEL_INVALID_RELATION_DEFINITION',\n\t\t\t\t\t\t`${relationDescription} back reference ${entityName}::${field.name} expected, ${targetField.target}::${targetField.ownedBy} given`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tif (field.type === Model.RelationType.OneHasOne && targetField.type !== Model.RelationType.OneHasOne) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"OneHasOne\" type expected, \"${targetField.type}\" given`)\n\t\t\t\t}\n\t\t\t\tif (field.type === Model.RelationType.ManyHasOne && targetField.type !== Model.RelationType.OneHasMany) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"ManyHasOne\" type expected, \"${targetField.type}\" given`)\n\t\t\t\t}\n\t\t\t\tif (field.type === Model.RelationType.ManyHasMany && targetField.type !== Model.RelationType.ManyHasMany) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"ManyHasMany\" type expected, \"${targetField.type}\" given`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateIdentifier(value: string, errorBuilder: ErrorBuilder) {\n\t\tif (!value.match(IDENTIFIER_PATTERN)) {\n\t\t\treturn errorBuilder.add('MODEL_INVALID_IDENTIFIER', `${value} must match pattern ${IDENTIFIER_PATTERN.source}`)\n\t\t}\n\t\tif (RESERVED_WORDS.includes(value)) {\n\t\t\terrorBuilder.add('MODEL_INVALID_IDENTIFIER', `${value} is reserved word`)\n\t\t}\n\t}\n\n\tprivate validateEntityName(value: string, errorBuilder: ErrorBuilder) {\n\t\tif (['Query', 'Mutation'].includes(value)) {\n\t\t\terrorBuilder.add('MODEL_INVALID_ENTITY_NAME', `${value} is reserved word`)\n\t\t}\n\t}\n\n\tprivate validateMetaSuffixCollisions(entities: Model.Entity[], errorBuilder: ErrorBuilder) {\n\t\tconst entityNames = new Set(entities.map(it => it.name))\n\t\tfor (const entity of entities) {\n\t\t\tif (entity.name.endsWith('Meta')) {\n\t\t\t\tconst baseName = entity.name.substring(0, entity.name.length - 4)\n\t\t\t\tif (entityNames.has(baseName)) {\n\t\t\t\t\terrorBuilder.for(entity.name)\n\t\t\t\t\t\t.add(\n\t\t\t\t\t\t\t'MODEL_NAME_COLLISION',\n\t\t\t\t\t\t\t`entity ${entity.name} collides with entity ${baseName}, because a GraphQL type with \"Meta\" suffix is created for every entity`,\n\t\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateTableNameCollisions(entities: Model.Entity[], errorBuilder: ErrorBuilder) {\n\t\tconst relationNames: Record<string, string> = {}\n\t\tfor (const entity of entities) {\n\t\t\tconst description = `table name ${entity.tableName} of entity ${entity.name}`\n\t\t\tif (relationNames[entity.tableName]) {\n\t\t\t\terrorBuilder\n\t\t\t\t\t.for(entity.name)\n\t\t\t\t\t.add('MODEL_NAME_COLLISION', `${description} collides with a ${relationNames[entity.tableName]}`)\n\t\t\t} else {\n\t\t\t\trelationNames[entity.tableName] = description\n\t\t\t}\n\t\t}\n\t\tfor (const entity of entities) {\n\t\t\tconst entityErrorBuilder = errorBuilder.for(entity.name)\n\t\t\tacceptEveryFieldVisitor(this.model, entity, {\n\t\t\t\tvisitManyHasManyOwning: ({ entity, relation }) => {\n\t\t\t\t\tconst joiningTable = relation.joiningTable\n\t\t\t\t\tconst description = `joining table name ${joiningTable.tableName} of relation ${entity.name}::${relation.name}`\n\t\t\t\t\tif (relationNames[joiningTable.tableName]) {\n\t\t\t\t\t\tentityErrorBuilder\n\t\t\t\t\t\t\t.for(relation.name)\n\t\t\t\t\t\t\t.add(\n\t\t\t\t\t\t\t\t'MODEL_NAME_COLLISION',\n\t\t\t\t\t\t\t\t`${description} collides with a ${relationNames[joiningTable.tableName]}.`\n\t\t\t\t\t\t\t\t\t+ 'Consider using plural for a relation name or change the joining table name using .joiningTable(...) in schema definition.',\n\t\t\t\t\t\t\t)\n\t\t\t\t\t} else {\n\t\t\t\t\t\trelationNames[joiningTable.tableName] = description\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitColumn: () => {},\n\t\t\t\tvisitManyHasManyInverse: () => {},\n\t\t\t\tvisitOneHasMany: () => {},\n\t\t\t\tvisitOneHasOneInverse: () => {},\n\t\t\t\tvisitOneHasOneOwning: () => {},\n\t\t\t\tvisitManyHasOne: () => {},\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate validateAliasedTypesCollision(entities: Model.Entity[], errorBuilder: ErrorBuilder) {\n\t\tconst aliasedTypes = new Map<string, Model.ColumnType>()\n\t\tfor (const entity of entities) {\n\t\t\tacceptEveryFieldVisitor(this.model, entity, {\n\t\t\t\tvisitColumn: ({ column }) => {\n\t\t\t\t\tif (!column.typeAlias) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif (aliasedTypes.has(column.typeAlias) && aliasedTypes.get(column.typeAlias) !== column.type) {\n\t\t\t\t\t\terrorBuilder\n\t\t\t\t\t\t\t.for(column.name)\n\t\t\t\t\t\t\t.add('MODEL_NAME_COLLISION', `Type alias ${column.typeAlias} already exists for base type ${column.type}`)\n\t\t\t\t\t}\n\t\t\t\t\taliasedTypes.set(column.typeAlias, column.type)\n\t\t\t\t},\n\t\t\t\tvisitManyHasManyOwning: () => {},\n\t\t\t\tvisitManyHasManyInverse: () => {},\n\t\t\t\tvisitOneHasMany: () => {},\n\t\t\t\tvisitOneHasOneInverse: () => {},\n\t\t\t\tvisitOneHasOneOwning: () => {},\n\t\t\t\tvisitManyHasOne: () => {},\n\t\t\t})\n\t\t}\n\t}\n}\n\nconst isRelation = (field: Model.AnyField): field is Model.AnyRelation => Object.values(Model.RelationType).includes(field.type as Model.RelationType)\n"],"names":["ErrorBuilder","errors","isColumn","acceptEveryFieldVisitor","targetEntity","getTargetEntity","Model","isInverseRelation","isOwningRelation","entity"],"mappings":"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"}
@@ -154,7 +154,10 @@ class ModelValidator {
154
154
  return errors.add("MODEL_RELATION_REQUIRED", `${relationDescription} not a relation`);
155
155
  }
156
156
  if (targetField.target !== entityName) {
157
- return errors.add("MODEL_INVALID_RELATION_DEFINITION", `${relationDescription} back reference to entity ${entityName} expected, but ${targetField.target} given`);
157
+ return errors.add(
158
+ "MODEL_INVALID_RELATION_DEFINITION",
159
+ `${relationDescription} back reference to entity ${entityName} expected, but ${targetField.target} given`
160
+ );
158
161
  }
159
162
  if (!isOwningRelation(targetField)) {
160
163
  errors.add("MODEL_INVALID_RELATION_DEFINITION", `${relationDescription} not an owning relation`);
@@ -164,7 +167,10 @@ class ModelValidator {
164
167
  return errors.add("MODEL_INVALID_RELATION_DEFINITION", `${relationDescription} inverse relation is not set`);
165
168
  }
166
169
  if (targetField.inversedBy !== field.name) {
167
- return errors.add("MODEL_INVALID_RELATION_DEFINITION", `${relationDescription} back reference ${entityName}::${field.name} expected, ${targetField.target}::${targetField.inversedBy} given`);
170
+ return errors.add(
171
+ "MODEL_INVALID_RELATION_DEFINITION",
172
+ `${relationDescription} back reference ${entityName}::${field.name} expected, ${targetField.target}::${targetField.inversedBy} given`
173
+ );
168
174
  }
169
175
  if (field.type === Model.RelationType.OneHasOne && targetField.type !== Model.RelationType.OneHasOne) {
170
176
  return errors.add("MODEL_INVALID_RELATION_DEFINITION", `${relationDescription} "OneHasOne" type expected, "${targetField.type}" given`);
@@ -187,7 +193,10 @@ class ModelValidator {
187
193
  return errors.add("MODEL_RELATION_REQUIRED", `${relationDescription} not a relation`);
188
194
  }
189
195
  if (targetField.target !== entityName) {
190
- return errors.add("MODEL_INVALID_RELATION_DEFINITION", `${relationDescription} back reference to entity ${entityName} expected, but ${targetField.target} given`);
196
+ return errors.add(
197
+ "MODEL_INVALID_RELATION_DEFINITION",
198
+ `${relationDescription} back reference to entity ${entityName} expected, but ${targetField.target} given`
199
+ );
191
200
  }
192
201
  if (!isInverseRelation(targetField)) {
193
202
  return errors.add("MODEL_INVALID_RELATION_DEFINITION", `${relationDescription} not an inverse relation`);
@@ -196,7 +205,10 @@ class ModelValidator {
196
205
  return errors.add("MODEL_INVALID_RELATION_DEFINITION", `${relationDescription} owning relation is not set`);
197
206
  }
198
207
  if (targetField.ownedBy !== field.name) {
199
- return errors.add("MODEL_INVALID_RELATION_DEFINITION", `${relationDescription} back reference ${entityName}::${field.name} expected, ${targetField.target}::${targetField.ownedBy} given`);
208
+ return errors.add(
209
+ "MODEL_INVALID_RELATION_DEFINITION",
210
+ `${relationDescription} back reference ${entityName}::${field.name} expected, ${targetField.target}::${targetField.ownedBy} given`
211
+ );
200
212
  }
201
213
  if (field.type === Model.RelationType.OneHasOne && targetField.type !== Model.RelationType.OneHasOne) {
202
214
  return errors.add("MODEL_INVALID_RELATION_DEFINITION", `${relationDescription} "OneHasOne" type expected, "${targetField.type}" given`);
@@ -229,7 +241,10 @@ class ModelValidator {
229
241
  if (entity.name.endsWith("Meta")) {
230
242
  const baseName = entity.name.substring(0, entity.name.length - 4);
231
243
  if (entityNames.has(baseName)) {
232
- errorBuilder.for(entity.name).add("MODEL_NAME_COLLISION", `entity ${entity.name} collides with entity ${baseName}, because a GraphQL type with "Meta" suffix is created for every entity`);
244
+ errorBuilder.for(entity.name).add(
245
+ "MODEL_NAME_COLLISION",
246
+ `entity ${entity.name} collides with entity ${baseName}, because a GraphQL type with "Meta" suffix is created for every entity`
247
+ );
233
248
  }
234
249
  }
235
250
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ModelValidator.js","sources":["../../../../../packages/schema-utils/src/validation/ModelValidator.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { ErrorBuilder, ValidationError } from './errors'\nimport { acceptEveryFieldVisitor, getTargetEntity, isColumn, isInverseRelation, isOwningRelation } from '../model'\n\nconst IDENTIFIER_PATTERN = /^[_a-zA-Z][_a-zA-Z0-9]*$/\nconst RESERVED_WORDS = ['and', 'or', 'not']\n\n\nexport class ModelValidator {\n\tconstructor(private readonly model: Model.Schema) { }\n\n\tpublic validate(): ValidationError[] {\n\t\tconst errorBuilder = new ErrorBuilder([], [])\n\t\tthis.validateEnums(this.model.enums, errorBuilder.for('enums'))\n\t\tthis.validateEntities(this.model.entities, errorBuilder.for('entities'))\n\n\t\treturn errorBuilder.errors\n\t}\n\n\tprivate validateEnums(enums: Model.Schema['enums'], errors: ErrorBuilder): void {\n\t\tfor (const [enumName, enumValues] of Object.entries(enums)) {\n\t\t\tfor (const value of enumValues) {\n\t\t\t\tconst valueErrors = errors.for(enumName, value)\n\t\t\t\tthis.validateIdentifier(value, valueErrors)\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateEntities(entities: Model.Schema['entities'], errors: ErrorBuilder): void {\n\t\tfor (const [entityName, entity] of Object.entries(entities)) {\n\t\t\tconst entityErrors = errors.for(entityName)\n\t\t\tif (entity.name !== entityName) {\n\t\t\t\tentityErrors.add('MODEL_NAME_MISMATCH', `Entity name \"${entity.name}\" does not match the name in a map \"${entityName}\"`)\n\t\t\t}\n\t\t\tthis.validateEntity(entity, entityErrors)\n\t\t}\n\t\tconst entitiesArr = Object.values(this.model.entities)\n\t\tthis.validateMetaSuffixCollisions(entitiesArr, errors)\n\t\tthis.validateTableNameCollisions(entitiesArr, errors)\n\t\tthis.validateAliasedTypesCollision(entitiesArr, errors)\n\t}\n\n\tprivate validateEntity(entity: Model.Entity, errors: ErrorBuilder): void {\n\t\tthis.validateIdentifier(entity.name, errors)\n\t\tthis.validateEntityName(entity.name, errors)\n\n\t\tfor (const [fieldName, field] of Object.entries(entity.fields)) {\n\t\t\tconst fieldErrors = errors.for(fieldName)\n\t\t\tthis.validateField(entity, field, fieldErrors)\n\t\t\tif (field.name !== fieldName) {\n\t\t\t\tfieldErrors.add('MODEL_NAME_MISMATCH', `Field name \"${field.name}\" does not match the name in a map \"${fieldName}\"`)\n\t\t\t}\n\t\t}\n\t\tthis.validateUniqueConstraints(\n\t\t\tentity,\n\t\t\terrors.for('unique'),\n\t\t)\n\t\tthis.validateColumnNamesCollision(entity, errors)\n\t}\n\n\tprivate validateUniqueConstraints(entity: Model.Entity, errors: ErrorBuilder): void {\n\t\tfor (const constraint of entity.unique) {\n\t\t\tif (entity.view?.materialized && !constraint.index) {\n\t\t\t\terrors.add('MODEL_INVALID_CONSTRAINT', 'For materialized views, Unique must be defined as an index. Please set index: true.')\n\t\t\t}\n\t\t\tfor (const field of constraint.fields) {\n\t\t\t\tconst fieldDef = entity.fields[field]\n\t\t\t\tif (!fieldDef) {\n\t\t\t\t\terrors.add('MODEL_UNDEFINED_FIELD', `Referenced field ${field} in a constraint does not exists`)\n\t\t\t\t} else if (isColumn(fieldDef) && fieldDef.list) {\n\t\t\t\t\terrors.add('MODEL_INVALID_FIELD', `Field ${field} in a unique constraint cannot be an array`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateColumnNamesCollision(entity: Model.Entity, errors: ErrorBuilder): void {\n\t\tconst existingColumnNames = new Map<string, string>()\n\t\tconst addColumnName = (fieldName: string, columnName: string) => {\n\t\t\tif (existingColumnNames.has(columnName)) {\n\t\t\t\tconst exitingName = existingColumnNames.get(columnName)\n\t\t\t\terrors\n\t\t\t\t\t.for(fieldName)\n\t\t\t\t\t.add('MODEL_NAME_COLLISION', `Column name \"${columnName}\" on field \"${fieldName}\" collides with a column name on field \"${exitingName}\".`)\n\t\t\t}\n\t\t\texistingColumnNames.set(columnName, fieldName)\n\t\t}\n\t\tacceptEveryFieldVisitor(this.model, entity, {\n\t\t\tvisitColumn: ({ column }) => {\n\t\t\t\taddColumnName(column.name, column.columnName)\n\t\t\t},\n\t\t\tvisitOneHasOneOwning: ({ relation }) => {\n\t\t\t\taddColumnName(relation.name, relation.joiningColumn.columnName)\n\t\t\t},\n\t\t\tvisitManyHasOne: ({ relation }) => {\n\t\t\t\taddColumnName(relation.name, relation.joiningColumn.columnName)\n\t\t\t},\n\t\t\tvisitOneHasOneInverse: () => {},\n\t\t\tvisitOneHasMany: () => {},\n\t\t\tvisitManyHasManyInverse: () => {},\n\t\t\tvisitManyHasManyOwning: () => {},\n\t\t})\n\t}\n\n\tprivate validateField(partialEntity: Model.Entity, field: Model.AnyField, errors: ErrorBuilder): void {\n\t\tthis.validateIdentifier(field.name, errors)\n\t\tif (isRelation(field)) {\n\t\t\tthis.validateRelation(partialEntity, field, errors)\n\t\t} else {\n\t\t\tif (field.sequence && field.nullable) {\n\t\t\t\terrors.add('MODEL_INVALID_COLUMN_DEFINITION', 'Column with sequence cannot be nullable.')\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateRelation(partialEntity: Model.Entity, field: Model.AnyRelation, errors: ErrorBuilder): void {\n\t\tconst entityName = partialEntity.name\n\t\tconst targetEntityName = field.target\n\t\tconst targetEntity = this.model.entities[targetEntityName] || undefined\n\t\tif (!targetEntity) {\n\t\t\treturn errors.add('MODEL_UNDEFINED_ENTITY', `Target entity ${targetEntityName} not found`)\n\t\t}\n\t\tif (((it: Model.AnyRelation): it is Model.AnyRelation & Model.OrderableRelation => 'orderBy' in it)(field)) {\n\t\t\t(field as Model.OrderableRelation).orderBy?.forEach(it => {\n\t\t\t\tlet entity = targetEntity\n\n\t\t\t\tfor (let i = 0; i < it.path.length; i++) {\n\t\t\t\t\tconst orderByField = entity.fields[it.path[i]]\n\t\t\t\t\tconst pathStr = it.path.slice(0, i + 1).join('.')\n\t\t\t\t\tif (!orderByField) {\n\t\t\t\t\t\terrors.add('MODEL_UNDEFINED_FIELD', `Invalid orderBy of ${entityName}::${field.name}: field ${pathStr} is not defined`)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif (i + 1 < it.path.length) {\n\t\t\t\t\t\tconst targetEntity = getTargetEntity(this.model, entity, orderByField.name)\n\t\t\t\t\t\tif (!targetEntity) {\n\t\t\t\t\t\t\terrors.add('MODEL_RELATION_REQUIRED', `Invalid orderBy of ${entityName}::${field.name}: field ${pathStr} is not a relation`)\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tentity = targetEntity\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t\tif (partialEntity.view) {\n\t\t\tif (field.type === Model.RelationType.ManyHasMany) {\n\t\t\t\treturn errors.add('MODEL_INVALID_VIEW_USAGE', 'Many-has-many relation is not allowed on a view entity.')\n\t\t\t}\n\t\t\tif (\n\t\t\t\t!targetEntity.view &&\n\t\t\t\tfield.type === Model.RelationType.OneHasMany\n\t\t\t) {\n\t\t\t\treturn errors.add('MODEL_INVALID_VIEW_USAGE', 'One-has-many relation fields on views must point to a view entity.')\n\t\t\t}\n\t\t\tif (\n\t\t\t\t!targetEntity.view &&\n\t\t\t\tfield.type === Model.RelationType.OneHasOne &&\n\t\t\t\t!('joiningColumn' in field)\n\t\t\t) {\n\t\t\t\treturn errors.add('MODEL_INVALID_VIEW_USAGE', 'One-has-one relation fields on views must be owning or point to a view entity.')\n\t\t\t}\n\t\t}\n\t\tif (isInverseRelation(field)) {\n\t\t\tconst ownedBy = field.ownedBy\n\t\t\tconst targetField = targetEntity.fields[ownedBy]\n\t\t\tconst relationDescription = `Target relation ${targetEntityName}::${ownedBy}:`\n\t\t\tif (!targetField) {\n\t\t\t\treturn errors.add('MODEL_UNDEFINED_FIELD', `${relationDescription} not exists`)\n\t\t\t}\n\n\t\t\tif (!isRelation(targetField)) {\n\t\t\t\treturn errors.add('MODEL_RELATION_REQUIRED', `${relationDescription} not a relation`)\n\t\t\t}\n\t\t\tif (targetField.target !== entityName) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} back reference to entity ${entityName} expected, but ${targetField.target} given`)\n\t\t\t}\n\t\t\tif (!isOwningRelation(targetField)) {\n\t\t\t\terrors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} not an owning relation`)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (!targetField.inversedBy) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} inverse relation is not set`)\n\t\t\t}\n\t\t\tif (targetField.inversedBy !== field.name) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} back reference ${entityName}::${field.name} expected, ${targetField.target}::${targetField.inversedBy} given`)\n\t\t\t}\n\t\t\tif (field.type === Model.RelationType.OneHasOne && targetField.type !== Model.RelationType.OneHasOne) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"OneHasOne\" type expected, \"${targetField.type}\" given`)\n\t\t\t}\n\t\t\tif (field.type === Model.RelationType.OneHasMany && targetField.type !== Model.RelationType.ManyHasOne) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"ManyHasOne\" type expected, \"${targetField.type}\" given`)\n\t\t\t}\n\t\t\tif (field.type === Model.RelationType.ManyHasMany && targetField.type !== Model.RelationType.ManyHasMany) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"ManyHasMany\" type expected, \"${targetField.type}\" given`)\n\t\t\t}\n\t\t} else {\n\t\t\tconst inversedBy = field.inversedBy\n\t\t\tif (inversedBy) {\n\t\t\t\tconst targetField = targetEntity.fields[inversedBy]\n\t\t\t\tconst relationDescription = `Target relation ${targetEntityName}::${inversedBy}:`\n\t\t\t\tif (!targetField) {\n\t\t\t\t\treturn errors.add('MODEL_UNDEFINED_FIELD', `${relationDescription} not exists`)\n\t\t\t\t}\n\t\t\t\tif (!isRelation(targetField)) {\n\t\t\t\t\treturn errors.add('MODEL_RELATION_REQUIRED', `${relationDescription} not a relation`)\n\t\t\t\t}\n\t\t\t\tif (targetField.target !== entityName) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} back reference to entity ${entityName} expected, but ${targetField.target} given`)\n\t\t\t\t}\n\t\t\t\tif (!isInverseRelation(targetField)) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} not an inverse relation`)\n\t\t\t\t}\n\t\t\t\tif (!targetField.ownedBy) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} owning relation is not set`)\n\t\t\t\t}\n\t\t\t\tif (targetField.ownedBy !== field.name) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} back reference ${entityName}::${field.name} expected, ${targetField.target}::${targetField.ownedBy} given`)\n\t\t\t\t}\n\t\t\t\tif (field.type === Model.RelationType.OneHasOne && targetField.type !== Model.RelationType.OneHasOne) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"OneHasOne\" type expected, \"${targetField.type}\" given`)\n\t\t\t\t}\n\t\t\t\tif (field.type === Model.RelationType.ManyHasOne && targetField.type !== Model.RelationType.OneHasMany) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"ManyHasOne\" type expected, \"${targetField.type}\" given`)\n\t\t\t\t}\n\t\t\t\tif (field.type === Model.RelationType.ManyHasMany && targetField.type !== Model.RelationType.ManyHasMany) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"ManyHasMany\" type expected, \"${targetField.type}\" given`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateIdentifier(value: string, errorBuilder: ErrorBuilder) {\n\t\tif (!value.match(IDENTIFIER_PATTERN)) {\n\t\t\treturn errorBuilder.add('MODEL_INVALID_IDENTIFIER', `${value} must match pattern ${IDENTIFIER_PATTERN.source}`)\n\t\t}\n\t\tif (RESERVED_WORDS.includes(value)) {\n\t\t\terrorBuilder.add('MODEL_INVALID_IDENTIFIER', `${value} is reserved word`)\n\t\t}\n\t}\n\n\tprivate validateEntityName(value: string, errorBuilder: ErrorBuilder) {\n\t\tif (['Query', 'Mutation'].includes(value)) {\n\t\t\terrorBuilder.add('MODEL_INVALID_ENTITY_NAME', `${value} is reserved word`)\n\t\t}\n\t}\n\n\n\tprivate validateMetaSuffixCollisions(entities: Model.Entity[], errorBuilder: ErrorBuilder) {\n\t\tconst entityNames = new Set(entities.map(it => it.name))\n\t\tfor (const entity of entities) {\n\t\t\tif (entity.name.endsWith('Meta')) {\n\t\t\t\tconst baseName = entity.name.substring(0, entity.name.length - 4)\n\t\t\t\tif (entityNames.has(baseName)) {\n\t\t\t\t\terrorBuilder.for(entity.name)\n\t\t\t\t\t\t.add('MODEL_NAME_COLLISION', `entity ${entity.name} collides with entity ${baseName}, because a GraphQL type with \"Meta\" suffix is created for every entity`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\n\tprivate validateTableNameCollisions(entities: Model.Entity[], errorBuilder: ErrorBuilder) {\n\t\tconst relationNames: Record<string, string> = {}\n\t\tfor (const entity of entities) {\n\t\t\tconst description = `table name ${entity.tableName} of entity ${entity.name}`\n\t\t\tif (relationNames[entity.tableName]) {\n\t\t\t\terrorBuilder\n\t\t\t\t\t.for(entity.name)\n\t\t\t\t\t.add('MODEL_NAME_COLLISION', `${description} collides with a ${relationNames[entity.tableName]}`)\n\t\t\t} else {\n\t\t\t\trelationNames[entity.tableName] = description\n\t\t\t}\n\t\t}\n\t\tfor (const entity of entities) {\n\t\t\tconst entityErrorBuilder = errorBuilder.for(entity.name)\n\t\t\tacceptEveryFieldVisitor(this.model, entity, {\n\t\t\t\tvisitManyHasManyOwning: ({ entity, relation }) => {\n\t\t\t\t\tconst joiningTable = relation.joiningTable\n\t\t\t\t\tconst description = `joining table name ${joiningTable.tableName} of relation ${entity.name}::${relation.name}`\n\t\t\t\t\tif (relationNames[joiningTable.tableName]) {\n\t\t\t\t\t\tentityErrorBuilder\n\t\t\t\t\t\t\t.for(relation.name)\n\t\t\t\t\t\t\t.add('MODEL_NAME_COLLISION',\n\t\t\t\t\t\t\t\t`${description} collides with a ${relationNames[joiningTable.tableName]}.` +\n\t\t\t\t\t\t\t\t'Consider using plural for a relation name or change the joining table name using .joiningTable(...) in schema definition.',\n\t\t\t\t\t\t\t)\n\t\t\t\t\t} else {\n\t\t\t\t\t\trelationNames[joiningTable.tableName] = description\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitColumn: () => {},\n\t\t\t\tvisitManyHasManyInverse: () => { },\n\t\t\t\tvisitOneHasMany: () => { },\n\t\t\t\tvisitOneHasOneInverse: () => { },\n\t\t\t\tvisitOneHasOneOwning: () => { },\n\t\t\t\tvisitManyHasOne: () => { },\n\t\t\t})\n\t\t}\n\t}\n\n\n\tprivate validateAliasedTypesCollision(entities: Model.Entity[], errorBuilder: ErrorBuilder) {\n\t\tconst aliasedTypes = new Map<string, Model.ColumnType>()\n\t\tfor (const entity of entities) {\n\t\t\tacceptEveryFieldVisitor(this.model, entity, {\n\t\t\t\tvisitColumn: ({ column }) => {\n\t\t\t\t\tif (!column.typeAlias) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif (aliasedTypes.has(column.typeAlias) && aliasedTypes.get(column.typeAlias) !== column.type) {\n\t\t\t\t\t\terrorBuilder\n\t\t\t\t\t\t\t.for(column.name)\n\t\t\t\t\t\t\t.add('MODEL_NAME_COLLISION', `Type alias ${column.typeAlias} already exists for base type ${column.type}`)\n\t\t\t\t\t}\n\t\t\t\t\taliasedTypes.set(column.typeAlias, column.type)\n\t\t\t\t},\n\t\t\t\tvisitManyHasManyOwning: () => { },\n\t\t\t\tvisitManyHasManyInverse: () => { },\n\t\t\t\tvisitOneHasMany: () => { },\n\t\t\t\tvisitOneHasOneInverse: () => { },\n\t\t\t\tvisitOneHasOneOwning: () => { },\n\t\t\t\tvisitManyHasOne: () => { },\n\t\t\t})\n\t\t}\n\t}\n}\n\nconst isRelation = (field: Model.AnyField): field is Model.AnyRelation =>\n\tObject.values(Model.RelationType).includes(field.type as Model.RelationType)\n"],"names":["targetEntity","entity"],"mappings":"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"}
1
+ {"version":3,"file":"ModelValidator.js","sources":["../../../../../packages/schema-utils/src/validation/ModelValidator.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { ErrorBuilder, ValidationError } from './errors'\nimport { acceptEveryFieldVisitor, getTargetEntity, isColumn, isInverseRelation, isOwningRelation } from '../model'\n\nconst IDENTIFIER_PATTERN = /^[_a-zA-Z][_a-zA-Z0-9]*$/\nconst RESERVED_WORDS = ['and', 'or', 'not']\n\nexport class ModelValidator {\n\tconstructor(private readonly model: Model.Schema) {}\n\n\tpublic validate(): ValidationError[] {\n\t\tconst errorBuilder = new ErrorBuilder([], [])\n\t\tthis.validateEnums(this.model.enums, errorBuilder.for('enums'))\n\t\tthis.validateEntities(this.model.entities, errorBuilder.for('entities'))\n\n\t\treturn errorBuilder.errors\n\t}\n\n\tprivate validateEnums(enums: Model.Schema['enums'], errors: ErrorBuilder): void {\n\t\tfor (const [enumName, enumValues] of Object.entries(enums)) {\n\t\t\tfor (const value of enumValues) {\n\t\t\t\tconst valueErrors = errors.for(enumName, value)\n\t\t\t\tthis.validateIdentifier(value, valueErrors)\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateEntities(entities: Model.Schema['entities'], errors: ErrorBuilder): void {\n\t\tfor (const [entityName, entity] of Object.entries(entities)) {\n\t\t\tconst entityErrors = errors.for(entityName)\n\t\t\tif (entity.name !== entityName) {\n\t\t\t\tentityErrors.add('MODEL_NAME_MISMATCH', `Entity name \"${entity.name}\" does not match the name in a map \"${entityName}\"`)\n\t\t\t}\n\t\t\tthis.validateEntity(entity, entityErrors)\n\t\t}\n\t\tconst entitiesArr = Object.values(this.model.entities)\n\t\tthis.validateMetaSuffixCollisions(entitiesArr, errors)\n\t\tthis.validateTableNameCollisions(entitiesArr, errors)\n\t\tthis.validateAliasedTypesCollision(entitiesArr, errors)\n\t}\n\n\tprivate validateEntity(entity: Model.Entity, errors: ErrorBuilder): void {\n\t\tthis.validateIdentifier(entity.name, errors)\n\t\tthis.validateEntityName(entity.name, errors)\n\n\t\tfor (const [fieldName, field] of Object.entries(entity.fields)) {\n\t\t\tconst fieldErrors = errors.for(fieldName)\n\t\t\tthis.validateField(entity, field, fieldErrors)\n\t\t\tif (field.name !== fieldName) {\n\t\t\t\tfieldErrors.add('MODEL_NAME_MISMATCH', `Field name \"${field.name}\" does not match the name in a map \"${fieldName}\"`)\n\t\t\t}\n\t\t}\n\t\tthis.validateUniqueConstraints(\n\t\t\tentity,\n\t\t\terrors.for('unique'),\n\t\t)\n\t\tthis.validateColumnNamesCollision(entity, errors)\n\t}\n\n\tprivate validateUniqueConstraints(entity: Model.Entity, errors: ErrorBuilder): void {\n\t\tfor (const constraint of entity.unique) {\n\t\t\tif (entity.view?.materialized && !constraint.index) {\n\t\t\t\terrors.add('MODEL_INVALID_CONSTRAINT', 'For materialized views, Unique must be defined as an index. Please set index: true.')\n\t\t\t}\n\t\t\tfor (const field of constraint.fields) {\n\t\t\t\tconst fieldDef = entity.fields[field]\n\t\t\t\tif (!fieldDef) {\n\t\t\t\t\terrors.add('MODEL_UNDEFINED_FIELD', `Referenced field ${field} in a constraint does not exists`)\n\t\t\t\t} else if (isColumn(fieldDef) && fieldDef.list) {\n\t\t\t\t\terrors.add('MODEL_INVALID_FIELD', `Field ${field} in a unique constraint cannot be an array`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateColumnNamesCollision(entity: Model.Entity, errors: ErrorBuilder): void {\n\t\tconst existingColumnNames = new Map<string, string>()\n\t\tconst addColumnName = (fieldName: string, columnName: string) => {\n\t\t\tif (existingColumnNames.has(columnName)) {\n\t\t\t\tconst exitingName = existingColumnNames.get(columnName)\n\t\t\t\terrors\n\t\t\t\t\t.for(fieldName)\n\t\t\t\t\t.add('MODEL_NAME_COLLISION', `Column name \"${columnName}\" on field \"${fieldName}\" collides with a column name on field \"${exitingName}\".`)\n\t\t\t}\n\t\t\texistingColumnNames.set(columnName, fieldName)\n\t\t}\n\t\tacceptEveryFieldVisitor(this.model, entity, {\n\t\t\tvisitColumn: ({ column }) => {\n\t\t\t\taddColumnName(column.name, column.columnName)\n\t\t\t},\n\t\t\tvisitOneHasOneOwning: ({ relation }) => {\n\t\t\t\taddColumnName(relation.name, relation.joiningColumn.columnName)\n\t\t\t},\n\t\t\tvisitManyHasOne: ({ relation }) => {\n\t\t\t\taddColumnName(relation.name, relation.joiningColumn.columnName)\n\t\t\t},\n\t\t\tvisitOneHasOneInverse: () => {},\n\t\t\tvisitOneHasMany: () => {},\n\t\t\tvisitManyHasManyInverse: () => {},\n\t\t\tvisitManyHasManyOwning: () => {},\n\t\t})\n\t}\n\n\tprivate validateField(partialEntity: Model.Entity, field: Model.AnyField, errors: ErrorBuilder): void {\n\t\tthis.validateIdentifier(field.name, errors)\n\t\tif (isRelation(field)) {\n\t\t\tthis.validateRelation(partialEntity, field, errors)\n\t\t} else {\n\t\t\tif (field.sequence && field.nullable) {\n\t\t\t\terrors.add('MODEL_INVALID_COLUMN_DEFINITION', 'Column with sequence cannot be nullable.')\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateRelation(partialEntity: Model.Entity, field: Model.AnyRelation, errors: ErrorBuilder): void {\n\t\tconst entityName = partialEntity.name\n\t\tconst targetEntityName = field.target\n\t\tconst targetEntity = this.model.entities[targetEntityName] || undefined\n\t\tif (!targetEntity) {\n\t\t\treturn errors.add('MODEL_UNDEFINED_ENTITY', `Target entity ${targetEntityName} not found`)\n\t\t}\n\t\tif (((it: Model.AnyRelation): it is Model.AnyRelation & Model.OrderableRelation => 'orderBy' in it)(field)) {\n\t\t\t;(field as Model.OrderableRelation).orderBy?.forEach(it => {\n\t\t\t\tlet entity = targetEntity\n\n\t\t\t\tfor (let i = 0; i < it.path.length; i++) {\n\t\t\t\t\tconst orderByField = entity.fields[it.path[i]]\n\t\t\t\t\tconst pathStr = it.path.slice(0, i + 1).join('.')\n\t\t\t\t\tif (!orderByField) {\n\t\t\t\t\t\terrors.add('MODEL_UNDEFINED_FIELD', `Invalid orderBy of ${entityName}::${field.name}: field ${pathStr} is not defined`)\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif (i + 1 < it.path.length) {\n\t\t\t\t\t\tconst targetEntity = getTargetEntity(this.model, entity, orderByField.name)\n\t\t\t\t\t\tif (!targetEntity) {\n\t\t\t\t\t\t\terrors.add('MODEL_RELATION_REQUIRED', `Invalid orderBy of ${entityName}::${field.name}: field ${pathStr} is not a relation`)\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t\tentity = targetEntity\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t\tif (partialEntity.view) {\n\t\t\tif (field.type === Model.RelationType.ManyHasMany) {\n\t\t\t\treturn errors.add('MODEL_INVALID_VIEW_USAGE', 'Many-has-many relation is not allowed on a view entity.')\n\t\t\t}\n\t\t\tif (\n\t\t\t\t!targetEntity.view\n\t\t\t\t&& field.type === Model.RelationType.OneHasMany\n\t\t\t) {\n\t\t\t\treturn errors.add('MODEL_INVALID_VIEW_USAGE', 'One-has-many relation fields on views must point to a view entity.')\n\t\t\t}\n\t\t\tif (\n\t\t\t\t!targetEntity.view\n\t\t\t\t&& field.type === Model.RelationType.OneHasOne\n\t\t\t\t&& !('joiningColumn' in field)\n\t\t\t) {\n\t\t\t\treturn errors.add('MODEL_INVALID_VIEW_USAGE', 'One-has-one relation fields on views must be owning or point to a view entity.')\n\t\t\t}\n\t\t}\n\t\tif (isInverseRelation(field)) {\n\t\t\tconst ownedBy = field.ownedBy\n\t\t\tconst targetField = targetEntity.fields[ownedBy]\n\t\t\tconst relationDescription = `Target relation ${targetEntityName}::${ownedBy}:`\n\t\t\tif (!targetField) {\n\t\t\t\treturn errors.add('MODEL_UNDEFINED_FIELD', `${relationDescription} not exists`)\n\t\t\t}\n\n\t\t\tif (!isRelation(targetField)) {\n\t\t\t\treturn errors.add('MODEL_RELATION_REQUIRED', `${relationDescription} not a relation`)\n\t\t\t}\n\t\t\tif (targetField.target !== entityName) {\n\t\t\t\treturn errors.add(\n\t\t\t\t\t'MODEL_INVALID_RELATION_DEFINITION',\n\t\t\t\t\t`${relationDescription} back reference to entity ${entityName} expected, but ${targetField.target} given`,\n\t\t\t\t)\n\t\t\t}\n\t\t\tif (!isOwningRelation(targetField)) {\n\t\t\t\terrors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} not an owning relation`)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (!targetField.inversedBy) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} inverse relation is not set`)\n\t\t\t}\n\t\t\tif (targetField.inversedBy !== field.name) {\n\t\t\t\treturn errors.add(\n\t\t\t\t\t'MODEL_INVALID_RELATION_DEFINITION',\n\t\t\t\t\t`${relationDescription} back reference ${entityName}::${field.name} expected, ${targetField.target}::${targetField.inversedBy} given`,\n\t\t\t\t)\n\t\t\t}\n\t\t\tif (field.type === Model.RelationType.OneHasOne && targetField.type !== Model.RelationType.OneHasOne) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"OneHasOne\" type expected, \"${targetField.type}\" given`)\n\t\t\t}\n\t\t\tif (field.type === Model.RelationType.OneHasMany && targetField.type !== Model.RelationType.ManyHasOne) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"ManyHasOne\" type expected, \"${targetField.type}\" given`)\n\t\t\t}\n\t\t\tif (field.type === Model.RelationType.ManyHasMany && targetField.type !== Model.RelationType.ManyHasMany) {\n\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"ManyHasMany\" type expected, \"${targetField.type}\" given`)\n\t\t\t}\n\t\t} else {\n\t\t\tconst inversedBy = field.inversedBy\n\t\t\tif (inversedBy) {\n\t\t\t\tconst targetField = targetEntity.fields[inversedBy]\n\t\t\t\tconst relationDescription = `Target relation ${targetEntityName}::${inversedBy}:`\n\t\t\t\tif (!targetField) {\n\t\t\t\t\treturn errors.add('MODEL_UNDEFINED_FIELD', `${relationDescription} not exists`)\n\t\t\t\t}\n\t\t\t\tif (!isRelation(targetField)) {\n\t\t\t\t\treturn errors.add('MODEL_RELATION_REQUIRED', `${relationDescription} not a relation`)\n\t\t\t\t}\n\t\t\t\tif (targetField.target !== entityName) {\n\t\t\t\t\treturn errors.add(\n\t\t\t\t\t\t'MODEL_INVALID_RELATION_DEFINITION',\n\t\t\t\t\t\t`${relationDescription} back reference to entity ${entityName} expected, but ${targetField.target} given`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tif (!isInverseRelation(targetField)) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} not an inverse relation`)\n\t\t\t\t}\n\t\t\t\tif (!targetField.ownedBy) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} owning relation is not set`)\n\t\t\t\t}\n\t\t\t\tif (targetField.ownedBy !== field.name) {\n\t\t\t\t\treturn errors.add(\n\t\t\t\t\t\t'MODEL_INVALID_RELATION_DEFINITION',\n\t\t\t\t\t\t`${relationDescription} back reference ${entityName}::${field.name} expected, ${targetField.target}::${targetField.ownedBy} given`,\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t\tif (field.type === Model.RelationType.OneHasOne && targetField.type !== Model.RelationType.OneHasOne) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"OneHasOne\" type expected, \"${targetField.type}\" given`)\n\t\t\t\t}\n\t\t\t\tif (field.type === Model.RelationType.ManyHasOne && targetField.type !== Model.RelationType.OneHasMany) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"ManyHasOne\" type expected, \"${targetField.type}\" given`)\n\t\t\t\t}\n\t\t\t\tif (field.type === Model.RelationType.ManyHasMany && targetField.type !== Model.RelationType.ManyHasMany) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_RELATION_DEFINITION', `${relationDescription} \"ManyHasMany\" type expected, \"${targetField.type}\" given`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateIdentifier(value: string, errorBuilder: ErrorBuilder) {\n\t\tif (!value.match(IDENTIFIER_PATTERN)) {\n\t\t\treturn errorBuilder.add('MODEL_INVALID_IDENTIFIER', `${value} must match pattern ${IDENTIFIER_PATTERN.source}`)\n\t\t}\n\t\tif (RESERVED_WORDS.includes(value)) {\n\t\t\terrorBuilder.add('MODEL_INVALID_IDENTIFIER', `${value} is reserved word`)\n\t\t}\n\t}\n\n\tprivate validateEntityName(value: string, errorBuilder: ErrorBuilder) {\n\t\tif (['Query', 'Mutation'].includes(value)) {\n\t\t\terrorBuilder.add('MODEL_INVALID_ENTITY_NAME', `${value} is reserved word`)\n\t\t}\n\t}\n\n\tprivate validateMetaSuffixCollisions(entities: Model.Entity[], errorBuilder: ErrorBuilder) {\n\t\tconst entityNames = new Set(entities.map(it => it.name))\n\t\tfor (const entity of entities) {\n\t\t\tif (entity.name.endsWith('Meta')) {\n\t\t\t\tconst baseName = entity.name.substring(0, entity.name.length - 4)\n\t\t\t\tif (entityNames.has(baseName)) {\n\t\t\t\t\terrorBuilder.for(entity.name)\n\t\t\t\t\t\t.add(\n\t\t\t\t\t\t\t'MODEL_NAME_COLLISION',\n\t\t\t\t\t\t\t`entity ${entity.name} collides with entity ${baseName}, because a GraphQL type with \"Meta\" suffix is created for every entity`,\n\t\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateTableNameCollisions(entities: Model.Entity[], errorBuilder: ErrorBuilder) {\n\t\tconst relationNames: Record<string, string> = {}\n\t\tfor (const entity of entities) {\n\t\t\tconst description = `table name ${entity.tableName} of entity ${entity.name}`\n\t\t\tif (relationNames[entity.tableName]) {\n\t\t\t\terrorBuilder\n\t\t\t\t\t.for(entity.name)\n\t\t\t\t\t.add('MODEL_NAME_COLLISION', `${description} collides with a ${relationNames[entity.tableName]}`)\n\t\t\t} else {\n\t\t\t\trelationNames[entity.tableName] = description\n\t\t\t}\n\t\t}\n\t\tfor (const entity of entities) {\n\t\t\tconst entityErrorBuilder = errorBuilder.for(entity.name)\n\t\t\tacceptEveryFieldVisitor(this.model, entity, {\n\t\t\t\tvisitManyHasManyOwning: ({ entity, relation }) => {\n\t\t\t\t\tconst joiningTable = relation.joiningTable\n\t\t\t\t\tconst description = `joining table name ${joiningTable.tableName} of relation ${entity.name}::${relation.name}`\n\t\t\t\t\tif (relationNames[joiningTable.tableName]) {\n\t\t\t\t\t\tentityErrorBuilder\n\t\t\t\t\t\t\t.for(relation.name)\n\t\t\t\t\t\t\t.add(\n\t\t\t\t\t\t\t\t'MODEL_NAME_COLLISION',\n\t\t\t\t\t\t\t\t`${description} collides with a ${relationNames[joiningTable.tableName]}.`\n\t\t\t\t\t\t\t\t\t+ 'Consider using plural for a relation name or change the joining table name using .joiningTable(...) in schema definition.',\n\t\t\t\t\t\t\t)\n\t\t\t\t\t} else {\n\t\t\t\t\t\trelationNames[joiningTable.tableName] = description\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitColumn: () => {},\n\t\t\t\tvisitManyHasManyInverse: () => {},\n\t\t\t\tvisitOneHasMany: () => {},\n\t\t\t\tvisitOneHasOneInverse: () => {},\n\t\t\t\tvisitOneHasOneOwning: () => {},\n\t\t\t\tvisitManyHasOne: () => {},\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate validateAliasedTypesCollision(entities: Model.Entity[], errorBuilder: ErrorBuilder) {\n\t\tconst aliasedTypes = new Map<string, Model.ColumnType>()\n\t\tfor (const entity of entities) {\n\t\t\tacceptEveryFieldVisitor(this.model, entity, {\n\t\t\t\tvisitColumn: ({ column }) => {\n\t\t\t\t\tif (!column.typeAlias) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tif (aliasedTypes.has(column.typeAlias) && aliasedTypes.get(column.typeAlias) !== column.type) {\n\t\t\t\t\t\terrorBuilder\n\t\t\t\t\t\t\t.for(column.name)\n\t\t\t\t\t\t\t.add('MODEL_NAME_COLLISION', `Type alias ${column.typeAlias} already exists for base type ${column.type}`)\n\t\t\t\t\t}\n\t\t\t\t\taliasedTypes.set(column.typeAlias, column.type)\n\t\t\t\t},\n\t\t\t\tvisitManyHasManyOwning: () => {},\n\t\t\t\tvisitManyHasManyInverse: () => {},\n\t\t\t\tvisitOneHasMany: () => {},\n\t\t\t\tvisitOneHasOneInverse: () => {},\n\t\t\t\tvisitOneHasOneOwning: () => {},\n\t\t\t\tvisitManyHasOne: () => {},\n\t\t\t})\n\t\t}\n\t}\n}\n\nconst isRelation = (field: Model.AnyField): field is Model.AnyRelation => Object.values(Model.RelationType).includes(field.type as Model.RelationType)\n"],"names":["targetEntity","entity"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"SchemaValidator.cjs","sources":["../../../../../packages/schema-utils/src/validation/SchemaValidator.ts"],"sourcesContent":["import { Schema } from '@contember/schema'\nimport { ValidationError, ValidationErrorCode } from './errors'\nimport { AclValidator } from './AclValidator'\nimport { ModelValidator } from './ModelValidator'\nimport { ValidationValidator } from './ValidationValidator'\nimport { ActionsValidator } from './ActionsValidator'\n\nexport interface SchemaValidatorSkippedErrors {\n\treadonly code: ValidationErrorCode\n\treadonly skipUntil?: string\n\treadonly path?: string\n}\n\nexport class SchemaValidator {\n\tpublic static validate(schema: Schema, skippedErrors: SchemaValidatorSkippedErrors[] = []): ValidationError[] {\n\t\tconst modelValidator = new ModelValidator(schema.model)\n\t\tconst modelErrors = modelValidator.validate()\n\n\t\tconst aclValidator = new AclValidator(schema.model)\n\t\tconst aclErrors = aclValidator.validate(schema.acl)\n\n\n\t\tconst validationValidator = new ValidationValidator(schema.model)\n\t\tconst validationErrors = validationValidator.validate(schema.validation)\n\n\t\tconst actionsValidator = new ActionsValidator(schema.model)\n\t\tconst actionsErrors = actionsValidator.validate(schema.actions)\n\n\t\tconst allErrors = [...aclErrors, ...modelErrors, ...validationErrors, ...actionsErrors]\n\t\tif (skippedErrors.length === 0) {\n\t\t\treturn allErrors\n\t\t}\n\t\treturn allErrors.filter(\n\t\t\terr => !skippedErrors.some(\n\t\t\t\trule => err.code === rule.code\n\t\t\t\t\t&& (!rule.path || err.path.join('.') === rule.path),\n\t\t\t),\n\t\t)\n\t}\n}\n"],"names":["ModelValidator","AclValidator","ValidationValidator","ActionsValidator"],"mappings":";;;;;;AAaO,MAAM,gBAAgB;AAAA,EAC5B,OAAc,SAAS,QAAgB,gBAAgD,IAAuB;AAC7G,UAAM,iBAAiB,IAAIA,8BAAe,OAAO,KAAK;AAChD,UAAA,cAAc,eAAe,SAAS;AAE5C,UAAM,eAAe,IAAIC,0BAAa,OAAO,KAAK;AAClD,UAAM,YAAY,aAAa,SAAS,OAAO,GAAG;AAGlD,UAAM,sBAAsB,IAAIC,wCAAoB,OAAO,KAAK;AAChE,UAAM,mBAAmB,oBAAoB,SAAS,OAAO,UAAU;AAEvE,UAAM,mBAAmB,IAAIC,kCAAiB,OAAO,KAAK;AAC1D,UAAM,gBAAiB,iBAAiB,SAAS,OAAO,OAAO;AAEzD,UAAA,YAAY,CAAC,GAAG,WAAW,GAAG,aAAa,GAAG,kBAAkB,GAAG,aAAa;AAClF,QAAA,cAAc,WAAW,GAAG;AACxB,aAAA;AAAA,IAAA;AAER,WAAO,UAAU;AAAA,MAChB,CAAA,QAAO,CAAC,cAAc;AAAA,QACrB,CAAQ,SAAA,IAAI,SAAS,KAAK,SACrB,CAAC,KAAK,QAAQ,IAAI,KAAK,KAAK,GAAG,MAAM,KAAK;AAAA,MAAA;AAAA,IAEjD;AAAA,EAAA;AAEF;;"}
1
+ {"version":3,"file":"SchemaValidator.cjs","sources":["../../../../../packages/schema-utils/src/validation/SchemaValidator.ts"],"sourcesContent":["import { Schema } from '@contember/schema'\nimport { ValidationError, ValidationErrorCode } from './errors'\nimport { AclValidator } from './AclValidator'\nimport { ModelValidator } from './ModelValidator'\nimport { ValidationValidator } from './ValidationValidator'\nimport { ActionsValidator } from './ActionsValidator'\n\nexport interface SchemaValidatorSkippedErrors {\n\treadonly code: ValidationErrorCode\n\treadonly skipUntil?: string\n\treadonly path?: string\n}\n\nexport class SchemaValidator {\n\tpublic static validate(schema: Schema, skippedErrors: SchemaValidatorSkippedErrors[] = []): ValidationError[] {\n\t\tconst modelValidator = new ModelValidator(schema.model)\n\t\tconst modelErrors = modelValidator.validate()\n\n\t\tconst aclValidator = new AclValidator(schema.model)\n\t\tconst aclErrors = aclValidator.validate(schema.acl)\n\n\t\tconst validationValidator = new ValidationValidator(schema.model)\n\t\tconst validationErrors = validationValidator.validate(schema.validation)\n\n\t\tconst actionsValidator = new ActionsValidator(schema.model)\n\t\tconst actionsErrors = actionsValidator.validate(schema.actions)\n\n\t\tconst allErrors = [...aclErrors, ...modelErrors, ...validationErrors, ...actionsErrors]\n\t\tif (skippedErrors.length === 0) {\n\t\t\treturn allErrors\n\t\t}\n\t\treturn allErrors.filter(\n\t\t\terr =>\n\t\t\t\t!skippedErrors.some(\n\t\t\t\t\trule =>\n\t\t\t\t\t\terr.code === rule.code\n\t\t\t\t\t\t&& (!rule.path || err.path.join('.') === rule.path),\n\t\t\t\t),\n\t\t)\n\t}\n}\n"],"names":["ModelValidator","AclValidator","ValidationValidator","ActionsValidator"],"mappings":";;;;;;AAaO,MAAM,gBAAgB;AAAA,EAC5B,OAAc,SAAS,QAAgB,gBAAgD,IAAuB;AAC7G,UAAM,iBAAiB,IAAIA,8BAAe,OAAO,KAAK;AACtD,UAAM,cAAc,eAAe,SAAA;AAEnC,UAAM,eAAe,IAAIC,0BAAa,OAAO,KAAK;AAClD,UAAM,YAAY,aAAa,SAAS,OAAO,GAAG;AAElD,UAAM,sBAAsB,IAAIC,wCAAoB,OAAO,KAAK;AAChE,UAAM,mBAAmB,oBAAoB,SAAS,OAAO,UAAU;AAEvE,UAAM,mBAAmB,IAAIC,kCAAiB,OAAO,KAAK;AAC1D,UAAM,gBAAgB,iBAAiB,SAAS,OAAO,OAAO;AAE9D,UAAM,YAAY,CAAC,GAAG,WAAW,GAAG,aAAa,GAAG,kBAAkB,GAAG,aAAa;AACtF,QAAI,cAAc,WAAW,GAAG;AAC/B,aAAO;AAAA,IACR;AACA,WAAO,UAAU;AAAA,MAChB,CAAA,QACC,CAAC,cAAc;AAAA,QACd,CAAA,SACC,IAAI,SAAS,KAAK,SACd,CAAC,KAAK,QAAQ,IAAI,KAAK,KAAK,GAAG,MAAM,KAAK;AAAA,MAAA;AAAA,IAChD;AAAA,EAEH;AACD;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"SchemaValidator.js","sources":["../../../../../packages/schema-utils/src/validation/SchemaValidator.ts"],"sourcesContent":["import { Schema } from '@contember/schema'\nimport { ValidationError, ValidationErrorCode } from './errors'\nimport { AclValidator } from './AclValidator'\nimport { ModelValidator } from './ModelValidator'\nimport { ValidationValidator } from './ValidationValidator'\nimport { ActionsValidator } from './ActionsValidator'\n\nexport interface SchemaValidatorSkippedErrors {\n\treadonly code: ValidationErrorCode\n\treadonly skipUntil?: string\n\treadonly path?: string\n}\n\nexport class SchemaValidator {\n\tpublic static validate(schema: Schema, skippedErrors: SchemaValidatorSkippedErrors[] = []): ValidationError[] {\n\t\tconst modelValidator = new ModelValidator(schema.model)\n\t\tconst modelErrors = modelValidator.validate()\n\n\t\tconst aclValidator = new AclValidator(schema.model)\n\t\tconst aclErrors = aclValidator.validate(schema.acl)\n\n\n\t\tconst validationValidator = new ValidationValidator(schema.model)\n\t\tconst validationErrors = validationValidator.validate(schema.validation)\n\n\t\tconst actionsValidator = new ActionsValidator(schema.model)\n\t\tconst actionsErrors = actionsValidator.validate(schema.actions)\n\n\t\tconst allErrors = [...aclErrors, ...modelErrors, ...validationErrors, ...actionsErrors]\n\t\tif (skippedErrors.length === 0) {\n\t\t\treturn allErrors\n\t\t}\n\t\treturn allErrors.filter(\n\t\t\terr => !skippedErrors.some(\n\t\t\t\trule => err.code === rule.code\n\t\t\t\t\t&& (!rule.path || err.path.join('.') === rule.path),\n\t\t\t),\n\t\t)\n\t}\n}\n"],"names":[],"mappings":";;;;AAaO,MAAM,gBAAgB;AAAA,EAC5B,OAAc,SAAS,QAAgB,gBAAgD,IAAuB;AAC7G,UAAM,iBAAiB,IAAI,eAAe,OAAO,KAAK;AAChD,UAAA,cAAc,eAAe,SAAS;AAE5C,UAAM,eAAe,IAAI,aAAa,OAAO,KAAK;AAClD,UAAM,YAAY,aAAa,SAAS,OAAO,GAAG;AAGlD,UAAM,sBAAsB,IAAI,oBAAoB,OAAO,KAAK;AAChE,UAAM,mBAAmB,oBAAoB,SAAS,OAAO,UAAU;AAEvE,UAAM,mBAAmB,IAAI,iBAAiB,OAAO,KAAK;AAC1D,UAAM,gBAAiB,iBAAiB,SAAS,OAAO,OAAO;AAEzD,UAAA,YAAY,CAAC,GAAG,WAAW,GAAG,aAAa,GAAG,kBAAkB,GAAG,aAAa;AAClF,QAAA,cAAc,WAAW,GAAG;AACxB,aAAA;AAAA,IAAA;AAER,WAAO,UAAU;AAAA,MAChB,CAAA,QAAO,CAAC,cAAc;AAAA,QACrB,CAAQ,SAAA,IAAI,SAAS,KAAK,SACrB,CAAC,KAAK,QAAQ,IAAI,KAAK,KAAK,GAAG,MAAM,KAAK;AAAA,MAAA;AAAA,IAEjD;AAAA,EAAA;AAEF;"}
1
+ {"version":3,"file":"SchemaValidator.js","sources":["../../../../../packages/schema-utils/src/validation/SchemaValidator.ts"],"sourcesContent":["import { Schema } from '@contember/schema'\nimport { ValidationError, ValidationErrorCode } from './errors'\nimport { AclValidator } from './AclValidator'\nimport { ModelValidator } from './ModelValidator'\nimport { ValidationValidator } from './ValidationValidator'\nimport { ActionsValidator } from './ActionsValidator'\n\nexport interface SchemaValidatorSkippedErrors {\n\treadonly code: ValidationErrorCode\n\treadonly skipUntil?: string\n\treadonly path?: string\n}\n\nexport class SchemaValidator {\n\tpublic static validate(schema: Schema, skippedErrors: SchemaValidatorSkippedErrors[] = []): ValidationError[] {\n\t\tconst modelValidator = new ModelValidator(schema.model)\n\t\tconst modelErrors = modelValidator.validate()\n\n\t\tconst aclValidator = new AclValidator(schema.model)\n\t\tconst aclErrors = aclValidator.validate(schema.acl)\n\n\t\tconst validationValidator = new ValidationValidator(schema.model)\n\t\tconst validationErrors = validationValidator.validate(schema.validation)\n\n\t\tconst actionsValidator = new ActionsValidator(schema.model)\n\t\tconst actionsErrors = actionsValidator.validate(schema.actions)\n\n\t\tconst allErrors = [...aclErrors, ...modelErrors, ...validationErrors, ...actionsErrors]\n\t\tif (skippedErrors.length === 0) {\n\t\t\treturn allErrors\n\t\t}\n\t\treturn allErrors.filter(\n\t\t\terr =>\n\t\t\t\t!skippedErrors.some(\n\t\t\t\t\trule =>\n\t\t\t\t\t\terr.code === rule.code\n\t\t\t\t\t\t&& (!rule.path || err.path.join('.') === rule.path),\n\t\t\t\t),\n\t\t)\n\t}\n}\n"],"names":[],"mappings":";;;;AAaO,MAAM,gBAAgB;AAAA,EAC5B,OAAc,SAAS,QAAgB,gBAAgD,IAAuB;AAC7G,UAAM,iBAAiB,IAAI,eAAe,OAAO,KAAK;AACtD,UAAM,cAAc,eAAe,SAAA;AAEnC,UAAM,eAAe,IAAI,aAAa,OAAO,KAAK;AAClD,UAAM,YAAY,aAAa,SAAS,OAAO,GAAG;AAElD,UAAM,sBAAsB,IAAI,oBAAoB,OAAO,KAAK;AAChE,UAAM,mBAAmB,oBAAoB,SAAS,OAAO,UAAU;AAEvE,UAAM,mBAAmB,IAAI,iBAAiB,OAAO,KAAK;AAC1D,UAAM,gBAAgB,iBAAiB,SAAS,OAAO,OAAO;AAE9D,UAAM,YAAY,CAAC,GAAG,WAAW,GAAG,aAAa,GAAG,kBAAkB,GAAG,aAAa;AACtF,QAAI,cAAc,WAAW,GAAG;AAC/B,aAAO;AAAA,IACR;AACA,WAAO,UAAU;AAAA,MAChB,CAAA,QACC,CAAC,cAAc;AAAA,QACd,CAAA,SACC,IAAI,SAAS,KAAK,SACd,CAAC,KAAK,QAAQ,IAAI,KAAK,KAAK,GAAG,MAAM,KAAK;AAAA,MAAA;AAAA,IAChD;AAAA,EAEH;AACD;"}