@contember/schema-definition 2.1.0-alpha.9 → 2.1.0-beta.1

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 (427) hide show
  1. package/CLAUDE.md +64 -0
  2. package/dist/development/index.cjs +33 -33
  3. package/dist/development/index.cjs.map +1 -1
  4. package/dist/development/index.js +25 -25
  5. package/dist/development/index.js.map +1 -1
  6. package/dist/development/src/acl/builder/EntityPermissionsBuilder.cjs.map +1 -1
  7. package/dist/development/src/acl/builder/EntityPermissionsBuilder.js.map +1 -1
  8. package/dist/development/src/acl/builder/EntitySelector.cjs.map +1 -1
  9. package/dist/development/src/acl/builder/EntitySelector.js.map +1 -1
  10. package/dist/development/src/acl/builder/FieldPermissionsBuilder.cjs.map +1 -1
  11. package/dist/development/src/acl/builder/FieldPermissionsBuilder.js.map +1 -1
  12. package/dist/development/src/acl/builder/FieldSelector.cjs.map +1 -1
  13. package/dist/development/src/acl/builder/FieldSelector.js.map +1 -1
  14. package/dist/development/src/acl/builder/PermissionOverrider.cjs.map +1 -1
  15. package/dist/development/src/acl/builder/PermissionOverrider.js.map +1 -1
  16. package/dist/development/src/acl/builder/PermissionsBuilder.cjs +1 -3
  17. package/dist/development/src/acl/builder/PermissionsBuilder.cjs.map +1 -1
  18. package/dist/development/src/acl/builder/PermissionsBuilder.js +1 -3
  19. package/dist/development/src/acl/builder/PermissionsBuilder.js.map +1 -1
  20. package/dist/development/src/acl/builder/PredicateReference.cjs.map +1 -1
  21. package/dist/development/src/acl/builder/PredicateReference.js.map +1 -1
  22. package/dist/development/src/acl/definition/aclExtensions.cjs +2 -2
  23. package/dist/development/src/acl/definition/aclExtensions.cjs.map +1 -1
  24. package/dist/development/src/acl/definition/aclExtensions.js +2 -2
  25. package/dist/development/src/acl/definition/aclExtensions.js.map +1 -1
  26. package/dist/development/src/acl/definition/customPrimary.cjs +1 -1
  27. package/dist/development/src/acl/definition/customPrimary.cjs.map +1 -1
  28. package/dist/development/src/acl/definition/customPrimary.js +1 -1
  29. package/dist/development/src/acl/definition/customPrimary.js.map +1 -1
  30. package/dist/development/src/acl/definition/index.cjs.map +1 -1
  31. package/dist/development/src/acl/definition/index.js.map +1 -1
  32. package/dist/development/src/acl/definition/internal/AclFactory.cjs +24 -16
  33. package/dist/development/src/acl/definition/internal/AclFactory.cjs.map +1 -1
  34. package/dist/development/src/acl/definition/internal/AclFactory.js +24 -16
  35. package/dist/development/src/acl/definition/internal/AclFactory.js.map +1 -1
  36. package/dist/development/src/acl/definition/internal/EntityPredicateResolver.cjs.map +1 -1
  37. package/dist/development/src/acl/definition/internal/EntityPredicateResolver.js.map +1 -1
  38. package/dist/development/src/acl/definition/internal/createPredicateName.cjs.map +1 -1
  39. package/dist/development/src/acl/definition/internal/createPredicateName.js.map +1 -1
  40. package/dist/development/src/acl/definition/internal/stores.cjs.map +1 -1
  41. package/dist/development/src/acl/definition/internal/stores.js.map +1 -1
  42. package/dist/development/src/acl/definition/permissions.cjs +5 -2
  43. package/dist/development/src/acl/definition/permissions.cjs.map +1 -1
  44. package/dist/development/src/acl/definition/permissions.js +5 -2
  45. package/dist/development/src/acl/definition/permissions.js.map +1 -1
  46. package/dist/development/src/acl/definition/references.cjs.map +1 -1
  47. package/dist/development/src/acl/definition/references.js.map +1 -1
  48. package/dist/development/src/acl/definition/roles.cjs.map +1 -1
  49. package/dist/development/src/acl/definition/roles.js.map +1 -1
  50. package/dist/development/src/acl/definition/variables.cjs.map +1 -1
  51. package/dist/development/src/acl/definition/variables.js.map +1 -1
  52. package/dist/development/src/actions/definition/index.cjs.map +1 -1
  53. package/dist/development/src/actions/definition/index.js.map +1 -1
  54. package/dist/development/src/actions/definition/internal/ActionsFactory.cjs +8 -7
  55. package/dist/development/src/actions/definition/internal/ActionsFactory.cjs.map +1 -1
  56. package/dist/development/src/actions/definition/internal/ActionsFactory.js +8 -7
  57. package/dist/development/src/actions/definition/internal/ActionsFactory.js.map +1 -1
  58. package/dist/development/src/actions/definition/internal/store.cjs.map +1 -1
  59. package/dist/development/src/actions/definition/internal/store.js.map +1 -1
  60. package/dist/development/src/actions/definition/targets.cjs.map +1 -1
  61. package/dist/development/src/actions/definition/targets.js.map +1 -1
  62. package/dist/development/src/actions/definition/triggers.cjs +4 -4
  63. package/dist/development/src/actions/definition/triggers.cjs.map +1 -1
  64. package/dist/development/src/actions/definition/triggers.js +4 -4
  65. package/dist/development/src/actions/definition/triggers.js.map +1 -1
  66. package/dist/development/src/createSchema.cjs.map +1 -1
  67. package/dist/development/src/createSchema.js.map +1 -1
  68. package/dist/development/src/model/builder/ColumnBuilder.cjs +7 -5
  69. package/dist/development/src/model/builder/ColumnBuilder.cjs.map +1 -1
  70. package/dist/development/src/model/builder/ColumnBuilder.js +7 -5
  71. package/dist/development/src/model/builder/ColumnBuilder.js.map +1 -1
  72. package/dist/development/src/model/builder/EntityBuilder.cjs.map +1 -1
  73. package/dist/development/src/model/builder/EntityBuilder.js.map +1 -1
  74. package/dist/development/src/model/builder/FieldBuilder.cjs +4 -4
  75. package/dist/development/src/model/builder/FieldBuilder.cjs.map +1 -1
  76. package/dist/development/src/model/builder/FieldBuilder.js.map +1 -1
  77. package/dist/development/src/model/builder/ManyHasManyBuilder.cjs.map +1 -1
  78. package/dist/development/src/model/builder/ManyHasManyBuilder.js.map +1 -1
  79. package/dist/development/src/model/builder/ManyHasOneBuilder.cjs.map +1 -1
  80. package/dist/development/src/model/builder/ManyHasOneBuilder.js.map +1 -1
  81. package/dist/development/src/model/builder/OneHasManyBuilder.cjs.map +1 -1
  82. package/dist/development/src/model/builder/OneHasManyBuilder.js.map +1 -1
  83. package/dist/development/src/model/builder/OneHasOneBuilder.cjs.map +1 -1
  84. package/dist/development/src/model/builder/OneHasOneBuilder.js.map +1 -1
  85. package/dist/development/src/model/builder/SchemaBuilder.cjs.map +1 -1
  86. package/dist/development/src/model/builder/SchemaBuilder.js.map +1 -1
  87. package/dist/development/src/model/builder/SchemaBuilderInternal.cjs.map +1 -1
  88. package/dist/development/src/model/builder/SchemaBuilderInternal.js.map +1 -1
  89. package/dist/development/src/model/builder/internal/ColumnProcessor.cjs.map +1 -1
  90. package/dist/development/src/model/builder/internal/ColumnProcessor.js.map +1 -1
  91. package/dist/development/src/model/builder/internal/ManyHasManyProcessor.cjs.map +1 -1
  92. package/dist/development/src/model/builder/internal/ManyHasManyProcessor.js.map +1 -1
  93. package/dist/development/src/model/builder/internal/ManyHasOneProcessor.cjs.map +1 -1
  94. package/dist/development/src/model/builder/internal/ManyHasOneProcessor.js.map +1 -1
  95. package/dist/development/src/model/builder/internal/OneHasManyProcessor.cjs.map +1 -1
  96. package/dist/development/src/model/builder/internal/OneHasManyProcessor.js.map +1 -1
  97. package/dist/development/src/model/builder/internal/OneHasOneProcessor.cjs.map +1 -1
  98. package/dist/development/src/model/builder/internal/OneHasOneProcessor.js.map +1 -1
  99. package/dist/development/src/model/definition/EnumDefinition.cjs.map +1 -1
  100. package/dist/development/src/model/definition/EnumDefinition.js.map +1 -1
  101. package/dist/development/src/model/definition/EventLogDefinition.cjs.map +1 -1
  102. package/dist/development/src/model/definition/EventLogDefinition.js.map +1 -1
  103. package/dist/development/src/model/definition/IndexDefinition.cjs +2 -2
  104. package/dist/development/src/model/definition/IndexDefinition.cjs.map +1 -1
  105. package/dist/development/src/model/definition/IndexDefinition.js +2 -2
  106. package/dist/development/src/model/definition/IndexDefinition.js.map +1 -1
  107. package/dist/development/src/model/definition/OrderByDefinition.cjs +3 -1
  108. package/dist/development/src/model/definition/OrderByDefinition.cjs.map +1 -1
  109. package/dist/development/src/model/definition/OrderByDefinition.js +3 -1
  110. package/dist/development/src/model/definition/OrderByDefinition.js.map +1 -1
  111. package/dist/development/src/model/definition/UniqueDefinition.cjs.map +1 -1
  112. package/dist/development/src/model/definition/UniqueDefinition.js.map +1 -1
  113. package/dist/development/src/model/definition/ViewDefinition.cjs.map +1 -1
  114. package/dist/development/src/model/definition/ViewDefinition.js.map +1 -1
  115. package/dist/development/src/model/definition/extensions.cjs +2 -2
  116. package/dist/development/src/model/definition/extensions.cjs.map +1 -1
  117. package/dist/development/src/model/definition/extensions.js +2 -2
  118. package/dist/development/src/model/definition/extensions.js.map +1 -1
  119. package/dist/development/src/model/definition/fieldDefinitions/ColumnDefinition.cjs +12 -1
  120. package/dist/development/src/model/definition/fieldDefinitions/ColumnDefinition.cjs.map +1 -1
  121. package/dist/development/src/model/definition/fieldDefinitions/ColumnDefinition.js +12 -1
  122. package/dist/development/src/model/definition/fieldDefinitions/ColumnDefinition.js.map +1 -1
  123. package/dist/development/src/model/definition/fieldDefinitions/FieldDefinition.cjs.map +1 -1
  124. package/dist/development/src/model/definition/fieldDefinitions/FieldDefinition.js.map +1 -1
  125. package/dist/development/src/model/definition/fieldDefinitions/ManyHasManyDefinition.cjs.map +1 -1
  126. package/dist/development/src/model/definition/fieldDefinitions/ManyHasManyDefinition.js.map +1 -1
  127. package/dist/development/src/model/definition/fieldDefinitions/ManyHasManyInverseDefinition.cjs.map +1 -1
  128. package/dist/development/src/model/definition/fieldDefinitions/ManyHasManyInverseDefinition.js.map +1 -1
  129. package/dist/development/src/model/definition/fieldDefinitions/ManyHasOneDefinition.cjs.map +1 -1
  130. package/dist/development/src/model/definition/fieldDefinitions/ManyHasOneDefinition.js.map +1 -1
  131. package/dist/development/src/model/definition/fieldDefinitions/OneHasManyDefinition.cjs.map +1 -1
  132. package/dist/development/src/model/definition/fieldDefinitions/OneHasManyDefinition.js.map +1 -1
  133. package/dist/development/src/model/definition/fieldDefinitions/OneHasOneDefinition.cjs.map +1 -1
  134. package/dist/development/src/model/definition/fieldDefinitions/OneHasOneDefinition.js.map +1 -1
  135. package/dist/development/src/model/definition/fieldDefinitions/OneHasOneInverseDefinition.cjs.map +1 -1
  136. package/dist/development/src/model/definition/fieldDefinitions/OneHasOneInverseDefinition.js.map +1 -1
  137. package/dist/development/src/model/definition/index.cjs.map +1 -1
  138. package/dist/development/src/model/definition/index.js.map +1 -1
  139. package/dist/development/src/model/definition/internal/EntityRegistry.cjs.map +1 -1
  140. package/dist/development/src/model/definition/internal/EntityRegistry.js.map +1 -1
  141. package/dist/development/src/model/definition/internal/EnumRegistry.cjs.map +1 -1
  142. package/dist/development/src/model/definition/internal/EnumRegistry.js.map +1 -1
  143. package/dist/development/src/model/definition/internal/SchemaBuilder.cjs.map +1 -1
  144. package/dist/development/src/model/definition/internal/SchemaBuilder.js.map +1 -1
  145. package/dist/development/src/presets.cjs.map +1 -1
  146. package/dist/development/src/presets.js.map +1 -1
  147. package/dist/development/src/strict.cjs +3 -1
  148. package/dist/development/src/strict.cjs.map +1 -1
  149. package/dist/development/src/strict.js +3 -1
  150. package/dist/development/src/strict.js.map +1 -1
  151. package/dist/development/src/utils/MetadataStore.cjs +16 -4
  152. package/dist/development/src/utils/MetadataStore.cjs.map +1 -1
  153. package/dist/development/src/utils/MetadataStore.js +16 -4
  154. package/dist/development/src/utils/MetadataStore.js.map +1 -1
  155. package/dist/development/src/utils/assertNever.cjs.map +1 -1
  156. package/dist/development/src/utils/assertNever.js.map +1 -1
  157. package/dist/development/src/utils/filterEntityDefinition.cjs.map +1 -1
  158. package/dist/development/src/utils/filterEntityDefinition.js.map +1 -1
  159. package/dist/development/src/utils/tuple.cjs.map +1 -1
  160. package/dist/development/src/utils/tuple.js.map +1 -1
  161. package/dist/development/src/validation/index.cjs +25 -11
  162. package/dist/development/src/validation/index.cjs.map +1 -1
  163. package/dist/development/src/validation/index.js +25 -11
  164. package/dist/development/src/validation/index.js.map +1 -1
  165. package/dist/production/index.cjs +33 -33
  166. package/dist/production/index.cjs.map +1 -1
  167. package/dist/production/index.js +25 -25
  168. package/dist/production/index.js.map +1 -1
  169. package/dist/production/src/acl/builder/EntityPermissionsBuilder.cjs.map +1 -1
  170. package/dist/production/src/acl/builder/EntityPermissionsBuilder.js.map +1 -1
  171. package/dist/production/src/acl/builder/EntitySelector.cjs.map +1 -1
  172. package/dist/production/src/acl/builder/EntitySelector.js.map +1 -1
  173. package/dist/production/src/acl/builder/FieldPermissionsBuilder.cjs.map +1 -1
  174. package/dist/production/src/acl/builder/FieldPermissionsBuilder.js.map +1 -1
  175. package/dist/production/src/acl/builder/FieldSelector.cjs.map +1 -1
  176. package/dist/production/src/acl/builder/FieldSelector.js.map +1 -1
  177. package/dist/production/src/acl/builder/PermissionOverrider.cjs.map +1 -1
  178. package/dist/production/src/acl/builder/PermissionOverrider.js.map +1 -1
  179. package/dist/production/src/acl/builder/PermissionsBuilder.cjs +1 -3
  180. package/dist/production/src/acl/builder/PermissionsBuilder.cjs.map +1 -1
  181. package/dist/production/src/acl/builder/PermissionsBuilder.js +1 -3
  182. package/dist/production/src/acl/builder/PermissionsBuilder.js.map +1 -1
  183. package/dist/production/src/acl/builder/PredicateReference.cjs.map +1 -1
  184. package/dist/production/src/acl/builder/PredicateReference.js.map +1 -1
  185. package/dist/production/src/acl/definition/aclExtensions.cjs +2 -2
  186. package/dist/production/src/acl/definition/aclExtensions.cjs.map +1 -1
  187. package/dist/production/src/acl/definition/aclExtensions.js +2 -2
  188. package/dist/production/src/acl/definition/aclExtensions.js.map +1 -1
  189. package/dist/production/src/acl/definition/customPrimary.cjs +1 -1
  190. package/dist/production/src/acl/definition/customPrimary.cjs.map +1 -1
  191. package/dist/production/src/acl/definition/customPrimary.js +1 -1
  192. package/dist/production/src/acl/definition/customPrimary.js.map +1 -1
  193. package/dist/production/src/acl/definition/index.cjs.map +1 -1
  194. package/dist/production/src/acl/definition/index.js.map +1 -1
  195. package/dist/production/src/acl/definition/internal/AclFactory.cjs +24 -16
  196. package/dist/production/src/acl/definition/internal/AclFactory.cjs.map +1 -1
  197. package/dist/production/src/acl/definition/internal/AclFactory.js +24 -16
  198. package/dist/production/src/acl/definition/internal/AclFactory.js.map +1 -1
  199. package/dist/production/src/acl/definition/internal/EntityPredicateResolver.cjs.map +1 -1
  200. package/dist/production/src/acl/definition/internal/EntityPredicateResolver.js.map +1 -1
  201. package/dist/production/src/acl/definition/internal/createPredicateName.cjs.map +1 -1
  202. package/dist/production/src/acl/definition/internal/createPredicateName.js.map +1 -1
  203. package/dist/production/src/acl/definition/internal/stores.cjs.map +1 -1
  204. package/dist/production/src/acl/definition/internal/stores.js.map +1 -1
  205. package/dist/production/src/acl/definition/permissions.cjs +5 -2
  206. package/dist/production/src/acl/definition/permissions.cjs.map +1 -1
  207. package/dist/production/src/acl/definition/permissions.js +5 -2
  208. package/dist/production/src/acl/definition/permissions.js.map +1 -1
  209. package/dist/production/src/acl/definition/references.cjs.map +1 -1
  210. package/dist/production/src/acl/definition/references.js.map +1 -1
  211. package/dist/production/src/acl/definition/roles.cjs.map +1 -1
  212. package/dist/production/src/acl/definition/roles.js.map +1 -1
  213. package/dist/production/src/acl/definition/variables.cjs.map +1 -1
  214. package/dist/production/src/acl/definition/variables.js.map +1 -1
  215. package/dist/production/src/actions/definition/index.cjs.map +1 -1
  216. package/dist/production/src/actions/definition/index.js.map +1 -1
  217. package/dist/production/src/actions/definition/internal/ActionsFactory.cjs +8 -7
  218. package/dist/production/src/actions/definition/internal/ActionsFactory.cjs.map +1 -1
  219. package/dist/production/src/actions/definition/internal/ActionsFactory.js +8 -7
  220. package/dist/production/src/actions/definition/internal/ActionsFactory.js.map +1 -1
  221. package/dist/production/src/actions/definition/internal/store.cjs.map +1 -1
  222. package/dist/production/src/actions/definition/internal/store.js.map +1 -1
  223. package/dist/production/src/actions/definition/targets.cjs.map +1 -1
  224. package/dist/production/src/actions/definition/targets.js.map +1 -1
  225. package/dist/production/src/actions/definition/triggers.cjs +4 -4
  226. package/dist/production/src/actions/definition/triggers.cjs.map +1 -1
  227. package/dist/production/src/actions/definition/triggers.js +4 -4
  228. package/dist/production/src/actions/definition/triggers.js.map +1 -1
  229. package/dist/production/src/createSchema.cjs.map +1 -1
  230. package/dist/production/src/createSchema.js.map +1 -1
  231. package/dist/production/src/model/builder/ColumnBuilder.cjs +7 -5
  232. package/dist/production/src/model/builder/ColumnBuilder.cjs.map +1 -1
  233. package/dist/production/src/model/builder/ColumnBuilder.js +7 -5
  234. package/dist/production/src/model/builder/ColumnBuilder.js.map +1 -1
  235. package/dist/production/src/model/builder/EntityBuilder.cjs.map +1 -1
  236. package/dist/production/src/model/builder/EntityBuilder.js.map +1 -1
  237. package/dist/production/src/model/builder/FieldBuilder.cjs +4 -4
  238. package/dist/production/src/model/builder/FieldBuilder.cjs.map +1 -1
  239. package/dist/production/src/model/builder/FieldBuilder.js.map +1 -1
  240. package/dist/production/src/model/builder/ManyHasManyBuilder.cjs.map +1 -1
  241. package/dist/production/src/model/builder/ManyHasManyBuilder.js.map +1 -1
  242. package/dist/production/src/model/builder/ManyHasOneBuilder.cjs.map +1 -1
  243. package/dist/production/src/model/builder/ManyHasOneBuilder.js.map +1 -1
  244. package/dist/production/src/model/builder/OneHasManyBuilder.cjs.map +1 -1
  245. package/dist/production/src/model/builder/OneHasManyBuilder.js.map +1 -1
  246. package/dist/production/src/model/builder/OneHasOneBuilder.cjs.map +1 -1
  247. package/dist/production/src/model/builder/OneHasOneBuilder.js.map +1 -1
  248. package/dist/production/src/model/builder/SchemaBuilder.cjs.map +1 -1
  249. package/dist/production/src/model/builder/SchemaBuilder.js.map +1 -1
  250. package/dist/production/src/model/builder/SchemaBuilderInternal.cjs.map +1 -1
  251. package/dist/production/src/model/builder/SchemaBuilderInternal.js.map +1 -1
  252. package/dist/production/src/model/builder/internal/ColumnProcessor.cjs.map +1 -1
  253. package/dist/production/src/model/builder/internal/ColumnProcessor.js.map +1 -1
  254. package/dist/production/src/model/builder/internal/ManyHasManyProcessor.cjs.map +1 -1
  255. package/dist/production/src/model/builder/internal/ManyHasManyProcessor.js.map +1 -1
  256. package/dist/production/src/model/builder/internal/ManyHasOneProcessor.cjs.map +1 -1
  257. package/dist/production/src/model/builder/internal/ManyHasOneProcessor.js.map +1 -1
  258. package/dist/production/src/model/builder/internal/OneHasManyProcessor.cjs.map +1 -1
  259. package/dist/production/src/model/builder/internal/OneHasManyProcessor.js.map +1 -1
  260. package/dist/production/src/model/builder/internal/OneHasOneProcessor.cjs.map +1 -1
  261. package/dist/production/src/model/builder/internal/OneHasOneProcessor.js.map +1 -1
  262. package/dist/production/src/model/definition/EnumDefinition.cjs.map +1 -1
  263. package/dist/production/src/model/definition/EnumDefinition.js.map +1 -1
  264. package/dist/production/src/model/definition/EventLogDefinition.cjs.map +1 -1
  265. package/dist/production/src/model/definition/EventLogDefinition.js.map +1 -1
  266. package/dist/production/src/model/definition/IndexDefinition.cjs +2 -2
  267. package/dist/production/src/model/definition/IndexDefinition.cjs.map +1 -1
  268. package/dist/production/src/model/definition/IndexDefinition.js +2 -2
  269. package/dist/production/src/model/definition/IndexDefinition.js.map +1 -1
  270. package/dist/production/src/model/definition/OrderByDefinition.cjs +3 -1
  271. package/dist/production/src/model/definition/OrderByDefinition.cjs.map +1 -1
  272. package/dist/production/src/model/definition/OrderByDefinition.js +3 -1
  273. package/dist/production/src/model/definition/OrderByDefinition.js.map +1 -1
  274. package/dist/production/src/model/definition/UniqueDefinition.cjs.map +1 -1
  275. package/dist/production/src/model/definition/UniqueDefinition.js.map +1 -1
  276. package/dist/production/src/model/definition/ViewDefinition.cjs.map +1 -1
  277. package/dist/production/src/model/definition/ViewDefinition.js.map +1 -1
  278. package/dist/production/src/model/definition/extensions.cjs +2 -2
  279. package/dist/production/src/model/definition/extensions.cjs.map +1 -1
  280. package/dist/production/src/model/definition/extensions.js +2 -2
  281. package/dist/production/src/model/definition/extensions.js.map +1 -1
  282. package/dist/production/src/model/definition/fieldDefinitions/ColumnDefinition.cjs +12 -1
  283. package/dist/production/src/model/definition/fieldDefinitions/ColumnDefinition.cjs.map +1 -1
  284. package/dist/production/src/model/definition/fieldDefinitions/ColumnDefinition.js +12 -1
  285. package/dist/production/src/model/definition/fieldDefinitions/ColumnDefinition.js.map +1 -1
  286. package/dist/production/src/model/definition/fieldDefinitions/FieldDefinition.cjs.map +1 -1
  287. package/dist/production/src/model/definition/fieldDefinitions/FieldDefinition.js.map +1 -1
  288. package/dist/production/src/model/definition/fieldDefinitions/ManyHasManyDefinition.cjs.map +1 -1
  289. package/dist/production/src/model/definition/fieldDefinitions/ManyHasManyDefinition.js.map +1 -1
  290. package/dist/production/src/model/definition/fieldDefinitions/ManyHasManyInverseDefinition.cjs.map +1 -1
  291. package/dist/production/src/model/definition/fieldDefinitions/ManyHasManyInverseDefinition.js.map +1 -1
  292. package/dist/production/src/model/definition/fieldDefinitions/ManyHasOneDefinition.cjs.map +1 -1
  293. package/dist/production/src/model/definition/fieldDefinitions/ManyHasOneDefinition.js.map +1 -1
  294. package/dist/production/src/model/definition/fieldDefinitions/OneHasManyDefinition.cjs.map +1 -1
  295. package/dist/production/src/model/definition/fieldDefinitions/OneHasManyDefinition.js.map +1 -1
  296. package/dist/production/src/model/definition/fieldDefinitions/OneHasOneDefinition.cjs.map +1 -1
  297. package/dist/production/src/model/definition/fieldDefinitions/OneHasOneDefinition.js.map +1 -1
  298. package/dist/production/src/model/definition/fieldDefinitions/OneHasOneInverseDefinition.cjs.map +1 -1
  299. package/dist/production/src/model/definition/fieldDefinitions/OneHasOneInverseDefinition.js.map +1 -1
  300. package/dist/production/src/model/definition/index.cjs.map +1 -1
  301. package/dist/production/src/model/definition/index.js.map +1 -1
  302. package/dist/production/src/model/definition/internal/EntityRegistry.cjs.map +1 -1
  303. package/dist/production/src/model/definition/internal/EntityRegistry.js.map +1 -1
  304. package/dist/production/src/model/definition/internal/EnumRegistry.cjs.map +1 -1
  305. package/dist/production/src/model/definition/internal/EnumRegistry.js.map +1 -1
  306. package/dist/production/src/model/definition/internal/SchemaBuilder.cjs.map +1 -1
  307. package/dist/production/src/model/definition/internal/SchemaBuilder.js.map +1 -1
  308. package/dist/production/src/presets.cjs.map +1 -1
  309. package/dist/production/src/presets.js.map +1 -1
  310. package/dist/production/src/strict.cjs +3 -1
  311. package/dist/production/src/strict.cjs.map +1 -1
  312. package/dist/production/src/strict.js +3 -1
  313. package/dist/production/src/strict.js.map +1 -1
  314. package/dist/production/src/utils/MetadataStore.cjs +16 -4
  315. package/dist/production/src/utils/MetadataStore.cjs.map +1 -1
  316. package/dist/production/src/utils/MetadataStore.js +16 -4
  317. package/dist/production/src/utils/MetadataStore.js.map +1 -1
  318. package/dist/production/src/utils/assertNever.cjs.map +1 -1
  319. package/dist/production/src/utils/assertNever.js.map +1 -1
  320. package/dist/production/src/utils/filterEntityDefinition.cjs.map +1 -1
  321. package/dist/production/src/utils/filterEntityDefinition.js.map +1 -1
  322. package/dist/production/src/utils/tuple.cjs.map +1 -1
  323. package/dist/production/src/utils/tuple.js.map +1 -1
  324. package/dist/production/src/validation/index.cjs +25 -11
  325. package/dist/production/src/validation/index.cjs.map +1 -1
  326. package/dist/production/src/validation/index.js +25 -11
  327. package/dist/production/src/validation/index.js.map +1 -1
  328. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  329. package/dist/types/acl/builder/PermissionOverrider.d.ts.map +1 -1
  330. package/dist/types/acl/builder/PermissionsBuilder.d.ts.map +1 -1
  331. package/dist/types/acl/definition/aclExtensions.d.ts.map +1 -1
  332. package/dist/types/acl/definition/internal/AclFactory.d.ts +1 -1
  333. package/dist/types/acl/definition/internal/AclFactory.d.ts.map +1 -1
  334. package/dist/types/acl/definition/internal/EntityPredicateResolver.d.ts.map +1 -1
  335. package/dist/types/acl/definition/internal/stores.d.ts +4 -3
  336. package/dist/types/acl/definition/internal/stores.d.ts.map +1 -1
  337. package/dist/types/acl/definition/permissions.d.ts +7 -2
  338. package/dist/types/acl/definition/permissions.d.ts.map +1 -1
  339. package/dist/types/acl/definition/variables.d.ts.map +1 -1
  340. package/dist/types/actions/definition/index.d.ts.map +1 -1
  341. package/dist/types/actions/definition/internal/ActionsFactory.d.ts +0 -1
  342. package/dist/types/actions/definition/internal/ActionsFactory.d.ts.map +1 -1
  343. package/dist/types/actions/definition/targets.d.ts.map +1 -1
  344. package/dist/types/actions/definition/triggers.d.ts +1 -0
  345. package/dist/types/actions/definition/triggers.d.ts.map +1 -1
  346. package/dist/types/createSchema.d.ts.map +1 -1
  347. package/dist/types/index.d.ts +3 -3
  348. package/dist/types/index.d.ts.map +1 -1
  349. package/dist/types/model/builder/ColumnBuilder.d.ts.map +1 -1
  350. package/dist/types/model/builder/internal/ColumnProcessor.d.ts.map +1 -1
  351. package/dist/types/model/definition/IndexDefinition.d.ts +2 -0
  352. package/dist/types/model/definition/IndexDefinition.d.ts.map +1 -1
  353. package/dist/types/model/definition/OrderByDefinition.d.ts.map +1 -1
  354. package/dist/types/model/definition/UniqueDefinition.d.ts +1 -0
  355. package/dist/types/model/definition/UniqueDefinition.d.ts.map +1 -1
  356. package/dist/types/model/definition/fieldDefinitions/ColumnDefinition.d.ts.map +1 -1
  357. package/dist/types/model/definition/fieldDefinitions/FieldDefinition.d.ts.map +1 -1
  358. package/dist/types/model/definition/fieldDefinitions/ManyHasManyDefinition.d.ts.map +1 -1
  359. package/dist/types/model/definition/fieldDefinitions/ManyHasManyInverseDefinition.d.ts.map +1 -1
  360. package/dist/types/model/definition/fieldDefinitions/ManyHasOneDefinition.d.ts.map +1 -1
  361. package/dist/types/model/definition/fieldDefinitions/OneHasManyDefinition.d.ts.map +1 -1
  362. package/dist/types/model/definition/fieldDefinitions/OneHasOneDefinition.d.ts.map +1 -1
  363. package/dist/types/model/definition/fieldDefinitions/OneHasOneInverseDefinition.d.ts.map +1 -1
  364. package/dist/types/model/definition/index.d.ts +1 -1
  365. package/dist/types/model/definition/index.d.ts.map +1 -1
  366. package/dist/types/model/definition/internal/SchemaBuilder.d.ts.map +1 -1
  367. package/dist/types/model/definition/types.d.ts +1 -1
  368. package/dist/types/model/definition/types.d.ts.map +1 -1
  369. package/dist/types/model/index.d.ts +1 -1
  370. package/dist/types/model/index.d.ts.map +1 -1
  371. package/dist/types/presets.d.ts.map +1 -1
  372. package/dist/types/strict.d.ts.map +1 -1
  373. package/dist/types/tsconfig.tsbuildinfo +1 -1
  374. package/dist/types/utils/MetadataStore.d.ts +1 -1
  375. package/dist/types/utils/MetadataStore.d.ts.map +1 -1
  376. package/dist/types/utils/decorators.d.ts +1 -1
  377. package/dist/types/utils/decorators.d.ts.map +1 -1
  378. package/dist/types/utils/filterEntityDefinition.d.ts.map +1 -1
  379. package/dist/types/validation/index.d.ts +0 -1
  380. package/dist/types/validation/index.d.ts.map +1 -1
  381. package/package.json +11 -6
  382. package/src/acl/builder/EntityPermissionsBuilder.ts +1 -1
  383. package/src/acl/builder/EntitySelector.ts +2 -2
  384. package/src/acl/builder/PermissionOverrider.ts +10 -8
  385. package/src/acl/builder/PermissionsBuilder.ts +1 -3
  386. package/src/acl/definition/aclExtensions.ts +7 -8
  387. package/src/acl/definition/customPrimary.ts +1 -1
  388. package/src/acl/definition/internal/AclFactory.ts +30 -25
  389. package/src/acl/definition/internal/EntityPredicateResolver.ts +4 -4
  390. package/src/acl/definition/internal/stores.ts +5 -6
  391. package/src/acl/definition/permissions.ts +14 -8
  392. package/src/acl/definition/variables.ts +5 -1
  393. package/src/actions/definition/index.ts +0 -1
  394. package/src/actions/definition/internal/ActionsFactory.ts +7 -9
  395. package/src/actions/definition/targets.ts +0 -1
  396. package/src/actions/definition/triggers.ts +9 -7
  397. package/src/createSchema.ts +1 -1
  398. package/src/index.ts +6 -11
  399. package/src/model/builder/ColumnBuilder.ts +7 -5
  400. package/src/model/builder/internal/ColumnProcessor.ts +0 -1
  401. package/src/model/definition/IndexDefinition.ts +7 -3
  402. package/src/model/definition/OrderByDefinition.ts +7 -5
  403. package/src/model/definition/UniqueDefinition.ts +14 -12
  404. package/src/model/definition/extensions.ts +2 -2
  405. package/src/model/definition/fieldDefinitions/ColumnDefinition.ts +12 -4
  406. package/src/model/definition/fieldDefinitions/FieldDefinition.ts +1 -1
  407. package/src/model/definition/fieldDefinitions/ManyHasManyDefinition.ts +0 -2
  408. package/src/model/definition/fieldDefinitions/ManyHasManyInverseDefinition.ts +4 -2
  409. package/src/model/definition/fieldDefinitions/ManyHasOneDefinition.ts +1 -1
  410. package/src/model/definition/fieldDefinitions/OneHasManyDefinition.ts +0 -1
  411. package/src/model/definition/fieldDefinitions/OneHasOneDefinition.ts +0 -2
  412. package/src/model/definition/fieldDefinitions/OneHasOneInverseDefinition.ts +5 -3
  413. package/src/model/definition/index.ts +2 -2
  414. package/src/model/definition/internal/SchemaBuilder.ts +1 -2
  415. package/src/model/definition/types.ts +1 -1
  416. package/src/model/index.ts +1 -10
  417. package/src/presets.ts +0 -2
  418. package/src/strict.ts +4 -4
  419. package/src/utils/MetadataStore.ts +18 -4
  420. package/src/utils/decorators.ts +1 -1
  421. package/src/utils/filterEntityDefinition.ts +3 -2
  422. package/src/validation/index.ts +30 -21
  423. package/tests/cases/unit/createSchema.test.ts +5 -6
  424. package/tests/cases/unit/extendEntity.test.ts +1 -2
  425. package/tests/cases/unit/orderBy.test.ts +3 -6
  426. package/tests/cases/unit/readAclDefinitions.test.ts +191 -176
  427. package/tests/cases/unit/readActions.test.ts +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"PermissionsBuilder.cjs","sources":["../../../../../../packages/schema-definition/src/acl/builder/PermissionsBuilder.ts"],"sourcesContent":["import { Acl, Model } from '@contember/schema'\nimport { AllowAllPermissionFactory } from '@contember/schema-utils'\nimport PermissionOverrider from './PermissionOverrider'\nimport EntitySelector from './EntitySelector'\nimport EntityPermissionsBuilder from './EntityPermissionsBuilder'\nimport FieldSelector from './FieldSelector'\nimport Reference from './PredicateReference'\n\nclass PermissionsBuilder {\n\tconstructor(public readonly schema: Model.Schema, public readonly permissions: Acl.Permissions) {}\n\n\tpublic static create(model: Model.Schema): PermissionsBuilder {\n\t\treturn new PermissionsBuilder(model, {})\n\t}\n\n\tpublic allowAll(): PermissionsBuilder {\n\t\treturn this.allow([Acl.Operation.read, Acl.Operation.update, Acl.Operation.delete, Acl.Operation.create])\n\t}\n\n\tpublic allow(operations: Acl.Operation[]): PermissionsBuilder {\n\t\tconst allowAllFactory = new AllowAllPermissionFactory(operations)\n\t\treturn this.add(allowAllFactory.create(this.schema))\n\t}\n\n\tpublic allowCustomPrimary(): PermissionsBuilder {\n\t\treturn this.onEveryEntity().allowCustomPrimary().builder\n\t}\n\n\tpublic add(permissions: Acl.Permissions): PermissionsBuilder {\n\t\tconst overrider = new PermissionOverrider()\n\t\treturn new PermissionsBuilder(this.schema, overrider.override(this.permissions, permissions))\n\t}\n\n\tpublic onEntity(entitySelector: EntitySelector | string | string[]): EntityPermissionsBuilder {\n\t\tif (typeof entitySelector === 'string') {\n\t\t\tentitySelector = EntitySelector.named(entitySelector)\n\t\t} else if (Array.isArray(entitySelector)) {\n\t\t\tentitySelector = EntitySelector.named(...entitySelector)\n\t\t}\n\t\tconst entitySelectorWithType = entitySelector\n\t\tconst entities = Object.values(this.schema.entities).filter(entity =>\n\t\t\tentitySelectorWithType.matches(this.schema, entity),\n\t\t)\n\t\treturn new EntityPermissionsBuilder(this, entities)\n\t}\n\n\tpublic onEveryEntity(): EntityPermissionsBuilder {\n\t\treturn this.onEntity(EntitySelector.every())\n\t}\n}\n\nnamespace PermissionsBuilder {\n\texport const everyEntity = () => {\n\t\treturn EntitySelector.every()\n\t}\n\texport const everyField = () => {\n\t\treturn FieldSelector.every()\n\t}\n\texport const predicateReference = (name: Acl.PredicateReference) => new Reference(name)\n}\nexport { PermissionsBuilder }\n"],"names":["schema","Acl","AllowAllPermissionFactory","PermissionsBuilder","Reference"],"mappings":";;;;;;;;;AAQA,MAAM,mBAAmB;AAAA,EACxB,YAA4BA,SAAsC,aAA8B;AAApE,SAAA,SAAAA;AAAsC,SAAA,cAAA;AAAA,EAAA;AAAA,EAElE,OAAc,OAAO,OAAyC;AAC7D,WAAO,IAAI,mBAAmB,OAAO,EAAE;AAAA,EAAA;AAAA,EAGjC,WAA+B;AACrC,WAAO,KAAK,MAAM,CAACC,OAAA,IAAI,UAAU,MAAMA,WAAI,UAAU,QAAQA,OAAAA,IAAI,UAAU,QAAQA,OAAAA,IAAI,UAAU,MAAM,CAAC;AAAA,EAAA;AAAA,EAGlG,MAAM,YAAiD;AACvD,UAAA,kBAAkB,IAAIC,YAAA,0BAA0B,UAAU;AAChE,WAAO,KAAK,IAAI,gBAAgB,OAAO,KAAK,MAAM,CAAC;AAAA,EAAA;AAAA,EAG7C,qBAAyC;AAC/C,WAAO,KAAK,gBAAgB,mBAAqB,EAAA;AAAA,EAAA;AAAA,EAG3C,IAAI,aAAkD;AACtD,UAAA,YAAY,IAAI,oBAAoB;AACnC,WAAA,IAAI,mBAAmB,KAAK,QAAQ,UAAU,SAAS,KAAK,aAAa,WAAW,CAAC;AAAA,EAAA;AAAA,EAGtF,SAAS,gBAA8E;AACzF,QAAA,OAAO,mBAAmB,UAAU;AACtB,uBAAA,eAAe,MAAM,cAAc;AAAA,IAC1C,WAAA,MAAM,QAAQ,cAAc,GAAG;AACxB,uBAAA,eAAe,MAAM,GAAG,cAAc;AAAA,IAAA;AAExD,UAAM,yBAAyB;AAC/B,UAAM,WAAW,OAAO,OAAO,KAAK,OAAO,QAAQ,EAAE;AAAA,MAAO,CAC3D,WAAA,uBAAuB,QAAQ,KAAK,QAAQ,MAAM;AAAA,IACnD;AACO,WAAA,IAAI,yBAAyB,MAAM,QAAQ;AAAA,EAAA;AAAA,EAG5C,gBAA0C;AAChD,WAAO,KAAK,SAAS,eAAe,MAAA,CAAO;AAAA,EAAA;AAE7C;AAAA,CAEA,CAAUC,wBAAV;AACcA,sBAAA,cAAc,MAAM;AAChC,WAAO,eAAe,MAAM;AAAA,EAC7B;AACaA,sBAAA,aAAa,MAAM;AAC/B,WAAO,cAAc,MAAM;AAAA,EAC5B;AACaA,sBAAA,qBAAqB,CAAC,SAAiC,IAAIC,mBAAAA,QAAU,IAAI;AAAA,GAP7E,uBAAA,qBAAA,CAAA,EAAA;;"}
1
+ {"version":3,"file":"PermissionsBuilder.cjs","sources":["../../../../../../packages/schema-definition/src/acl/builder/PermissionsBuilder.ts"],"sourcesContent":["import { Acl, Model } from '@contember/schema'\nimport { AllowAllPermissionFactory } from '@contember/schema-utils'\nimport PermissionOverrider from './PermissionOverrider'\nimport EntitySelector from './EntitySelector'\nimport EntityPermissionsBuilder from './EntityPermissionsBuilder'\nimport FieldSelector from './FieldSelector'\nimport Reference from './PredicateReference'\n\nclass PermissionsBuilder {\n\tconstructor(public readonly schema: Model.Schema, public readonly permissions: Acl.Permissions) {}\n\n\tpublic static create(model: Model.Schema): PermissionsBuilder {\n\t\treturn new PermissionsBuilder(model, {})\n\t}\n\n\tpublic allowAll(): PermissionsBuilder {\n\t\treturn this.allow([Acl.Operation.read, Acl.Operation.update, Acl.Operation.delete, Acl.Operation.create])\n\t}\n\n\tpublic allow(operations: Acl.Operation[]): PermissionsBuilder {\n\t\tconst allowAllFactory = new AllowAllPermissionFactory(operations)\n\t\treturn this.add(allowAllFactory.create(this.schema))\n\t}\n\n\tpublic allowCustomPrimary(): PermissionsBuilder {\n\t\treturn this.onEveryEntity().allowCustomPrimary().builder\n\t}\n\n\tpublic add(permissions: Acl.Permissions): PermissionsBuilder {\n\t\tconst overrider = new PermissionOverrider()\n\t\treturn new PermissionsBuilder(this.schema, overrider.override(this.permissions, permissions))\n\t}\n\n\tpublic onEntity(entitySelector: EntitySelector | string | string[]): EntityPermissionsBuilder {\n\t\tif (typeof entitySelector === 'string') {\n\t\t\tentitySelector = EntitySelector.named(entitySelector)\n\t\t} else if (Array.isArray(entitySelector)) {\n\t\t\tentitySelector = EntitySelector.named(...entitySelector)\n\t\t}\n\t\tconst entitySelectorWithType = entitySelector\n\t\tconst entities = Object.values(this.schema.entities).filter(entity => entitySelectorWithType.matches(this.schema, entity))\n\t\treturn new EntityPermissionsBuilder(this, entities)\n\t}\n\n\tpublic onEveryEntity(): EntityPermissionsBuilder {\n\t\treturn this.onEntity(EntitySelector.every())\n\t}\n}\n\nnamespace PermissionsBuilder {\n\texport const everyEntity = () => {\n\t\treturn EntitySelector.every()\n\t}\n\texport const everyField = () => {\n\t\treturn FieldSelector.every()\n\t}\n\texport const predicateReference = (name: Acl.PredicateReference) => new Reference(name)\n}\nexport { PermissionsBuilder }\n"],"names":["schema","Acl","AllowAllPermissionFactory","PermissionsBuilder","Reference"],"mappings":";;;;;;;;;AAQA,MAAM,mBAAmB;AAAA,EACxB,YAA4BA,SAAsC,aAA8B;AAApE,SAAA,SAAAA;AAAsC,SAAA,cAAA;AAAA,EAA+B;AAAA,EAEjG,OAAc,OAAO,OAAyC;AAC7D,WAAO,IAAI,mBAAmB,OAAO,EAAE;AAAA,EACxC;AAAA,EAEO,WAA+B;AACrC,WAAO,KAAK,MAAM,CAACC,OAAAA,IAAI,UAAU,MAAMA,WAAI,UAAU,QAAQA,OAAAA,IAAI,UAAU,QAAQA,OAAAA,IAAI,UAAU,MAAM,CAAC;AAAA,EACzG;AAAA,EAEO,MAAM,YAAiD;AAC7D,UAAM,kBAAkB,IAAIC,YAAAA,0BAA0B,UAAU;AAChE,WAAO,KAAK,IAAI,gBAAgB,OAAO,KAAK,MAAM,CAAC;AAAA,EACpD;AAAA,EAEO,qBAAyC;AAC/C,WAAO,KAAK,gBAAgB,mBAAA,EAAqB;AAAA,EAClD;AAAA,EAEO,IAAI,aAAkD;AAC5D,UAAM,YAAY,IAAI,oBAAA;AACtB,WAAO,IAAI,mBAAmB,KAAK,QAAQ,UAAU,SAAS,KAAK,aAAa,WAAW,CAAC;AAAA,EAC7F;AAAA,EAEO,SAAS,gBAA8E;AAC7F,QAAI,OAAO,mBAAmB,UAAU;AACvC,uBAAiB,eAAe,MAAM,cAAc;AAAA,IACrD,WAAW,MAAM,QAAQ,cAAc,GAAG;AACzC,uBAAiB,eAAe,MAAM,GAAG,cAAc;AAAA,IACxD;AACA,UAAM,yBAAyB;AAC/B,UAAM,WAAW,OAAO,OAAO,KAAK,OAAO,QAAQ,EAAE,OAAO,CAAA,WAAU,uBAAuB,QAAQ,KAAK,QAAQ,MAAM,CAAC;AACzH,WAAO,IAAI,yBAAyB,MAAM,QAAQ;AAAA,EACnD;AAAA,EAEO,gBAA0C;AAChD,WAAO,KAAK,SAAS,eAAe,MAAA,CAAO;AAAA,EAC5C;AACD;AAAA,CAEA,CAAUC,wBAAV;AACcA,sBAAA,cAAc,MAAM;AAChC,WAAO,eAAe,MAAA;AAAA,EACvB;AACaA,sBAAA,aAAa,MAAM;AAC/B,WAAO,cAAc,MAAA;AAAA,EACtB;AACaA,sBAAA,qBAAqB,CAAC,SAAiC,IAAIC,mBAAAA,QAAU,IAAI;AAAA,GAP7E,uBAAA,qBAAA,CAAA,EAAA;;"}
@@ -34,9 +34,7 @@ class PermissionsBuilder {
34
34
  entitySelector = EntitySelector.named(...entitySelector);
35
35
  }
36
36
  const entitySelectorWithType = entitySelector;
37
- const entities = Object.values(this.schema.entities).filter(
38
- (entity) => entitySelectorWithType.matches(this.schema, entity)
39
- );
37
+ const entities = Object.values(this.schema.entities).filter((entity) => entitySelectorWithType.matches(this.schema, entity));
40
38
  return new EntityPermissionsBuilder(this, entities);
41
39
  }
42
40
  onEveryEntity() {
@@ -1 +1 @@
1
- {"version":3,"file":"PermissionsBuilder.js","sources":["../../../../../../packages/schema-definition/src/acl/builder/PermissionsBuilder.ts"],"sourcesContent":["import { Acl, Model } from '@contember/schema'\nimport { AllowAllPermissionFactory } from '@contember/schema-utils'\nimport PermissionOverrider from './PermissionOverrider'\nimport EntitySelector from './EntitySelector'\nimport EntityPermissionsBuilder from './EntityPermissionsBuilder'\nimport FieldSelector from './FieldSelector'\nimport Reference from './PredicateReference'\n\nclass PermissionsBuilder {\n\tconstructor(public readonly schema: Model.Schema, public readonly permissions: Acl.Permissions) {}\n\n\tpublic static create(model: Model.Schema): PermissionsBuilder {\n\t\treturn new PermissionsBuilder(model, {})\n\t}\n\n\tpublic allowAll(): PermissionsBuilder {\n\t\treturn this.allow([Acl.Operation.read, Acl.Operation.update, Acl.Operation.delete, Acl.Operation.create])\n\t}\n\n\tpublic allow(operations: Acl.Operation[]): PermissionsBuilder {\n\t\tconst allowAllFactory = new AllowAllPermissionFactory(operations)\n\t\treturn this.add(allowAllFactory.create(this.schema))\n\t}\n\n\tpublic allowCustomPrimary(): PermissionsBuilder {\n\t\treturn this.onEveryEntity().allowCustomPrimary().builder\n\t}\n\n\tpublic add(permissions: Acl.Permissions): PermissionsBuilder {\n\t\tconst overrider = new PermissionOverrider()\n\t\treturn new PermissionsBuilder(this.schema, overrider.override(this.permissions, permissions))\n\t}\n\n\tpublic onEntity(entitySelector: EntitySelector | string | string[]): EntityPermissionsBuilder {\n\t\tif (typeof entitySelector === 'string') {\n\t\t\tentitySelector = EntitySelector.named(entitySelector)\n\t\t} else if (Array.isArray(entitySelector)) {\n\t\t\tentitySelector = EntitySelector.named(...entitySelector)\n\t\t}\n\t\tconst entitySelectorWithType = entitySelector\n\t\tconst entities = Object.values(this.schema.entities).filter(entity =>\n\t\t\tentitySelectorWithType.matches(this.schema, entity),\n\t\t)\n\t\treturn new EntityPermissionsBuilder(this, entities)\n\t}\n\n\tpublic onEveryEntity(): EntityPermissionsBuilder {\n\t\treturn this.onEntity(EntitySelector.every())\n\t}\n}\n\nnamespace PermissionsBuilder {\n\texport const everyEntity = () => {\n\t\treturn EntitySelector.every()\n\t}\n\texport const everyField = () => {\n\t\treturn FieldSelector.every()\n\t}\n\texport const predicateReference = (name: Acl.PredicateReference) => new Reference(name)\n}\nexport { PermissionsBuilder }\n"],"names":["PermissionsBuilder","Reference"],"mappings":";;;;;;;AAQA,MAAM,mBAAmB;AAAA,EACxB,YAA4B,QAAsC,aAA8B;AAApE,SAAA,SAAA;AAAsC,SAAA,cAAA;AAAA,EAAA;AAAA,EAElE,OAAc,OAAO,OAAyC;AAC7D,WAAO,IAAI,mBAAmB,OAAO,EAAE;AAAA,EAAA;AAAA,EAGjC,WAA+B;AACrC,WAAO,KAAK,MAAM,CAAC,IAAI,UAAU,MAAM,IAAI,UAAU,QAAQ,IAAI,UAAU,QAAQ,IAAI,UAAU,MAAM,CAAC;AAAA,EAAA;AAAA,EAGlG,MAAM,YAAiD;AACvD,UAAA,kBAAkB,IAAI,0BAA0B,UAAU;AAChE,WAAO,KAAK,IAAI,gBAAgB,OAAO,KAAK,MAAM,CAAC;AAAA,EAAA;AAAA,EAG7C,qBAAyC;AAC/C,WAAO,KAAK,gBAAgB,mBAAqB,EAAA;AAAA,EAAA;AAAA,EAG3C,IAAI,aAAkD;AACtD,UAAA,YAAY,IAAI,oBAAoB;AACnC,WAAA,IAAI,mBAAmB,KAAK,QAAQ,UAAU,SAAS,KAAK,aAAa,WAAW,CAAC;AAAA,EAAA;AAAA,EAGtF,SAAS,gBAA8E;AACzF,QAAA,OAAO,mBAAmB,UAAU;AACtB,uBAAA,eAAe,MAAM,cAAc;AAAA,IAC1C,WAAA,MAAM,QAAQ,cAAc,GAAG;AACxB,uBAAA,eAAe,MAAM,GAAG,cAAc;AAAA,IAAA;AAExD,UAAM,yBAAyB;AAC/B,UAAM,WAAW,OAAO,OAAO,KAAK,OAAO,QAAQ,EAAE;AAAA,MAAO,CAC3D,WAAA,uBAAuB,QAAQ,KAAK,QAAQ,MAAM;AAAA,IACnD;AACO,WAAA,IAAI,yBAAyB,MAAM,QAAQ;AAAA,EAAA;AAAA,EAG5C,gBAA0C;AAChD,WAAO,KAAK,SAAS,eAAe,MAAA,CAAO;AAAA,EAAA;AAE7C;AAAA,CAEA,CAAUA,wBAAV;AACcA,sBAAA,cAAc,MAAM;AAChC,WAAO,eAAe,MAAM;AAAA,EAC7B;AACaA,sBAAA,aAAa,MAAM;AAC/B,WAAO,cAAc,MAAM;AAAA,EAC5B;AACaA,sBAAA,qBAAqB,CAAC,SAAiC,IAAIC,mBAAU,IAAI;AAAA,GAP7E,uBAAA,qBAAA,CAAA,EAAA;"}
1
+ {"version":3,"file":"PermissionsBuilder.js","sources":["../../../../../../packages/schema-definition/src/acl/builder/PermissionsBuilder.ts"],"sourcesContent":["import { Acl, Model } from '@contember/schema'\nimport { AllowAllPermissionFactory } from '@contember/schema-utils'\nimport PermissionOverrider from './PermissionOverrider'\nimport EntitySelector from './EntitySelector'\nimport EntityPermissionsBuilder from './EntityPermissionsBuilder'\nimport FieldSelector from './FieldSelector'\nimport Reference from './PredicateReference'\n\nclass PermissionsBuilder {\n\tconstructor(public readonly schema: Model.Schema, public readonly permissions: Acl.Permissions) {}\n\n\tpublic static create(model: Model.Schema): PermissionsBuilder {\n\t\treturn new PermissionsBuilder(model, {})\n\t}\n\n\tpublic allowAll(): PermissionsBuilder {\n\t\treturn this.allow([Acl.Operation.read, Acl.Operation.update, Acl.Operation.delete, Acl.Operation.create])\n\t}\n\n\tpublic allow(operations: Acl.Operation[]): PermissionsBuilder {\n\t\tconst allowAllFactory = new AllowAllPermissionFactory(operations)\n\t\treturn this.add(allowAllFactory.create(this.schema))\n\t}\n\n\tpublic allowCustomPrimary(): PermissionsBuilder {\n\t\treturn this.onEveryEntity().allowCustomPrimary().builder\n\t}\n\n\tpublic add(permissions: Acl.Permissions): PermissionsBuilder {\n\t\tconst overrider = new PermissionOverrider()\n\t\treturn new PermissionsBuilder(this.schema, overrider.override(this.permissions, permissions))\n\t}\n\n\tpublic onEntity(entitySelector: EntitySelector | string | string[]): EntityPermissionsBuilder {\n\t\tif (typeof entitySelector === 'string') {\n\t\t\tentitySelector = EntitySelector.named(entitySelector)\n\t\t} else if (Array.isArray(entitySelector)) {\n\t\t\tentitySelector = EntitySelector.named(...entitySelector)\n\t\t}\n\t\tconst entitySelectorWithType = entitySelector\n\t\tconst entities = Object.values(this.schema.entities).filter(entity => entitySelectorWithType.matches(this.schema, entity))\n\t\treturn new EntityPermissionsBuilder(this, entities)\n\t}\n\n\tpublic onEveryEntity(): EntityPermissionsBuilder {\n\t\treturn this.onEntity(EntitySelector.every())\n\t}\n}\n\nnamespace PermissionsBuilder {\n\texport const everyEntity = () => {\n\t\treturn EntitySelector.every()\n\t}\n\texport const everyField = () => {\n\t\treturn FieldSelector.every()\n\t}\n\texport const predicateReference = (name: Acl.PredicateReference) => new Reference(name)\n}\nexport { PermissionsBuilder }\n"],"names":["PermissionsBuilder","Reference"],"mappings":";;;;;;;AAQA,MAAM,mBAAmB;AAAA,EACxB,YAA4B,QAAsC,aAA8B;AAApE,SAAA,SAAA;AAAsC,SAAA,cAAA;AAAA,EAA+B;AAAA,EAEjG,OAAc,OAAO,OAAyC;AAC7D,WAAO,IAAI,mBAAmB,OAAO,EAAE;AAAA,EACxC;AAAA,EAEO,WAA+B;AACrC,WAAO,KAAK,MAAM,CAAC,IAAI,UAAU,MAAM,IAAI,UAAU,QAAQ,IAAI,UAAU,QAAQ,IAAI,UAAU,MAAM,CAAC;AAAA,EACzG;AAAA,EAEO,MAAM,YAAiD;AAC7D,UAAM,kBAAkB,IAAI,0BAA0B,UAAU;AAChE,WAAO,KAAK,IAAI,gBAAgB,OAAO,KAAK,MAAM,CAAC;AAAA,EACpD;AAAA,EAEO,qBAAyC;AAC/C,WAAO,KAAK,gBAAgB,mBAAA,EAAqB;AAAA,EAClD;AAAA,EAEO,IAAI,aAAkD;AAC5D,UAAM,YAAY,IAAI,oBAAA;AACtB,WAAO,IAAI,mBAAmB,KAAK,QAAQ,UAAU,SAAS,KAAK,aAAa,WAAW,CAAC;AAAA,EAC7F;AAAA,EAEO,SAAS,gBAA8E;AAC7F,QAAI,OAAO,mBAAmB,UAAU;AACvC,uBAAiB,eAAe,MAAM,cAAc;AAAA,IACrD,WAAW,MAAM,QAAQ,cAAc,GAAG;AACzC,uBAAiB,eAAe,MAAM,GAAG,cAAc;AAAA,IACxD;AACA,UAAM,yBAAyB;AAC/B,UAAM,WAAW,OAAO,OAAO,KAAK,OAAO,QAAQ,EAAE,OAAO,CAAA,WAAU,uBAAuB,QAAQ,KAAK,QAAQ,MAAM,CAAC;AACzH,WAAO,IAAI,yBAAyB,MAAM,QAAQ;AAAA,EACnD;AAAA,EAEO,gBAA0C;AAChD,WAAO,KAAK,SAAS,eAAe,MAAA,CAAO;AAAA,EAC5C;AACD;AAAA,CAEA,CAAUA,wBAAV;AACcA,sBAAA,cAAc,MAAM;AAChC,WAAO,eAAe,MAAA;AAAA,EACvB;AACaA,sBAAA,aAAa,MAAM;AAC/B,WAAO,cAAc,MAAA;AAAA,EACtB;AACaA,sBAAA,qBAAqB,CAAC,SAAiC,IAAIC,mBAAU,IAAI;AAAA,GAP7E,uBAAA,qBAAA,CAAA,EAAA;"}
@@ -1 +1 @@
1
- {"version":3,"file":"PredicateReference.cjs","sources":["../../../../../../packages/schema-definition/src/acl/builder/PredicateReference.ts"],"sourcesContent":["import { Acl, Input, Model } from '@contember/schema'\nimport { PredicateDefinitionProcessor } from '@contember/schema-utils'\n\nexport default class PredicateReference {\n\tconstructor(public readonly name: Acl.PredicateReference) {}\n}\n\nexport const resolvePredicateReference = (\n\tmodel: Model.Schema,\n\tpermissions: Acl.Permissions,\n\tentity: Model.Entity,\n\tpredicate: Acl.PredicateDefinition<PredicateReference>,\n): Acl.PredicateDefinition => {\n\tconst predicateDefinitionProcessor = new PredicateDefinitionProcessor(model)\n\treturn predicateDefinitionProcessor.process<Acl.PredicateVariable | Input.Condition, PredicateReference>(\n\t\tentity,\n\t\tpredicate,\n\t\t{\n\t\t\thandleColumn: ({ value }) => {\n\t\t\t\tif (value instanceof PredicateReference) {\n\t\t\t\t\tthrow new Error()\n\t\t\t\t}\n\t\t\t\treturn value\n\t\t\t},\n\t\t\thandleRelation: ({ value, targetEntity }) => {\n\t\t\t\tif (value instanceof PredicateReference) {\n\t\t\t\t\tif (!permissions[targetEntity.name]) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Permissions for entity ${targetEntity.name} not found. Make sure you are defining it in a right order.`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\tconst predicate = permissions[targetEntity.name].predicates[value.name]\n\t\t\t\t\tif (!predicate) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Predicate ${value.name} of entity ${targetEntity.name} not found. Make sure you are defining it in a right order.`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\treturn predicate\n\t\t\t\t}\n\t\t\t\treturn value\n\t\t\t},\n\t\t},\n\t)\n}\n"],"names":["PredicateDefinitionProcessor","predicate"],"mappings":";;;AAGA,MAAqB,mBAAmB;AAAA,EACvC,YAA4B,MAA8B;AAA9B,SAAA,OAAA;AAAA,EAAA;AAC7B;AAEO,MAAM,4BAA4B,CACxC,OACA,aACA,QACA,cAC6B;AACvB,QAAA,+BAA+B,IAAIA,YAAA,6BAA6B,KAAK;AAC3E,SAAO,6BAA6B;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,MACC,cAAc,CAAC,EAAE,YAAY;AAC5B,YAAI,iBAAiB,oBAAoB;AACxC,gBAAM,IAAI,MAAM;AAAA,QAAA;AAEV,eAAA;AAAA,MACR;AAAA,MACA,gBAAgB,CAAC,EAAE,OAAO,mBAAmB;AAC5C,YAAI,iBAAiB,oBAAoB;AACxC,cAAI,CAAC,YAAY,aAAa,IAAI,GAAG;AACpC,kBAAM,IAAI;AAAA,cACT,0BAA0B,aAAa,IAAI;AAAA,YAC5C;AAAA,UAAA;AAED,gBAAMC,aAAY,YAAY,aAAa,IAAI,EAAE,WAAW,MAAM,IAAI;AACtE,cAAI,CAACA,YAAW;AACf,kBAAM,IAAI;AAAA,cACT,aAAa,MAAM,IAAI,cAAc,aAAa,IAAI;AAAA,YACvD;AAAA,UAAA;AAEMA,iBAAAA;AAAAA,QAAA;AAED,eAAA;AAAA,MAAA;AAAA,IACR;AAAA,EAEF;AACD;;;"}
1
+ {"version":3,"file":"PredicateReference.cjs","sources":["../../../../../../packages/schema-definition/src/acl/builder/PredicateReference.ts"],"sourcesContent":["import { Acl, Input, Model } from '@contember/schema'\nimport { PredicateDefinitionProcessor } from '@contember/schema-utils'\n\nexport default class PredicateReference {\n\tconstructor(public readonly name: Acl.PredicateReference) {}\n}\n\nexport const resolvePredicateReference = (\n\tmodel: Model.Schema,\n\tpermissions: Acl.Permissions,\n\tentity: Model.Entity,\n\tpredicate: Acl.PredicateDefinition<PredicateReference>,\n): Acl.PredicateDefinition => {\n\tconst predicateDefinitionProcessor = new PredicateDefinitionProcessor(model)\n\treturn predicateDefinitionProcessor.process<Acl.PredicateVariable | Input.Condition, PredicateReference>(\n\t\tentity,\n\t\tpredicate,\n\t\t{\n\t\t\thandleColumn: ({ value }) => {\n\t\t\t\tif (value instanceof PredicateReference) {\n\t\t\t\t\tthrow new Error()\n\t\t\t\t}\n\t\t\t\treturn value\n\t\t\t},\n\t\t\thandleRelation: ({ value, targetEntity }) => {\n\t\t\t\tif (value instanceof PredicateReference) {\n\t\t\t\t\tif (!permissions[targetEntity.name]) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Permissions for entity ${targetEntity.name} not found. Make sure you are defining it in a right order.`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\tconst predicate = permissions[targetEntity.name].predicates[value.name]\n\t\t\t\t\tif (!predicate) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Predicate ${value.name} of entity ${targetEntity.name} not found. Make sure you are defining it in a right order.`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\treturn predicate\n\t\t\t\t}\n\t\t\t\treturn value\n\t\t\t},\n\t\t},\n\t)\n}\n"],"names":["PredicateDefinitionProcessor","predicate"],"mappings":";;;AAGA,MAAqB,mBAAmB;AAAA,EACvC,YAA4B,MAA8B;AAA9B,SAAA,OAAA;AAAA,EAA+B;AAC5D;AAEO,MAAM,4BAA4B,CACxC,OACA,aACA,QACA,cAC6B;AAC7B,QAAM,+BAA+B,IAAIA,YAAAA,6BAA6B,KAAK;AAC3E,SAAO,6BAA6B;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,MACC,cAAc,CAAC,EAAE,YAAY;AAC5B,YAAI,iBAAiB,oBAAoB;AACxC,gBAAM,IAAI,MAAA;AAAA,QACX;AACA,eAAO;AAAA,MACR;AAAA,MACA,gBAAgB,CAAC,EAAE,OAAO,mBAAmB;AAC5C,YAAI,iBAAiB,oBAAoB;AACxC,cAAI,CAAC,YAAY,aAAa,IAAI,GAAG;AACpC,kBAAM,IAAI;AAAA,cACT,0BAA0B,aAAa,IAAI;AAAA,YAAA;AAAA,UAE7C;AACA,gBAAMC,aAAY,YAAY,aAAa,IAAI,EAAE,WAAW,MAAM,IAAI;AACtE,cAAI,CAACA,YAAW;AACf,kBAAM,IAAI;AAAA,cACT,aAAa,MAAM,IAAI,cAAc,aAAa,IAAI;AAAA,YAAA;AAAA,UAExD;AACA,iBAAOA;AAAAA,QACR;AACA,eAAO;AAAA,MACR;AAAA,IAAA;AAAA,EACD;AAEF;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"PredicateReference.js","sources":["../../../../../../packages/schema-definition/src/acl/builder/PredicateReference.ts"],"sourcesContent":["import { Acl, Input, Model } from '@contember/schema'\nimport { PredicateDefinitionProcessor } from '@contember/schema-utils'\n\nexport default class PredicateReference {\n\tconstructor(public readonly name: Acl.PredicateReference) {}\n}\n\nexport const resolvePredicateReference = (\n\tmodel: Model.Schema,\n\tpermissions: Acl.Permissions,\n\tentity: Model.Entity,\n\tpredicate: Acl.PredicateDefinition<PredicateReference>,\n): Acl.PredicateDefinition => {\n\tconst predicateDefinitionProcessor = new PredicateDefinitionProcessor(model)\n\treturn predicateDefinitionProcessor.process<Acl.PredicateVariable | Input.Condition, PredicateReference>(\n\t\tentity,\n\t\tpredicate,\n\t\t{\n\t\t\thandleColumn: ({ value }) => {\n\t\t\t\tif (value instanceof PredicateReference) {\n\t\t\t\t\tthrow new Error()\n\t\t\t\t}\n\t\t\t\treturn value\n\t\t\t},\n\t\t\thandleRelation: ({ value, targetEntity }) => {\n\t\t\t\tif (value instanceof PredicateReference) {\n\t\t\t\t\tif (!permissions[targetEntity.name]) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Permissions for entity ${targetEntity.name} not found. Make sure you are defining it in a right order.`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\tconst predicate = permissions[targetEntity.name].predicates[value.name]\n\t\t\t\t\tif (!predicate) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Predicate ${value.name} of entity ${targetEntity.name} not found. Make sure you are defining it in a right order.`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\treturn predicate\n\t\t\t\t}\n\t\t\t\treturn value\n\t\t\t},\n\t\t},\n\t)\n}\n"],"names":["predicate"],"mappings":";AAGA,MAAqB,mBAAmB;AAAA,EACvC,YAA4B,MAA8B;AAA9B,SAAA,OAAA;AAAA,EAAA;AAC7B;AAEO,MAAM,4BAA4B,CACxC,OACA,aACA,QACA,cAC6B;AACvB,QAAA,+BAA+B,IAAI,6BAA6B,KAAK;AAC3E,SAAO,6BAA6B;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,MACC,cAAc,CAAC,EAAE,YAAY;AAC5B,YAAI,iBAAiB,oBAAoB;AACxC,gBAAM,IAAI,MAAM;AAAA,QAAA;AAEV,eAAA;AAAA,MACR;AAAA,MACA,gBAAgB,CAAC,EAAE,OAAO,mBAAmB;AAC5C,YAAI,iBAAiB,oBAAoB;AACxC,cAAI,CAAC,YAAY,aAAa,IAAI,GAAG;AACpC,kBAAM,IAAI;AAAA,cACT,0BAA0B,aAAa,IAAI;AAAA,YAC5C;AAAA,UAAA;AAED,gBAAMA,aAAY,YAAY,aAAa,IAAI,EAAE,WAAW,MAAM,IAAI;AACtE,cAAI,CAACA,YAAW;AACf,kBAAM,IAAI;AAAA,cACT,aAAa,MAAM,IAAI,cAAc,aAAa,IAAI;AAAA,YACvD;AAAA,UAAA;AAEMA,iBAAAA;AAAAA,QAAA;AAED,eAAA;AAAA,MAAA;AAAA,IACR;AAAA,EAEF;AACD;"}
1
+ {"version":3,"file":"PredicateReference.js","sources":["../../../../../../packages/schema-definition/src/acl/builder/PredicateReference.ts"],"sourcesContent":["import { Acl, Input, Model } from '@contember/schema'\nimport { PredicateDefinitionProcessor } from '@contember/schema-utils'\n\nexport default class PredicateReference {\n\tconstructor(public readonly name: Acl.PredicateReference) {}\n}\n\nexport const resolvePredicateReference = (\n\tmodel: Model.Schema,\n\tpermissions: Acl.Permissions,\n\tentity: Model.Entity,\n\tpredicate: Acl.PredicateDefinition<PredicateReference>,\n): Acl.PredicateDefinition => {\n\tconst predicateDefinitionProcessor = new PredicateDefinitionProcessor(model)\n\treturn predicateDefinitionProcessor.process<Acl.PredicateVariable | Input.Condition, PredicateReference>(\n\t\tentity,\n\t\tpredicate,\n\t\t{\n\t\t\thandleColumn: ({ value }) => {\n\t\t\t\tif (value instanceof PredicateReference) {\n\t\t\t\t\tthrow new Error()\n\t\t\t\t}\n\t\t\t\treturn value\n\t\t\t},\n\t\t\thandleRelation: ({ value, targetEntity }) => {\n\t\t\t\tif (value instanceof PredicateReference) {\n\t\t\t\t\tif (!permissions[targetEntity.name]) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Permissions for entity ${targetEntity.name} not found. Make sure you are defining it in a right order.`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\tconst predicate = permissions[targetEntity.name].predicates[value.name]\n\t\t\t\t\tif (!predicate) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Predicate ${value.name} of entity ${targetEntity.name} not found. Make sure you are defining it in a right order.`,\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t\treturn predicate\n\t\t\t\t}\n\t\t\t\treturn value\n\t\t\t},\n\t\t},\n\t)\n}\n"],"names":["predicate"],"mappings":";AAGA,MAAqB,mBAAmB;AAAA,EACvC,YAA4B,MAA8B;AAA9B,SAAA,OAAA;AAAA,EAA+B;AAC5D;AAEO,MAAM,4BAA4B,CACxC,OACA,aACA,QACA,cAC6B;AAC7B,QAAM,+BAA+B,IAAI,6BAA6B,KAAK;AAC3E,SAAO,6BAA6B;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,MACC,cAAc,CAAC,EAAE,YAAY;AAC5B,YAAI,iBAAiB,oBAAoB;AACxC,gBAAM,IAAI,MAAA;AAAA,QACX;AACA,eAAO;AAAA,MACR;AAAA,MACA,gBAAgB,CAAC,EAAE,OAAO,mBAAmB;AAC5C,YAAI,iBAAiB,oBAAoB;AACxC,cAAI,CAAC,YAAY,aAAa,IAAI,GAAG;AACpC,kBAAM,IAAI;AAAA,cACT,0BAA0B,aAAa,IAAI;AAAA,YAAA;AAAA,UAE7C;AACA,gBAAMA,aAAY,YAAY,aAAa,IAAI,EAAE,WAAW,MAAM,IAAI;AACtE,cAAI,CAACA,YAAW;AACf,kBAAM,IAAI;AAAA,cACT,aAAa,MAAM,IAAI,cAAc,aAAa,IAAI;AAAA,YAAA;AAAA,UAExD;AACA,iBAAOA;AAAAA,QACR;AACA,eAAO;AAAA,MACR;AAAA,IAAA;AAAA,EACD;AAEF;"}
@@ -3,8 +3,8 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const MetadataStore = require("../../utils/MetadataStore.cjs");
4
4
  const entityAclExtensionsStore = MetadataStore.createMetadataStore([]);
5
5
  const extendEntityAcl = (extension) => {
6
- return function(cls) {
7
- entityAclExtensionsStore.update(cls, (current) => [...current, extension]);
6
+ return function(cls, context) {
7
+ entityAclExtensionsStore.update(cls, (current) => [...current, extension], context);
8
8
  };
9
9
  };
10
10
  const applyEntityAclExtensions = (cls, args) => entityAclExtensionsStore.get(cls).reduce(
@@ -1 +1 @@
1
- {"version":3,"file":"aclExtensions.cjs","sources":["../../../../../../packages/schema-definition/src/acl/definition/aclExtensions.ts"],"sourcesContent":["import { Acl, Model } from '@contember/schema'\nimport { createMetadataStore, DecoratorFunction, EntityConstructor } from '../../utils'\nimport { Role } from './roles'\n\nexport type EntityAclExtensionArgs =\n\t& {\n\t\tentity: Model.Entity\n\t\trole: Role\n\t\tpermissions: Acl.EntityPermissions\n\t}\n\nconst entityAclExtensionsStore = createMetadataStore<EntityAclExtension[]>([])\n\nexport type EntityAclExtension = (args: EntityAclExtensionArgs) => Acl.EntityPermissions\nexport const extendEntityAcl = <T>(extension: EntityAclExtension): DecoratorFunction<T> => {\n\treturn function (cls: EntityConstructor) {\n\t\tentityAclExtensionsStore.update(cls, current => [...current, extension])\n\t}\n}\n\nexport const applyEntityAclExtensions = (\n\tcls: EntityConstructor,\n\targs: EntityAclExtensionArgs,\n): Acl.EntityPermissions =>\n\tentityAclExtensionsStore.get(cls).reduce(\n\t\t(permissions, ext) => ext({ ...args, permissions }),\n\t\targs.permissions,\n\t)\n"],"names":["createMetadataStore"],"mappings":";;;AAWA,MAAM,2BAA2BA,cAA0C,oBAAA,EAAE;AAGhE,MAAA,kBAAkB,CAAI,cAAwD;AAC1F,SAAO,SAAU,KAAwB;AACxC,6BAAyB,OAAO,KAAK,CAAA,YAAW,CAAC,GAAG,SAAS,SAAS,CAAC;AAAA,EACxE;AACD;AAEO,MAAM,2BAA2B,CACvC,KACA,SAEA,yBAAyB,IAAI,GAAG,EAAE;AAAA,EACjC,CAAC,aAAa,QAAQ,IAAI,EAAE,GAAG,MAAM,aAAa;AAAA,EAClD,KAAK;AACN;;;"}
1
+ {"version":3,"file":"aclExtensions.cjs","sources":["../../../../../../packages/schema-definition/src/acl/definition/aclExtensions.ts"],"sourcesContent":["import { Acl, Model } from '@contember/schema'\nimport { createMetadataStore, DecoratorFunction, EntityConstructor } from '../../utils'\nimport { Role } from './roles'\n\nexport type EntityAclExtensionArgs = {\n\tentity: Model.Entity\n\trole: Role\n\tpermissions: Acl.EntityPermissions\n}\n\nconst entityAclExtensionsStore = createMetadataStore<EntityAclExtension[]>([])\n\nexport type EntityAclExtension = (args: EntityAclExtensionArgs) => Acl.EntityPermissions\nexport const extendEntityAcl = <T>(extension: EntityAclExtension): DecoratorFunction<T> => {\n\treturn function(cls: EntityConstructor, context?: ClassDecoratorContext) {\n\t\tentityAclExtensionsStore.update(cls, current => [...current, extension], context)\n\t}\n}\n\nexport const applyEntityAclExtensions = (\n\tcls: EntityConstructor,\n\targs: EntityAclExtensionArgs,\n): Acl.EntityPermissions =>\n\tentityAclExtensionsStore.get(cls).reduce(\n\t\t(permissions, ext) => ext({ ...args, permissions }),\n\t\targs.permissions,\n\t)\n"],"names":["createMetadataStore"],"mappings":";;;AAUA,MAAM,2BAA2BA,cAAAA,oBAA0C,EAAE;AAGtE,MAAM,kBAAkB,CAAI,cAAwD;AAC1F,SAAO,SAAS,KAAwB,SAAiC;AACxE,6BAAyB,OAAO,KAAK,CAAA,YAAW,CAAC,GAAG,SAAS,SAAS,GAAG,OAAO;AAAA,EACjF;AACD;AAEO,MAAM,2BAA2B,CACvC,KACA,SAEA,yBAAyB,IAAI,GAAG,EAAE;AAAA,EACjC,CAAC,aAAa,QAAQ,IAAI,EAAE,GAAG,MAAM,aAAa;AAAA,EAClD,KAAK;AACN;;;"}
@@ -1,8 +1,8 @@
1
1
  import { createMetadataStore } from "../../utils/MetadataStore.js";
2
2
  const entityAclExtensionsStore = createMetadataStore([]);
3
3
  const extendEntityAcl = (extension) => {
4
- return function(cls) {
5
- entityAclExtensionsStore.update(cls, (current) => [...current, extension]);
4
+ return function(cls, context) {
5
+ entityAclExtensionsStore.update(cls, (current) => [...current, extension], context);
6
6
  };
7
7
  };
8
8
  const applyEntityAclExtensions = (cls, args) => entityAclExtensionsStore.get(cls).reduce(
@@ -1 +1 @@
1
- {"version":3,"file":"aclExtensions.js","sources":["../../../../../../packages/schema-definition/src/acl/definition/aclExtensions.ts"],"sourcesContent":["import { Acl, Model } from '@contember/schema'\nimport { createMetadataStore, DecoratorFunction, EntityConstructor } from '../../utils'\nimport { Role } from './roles'\n\nexport type EntityAclExtensionArgs =\n\t& {\n\t\tentity: Model.Entity\n\t\trole: Role\n\t\tpermissions: Acl.EntityPermissions\n\t}\n\nconst entityAclExtensionsStore = createMetadataStore<EntityAclExtension[]>([])\n\nexport type EntityAclExtension = (args: EntityAclExtensionArgs) => Acl.EntityPermissions\nexport const extendEntityAcl = <T>(extension: EntityAclExtension): DecoratorFunction<T> => {\n\treturn function (cls: EntityConstructor) {\n\t\tentityAclExtensionsStore.update(cls, current => [...current, extension])\n\t}\n}\n\nexport const applyEntityAclExtensions = (\n\tcls: EntityConstructor,\n\targs: EntityAclExtensionArgs,\n): Acl.EntityPermissions =>\n\tentityAclExtensionsStore.get(cls).reduce(\n\t\t(permissions, ext) => ext({ ...args, permissions }),\n\t\targs.permissions,\n\t)\n"],"names":[],"mappings":";AAWA,MAAM,2BAA2B,oBAA0C,EAAE;AAGhE,MAAA,kBAAkB,CAAI,cAAwD;AAC1F,SAAO,SAAU,KAAwB;AACxC,6BAAyB,OAAO,KAAK,CAAA,YAAW,CAAC,GAAG,SAAS,SAAS,CAAC;AAAA,EACxE;AACD;AAEO,MAAM,2BAA2B,CACvC,KACA,SAEA,yBAAyB,IAAI,GAAG,EAAE;AAAA,EACjC,CAAC,aAAa,QAAQ,IAAI,EAAE,GAAG,MAAM,aAAa;AAAA,EAClD,KAAK;AACN;"}
1
+ {"version":3,"file":"aclExtensions.js","sources":["../../../../../../packages/schema-definition/src/acl/definition/aclExtensions.ts"],"sourcesContent":["import { Acl, Model } from '@contember/schema'\nimport { createMetadataStore, DecoratorFunction, EntityConstructor } from '../../utils'\nimport { Role } from './roles'\n\nexport type EntityAclExtensionArgs = {\n\tentity: Model.Entity\n\trole: Role\n\tpermissions: Acl.EntityPermissions\n}\n\nconst entityAclExtensionsStore = createMetadataStore<EntityAclExtension[]>([])\n\nexport type EntityAclExtension = (args: EntityAclExtensionArgs) => Acl.EntityPermissions\nexport const extendEntityAcl = <T>(extension: EntityAclExtension): DecoratorFunction<T> => {\n\treturn function(cls: EntityConstructor, context?: ClassDecoratorContext) {\n\t\tentityAclExtensionsStore.update(cls, current => [...current, extension], context)\n\t}\n}\n\nexport const applyEntityAclExtensions = (\n\tcls: EntityConstructor,\n\targs: EntityAclExtensionArgs,\n): Acl.EntityPermissions =>\n\tentityAclExtensionsStore.get(cls).reduce(\n\t\t(permissions, ext) => ext({ ...args, permissions }),\n\t\targs.permissions,\n\t)\n"],"names":[],"mappings":";AAUA,MAAM,2BAA2B,oBAA0C,EAAE;AAGtE,MAAM,kBAAkB,CAAI,cAAwD;AAC1F,SAAO,SAAS,KAAwB,SAAiC;AACxE,6BAAyB,OAAO,KAAK,CAAA,YAAW,CAAC,GAAG,SAAS,SAAS,GAAG,OAAO;AAAA,EACjF;AACD;AAEO,MAAM,2BAA2B,CACvC,KACA,SAEA,yBAAyB,IAAI,GAAG,EAAE;AAAA,EACjC,CAAC,aAAa,QAAQ,IAAI,EAAE,GAAG,MAAM,aAAa;AAAA,EAClD,KAAK;AACN;"}
@@ -4,7 +4,7 @@ const aclExtensions = require("./aclExtensions.cjs");
4
4
  const allowCustomPrimary = (role) => {
5
5
  return aclExtensions.extendEntityAcl(({ permissions, role: currentRole }) => {
6
6
  if (!role || role === currentRole || Array.isArray(role) && role.includes(currentRole)) {
7
- return { ...permissions, operations: { customPrimary: true } };
7
+ return { ...permissions, operations: { ...permissions.operations, customPrimary: true } };
8
8
  }
9
9
  return permissions;
10
10
  });
@@ -1 +1 @@
1
- {"version":3,"file":"customPrimary.cjs","sources":["../../../../../../packages/schema-definition/src/acl/definition/customPrimary.ts"],"sourcesContent":["import { Role } from './roles'\nimport { DecoratorFunction } from '../../utils'\nimport { extendEntityAcl } from './aclExtensions'\n\nexport const allowCustomPrimary = (role?: Role | Role[]): DecoratorFunction<any> => {\n\treturn extendEntityAcl(({ permissions, role: currentRole }) => {\n\t\tif (!role || role === currentRole || (Array.isArray(role) && role.includes(currentRole))) {\n\t\t\treturn { ...permissions, operations: { customPrimary: true } }\n\t\t}\n\t\treturn permissions\n\t})\n}\n"],"names":["extendEntityAcl"],"mappings":";;;AAIa,MAAA,qBAAqB,CAAC,SAAiD;AACnF,SAAOA,8BAAgB,CAAC,EAAE,aAAa,MAAM,kBAAkB;AAC1D,QAAA,CAAC,QAAQ,SAAS,eAAgB,MAAM,QAAQ,IAAI,KAAK,KAAK,SAAS,WAAW,GAAI;AACzF,aAAO,EAAE,GAAG,aAAa,YAAY,EAAE,eAAe,OAAO;AAAA,IAAA;AAEvD,WAAA;AAAA,EAAA,CACP;AACF;;"}
1
+ {"version":3,"file":"customPrimary.cjs","sources":["../../../../../../packages/schema-definition/src/acl/definition/customPrimary.ts"],"sourcesContent":["import { Role } from './roles'\nimport { DecoratorFunction } from '../../utils'\nimport { extendEntityAcl } from './aclExtensions'\n\nexport const allowCustomPrimary = (role?: Role | Role[]): DecoratorFunction<any> => {\n\treturn extendEntityAcl(({ permissions, role: currentRole }) => {\n\t\tif (!role || role === currentRole || (Array.isArray(role) && role.includes(currentRole))) {\n\t\t\treturn { ...permissions, operations: { ...permissions.operations, customPrimary: true } }\n\t\t}\n\t\treturn permissions\n\t})\n}\n"],"names":["extendEntityAcl"],"mappings":";;;AAIO,MAAM,qBAAqB,CAAC,SAAiD;AACnF,SAAOA,cAAAA,gBAAgB,CAAC,EAAE,aAAa,MAAM,kBAAkB;AAC9D,QAAI,CAAC,QAAQ,SAAS,eAAgB,MAAM,QAAQ,IAAI,KAAK,KAAK,SAAS,WAAW,GAAI;AACzF,aAAO,EAAE,GAAG,aAAa,YAAY,EAAE,GAAG,YAAY,YAAY,eAAe,OAAK;AAAA,IACvF;AACA,WAAO;AAAA,EACR,CAAC;AACF;;"}
@@ -2,7 +2,7 @@ import { extendEntityAcl } from "./aclExtensions.js";
2
2
  const allowCustomPrimary = (role) => {
3
3
  return extendEntityAcl(({ permissions, role: currentRole }) => {
4
4
  if (!role || role === currentRole || Array.isArray(role) && role.includes(currentRole)) {
5
- return { ...permissions, operations: { customPrimary: true } };
5
+ return { ...permissions, operations: { ...permissions.operations, customPrimary: true } };
6
6
  }
7
7
  return permissions;
8
8
  });
@@ -1 +1 @@
1
- {"version":3,"file":"customPrimary.js","sources":["../../../../../../packages/schema-definition/src/acl/definition/customPrimary.ts"],"sourcesContent":["import { Role } from './roles'\nimport { DecoratorFunction } from '../../utils'\nimport { extendEntityAcl } from './aclExtensions'\n\nexport const allowCustomPrimary = (role?: Role | Role[]): DecoratorFunction<any> => {\n\treturn extendEntityAcl(({ permissions, role: currentRole }) => {\n\t\tif (!role || role === currentRole || (Array.isArray(role) && role.includes(currentRole))) {\n\t\t\treturn { ...permissions, operations: { customPrimary: true } }\n\t\t}\n\t\treturn permissions\n\t})\n}\n"],"names":[],"mappings":";AAIa,MAAA,qBAAqB,CAAC,SAAiD;AACnF,SAAO,gBAAgB,CAAC,EAAE,aAAa,MAAM,kBAAkB;AAC1D,QAAA,CAAC,QAAQ,SAAS,eAAgB,MAAM,QAAQ,IAAI,KAAK,KAAK,SAAS,WAAW,GAAI;AACzF,aAAO,EAAE,GAAG,aAAa,YAAY,EAAE,eAAe,OAAO;AAAA,IAAA;AAEvD,WAAA;AAAA,EAAA,CACP;AACF;"}
1
+ {"version":3,"file":"customPrimary.js","sources":["../../../../../../packages/schema-definition/src/acl/definition/customPrimary.ts"],"sourcesContent":["import { Role } from './roles'\nimport { DecoratorFunction } from '../../utils'\nimport { extendEntityAcl } from './aclExtensions'\n\nexport const allowCustomPrimary = (role?: Role | Role[]): DecoratorFunction<any> => {\n\treturn extendEntityAcl(({ permissions, role: currentRole }) => {\n\t\tif (!role || role === currentRole || (Array.isArray(role) && role.includes(currentRole))) {\n\t\t\treturn { ...permissions, operations: { ...permissions.operations, customPrimary: true } }\n\t\t}\n\t\treturn permissions\n\t})\n}\n"],"names":[],"mappings":";AAIO,MAAM,qBAAqB,CAAC,SAAiD;AACnF,SAAO,gBAAgB,CAAC,EAAE,aAAa,MAAM,kBAAkB;AAC9D,QAAI,CAAC,QAAQ,SAAS,eAAgB,MAAM,QAAQ,IAAI,KAAK,KAAK,SAAS,WAAW,GAAI;AACzF,aAAO,EAAE,GAAG,aAAa,YAAY,EAAE,GAAG,YAAY,YAAY,eAAe,OAAK;AAAA,IACvF;AACA,WAAO;AAAA,EACR,CAAC;AACF;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../../../../packages/schema-definition/src/acl/definition/index.ts"],"sourcesContent":["import { Acl, Model } from '@contember/schema'\nimport { AclFactory } from './internal/AclFactory'\n\nexport * from './customPrimary'\nexport * from './permissions'\nexport * from './references'\nexport * from './roles'\nexport * from './variables'\n\nexport const createAcl = (\n\texportedDefinitions: Record<string, any>,\n\tmodel: Model.Schema,\n): Acl.Schema => {\n\tconst aclFactory = new AclFactory(model)\n\treturn aclFactory.create(exportedDefinitions)\n}\n"],"names":["AclFactory"],"mappings":";;;;;;;;AASa,MAAA,YAAY,CACxB,qBACA,UACgB;AACV,QAAA,aAAa,IAAIA,WAAA,WAAW,KAAK;AAChC,SAAA,WAAW,OAAO,mBAAmB;AAC7C;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../../../../packages/schema-definition/src/acl/definition/index.ts"],"sourcesContent":["import { Acl, Model } from '@contember/schema'\nimport { AclFactory } from './internal/AclFactory'\n\nexport * from './customPrimary'\nexport * from './permissions'\nexport * from './references'\nexport * from './roles'\nexport * from './variables'\n\nexport const createAcl = (\n\texportedDefinitions: Record<string, any>,\n\tmodel: Model.Schema,\n): Acl.Schema => {\n\tconst aclFactory = new AclFactory(model)\n\treturn aclFactory.create(exportedDefinitions)\n}\n"],"names":["AclFactory"],"mappings":";;;;;;;;AASO,MAAM,YAAY,CACxB,qBACA,UACgB;AAChB,QAAM,aAAa,IAAIA,WAAAA,WAAW,KAAK;AACvC,SAAO,WAAW,OAAO,mBAAmB;AAC7C;;;;;;;;;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../../packages/schema-definition/src/acl/definition/index.ts"],"sourcesContent":["import { Acl, Model } from '@contember/schema'\nimport { AclFactory } from './internal/AclFactory'\n\nexport * from './customPrimary'\nexport * from './permissions'\nexport * from './references'\nexport * from './roles'\nexport * from './variables'\n\nexport const createAcl = (\n\texportedDefinitions: Record<string, any>,\n\tmodel: Model.Schema,\n): Acl.Schema => {\n\tconst aclFactory = new AclFactory(model)\n\treturn aclFactory.create(exportedDefinitions)\n}\n"],"names":[],"mappings":";;;;;;AASa,MAAA,YAAY,CACxB,qBACA,UACgB;AACV,QAAA,aAAa,IAAI,WAAW,KAAK;AAChC,SAAA,WAAW,OAAO,mBAAmB;AAC7C;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../../packages/schema-definition/src/acl/definition/index.ts"],"sourcesContent":["import { Acl, Model } from '@contember/schema'\nimport { AclFactory } from './internal/AclFactory'\n\nexport * from './customPrimary'\nexport * from './permissions'\nexport * from './references'\nexport * from './roles'\nexport * from './variables'\n\nexport const createAcl = (\n\texportedDefinitions: Record<string, any>,\n\tmodel: Model.Schema,\n): Acl.Schema => {\n\tconst aclFactory = new AclFactory(model)\n\treturn aclFactory.create(exportedDefinitions)\n}\n"],"names":[],"mappings":";;;;;;AASO,MAAM,YAAY,CACxB,qBACA,UACgB;AAChB,QAAM,aAAa,IAAI,WAAW,KAAK;AACvC,SAAO,WAAW,OAAO,mBAAmB;AAC7C;"}
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const schemaUtils = require("@contember/schema-utils");
3
4
  const EntityPredicateResolver = require("./EntityPredicateResolver.cjs");
4
5
  const stores = require("./stores.cjs");
5
6
  const roles = require("../roles.cjs");
@@ -15,7 +16,7 @@ class AclFactory {
15
16
  const entityLikeDefinition = filterEntityDefinition.filterEntityDefinition(exportedDefinitions);
16
17
  const roles$1 = Object.values(exportedDefinitions).filter((it) => it instanceof roles.Role);
17
18
  const variables$1 = Object.values(exportedDefinitions).filter((it) => it instanceof variables.VariableDefinition);
18
- const groupedPermissions = AclFactory.groupPermissions(entityLikeDefinition, roles$1);
19
+ const groupedPermissions = this.groupPermissions(entityLikeDefinition, roles$1);
19
20
  return {
20
21
  roles: Object.fromEntries(roles$1.map((role) => {
21
22
  const rolePermissions = groupedPermissions.get(role);
@@ -32,18 +33,20 @@ class AclFactory {
32
33
  };
33
34
  }
34
35
  createPermissions(rolePermissions, entityLikeDefinition, role) {
35
- return Object.fromEntries(Object.values(this.model.entities).map((entity) => {
36
- const permissions = rolePermissions ? this.createPermissionsFromAllow(rolePermissions, entity) : { predicates: {}, operations: {} };
37
- const isEmpty = !rolePermissions?.has(entity.name);
38
- const withExtensions = aclExtensions.applyEntityAclExtensions(entityLikeDefinition[entity.name], { entity, permissions, role });
39
- if (isEmpty && withExtensions === permissions) {
40
- return void 0;
41
- }
42
- return [
43
- entity.name,
44
- withExtensions
45
- ];
46
- }).filter((it) => it !== void 0));
36
+ return Object.fromEntries(
37
+ Object.values(this.model.entities).map((entity) => {
38
+ const permissions = rolePermissions ? this.createPermissionsFromAllow(rolePermissions, entity) : { predicates: {}, operations: {} };
39
+ const isEmpty = !rolePermissions?.has(entity.name);
40
+ const withExtensions = aclExtensions.applyEntityAclExtensions(entityLikeDefinition[entity.name], { entity, permissions, role });
41
+ if (isEmpty && withExtensions === permissions) {
42
+ return void 0;
43
+ }
44
+ return [
45
+ entity.name,
46
+ withExtensions
47
+ ];
48
+ }).filter((it) => it !== void 0)
49
+ );
47
50
  }
48
51
  createPermissionsFromAllow(rolePermissions, entity) {
49
52
  const predicatesResolver = EntityPredicateResolver.EntityPredicatesResolver.create(rolePermissions, this.model, entity);
@@ -97,7 +100,7 @@ class AclFactory {
97
100
  return [variable.name, variable.variable];
98
101
  }));
99
102
  }
100
- static groupPermissions(entityLikeDefinition, roles2) {
103
+ groupPermissions(entityLikeDefinition, roles2) {
101
104
  const groupedPermissions = /* @__PURE__ */ new Map();
102
105
  for (const [name, entity] of entityLikeDefinition) {
103
106
  const initEntityPermissions = (role) => {
@@ -110,12 +113,17 @@ class AclFactory {
110
113
  return entityPermissions;
111
114
  };
112
115
  const metadata = stores.allowDefinitionsStore.get(entity);
113
- for (const { role, ...definition } of metadata) {
116
+ for (const { role, factory } of metadata) {
114
117
  if (!roles2.includes(role)) {
115
118
  throw `Role ${role.name} used on entity ${name} is not registered. Have you exported it?`;
116
119
  }
117
120
  const entityPermissions = initEntityPermissions(role);
118
- entityPermissions.definitions.push(definition);
121
+ const entity2 = schemaUtils.getEntity(this.model, name);
122
+ entityPermissions.definitions.push(factory({
123
+ model: this.model,
124
+ entity: schemaUtils.getEntity(this.model, name),
125
+ except: (...fields) => Object.keys(entity2.fields).filter((it) => !fields.includes(it))
126
+ }));
119
127
  }
120
128
  }
121
129
  return groupedPermissions;
@@ -1 +1 @@
1
- {"version":3,"file":"AclFactory.cjs","sources":["../../../../../../../packages/schema-definition/src/acl/definition/internal/AclFactory.ts"],"sourcesContent":["import { Acl, Model, Writable } from '@contember/schema'\nimport { getEntity } from '@contember/schema-utils'\n\nimport { EntityPredicatesResolver } from './EntityPredicateResolver'\nimport { AllowDefinition } from '../permissions'\nimport {\n\tallowDefinitionsStore,\n\tEntityPermissionsDefinition,\n} from './stores'\nimport { Role } from '../roles'\nimport { VariableDefinition } from '../variables'\nimport { filterEntityDefinition } from '../../../utils'\nimport { applyEntityAclExtensions } from '../aclExtensions'\n\nexport class AclFactory {\n\tconstructor(\n\t\tprivate model: Model.Schema,\n\t) {\n\t}\n\n\tpublic create(\n\t\texportedDefinitions: Record<string, any>,\n\t): Acl.Schema {\n\t\tconst entityLikeDefinition = filterEntityDefinition(exportedDefinitions)\n\t\tconst roles: Role[] = Object.values(exportedDefinitions).filter(it => it instanceof Role)\n\t\tconst variables: VariableDefinition[] = Object.values(exportedDefinitions).filter(it => it instanceof VariableDefinition)\n\n\t\tconst groupedPermissions = AclFactory.groupPermissions(entityLikeDefinition, roles)\n\n\t\treturn {\n\t\t\troles: Object.fromEntries(roles.map((role): [string, Acl.RolePermissions] => {\n\t\t\t\tconst rolePermissions = groupedPermissions.get(role)\n\t\t\t\treturn [\n\t\t\t\t\trole.name,\n\t\t\t\t\t{\n\t\t\t\t\t\t...role.options,\n\t\t\t\t\t\tstages: role.options.stages ?? '*',\n\t\t\t\t\t\tentities: this.createPermissions(rolePermissions, Object.fromEntries(entityLikeDefinition), role),\n\t\t\t\t\t\tvariables: this.createVariables(role, variables),\n\t\t\t\t\t},\n\t\t\t\t]\n\t\t\t})),\n\t\t}\n\t}\n\n\tprivate createPermissions(rolePermissions: PermissionsByEntity | undefined, entityLikeDefinition: Record<string, { new(): any }>, role: Role): Acl.Permissions {\n\t\treturn Object.fromEntries(Object.values(this.model.entities).map((entity): [string, Acl.EntityPermissions] | undefined => {\n\t\t\tconst permissions = rolePermissions ? this.createPermissionsFromAllow(rolePermissions, entity) : { predicates: {}, operations: {} }\n\t\t\tconst isEmpty = !rolePermissions?.has(entity.name)\n\t\t\tconst withExtensions = applyEntityAclExtensions(entityLikeDefinition[entity.name], { entity, permissions, role })\n\t\t\tif (isEmpty && withExtensions === permissions) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\treturn [\n\t\t\t\tentity.name,\n\t\t\t\twithExtensions,\n\t\t\t]\n\t\t}).filter(<T>(it: T | undefined): it is T => it !== undefined))\n\t}\n\n\tprivate createPermissionsFromAllow(rolePermissions: PermissionsByEntity, entity: Model.Entity): Acl.EntityPermissions {\n\t\tconst predicatesResolver = EntityPredicatesResolver.create(rolePermissions, this.model, entity)\n\n\t\tconst entityOperations: Writable<Acl.EntityOperations> = {}\n\t\tconst noRootOptions = this.getNoRootOptions(entity, rolePermissions.get(entity.name))\n\t\tif (noRootOptions?.length) {\n\t\t\tentityOperations.noRoot = noRootOptions\n\t\t}\n\t\tfor (const op of ['create', 'update', 'read'] as const) {\n\t\t\tconst fieldPermissions: Writable<Acl.FieldPermissions> = {}\n\t\t\tfor (const field of Object.keys(entity.fields)) {\n\t\t\t\tconst predicate = predicatesResolver.createFieldPredicate(op, field, field === entity.primary)\n\t\t\t\tif (predicate !== undefined) {\n\t\t\t\t\tfieldPermissions[field] = predicate\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (Object.keys(fieldPermissions).length > 0) {\n\t\t\t\tentityOperations[op] = fieldPermissions\n\t\t\t}\n\t\t}\n\t\tconst delPredicate = predicatesResolver.createFieldPredicate('delete', '', false)\n\t\tif (delPredicate !== undefined) {\n\t\t\tentityOperations.delete = delPredicate\n\t\t}\n\t\treturn {\n\t\t\tpredicates: predicatesResolver.getUsedPredicates(),\n\t\t\toperations: entityOperations,\n\t\t}\n\t}\n\n\n\tgetNoRootOptions(entity: Model.Entity, permissions?: EntityPermissions): Acl.EntityOperations['noRoot'] {\n\t\tconst allowedRoot = new Set<Acl.Operation>()\n\t\tconst disallowedRoot = new Set<Acl.Operation>()\n\t\tfor (const def of permissions?.definitions ?? []) {\n\t\t\tconst noRoot = def.through === true\n\t\t\tfor (const op of ['create', 'read', 'update', 'delete'] as const) {\n\t\t\t\tif (def[op]) {\n\t\t\t\t\tconst currentSet = noRoot ? disallowedRoot : allowedRoot\n\t\t\t\t\tcurrentSet.add(op as Acl.Operation)\n\n\t\t\t\t\tconst otherSet = noRoot ? allowedRoot : disallowedRoot\n\n\t\t\t\t\tif (otherSet.has(op as Acl.Operation)) {\n\t\t\t\t\t\tthrow new Error(`Operation ${op} cannot be both allowed and disallowed on root on entity ${entity.name}`)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t\treturn [...disallowedRoot.values()]\n\t}\n\n\tprivate createVariables(role: Role, variables: VariableDefinition[]): Acl.Variables {\n\t\tconst roleVariables = variables.filter(it => it.roles.includes(role))\n\t\treturn Object.fromEntries(roleVariables.map((variable): [string, Acl.Variable] => {\n\t\t\treturn [variable.name, variable.variable]\n\t\t}))\n\t}\n\n\tprivate static groupPermissions(entityLikeDefinition: [string, { new(): any }][], roles: Role[]): PermissionsByRoleAndEntity {\n\t\tconst groupedPermissions: PermissionsByRoleAndEntity = new Map()\n\t\tfor (const [name, entity] of entityLikeDefinition) {\n\t\t\tconst initEntityPermissions = (role: Role): EntityPermissions => {\n\t\t\t\tconst rolePermissions: PermissionsByEntity = groupedPermissions.get(role) ?? new Map()\n\t\t\t\tgroupedPermissions.set(role, rolePermissions)\n\t\t\t\tconst entityPermissions = rolePermissions.get(name) ?? {\n\t\t\t\t\tdefinitions: [],\n\t\t\t\t}\n\t\t\t\trolePermissions.set(name, entityPermissions)\n\t\t\t\treturn entityPermissions\n\t\t\t}\n\t\t\tconst metadata: EntityPermissionsDefinition[] = allowDefinitionsStore.get(entity)\n\t\t\tfor (const { role, ...definition } of metadata) {\n\t\t\t\tif (!roles.includes(role)) {\n\t\t\t\t\tthrow `Role ${role.name} used on entity ${name} is not registered. Have you exported it?`\n\t\t\t\t}\n\t\t\t\tconst entityPermissions = initEntityPermissions(role)\n\t\t\t\tentityPermissions.definitions.push(definition)\n\t\t\t}\n\t\t}\n\n\t\treturn groupedPermissions\n\t}\n}\n\n\nexport type EntityPermissions = { definitions: AllowDefinition<any>[] }\nexport type PermissionsByEntity = Map<string, EntityPermissions>\nexport type PermissionsByRoleAndEntity = Map<Role, PermissionsByEntity>\n"],"names":["filterEntityDefinition","roles","Role","variables","VariableDefinition","applyEntityAclExtensions","EntityPredicatesResolver","allowDefinitionsStore"],"mappings":"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"}
1
+ {"version":3,"file":"AclFactory.cjs","sources":["../../../../../../../packages/schema-definition/src/acl/definition/internal/AclFactory.ts"],"sourcesContent":["import { Acl, Model, Writable } from '@contember/schema'\nimport { getEntity } from '@contember/schema-utils'\n\nimport { EntityPredicatesResolver } from './EntityPredicateResolver'\nimport { AllowDefinition } from '../permissions'\nimport { allowDefinitionsStore, EntityPermissionsDefinition } from './stores'\nimport { Role } from '../roles'\nimport { VariableDefinition } from '../variables'\nimport { filterEntityDefinition } from '../../../utils'\nimport { applyEntityAclExtensions } from '../aclExtensions'\n\nexport class AclFactory {\n\tconstructor(\n\t\tprivate model: Model.Schema,\n\t) {\n\t}\n\n\tpublic create(\n\t\texportedDefinitions: Record<string, any>,\n\t): Acl.Schema {\n\t\tconst entityLikeDefinition = filterEntityDefinition(exportedDefinitions)\n\t\tconst roles: Role[] = Object.values(exportedDefinitions).filter(it => it instanceof Role)\n\t\tconst variables: VariableDefinition[] = Object.values(exportedDefinitions).filter(it => it instanceof VariableDefinition)\n\n\t\tconst groupedPermissions = this.groupPermissions(entityLikeDefinition, roles)\n\n\t\treturn {\n\t\t\troles: Object.fromEntries(roles.map((role): [string, Acl.RolePermissions] => {\n\t\t\t\tconst rolePermissions = groupedPermissions.get(role)\n\t\t\t\treturn [\n\t\t\t\t\trole.name,\n\t\t\t\t\t{\n\t\t\t\t\t\t...role.options,\n\t\t\t\t\t\tstages: role.options.stages ?? '*',\n\t\t\t\t\t\tentities: this.createPermissions(rolePermissions, Object.fromEntries(entityLikeDefinition), role),\n\t\t\t\t\t\tvariables: this.createVariables(role, variables),\n\t\t\t\t\t},\n\t\t\t\t]\n\t\t\t})),\n\t\t}\n\t}\n\n\tprivate createPermissions(\n\t\trolePermissions: PermissionsByEntity | undefined,\n\t\tentityLikeDefinition: Record<string, { new(): any }>,\n\t\trole: Role,\n\t): Acl.Permissions {\n\t\treturn Object.fromEntries(\n\t\t\tObject.values(this.model.entities).map((entity): [string, Acl.EntityPermissions] | undefined => {\n\t\t\t\tconst permissions = rolePermissions ? this.createPermissionsFromAllow(rolePermissions, entity) : { predicates: {}, operations: {} }\n\t\t\t\tconst isEmpty = !rolePermissions?.has(entity.name)\n\t\t\t\tconst withExtensions = applyEntityAclExtensions(entityLikeDefinition[entity.name], { entity, permissions, role })\n\t\t\t\tif (isEmpty && withExtensions === permissions) {\n\t\t\t\t\treturn undefined\n\t\t\t\t}\n\t\t\t\treturn [\n\t\t\t\t\tentity.name,\n\t\t\t\t\twithExtensions,\n\t\t\t\t]\n\t\t\t}).filter(<T>(it: T | undefined): it is T => it !== undefined),\n\t\t)\n\t}\n\n\tprivate createPermissionsFromAllow(rolePermissions: PermissionsByEntity, entity: Model.Entity): Acl.EntityPermissions {\n\t\tconst predicatesResolver = EntityPredicatesResolver.create(rolePermissions, this.model, entity)\n\n\t\tconst entityOperations: Writable<Acl.EntityOperations> = {}\n\t\tconst noRootOptions = this.getNoRootOptions(entity, rolePermissions.get(entity.name))\n\t\tif (noRootOptions?.length) {\n\t\t\tentityOperations.noRoot = noRootOptions\n\t\t}\n\t\tfor (const op of ['create', 'update', 'read'] as const) {\n\t\t\tconst fieldPermissions: Writable<Acl.FieldPermissions> = {}\n\t\t\tfor (const field of Object.keys(entity.fields)) {\n\t\t\t\tconst predicate = predicatesResolver.createFieldPredicate(op, field, field === entity.primary)\n\t\t\t\tif (predicate !== undefined) {\n\t\t\t\t\tfieldPermissions[field] = predicate\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (Object.keys(fieldPermissions).length > 0) {\n\t\t\t\tentityOperations[op] = fieldPermissions\n\t\t\t}\n\t\t}\n\t\tconst delPredicate = predicatesResolver.createFieldPredicate('delete', '', false)\n\t\tif (delPredicate !== undefined) {\n\t\t\tentityOperations.delete = delPredicate\n\t\t}\n\t\treturn {\n\t\t\tpredicates: predicatesResolver.getUsedPredicates(),\n\t\t\toperations: entityOperations,\n\t\t}\n\t}\n\n\tgetNoRootOptions(entity: Model.Entity, permissions?: EntityPermissions): Acl.EntityOperations['noRoot'] {\n\t\tconst allowedRoot = new Set<Acl.Operation>()\n\t\tconst disallowedRoot = new Set<Acl.Operation>()\n\t\tfor (const def of permissions?.definitions ?? []) {\n\t\t\tconst noRoot = def.through === true\n\t\t\tfor (const op of ['create', 'read', 'update', 'delete'] as const) {\n\t\t\t\tif (def[op]) {\n\t\t\t\t\tconst currentSet = noRoot ? disallowedRoot : allowedRoot\n\t\t\t\t\tcurrentSet.add(op as Acl.Operation)\n\n\t\t\t\t\tconst otherSet = noRoot ? allowedRoot : disallowedRoot\n\n\t\t\t\t\tif (otherSet.has(op as Acl.Operation)) {\n\t\t\t\t\t\tthrow new Error(`Operation ${op} cannot be both allowed and disallowed on root on entity ${entity.name}`)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn [...disallowedRoot.values()]\n\t}\n\n\tprivate createVariables(role: Role, variables: VariableDefinition[]): Acl.Variables {\n\t\tconst roleVariables = variables.filter(it => it.roles.includes(role))\n\t\treturn Object.fromEntries(roleVariables.map((variable): [string, Acl.Variable] => {\n\t\t\treturn [variable.name, variable.variable]\n\t\t}))\n\t}\n\n\tprivate groupPermissions(entityLikeDefinition: [string, { new(): any }][], roles: Role[]): PermissionsByRoleAndEntity {\n\t\tconst groupedPermissions: PermissionsByRoleAndEntity = new Map()\n\t\tfor (const [name, entity] of entityLikeDefinition) {\n\t\t\tconst initEntityPermissions = (role: Role): EntityPermissions => {\n\t\t\t\tconst rolePermissions: PermissionsByEntity = groupedPermissions.get(role) ?? new Map()\n\t\t\t\tgroupedPermissions.set(role, rolePermissions)\n\t\t\t\tconst entityPermissions = rolePermissions.get(name) ?? {\n\t\t\t\t\tdefinitions: [],\n\t\t\t\t}\n\t\t\t\trolePermissions.set(name, entityPermissions)\n\t\t\t\treturn entityPermissions\n\t\t\t}\n\t\t\tconst metadata: EntityPermissionsDefinition[] = allowDefinitionsStore.get(entity)\n\t\t\tfor (const { role, factory } of metadata) {\n\t\t\t\tif (!roles.includes(role)) {\n\t\t\t\t\tthrow `Role ${role.name} used on entity ${name} is not registered. Have you exported it?`\n\t\t\t\t}\n\t\t\t\tconst entityPermissions = initEntityPermissions(role)\n\t\t\t\tconst entity = getEntity(this.model, name)\n\t\t\t\tentityPermissions.definitions.push(factory({\n\t\t\t\t\tmodel: this.model,\n\t\t\t\t\tentity: getEntity(this.model, name),\n\t\t\t\t\texcept: (...fields) => (Object.keys(entity.fields)).filter(it => !fields.includes(it)),\n\t\t\t\t}))\n\t\t\t}\n\t\t}\n\n\t\treturn groupedPermissions\n\t}\n}\n\nexport type EntityPermissions = { definitions: AllowDefinition<any>[] }\nexport type PermissionsByEntity = Map<string, EntityPermissions>\nexport type PermissionsByRoleAndEntity = Map<Role, PermissionsByEntity>\n"],"names":["filterEntityDefinition","roles","Role","variables","VariableDefinition","applyEntityAclExtensions","EntityPredicatesResolver","allowDefinitionsStore","entity","getEntity"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { getEntity } from "@contember/schema-utils";
1
2
  import { EntityPredicatesResolver } from "./EntityPredicateResolver.js";
2
3
  import { allowDefinitionsStore } from "./stores.js";
3
4
  import { Role } from "../roles.js";
@@ -13,7 +14,7 @@ class AclFactory {
13
14
  const entityLikeDefinition = filterEntityDefinition(exportedDefinitions);
14
15
  const roles = Object.values(exportedDefinitions).filter((it) => it instanceof Role);
15
16
  const variables = Object.values(exportedDefinitions).filter((it) => it instanceof VariableDefinition);
16
- const groupedPermissions = AclFactory.groupPermissions(entityLikeDefinition, roles);
17
+ const groupedPermissions = this.groupPermissions(entityLikeDefinition, roles);
17
18
  return {
18
19
  roles: Object.fromEntries(roles.map((role) => {
19
20
  const rolePermissions = groupedPermissions.get(role);
@@ -30,18 +31,20 @@ class AclFactory {
30
31
  };
31
32
  }
32
33
  createPermissions(rolePermissions, entityLikeDefinition, role) {
33
- return Object.fromEntries(Object.values(this.model.entities).map((entity) => {
34
- const permissions = rolePermissions ? this.createPermissionsFromAllow(rolePermissions, entity) : { predicates: {}, operations: {} };
35
- const isEmpty = !rolePermissions?.has(entity.name);
36
- const withExtensions = applyEntityAclExtensions(entityLikeDefinition[entity.name], { entity, permissions, role });
37
- if (isEmpty && withExtensions === permissions) {
38
- return void 0;
39
- }
40
- return [
41
- entity.name,
42
- withExtensions
43
- ];
44
- }).filter((it) => it !== void 0));
34
+ return Object.fromEntries(
35
+ Object.values(this.model.entities).map((entity) => {
36
+ const permissions = rolePermissions ? this.createPermissionsFromAllow(rolePermissions, entity) : { predicates: {}, operations: {} };
37
+ const isEmpty = !rolePermissions?.has(entity.name);
38
+ const withExtensions = applyEntityAclExtensions(entityLikeDefinition[entity.name], { entity, permissions, role });
39
+ if (isEmpty && withExtensions === permissions) {
40
+ return void 0;
41
+ }
42
+ return [
43
+ entity.name,
44
+ withExtensions
45
+ ];
46
+ }).filter((it) => it !== void 0)
47
+ );
45
48
  }
46
49
  createPermissionsFromAllow(rolePermissions, entity) {
47
50
  const predicatesResolver = EntityPredicatesResolver.create(rolePermissions, this.model, entity);
@@ -95,7 +98,7 @@ class AclFactory {
95
98
  return [variable.name, variable.variable];
96
99
  }));
97
100
  }
98
- static groupPermissions(entityLikeDefinition, roles) {
101
+ groupPermissions(entityLikeDefinition, roles) {
99
102
  const groupedPermissions = /* @__PURE__ */ new Map();
100
103
  for (const [name, entity] of entityLikeDefinition) {
101
104
  const initEntityPermissions = (role) => {
@@ -108,12 +111,17 @@ class AclFactory {
108
111
  return entityPermissions;
109
112
  };
110
113
  const metadata = allowDefinitionsStore.get(entity);
111
- for (const { role, ...definition } of metadata) {
114
+ for (const { role, factory } of metadata) {
112
115
  if (!roles.includes(role)) {
113
116
  throw `Role ${role.name} used on entity ${name} is not registered. Have you exported it?`;
114
117
  }
115
118
  const entityPermissions = initEntityPermissions(role);
116
- entityPermissions.definitions.push(definition);
119
+ const entity2 = getEntity(this.model, name);
120
+ entityPermissions.definitions.push(factory({
121
+ model: this.model,
122
+ entity: getEntity(this.model, name),
123
+ except: (...fields) => Object.keys(entity2.fields).filter((it) => !fields.includes(it))
124
+ }));
117
125
  }
118
126
  }
119
127
  return groupedPermissions;
@@ -1 +1 @@
1
- {"version":3,"file":"AclFactory.js","sources":["../../../../../../../packages/schema-definition/src/acl/definition/internal/AclFactory.ts"],"sourcesContent":["import { Acl, Model, Writable } from '@contember/schema'\nimport { getEntity } from '@contember/schema-utils'\n\nimport { EntityPredicatesResolver } from './EntityPredicateResolver'\nimport { AllowDefinition } from '../permissions'\nimport {\n\tallowDefinitionsStore,\n\tEntityPermissionsDefinition,\n} from './stores'\nimport { Role } from '../roles'\nimport { VariableDefinition } from '../variables'\nimport { filterEntityDefinition } from '../../../utils'\nimport { applyEntityAclExtensions } from '../aclExtensions'\n\nexport class AclFactory {\n\tconstructor(\n\t\tprivate model: Model.Schema,\n\t) {\n\t}\n\n\tpublic create(\n\t\texportedDefinitions: Record<string, any>,\n\t): Acl.Schema {\n\t\tconst entityLikeDefinition = filterEntityDefinition(exportedDefinitions)\n\t\tconst roles: Role[] = Object.values(exportedDefinitions).filter(it => it instanceof Role)\n\t\tconst variables: VariableDefinition[] = Object.values(exportedDefinitions).filter(it => it instanceof VariableDefinition)\n\n\t\tconst groupedPermissions = AclFactory.groupPermissions(entityLikeDefinition, roles)\n\n\t\treturn {\n\t\t\troles: Object.fromEntries(roles.map((role): [string, Acl.RolePermissions] => {\n\t\t\t\tconst rolePermissions = groupedPermissions.get(role)\n\t\t\t\treturn [\n\t\t\t\t\trole.name,\n\t\t\t\t\t{\n\t\t\t\t\t\t...role.options,\n\t\t\t\t\t\tstages: role.options.stages ?? '*',\n\t\t\t\t\t\tentities: this.createPermissions(rolePermissions, Object.fromEntries(entityLikeDefinition), role),\n\t\t\t\t\t\tvariables: this.createVariables(role, variables),\n\t\t\t\t\t},\n\t\t\t\t]\n\t\t\t})),\n\t\t}\n\t}\n\n\tprivate createPermissions(rolePermissions: PermissionsByEntity | undefined, entityLikeDefinition: Record<string, { new(): any }>, role: Role): Acl.Permissions {\n\t\treturn Object.fromEntries(Object.values(this.model.entities).map((entity): [string, Acl.EntityPermissions] | undefined => {\n\t\t\tconst permissions = rolePermissions ? this.createPermissionsFromAllow(rolePermissions, entity) : { predicates: {}, operations: {} }\n\t\t\tconst isEmpty = !rolePermissions?.has(entity.name)\n\t\t\tconst withExtensions = applyEntityAclExtensions(entityLikeDefinition[entity.name], { entity, permissions, role })\n\t\t\tif (isEmpty && withExtensions === permissions) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\treturn [\n\t\t\t\tentity.name,\n\t\t\t\twithExtensions,\n\t\t\t]\n\t\t}).filter(<T>(it: T | undefined): it is T => it !== undefined))\n\t}\n\n\tprivate createPermissionsFromAllow(rolePermissions: PermissionsByEntity, entity: Model.Entity): Acl.EntityPermissions {\n\t\tconst predicatesResolver = EntityPredicatesResolver.create(rolePermissions, this.model, entity)\n\n\t\tconst entityOperations: Writable<Acl.EntityOperations> = {}\n\t\tconst noRootOptions = this.getNoRootOptions(entity, rolePermissions.get(entity.name))\n\t\tif (noRootOptions?.length) {\n\t\t\tentityOperations.noRoot = noRootOptions\n\t\t}\n\t\tfor (const op of ['create', 'update', 'read'] as const) {\n\t\t\tconst fieldPermissions: Writable<Acl.FieldPermissions> = {}\n\t\t\tfor (const field of Object.keys(entity.fields)) {\n\t\t\t\tconst predicate = predicatesResolver.createFieldPredicate(op, field, field === entity.primary)\n\t\t\t\tif (predicate !== undefined) {\n\t\t\t\t\tfieldPermissions[field] = predicate\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (Object.keys(fieldPermissions).length > 0) {\n\t\t\t\tentityOperations[op] = fieldPermissions\n\t\t\t}\n\t\t}\n\t\tconst delPredicate = predicatesResolver.createFieldPredicate('delete', '', false)\n\t\tif (delPredicate !== undefined) {\n\t\t\tentityOperations.delete = delPredicate\n\t\t}\n\t\treturn {\n\t\t\tpredicates: predicatesResolver.getUsedPredicates(),\n\t\t\toperations: entityOperations,\n\t\t}\n\t}\n\n\n\tgetNoRootOptions(entity: Model.Entity, permissions?: EntityPermissions): Acl.EntityOperations['noRoot'] {\n\t\tconst allowedRoot = new Set<Acl.Operation>()\n\t\tconst disallowedRoot = new Set<Acl.Operation>()\n\t\tfor (const def of permissions?.definitions ?? []) {\n\t\t\tconst noRoot = def.through === true\n\t\t\tfor (const op of ['create', 'read', 'update', 'delete'] as const) {\n\t\t\t\tif (def[op]) {\n\t\t\t\t\tconst currentSet = noRoot ? disallowedRoot : allowedRoot\n\t\t\t\t\tcurrentSet.add(op as Acl.Operation)\n\n\t\t\t\t\tconst otherSet = noRoot ? allowedRoot : disallowedRoot\n\n\t\t\t\t\tif (otherSet.has(op as Acl.Operation)) {\n\t\t\t\t\t\tthrow new Error(`Operation ${op} cannot be both allowed and disallowed on root on entity ${entity.name}`)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t\treturn [...disallowedRoot.values()]\n\t}\n\n\tprivate createVariables(role: Role, variables: VariableDefinition[]): Acl.Variables {\n\t\tconst roleVariables = variables.filter(it => it.roles.includes(role))\n\t\treturn Object.fromEntries(roleVariables.map((variable): [string, Acl.Variable] => {\n\t\t\treturn [variable.name, variable.variable]\n\t\t}))\n\t}\n\n\tprivate static groupPermissions(entityLikeDefinition: [string, { new(): any }][], roles: Role[]): PermissionsByRoleAndEntity {\n\t\tconst groupedPermissions: PermissionsByRoleAndEntity = new Map()\n\t\tfor (const [name, entity] of entityLikeDefinition) {\n\t\t\tconst initEntityPermissions = (role: Role): EntityPermissions => {\n\t\t\t\tconst rolePermissions: PermissionsByEntity = groupedPermissions.get(role) ?? new Map()\n\t\t\t\tgroupedPermissions.set(role, rolePermissions)\n\t\t\t\tconst entityPermissions = rolePermissions.get(name) ?? {\n\t\t\t\t\tdefinitions: [],\n\t\t\t\t}\n\t\t\t\trolePermissions.set(name, entityPermissions)\n\t\t\t\treturn entityPermissions\n\t\t\t}\n\t\t\tconst metadata: EntityPermissionsDefinition[] = allowDefinitionsStore.get(entity)\n\t\t\tfor (const { role, ...definition } of metadata) {\n\t\t\t\tif (!roles.includes(role)) {\n\t\t\t\t\tthrow `Role ${role.name} used on entity ${name} is not registered. Have you exported it?`\n\t\t\t\t}\n\t\t\t\tconst entityPermissions = initEntityPermissions(role)\n\t\t\t\tentityPermissions.definitions.push(definition)\n\t\t\t}\n\t\t}\n\n\t\treturn groupedPermissions\n\t}\n}\n\n\nexport type EntityPermissions = { definitions: AllowDefinition<any>[] }\nexport type PermissionsByEntity = Map<string, EntityPermissions>\nexport type PermissionsByRoleAndEntity = Map<Role, PermissionsByEntity>\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AclFactory.js","sources":["../../../../../../../packages/schema-definition/src/acl/definition/internal/AclFactory.ts"],"sourcesContent":["import { Acl, Model, Writable } from '@contember/schema'\nimport { getEntity } from '@contember/schema-utils'\n\nimport { EntityPredicatesResolver } from './EntityPredicateResolver'\nimport { AllowDefinition } from '../permissions'\nimport { allowDefinitionsStore, EntityPermissionsDefinition } from './stores'\nimport { Role } from '../roles'\nimport { VariableDefinition } from '../variables'\nimport { filterEntityDefinition } from '../../../utils'\nimport { applyEntityAclExtensions } from '../aclExtensions'\n\nexport class AclFactory {\n\tconstructor(\n\t\tprivate model: Model.Schema,\n\t) {\n\t}\n\n\tpublic create(\n\t\texportedDefinitions: Record<string, any>,\n\t): Acl.Schema {\n\t\tconst entityLikeDefinition = filterEntityDefinition(exportedDefinitions)\n\t\tconst roles: Role[] = Object.values(exportedDefinitions).filter(it => it instanceof Role)\n\t\tconst variables: VariableDefinition[] = Object.values(exportedDefinitions).filter(it => it instanceof VariableDefinition)\n\n\t\tconst groupedPermissions = this.groupPermissions(entityLikeDefinition, roles)\n\n\t\treturn {\n\t\t\troles: Object.fromEntries(roles.map((role): [string, Acl.RolePermissions] => {\n\t\t\t\tconst rolePermissions = groupedPermissions.get(role)\n\t\t\t\treturn [\n\t\t\t\t\trole.name,\n\t\t\t\t\t{\n\t\t\t\t\t\t...role.options,\n\t\t\t\t\t\tstages: role.options.stages ?? '*',\n\t\t\t\t\t\tentities: this.createPermissions(rolePermissions, Object.fromEntries(entityLikeDefinition), role),\n\t\t\t\t\t\tvariables: this.createVariables(role, variables),\n\t\t\t\t\t},\n\t\t\t\t]\n\t\t\t})),\n\t\t}\n\t}\n\n\tprivate createPermissions(\n\t\trolePermissions: PermissionsByEntity | undefined,\n\t\tentityLikeDefinition: Record<string, { new(): any }>,\n\t\trole: Role,\n\t): Acl.Permissions {\n\t\treturn Object.fromEntries(\n\t\t\tObject.values(this.model.entities).map((entity): [string, Acl.EntityPermissions] | undefined => {\n\t\t\t\tconst permissions = rolePermissions ? this.createPermissionsFromAllow(rolePermissions, entity) : { predicates: {}, operations: {} }\n\t\t\t\tconst isEmpty = !rolePermissions?.has(entity.name)\n\t\t\t\tconst withExtensions = applyEntityAclExtensions(entityLikeDefinition[entity.name], { entity, permissions, role })\n\t\t\t\tif (isEmpty && withExtensions === permissions) {\n\t\t\t\t\treturn undefined\n\t\t\t\t}\n\t\t\t\treturn [\n\t\t\t\t\tentity.name,\n\t\t\t\t\twithExtensions,\n\t\t\t\t]\n\t\t\t}).filter(<T>(it: T | undefined): it is T => it !== undefined),\n\t\t)\n\t}\n\n\tprivate createPermissionsFromAllow(rolePermissions: PermissionsByEntity, entity: Model.Entity): Acl.EntityPermissions {\n\t\tconst predicatesResolver = EntityPredicatesResolver.create(rolePermissions, this.model, entity)\n\n\t\tconst entityOperations: Writable<Acl.EntityOperations> = {}\n\t\tconst noRootOptions = this.getNoRootOptions(entity, rolePermissions.get(entity.name))\n\t\tif (noRootOptions?.length) {\n\t\t\tentityOperations.noRoot = noRootOptions\n\t\t}\n\t\tfor (const op of ['create', 'update', 'read'] as const) {\n\t\t\tconst fieldPermissions: Writable<Acl.FieldPermissions> = {}\n\t\t\tfor (const field of Object.keys(entity.fields)) {\n\t\t\t\tconst predicate = predicatesResolver.createFieldPredicate(op, field, field === entity.primary)\n\t\t\t\tif (predicate !== undefined) {\n\t\t\t\t\tfieldPermissions[field] = predicate\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (Object.keys(fieldPermissions).length > 0) {\n\t\t\t\tentityOperations[op] = fieldPermissions\n\t\t\t}\n\t\t}\n\t\tconst delPredicate = predicatesResolver.createFieldPredicate('delete', '', false)\n\t\tif (delPredicate !== undefined) {\n\t\t\tentityOperations.delete = delPredicate\n\t\t}\n\t\treturn {\n\t\t\tpredicates: predicatesResolver.getUsedPredicates(),\n\t\t\toperations: entityOperations,\n\t\t}\n\t}\n\n\tgetNoRootOptions(entity: Model.Entity, permissions?: EntityPermissions): Acl.EntityOperations['noRoot'] {\n\t\tconst allowedRoot = new Set<Acl.Operation>()\n\t\tconst disallowedRoot = new Set<Acl.Operation>()\n\t\tfor (const def of permissions?.definitions ?? []) {\n\t\t\tconst noRoot = def.through === true\n\t\t\tfor (const op of ['create', 'read', 'update', 'delete'] as const) {\n\t\t\t\tif (def[op]) {\n\t\t\t\t\tconst currentSet = noRoot ? disallowedRoot : allowedRoot\n\t\t\t\t\tcurrentSet.add(op as Acl.Operation)\n\n\t\t\t\t\tconst otherSet = noRoot ? allowedRoot : disallowedRoot\n\n\t\t\t\t\tif (otherSet.has(op as Acl.Operation)) {\n\t\t\t\t\t\tthrow new Error(`Operation ${op} cannot be both allowed and disallowed on root on entity ${entity.name}`)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn [...disallowedRoot.values()]\n\t}\n\n\tprivate createVariables(role: Role, variables: VariableDefinition[]): Acl.Variables {\n\t\tconst roleVariables = variables.filter(it => it.roles.includes(role))\n\t\treturn Object.fromEntries(roleVariables.map((variable): [string, Acl.Variable] => {\n\t\t\treturn [variable.name, variable.variable]\n\t\t}))\n\t}\n\n\tprivate groupPermissions(entityLikeDefinition: [string, { new(): any }][], roles: Role[]): PermissionsByRoleAndEntity {\n\t\tconst groupedPermissions: PermissionsByRoleAndEntity = new Map()\n\t\tfor (const [name, entity] of entityLikeDefinition) {\n\t\t\tconst initEntityPermissions = (role: Role): EntityPermissions => {\n\t\t\t\tconst rolePermissions: PermissionsByEntity = groupedPermissions.get(role) ?? new Map()\n\t\t\t\tgroupedPermissions.set(role, rolePermissions)\n\t\t\t\tconst entityPermissions = rolePermissions.get(name) ?? {\n\t\t\t\t\tdefinitions: [],\n\t\t\t\t}\n\t\t\t\trolePermissions.set(name, entityPermissions)\n\t\t\t\treturn entityPermissions\n\t\t\t}\n\t\t\tconst metadata: EntityPermissionsDefinition[] = allowDefinitionsStore.get(entity)\n\t\t\tfor (const { role, factory } of metadata) {\n\t\t\t\tif (!roles.includes(role)) {\n\t\t\t\t\tthrow `Role ${role.name} used on entity ${name} is not registered. Have you exported it?`\n\t\t\t\t}\n\t\t\t\tconst entityPermissions = initEntityPermissions(role)\n\t\t\t\tconst entity = getEntity(this.model, name)\n\t\t\t\tentityPermissions.definitions.push(factory({\n\t\t\t\t\tmodel: this.model,\n\t\t\t\t\tentity: getEntity(this.model, name),\n\t\t\t\t\texcept: (...fields) => (Object.keys(entity.fields)).filter(it => !fields.includes(it)),\n\t\t\t\t}))\n\t\t\t}\n\t\t}\n\n\t\treturn groupedPermissions\n\t}\n}\n\nexport type EntityPermissions = { definitions: AllowDefinition<any>[] }\nexport type PermissionsByEntity = Map<string, EntityPermissions>\nexport type PermissionsByRoleAndEntity = Map<Role, PermissionsByEntity>\n"],"names":["entity"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"EntityPredicateResolver.cjs","sources":["../../../../../../../packages/schema-definition/src/acl/definition/internal/EntityPredicateResolver.ts"],"sourcesContent":["import deepEqual from 'fast-deep-equal'\n\nimport { Acl, Input, Model, Writable } from '@contember/schema'\nimport { PredicateDefinitionProcessor } from '@contember/schema-utils'\n\nimport { PermissionsByEntity } from './AclFactory'\nimport { createPredicateName } from './createPredicateName'\nimport { AllowDefinition, PredicateExtra, WhenDefinition } from '../permissions'\nimport { PredicateEvaluationReference } from '../references'\nimport { VariableDefinition } from '../variables'\n\nexport class EntityPredicatesResolver {\n\tprivate usedPredicates: string[] = []\n\n\tprivate constructor(\n\t\tprivate aclDefinitions: AllowDefinition<any>[],\n\t\tprivate predicates: Writable<Acl.PredicateMap>,\n\t\tprivate predicateNamesMap: Map<WhenDefinition, string>,\n\t\tprivate generatedNames: Set<string>,\n\t) {\n\t}\n\n\tpublic static create(\n\t\trolePermissions: PermissionsByEntity,\n\t\tmodel: Model.Schema,\n\t\tentity: Model.Entity,\n\t): EntityPredicatesResolver {\n\t\tconst predicates: Writable<Acl.PredicateMap> = {}\n\t\tconst predicateNamesMap = new Map<WhenDefinition, string>()\n\t\tconst aclDefinitions = rolePermissions.get(entity.name)?.definitions ?? []\n\t\tconst generatedNames = new Set<string>()\n\t\tconst definedNames = new Set<string>(aclDefinitions.map(it => it.name).filter((it): it is string => it !== undefined))\n\t\tfor (const permission of aclDefinitions) {\n\t\t\tif (!permission.when) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst resolvedPredicate = EntityPredicatesResolver.resolvePredicate(model, entity, permission.when, rolePermissions)\n\t\t\tlet predicateName = permission.name ?? createPredicateName(resolvedPredicate)\n\t\t\twhile (predicateName in predicates || definedNames.has(predicateName)) {\n\t\t\t\tpredicateName += '_'\n\t\t\t}\n\t\t\tif (!permission.name) {\n\t\t\t\tgeneratedNames.add(predicateName)\n\t\t\t}\n\t\t\tpredicates[predicateName] = resolvedPredicate\n\t\t\tpredicateNamesMap.set(permission.when, predicateName)\n\t\t}\n\t\tfor (const op of ['read', 'update', 'create'] as const) {\n\t\t\tfor (const definition of aclDefinitions) {\n\t\t\t\tconst fields = definition[op]\n\t\t\t\tif (!Array.isArray(fields)) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tfor (const field of fields) {\n\t\t\t\t\tif (!(field in entity.fields)) {\n\t\t\t\t\t\tthrow `Field \"${String(field)}\" does not exist on entity \"${entity.name}\" in ${op} ACL definition.`\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn new EntityPredicatesResolver(aclDefinitions, predicates, predicateNamesMap, generatedNames)\n\t}\n\n\tcreateFieldPredicate(op: 'create' | 'update' | 'read' | 'delete', field: string, isPrimary: boolean): true | undefined | string {\n\t\tconst fieldWhens = EntityPredicatesResolver.getMatchingWhens(this.aclDefinitions, op, field, isPrimary)\n\t\tif (fieldWhens.length === 0) {\n\t\t\treturn undefined\n\t\t}\n\t\tif (fieldWhens.includes(true)) {\n\t\t\treturn true\n\t\t}\n\t\tconst predicateNames = (fieldWhens as WhenDefinition[]).map(it => {\n\t\t\tconst name = this.predicateNamesMap.get(it)\n\t\t\tif (!name) throw new Error('implementation error')\n\t\t\treturn name\n\t\t})\n\t\tif (predicateNames.length === 1) {\n\t\t\tthis.usedPredicates.push(predicateNames[0])\n\t\t\treturn predicateNames[0]\n\t\t}\n\n\n\t\tconst predicate = { or: predicateNames.map(it => this.predicates[it]) }\n\t\tconst origName = predicateNames.every(it => this.generatedNames.has(it)) ? createPredicateName(predicate) : predicateNames.join('_or_')\n\t\tlet predicateName = origName\n\t\tfor (let i = 1;; i++) {\n\t\t\tif (!(predicateName in this.predicates)) {\n\t\t\t\tthis.predicates[predicateName] = predicate\n\t\t\t\tbreak\n\t\t\t} else if (deepEqual(predicate, this.predicates[predicateName])) {\n\t\t\t\tbreak\n\t\t\t} else {\n\t\t\t\tpredicateName = `${origName}_${i}`\n\t\t\t}\n\t\t}\n\t\tthis.usedPredicates.push(predicateName)\n\t\treturn predicateName\n\t}\n\n\tgetUsedPredicates(): Acl.PredicateMap {\n\t\treturn Object.fromEntries(Object.entries(this.predicates).filter(([name]) => this.usedPredicates.includes(name)))\n\t}\n\n\n\tprivate static resolvePredicate(\n\t\tmodel: Model.Schema,\n\t\tentity: Model.Entity,\n\t\twhen: WhenDefinition,\n\t\trolePermissionsByEntity: PermissionsByEntity,\n\t): Acl.PredicateDefinition {\n\t\tconst processor = new PredicateDefinitionProcessor(model)\n\t\treturn processor.process<Acl.PredicateReference | Input.Condition, PredicateExtra>(entity, when, {\n\t\t\thandleColumn(ctx) {\n\t\t\t\tif (ctx.value instanceof VariableDefinition) {\n\t\t\t\t\treturn ctx.value.name\n\t\t\t\t}\n\t\t\t\tif (ctx.value instanceof PredicateEvaluationReference) {\n\t\t\t\t\tthrow `Predicate references are allowed only on relations. \\nYou cannot use \"can${upperCaseFirst(ctx.value.operation)}(${ctx.value.field ? JSON.stringify(ctx.value.field) : ''})\" on a column \"${ctx.column.name}\" of entity \"${ctx.entity.name}\".`\n\t\t\t\t}\n\t\t\t\treturn ctx.value\n\t\t\t},\n\t\t\thandleRelation(ctx) {\n\t\t\t\tif (ctx.value instanceof VariableDefinition) {\n\t\t\t\t\treturn { [ctx.targetEntity.primary]: ctx.value.name }\n\t\t\t\t}\n\t\t\t\tif (ctx.value instanceof PredicateEvaluationReference) {\n\t\t\t\t\tconst targetPermissions = rolePermissionsByEntity.get(ctx.targetEntity.name)\n\t\t\t\t\tif (!targetPermissions) {\n\t\t\t\t\t\treturn { [ctx.targetEntity.primary]: { never: true } }\n\t\t\t\t\t}\n\t\t\t\t\tconst ref = ctx.value\n\t\t\t\t\tconst whens = EntityPredicatesResolver.getMatchingWhens(targetPermissions.definitions, ref.operation, ref.field ?? '', false)\n\t\t\t\t\tif (whens.length === 0) {\n\t\t\t\t\t\treturn { [ctx.targetEntity.primary]: { never: true } }\n\t\t\t\t\t}\n\t\t\t\t\tif (whens.includes(true)) {\n\t\t\t\t\t\treturn { [ctx.targetEntity.primary]: { isNull: false } }\n\t\t\t\t\t}\n\t\t\t\t\tconst predicates = (whens as WhenDefinition[]).map(it =>\n\t\t\t\t\t\tEntityPredicatesResolver.resolvePredicate(model, ctx.targetEntity, it, rolePermissionsByEntity),\n\t\t\t\t\t)\n\t\t\t\t\tif (predicates.length > 1) {\n\t\t\t\t\t\treturn { or: predicates }\n\t\t\t\t\t}\n\t\t\t\t\treturn predicates[0]\n\t\t\t\t}\n\t\t\t\treturn ctx.value\n\t\t\t},\n\t\t})\n\t}\n\n\tprivate static getMatchingWhens(\n\t\tpermissions: AllowDefinition<any>[],\n\t\toperation: 'delete' | 'read' | 'update' | 'create',\n\t\tfield: string,\n\t\tisPrimary: boolean,\n\t) {\n\t\treturn permissions\n\t\t\t.filter(it => {\n\t\t\t\tif (operation === 'delete') {\n\t\t\t\t\treturn !!it.delete\n\t\t\t\t}\n\t\t\t\tconst op = it[operation]\n\t\t\t\tif (!op) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t\tif (op === true) {\n\t\t\t\t\treturn !isPrimary\n\t\t\t\t}\n\t\t\t\treturn op.includes(field)\n\t\t\t})\n\t\t\t.map(it => it.when ?? true)\n\t}\n}\n\nconst upperCaseFirst = (string: string) => `${string.charAt(0).toUpperCase()}${string.substring(1)}`\n"],"names":["createPredicateName","PredicateDefinitionProcessor","VariableDefinition","PredicateEvaluationReference"],"mappings":"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"}
1
+ {"version":3,"file":"EntityPredicateResolver.cjs","sources":["../../../../../../../packages/schema-definition/src/acl/definition/internal/EntityPredicateResolver.ts"],"sourcesContent":["import deepEqual from 'fast-deep-equal'\n\nimport { Acl, Input, Model, Writable } from '@contember/schema'\nimport { PredicateDefinitionProcessor } from '@contember/schema-utils'\n\nimport { PermissionsByEntity } from './AclFactory'\nimport { createPredicateName } from './createPredicateName'\nimport { AllowDefinition, PredicateExtra, WhenDefinition } from '../permissions'\nimport { PredicateEvaluationReference } from '../references'\nimport { VariableDefinition } from '../variables'\n\nexport class EntityPredicatesResolver {\n\tprivate usedPredicates: string[] = []\n\n\tprivate constructor(\n\t\tprivate aclDefinitions: AllowDefinition<any>[],\n\t\tprivate predicates: Writable<Acl.PredicateMap>,\n\t\tprivate predicateNamesMap: Map<WhenDefinition, string>,\n\t\tprivate generatedNames: Set<string>,\n\t) {\n\t}\n\n\tpublic static create(\n\t\trolePermissions: PermissionsByEntity,\n\t\tmodel: Model.Schema,\n\t\tentity: Model.Entity,\n\t): EntityPredicatesResolver {\n\t\tconst predicates: Writable<Acl.PredicateMap> = {}\n\t\tconst predicateNamesMap = new Map<WhenDefinition, string>()\n\t\tconst aclDefinitions = rolePermissions.get(entity.name)?.definitions ?? []\n\t\tconst generatedNames = new Set<string>()\n\t\tconst definedNames = new Set<string>(aclDefinitions.map(it => it.name).filter((it): it is string => it !== undefined))\n\t\tfor (const permission of aclDefinitions) {\n\t\t\tif (!permission.when) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst resolvedPredicate = EntityPredicatesResolver.resolvePredicate(model, entity, permission.when, rolePermissions)\n\t\t\tlet predicateName = permission.name ?? createPredicateName(resolvedPredicate)\n\t\t\twhile (predicateName in predicates || definedNames.has(predicateName)) {\n\t\t\t\tpredicateName += '_'\n\t\t\t}\n\t\t\tif (!permission.name) {\n\t\t\t\tgeneratedNames.add(predicateName)\n\t\t\t}\n\t\t\tpredicates[predicateName] = resolvedPredicate\n\t\t\tpredicateNamesMap.set(permission.when, predicateName)\n\t\t}\n\t\tfor (const op of ['read', 'update', 'create'] as const) {\n\t\t\tfor (const definition of aclDefinitions) {\n\t\t\t\tconst fields = definition[op]\n\t\t\t\tif (!Array.isArray(fields)) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tfor (const field of fields) {\n\t\t\t\t\tif (!(field in entity.fields)) {\n\t\t\t\t\t\tthrow `Field \"${String(field)}\" does not exist on entity \"${entity.name}\" in ${op} ACL definition.`\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn new EntityPredicatesResolver(aclDefinitions, predicates, predicateNamesMap, generatedNames)\n\t}\n\n\tcreateFieldPredicate(op: 'create' | 'update' | 'read' | 'delete', field: string, isPrimary: boolean): true | undefined | string {\n\t\tconst fieldWhens = EntityPredicatesResolver.getMatchingWhens(this.aclDefinitions, op, field, isPrimary)\n\t\tif (fieldWhens.length === 0) {\n\t\t\treturn undefined\n\t\t}\n\t\tif (fieldWhens.includes(true)) {\n\t\t\treturn true\n\t\t}\n\t\tconst predicateNames = (fieldWhens as WhenDefinition[]).map(it => {\n\t\t\tconst name = this.predicateNamesMap.get(it)\n\t\t\tif (!name) throw new Error('implementation error')\n\t\t\treturn name\n\t\t})\n\t\tif (predicateNames.length === 1) {\n\t\t\tthis.usedPredicates.push(predicateNames[0])\n\t\t\treturn predicateNames[0]\n\t\t}\n\n\t\tconst predicate = { or: predicateNames.map(it => this.predicates[it]) }\n\t\tconst origName = predicateNames.every(it => this.generatedNames.has(it)) ? createPredicateName(predicate) : predicateNames.join('_or_')\n\t\tlet predicateName = origName\n\t\tfor (let i = 1;; i++) {\n\t\t\tif (!(predicateName in this.predicates)) {\n\t\t\t\tthis.predicates[predicateName] = predicate\n\t\t\t\tbreak\n\t\t\t} else if (deepEqual(predicate, this.predicates[predicateName])) {\n\t\t\t\tbreak\n\t\t\t} else {\n\t\t\t\tpredicateName = `${origName}_${i}`\n\t\t\t}\n\t\t}\n\t\tthis.usedPredicates.push(predicateName)\n\t\treturn predicateName\n\t}\n\n\tgetUsedPredicates(): Acl.PredicateMap {\n\t\treturn Object.fromEntries(Object.entries(this.predicates).filter(([name]) => this.usedPredicates.includes(name)))\n\t}\n\n\tprivate static resolvePredicate(\n\t\tmodel: Model.Schema,\n\t\tentity: Model.Entity,\n\t\twhen: WhenDefinition,\n\t\trolePermissionsByEntity: PermissionsByEntity,\n\t): Acl.PredicateDefinition {\n\t\tconst processor = new PredicateDefinitionProcessor(model)\n\t\treturn processor.process<Acl.PredicateReference | Input.Condition, PredicateExtra>(entity, when, {\n\t\t\thandleColumn(ctx) {\n\t\t\t\tif (ctx.value instanceof VariableDefinition) {\n\t\t\t\t\treturn ctx.value.name\n\t\t\t\t}\n\t\t\t\tif (ctx.value instanceof PredicateEvaluationReference) {\n\t\t\t\t\tthrow `Predicate references are allowed only on relations. \\nYou cannot use \"can${upperCaseFirst(ctx.value.operation)}(${\n\t\t\t\t\t\tctx.value.field ? JSON.stringify(ctx.value.field) : ''\n\t\t\t\t\t})\" on a column \"${ctx.column.name}\" of entity \"${ctx.entity.name}\".`\n\t\t\t\t}\n\t\t\t\treturn ctx.value\n\t\t\t},\n\t\t\thandleRelation(ctx) {\n\t\t\t\tif (ctx.value instanceof VariableDefinition) {\n\t\t\t\t\treturn { [ctx.targetEntity.primary]: ctx.value.name }\n\t\t\t\t}\n\t\t\t\tif (ctx.value instanceof PredicateEvaluationReference) {\n\t\t\t\t\tconst targetPermissions = rolePermissionsByEntity.get(ctx.targetEntity.name)\n\t\t\t\t\tif (!targetPermissions) {\n\t\t\t\t\t\treturn { [ctx.targetEntity.primary]: { never: true } }\n\t\t\t\t\t}\n\t\t\t\t\tconst ref = ctx.value\n\t\t\t\t\tconst whens = EntityPredicatesResolver.getMatchingWhens(targetPermissions.definitions, ref.operation, ref.field ?? '', false)\n\t\t\t\t\tif (whens.length === 0) {\n\t\t\t\t\t\treturn { [ctx.targetEntity.primary]: { never: true } }\n\t\t\t\t\t}\n\t\t\t\t\tif (whens.includes(true)) {\n\t\t\t\t\t\treturn { [ctx.targetEntity.primary]: { isNull: false } }\n\t\t\t\t\t}\n\t\t\t\t\tconst predicates = (whens as WhenDefinition[]).map(it =>\n\t\t\t\t\t\tEntityPredicatesResolver.resolvePredicate(model, ctx.targetEntity, it, rolePermissionsByEntity)\n\t\t\t\t\t)\n\t\t\t\t\tif (predicates.length > 1) {\n\t\t\t\t\t\treturn { or: predicates }\n\t\t\t\t\t}\n\t\t\t\t\treturn predicates[0]\n\t\t\t\t}\n\t\t\t\treturn ctx.value\n\t\t\t},\n\t\t})\n\t}\n\n\tprivate static getMatchingWhens(\n\t\tpermissions: AllowDefinition<any>[],\n\t\toperation: 'delete' | 'read' | 'update' | 'create',\n\t\tfield: string,\n\t\tisPrimary: boolean,\n\t) {\n\t\treturn permissions\n\t\t\t.filter(it => {\n\t\t\t\tif (operation === 'delete') {\n\t\t\t\t\treturn !!it.delete\n\t\t\t\t}\n\t\t\t\tconst op = it[operation]\n\t\t\t\tif (!op) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t\tif (op === true) {\n\t\t\t\t\treturn !isPrimary\n\t\t\t\t}\n\t\t\t\treturn op.includes(field)\n\t\t\t})\n\t\t\t.map(it => it.when ?? true)\n\t}\n}\n\nconst upperCaseFirst = (string: string) => `${string.charAt(0).toUpperCase()}${string.substring(1)}`\n"],"names":["createPredicateName","PredicateDefinitionProcessor","VariableDefinition","PredicateEvaluationReference"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"EntityPredicateResolver.js","sources":["../../../../../../../packages/schema-definition/src/acl/definition/internal/EntityPredicateResolver.ts"],"sourcesContent":["import deepEqual from 'fast-deep-equal'\n\nimport { Acl, Input, Model, Writable } from '@contember/schema'\nimport { PredicateDefinitionProcessor } from '@contember/schema-utils'\n\nimport { PermissionsByEntity } from './AclFactory'\nimport { createPredicateName } from './createPredicateName'\nimport { AllowDefinition, PredicateExtra, WhenDefinition } from '../permissions'\nimport { PredicateEvaluationReference } from '../references'\nimport { VariableDefinition } from '../variables'\n\nexport class EntityPredicatesResolver {\n\tprivate usedPredicates: string[] = []\n\n\tprivate constructor(\n\t\tprivate aclDefinitions: AllowDefinition<any>[],\n\t\tprivate predicates: Writable<Acl.PredicateMap>,\n\t\tprivate predicateNamesMap: Map<WhenDefinition, string>,\n\t\tprivate generatedNames: Set<string>,\n\t) {\n\t}\n\n\tpublic static create(\n\t\trolePermissions: PermissionsByEntity,\n\t\tmodel: Model.Schema,\n\t\tentity: Model.Entity,\n\t): EntityPredicatesResolver {\n\t\tconst predicates: Writable<Acl.PredicateMap> = {}\n\t\tconst predicateNamesMap = new Map<WhenDefinition, string>()\n\t\tconst aclDefinitions = rolePermissions.get(entity.name)?.definitions ?? []\n\t\tconst generatedNames = new Set<string>()\n\t\tconst definedNames = new Set<string>(aclDefinitions.map(it => it.name).filter((it): it is string => it !== undefined))\n\t\tfor (const permission of aclDefinitions) {\n\t\t\tif (!permission.when) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst resolvedPredicate = EntityPredicatesResolver.resolvePredicate(model, entity, permission.when, rolePermissions)\n\t\t\tlet predicateName = permission.name ?? createPredicateName(resolvedPredicate)\n\t\t\twhile (predicateName in predicates || definedNames.has(predicateName)) {\n\t\t\t\tpredicateName += '_'\n\t\t\t}\n\t\t\tif (!permission.name) {\n\t\t\t\tgeneratedNames.add(predicateName)\n\t\t\t}\n\t\t\tpredicates[predicateName] = resolvedPredicate\n\t\t\tpredicateNamesMap.set(permission.when, predicateName)\n\t\t}\n\t\tfor (const op of ['read', 'update', 'create'] as const) {\n\t\t\tfor (const definition of aclDefinitions) {\n\t\t\t\tconst fields = definition[op]\n\t\t\t\tif (!Array.isArray(fields)) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tfor (const field of fields) {\n\t\t\t\t\tif (!(field in entity.fields)) {\n\t\t\t\t\t\tthrow `Field \"${String(field)}\" does not exist on entity \"${entity.name}\" in ${op} ACL definition.`\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn new EntityPredicatesResolver(aclDefinitions, predicates, predicateNamesMap, generatedNames)\n\t}\n\n\tcreateFieldPredicate(op: 'create' | 'update' | 'read' | 'delete', field: string, isPrimary: boolean): true | undefined | string {\n\t\tconst fieldWhens = EntityPredicatesResolver.getMatchingWhens(this.aclDefinitions, op, field, isPrimary)\n\t\tif (fieldWhens.length === 0) {\n\t\t\treturn undefined\n\t\t}\n\t\tif (fieldWhens.includes(true)) {\n\t\t\treturn true\n\t\t}\n\t\tconst predicateNames = (fieldWhens as WhenDefinition[]).map(it => {\n\t\t\tconst name = this.predicateNamesMap.get(it)\n\t\t\tif (!name) throw new Error('implementation error')\n\t\t\treturn name\n\t\t})\n\t\tif (predicateNames.length === 1) {\n\t\t\tthis.usedPredicates.push(predicateNames[0])\n\t\t\treturn predicateNames[0]\n\t\t}\n\n\n\t\tconst predicate = { or: predicateNames.map(it => this.predicates[it]) }\n\t\tconst origName = predicateNames.every(it => this.generatedNames.has(it)) ? createPredicateName(predicate) : predicateNames.join('_or_')\n\t\tlet predicateName = origName\n\t\tfor (let i = 1;; i++) {\n\t\t\tif (!(predicateName in this.predicates)) {\n\t\t\t\tthis.predicates[predicateName] = predicate\n\t\t\t\tbreak\n\t\t\t} else if (deepEqual(predicate, this.predicates[predicateName])) {\n\t\t\t\tbreak\n\t\t\t} else {\n\t\t\t\tpredicateName = `${origName}_${i}`\n\t\t\t}\n\t\t}\n\t\tthis.usedPredicates.push(predicateName)\n\t\treturn predicateName\n\t}\n\n\tgetUsedPredicates(): Acl.PredicateMap {\n\t\treturn Object.fromEntries(Object.entries(this.predicates).filter(([name]) => this.usedPredicates.includes(name)))\n\t}\n\n\n\tprivate static resolvePredicate(\n\t\tmodel: Model.Schema,\n\t\tentity: Model.Entity,\n\t\twhen: WhenDefinition,\n\t\trolePermissionsByEntity: PermissionsByEntity,\n\t): Acl.PredicateDefinition {\n\t\tconst processor = new PredicateDefinitionProcessor(model)\n\t\treturn processor.process<Acl.PredicateReference | Input.Condition, PredicateExtra>(entity, when, {\n\t\t\thandleColumn(ctx) {\n\t\t\t\tif (ctx.value instanceof VariableDefinition) {\n\t\t\t\t\treturn ctx.value.name\n\t\t\t\t}\n\t\t\t\tif (ctx.value instanceof PredicateEvaluationReference) {\n\t\t\t\t\tthrow `Predicate references are allowed only on relations. \\nYou cannot use \"can${upperCaseFirst(ctx.value.operation)}(${ctx.value.field ? JSON.stringify(ctx.value.field) : ''})\" on a column \"${ctx.column.name}\" of entity \"${ctx.entity.name}\".`\n\t\t\t\t}\n\t\t\t\treturn ctx.value\n\t\t\t},\n\t\t\thandleRelation(ctx) {\n\t\t\t\tif (ctx.value instanceof VariableDefinition) {\n\t\t\t\t\treturn { [ctx.targetEntity.primary]: ctx.value.name }\n\t\t\t\t}\n\t\t\t\tif (ctx.value instanceof PredicateEvaluationReference) {\n\t\t\t\t\tconst targetPermissions = rolePermissionsByEntity.get(ctx.targetEntity.name)\n\t\t\t\t\tif (!targetPermissions) {\n\t\t\t\t\t\treturn { [ctx.targetEntity.primary]: { never: true } }\n\t\t\t\t\t}\n\t\t\t\t\tconst ref = ctx.value\n\t\t\t\t\tconst whens = EntityPredicatesResolver.getMatchingWhens(targetPermissions.definitions, ref.operation, ref.field ?? '', false)\n\t\t\t\t\tif (whens.length === 0) {\n\t\t\t\t\t\treturn { [ctx.targetEntity.primary]: { never: true } }\n\t\t\t\t\t}\n\t\t\t\t\tif (whens.includes(true)) {\n\t\t\t\t\t\treturn { [ctx.targetEntity.primary]: { isNull: false } }\n\t\t\t\t\t}\n\t\t\t\t\tconst predicates = (whens as WhenDefinition[]).map(it =>\n\t\t\t\t\t\tEntityPredicatesResolver.resolvePredicate(model, ctx.targetEntity, it, rolePermissionsByEntity),\n\t\t\t\t\t)\n\t\t\t\t\tif (predicates.length > 1) {\n\t\t\t\t\t\treturn { or: predicates }\n\t\t\t\t\t}\n\t\t\t\t\treturn predicates[0]\n\t\t\t\t}\n\t\t\t\treturn ctx.value\n\t\t\t},\n\t\t})\n\t}\n\n\tprivate static getMatchingWhens(\n\t\tpermissions: AllowDefinition<any>[],\n\t\toperation: 'delete' | 'read' | 'update' | 'create',\n\t\tfield: string,\n\t\tisPrimary: boolean,\n\t) {\n\t\treturn permissions\n\t\t\t.filter(it => {\n\t\t\t\tif (operation === 'delete') {\n\t\t\t\t\treturn !!it.delete\n\t\t\t\t}\n\t\t\t\tconst op = it[operation]\n\t\t\t\tif (!op) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t\tif (op === true) {\n\t\t\t\t\treturn !isPrimary\n\t\t\t\t}\n\t\t\t\treturn op.includes(field)\n\t\t\t})\n\t\t\t.map(it => it.when ?? true)\n\t}\n}\n\nconst upperCaseFirst = (string: string) => `${string.charAt(0).toUpperCase()}${string.substring(1)}`\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EntityPredicateResolver.js","sources":["../../../../../../../packages/schema-definition/src/acl/definition/internal/EntityPredicateResolver.ts"],"sourcesContent":["import deepEqual from 'fast-deep-equal'\n\nimport { Acl, Input, Model, Writable } from '@contember/schema'\nimport { PredicateDefinitionProcessor } from '@contember/schema-utils'\n\nimport { PermissionsByEntity } from './AclFactory'\nimport { createPredicateName } from './createPredicateName'\nimport { AllowDefinition, PredicateExtra, WhenDefinition } from '../permissions'\nimport { PredicateEvaluationReference } from '../references'\nimport { VariableDefinition } from '../variables'\n\nexport class EntityPredicatesResolver {\n\tprivate usedPredicates: string[] = []\n\n\tprivate constructor(\n\t\tprivate aclDefinitions: AllowDefinition<any>[],\n\t\tprivate predicates: Writable<Acl.PredicateMap>,\n\t\tprivate predicateNamesMap: Map<WhenDefinition, string>,\n\t\tprivate generatedNames: Set<string>,\n\t) {\n\t}\n\n\tpublic static create(\n\t\trolePermissions: PermissionsByEntity,\n\t\tmodel: Model.Schema,\n\t\tentity: Model.Entity,\n\t): EntityPredicatesResolver {\n\t\tconst predicates: Writable<Acl.PredicateMap> = {}\n\t\tconst predicateNamesMap = new Map<WhenDefinition, string>()\n\t\tconst aclDefinitions = rolePermissions.get(entity.name)?.definitions ?? []\n\t\tconst generatedNames = new Set<string>()\n\t\tconst definedNames = new Set<string>(aclDefinitions.map(it => it.name).filter((it): it is string => it !== undefined))\n\t\tfor (const permission of aclDefinitions) {\n\t\t\tif (!permission.when) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst resolvedPredicate = EntityPredicatesResolver.resolvePredicate(model, entity, permission.when, rolePermissions)\n\t\t\tlet predicateName = permission.name ?? createPredicateName(resolvedPredicate)\n\t\t\twhile (predicateName in predicates || definedNames.has(predicateName)) {\n\t\t\t\tpredicateName += '_'\n\t\t\t}\n\t\t\tif (!permission.name) {\n\t\t\t\tgeneratedNames.add(predicateName)\n\t\t\t}\n\t\t\tpredicates[predicateName] = resolvedPredicate\n\t\t\tpredicateNamesMap.set(permission.when, predicateName)\n\t\t}\n\t\tfor (const op of ['read', 'update', 'create'] as const) {\n\t\t\tfor (const definition of aclDefinitions) {\n\t\t\t\tconst fields = definition[op]\n\t\t\t\tif (!Array.isArray(fields)) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tfor (const field of fields) {\n\t\t\t\t\tif (!(field in entity.fields)) {\n\t\t\t\t\t\tthrow `Field \"${String(field)}\" does not exist on entity \"${entity.name}\" in ${op} ACL definition.`\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn new EntityPredicatesResolver(aclDefinitions, predicates, predicateNamesMap, generatedNames)\n\t}\n\n\tcreateFieldPredicate(op: 'create' | 'update' | 'read' | 'delete', field: string, isPrimary: boolean): true | undefined | string {\n\t\tconst fieldWhens = EntityPredicatesResolver.getMatchingWhens(this.aclDefinitions, op, field, isPrimary)\n\t\tif (fieldWhens.length === 0) {\n\t\t\treturn undefined\n\t\t}\n\t\tif (fieldWhens.includes(true)) {\n\t\t\treturn true\n\t\t}\n\t\tconst predicateNames = (fieldWhens as WhenDefinition[]).map(it => {\n\t\t\tconst name = this.predicateNamesMap.get(it)\n\t\t\tif (!name) throw new Error('implementation error')\n\t\t\treturn name\n\t\t})\n\t\tif (predicateNames.length === 1) {\n\t\t\tthis.usedPredicates.push(predicateNames[0])\n\t\t\treturn predicateNames[0]\n\t\t}\n\n\t\tconst predicate = { or: predicateNames.map(it => this.predicates[it]) }\n\t\tconst origName = predicateNames.every(it => this.generatedNames.has(it)) ? createPredicateName(predicate) : predicateNames.join('_or_')\n\t\tlet predicateName = origName\n\t\tfor (let i = 1;; i++) {\n\t\t\tif (!(predicateName in this.predicates)) {\n\t\t\t\tthis.predicates[predicateName] = predicate\n\t\t\t\tbreak\n\t\t\t} else if (deepEqual(predicate, this.predicates[predicateName])) {\n\t\t\t\tbreak\n\t\t\t} else {\n\t\t\t\tpredicateName = `${origName}_${i}`\n\t\t\t}\n\t\t}\n\t\tthis.usedPredicates.push(predicateName)\n\t\treturn predicateName\n\t}\n\n\tgetUsedPredicates(): Acl.PredicateMap {\n\t\treturn Object.fromEntries(Object.entries(this.predicates).filter(([name]) => this.usedPredicates.includes(name)))\n\t}\n\n\tprivate static resolvePredicate(\n\t\tmodel: Model.Schema,\n\t\tentity: Model.Entity,\n\t\twhen: WhenDefinition,\n\t\trolePermissionsByEntity: PermissionsByEntity,\n\t): Acl.PredicateDefinition {\n\t\tconst processor = new PredicateDefinitionProcessor(model)\n\t\treturn processor.process<Acl.PredicateReference | Input.Condition, PredicateExtra>(entity, when, {\n\t\t\thandleColumn(ctx) {\n\t\t\t\tif (ctx.value instanceof VariableDefinition) {\n\t\t\t\t\treturn ctx.value.name\n\t\t\t\t}\n\t\t\t\tif (ctx.value instanceof PredicateEvaluationReference) {\n\t\t\t\t\tthrow `Predicate references are allowed only on relations. \\nYou cannot use \"can${upperCaseFirst(ctx.value.operation)}(${\n\t\t\t\t\t\tctx.value.field ? JSON.stringify(ctx.value.field) : ''\n\t\t\t\t\t})\" on a column \"${ctx.column.name}\" of entity \"${ctx.entity.name}\".`\n\t\t\t\t}\n\t\t\t\treturn ctx.value\n\t\t\t},\n\t\t\thandleRelation(ctx) {\n\t\t\t\tif (ctx.value instanceof VariableDefinition) {\n\t\t\t\t\treturn { [ctx.targetEntity.primary]: ctx.value.name }\n\t\t\t\t}\n\t\t\t\tif (ctx.value instanceof PredicateEvaluationReference) {\n\t\t\t\t\tconst targetPermissions = rolePermissionsByEntity.get(ctx.targetEntity.name)\n\t\t\t\t\tif (!targetPermissions) {\n\t\t\t\t\t\treturn { [ctx.targetEntity.primary]: { never: true } }\n\t\t\t\t\t}\n\t\t\t\t\tconst ref = ctx.value\n\t\t\t\t\tconst whens = EntityPredicatesResolver.getMatchingWhens(targetPermissions.definitions, ref.operation, ref.field ?? '', false)\n\t\t\t\t\tif (whens.length === 0) {\n\t\t\t\t\t\treturn { [ctx.targetEntity.primary]: { never: true } }\n\t\t\t\t\t}\n\t\t\t\t\tif (whens.includes(true)) {\n\t\t\t\t\t\treturn { [ctx.targetEntity.primary]: { isNull: false } }\n\t\t\t\t\t}\n\t\t\t\t\tconst predicates = (whens as WhenDefinition[]).map(it =>\n\t\t\t\t\t\tEntityPredicatesResolver.resolvePredicate(model, ctx.targetEntity, it, rolePermissionsByEntity)\n\t\t\t\t\t)\n\t\t\t\t\tif (predicates.length > 1) {\n\t\t\t\t\t\treturn { or: predicates }\n\t\t\t\t\t}\n\t\t\t\t\treturn predicates[0]\n\t\t\t\t}\n\t\t\t\treturn ctx.value\n\t\t\t},\n\t\t})\n\t}\n\n\tprivate static getMatchingWhens(\n\t\tpermissions: AllowDefinition<any>[],\n\t\toperation: 'delete' | 'read' | 'update' | 'create',\n\t\tfield: string,\n\t\tisPrimary: boolean,\n\t) {\n\t\treturn permissions\n\t\t\t.filter(it => {\n\t\t\t\tif (operation === 'delete') {\n\t\t\t\t\treturn !!it.delete\n\t\t\t\t}\n\t\t\t\tconst op = it[operation]\n\t\t\t\tif (!op) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t\tif (op === true) {\n\t\t\t\t\treturn !isPrimary\n\t\t\t\t}\n\t\t\t\treturn op.includes(field)\n\t\t\t})\n\t\t\t.map(it => it.when ?? true)\n\t}\n}\n\nconst upperCaseFirst = (string: string) => `${string.charAt(0).toUpperCase()}${string.substring(1)}`\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"createPredicateName.cjs","sources":["../../../../../../../packages/schema-definition/src/acl/definition/internal/createPredicateName.ts"],"sourcesContent":["import { WhenDefinition } from '../permissions'\n\nexport const createPredicateName = (when: WhenDefinition) => {\n\tconst json = JSON.stringify(when)\n\treturn json.replace(/[^A-Za-z0-9]+/g, '_').slice(0, 30).replace(/^_|_$/g, '')\n}\n"],"names":[],"mappings":";;AAEa,MAAA,sBAAsB,CAAC,SAAyB;AACtD,QAAA,OAAO,KAAK,UAAU,IAAI;AACzB,SAAA,KAAK,QAAQ,kBAAkB,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,QAAQ,UAAU,EAAE;AAC7E;;"}
1
+ {"version":3,"file":"createPredicateName.cjs","sources":["../../../../../../../packages/schema-definition/src/acl/definition/internal/createPredicateName.ts"],"sourcesContent":["import { WhenDefinition } from '../permissions'\n\nexport const createPredicateName = (when: WhenDefinition) => {\n\tconst json = JSON.stringify(when)\n\treturn json.replace(/[^A-Za-z0-9]+/g, '_').slice(0, 30).replace(/^_|_$/g, '')\n}\n"],"names":[],"mappings":";;AAEO,MAAM,sBAAsB,CAAC,SAAyB;AAC5D,QAAM,OAAO,KAAK,UAAU,IAAI;AAChC,SAAO,KAAK,QAAQ,kBAAkB,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,QAAQ,UAAU,EAAE;AAC7E;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"createPredicateName.js","sources":["../../../../../../../packages/schema-definition/src/acl/definition/internal/createPredicateName.ts"],"sourcesContent":["import { WhenDefinition } from '../permissions'\n\nexport const createPredicateName = (when: WhenDefinition) => {\n\tconst json = JSON.stringify(when)\n\treturn json.replace(/[^A-Za-z0-9]+/g, '_').slice(0, 30).replace(/^_|_$/g, '')\n}\n"],"names":[],"mappings":"AAEa,MAAA,sBAAsB,CAAC,SAAyB;AACtD,QAAA,OAAO,KAAK,UAAU,IAAI;AACzB,SAAA,KAAK,QAAQ,kBAAkB,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,QAAQ,UAAU,EAAE;AAC7E;"}
1
+ {"version":3,"file":"createPredicateName.js","sources":["../../../../../../../packages/schema-definition/src/acl/definition/internal/createPredicateName.ts"],"sourcesContent":["import { WhenDefinition } from '../permissions'\n\nexport const createPredicateName = (when: WhenDefinition) => {\n\tconst json = JSON.stringify(when)\n\treturn json.replace(/[^A-Za-z0-9]+/g, '_').slice(0, 30).replace(/^_|_$/g, '')\n}\n"],"names":[],"mappings":"AAEO,MAAM,sBAAsB,CAAC,SAAyB;AAC5D,QAAM,OAAO,KAAK,UAAU,IAAI;AAChC,SAAO,KAAK,QAAQ,kBAAkB,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,QAAQ,UAAU,EAAE;AAC7E;"}
@@ -1 +1 @@
1
- {"version":3,"file":"stores.cjs","sources":["../../../../../../../packages/schema-definition/src/acl/definition/internal/stores.ts"],"sourcesContent":["import { createMetadataStore } from '../../../utils/MetadataStore'\nimport { Role } from '../roles'\nimport { AllowDefinition } from '../permissions'\n\nexport type EntityPermissionsDefinition =\n\t& AllowDefinition<any>\n\t& {\n\t\trole: Role<string>\n\t}\nexport const allowDefinitionsStore = createMetadataStore<EntityPermissionsDefinition[]>([])\n"],"names":["createMetadataStore"],"mappings":";;;AASa,MAAA,wBAAwBA,cAAmD,oBAAA,CAAE,CAAA;;"}
1
+ {"version":3,"file":"stores.cjs","sources":["../../../../../../../packages/schema-definition/src/acl/definition/internal/stores.ts"],"sourcesContent":["import { createMetadataStore } from '../../../utils/MetadataStore'\nimport { AllowDefinitionFactory } from '../permissions'\nimport { Role } from '../roles'\n\nexport type EntityPermissionsDefinition = {\n\tfactory: AllowDefinitionFactory<any>\n\trole: Role<string>\n}\nexport const allowDefinitionsStore = createMetadataStore<EntityPermissionsDefinition[]>([])\n"],"names":["createMetadataStore"],"mappings":";;;AAQO,MAAM,wBAAwBA,cAAAA,oBAAmD,CAAA,CAAE;;"}