@contember/schema-utils 2.1.0-beta.2 → 2.2.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (247) hide show
  1. package/dist/development/index.cjs +11 -0
  2. package/dist/development/index.cjs.map +1 -1
  3. package/dist/development/index.js +11 -0
  4. package/dist/development/index.js.map +1 -1
  5. package/dist/development/src/acl/PredicateDefinitionProcessor.cjs.map +1 -1
  6. package/dist/development/src/acl/PredicateDefinitionProcessor.js.map +1 -1
  7. package/dist/development/src/dataUtils.cjs +1 -0
  8. package/dist/development/src/dataUtils.cjs.map +1 -1
  9. package/dist/development/src/dataUtils.js +1 -0
  10. package/dist/development/src/dataUtils.js.map +1 -1
  11. package/dist/development/src/definition-generator/AclDefinitionCodeGenerator.cjs.map +1 -1
  12. package/dist/development/src/definition-generator/AclDefinitionCodeGenerator.js.map +1 -1
  13. package/dist/development/src/definition-generator/DefinitionCodeGenerator.cjs +37 -2
  14. package/dist/development/src/definition-generator/DefinitionCodeGenerator.cjs.map +1 -1
  15. package/dist/development/src/definition-generator/DefinitionCodeGenerator.js +37 -2
  16. package/dist/development/src/definition-generator/DefinitionCodeGenerator.js.map +1 -1
  17. package/dist/development/src/definition-generator/TsDefinitionGenerator.cjs.map +1 -1
  18. package/dist/development/src/definition-generator/TsDefinitionGenerator.js.map +1 -1
  19. package/dist/development/src/json-schema/collectUnsupportedKeywords.cjs +45 -0
  20. package/dist/development/src/json-schema/collectUnsupportedKeywords.cjs.map +1 -0
  21. package/dist/development/src/json-schema/collectUnsupportedKeywords.js +45 -0
  22. package/dist/development/src/json-schema/collectUnsupportedKeywords.js.map +1 -0
  23. package/dist/development/src/json-schema/jsonSchemaToTsType.cjs +138 -0
  24. package/dist/development/src/json-schema/jsonSchemaToTsType.cjs.map +1 -0
  25. package/dist/development/src/json-schema/jsonSchemaToTsType.js +138 -0
  26. package/dist/development/src/json-schema/jsonSchemaToTsType.js.map +1 -0
  27. package/dist/development/src/json-schema/keywords.cjs +57 -0
  28. package/dist/development/src/json-schema/keywords.cjs.map +1 -0
  29. package/dist/development/src/json-schema/keywords.js +57 -0
  30. package/dist/development/src/json-schema/keywords.js.map +1 -0
  31. package/dist/development/src/lax/LaxSchemaConverter.cjs.map +1 -1
  32. package/dist/development/src/lax/LaxSchemaConverter.js.map +1 -1
  33. package/dist/development/src/model/modelUtils.cjs.map +1 -1
  34. package/dist/development/src/model/modelUtils.js.map +1 -1
  35. package/dist/development/src/model/resolveDefaultColumnType.cjs +2 -0
  36. package/dist/development/src/model/resolveDefaultColumnType.cjs.map +1 -1
  37. package/dist/development/src/model/resolveDefaultColumnType.js +2 -0
  38. package/dist/development/src/model/resolveDefaultColumnType.js.map +1 -1
  39. package/dist/development/src/schemaNormalizer.cjs.map +1 -1
  40. package/dist/development/src/schemaNormalizer.js.map +1 -1
  41. package/dist/development/src/type-schema/acl.cjs.map +1 -1
  42. package/dist/development/src/type-schema/acl.js.map +1 -1
  43. package/dist/development/src/type-schema/condition.cjs +6 -1
  44. package/dist/development/src/type-schema/condition.cjs.map +1 -1
  45. package/dist/development/src/type-schema/condition.js +6 -1
  46. package/dist/development/src/type-schema/condition.js.map +1 -1
  47. package/dist/development/src/type-schema/model.cjs +14 -2
  48. package/dist/development/src/type-schema/model.cjs.map +1 -1
  49. package/dist/development/src/type-schema/model.js +14 -2
  50. package/dist/development/src/type-schema/model.js.map +1 -1
  51. package/dist/development/src/type-schema/settings.cjs +1 -0
  52. package/dist/development/src/type-schema/settings.cjs.map +1 -1
  53. package/dist/development/src/type-schema/settings.js +1 -0
  54. package/dist/development/src/type-schema/settings.js.map +1 -1
  55. package/dist/development/src/type-schema/where.cjs.map +1 -1
  56. package/dist/development/src/type-schema/where.js.map +1 -1
  57. package/dist/development/src/validation/AclValidator.cjs.map +1 -1
  58. package/dist/development/src/validation/AclValidator.js.map +1 -1
  59. package/dist/development/src/validation/ActionsValidator.cjs.map +1 -1
  60. package/dist/development/src/validation/ActionsValidator.js.map +1 -1
  61. package/dist/development/src/validation/MembershipResolver.cjs.map +1 -1
  62. package/dist/development/src/validation/MembershipResolver.js.map +1 -1
  63. package/dist/development/src/validation/ModelValidator.cjs +66 -0
  64. package/dist/development/src/validation/ModelValidator.cjs.map +1 -1
  65. package/dist/development/src/validation/ModelValidator.js +66 -0
  66. package/dist/development/src/validation/ModelValidator.js.map +1 -1
  67. package/dist/development/src/validation/SchemaValidator.cjs.map +1 -1
  68. package/dist/development/src/validation/SchemaValidator.js.map +1 -1
  69. package/dist/development/src/validation/ValidationValidator.cjs.map +1 -1
  70. package/dist/development/src/validation/ValidationValidator.js.map +1 -1
  71. package/dist/development/src/validation/errors.cjs.map +1 -1
  72. package/dist/development/src/validation/errors.js.map +1 -1
  73. package/dist/production/index.cjs +11 -0
  74. package/dist/production/index.cjs.map +1 -1
  75. package/dist/production/index.js +11 -0
  76. package/dist/production/index.js.map +1 -1
  77. package/dist/production/src/acl/PredicateDefinitionProcessor.cjs.map +1 -1
  78. package/dist/production/src/acl/PredicateDefinitionProcessor.js.map +1 -1
  79. package/dist/production/src/dataUtils.cjs +1 -0
  80. package/dist/production/src/dataUtils.cjs.map +1 -1
  81. package/dist/production/src/dataUtils.js +1 -0
  82. package/dist/production/src/dataUtils.js.map +1 -1
  83. package/dist/production/src/definition-generator/AclDefinitionCodeGenerator.cjs.map +1 -1
  84. package/dist/production/src/definition-generator/AclDefinitionCodeGenerator.js.map +1 -1
  85. package/dist/production/src/definition-generator/DefinitionCodeGenerator.cjs +37 -2
  86. package/dist/production/src/definition-generator/DefinitionCodeGenerator.cjs.map +1 -1
  87. package/dist/production/src/definition-generator/DefinitionCodeGenerator.js +37 -2
  88. package/dist/production/src/definition-generator/DefinitionCodeGenerator.js.map +1 -1
  89. package/dist/production/src/definition-generator/TsDefinitionGenerator.cjs.map +1 -1
  90. package/dist/production/src/definition-generator/TsDefinitionGenerator.js.map +1 -1
  91. package/dist/production/src/json-schema/collectUnsupportedKeywords.cjs +45 -0
  92. package/dist/production/src/json-schema/collectUnsupportedKeywords.cjs.map +1 -0
  93. package/dist/production/src/json-schema/collectUnsupportedKeywords.js +45 -0
  94. package/dist/production/src/json-schema/collectUnsupportedKeywords.js.map +1 -0
  95. package/dist/production/src/json-schema/jsonSchemaToTsType.cjs +138 -0
  96. package/dist/production/src/json-schema/jsonSchemaToTsType.cjs.map +1 -0
  97. package/dist/production/src/json-schema/jsonSchemaToTsType.js +138 -0
  98. package/dist/production/src/json-schema/jsonSchemaToTsType.js.map +1 -0
  99. package/dist/production/src/json-schema/keywords.cjs +57 -0
  100. package/dist/production/src/json-schema/keywords.cjs.map +1 -0
  101. package/dist/production/src/json-schema/keywords.js +57 -0
  102. package/dist/production/src/json-schema/keywords.js.map +1 -0
  103. package/dist/production/src/lax/LaxSchemaConverter.cjs.map +1 -1
  104. package/dist/production/src/lax/LaxSchemaConverter.js.map +1 -1
  105. package/dist/production/src/model/modelUtils.cjs.map +1 -1
  106. package/dist/production/src/model/modelUtils.js.map +1 -1
  107. package/dist/production/src/model/resolveDefaultColumnType.cjs +2 -0
  108. package/dist/production/src/model/resolveDefaultColumnType.cjs.map +1 -1
  109. package/dist/production/src/model/resolveDefaultColumnType.js +2 -0
  110. package/dist/production/src/model/resolveDefaultColumnType.js.map +1 -1
  111. package/dist/production/src/schemaNormalizer.cjs.map +1 -1
  112. package/dist/production/src/schemaNormalizer.js.map +1 -1
  113. package/dist/production/src/type-schema/acl.cjs.map +1 -1
  114. package/dist/production/src/type-schema/acl.js.map +1 -1
  115. package/dist/production/src/type-schema/condition.cjs +6 -1
  116. package/dist/production/src/type-schema/condition.cjs.map +1 -1
  117. package/dist/production/src/type-schema/condition.js +6 -1
  118. package/dist/production/src/type-schema/condition.js.map +1 -1
  119. package/dist/production/src/type-schema/model.cjs +14 -2
  120. package/dist/production/src/type-schema/model.cjs.map +1 -1
  121. package/dist/production/src/type-schema/model.js +14 -2
  122. package/dist/production/src/type-schema/model.js.map +1 -1
  123. package/dist/production/src/type-schema/settings.cjs +1 -0
  124. package/dist/production/src/type-schema/settings.cjs.map +1 -1
  125. package/dist/production/src/type-schema/settings.js +1 -0
  126. package/dist/production/src/type-schema/settings.js.map +1 -1
  127. package/dist/production/src/type-schema/where.cjs.map +1 -1
  128. package/dist/production/src/type-schema/where.js.map +1 -1
  129. package/dist/production/src/validation/AclValidator.cjs.map +1 -1
  130. package/dist/production/src/validation/AclValidator.js.map +1 -1
  131. package/dist/production/src/validation/ActionsValidator.cjs.map +1 -1
  132. package/dist/production/src/validation/ActionsValidator.js.map +1 -1
  133. package/dist/production/src/validation/MembershipResolver.cjs.map +1 -1
  134. package/dist/production/src/validation/MembershipResolver.js.map +1 -1
  135. package/dist/production/src/validation/ModelValidator.cjs +66 -0
  136. package/dist/production/src/validation/ModelValidator.cjs.map +1 -1
  137. package/dist/production/src/validation/ModelValidator.js +66 -0
  138. package/dist/production/src/validation/ModelValidator.js.map +1 -1
  139. package/dist/production/src/validation/SchemaValidator.cjs.map +1 -1
  140. package/dist/production/src/validation/SchemaValidator.js.map +1 -1
  141. package/dist/production/src/validation/ValidationValidator.cjs.map +1 -1
  142. package/dist/production/src/validation/ValidationValidator.js.map +1 -1
  143. package/dist/production/src/validation/errors.cjs.map +1 -1
  144. package/dist/production/src/validation/errors.js.map +1 -1
  145. package/dist/tests/cases/unit/jsonSchemaKeywords.test.d.ts +2 -0
  146. package/dist/tests/cases/unit/jsonSchemaKeywords.test.d.ts.map +1 -0
  147. package/dist/tests/cases/unit/jsonSchemaToTsType.test.d.ts +2 -0
  148. package/dist/tests/cases/unit/jsonSchemaToTsType.test.d.ts.map +1 -0
  149. package/dist/tests/cases/unit/numericColumnCodeGenerator.test.d.ts +2 -0
  150. package/dist/tests/cases/unit/numericColumnCodeGenerator.test.d.ts.map +1 -0
  151. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  152. package/dist/types/acl/index.d.ts +3 -3
  153. package/dist/types/acl/index.d.ts.map +1 -1
  154. package/dist/types/dataUtils.d.ts.map +1 -1
  155. package/dist/types/definition-generator/AclDefinitionCodeGenerator.d.ts +1 -1
  156. package/dist/types/definition-generator/AclDefinitionCodeGenerator.d.ts.map +1 -1
  157. package/dist/types/definition-generator/DefinitionCodeGenerator.d.ts +3 -3
  158. package/dist/types/definition-generator/DefinitionCodeGenerator.d.ts.map +1 -1
  159. package/dist/types/definition-generator/TsDefinitionGenerator.d.ts +1 -1
  160. package/dist/types/definition-generator/TsDefinitionGenerator.d.ts.map +1 -1
  161. package/dist/types/definition-generator/index.d.ts +4 -4
  162. package/dist/types/definition-generator/index.d.ts.map +1 -1
  163. package/dist/types/index.d.ts +11 -10
  164. package/dist/types/index.d.ts.map +1 -1
  165. package/dist/types/json-schema/collectUnsupportedKeywords.d.ts +20 -0
  166. package/dist/types/json-schema/collectUnsupportedKeywords.d.ts.map +1 -0
  167. package/dist/types/json-schema/index.d.ts +4 -0
  168. package/dist/types/json-schema/index.d.ts.map +1 -0
  169. package/dist/types/json-schema/jsonSchemaToTsType.d.ts +24 -0
  170. package/dist/types/json-schema/jsonSchemaToTsType.d.ts.map +1 -0
  171. package/dist/types/json-schema/keywords.d.ts +28 -0
  172. package/dist/types/json-schema/keywords.d.ts.map +1 -0
  173. package/dist/types/lax/LaxSchemaConverter.d.ts +2 -2
  174. package/dist/types/lax/LaxSchemaConverter.d.ts.map +1 -1
  175. package/dist/types/lax/index.d.ts +2 -2
  176. package/dist/types/lax/index.d.ts.map +1 -1
  177. package/dist/types/model/index.d.ts +3 -3
  178. package/dist/types/model/index.d.ts.map +1 -1
  179. package/dist/types/model/resolveDefaultColumnType.d.ts.map +1 -1
  180. package/dist/types/tsconfig.tsbuildinfo +1 -1
  181. package/dist/types/type-schema/index.d.ts +5 -5
  182. package/dist/types/type-schema/index.d.ts.map +1 -1
  183. package/dist/types/type-schema/model.d.ts.map +1 -1
  184. package/dist/types/type-schema/settings.d.ts +3 -0
  185. package/dist/types/type-schema/settings.d.ts.map +1 -1
  186. package/dist/types/utils/index.d.ts +3 -3
  187. package/dist/types/utils/index.d.ts.map +1 -1
  188. package/dist/types/validation/AclValidator.d.ts +1 -1
  189. package/dist/types/validation/AclValidator.d.ts.map +1 -1
  190. package/dist/types/validation/ActionsValidator.d.ts +1 -1
  191. package/dist/types/validation/ActionsValidator.d.ts.map +1 -1
  192. package/dist/types/validation/ModelValidator.d.ts +3 -1
  193. package/dist/types/validation/ModelValidator.d.ts.map +1 -1
  194. package/dist/types/validation/SchemaValidator.d.ts +1 -1
  195. package/dist/types/validation/SchemaValidator.d.ts.map +1 -1
  196. package/dist/types/validation/ValidationValidator.d.ts +1 -1
  197. package/dist/types/validation/ValidationValidator.d.ts.map +1 -1
  198. package/dist/types/validation/errors.d.ts +1 -1
  199. package/dist/types/validation/errors.d.ts.map +1 -1
  200. package/dist/types/validation/index.d.ts +6 -6
  201. package/dist/types/validation/index.d.ts.map +1 -1
  202. package/package.json +4 -4
  203. package/src/acl/PredicateDefinitionProcessor.ts +1 -1
  204. package/src/acl/index.ts +3 -3
  205. package/src/dataUtils.ts +1 -0
  206. package/src/definition-generator/AclDefinitionCodeGenerator.ts +3 -3
  207. package/src/definition-generator/DefinitionCodeGenerator.ts +44 -7
  208. package/src/definition-generator/TsDefinitionGenerator.ts +2 -2
  209. package/src/definition-generator/index.ts +4 -4
  210. package/src/index.ts +14 -13
  211. package/src/json-schema/collectUnsupportedKeywords.ts +74 -0
  212. package/src/json-schema/index.ts +3 -0
  213. package/src/json-schema/jsonSchemaToTsType.ts +188 -0
  214. package/src/json-schema/keywords.ts +79 -0
  215. package/src/lax/LaxSchemaConverter.ts +3 -3
  216. package/src/lax/index.ts +2 -2
  217. package/src/model/index.ts +3 -3
  218. package/src/model/modelUtils.ts +1 -1
  219. package/src/model/resolveDefaultColumnType.ts +3 -1
  220. package/src/schemaNormalizer.ts +1 -1
  221. package/src/type-schema/acl.ts +1 -1
  222. package/src/type-schema/condition.ts +5 -0
  223. package/src/type-schema/index.ts +5 -5
  224. package/src/type-schema/model.ts +12 -0
  225. package/src/type-schema/settings.ts +1 -0
  226. package/src/type-schema/where.ts +2 -2
  227. package/src/utils/index.ts +3 -3
  228. package/src/validation/AclValidator.ts +4 -4
  229. package/src/validation/ActionsValidator.ts +4 -4
  230. package/src/validation/MembershipResolver.ts +3 -3
  231. package/src/validation/ModelValidator.ts +80 -2
  232. package/src/validation/SchemaValidator.ts +5 -5
  233. package/src/validation/ValidationValidator.ts +2 -2
  234. package/src/validation/errors.ts +2 -0
  235. package/src/validation/index.ts +6 -6
  236. package/tests/cases/unit/conditionSchema.test.ts +1 -1
  237. package/tests/cases/unit/deepCompare.test.ts +1 -1
  238. package/tests/cases/unit/jsonSchemaKeywords.test.ts +91 -0
  239. package/tests/cases/unit/jsonSchemaToTsType.test.ts +55 -0
  240. package/tests/cases/unit/laxSchemaConverter.test.ts +1 -1
  241. package/tests/cases/unit/membershipResolver.test.ts +1 -1
  242. package/tests/cases/unit/modelSchema.test.ts +1 -1
  243. package/tests/cases/unit/modelValidator.test.ts +246 -1
  244. package/tests/cases/unit/numericColumnCodeGenerator.test.ts +69 -0
  245. package/tests/cases/unit/printJsvalue.test.ts +1 -1
  246. package/tests/cases/unit/tsDefinitionGenerator.test.ts +46 -9
  247. package/tests/cases/unit/whereSchema.test.ts +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"condition.js","sources":["../../../../../packages/schema-utils/src/type-schema/condition.ts"],"sourcesContent":["import * as Typesafe from '@contember/typesafe'\nimport { Json, Type } from '@contember/typesafe'\nimport { Input, Model, Value } from '@contember/schema'\n\nexport const conditionSchema = <T extends Value.FieldValue>(type?: Model.ColumnType): Type<Input.Condition<T>> => {\n\tconst metadata = type ? resolveColumnMetadata(type) : { type: Typesafe.scalar }\n\treturn conditionSchemaInner(metadata)\n}\n\ninterface ResolvedColumnMetadata<T extends Json> {\n\ttype: Typesafe.Type<T>\n\tisJson?: boolean\n\tisString?: boolean\n}\n\nconst conditionSchemaInner = <T extends Json>(metadata: ResolvedColumnMetadata<T>): Type<Input.Condition<T>> => {\n\treturn (input: unknown, path: PropertyKey[] = []): Input.Condition<T> => {\n\t\tconst self = conditionSchemaInner(metadata)\n\t\tconst inner = metadata.type\n\t\tconst objectSchema = Typesafe.noExtraProps(Typesafe.partial({\n\t\t\tand: Typesafe.array(self),\n\t\t\tor: Typesafe.array(self),\n\t\t\tnot: self,\n\t\t\tnull: Typesafe.boolean,\n\t\t\tisNull: Typesafe.boolean,\n\t\t\tnever: Typesafe.true_,\n\t\t\talways: Typesafe.true_,\n\t\t\t...(metadata.isJson !== true\n\t\t\t\t? {\n\t\t\t\t\teq: inner,\n\t\t\t\t\tnotEq: inner,\n\t\t\t\t\tin: Typesafe.array(inner),\n\t\t\t\t\tnotIn: Typesafe.array(inner),\n\t\t\t\t\tlt: inner,\n\t\t\t\t\tlte: inner,\n\t\t\t\t\tgt: inner,\n\t\t\t\t\tgte: inner,\n\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t// For JSON columns, allow includes operator\n\t\t\t\t\tincludes: inner,\n\t\t\t\t}),\n\t\t\t...(metadata.isString !== false\n\t\t\t\t? {\n\t\t\t\t\tcontains: Typesafe.string,\n\t\t\t\t\tstartsWith: Typesafe.string,\n\t\t\t\t\tendsWith: Typesafe.string,\n\t\t\t\t\tcontainsCI: Typesafe.string,\n\t\t\t\t\tstartsWithCI: Typesafe.string,\n\t\t\t\t\tendsWithCI: Typesafe.string,\n\t\t\t\t}\n\t\t\t\t: {}),\n\t\t}))\n\t\treturn objectSchema(input, path) as Input.Condition<T>\n\t}\n}\n\nconst resolveColumnMetadata = (type: Model.ColumnType): ResolvedColumnMetadata<any> => {\n\tconst resolvedType = Typesafe.nullable(resolveColumnTypeSchema(type))\n\treturn {\n\t\ttype: resolvedType,\n\t\tisJson: type === Model.ColumnType.Json,\n\t\tisString: type === Model.ColumnType.String,\n\t}\n}\n\nconst resolveColumnTypeSchema = (type: Model.ColumnType) => {\n\tswitch (type) {\n\t\tcase Model.ColumnType.Bool:\n\t\t\treturn Typesafe.boolean\n\n\t\t// todo: validate format of string-like inputs uuid, date, enum\n\t\tcase Model.ColumnType.Date:\n\t\tcase Model.ColumnType.DateTime:\n\t\tcase Model.ColumnType.Time:\n\t\tcase Model.ColumnType.Uuid:\n\t\tcase Model.ColumnType.Enum:\n\t\tcase Model.ColumnType.String:\n\t\t\treturn Typesafe.string\n\t\tcase Model.ColumnType.Double:\n\t\t\treturn Typesafe.number\n\t\tcase Model.ColumnType.Int:\n\t\t\treturn Typesafe.integer\n\t\tcase Model.ColumnType.Json:\n\t\t\treturn Typesafe.anyJson\n\t}\n}\n"],"names":[],"mappings":";;AAIO,MAAM,kBAAkB,CAA6B,SAAsD;AACjH,QAAM,WAAW,OAAO,sBAAsB,IAAI,IAAI,EAAE,MAAM,SAAS,OAAA;AACvE,SAAO,qBAAqB,QAAQ;AACrC;AAQA,MAAM,uBAAuB,CAAiB,aAAkE;AAC/G,SAAO,CAAC,OAAgB,OAAsB,OAA2B;AACxE,UAAM,OAAO,qBAAqB,QAAQ;AAC1C,UAAM,QAAQ,SAAS;AACvB,UAAM,eAAe,SAAS,aAAa,SAAS,QAAQ;AAAA,MAC3D,KAAK,SAAS,MAAM,IAAI;AAAA,MACxB,IAAI,SAAS,MAAM,IAAI;AAAA,MACvB,KAAK;AAAA,MACL,MAAM,SAAS;AAAA,MACf,QAAQ,SAAS;AAAA,MACjB,OAAO,SAAS;AAAA,MAChB,QAAQ,SAAS;AAAA,MACjB,GAAI,SAAS,WAAW,OACrB;AAAA,QACD,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,IAAI,SAAS,MAAM,KAAK;AAAA,QACxB,OAAO,SAAS,MAAM,KAAK;AAAA,QAC3B,IAAI;AAAA,QACJ,KAAK;AAAA,QACL,IAAI;AAAA,QACJ,KAAK;AAAA,MAAA,IAEJ;AAAA;AAAA,QAED,UAAU;AAAA,MAAA;AAAA,MAEZ,GAAI,SAAS,aAAa,QACvB;AAAA,QACD,UAAU,SAAS;AAAA,QACnB,YAAY,SAAS;AAAA,QACrB,UAAU,SAAS;AAAA,QACnB,YAAY,SAAS;AAAA,QACrB,cAAc,SAAS;AAAA,QACvB,YAAY,SAAS;AAAA,MAAA,IAEpB,CAAA;AAAA,IAAC,CACJ,CAAC;AACF,WAAO,aAAa,OAAO,IAAI;AAAA,EAChC;AACD;AAEA,MAAM,wBAAwB,CAAC,SAAwD;AACtF,QAAM,eAAe,SAAS,SAAS,wBAAwB,IAAI,CAAC;AACpE,SAAO;AAAA,IACN,MAAM;AAAA,IACN,QAAQ,SAAS,MAAM,WAAW;AAAA,IAClC,UAAU,SAAS,MAAM,WAAW;AAAA,EAAA;AAEtC;AAEA,MAAM,0BAA0B,CAAC,SAA2B;AAC3D,UAAQ,MAAA;AAAA,IACP,KAAK,MAAM,WAAW;AACrB,aAAO,SAAS;AAAA;AAAA,IAGjB,KAAK,MAAM,WAAW;AAAA,IACtB,KAAK,MAAM,WAAW;AAAA,IACtB,KAAK,MAAM,WAAW;AAAA,IACtB,KAAK,MAAM,WAAW;AAAA,IACtB,KAAK,MAAM,WAAW;AAAA,IACtB,KAAK,MAAM,WAAW;AACrB,aAAO,SAAS;AAAA,IACjB,KAAK,MAAM,WAAW;AACrB,aAAO,SAAS;AAAA,IACjB,KAAK,MAAM,WAAW;AACrB,aAAO,SAAS;AAAA,IACjB,KAAK,MAAM,WAAW;AACrB,aAAO,SAAS;AAAA,EAAA;AAEnB;"}
1
+ {"version":3,"file":"condition.js","sources":["../../../../../packages/schema-utils/src/type-schema/condition.ts"],"sourcesContent":["import * as Typesafe from '@contember/typesafe'\nimport { Json, Type } from '@contember/typesafe'\nimport { Input, Model, Value } from '@contember/schema'\n\nexport const conditionSchema = <T extends Value.FieldValue>(type?: Model.ColumnType): Type<Input.Condition<T>> => {\n\tconst metadata = type ? resolveColumnMetadata(type) : { type: Typesafe.scalar }\n\treturn conditionSchemaInner(metadata)\n}\n\ninterface ResolvedColumnMetadata<T extends Json> {\n\ttype: Typesafe.Type<T>\n\tisJson?: boolean\n\tisString?: boolean\n}\n\nconst conditionSchemaInner = <T extends Json>(metadata: ResolvedColumnMetadata<T>): Type<Input.Condition<T>> => {\n\treturn (input: unknown, path: PropertyKey[] = []): Input.Condition<T> => {\n\t\tconst self = conditionSchemaInner(metadata)\n\t\tconst inner = metadata.type\n\t\tconst objectSchema = Typesafe.noExtraProps(Typesafe.partial({\n\t\t\tand: Typesafe.array(self),\n\t\t\tor: Typesafe.array(self),\n\t\t\tnot: self,\n\t\t\tnull: Typesafe.boolean,\n\t\t\tisNull: Typesafe.boolean,\n\t\t\tnever: Typesafe.true_,\n\t\t\talways: Typesafe.true_,\n\t\t\t...(metadata.isJson !== true\n\t\t\t\t? {\n\t\t\t\t\teq: inner,\n\t\t\t\t\tnotEq: inner,\n\t\t\t\t\tin: Typesafe.array(inner),\n\t\t\t\t\tnotIn: Typesafe.array(inner),\n\t\t\t\t\tlt: inner,\n\t\t\t\t\tlte: inner,\n\t\t\t\t\tgt: inner,\n\t\t\t\t\tgte: inner,\n\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t// For JSON columns, allow includes operator\n\t\t\t\t\tincludes: inner,\n\t\t\t\t}),\n\t\t\t...(metadata.isString !== false\n\t\t\t\t? {\n\t\t\t\t\tcontains: Typesafe.string,\n\t\t\t\t\tstartsWith: Typesafe.string,\n\t\t\t\t\tendsWith: Typesafe.string,\n\t\t\t\t\tcontainsCI: Typesafe.string,\n\t\t\t\t\tstartsWithCI: Typesafe.string,\n\t\t\t\t\tendsWithCI: Typesafe.string,\n\t\t\t\t\tsimilar: Typesafe.string,\n\t\t\t\t\twordSimilar: Typesafe.string,\n\t\t\t\t}\n\t\t\t\t: {}),\n\t\t}))\n\t\treturn objectSchema(input, path) as Input.Condition<T>\n\t}\n}\n\nconst resolveColumnMetadata = (type: Model.ColumnType): ResolvedColumnMetadata<any> => {\n\tconst resolvedType = Typesafe.nullable(resolveColumnTypeSchema(type))\n\treturn {\n\t\ttype: resolvedType,\n\t\tisJson: type === Model.ColumnType.Json,\n\t\tisString: type === Model.ColumnType.String,\n\t}\n}\n\nconst resolveColumnTypeSchema = (type: Model.ColumnType) => {\n\tswitch (type) {\n\t\tcase Model.ColumnType.Bool:\n\t\t\treturn Typesafe.boolean\n\n\t\t// todo: validate format of string-like inputs uuid, date, enum\n\t\tcase Model.ColumnType.Date:\n\t\tcase Model.ColumnType.DateTime:\n\t\tcase Model.ColumnType.Time:\n\t\tcase Model.ColumnType.Uuid:\n\t\tcase Model.ColumnType.Enum:\n\t\tcase Model.ColumnType.String:\n\t\t\treturn Typesafe.string\n\t\t// Numeric is transported as a string to avoid JS float precision loss.\n\t\tcase Model.ColumnType.Numeric:\n\t\t\treturn Typesafe.string\n\t\tcase Model.ColumnType.Double:\n\t\t\treturn Typesafe.number\n\t\tcase Model.ColumnType.Int:\n\t\t\treturn Typesafe.integer\n\t\tcase Model.ColumnType.Json:\n\t\t\treturn Typesafe.anyJson\n\t}\n}\n"],"names":[],"mappings":";;AAIO,MAAM,kBAAkB,CAA6B,SAAsD;AACjH,QAAM,WAAW,OAAO,sBAAsB,IAAI,IAAI,EAAE,MAAM,SAAS,OAAA;AACvE,SAAO,qBAAqB,QAAQ;AACrC;AAQA,MAAM,uBAAuB,CAAiB,aAAkE;AAC/G,SAAO,CAAC,OAAgB,OAAsB,OAA2B;AACxE,UAAM,OAAO,qBAAqB,QAAQ;AAC1C,UAAM,QAAQ,SAAS;AACvB,UAAM,eAAe,SAAS,aAAa,SAAS,QAAQ;AAAA,MAC3D,KAAK,SAAS,MAAM,IAAI;AAAA,MACxB,IAAI,SAAS,MAAM,IAAI;AAAA,MACvB,KAAK;AAAA,MACL,MAAM,SAAS;AAAA,MACf,QAAQ,SAAS;AAAA,MACjB,OAAO,SAAS;AAAA,MAChB,QAAQ,SAAS;AAAA,MACjB,GAAI,SAAS,WAAW,OACrB;AAAA,QACD,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,IAAI,SAAS,MAAM,KAAK;AAAA,QACxB,OAAO,SAAS,MAAM,KAAK;AAAA,QAC3B,IAAI;AAAA,QACJ,KAAK;AAAA,QACL,IAAI;AAAA,QACJ,KAAK;AAAA,MAAA,IAEJ;AAAA;AAAA,QAED,UAAU;AAAA,MAAA;AAAA,MAEZ,GAAI,SAAS,aAAa,QACvB;AAAA,QACD,UAAU,SAAS;AAAA,QACnB,YAAY,SAAS;AAAA,QACrB,UAAU,SAAS;AAAA,QACnB,YAAY,SAAS;AAAA,QACrB,cAAc,SAAS;AAAA,QACvB,YAAY,SAAS;AAAA,QACrB,SAAS,SAAS;AAAA,QAClB,aAAa,SAAS;AAAA,MAAA,IAErB,CAAA;AAAA,IAAC,CACJ,CAAC;AACF,WAAO,aAAa,OAAO,IAAI;AAAA,EAChC;AACD;AAEA,MAAM,wBAAwB,CAAC,SAAwD;AACtF,QAAM,eAAe,SAAS,SAAS,wBAAwB,IAAI,CAAC;AACpE,SAAO;AAAA,IACN,MAAM;AAAA,IACN,QAAQ,SAAS,MAAM,WAAW;AAAA,IAClC,UAAU,SAAS,MAAM,WAAW;AAAA,EAAA;AAEtC;AAEA,MAAM,0BAA0B,CAAC,SAA2B;AAC3D,UAAQ,MAAA;AAAA,IACP,KAAK,MAAM,WAAW;AACrB,aAAO,SAAS;AAAA;AAAA,IAGjB,KAAK,MAAM,WAAW;AAAA,IACtB,KAAK,MAAM,WAAW;AAAA,IACtB,KAAK,MAAM,WAAW;AAAA,IACtB,KAAK,MAAM,WAAW;AAAA,IACtB,KAAK,MAAM,WAAW;AAAA,IACtB,KAAK,MAAM,WAAW;AACrB,aAAO,SAAS;AAAA;AAAA,IAEjB,KAAK,MAAM,WAAW;AACrB,aAAO,SAAS;AAAA,IACjB,KAAK,MAAM,WAAW;AACrB,aAAO,SAAS;AAAA,IACjB,KAAK,MAAM,WAAW;AACrB,aAAO,SAAS;AAAA,IACjB,KAAK,MAAM,WAAW;AACrB,aAAO,SAAS;AAAA,EAAA;AAEnB;"}
@@ -135,7 +135,8 @@ const columnSchema = Typesafe__namespace.intersection(
135
135
  list: Typesafe__namespace.boolean,
136
136
  default: Typesafe__namespace.anyJson,
137
137
  sequence: intersectionSchema,
138
- collation: Typesafe__namespace.string
138
+ collation: Typesafe__namespace.string,
139
+ schema: Typesafe__namespace.anyJson
139
140
  })
140
141
  );
141
142
  const fieldSchema = Typesafe__namespace.partiallyDiscriminatedUnion(
@@ -165,7 +166,18 @@ const indexSchemaBase = Typesafe__namespace.intersection(
165
166
  }),
166
167
  Typesafe__namespace.partial({
167
168
  name: Typesafe__namespace.string,
168
- method: Typesafe__namespace.enumeration("btree", "gin", "gist", "hash", "brin", "spgist")
169
+ method: Typesafe__namespace.enumeration("btree", "gin", "gist", "hash", "brin", "spgist"),
170
+ opClass: Typesafe__namespace.string,
171
+ where: Typesafe__namespace.string,
172
+ include: Typesafe__namespace.array(Typesafe__namespace.string),
173
+ columnOptions: Typesafe__namespace.record(
174
+ Typesafe__namespace.string,
175
+ Typesafe__namespace.partial({
176
+ order: Typesafe__namespace.enumeration("asc", "desc"),
177
+ nulls: Typesafe__namespace.enumeration("first", "last"),
178
+ opClass: Typesafe__namespace.string
179
+ })
180
+ )
169
181
  })
170
182
  );
171
183
  const indexesSchema = Typesafe__namespace.coalesce(
@@ -1 +1 @@
1
- {"version":3,"file":"model.cjs","sources":["../../../../../packages/schema-utils/src/type-schema/model.ts"],"sourcesContent":["import * as Typesafe from '@contember/typesafe'\nimport { Model } from '@contember/schema'\nimport { ParseError } from '@contember/typesafe'\n\nconst orderBySchema = Typesafe.array(Typesafe.object({\n\tpath: Typesafe.array(Typesafe.string),\n\tdirection: Typesafe.enumeration<Model.OrderDirection>(\n\t\tModel.OrderDirection.asc,\n\t\tModel.OrderDirection.desc,\n\t\tModel.OrderDirection.ascNullsFirst,\n\t\tModel.OrderDirection.descNullsLast,\n\t),\n}))\nconst joiningColumnSchema = Typesafe.object({\n\tcolumnName: Typesafe.string,\n\tonDelete: Typesafe.enumeration<Model.OnDelete>(Model.OnDelete.cascade, Model.OnDelete.restrict, Model.OnDelete.setNull),\n})\nconst oneHasManyRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.OneHasMany),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\townedBy: Typesafe.string,\n\t}),\n\tTypesafe.partial({\n\t\torderBy: orderBySchema,\n\t}),\n)\nconst oneHasManyRelationSchemaCheck: Typesafe.Equals<Model.OneHasManyRelation, ReturnType<typeof oneHasManyRelationSchema>> = true\n\nconst manyHasOneRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.ManyHasOne),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\tjoiningColumn: joiningColumnSchema,\n\t\tnullable: Typesafe.boolean,\n\t}),\n\tTypesafe.partial({\n\t\tinversedBy: Typesafe.string,\n\t}),\n)\n\nconst manyHasOneRelationSchemaCheck: Typesafe.Equals<Model.ManyHasOneRelation, ReturnType<typeof manyHasOneRelationSchema>> = true\n\nconst oneHasOneInverseRelationSchema = Typesafe.object({\n\ttype: Typesafe.literal(Model.RelationType.OneHasOne),\n\tname: Typesafe.string,\n\ttarget: Typesafe.string,\n\townedBy: Typesafe.string,\n\tnullable: Typesafe.boolean,\n})\nconst oneHasOneInverseRelationSchemaCheck: Typesafe.Equals<Model.OneHasOneInverseRelation, ReturnType<typeof oneHasOneInverseRelationSchema>> = true\n\nconst oneHasOneOwningRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.OneHasOne),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\tjoiningColumn: joiningColumnSchema,\n\t\tnullable: Typesafe.boolean,\n\t}),\n\tTypesafe.partial({\n\t\tinversedBy: Typesafe.string,\n\t\torphanRemoval: Typesafe.literal(true),\n\t}),\n)\n\nconst oneHasOneOwningRelationSchemaCheck: Typesafe.Equals<Model.OneHasOneOwningRelation, ReturnType<typeof oneHasOneOwningRelationSchema>> = true\n\nconst eventLogSchema = Typesafe.coalesce(\n\tTypesafe.object({\n\t\tenabled: Typesafe.boolean,\n\t}),\n\t{ enabled: true },\n) as Typesafe.Type<{ readonly enabled: boolean }>\n\nconst manyHasManyOwningRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.ManyHasMany),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\tjoiningTable: Typesafe.object({\n\t\t\ttableName: Typesafe.string,\n\t\t\tjoiningColumn: joiningColumnSchema,\n\t\t\tinverseJoiningColumn: joiningColumnSchema,\n\t\t\teventLog: eventLogSchema,\n\t\t}),\n\t}),\n\tTypesafe.partial({\n\t\tinversedBy: Typesafe.string,\n\t\torderBy: orderBySchema,\n\t}),\n)\nconst manyHasManyOwningRelationSchemaCheck: Typesafe.Equals<Model.ManyHasManyOwningRelation, ReturnType<typeof manyHasManyOwningRelationSchema>> =\n\ttrue\n\nconst manyHasManyInverseRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.ManyHasMany),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\townedBy: Typesafe.string,\n\t}),\n\tTypesafe.partial({\n\t\torderBy: orderBySchema,\n\t}),\n)\nconst manyHasManyInverseRelationSchemaCheck: Typesafe.Equals<Model.ManyHasManyInverseRelation, ReturnType<typeof manyHasManyInverseRelationSchema>> =\n\ttrue\n\nconst intersectionSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\tprecedence: Typesafe.enumeration('ALWAYS', 'BY DEFAULT'),\n\t}),\n\tTypesafe.partial({\n\t\tstart: Typesafe.number,\n\t}),\n)\nconst intersectionSchemaCheck: Typesafe.Equals<Model.AnyColumn['sequence'], ReturnType<typeof intersectionSchema>> = true\n\nconst columnSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\tname: Typesafe.string,\n\t\tcolumnName: Typesafe.string,\n\t\tcolumnType: Typesafe.transform(Typesafe.string, (it, raw, path) => {\n\t\t\tif (!it.replaceAll(/\\s+/g, '').match(/^[\\w_]+(?:\\(\\w+(?:,\\w+)*\\))?\\w*(?:\"[^\"]+\")?(\\[])*$/)) {\n\t\t\t\tthrow ParseError.format(it, path, 'valid column type')\n\t\t\t}\n\t\t\treturn it\n\t\t}),\n\t\tnullable: Typesafe.boolean,\n\t\ttype: Typesafe.enumeration<Model.ColumnType>(...Object.values(Model.ColumnType)),\n\t}),\n\tTypesafe.partial({\n\t\ttypeAlias: Typesafe.string,\n\t\tlist: Typesafe.boolean,\n\t\tdefault: Typesafe.anyJson,\n\t\tsequence: intersectionSchema as Typesafe.Type<Model.AnyColumn['sequence']>,\n\t\tcollation: Typesafe.string as Typesafe.Type<Model.AnyColumn['collation']>,\n\t}),\n)\nconst columnSchemaCheck: Typesafe.Equals<Model.AnyColumn, ReturnType<typeof columnSchema>> = true\n\nconst fieldSchema: Typesafe.Type<Model.AnyField> = Typesafe.partiallyDiscriminatedUnion(\n\t'type',\n\toneHasOneInverseRelationSchema,\n\toneHasOneOwningRelationSchema,\n\toneHasManyRelationSchema,\n\tmanyHasOneRelationSchema,\n\tmanyHasManyInverseRelationSchema,\n\tmanyHasManyOwningRelationSchema,\n\tcolumnSchema,\n)\n\nconst viewSchemaInner = Typesafe.intersection(\n\tTypesafe.object({\n\t\tsql: Typesafe.string,\n\t}),\n\tTypesafe.partial({\n\t\tdependencies: Typesafe.array(Typesafe.string),\n\t\tidSource: Typesafe.array(Typesafe.string),\n\t\tmaterialized: Typesafe.boolean,\n\t}),\n)\nconst viewSchemaCheck: Typesafe.Equals<Model.View, ReturnType<typeof viewSchemaInner>> = true\nconst viewSchema: Typesafe.Type<Model.View> = viewSchemaInner\n\nconst indexSchemaBase = Typesafe.intersection(\n\tTypesafe.object({\n\t\tfields: Typesafe.array(Typesafe.string),\n\t}),\n\tTypesafe.partial({\n\t\tname: Typesafe.string,\n\t\tmethod: Typesafe.enumeration('btree', 'gin', 'gist', 'hash', 'brin', 'spgist'),\n\t}),\n)\nconst indexCheck: Typesafe.Equals<Model.Index, ReturnType<typeof indexSchemaBase>> = true\n\nconst indexesSchema = Typesafe.coalesce<Model.Indexes, Model.Indexes>(\n\tTypesafe.preprocess(\n\t\tTypesafe.array(indexSchemaBase),\n\t\tit => it?.constructor === Object ? Object.values(it) : it,\n\t),\n\t[],\n)\n\nconst uniqueConstraint = Typesafe.intersection(\n\tTypesafe.object({\n\t\tfields: Typesafe.array(Typesafe.string),\n\t}),\n\tTypesafe.partial({\n\t\ttiming: Typesafe.enumeration('deferrable', 'deferred'),\n\t\tname: Typesafe.string,\n\t\tindex: Typesafe.literal(false),\n\t}),\n)\nconst uniqueIndex = Typesafe.intersection(\n\tTypesafe.object({\n\t\tfields: Typesafe.array(Typesafe.string),\n\t\tindex: Typesafe.literal(true),\n\t}),\n\tTypesafe.partial({\n\t\tnulls: Typesafe.enumeration('distinct', 'not distinct'),\n\t\tmethod: Typesafe.enumeration('btree', 'gin', 'gist', 'hash', 'brin', 'spgist'),\n\t}),\n)\nconst uniqueConstraintCheck: Typesafe.Equals<Model.UniqueConstraint, ReturnType<typeof uniqueConstraint>> = true\nconst uniqueIndexCheck: Typesafe.Equals<Model.UniqueIndex, ReturnType<typeof uniqueIndex>> = true\n\nconst entitySchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\tname: Typesafe.string,\n\t\tprimary: Typesafe.string,\n\t\tprimaryColumn: Typesafe.string,\n\t\ttableName: Typesafe.string,\n\t\tfields: Typesafe.record(Typesafe.string, fieldSchema),\n\t\tunique: Typesafe.preprocess<Model.Uniques>(\n\t\t\tTypesafe.array(Typesafe.union(uniqueConstraint, uniqueIndex)),\n\t\t\tit => it?.constructor === Object ? Object.values(it) : it,\n\t\t),\n\t\tindexes: indexesSchema,\n\t\teventLog: eventLogSchema,\n\t}),\n\tTypesafe.partial({\n\t\tview: viewSchema,\n\t\torderBy: orderBySchema,\n\t}),\n)\n\nconst entitySchemaCheck: Typesafe.Equals<Model.Entity, ReturnType<typeof entitySchema>> = true\n\nexport const modelSchema = Typesafe.object({\n\tentities: Typesafe.record(Typesafe.string, entitySchema),\n\tenums: Typesafe.record(Typesafe.string, Typesafe.array(Typesafe.string)),\n})\n"],"names":["Typesafe","Model","ParseError"],"mappings":"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"}
1
+ {"version":3,"file":"model.cjs","sources":["../../../../../packages/schema-utils/src/type-schema/model.ts"],"sourcesContent":["import * as Typesafe from '@contember/typesafe'\nimport { Model } from '@contember/schema'\nimport { ParseError } from '@contember/typesafe'\n\nconst orderBySchema = Typesafe.array(Typesafe.object({\n\tpath: Typesafe.array(Typesafe.string),\n\tdirection: Typesafe.enumeration<Model.OrderDirection>(\n\t\tModel.OrderDirection.asc,\n\t\tModel.OrderDirection.desc,\n\t\tModel.OrderDirection.ascNullsFirst,\n\t\tModel.OrderDirection.descNullsLast,\n\t),\n}))\nconst joiningColumnSchema = Typesafe.object({\n\tcolumnName: Typesafe.string,\n\tonDelete: Typesafe.enumeration<Model.OnDelete>(Model.OnDelete.cascade, Model.OnDelete.restrict, Model.OnDelete.setNull),\n})\nconst oneHasManyRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.OneHasMany),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\townedBy: Typesafe.string,\n\t}),\n\tTypesafe.partial({\n\t\torderBy: orderBySchema,\n\t}),\n)\nconst oneHasManyRelationSchemaCheck: Typesafe.Equals<Model.OneHasManyRelation, ReturnType<typeof oneHasManyRelationSchema>> = true\n\nconst manyHasOneRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.ManyHasOne),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\tjoiningColumn: joiningColumnSchema,\n\t\tnullable: Typesafe.boolean,\n\t}),\n\tTypesafe.partial({\n\t\tinversedBy: Typesafe.string,\n\t}),\n)\n\nconst manyHasOneRelationSchemaCheck: Typesafe.Equals<Model.ManyHasOneRelation, ReturnType<typeof manyHasOneRelationSchema>> = true\n\nconst oneHasOneInverseRelationSchema = Typesafe.object({\n\ttype: Typesafe.literal(Model.RelationType.OneHasOne),\n\tname: Typesafe.string,\n\ttarget: Typesafe.string,\n\townedBy: Typesafe.string,\n\tnullable: Typesafe.boolean,\n})\nconst oneHasOneInverseRelationSchemaCheck: Typesafe.Equals<Model.OneHasOneInverseRelation, ReturnType<typeof oneHasOneInverseRelationSchema>> = true\n\nconst oneHasOneOwningRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.OneHasOne),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\tjoiningColumn: joiningColumnSchema,\n\t\tnullable: Typesafe.boolean,\n\t}),\n\tTypesafe.partial({\n\t\tinversedBy: Typesafe.string,\n\t\torphanRemoval: Typesafe.literal(true),\n\t}),\n)\n\nconst oneHasOneOwningRelationSchemaCheck: Typesafe.Equals<Model.OneHasOneOwningRelation, ReturnType<typeof oneHasOneOwningRelationSchema>> = true\n\nconst eventLogSchema = Typesafe.coalesce(\n\tTypesafe.object({\n\t\tenabled: Typesafe.boolean,\n\t}),\n\t{ enabled: true },\n) as Typesafe.Type<{ readonly enabled: boolean }>\n\nconst manyHasManyOwningRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.ManyHasMany),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\tjoiningTable: Typesafe.object({\n\t\t\ttableName: Typesafe.string,\n\t\t\tjoiningColumn: joiningColumnSchema,\n\t\t\tinverseJoiningColumn: joiningColumnSchema,\n\t\t\teventLog: eventLogSchema,\n\t\t}),\n\t}),\n\tTypesafe.partial({\n\t\tinversedBy: Typesafe.string,\n\t\torderBy: orderBySchema,\n\t}),\n)\nconst manyHasManyOwningRelationSchemaCheck: Typesafe.Equals<Model.ManyHasManyOwningRelation, ReturnType<typeof manyHasManyOwningRelationSchema>> =\n\ttrue\n\nconst manyHasManyInverseRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.ManyHasMany),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\townedBy: Typesafe.string,\n\t}),\n\tTypesafe.partial({\n\t\torderBy: orderBySchema,\n\t}),\n)\nconst manyHasManyInverseRelationSchemaCheck: Typesafe.Equals<Model.ManyHasManyInverseRelation, ReturnType<typeof manyHasManyInverseRelationSchema>> =\n\ttrue\n\nconst intersectionSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\tprecedence: Typesafe.enumeration('ALWAYS', 'BY DEFAULT'),\n\t}),\n\tTypesafe.partial({\n\t\tstart: Typesafe.number,\n\t}),\n)\nconst intersectionSchemaCheck: Typesafe.Equals<Model.AnyColumn['sequence'], ReturnType<typeof intersectionSchema>> = true\n\nconst columnSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\tname: Typesafe.string,\n\t\tcolumnName: Typesafe.string,\n\t\tcolumnType: Typesafe.transform(Typesafe.string, (it, raw, path) => {\n\t\t\tif (!it.replaceAll(/\\s+/g, '').match(/^[\\w_]+(?:\\(\\w+(?:,\\w+)*\\))?\\w*(?:\"[^\"]+\")?(\\[])*$/)) {\n\t\t\t\tthrow ParseError.format(it, path, 'valid column type')\n\t\t\t}\n\t\t\treturn it\n\t\t}),\n\t\tnullable: Typesafe.boolean,\n\t\ttype: Typesafe.enumeration<Model.ColumnType>(...Object.values(Model.ColumnType)),\n\t}),\n\tTypesafe.partial({\n\t\ttypeAlias: Typesafe.string,\n\t\tlist: Typesafe.boolean,\n\t\tdefault: Typesafe.anyJson,\n\t\tsequence: intersectionSchema as Typesafe.Type<Model.AnyColumn['sequence']>,\n\t\tcollation: Typesafe.string as Typesafe.Type<Model.AnyColumn['collation']>,\n\t\tschema: Typesafe.anyJson,\n\t}),\n)\nconst columnSchemaCheck: Typesafe.Equals<Model.AnyColumn, ReturnType<typeof columnSchema>> = true\n\nconst fieldSchema: Typesafe.Type<Model.AnyField> = Typesafe.partiallyDiscriminatedUnion(\n\t'type',\n\toneHasOneInverseRelationSchema,\n\toneHasOneOwningRelationSchema,\n\toneHasManyRelationSchema,\n\tmanyHasOneRelationSchema,\n\tmanyHasManyInverseRelationSchema,\n\tmanyHasManyOwningRelationSchema,\n\tcolumnSchema,\n)\n\nconst viewSchemaInner = Typesafe.intersection(\n\tTypesafe.object({\n\t\tsql: Typesafe.string,\n\t}),\n\tTypesafe.partial({\n\t\tdependencies: Typesafe.array(Typesafe.string),\n\t\tidSource: Typesafe.array(Typesafe.string),\n\t\tmaterialized: Typesafe.boolean,\n\t}),\n)\nconst viewSchemaCheck: Typesafe.Equals<Model.View, ReturnType<typeof viewSchemaInner>> = true\nconst viewSchema: Typesafe.Type<Model.View> = viewSchemaInner\n\nconst indexSchemaBase = Typesafe.intersection(\n\tTypesafe.object({\n\t\tfields: Typesafe.array(Typesafe.string),\n\t}),\n\tTypesafe.partial({\n\t\tname: Typesafe.string,\n\t\tmethod: Typesafe.enumeration('btree', 'gin', 'gist', 'hash', 'brin', 'spgist'),\n\t\topClass: Typesafe.string,\n\t\twhere: Typesafe.string,\n\t\tinclude: Typesafe.array(Typesafe.string),\n\t\tcolumnOptions: Typesafe.record(\n\t\t\tTypesafe.string,\n\t\t\tTypesafe.partial({\n\t\t\t\torder: Typesafe.enumeration('asc', 'desc'),\n\t\t\t\tnulls: Typesafe.enumeration('first', 'last'),\n\t\t\t\topClass: Typesafe.string,\n\t\t\t}),\n\t\t),\n\t}),\n)\nconst indexCheck: Typesafe.Equals<Model.Index, ReturnType<typeof indexSchemaBase>> = true\n\nconst indexesSchema = Typesafe.coalesce<Model.Indexes, Model.Indexes>(\n\tTypesafe.preprocess(\n\t\tTypesafe.array(indexSchemaBase),\n\t\tit => it?.constructor === Object ? Object.values(it) : it,\n\t),\n\t[],\n)\n\nconst uniqueConstraint = Typesafe.intersection(\n\tTypesafe.object({\n\t\tfields: Typesafe.array(Typesafe.string),\n\t}),\n\tTypesafe.partial({\n\t\ttiming: Typesafe.enumeration('deferrable', 'deferred'),\n\t\tname: Typesafe.string,\n\t\tindex: Typesafe.literal(false),\n\t}),\n)\nconst uniqueIndex = Typesafe.intersection(\n\tTypesafe.object({\n\t\tfields: Typesafe.array(Typesafe.string),\n\t\tindex: Typesafe.literal(true),\n\t}),\n\tTypesafe.partial({\n\t\tnulls: Typesafe.enumeration('distinct', 'not distinct'),\n\t\tmethod: Typesafe.enumeration('btree', 'gin', 'gist', 'hash', 'brin', 'spgist'),\n\t}),\n)\nconst uniqueConstraintCheck: Typesafe.Equals<Model.UniqueConstraint, ReturnType<typeof uniqueConstraint>> = true\nconst uniqueIndexCheck: Typesafe.Equals<Model.UniqueIndex, ReturnType<typeof uniqueIndex>> = true\n\nconst entitySchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\tname: Typesafe.string,\n\t\tprimary: Typesafe.string,\n\t\tprimaryColumn: Typesafe.string,\n\t\ttableName: Typesafe.string,\n\t\tfields: Typesafe.record(Typesafe.string, fieldSchema),\n\t\tunique: Typesafe.preprocess<Model.Uniques>(\n\t\t\tTypesafe.array(Typesafe.union(uniqueConstraint, uniqueIndex)),\n\t\t\tit => it?.constructor === Object ? Object.values(it) : it,\n\t\t),\n\t\tindexes: indexesSchema,\n\t\teventLog: eventLogSchema,\n\t}),\n\tTypesafe.partial({\n\t\tview: viewSchema,\n\t\torderBy: orderBySchema,\n\t}),\n)\n\nconst entitySchemaCheck: Typesafe.Equals<Model.Entity, ReturnType<typeof entitySchema>> = true\n\nexport const modelSchema = Typesafe.object({\n\tentities: Typesafe.record(Typesafe.string, entitySchema),\n\tenums: Typesafe.record(Typesafe.string, Typesafe.array(Typesafe.string)),\n})\n"],"names":["Typesafe","Model","ParseError"],"mappings":"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"}
@@ -117,7 +117,8 @@ const columnSchema = Typesafe.intersection(
117
117
  list: Typesafe.boolean,
118
118
  default: Typesafe.anyJson,
119
119
  sequence: intersectionSchema,
120
- collation: Typesafe.string
120
+ collation: Typesafe.string,
121
+ schema: Typesafe.anyJson
121
122
  })
122
123
  );
123
124
  const fieldSchema = Typesafe.partiallyDiscriminatedUnion(
@@ -147,7 +148,18 @@ const indexSchemaBase = Typesafe.intersection(
147
148
  }),
148
149
  Typesafe.partial({
149
150
  name: Typesafe.string,
150
- method: Typesafe.enumeration("btree", "gin", "gist", "hash", "brin", "spgist")
151
+ method: Typesafe.enumeration("btree", "gin", "gist", "hash", "brin", "spgist"),
152
+ opClass: Typesafe.string,
153
+ where: Typesafe.string,
154
+ include: Typesafe.array(Typesafe.string),
155
+ columnOptions: Typesafe.record(
156
+ Typesafe.string,
157
+ Typesafe.partial({
158
+ order: Typesafe.enumeration("asc", "desc"),
159
+ nulls: Typesafe.enumeration("first", "last"),
160
+ opClass: Typesafe.string
161
+ })
162
+ )
151
163
  })
152
164
  );
153
165
  const indexesSchema = Typesafe.coalesce(
@@ -1 +1 @@
1
- {"version":3,"file":"model.js","sources":["../../../../../packages/schema-utils/src/type-schema/model.ts"],"sourcesContent":["import * as Typesafe from '@contember/typesafe'\nimport { Model } from '@contember/schema'\nimport { ParseError } from '@contember/typesafe'\n\nconst orderBySchema = Typesafe.array(Typesafe.object({\n\tpath: Typesafe.array(Typesafe.string),\n\tdirection: Typesafe.enumeration<Model.OrderDirection>(\n\t\tModel.OrderDirection.asc,\n\t\tModel.OrderDirection.desc,\n\t\tModel.OrderDirection.ascNullsFirst,\n\t\tModel.OrderDirection.descNullsLast,\n\t),\n}))\nconst joiningColumnSchema = Typesafe.object({\n\tcolumnName: Typesafe.string,\n\tonDelete: Typesafe.enumeration<Model.OnDelete>(Model.OnDelete.cascade, Model.OnDelete.restrict, Model.OnDelete.setNull),\n})\nconst oneHasManyRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.OneHasMany),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\townedBy: Typesafe.string,\n\t}),\n\tTypesafe.partial({\n\t\torderBy: orderBySchema,\n\t}),\n)\nconst oneHasManyRelationSchemaCheck: Typesafe.Equals<Model.OneHasManyRelation, ReturnType<typeof oneHasManyRelationSchema>> = true\n\nconst manyHasOneRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.ManyHasOne),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\tjoiningColumn: joiningColumnSchema,\n\t\tnullable: Typesafe.boolean,\n\t}),\n\tTypesafe.partial({\n\t\tinversedBy: Typesafe.string,\n\t}),\n)\n\nconst manyHasOneRelationSchemaCheck: Typesafe.Equals<Model.ManyHasOneRelation, ReturnType<typeof manyHasOneRelationSchema>> = true\n\nconst oneHasOneInverseRelationSchema = Typesafe.object({\n\ttype: Typesafe.literal(Model.RelationType.OneHasOne),\n\tname: Typesafe.string,\n\ttarget: Typesafe.string,\n\townedBy: Typesafe.string,\n\tnullable: Typesafe.boolean,\n})\nconst oneHasOneInverseRelationSchemaCheck: Typesafe.Equals<Model.OneHasOneInverseRelation, ReturnType<typeof oneHasOneInverseRelationSchema>> = true\n\nconst oneHasOneOwningRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.OneHasOne),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\tjoiningColumn: joiningColumnSchema,\n\t\tnullable: Typesafe.boolean,\n\t}),\n\tTypesafe.partial({\n\t\tinversedBy: Typesafe.string,\n\t\torphanRemoval: Typesafe.literal(true),\n\t}),\n)\n\nconst oneHasOneOwningRelationSchemaCheck: Typesafe.Equals<Model.OneHasOneOwningRelation, ReturnType<typeof oneHasOneOwningRelationSchema>> = true\n\nconst eventLogSchema = Typesafe.coalesce(\n\tTypesafe.object({\n\t\tenabled: Typesafe.boolean,\n\t}),\n\t{ enabled: true },\n) as Typesafe.Type<{ readonly enabled: boolean }>\n\nconst manyHasManyOwningRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.ManyHasMany),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\tjoiningTable: Typesafe.object({\n\t\t\ttableName: Typesafe.string,\n\t\t\tjoiningColumn: joiningColumnSchema,\n\t\t\tinverseJoiningColumn: joiningColumnSchema,\n\t\t\teventLog: eventLogSchema,\n\t\t}),\n\t}),\n\tTypesafe.partial({\n\t\tinversedBy: Typesafe.string,\n\t\torderBy: orderBySchema,\n\t}),\n)\nconst manyHasManyOwningRelationSchemaCheck: Typesafe.Equals<Model.ManyHasManyOwningRelation, ReturnType<typeof manyHasManyOwningRelationSchema>> =\n\ttrue\n\nconst manyHasManyInverseRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.ManyHasMany),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\townedBy: Typesafe.string,\n\t}),\n\tTypesafe.partial({\n\t\torderBy: orderBySchema,\n\t}),\n)\nconst manyHasManyInverseRelationSchemaCheck: Typesafe.Equals<Model.ManyHasManyInverseRelation, ReturnType<typeof manyHasManyInverseRelationSchema>> =\n\ttrue\n\nconst intersectionSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\tprecedence: Typesafe.enumeration('ALWAYS', 'BY DEFAULT'),\n\t}),\n\tTypesafe.partial({\n\t\tstart: Typesafe.number,\n\t}),\n)\nconst intersectionSchemaCheck: Typesafe.Equals<Model.AnyColumn['sequence'], ReturnType<typeof intersectionSchema>> = true\n\nconst columnSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\tname: Typesafe.string,\n\t\tcolumnName: Typesafe.string,\n\t\tcolumnType: Typesafe.transform(Typesafe.string, (it, raw, path) => {\n\t\t\tif (!it.replaceAll(/\\s+/g, '').match(/^[\\w_]+(?:\\(\\w+(?:,\\w+)*\\))?\\w*(?:\"[^\"]+\")?(\\[])*$/)) {\n\t\t\t\tthrow ParseError.format(it, path, 'valid column type')\n\t\t\t}\n\t\t\treturn it\n\t\t}),\n\t\tnullable: Typesafe.boolean,\n\t\ttype: Typesafe.enumeration<Model.ColumnType>(...Object.values(Model.ColumnType)),\n\t}),\n\tTypesafe.partial({\n\t\ttypeAlias: Typesafe.string,\n\t\tlist: Typesafe.boolean,\n\t\tdefault: Typesafe.anyJson,\n\t\tsequence: intersectionSchema as Typesafe.Type<Model.AnyColumn['sequence']>,\n\t\tcollation: Typesafe.string as Typesafe.Type<Model.AnyColumn['collation']>,\n\t}),\n)\nconst columnSchemaCheck: Typesafe.Equals<Model.AnyColumn, ReturnType<typeof columnSchema>> = true\n\nconst fieldSchema: Typesafe.Type<Model.AnyField> = Typesafe.partiallyDiscriminatedUnion(\n\t'type',\n\toneHasOneInverseRelationSchema,\n\toneHasOneOwningRelationSchema,\n\toneHasManyRelationSchema,\n\tmanyHasOneRelationSchema,\n\tmanyHasManyInverseRelationSchema,\n\tmanyHasManyOwningRelationSchema,\n\tcolumnSchema,\n)\n\nconst viewSchemaInner = Typesafe.intersection(\n\tTypesafe.object({\n\t\tsql: Typesafe.string,\n\t}),\n\tTypesafe.partial({\n\t\tdependencies: Typesafe.array(Typesafe.string),\n\t\tidSource: Typesafe.array(Typesafe.string),\n\t\tmaterialized: Typesafe.boolean,\n\t}),\n)\nconst viewSchemaCheck: Typesafe.Equals<Model.View, ReturnType<typeof viewSchemaInner>> = true\nconst viewSchema: Typesafe.Type<Model.View> = viewSchemaInner\n\nconst indexSchemaBase = Typesafe.intersection(\n\tTypesafe.object({\n\t\tfields: Typesafe.array(Typesafe.string),\n\t}),\n\tTypesafe.partial({\n\t\tname: Typesafe.string,\n\t\tmethod: Typesafe.enumeration('btree', 'gin', 'gist', 'hash', 'brin', 'spgist'),\n\t}),\n)\nconst indexCheck: Typesafe.Equals<Model.Index, ReturnType<typeof indexSchemaBase>> = true\n\nconst indexesSchema = Typesafe.coalesce<Model.Indexes, Model.Indexes>(\n\tTypesafe.preprocess(\n\t\tTypesafe.array(indexSchemaBase),\n\t\tit => it?.constructor === Object ? Object.values(it) : it,\n\t),\n\t[],\n)\n\nconst uniqueConstraint = Typesafe.intersection(\n\tTypesafe.object({\n\t\tfields: Typesafe.array(Typesafe.string),\n\t}),\n\tTypesafe.partial({\n\t\ttiming: Typesafe.enumeration('deferrable', 'deferred'),\n\t\tname: Typesafe.string,\n\t\tindex: Typesafe.literal(false),\n\t}),\n)\nconst uniqueIndex = Typesafe.intersection(\n\tTypesafe.object({\n\t\tfields: Typesafe.array(Typesafe.string),\n\t\tindex: Typesafe.literal(true),\n\t}),\n\tTypesafe.partial({\n\t\tnulls: Typesafe.enumeration('distinct', 'not distinct'),\n\t\tmethod: Typesafe.enumeration('btree', 'gin', 'gist', 'hash', 'brin', 'spgist'),\n\t}),\n)\nconst uniqueConstraintCheck: Typesafe.Equals<Model.UniqueConstraint, ReturnType<typeof uniqueConstraint>> = true\nconst uniqueIndexCheck: Typesafe.Equals<Model.UniqueIndex, ReturnType<typeof uniqueIndex>> = true\n\nconst entitySchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\tname: Typesafe.string,\n\t\tprimary: Typesafe.string,\n\t\tprimaryColumn: Typesafe.string,\n\t\ttableName: Typesafe.string,\n\t\tfields: Typesafe.record(Typesafe.string, fieldSchema),\n\t\tunique: Typesafe.preprocess<Model.Uniques>(\n\t\t\tTypesafe.array(Typesafe.union(uniqueConstraint, uniqueIndex)),\n\t\t\tit => it?.constructor === Object ? Object.values(it) : it,\n\t\t),\n\t\tindexes: indexesSchema,\n\t\teventLog: eventLogSchema,\n\t}),\n\tTypesafe.partial({\n\t\tview: viewSchema,\n\t\torderBy: orderBySchema,\n\t}),\n)\n\nconst entitySchemaCheck: Typesafe.Equals<Model.Entity, ReturnType<typeof entitySchema>> = true\n\nexport const modelSchema = Typesafe.object({\n\tentities: Typesafe.record(Typesafe.string, entitySchema),\n\tenums: Typesafe.record(Typesafe.string, Typesafe.array(Typesafe.string)),\n})\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model.js","sources":["../../../../../packages/schema-utils/src/type-schema/model.ts"],"sourcesContent":["import * as Typesafe from '@contember/typesafe'\nimport { Model } from '@contember/schema'\nimport { ParseError } from '@contember/typesafe'\n\nconst orderBySchema = Typesafe.array(Typesafe.object({\n\tpath: Typesafe.array(Typesafe.string),\n\tdirection: Typesafe.enumeration<Model.OrderDirection>(\n\t\tModel.OrderDirection.asc,\n\t\tModel.OrderDirection.desc,\n\t\tModel.OrderDirection.ascNullsFirst,\n\t\tModel.OrderDirection.descNullsLast,\n\t),\n}))\nconst joiningColumnSchema = Typesafe.object({\n\tcolumnName: Typesafe.string,\n\tonDelete: Typesafe.enumeration<Model.OnDelete>(Model.OnDelete.cascade, Model.OnDelete.restrict, Model.OnDelete.setNull),\n})\nconst oneHasManyRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.OneHasMany),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\townedBy: Typesafe.string,\n\t}),\n\tTypesafe.partial({\n\t\torderBy: orderBySchema,\n\t}),\n)\nconst oneHasManyRelationSchemaCheck: Typesafe.Equals<Model.OneHasManyRelation, ReturnType<typeof oneHasManyRelationSchema>> = true\n\nconst manyHasOneRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.ManyHasOne),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\tjoiningColumn: joiningColumnSchema,\n\t\tnullable: Typesafe.boolean,\n\t}),\n\tTypesafe.partial({\n\t\tinversedBy: Typesafe.string,\n\t}),\n)\n\nconst manyHasOneRelationSchemaCheck: Typesafe.Equals<Model.ManyHasOneRelation, ReturnType<typeof manyHasOneRelationSchema>> = true\n\nconst oneHasOneInverseRelationSchema = Typesafe.object({\n\ttype: Typesafe.literal(Model.RelationType.OneHasOne),\n\tname: Typesafe.string,\n\ttarget: Typesafe.string,\n\townedBy: Typesafe.string,\n\tnullable: Typesafe.boolean,\n})\nconst oneHasOneInverseRelationSchemaCheck: Typesafe.Equals<Model.OneHasOneInverseRelation, ReturnType<typeof oneHasOneInverseRelationSchema>> = true\n\nconst oneHasOneOwningRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.OneHasOne),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\tjoiningColumn: joiningColumnSchema,\n\t\tnullable: Typesafe.boolean,\n\t}),\n\tTypesafe.partial({\n\t\tinversedBy: Typesafe.string,\n\t\torphanRemoval: Typesafe.literal(true),\n\t}),\n)\n\nconst oneHasOneOwningRelationSchemaCheck: Typesafe.Equals<Model.OneHasOneOwningRelation, ReturnType<typeof oneHasOneOwningRelationSchema>> = true\n\nconst eventLogSchema = Typesafe.coalesce(\n\tTypesafe.object({\n\t\tenabled: Typesafe.boolean,\n\t}),\n\t{ enabled: true },\n) as Typesafe.Type<{ readonly enabled: boolean }>\n\nconst manyHasManyOwningRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.ManyHasMany),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\tjoiningTable: Typesafe.object({\n\t\t\ttableName: Typesafe.string,\n\t\t\tjoiningColumn: joiningColumnSchema,\n\t\t\tinverseJoiningColumn: joiningColumnSchema,\n\t\t\teventLog: eventLogSchema,\n\t\t}),\n\t}),\n\tTypesafe.partial({\n\t\tinversedBy: Typesafe.string,\n\t\torderBy: orderBySchema,\n\t}),\n)\nconst manyHasManyOwningRelationSchemaCheck: Typesafe.Equals<Model.ManyHasManyOwningRelation, ReturnType<typeof manyHasManyOwningRelationSchema>> =\n\ttrue\n\nconst manyHasManyInverseRelationSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\ttype: Typesafe.literal(Model.RelationType.ManyHasMany),\n\t\tname: Typesafe.string,\n\t\ttarget: Typesafe.string,\n\t\townedBy: Typesafe.string,\n\t}),\n\tTypesafe.partial({\n\t\torderBy: orderBySchema,\n\t}),\n)\nconst manyHasManyInverseRelationSchemaCheck: Typesafe.Equals<Model.ManyHasManyInverseRelation, ReturnType<typeof manyHasManyInverseRelationSchema>> =\n\ttrue\n\nconst intersectionSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\tprecedence: Typesafe.enumeration('ALWAYS', 'BY DEFAULT'),\n\t}),\n\tTypesafe.partial({\n\t\tstart: Typesafe.number,\n\t}),\n)\nconst intersectionSchemaCheck: Typesafe.Equals<Model.AnyColumn['sequence'], ReturnType<typeof intersectionSchema>> = true\n\nconst columnSchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\tname: Typesafe.string,\n\t\tcolumnName: Typesafe.string,\n\t\tcolumnType: Typesafe.transform(Typesafe.string, (it, raw, path) => {\n\t\t\tif (!it.replaceAll(/\\s+/g, '').match(/^[\\w_]+(?:\\(\\w+(?:,\\w+)*\\))?\\w*(?:\"[^\"]+\")?(\\[])*$/)) {\n\t\t\t\tthrow ParseError.format(it, path, 'valid column type')\n\t\t\t}\n\t\t\treturn it\n\t\t}),\n\t\tnullable: Typesafe.boolean,\n\t\ttype: Typesafe.enumeration<Model.ColumnType>(...Object.values(Model.ColumnType)),\n\t}),\n\tTypesafe.partial({\n\t\ttypeAlias: Typesafe.string,\n\t\tlist: Typesafe.boolean,\n\t\tdefault: Typesafe.anyJson,\n\t\tsequence: intersectionSchema as Typesafe.Type<Model.AnyColumn['sequence']>,\n\t\tcollation: Typesafe.string as Typesafe.Type<Model.AnyColumn['collation']>,\n\t\tschema: Typesafe.anyJson,\n\t}),\n)\nconst columnSchemaCheck: Typesafe.Equals<Model.AnyColumn, ReturnType<typeof columnSchema>> = true\n\nconst fieldSchema: Typesafe.Type<Model.AnyField> = Typesafe.partiallyDiscriminatedUnion(\n\t'type',\n\toneHasOneInverseRelationSchema,\n\toneHasOneOwningRelationSchema,\n\toneHasManyRelationSchema,\n\tmanyHasOneRelationSchema,\n\tmanyHasManyInverseRelationSchema,\n\tmanyHasManyOwningRelationSchema,\n\tcolumnSchema,\n)\n\nconst viewSchemaInner = Typesafe.intersection(\n\tTypesafe.object({\n\t\tsql: Typesafe.string,\n\t}),\n\tTypesafe.partial({\n\t\tdependencies: Typesafe.array(Typesafe.string),\n\t\tidSource: Typesafe.array(Typesafe.string),\n\t\tmaterialized: Typesafe.boolean,\n\t}),\n)\nconst viewSchemaCheck: Typesafe.Equals<Model.View, ReturnType<typeof viewSchemaInner>> = true\nconst viewSchema: Typesafe.Type<Model.View> = viewSchemaInner\n\nconst indexSchemaBase = Typesafe.intersection(\n\tTypesafe.object({\n\t\tfields: Typesafe.array(Typesafe.string),\n\t}),\n\tTypesafe.partial({\n\t\tname: Typesafe.string,\n\t\tmethod: Typesafe.enumeration('btree', 'gin', 'gist', 'hash', 'brin', 'spgist'),\n\t\topClass: Typesafe.string,\n\t\twhere: Typesafe.string,\n\t\tinclude: Typesafe.array(Typesafe.string),\n\t\tcolumnOptions: Typesafe.record(\n\t\t\tTypesafe.string,\n\t\t\tTypesafe.partial({\n\t\t\t\torder: Typesafe.enumeration('asc', 'desc'),\n\t\t\t\tnulls: Typesafe.enumeration('first', 'last'),\n\t\t\t\topClass: Typesafe.string,\n\t\t\t}),\n\t\t),\n\t}),\n)\nconst indexCheck: Typesafe.Equals<Model.Index, ReturnType<typeof indexSchemaBase>> = true\n\nconst indexesSchema = Typesafe.coalesce<Model.Indexes, Model.Indexes>(\n\tTypesafe.preprocess(\n\t\tTypesafe.array(indexSchemaBase),\n\t\tit => it?.constructor === Object ? Object.values(it) : it,\n\t),\n\t[],\n)\n\nconst uniqueConstraint = Typesafe.intersection(\n\tTypesafe.object({\n\t\tfields: Typesafe.array(Typesafe.string),\n\t}),\n\tTypesafe.partial({\n\t\ttiming: Typesafe.enumeration('deferrable', 'deferred'),\n\t\tname: Typesafe.string,\n\t\tindex: Typesafe.literal(false),\n\t}),\n)\nconst uniqueIndex = Typesafe.intersection(\n\tTypesafe.object({\n\t\tfields: Typesafe.array(Typesafe.string),\n\t\tindex: Typesafe.literal(true),\n\t}),\n\tTypesafe.partial({\n\t\tnulls: Typesafe.enumeration('distinct', 'not distinct'),\n\t\tmethod: Typesafe.enumeration('btree', 'gin', 'gist', 'hash', 'brin', 'spgist'),\n\t}),\n)\nconst uniqueConstraintCheck: Typesafe.Equals<Model.UniqueConstraint, ReturnType<typeof uniqueConstraint>> = true\nconst uniqueIndexCheck: Typesafe.Equals<Model.UniqueIndex, ReturnType<typeof uniqueIndex>> = true\n\nconst entitySchema = Typesafe.intersection(\n\tTypesafe.object({\n\t\tname: Typesafe.string,\n\t\tprimary: Typesafe.string,\n\t\tprimaryColumn: Typesafe.string,\n\t\ttableName: Typesafe.string,\n\t\tfields: Typesafe.record(Typesafe.string, fieldSchema),\n\t\tunique: Typesafe.preprocess<Model.Uniques>(\n\t\t\tTypesafe.array(Typesafe.union(uniqueConstraint, uniqueIndex)),\n\t\t\tit => it?.constructor === Object ? Object.values(it) : it,\n\t\t),\n\t\tindexes: indexesSchema,\n\t\teventLog: eventLogSchema,\n\t}),\n\tTypesafe.partial({\n\t\tview: viewSchema,\n\t\torderBy: orderBySchema,\n\t}),\n)\n\nconst entitySchemaCheck: Typesafe.Equals<Model.Entity, ReturnType<typeof entitySchema>> = true\n\nexport const modelSchema = Typesafe.object({\n\tentities: Typesafe.record(Typesafe.string, entitySchema),\n\tenums: Typesafe.record(Typesafe.string, Typesafe.array(Typesafe.string)),\n})\n"],"names":[],"mappings":"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"}
@@ -26,6 +26,7 @@ const settingsSchema = Typesafe__namespace.partial({
26
26
  content: Typesafe__namespace.partial({
27
27
  useExistsInHasManyFilter: Typesafe__namespace.boolean,
28
28
  fullDateTimeResponse: Typesafe__namespace.boolean,
29
+ dateTimeResponseFormat: Typesafe__namespace.union(Typesafe__namespace.literal("legacy"), Typesafe__namespace.literal("iso8601")),
29
30
  shortDateResponse: Typesafe__namespace.boolean,
30
31
  uuidVersion: Typesafe__namespace.union(Typesafe__namespace.literal(4), Typesafe__namespace.literal(7))
31
32
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"settings.cjs","sources":["../../../../../packages/schema-utils/src/type-schema/settings.ts"],"sourcesContent":["import * as Typesafe from '@contember/typesafe'\nimport { Settings } from '@contember/schema'\n\nexport const settingsSchema = Typesafe.partial({\n\tuseExistsInHasManyFilter: Typesafe.boolean,\n\n\ttenant: Typesafe.partial({\n\t\tinviteExpirationMinutes: Typesafe.integer,\n\t}),\n\tcontent: Typesafe.partial({\n\t\tuseExistsInHasManyFilter: Typesafe.boolean,\n\t\tfullDateTimeResponse: Typesafe.boolean,\n\t\tshortDateResponse: Typesafe.boolean,\n\t\tuuidVersion: Typesafe.union(Typesafe.literal(4), Typesafe.literal(7)),\n\t}),\n\tactions: Typesafe.partial({\n\t\treturnTriggeredActions: Typesafe.boolean,\n\t}),\n})\n\nconst settingSchemaCheck: Typesafe.Equals<Settings.Schema, ReturnType<typeof settingsSchema>> = true\n"],"names":["Typesafe"],"mappings":";;;;;;;;;;;;;;;;;;;;AAGO,MAAM,iBAAiBA,oBAAS,QAAQ;AAAA,EAC9C,0BAA0BA,oBAAS;AAAA,EAEnC,QAAQA,oBAAS,QAAQ;AAAA,IACxB,yBAAyBA,oBAAS;AAAA,EAAA,CAClC;AAAA,EACD,SAASA,oBAAS,QAAQ;AAAA,IACzB,0BAA0BA,oBAAS;AAAA,IACnC,sBAAsBA,oBAAS;AAAA,IAC/B,mBAAmBA,oBAAS;AAAA,IAC5B,aAAaA,oBAAS,MAAMA,oBAAS,QAAQ,CAAC,GAAGA,oBAAS,QAAQ,CAAC,CAAC;AAAA,EAAA,CACpE;AAAA,EACD,SAASA,oBAAS,QAAQ;AAAA,IACzB,wBAAwBA,oBAAS;AAAA,EAAA,CACjC;AACF,CAAC;;"}
1
+ {"version":3,"file":"settings.cjs","sources":["../../../../../packages/schema-utils/src/type-schema/settings.ts"],"sourcesContent":["import * as Typesafe from '@contember/typesafe'\nimport { Settings } from '@contember/schema'\n\nexport const settingsSchema = Typesafe.partial({\n\tuseExistsInHasManyFilter: Typesafe.boolean,\n\n\ttenant: Typesafe.partial({\n\t\tinviteExpirationMinutes: Typesafe.integer,\n\t}),\n\tcontent: Typesafe.partial({\n\t\tuseExistsInHasManyFilter: Typesafe.boolean,\n\t\tfullDateTimeResponse: Typesafe.boolean,\n\t\tdateTimeResponseFormat: Typesafe.union(Typesafe.literal('legacy'), Typesafe.literal('iso8601')),\n\t\tshortDateResponse: Typesafe.boolean,\n\t\tuuidVersion: Typesafe.union(Typesafe.literal(4), Typesafe.literal(7)),\n\t}),\n\tactions: Typesafe.partial({\n\t\treturnTriggeredActions: Typesafe.boolean,\n\t}),\n})\n\nconst settingSchemaCheck: Typesafe.Equals<Settings.Schema, ReturnType<typeof settingsSchema>> = true\n"],"names":["Typesafe"],"mappings":";;;;;;;;;;;;;;;;;;;;AAGO,MAAM,iBAAiBA,oBAAS,QAAQ;AAAA,EAC9C,0BAA0BA,oBAAS;AAAA,EAEnC,QAAQA,oBAAS,QAAQ;AAAA,IACxB,yBAAyBA,oBAAS;AAAA,EAAA,CAClC;AAAA,EACD,SAASA,oBAAS,QAAQ;AAAA,IACzB,0BAA0BA,oBAAS;AAAA,IACnC,sBAAsBA,oBAAS;AAAA,IAC/B,wBAAwBA,oBAAS,MAAMA,oBAAS,QAAQ,QAAQ,GAAGA,oBAAS,QAAQ,SAAS,CAAC;AAAA,IAC9F,mBAAmBA,oBAAS;AAAA,IAC5B,aAAaA,oBAAS,MAAMA,oBAAS,QAAQ,CAAC,GAAGA,oBAAS,QAAQ,CAAC,CAAC;AAAA,EAAA,CACpE;AAAA,EACD,SAASA,oBAAS,QAAQ;AAAA,IACzB,wBAAwBA,oBAAS;AAAA,EAAA,CACjC;AACF,CAAC;;"}
@@ -7,6 +7,7 @@ const settingsSchema = Typesafe.partial({
7
7
  content: Typesafe.partial({
8
8
  useExistsInHasManyFilter: Typesafe.boolean,
9
9
  fullDateTimeResponse: Typesafe.boolean,
10
+ dateTimeResponseFormat: Typesafe.union(Typesafe.literal("legacy"), Typesafe.literal("iso8601")),
10
11
  shortDateResponse: Typesafe.boolean,
11
12
  uuidVersion: Typesafe.union(Typesafe.literal(4), Typesafe.literal(7))
12
13
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"settings.js","sources":["../../../../../packages/schema-utils/src/type-schema/settings.ts"],"sourcesContent":["import * as Typesafe from '@contember/typesafe'\nimport { Settings } from '@contember/schema'\n\nexport const settingsSchema = Typesafe.partial({\n\tuseExistsInHasManyFilter: Typesafe.boolean,\n\n\ttenant: Typesafe.partial({\n\t\tinviteExpirationMinutes: Typesafe.integer,\n\t}),\n\tcontent: Typesafe.partial({\n\t\tuseExistsInHasManyFilter: Typesafe.boolean,\n\t\tfullDateTimeResponse: Typesafe.boolean,\n\t\tshortDateResponse: Typesafe.boolean,\n\t\tuuidVersion: Typesafe.union(Typesafe.literal(4), Typesafe.literal(7)),\n\t}),\n\tactions: Typesafe.partial({\n\t\treturnTriggeredActions: Typesafe.boolean,\n\t}),\n})\n\nconst settingSchemaCheck: Typesafe.Equals<Settings.Schema, ReturnType<typeof settingsSchema>> = true\n"],"names":[],"mappings":";AAGO,MAAM,iBAAiB,SAAS,QAAQ;AAAA,EAC9C,0BAA0B,SAAS;AAAA,EAEnC,QAAQ,SAAS,QAAQ;AAAA,IACxB,yBAAyB,SAAS;AAAA,EAAA,CAClC;AAAA,EACD,SAAS,SAAS,QAAQ;AAAA,IACzB,0BAA0B,SAAS;AAAA,IACnC,sBAAsB,SAAS;AAAA,IAC/B,mBAAmB,SAAS;AAAA,IAC5B,aAAa,SAAS,MAAM,SAAS,QAAQ,CAAC,GAAG,SAAS,QAAQ,CAAC,CAAC;AAAA,EAAA,CACpE;AAAA,EACD,SAAS,SAAS,QAAQ;AAAA,IACzB,wBAAwB,SAAS;AAAA,EAAA,CACjC;AACF,CAAC;"}
1
+ {"version":3,"file":"settings.js","sources":["../../../../../packages/schema-utils/src/type-schema/settings.ts"],"sourcesContent":["import * as Typesafe from '@contember/typesafe'\nimport { Settings } from '@contember/schema'\n\nexport const settingsSchema = Typesafe.partial({\n\tuseExistsInHasManyFilter: Typesafe.boolean,\n\n\ttenant: Typesafe.partial({\n\t\tinviteExpirationMinutes: Typesafe.integer,\n\t}),\n\tcontent: Typesafe.partial({\n\t\tuseExistsInHasManyFilter: Typesafe.boolean,\n\t\tfullDateTimeResponse: Typesafe.boolean,\n\t\tdateTimeResponseFormat: Typesafe.union(Typesafe.literal('legacy'), Typesafe.literal('iso8601')),\n\t\tshortDateResponse: Typesafe.boolean,\n\t\tuuidVersion: Typesafe.union(Typesafe.literal(4), Typesafe.literal(7)),\n\t}),\n\tactions: Typesafe.partial({\n\t\treturnTriggeredActions: Typesafe.boolean,\n\t}),\n})\n\nconst settingSchemaCheck: Typesafe.Equals<Settings.Schema, ReturnType<typeof settingsSchema>> = true\n"],"names":[],"mappings":";AAGO,MAAM,iBAAiB,SAAS,QAAQ;AAAA,EAC9C,0BAA0B,SAAS;AAAA,EAEnC,QAAQ,SAAS,QAAQ;AAAA,IACxB,yBAAyB,SAAS;AAAA,EAAA,CAClC;AAAA,EACD,SAAS,SAAS,QAAQ;AAAA,IACzB,0BAA0B,SAAS;AAAA,IACnC,sBAAsB,SAAS;AAAA,IAC/B,wBAAwB,SAAS,MAAM,SAAS,QAAQ,QAAQ,GAAG,SAAS,QAAQ,SAAS,CAAC;AAAA,IAC9F,mBAAmB,SAAS;AAAA,IAC5B,aAAa,SAAS,MAAM,SAAS,QAAQ,CAAC,GAAG,SAAS,QAAQ,CAAC,CAAC;AAAA,EAAA,CACpE;AAAA,EACD,SAAS,SAAS,QAAQ;AAAA,IACzB,wBAAwB,SAAS;AAAA,EAAA,CACjC;AACF,CAAC;"}
@@ -1 +1 @@
1
- {"version":3,"file":"where.cjs","sources":["../../../../../packages/schema-utils/src/type-schema/where.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { acceptFieldVisitor } from '../model'\nimport { conditionSchema } from './condition'\nimport * as Typesafe from '@contember/typesafe'\n\nexport const whereSchema = ({ schema, entity }: {\n\tschema: Model.Schema\n\tentity: Model.Entity\n}): Typesafe.Type<Input.Where> => {\n\treturn (input: unknown, path: PropertyKey[] = []): Input.Where => {\n\t\tconst whereSchemaInner = Typesafe.noExtraProps(Typesafe.partial({\n\t\t\tand: Typesafe.array(whereSchema({ schema, entity })),\n\t\t\tor: Typesafe.array(whereSchema({ schema, entity })),\n\t\t\tnot: whereSchema({ schema, entity }),\n\t\t\t...Object.fromEntries(\n\t\t\t\tObject.values(entity.fields).map((it): [string, Typesafe.Type<Input.Where[any]>] => {\n\t\t\t\t\treturn [\n\t\t\t\t\t\tit.name,\n\t\t\t\t\t\tacceptFieldVisitor(schema, entity, it.name, {\n\t\t\t\t\t\t\tvisitColumn: ({ column }) => conditionSchema(column.type),\n\t\t\t\t\t\t\tvisitRelation: ({ targetEntity }) => whereSchema({ schema, entity: targetEntity }),\n\t\t\t\t\t\t}),\n\t\t\t\t\t]\n\t\t\t\t}),\n\t\t\t),\n\t\t}))\n\n\t\treturn whereSchemaInner(input, path)\n\t}\n}\n"],"names":["Typesafe","acceptFieldVisitor","conditionSchema"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAKO,MAAM,cAAc,CAAC,EAAE,QAAQ,aAGJ;AACjC,SAAO,CAAC,OAAgB,OAAsB,OAAoB;AACjE,UAAM,mBAAmBA,oBAAS,aAAaA,oBAAS,QAAQ;AAAA,MAC/D,KAAKA,oBAAS,MAAM,YAAY,EAAE,QAAQ,OAAA,CAAQ,CAAC;AAAA,MACnD,IAAIA,oBAAS,MAAM,YAAY,EAAE,QAAQ,OAAA,CAAQ,CAAC;AAAA,MAClD,KAAK,YAAY,EAAE,QAAQ,QAAQ;AAAA,MACnC,GAAG,OAAO;AAAA,QACT,OAAO,OAAO,OAAO,MAAM,EAAE,IAAI,CAAC,OAAkD;AACnF,iBAAO;AAAA,YACN,GAAG;AAAA,YACHC,WAAAA,mBAAmB,QAAQ,QAAQ,GAAG,MAAM;AAAA,cAC3C,aAAa,CAAC,EAAE,aAAaC,UAAAA,gBAAgB,OAAO,IAAI;AAAA,cACxD,eAAe,CAAC,EAAE,aAAA,MAAmB,YAAY,EAAE,QAAQ,QAAQ,aAAA,CAAc;AAAA,YAAA,CACjF;AAAA,UAAA;AAAA,QAEH,CAAC;AAAA,MAAA;AAAA,IACF,CACA,CAAC;AAEF,WAAO,iBAAiB,OAAO,IAAI;AAAA,EACpC;AACD;;"}
1
+ {"version":3,"file":"where.cjs","sources":["../../../../../packages/schema-utils/src/type-schema/where.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { acceptFieldVisitor } from '../model/index.js'\nimport { conditionSchema } from './condition.js'\nimport * as Typesafe from '@contember/typesafe'\n\nexport const whereSchema = ({ schema, entity }: {\n\tschema: Model.Schema\n\tentity: Model.Entity\n}): Typesafe.Type<Input.Where> => {\n\treturn (input: unknown, path: PropertyKey[] = []): Input.Where => {\n\t\tconst whereSchemaInner = Typesafe.noExtraProps(Typesafe.partial({\n\t\t\tand: Typesafe.array(whereSchema({ schema, entity })),\n\t\t\tor: Typesafe.array(whereSchema({ schema, entity })),\n\t\t\tnot: whereSchema({ schema, entity }),\n\t\t\t...Object.fromEntries(\n\t\t\t\tObject.values(entity.fields).map((it): [string, Typesafe.Type<Input.Where[any]>] => {\n\t\t\t\t\treturn [\n\t\t\t\t\t\tit.name,\n\t\t\t\t\t\tacceptFieldVisitor(schema, entity, it.name, {\n\t\t\t\t\t\t\tvisitColumn: ({ column }) => conditionSchema(column.type),\n\t\t\t\t\t\t\tvisitRelation: ({ targetEntity }) => whereSchema({ schema, entity: targetEntity }),\n\t\t\t\t\t\t}),\n\t\t\t\t\t]\n\t\t\t\t}),\n\t\t\t),\n\t\t}))\n\n\t\treturn whereSchemaInner(input, path)\n\t}\n}\n"],"names":["Typesafe","acceptFieldVisitor","conditionSchema"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAKO,MAAM,cAAc,CAAC,EAAE,QAAQ,aAGJ;AACjC,SAAO,CAAC,OAAgB,OAAsB,OAAoB;AACjE,UAAM,mBAAmBA,oBAAS,aAAaA,oBAAS,QAAQ;AAAA,MAC/D,KAAKA,oBAAS,MAAM,YAAY,EAAE,QAAQ,OAAA,CAAQ,CAAC;AAAA,MACnD,IAAIA,oBAAS,MAAM,YAAY,EAAE,QAAQ,OAAA,CAAQ,CAAC;AAAA,MAClD,KAAK,YAAY,EAAE,QAAQ,QAAQ;AAAA,MACnC,GAAG,OAAO;AAAA,QACT,OAAO,OAAO,OAAO,MAAM,EAAE,IAAI,CAAC,OAAkD;AACnF,iBAAO;AAAA,YACN,GAAG;AAAA,YACHC,WAAAA,mBAAmB,QAAQ,QAAQ,GAAG,MAAM;AAAA,cAC3C,aAAa,CAAC,EAAE,aAAaC,UAAAA,gBAAgB,OAAO,IAAI;AAAA,cACxD,eAAe,CAAC,EAAE,aAAA,MAAmB,YAAY,EAAE,QAAQ,QAAQ,aAAA,CAAc;AAAA,YAAA,CACjF;AAAA,UAAA;AAAA,QAEH,CAAC;AAAA,MAAA;AAAA,IACF,CACA,CAAC;AAEF,WAAO,iBAAiB,OAAO,IAAI;AAAA,EACpC;AACD;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"where.js","sources":["../../../../../packages/schema-utils/src/type-schema/where.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { acceptFieldVisitor } from '../model'\nimport { conditionSchema } from './condition'\nimport * as Typesafe from '@contember/typesafe'\n\nexport const whereSchema = ({ schema, entity }: {\n\tschema: Model.Schema\n\tentity: Model.Entity\n}): Typesafe.Type<Input.Where> => {\n\treturn (input: unknown, path: PropertyKey[] = []): Input.Where => {\n\t\tconst whereSchemaInner = Typesafe.noExtraProps(Typesafe.partial({\n\t\t\tand: Typesafe.array(whereSchema({ schema, entity })),\n\t\t\tor: Typesafe.array(whereSchema({ schema, entity })),\n\t\t\tnot: whereSchema({ schema, entity }),\n\t\t\t...Object.fromEntries(\n\t\t\t\tObject.values(entity.fields).map((it): [string, Typesafe.Type<Input.Where[any]>] => {\n\t\t\t\t\treturn [\n\t\t\t\t\t\tit.name,\n\t\t\t\t\t\tacceptFieldVisitor(schema, entity, it.name, {\n\t\t\t\t\t\t\tvisitColumn: ({ column }) => conditionSchema(column.type),\n\t\t\t\t\t\t\tvisitRelation: ({ targetEntity }) => whereSchema({ schema, entity: targetEntity }),\n\t\t\t\t\t\t}),\n\t\t\t\t\t]\n\t\t\t\t}),\n\t\t\t),\n\t\t}))\n\n\t\treturn whereSchemaInner(input, path)\n\t}\n}\n"],"names":[],"mappings":";;;;AAKO,MAAM,cAAc,CAAC,EAAE,QAAQ,aAGJ;AACjC,SAAO,CAAC,OAAgB,OAAsB,OAAoB;AACjE,UAAM,mBAAmB,SAAS,aAAa,SAAS,QAAQ;AAAA,MAC/D,KAAK,SAAS,MAAM,YAAY,EAAE,QAAQ,OAAA,CAAQ,CAAC;AAAA,MACnD,IAAI,SAAS,MAAM,YAAY,EAAE,QAAQ,OAAA,CAAQ,CAAC;AAAA,MAClD,KAAK,YAAY,EAAE,QAAQ,QAAQ;AAAA,MACnC,GAAG,OAAO;AAAA,QACT,OAAO,OAAO,OAAO,MAAM,EAAE,IAAI,CAAC,OAAkD;AACnF,iBAAO;AAAA,YACN,GAAG;AAAA,YACH,mBAAmB,QAAQ,QAAQ,GAAG,MAAM;AAAA,cAC3C,aAAa,CAAC,EAAE,aAAa,gBAAgB,OAAO,IAAI;AAAA,cACxD,eAAe,CAAC,EAAE,aAAA,MAAmB,YAAY,EAAE,QAAQ,QAAQ,aAAA,CAAc;AAAA,YAAA,CACjF;AAAA,UAAA;AAAA,QAEH,CAAC;AAAA,MAAA;AAAA,IACF,CACA,CAAC;AAEF,WAAO,iBAAiB,OAAO,IAAI;AAAA,EACpC;AACD;"}
1
+ {"version":3,"file":"where.js","sources":["../../../../../packages/schema-utils/src/type-schema/where.ts"],"sourcesContent":["import { Input, Model } from '@contember/schema'\nimport { acceptFieldVisitor } from '../model/index.js'\nimport { conditionSchema } from './condition.js'\nimport * as Typesafe from '@contember/typesafe'\n\nexport const whereSchema = ({ schema, entity }: {\n\tschema: Model.Schema\n\tentity: Model.Entity\n}): Typesafe.Type<Input.Where> => {\n\treturn (input: unknown, path: PropertyKey[] = []): Input.Where => {\n\t\tconst whereSchemaInner = Typesafe.noExtraProps(Typesafe.partial({\n\t\t\tand: Typesafe.array(whereSchema({ schema, entity })),\n\t\t\tor: Typesafe.array(whereSchema({ schema, entity })),\n\t\t\tnot: whereSchema({ schema, entity }),\n\t\t\t...Object.fromEntries(\n\t\t\t\tObject.values(entity.fields).map((it): [string, Typesafe.Type<Input.Where[any]>] => {\n\t\t\t\t\treturn [\n\t\t\t\t\t\tit.name,\n\t\t\t\t\t\tacceptFieldVisitor(schema, entity, it.name, {\n\t\t\t\t\t\t\tvisitColumn: ({ column }) => conditionSchema(column.type),\n\t\t\t\t\t\t\tvisitRelation: ({ targetEntity }) => whereSchema({ schema, entity: targetEntity }),\n\t\t\t\t\t\t}),\n\t\t\t\t\t]\n\t\t\t\t}),\n\t\t\t),\n\t\t}))\n\n\t\treturn whereSchemaInner(input, path)\n\t}\n}\n"],"names":[],"mappings":";;;;AAKO,MAAM,cAAc,CAAC,EAAE,QAAQ,aAGJ;AACjC,SAAO,CAAC,OAAgB,OAAsB,OAAoB;AACjE,UAAM,mBAAmB,SAAS,aAAa,SAAS,QAAQ;AAAA,MAC/D,KAAK,SAAS,MAAM,YAAY,EAAE,QAAQ,OAAA,CAAQ,CAAC;AAAA,MACnD,IAAI,SAAS,MAAM,YAAY,EAAE,QAAQ,OAAA,CAAQ,CAAC;AAAA,MAClD,KAAK,YAAY,EAAE,QAAQ,QAAQ;AAAA,MACnC,GAAG,OAAO;AAAA,QACT,OAAO,OAAO,OAAO,MAAM,EAAE,IAAI,CAAC,OAAkD;AACnF,iBAAO;AAAA,YACN,GAAG;AAAA,YACH,mBAAmB,QAAQ,QAAQ,GAAG,MAAM;AAAA,cAC3C,aAAa,CAAC,EAAE,aAAa,gBAAgB,OAAO,IAAI;AAAA,cACxD,eAAe,CAAC,EAAE,aAAA,MAAmB,YAAY,EAAE,QAAQ,QAAQ,aAAA,CAAc;AAAA,YAAA,CACjF;AAAA,UAAA;AAAA,QAEH,CAAC;AAAA,MAAA;AAAA,IACF,CACA,CAAC;AAEF,WAAO,iBAAiB,OAAO,IAAI;AAAA,EACpC;AACD;"}
@@ -1 +1 @@
1
- {"version":3,"file":"AclValidator.cjs","sources":["../../../../../packages/schema-utils/src/validation/AclValidator.ts"],"sourcesContent":["import { Acl, Model } from '@contember/schema'\nimport { PredicateDefinitionProcessor } from '../acl'\nimport { getEntity } from '../model'\nimport { ErrorBuilder, ValidationError } from './errors'\nimport { conditionSchema } from '../type-schema'\n\nexport class AclValidator {\n\tconstructor(private readonly model: Model.Schema) {}\n\n\tpublic validate(schema: Acl.Schema): ValidationError[] {\n\t\tconst errorBuilder = new ErrorBuilder([], ['acl'])\n\t\tthis.validateRoles(schema.roles, errorBuilder)\n\t\treturn errorBuilder.errors\n\t}\n\n\tprivate validateRoles(roles: Acl.Roles, errorBuilder: ErrorBuilder): void {\n\t\tfor (const role in roles) {\n\t\t\tif (!roles.hasOwnProperty(role)) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tthis.validateRolePermissions(roles[role], Object.keys(roles), errorBuilder.for(role))\n\t\t}\n\t}\n\n\tprivate validateRolePermissions(\n\t\tpermissions: Acl.RolePermissions,\n\t\troles: string[],\n\t\terrorBuilder: ErrorBuilder,\n\t): void {\n\t\tthis.validateInherits(permissions.inherits, roles, errorBuilder.for('inherits'))\n\t\tthis.validateVariables(permissions.variables, errorBuilder.for('variables'))\n\t\tthis.validatePermissions(permissions.entities, (permissions.variables as Acl.Variables) || {}, errorBuilder.for('entities'))\n\t\t// todo: plugins validation\n\t}\n\n\tprivate validateInherits(inherits: Acl.RolePermissions['inherits'], roles: string[], errorBuilder: ErrorBuilder): void {\n\t\tif (inherits === undefined) {\n\t\t\treturn undefined\n\t\t}\n\t\tfor (const inheritsFrom of inherits) {\n\t\t\tif (!roles.includes(inheritsFrom)) {\n\t\t\t\terrorBuilder.for(inheritsFrom).add('ACL_UNDEFINED_ROLE', 'Referenced role not exists.')\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateVariables(variables: Acl.Variables, errorBuilder: ErrorBuilder): void {\n\t\tfor (const varName in variables) {\n\t\t\tif (!variables.hasOwnProperty(varName)) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tthis.validateVariable(variables[varName], errorBuilder.for(varName))\n\t\t}\n\t}\n\n\tprivate validateVariable(variable: Acl.Variable, errorBuilder: ErrorBuilder): void {\n\t\tswitch (variable.type) {\n\t\t\tcase 'entity':\n\t\t\t\tif (!this.model.entities[variable.entityName]) {\n\t\t\t\t\terrorBuilder.add('ACL_UNDEFINED_ENTITY', `Entity \"${variable.entityName}\" not found`)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t}\n\t\treturn\n\t}\n\n\tprivate validatePermissions(permissions: Acl.Permissions, variables: Acl.Variables, errorBuilder: ErrorBuilder): void {\n\t\tfor (const entityName in permissions) {\n\t\t\tif (!permissions.hasOwnProperty(entityName)) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (!this.model.entities[entityName]) {\n\t\t\t\terrorBuilder.add('ACL_UNDEFINED_ENTITY', `Entity ${entityName} not found`)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst entity = getEntity(this.model, entityName)\n\n\t\t\tthis.validateEntityPermissions(\n\t\t\t\tpermissions[entityName],\n\t\t\t\tentity,\n\t\t\t\tvariables,\n\t\t\t\terrorBuilder.for(entityName),\n\t\t\t)\n\t\t}\n\t}\n\n\tprivate validateEntityPermissions(\n\t\tentityPermissions: Acl.EntityPermissions,\n\t\tentity: Model.Entity,\n\t\tvariables: Acl.Variables,\n\t\terrorBuilder: ErrorBuilder,\n\t): void {\n\t\tthis.validatePredicates(\n\t\t\tentityPermissions.predicates,\n\t\t\tentity,\n\t\t\tvariables,\n\t\t\terrorBuilder.for('predicates'),\n\t\t)\n\t\tthis.validateOperations(\n\t\t\tentityPermissions.operations,\n\t\t\tentity,\n\t\t\tentityPermissions.predicates as Acl.PredicateMap,\n\t\t\terrorBuilder.for('operations'),\n\t\t)\n\t}\n\n\tprivate validatePredicates(predicates: Acl.PredicateMap, entity: Model.Entity, variables: Acl.Variables, errorBuilder: ErrorBuilder): void {\n\t\tfor (const predicateName in predicates) {\n\t\t\tif (!predicates.hasOwnProperty(predicateName)) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tthis.validatePredicateDefinition(\n\t\t\t\tpredicates[predicateName],\n\t\t\t\tentity,\n\t\t\t\tvariables,\n\t\t\t\terrorBuilder.for(predicateName),\n\t\t\t)\n\t\t}\n\t}\n\n\tprivate validatePredicateDefinition(\n\t\tpredicate: Acl.PredicateDefinition,\n\t\tentity: Model.Entity,\n\t\tvariables: Acl.Variables,\n\t\terrorBuilder: ErrorBuilder,\n\t): void {\n\t\tconst processor = new PredicateDefinitionProcessor(this.model)\n\t\tprocessor.process(entity, predicate, {\n\t\t\thandleColumn: ctx => {\n\t\t\t\tif (typeof ctx.value === 'string') {\n\t\t\t\t\tif (!variables[ctx.value]) {\n\t\t\t\t\t\terrorBuilder.for(...ctx.path).add('ACL_UNDEFINED_VARIABLE', `Undefined variable ${ctx.value}`)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconditionSchema(ctx.column.type)(ctx.value)\n\t\t\t\t\t} catch (e: any) {\n\t\t\t\t\t\terrorBuilder.for(...ctx.path).add('ACL_INVALID_CONDITION', `Invalid condition (${e.message}): ${JSON.stringify(ctx.value)}`)\n\t\t\t\t\t}\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 (typeof ctx.value === 'string' && !variables[ctx.value]) {\n\t\t\t\t\terrorBuilder.for(...ctx.path).add('ACL_UNDEFINED_VARIABLE', `Undefined variable ${ctx.value}`)\n\t\t\t\t}\n\t\t\t\treturn ctx.value\n\t\t\t},\n\t\t\thandleUndefinedField: ctx => {\n\t\t\t\terrorBuilder.for(...ctx.path).add('ACL_UNDEFINED_FIELD', `Undefined field ${ctx.name} on entity ${ctx.entity.name}`)\n\t\t\t\treturn ctx.value\n\t\t\t},\n\t\t})\n\t}\n\n\tprivate validateOperations(\n\t\toperations: Acl.EntityOperations,\n\t\tentity: Model.Entity,\n\t\tpredicates: Acl.PredicateDefinition,\n\t\terrorBuilder: ErrorBuilder,\n\t): void {\n\t\tif (operations.delete !== undefined) {\n\t\t\tthis.validatePredicate(operations.delete, predicates, errorBuilder.for('delete'))\n\t\t}\n\t\tfor (const op of ['read', 'create', 'update'] as const) {\n\t\t\tconst operation = operations[op]\n\t\t\tif (operation !== undefined) {\n\t\t\t\tthis.validateFieldPermissions(operation, entity, predicates, errorBuilder.for(op))\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateFieldPermissions(\n\t\tpermissions: Acl.FieldPermissions,\n\t\tentity: Model.Entity,\n\t\tpredicates: Acl.PredicateDefinition,\n\t\terrorBuilder: ErrorBuilder,\n\t): void {\n\t\tfor (const field in permissions) {\n\t\t\tif (!permissions.hasOwnProperty(field)) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (!entity.fields[field]) {\n\t\t\t\terrorBuilder.add('ACL_UNDEFINED_FIELD', `Field ${field} not found on entity ${entity.name}`)\n\t\t\t}\n\t\t\tthis.validatePredicate(permissions[field], predicates, errorBuilder.for(field))\n\t\t}\n\t}\n\n\tprivate validatePredicate(\n\t\tpredicate: Acl.Predicate,\n\t\tpredicates: Acl.PredicateDefinition,\n\t\terrorBuilder: ErrorBuilder,\n\t): void {\n\t\tif (predicate === false || predicate === true) {\n\t\t\treturn\n\t\t}\n\t\tif (!predicates[predicate]) {\n\t\t\terrorBuilder.add('ACL_UNDEFINED_PREDICATE', `Predicate ${predicate} not found`)\n\t\t}\n\t}\n}\n"],"names":["ErrorBuilder","getEntity","PredicateDefinitionProcessor","conditionSchema"],"mappings":"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"}
1
+ {"version":3,"file":"AclValidator.cjs","sources":["../../../../../packages/schema-utils/src/validation/AclValidator.ts"],"sourcesContent":["import { Acl, Model } from '@contember/schema'\nimport { PredicateDefinitionProcessor } from '../acl/index.js'\nimport { getEntity } from '../model/index.js'\nimport { ErrorBuilder, ValidationError } from './errors.js'\nimport { conditionSchema } from '../type-schema/index.js'\n\nexport class AclValidator {\n\tconstructor(private readonly model: Model.Schema) {}\n\n\tpublic validate(schema: Acl.Schema): ValidationError[] {\n\t\tconst errorBuilder = new ErrorBuilder([], ['acl'])\n\t\tthis.validateRoles(schema.roles, errorBuilder)\n\t\treturn errorBuilder.errors\n\t}\n\n\tprivate validateRoles(roles: Acl.Roles, errorBuilder: ErrorBuilder): void {\n\t\tfor (const role in roles) {\n\t\t\tif (!roles.hasOwnProperty(role)) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tthis.validateRolePermissions(roles[role], Object.keys(roles), errorBuilder.for(role))\n\t\t}\n\t}\n\n\tprivate validateRolePermissions(\n\t\tpermissions: Acl.RolePermissions,\n\t\troles: string[],\n\t\terrorBuilder: ErrorBuilder,\n\t): void {\n\t\tthis.validateInherits(permissions.inherits, roles, errorBuilder.for('inherits'))\n\t\tthis.validateVariables(permissions.variables, errorBuilder.for('variables'))\n\t\tthis.validatePermissions(permissions.entities, (permissions.variables as Acl.Variables) || {}, errorBuilder.for('entities'))\n\t\t// todo: plugins validation\n\t}\n\n\tprivate validateInherits(inherits: Acl.RolePermissions['inherits'], roles: string[], errorBuilder: ErrorBuilder): void {\n\t\tif (inherits === undefined) {\n\t\t\treturn undefined\n\t\t}\n\t\tfor (const inheritsFrom of inherits) {\n\t\t\tif (!roles.includes(inheritsFrom)) {\n\t\t\t\terrorBuilder.for(inheritsFrom).add('ACL_UNDEFINED_ROLE', 'Referenced role not exists.')\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateVariables(variables: Acl.Variables, errorBuilder: ErrorBuilder): void {\n\t\tfor (const varName in variables) {\n\t\t\tif (!variables.hasOwnProperty(varName)) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tthis.validateVariable(variables[varName], errorBuilder.for(varName))\n\t\t}\n\t}\n\n\tprivate validateVariable(variable: Acl.Variable, errorBuilder: ErrorBuilder): void {\n\t\tswitch (variable.type) {\n\t\t\tcase 'entity':\n\t\t\t\tif (!this.model.entities[variable.entityName]) {\n\t\t\t\t\terrorBuilder.add('ACL_UNDEFINED_ENTITY', `Entity \"${variable.entityName}\" not found`)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t}\n\t\treturn\n\t}\n\n\tprivate validatePermissions(permissions: Acl.Permissions, variables: Acl.Variables, errorBuilder: ErrorBuilder): void {\n\t\tfor (const entityName in permissions) {\n\t\t\tif (!permissions.hasOwnProperty(entityName)) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (!this.model.entities[entityName]) {\n\t\t\t\terrorBuilder.add('ACL_UNDEFINED_ENTITY', `Entity ${entityName} not found`)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst entity = getEntity(this.model, entityName)\n\n\t\t\tthis.validateEntityPermissions(\n\t\t\t\tpermissions[entityName],\n\t\t\t\tentity,\n\t\t\t\tvariables,\n\t\t\t\terrorBuilder.for(entityName),\n\t\t\t)\n\t\t}\n\t}\n\n\tprivate validateEntityPermissions(\n\t\tentityPermissions: Acl.EntityPermissions,\n\t\tentity: Model.Entity,\n\t\tvariables: Acl.Variables,\n\t\terrorBuilder: ErrorBuilder,\n\t): void {\n\t\tthis.validatePredicates(\n\t\t\tentityPermissions.predicates,\n\t\t\tentity,\n\t\t\tvariables,\n\t\t\terrorBuilder.for('predicates'),\n\t\t)\n\t\tthis.validateOperations(\n\t\t\tentityPermissions.operations,\n\t\t\tentity,\n\t\t\tentityPermissions.predicates as Acl.PredicateMap,\n\t\t\terrorBuilder.for('operations'),\n\t\t)\n\t}\n\n\tprivate validatePredicates(predicates: Acl.PredicateMap, entity: Model.Entity, variables: Acl.Variables, errorBuilder: ErrorBuilder): void {\n\t\tfor (const predicateName in predicates) {\n\t\t\tif (!predicates.hasOwnProperty(predicateName)) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tthis.validatePredicateDefinition(\n\t\t\t\tpredicates[predicateName],\n\t\t\t\tentity,\n\t\t\t\tvariables,\n\t\t\t\terrorBuilder.for(predicateName),\n\t\t\t)\n\t\t}\n\t}\n\n\tprivate validatePredicateDefinition(\n\t\tpredicate: Acl.PredicateDefinition,\n\t\tentity: Model.Entity,\n\t\tvariables: Acl.Variables,\n\t\terrorBuilder: ErrorBuilder,\n\t): void {\n\t\tconst processor = new PredicateDefinitionProcessor(this.model)\n\t\tprocessor.process(entity, predicate, {\n\t\t\thandleColumn: ctx => {\n\t\t\t\tif (typeof ctx.value === 'string') {\n\t\t\t\t\tif (!variables[ctx.value]) {\n\t\t\t\t\t\terrorBuilder.for(...ctx.path).add('ACL_UNDEFINED_VARIABLE', `Undefined variable ${ctx.value}`)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconditionSchema(ctx.column.type)(ctx.value)\n\t\t\t\t\t} catch (e: any) {\n\t\t\t\t\t\terrorBuilder.for(...ctx.path).add('ACL_INVALID_CONDITION', `Invalid condition (${e.message}): ${JSON.stringify(ctx.value)}`)\n\t\t\t\t\t}\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 (typeof ctx.value === 'string' && !variables[ctx.value]) {\n\t\t\t\t\terrorBuilder.for(...ctx.path).add('ACL_UNDEFINED_VARIABLE', `Undefined variable ${ctx.value}`)\n\t\t\t\t}\n\t\t\t\treturn ctx.value\n\t\t\t},\n\t\t\thandleUndefinedField: ctx => {\n\t\t\t\terrorBuilder.for(...ctx.path).add('ACL_UNDEFINED_FIELD', `Undefined field ${ctx.name} on entity ${ctx.entity.name}`)\n\t\t\t\treturn ctx.value\n\t\t\t},\n\t\t})\n\t}\n\n\tprivate validateOperations(\n\t\toperations: Acl.EntityOperations,\n\t\tentity: Model.Entity,\n\t\tpredicates: Acl.PredicateDefinition,\n\t\terrorBuilder: ErrorBuilder,\n\t): void {\n\t\tif (operations.delete !== undefined) {\n\t\t\tthis.validatePredicate(operations.delete, predicates, errorBuilder.for('delete'))\n\t\t}\n\t\tfor (const op of ['read', 'create', 'update'] as const) {\n\t\t\tconst operation = operations[op]\n\t\t\tif (operation !== undefined) {\n\t\t\t\tthis.validateFieldPermissions(operation, entity, predicates, errorBuilder.for(op))\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateFieldPermissions(\n\t\tpermissions: Acl.FieldPermissions,\n\t\tentity: Model.Entity,\n\t\tpredicates: Acl.PredicateDefinition,\n\t\terrorBuilder: ErrorBuilder,\n\t): void {\n\t\tfor (const field in permissions) {\n\t\t\tif (!permissions.hasOwnProperty(field)) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (!entity.fields[field]) {\n\t\t\t\terrorBuilder.add('ACL_UNDEFINED_FIELD', `Field ${field} not found on entity ${entity.name}`)\n\t\t\t}\n\t\t\tthis.validatePredicate(permissions[field], predicates, errorBuilder.for(field))\n\t\t}\n\t}\n\n\tprivate validatePredicate(\n\t\tpredicate: Acl.Predicate,\n\t\tpredicates: Acl.PredicateDefinition,\n\t\terrorBuilder: ErrorBuilder,\n\t): void {\n\t\tif (predicate === false || predicate === true) {\n\t\t\treturn\n\t\t}\n\t\tif (!predicates[predicate]) {\n\t\t\terrorBuilder.add('ACL_UNDEFINED_PREDICATE', `Predicate ${predicate} not found`)\n\t\t}\n\t}\n}\n"],"names":["ErrorBuilder","getEntity","PredicateDefinitionProcessor","conditionSchema"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AclValidator.js","sources":["../../../../../packages/schema-utils/src/validation/AclValidator.ts"],"sourcesContent":["import { Acl, Model } from '@contember/schema'\nimport { PredicateDefinitionProcessor } from '../acl'\nimport { getEntity } from '../model'\nimport { ErrorBuilder, ValidationError } from './errors'\nimport { conditionSchema } from '../type-schema'\n\nexport class AclValidator {\n\tconstructor(private readonly model: Model.Schema) {}\n\n\tpublic validate(schema: Acl.Schema): ValidationError[] {\n\t\tconst errorBuilder = new ErrorBuilder([], ['acl'])\n\t\tthis.validateRoles(schema.roles, errorBuilder)\n\t\treturn errorBuilder.errors\n\t}\n\n\tprivate validateRoles(roles: Acl.Roles, errorBuilder: ErrorBuilder): void {\n\t\tfor (const role in roles) {\n\t\t\tif (!roles.hasOwnProperty(role)) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tthis.validateRolePermissions(roles[role], Object.keys(roles), errorBuilder.for(role))\n\t\t}\n\t}\n\n\tprivate validateRolePermissions(\n\t\tpermissions: Acl.RolePermissions,\n\t\troles: string[],\n\t\terrorBuilder: ErrorBuilder,\n\t): void {\n\t\tthis.validateInherits(permissions.inherits, roles, errorBuilder.for('inherits'))\n\t\tthis.validateVariables(permissions.variables, errorBuilder.for('variables'))\n\t\tthis.validatePermissions(permissions.entities, (permissions.variables as Acl.Variables) || {}, errorBuilder.for('entities'))\n\t\t// todo: plugins validation\n\t}\n\n\tprivate validateInherits(inherits: Acl.RolePermissions['inherits'], roles: string[], errorBuilder: ErrorBuilder): void {\n\t\tif (inherits === undefined) {\n\t\t\treturn undefined\n\t\t}\n\t\tfor (const inheritsFrom of inherits) {\n\t\t\tif (!roles.includes(inheritsFrom)) {\n\t\t\t\terrorBuilder.for(inheritsFrom).add('ACL_UNDEFINED_ROLE', 'Referenced role not exists.')\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateVariables(variables: Acl.Variables, errorBuilder: ErrorBuilder): void {\n\t\tfor (const varName in variables) {\n\t\t\tif (!variables.hasOwnProperty(varName)) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tthis.validateVariable(variables[varName], errorBuilder.for(varName))\n\t\t}\n\t}\n\n\tprivate validateVariable(variable: Acl.Variable, errorBuilder: ErrorBuilder): void {\n\t\tswitch (variable.type) {\n\t\t\tcase 'entity':\n\t\t\t\tif (!this.model.entities[variable.entityName]) {\n\t\t\t\t\terrorBuilder.add('ACL_UNDEFINED_ENTITY', `Entity \"${variable.entityName}\" not found`)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t}\n\t\treturn\n\t}\n\n\tprivate validatePermissions(permissions: Acl.Permissions, variables: Acl.Variables, errorBuilder: ErrorBuilder): void {\n\t\tfor (const entityName in permissions) {\n\t\t\tif (!permissions.hasOwnProperty(entityName)) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (!this.model.entities[entityName]) {\n\t\t\t\terrorBuilder.add('ACL_UNDEFINED_ENTITY', `Entity ${entityName} not found`)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst entity = getEntity(this.model, entityName)\n\n\t\t\tthis.validateEntityPermissions(\n\t\t\t\tpermissions[entityName],\n\t\t\t\tentity,\n\t\t\t\tvariables,\n\t\t\t\terrorBuilder.for(entityName),\n\t\t\t)\n\t\t}\n\t}\n\n\tprivate validateEntityPermissions(\n\t\tentityPermissions: Acl.EntityPermissions,\n\t\tentity: Model.Entity,\n\t\tvariables: Acl.Variables,\n\t\terrorBuilder: ErrorBuilder,\n\t): void {\n\t\tthis.validatePredicates(\n\t\t\tentityPermissions.predicates,\n\t\t\tentity,\n\t\t\tvariables,\n\t\t\terrorBuilder.for('predicates'),\n\t\t)\n\t\tthis.validateOperations(\n\t\t\tentityPermissions.operations,\n\t\t\tentity,\n\t\t\tentityPermissions.predicates as Acl.PredicateMap,\n\t\t\terrorBuilder.for('operations'),\n\t\t)\n\t}\n\n\tprivate validatePredicates(predicates: Acl.PredicateMap, entity: Model.Entity, variables: Acl.Variables, errorBuilder: ErrorBuilder): void {\n\t\tfor (const predicateName in predicates) {\n\t\t\tif (!predicates.hasOwnProperty(predicateName)) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tthis.validatePredicateDefinition(\n\t\t\t\tpredicates[predicateName],\n\t\t\t\tentity,\n\t\t\t\tvariables,\n\t\t\t\terrorBuilder.for(predicateName),\n\t\t\t)\n\t\t}\n\t}\n\n\tprivate validatePredicateDefinition(\n\t\tpredicate: Acl.PredicateDefinition,\n\t\tentity: Model.Entity,\n\t\tvariables: Acl.Variables,\n\t\terrorBuilder: ErrorBuilder,\n\t): void {\n\t\tconst processor = new PredicateDefinitionProcessor(this.model)\n\t\tprocessor.process(entity, predicate, {\n\t\t\thandleColumn: ctx => {\n\t\t\t\tif (typeof ctx.value === 'string') {\n\t\t\t\t\tif (!variables[ctx.value]) {\n\t\t\t\t\t\terrorBuilder.for(...ctx.path).add('ACL_UNDEFINED_VARIABLE', `Undefined variable ${ctx.value}`)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconditionSchema(ctx.column.type)(ctx.value)\n\t\t\t\t\t} catch (e: any) {\n\t\t\t\t\t\terrorBuilder.for(...ctx.path).add('ACL_INVALID_CONDITION', `Invalid condition (${e.message}): ${JSON.stringify(ctx.value)}`)\n\t\t\t\t\t}\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 (typeof ctx.value === 'string' && !variables[ctx.value]) {\n\t\t\t\t\terrorBuilder.for(...ctx.path).add('ACL_UNDEFINED_VARIABLE', `Undefined variable ${ctx.value}`)\n\t\t\t\t}\n\t\t\t\treturn ctx.value\n\t\t\t},\n\t\t\thandleUndefinedField: ctx => {\n\t\t\t\terrorBuilder.for(...ctx.path).add('ACL_UNDEFINED_FIELD', `Undefined field ${ctx.name} on entity ${ctx.entity.name}`)\n\t\t\t\treturn ctx.value\n\t\t\t},\n\t\t})\n\t}\n\n\tprivate validateOperations(\n\t\toperations: Acl.EntityOperations,\n\t\tentity: Model.Entity,\n\t\tpredicates: Acl.PredicateDefinition,\n\t\terrorBuilder: ErrorBuilder,\n\t): void {\n\t\tif (operations.delete !== undefined) {\n\t\t\tthis.validatePredicate(operations.delete, predicates, errorBuilder.for('delete'))\n\t\t}\n\t\tfor (const op of ['read', 'create', 'update'] as const) {\n\t\t\tconst operation = operations[op]\n\t\t\tif (operation !== undefined) {\n\t\t\t\tthis.validateFieldPermissions(operation, entity, predicates, errorBuilder.for(op))\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateFieldPermissions(\n\t\tpermissions: Acl.FieldPermissions,\n\t\tentity: Model.Entity,\n\t\tpredicates: Acl.PredicateDefinition,\n\t\terrorBuilder: ErrorBuilder,\n\t): void {\n\t\tfor (const field in permissions) {\n\t\t\tif (!permissions.hasOwnProperty(field)) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (!entity.fields[field]) {\n\t\t\t\terrorBuilder.add('ACL_UNDEFINED_FIELD', `Field ${field} not found on entity ${entity.name}`)\n\t\t\t}\n\t\t\tthis.validatePredicate(permissions[field], predicates, errorBuilder.for(field))\n\t\t}\n\t}\n\n\tprivate validatePredicate(\n\t\tpredicate: Acl.Predicate,\n\t\tpredicates: Acl.PredicateDefinition,\n\t\terrorBuilder: ErrorBuilder,\n\t): void {\n\t\tif (predicate === false || predicate === true) {\n\t\t\treturn\n\t\t}\n\t\tif (!predicates[predicate]) {\n\t\t\terrorBuilder.add('ACL_UNDEFINED_PREDICATE', `Predicate ${predicate} not found`)\n\t\t}\n\t}\n}\n"],"names":[],"mappings":";;;;;;;;;AAMO,MAAM,aAAa;AAAA,EACzB,YAA6B,OAAqB;AAArB,SAAA,QAAA;AAAA,EAAsB;AAAA,EAE5C,SAAS,QAAuC;AACtD,UAAM,eAAe,IAAI,aAAa,CAAA,GAAI,CAAC,KAAK,CAAC;AACjD,SAAK,cAAc,OAAO,OAAO,YAAY;AAC7C,WAAO,aAAa;AAAA,EACrB;AAAA,EAEQ,cAAc,OAAkB,cAAkC;AACzE,eAAW,QAAQ,OAAO;AACzB,UAAI,CAAC,MAAM,eAAe,IAAI,GAAG;AAChC;AAAA,MACD;AACA,WAAK,wBAAwB,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,GAAG,aAAa,IAAI,IAAI,CAAC;AAAA,IACrF;AAAA,EACD;AAAA,EAEQ,wBACP,aACA,OACA,cACO;AACP,SAAK,iBAAiB,YAAY,UAAU,OAAO,aAAa,IAAI,UAAU,CAAC;AAC/E,SAAK,kBAAkB,YAAY,WAAW,aAAa,IAAI,WAAW,CAAC;AAC3E,SAAK,oBAAoB,YAAY,UAAW,YAAY,aAA+B,CAAA,GAAI,aAAa,IAAI,UAAU,CAAC;AAAA,EAE5H;AAAA,EAEQ,iBAAiB,UAA2C,OAAiB,cAAkC;AACtH,QAAI,aAAa,QAAW;AAC3B,aAAO;AAAA,IACR;AACA,eAAW,gBAAgB,UAAU;AACpC,UAAI,CAAC,MAAM,SAAS,YAAY,GAAG;AAClC,qBAAa,IAAI,YAAY,EAAE,IAAI,sBAAsB,6BAA6B;AAAA,MACvF;AAAA,IACD;AAAA,EACD;AAAA,EAEQ,kBAAkB,WAA0B,cAAkC;AACrF,eAAW,WAAW,WAAW;AAChC,UAAI,CAAC,UAAU,eAAe,OAAO,GAAG;AACvC;AAAA,MACD;AACA,WAAK,iBAAiB,UAAU,OAAO,GAAG,aAAa,IAAI,OAAO,CAAC;AAAA,IACpE;AAAA,EACD;AAAA,EAEQ,iBAAiB,UAAwB,cAAkC;AAClF,YAAQ,SAAS,MAAA;AAAA,MAChB,KAAK;AACJ,YAAI,CAAC,KAAK,MAAM,SAAS,SAAS,UAAU,GAAG;AAC9C,uBAAa,IAAI,wBAAwB,WAAW,SAAS,UAAU,aAAa;AACpF;AAAA,QACD;AAAA,IAAA;AAEF;AAAA,EACD;AAAA,EAEQ,oBAAoB,aAA8B,WAA0B,cAAkC;AACrH,eAAW,cAAc,aAAa;AACrC,UAAI,CAAC,YAAY,eAAe,UAAU,GAAG;AAC5C;AAAA,MACD;AACA,UAAI,CAAC,KAAK,MAAM,SAAS,UAAU,GAAG;AACrC,qBAAa,IAAI,wBAAwB,UAAU,UAAU,YAAY;AACzE;AAAA,MACD;AACA,YAAM,SAAS,UAAU,KAAK,OAAO,UAAU;AAE/C,WAAK;AAAA,QACJ,YAAY,UAAU;AAAA,QACtB;AAAA,QACA;AAAA,QACA,aAAa,IAAI,UAAU;AAAA,MAAA;AAAA,IAE7B;AAAA,EACD;AAAA,EAEQ,0BACP,mBACA,QACA,WACA,cACO;AACP,SAAK;AAAA,MACJ,kBAAkB;AAAA,MAClB;AAAA,MACA;AAAA,MACA,aAAa,IAAI,YAAY;AAAA,IAAA;AAE9B,SAAK;AAAA,MACJ,kBAAkB;AAAA,MAClB;AAAA,MACA,kBAAkB;AAAA,MAClB,aAAa,IAAI,YAAY;AAAA,IAAA;AAAA,EAE/B;AAAA,EAEQ,mBAAmB,YAA8B,QAAsB,WAA0B,cAAkC;AAC1I,eAAW,iBAAiB,YAAY;AACvC,UAAI,CAAC,WAAW,eAAe,aAAa,GAAG;AAC9C;AAAA,MACD;AACA,WAAK;AAAA,QACJ,WAAW,aAAa;AAAA,QACxB;AAAA,QACA;AAAA,QACA,aAAa,IAAI,aAAa;AAAA,MAAA;AAAA,IAEhC;AAAA,EACD;AAAA,EAEQ,4BACP,WACA,QACA,WACA,cACO;AACP,UAAM,YAAY,IAAI,6BAA6B,KAAK,KAAK;AAC7D,cAAU,QAAQ,QAAQ,WAAW;AAAA,MACpC,cAAc,CAAA,QAAO;AACpB,YAAI,OAAO,IAAI,UAAU,UAAU;AAClC,cAAI,CAAC,UAAU,IAAI,KAAK,GAAG;AAC1B,yBAAa,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,0BAA0B,sBAAsB,IAAI,KAAK,EAAE;AAAA,UAC9F;AAAA,QACD,OAAO;AACN,cAAI;AACH,4BAAgB,IAAI,OAAO,IAAI,EAAE,IAAI,KAAK;AAAA,UAC3C,SAAS,GAAQ;AAChB,yBAAa,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,yBAAyB,sBAAsB,EAAE,OAAO,MAAM,KAAK,UAAU,IAAI,KAAK,CAAC,EAAE;AAAA,UAC5H;AAAA,QACD;AACA,eAAO,IAAI;AAAA,MACZ;AAAA,MACA,gBAAgB,CAAA,QAAO;AACtB,YAAI,OAAO,IAAI,UAAU,YAAY,CAAC,UAAU,IAAI,KAAK,GAAG;AAC3D,uBAAa,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,0BAA0B,sBAAsB,IAAI,KAAK,EAAE;AAAA,QAC9F;AACA,eAAO,IAAI;AAAA,MACZ;AAAA,MACA,sBAAsB,CAAA,QAAO;AAC5B,qBAAa,IAAI,GAAG,IAAI,IAAI,EAAE,IAAI,uBAAuB,mBAAmB,IAAI,IAAI,cAAc,IAAI,OAAO,IAAI,EAAE;AACnH,eAAO,IAAI;AAAA,MACZ;AAAA,IAAA,CACA;AAAA,EACF;AAAA,EAEQ,mBACP,YACA,QACA,YACA,cACO;AACP,QAAI,WAAW,WAAW,QAAW;AACpC,WAAK,kBAAkB,WAAW,QAAQ,YAAY,aAAa,IAAI,QAAQ,CAAC;AAAA,IACjF;AACA,eAAW,MAAM,CAAC,QAAQ,UAAU,QAAQ,GAAY;AACvD,YAAM,YAAY,WAAW,EAAE;AAC/B,UAAI,cAAc,QAAW;AAC5B,aAAK,yBAAyB,WAAW,QAAQ,YAAY,aAAa,IAAI,EAAE,CAAC;AAAA,MAClF;AAAA,IACD;AAAA,EACD;AAAA,EAEQ,yBACP,aACA,QACA,YACA,cACO;AACP,eAAW,SAAS,aAAa;AAChC,UAAI,CAAC,YAAY,eAAe,KAAK,GAAG;AACvC;AAAA,MACD;AACA,UAAI,CAAC,OAAO,OAAO,KAAK,GAAG;AAC1B,qBAAa,IAAI,uBAAuB,SAAS,KAAK,wBAAwB,OAAO,IAAI,EAAE;AAAA,MAC5F;AACA,WAAK,kBAAkB,YAAY,KAAK,GAAG,YAAY,aAAa,IAAI,KAAK,CAAC;AAAA,IAC/E;AAAA,EACD;AAAA,EAEQ,kBACP,WACA,YACA,cACO;AACP,QAAI,cAAc,SAAS,cAAc,MAAM;AAC9C;AAAA,IACD;AACA,QAAI,CAAC,WAAW,SAAS,GAAG;AAC3B,mBAAa,IAAI,2BAA2B,aAAa,SAAS,YAAY;AAAA,IAC/E;AAAA,EACD;AACD;"}
1
+ {"version":3,"file":"AclValidator.js","sources":["../../../../../packages/schema-utils/src/validation/AclValidator.ts"],"sourcesContent":["import { Acl, Model } from '@contember/schema'\nimport { PredicateDefinitionProcessor } from '../acl/index.js'\nimport { getEntity } from '../model/index.js'\nimport { ErrorBuilder, ValidationError } from './errors.js'\nimport { conditionSchema } from '../type-schema/index.js'\n\nexport class AclValidator {\n\tconstructor(private readonly model: Model.Schema) {}\n\n\tpublic validate(schema: Acl.Schema): ValidationError[] {\n\t\tconst errorBuilder = new ErrorBuilder([], ['acl'])\n\t\tthis.validateRoles(schema.roles, errorBuilder)\n\t\treturn errorBuilder.errors\n\t}\n\n\tprivate validateRoles(roles: Acl.Roles, errorBuilder: ErrorBuilder): void {\n\t\tfor (const role in roles) {\n\t\t\tif (!roles.hasOwnProperty(role)) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tthis.validateRolePermissions(roles[role], Object.keys(roles), errorBuilder.for(role))\n\t\t}\n\t}\n\n\tprivate validateRolePermissions(\n\t\tpermissions: Acl.RolePermissions,\n\t\troles: string[],\n\t\terrorBuilder: ErrorBuilder,\n\t): void {\n\t\tthis.validateInherits(permissions.inherits, roles, errorBuilder.for('inherits'))\n\t\tthis.validateVariables(permissions.variables, errorBuilder.for('variables'))\n\t\tthis.validatePermissions(permissions.entities, (permissions.variables as Acl.Variables) || {}, errorBuilder.for('entities'))\n\t\t// todo: plugins validation\n\t}\n\n\tprivate validateInherits(inherits: Acl.RolePermissions['inherits'], roles: string[], errorBuilder: ErrorBuilder): void {\n\t\tif (inherits === undefined) {\n\t\t\treturn undefined\n\t\t}\n\t\tfor (const inheritsFrom of inherits) {\n\t\t\tif (!roles.includes(inheritsFrom)) {\n\t\t\t\terrorBuilder.for(inheritsFrom).add('ACL_UNDEFINED_ROLE', 'Referenced role not exists.')\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateVariables(variables: Acl.Variables, errorBuilder: ErrorBuilder): void {\n\t\tfor (const varName in variables) {\n\t\t\tif (!variables.hasOwnProperty(varName)) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tthis.validateVariable(variables[varName], errorBuilder.for(varName))\n\t\t}\n\t}\n\n\tprivate validateVariable(variable: Acl.Variable, errorBuilder: ErrorBuilder): void {\n\t\tswitch (variable.type) {\n\t\t\tcase 'entity':\n\t\t\t\tif (!this.model.entities[variable.entityName]) {\n\t\t\t\t\terrorBuilder.add('ACL_UNDEFINED_ENTITY', `Entity \"${variable.entityName}\" not found`)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t}\n\t\treturn\n\t}\n\n\tprivate validatePermissions(permissions: Acl.Permissions, variables: Acl.Variables, errorBuilder: ErrorBuilder): void {\n\t\tfor (const entityName in permissions) {\n\t\t\tif (!permissions.hasOwnProperty(entityName)) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (!this.model.entities[entityName]) {\n\t\t\t\terrorBuilder.add('ACL_UNDEFINED_ENTITY', `Entity ${entityName} not found`)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst entity = getEntity(this.model, entityName)\n\n\t\t\tthis.validateEntityPermissions(\n\t\t\t\tpermissions[entityName],\n\t\t\t\tentity,\n\t\t\t\tvariables,\n\t\t\t\terrorBuilder.for(entityName),\n\t\t\t)\n\t\t}\n\t}\n\n\tprivate validateEntityPermissions(\n\t\tentityPermissions: Acl.EntityPermissions,\n\t\tentity: Model.Entity,\n\t\tvariables: Acl.Variables,\n\t\terrorBuilder: ErrorBuilder,\n\t): void {\n\t\tthis.validatePredicates(\n\t\t\tentityPermissions.predicates,\n\t\t\tentity,\n\t\t\tvariables,\n\t\t\terrorBuilder.for('predicates'),\n\t\t)\n\t\tthis.validateOperations(\n\t\t\tentityPermissions.operations,\n\t\t\tentity,\n\t\t\tentityPermissions.predicates as Acl.PredicateMap,\n\t\t\terrorBuilder.for('operations'),\n\t\t)\n\t}\n\n\tprivate validatePredicates(predicates: Acl.PredicateMap, entity: Model.Entity, variables: Acl.Variables, errorBuilder: ErrorBuilder): void {\n\t\tfor (const predicateName in predicates) {\n\t\t\tif (!predicates.hasOwnProperty(predicateName)) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tthis.validatePredicateDefinition(\n\t\t\t\tpredicates[predicateName],\n\t\t\t\tentity,\n\t\t\t\tvariables,\n\t\t\t\terrorBuilder.for(predicateName),\n\t\t\t)\n\t\t}\n\t}\n\n\tprivate validatePredicateDefinition(\n\t\tpredicate: Acl.PredicateDefinition,\n\t\tentity: Model.Entity,\n\t\tvariables: Acl.Variables,\n\t\terrorBuilder: ErrorBuilder,\n\t): void {\n\t\tconst processor = new PredicateDefinitionProcessor(this.model)\n\t\tprocessor.process(entity, predicate, {\n\t\t\thandleColumn: ctx => {\n\t\t\t\tif (typeof ctx.value === 'string') {\n\t\t\t\t\tif (!variables[ctx.value]) {\n\t\t\t\t\t\terrorBuilder.for(...ctx.path).add('ACL_UNDEFINED_VARIABLE', `Undefined variable ${ctx.value}`)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconditionSchema(ctx.column.type)(ctx.value)\n\t\t\t\t\t} catch (e: any) {\n\t\t\t\t\t\terrorBuilder.for(...ctx.path).add('ACL_INVALID_CONDITION', `Invalid condition (${e.message}): ${JSON.stringify(ctx.value)}`)\n\t\t\t\t\t}\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 (typeof ctx.value === 'string' && !variables[ctx.value]) {\n\t\t\t\t\terrorBuilder.for(...ctx.path).add('ACL_UNDEFINED_VARIABLE', `Undefined variable ${ctx.value}`)\n\t\t\t\t}\n\t\t\t\treturn ctx.value\n\t\t\t},\n\t\t\thandleUndefinedField: ctx => {\n\t\t\t\terrorBuilder.for(...ctx.path).add('ACL_UNDEFINED_FIELD', `Undefined field ${ctx.name} on entity ${ctx.entity.name}`)\n\t\t\t\treturn ctx.value\n\t\t\t},\n\t\t})\n\t}\n\n\tprivate validateOperations(\n\t\toperations: Acl.EntityOperations,\n\t\tentity: Model.Entity,\n\t\tpredicates: Acl.PredicateDefinition,\n\t\terrorBuilder: ErrorBuilder,\n\t): void {\n\t\tif (operations.delete !== undefined) {\n\t\t\tthis.validatePredicate(operations.delete, predicates, errorBuilder.for('delete'))\n\t\t}\n\t\tfor (const op of ['read', 'create', 'update'] as const) {\n\t\t\tconst operation = operations[op]\n\t\t\tif (operation !== undefined) {\n\t\t\t\tthis.validateFieldPermissions(operation, entity, predicates, errorBuilder.for(op))\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateFieldPermissions(\n\t\tpermissions: Acl.FieldPermissions,\n\t\tentity: Model.Entity,\n\t\tpredicates: Acl.PredicateDefinition,\n\t\terrorBuilder: ErrorBuilder,\n\t): void {\n\t\tfor (const field in permissions) {\n\t\t\tif (!permissions.hasOwnProperty(field)) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (!entity.fields[field]) {\n\t\t\t\terrorBuilder.add('ACL_UNDEFINED_FIELD', `Field ${field} not found on entity ${entity.name}`)\n\t\t\t}\n\t\t\tthis.validatePredicate(permissions[field], predicates, errorBuilder.for(field))\n\t\t}\n\t}\n\n\tprivate validatePredicate(\n\t\tpredicate: Acl.Predicate,\n\t\tpredicates: Acl.PredicateDefinition,\n\t\terrorBuilder: ErrorBuilder,\n\t): void {\n\t\tif (predicate === false || predicate === true) {\n\t\t\treturn\n\t\t}\n\t\tif (!predicates[predicate]) {\n\t\t\terrorBuilder.add('ACL_UNDEFINED_PREDICATE', `Predicate ${predicate} not found`)\n\t\t}\n\t}\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ActionsValidator.cjs","sources":["../../../../../packages/schema-utils/src/validation/ActionsValidator.ts"],"sourcesContent":["import { Actions, Model } from '@contember/schema'\nimport { acceptFieldVisitor } from '../model'\nimport { ErrorBuilder, ValidationError } from './errors'\nimport { assertNever } from '../utils'\nimport * as Typesafe from '@contember/typesafe'\nimport { whereSchema } from '../type-schema/where'\n\nconst manyArgsSchema = (args: { schema: Model.Schema; entity: Model.Entity }) =>\n\tTypesafe.partial({\n\t\tlimit: Typesafe.integer,\n\t\toffset: Typesafe.integer,\n\t\torderBy: Typesafe.array(Typesafe.anyJsonObject),\n\t\tfilter: whereSchema(args),\n\t})\n\nexport class ActionsValidator {\n\tconstructor(private readonly model: Model.Schema) {}\n\n\tpublic validate(schema: Actions.Schema): ValidationError[] {\n\t\tconst errorBuilder = new ErrorBuilder([], ['actions'])\n\t\tthis.validateTriggers(schema, errorBuilder.for('triggers'))\n\t\treturn errorBuilder.errors\n\t}\n\n\tprivate validateTriggers(schema: Actions.Schema, errorBuilder: ErrorBuilder) {\n\t\tfor (const [name, def] of Object.entries(schema.triggers)) {\n\t\t\tconst triggerErrorBuilder = errorBuilder.for(name)\n\t\t\tif (name !== def.name) {\n\t\t\t\ttriggerErrorBuilder.add('ACTIONS_NAME_MISMATCH', `Trigger name ${def.name} does not match the name in a map ${name}`)\n\t\t\t}\n\t\t\tif (!schema.targets[def.target]) {\n\t\t\t\ttriggerErrorBuilder.add('ACTIONS_UNDEFINED_TRIGGER_TARGET', `Trigger target ${def.target} not found`)\n\t\t\t}\n\t\t\tthis.validateTrigger(def, triggerErrorBuilder)\n\t\t}\n\t}\n\n\tprivate validateTrigger(trigger: Actions.AnyTrigger, errorBuilder: ErrorBuilder): void {\n\t\tconst entity = this.model.entities[trigger.entity]\n\t\tif (!entity) {\n\t\t\terrorBuilder.add('ACTIONS_UNDEFINED_ENTITY', `Entity ${trigger.entity} not found.`)\n\t\t\treturn\n\t\t}\n\n\t\tswitch (trigger.type) {\n\t\t\tcase 'watch':\n\t\t\t\tthis.validateWatchTrigger(trigger, entity, errorBuilder)\n\t\t\t\tbreak\n\t\t\tcase 'basic':\n\t\t\t\tthis.validateBasicTrigger(trigger, entity, errorBuilder)\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tassertNever(trigger)\n\t\t}\n\t}\n\n\tprivate validateWatchTrigger(trigger: Actions.WatchTrigger, entity: Model.Entity, errorBuilder: ErrorBuilder): void {\n\t\tthis.validateSelection(trigger.watch, entity, errorBuilder.for('watch'))\n\t\tif (trigger.selection) {\n\t\t\tthis.validateSelection(trigger.selection, entity, errorBuilder.for('selection'))\n\t\t}\n\t}\n\n\tprivate validateBasicTrigger(trigger: Actions.BasicTrigger, entity: Model.Entity, errorBuilder: ErrorBuilder): void {\n\t\tif (trigger.selection) {\n\t\t\tthis.validateSelection(trigger.selection, entity, errorBuilder.for('selection'))\n\t\t}\n\n\t\tif (Array.isArray(trigger.update)) {\n\t\t\tfor (const field of trigger.update) {\n\t\t\t\tif (!entity.fields[field]) {\n\t\t\t\t\terrorBuilder.for('update').add('ACTIONS_UNDEFINED_FIELD', `Field ${field} of entity ${entity.name} not found.`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateSelection(\n\t\tselectionNode: Actions.SelectionNode,\n\t\tentity: Model.Entity,\n\t\terrorBuilder: ErrorBuilder,\n\t): void {\n\t\tfor (const part of selectionNode) {\n\t\t\tconst [field, args, selection] = Array.isArray(part) ? part : [part, {}, []]\n\t\t\tconst fieldErrorBuilder = errorBuilder.for(field)\n\t\t\tif (!entity.fields[field]) {\n\t\t\t\tfieldErrorBuilder.add('ACTIONS_UNDEFINED_FIELD', `Undefined field ${field} on entity ${entity.name}`)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tacceptFieldVisitor(this.model, entity, field, {\n\t\t\t\tvisitColumn: () => {\n\t\t\t\t\tif (selection.length) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Unexpected sub selection on a column.`)\n\t\t\t\t\t}\n\t\t\t\t\tif (Object.keys(args).length !== 0) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Unexpected args on a column.`)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitHasMany: ({ targetEntity }) => {\n\t\t\t\t\tif (selection.length === 0) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Sub-selection expected on a relation.`)\n\t\t\t\t\t}\n\t\t\t\t\tthis.validateSelection(selection, targetEntity, fieldErrorBuilder)\n\t\t\t\t\ttry {\n\t\t\t\t\t\tmanyArgsSchema({ schema: this.model, entity: targetEntity })(args)\n\t\t\t\t\t} catch (e: any) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Selection args are not valid: ` + e.message)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitHasOne: ({ targetEntity }) => {\n\t\t\t\t\tif (selection.length === 0) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Sub-selection expected on a relation.`)\n\t\t\t\t\t}\n\t\t\t\t\tthis.validateSelection(selection, targetEntity, fieldErrorBuilder)\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t}\n}\n"],"names":["Typesafe","whereSchema","ErrorBuilder","assertNever","acceptFieldVisitor"],"mappings":"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"}
1
+ {"version":3,"file":"ActionsValidator.cjs","sources":["../../../../../packages/schema-utils/src/validation/ActionsValidator.ts"],"sourcesContent":["import { Actions, Model } from '@contember/schema'\nimport { acceptFieldVisitor } from '../model/index.js'\nimport { ErrorBuilder, ValidationError } from './errors.js'\nimport { assertNever } from '../utils/index.js'\nimport * as Typesafe from '@contember/typesafe'\nimport { whereSchema } from '../type-schema/where.js'\n\nconst manyArgsSchema = (args: { schema: Model.Schema; entity: Model.Entity }) =>\n\tTypesafe.partial({\n\t\tlimit: Typesafe.integer,\n\t\toffset: Typesafe.integer,\n\t\torderBy: Typesafe.array(Typesafe.anyJsonObject),\n\t\tfilter: whereSchema(args),\n\t})\n\nexport class ActionsValidator {\n\tconstructor(private readonly model: Model.Schema) {}\n\n\tpublic validate(schema: Actions.Schema): ValidationError[] {\n\t\tconst errorBuilder = new ErrorBuilder([], ['actions'])\n\t\tthis.validateTriggers(schema, errorBuilder.for('triggers'))\n\t\treturn errorBuilder.errors\n\t}\n\n\tprivate validateTriggers(schema: Actions.Schema, errorBuilder: ErrorBuilder) {\n\t\tfor (const [name, def] of Object.entries(schema.triggers)) {\n\t\t\tconst triggerErrorBuilder = errorBuilder.for(name)\n\t\t\tif (name !== def.name) {\n\t\t\t\ttriggerErrorBuilder.add('ACTIONS_NAME_MISMATCH', `Trigger name ${def.name} does not match the name in a map ${name}`)\n\t\t\t}\n\t\t\tif (!schema.targets[def.target]) {\n\t\t\t\ttriggerErrorBuilder.add('ACTIONS_UNDEFINED_TRIGGER_TARGET', `Trigger target ${def.target} not found`)\n\t\t\t}\n\t\t\tthis.validateTrigger(def, triggerErrorBuilder)\n\t\t}\n\t}\n\n\tprivate validateTrigger(trigger: Actions.AnyTrigger, errorBuilder: ErrorBuilder): void {\n\t\tconst entity = this.model.entities[trigger.entity]\n\t\tif (!entity) {\n\t\t\terrorBuilder.add('ACTIONS_UNDEFINED_ENTITY', `Entity ${trigger.entity} not found.`)\n\t\t\treturn\n\t\t}\n\n\t\tswitch (trigger.type) {\n\t\t\tcase 'watch':\n\t\t\t\tthis.validateWatchTrigger(trigger, entity, errorBuilder)\n\t\t\t\tbreak\n\t\t\tcase 'basic':\n\t\t\t\tthis.validateBasicTrigger(trigger, entity, errorBuilder)\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tassertNever(trigger)\n\t\t}\n\t}\n\n\tprivate validateWatchTrigger(trigger: Actions.WatchTrigger, entity: Model.Entity, errorBuilder: ErrorBuilder): void {\n\t\tthis.validateSelection(trigger.watch, entity, errorBuilder.for('watch'))\n\t\tif (trigger.selection) {\n\t\t\tthis.validateSelection(trigger.selection, entity, errorBuilder.for('selection'))\n\t\t}\n\t}\n\n\tprivate validateBasicTrigger(trigger: Actions.BasicTrigger, entity: Model.Entity, errorBuilder: ErrorBuilder): void {\n\t\tif (trigger.selection) {\n\t\t\tthis.validateSelection(trigger.selection, entity, errorBuilder.for('selection'))\n\t\t}\n\n\t\tif (Array.isArray(trigger.update)) {\n\t\t\tfor (const field of trigger.update) {\n\t\t\t\tif (!entity.fields[field]) {\n\t\t\t\t\terrorBuilder.for('update').add('ACTIONS_UNDEFINED_FIELD', `Field ${field} of entity ${entity.name} not found.`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateSelection(\n\t\tselectionNode: Actions.SelectionNode,\n\t\tentity: Model.Entity,\n\t\terrorBuilder: ErrorBuilder,\n\t): void {\n\t\tfor (const part of selectionNode) {\n\t\t\tconst [field, args, selection] = Array.isArray(part) ? part : [part, {}, []]\n\t\t\tconst fieldErrorBuilder = errorBuilder.for(field)\n\t\t\tif (!entity.fields[field]) {\n\t\t\t\tfieldErrorBuilder.add('ACTIONS_UNDEFINED_FIELD', `Undefined field ${field} on entity ${entity.name}`)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tacceptFieldVisitor(this.model, entity, field, {\n\t\t\t\tvisitColumn: () => {\n\t\t\t\t\tif (selection.length) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Unexpected sub selection on a column.`)\n\t\t\t\t\t}\n\t\t\t\t\tif (Object.keys(args).length !== 0) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Unexpected args on a column.`)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitHasMany: ({ targetEntity }) => {\n\t\t\t\t\tif (selection.length === 0) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Sub-selection expected on a relation.`)\n\t\t\t\t\t}\n\t\t\t\t\tthis.validateSelection(selection, targetEntity, fieldErrorBuilder)\n\t\t\t\t\ttry {\n\t\t\t\t\t\tmanyArgsSchema({ schema: this.model, entity: targetEntity })(args)\n\t\t\t\t\t} catch (e: any) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Selection args are not valid: ` + e.message)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitHasOne: ({ targetEntity }) => {\n\t\t\t\t\tif (selection.length === 0) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Sub-selection expected on a relation.`)\n\t\t\t\t\t}\n\t\t\t\t\tthis.validateSelection(selection, targetEntity, fieldErrorBuilder)\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t}\n}\n"],"names":["Typesafe","whereSchema","ErrorBuilder","assertNever","acceptFieldVisitor"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ActionsValidator.js","sources":["../../../../../packages/schema-utils/src/validation/ActionsValidator.ts"],"sourcesContent":["import { Actions, Model } from '@contember/schema'\nimport { acceptFieldVisitor } from '../model'\nimport { ErrorBuilder, ValidationError } from './errors'\nimport { assertNever } from '../utils'\nimport * as Typesafe from '@contember/typesafe'\nimport { whereSchema } from '../type-schema/where'\n\nconst manyArgsSchema = (args: { schema: Model.Schema; entity: Model.Entity }) =>\n\tTypesafe.partial({\n\t\tlimit: Typesafe.integer,\n\t\toffset: Typesafe.integer,\n\t\torderBy: Typesafe.array(Typesafe.anyJsonObject),\n\t\tfilter: whereSchema(args),\n\t})\n\nexport class ActionsValidator {\n\tconstructor(private readonly model: Model.Schema) {}\n\n\tpublic validate(schema: Actions.Schema): ValidationError[] {\n\t\tconst errorBuilder = new ErrorBuilder([], ['actions'])\n\t\tthis.validateTriggers(schema, errorBuilder.for('triggers'))\n\t\treturn errorBuilder.errors\n\t}\n\n\tprivate validateTriggers(schema: Actions.Schema, errorBuilder: ErrorBuilder) {\n\t\tfor (const [name, def] of Object.entries(schema.triggers)) {\n\t\t\tconst triggerErrorBuilder = errorBuilder.for(name)\n\t\t\tif (name !== def.name) {\n\t\t\t\ttriggerErrorBuilder.add('ACTIONS_NAME_MISMATCH', `Trigger name ${def.name} does not match the name in a map ${name}`)\n\t\t\t}\n\t\t\tif (!schema.targets[def.target]) {\n\t\t\t\ttriggerErrorBuilder.add('ACTIONS_UNDEFINED_TRIGGER_TARGET', `Trigger target ${def.target} not found`)\n\t\t\t}\n\t\t\tthis.validateTrigger(def, triggerErrorBuilder)\n\t\t}\n\t}\n\n\tprivate validateTrigger(trigger: Actions.AnyTrigger, errorBuilder: ErrorBuilder): void {\n\t\tconst entity = this.model.entities[trigger.entity]\n\t\tif (!entity) {\n\t\t\terrorBuilder.add('ACTIONS_UNDEFINED_ENTITY', `Entity ${trigger.entity} not found.`)\n\t\t\treturn\n\t\t}\n\n\t\tswitch (trigger.type) {\n\t\t\tcase 'watch':\n\t\t\t\tthis.validateWatchTrigger(trigger, entity, errorBuilder)\n\t\t\t\tbreak\n\t\t\tcase 'basic':\n\t\t\t\tthis.validateBasicTrigger(trigger, entity, errorBuilder)\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tassertNever(trigger)\n\t\t}\n\t}\n\n\tprivate validateWatchTrigger(trigger: Actions.WatchTrigger, entity: Model.Entity, errorBuilder: ErrorBuilder): void {\n\t\tthis.validateSelection(trigger.watch, entity, errorBuilder.for('watch'))\n\t\tif (trigger.selection) {\n\t\t\tthis.validateSelection(trigger.selection, entity, errorBuilder.for('selection'))\n\t\t}\n\t}\n\n\tprivate validateBasicTrigger(trigger: Actions.BasicTrigger, entity: Model.Entity, errorBuilder: ErrorBuilder): void {\n\t\tif (trigger.selection) {\n\t\t\tthis.validateSelection(trigger.selection, entity, errorBuilder.for('selection'))\n\t\t}\n\n\t\tif (Array.isArray(trigger.update)) {\n\t\t\tfor (const field of trigger.update) {\n\t\t\t\tif (!entity.fields[field]) {\n\t\t\t\t\terrorBuilder.for('update').add('ACTIONS_UNDEFINED_FIELD', `Field ${field} of entity ${entity.name} not found.`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateSelection(\n\t\tselectionNode: Actions.SelectionNode,\n\t\tentity: Model.Entity,\n\t\terrorBuilder: ErrorBuilder,\n\t): void {\n\t\tfor (const part of selectionNode) {\n\t\t\tconst [field, args, selection] = Array.isArray(part) ? part : [part, {}, []]\n\t\t\tconst fieldErrorBuilder = errorBuilder.for(field)\n\t\t\tif (!entity.fields[field]) {\n\t\t\t\tfieldErrorBuilder.add('ACTIONS_UNDEFINED_FIELD', `Undefined field ${field} on entity ${entity.name}`)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tacceptFieldVisitor(this.model, entity, field, {\n\t\t\t\tvisitColumn: () => {\n\t\t\t\t\tif (selection.length) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Unexpected sub selection on a column.`)\n\t\t\t\t\t}\n\t\t\t\t\tif (Object.keys(args).length !== 0) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Unexpected args on a column.`)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitHasMany: ({ targetEntity }) => {\n\t\t\t\t\tif (selection.length === 0) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Sub-selection expected on a relation.`)\n\t\t\t\t\t}\n\t\t\t\t\tthis.validateSelection(selection, targetEntity, fieldErrorBuilder)\n\t\t\t\t\ttry {\n\t\t\t\t\t\tmanyArgsSchema({ schema: this.model, entity: targetEntity })(args)\n\t\t\t\t\t} catch (e: any) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Selection args are not valid: ` + e.message)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitHasOne: ({ targetEntity }) => {\n\t\t\t\t\tif (selection.length === 0) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Sub-selection expected on a relation.`)\n\t\t\t\t\t}\n\t\t\t\t\tthis.validateSelection(selection, targetEntity, fieldErrorBuilder)\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t}\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ActionsValidator.js","sources":["../../../../../packages/schema-utils/src/validation/ActionsValidator.ts"],"sourcesContent":["import { Actions, Model } from '@contember/schema'\nimport { acceptFieldVisitor } from '../model/index.js'\nimport { ErrorBuilder, ValidationError } from './errors.js'\nimport { assertNever } from '../utils/index.js'\nimport * as Typesafe from '@contember/typesafe'\nimport { whereSchema } from '../type-schema/where.js'\n\nconst manyArgsSchema = (args: { schema: Model.Schema; entity: Model.Entity }) =>\n\tTypesafe.partial({\n\t\tlimit: Typesafe.integer,\n\t\toffset: Typesafe.integer,\n\t\torderBy: Typesafe.array(Typesafe.anyJsonObject),\n\t\tfilter: whereSchema(args),\n\t})\n\nexport class ActionsValidator {\n\tconstructor(private readonly model: Model.Schema) {}\n\n\tpublic validate(schema: Actions.Schema): ValidationError[] {\n\t\tconst errorBuilder = new ErrorBuilder([], ['actions'])\n\t\tthis.validateTriggers(schema, errorBuilder.for('triggers'))\n\t\treturn errorBuilder.errors\n\t}\n\n\tprivate validateTriggers(schema: Actions.Schema, errorBuilder: ErrorBuilder) {\n\t\tfor (const [name, def] of Object.entries(schema.triggers)) {\n\t\t\tconst triggerErrorBuilder = errorBuilder.for(name)\n\t\t\tif (name !== def.name) {\n\t\t\t\ttriggerErrorBuilder.add('ACTIONS_NAME_MISMATCH', `Trigger name ${def.name} does not match the name in a map ${name}`)\n\t\t\t}\n\t\t\tif (!schema.targets[def.target]) {\n\t\t\t\ttriggerErrorBuilder.add('ACTIONS_UNDEFINED_TRIGGER_TARGET', `Trigger target ${def.target} not found`)\n\t\t\t}\n\t\t\tthis.validateTrigger(def, triggerErrorBuilder)\n\t\t}\n\t}\n\n\tprivate validateTrigger(trigger: Actions.AnyTrigger, errorBuilder: ErrorBuilder): void {\n\t\tconst entity = this.model.entities[trigger.entity]\n\t\tif (!entity) {\n\t\t\terrorBuilder.add('ACTIONS_UNDEFINED_ENTITY', `Entity ${trigger.entity} not found.`)\n\t\t\treturn\n\t\t}\n\n\t\tswitch (trigger.type) {\n\t\t\tcase 'watch':\n\t\t\t\tthis.validateWatchTrigger(trigger, entity, errorBuilder)\n\t\t\t\tbreak\n\t\t\tcase 'basic':\n\t\t\t\tthis.validateBasicTrigger(trigger, entity, errorBuilder)\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tassertNever(trigger)\n\t\t}\n\t}\n\n\tprivate validateWatchTrigger(trigger: Actions.WatchTrigger, entity: Model.Entity, errorBuilder: ErrorBuilder): void {\n\t\tthis.validateSelection(trigger.watch, entity, errorBuilder.for('watch'))\n\t\tif (trigger.selection) {\n\t\t\tthis.validateSelection(trigger.selection, entity, errorBuilder.for('selection'))\n\t\t}\n\t}\n\n\tprivate validateBasicTrigger(trigger: Actions.BasicTrigger, entity: Model.Entity, errorBuilder: ErrorBuilder): void {\n\t\tif (trigger.selection) {\n\t\t\tthis.validateSelection(trigger.selection, entity, errorBuilder.for('selection'))\n\t\t}\n\n\t\tif (Array.isArray(trigger.update)) {\n\t\t\tfor (const field of trigger.update) {\n\t\t\t\tif (!entity.fields[field]) {\n\t\t\t\t\terrorBuilder.for('update').add('ACTIONS_UNDEFINED_FIELD', `Field ${field} of entity ${entity.name} not found.`)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate validateSelection(\n\t\tselectionNode: Actions.SelectionNode,\n\t\tentity: Model.Entity,\n\t\terrorBuilder: ErrorBuilder,\n\t): void {\n\t\tfor (const part of selectionNode) {\n\t\t\tconst [field, args, selection] = Array.isArray(part) ? part : [part, {}, []]\n\t\t\tconst fieldErrorBuilder = errorBuilder.for(field)\n\t\t\tif (!entity.fields[field]) {\n\t\t\t\tfieldErrorBuilder.add('ACTIONS_UNDEFINED_FIELD', `Undefined field ${field} on entity ${entity.name}`)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tacceptFieldVisitor(this.model, entity, field, {\n\t\t\t\tvisitColumn: () => {\n\t\t\t\t\tif (selection.length) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Unexpected sub selection on a column.`)\n\t\t\t\t\t}\n\t\t\t\t\tif (Object.keys(args).length !== 0) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Unexpected args on a column.`)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitHasMany: ({ targetEntity }) => {\n\t\t\t\t\tif (selection.length === 0) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Sub-selection expected on a relation.`)\n\t\t\t\t\t}\n\t\t\t\t\tthis.validateSelection(selection, targetEntity, fieldErrorBuilder)\n\t\t\t\t\ttry {\n\t\t\t\t\t\tmanyArgsSchema({ schema: this.model, entity: targetEntity })(args)\n\t\t\t\t\t} catch (e: any) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Selection args are not valid: ` + e.message)\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitHasOne: ({ targetEntity }) => {\n\t\t\t\t\tif (selection.length === 0) {\n\t\t\t\t\t\tfieldErrorBuilder.add('ACTIONS_INVALID_SELECTION', `Sub-selection expected on a relation.`)\n\t\t\t\t\t}\n\t\t\t\t\tthis.validateSelection(selection, targetEntity, fieldErrorBuilder)\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t}\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"MembershipResolver.cjs","sources":["../../../../../packages/schema-utils/src/validation/MembershipResolver.ts"],"sourcesContent":["import { Acl, Input } from '@contember/schema'\nimport { getRoleVariables } from '../acl'\nimport { conditionSchema } from '../type-schema'\nimport { assertNever } from '../utils'\n\nexport class MembershipResolver {\n\tpublic static UnknownIdentity = { identityId: '00000000-0000-0000-0000-000000000000' }\n\n\tresolve(\n\t\tacl: Acl.Schema,\n\t\tmemberships: readonly Acl.Membership[],\n\t\tidentity: {\n\t\t\tidentityId: string\n\t\t\tpersonId?: string\n\t\t},\n\t\tisAssumed: boolean,\n\t): MembershipReadResult {\n\t\tconst errors: MembershipValidationError[] = []\n\t\tconst parsed: ParsedMembership[] = []\n\t\tconst roles = acl.roles\n\t\tfor (const membership of memberships) {\n\t\t\tif (!roles[membership.role]) {\n\t\t\t\terrors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.ROLE_NOT_FOUND))\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst roleVariables = getRoleVariables(membership.role, acl)\n\t\t\tfor (const variable of membership.variables) {\n\t\t\t\tif (!roleVariables[variable.name] || (!isAssumed && roleVariables[variable.name].type === Acl.VariableType.predefined)) {\n\t\t\t\t\terrors.push(\n\t\t\t\t\t\tnew MembershipValidationError(\n\t\t\t\t\t\t\tmembership.role,\n\t\t\t\t\t\t\tMembershipValidationErrorType.VARIABLE_NOT_FOUND,\n\t\t\t\t\t\t\tvariable.name,\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst [membershipErrors, parsedVariables] = this.readMembershipVariables(roleVariables, membership, identity, isAssumed)\n\t\t\terrors.push(...membershipErrors)\n\t\t\tparsed.push({\n\t\t\t\trole: membership.role,\n\t\t\t\tvariables: parsedVariables,\n\t\t\t})\n\t\t}\n\t\treturn new MembershipReadResult(errors, parsed)\n\t}\n\n\tprivate readMembershipVariables(roleVariables: Acl.Variables, membership: Acl.Membership, identity: {\n\t\tidentityId: string\n\t\tpersonId?: string\n\t}, isAssumed: boolean): [MembershipValidationError[], ParsedMembershipVariable[]] {\n\t\tconst errors: MembershipValidationError[] = []\n\t\tconst parsedVariables: ParsedMembershipVariable[] = []\n\t\tfor (const [name, variable] of Object.entries(roleVariables)) {\n\t\t\tconst inputVariable = membership.variables.find(it => it.name === name)\n\t\t\tif (variable.type === Acl.VariableType.predefined) {\n\t\t\t\tswitch (variable.value) {\n\t\t\t\t\tcase 'identityID':\n\t\t\t\t\t\tparsedVariables.push({\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tcondition: { in: isAssumed && inputVariable ? inputVariable.values : [identity.identityId] },\n\t\t\t\t\t\t})\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'personID':\n\t\t\t\t\t\tparsedVariables.push({\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tcondition: { in: isAssumed && inputVariable ? inputVariable.values : identity.personId ? [identity.personId] : [] },\n\t\t\t\t\t\t})\n\t\t\t\t\t\tbreak\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tparsedVariables.push({ name, condition: { never: true } })\n\t\t\t\t\t\terrors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.VARIABLE_INVALID, name))\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (!inputVariable) {\n\t\t\t\tif (variable.fallback) {\n\t\t\t\t\tparsedVariables.push({ name, condition: variable.fallback })\n\t\t\t\t} else {\n\t\t\t\t\terrors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.VARIABLE_EMPTY, name))\n\t\t\t\t\tparsedVariables.push({ name, condition: { never: true } })\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (variable.type === Acl.VariableType.entity) {\n\t\t\t\tparsedVariables.push({ name, condition: { in: inputVariable.values } }) // todo: cast to int where primary is int\n\t\t\t} else if (variable.type === Acl.VariableType.condition) {\n\t\t\t\ttry {\n\t\t\t\t\tconst conditions = inputVariable.values.map(it => conditionSchema()(JSON.parse(it)))\n\t\t\t\t\tparsedVariables.push({\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tcondition: conditions.length === 1 ? conditions[0] : { or: conditions },\n\t\t\t\t\t})\n\t\t\t\t} catch {\n\t\t\t\t\terrors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.VARIABLE_INVALID, name))\n\t\t\t\t\tparsedVariables.push({ name, condition: { never: true } })\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tassertNever(variable)\n\t\t\t}\n\t\t}\n\t\treturn [errors, parsedVariables]\n\t}\n}\n\nexport class MembershipReadResult {\n\tconstructor(\n\t\tpublic readonly errors: MembershipValidationError[],\n\t\tpublic readonly memberships: ParsedMembership[],\n\t) {\n\t}\n}\n\nexport class MembershipValidationError {\n\tconstructor(\n\t\tpublic readonly role: string,\n\t\tpublic readonly error: MembershipValidationErrorType,\n\t\tpublic readonly variable?: string,\n\t) {\n\t}\n}\n\nexport enum MembershipValidationErrorType {\n\tROLE_NOT_FOUND = 'roleNotFound',\n\tVARIABLE_NOT_FOUND = 'variableNotFound',\n\tVARIABLE_EMPTY = 'variableEmpty',\n\tVARIABLE_INVALID = 'variableInvalid',\n}\n\nexport interface ParsedMembershipVariable {\n\treadonly name: string\n\treadonly condition: Input.Condition\n}\n\nexport interface ParsedMembership {\n\treadonly role: string\n\treadonly variables: readonly ParsedMembershipVariable[]\n}\n"],"names":["getRoleVariables","Acl","conditionSchema","assertNever","MembershipValidationErrorType"],"mappings":"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"}
1
+ {"version":3,"file":"MembershipResolver.cjs","sources":["../../../../../packages/schema-utils/src/validation/MembershipResolver.ts"],"sourcesContent":["import { Acl, Input } from '@contember/schema'\nimport { getRoleVariables } from '../acl/index.js'\nimport { conditionSchema } from '../type-schema/index.js'\nimport { assertNever } from '../utils/index.js'\n\nexport class MembershipResolver {\n\tpublic static UnknownIdentity = { identityId: '00000000-0000-0000-0000-000000000000' }\n\n\tresolve(\n\t\tacl: Acl.Schema,\n\t\tmemberships: readonly Acl.Membership[],\n\t\tidentity: {\n\t\t\tidentityId: string\n\t\t\tpersonId?: string\n\t\t},\n\t\tisAssumed: boolean,\n\t): MembershipReadResult {\n\t\tconst errors: MembershipValidationError[] = []\n\t\tconst parsed: ParsedMembership[] = []\n\t\tconst roles = acl.roles\n\t\tfor (const membership of memberships) {\n\t\t\tif (!roles[membership.role]) {\n\t\t\t\terrors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.ROLE_NOT_FOUND))\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst roleVariables = getRoleVariables(membership.role, acl)\n\t\t\tfor (const variable of membership.variables) {\n\t\t\t\tif (!roleVariables[variable.name] || (!isAssumed && roleVariables[variable.name].type === Acl.VariableType.predefined)) {\n\t\t\t\t\terrors.push(\n\t\t\t\t\t\tnew MembershipValidationError(\n\t\t\t\t\t\t\tmembership.role,\n\t\t\t\t\t\t\tMembershipValidationErrorType.VARIABLE_NOT_FOUND,\n\t\t\t\t\t\t\tvariable.name,\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst [membershipErrors, parsedVariables] = this.readMembershipVariables(roleVariables, membership, identity, isAssumed)\n\t\t\terrors.push(...membershipErrors)\n\t\t\tparsed.push({\n\t\t\t\trole: membership.role,\n\t\t\t\tvariables: parsedVariables,\n\t\t\t})\n\t\t}\n\t\treturn new MembershipReadResult(errors, parsed)\n\t}\n\n\tprivate readMembershipVariables(roleVariables: Acl.Variables, membership: Acl.Membership, identity: {\n\t\tidentityId: string\n\t\tpersonId?: string\n\t}, isAssumed: boolean): [MembershipValidationError[], ParsedMembershipVariable[]] {\n\t\tconst errors: MembershipValidationError[] = []\n\t\tconst parsedVariables: ParsedMembershipVariable[] = []\n\t\tfor (const [name, variable] of Object.entries(roleVariables)) {\n\t\t\tconst inputVariable = membership.variables.find(it => it.name === name)\n\t\t\tif (variable.type === Acl.VariableType.predefined) {\n\t\t\t\tswitch (variable.value) {\n\t\t\t\t\tcase 'identityID':\n\t\t\t\t\t\tparsedVariables.push({\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tcondition: { in: isAssumed && inputVariable ? inputVariable.values : [identity.identityId] },\n\t\t\t\t\t\t})\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'personID':\n\t\t\t\t\t\tparsedVariables.push({\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tcondition: { in: isAssumed && inputVariable ? inputVariable.values : identity.personId ? [identity.personId] : [] },\n\t\t\t\t\t\t})\n\t\t\t\t\t\tbreak\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tparsedVariables.push({ name, condition: { never: true } })\n\t\t\t\t\t\terrors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.VARIABLE_INVALID, name))\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (!inputVariable) {\n\t\t\t\tif (variable.fallback) {\n\t\t\t\t\tparsedVariables.push({ name, condition: variable.fallback })\n\t\t\t\t} else {\n\t\t\t\t\terrors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.VARIABLE_EMPTY, name))\n\t\t\t\t\tparsedVariables.push({ name, condition: { never: true } })\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (variable.type === Acl.VariableType.entity) {\n\t\t\t\tparsedVariables.push({ name, condition: { in: inputVariable.values } }) // todo: cast to int where primary is int\n\t\t\t} else if (variable.type === Acl.VariableType.condition) {\n\t\t\t\ttry {\n\t\t\t\t\tconst conditions = inputVariable.values.map(it => conditionSchema()(JSON.parse(it)))\n\t\t\t\t\tparsedVariables.push({\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tcondition: conditions.length === 1 ? conditions[0] : { or: conditions },\n\t\t\t\t\t})\n\t\t\t\t} catch {\n\t\t\t\t\terrors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.VARIABLE_INVALID, name))\n\t\t\t\t\tparsedVariables.push({ name, condition: { never: true } })\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tassertNever(variable)\n\t\t\t}\n\t\t}\n\t\treturn [errors, parsedVariables]\n\t}\n}\n\nexport class MembershipReadResult {\n\tconstructor(\n\t\tpublic readonly errors: MembershipValidationError[],\n\t\tpublic readonly memberships: ParsedMembership[],\n\t) {\n\t}\n}\n\nexport class MembershipValidationError {\n\tconstructor(\n\t\tpublic readonly role: string,\n\t\tpublic readonly error: MembershipValidationErrorType,\n\t\tpublic readonly variable?: string,\n\t) {\n\t}\n}\n\nexport enum MembershipValidationErrorType {\n\tROLE_NOT_FOUND = 'roleNotFound',\n\tVARIABLE_NOT_FOUND = 'variableNotFound',\n\tVARIABLE_EMPTY = 'variableEmpty',\n\tVARIABLE_INVALID = 'variableInvalid',\n}\n\nexport interface ParsedMembershipVariable {\n\treadonly name: string\n\treadonly condition: Input.Condition\n}\n\nexport interface ParsedMembership {\n\treadonly role: string\n\treadonly variables: readonly ParsedMembershipVariable[]\n}\n"],"names":["getRoleVariables","Acl","conditionSchema","assertNever","MembershipValidationErrorType"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"MembershipResolver.js","sources":["../../../../../packages/schema-utils/src/validation/MembershipResolver.ts"],"sourcesContent":["import { Acl, Input } from '@contember/schema'\nimport { getRoleVariables } from '../acl'\nimport { conditionSchema } from '../type-schema'\nimport { assertNever } from '../utils'\n\nexport class MembershipResolver {\n\tpublic static UnknownIdentity = { identityId: '00000000-0000-0000-0000-000000000000' }\n\n\tresolve(\n\t\tacl: Acl.Schema,\n\t\tmemberships: readonly Acl.Membership[],\n\t\tidentity: {\n\t\t\tidentityId: string\n\t\t\tpersonId?: string\n\t\t},\n\t\tisAssumed: boolean,\n\t): MembershipReadResult {\n\t\tconst errors: MembershipValidationError[] = []\n\t\tconst parsed: ParsedMembership[] = []\n\t\tconst roles = acl.roles\n\t\tfor (const membership of memberships) {\n\t\t\tif (!roles[membership.role]) {\n\t\t\t\terrors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.ROLE_NOT_FOUND))\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst roleVariables = getRoleVariables(membership.role, acl)\n\t\t\tfor (const variable of membership.variables) {\n\t\t\t\tif (!roleVariables[variable.name] || (!isAssumed && roleVariables[variable.name].type === Acl.VariableType.predefined)) {\n\t\t\t\t\terrors.push(\n\t\t\t\t\t\tnew MembershipValidationError(\n\t\t\t\t\t\t\tmembership.role,\n\t\t\t\t\t\t\tMembershipValidationErrorType.VARIABLE_NOT_FOUND,\n\t\t\t\t\t\t\tvariable.name,\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst [membershipErrors, parsedVariables] = this.readMembershipVariables(roleVariables, membership, identity, isAssumed)\n\t\t\terrors.push(...membershipErrors)\n\t\t\tparsed.push({\n\t\t\t\trole: membership.role,\n\t\t\t\tvariables: parsedVariables,\n\t\t\t})\n\t\t}\n\t\treturn new MembershipReadResult(errors, parsed)\n\t}\n\n\tprivate readMembershipVariables(roleVariables: Acl.Variables, membership: Acl.Membership, identity: {\n\t\tidentityId: string\n\t\tpersonId?: string\n\t}, isAssumed: boolean): [MembershipValidationError[], ParsedMembershipVariable[]] {\n\t\tconst errors: MembershipValidationError[] = []\n\t\tconst parsedVariables: ParsedMembershipVariable[] = []\n\t\tfor (const [name, variable] of Object.entries(roleVariables)) {\n\t\t\tconst inputVariable = membership.variables.find(it => it.name === name)\n\t\t\tif (variable.type === Acl.VariableType.predefined) {\n\t\t\t\tswitch (variable.value) {\n\t\t\t\t\tcase 'identityID':\n\t\t\t\t\t\tparsedVariables.push({\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tcondition: { in: isAssumed && inputVariable ? inputVariable.values : [identity.identityId] },\n\t\t\t\t\t\t})\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'personID':\n\t\t\t\t\t\tparsedVariables.push({\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tcondition: { in: isAssumed && inputVariable ? inputVariable.values : identity.personId ? [identity.personId] : [] },\n\t\t\t\t\t\t})\n\t\t\t\t\t\tbreak\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tparsedVariables.push({ name, condition: { never: true } })\n\t\t\t\t\t\terrors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.VARIABLE_INVALID, name))\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (!inputVariable) {\n\t\t\t\tif (variable.fallback) {\n\t\t\t\t\tparsedVariables.push({ name, condition: variable.fallback })\n\t\t\t\t} else {\n\t\t\t\t\terrors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.VARIABLE_EMPTY, name))\n\t\t\t\t\tparsedVariables.push({ name, condition: { never: true } })\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (variable.type === Acl.VariableType.entity) {\n\t\t\t\tparsedVariables.push({ name, condition: { in: inputVariable.values } }) // todo: cast to int where primary is int\n\t\t\t} else if (variable.type === Acl.VariableType.condition) {\n\t\t\t\ttry {\n\t\t\t\t\tconst conditions = inputVariable.values.map(it => conditionSchema()(JSON.parse(it)))\n\t\t\t\t\tparsedVariables.push({\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tcondition: conditions.length === 1 ? conditions[0] : { or: conditions },\n\t\t\t\t\t})\n\t\t\t\t} catch {\n\t\t\t\t\terrors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.VARIABLE_INVALID, name))\n\t\t\t\t\tparsedVariables.push({ name, condition: { never: true } })\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tassertNever(variable)\n\t\t\t}\n\t\t}\n\t\treturn [errors, parsedVariables]\n\t}\n}\n\nexport class MembershipReadResult {\n\tconstructor(\n\t\tpublic readonly errors: MembershipValidationError[],\n\t\tpublic readonly memberships: ParsedMembership[],\n\t) {\n\t}\n}\n\nexport class MembershipValidationError {\n\tconstructor(\n\t\tpublic readonly role: string,\n\t\tpublic readonly error: MembershipValidationErrorType,\n\t\tpublic readonly variable?: string,\n\t) {\n\t}\n}\n\nexport enum MembershipValidationErrorType {\n\tROLE_NOT_FOUND = 'roleNotFound',\n\tVARIABLE_NOT_FOUND = 'variableNotFound',\n\tVARIABLE_EMPTY = 'variableEmpty',\n\tVARIABLE_INVALID = 'variableInvalid',\n}\n\nexport interface ParsedMembershipVariable {\n\treadonly name: string\n\treadonly condition: Input.Condition\n}\n\nexport interface ParsedMembership {\n\treadonly role: string\n\treadonly variables: readonly ParsedMembershipVariable[]\n}\n"],"names":["MembershipValidationErrorType"],"mappings":"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"}
1
+ {"version":3,"file":"MembershipResolver.js","sources":["../../../../../packages/schema-utils/src/validation/MembershipResolver.ts"],"sourcesContent":["import { Acl, Input } from '@contember/schema'\nimport { getRoleVariables } from '../acl/index.js'\nimport { conditionSchema } from '../type-schema/index.js'\nimport { assertNever } from '../utils/index.js'\n\nexport class MembershipResolver {\n\tpublic static UnknownIdentity = { identityId: '00000000-0000-0000-0000-000000000000' }\n\n\tresolve(\n\t\tacl: Acl.Schema,\n\t\tmemberships: readonly Acl.Membership[],\n\t\tidentity: {\n\t\t\tidentityId: string\n\t\t\tpersonId?: string\n\t\t},\n\t\tisAssumed: boolean,\n\t): MembershipReadResult {\n\t\tconst errors: MembershipValidationError[] = []\n\t\tconst parsed: ParsedMembership[] = []\n\t\tconst roles = acl.roles\n\t\tfor (const membership of memberships) {\n\t\t\tif (!roles[membership.role]) {\n\t\t\t\terrors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.ROLE_NOT_FOUND))\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tconst roleVariables = getRoleVariables(membership.role, acl)\n\t\t\tfor (const variable of membership.variables) {\n\t\t\t\tif (!roleVariables[variable.name] || (!isAssumed && roleVariables[variable.name].type === Acl.VariableType.predefined)) {\n\t\t\t\t\terrors.push(\n\t\t\t\t\t\tnew MembershipValidationError(\n\t\t\t\t\t\t\tmembership.role,\n\t\t\t\t\t\t\tMembershipValidationErrorType.VARIABLE_NOT_FOUND,\n\t\t\t\t\t\t\tvariable.name,\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst [membershipErrors, parsedVariables] = this.readMembershipVariables(roleVariables, membership, identity, isAssumed)\n\t\t\terrors.push(...membershipErrors)\n\t\t\tparsed.push({\n\t\t\t\trole: membership.role,\n\t\t\t\tvariables: parsedVariables,\n\t\t\t})\n\t\t}\n\t\treturn new MembershipReadResult(errors, parsed)\n\t}\n\n\tprivate readMembershipVariables(roleVariables: Acl.Variables, membership: Acl.Membership, identity: {\n\t\tidentityId: string\n\t\tpersonId?: string\n\t}, isAssumed: boolean): [MembershipValidationError[], ParsedMembershipVariable[]] {\n\t\tconst errors: MembershipValidationError[] = []\n\t\tconst parsedVariables: ParsedMembershipVariable[] = []\n\t\tfor (const [name, variable] of Object.entries(roleVariables)) {\n\t\t\tconst inputVariable = membership.variables.find(it => it.name === name)\n\t\t\tif (variable.type === Acl.VariableType.predefined) {\n\t\t\t\tswitch (variable.value) {\n\t\t\t\t\tcase 'identityID':\n\t\t\t\t\t\tparsedVariables.push({\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tcondition: { in: isAssumed && inputVariable ? inputVariable.values : [identity.identityId] },\n\t\t\t\t\t\t})\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'personID':\n\t\t\t\t\t\tparsedVariables.push({\n\t\t\t\t\t\t\tname,\n\t\t\t\t\t\t\tcondition: { in: isAssumed && inputVariable ? inputVariable.values : identity.personId ? [identity.personId] : [] },\n\t\t\t\t\t\t})\n\t\t\t\t\t\tbreak\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tparsedVariables.push({ name, condition: { never: true } })\n\t\t\t\t\t\terrors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.VARIABLE_INVALID, name))\n\t\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (!inputVariable) {\n\t\t\t\tif (variable.fallback) {\n\t\t\t\t\tparsedVariables.push({ name, condition: variable.fallback })\n\t\t\t\t} else {\n\t\t\t\t\terrors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.VARIABLE_EMPTY, name))\n\t\t\t\t\tparsedVariables.push({ name, condition: { never: true } })\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (variable.type === Acl.VariableType.entity) {\n\t\t\t\tparsedVariables.push({ name, condition: { in: inputVariable.values } }) // todo: cast to int where primary is int\n\t\t\t} else if (variable.type === Acl.VariableType.condition) {\n\t\t\t\ttry {\n\t\t\t\t\tconst conditions = inputVariable.values.map(it => conditionSchema()(JSON.parse(it)))\n\t\t\t\t\tparsedVariables.push({\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tcondition: conditions.length === 1 ? conditions[0] : { or: conditions },\n\t\t\t\t\t})\n\t\t\t\t} catch {\n\t\t\t\t\terrors.push(new MembershipValidationError(membership.role, MembershipValidationErrorType.VARIABLE_INVALID, name))\n\t\t\t\t\tparsedVariables.push({ name, condition: { never: true } })\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tassertNever(variable)\n\t\t\t}\n\t\t}\n\t\treturn [errors, parsedVariables]\n\t}\n}\n\nexport class MembershipReadResult {\n\tconstructor(\n\t\tpublic readonly errors: MembershipValidationError[],\n\t\tpublic readonly memberships: ParsedMembership[],\n\t) {\n\t}\n}\n\nexport class MembershipValidationError {\n\tconstructor(\n\t\tpublic readonly role: string,\n\t\tpublic readonly error: MembershipValidationErrorType,\n\t\tpublic readonly variable?: string,\n\t) {\n\t}\n}\n\nexport enum MembershipValidationErrorType {\n\tROLE_NOT_FOUND = 'roleNotFound',\n\tVARIABLE_NOT_FOUND = 'variableNotFound',\n\tVARIABLE_EMPTY = 'variableEmpty',\n\tVARIABLE_INVALID = 'variableInvalid',\n}\n\nexport interface ParsedMembershipVariable {\n\treadonly name: string\n\treadonly condition: Input.Condition\n}\n\nexport interface ParsedMembership {\n\treadonly role: string\n\treadonly variables: readonly ParsedMembershipVariable[]\n}\n"],"names":["MembershipValidationErrorType"],"mappings":";;;;;;;;;;;AAKO,MAAM,mBAAmB;AAAA,EAG/B,QACC,KACA,aACA,UAIA,WACuB;AACvB,UAAM,SAAsC,CAAA;AAC5C,UAAM,SAA6B,CAAA;AACnC,UAAM,QAAQ,IAAI;AAClB,eAAW,cAAc,aAAa;AACrC,UAAI,CAAC,MAAM,WAAW,IAAI,GAAG;AAC5B,eAAO,KAAK,IAAI;AAAA,UAA0B,WAAW;AAAA,UAAM;AAAA;AAAA,SAA6C;AACxG;AAAA,MACD;AACA,YAAM,gBAAgB,iBAAiB,WAAW,MAAM,GAAG;AAC3D,iBAAW,YAAY,WAAW,WAAW;AAC5C,YAAI,CAAC,cAAc,SAAS,IAAI,KAAM,CAAC,aAAa,cAAc,SAAS,IAAI,EAAE,SAAS,IAAI,aAAa,YAAa;AACvH,iBAAO;AAAA,YACN,IAAI;AAAA,cACH,WAAW;AAAA,cACX;AAAA,cACA,SAAS;AAAA,YAAA;AAAA,UACV;AAAA,QAEF;AAAA,MACD;AACA,YAAM,CAAC,kBAAkB,eAAe,IAAI,KAAK,wBAAwB,eAAe,YAAY,UAAU,SAAS;AACvH,aAAO,KAAK,GAAG,gBAAgB;AAC/B,aAAO,KAAK;AAAA,QACX,MAAM,WAAW;AAAA,QACjB,WAAW;AAAA,MAAA,CACX;AAAA,IACF;AACA,WAAO,IAAI,qBAAqB,QAAQ,MAAM;AAAA,EAC/C;AAAA,EAEQ,wBAAwB,eAA8B,YAA4B,UAGvF,WAA+E;AACjF,UAAM,SAAsC,CAAA;AAC5C,UAAM,kBAA8C,CAAA;AACpD,eAAW,CAAC,MAAM,QAAQ,KAAK,OAAO,QAAQ,aAAa,GAAG;AAC7D,YAAM,gBAAgB,WAAW,UAAU,KAAK,CAAA,OAAM,GAAG,SAAS,IAAI;AACtE,UAAI,SAAS,SAAS,IAAI,aAAa,YAAY;AAClD,gBAAQ,SAAS,OAAA;AAAA,UAChB,KAAK;AACJ,4BAAgB,KAAK;AAAA,cACpB;AAAA,cACA,WAAW,EAAE,IAAI,aAAa,gBAAgB,cAAc,SAAS,CAAC,SAAS,UAAU,EAAA;AAAA,YAAE,CAC3F;AACD;AAAA,UACD,KAAK;AACJ,4BAAgB,KAAK;AAAA,cACpB;AAAA,cACA,WAAW,EAAE,IAAI,aAAa,gBAAgB,cAAc,SAAS,SAAS,WAAW,CAAC,SAAS,QAAQ,IAAI,CAAA,EAAC;AAAA,YAAE,CAClH;AACD;AAAA,UACD;AACC,4BAAgB,KAAK,EAAE,MAAM,WAAW,EAAE,OAAO,KAAA,GAAQ;AACzD,mBAAO,KAAK,IAAI,0BAA0B,WAAW,MAAM,mBAAgD,IAAI,CAAC;AAChH;AAAA,QAAA;AAEF;AAAA,MACD;AAEA,UAAI,CAAC,eAAe;AACnB,YAAI,SAAS,UAAU;AACtB,0BAAgB,KAAK,EAAE,MAAM,WAAW,SAAS,UAAU;AAAA,QAC5D,OAAO;AACN,iBAAO,KAAK,IAAI,0BAA0B,WAAW,MAAM,iBAA8C,IAAI,CAAC;AAC9G,0BAAgB,KAAK,EAAE,MAAM,WAAW,EAAE,OAAO,KAAA,GAAQ;AAAA,QAC1D;AACA;AAAA,MACD;AAEA,UAAI,SAAS,SAAS,IAAI,aAAa,QAAQ;AAC9C,wBAAgB,KAAK,EAAE,MAAM,WAAW,EAAE,IAAI,cAAc,OAAA,GAAU;AAAA,MACvE,WAAW,SAAS,SAAS,IAAI,aAAa,WAAW;AACxD,YAAI;AACH,gBAAM,aAAa,cAAc,OAAO,IAAI,CAAA,OAAM,gBAAA,EAAkB,KAAK,MAAM,EAAE,CAAC,CAAC;AACnF,0BAAgB,KAAK;AAAA,YACpB;AAAA,YACA,WAAW,WAAW,WAAW,IAAI,WAAW,CAAC,IAAI,EAAE,IAAI,WAAA;AAAA,UAAW,CACtE;AAAA,QACF,QAAQ;AACP,iBAAO,KAAK,IAAI,0BAA0B,WAAW,MAAM,mBAAgD,IAAI,CAAC;AAChH,0BAAgB,KAAK,EAAE,MAAM,WAAW,EAAE,OAAO,KAAA,GAAQ;AAAA,QAC1D;AAAA,MACD,OAAO;AACN,oBAAoB;AAAA,MACrB;AAAA,IACD;AACA,WAAO,CAAC,QAAQ,eAAe;AAAA,EAChC;AACD;AApGC,cADY,oBACE,mBAAkB,EAAE,YAAY,uCAAA,CAAuC;AAsG/E,MAAM,qBAAqB;AAAA,EACjC,YACiB,QACA,aACf;AAFe,SAAA,SAAA;AACA,SAAA,cAAA;AAAA,EAEjB;AACD;AAEO,MAAM,0BAA0B;AAAA,EACtC,YACiB,MACA,OACA,UACf;AAHe,SAAA,OAAA;AACA,SAAA,QAAA;AACA,SAAA,WAAA;AAAA,EAEjB;AACD;AAEO,IAAK,kDAAAA,mCAAL;AACNA,iCAAA,gBAAA,IAAiB;AACjBA,iCAAA,oBAAA,IAAqB;AACrBA,iCAAA,gBAAA,IAAiB;AACjBA,iCAAA,kBAAA,IAAmB;AAJR,SAAAA;AAAA,GAAA,iCAAA,CAAA,CAAA;"}