@contember/engine-content-api 1.1.2 → 1.2.0-alpha.11

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 (352) hide show
  1. package/dist/src/acl/EvaluatedPredicateReplacer.d.ts +9 -0
  2. package/dist/src/acl/EvaluatedPredicateReplacer.d.ts.map +1 -0
  3. package/dist/src/acl/EvaluatedPredicateReplacer.js +31 -0
  4. package/dist/src/acl/EvaluatedPredicateReplacer.js.map +1 -0
  5. package/dist/src/acl/PermissionFactory.d.ts.map +1 -1
  6. package/dist/src/acl/PermissionFactory.js +15 -11
  7. package/dist/src/acl/PermissionFactory.js.map +1 -1
  8. package/dist/src/acl/PredicateFactory.d.ts +4 -2
  9. package/dist/src/acl/PredicateFactory.d.ts.map +1 -1
  10. package/dist/src/acl/PredicateFactory.js +17 -6
  11. package/dist/src/acl/PredicateFactory.js.map +1 -1
  12. package/dist/src/acl/PredicatesInjector.d.ts +1 -1
  13. package/dist/src/acl/PredicatesInjector.d.ts.map +1 -1
  14. package/dist/src/acl/PredicatesInjector.js +16 -19
  15. package/dist/src/acl/PredicatesInjector.js.map +1 -1
  16. package/dist/src/acl/VariableInjector.d.ts +0 -1
  17. package/dist/src/acl/VariableInjector.d.ts.map +1 -1
  18. package/dist/src/acl/VariableInjector.js +4 -14
  19. package/dist/src/acl/VariableInjector.js.map +1 -1
  20. package/dist/src/acl/VariableUtils.d.ts +2 -13
  21. package/dist/src/acl/VariableUtils.d.ts.map +1 -1
  22. package/dist/src/acl/VariableUtils.js +5 -16
  23. package/dist/src/acl/VariableUtils.js.map +1 -1
  24. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.d.ts +0 -1
  25. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.d.ts.map +1 -1
  26. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.js +14 -15
  27. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.js.map +1 -1
  28. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.d.ts +1 -1
  29. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.d.ts.map +1 -1
  30. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.js +1 -1
  31. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.js.map +1 -1
  32. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.d.ts +5 -4
  33. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.d.ts.map +1 -1
  34. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.js +29 -20
  35. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.js.map +1 -1
  36. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.d.ts.map +1 -1
  37. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.js +2 -2
  38. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.js.map +1 -1
  39. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.d.ts +3 -3
  40. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.d.ts.map +1 -1
  41. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.js +3 -3
  42. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.js.map +1 -1
  43. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.d.ts +5 -4
  44. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.d.ts.map +1 -1
  45. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.js +29 -20
  46. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.js.map +1 -1
  47. package/dist/src/input-validation/ColumnValueResolver.d.ts +4 -3
  48. package/dist/src/input-validation/ColumnValueResolver.d.ts.map +1 -1
  49. package/dist/src/input-validation/ColumnValueResolver.js.map +1 -1
  50. package/dist/src/input-validation/EntityRulesResolver.js +4 -4
  51. package/dist/src/input-validation/EntityRulesResolver.js.map +1 -1
  52. package/dist/src/input-validation/QueryAstFactory.js +1 -1
  53. package/dist/src/input-validation/QueryAstFactory.js.map +1 -1
  54. package/dist/src/input-validation/ValidationContext.d.ts +2 -2
  55. package/dist/src/input-validation/ValidationContext.d.ts.map +1 -1
  56. package/dist/src/input-validation/ValidationContext.js.map +1 -1
  57. package/dist/src/input-validation/ValidationDataSelector.d.ts.map +1 -1
  58. package/dist/src/input-validation/ValidationDataSelector.js +1 -1
  59. package/dist/src/input-validation/ValidationDataSelector.js.map +1 -1
  60. package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.d.ts +7 -8
  61. package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.d.ts.map +1 -1
  62. package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.js.map +1 -1
  63. package/dist/src/input-validation/preValidation/InputPreValidator.js +4 -4
  64. package/dist/src/input-validation/preValidation/InputPreValidator.js.map +1 -1
  65. package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.d.ts +7 -8
  66. package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.d.ts.map +1 -1
  67. package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.js.map +1 -1
  68. package/dist/src/inputProcessing/CreateInputProcessor.d.ts +8 -9
  69. package/dist/src/inputProcessing/CreateInputProcessor.d.ts.map +1 -1
  70. package/dist/src/inputProcessing/CreateInputVisitor.d.ts +7 -7
  71. package/dist/src/inputProcessing/CreateInputVisitor.d.ts.map +1 -1
  72. package/dist/src/inputProcessing/CreateInputVisitor.js +15 -46
  73. package/dist/src/inputProcessing/CreateInputVisitor.js.map +1 -1
  74. package/dist/src/inputProcessing/UpdateInputProcessor.d.ts +8 -9
  75. package/dist/src/inputProcessing/UpdateInputProcessor.d.ts.map +1 -1
  76. package/dist/src/inputProcessing/UpdateInputVisitor.d.ts +7 -7
  77. package/dist/src/inputProcessing/UpdateInputVisitor.d.ts.map +1 -1
  78. package/dist/src/inputProcessing/UpdateInputVisitor.js +13 -28
  79. package/dist/src/inputProcessing/UpdateInputVisitor.js.map +1 -1
  80. package/dist/src/inputProcessing/index.d.ts +0 -1
  81. package/dist/src/inputProcessing/index.d.ts.map +1 -1
  82. package/dist/src/inputProcessing/index.js +0 -1
  83. package/dist/src/inputProcessing/index.js.map +1 -1
  84. package/dist/src/introspection/IntrospectionSchemaFactory.js +7 -7
  85. package/dist/src/introspection/IntrospectionSchemaFactory.js.map +1 -1
  86. package/dist/src/introspection/content-schema.types.d.ts +19 -223
  87. package/dist/src/introspection/content-schema.types.d.ts.map +1 -1
  88. package/dist/src/introspection/content-schema.types.js +2 -2
  89. package/dist/src/introspection/content-schema.types.js.map +1 -1
  90. package/dist/src/mapper/Mapper.d.ts +6 -6
  91. package/dist/src/mapper/Mapper.d.ts.map +1 -1
  92. package/dist/src/mapper/Mapper.js +28 -23
  93. package/dist/src/mapper/Mapper.js.map +1 -1
  94. package/dist/src/mapper/MapperContainer.d.ts.map +1 -1
  95. package/dist/src/mapper/MapperContainer.js +7 -4
  96. package/dist/src/mapper/MapperContainer.js.map +1 -1
  97. package/dist/src/mapper/delete/DeleteExecutor.js +3 -3
  98. package/dist/src/mapper/delete/DeleteExecutor.js.map +1 -1
  99. package/dist/src/mapper/insert/SqlCreateInputProcessor.d.ts +4 -2
  100. package/dist/src/mapper/insert/SqlCreateInputProcessor.d.ts.map +1 -1
  101. package/dist/src/mapper/insert/SqlCreateInputProcessor.js.map +1 -1
  102. package/dist/src/mapper/select/JoinVisitor.d.ts +6 -6
  103. package/dist/src/mapper/select/JoinVisitor.d.ts.map +1 -1
  104. package/dist/src/mapper/select/JoinVisitor.js +6 -6
  105. package/dist/src/mapper/select/JoinVisitor.js.map +1 -1
  106. package/dist/src/mapper/select/RelationFetcher.d.ts +32 -5
  107. package/dist/src/mapper/select/RelationFetcher.d.ts.map +1 -1
  108. package/dist/src/mapper/select/RelationFetcher.js +37 -15
  109. package/dist/src/mapper/select/RelationFetcher.js.map +1 -1
  110. package/dist/src/mapper/select/SelectBuilder.d.ts +2 -1
  111. package/dist/src/mapper/select/SelectBuilder.d.ts.map +1 -1
  112. package/dist/src/mapper/select/SelectBuilder.js +4 -2
  113. package/dist/src/mapper/select/SelectBuilder.js.map +1 -1
  114. package/dist/src/mapper/select/SelectBuilderFactory.d.ts +2 -1
  115. package/dist/src/mapper/select/SelectBuilderFactory.d.ts.map +1 -1
  116. package/dist/src/mapper/select/SelectExecutionHandler.d.ts +1 -0
  117. package/dist/src/mapper/select/SelectExecutionHandler.d.ts.map +1 -1
  118. package/dist/src/mapper/select/WhereBuilder.d.ts +6 -3
  119. package/dist/src/mapper/select/WhereBuilder.d.ts.map +1 -1
  120. package/dist/src/mapper/select/WhereBuilder.js +31 -24
  121. package/dist/src/mapper/select/WhereBuilder.js.map +1 -1
  122. package/dist/src/mapper/select/handlers/FieldsVisitor.d.ts +9 -8
  123. package/dist/src/mapper/select/handlers/FieldsVisitor.d.ts.map +1 -1
  124. package/dist/src/mapper/select/handlers/FieldsVisitor.js +45 -24
  125. package/dist/src/mapper/select/handlers/FieldsVisitor.js.map +1 -1
  126. package/dist/src/mapper/select/handlers/FieldsVisitorFactory.d.ts.map +1 -1
  127. package/dist/src/mapper/select/handlers/FieldsVisitorFactory.js +1 -1
  128. package/dist/src/mapper/select/handlers/FieldsVisitorFactory.js.map +1 -1
  129. package/dist/src/mapper/select/optimizer/ConditionOptimizer.d.ts +5 -0
  130. package/dist/src/mapper/select/optimizer/ConditionOptimizer.d.ts.map +1 -0
  131. package/dist/src/mapper/select/optimizer/ConditionOptimizer.js +39 -0
  132. package/dist/src/mapper/select/optimizer/ConditionOptimizer.js.map +1 -0
  133. package/dist/src/mapper/select/optimizer/WhereOptimizer.d.ts +15 -0
  134. package/dist/src/mapper/select/optimizer/WhereOptimizer.d.ts.map +1 -0
  135. package/dist/src/mapper/select/optimizer/WhereOptimizer.js +118 -0
  136. package/dist/src/mapper/select/optimizer/WhereOptimizer.js.map +1 -0
  137. package/dist/src/mapper/select/optimizer/WhereReplacer.d.ts +6 -0
  138. package/dist/src/mapper/select/optimizer/WhereReplacer.d.ts.map +1 -0
  139. package/dist/src/mapper/select/optimizer/WhereReplacer.js +28 -0
  140. package/dist/src/mapper/select/optimizer/WhereReplacer.js.map +1 -0
  141. package/dist/src/mapper/select/optimizer/helpers.d.ts +10 -0
  142. package/dist/src/mapper/select/optimizer/helpers.d.ts.map +1 -0
  143. package/dist/src/mapper/select/optimizer/helpers.js +72 -0
  144. package/dist/src/mapper/select/optimizer/helpers.js.map +1 -0
  145. package/dist/src/mapper/update/SqlUpdateInputProcessor.d.ts +2 -3
  146. package/dist/src/mapper/update/SqlUpdateInputProcessor.d.ts.map +1 -1
  147. package/dist/src/mapper/update/SqlUpdateInputProcessor.js.map +1 -1
  148. package/dist/src/mapper/update/UpdateBuilder.js +3 -3
  149. package/dist/src/mapper/update/UpdateBuilder.js.map +1 -1
  150. package/dist/src/resolvers/GraphQlQueryAstFactory.js +2 -2
  151. package/dist/src/resolvers/GraphQlQueryAstFactory.js.map +1 -1
  152. package/dist/src/resolvers/MutationResolver.js +15 -15
  153. package/dist/src/resolvers/MutationResolver.js.map +1 -1
  154. package/dist/src/resolvers/ReadHelpers.js +10 -10
  155. package/dist/src/resolvers/ReadHelpers.js.map +1 -1
  156. package/dist/src/resolvers/ReadResolver.js +2 -2
  157. package/dist/src/resolvers/ReadResolver.js.map +1 -1
  158. package/dist/src/schema/FieldAccessVisitor.d.ts +2 -2
  159. package/dist/src/schema/FieldAccessVisitor.d.ts.map +1 -1
  160. package/dist/src/schema/FieldAccessVisitor.js +2 -2
  161. package/dist/src/schema/FieldAccessVisitor.js.map +1 -1
  162. package/dist/src/schema/MutationProvider.js +4 -4
  163. package/dist/src/schema/MutationProvider.js.map +1 -1
  164. package/dist/src/schema/OrderByTypeProvider.js +1 -1
  165. package/dist/src/schema/OrderByTypeProvider.js.map +1 -1
  166. package/dist/src/schema/QueryProvider.js +3 -3
  167. package/dist/src/schema/QueryProvider.js.map +1 -1
  168. package/dist/src/schema/ResultSchemaTypeProvider.d.ts +2 -2
  169. package/dist/src/schema/ResultSchemaTypeProvider.d.ts.map +1 -1
  170. package/dist/src/schema/WhereTypeProvider.js +4 -4
  171. package/dist/src/schema/WhereTypeProvider.js.map +1 -1
  172. package/dist/src/schema/entities/FieldArgsVisitor.d.ts +7 -7
  173. package/dist/src/schema/entities/FieldArgsVisitor.d.ts.map +1 -1
  174. package/dist/src/schema/entities/FieldArgsVisitor.js +3 -3
  175. package/dist/src/schema/entities/FieldArgsVisitor.js.map +1 -1
  176. package/dist/src/schema/entities/FieldTypeVisitor.d.ts +3 -3
  177. package/dist/src/schema/entities/FieldTypeVisitor.d.ts.map +1 -1
  178. package/dist/src/schema/entities/FieldTypeVisitor.js +3 -3
  179. package/dist/src/schema/entities/FieldTypeVisitor.js.map +1 -1
  180. package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.d.ts +3 -3
  181. package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.d.ts.map +1 -1
  182. package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.js +3 -3
  183. package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.js.map +1 -1
  184. package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.d.ts +6 -6
  185. package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.d.ts.map +1 -1
  186. package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.js +6 -6
  187. package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.js.map +1 -1
  188. package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.d.ts +3 -3
  189. package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.d.ts.map +1 -1
  190. package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.js +5 -5
  191. package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.js.map +1 -1
  192. package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.d.ts +10 -4
  193. package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.d.ts.map +1 -1
  194. package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.js +3 -3
  195. package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.js.map +1 -1
  196. package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.d.ts +6 -6
  197. package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.d.ts.map +1 -1
  198. package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.js +6 -6
  199. package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.js.map +1 -1
  200. package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.d.ts +2 -2
  201. package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.d.ts.map +1 -1
  202. package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.js +2 -2
  203. package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.js.map +1 -1
  204. package/dist/src/tsconfig.tsbuildinfo +1 -1
  205. package/dist/src/utils/object.d.ts.map +1 -1
  206. package/dist/src/utils/object.js +3 -4
  207. package/dist/src/utils/object.js.map +1 -1
  208. package/dist/src/utils/uniqueWhereFields.js +3 -3
  209. package/dist/src/utils/uniqueWhereFields.js.map +1 -1
  210. package/dist/tests/cases/integration/graphQlRequests/delete/aclDelete.test.js +1 -1
  211. package/dist/tests/cases/integration/graphQlRequests/delete/aclDelete.test.js.map +1 -1
  212. package/dist/tests/cases/integration/graphQlRequests/insert/acl/setField.test.js +2 -2
  213. package/dist/tests/cases/integration/graphQlRequests/insert/acl/setField.test.js.map +1 -1
  214. package/dist/tests/cases/integration/graphQlRequests/insert/aclInsert.test.js +1 -1
  215. package/dist/tests/cases/integration/graphQlRequests/insert/aclInsert.test.js.map +1 -1
  216. package/dist/tests/cases/integration/graphQlRequests/query/acl/fieldRestrictedByLocale.test.js +7 -6
  217. package/dist/tests/cases/integration/graphQlRequests/query/acl/fieldRestrictedByLocale.test.js.map +1 -1
  218. package/dist/tests/cases/integration/graphQlRequests/query/acl/nestedPredicate.test.js +1 -1
  219. package/dist/tests/cases/integration/graphQlRequests/query/acl/nestedPredicate.test.js.map +1 -1
  220. package/dist/tests/cases/integration/graphQlRequests/query/acl/predicateElimination.test.d.ts +2 -0
  221. package/dist/tests/cases/integration/graphQlRequests/query/acl/predicateElimination.test.d.ts.map +1 -0
  222. package/dist/tests/cases/integration/graphQlRequests/query/acl/predicateElimination.test.js +137 -0
  223. package/dist/tests/cases/integration/graphQlRequests/query/acl/predicateElimination.test.js.map +1 -0
  224. package/dist/tests/cases/integration/graphQlRequests/query/filter/complexCondition.test.js +1 -1
  225. package/dist/tests/cases/integration/graphQlRequests/query/filter/composedFilter.test.js +1 -1
  226. package/dist/tests/cases/integration/graphQlRequests/query/filter/composedFilter.test.js.map +1 -1
  227. package/dist/tests/cases/integration/graphQlRequests/query/relations/manyHasManyInverse.test.js +73 -0
  228. package/dist/tests/cases/integration/graphQlRequests/query/relations/manyHasManyInverse.test.js.map +1 -1
  229. package/dist/tests/cases/integration/graphQlRequests/query/relations/manyHasManyOwning.test.js +73 -0
  230. package/dist/tests/cases/integration/graphQlRequests/query/relations/manyHasManyOwning.test.js.map +1 -1
  231. package/dist/tests/cases/integration/graphQlRequests/update/acl/aclUpdate.test.js +6 -6
  232. package/dist/tests/cases/integration/graphQlRequests/update/acl/aclUpdate.test.js.map +1 -1
  233. package/dist/tests/cases/integration/graphQlSchema/graphQlSchemaBuilder.test.js +6 -3
  234. package/dist/tests/cases/integration/graphQlSchema/graphQlSchemaBuilder.test.js.map +1 -1
  235. package/dist/tests/cases/integration/graphQlSchema/model.js.map +1 -1
  236. package/dist/tests/cases/unit/aclVariablesFactory.test.js +7 -33
  237. package/dist/tests/cases/unit/aclVariablesFactory.test.js.map +1 -1
  238. package/dist/tests/cases/unit/conditionOptimizer.test.d.ts +2 -0
  239. package/dist/tests/cases/unit/conditionOptimizer.test.d.ts.map +1 -0
  240. package/dist/tests/cases/unit/conditionOptimizer.test.js +118 -0
  241. package/dist/tests/cases/unit/conditionOptimizer.test.js.map +1 -0
  242. package/dist/tests/cases/unit/orderbyHelper.test.js +1 -0
  243. package/dist/tests/cases/unit/orderbyHelper.test.js.map +1 -1
  244. package/dist/tests/cases/unit/permissionMerger.test.js +2 -0
  245. package/dist/tests/cases/unit/permissionMerger.test.js.map +1 -1
  246. package/dist/tests/cases/unit/predicatesFactory.test.d.ts +2 -0
  247. package/dist/tests/cases/unit/predicatesFactory.test.d.ts.map +1 -0
  248. package/dist/tests/cases/unit/predicatesFactory.test.js +109 -0
  249. package/dist/tests/cases/unit/predicatesFactory.test.js.map +1 -0
  250. package/dist/tests/cases/unit/predicatesInjector.test.js +88 -14
  251. package/dist/tests/cases/unit/predicatesInjector.test.js.map +1 -1
  252. package/dist/tests/cases/unit/variableInjector.test.js +4 -3
  253. package/dist/tests/cases/unit/variableInjector.test.js.map +1 -1
  254. package/dist/tests/cases/unit/whereOptimizer.test.d.ts +2 -0
  255. package/dist/tests/cases/unit/whereOptimizer.test.d.ts.map +1 -0
  256. package/dist/tests/cases/unit/whereOptimizer.test.js +265 -0
  257. package/dist/tests/cases/unit/whereOptimizer.test.js.map +1 -0
  258. package/dist/tests/src/testGraphql.d.ts.map +1 -1
  259. package/dist/tests/src/testGraphql.js +10 -2
  260. package/dist/tests/src/testGraphql.js.map +1 -1
  261. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  262. package/graphql.codegen.yml +0 -3
  263. package/package.json +16 -16
  264. package/src/acl/EvaluatedPredicateReplacer.ts +32 -0
  265. package/src/acl/PermissionFactory.ts +18 -13
  266. package/src/acl/PredicateFactory.ts +32 -8
  267. package/src/acl/PredicatesInjector.ts +25 -17
  268. package/src/acl/VariableInjector.ts +2 -15
  269. package/src/acl/VariableUtils.ts +7 -23
  270. package/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.ts +17 -24
  271. package/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.ts +1 -6
  272. package/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.ts +26 -46
  273. package/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.ts +6 -3
  274. package/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.ts +4 -22
  275. package/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.ts +26 -49
  276. package/src/input-validation/ColumnValueResolver.ts +2 -3
  277. package/src/input-validation/EntityRulesResolver.ts +4 -4
  278. package/src/input-validation/QueryAstFactory.ts +1 -1
  279. package/src/input-validation/ValidationContext.ts +2 -2
  280. package/src/input-validation/ValidationDataSelector.ts +2 -2
  281. package/src/input-validation/preValidation/CreateInputPreValidationProcessor.ts +7 -8
  282. package/src/input-validation/preValidation/InputPreValidator.ts +4 -4
  283. package/src/input-validation/preValidation/UpdateInputPreValidationProcessor.ts +7 -8
  284. package/src/inputProcessing/CreateInputProcessor.ts +8 -9
  285. package/src/inputProcessing/CreateInputVisitor.ts +27 -89
  286. package/src/inputProcessing/UpdateInputProcessor.ts +8 -9
  287. package/src/inputProcessing/UpdateInputVisitor.ts +25 -71
  288. package/src/inputProcessing/index.ts +0 -1
  289. package/src/introspection/IntrospectionSchemaFactory.ts +7 -7
  290. package/src/introspection/content-schema.types.ts +19 -286
  291. package/src/mapper/Mapper.ts +37 -30
  292. package/src/mapper/MapperContainer.ts +10 -5
  293. package/src/mapper/delete/DeleteExecutor.ts +3 -3
  294. package/src/mapper/insert/SqlCreateInputProcessor.ts +3 -3
  295. package/src/mapper/select/JoinVisitor.ts +6 -33
  296. package/src/mapper/select/RelationFetcher.ts +101 -41
  297. package/src/mapper/select/SelectBuilder.ts +3 -1
  298. package/src/mapper/select/SelectBuilderFactory.ts +2 -1
  299. package/src/mapper/select/SelectExecutionHandler.ts +1 -0
  300. package/src/mapper/select/WhereBuilder.ts +46 -32
  301. package/src/mapper/select/handlers/FieldsVisitor.ts +47 -57
  302. package/src/mapper/select/handlers/FieldsVisitorFactory.ts +1 -0
  303. package/src/mapper/select/optimizer/ConditionOptimizer.ts +41 -0
  304. package/src/mapper/select/optimizer/WhereOptimizer.ts +138 -0
  305. package/src/mapper/select/optimizer/WhereReplacer.ts +27 -0
  306. package/src/mapper/select/optimizer/helpers.ts +58 -0
  307. package/src/mapper/update/SqlUpdateInputProcessor.ts +1 -1
  308. package/src/mapper/update/UpdateBuilder.ts +3 -3
  309. package/src/resolvers/GraphQlQueryAstFactory.ts +3 -3
  310. package/src/resolvers/MutationResolver.ts +1 -1
  311. package/src/resolvers/ReadHelpers.ts +3 -3
  312. package/src/resolvers/ReadResolver.ts +2 -2
  313. package/src/schema/FieldAccessVisitor.ts +2 -2
  314. package/src/schema/OrderByTypeProvider.ts +1 -1
  315. package/src/schema/WhereTypeProvider.ts +4 -4
  316. package/src/schema/entities/FieldArgsVisitor.ts +3 -3
  317. package/src/schema/entities/FieldTypeVisitor.ts +3 -3
  318. package/src/schema/mutations/CreateEntityInputFieldVisitor.ts +3 -6
  319. package/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.ts +6 -20
  320. package/src/schema/mutations/CreateEntityRelationInputFieldVisitor.ts +5 -18
  321. package/src/schema/mutations/UpdateEntityInputFieldVisitor.ts +3 -6
  322. package/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.ts +6 -20
  323. package/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.ts +2 -12
  324. package/src/utils/object.ts +6 -6
  325. package/src/utils/uniqueWhereFields.ts +3 -3
  326. package/tests/cases/integration/graphQlRequests/delete/aclDelete.test.ts +2 -2
  327. package/tests/cases/integration/graphQlRequests/insert/acl/setField.test.ts +3 -3
  328. package/tests/cases/integration/graphQlRequests/insert/aclInsert.test.ts +2 -2
  329. package/tests/cases/integration/graphQlRequests/query/acl/fieldRestrictedByLocale.test.ts +7 -6
  330. package/tests/cases/integration/graphQlRequests/query/acl/nestedPredicate.test.ts +1 -1
  331. package/tests/cases/integration/graphQlRequests/query/acl/predicateElimination.test.ts +130 -0
  332. package/tests/cases/integration/graphQlRequests/query/filter/complexCondition.test.ts +1 -1
  333. package/tests/cases/integration/graphQlRequests/query/filter/composedFilter.test.ts +1 -1
  334. package/tests/cases/integration/graphQlRequests/query/relations/manyHasManyInverse.test.ts +74 -0
  335. package/tests/cases/integration/graphQlRequests/query/relations/manyHasManyOwning.test.ts +77 -0
  336. package/tests/cases/integration/graphQlRequests/update/acl/aclUpdate.test.ts +7 -7
  337. package/tests/cases/integration/graphQlSchema/graphQlSchemaBuilder.test.ts +5 -5
  338. package/tests/cases/unit/aclVariablesFactory.test.ts +8 -35
  339. package/tests/cases/unit/conditionOptimizer.test.ts +135 -0
  340. package/tests/cases/unit/orderbyHelper.test.ts +1 -0
  341. package/tests/cases/unit/permissionMerger.test.ts +2 -0
  342. package/tests/cases/unit/predicatesFactory.test.ts +103 -0
  343. package/tests/cases/unit/predicatesInjector.test.ts +78 -16
  344. package/tests/cases/unit/variableInjector.test.ts +6 -5
  345. package/tests/cases/unit/whereOptimizer.test.ts +289 -0
  346. package/tests/src/testGraphql.ts +9 -2
  347. package/dist/src/inputProcessing/InputContext.d.ts +0 -43
  348. package/dist/src/inputProcessing/InputContext.d.ts.map +0 -1
  349. package/dist/src/inputProcessing/InputContext.js +0 -3
  350. package/dist/src/inputProcessing/InputContext.js.map +0 -1
  351. package/jasmine.json +0 -7
  352. package/src/inputProcessing/InputContext.ts +0 -49
@@ -7,7 +7,7 @@ import {
7
7
  GraphQLResolveInfo,
8
8
  isListType,
9
9
  isNonNullType,
10
- isObjectType,
10
+ isObjectType, Kind,
11
11
  } from 'graphql'
12
12
  import { SelectionSetNode } from 'graphql/language/ast'
13
13
  import { getArgumentValues } from 'graphql/execution/values'
@@ -67,13 +67,13 @@ export class GraphQlQueryAstFactory {
67
67
  ): AnyNode[] {
68
68
  const fields: ObjectNode | FieldNode[] = []
69
69
  for (const subNode of selectionSet.selections) {
70
- if (isIt<GraphQlFieldNode>(subNode, 'kind', 'Field')) {
70
+ if (isIt<GraphQlFieldNode>(subNode, 'kind', Kind.FIELD)) {
71
71
  const field = this.createFromNode(info, parentType, subNode, path, filter)
72
72
  if (field === null) {
73
73
  continue
74
74
  }
75
75
  fields.push(field)
76
- } else if (isIt<FragmentSpreadNode>(subNode, 'kind', 'FragmentSpread')) {
76
+ } else if (isIt<FragmentSpreadNode>(subNode, 'kind', Kind.FRAGMENT_SPREAD)) {
77
77
  const fragmentDefinition = info.fragments[subNode.name.value]
78
78
  if (!fragmentDefinition) {
79
79
  throw new Error(`GraphQlQueryAstFactory: Fragment definition ${subNode.name.value} not found`)
@@ -457,7 +457,7 @@ export class MutationResolver {
457
457
  throw new Error('MutationResolver: expected ObjectNode')
458
458
  }
459
459
  const objectWithArgs = singleNodeQuery.withArgs({ by: where })
460
- nodes[singleNodeQuery.alias] = await mapper.selectUnique(entity, objectWithArgs)
460
+ nodes[singleNodeQuery.alias] = await mapper.selectUnique(entity, objectWithArgs, [])
461
461
  }
462
462
  return nodes
463
463
  }
@@ -15,7 +15,7 @@ export const paginate = async (
15
15
  const totalCount = paginationHelper.requiresTotalCount
16
16
  ? await mapper.count(entity, queryAst.args.filter || {})
17
17
  : undefined
18
- const nodes = paginationHelper.nodeField ? await mapper.select(entity, paginationHelper.nodeField) : undefined
18
+ const nodes = paginationHelper.nodeField ? await mapper.select(entity, paginationHelper.nodeField, []) : undefined
19
19
 
20
20
  return paginationHelper.createResponse(totalCount, nodes)
21
21
  }
@@ -37,9 +37,9 @@ export const executeReadOperations = async (
37
37
  trxResult[field.alias] = await (() => {
38
38
  switch (meta.operation) {
39
39
  case Operation.get:
40
- return mapper.selectUnique(meta.entity, field)
40
+ return mapper.selectUnique(meta.entity, field, [])
41
41
  case Operation.list:
42
- return mapper.select(meta.entity, field)
42
+ return mapper.select(meta.entity, field, [])
43
43
  case Operation.paginate:
44
44
  return paginate(mapper, meta.entity, field)
45
45
  case Operation.create:
@@ -33,12 +33,12 @@ export class ReadResolver {
33
33
 
34
34
  public async resolveListQuery(entity: Model.Entity, info: GraphQLResolveInfo) {
35
35
  const queryAst: ObjectNode<Input.ListQueryInput> = this.queryAstFactory.create(info)
36
- return await this.mapperFactory(this.db).select(entity, queryAst)
36
+ return await this.mapperFactory(this.db).select(entity, queryAst, [])
37
37
  }
38
38
 
39
39
  public async resolveGetQuery(entity: Model.Entity, info: GraphQLResolveInfo) {
40
40
  const queryAst: ObjectNode<Input.UniqueQueryInput> = this.queryAstFactory.create(info)
41
- return await this.mapperFactory(this.db).selectUnique(entity, queryAst)
41
+ return await this.mapperFactory(this.db).selectUnique(entity, queryAst, [])
42
42
  }
43
43
 
44
44
  public async resolvePaginationQuery(entity: Model.Entity, info: GraphQLResolveInfo) {
@@ -7,11 +7,11 @@ export class FieldAccessVisitor implements Model.ColumnVisitor<boolean>, Model.R
7
7
  private readonly authorizator: Authorizator,
8
8
  ) {}
9
9
 
10
- visitColumn(entity: Model.Entity, column: Model.AnyColumn) {
10
+ visitColumn({ column, entity }: Model.ColumnContext) {
11
11
  return this.authorizator.getFieldPermissions(this.operation, entity.name, column.name) !== 'no'
12
12
  }
13
13
 
14
- visitRelation({}, {}, targetEntity: Model.Entity) {
14
+ visitRelation({ targetEntity }: Model.AnyRelationContext) {
15
15
  return this.authorizator.getEntityPermission(this.operation, targetEntity.name) !== 'no'
16
16
  }
17
17
  }
@@ -51,7 +51,7 @@ export class OrderByTypeProvider {
51
51
 
52
52
  const field = acceptFieldVisitor(this.schema, name, fieldName, {
53
53
  visitColumn: () => ({ type: this.orderDirectionEnum }),
54
- visitHasOne: (entity, relation) => ({ type: this.getEntityOrderByType(relation.target) }),
54
+ visitHasOne: ({ relation }) => ({ type: this.getEntityOrderByType(relation.target) }),
55
55
  visitHasMany: () => undefined,
56
56
  } as Model.FieldVisitor<GraphQLInputFieldConfig | undefined>)
57
57
 
@@ -74,7 +74,7 @@ export class WhereTypeProvider {
74
74
  continue
75
75
  }
76
76
  fields[field] = acceptFieldVisitor<GraphQLInputFieldConfig>(this.schema, entity, field, {
77
- visitRelation: (entity, relation, targetEntity) => {
77
+ visitRelation: ({ targetEntity }) => {
78
78
  // if (!isIt<Model.JoiningColumnRelation>(relation, 'joiningColumn')) {
79
79
  // throw new Error('Only column or owning relation can be a part of unique key')
80
80
  // }
@@ -84,7 +84,7 @@ export class WhereTypeProvider {
84
84
  }
85
85
  return { type: uniqueWhere }
86
86
  },
87
- visitColumn: (entity, column) => ({ type: this.columnTypeResolver.getType(column) }),
87
+ visitColumn: ({ column }) => ({ type: this.columnTypeResolver.getType(column) }),
88
88
  })
89
89
  }
90
90
  }
@@ -104,8 +104,8 @@ export class WhereTypeProvider {
104
104
  continue
105
105
  }
106
106
  fields[fieldName] = acceptFieldVisitor(this.schema, name, fieldName, {
107
- visitColumn: (entity, column) => ({ type: this.conditionTypeProvider.getCondition(column) }),
108
- visitRelation: (entity, relation) => ({ type: this.getEntityWhereType(relation.target) }),
107
+ visitColumn: ({ column }) => ({ type: this.conditionTypeProvider.getCondition(column) }),
108
+ visitRelation: ({ relation }) => ({ type: this.getEntityWhereType(relation.target) }),
109
109
  } as Model.FieldVisitor<GraphQLInputFieldConfig>)
110
110
  }
111
111
 
@@ -15,11 +15,11 @@ export class FieldArgsVisitor implements
15
15
  this.whereTypeProvider = whereTypeProvider
16
16
  }
17
17
 
18
- public visitColumn(entity: Model.Entity, column: Model.AnyColumn) {
18
+ public visitColumn() {
19
19
  return undefined
20
20
  }
21
21
 
22
- public visitHasMany(entity: Model.Entity, relation: Model.Relation) {
22
+ public visitHasMany({ relation }: Model.AnyHasManyRelationContext) {
23
23
  const filter = this.getWhereArg(relation)
24
24
  const orderBy = this.getOrderByArgs(relation)
25
25
  return {
@@ -30,7 +30,7 @@ export class FieldArgsVisitor implements
30
30
  }
31
31
  }
32
32
 
33
- public visitHasOne(entity: Model.Entity, relation: Model.Relation) {
33
+ public visitHasOne({ relation }: Model.ManyHasOneContext) {
34
34
  const filter = this.getWhereArg(relation)
35
35
  return { filter }
36
36
  }
@@ -13,7 +13,7 @@ export class FieldTypeVisitor implements Model.ColumnVisitor<GraphQLOutputType>,
13
13
  ) {
14
14
  }
15
15
 
16
- public visitColumn(entity: Model.Entity, column: Model.AnyColumn): GraphQLOutputType {
16
+ public visitColumn({ column, entity }: Model.ColumnContext): GraphQLOutputType {
17
17
  const basicType = this.columnTypeResolver.getType(column)
18
18
  const fieldPredicate = this.authorizator.getFieldPredicate(Acl.Operation.read, entity.name, column.name)
19
19
  const idPredicate = this.authorizator.getFieldPredicate(Acl.Operation.read, entity.name, entity.primary)
@@ -26,12 +26,12 @@ export class FieldTypeVisitor implements Model.ColumnVisitor<GraphQLOutputType>,
26
26
  return basicType
27
27
  }
28
28
 
29
- public visitHasMany(entity: Model.Entity, relation: Model.Relation): GraphQLOutputType {
29
+ public visitHasMany({ relation }: Model.AnyHasManyRelationContext): GraphQLOutputType {
30
30
  const entityType = this.entityTypeProvider.getEntity(relation.target)
31
31
  return new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(entityType)))
32
32
  }
33
33
 
34
- public visitHasOne(entity: Model.Entity, relation: Model.Relation & Model.NullableRelation): GraphQLOutputType {
34
+ public visitHasOne({ relation }: Model.AnyHasOneRelationContext): GraphQLOutputType {
35
35
  return this.entityTypeProvider.getEntity(relation.target)
36
36
  }
37
37
  }
@@ -15,7 +15,7 @@ export class CreateEntityInputFieldVisitor implements
15
15
  private readonly createEntityRelationInputProvider: CreateEntityRelationInputProvider,
16
16
  ) {}
17
17
 
18
- public visitColumn(entity: Model.Entity, column: Model.AnyColumn): GraphQLInputFieldConfig | undefined {
18
+ public visitColumn({ entity, column }: Model.ColumnContext): GraphQLInputFieldConfig | undefined {
19
19
  if (entity.primary === column.name && !this.authorizator.isCustomPrimaryAllowed(entity.name)) {
20
20
  return undefined
21
21
  }
@@ -28,10 +28,7 @@ export class CreateEntityInputFieldVisitor implements
28
28
  }
29
29
  }
30
30
 
31
- public visitHasOne(
32
- entity: Model.Entity,
33
- relation: Model.Relation & Model.NullableRelation,
34
- ): GraphQLInputFieldConfig | undefined {
31
+ public visitHasOne({ entity, relation }: Model.AnyHasOneRelationContext): GraphQLInputFieldConfig | undefined {
35
32
  const type = this.createEntityRelationInputProvider.getCreateEntityRelationInput(entity.name, relation.name)
36
33
  if (type === undefined) {
37
34
  return undefined
@@ -41,7 +38,7 @@ export class CreateEntityInputFieldVisitor implements
41
38
  }
42
39
  }
43
40
 
44
- public visitHasMany(entity: Model.Entity, relation: Model.Relation): GraphQLInputFieldConfig | undefined {
41
+ public visitHasMany({ entity, relation }: Model.AnyHasManyRelationContext): GraphQLInputFieldConfig | undefined {
45
42
  const type = this.createEntityRelationInputProvider.getCreateEntityRelationInput(entity.name, relation.name)
46
43
  if (type === undefined) {
47
44
  return undefined
@@ -12,32 +12,23 @@ export class CreateEntityRelationAllowedOperationsVisitor implements
12
12
  throw new ImplementationException('CreateEntityRelationAllowedOperationsVisitor: Not applicable for a column')
13
13
  }
14
14
 
15
- public visitManyHasManyInverse({}, {}, targetEntity: Model.Entity, targetRelation: Model.ManyHasManyOwningRelation) {
15
+ public visitManyHasManyInverse({ targetEntity, targetRelation }: Model.ManyHasManyInverseContext) {
16
16
  return this.getAllowedOperations(targetEntity, targetEntity, targetRelation)
17
17
  }
18
18
 
19
- public visitManyHasManyOwning(
20
- entity: Model.Entity,
21
- relation: Model.ManyHasManyOwningRelation,
22
- targetEntity: Model.Entity,
23
- ) {
19
+ public visitManyHasManyOwning({ entity, targetEntity, relation }: Model.ManyHasManyOwningContext) {
24
20
  return this.getAllowedOperations(targetEntity, entity, relation)
25
21
  }
26
22
 
27
- public visitOneHasMany({}, {}, targetEntity: Model.Entity, targetRelation: Model.ManyHasOneRelation) {
23
+ public visitOneHasMany({ targetEntity, targetRelation }: Model.OneHasManyContext) {
28
24
  return this.getAllowedOperations(targetEntity, targetEntity, targetRelation)
29
25
  }
30
26
 
31
- public visitManyHasOne(entity: Model.Entity, relation: Model.ManyHasOneRelation, targetEntity: Model.Entity) {
27
+ public visitManyHasOne({ targetEntity, entity, relation }: Model.ManyHasOneContext) {
32
28
  return this.getAllowedOperations(targetEntity, entity, relation)
33
29
  }
34
30
 
35
- public visitOneHasOneInverse(
36
- {},
37
- relation: Model.OneHasOneInverseRelation,
38
- targetEntity: Model.Entity,
39
- targetRelation: Model.OneHasOneOwningRelation,
40
- ) {
31
+ public visitOneHasOneInverse({ targetEntity, targetRelation, relation }: Model.OneHasOneInverseContext) {
41
32
  const operations = this.getAllowedOperations(targetEntity, targetEntity, targetRelation)
42
33
  if (relation.nullable || targetRelation.nullable) {
43
34
  return operations
@@ -45,12 +36,7 @@ export class CreateEntityRelationAllowedOperationsVisitor implements
45
36
  return operations.filter(it => it === Input.CreateRelationOperation.create)
46
37
  }
47
38
 
48
- public visitOneHasOneOwning(
49
- entity: Model.Entity,
50
- relation: Model.OneHasOneOwningRelation,
51
- targetEntity: Model.Entity,
52
- targetRelation: Model.OneHasOneInverseRelation | null,
53
- ) {
39
+ public visitOneHasOneOwning({ targetEntity, entity, relation, targetRelation }: Model.OneHasOneOwningContext) {
54
40
  const operations = this.getAllowedOperations(targetEntity, entity, relation)
55
41
  if (!targetRelation || targetRelation.nullable || relation.nullable) {
56
42
  return operations
@@ -26,29 +26,16 @@ export class CreateEntityRelationInputFieldVisitor implements
26
26
  throw new ImplementationException('CreateEntityRelationInputFieldVisitor: Not applicable for a column')
27
27
  }
28
28
 
29
- public visitHasOne(
30
- entity: Model.Entity,
31
- relation: Model.Relation & Model.NullableRelation,
32
- targetEntity: Model.Entity,
33
- targetRelation: Model.Relation | null,
34
- ): GraphQLInputObjectType | undefined {
35
- return this.createInputObject(entity, relation, targetEntity, targetRelation, false)
29
+ public visitHasOne(context: Model.ManyHasOneContext): GraphQLInputObjectType | undefined {
30
+ return this.createInputObject(context, false)
36
31
  }
37
32
 
38
- public visitHasMany(
39
- entity: Model.Entity,
40
- relation: Model.Relation,
41
- targetEntity: Model.Entity,
42
- targetRelation: Model.Relation | null,
43
- ): GraphQLInputObjectType | undefined {
44
- return this.createInputObject(entity, relation, targetEntity, targetRelation, true)
33
+ public visitHasMany(context: Model.OneHasManyContext): GraphQLInputObjectType | undefined {
34
+ return this.createInputObject(context, true)
45
35
  }
46
36
 
47
37
  public createInputObject(
48
- entity: Model.Entity,
49
- relation: Model.Relation,
50
- targetEntity: Model.Entity,
51
- targetRelation: Model.Relation | null,
38
+ { entity, relation, targetEntity, targetRelation }: Model.AnyRelationContext,
52
39
  withAliasField: boolean,
53
40
  ): GraphQLInputObjectType | undefined {
54
41
  const targetName = targetRelation ? targetRelation.name : undefined
@@ -14,7 +14,7 @@ export class UpdateEntityInputFieldVisitor implements
14
14
  private readonly updateEntityRelationInputProvider: UpdateEntityRelationInputProvider,
15
15
  ) {}
16
16
 
17
- public visitColumn(entity: Model.Entity, column: Model.AnyColumn): GraphQLInputFieldConfig | undefined {
17
+ public visitColumn({ entity, column }: Model.ColumnContext) {
18
18
  if (entity.primary === column.name) {
19
19
  return undefined
20
20
  }
@@ -27,10 +27,7 @@ export class UpdateEntityInputFieldVisitor implements
27
27
  }
28
28
  }
29
29
 
30
- public visitHasOne(
31
- entity: Model.Entity,
32
- relation: Model.Relation & Model.NullableRelation,
33
- ): GraphQLInputFieldConfig | undefined {
30
+ public visitHasOne({ entity, relation }: Model.AnyHasOneRelationContext) {
34
31
  const type = this.updateEntityRelationInputProvider.getUpdateEntityRelationInput(entity.name, relation.name)
35
32
  if (type === undefined) {
36
33
  return undefined
@@ -40,7 +37,7 @@ export class UpdateEntityInputFieldVisitor implements
40
37
  }
41
38
  }
42
39
 
43
- public visitHasMany(entity: Model.Entity, relation: Model.Relation): GraphQLInputFieldConfig | undefined {
40
+ public visitHasMany({ entity, relation }: Model.AnyHasManyRelationContext) {
44
41
  const type = this.updateEntityRelationInputProvider.getUpdateEntityRelationInput(entity.name, relation.name)
45
42
  if (type === undefined) {
46
43
  return undefined
@@ -11,23 +11,19 @@ export class UpdateEntityRelationAllowedOperationsVisitor implements
11
11
  throw new Error('UpdateEntityRelationAllowedOperationsVisitor: Not applicable for a column')
12
12
  }
13
13
 
14
- public visitManyHasManyInverse({}, {}, targetEntity: Model.Entity, targetRelation: Model.ManyHasManyOwningRelation) {
14
+ public visitManyHasManyInverse({ targetEntity, targetRelation }: Model.ManyHasManyInverseContext) {
15
15
  return this.getAllowedOperations(targetEntity, targetEntity, targetRelation)
16
16
  }
17
17
 
18
- public visitManyHasManyOwning(
19
- entity: Model.Entity,
20
- relation: Model.ManyHasManyOwningRelation,
21
- targetEntity: Model.Entity,
22
- ) {
18
+ public visitManyHasManyOwning({ entity, targetEntity, relation }: Model.ManyHasManyOwningContext) {
23
19
  return this.getAllowedOperations(targetEntity, entity, relation)
24
20
  }
25
21
 
26
- public visitOneHasMany({}, {}, targetEntity: Model.Entity, targetRelation: Model.ManyHasOneRelation) {
22
+ public visitOneHasMany({ targetRelation, targetEntity }: Model.OneHasManyContext) {
27
23
  return this.getAllowedOperations(targetEntity, targetEntity, targetRelation)
28
24
  }
29
25
 
30
- public visitManyHasOne(entity: Model.Entity, relation: Model.ManyHasOneRelation, targetEntity: Model.Entity) {
26
+ public visitManyHasOne({ targetEntity, relation, entity }: Model.ManyHasOneContext) {
31
27
  const operations = this.getAllowedOperations(targetEntity, entity, relation)
32
28
  if (relation.nullable) {
33
29
  return operations
@@ -39,12 +35,7 @@ export class UpdateEntityRelationAllowedOperationsVisitor implements
39
35
  return operations.filter(it => !forbiddenOperations.includes(it))
40
36
  }
41
37
 
42
- public visitOneHasOneInverse(
43
- {},
44
- relation: Model.OneHasOneInverseRelation,
45
- targetEntity: Model.Entity,
46
- targetRelation: Model.OneHasOneOwningRelation,
47
- ) {
38
+ public visitOneHasOneInverse({ relation, targetEntity, targetRelation }: Model.OneHasOneInverseContext) {
48
39
  const operations = this.getAllowedOperations(targetEntity, targetEntity, targetRelation)
49
40
  if (relation.nullable || targetRelation.nullable) {
50
41
  return operations
@@ -52,12 +43,7 @@ export class UpdateEntityRelationAllowedOperationsVisitor implements
52
43
  return operations.filter(it => it === Input.UpdateRelationOperation.update)
53
44
  }
54
45
 
55
- public visitOneHasOneOwning(
56
- entity: Model.Entity,
57
- relation: Model.OneHasOneOwningRelation,
58
- targetEntity: Model.Entity,
59
- targetRelation: Model.OneHasOneInverseRelation | null,
60
- ) {
46
+ public visitOneHasOneOwning({ targetEntity, entity, relation, targetRelation }: Model.OneHasOneOwningContext) {
61
47
  const operations = this.getAllowedOperations(targetEntity, entity, relation)
62
48
  if (relation.nullable || !targetRelation || targetRelation.nullable) {
63
49
  return operations
@@ -27,12 +27,7 @@ export class UpdateEntityRelationInputFieldVisitor implements
27
27
  throw new Error('UpdateEntityRelationInputFieldVisitor: Not applicable for a column')
28
28
  }
29
29
 
30
- public visitHasOne(
31
- entity: Model.Entity,
32
- relation: Model.Relation & Model.NullableRelation,
33
- targetEntity: Model.Entity,
34
- targetRelation: Model.Relation | null,
35
- ): GraphQLInputObjectType | undefined {
30
+ public visitHasOne({ targetRelation, targetEntity, relation, entity }: Model.AnyHasOneRelationContext) {
36
31
  const withoutRelation = targetRelation ? targetRelation.name : undefined
37
32
 
38
33
  const whereInput = this.createWhereInput(targetEntity)
@@ -84,12 +79,7 @@ export class UpdateEntityRelationInputFieldVisitor implements
84
79
  })
85
80
  }
86
81
 
87
- public visitHasMany(
88
- entity: Model.Entity,
89
- relation: Model.Relation,
90
- targetEntity: Model.Entity,
91
- targetRelation: Model.Relation | null,
92
- ): GraphQLInputObjectType | undefined {
82
+ public visitHasMany({ entity, relation, targetEntity, targetRelation }: Model.AnyHasManyRelationContext) {
93
83
  const withoutRelation = targetRelation ? targetRelation.name : undefined
94
84
 
95
85
  const whereInput = this.createWhereInput(targetEntity)
@@ -9,18 +9,18 @@ function filterObject<Input extends {}, Result extends { [Key in keyof Input]: I
9
9
  object: Input,
10
10
  callback: TypeGuard<Input, Result> | Filter<Input>,
11
11
  ): Result {
12
- return (Object.entries(object) as any)
13
- .filter(<K extends keyof Input>(it: [K, Input[K]]): it is [K, Result[K]] =>
14
- (callback as any)(it[0] as K, it[1] as Input[K], object),
15
- )
16
- .reduce((result: Result, [key, value]: [string, any]) => ({ ...(result as any), [key]: value }), {} as Result)
12
+ return Object.fromEntries(Object.entries(object)
13
+ .filter(([key, value]) => (callback as any)(key, value, object)),
14
+ ) as Result
17
15
  }
18
16
 
19
17
  function mapObject<Input, Result>(
20
18
  input: { [key: string]: Input },
21
19
  callback: (value: Input, key: string) => Result,
22
20
  ): { [key: string]: Result } {
23
- return Object.keys(input).reduce((acc, key) => ({ ...acc, [key]: callback(input[key], key) }), {})
21
+ return Object.fromEntries(
22
+ Object.entries(input).map(([key, value]) => [key, callback(value, key)]),
23
+ )
24
24
  }
25
25
 
26
26
  export { filterObject, mapObject }
@@ -8,10 +8,10 @@ export const getFieldsForUniqueWhere = (schema: Model.Schema, entity: Model.Enti
8
8
  visitColumn: () => undefined,
9
9
  visitManyHasManyInverse: () => undefined,
10
10
  visitManyHasManyOwning: () => undefined,
11
- visitOneHasMany: ({}, relation) => [relation.name],
11
+ visitOneHasMany: ({ relation }) => [relation.name],
12
12
  visitManyHasOne: () => undefined,
13
- visitOneHasOneInverse: ({}, relation) => [relation.name],
14
- visitOneHasOneOwning: ({}, relation) => [relation.name],
13
+ visitOneHasOneInverse: ({ relation }) => [relation.name],
14
+ visitOneHasOneOwning: ({ relation }) => [relation.name],
15
15
  }),
16
16
  ).filter((it): it is [string] => !!it)
17
17
 
@@ -1,7 +1,7 @@
1
1
  import { test } from 'vitest'
2
2
  import { execute, sqlDeferred, sqlTransaction } from '../../../../src/test'
3
3
  import { SchemaBuilder } from '@contember/schema-definition'
4
- import { Model } from '@contember/schema'
4
+ import { Acl, Model } from '@contember/schema'
5
5
  import { GQL, SQL } from '../../../../src/tags'
6
6
  import { testUuid } from '../../../../src/testUuid'
7
7
 
@@ -32,7 +32,7 @@ test('delete post with acl', async () => {
32
32
  },
33
33
  },
34
34
  variables: {
35
- locale_variable: ['cs'],
35
+ locale_variable: { in: ['cs'] },
36
36
  },
37
37
  executes: [
38
38
  ...sqlTransaction([
@@ -1,7 +1,7 @@
1
1
  import { test } from 'vitest'
2
2
  import { execute, failedTransaction, sqlTransaction } from '../../../../../src/test'
3
3
  import { SchemaBuilder } from '@contember/schema-definition'
4
- import { Model } from '@contember/schema'
4
+ import { Acl, Model } from '@contember/schema'
5
5
  import { GQL, SQL } from '../../../../../src/tags'
6
6
  import { testUuid } from '../../../../../src/testUuid'
7
7
 
@@ -34,7 +34,7 @@ test('set a name - allowed', async () => {
34
34
  },
35
35
  },
36
36
  variables: {
37
- name_variable: ['John', 'Jack'],
37
+ name_variable: { in: ['John', 'Jack'] },
38
38
  },
39
39
  executes: [
40
40
  ...sqlTransaction([
@@ -89,7 +89,7 @@ test('set a name - denied', async () => {
89
89
  },
90
90
  },
91
91
  variables: {
92
- name_variable: ['John', 'Jack'],
92
+ name_variable: { in: ['John', 'Jack'] },
93
93
  },
94
94
  executes: [
95
95
  ...failedTransaction([
@@ -1,7 +1,7 @@
1
1
  import { test } from 'vitest'
2
2
  import { execute, sqlTransaction } from '../../../../src/test'
3
3
  import { SchemaBuilder } from '@contember/schema-definition'
4
- import { Model } from '@contember/schema'
4
+ import { Acl, Model } from '@contember/schema'
5
5
  import { GQL, SQL } from '../../../../src/tags'
6
6
  import { testUuid } from '../../../../src/testUuid'
7
7
 
@@ -27,7 +27,7 @@ test('insert author (with acl)', async () => {
27
27
  },
28
28
  },
29
29
  variables: {
30
- name_variable: ['John', 'Jack'],
30
+ name_variable: { in: ['John', 'Jack'] },
31
31
  },
32
32
  query: GQL`
33
33
  mutation {
@@ -7,7 +7,7 @@ import { testUuid } from '../../../../../src/testUuid'
7
7
 
8
8
  const schema = new SchemaBuilder()
9
9
  .enum('locale', ['cs', 'en'])
10
- .entity('Post', entityBuilder => entityBuilder.oneHasMany('locales', c => c.target('PostLocale')))
10
+ .entity('Post', entityBuilder => entityBuilder.oneHasMany('locales', c => c.target('PostLocale').ownedBy('post')))
11
11
  .entity('PostLocale', entity =>
12
12
  entity
13
13
  .column('title', column => column.type(Model.ColumnType.String))
@@ -34,6 +34,7 @@ const permissions: Acl.Permissions = {
34
34
  operations: {
35
35
  read: {
36
36
  id: true,
37
+ post: true,
37
38
  title: 'localePredicate',
38
39
  },
39
40
  },
@@ -45,7 +46,7 @@ test('querying id and title', async () => {
45
46
  schema: schema,
46
47
  permissions: permissions,
47
48
  variables: {
48
- localeVariable: ['cs'],
49
+ localeVariable: { in: ['cs'] },
49
50
  },
50
51
  query: GQL`
51
52
  query {
@@ -121,7 +122,7 @@ test('querying with extra where', async () => {
121
122
  schema: schema,
122
123
  permissions: permissions,
123
124
  variables: {
124
- localeVariable: ['cs'],
125
+ localeVariable: { in: ['cs'] },
125
126
  },
126
127
  query: GQL`
127
128
  query {
@@ -167,7 +168,7 @@ test('querying only id', async () => {
167
168
  schema: schema,
168
169
  permissions: permissions,
169
170
  variables: {
170
- localeVariable: ['cs'],
171
+ localeVariable: { in: ['cs'] },
171
172
  },
172
173
  query: GQL`
173
174
  query {
@@ -239,7 +240,7 @@ test('querying on nested field', async () => {
239
240
  schema: schema,
240
241
  permissions: permissions,
241
242
  variables: {
242
- localeVariable: ['cs'],
243
+ localeVariable: { in: ['cs'] },
243
244
  },
244
245
  query: GQL`
245
246
  query {
@@ -274,7 +275,7 @@ test('querying on nested field', async () => {
274
275
  "root_"."id" as "root_id",
275
276
  case when "root_"."locale" in (?) then "root_"."title" else null end as "root_title"
276
277
  from "public"."post_locale" as "root_"
277
- where "root_"."post_id" in (?, ?) and false`,
278
+ where "root_"."post_id" in (?, ?)`,
278
279
  parameters: ['cs', testUuid(1), testUuid(2)],
279
280
  response: {
280
281
  rows: [
@@ -58,7 +58,7 @@ test('querying post + author name', async () => {
58
58
  schema: schema,
59
59
  permissions: permissions,
60
60
  variables: {
61
- countryVariable: ['Czechia'],
61
+ countryVariable: { in: ['Czechia'] },
62
62
  },
63
63
  query: GQL`
64
64
  query {