@contember/schema-utils 2.0.0-alpha.9 → 2.0.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 (204) hide show
  1. package/dist/development/index.cjs +2 -0
  2. package/dist/development/index.cjs.map +1 -1
  3. package/dist/development/index.js +2 -0
  4. package/dist/development/index.js.map +1 -1
  5. package/dist/development/src/acl/AllowAllPermissionFactory.cjs.map +1 -1
  6. package/dist/development/src/acl/AllowAllPermissionFactory.js.map +1 -1
  7. package/dist/development/src/acl/PredicateDefinitionProcessor.cjs.map +1 -1
  8. package/dist/development/src/acl/PredicateDefinitionProcessor.js.map +1 -1
  9. package/dist/development/src/acl/schemaUtils.cjs.map +1 -1
  10. package/dist/development/src/acl/schemaUtils.js.map +1 -1
  11. package/dist/development/src/dataUtils.cjs.map +1 -1
  12. package/dist/development/src/dataUtils.js.map +1 -1
  13. package/dist/development/src/definition-generator/AclDefinitionCodeGenerator.cjs +1 -2
  14. package/dist/development/src/definition-generator/AclDefinitionCodeGenerator.cjs.map +1 -1
  15. package/dist/development/src/definition-generator/AclDefinitionCodeGenerator.js +1 -2
  16. package/dist/development/src/definition-generator/AclDefinitionCodeGenerator.js.map +1 -1
  17. package/dist/development/src/definition-generator/DefinitionCodeGenerator.cjs +5 -9
  18. package/dist/development/src/definition-generator/DefinitionCodeGenerator.cjs.map +1 -1
  19. package/dist/development/src/definition-generator/DefinitionCodeGenerator.js +5 -9
  20. package/dist/development/src/definition-generator/DefinitionCodeGenerator.js.map +1 -1
  21. package/dist/development/src/definition-generator/DefinitionNamingConventions.cjs.map +1 -1
  22. package/dist/development/src/definition-generator/DefinitionNamingConventions.js.map +1 -1
  23. package/dist/development/src/definition-generator/TsDefinitionGenerator.cjs.map +1 -1
  24. package/dist/development/src/definition-generator/TsDefinitionGenerator.js.map +1 -1
  25. package/dist/development/src/lax/LaxSchemaConverter.cjs.map +1 -1
  26. package/dist/development/src/lax/LaxSchemaConverter.js.map +1 -1
  27. package/dist/development/src/lax/schema.cjs.map +1 -1
  28. package/dist/development/src/lax/schema.js.map +1 -1
  29. package/dist/development/src/model/NamingConventions.cjs.map +1 -1
  30. package/dist/development/src/model/NamingConventions.js.map +1 -1
  31. package/dist/development/src/model/modelUtils.cjs.map +1 -1
  32. package/dist/development/src/model/modelUtils.js.map +1 -1
  33. package/dist/development/src/model/resolveDefaultColumnType.cjs.map +1 -1
  34. package/dist/development/src/model/resolveDefaultColumnType.js.map +1 -1
  35. package/dist/development/src/schemaChecksum.cjs +9 -0
  36. package/dist/development/src/schemaChecksum.cjs.map +1 -0
  37. package/dist/development/src/schemaChecksum.js +9 -0
  38. package/dist/development/src/schemaChecksum.js.map +1 -0
  39. package/dist/development/src/schemaFilter.cjs.map +1 -1
  40. package/dist/development/src/schemaFilter.js.map +1 -1
  41. package/dist/development/src/schemaNormalizer.cjs.map +1 -1
  42. package/dist/development/src/schemaNormalizer.js.map +1 -1
  43. package/dist/development/src/type-schema/acl.cjs.map +1 -1
  44. package/dist/development/src/type-schema/acl.js.map +1 -1
  45. package/dist/development/src/type-schema/actions.cjs.map +1 -1
  46. package/dist/development/src/type-schema/actions.js.map +1 -1
  47. package/dist/development/src/type-schema/condition.cjs.map +1 -1
  48. package/dist/development/src/type-schema/condition.js.map +1 -1
  49. package/dist/development/src/type-schema/model.cjs +6 -1
  50. package/dist/development/src/type-schema/model.cjs.map +1 -1
  51. package/dist/development/src/type-schema/model.js +7 -1
  52. package/dist/development/src/type-schema/model.js.map +1 -1
  53. package/dist/development/src/type-schema/settings.cjs +1 -0
  54. package/dist/development/src/type-schema/settings.cjs.map +1 -1
  55. package/dist/development/src/type-schema/settings.js +1 -0
  56. package/dist/development/src/type-schema/settings.js.map +1 -1
  57. package/dist/development/src/type-schema/validation.cjs.map +1 -1
  58. package/dist/development/src/type-schema/validation.js.map +1 -1
  59. package/dist/development/src/type-schema/where.cjs.map +1 -1
  60. package/dist/development/src/type-schema/where.js.map +1 -1
  61. package/dist/development/src/utils/deepCompare.cjs.map +1 -1
  62. package/dist/development/src/utils/deepCompare.js.map +1 -1
  63. package/dist/development/src/utils/printJsValue.cjs.map +1 -1
  64. package/dist/development/src/utils/printJsValue.js.map +1 -1
  65. package/dist/development/src/validation/AclValidator.cjs.map +1 -1
  66. package/dist/development/src/validation/AclValidator.js.map +1 -1
  67. package/dist/development/src/validation/ActionsValidator.cjs.map +1 -1
  68. package/dist/development/src/validation/ActionsValidator.js.map +1 -1
  69. package/dist/development/src/validation/MembershipResolver.cjs.map +1 -1
  70. package/dist/development/src/validation/MembershipResolver.js.map +1 -1
  71. package/dist/development/src/validation/ModelValidator.cjs.map +1 -1
  72. package/dist/development/src/validation/ModelValidator.js.map +1 -1
  73. package/dist/development/src/validation/SchemaValidator.cjs.map +1 -1
  74. package/dist/development/src/validation/SchemaValidator.js.map +1 -1
  75. package/dist/development/src/validation/ValidationValidator.cjs.map +1 -1
  76. package/dist/development/src/validation/ValidationValidator.js.map +1 -1
  77. package/dist/development/src/validation/errors.cjs.map +1 -1
  78. package/dist/development/src/validation/errors.js.map +1 -1
  79. package/dist/production/index.cjs +2 -0
  80. package/dist/production/index.cjs.map +1 -1
  81. package/dist/production/index.js +2 -0
  82. package/dist/production/index.js.map +1 -1
  83. package/dist/production/src/acl/AllowAllPermissionFactory.cjs.map +1 -1
  84. package/dist/production/src/acl/AllowAllPermissionFactory.js.map +1 -1
  85. package/dist/production/src/acl/PredicateDefinitionProcessor.cjs.map +1 -1
  86. package/dist/production/src/acl/PredicateDefinitionProcessor.js.map +1 -1
  87. package/dist/production/src/acl/schemaUtils.cjs.map +1 -1
  88. package/dist/production/src/acl/schemaUtils.js.map +1 -1
  89. package/dist/production/src/dataUtils.cjs.map +1 -1
  90. package/dist/production/src/dataUtils.js.map +1 -1
  91. package/dist/production/src/definition-generator/AclDefinitionCodeGenerator.cjs +1 -2
  92. package/dist/production/src/definition-generator/AclDefinitionCodeGenerator.cjs.map +1 -1
  93. package/dist/production/src/definition-generator/AclDefinitionCodeGenerator.js +1 -2
  94. package/dist/production/src/definition-generator/AclDefinitionCodeGenerator.js.map +1 -1
  95. package/dist/production/src/definition-generator/DefinitionCodeGenerator.cjs +5 -9
  96. package/dist/production/src/definition-generator/DefinitionCodeGenerator.cjs.map +1 -1
  97. package/dist/production/src/definition-generator/DefinitionCodeGenerator.js +5 -9
  98. package/dist/production/src/definition-generator/DefinitionCodeGenerator.js.map +1 -1
  99. package/dist/production/src/definition-generator/DefinitionNamingConventions.cjs.map +1 -1
  100. package/dist/production/src/definition-generator/DefinitionNamingConventions.js.map +1 -1
  101. package/dist/production/src/definition-generator/TsDefinitionGenerator.cjs.map +1 -1
  102. package/dist/production/src/definition-generator/TsDefinitionGenerator.js.map +1 -1
  103. package/dist/production/src/lax/LaxSchemaConverter.cjs.map +1 -1
  104. package/dist/production/src/lax/LaxSchemaConverter.js.map +1 -1
  105. package/dist/production/src/lax/schema.cjs.map +1 -1
  106. package/dist/production/src/lax/schema.js.map +1 -1
  107. package/dist/production/src/model/NamingConventions.cjs.map +1 -1
  108. package/dist/production/src/model/NamingConventions.js.map +1 -1
  109. package/dist/production/src/model/modelUtils.cjs.map +1 -1
  110. package/dist/production/src/model/modelUtils.js.map +1 -1
  111. package/dist/production/src/model/resolveDefaultColumnType.cjs.map +1 -1
  112. package/dist/production/src/model/resolveDefaultColumnType.js.map +1 -1
  113. package/dist/production/src/schemaChecksum.cjs +9 -0
  114. package/dist/production/src/schemaChecksum.cjs.map +1 -0
  115. package/dist/production/src/schemaChecksum.js +9 -0
  116. package/dist/production/src/schemaChecksum.js.map +1 -0
  117. package/dist/production/src/schemaFilter.cjs.map +1 -1
  118. package/dist/production/src/schemaFilter.js.map +1 -1
  119. package/dist/production/src/schemaNormalizer.cjs.map +1 -1
  120. package/dist/production/src/schemaNormalizer.js.map +1 -1
  121. package/dist/production/src/type-schema/acl.cjs.map +1 -1
  122. package/dist/production/src/type-schema/acl.js.map +1 -1
  123. package/dist/production/src/type-schema/actions.cjs.map +1 -1
  124. package/dist/production/src/type-schema/actions.js.map +1 -1
  125. package/dist/production/src/type-schema/condition.cjs.map +1 -1
  126. package/dist/production/src/type-schema/condition.js.map +1 -1
  127. package/dist/production/src/type-schema/model.cjs +6 -1
  128. package/dist/production/src/type-schema/model.cjs.map +1 -1
  129. package/dist/production/src/type-schema/model.js +7 -1
  130. package/dist/production/src/type-schema/model.js.map +1 -1
  131. package/dist/production/src/type-schema/settings.cjs +1 -0
  132. package/dist/production/src/type-schema/settings.cjs.map +1 -1
  133. package/dist/production/src/type-schema/settings.js +1 -0
  134. package/dist/production/src/type-schema/settings.js.map +1 -1
  135. package/dist/production/src/type-schema/validation.cjs.map +1 -1
  136. package/dist/production/src/type-schema/validation.js.map +1 -1
  137. package/dist/production/src/type-schema/where.cjs.map +1 -1
  138. package/dist/production/src/type-schema/where.js.map +1 -1
  139. package/dist/production/src/utils/deepCompare.cjs.map +1 -1
  140. package/dist/production/src/utils/deepCompare.js.map +1 -1
  141. package/dist/production/src/utils/printJsValue.cjs.map +1 -1
  142. package/dist/production/src/utils/printJsValue.js.map +1 -1
  143. package/dist/production/src/validation/AclValidator.cjs.map +1 -1
  144. package/dist/production/src/validation/AclValidator.js.map +1 -1
  145. package/dist/production/src/validation/ActionsValidator.cjs.map +1 -1
  146. package/dist/production/src/validation/ActionsValidator.js.map +1 -1
  147. package/dist/production/src/validation/MembershipResolver.cjs.map +1 -1
  148. package/dist/production/src/validation/MembershipResolver.js.map +1 -1
  149. package/dist/production/src/validation/ModelValidator.cjs.map +1 -1
  150. package/dist/production/src/validation/ModelValidator.js.map +1 -1
  151. package/dist/production/src/validation/SchemaValidator.cjs.map +1 -1
  152. package/dist/production/src/validation/SchemaValidator.js.map +1 -1
  153. package/dist/production/src/validation/ValidationValidator.cjs.map +1 -1
  154. package/dist/production/src/validation/ValidationValidator.js.map +1 -1
  155. package/dist/production/src/validation/errors.cjs.map +1 -1
  156. package/dist/production/src/validation/errors.js.map +1 -1
  157. package/dist/tests/cases/unit/modelSchema.test.d.ts +2 -0
  158. package/dist/tests/cases/unit/modelSchema.test.d.ts.map +1 -0
  159. package/dist/tests/cases/unit/schemas/acl.d.ts +7 -7
  160. package/dist/tests/cases/unit/schemas/acl.d.ts.map +1 -1
  161. package/dist/tests/cases/unit/schemas/basic.d.ts +1 -1
  162. package/dist/tests/cases/unit/schemas/basic.d.ts.map +1 -1
  163. package/dist/tests/cases/unit/schemas/complex.d.ts +12 -0
  164. package/dist/tests/cases/unit/schemas/complex.d.ts.map +1 -0
  165. package/dist/tests/cases/unit/schemas/enum.d.ts +3 -3
  166. package/dist/tests/cases/unit/schemas/enum.d.ts.map +1 -1
  167. package/dist/tests/cases/unit/schemas/relations.d.ts +7 -7
  168. package/dist/tests/cases/unit/schemas/relations.d.ts.map +1 -1
  169. package/dist/tests/cases/unit/schemas/unique.d.ts +1 -1
  170. package/dist/tests/cases/unit/schemas/unique.d.ts.map +1 -1
  171. package/dist/tests/cases/unit/schemas/view.d.ts +4 -0
  172. package/dist/tests/cases/unit/schemas/view.d.ts.map +1 -0
  173. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  174. package/dist/types/dataUtils.d.ts +1 -1
  175. package/dist/types/dataUtils.d.ts.map +1 -1
  176. package/dist/types/definition-generator/DefinitionCodeGenerator.d.ts.map +1 -1
  177. package/dist/types/index.d.ts +1 -0
  178. package/dist/types/index.d.ts.map +1 -1
  179. package/dist/types/schemaChecksum.d.ts +3 -0
  180. package/dist/types/schemaChecksum.d.ts.map +1 -0
  181. package/dist/types/tsconfig.tsbuildinfo +1 -1
  182. package/dist/types/type-schema/model.d.ts.map +1 -1
  183. package/dist/types/type-schema/settings.d.ts +20 -28
  184. package/dist/types/type-schema/settings.d.ts.map +1 -1
  185. package/package.json +6 -6
  186. package/src/dataUtils.ts +2 -2
  187. package/src/definition-generator/AclDefinitionCodeGenerator.ts +1 -1
  188. package/src/definition-generator/DefinitionCodeGenerator.ts +10 -18
  189. package/src/index.ts +1 -0
  190. package/src/schemaChecksum.ts +12 -0
  191. package/src/type-schema/model.ts +7 -1
  192. package/src/type-schema/settings.ts +1 -0
  193. package/tests/cases/unit/conditionSchema.test.ts +8 -8
  194. package/tests/cases/unit/deepCompare.test.ts +4 -4
  195. package/tests/cases/unit/laxSchemaConverter.test.ts +4 -4
  196. package/tests/cases/unit/membershipResolver.test.ts +17 -17
  197. package/tests/cases/unit/modelSchema.test.ts +88 -0
  198. package/tests/cases/unit/modelValidator.test.ts +3 -3
  199. package/tests/cases/unit/printJsvalue.test.ts +49 -61
  200. package/tests/cases/unit/schemas/acl.ts +7 -9
  201. package/tests/cases/unit/schemas/complex.ts +38 -0
  202. package/tests/cases/unit/schemas/view.ts +6 -0
  203. package/tests/cases/unit/tsDefinitionGenerator.test.ts +5 -1
  204. package/tests/cases/unit/whereSchema.test.ts +10 -10
@@ -1 +1 @@
1
- {"version":3,"file":"ActionsValidator.cjs","sources":["../../../../../packages/schema-utils/src/validation/ActionsValidator.ts"],"sourcesContent":["import { Actions, Model } from '@contember/schema'\nimport { acceptFieldVisitor } from '../model'\nimport { ErrorBuilder, ValidationError } from './errors'\nimport { assertNever } from '../utils'\nimport * as Typesafe from '@contember/typesafe'\nimport { whereSchema } from '../type-schema/where'\n\nconst manyArgsSchema = (args: {schema: Model.Schema; entity: Model.Entity}) => Typesafe.partial({\n\tlimit: Typesafe.integer,\n\toffset: Typesafe.integer,\n\torderBy: Typesafe.array(Typesafe.anyJsonObject),\n\tfilter: whereSchema(args),\n})\n\nexport class ActionsValidator {\n\tconstructor(private readonly model: Model.Schema) {}\n\n\tpublic validate(schema: Actions.Schema): ValidationError[] {\n\t\tconst errorBuilder = new ErrorBuilder([], ['actions'])\n\t\tthis.validateTriggers(schema, errorBuilder.for('triggers'))\n\t\treturn errorBuilder.errors\n\t}\n\n\tprivate validateTriggers(schema: Actions.Schema, errorBuilder: ErrorBuilder) {\n\t\tfor (const [name, def] of Object.entries(schema.triggers)) {\n\t\t\tconst triggerErrorBuilder = errorBuilder.for(name)\n\t\t\tif (name !== def.name) {\n\t\t\t\ttriggerErrorBuilder.add('ACTIONS_NAME_MISMATCH', `Trigger name ${def.name} does not match the name in a map ${name}`)\n\t\t\t}\n\t\t\tif (!schema.targets[def.target]) {\n\t\t\t\ttriggerErrorBuilder.add('ACTIONS_UNDEFINED_TRIGGER_TARGET', `Trigger target ${def.target} not found`)\n\t\t\t}\n\t\t\tthis.validateTrigger(def, triggerErrorBuilder)\n\t\t}\n\t}\n\n\n\tprivate validateTrigger(trigger: Actions.AnyTrigger, errorBuilder: ErrorBuilder): void {\n\t\tconst entity = this.model.entities[trigger.entity]\n\t\tif (!entity) {\n\t\t\terrorBuilder.add('ACTIONS_UNDEFINED_ENTITY', `Entity ${trigger.entity} not found.`)\n\t\t\treturn\n\t\t}\n\n\t\tswitch (trigger.type) {\n\t\t\tcase 'watch':\n\t\t\t\tthis.validateWatchTrigger(trigger, entity, errorBuilder)\n\t\t\t\tbreak\n\t\t\tcase 'basic':\n\t\t\t\tthis.validateBasicTrigger(trigger, entity, errorBuilder)\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tassertNever(trigger)\n\t\t}\n\t}\n\n\tprivate validateWatchTrigger(trigger: Actions.WatchTrigger, entity: Model.Entity, errorBuilder: ErrorBuilder): void {\n\t\tthis.validateSelection(trigger.watch, entity, errorBuilder.for('watch'))\n\t\tif (trigger.selection) {\n\t\t\tthis.validateSelection(trigger.selection, entity, errorBuilder.for('selection'))\n\t\t}\n\t}\n\n\tprivate validateBasicTrigger(trigger: Actions.BasicTrigger, entity: Model.Entity, errorBuilder: ErrorBuilder): void {\n\t\tif (trigger.selection) {\n\t\t\tthis.validateSelection(trigger.selection, entity, errorBuilder.for('selection'))\n\t\t}\n\n\t\tif (Array.isArray(trigger.update)) {\n\t\t\tfor (const field of trigger.update) {\n\t\t\t\tif (!entity.fields[field]) {\n\t\t\t\t\terrorBuilder.for('update').add('ACTIONS_UNDEFINED_FIELD', `Field ${field} of entity ${entity.name} not found.`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateSelection(\n\t\tselectionNode: Actions.SelectionNode,\n\t\tentity: Model.Entity,\n\t\terrorBuilder: ErrorBuilder,\n\t): void {\n\t\tfor (const part of selectionNode) {\n\t\t\tconst [field, args, selection] = Array.isArray(part) ? part : [part, {}, []]\n\t\t\tconst fieldErrorBuilder = errorBuilder.for(field)\n\t\t\tif (!entity.fields[field]) {\n\t\t\t\tfieldErrorBuilder.add('ACTIONS_UNDEFINED_FIELD', `Undefined field ${field} on entity ${entity.name}`)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tacceptFieldVisitor(this.model, entity, field, {\n\t\t\t\tvisitColumn: () => {\n\t\t\t\t\tif (selection.length) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Unexpected sub selection on a column.`)\n\t\t\t\t\t}\n\t\t\t\t\tif (Object.keys(args).length !== 0) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Unexpected args on a column.`)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitHasMany: ({ targetEntity }) => {\n\t\t\t\t\tif (selection.length === 0) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Sub-selection expected on a relation.`)\n\t\t\t\t\t}\n\t\t\t\t\tthis.validateSelection(selection, targetEntity, fieldErrorBuilder)\n\t\t\t\t\ttry {\n\t\t\t\t\t\tmanyArgsSchema({ schema: this.model, entity: targetEntity })(args)\n\t\t\t\t\t} catch (e: any) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Selection args are not valid: ` + e.message)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitHasOne: ({ targetEntity }) => {\n\t\t\t\t\tif (selection.length === 0) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Sub-selection expected on a relation.`)\n\t\t\t\t\t}\n\t\t\t\t\tthis.validateSelection(selection, targetEntity, fieldErrorBuilder)\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t}\n}\n"],"names":["Typesafe","whereSchema","ErrorBuilder","assertNever","acceptFieldVisitor"],"mappings":"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"}
1
+ {"version":3,"file":"ActionsValidator.cjs","sources":["../../../../../packages/schema-utils/src/validation/ActionsValidator.ts"],"sourcesContent":["import { Actions, Model } from '@contember/schema'\nimport { acceptFieldVisitor } from '../model'\nimport { ErrorBuilder, ValidationError } from './errors'\nimport { assertNever } from '../utils'\nimport * as Typesafe from '@contember/typesafe'\nimport { whereSchema } from '../type-schema/where'\n\nconst manyArgsSchema = (args: {schema: Model.Schema; entity: Model.Entity}) => Typesafe.partial({\n\tlimit: Typesafe.integer,\n\toffset: Typesafe.integer,\n\torderBy: Typesafe.array(Typesafe.anyJsonObject),\n\tfilter: whereSchema(args),\n})\n\nexport class ActionsValidator {\n\tconstructor(private readonly model: Model.Schema) {}\n\n\tpublic validate(schema: Actions.Schema): ValidationError[] {\n\t\tconst errorBuilder = new ErrorBuilder([], ['actions'])\n\t\tthis.validateTriggers(schema, errorBuilder.for('triggers'))\n\t\treturn errorBuilder.errors\n\t}\n\n\tprivate validateTriggers(schema: Actions.Schema, errorBuilder: ErrorBuilder) {\n\t\tfor (const [name, def] of Object.entries(schema.triggers)) {\n\t\t\tconst triggerErrorBuilder = errorBuilder.for(name)\n\t\t\tif (name !== def.name) {\n\t\t\t\ttriggerErrorBuilder.add('ACTIONS_NAME_MISMATCH', `Trigger name ${def.name} does not match the name in a map ${name}`)\n\t\t\t}\n\t\t\tif (!schema.targets[def.target]) {\n\t\t\t\ttriggerErrorBuilder.add('ACTIONS_UNDEFINED_TRIGGER_TARGET', `Trigger target ${def.target} not found`)\n\t\t\t}\n\t\t\tthis.validateTrigger(def, triggerErrorBuilder)\n\t\t}\n\t}\n\n\n\tprivate validateTrigger(trigger: Actions.AnyTrigger, errorBuilder: ErrorBuilder): void {\n\t\tconst entity = this.model.entities[trigger.entity]\n\t\tif (!entity) {\n\t\t\terrorBuilder.add('ACTIONS_UNDEFINED_ENTITY', `Entity ${trigger.entity} not found.`)\n\t\t\treturn\n\t\t}\n\n\t\tswitch (trigger.type) {\n\t\t\tcase 'watch':\n\t\t\t\tthis.validateWatchTrigger(trigger, entity, errorBuilder)\n\t\t\t\tbreak\n\t\t\tcase 'basic':\n\t\t\t\tthis.validateBasicTrigger(trigger, entity, errorBuilder)\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tassertNever(trigger)\n\t\t}\n\t}\n\n\tprivate validateWatchTrigger(trigger: Actions.WatchTrigger, entity: Model.Entity, errorBuilder: ErrorBuilder): void {\n\t\tthis.validateSelection(trigger.watch, entity, errorBuilder.for('watch'))\n\t\tif (trigger.selection) {\n\t\t\tthis.validateSelection(trigger.selection, entity, errorBuilder.for('selection'))\n\t\t}\n\t}\n\n\tprivate validateBasicTrigger(trigger: Actions.BasicTrigger, entity: Model.Entity, errorBuilder: ErrorBuilder): void {\n\t\tif (trigger.selection) {\n\t\t\tthis.validateSelection(trigger.selection, entity, errorBuilder.for('selection'))\n\t\t}\n\n\t\tif (Array.isArray(trigger.update)) {\n\t\t\tfor (const field of trigger.update) {\n\t\t\t\tif (!entity.fields[field]) {\n\t\t\t\t\terrorBuilder.for('update').add('ACTIONS_UNDEFINED_FIELD', `Field ${field} of entity ${entity.name} not found.`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateSelection(\n\t\tselectionNode: Actions.SelectionNode,\n\t\tentity: Model.Entity,\n\t\terrorBuilder: ErrorBuilder,\n\t): void {\n\t\tfor (const part of selectionNode) {\n\t\t\tconst [field, args, selection] = Array.isArray(part) ? part : [part, {}, []]\n\t\t\tconst fieldErrorBuilder = errorBuilder.for(field)\n\t\t\tif (!entity.fields[field]) {\n\t\t\t\tfieldErrorBuilder.add('ACTIONS_UNDEFINED_FIELD', `Undefined field ${field} on entity ${entity.name}`)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tacceptFieldVisitor(this.model, entity, field, {\n\t\t\t\tvisitColumn: () => {\n\t\t\t\t\tif (selection.length) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Unexpected sub selection on a column.`)\n\t\t\t\t\t}\n\t\t\t\t\tif (Object.keys(args).length !== 0) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Unexpected args on a column.`)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitHasMany: ({ targetEntity }) => {\n\t\t\t\t\tif (selection.length === 0) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Sub-selection expected on a relation.`)\n\t\t\t\t\t}\n\t\t\t\t\tthis.validateSelection(selection, targetEntity, fieldErrorBuilder)\n\t\t\t\t\ttry {\n\t\t\t\t\t\tmanyArgsSchema({ schema: this.model, entity: targetEntity })(args)\n\t\t\t\t\t} catch (e: any) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Selection args are not valid: ` + e.message)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitHasOne: ({ targetEntity }) => {\n\t\t\t\t\tif (selection.length === 0) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Sub-selection expected on a relation.`)\n\t\t\t\t\t}\n\t\t\t\t\tthis.validateSelection(selection, targetEntity, fieldErrorBuilder)\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t}\n}\n"],"names":["Typesafe","whereSchema","ErrorBuilder","assertNever","acceptFieldVisitor"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ActionsValidator.js","sources":["../../../../../packages/schema-utils/src/validation/ActionsValidator.ts"],"sourcesContent":["import { Actions, Model } from '@contember/schema'\nimport { acceptFieldVisitor } from '../model'\nimport { ErrorBuilder, ValidationError } from './errors'\nimport { assertNever } from '../utils'\nimport * as Typesafe from '@contember/typesafe'\nimport { whereSchema } from '../type-schema/where'\n\nconst manyArgsSchema = (args: {schema: Model.Schema; entity: Model.Entity}) => Typesafe.partial({\n\tlimit: Typesafe.integer,\n\toffset: Typesafe.integer,\n\torderBy: Typesafe.array(Typesafe.anyJsonObject),\n\tfilter: whereSchema(args),\n})\n\nexport class ActionsValidator {\n\tconstructor(private readonly model: Model.Schema) {}\n\n\tpublic validate(schema: Actions.Schema): ValidationError[] {\n\t\tconst errorBuilder = new ErrorBuilder([], ['actions'])\n\t\tthis.validateTriggers(schema, errorBuilder.for('triggers'))\n\t\treturn errorBuilder.errors\n\t}\n\n\tprivate validateTriggers(schema: Actions.Schema, errorBuilder: ErrorBuilder) {\n\t\tfor (const [name, def] of Object.entries(schema.triggers)) {\n\t\t\tconst triggerErrorBuilder = errorBuilder.for(name)\n\t\t\tif (name !== def.name) {\n\t\t\t\ttriggerErrorBuilder.add('ACTIONS_NAME_MISMATCH', `Trigger name ${def.name} does not match the name in a map ${name}`)\n\t\t\t}\n\t\t\tif (!schema.targets[def.target]) {\n\t\t\t\ttriggerErrorBuilder.add('ACTIONS_UNDEFINED_TRIGGER_TARGET', `Trigger target ${def.target} not found`)\n\t\t\t}\n\t\t\tthis.validateTrigger(def, triggerErrorBuilder)\n\t\t}\n\t}\n\n\n\tprivate validateTrigger(trigger: Actions.AnyTrigger, errorBuilder: ErrorBuilder): void {\n\t\tconst entity = this.model.entities[trigger.entity]\n\t\tif (!entity) {\n\t\t\terrorBuilder.add('ACTIONS_UNDEFINED_ENTITY', `Entity ${trigger.entity} not found.`)\n\t\t\treturn\n\t\t}\n\n\t\tswitch (trigger.type) {\n\t\t\tcase 'watch':\n\t\t\t\tthis.validateWatchTrigger(trigger, entity, errorBuilder)\n\t\t\t\tbreak\n\t\t\tcase 'basic':\n\t\t\t\tthis.validateBasicTrigger(trigger, entity, errorBuilder)\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tassertNever(trigger)\n\t\t}\n\t}\n\n\tprivate validateWatchTrigger(trigger: Actions.WatchTrigger, entity: Model.Entity, errorBuilder: ErrorBuilder): void {\n\t\tthis.validateSelection(trigger.watch, entity, errorBuilder.for('watch'))\n\t\tif (trigger.selection) {\n\t\t\tthis.validateSelection(trigger.selection, entity, errorBuilder.for('selection'))\n\t\t}\n\t}\n\n\tprivate validateBasicTrigger(trigger: Actions.BasicTrigger, entity: Model.Entity, errorBuilder: ErrorBuilder): void {\n\t\tif (trigger.selection) {\n\t\t\tthis.validateSelection(trigger.selection, entity, errorBuilder.for('selection'))\n\t\t}\n\n\t\tif (Array.isArray(trigger.update)) {\n\t\t\tfor (const field of trigger.update) {\n\t\t\t\tif (!entity.fields[field]) {\n\t\t\t\t\terrorBuilder.for('update').add('ACTIONS_UNDEFINED_FIELD', `Field ${field} of entity ${entity.name} not found.`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateSelection(\n\t\tselectionNode: Actions.SelectionNode,\n\t\tentity: Model.Entity,\n\t\terrorBuilder: ErrorBuilder,\n\t): void {\n\t\tfor (const part of selectionNode) {\n\t\t\tconst [field, args, selection] = Array.isArray(part) ? part : [part, {}, []]\n\t\t\tconst fieldErrorBuilder = errorBuilder.for(field)\n\t\t\tif (!entity.fields[field]) {\n\t\t\t\tfieldErrorBuilder.add('ACTIONS_UNDEFINED_FIELD', `Undefined field ${field} on entity ${entity.name}`)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tacceptFieldVisitor(this.model, entity, field, {\n\t\t\t\tvisitColumn: () => {\n\t\t\t\t\tif (selection.length) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Unexpected sub selection on a column.`)\n\t\t\t\t\t}\n\t\t\t\t\tif (Object.keys(args).length !== 0) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Unexpected args on a column.`)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitHasMany: ({ targetEntity }) => {\n\t\t\t\t\tif (selection.length === 0) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Sub-selection expected on a relation.`)\n\t\t\t\t\t}\n\t\t\t\t\tthis.validateSelection(selection, targetEntity, fieldErrorBuilder)\n\t\t\t\t\ttry {\n\t\t\t\t\t\tmanyArgsSchema({ schema: this.model, entity: targetEntity })(args)\n\t\t\t\t\t} catch (e: any) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Selection args are not valid: ` + e.message)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitHasOne: ({ targetEntity }) => {\n\t\t\t\t\tif (selection.length === 0) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Sub-selection expected on a relation.`)\n\t\t\t\t\t}\n\t\t\t\t\tthis.validateSelection(selection, targetEntity, fieldErrorBuilder)\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t}\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ActionsValidator.js","sources":["../../../../../packages/schema-utils/src/validation/ActionsValidator.ts"],"sourcesContent":["import { Actions, Model } from '@contember/schema'\nimport { acceptFieldVisitor } from '../model'\nimport { ErrorBuilder, ValidationError } from './errors'\nimport { assertNever } from '../utils'\nimport * as Typesafe from '@contember/typesafe'\nimport { whereSchema } from '../type-schema/where'\n\nconst manyArgsSchema = (args: {schema: Model.Schema; entity: Model.Entity}) => Typesafe.partial({\n\tlimit: Typesafe.integer,\n\toffset: Typesafe.integer,\n\torderBy: Typesafe.array(Typesafe.anyJsonObject),\n\tfilter: whereSchema(args),\n})\n\nexport class ActionsValidator {\n\tconstructor(private readonly model: Model.Schema) {}\n\n\tpublic validate(schema: Actions.Schema): ValidationError[] {\n\t\tconst errorBuilder = new ErrorBuilder([], ['actions'])\n\t\tthis.validateTriggers(schema, errorBuilder.for('triggers'))\n\t\treturn errorBuilder.errors\n\t}\n\n\tprivate validateTriggers(schema: Actions.Schema, errorBuilder: ErrorBuilder) {\n\t\tfor (const [name, def] of Object.entries(schema.triggers)) {\n\t\t\tconst triggerErrorBuilder = errorBuilder.for(name)\n\t\t\tif (name !== def.name) {\n\t\t\t\ttriggerErrorBuilder.add('ACTIONS_NAME_MISMATCH', `Trigger name ${def.name} does not match the name in a map ${name}`)\n\t\t\t}\n\t\t\tif (!schema.targets[def.target]) {\n\t\t\t\ttriggerErrorBuilder.add('ACTIONS_UNDEFINED_TRIGGER_TARGET', `Trigger target ${def.target} not found`)\n\t\t\t}\n\t\t\tthis.validateTrigger(def, triggerErrorBuilder)\n\t\t}\n\t}\n\n\n\tprivate validateTrigger(trigger: Actions.AnyTrigger, errorBuilder: ErrorBuilder): void {\n\t\tconst entity = this.model.entities[trigger.entity]\n\t\tif (!entity) {\n\t\t\terrorBuilder.add('ACTIONS_UNDEFINED_ENTITY', `Entity ${trigger.entity} not found.`)\n\t\t\treturn\n\t\t}\n\n\t\tswitch (trigger.type) {\n\t\t\tcase 'watch':\n\t\t\t\tthis.validateWatchTrigger(trigger, entity, errorBuilder)\n\t\t\t\tbreak\n\t\t\tcase 'basic':\n\t\t\t\tthis.validateBasicTrigger(trigger, entity, errorBuilder)\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tassertNever(trigger)\n\t\t}\n\t}\n\n\tprivate validateWatchTrigger(trigger: Actions.WatchTrigger, entity: Model.Entity, errorBuilder: ErrorBuilder): void {\n\t\tthis.validateSelection(trigger.watch, entity, errorBuilder.for('watch'))\n\t\tif (trigger.selection) {\n\t\t\tthis.validateSelection(trigger.selection, entity, errorBuilder.for('selection'))\n\t\t}\n\t}\n\n\tprivate validateBasicTrigger(trigger: Actions.BasicTrigger, entity: Model.Entity, errorBuilder: ErrorBuilder): void {\n\t\tif (trigger.selection) {\n\t\t\tthis.validateSelection(trigger.selection, entity, errorBuilder.for('selection'))\n\t\t}\n\n\t\tif (Array.isArray(trigger.update)) {\n\t\t\tfor (const field of trigger.update) {\n\t\t\t\tif (!entity.fields[field]) {\n\t\t\t\t\terrorBuilder.for('update').add('ACTIONS_UNDEFINED_FIELD', `Field ${field} of entity ${entity.name} not found.`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateSelection(\n\t\tselectionNode: Actions.SelectionNode,\n\t\tentity: Model.Entity,\n\t\terrorBuilder: ErrorBuilder,\n\t): void {\n\t\tfor (const part of selectionNode) {\n\t\t\tconst [field, args, selection] = Array.isArray(part) ? part : [part, {}, []]\n\t\t\tconst fieldErrorBuilder = errorBuilder.for(field)\n\t\t\tif (!entity.fields[field]) {\n\t\t\t\tfieldErrorBuilder.add('ACTIONS_UNDEFINED_FIELD', `Undefined field ${field} on entity ${entity.name}`)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tacceptFieldVisitor(this.model, entity, field, {\n\t\t\t\tvisitColumn: () => {\n\t\t\t\t\tif (selection.length) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Unexpected sub selection on a column.`)\n\t\t\t\t\t}\n\t\t\t\t\tif (Object.keys(args).length !== 0) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Unexpected args on a column.`)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitHasMany: ({ targetEntity }) => {\n\t\t\t\t\tif (selection.length === 0) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Sub-selection expected on a relation.`)\n\t\t\t\t\t}\n\t\t\t\t\tthis.validateSelection(selection, targetEntity, fieldErrorBuilder)\n\t\t\t\t\ttry {\n\t\t\t\t\t\tmanyArgsSchema({ schema: this.model, entity: targetEntity })(args)\n\t\t\t\t\t} catch (e: any) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Selection args are not valid: ` + e.message)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitHasOne: ({ targetEntity }) => {\n\t\t\t\t\tif (selection.length === 0) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Sub-selection expected on a relation.`)\n\t\t\t\t\t}\n\t\t\t\t\tthis.validateSelection(selection, targetEntity, fieldErrorBuilder)\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t}\n}\n"],"names":[],"mappings":"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"}
@@ -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\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 +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\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":";;;;;;;;;;;AAMO,MAAM,mBAAmB;AAAA,EAG/B,QACC,KACA,aACA,UAIuB;AACvB,UAAM,SAAsC,CAAC;AAC7C,UAAM,SAA6B,CAAC;AACpC,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,MAAA;AAED,YAAM,gBAAgB,iBAAiB,WAAW,MAAM,GAAG;AAChD,iBAAA,YAAY,WAAW,WAAW;AAC5C,YAAI,CAAC,cAAc,SAAS,IAAI,KAAK,cAAc,SAAS,IAAI,EAAE,SAAS,IAAI,aAAa,YAAY;AAChG,iBAAA;AAAA,YACN,IAAI;AAAA,cACH,WAAW;AAAA,cACX;AAAA,cACA,SAAS;AAAA,YAAA;AAAA,UAEX;AAAA,QAAA;AAAA,MACD;AAEK,YAAA,CAAC,kBAAkB,eAAe,IAAI,KAAK,wBAAwB,eAAe,YAAY,QAAQ;AACrG,aAAA,KAAK,GAAG,gBAAgB;AAC/B,aAAO,KAAK;AAAA,QACX,MAAM,WAAW;AAAA,QACjB,WAAW;AAAA,MAAA,CACX;AAAA,IAAA;AAEK,WAAA,IAAI,qBAAqB,QAAQ,MAAM;AAAA,EAAA;AAAA,EAGvC,wBAAwB,eAA8B,YAA4B,UAG5B;AAC7D,UAAM,SAAsC,CAAC;AAC7C,UAAM,kBAA8C,CAAC;AACrD,eAAW,CAAC,MAAM,QAAQ,KAAK,OAAO,QAAQ,aAAa,GAAG;AAC7D,UAAI,SAAS,SAAS,IAAI,aAAa,YAAY;AAClD,gBAAQ,SAAS,OAAO;AAAA,UACvB,KAAK;AACY,4BAAA,KAAK,EAAE,MAAM,WAAW,EAAE,IAAI,CAAC,SAAS,UAAU,EAAE,GAAG;AACvE;AAAA,UACD,KAAK;AACJ,4BAAgB,KAAK;AAAA,cACpB;AAAA,cACA,WAAW,EAAE,IAAI,SAAS,WAAW,CAAC,SAAS,QAAQ,IAAI,CAAG,EAAA;AAAA,YAAA,CAC9D;AACD;AAAA,UACD;AACiB,4BAAA,KAAK,EAAE,MAAM,WAAW,EAAE,OAAO,KAAA,GAAQ;AACzD,mBAAO,KAAK,IAAI,0BAA0B,WAAW,MAAM,mBAAgD,IAAI,CAAC;AAChH;AAAA,QAAA;AAEF;AAAA,MAAA;AAGD,YAAM,gBAAgB,WAAW,UAAU,KAAK,CAAM,OAAA,GAAG,SAAS,IAAI;AACtE,UAAI,CAAC,eAAe;AACnB,YAAI,SAAS,UAAU;AACtB,0BAAgB,KAAK,EAAE,MAAM,WAAW,SAAS,UAAU;AAAA,QAAA,OACrD;AACN,iBAAO,KAAK,IAAI,0BAA0B,WAAW,MAAM,iBAA8C,IAAI,CAAC;AAC9F,0BAAA,KAAK,EAAE,MAAM,WAAW,EAAE,OAAO,KAAA,GAAQ;AAAA,QAAA;AAE1D;AAAA,MAAA;AAGD,UAAI,SAAS,SAAS,IAAI,aAAa,QAAQ;AAC9B,wBAAA,KAAK,EAAE,MAAM,WAAW,EAAE,IAAI,cAAc,OAAO,GAAG;AAAA,MAE5D,WAAA,SAAS,SAAS,IAAI,aAAa,WAAW;AACpD,YAAA;AACG,gBAAA,aAAa,cAAc,OAAO,IAAI,CAAA,OAAM,gBAAgB,EAAE,KAAK,MAAM,EAAE,CAAC,CAAC;AACnF,0BAAgB,KAAK;AAAA,YACpB;AAAA,YACA,WAAW,WAAW,WAAW,IAAI,WAAW,CAAC,IAAI,EAAE,IAAI,WAAW;AAAA,UAAA,CACtE;AAAA,QAAA,QACM;AACP,iBAAO,KAAK,IAAI,0BAA0B,WAAW,MAAM,mBAAgD,IAAI,CAAC;AAChG,0BAAA,KAAK,EAAE,MAAM,WAAW,EAAE,OAAO,KAAA,GAAQ;AAAA,QAAA;AAAA,MAC1D,OACM;AACN,oBAAoB;AAAA,MAAA;AAAA,IACrB;AAEM,WAAA,CAAC,QAAQ,eAAe;AAAA,EAAA;AAEjC;AAjGC,cADY,oBACE,mBAAkB,EAAE,YAAY,uCAAuC,CAAA;AAmG/E,MAAM,qBAAqB;AAAA,EACjC,YACiB,QACA,aACf;AAFe,SAAA,SAAA;AACA,SAAA,cAAA;AAAA,EAAA;AAGlB;AAEO,MAAM,0BAA0B;AAAA,EACtC,YACiB,MACA,OACA,UACf;AAHe,SAAA,OAAA;AACA,SAAA,QAAA;AACA,SAAA,WAAA;AAAA,EAAA;AAGlB;AAEY,IAAA,kDAAAA,mCAAL;AACNA,iCAAA,gBAAiB,IAAA;AACjBA,iCAAA,oBAAqB,IAAA;AACrBA,iCAAA,gBAAiB,IAAA;AACjBA,iCAAA,kBAAmB,IAAA;AAJRA,SAAAA;AAAA,GAAA,iCAAA,CAAA,CAAA;"}
@@ -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, 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.unique,\n\t\t\tnew Set(Object.keys(entity.fields)),\n\t\t\terrors.for('unique'),\n\t\t)\n\t\tthis.validateColumnNamesCollision(entity, errors)\n\t}\n\n\tprivate validateUniqueConstraints(uniqueConstraints: Model.Entity['unique'], fields: Set<string>, errors: ErrorBuilder): void {\n\t\tfor (const constraint of uniqueConstraints) {\n\t\t\tfor (const field of constraint.fields) {\n\t\t\t\tif (!fields.has(field)) {\n\t\t\t\t\terrors.add('MODEL_UNDEFINED_FIELD', `Referenced field ${field} in a constraint does not exists`)\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 (targetEntity.view) {\n\t\t\t\tif ('joiningColumn' in field) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_VIEW_USAGE', `View entity ${targetEntity.name} cannot be referenced from an owning relation. Try switching the owning side.`)\n\t\t\t\t}\n\t\t\t}\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","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, 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.unique,\n\t\t\tnew Set(Object.keys(entity.fields)),\n\t\t\terrors.for('unique'),\n\t\t)\n\t\tthis.validateColumnNamesCollision(entity, errors)\n\t}\n\n\tprivate validateUniqueConstraints(uniqueConstraints: Model.Entity['unique'], fields: Set<string>, errors: ErrorBuilder): void {\n\t\tfor (const constraint of uniqueConstraints) {\n\t\t\tfor (const field of constraint.fields) {\n\t\t\t\tif (!fields.has(field)) {\n\t\t\t\t\terrors.add('MODEL_UNDEFINED_FIELD', `Referenced field ${field} in a constraint does not exists`)\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 (targetEntity.view) {\n\t\t\t\tif ('joiningColumn' in field) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_VIEW_USAGE', `View entity ${targetEntity.name} cannot be referenced from an owning relation. Try switching the owning side.`)\n\t\t\t\t}\n\t\t\t}\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","acceptEveryFieldVisitor","targetEntity","getTargetEntity","Model","isInverseRelation","isOwningRelation","entity"],"mappings":"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"}
@@ -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, 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.unique,\n\t\t\tnew Set(Object.keys(entity.fields)),\n\t\t\terrors.for('unique'),\n\t\t)\n\t\tthis.validateColumnNamesCollision(entity, errors)\n\t}\n\n\tprivate validateUniqueConstraints(uniqueConstraints: Model.Entity['unique'], fields: Set<string>, errors: ErrorBuilder): void {\n\t\tfor (const constraint of uniqueConstraints) {\n\t\t\tfor (const field of constraint.fields) {\n\t\t\t\tif (!fields.has(field)) {\n\t\t\t\t\terrors.add('MODEL_UNDEFINED_FIELD', `Referenced field ${field} in a constraint does not exists`)\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 (targetEntity.view) {\n\t\t\t\tif ('joiningColumn' in field) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_VIEW_USAGE', `View entity ${targetEntity.name} cannot be referenced from an owning relation. Try switching the owning side.`)\n\t\t\t\t}\n\t\t\t}\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, 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.unique,\n\t\t\tnew Set(Object.keys(entity.fields)),\n\t\t\terrors.for('unique'),\n\t\t)\n\t\tthis.validateColumnNamesCollision(entity, errors)\n\t}\n\n\tprivate validateUniqueConstraints(uniqueConstraints: Model.Entity['unique'], fields: Set<string>, errors: ErrorBuilder): void {\n\t\tfor (const constraint of uniqueConstraints) {\n\t\t\tfor (const field of constraint.fields) {\n\t\t\t\tif (!fields.has(field)) {\n\t\t\t\t\terrors.add('MODEL_UNDEFINED_FIELD', `Referenced field ${field} in a constraint does not exists`)\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 (targetEntity.view) {\n\t\t\t\tif ('joiningColumn' in field) {\n\t\t\t\t\treturn errors.add('MODEL_INVALID_VIEW_USAGE', `View entity ${targetEntity.name} cannot be referenced from an owning relation. Try switching the owning side.`)\n\t\t\t\t}\n\t\t\t}\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 +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,eAAAA,eAAe,OAAO,KAAK;AAChD,UAAA,cAAc,eAAe;AAEnC,UAAM,eAAe,IAAIC,aAAAA,aAAa,OAAO,KAAK;AAClD,UAAM,YAAY,aAAa,SAAS,OAAO,GAAG;AAGlD,UAAM,sBAAsB,IAAIC,oBAAAA,oBAAoB,OAAO,KAAK;AAChE,UAAM,mBAAmB,oBAAoB,SAAS,OAAO,UAAU;AAEvE,UAAM,mBAAmB,IAAIC,iBAAAA,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,IACR;AACA,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,MAChD;AAAA,IAAA;AAAA,EAEF;AACD;;"}
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 +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;AAEnC,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,IACR;AACA,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,MAChD;AAAA,IAAA;AAAA,EAEF;AACD;"}
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 +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\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\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":"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"}
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\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\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":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ValidationValidator.js","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\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\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":[],"mappings":"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"}
1
+ {"version":3,"file":"ValidationValidator.js","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\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\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":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"errors.cjs","sources":["../../../../../packages/schema-utils/src/validation/errors.ts"],"sourcesContent":["export type ValidationErrorCode =\n\t| 'MODEL_NAME_MISMATCH'\n\t| 'MODEL_UNDEFINED_FIELD'\n\t| 'MODEL_UNDEFINED_ENTITY'\n\t| 'MODEL_RELATION_REQUIRED'\n\t| 'MODEL_INVALID_RELATION_DEFINITION'\n\t| 'MODEL_INVALID_COLUMN_DEFINITION'\n\t| 'MODEL_INVALID_VIEW_USAGE'\n\t| 'MODEL_INVALID_IDENTIFIER'\n\t| 'MODEL_INVALID_ENTITY_NAME'\n\t| 'MODEL_NAME_COLLISION'\n\n\t| 'ACL_INVALID_CONDITION'\n\t| 'ACL_UNDEFINED_VARIABLE'\n\t| 'ACL_UNDEFINED_FIELD'\n\t| 'ACL_UNDEFINED_PREDICATE'\n\t| 'ACL_UNDEFINED_ROLE'\n\t| 'ACL_UNDEFINED_ENTITY'\n\n\t| 'ACTIONS_NAME_MISMATCH'\n\t| 'ACTIONS_INVALID_CONDITION'\n\t| 'ACTIONS_UNDEFINED_FIELD'\n\t| 'ACTIONS_UNDEFINED_ENTITY'\n\t| 'ACTIONS_UNDEFINED_TRIGGER_TARGET'\n\t| 'ACTIONS_INVALID_SELECTION'\n\n\t| 'VALIDATION_UNDEFINED_ENTITY'\n\t| 'VALIDATION_UNDEFINED_FIELD'\n\t| 'VALIDATION_NOT_IMPLEMENTED'\n\nexport interface ValidationError {\n\tpath: (string | number)[]\n\tmessage: string\n\tcode: ValidationErrorCode\n}\n\nexport class ErrorBuilder {\n\tconstructor(public readonly errors: ValidationError[], private readonly path: string[] = []) {}\n\n\tfor(...path: string[]): ErrorBuilder {\n\t\treturn new ErrorBuilder(this.errors, [...this.path, ...path])\n\t}\n\n\tadd(code: ValidationErrorCode, message: string): void {\n\t\tthis.errors.push({ path: this.path, message, code })\n\t}\n}\n"],"names":[],"mappings":";;AAoCO,MAAM,aAAa;AAAA,EACzB,YAA4B,QAA4C,OAAiB,IAAI;AAAjE,SAAA,SAAA;AAA4C,SAAA,OAAA;AAAA,EAAsB;AAAA,EAE9F,OAAO,MAA8B;AAC7B,WAAA,IAAI,aAAa,KAAK,QAAQ,CAAC,GAAG,KAAK,MAAM,GAAG,IAAI,CAAC;AAAA,EAC7D;AAAA,EAEA,IAAI,MAA2B,SAAuB;AAChD,SAAA,OAAO,KAAK,EAAE,MAAM,KAAK,MAAM,SAAS,MAAM;AAAA,EACpD;AACD;;"}
1
+ {"version":3,"file":"errors.cjs","sources":["../../../../../packages/schema-utils/src/validation/errors.ts"],"sourcesContent":["export type ValidationErrorCode =\n\t| 'MODEL_NAME_MISMATCH'\n\t| 'MODEL_UNDEFINED_FIELD'\n\t| 'MODEL_UNDEFINED_ENTITY'\n\t| 'MODEL_RELATION_REQUIRED'\n\t| 'MODEL_INVALID_RELATION_DEFINITION'\n\t| 'MODEL_INVALID_COLUMN_DEFINITION'\n\t| 'MODEL_INVALID_VIEW_USAGE'\n\t| 'MODEL_INVALID_IDENTIFIER'\n\t| 'MODEL_INVALID_ENTITY_NAME'\n\t| 'MODEL_NAME_COLLISION'\n\n\t| 'ACL_INVALID_CONDITION'\n\t| 'ACL_UNDEFINED_VARIABLE'\n\t| 'ACL_UNDEFINED_FIELD'\n\t| 'ACL_UNDEFINED_PREDICATE'\n\t| 'ACL_UNDEFINED_ROLE'\n\t| 'ACL_UNDEFINED_ENTITY'\n\n\t| 'ACTIONS_NAME_MISMATCH'\n\t| 'ACTIONS_INVALID_CONDITION'\n\t| 'ACTIONS_UNDEFINED_FIELD'\n\t| 'ACTIONS_UNDEFINED_ENTITY'\n\t| 'ACTIONS_UNDEFINED_TRIGGER_TARGET'\n\t| 'ACTIONS_INVALID_SELECTION'\n\n\t| 'VALIDATION_UNDEFINED_ENTITY'\n\t| 'VALIDATION_UNDEFINED_FIELD'\n\t| 'VALIDATION_NOT_IMPLEMENTED'\n\nexport interface ValidationError {\n\tpath: (string | number)[]\n\tmessage: string\n\tcode: ValidationErrorCode\n}\n\nexport class ErrorBuilder {\n\tconstructor(public readonly errors: ValidationError[], private readonly path: string[] = []) {}\n\n\tfor(...path: string[]): ErrorBuilder {\n\t\treturn new ErrorBuilder(this.errors, [...this.path, ...path])\n\t}\n\n\tadd(code: ValidationErrorCode, message: string): void {\n\t\tthis.errors.push({ path: this.path, message, code })\n\t}\n}\n"],"names":[],"mappings":";;AAoCO,MAAM,aAAa;AAAA,EACzB,YAA4B,QAA4C,OAAiB,IAAI;AAAjE,SAAA,SAAA;AAA4C,SAAA,OAAA;AAAA,EAAA;AAAA,EAExE,OAAO,MAA8B;AAC7B,WAAA,IAAI,aAAa,KAAK,QAAQ,CAAC,GAAG,KAAK,MAAM,GAAG,IAAI,CAAC;AAAA,EAAA;AAAA,EAG7D,IAAI,MAA2B,SAAuB;AAChD,SAAA,OAAO,KAAK,EAAE,MAAM,KAAK,MAAM,SAAS,MAAM;AAAA,EAAA;AAErD;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sources":["../../../../../packages/schema-utils/src/validation/errors.ts"],"sourcesContent":["export type ValidationErrorCode =\n\t| 'MODEL_NAME_MISMATCH'\n\t| 'MODEL_UNDEFINED_FIELD'\n\t| 'MODEL_UNDEFINED_ENTITY'\n\t| 'MODEL_RELATION_REQUIRED'\n\t| 'MODEL_INVALID_RELATION_DEFINITION'\n\t| 'MODEL_INVALID_COLUMN_DEFINITION'\n\t| 'MODEL_INVALID_VIEW_USAGE'\n\t| 'MODEL_INVALID_IDENTIFIER'\n\t| 'MODEL_INVALID_ENTITY_NAME'\n\t| 'MODEL_NAME_COLLISION'\n\n\t| 'ACL_INVALID_CONDITION'\n\t| 'ACL_UNDEFINED_VARIABLE'\n\t| 'ACL_UNDEFINED_FIELD'\n\t| 'ACL_UNDEFINED_PREDICATE'\n\t| 'ACL_UNDEFINED_ROLE'\n\t| 'ACL_UNDEFINED_ENTITY'\n\n\t| 'ACTIONS_NAME_MISMATCH'\n\t| 'ACTIONS_INVALID_CONDITION'\n\t| 'ACTIONS_UNDEFINED_FIELD'\n\t| 'ACTIONS_UNDEFINED_ENTITY'\n\t| 'ACTIONS_UNDEFINED_TRIGGER_TARGET'\n\t| 'ACTIONS_INVALID_SELECTION'\n\n\t| 'VALIDATION_UNDEFINED_ENTITY'\n\t| 'VALIDATION_UNDEFINED_FIELD'\n\t| 'VALIDATION_NOT_IMPLEMENTED'\n\nexport interface ValidationError {\n\tpath: (string | number)[]\n\tmessage: string\n\tcode: ValidationErrorCode\n}\n\nexport class ErrorBuilder {\n\tconstructor(public readonly errors: ValidationError[], private readonly path: string[] = []) {}\n\n\tfor(...path: string[]): ErrorBuilder {\n\t\treturn new ErrorBuilder(this.errors, [...this.path, ...path])\n\t}\n\n\tadd(code: ValidationErrorCode, message: string): void {\n\t\tthis.errors.push({ path: this.path, message, code })\n\t}\n}\n"],"names":[],"mappings":"AAoCO,MAAM,aAAa;AAAA,EACzB,YAA4B,QAA4C,OAAiB,IAAI;AAAjE,SAAA,SAAA;AAA4C,SAAA,OAAA;AAAA,EAAsB;AAAA,EAE9F,OAAO,MAA8B;AAC7B,WAAA,IAAI,aAAa,KAAK,QAAQ,CAAC,GAAG,KAAK,MAAM,GAAG,IAAI,CAAC;AAAA,EAC7D;AAAA,EAEA,IAAI,MAA2B,SAAuB;AAChD,SAAA,OAAO,KAAK,EAAE,MAAM,KAAK,MAAM,SAAS,MAAM;AAAA,EACpD;AACD;"}
1
+ {"version":3,"file":"errors.js","sources":["../../../../../packages/schema-utils/src/validation/errors.ts"],"sourcesContent":["export type ValidationErrorCode =\n\t| 'MODEL_NAME_MISMATCH'\n\t| 'MODEL_UNDEFINED_FIELD'\n\t| 'MODEL_UNDEFINED_ENTITY'\n\t| 'MODEL_RELATION_REQUIRED'\n\t| 'MODEL_INVALID_RELATION_DEFINITION'\n\t| 'MODEL_INVALID_COLUMN_DEFINITION'\n\t| 'MODEL_INVALID_VIEW_USAGE'\n\t| 'MODEL_INVALID_IDENTIFIER'\n\t| 'MODEL_INVALID_ENTITY_NAME'\n\t| 'MODEL_NAME_COLLISION'\n\n\t| 'ACL_INVALID_CONDITION'\n\t| 'ACL_UNDEFINED_VARIABLE'\n\t| 'ACL_UNDEFINED_FIELD'\n\t| 'ACL_UNDEFINED_PREDICATE'\n\t| 'ACL_UNDEFINED_ROLE'\n\t| 'ACL_UNDEFINED_ENTITY'\n\n\t| 'ACTIONS_NAME_MISMATCH'\n\t| 'ACTIONS_INVALID_CONDITION'\n\t| 'ACTIONS_UNDEFINED_FIELD'\n\t| 'ACTIONS_UNDEFINED_ENTITY'\n\t| 'ACTIONS_UNDEFINED_TRIGGER_TARGET'\n\t| 'ACTIONS_INVALID_SELECTION'\n\n\t| 'VALIDATION_UNDEFINED_ENTITY'\n\t| 'VALIDATION_UNDEFINED_FIELD'\n\t| 'VALIDATION_NOT_IMPLEMENTED'\n\nexport interface ValidationError {\n\tpath: (string | number)[]\n\tmessage: string\n\tcode: ValidationErrorCode\n}\n\nexport class ErrorBuilder {\n\tconstructor(public readonly errors: ValidationError[], private readonly path: string[] = []) {}\n\n\tfor(...path: string[]): ErrorBuilder {\n\t\treturn new ErrorBuilder(this.errors, [...this.path, ...path])\n\t}\n\n\tadd(code: ValidationErrorCode, message: string): void {\n\t\tthis.errors.push({ path: this.path, message, code })\n\t}\n}\n"],"names":[],"mappings":"AAoCO,MAAM,aAAa;AAAA,EACzB,YAA4B,QAA4C,OAAiB,IAAI;AAAjE,SAAA,SAAA;AAA4C,SAAA,OAAA;AAAA,EAAA;AAAA,EAExE,OAAO,MAA8B;AAC7B,WAAA,IAAI,aAAa,KAAK,QAAQ,CAAC,GAAG,KAAK,MAAM,GAAG,IAAI,CAAC;AAAA,EAAA;AAAA,EAG7D,IAAI,MAA2B,SAAuB;AAChD,SAAA,OAAO,KAAK,EAAE,MAAM,KAAK,MAAM,SAAS,MAAM;AAAA,EAAA;AAErD;"}
@@ -28,6 +28,7 @@ const SchemaValidator = require("./src/validation/SchemaValidator.cjs");
28
28
  const MembershipResolver = require("./src/validation/MembershipResolver.cjs");
29
29
  const schemaNormalizer = require("./src/schemaNormalizer.cjs");
30
30
  const schemaFilter = require("./src/schemaFilter.cjs");
31
+ const schemaChecksum = require("./src/schemaChecksum.cjs");
31
32
  const deepCompare = require("./src/utils/deepCompare.cjs");
32
33
  function _interopNamespaceDefault(e) {
33
34
  const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
@@ -102,6 +103,7 @@ exports.MembershipValidationError = MembershipResolver.MembershipValidationError
102
103
  exports.MembershipValidationErrorType = MembershipResolver.MembershipValidationErrorType;
103
104
  exports.normalizeSchema = schemaNormalizer.normalizeSchema;
104
105
  exports.filterSchemaByStage = schemaFilter.filterSchemaByStage;
106
+ exports.calculateSchemaChecksum = schemaChecksum.calculateSchemaChecksum;
105
107
  exports.compareArraysIgnoreOrder = deepCompare.compareArraysIgnoreOrder;
106
108
  exports.deepCompare = deepCompare.deepCompare;
107
109
  exports.emptySchema = emptySchema;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../packages/schema-utils/src/index.ts"],"sourcesContent":["import { Schema } from '@contember/schema'\nimport { emptyModelSchema } from './model'\nimport * as Typesafe from '@contember/typesafe'\nimport { aclSchema, modelSchema, validationSchema, settingsSchema } from './type-schema'\nimport { actionsSchema } from './type-schema/actions'\n\nexport * from './definition-generator'\nexport * from './lax'\nexport * from './model'\nexport * from './acl'\nexport * from './dataUtils'\nexport * from './validation'\nexport * from './schemaNormalizer'\nexport * from './schemaFilter'\nexport { deepCompare, compareArraysIgnoreOrder } from './utils'\n\nexport const emptySchema: Schema = {\n\tmodel: emptyModelSchema,\n\tacl: { roles: {} },\n\tvalidation: {},\n\tactions: { triggers: {}, targets: {} },\n\tsettings: {},\n}\n\nexport const schemaType: Typesafe.Type<Schema> = Typesafe.object({\n\tmodel: modelSchema,\n\tacl: aclSchema,\n\tvalidation: validationSchema,\n\tactions: Typesafe.coalesce(actionsSchema, { triggers: {}, targets: {} }),\n\tsettings: Typesafe.coalesce(settingsSchema, {}),\n})\n"],"names":["emptyModelSchema","Typesafe","modelSchema","aclSchema","validationSchema","actionsSchema","settingsSchema"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBO,MAAM,cAAsB;AAAA,EAClC,OAAOA,WAAA;AAAA,EACP,KAAK,EAAE,OAAO,GAAG;AAAA,EACjB,YAAY,CAAC;AAAA,EACb,SAAS,EAAE,UAAU,IAAI,SAAS,CAAA,EAAG;AAAA,EACrC,UAAU,CAAC;AACZ;AAEa,MAAA,aAAoCC,oBAAS,OAAO;AAAA,EAChE,OAAOC,MAAA;AAAA,EACP,KAAKC,IAAA;AAAA,EACL,YAAYC,WAAA;AAAA,EACZ,SAASH,oBAAS,SAASI,QAAe,eAAA,EAAE,UAAU,CAAI,GAAA,SAAS,CAAA,GAAI;AAAA,EACvE,UAAUJ,oBAAS,SAASK,SAAAA,gBAAgB,CAAA,CAAE;AAC/C,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../packages/schema-utils/src/index.ts"],"sourcesContent":["import { Schema } from '@contember/schema'\nimport { emptyModelSchema } from './model'\nimport * as Typesafe from '@contember/typesafe'\nimport { aclSchema, modelSchema, validationSchema, settingsSchema } from './type-schema'\nimport { actionsSchema } from './type-schema/actions'\n\nexport * from './definition-generator'\nexport * from './lax'\nexport * from './model'\nexport * from './acl'\nexport * from './dataUtils'\nexport * from './validation'\nexport * from './schemaNormalizer'\nexport * from './schemaFilter'\nexport * from './schemaChecksum'\nexport { deepCompare, compareArraysIgnoreOrder } from './utils'\n\nexport const emptySchema: Schema = {\n\tmodel: emptyModelSchema,\n\tacl: { roles: {} },\n\tvalidation: {},\n\tactions: { triggers: {}, targets: {} },\n\tsettings: {},\n}\n\nexport const schemaType: Typesafe.Type<Schema> = Typesafe.object({\n\tmodel: modelSchema,\n\tacl: aclSchema,\n\tvalidation: validationSchema,\n\tactions: Typesafe.coalesce(actionsSchema, { triggers: {}, targets: {} }),\n\tsettings: Typesafe.coalesce(settingsSchema, {}),\n})\n"],"names":["emptyModelSchema","Typesafe","modelSchema","aclSchema","validationSchema","actionsSchema","settingsSchema"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBO,MAAM,cAAsB;AAAA,EAClC,OAAOA,WAAA;AAAA,EACP,KAAK,EAAE,OAAO,GAAG;AAAA,EACjB,YAAY,CAAC;AAAA,EACb,SAAS,EAAE,UAAU,IAAI,SAAS,CAAA,EAAG;AAAA,EACrC,UAAU,CAAA;AACX;AAEa,MAAA,aAAoCC,oBAAS,OAAO;AAAA,EAChE,OAAOC,MAAA;AAAA,EACP,KAAKC,IAAA;AAAA,EACL,YAAYC,WAAA;AAAA,EACZ,SAASH,oBAAS,SAASI,QAAe,eAAA,EAAE,UAAU,CAAI,GAAA,SAAS,CAAA,GAAI;AAAA,EACvE,UAAUJ,oBAAS,SAASK,SAAAA,gBAAgB,CAAE,CAAA;AAC/C,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}