@contember/schema-utils 2.1.0-alpha.37 → 2.1.0-alpha.39

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 (399) hide show
  1. package/dist/development/index.cjs +110 -0
  2. package/dist/development/index.cjs.map +1 -0
  3. package/dist/development/index.js +94 -0
  4. package/dist/development/index.js.map +1 -0
  5. package/dist/development/src/acl/AllowAllPermissionFactory.cjs +42 -0
  6. package/dist/development/src/acl/AllowAllPermissionFactory.cjs.map +1 -0
  7. package/dist/development/src/acl/AllowAllPermissionFactory.js +42 -0
  8. package/dist/development/src/acl/AllowAllPermissionFactory.js.map +1 -0
  9. package/dist/development/src/acl/PredicateDefinitionProcessor.cjs +69 -0
  10. package/dist/development/src/acl/PredicateDefinitionProcessor.cjs.map +1 -0
  11. package/dist/development/src/acl/PredicateDefinitionProcessor.js +69 -0
  12. package/dist/development/src/acl/PredicateDefinitionProcessor.js.map +1 -0
  13. package/dist/development/src/acl/schemaUtils.cjs +11 -0
  14. package/dist/development/src/acl/schemaUtils.cjs.map +1 -0
  15. package/dist/development/src/acl/schemaUtils.js +11 -0
  16. package/dist/development/src/acl/schemaUtils.js.map +1 -0
  17. package/dist/development/src/dataUtils.cjs +59 -0
  18. package/dist/development/src/dataUtils.cjs.map +1 -0
  19. package/dist/development/src/dataUtils.js +59 -0
  20. package/dist/development/src/dataUtils.js.map +1 -0
  21. package/dist/development/src/definition-generator/AclDefinitionCodeGenerator.cjs +118 -0
  22. package/dist/development/src/definition-generator/AclDefinitionCodeGenerator.cjs.map +1 -0
  23. package/dist/development/src/definition-generator/AclDefinitionCodeGenerator.js +118 -0
  24. package/dist/development/src/definition-generator/AclDefinitionCodeGenerator.js.map +1 -0
  25. package/dist/development/src/definition-generator/DefinitionCodeGenerator.cjs +218 -0
  26. package/dist/development/src/definition-generator/DefinitionCodeGenerator.cjs.map +1 -0
  27. package/dist/development/src/definition-generator/DefinitionCodeGenerator.js +218 -0
  28. package/dist/development/src/definition-generator/DefinitionCodeGenerator.js.map +1 -0
  29. package/dist/development/src/definition-generator/DefinitionNamingConventions.cjs +68 -0
  30. package/dist/development/src/definition-generator/DefinitionNamingConventions.cjs.map +1 -0
  31. package/dist/development/src/definition-generator/DefinitionNamingConventions.js +68 -0
  32. package/dist/development/src/definition-generator/DefinitionNamingConventions.js.map +1 -0
  33. package/dist/development/src/definition-generator/TsDefinitionGenerator.cjs +17 -0
  34. package/dist/development/src/definition-generator/TsDefinitionGenerator.cjs.map +1 -0
  35. package/dist/development/src/definition-generator/TsDefinitionGenerator.js +17 -0
  36. package/dist/development/src/definition-generator/TsDefinitionGenerator.js.map +1 -0
  37. package/dist/development/src/lax/LaxSchemaConverter.cjs +202 -0
  38. package/dist/development/src/lax/LaxSchemaConverter.cjs.map +1 -0
  39. package/dist/development/src/lax/LaxSchemaConverter.js +202 -0
  40. package/dist/development/src/lax/LaxSchemaConverter.js.map +1 -0
  41. package/dist/development/src/lax/schema.cjs +70 -0
  42. package/dist/development/src/lax/schema.cjs.map +1 -0
  43. package/dist/development/src/lax/schema.js +53 -0
  44. package/dist/development/src/lax/schema.js.map +1 -0
  45. package/dist/development/src/model/NamingConventions.cjs +28 -0
  46. package/dist/development/src/model/NamingConventions.cjs.map +1 -0
  47. package/dist/development/src/model/NamingConventions.js +28 -0
  48. package/dist/development/src/model/NamingConventions.js.map +1 -0
  49. package/dist/development/src/model/modelUtils.cjs +229 -0
  50. package/dist/development/src/model/modelUtils.cjs.map +1 -0
  51. package/dist/development/src/model/modelUtils.js +229 -0
  52. package/dist/development/src/model/modelUtils.js.map +1 -0
  53. package/dist/development/src/model/resolveDefaultColumnType.cjs +30 -0
  54. package/dist/development/src/model/resolveDefaultColumnType.cjs.map +1 -0
  55. package/dist/development/src/model/resolveDefaultColumnType.js +30 -0
  56. package/dist/development/src/model/resolveDefaultColumnType.js.map +1 -0
  57. package/dist/development/src/schemaChecksum.cjs +9 -0
  58. package/dist/development/src/schemaChecksum.cjs.map +1 -0
  59. package/dist/development/src/schemaChecksum.js +9 -0
  60. package/dist/development/src/schemaChecksum.js.map +1 -0
  61. package/dist/development/src/schemaFilter.cjs +24 -0
  62. package/dist/development/src/schemaFilter.cjs.map +1 -0
  63. package/dist/development/src/schemaFilter.js +24 -0
  64. package/dist/development/src/schemaFilter.js.map +1 -0
  65. package/dist/development/src/schemaNormalizer.cjs +72 -0
  66. package/dist/development/src/schemaNormalizer.cjs.map +1 -0
  67. package/dist/development/src/schemaNormalizer.js +72 -0
  68. package/dist/development/src/schemaNormalizer.js.map +1 -0
  69. package/dist/development/src/type-schema/acl.cjs +149 -0
  70. package/dist/development/src/type-schema/acl.cjs.map +1 -0
  71. package/dist/development/src/type-schema/acl.js +132 -0
  72. package/dist/development/src/type-schema/acl.js.map +1 -0
  73. package/dist/development/src/type-schema/actions.cjs +88 -0
  74. package/dist/development/src/type-schema/actions.cjs.map +1 -0
  75. package/dist/development/src/type-schema/actions.js +71 -0
  76. package/dist/development/src/type-schema/actions.js.map +1 -0
  77. package/dist/development/src/type-schema/condition.cjs +92 -0
  78. package/dist/development/src/type-schema/condition.cjs.map +1 -0
  79. package/dist/development/src/type-schema/condition.js +75 -0
  80. package/dist/development/src/type-schema/condition.js.map +1 -0
  81. package/dist/development/src/type-schema/model.cjs +222 -0
  82. package/dist/development/src/type-schema/model.cjs.map +1 -0
  83. package/dist/development/src/type-schema/model.js +206 -0
  84. package/dist/development/src/type-schema/model.js.map +1 -0
  85. package/dist/development/src/type-schema/settings.cjs +34 -0
  86. package/dist/development/src/type-schema/settings.cjs.map +1 -0
  87. package/dist/development/src/type-schema/settings.js +17 -0
  88. package/dist/development/src/type-schema/settings.js.map +1 -0
  89. package/dist/development/src/type-schema/validation.cjs +115 -0
  90. package/dist/development/src/type-schema/validation.cjs.map +1 -0
  91. package/dist/development/src/type-schema/validation.js +98 -0
  92. package/dist/development/src/type-schema/validation.js.map +1 -0
  93. package/dist/development/src/type-schema/where.cjs +46 -0
  94. package/dist/development/src/type-schema/where.cjs.map +1 -0
  95. package/dist/development/src/type-schema/where.js +29 -0
  96. package/dist/development/src/type-schema/where.js.map +1 -0
  97. package/dist/development/src/utils/assertNever.cjs +7 -0
  98. package/dist/development/src/utils/assertNever.cjs.map +1 -0
  99. package/dist/development/src/utils/assertNever.js +7 -0
  100. package/dist/development/src/utils/assertNever.js.map +1 -0
  101. package/dist/development/src/utils/deepCompare.cjs +134 -0
  102. package/dist/development/src/utils/deepCompare.cjs.map +1 -0
  103. package/dist/development/src/utils/deepCompare.js +134 -0
  104. package/dist/development/src/utils/deepCompare.js.map +1 -0
  105. package/dist/development/src/utils/isIt.cjs +7 -0
  106. package/dist/development/src/utils/isIt.cjs.map +1 -0
  107. package/dist/development/src/utils/isIt.js +7 -0
  108. package/dist/development/src/utils/isIt.js.map +1 -0
  109. package/dist/development/src/utils/printJsValue.cjs +42 -0
  110. package/dist/development/src/utils/printJsValue.cjs.map +1 -0
  111. package/dist/development/src/utils/printJsValue.js +42 -0
  112. package/dist/development/src/utils/printJsValue.js.map +1 -0
  113. package/dist/development/src/validation/AclValidator.cjs +168 -0
  114. package/dist/development/src/validation/AclValidator.cjs.map +1 -0
  115. package/dist/development/src/validation/AclValidator.js +168 -0
  116. package/dist/development/src/validation/AclValidator.js.map +1 -0
  117. package/dist/development/src/validation/ActionsValidator.cjs +127 -0
  118. package/dist/development/src/validation/ActionsValidator.cjs.map +1 -0
  119. package/dist/development/src/validation/ActionsValidator.js +110 -0
  120. package/dist/development/src/validation/ActionsValidator.js.map +1 -0
  121. package/dist/development/src/validation/MembershipResolver.cjs +129 -0
  122. package/dist/development/src/validation/MembershipResolver.cjs.map +1 -0
  123. package/dist/development/src/validation/MembershipResolver.js +129 -0
  124. package/dist/development/src/validation/MembershipResolver.js.map +1 -0
  125. package/dist/development/src/validation/ModelValidator.cjs +325 -0
  126. package/dist/development/src/validation/ModelValidator.cjs.map +1 -0
  127. package/dist/development/src/validation/ModelValidator.js +325 -0
  128. package/dist/development/src/validation/ModelValidator.js.map +1 -0
  129. package/dist/development/src/validation/SchemaValidator.cjs +29 -0
  130. package/dist/development/src/validation/SchemaValidator.cjs.map +1 -0
  131. package/dist/development/src/validation/SchemaValidator.js +29 -0
  132. package/dist/development/src/validation/SchemaValidator.js.map +1 -0
  133. package/dist/development/src/validation/ValidationValidator.cjs +121 -0
  134. package/dist/development/src/validation/ValidationValidator.cjs.map +1 -0
  135. package/dist/development/src/validation/ValidationValidator.js +121 -0
  136. package/dist/development/src/validation/ValidationValidator.js.map +1 -0
  137. package/dist/development/src/validation/errors.cjs +16 -0
  138. package/dist/development/src/validation/errors.cjs.map +1 -0
  139. package/dist/development/src/validation/errors.js +16 -0
  140. package/dist/development/src/validation/errors.js.map +1 -0
  141. package/dist/production/index.cjs +110 -0
  142. package/dist/production/index.cjs.map +1 -0
  143. package/dist/production/index.js +94 -0
  144. package/dist/production/index.js.map +1 -0
  145. package/dist/production/src/acl/AllowAllPermissionFactory.cjs +42 -0
  146. package/dist/production/src/acl/AllowAllPermissionFactory.cjs.map +1 -0
  147. package/dist/production/src/acl/AllowAllPermissionFactory.js +42 -0
  148. package/dist/production/src/acl/AllowAllPermissionFactory.js.map +1 -0
  149. package/dist/production/src/acl/PredicateDefinitionProcessor.cjs +69 -0
  150. package/dist/production/src/acl/PredicateDefinitionProcessor.cjs.map +1 -0
  151. package/dist/production/src/acl/PredicateDefinitionProcessor.js +69 -0
  152. package/dist/production/src/acl/PredicateDefinitionProcessor.js.map +1 -0
  153. package/dist/production/src/acl/schemaUtils.cjs +11 -0
  154. package/dist/production/src/acl/schemaUtils.cjs.map +1 -0
  155. package/dist/production/src/acl/schemaUtils.js +11 -0
  156. package/dist/production/src/acl/schemaUtils.js.map +1 -0
  157. package/dist/production/src/dataUtils.cjs +59 -0
  158. package/dist/production/src/dataUtils.cjs.map +1 -0
  159. package/dist/production/src/dataUtils.js +59 -0
  160. package/dist/production/src/dataUtils.js.map +1 -0
  161. package/dist/production/src/definition-generator/AclDefinitionCodeGenerator.cjs +118 -0
  162. package/dist/production/src/definition-generator/AclDefinitionCodeGenerator.cjs.map +1 -0
  163. package/dist/production/src/definition-generator/AclDefinitionCodeGenerator.js +118 -0
  164. package/dist/production/src/definition-generator/AclDefinitionCodeGenerator.js.map +1 -0
  165. package/dist/production/src/definition-generator/DefinitionCodeGenerator.cjs +218 -0
  166. package/dist/production/src/definition-generator/DefinitionCodeGenerator.cjs.map +1 -0
  167. package/dist/production/src/definition-generator/DefinitionCodeGenerator.js +218 -0
  168. package/dist/production/src/definition-generator/DefinitionCodeGenerator.js.map +1 -0
  169. package/dist/production/src/definition-generator/DefinitionNamingConventions.cjs +68 -0
  170. package/dist/production/src/definition-generator/DefinitionNamingConventions.cjs.map +1 -0
  171. package/dist/production/src/definition-generator/DefinitionNamingConventions.js +68 -0
  172. package/dist/production/src/definition-generator/DefinitionNamingConventions.js.map +1 -0
  173. package/dist/production/src/definition-generator/TsDefinitionGenerator.cjs +17 -0
  174. package/dist/production/src/definition-generator/TsDefinitionGenerator.cjs.map +1 -0
  175. package/dist/production/src/definition-generator/TsDefinitionGenerator.js +17 -0
  176. package/dist/production/src/definition-generator/TsDefinitionGenerator.js.map +1 -0
  177. package/dist/production/src/lax/LaxSchemaConverter.cjs +202 -0
  178. package/dist/production/src/lax/LaxSchemaConverter.cjs.map +1 -0
  179. package/dist/production/src/lax/LaxSchemaConverter.js +202 -0
  180. package/dist/production/src/lax/LaxSchemaConverter.js.map +1 -0
  181. package/dist/production/src/lax/schema.cjs +70 -0
  182. package/dist/production/src/lax/schema.cjs.map +1 -0
  183. package/dist/production/src/lax/schema.js +53 -0
  184. package/dist/production/src/lax/schema.js.map +1 -0
  185. package/dist/production/src/model/NamingConventions.cjs +28 -0
  186. package/dist/production/src/model/NamingConventions.cjs.map +1 -0
  187. package/dist/production/src/model/NamingConventions.js +28 -0
  188. package/dist/production/src/model/NamingConventions.js.map +1 -0
  189. package/dist/production/src/model/modelUtils.cjs +229 -0
  190. package/dist/production/src/model/modelUtils.cjs.map +1 -0
  191. package/dist/production/src/model/modelUtils.js +229 -0
  192. package/dist/production/src/model/modelUtils.js.map +1 -0
  193. package/dist/production/src/model/resolveDefaultColumnType.cjs +30 -0
  194. package/dist/production/src/model/resolveDefaultColumnType.cjs.map +1 -0
  195. package/dist/production/src/model/resolveDefaultColumnType.js +30 -0
  196. package/dist/production/src/model/resolveDefaultColumnType.js.map +1 -0
  197. package/dist/production/src/schemaChecksum.cjs +9 -0
  198. package/dist/production/src/schemaChecksum.cjs.map +1 -0
  199. package/dist/production/src/schemaChecksum.js +9 -0
  200. package/dist/production/src/schemaChecksum.js.map +1 -0
  201. package/dist/production/src/schemaFilter.cjs +24 -0
  202. package/dist/production/src/schemaFilter.cjs.map +1 -0
  203. package/dist/production/src/schemaFilter.js +24 -0
  204. package/dist/production/src/schemaFilter.js.map +1 -0
  205. package/dist/production/src/schemaNormalizer.cjs +72 -0
  206. package/dist/production/src/schemaNormalizer.cjs.map +1 -0
  207. package/dist/production/src/schemaNormalizer.js +72 -0
  208. package/dist/production/src/schemaNormalizer.js.map +1 -0
  209. package/dist/production/src/type-schema/acl.cjs +149 -0
  210. package/dist/production/src/type-schema/acl.cjs.map +1 -0
  211. package/dist/production/src/type-schema/acl.js +132 -0
  212. package/dist/production/src/type-schema/acl.js.map +1 -0
  213. package/dist/production/src/type-schema/actions.cjs +88 -0
  214. package/dist/production/src/type-schema/actions.cjs.map +1 -0
  215. package/dist/production/src/type-schema/actions.js +71 -0
  216. package/dist/production/src/type-schema/actions.js.map +1 -0
  217. package/dist/production/src/type-schema/condition.cjs +92 -0
  218. package/dist/production/src/type-schema/condition.cjs.map +1 -0
  219. package/dist/production/src/type-schema/condition.js +75 -0
  220. package/dist/production/src/type-schema/condition.js.map +1 -0
  221. package/dist/production/src/type-schema/model.cjs +222 -0
  222. package/dist/production/src/type-schema/model.cjs.map +1 -0
  223. package/dist/production/src/type-schema/model.js +206 -0
  224. package/dist/production/src/type-schema/model.js.map +1 -0
  225. package/dist/production/src/type-schema/settings.cjs +34 -0
  226. package/dist/production/src/type-schema/settings.cjs.map +1 -0
  227. package/dist/production/src/type-schema/settings.js +17 -0
  228. package/dist/production/src/type-schema/settings.js.map +1 -0
  229. package/dist/production/src/type-schema/validation.cjs +115 -0
  230. package/dist/production/src/type-schema/validation.cjs.map +1 -0
  231. package/dist/production/src/type-schema/validation.js +98 -0
  232. package/dist/production/src/type-schema/validation.js.map +1 -0
  233. package/dist/production/src/type-schema/where.cjs +46 -0
  234. package/dist/production/src/type-schema/where.cjs.map +1 -0
  235. package/dist/production/src/type-schema/where.js +29 -0
  236. package/dist/production/src/type-schema/where.js.map +1 -0
  237. package/dist/production/src/utils/assertNever.cjs +7 -0
  238. package/dist/production/src/utils/assertNever.cjs.map +1 -0
  239. package/dist/production/src/utils/assertNever.js +7 -0
  240. package/dist/production/src/utils/assertNever.js.map +1 -0
  241. package/dist/production/src/utils/deepCompare.cjs +134 -0
  242. package/dist/production/src/utils/deepCompare.cjs.map +1 -0
  243. package/dist/production/src/utils/deepCompare.js +134 -0
  244. package/dist/production/src/utils/deepCompare.js.map +1 -0
  245. package/dist/production/src/utils/isIt.cjs +7 -0
  246. package/dist/production/src/utils/isIt.cjs.map +1 -0
  247. package/dist/production/src/utils/isIt.js +7 -0
  248. package/dist/production/src/utils/isIt.js.map +1 -0
  249. package/dist/production/src/utils/printJsValue.cjs +42 -0
  250. package/dist/production/src/utils/printJsValue.cjs.map +1 -0
  251. package/dist/production/src/utils/printJsValue.js +42 -0
  252. package/dist/production/src/utils/printJsValue.js.map +1 -0
  253. package/dist/production/src/validation/AclValidator.cjs +168 -0
  254. package/dist/production/src/validation/AclValidator.cjs.map +1 -0
  255. package/dist/production/src/validation/AclValidator.js +168 -0
  256. package/dist/production/src/validation/AclValidator.js.map +1 -0
  257. package/dist/production/src/validation/ActionsValidator.cjs +127 -0
  258. package/dist/production/src/validation/ActionsValidator.cjs.map +1 -0
  259. package/dist/production/src/validation/ActionsValidator.js +110 -0
  260. package/dist/production/src/validation/ActionsValidator.js.map +1 -0
  261. package/dist/production/src/validation/MembershipResolver.cjs +129 -0
  262. package/dist/production/src/validation/MembershipResolver.cjs.map +1 -0
  263. package/dist/production/src/validation/MembershipResolver.js +129 -0
  264. package/dist/production/src/validation/MembershipResolver.js.map +1 -0
  265. package/dist/production/src/validation/ModelValidator.cjs +325 -0
  266. package/dist/production/src/validation/ModelValidator.cjs.map +1 -0
  267. package/dist/production/src/validation/ModelValidator.js +325 -0
  268. package/dist/production/src/validation/ModelValidator.js.map +1 -0
  269. package/dist/production/src/validation/SchemaValidator.cjs +29 -0
  270. package/dist/production/src/validation/SchemaValidator.cjs.map +1 -0
  271. package/dist/production/src/validation/SchemaValidator.js +29 -0
  272. package/dist/production/src/validation/SchemaValidator.js.map +1 -0
  273. package/dist/production/src/validation/ValidationValidator.cjs +121 -0
  274. package/dist/production/src/validation/ValidationValidator.cjs.map +1 -0
  275. package/dist/production/src/validation/ValidationValidator.js +121 -0
  276. package/dist/production/src/validation/ValidationValidator.js.map +1 -0
  277. package/dist/production/src/validation/errors.cjs +16 -0
  278. package/dist/production/src/validation/errors.cjs.map +1 -0
  279. package/dist/production/src/validation/errors.js +16 -0
  280. package/dist/production/src/validation/errors.js.map +1 -0
  281. package/dist/tests/cases/unit/conditionSchema.test.d.ts +2 -0
  282. package/dist/tests/cases/unit/conditionSchema.test.d.ts.map +1 -0
  283. package/dist/tests/cases/unit/deepCompare.test.d.ts +2 -0
  284. package/dist/tests/cases/unit/deepCompare.test.d.ts.map +1 -0
  285. package/dist/tests/cases/unit/laxSchemaConverter.test.d.ts +2 -0
  286. package/dist/tests/cases/unit/laxSchemaConverter.test.d.ts.map +1 -0
  287. package/dist/tests/cases/unit/membershipResolver.test.d.ts +2 -0
  288. package/dist/tests/cases/unit/membershipResolver.test.d.ts.map +1 -0
  289. package/dist/tests/cases/unit/modelSchema.test.d.ts +2 -0
  290. package/dist/tests/cases/unit/modelSchema.test.d.ts.map +1 -0
  291. package/dist/tests/cases/unit/modelValidator.test.d.ts +2 -0
  292. package/dist/tests/cases/unit/modelValidator.test.d.ts.map +1 -0
  293. package/dist/tests/cases/unit/printJsvalue.test.d.ts +2 -0
  294. package/dist/tests/cases/unit/printJsvalue.test.d.ts.map +1 -0
  295. package/dist/tests/cases/unit/schemas/acl.d.ts +12 -0
  296. package/dist/tests/cases/unit/schemas/acl.d.ts.map +1 -0
  297. package/dist/tests/cases/unit/schemas/basic.d.ts +4 -0
  298. package/dist/tests/cases/unit/schemas/basic.d.ts.map +1 -0
  299. package/dist/tests/cases/unit/schemas/complex.d.ts +12 -0
  300. package/dist/tests/cases/unit/schemas/complex.d.ts.map +1 -0
  301. package/dist/tests/cases/unit/schemas/enum.d.ts +6 -0
  302. package/dist/tests/cases/unit/schemas/enum.d.ts.map +1 -0
  303. package/dist/tests/cases/unit/schemas/relations.d.ts +14 -0
  304. package/dist/tests/cases/unit/schemas/relations.d.ts.map +1 -0
  305. package/dist/tests/cases/unit/schemas/unique.d.ts +4 -0
  306. package/dist/tests/cases/unit/schemas/unique.d.ts.map +1 -0
  307. package/dist/tests/cases/unit/schemas/view.d.ts +4 -0
  308. package/dist/tests/cases/unit/schemas/view.d.ts.map +1 -0
  309. package/dist/tests/cases/unit/tsDefinitionGenerator.test.d.ts +2 -0
  310. package/dist/tests/cases/unit/tsDefinitionGenerator.test.d.ts.map +1 -0
  311. package/dist/tests/cases/unit/whereSchema.test.d.ts +2 -0
  312. package/dist/tests/cases/unit/whereSchema.test.d.ts.map +1 -0
  313. package/dist/tests/tsconfig.tsbuildinfo +1 -0
  314. package/dist/types/acl/AllowAllPermissionFactory.d.ts +7 -0
  315. package/dist/types/acl/AllowAllPermissionFactory.d.ts.map +1 -0
  316. package/dist/types/acl/PredicateDefinitionProcessor.d.ts +32 -0
  317. package/dist/types/acl/PredicateDefinitionProcessor.d.ts.map +1 -0
  318. package/dist/types/acl/index.d.ts +4 -0
  319. package/dist/types/acl/index.d.ts.map +1 -0
  320. package/dist/types/acl/schemaUtils.d.ts +3 -0
  321. package/dist/types/acl/schemaUtils.d.ts.map +1 -0
  322. package/dist/types/dataUtils.d.ts +18 -0
  323. package/dist/types/dataUtils.d.ts.map +1 -0
  324. package/dist/types/definition-generator/AclDefinitionCodeGenerator.d.ts +19 -0
  325. package/dist/types/definition-generator/AclDefinitionCodeGenerator.d.ts.map +1 -0
  326. package/dist/types/definition-generator/DefinitionCodeGenerator.d.ts +27 -0
  327. package/dist/types/definition-generator/DefinitionCodeGenerator.d.ts.map +1 -0
  328. package/dist/types/definition-generator/DefinitionNamingConventions.d.ts +7 -0
  329. package/dist/types/definition-generator/DefinitionNamingConventions.d.ts.map +1 -0
  330. package/dist/types/definition-generator/TsDefinitionGenerator.d.ts +12 -0
  331. package/dist/types/definition-generator/TsDefinitionGenerator.d.ts.map +1 -0
  332. package/dist/types/definition-generator/index.d.ts +5 -0
  333. package/dist/types/definition-generator/index.d.ts.map +1 -0
  334. package/dist/types/index.d.ts +15 -0
  335. package/dist/types/index.d.ts.map +1 -0
  336. package/dist/types/lax/LaxSchemaConverter.d.ts +10 -0
  337. package/dist/types/lax/LaxSchemaConverter.d.ts.map +1 -0
  338. package/dist/types/lax/index.d.ts +3 -0
  339. package/dist/types/lax/index.d.ts.map +1 -0
  340. package/dist/types/lax/schema.d.ts +285 -0
  341. package/dist/types/lax/schema.d.ts.map +1 -0
  342. package/dist/types/model/NamingConventions.d.ts +17 -0
  343. package/dist/types/model/NamingConventions.d.ts.map +1 -0
  344. package/dist/types/model/index.d.ts +4 -0
  345. package/dist/types/model/index.d.ts.map +1 -0
  346. package/dist/types/model/modelUtils.d.ts +28 -0
  347. package/dist/types/model/modelUtils.d.ts.map +1 -0
  348. package/dist/types/model/resolveDefaultColumnType.d.ts +3 -0
  349. package/dist/types/model/resolveDefaultColumnType.d.ts.map +1 -0
  350. package/dist/types/schemaChecksum.d.ts +3 -0
  351. package/dist/types/schemaChecksum.d.ts.map +1 -0
  352. package/dist/types/schemaFilter.d.ts +3 -0
  353. package/dist/types/schemaFilter.d.ts.map +1 -0
  354. package/dist/types/schemaNormalizer.d.ts +3 -0
  355. package/dist/types/schemaNormalizer.d.ts.map +1 -0
  356. package/dist/types/tsconfig.tsbuildinfo +1 -0
  357. package/dist/types/type-schema/acl.d.ts +10 -0
  358. package/dist/types/type-schema/acl.d.ts.map +1 -0
  359. package/dist/types/type-schema/actions.d.ts +32 -0
  360. package/dist/types/type-schema/actions.d.ts.map +1 -0
  361. package/dist/types/type-schema/condition.d.ts +4 -0
  362. package/dist/types/type-schema/condition.d.ts.map +1 -0
  363. package/dist/types/type-schema/index.d.ts +6 -0
  364. package/dist/types/type-schema/index.d.ts.map +1 -0
  365. package/dist/types/type-schema/model.d.ts +30 -0
  366. package/dist/types/type-schema/model.d.ts.map +1 -0
  367. package/dist/types/type-schema/settings.d.ts +41 -0
  368. package/dist/types/type-schema/settings.d.ts.map +1 -0
  369. package/dist/types/type-schema/validation.d.ts +15 -0
  370. package/dist/types/type-schema/validation.d.ts.map +1 -0
  371. package/dist/types/type-schema/where.d.ts +7 -0
  372. package/dist/types/type-schema/where.d.ts.map +1 -0
  373. package/dist/types/utils/assertNever.d.ts +2 -0
  374. package/dist/types/utils/assertNever.d.ts.map +1 -0
  375. package/dist/types/utils/deepCompare.d.ts +13 -0
  376. package/dist/types/utils/deepCompare.d.ts.map +1 -0
  377. package/dist/types/utils/index.d.ts +4 -0
  378. package/dist/types/utils/index.d.ts.map +1 -0
  379. package/dist/types/utils/isIt.d.ts +2 -0
  380. package/dist/types/utils/isIt.d.ts.map +1 -0
  381. package/dist/types/utils/printJsValue.d.ts +13 -0
  382. package/dist/types/utils/printJsValue.d.ts.map +1 -0
  383. package/dist/types/validation/AclValidator.d.ts +20 -0
  384. package/dist/types/validation/AclValidator.d.ts.map +1 -0
  385. package/dist/types/validation/ActionsValidator.d.ts +13 -0
  386. package/dist/types/validation/ActionsValidator.d.ts.map +1 -0
  387. package/dist/types/validation/MembershipResolver.d.ts +37 -0
  388. package/dist/types/validation/MembershipResolver.d.ts.map +1 -0
  389. package/dist/types/validation/ModelValidator.d.ts +20 -0
  390. package/dist/types/validation/ModelValidator.d.ts.map +1 -0
  391. package/dist/types/validation/SchemaValidator.d.ts +11 -0
  392. package/dist/types/validation/SchemaValidator.d.ts.map +1 -0
  393. package/dist/types/validation/ValidationValidator.d.ts +14 -0
  394. package/dist/types/validation/ValidationValidator.d.ts.map +1 -0
  395. package/dist/types/validation/errors.d.ts +14 -0
  396. package/dist/types/validation/errors.d.ts.map +1 -0
  397. package/dist/types/validation/index.d.ts +7 -0
  398. package/dist/types/validation/index.d.ts.map +1 -0
  399. package/package.json +5 -5
@@ -0,0 +1,325 @@
1
+ import { Model } from "@contember/schema";
2
+ import { ErrorBuilder } from "./errors.js";
3
+ import { isColumn, acceptEveryFieldVisitor, getTargetEntity, isInverseRelation, isOwningRelation } from "../model/modelUtils.js";
4
+ const IDENTIFIER_PATTERN = /^[_a-zA-Z][_a-zA-Z0-9]*$/;
5
+ const RESERVED_WORDS = ["and", "or", "not"];
6
+ class ModelValidator {
7
+ constructor(model) {
8
+ this.model = model;
9
+ }
10
+ validate() {
11
+ const errorBuilder = new ErrorBuilder([], []);
12
+ this.validateEnums(this.model.enums, errorBuilder.for("enums"));
13
+ this.validateEntities(this.model.entities, errorBuilder.for("entities"));
14
+ return errorBuilder.errors;
15
+ }
16
+ validateEnums(enums, errors) {
17
+ for (const [enumName, enumValues] of Object.entries(enums)) {
18
+ for (const value of enumValues) {
19
+ const valueErrors = errors.for(enumName, value);
20
+ this.validateIdentifier(value, valueErrors);
21
+ }
22
+ }
23
+ }
24
+ validateEntities(entities, errors) {
25
+ for (const [entityName, entity] of Object.entries(entities)) {
26
+ const entityErrors = errors.for(entityName);
27
+ if (entity.name !== entityName) {
28
+ entityErrors.add("MODEL_NAME_MISMATCH", `Entity name "${entity.name}" does not match the name in a map "${entityName}"`);
29
+ }
30
+ this.validateEntity(entity, entityErrors);
31
+ }
32
+ const entitiesArr = Object.values(this.model.entities);
33
+ this.validateMetaSuffixCollisions(entitiesArr, errors);
34
+ this.validateTableNameCollisions(entitiesArr, errors);
35
+ this.validateAliasedTypesCollision(entitiesArr, errors);
36
+ }
37
+ validateEntity(entity, errors) {
38
+ this.validateIdentifier(entity.name, errors);
39
+ this.validateEntityName(entity.name, errors);
40
+ for (const [fieldName, field] of Object.entries(entity.fields)) {
41
+ const fieldErrors = errors.for(fieldName);
42
+ this.validateField(entity, field, fieldErrors);
43
+ if (field.name !== fieldName) {
44
+ fieldErrors.add("MODEL_NAME_MISMATCH", `Field name "${field.name}" does not match the name in a map "${fieldName}"`);
45
+ }
46
+ }
47
+ this.validateUniqueConstraints(
48
+ entity,
49
+ errors.for("unique")
50
+ );
51
+ this.validateColumnNamesCollision(entity, errors);
52
+ }
53
+ validateUniqueConstraints(entity, errors) {
54
+ for (const constraint of entity.unique) {
55
+ if (entity.view?.materialized && !constraint.index) {
56
+ errors.add("MODEL_INVALID_CONSTRAINT", "For materialized views, Unique must be defined as an index. Please set index: true.");
57
+ }
58
+ for (const field of constraint.fields) {
59
+ const fieldDef = entity.fields[field];
60
+ if (!fieldDef) {
61
+ errors.add("MODEL_UNDEFINED_FIELD", `Referenced field ${field} in a constraint does not exists`);
62
+ } else if (isColumn(fieldDef) && fieldDef.list) {
63
+ errors.add("MODEL_INVALID_FIELD", `Field ${field} in a unique constraint cannot be an array`);
64
+ }
65
+ }
66
+ }
67
+ }
68
+ validateColumnNamesCollision(entity, errors) {
69
+ const existingColumnNames = /* @__PURE__ */ new Map();
70
+ const addColumnName = (fieldName, columnName) => {
71
+ if (existingColumnNames.has(columnName)) {
72
+ const exitingName = existingColumnNames.get(columnName);
73
+ errors.for(fieldName).add("MODEL_NAME_COLLISION", `Column name "${columnName}" on field "${fieldName}" collides with a column name on field "${exitingName}".`);
74
+ }
75
+ existingColumnNames.set(columnName, fieldName);
76
+ };
77
+ acceptEveryFieldVisitor(this.model, entity, {
78
+ visitColumn: ({ column }) => {
79
+ addColumnName(column.name, column.columnName);
80
+ },
81
+ visitOneHasOneOwning: ({ relation }) => {
82
+ addColumnName(relation.name, relation.joiningColumn.columnName);
83
+ },
84
+ visitManyHasOne: ({ relation }) => {
85
+ addColumnName(relation.name, relation.joiningColumn.columnName);
86
+ },
87
+ visitOneHasOneInverse: () => {
88
+ },
89
+ visitOneHasMany: () => {
90
+ },
91
+ visitManyHasManyInverse: () => {
92
+ },
93
+ visitManyHasManyOwning: () => {
94
+ }
95
+ });
96
+ }
97
+ validateField(partialEntity, field, errors) {
98
+ this.validateIdentifier(field.name, errors);
99
+ if (isRelation(field)) {
100
+ this.validateRelation(partialEntity, field, errors);
101
+ } else {
102
+ if (field.sequence && field.nullable) {
103
+ errors.add("MODEL_INVALID_COLUMN_DEFINITION", "Column with sequence cannot be nullable.");
104
+ }
105
+ }
106
+ }
107
+ validateRelation(partialEntity, field, errors) {
108
+ const entityName = partialEntity.name;
109
+ const targetEntityName = field.target;
110
+ const targetEntity = this.model.entities[targetEntityName] || void 0;
111
+ if (!targetEntity) {
112
+ return errors.add("MODEL_UNDEFINED_ENTITY", `Target entity ${targetEntityName} not found`);
113
+ }
114
+ if (((it) => "orderBy" in it)(field)) {
115
+ field.orderBy?.forEach((it) => {
116
+ let entity = targetEntity;
117
+ for (let i = 0; i < it.path.length; i++) {
118
+ const orderByField = entity.fields[it.path[i]];
119
+ const pathStr = it.path.slice(0, i + 1).join(".");
120
+ if (!orderByField) {
121
+ errors.add("MODEL_UNDEFINED_FIELD", `Invalid orderBy of ${entityName}::${field.name}: field ${pathStr} is not defined`);
122
+ return;
123
+ }
124
+ if (i + 1 < it.path.length) {
125
+ const targetEntity2 = getTargetEntity(this.model, entity, orderByField.name);
126
+ if (!targetEntity2) {
127
+ errors.add("MODEL_RELATION_REQUIRED", `Invalid orderBy of ${entityName}::${field.name}: field ${pathStr} is not a relation`);
128
+ return;
129
+ }
130
+ entity = targetEntity2;
131
+ }
132
+ }
133
+ });
134
+ }
135
+ if (partialEntity.view) {
136
+ if (field.type === Model.RelationType.ManyHasMany) {
137
+ return errors.add("MODEL_INVALID_VIEW_USAGE", "Many-has-many relation is not allowed on a view entity.");
138
+ }
139
+ if (!targetEntity.view && field.type === Model.RelationType.OneHasMany) {
140
+ return errors.add("MODEL_INVALID_VIEW_USAGE", "One-has-many relation fields on views must point to a view entity.");
141
+ }
142
+ if (!targetEntity.view && field.type === Model.RelationType.OneHasOne && !("joiningColumn" in field)) {
143
+ return errors.add("MODEL_INVALID_VIEW_USAGE", "One-has-one relation fields on views must be owning or point to a view entity.");
144
+ }
145
+ }
146
+ if (isInverseRelation(field)) {
147
+ const ownedBy = field.ownedBy;
148
+ const targetField = targetEntity.fields[ownedBy];
149
+ const relationDescription = `Target relation ${targetEntityName}::${ownedBy}:`;
150
+ if (!targetField) {
151
+ return errors.add("MODEL_UNDEFINED_FIELD", `${relationDescription} not exists`);
152
+ }
153
+ if (!isRelation(targetField)) {
154
+ return errors.add("MODEL_RELATION_REQUIRED", `${relationDescription} not a relation`);
155
+ }
156
+ if (targetField.target !== entityName) {
157
+ return errors.add(
158
+ "MODEL_INVALID_RELATION_DEFINITION",
159
+ `${relationDescription} back reference to entity ${entityName} expected, but ${targetField.target} given`
160
+ );
161
+ }
162
+ if (!isOwningRelation(targetField)) {
163
+ errors.add("MODEL_INVALID_RELATION_DEFINITION", `${relationDescription} not an owning relation`);
164
+ return;
165
+ }
166
+ if (!targetField.inversedBy) {
167
+ return errors.add("MODEL_INVALID_RELATION_DEFINITION", `${relationDescription} inverse relation is not set`);
168
+ }
169
+ if (targetField.inversedBy !== field.name) {
170
+ return errors.add(
171
+ "MODEL_INVALID_RELATION_DEFINITION",
172
+ `${relationDescription} back reference ${entityName}::${field.name} expected, ${targetField.target}::${targetField.inversedBy} given`
173
+ );
174
+ }
175
+ if (field.type === Model.RelationType.OneHasOne && targetField.type !== Model.RelationType.OneHasOne) {
176
+ return errors.add("MODEL_INVALID_RELATION_DEFINITION", `${relationDescription} "OneHasOne" type expected, "${targetField.type}" given`);
177
+ }
178
+ if (field.type === Model.RelationType.OneHasMany && targetField.type !== Model.RelationType.ManyHasOne) {
179
+ return errors.add("MODEL_INVALID_RELATION_DEFINITION", `${relationDescription} "ManyHasOne" type expected, "${targetField.type}" given`);
180
+ }
181
+ if (field.type === Model.RelationType.ManyHasMany && targetField.type !== Model.RelationType.ManyHasMany) {
182
+ return errors.add("MODEL_INVALID_RELATION_DEFINITION", `${relationDescription} "ManyHasMany" type expected, "${targetField.type}" given`);
183
+ }
184
+ } else {
185
+ const inversedBy = field.inversedBy;
186
+ if (inversedBy) {
187
+ const targetField = targetEntity.fields[inversedBy];
188
+ const relationDescription = `Target relation ${targetEntityName}::${inversedBy}:`;
189
+ if (!targetField) {
190
+ return errors.add("MODEL_UNDEFINED_FIELD", `${relationDescription} not exists`);
191
+ }
192
+ if (!isRelation(targetField)) {
193
+ return errors.add("MODEL_RELATION_REQUIRED", `${relationDescription} not a relation`);
194
+ }
195
+ if (targetField.target !== entityName) {
196
+ return errors.add(
197
+ "MODEL_INVALID_RELATION_DEFINITION",
198
+ `${relationDescription} back reference to entity ${entityName} expected, but ${targetField.target} given`
199
+ );
200
+ }
201
+ if (!isInverseRelation(targetField)) {
202
+ return errors.add("MODEL_INVALID_RELATION_DEFINITION", `${relationDescription} not an inverse relation`);
203
+ }
204
+ if (!targetField.ownedBy) {
205
+ return errors.add("MODEL_INVALID_RELATION_DEFINITION", `${relationDescription} owning relation is not set`);
206
+ }
207
+ if (targetField.ownedBy !== field.name) {
208
+ return errors.add(
209
+ "MODEL_INVALID_RELATION_DEFINITION",
210
+ `${relationDescription} back reference ${entityName}::${field.name} expected, ${targetField.target}::${targetField.ownedBy} given`
211
+ );
212
+ }
213
+ if (field.type === Model.RelationType.OneHasOne && targetField.type !== Model.RelationType.OneHasOne) {
214
+ return errors.add("MODEL_INVALID_RELATION_DEFINITION", `${relationDescription} "OneHasOne" type expected, "${targetField.type}" given`);
215
+ }
216
+ if (field.type === Model.RelationType.ManyHasOne && targetField.type !== Model.RelationType.OneHasMany) {
217
+ return errors.add("MODEL_INVALID_RELATION_DEFINITION", `${relationDescription} "ManyHasOne" type expected, "${targetField.type}" given`);
218
+ }
219
+ if (field.type === Model.RelationType.ManyHasMany && targetField.type !== Model.RelationType.ManyHasMany) {
220
+ return errors.add("MODEL_INVALID_RELATION_DEFINITION", `${relationDescription} "ManyHasMany" type expected, "${targetField.type}" given`);
221
+ }
222
+ }
223
+ }
224
+ }
225
+ validateIdentifier(value, errorBuilder) {
226
+ if (!value.match(IDENTIFIER_PATTERN)) {
227
+ return errorBuilder.add("MODEL_INVALID_IDENTIFIER", `${value} must match pattern ${IDENTIFIER_PATTERN.source}`);
228
+ }
229
+ if (RESERVED_WORDS.includes(value)) {
230
+ errorBuilder.add("MODEL_INVALID_IDENTIFIER", `${value} is reserved word`);
231
+ }
232
+ }
233
+ validateEntityName(value, errorBuilder) {
234
+ if (["Query", "Mutation"].includes(value)) {
235
+ errorBuilder.add("MODEL_INVALID_ENTITY_NAME", `${value} is reserved word`);
236
+ }
237
+ }
238
+ validateMetaSuffixCollisions(entities, errorBuilder) {
239
+ const entityNames = new Set(entities.map((it) => it.name));
240
+ for (const entity of entities) {
241
+ if (entity.name.endsWith("Meta")) {
242
+ const baseName = entity.name.substring(0, entity.name.length - 4);
243
+ if (entityNames.has(baseName)) {
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
+ );
248
+ }
249
+ }
250
+ }
251
+ }
252
+ validateTableNameCollisions(entities, errorBuilder) {
253
+ const relationNames = {};
254
+ for (const entity of entities) {
255
+ const description = `table name ${entity.tableName} of entity ${entity.name}`;
256
+ if (relationNames[entity.tableName]) {
257
+ errorBuilder.for(entity.name).add("MODEL_NAME_COLLISION", `${description} collides with a ${relationNames[entity.tableName]}`);
258
+ } else {
259
+ relationNames[entity.tableName] = description;
260
+ }
261
+ }
262
+ for (const entity of entities) {
263
+ const entityErrorBuilder = errorBuilder.for(entity.name);
264
+ acceptEveryFieldVisitor(this.model, entity, {
265
+ visitManyHasManyOwning: ({ entity: entity2, relation }) => {
266
+ const joiningTable = relation.joiningTable;
267
+ const description = `joining table name ${joiningTable.tableName} of relation ${entity2.name}::${relation.name}`;
268
+ if (relationNames[joiningTable.tableName]) {
269
+ entityErrorBuilder.for(relation.name).add(
270
+ "MODEL_NAME_COLLISION",
271
+ `${description} collides with a ${relationNames[joiningTable.tableName]}.Consider using plural for a relation name or change the joining table name using .joiningTable(...) in schema definition.`
272
+ );
273
+ } else {
274
+ relationNames[joiningTable.tableName] = description;
275
+ }
276
+ },
277
+ visitColumn: () => {
278
+ },
279
+ visitManyHasManyInverse: () => {
280
+ },
281
+ visitOneHasMany: () => {
282
+ },
283
+ visitOneHasOneInverse: () => {
284
+ },
285
+ visitOneHasOneOwning: () => {
286
+ },
287
+ visitManyHasOne: () => {
288
+ }
289
+ });
290
+ }
291
+ }
292
+ validateAliasedTypesCollision(entities, errorBuilder) {
293
+ const aliasedTypes = /* @__PURE__ */ new Map();
294
+ for (const entity of entities) {
295
+ acceptEveryFieldVisitor(this.model, entity, {
296
+ visitColumn: ({ column }) => {
297
+ if (!column.typeAlias) {
298
+ return;
299
+ }
300
+ if (aliasedTypes.has(column.typeAlias) && aliasedTypes.get(column.typeAlias) !== column.type) {
301
+ errorBuilder.for(column.name).add("MODEL_NAME_COLLISION", `Type alias ${column.typeAlias} already exists for base type ${column.type}`);
302
+ }
303
+ aliasedTypes.set(column.typeAlias, column.type);
304
+ },
305
+ visitManyHasManyOwning: () => {
306
+ },
307
+ visitManyHasManyInverse: () => {
308
+ },
309
+ visitOneHasMany: () => {
310
+ },
311
+ visitOneHasOneInverse: () => {
312
+ },
313
+ visitOneHasOneOwning: () => {
314
+ },
315
+ visitManyHasOne: () => {
316
+ }
317
+ });
318
+ }
319
+ }
320
+ }
321
+ const isRelation = (field) => Object.values(Model.RelationType).includes(field.type);
322
+ export {
323
+ ModelValidator
324
+ };
325
+ //# sourceMappingURL=ModelValidator.js.map
@@ -0,0 +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\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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"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const AclValidator = require("./AclValidator.cjs");
4
+ const ModelValidator = require("./ModelValidator.cjs");
5
+ const ValidationValidator = require("./ValidationValidator.cjs");
6
+ const ActionsValidator = require("./ActionsValidator.cjs");
7
+ class SchemaValidator {
8
+ static validate(schema, skippedErrors = []) {
9
+ const modelValidator = new ModelValidator.ModelValidator(schema.model);
10
+ const modelErrors = modelValidator.validate();
11
+ const aclValidator = new AclValidator.AclValidator(schema.model);
12
+ const aclErrors = aclValidator.validate(schema.acl);
13
+ const validationValidator = new ValidationValidator.ValidationValidator(schema.model);
14
+ const validationErrors = validationValidator.validate(schema.validation);
15
+ const actionsValidator = new ActionsValidator.ActionsValidator(schema.model);
16
+ const actionsErrors = actionsValidator.validate(schema.actions);
17
+ const allErrors = [...aclErrors, ...modelErrors, ...validationErrors, ...actionsErrors];
18
+ if (skippedErrors.length === 0) {
19
+ return allErrors;
20
+ }
21
+ return allErrors.filter(
22
+ (err) => !skippedErrors.some(
23
+ (rule) => err.code === rule.code && (!rule.path || err.path.join(".") === rule.path)
24
+ )
25
+ );
26
+ }
27
+ }
28
+ exports.SchemaValidator = SchemaValidator;
29
+ //# sourceMappingURL=SchemaValidator.cjs.map
@@ -0,0 +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\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;;"}
@@ -0,0 +1,29 @@
1
+ import { AclValidator } from "./AclValidator.js";
2
+ import { ModelValidator } from "./ModelValidator.js";
3
+ import { ValidationValidator } from "./ValidationValidator.js";
4
+ import { ActionsValidator } from "./ActionsValidator.js";
5
+ class SchemaValidator {
6
+ static validate(schema, skippedErrors = []) {
7
+ const modelValidator = new ModelValidator(schema.model);
8
+ const modelErrors = modelValidator.validate();
9
+ const aclValidator = new AclValidator(schema.model);
10
+ const aclErrors = aclValidator.validate(schema.acl);
11
+ const validationValidator = new ValidationValidator(schema.model);
12
+ const validationErrors = validationValidator.validate(schema.validation);
13
+ const actionsValidator = new ActionsValidator(schema.model);
14
+ const actionsErrors = actionsValidator.validate(schema.actions);
15
+ const allErrors = [...aclErrors, ...modelErrors, ...validationErrors, ...actionsErrors];
16
+ if (skippedErrors.length === 0) {
17
+ return allErrors;
18
+ }
19
+ return allErrors.filter(
20
+ (err) => !skippedErrors.some(
21
+ (rule) => err.code === rule.code && (!rule.path || err.path.join(".") === rule.path)
22
+ )
23
+ );
24
+ }
25
+ }
26
+ export {
27
+ SchemaValidator
28
+ };
29
+ //# sourceMappingURL=SchemaValidator.js.map
@@ -0,0 +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\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;"}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const errors = require("./errors.cjs");
4
+ const modelUtils = require("../model/modelUtils.cjs");
5
+ require("@contember/schema");
6
+ class ValidationValidator {
7
+ constructor(model) {
8
+ this.model = model;
9
+ }
10
+ validate(schema) {
11
+ const errorBuilder = new errors.ErrorBuilder([], ["validation"]);
12
+ for (const entityName in schema) {
13
+ const entity = this.model.entities[entityName];
14
+ const entityErrorBuilder = errorBuilder.for(entityName);
15
+ if (!entity) {
16
+ entityErrorBuilder.add("VALIDATION_UNDEFINED_ENTITY", "Entity not found");
17
+ } else {
18
+ this.validateEntityRules(entityErrorBuilder, schema[entityName], entity);
19
+ }
20
+ }
21
+ return errorBuilder.errors;
22
+ }
23
+ validateEntityRules(errorBuilder, entitySchema, entity) {
24
+ for (const fieldName in entitySchema) {
25
+ const field = entity.fields[fieldName];
26
+ const fieldErrorBuilder = errorBuilder.for(fieldName);
27
+ if (!field) {
28
+ fieldErrorBuilder.add("VALIDATION_UNDEFINED_FIELD", "Field not found");
29
+ } else {
30
+ this.validateFieldRules(fieldErrorBuilder, entitySchema[fieldName], entity, field);
31
+ }
32
+ }
33
+ }
34
+ validateFieldRules(errorBuilder, fieldSchema, entity, field) {
35
+ for (const i in fieldSchema) {
36
+ this.validateFieldRule(errorBuilder.for(i), fieldSchema[i], entity, field);
37
+ }
38
+ }
39
+ validateFieldRule(errorBuilder, rule, entity, field) {
40
+ const errorMessage = modelUtils.acceptFieldVisitor(this.model, entity, field, {
41
+ visitColumn: () => null,
42
+ visitHasOne: () => null,
43
+ visitHasMany: () => {
44
+ return "Rules on has-many relations are currently not supported.";
45
+ }
46
+ });
47
+ if (errorMessage) {
48
+ return errorBuilder.add("VALIDATION_NOT_IMPLEMENTED", errorMessage);
49
+ }
50
+ this.validateValidator(errorBuilder.for("validator"), rule.validator, entity, field);
51
+ }
52
+ validateValidator(errorBuilder, validator, entity, field) {
53
+ const validatorCast = validator;
54
+ switch (validatorCast.operation) {
55
+ case "and":
56
+ case "or":
57
+ return validatorCast.args.forEach((it, index) => this.validateValidatorArgument(errorBuilder.for(String(index)), it, entity, field));
58
+ case "conditional":
59
+ this.validateValidatorArgument(errorBuilder.for("condition"), validatorCast.args[0], entity, field);
60
+ this.validateValidatorArgument(errorBuilder.for("rule"), validatorCast.args[1], entity, field);
61
+ return;
62
+ case "pattern":
63
+ case "lengthRange":
64
+ case "range":
65
+ case "equals":
66
+ case "empty":
67
+ case "defined":
68
+ return;
69
+ case "not":
70
+ return this.validateValidatorArgument(errorBuilder, validatorCast.args[0], entity, field);
71
+ case "inContext":
72
+ const pathArgResult = this.validatePathArgument(errorBuilder.for("path"), validatorCast.args[0], entity);
73
+ if (pathArgResult === void 0) {
74
+ return void 0;
75
+ }
76
+ return this.validateValidatorArgument(
77
+ errorBuilder.for("validator"),
78
+ validatorCast.args[1],
79
+ entity,
80
+ pathArgResult
81
+ );
82
+ case "every":
83
+ case "any":
84
+ return this.validateValidatorArgument(errorBuilder, validatorCast.args[0], entity, field);
85
+ case "filter":
86
+ this.validateValidatorArgument(
87
+ errorBuilder.for("filter"),
88
+ validatorCast.args[0],
89
+ entity,
90
+ field
91
+ );
92
+ this.validateValidatorArgument(
93
+ errorBuilder.for("validator"),
94
+ validatorCast.args[1],
95
+ entity,
96
+ field
97
+ );
98
+ return;
99
+ default:
100
+ ((_) => {
101
+ errorBuilder.for("operation", `Operation ${validatorCast.operation} is not an valid option`);
102
+ })();
103
+ }
104
+ }
105
+ validateValidatorArgument(errorBuilder, argument, entity, field) {
106
+ this.validateValidator(errorBuilder.for("validator"), argument.validator, entity, field);
107
+ }
108
+ validatePathArgument(errorBuilder, argument, entity) {
109
+ const isRelation = modelUtils.acceptFieldVisitor(this.model, entity, argument.path[0], {
110
+ visitColumn: () => false,
111
+ visitRelation: () => true
112
+ });
113
+ if (isRelation) {
114
+ errorBuilder.add("VALIDATION_NOT_IMPLEMENTED", "Rules depending on relations are currently not supported.");
115
+ return void 0;
116
+ }
117
+ return entity.fields[argument.path[0]];
118
+ }
119
+ }
120
+ exports.ValidationValidator = ValidationValidator;
121
+ //# sourceMappingURL=ValidationValidator.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValidationValidator.cjs","sources":["../../../../../packages/schema-utils/src/validation/ValidationValidator.ts"],"sourcesContent":["import { Model, Validation } from '@contember/schema'\nimport { ErrorBuilder, ValidationError } from './errors'\nimport { acceptFieldVisitor } from '../model'\n\nexport class ValidationValidator {\n\tconstructor(private readonly model: Model.Schema) {}\n\n\tpublic validate(schema: Validation.Schema): ValidationError[] {\n\t\tconst errorBuilder = new ErrorBuilder([], ['validation'])\n\t\tfor (const entityName in schema) {\n\t\t\tconst entity = this.model.entities[entityName]\n\t\t\tconst entityErrorBuilder = errorBuilder.for(entityName)\n\t\t\tif (!entity) {\n\t\t\t\tentityErrorBuilder.add('VALIDATION_UNDEFINED_ENTITY', 'Entity not found')\n\t\t\t} else {\n\t\t\t\tthis.validateEntityRules(entityErrorBuilder, schema[entityName], entity)\n\t\t\t}\n\t\t}\n\t\treturn errorBuilder.errors\n\t}\n\n\tprivate validateEntityRules(\n\t\terrorBuilder: ErrorBuilder,\n\t\tentitySchema: Validation.EntityRules,\n\t\tentity: Model.Entity,\n\t): void {\n\t\tfor (const fieldName in entitySchema) {\n\t\t\tconst field = entity.fields[fieldName]\n\t\t\tconst fieldErrorBuilder = errorBuilder.for(fieldName)\n\t\t\tif (!field) {\n\t\t\t\tfieldErrorBuilder.add('VALIDATION_UNDEFINED_FIELD', 'Field not found')\n\t\t\t} else {\n\t\t\t\tthis.validateFieldRules(fieldErrorBuilder, entitySchema[fieldName], entity, field)\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateFieldRules(\n\t\terrorBuilder: ErrorBuilder,\n\t\tfieldSchema: readonly Validation.ValidationRule[],\n\t\tentity: Model.Entity,\n\t\tfield: Model.AnyField,\n\t): void {\n\t\tfor (const i in fieldSchema) {\n\t\t\tthis.validateFieldRule(errorBuilder.for(i), fieldSchema[i], entity, field)\n\t\t}\n\t}\n\n\tprivate validateFieldRule(\n\t\terrorBuilder: ErrorBuilder,\n\t\trule: Validation.ValidationRule,\n\t\tentity: Model.Entity,\n\t\tfield: Model.AnyField,\n\t): void {\n\t\tconst errorMessage = acceptFieldVisitor(this.model, entity, field, {\n\t\t\tvisitColumn: () => null,\n\t\t\tvisitHasOne: () => null,\n\t\t\tvisitHasMany: () => {\n\t\t\t\treturn 'Rules on has-many relations are currently not supported.'\n\t\t\t},\n\t\t})\n\t\tif (errorMessage) {\n\t\t\treturn errorBuilder.add('VALIDATION_NOT_IMPLEMENTED', errorMessage)\n\t\t}\n\t\tthis.validateValidator(errorBuilder.for('validator'), rule.validator, entity, field)\n\t}\n\n\tprivate validateValidator(\n\t\terrorBuilder: ErrorBuilder,\n\t\tvalidator: Validation.Validator,\n\t\tentity: Model.Entity,\n\t\tfield: Model.AnyField,\n\t): void {\n\t\tconst validatorCast = validator as Validation.Validator\n\t\tswitch (validatorCast.operation) {\n\t\t\tcase 'and':\n\t\t\tcase 'or':\n\t\t\t\treturn validatorCast.args\n\t\t\t\t\t.forEach((it, index) => this.validateValidatorArgument(errorBuilder.for(String(index)), it, entity, field))\n\t\t\tcase 'conditional':\n\t\t\t\tthis.validateValidatorArgument(errorBuilder.for('condition'), validatorCast.args[0], entity, field)\n\t\t\t\tthis.validateValidatorArgument(errorBuilder.for('rule'), validatorCast.args[1], entity, field)\n\t\t\t\treturn\n\t\t\tcase 'pattern':\n\t\t\tcase 'lengthRange':\n\t\t\tcase 'range':\n\t\t\tcase 'equals':\n\t\t\tcase 'empty':\n\t\t\tcase 'defined':\n\t\t\t\treturn\n\t\t\tcase 'not':\n\t\t\t\treturn this.validateValidatorArgument(errorBuilder, validatorCast.args[0], entity, field)\n\t\t\tcase 'inContext':\n\t\t\t\tconst pathArgResult = this.validatePathArgument(errorBuilder.for('path'), validatorCast.args[0], entity)\n\t\t\t\tif (pathArgResult === undefined) {\n\t\t\t\t\treturn undefined\n\t\t\t\t}\n\t\t\t\treturn this.validateValidatorArgument(\n\t\t\t\t\terrorBuilder.for('validator'),\n\t\t\t\t\tvalidatorCast.args[1],\n\t\t\t\t\tentity,\n\t\t\t\t\tpathArgResult,\n\t\t\t\t)\n\t\t\tcase 'every':\n\t\t\tcase 'any':\n\t\t\t\treturn this.validateValidatorArgument(errorBuilder, validatorCast.args[0], entity, field)\n\t\t\tcase 'filter':\n\t\t\t\tthis.validateValidatorArgument(\n\t\t\t\t\terrorBuilder.for('filter'),\n\t\t\t\t\tvalidatorCast.args[0],\n\t\t\t\t\tentity,\n\t\t\t\t\tfield,\n\t\t\t\t)\n\t\t\t\tthis.validateValidatorArgument(\n\t\t\t\t\terrorBuilder.for('validator'),\n\t\t\t\t\tvalidatorCast.args[1],\n\t\t\t\t\tentity,\n\t\t\t\t\tfield,\n\t\t\t\t)\n\t\t\t\treturn\n\t\t\tdefault:\n\t\t\t\t;((_: never) => {\n\t\t\t\t\terrorBuilder.for('operation', `Operation ${(validatorCast as any).operation} is not an valid option`)\n\t\t\t\t})(validatorCast)\n\t\t}\n\t}\n\n\tprivate validateValidatorArgument(\n\t\terrorBuilder: ErrorBuilder,\n\t\targument: Validation.ValidatorArgument,\n\t\tentity: Model.Entity,\n\t\tfield: Model.AnyField,\n\t): void {\n\t\tthis.validateValidator(errorBuilder.for('validator'), argument.validator, entity, field)\n\t}\n\n\tprivate validatePathArgument(\n\t\terrorBuilder: ErrorBuilder,\n\t\targument: Validation.PathArgument,\n\t\tentity: Model.Entity,\n\t): Model.AnyField | undefined {\n\t\tconst isRelation = acceptFieldVisitor(this.model, entity, argument.path[0], {\n\t\t\tvisitColumn: () => false,\n\t\t\tvisitRelation: () => true,\n\t\t})\n\t\tif (isRelation) {\n\t\t\terrorBuilder.add('VALIDATION_NOT_IMPLEMENTED', 'Rules depending on relations are currently not supported.')\n\t\t\treturn undefined\n\t\t}\n\t\treturn entity.fields[argument.path[0]]\n\t}\n}\n"],"names":["ErrorBuilder","acceptFieldVisitor"],"mappings":";;;;;AAIO,MAAM,oBAAoB;AAAA,EAChC,YAA6B,OAAqB;AAArB,SAAA,QAAA;AAAA,EAAsB;AAAA,EAE5C,SAAS,QAA8C;AAC7D,UAAM,eAAe,IAAIA,OAAAA,aAAa,CAAA,GAAI,CAAC,YAAY,CAAC;AACxD,eAAW,cAAc,QAAQ;AAChC,YAAM,SAAS,KAAK,MAAM,SAAS,UAAU;AAC7C,YAAM,qBAAqB,aAAa,IAAI,UAAU;AACtD,UAAI,CAAC,QAAQ;AACZ,2BAAmB,IAAI,+BAA+B,kBAAkB;AAAA,MACzE,OAAO;AACN,aAAK,oBAAoB,oBAAoB,OAAO,UAAU,GAAG,MAAM;AAAA,MACxE;AAAA,IACD;AACA,WAAO,aAAa;AAAA,EACrB;AAAA,EAEQ,oBACP,cACA,cACA,QACO;AACP,eAAW,aAAa,cAAc;AACrC,YAAM,QAAQ,OAAO,OAAO,SAAS;AACrC,YAAM,oBAAoB,aAAa,IAAI,SAAS;AACpD,UAAI,CAAC,OAAO;AACX,0BAAkB,IAAI,8BAA8B,iBAAiB;AAAA,MACtE,OAAO;AACN,aAAK,mBAAmB,mBAAmB,aAAa,SAAS,GAAG,QAAQ,KAAK;AAAA,MAClF;AAAA,IACD;AAAA,EACD;AAAA,EAEQ,mBACP,cACA,aACA,QACA,OACO;AACP,eAAW,KAAK,aAAa;AAC5B,WAAK,kBAAkB,aAAa,IAAI,CAAC,GAAG,YAAY,CAAC,GAAG,QAAQ,KAAK;AAAA,IAC1E;AAAA,EACD;AAAA,EAEQ,kBACP,cACA,MACA,QACA,OACO;AACP,UAAM,eAAeC,WAAAA,mBAAmB,KAAK,OAAO,QAAQ,OAAO;AAAA,MAClE,aAAa,MAAM;AAAA,MACnB,aAAa,MAAM;AAAA,MACnB,cAAc,MAAM;AACnB,eAAO;AAAA,MACR;AAAA,IAAA,CACA;AACD,QAAI,cAAc;AACjB,aAAO,aAAa,IAAI,8BAA8B,YAAY;AAAA,IACnE;AACA,SAAK,kBAAkB,aAAa,IAAI,WAAW,GAAG,KAAK,WAAW,QAAQ,KAAK;AAAA,EACpF;AAAA,EAEQ,kBACP,cACA,WACA,QACA,OACO;AACP,UAAM,gBAAgB;AACtB,YAAQ,cAAc,WAAA;AAAA,MACrB,KAAK;AAAA,MACL,KAAK;AACJ,eAAO,cAAc,KACnB,QAAQ,CAAC,IAAI,UAAU,KAAK,0BAA0B,aAAa,IAAI,OAAO,KAAK,CAAC,GAAG,IAAI,QAAQ,KAAK,CAAC;AAAA,MAC5G,KAAK;AACJ,aAAK,0BAA0B,aAAa,IAAI,WAAW,GAAG,cAAc,KAAK,CAAC,GAAG,QAAQ,KAAK;AAClG,aAAK,0BAA0B,aAAa,IAAI,MAAM,GAAG,cAAc,KAAK,CAAC,GAAG,QAAQ,KAAK;AAC7F;AAAA,MACD,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACJ;AAAA,MACD,KAAK;AACJ,eAAO,KAAK,0BAA0B,cAAc,cAAc,KAAK,CAAC,GAAG,QAAQ,KAAK;AAAA,MACzF,KAAK;AACJ,cAAM,gBAAgB,KAAK,qBAAqB,aAAa,IAAI,MAAM,GAAG,cAAc,KAAK,CAAC,GAAG,MAAM;AACvG,YAAI,kBAAkB,QAAW;AAChC,iBAAO;AAAA,QACR;AACA,eAAO,KAAK;AAAA,UACX,aAAa,IAAI,WAAW;AAAA,UAC5B,cAAc,KAAK,CAAC;AAAA,UACpB;AAAA,UACA;AAAA,QAAA;AAAA,MAEF,KAAK;AAAA,MACL,KAAK;AACJ,eAAO,KAAK,0BAA0B,cAAc,cAAc,KAAK,CAAC,GAAG,QAAQ,KAAK;AAAA,MACzF,KAAK;AACJ,aAAK;AAAA,UACJ,aAAa,IAAI,QAAQ;AAAA,UACzB,cAAc,KAAK,CAAC;AAAA,UACpB;AAAA,UACA;AAAA,QAAA;AAED,aAAK;AAAA,UACJ,aAAa,IAAI,WAAW;AAAA,UAC5B,cAAc,KAAK,CAAC;AAAA,UACpB;AAAA,UACA;AAAA,QAAA;AAED;AAAA,MACD;AACE,SAAC,CAAC,MAAa;AACf,uBAAa,IAAI,aAAa,aAAc,cAAsB,SAAS,yBAAyB;AAAA,QACrG,GAAgB;AAAA,IAAA;AAAA,EAEnB;AAAA,EAEQ,0BACP,cACA,UACA,QACA,OACO;AACP,SAAK,kBAAkB,aAAa,IAAI,WAAW,GAAG,SAAS,WAAW,QAAQ,KAAK;AAAA,EACxF;AAAA,EAEQ,qBACP,cACA,UACA,QAC6B;AAC7B,UAAM,aAAaA,WAAAA,mBAAmB,KAAK,OAAO,QAAQ,SAAS,KAAK,CAAC,GAAG;AAAA,MAC3E,aAAa,MAAM;AAAA,MACnB,eAAe,MAAM;AAAA,IAAA,CACrB;AACD,QAAI,YAAY;AACf,mBAAa,IAAI,8BAA8B,2DAA2D;AAC1G,aAAO;AAAA,IACR;AACA,WAAO,OAAO,OAAO,SAAS,KAAK,CAAC,CAAC;AAAA,EACtC;AACD;;"}