@contember/schema-definition 2.1.0-alpha.1 → 2.1.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 (140) hide show
  1. package/dist/development/src/acl/definition/aclExtensions.cjs +16 -0
  2. package/dist/development/src/acl/definition/aclExtensions.cjs.map +1 -0
  3. package/dist/development/src/acl/definition/aclExtensions.js +16 -0
  4. package/dist/development/src/acl/definition/aclExtensions.js.map +1 -0
  5. package/dist/development/src/acl/definition/customPrimary.cjs +6 -7
  6. package/dist/development/src/acl/definition/customPrimary.cjs.map +1 -1
  7. package/dist/development/src/acl/definition/customPrimary.js +6 -7
  8. package/dist/development/src/acl/definition/customPrimary.js.map +1 -1
  9. package/dist/development/src/acl/definition/internal/AclFactory.cjs +39 -39
  10. package/dist/development/src/acl/definition/internal/AclFactory.cjs.map +1 -1
  11. package/dist/development/src/acl/definition/internal/AclFactory.js +40 -40
  12. package/dist/development/src/acl/definition/internal/AclFactory.js.map +1 -1
  13. package/dist/development/src/acl/definition/internal/stores.cjs +0 -4
  14. package/dist/development/src/acl/definition/internal/stores.cjs.map +1 -1
  15. package/dist/development/src/acl/definition/internal/stores.js +0 -4
  16. package/dist/development/src/acl/definition/internal/stores.js.map +1 -1
  17. package/dist/development/src/createSchema.cjs +4 -1
  18. package/dist/development/src/createSchema.cjs.map +1 -1
  19. package/dist/development/src/createSchema.js +4 -1
  20. package/dist/development/src/createSchema.js.map +1 -1
  21. package/dist/development/src/model/builder/SchemaBuilderInternal.cjs.map +1 -1
  22. package/dist/development/src/model/builder/SchemaBuilderInternal.js.map +1 -1
  23. package/dist/development/src/model/definition/UniqueDefinition.cjs.map +1 -1
  24. package/dist/development/src/model/definition/UniqueDefinition.js.map +1 -1
  25. package/dist/development/src/model/definition/ViewDefinition.cjs +4 -2
  26. package/dist/development/src/model/definition/ViewDefinition.cjs.map +1 -1
  27. package/dist/development/src/model/definition/ViewDefinition.js +4 -2
  28. package/dist/development/src/model/definition/ViewDefinition.js.map +1 -1
  29. package/dist/development/src/model/definition/fieldDefinitions/ColumnDefinition.cjs +10 -3
  30. package/dist/development/src/model/definition/fieldDefinitions/ColumnDefinition.cjs.map +1 -1
  31. package/dist/development/src/model/definition/fieldDefinitions/ColumnDefinition.js +10 -3
  32. package/dist/development/src/model/definition/fieldDefinitions/ColumnDefinition.js.map +1 -1
  33. package/dist/development/src/model/definition/index.cjs +2 -1
  34. package/dist/development/src/model/definition/index.cjs.map +1 -1
  35. package/dist/development/src/model/definition/index.js +2 -1
  36. package/dist/development/src/model/definition/index.js.map +1 -1
  37. package/dist/development/src/model/definition/internal/SchemaBuilder.cjs +6 -3
  38. package/dist/development/src/model/definition/internal/SchemaBuilder.cjs.map +1 -1
  39. package/dist/development/src/model/definition/internal/SchemaBuilder.js +6 -3
  40. package/dist/development/src/model/definition/internal/SchemaBuilder.js.map +1 -1
  41. package/dist/production/src/acl/definition/aclExtensions.cjs +16 -0
  42. package/dist/production/src/acl/definition/aclExtensions.cjs.map +1 -0
  43. package/dist/production/src/acl/definition/aclExtensions.js +16 -0
  44. package/dist/production/src/acl/definition/aclExtensions.js.map +1 -0
  45. package/dist/production/src/acl/definition/customPrimary.cjs +6 -7
  46. package/dist/production/src/acl/definition/customPrimary.cjs.map +1 -1
  47. package/dist/production/src/acl/definition/customPrimary.js +6 -7
  48. package/dist/production/src/acl/definition/customPrimary.js.map +1 -1
  49. package/dist/production/src/acl/definition/internal/AclFactory.cjs +39 -39
  50. package/dist/production/src/acl/definition/internal/AclFactory.cjs.map +1 -1
  51. package/dist/production/src/acl/definition/internal/AclFactory.js +40 -40
  52. package/dist/production/src/acl/definition/internal/AclFactory.js.map +1 -1
  53. package/dist/production/src/acl/definition/internal/stores.cjs +0 -4
  54. package/dist/production/src/acl/definition/internal/stores.cjs.map +1 -1
  55. package/dist/production/src/acl/definition/internal/stores.js +0 -4
  56. package/dist/production/src/acl/definition/internal/stores.js.map +1 -1
  57. package/dist/production/src/createSchema.cjs +4 -1
  58. package/dist/production/src/createSchema.cjs.map +1 -1
  59. package/dist/production/src/createSchema.js +4 -1
  60. package/dist/production/src/createSchema.js.map +1 -1
  61. package/dist/production/src/model/builder/SchemaBuilderInternal.cjs.map +1 -1
  62. package/dist/production/src/model/builder/SchemaBuilderInternal.js.map +1 -1
  63. package/dist/production/src/model/definition/UniqueDefinition.cjs.map +1 -1
  64. package/dist/production/src/model/definition/UniqueDefinition.js.map +1 -1
  65. package/dist/production/src/model/definition/ViewDefinition.cjs +4 -2
  66. package/dist/production/src/model/definition/ViewDefinition.cjs.map +1 -1
  67. package/dist/production/src/model/definition/ViewDefinition.js +4 -2
  68. package/dist/production/src/model/definition/ViewDefinition.js.map +1 -1
  69. package/dist/production/src/model/definition/fieldDefinitions/ColumnDefinition.cjs +10 -3
  70. package/dist/production/src/model/definition/fieldDefinitions/ColumnDefinition.cjs.map +1 -1
  71. package/dist/production/src/model/definition/fieldDefinitions/ColumnDefinition.js +10 -3
  72. package/dist/production/src/model/definition/fieldDefinitions/ColumnDefinition.js.map +1 -1
  73. package/dist/production/src/model/definition/index.cjs +2 -1
  74. package/dist/production/src/model/definition/index.cjs.map +1 -1
  75. package/dist/production/src/model/definition/index.js +2 -1
  76. package/dist/production/src/model/definition/index.js.map +1 -1
  77. package/dist/production/src/model/definition/internal/SchemaBuilder.cjs +6 -3
  78. package/dist/production/src/model/definition/internal/SchemaBuilder.cjs.map +1 -1
  79. package/dist/production/src/model/definition/internal/SchemaBuilder.js +6 -3
  80. package/dist/production/src/model/definition/internal/SchemaBuilder.js.map +1 -1
  81. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  82. package/dist/types/acl/builder/PermissionsBuilder.d.ts.map +1 -1
  83. package/dist/types/acl/builder/PredicateReference.d.ts.map +1 -1
  84. package/dist/types/acl/definition/aclExtensions.d.ts +12 -0
  85. package/dist/types/acl/definition/aclExtensions.d.ts.map +1 -0
  86. package/dist/types/acl/definition/customPrimary.d.ts.map +1 -1
  87. package/dist/types/acl/definition/index.d.ts.map +1 -1
  88. package/dist/types/acl/definition/internal/AclFactory.d.ts +1 -1
  89. package/dist/types/acl/definition/internal/AclFactory.d.ts.map +1 -1
  90. package/dist/types/acl/definition/internal/createPredicateName.d.ts.map +1 -1
  91. package/dist/types/acl/definition/internal/stores.d.ts +0 -2
  92. package/dist/types/acl/definition/internal/stores.d.ts.map +1 -1
  93. package/dist/types/acl/definition/permissions.d.ts.map +1 -1
  94. package/dist/types/acl/definition/references.d.ts.map +1 -1
  95. package/dist/types/acl/definition/roles.d.ts.map +1 -1
  96. package/dist/types/acl/definition/variables.d.ts.map +1 -1
  97. package/dist/types/actions/definition/index.d.ts.map +1 -1
  98. package/dist/types/actions/definition/targets.d.ts.map +1 -1
  99. package/dist/types/actions/definition/triggers.d.ts.map +1 -1
  100. package/dist/types/createSchema.d.ts +2 -1
  101. package/dist/types/createSchema.d.ts.map +1 -1
  102. package/dist/types/index.d.ts +1 -3
  103. package/dist/types/index.d.ts.map +1 -1
  104. package/dist/types/model/definition/UniqueDefinition.d.ts +6 -1
  105. package/dist/types/model/definition/UniqueDefinition.d.ts.map +1 -1
  106. package/dist/types/model/definition/ViewDefinition.d.ts +6 -2
  107. package/dist/types/model/definition/ViewDefinition.d.ts.map +1 -1
  108. package/dist/types/model/definition/context.d.ts +3 -0
  109. package/dist/types/model/definition/context.d.ts.map +1 -1
  110. package/dist/types/model/definition/extensions.d.ts.map +1 -1
  111. package/dist/types/model/definition/fieldDefinitions/ColumnDefinition.d.ts +6 -1
  112. package/dist/types/model/definition/fieldDefinitions/ColumnDefinition.d.ts.map +1 -1
  113. package/dist/types/model/definition/fieldDefinitions/ManyHasManyDefinition.d.ts.map +1 -1
  114. package/dist/types/model/definition/fieldDefinitions/ManyHasManyInverseDefinition.d.ts.map +1 -1
  115. package/dist/types/model/definition/fieldDefinitions/ManyHasOneDefinition.d.ts.map +1 -1
  116. package/dist/types/model/definition/fieldDefinitions/OneHasManyDefinition.d.ts.map +1 -1
  117. package/dist/types/model/definition/fieldDefinitions/OneHasOneDefinition.d.ts.map +1 -1
  118. package/dist/types/model/definition/fieldDefinitions/OneHasOneInverseDefinition.d.ts.map +1 -1
  119. package/dist/types/model/definition/index.d.ts +1 -0
  120. package/dist/types/model/definition/index.d.ts.map +1 -1
  121. package/dist/types/model/definition/internal/SchemaBuilder.d.ts +4 -1
  122. package/dist/types/model/definition/internal/SchemaBuilder.d.ts.map +1 -1
  123. package/dist/types/tsconfig.tsbuildinfo +1 -1
  124. package/dist/types/utils/MetadataStore.d.ts.map +1 -1
  125. package/dist/types/utils/filterEntityDefinition.d.ts.map +1 -1
  126. package/dist/types/utils/tuple.d.ts.map +1 -1
  127. package/dist/types/validation/index.d.ts.map +1 -1
  128. package/package.json +3 -3
  129. package/src/acl/definition/aclExtensions.ts +28 -0
  130. package/src/acl/definition/customPrimary.ts +7 -8
  131. package/src/acl/definition/internal/AclFactory.ts +41 -45
  132. package/src/acl/definition/internal/stores.ts +0 -3
  133. package/src/createSchema.ts +6 -2
  134. package/src/model/builder/SchemaBuilderInternal.ts +1 -1
  135. package/src/model/definition/UniqueDefinition.ts +11 -2
  136. package/src/model/definition/ViewDefinition.ts +10 -1
  137. package/src/model/definition/context.ts +3 -0
  138. package/src/model/definition/fieldDefinitions/ColumnDefinition.ts +12 -2
  139. package/src/model/definition/index.ts +2 -0
  140. package/src/model/definition/internal/SchemaBuilder.ts +6 -1
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const MetadataStore = require("../../utils/MetadataStore.cjs");
4
+ const entityAclExtensionsStore = MetadataStore.createMetadataStore([]);
5
+ const extendEntityAcl = (extension) => {
6
+ return function(cls) {
7
+ entityAclExtensionsStore.update(cls, (current) => [...current, extension]);
8
+ };
9
+ };
10
+ const applyEntityAclExtensions = (cls, args) => entityAclExtensionsStore.get(cls).reduce(
11
+ (permissions, ext) => ext({ ...args, permissions }),
12
+ args.permissions
13
+ );
14
+ exports.applyEntityAclExtensions = applyEntityAclExtensions;
15
+ exports.extendEntityAcl = extendEntityAcl;
16
+ //# sourceMappingURL=aclExtensions.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aclExtensions.cjs","sources":["../../../../../../packages/schema-definition/src/acl/definition/aclExtensions.ts"],"sourcesContent":["import { Acl, Model } from '@contember/schema'\nimport { createMetadataStore, DecoratorFunction, EntityConstructor } from '../../utils'\nimport { Role } from './roles'\n\nexport type EntityAclExtensionArgs =\n\t& {\n\t\tentity: Model.Entity\n\t\trole: Role\n\t\tpermissions: Acl.EntityPermissions\n\t}\n\nconst entityAclExtensionsStore = createMetadataStore<EntityAclExtension[]>([])\n\nexport type EntityAclExtension = (args: EntityAclExtensionArgs) => Acl.EntityPermissions\nexport const extendEntityAcl = <T>(extension: EntityAclExtension): DecoratorFunction<T> => {\n\treturn function (cls: EntityConstructor) {\n\t\tentityAclExtensionsStore.update(cls, current => [...current, extension])\n\t}\n}\n\nexport const applyEntityAclExtensions = (\n\tcls: EntityConstructor,\n\targs: EntityAclExtensionArgs,\n): Acl.EntityPermissions =>\n\tentityAclExtensionsStore.get(cls).reduce(\n\t\t(permissions, ext) => ext({ ...args, permissions }),\n\t\targs.permissions,\n\t)\n"],"names":["createMetadataStore"],"mappings":";;;AAWA,MAAM,2BAA2BA,cAA0C,oBAAA,EAAE;AAGhE,MAAA,kBAAkB,CAAI,cAAwD;AAC1F,SAAO,SAAU,KAAwB;AACxC,6BAAyB,OAAO,KAAK,CAAA,YAAW,CAAC,GAAG,SAAS,SAAS,CAAC;AAAA,EACxE;AACD;AAEO,MAAM,2BAA2B,CACvC,KACA,SAEA,yBAAyB,IAAI,GAAG,EAAE;AAAA,EACjC,CAAC,aAAa,QAAQ,IAAI,EAAE,GAAG,MAAM,aAAa;AAAA,EAClD,KAAK;AACN;;;"}
@@ -0,0 +1,16 @@
1
+ import { createMetadataStore } from "../../utils/MetadataStore.js";
2
+ const entityAclExtensionsStore = createMetadataStore([]);
3
+ const extendEntityAcl = (extension) => {
4
+ return function(cls) {
5
+ entityAclExtensionsStore.update(cls, (current) => [...current, extension]);
6
+ };
7
+ };
8
+ const applyEntityAclExtensions = (cls, args) => entityAclExtensionsStore.get(cls).reduce(
9
+ (permissions, ext) => ext({ ...args, permissions }),
10
+ args.permissions
11
+ );
12
+ export {
13
+ applyEntityAclExtensions,
14
+ extendEntityAcl
15
+ };
16
+ //# sourceMappingURL=aclExtensions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aclExtensions.js","sources":["../../../../../../packages/schema-definition/src/acl/definition/aclExtensions.ts"],"sourcesContent":["import { Acl, Model } from '@contember/schema'\nimport { createMetadataStore, DecoratorFunction, EntityConstructor } from '../../utils'\nimport { Role } from './roles'\n\nexport type EntityAclExtensionArgs =\n\t& {\n\t\tentity: Model.Entity\n\t\trole: Role\n\t\tpermissions: Acl.EntityPermissions\n\t}\n\nconst entityAclExtensionsStore = createMetadataStore<EntityAclExtension[]>([])\n\nexport type EntityAclExtension = (args: EntityAclExtensionArgs) => Acl.EntityPermissions\nexport const extendEntityAcl = <T>(extension: EntityAclExtension): DecoratorFunction<T> => {\n\treturn function (cls: EntityConstructor) {\n\t\tentityAclExtensionsStore.update(cls, current => [...current, extension])\n\t}\n}\n\nexport const applyEntityAclExtensions = (\n\tcls: EntityConstructor,\n\targs: EntityAclExtensionArgs,\n): Acl.EntityPermissions =>\n\tentityAclExtensionsStore.get(cls).reduce(\n\t\t(permissions, ext) => ext({ ...args, permissions }),\n\t\targs.permissions,\n\t)\n"],"names":[],"mappings":";AAWA,MAAM,2BAA2B,oBAA0C,EAAE;AAGhE,MAAA,kBAAkB,CAAI,cAAwD;AAC1F,SAAO,SAAU,KAAwB;AACxC,6BAAyB,OAAO,KAAK,CAAA,YAAW,CAAC,GAAG,SAAS,SAAS,CAAC;AAAA,EACxE;AACD;AAEO,MAAM,2BAA2B,CACvC,KACA,SAEA,yBAAyB,IAAI,GAAG,EAAE;AAAA,EACjC,CAAC,aAAa,QAAQ,IAAI,EAAE,GAAG,MAAM,aAAa;AAAA,EAClD,KAAK;AACN;"}
@@ -1,14 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const stores = require("./internal/stores.cjs");
3
+ const aclExtensions = require("./aclExtensions.cjs");
4
4
  const allowCustomPrimary = (role) => {
5
- return (entity) => {
6
- if (!role) {
7
- stores.allowCustomPrimaryAllRolesStore.update(entity, () => true);
8
- } else {
9
- stores.allowCustomPrimaryStore.update(entity, (val) => [...val, ...Array.isArray(role) ? role : [role]]);
5
+ return aclExtensions.extendEntityAcl(({ permissions, role: currentRole }) => {
6
+ if (!role || role === currentRole || Array.isArray(role) && role.includes(currentRole)) {
7
+ return { ...permissions, operations: { customPrimary: true } };
10
8
  }
11
- };
9
+ return permissions;
10
+ });
12
11
  };
13
12
  exports.allowCustomPrimary = allowCustomPrimary;
14
13
  //# sourceMappingURL=customPrimary.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"customPrimary.cjs","sources":["../../../../../../packages/schema-definition/src/acl/definition/customPrimary.ts"],"sourcesContent":["import { Role } from './roles'\nimport { allowCustomPrimaryAllRolesStore, allowCustomPrimaryStore } from './internal/stores'\nimport { DecoratorFunction, EntityConstructor } from '../../utils'\n\nexport const allowCustomPrimary = (role?: Role | Role[]): DecoratorFunction<any> => {\n\treturn (entity: EntityConstructor) => {\n\t\tif (!role) {\n\t\t\tallowCustomPrimaryAllRolesStore.update(entity, () => true)\n\t\t} else {\n\t\t\tallowCustomPrimaryStore.update(entity, val => [...val, ...(Array.isArray(role) ? role : [role])])\n\t\t}\n\t}\n}\n"],"names":["allowCustomPrimaryAllRolesStore","allowCustomPrimaryStore"],"mappings":";;;AAIa,MAAA,qBAAqB,CAAC,SAAiD;AACnF,SAAO,CAAC,WAA8B;AACrC,QAAI,CAAC,MAAM;AACsBA,aAAAA,gCAAA,OAAO,QAAQ,MAAM,IAAI;AAAA,IAAA,OACnD;AACNC,aAAAA,wBAAwB,OAAO,QAAQ,CAAO,QAAA,CAAC,GAAG,KAAK,GAAI,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI,CAAE,CAAC;AAAA,IAAA;AAAA,EAElG;AACD;;"}
1
+ {"version":3,"file":"customPrimary.cjs","sources":["../../../../../../packages/schema-definition/src/acl/definition/customPrimary.ts"],"sourcesContent":["import { Role } from './roles'\nimport { DecoratorFunction } from '../../utils'\nimport { extendEntityAcl } from './aclExtensions'\n\nexport const allowCustomPrimary = (role?: Role | Role[]): DecoratorFunction<any> => {\n\treturn extendEntityAcl(({ permissions, role: currentRole }) => {\n\t\tif (!role || role === currentRole || (Array.isArray(role) && role.includes(currentRole))) {\n\t\t\treturn { ...permissions, operations: { customPrimary: true } }\n\t\t}\n\t\treturn permissions\n\t})\n}\n"],"names":["extendEntityAcl"],"mappings":";;;AAIa,MAAA,qBAAqB,CAAC,SAAiD;AACnF,SAAOA,8BAAgB,CAAC,EAAE,aAAa,MAAM,kBAAkB;AAC1D,QAAA,CAAC,QAAQ,SAAS,eAAgB,MAAM,QAAQ,IAAI,KAAK,KAAK,SAAS,WAAW,GAAI;AACzF,aAAO,EAAE,GAAG,aAAa,YAAY,EAAE,eAAe,OAAO;AAAA,IAAA;AAEvD,WAAA;AAAA,EAAA,CACP;AACF;;"}
@@ -1,12 +1,11 @@
1
- import { allowCustomPrimaryAllRolesStore, allowCustomPrimaryStore } from "./internal/stores.js";
1
+ import { extendEntityAcl } from "./aclExtensions.js";
2
2
  const allowCustomPrimary = (role) => {
3
- return (entity) => {
4
- if (!role) {
5
- allowCustomPrimaryAllRolesStore.update(entity, () => true);
6
- } else {
7
- allowCustomPrimaryStore.update(entity, (val) => [...val, ...Array.isArray(role) ? role : [role]]);
3
+ return extendEntityAcl(({ permissions, role: currentRole }) => {
4
+ if (!role || role === currentRole || Array.isArray(role) && role.includes(currentRole)) {
5
+ return { ...permissions, operations: { customPrimary: true } };
8
6
  }
9
- };
7
+ return permissions;
8
+ });
10
9
  };
11
10
  export {
12
11
  allowCustomPrimary
@@ -1 +1 @@
1
- {"version":3,"file":"customPrimary.js","sources":["../../../../../../packages/schema-definition/src/acl/definition/customPrimary.ts"],"sourcesContent":["import { Role } from './roles'\nimport { allowCustomPrimaryAllRolesStore, allowCustomPrimaryStore } from './internal/stores'\nimport { DecoratorFunction, EntityConstructor } from '../../utils'\n\nexport const allowCustomPrimary = (role?: Role | Role[]): DecoratorFunction<any> => {\n\treturn (entity: EntityConstructor) => {\n\t\tif (!role) {\n\t\t\tallowCustomPrimaryAllRolesStore.update(entity, () => true)\n\t\t} else {\n\t\t\tallowCustomPrimaryStore.update(entity, val => [...val, ...(Array.isArray(role) ? role : [role])])\n\t\t}\n\t}\n}\n"],"names":[],"mappings":";AAIa,MAAA,qBAAqB,CAAC,SAAiD;AACnF,SAAO,CAAC,WAA8B;AACrC,QAAI,CAAC,MAAM;AACsB,sCAAA,OAAO,QAAQ,MAAM,IAAI;AAAA,IAAA,OACnD;AACN,8BAAwB,OAAO,QAAQ,CAAO,QAAA,CAAC,GAAG,KAAK,GAAI,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI,CAAE,CAAC;AAAA,IAAA;AAAA,EAElG;AACD;"}
1
+ {"version":3,"file":"customPrimary.js","sources":["../../../../../../packages/schema-definition/src/acl/definition/customPrimary.ts"],"sourcesContent":["import { Role } from './roles'\nimport { DecoratorFunction } from '../../utils'\nimport { extendEntityAcl } from './aclExtensions'\n\nexport const allowCustomPrimary = (role?: Role | Role[]): DecoratorFunction<any> => {\n\treturn extendEntityAcl(({ permissions, role: currentRole }) => {\n\t\tif (!role || role === currentRole || (Array.isArray(role) && role.includes(currentRole))) {\n\t\t\treturn { ...permissions, operations: { customPrimary: true } }\n\t\t}\n\t\treturn permissions\n\t})\n}\n"],"names":[],"mappings":";AAIa,MAAA,qBAAqB,CAAC,SAAiD;AACnF,SAAO,gBAAgB,CAAC,EAAE,aAAa,MAAM,kBAAkB;AAC1D,QAAA,CAAC,QAAQ,SAAS,eAAgB,MAAM,QAAQ,IAAI,KAAK,KAAK,SAAS,WAAW,GAAI;AACzF,aAAO,EAAE,GAAG,aAAa,YAAY,EAAE,eAAe,OAAO;AAAA,IAAA;AAEvD,WAAA;AAAA,EAAA,CACP;AACF;"}
@@ -1,12 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const schemaUtils = require("@contember/schema-utils");
4
3
  const EntityPredicateResolver = require("./EntityPredicateResolver.cjs");
5
4
  const stores = require("./stores.cjs");
6
5
  const roles = require("../roles.cjs");
7
6
  const variables = require("../variables.cjs");
8
7
  const filterEntityDefinition = require("../../../utils/filterEntityDefinition.cjs");
9
8
  require("reflect-metadata");
9
+ const aclExtensions = require("../aclExtensions.cjs");
10
10
  class AclFactory {
11
11
  constructor(model) {
12
12
  this.model = model;
@@ -24,49 +24,54 @@ class AclFactory {
24
24
  {
25
25
  ...role.options,
26
26
  stages: role.options.stages ?? "*",
27
- entities: this.createPermissions(rolePermissions),
27
+ entities: this.createPermissions(rolePermissions, Object.fromEntries(entityLikeDefinition), role),
28
28
  variables: this.createVariables(role, variables$1)
29
29
  }
30
30
  ];
31
31
  }))
32
32
  };
33
33
  }
34
- createPermissions(rolePermissions) {
35
- if (!rolePermissions) {
36
- return {};
37
- }
38
- return Object.fromEntries(Array.from(rolePermissions.keys()).map((entityName) => {
39
- const entity = schemaUtils.getEntity(this.model, entityName);
40
- const predicatesResolver = EntityPredicateResolver.EntityPredicatesResolver.create(rolePermissions, this.model, entity);
41
- const entityOperations = {};
42
- const noRootOptions = this.getNoRootOptions(entity, rolePermissions.get(entityName));
43
- if (noRootOptions?.length) {
44
- entityOperations.noRoot = noRootOptions;
34
+ createPermissions(rolePermissions, entityLikeDefinition, role) {
35
+ return Object.fromEntries(Object.values(this.model.entities).map((entity) => {
36
+ const permissions = rolePermissions ? this.createPermissionsFromAllow(rolePermissions, entity) : { predicates: {}, operations: {} };
37
+ const isEmpty = rolePermissions === void 0;
38
+ const withExtensions = aclExtensions.applyEntityAclExtensions(entityLikeDefinition[entity.name], { entity, permissions, role });
39
+ if (isEmpty && withExtensions === permissions) {
40
+ return void 0;
45
41
  }
46
- for (const op of ["create", "update", "read"]) {
47
- const fieldPermissions = {};
48
- for (const field of Object.keys(entity.fields)) {
49
- const predicate = predicatesResolver.createFieldPredicate(op, field, field === entity.primary);
50
- if (predicate !== void 0) {
51
- fieldPermissions[field] = predicate;
52
- }
53
- }
54
- if (Object.keys(fieldPermissions).length > 0) {
55
- entityOperations[op] = fieldPermissions;
42
+ return [
43
+ entity.name,
44
+ withExtensions
45
+ ];
46
+ }).filter((it) => it !== void 0));
47
+ }
48
+ createPermissionsFromAllow(rolePermissions, entity) {
49
+ const predicatesResolver = EntityPredicateResolver.EntityPredicatesResolver.create(rolePermissions, this.model, entity);
50
+ const entityOperations = {};
51
+ const noRootOptions = this.getNoRootOptions(entity, rolePermissions.get(entity.name));
52
+ if (noRootOptions?.length) {
53
+ entityOperations.noRoot = noRootOptions;
54
+ }
55
+ for (const op of ["create", "update", "read"]) {
56
+ const fieldPermissions = {};
57
+ for (const field of Object.keys(entity.fields)) {
58
+ const predicate = predicatesResolver.createFieldPredicate(op, field, field === entity.primary);
59
+ if (predicate !== void 0) {
60
+ fieldPermissions[field] = predicate;
56
61
  }
57
62
  }
58
- const delPredicate = predicatesResolver.createFieldPredicate("delete", "", false);
59
- if (delPredicate !== void 0) {
60
- entityOperations.delete = delPredicate;
61
- }
62
- if (rolePermissions.get(entityName)?.allowCustomPrimary) {
63
- entityOperations.customPrimary = true;
63
+ if (Object.keys(fieldPermissions).length > 0) {
64
+ entityOperations[op] = fieldPermissions;
64
65
  }
65
- return [entityName, {
66
- predicates: predicatesResolver.getUsedPredicates(),
67
- operations: entityOperations
68
- }];
69
- }));
66
+ }
67
+ const delPredicate = predicatesResolver.createFieldPredicate("delete", "", false);
68
+ if (delPredicate !== void 0) {
69
+ entityOperations.delete = delPredicate;
70
+ }
71
+ return {
72
+ predicates: predicatesResolver.getUsedPredicates(),
73
+ operations: entityOperations
74
+ };
70
75
  }
71
76
  getNoRootOptions(entity, permissions) {
72
77
  const allowedRoot = /* @__PURE__ */ new Set();
@@ -99,7 +104,6 @@ class AclFactory {
99
104
  const rolePermissions = groupedPermissions.get(role) ?? /* @__PURE__ */ new Map();
100
105
  groupedPermissions.set(role, rolePermissions);
101
106
  const entityPermissions = rolePermissions.get(name) ?? {
102
- allowCustomPrimary: false,
103
107
  definitions: []
104
108
  };
105
109
  rolePermissions.set(name, entityPermissions);
@@ -113,10 +117,6 @@ class AclFactory {
113
117
  const entityPermissions = initEntityPermissions(role);
114
118
  entityPermissions.definitions.push(definition);
115
119
  }
116
- const rolesWithCustomPrimary = stores.allowCustomPrimaryAllRolesStore.get(entity) ? roles2 : stores.allowCustomPrimaryStore.get(entity);
117
- for (const role of rolesWithCustomPrimary) {
118
- initEntityPermissions(role).allowCustomPrimary = true;
119
- }
120
120
  }
121
121
  return groupedPermissions;
122
122
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AclFactory.cjs","sources":["../../../../../../../packages/schema-definition/src/acl/definition/internal/AclFactory.ts"],"sourcesContent":["import { Acl, Model, Writable } from '@contember/schema'\nimport { getEntity } from '@contember/schema-utils'\n\nimport { EntityPredicatesResolver } from './EntityPredicateResolver'\nimport { AllowDefinition } from '../permissions'\nimport {\n\tallowCustomPrimaryAllRolesStore,\n\tallowCustomPrimaryStore,\n\tallowDefinitionsStore,\n\tEntityPermissionsDefinition,\n} from './stores'\nimport { Role } from '../roles'\nimport { VariableDefinition } from '../variables'\nimport { filterEntityDefinition } from '../../../utils'\n\nexport class AclFactory {\n\tconstructor(\n\t\tprivate model: Model.Schema,\n\t) {\n\t}\n\n\tpublic create(\n\t\texportedDefinitions: Record<string, any>,\n\t): Acl.Schema {\n\t\tconst entityLikeDefinition = filterEntityDefinition(exportedDefinitions)\n\t\tconst roles: Role[] = Object.values(exportedDefinitions).filter(it => it instanceof Role)\n\t\tconst variables: VariableDefinition[] = Object.values(exportedDefinitions).filter(it => it instanceof VariableDefinition)\n\n\t\tconst groupedPermissions = AclFactory.groupPermissions(entityLikeDefinition, roles)\n\n\t\treturn {\n\t\t\troles: Object.fromEntries(roles.map((role): [string, Acl.RolePermissions] => {\n\t\t\t\tconst rolePermissions = groupedPermissions.get(role)\n\t\t\t\treturn [\n\t\t\t\t\trole.name,\n\t\t\t\t\t{\n\t\t\t\t\t\t...role.options,\n\t\t\t\t\t\tstages: role.options.stages ?? '*',\n\t\t\t\t\t\tentities: this.createPermissions(rolePermissions),\n\t\t\t\t\t\tvariables: this.createVariables(role, variables),\n\t\t\t\t\t},\n\t\t\t\t]\n\t\t\t})),\n\t\t}\n\t}\n\n\tprivate createPermissions(rolePermissions: PermissionsByEntity | undefined): Acl.Permissions {\n\t\tif (!rolePermissions) {\n\t\t\treturn {}\n\t\t}\n\t\treturn Object.fromEntries(Array.from(rolePermissions.keys()).map((entityName): [string, Acl.EntityPermissions] => {\n\t\t\tconst entity = getEntity(this.model, entityName)\n\n\t\t\tconst predicatesResolver = EntityPredicatesResolver.create(rolePermissions, this.model, entity)\n\n\t\t\tconst entityOperations: Writable<Acl.EntityOperations> = {\n\t\t\t}\n\t\t\tconst noRootOptions = this.getNoRootOptions(entity, rolePermissions.get(entityName))\n\t\t\tif (noRootOptions?.length) {\n\t\t\t\tentityOperations.noRoot = noRootOptions\n\t\t\t}\n\t\t\tfor (const op of ['create', 'update', 'read'] as const) {\n\t\t\t\tconst fieldPermissions: Writable<Acl.FieldPermissions> = {}\n\t\t\t\tfor (const field of Object.keys(entity.fields)) {\n\t\t\t\t\tconst predicate = predicatesResolver.createFieldPredicate(op, field, field === entity.primary)\n\t\t\t\t\tif (predicate !== undefined) {\n\t\t\t\t\t\tfieldPermissions[field] = predicate\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (Object.keys(fieldPermissions).length > 0) {\n\t\t\t\t\tentityOperations[op] = fieldPermissions\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst delPredicate = predicatesResolver.createFieldPredicate('delete', '', false)\n\t\t\tif (delPredicate !== undefined) {\n\t\t\t\tentityOperations.delete = delPredicate\n\t\t\t}\n\t\t\tif (rolePermissions.get(entityName)?.allowCustomPrimary) {\n\t\t\t\tentityOperations.customPrimary = true\n\t\t\t}\n\t\t\treturn [entityName, {\n\t\t\t\tpredicates: predicatesResolver.getUsedPredicates(),\n\t\t\t\toperations: entityOperations,\n\n\t\t\t}]\n\t\t}))\n\t}\n\n\n\tgetNoRootOptions(entity: Model.Entity, permissions?: EntityPermissions): Acl.EntityOperations['noRoot'] {\n\t\tconst allowedRoot = new Set<Acl.Operation>()\n\t\tconst disallowedRoot = new Set<Acl.Operation>()\n\t\tfor (const def of permissions?.definitions ?? []) {\n\t\t\tconst noRoot = def.through === true\n\t\t\tfor (const op of ['create', 'read', 'update', 'delete'] as const) {\n\t\t\t\tif (def[op]) {\n\t\t\t\t\tconst currentSet = noRoot ? disallowedRoot : allowedRoot\n\t\t\t\t\tcurrentSet.add(op as Acl.Operation)\n\n\t\t\t\t\tconst otherSet = noRoot ? allowedRoot : disallowedRoot\n\n\t\t\t\t\tif (otherSet.has(op as Acl.Operation)) {\n\t\t\t\t\t\tthrow new Error(`Operation ${op} cannot be both allowed and disallowed on root on entity ${entity.name}`)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t\treturn [...disallowedRoot.values()]\n\t}\n\n\tprivate createVariables(role: Role, variables: VariableDefinition[]): Acl.Variables {\n\t\tconst roleVariables = variables.filter(it => it.roles.includes(role))\n\t\treturn Object.fromEntries(roleVariables.map((variable): [string, Acl.Variable] => {\n\t\t\treturn [variable.name, variable.variable]\n\t\t}))\n\t}\n\n\tprivate static groupPermissions(entityLikeDefinition: [string, { new(): any }][], roles: Role[]): PermissionsByRoleAndEntity {\n\t\tconst groupedPermissions: PermissionsByRoleAndEntity = new Map()\n\t\tfor (const [name, entity] of entityLikeDefinition) {\n\t\t\tconst initEntityPermissions = (role: Role): EntityPermissions => {\n\t\t\t\tconst rolePermissions: PermissionsByEntity = groupedPermissions.get(role) ?? new Map()\n\t\t\t\tgroupedPermissions.set(role, rolePermissions)\n\t\t\t\tconst entityPermissions = rolePermissions.get(name) ?? {\n\t\t\t\t\tallowCustomPrimary: false,\n\t\t\t\t\tdefinitions: [],\n\t\t\t\t}\n\t\t\t\trolePermissions.set(name, entityPermissions)\n\t\t\t\treturn entityPermissions\n\t\t\t}\n\t\t\tconst metadata: EntityPermissionsDefinition[] = allowDefinitionsStore.get(entity)\n\t\t\tfor (const { role, ...definition } of metadata) {\n\t\t\t\tif (!roles.includes(role)) {\n\t\t\t\t\tthrow `Role ${role.name} used on entity ${name} is not registered. Have you exported it?`\n\t\t\t\t}\n\t\t\t\tconst entityPermissions = initEntityPermissions(role)\n\t\t\t\tentityPermissions.definitions.push(definition)\n\t\t\t}\n\n\t\t\tconst rolesWithCustomPrimary = allowCustomPrimaryAllRolesStore.get(entity) ? roles : allowCustomPrimaryStore.get(entity)\n\t\t\tfor (const role of rolesWithCustomPrimary) {\n\t\t\t\tinitEntityPermissions(role).allowCustomPrimary = true\n\t\t\t}\n\t\t}\n\n\t\treturn groupedPermissions\n\t}\n}\n\n\nexport type EntityPermissions = { definitions: AllowDefinition<any>[]; allowCustomPrimary: boolean }\nexport type PermissionsByEntity = Map<string, EntityPermissions>\nexport type PermissionsByRoleAndEntity = Map<Role, PermissionsByEntity>\n"],"names":["filterEntityDefinition","roles","Role","variables","VariableDefinition","getEntity","EntityPredicatesResolver","allowDefinitionsStore","allowCustomPrimaryAllRolesStore","allowCustomPrimaryStore"],"mappings":"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"}
1
+ {"version":3,"file":"AclFactory.cjs","sources":["../../../../../../../packages/schema-definition/src/acl/definition/internal/AclFactory.ts"],"sourcesContent":["import { Acl, Model, Writable } from '@contember/schema'\nimport { getEntity } from '@contember/schema-utils'\n\nimport { EntityPredicatesResolver } from './EntityPredicateResolver'\nimport { AllowDefinition } from '../permissions'\nimport {\n\tallowDefinitionsStore,\n\tEntityPermissionsDefinition,\n} from './stores'\nimport { Role } from '../roles'\nimport { VariableDefinition } from '../variables'\nimport { filterEntityDefinition } from '../../../utils'\nimport { applyEntityAclExtensions } from '../aclExtensions'\n\nexport class AclFactory {\n\tconstructor(\n\t\tprivate model: Model.Schema,\n\t) {\n\t}\n\n\tpublic create(\n\t\texportedDefinitions: Record<string, any>,\n\t): Acl.Schema {\n\t\tconst entityLikeDefinition = filterEntityDefinition(exportedDefinitions)\n\t\tconst roles: Role[] = Object.values(exportedDefinitions).filter(it => it instanceof Role)\n\t\tconst variables: VariableDefinition[] = Object.values(exportedDefinitions).filter(it => it instanceof VariableDefinition)\n\n\t\tconst groupedPermissions = AclFactory.groupPermissions(entityLikeDefinition, roles)\n\n\t\treturn {\n\t\t\troles: Object.fromEntries(roles.map((role): [string, Acl.RolePermissions] => {\n\t\t\t\tconst rolePermissions = groupedPermissions.get(role)\n\t\t\t\treturn [\n\t\t\t\t\trole.name,\n\t\t\t\t\t{\n\t\t\t\t\t\t...role.options,\n\t\t\t\t\t\tstages: role.options.stages ?? '*',\n\t\t\t\t\t\tentities: this.createPermissions(rolePermissions, Object.fromEntries(entityLikeDefinition), role),\n\t\t\t\t\t\tvariables: this.createVariables(role, variables),\n\t\t\t\t\t},\n\t\t\t\t]\n\t\t\t})),\n\t\t}\n\t}\n\n\tprivate createPermissions(rolePermissions: PermissionsByEntity | undefined, entityLikeDefinition: Record<string, { new(): any }>, role: Role): Acl.Permissions {\n\t\treturn Object.fromEntries(Object.values(this.model.entities).map((entity): [string, Acl.EntityPermissions] | undefined => {\n\t\t\tconst permissions = rolePermissions ? this.createPermissionsFromAllow(rolePermissions, entity) : { predicates: {}, operations: {} }\n\t\t\tconst isEmpty = rolePermissions === undefined\n\t\t\tconst withExtensions = applyEntityAclExtensions(entityLikeDefinition[entity.name], { entity, permissions, role })\n\t\t\tif (isEmpty && withExtensions === permissions) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\treturn [\n\t\t\t\tentity.name,\n\t\t\t\twithExtensions,\n\t\t\t]\n\t\t}).filter(<T>(it: T | undefined): it is T => it !== undefined))\n\t}\n\n\tprivate createPermissionsFromAllow(rolePermissions: PermissionsByEntity, entity: Model.Entity): Acl.EntityPermissions {\n\t\tconst predicatesResolver = EntityPredicatesResolver.create(rolePermissions, this.model, entity)\n\n\t\tconst entityOperations: Writable<Acl.EntityOperations> = {}\n\t\tconst noRootOptions = this.getNoRootOptions(entity, rolePermissions.get(entity.name))\n\t\tif (noRootOptions?.length) {\n\t\t\tentityOperations.noRoot = noRootOptions\n\t\t}\n\t\tfor (const op of ['create', 'update', 'read'] as const) {\n\t\t\tconst fieldPermissions: Writable<Acl.FieldPermissions> = {}\n\t\t\tfor (const field of Object.keys(entity.fields)) {\n\t\t\t\tconst predicate = predicatesResolver.createFieldPredicate(op, field, field === entity.primary)\n\t\t\t\tif (predicate !== undefined) {\n\t\t\t\t\tfieldPermissions[field] = predicate\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (Object.keys(fieldPermissions).length > 0) {\n\t\t\t\tentityOperations[op] = fieldPermissions\n\t\t\t}\n\t\t}\n\t\tconst delPredicate = predicatesResolver.createFieldPredicate('delete', '', false)\n\t\tif (delPredicate !== undefined) {\n\t\t\tentityOperations.delete = delPredicate\n\t\t}\n\t\treturn {\n\t\t\tpredicates: predicatesResolver.getUsedPredicates(),\n\t\t\toperations: entityOperations,\n\t\t}\n\t}\n\n\n\tgetNoRootOptions(entity: Model.Entity, permissions?: EntityPermissions): Acl.EntityOperations['noRoot'] {\n\t\tconst allowedRoot = new Set<Acl.Operation>()\n\t\tconst disallowedRoot = new Set<Acl.Operation>()\n\t\tfor (const def of permissions?.definitions ?? []) {\n\t\t\tconst noRoot = def.through === true\n\t\t\tfor (const op of ['create', 'read', 'update', 'delete'] as const) {\n\t\t\t\tif (def[op]) {\n\t\t\t\t\tconst currentSet = noRoot ? disallowedRoot : allowedRoot\n\t\t\t\t\tcurrentSet.add(op as Acl.Operation)\n\n\t\t\t\t\tconst otherSet = noRoot ? allowedRoot : disallowedRoot\n\n\t\t\t\t\tif (otherSet.has(op as Acl.Operation)) {\n\t\t\t\t\t\tthrow new Error(`Operation ${op} cannot be both allowed and disallowed on root on entity ${entity.name}`)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t\treturn [...disallowedRoot.values()]\n\t}\n\n\tprivate createVariables(role: Role, variables: VariableDefinition[]): Acl.Variables {\n\t\tconst roleVariables = variables.filter(it => it.roles.includes(role))\n\t\treturn Object.fromEntries(roleVariables.map((variable): [string, Acl.Variable] => {\n\t\t\treturn [variable.name, variable.variable]\n\t\t}))\n\t}\n\n\tprivate static groupPermissions(entityLikeDefinition: [string, { new(): any }][], roles: Role[]): PermissionsByRoleAndEntity {\n\t\tconst groupedPermissions: PermissionsByRoleAndEntity = new Map()\n\t\tfor (const [name, entity] of entityLikeDefinition) {\n\t\t\tconst initEntityPermissions = (role: Role): EntityPermissions => {\n\t\t\t\tconst rolePermissions: PermissionsByEntity = groupedPermissions.get(role) ?? new Map()\n\t\t\t\tgroupedPermissions.set(role, rolePermissions)\n\t\t\t\tconst entityPermissions = rolePermissions.get(name) ?? {\n\t\t\t\t\tdefinitions: [],\n\t\t\t\t}\n\t\t\t\trolePermissions.set(name, entityPermissions)\n\t\t\t\treturn entityPermissions\n\t\t\t}\n\t\t\tconst metadata: EntityPermissionsDefinition[] = allowDefinitionsStore.get(entity)\n\t\t\tfor (const { role, ...definition } of metadata) {\n\t\t\t\tif (!roles.includes(role)) {\n\t\t\t\t\tthrow `Role ${role.name} used on entity ${name} is not registered. Have you exported it?`\n\t\t\t\t}\n\t\t\t\tconst entityPermissions = initEntityPermissions(role)\n\t\t\t\tentityPermissions.definitions.push(definition)\n\t\t\t}\n\t\t}\n\n\t\treturn groupedPermissions\n\t}\n}\n\n\nexport type EntityPermissions = { definitions: AllowDefinition<any>[] }\nexport type PermissionsByEntity = Map<string, EntityPermissions>\nexport type PermissionsByRoleAndEntity = Map<Role, PermissionsByEntity>\n"],"names":["filterEntityDefinition","roles","Role","variables","VariableDefinition","applyEntityAclExtensions","EntityPredicatesResolver","allowDefinitionsStore"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
- import { getEntity } from "@contember/schema-utils";
2
1
  import { EntityPredicatesResolver } from "./EntityPredicateResolver.js";
3
- import { allowDefinitionsStore, allowCustomPrimaryAllRolesStore, allowCustomPrimaryStore } from "./stores.js";
2
+ import { allowDefinitionsStore } from "./stores.js";
4
3
  import { Role } from "../roles.js";
5
4
  import { VariableDefinition } from "../variables.js";
6
5
  import { filterEntityDefinition } from "../../../utils/filterEntityDefinition.js";
7
6
  import "reflect-metadata";
7
+ import { applyEntityAclExtensions } from "../aclExtensions.js";
8
8
  class AclFactory {
9
9
  constructor(model) {
10
10
  this.model = model;
@@ -22,49 +22,54 @@ class AclFactory {
22
22
  {
23
23
  ...role.options,
24
24
  stages: role.options.stages ?? "*",
25
- entities: this.createPermissions(rolePermissions),
25
+ entities: this.createPermissions(rolePermissions, Object.fromEntries(entityLikeDefinition), role),
26
26
  variables: this.createVariables(role, variables)
27
27
  }
28
28
  ];
29
29
  }))
30
30
  };
31
31
  }
32
- createPermissions(rolePermissions) {
33
- if (!rolePermissions) {
34
- return {};
35
- }
36
- return Object.fromEntries(Array.from(rolePermissions.keys()).map((entityName) => {
37
- const entity = getEntity(this.model, entityName);
38
- const predicatesResolver = EntityPredicatesResolver.create(rolePermissions, this.model, entity);
39
- const entityOperations = {};
40
- const noRootOptions = this.getNoRootOptions(entity, rolePermissions.get(entityName));
41
- if (noRootOptions?.length) {
42
- entityOperations.noRoot = noRootOptions;
32
+ createPermissions(rolePermissions, entityLikeDefinition, role) {
33
+ return Object.fromEntries(Object.values(this.model.entities).map((entity) => {
34
+ const permissions = rolePermissions ? this.createPermissionsFromAllow(rolePermissions, entity) : { predicates: {}, operations: {} };
35
+ const isEmpty = rolePermissions === void 0;
36
+ const withExtensions = applyEntityAclExtensions(entityLikeDefinition[entity.name], { entity, permissions, role });
37
+ if (isEmpty && withExtensions === permissions) {
38
+ return void 0;
43
39
  }
44
- for (const op of ["create", "update", "read"]) {
45
- const fieldPermissions = {};
46
- for (const field of Object.keys(entity.fields)) {
47
- const predicate = predicatesResolver.createFieldPredicate(op, field, field === entity.primary);
48
- if (predicate !== void 0) {
49
- fieldPermissions[field] = predicate;
50
- }
51
- }
52
- if (Object.keys(fieldPermissions).length > 0) {
53
- entityOperations[op] = fieldPermissions;
40
+ return [
41
+ entity.name,
42
+ withExtensions
43
+ ];
44
+ }).filter((it) => it !== void 0));
45
+ }
46
+ createPermissionsFromAllow(rolePermissions, entity) {
47
+ const predicatesResolver = EntityPredicatesResolver.create(rolePermissions, this.model, entity);
48
+ const entityOperations = {};
49
+ const noRootOptions = this.getNoRootOptions(entity, rolePermissions.get(entity.name));
50
+ if (noRootOptions?.length) {
51
+ entityOperations.noRoot = noRootOptions;
52
+ }
53
+ for (const op of ["create", "update", "read"]) {
54
+ const fieldPermissions = {};
55
+ for (const field of Object.keys(entity.fields)) {
56
+ const predicate = predicatesResolver.createFieldPredicate(op, field, field === entity.primary);
57
+ if (predicate !== void 0) {
58
+ fieldPermissions[field] = predicate;
54
59
  }
55
60
  }
56
- const delPredicate = predicatesResolver.createFieldPredicate("delete", "", false);
57
- if (delPredicate !== void 0) {
58
- entityOperations.delete = delPredicate;
59
- }
60
- if (rolePermissions.get(entityName)?.allowCustomPrimary) {
61
- entityOperations.customPrimary = true;
61
+ if (Object.keys(fieldPermissions).length > 0) {
62
+ entityOperations[op] = fieldPermissions;
62
63
  }
63
- return [entityName, {
64
- predicates: predicatesResolver.getUsedPredicates(),
65
- operations: entityOperations
66
- }];
67
- }));
64
+ }
65
+ const delPredicate = predicatesResolver.createFieldPredicate("delete", "", false);
66
+ if (delPredicate !== void 0) {
67
+ entityOperations.delete = delPredicate;
68
+ }
69
+ return {
70
+ predicates: predicatesResolver.getUsedPredicates(),
71
+ operations: entityOperations
72
+ };
68
73
  }
69
74
  getNoRootOptions(entity, permissions) {
70
75
  const allowedRoot = /* @__PURE__ */ new Set();
@@ -97,7 +102,6 @@ class AclFactory {
97
102
  const rolePermissions = groupedPermissions.get(role) ?? /* @__PURE__ */ new Map();
98
103
  groupedPermissions.set(role, rolePermissions);
99
104
  const entityPermissions = rolePermissions.get(name) ?? {
100
- allowCustomPrimary: false,
101
105
  definitions: []
102
106
  };
103
107
  rolePermissions.set(name, entityPermissions);
@@ -111,10 +115,6 @@ class AclFactory {
111
115
  const entityPermissions = initEntityPermissions(role);
112
116
  entityPermissions.definitions.push(definition);
113
117
  }
114
- const rolesWithCustomPrimary = allowCustomPrimaryAllRolesStore.get(entity) ? roles : allowCustomPrimaryStore.get(entity);
115
- for (const role of rolesWithCustomPrimary) {
116
- initEntityPermissions(role).allowCustomPrimary = true;
117
- }
118
118
  }
119
119
  return groupedPermissions;
120
120
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AclFactory.js","sources":["../../../../../../../packages/schema-definition/src/acl/definition/internal/AclFactory.ts"],"sourcesContent":["import { Acl, Model, Writable } from '@contember/schema'\nimport { getEntity } from '@contember/schema-utils'\n\nimport { EntityPredicatesResolver } from './EntityPredicateResolver'\nimport { AllowDefinition } from '../permissions'\nimport {\n\tallowCustomPrimaryAllRolesStore,\n\tallowCustomPrimaryStore,\n\tallowDefinitionsStore,\n\tEntityPermissionsDefinition,\n} from './stores'\nimport { Role } from '../roles'\nimport { VariableDefinition } from '../variables'\nimport { filterEntityDefinition } from '../../../utils'\n\nexport class AclFactory {\n\tconstructor(\n\t\tprivate model: Model.Schema,\n\t) {\n\t}\n\n\tpublic create(\n\t\texportedDefinitions: Record<string, any>,\n\t): Acl.Schema {\n\t\tconst entityLikeDefinition = filterEntityDefinition(exportedDefinitions)\n\t\tconst roles: Role[] = Object.values(exportedDefinitions).filter(it => it instanceof Role)\n\t\tconst variables: VariableDefinition[] = Object.values(exportedDefinitions).filter(it => it instanceof VariableDefinition)\n\n\t\tconst groupedPermissions = AclFactory.groupPermissions(entityLikeDefinition, roles)\n\n\t\treturn {\n\t\t\troles: Object.fromEntries(roles.map((role): [string, Acl.RolePermissions] => {\n\t\t\t\tconst rolePermissions = groupedPermissions.get(role)\n\t\t\t\treturn [\n\t\t\t\t\trole.name,\n\t\t\t\t\t{\n\t\t\t\t\t\t...role.options,\n\t\t\t\t\t\tstages: role.options.stages ?? '*',\n\t\t\t\t\t\tentities: this.createPermissions(rolePermissions),\n\t\t\t\t\t\tvariables: this.createVariables(role, variables),\n\t\t\t\t\t},\n\t\t\t\t]\n\t\t\t})),\n\t\t}\n\t}\n\n\tprivate createPermissions(rolePermissions: PermissionsByEntity | undefined): Acl.Permissions {\n\t\tif (!rolePermissions) {\n\t\t\treturn {}\n\t\t}\n\t\treturn Object.fromEntries(Array.from(rolePermissions.keys()).map((entityName): [string, Acl.EntityPermissions] => {\n\t\t\tconst entity = getEntity(this.model, entityName)\n\n\t\t\tconst predicatesResolver = EntityPredicatesResolver.create(rolePermissions, this.model, entity)\n\n\t\t\tconst entityOperations: Writable<Acl.EntityOperations> = {\n\t\t\t}\n\t\t\tconst noRootOptions = this.getNoRootOptions(entity, rolePermissions.get(entityName))\n\t\t\tif (noRootOptions?.length) {\n\t\t\t\tentityOperations.noRoot = noRootOptions\n\t\t\t}\n\t\t\tfor (const op of ['create', 'update', 'read'] as const) {\n\t\t\t\tconst fieldPermissions: Writable<Acl.FieldPermissions> = {}\n\t\t\t\tfor (const field of Object.keys(entity.fields)) {\n\t\t\t\t\tconst predicate = predicatesResolver.createFieldPredicate(op, field, field === entity.primary)\n\t\t\t\t\tif (predicate !== undefined) {\n\t\t\t\t\t\tfieldPermissions[field] = predicate\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (Object.keys(fieldPermissions).length > 0) {\n\t\t\t\t\tentityOperations[op] = fieldPermissions\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst delPredicate = predicatesResolver.createFieldPredicate('delete', '', false)\n\t\t\tif (delPredicate !== undefined) {\n\t\t\t\tentityOperations.delete = delPredicate\n\t\t\t}\n\t\t\tif (rolePermissions.get(entityName)?.allowCustomPrimary) {\n\t\t\t\tentityOperations.customPrimary = true\n\t\t\t}\n\t\t\treturn [entityName, {\n\t\t\t\tpredicates: predicatesResolver.getUsedPredicates(),\n\t\t\t\toperations: entityOperations,\n\n\t\t\t}]\n\t\t}))\n\t}\n\n\n\tgetNoRootOptions(entity: Model.Entity, permissions?: EntityPermissions): Acl.EntityOperations['noRoot'] {\n\t\tconst allowedRoot = new Set<Acl.Operation>()\n\t\tconst disallowedRoot = new Set<Acl.Operation>()\n\t\tfor (const def of permissions?.definitions ?? []) {\n\t\t\tconst noRoot = def.through === true\n\t\t\tfor (const op of ['create', 'read', 'update', 'delete'] as const) {\n\t\t\t\tif (def[op]) {\n\t\t\t\t\tconst currentSet = noRoot ? disallowedRoot : allowedRoot\n\t\t\t\t\tcurrentSet.add(op as Acl.Operation)\n\n\t\t\t\t\tconst otherSet = noRoot ? allowedRoot : disallowedRoot\n\n\t\t\t\t\tif (otherSet.has(op as Acl.Operation)) {\n\t\t\t\t\t\tthrow new Error(`Operation ${op} cannot be both allowed and disallowed on root on entity ${entity.name}`)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t\treturn [...disallowedRoot.values()]\n\t}\n\n\tprivate createVariables(role: Role, variables: VariableDefinition[]): Acl.Variables {\n\t\tconst roleVariables = variables.filter(it => it.roles.includes(role))\n\t\treturn Object.fromEntries(roleVariables.map((variable): [string, Acl.Variable] => {\n\t\t\treturn [variable.name, variable.variable]\n\t\t}))\n\t}\n\n\tprivate static groupPermissions(entityLikeDefinition: [string, { new(): any }][], roles: Role[]): PermissionsByRoleAndEntity {\n\t\tconst groupedPermissions: PermissionsByRoleAndEntity = new Map()\n\t\tfor (const [name, entity] of entityLikeDefinition) {\n\t\t\tconst initEntityPermissions = (role: Role): EntityPermissions => {\n\t\t\t\tconst rolePermissions: PermissionsByEntity = groupedPermissions.get(role) ?? new Map()\n\t\t\t\tgroupedPermissions.set(role, rolePermissions)\n\t\t\t\tconst entityPermissions = rolePermissions.get(name) ?? {\n\t\t\t\t\tallowCustomPrimary: false,\n\t\t\t\t\tdefinitions: [],\n\t\t\t\t}\n\t\t\t\trolePermissions.set(name, entityPermissions)\n\t\t\t\treturn entityPermissions\n\t\t\t}\n\t\t\tconst metadata: EntityPermissionsDefinition[] = allowDefinitionsStore.get(entity)\n\t\t\tfor (const { role, ...definition } of metadata) {\n\t\t\t\tif (!roles.includes(role)) {\n\t\t\t\t\tthrow `Role ${role.name} used on entity ${name} is not registered. Have you exported it?`\n\t\t\t\t}\n\t\t\t\tconst entityPermissions = initEntityPermissions(role)\n\t\t\t\tentityPermissions.definitions.push(definition)\n\t\t\t}\n\n\t\t\tconst rolesWithCustomPrimary = allowCustomPrimaryAllRolesStore.get(entity) ? roles : allowCustomPrimaryStore.get(entity)\n\t\t\tfor (const role of rolesWithCustomPrimary) {\n\t\t\t\tinitEntityPermissions(role).allowCustomPrimary = true\n\t\t\t}\n\t\t}\n\n\t\treturn groupedPermissions\n\t}\n}\n\n\nexport type EntityPermissions = { definitions: AllowDefinition<any>[]; allowCustomPrimary: boolean }\nexport type PermissionsByEntity = Map<string, EntityPermissions>\nexport type PermissionsByRoleAndEntity = Map<Role, PermissionsByEntity>\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AclFactory.js","sources":["../../../../../../../packages/schema-definition/src/acl/definition/internal/AclFactory.ts"],"sourcesContent":["import { Acl, Model, Writable } from '@contember/schema'\nimport { getEntity } from '@contember/schema-utils'\n\nimport { EntityPredicatesResolver } from './EntityPredicateResolver'\nimport { AllowDefinition } from '../permissions'\nimport {\n\tallowDefinitionsStore,\n\tEntityPermissionsDefinition,\n} from './stores'\nimport { Role } from '../roles'\nimport { VariableDefinition } from '../variables'\nimport { filterEntityDefinition } from '../../../utils'\nimport { applyEntityAclExtensions } from '../aclExtensions'\n\nexport class AclFactory {\n\tconstructor(\n\t\tprivate model: Model.Schema,\n\t) {\n\t}\n\n\tpublic create(\n\t\texportedDefinitions: Record<string, any>,\n\t): Acl.Schema {\n\t\tconst entityLikeDefinition = filterEntityDefinition(exportedDefinitions)\n\t\tconst roles: Role[] = Object.values(exportedDefinitions).filter(it => it instanceof Role)\n\t\tconst variables: VariableDefinition[] = Object.values(exportedDefinitions).filter(it => it instanceof VariableDefinition)\n\n\t\tconst groupedPermissions = AclFactory.groupPermissions(entityLikeDefinition, roles)\n\n\t\treturn {\n\t\t\troles: Object.fromEntries(roles.map((role): [string, Acl.RolePermissions] => {\n\t\t\t\tconst rolePermissions = groupedPermissions.get(role)\n\t\t\t\treturn [\n\t\t\t\t\trole.name,\n\t\t\t\t\t{\n\t\t\t\t\t\t...role.options,\n\t\t\t\t\t\tstages: role.options.stages ?? '*',\n\t\t\t\t\t\tentities: this.createPermissions(rolePermissions, Object.fromEntries(entityLikeDefinition), role),\n\t\t\t\t\t\tvariables: this.createVariables(role, variables),\n\t\t\t\t\t},\n\t\t\t\t]\n\t\t\t})),\n\t\t}\n\t}\n\n\tprivate createPermissions(rolePermissions: PermissionsByEntity | undefined, entityLikeDefinition: Record<string, { new(): any }>, role: Role): Acl.Permissions {\n\t\treturn Object.fromEntries(Object.values(this.model.entities).map((entity): [string, Acl.EntityPermissions] | undefined => {\n\t\t\tconst permissions = rolePermissions ? this.createPermissionsFromAllow(rolePermissions, entity) : { predicates: {}, operations: {} }\n\t\t\tconst isEmpty = rolePermissions === undefined\n\t\t\tconst withExtensions = applyEntityAclExtensions(entityLikeDefinition[entity.name], { entity, permissions, role })\n\t\t\tif (isEmpty && withExtensions === permissions) {\n\t\t\t\treturn undefined\n\t\t\t}\n\t\t\treturn [\n\t\t\t\tentity.name,\n\t\t\t\twithExtensions,\n\t\t\t]\n\t\t}).filter(<T>(it: T | undefined): it is T => it !== undefined))\n\t}\n\n\tprivate createPermissionsFromAllow(rolePermissions: PermissionsByEntity, entity: Model.Entity): Acl.EntityPermissions {\n\t\tconst predicatesResolver = EntityPredicatesResolver.create(rolePermissions, this.model, entity)\n\n\t\tconst entityOperations: Writable<Acl.EntityOperations> = {}\n\t\tconst noRootOptions = this.getNoRootOptions(entity, rolePermissions.get(entity.name))\n\t\tif (noRootOptions?.length) {\n\t\t\tentityOperations.noRoot = noRootOptions\n\t\t}\n\t\tfor (const op of ['create', 'update', 'read'] as const) {\n\t\t\tconst fieldPermissions: Writable<Acl.FieldPermissions> = {}\n\t\t\tfor (const field of Object.keys(entity.fields)) {\n\t\t\t\tconst predicate = predicatesResolver.createFieldPredicate(op, field, field === entity.primary)\n\t\t\t\tif (predicate !== undefined) {\n\t\t\t\t\tfieldPermissions[field] = predicate\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (Object.keys(fieldPermissions).length > 0) {\n\t\t\t\tentityOperations[op] = fieldPermissions\n\t\t\t}\n\t\t}\n\t\tconst delPredicate = predicatesResolver.createFieldPredicate('delete', '', false)\n\t\tif (delPredicate !== undefined) {\n\t\t\tentityOperations.delete = delPredicate\n\t\t}\n\t\treturn {\n\t\t\tpredicates: predicatesResolver.getUsedPredicates(),\n\t\t\toperations: entityOperations,\n\t\t}\n\t}\n\n\n\tgetNoRootOptions(entity: Model.Entity, permissions?: EntityPermissions): Acl.EntityOperations['noRoot'] {\n\t\tconst allowedRoot = new Set<Acl.Operation>()\n\t\tconst disallowedRoot = new Set<Acl.Operation>()\n\t\tfor (const def of permissions?.definitions ?? []) {\n\t\t\tconst noRoot = def.through === true\n\t\t\tfor (const op of ['create', 'read', 'update', 'delete'] as const) {\n\t\t\t\tif (def[op]) {\n\t\t\t\t\tconst currentSet = noRoot ? disallowedRoot : allowedRoot\n\t\t\t\t\tcurrentSet.add(op as Acl.Operation)\n\n\t\t\t\t\tconst otherSet = noRoot ? allowedRoot : disallowedRoot\n\n\t\t\t\t\tif (otherSet.has(op as Acl.Operation)) {\n\t\t\t\t\t\tthrow new Error(`Operation ${op} cannot be both allowed and disallowed on root on entity ${entity.name}`)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t\treturn [...disallowedRoot.values()]\n\t}\n\n\tprivate createVariables(role: Role, variables: VariableDefinition[]): Acl.Variables {\n\t\tconst roleVariables = variables.filter(it => it.roles.includes(role))\n\t\treturn Object.fromEntries(roleVariables.map((variable): [string, Acl.Variable] => {\n\t\t\treturn [variable.name, variable.variable]\n\t\t}))\n\t}\n\n\tprivate static groupPermissions(entityLikeDefinition: [string, { new(): any }][], roles: Role[]): PermissionsByRoleAndEntity {\n\t\tconst groupedPermissions: PermissionsByRoleAndEntity = new Map()\n\t\tfor (const [name, entity] of entityLikeDefinition) {\n\t\t\tconst initEntityPermissions = (role: Role): EntityPermissions => {\n\t\t\t\tconst rolePermissions: PermissionsByEntity = groupedPermissions.get(role) ?? new Map()\n\t\t\t\tgroupedPermissions.set(role, rolePermissions)\n\t\t\t\tconst entityPermissions = rolePermissions.get(name) ?? {\n\t\t\t\t\tdefinitions: [],\n\t\t\t\t}\n\t\t\t\trolePermissions.set(name, entityPermissions)\n\t\t\t\treturn entityPermissions\n\t\t\t}\n\t\t\tconst metadata: EntityPermissionsDefinition[] = allowDefinitionsStore.get(entity)\n\t\t\tfor (const { role, ...definition } of metadata) {\n\t\t\t\tif (!roles.includes(role)) {\n\t\t\t\t\tthrow `Role ${role.name} used on entity ${name} is not registered. Have you exported it?`\n\t\t\t\t}\n\t\t\t\tconst entityPermissions = initEntityPermissions(role)\n\t\t\t\tentityPermissions.definitions.push(definition)\n\t\t\t}\n\t\t}\n\n\t\treturn groupedPermissions\n\t}\n}\n\n\nexport type EntityPermissions = { definitions: AllowDefinition<any>[] }\nexport type PermissionsByEntity = Map<string, EntityPermissions>\nexport type PermissionsByRoleAndEntity = Map<Role, PermissionsByEntity>\n"],"names":[],"mappings":"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"}
@@ -1,10 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const MetadataStore = require("../../../utils/MetadataStore.cjs");
4
- const allowCustomPrimaryStore = MetadataStore.createMetadataStore([]);
5
- const allowCustomPrimaryAllRolesStore = MetadataStore.createMetadataStore(false);
6
4
  const allowDefinitionsStore = MetadataStore.createMetadataStore([]);
7
- exports.allowCustomPrimaryAllRolesStore = allowCustomPrimaryAllRolesStore;
8
- exports.allowCustomPrimaryStore = allowCustomPrimaryStore;
9
5
  exports.allowDefinitionsStore = allowDefinitionsStore;
10
6
  //# sourceMappingURL=stores.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"stores.cjs","sources":["../../../../../../../packages/schema-definition/src/acl/definition/internal/stores.ts"],"sourcesContent":["import { createMetadataStore } from '../../../utils/MetadataStore'\nimport { Role } from '../roles'\nimport { AllowDefinition } from '../permissions'\n\nexport const allowCustomPrimaryStore = createMetadataStore<Role[]>([])\nexport const allowCustomPrimaryAllRolesStore = createMetadataStore<boolean>(false)\n\nexport type EntityPermissionsDefinition =\n\t& AllowDefinition<any>\n\t& {\n\t\trole: Role<string>\n\t}\nexport const allowDefinitionsStore = createMetadataStore<EntityPermissionsDefinition[]>([])\n"],"names":["createMetadataStore"],"mappings":";;;AAIa,MAAA,0BAA0BA,cAA4B,oBAAA,CAAE,CAAA;AACxD,MAAA,kCAAkCA,kCAA6B,KAAK;AAOpE,MAAA,wBAAwBA,cAAmD,oBAAA,CAAE,CAAA;;;;"}
1
+ {"version":3,"file":"stores.cjs","sources":["../../../../../../../packages/schema-definition/src/acl/definition/internal/stores.ts"],"sourcesContent":["import { createMetadataStore } from '../../../utils/MetadataStore'\nimport { Role } from '../roles'\nimport { AllowDefinition } from '../permissions'\n\nexport type EntityPermissionsDefinition =\n\t& AllowDefinition<any>\n\t& {\n\t\trole: Role<string>\n\t}\nexport const allowDefinitionsStore = createMetadataStore<EntityPermissionsDefinition[]>([])\n"],"names":["createMetadataStore"],"mappings":";;;AASa,MAAA,wBAAwBA,cAAmD,oBAAA,CAAE,CAAA;;"}
@@ -1,10 +1,6 @@
1
1
  import { createMetadataStore } from "../../../utils/MetadataStore.js";
2
- const allowCustomPrimaryStore = createMetadataStore([]);
3
- const allowCustomPrimaryAllRolesStore = createMetadataStore(false);
4
2
  const allowDefinitionsStore = createMetadataStore([]);
5
3
  export {
6
- allowCustomPrimaryAllRolesStore,
7
- allowCustomPrimaryStore,
8
4
  allowDefinitionsStore
9
5
  };
10
6
  //# sourceMappingURL=stores.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stores.js","sources":["../../../../../../../packages/schema-definition/src/acl/definition/internal/stores.ts"],"sourcesContent":["import { createMetadataStore } from '../../../utils/MetadataStore'\nimport { Role } from '../roles'\nimport { AllowDefinition } from '../permissions'\n\nexport const allowCustomPrimaryStore = createMetadataStore<Role[]>([])\nexport const allowCustomPrimaryAllRolesStore = createMetadataStore<boolean>(false)\n\nexport type EntityPermissionsDefinition =\n\t& AllowDefinition<any>\n\t& {\n\t\trole: Role<string>\n\t}\nexport const allowDefinitionsStore = createMetadataStore<EntityPermissionsDefinition[]>([])\n"],"names":[],"mappings":";AAIa,MAAA,0BAA0B,oBAA4B,CAAE,CAAA;AACxD,MAAA,kCAAkC,oBAA6B,KAAK;AAOpE,MAAA,wBAAwB,oBAAmD,CAAE,CAAA;"}
1
+ {"version":3,"file":"stores.js","sources":["../../../../../../../packages/schema-definition/src/acl/definition/internal/stores.ts"],"sourcesContent":["import { createMetadataStore } from '../../../utils/MetadataStore'\nimport { Role } from '../roles'\nimport { AllowDefinition } from '../permissions'\n\nexport type EntityPermissionsDefinition =\n\t& AllowDefinition<any>\n\t& {\n\t\trole: Role<string>\n\t}\nexport const allowDefinitionsStore = createMetadataStore<EntityPermissionsDefinition[]>([])\n"],"names":[],"mappings":";AASa,MAAA,wBAAwB,oBAAmD,CAAE,CAAA;"}
@@ -11,7 +11,10 @@ const strict = require("./strict.cjs");
11
11
  const createSchema = (definitions, modifyCallback, options) => {
12
12
  const strictOptions = options?.strict === true ? strict.allStrict : options?.strict || {};
13
13
  const strictDefinitionValidator = new strict.StrictDefinitionValidator(strictOptions);
14
- const model = index.createModel(definitions, { strictDefinitionValidator });
14
+ const model = index.createModel(definitions, {
15
+ strictDefinitionValidator,
16
+ defaultCollation: options?.defaultCollation
17
+ });
15
18
  const validation = index$1.parseDefinition(definitions);
16
19
  const acl = index$2.createAcl(definitions, model);
17
20
  const actions = index$3.createActions(definitions);
@@ -1 +1 @@
1
- {"version":3,"file":"createSchema.cjs","sources":["../../../../packages/schema-definition/src/createSchema.ts"],"sourcesContent":["import { SchemaDefinition } from './model'\nimport * as InputValidation from './validation'\nimport * as AclDefinition from './acl/definition'\nimport * as ActionsDefinition from './actions/definition'\nimport { Schema } from '@contember/schema'\nimport { emptySchema } from '@contember/schema-utils'\nimport { allStrict, StrictOptions, StrictDefinitionValidator } from './strict'\n\nexport const createSchema = (definitions: Record<string, any>, modifyCallback?: (schema: Schema) => Schema, options?: {\n\tstrict?: boolean | StrictOptions\n}): Schema => {\n\tconst strictOptions = options?.strict === true ? allStrict : (options?.strict || {})\n\tconst strictDefinitionValidator = new StrictDefinitionValidator(strictOptions)\n\n\tconst model = SchemaDefinition.createModel(definitions, { strictDefinitionValidator: strictDefinitionValidator })\n\tconst validation = InputValidation.parseDefinition(definitions)\n\tconst acl = AclDefinition.createAcl(definitions, model)\n\tconst actions = ActionsDefinition.createActions(definitions)\n\tconst schema = { ...emptySchema, model, validation, acl, actions }\n\n\tif (strictDefinitionValidator.warnings.length > 0) {\n\t\tthrow `Strict schema validation failed: \\n${strictDefinitionValidator.warnings.map(it => `- ${it.message}`).join('\\n')}`\n\t}\n\n\treturn modifyCallback ? modifyCallback(schema) : schema\n}\n"],"names":["allStrict","StrictDefinitionValidator","SchemaDefinition.createModel","InputValidation.parseDefinition","AclDefinition.createAcl","ActionsDefinition.createActions","emptySchema"],"mappings":";;;;;;;;;;AAQO,MAAM,eAAe,CAAC,aAAkC,gBAA6C,YAE9F;AACb,QAAM,gBAAgB,SAAS,WAAW,OAAOA,mBAAa,SAAS,UAAU,CAAC;AAC5E,QAAA,4BAA4B,IAAIC,OAAA,0BAA0B,aAAa;AAE7E,QAAM,QAAQC,MAAiB,YAAY,aAAa,EAAE,2BAAsD;AAC1G,QAAA,aAAaC,QAAgB,gBAAgB,WAAW;AAC9D,QAAM,MAAMC,QAAAA,UAAwB,aAAa,KAAK;AAChD,QAAA,UAAUC,QAAkB,cAAc,WAAW;AAC3D,QAAM,SAAS,EAAE,GAAGC,yBAAa,OAAO,YAAY,KAAK,QAAQ;AAE7D,MAAA,0BAA0B,SAAS,SAAS,GAAG;AAC5C,UAAA;AAAA,EAAsC,0BAA0B,SAAS,IAAI,CAAM,OAAA,KAAK,GAAG,OAAO,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,EAAA;AAGhH,SAAA,iBAAiB,eAAe,MAAM,IAAI;AAClD;;"}
1
+ {"version":3,"file":"createSchema.cjs","sources":["../../../../packages/schema-definition/src/createSchema.ts"],"sourcesContent":["import { SchemaDefinition } from './model'\nimport * as InputValidation from './validation'\nimport * as AclDefinition from './acl/definition'\nimport * as ActionsDefinition from './actions/definition'\nimport { Model, Schema } from '@contember/schema'\nimport { emptySchema } from '@contember/schema-utils'\nimport { allStrict, StrictOptions, StrictDefinitionValidator } from './strict'\n\nexport const createSchema = (definitions: Record<string, any>, modifyCallback?: (schema: Schema) => Schema, options?: {\n\tstrict?: boolean | StrictOptions\n\tdefaultCollation?: Model.Collation\n}): Schema => {\n\tconst strictOptions = options?.strict === true ? allStrict : (options?.strict || {})\n\tconst strictDefinitionValidator = new StrictDefinitionValidator(strictOptions)\n\n\tconst model = SchemaDefinition.createModel(definitions, {\n\t\tstrictDefinitionValidator: strictDefinitionValidator,\n\t\tdefaultCollation: options?.defaultCollation,\n\t})\n\tconst validation = InputValidation.parseDefinition(definitions)\n\tconst acl = AclDefinition.createAcl(definitions, model)\n\tconst actions = ActionsDefinition.createActions(definitions)\n\tconst schema = { ...emptySchema, model, validation, acl, actions }\n\n\tif (strictDefinitionValidator.warnings.length > 0) {\n\t\tthrow `Strict schema validation failed: \\n${strictDefinitionValidator.warnings.map(it => `- ${it.message}`).join('\\n')}`\n\t}\n\n\treturn modifyCallback ? modifyCallback(schema) : schema\n}\n"],"names":["allStrict","StrictDefinitionValidator","SchemaDefinition.createModel","InputValidation.parseDefinition","AclDefinition.createAcl","ActionsDefinition.createActions","emptySchema"],"mappings":";;;;;;;;;;AAQO,MAAM,eAAe,CAAC,aAAkC,gBAA6C,YAG9F;AACb,QAAM,gBAAgB,SAAS,WAAW,OAAOA,mBAAa,SAAS,UAAU,CAAC;AAC5E,QAAA,4BAA4B,IAAIC,OAAA,0BAA0B,aAAa;AAEvE,QAAA,QAAQC,MAAiB,YAAY,aAAa;AAAA,IACvD;AAAA,IACA,kBAAkB,SAAS;AAAA,EAAA,CAC3B;AACK,QAAA,aAAaC,QAAgB,gBAAgB,WAAW;AAC9D,QAAM,MAAMC,QAAAA,UAAwB,aAAa,KAAK;AAChD,QAAA,UAAUC,QAAkB,cAAc,WAAW;AAC3D,QAAM,SAAS,EAAE,GAAGC,yBAAa,OAAO,YAAY,KAAK,QAAQ;AAE7D,MAAA,0BAA0B,SAAS,SAAS,GAAG;AAC5C,UAAA;AAAA,EAAsC,0BAA0B,SAAS,IAAI,CAAM,OAAA,KAAK,GAAG,OAAO,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,EAAA;AAGhH,SAAA,iBAAiB,eAAe,MAAM,IAAI;AAClD;;"}
@@ -9,7 +9,10 @@ import { allStrict, StrictDefinitionValidator } from "./strict.js";
9
9
  const createSchema = (definitions, modifyCallback, options) => {
10
10
  const strictOptions = options?.strict === true ? allStrict : options?.strict || {};
11
11
  const strictDefinitionValidator = new StrictDefinitionValidator(strictOptions);
12
- const model = createModel(definitions, { strictDefinitionValidator });
12
+ const model = createModel(definitions, {
13
+ strictDefinitionValidator,
14
+ defaultCollation: options?.defaultCollation
15
+ });
13
16
  const validation = parseDefinition(definitions);
14
17
  const acl = createAcl(definitions, model);
15
18
  const actions = createActions(definitions);
@@ -1 +1 @@
1
- {"version":3,"file":"createSchema.js","sources":["../../../../packages/schema-definition/src/createSchema.ts"],"sourcesContent":["import { SchemaDefinition } from './model'\nimport * as InputValidation from './validation'\nimport * as AclDefinition from './acl/definition'\nimport * as ActionsDefinition from './actions/definition'\nimport { Schema } from '@contember/schema'\nimport { emptySchema } from '@contember/schema-utils'\nimport { allStrict, StrictOptions, StrictDefinitionValidator } from './strict'\n\nexport const createSchema = (definitions: Record<string, any>, modifyCallback?: (schema: Schema) => Schema, options?: {\n\tstrict?: boolean | StrictOptions\n}): Schema => {\n\tconst strictOptions = options?.strict === true ? allStrict : (options?.strict || {})\n\tconst strictDefinitionValidator = new StrictDefinitionValidator(strictOptions)\n\n\tconst model = SchemaDefinition.createModel(definitions, { strictDefinitionValidator: strictDefinitionValidator })\n\tconst validation = InputValidation.parseDefinition(definitions)\n\tconst acl = AclDefinition.createAcl(definitions, model)\n\tconst actions = ActionsDefinition.createActions(definitions)\n\tconst schema = { ...emptySchema, model, validation, acl, actions }\n\n\tif (strictDefinitionValidator.warnings.length > 0) {\n\t\tthrow `Strict schema validation failed: \\n${strictDefinitionValidator.warnings.map(it => `- ${it.message}`).join('\\n')}`\n\t}\n\n\treturn modifyCallback ? modifyCallback(schema) : schema\n}\n"],"names":["SchemaDefinition.createModel","InputValidation.parseDefinition","AclDefinition.createAcl","ActionsDefinition.createActions"],"mappings":";;;;;;;;AAQO,MAAM,eAAe,CAAC,aAAkC,gBAA6C,YAE9F;AACb,QAAM,gBAAgB,SAAS,WAAW,OAAO,YAAa,SAAS,UAAU,CAAC;AAC5E,QAAA,4BAA4B,IAAI,0BAA0B,aAAa;AAE7E,QAAM,QAAQA,YAA6B,aAAa,EAAE,2BAAsD;AAC1G,QAAA,aAAaC,gBAAgC,WAAW;AAC9D,QAAM,MAAMC,UAAwB,aAAa,KAAK;AAChD,QAAA,UAAUC,cAAgC,WAAW;AAC3D,QAAM,SAAS,EAAE,GAAG,aAAa,OAAO,YAAY,KAAK,QAAQ;AAE7D,MAAA,0BAA0B,SAAS,SAAS,GAAG;AAC5C,UAAA;AAAA,EAAsC,0BAA0B,SAAS,IAAI,CAAM,OAAA,KAAK,GAAG,OAAO,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,EAAA;AAGhH,SAAA,iBAAiB,eAAe,MAAM,IAAI;AAClD;"}
1
+ {"version":3,"file":"createSchema.js","sources":["../../../../packages/schema-definition/src/createSchema.ts"],"sourcesContent":["import { SchemaDefinition } from './model'\nimport * as InputValidation from './validation'\nimport * as AclDefinition from './acl/definition'\nimport * as ActionsDefinition from './actions/definition'\nimport { Model, Schema } from '@contember/schema'\nimport { emptySchema } from '@contember/schema-utils'\nimport { allStrict, StrictOptions, StrictDefinitionValidator } from './strict'\n\nexport const createSchema = (definitions: Record<string, any>, modifyCallback?: (schema: Schema) => Schema, options?: {\n\tstrict?: boolean | StrictOptions\n\tdefaultCollation?: Model.Collation\n}): Schema => {\n\tconst strictOptions = options?.strict === true ? allStrict : (options?.strict || {})\n\tconst strictDefinitionValidator = new StrictDefinitionValidator(strictOptions)\n\n\tconst model = SchemaDefinition.createModel(definitions, {\n\t\tstrictDefinitionValidator: strictDefinitionValidator,\n\t\tdefaultCollation: options?.defaultCollation,\n\t})\n\tconst validation = InputValidation.parseDefinition(definitions)\n\tconst acl = AclDefinition.createAcl(definitions, model)\n\tconst actions = ActionsDefinition.createActions(definitions)\n\tconst schema = { ...emptySchema, model, validation, acl, actions }\n\n\tif (strictDefinitionValidator.warnings.length > 0) {\n\t\tthrow `Strict schema validation failed: \\n${strictDefinitionValidator.warnings.map(it => `- ${it.message}`).join('\\n')}`\n\t}\n\n\treturn modifyCallback ? modifyCallback(schema) : schema\n}\n"],"names":["SchemaDefinition.createModel","InputValidation.parseDefinition","AclDefinition.createAcl","ActionsDefinition.createActions"],"mappings":";;;;;;;;AAQO,MAAM,eAAe,CAAC,aAAkC,gBAA6C,YAG9F;AACb,QAAM,gBAAgB,SAAS,WAAW,OAAO,YAAa,SAAS,UAAU,CAAC;AAC5E,QAAA,4BAA4B,IAAI,0BAA0B,aAAa;AAEvE,QAAA,QAAQA,YAA6B,aAAa;AAAA,IACvD;AAAA,IACA,kBAAkB,SAAS;AAAA,EAAA,CAC3B;AACK,QAAA,aAAaC,gBAAgC,WAAW;AAC9D,QAAM,MAAMC,UAAwB,aAAa,KAAK;AAChD,QAAA,UAAUC,cAAgC,WAAW;AAC3D,QAAM,SAAS,EAAE,GAAG,aAAa,OAAO,YAAY,KAAK,QAAQ;AAE7D,MAAA,0BAA0B,SAAS,SAAS,GAAG;AAC5C,UAAA;AAAA,EAAsC,0BAA0B,SAAS,IAAI,CAAM,OAAA,KAAK,GAAG,OAAO,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,EAAA;AAGhH,SAAA,iBAAiB,eAAe,MAAM,IAAI;AAClD;"}
@@ -1 +1 @@
1
- {"version":3,"file":"SchemaBuilderInternal.cjs","sources":["../../../../../../packages/schema-definition/src/model/builder/SchemaBuilderInternal.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { NamingConventions } from '@contember/schema-utils'\nimport EntityBuilder from './EntityBuilder'\nimport { SchemaBuilderError } from './SchemaBuilderError'\nimport FieldProcessor from './internal/FieldProcessor'\nimport ColumnProcessor from './internal/ColumnProcessor'\nimport ManyHasManyProcessor from './internal/ManyHasManyProcessor'\nimport OneHasOneProcessor from './internal/OneHasOneProcessor'\nimport OneHasManyProcessor from './internal/OneHasManyProcessor'\nimport ManyHasOneProcessor from './internal/ManyHasOneProcessor'\nimport FieldBuilder from './FieldBuilder'\n\nexport default class SchemaBuilderInternal {\n\tprivate entities: { [name: string]: Model.Entity & { fields: Record<string, Model.AnyField> } } = {}\n\n\tprivate fieldOptions: { [entity: string]: FieldBuilder.Map } = {}\n\n\tprivate enums: { [name: string]: string[] } = {}\n\n\tconstructor(private readonly conventions: NamingConventions) {}\n\n\tpublic addEntity(name: string, options: EntityBuilder.EntityOptions, fieldOptions: FieldBuilder.Map): void {\n\t\tthis.fieldOptions[name] = fieldOptions\n\t\tconst primaryName = this.getPrimaryFieldName(options, name, fieldOptions)\n\t\tif (!fieldOptions[primaryName]) {\n\t\t\tfieldOptions[primaryName] = this.createDefaultPrimary(primaryName)\n\t\t}\n\t\tconst primaryField = fieldOptions[primaryName]\n\t\tif (primaryField.type !== FieldBuilder.Type.Column) {\n\t\t\tthrow new SchemaBuilderError(`${name}: Primary field must be a column`)\n\t\t}\n\t\tprimaryField.options.primary = true\n\t\tprimaryField.options.nullable = false\n\n\t\tthis.entities[name] = {\n\t\t\tname: name,\n\t\t\tprimary: primaryName,\n\t\t\tprimaryColumn: primaryField.options.columnName || this.conventions.getColumnName(primaryName),\n\t\t\tunique: this.createUnique(name, options, fieldOptions),\n\t\t\tfields: {},\n\t\t\tindexes: [],\n\t\t\ttableName: options.tableName || this.conventions.getTableName(name),\n\t\t\teventLog: {\n\t\t\t\tenabled: true,\n\t\t\t},\n\t\t\t...(options.orderBy !== undefined ? { orderBy: options.orderBy } : {}),\n\t\t}\n\t}\n\n\tpublic addEnum(name: string, values: string[]): void {\n\t\tthis.enums[name] = values\n\t}\n\n\tpublic createSchema(): Model.Schema {\n\t\tfor (let entityName in this.fieldOptions) {\n\t\t\tlet primaryField = this.entities[entityName].primary\n\t\t\tthis.processField(entityName, primaryField)\n\t\t\tfor (let fieldName in this.fieldOptions[entityName]) {\n\t\t\t\tif (fieldName === primaryField) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tthis.processField(entityName, fieldName)\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tenums: this.enums,\n\t\t\tentities: this.entities,\n\t\t}\n\t}\n\n\tprivate processField(entityName: string, fieldName: string): void {\n\t\tconst processor = this.createProcessor(entityName, fieldName)\n\t\tprocessor.process(\n\t\t\tentityName,\n\t\t\tfieldName,\n\t\t\tthis.fieldOptions[entityName][fieldName].options,\n\t\t\tthis.registerField.bind(this),\n\t\t)\n\t}\n\n\tprivate createProcessor(entityName: string, fieldName: string): FieldProcessor<any> {\n\t\tconst field: FieldBuilder.Options = this.fieldOptions[entityName][fieldName]\n\n\t\tif (field.type === FieldBuilder.Type.Column) {\n\t\t\treturn new ColumnProcessor(this.conventions)\n\t\t}\n\t\tthis.checkTarget(entityName, fieldName, field.options)\n\t\tswitch (field.type) {\n\t\t\tcase FieldBuilder.Type.ManyHasMany:\n\t\t\t\treturn new ManyHasManyProcessor(this.conventions)\n\t\t\tcase FieldBuilder.Type.OneHasOne:\n\t\t\t\treturn new OneHasOneProcessor(this.conventions)\n\t\t\tcase FieldBuilder.Type.OneHasMany:\n\t\t\t\treturn new OneHasManyProcessor(this.conventions)\n\t\t\tcase FieldBuilder.Type.ManyHasOne:\n\t\t\t\treturn new ManyHasOneProcessor(this.conventions)\n\t\t}\n\n\t\tthrow new Error()\n\t}\n\n\tprivate checkTarget(entityName: string, fieldName: string, options: { target: string }) {\n\t\tif (!this.entities[options.target]) {\n\t\t\tthrow new SchemaBuilderError(`${entityName}::${fieldName}: undefined target entity ${options.target}`)\n\t\t}\n\t}\n\n\tprivate registerField(entityName: string, field: Model.AnyColumn | Model.AnyRelation) {\n\t\tif (!this.entities[entityName]) {\n\t\t\tthrow new SchemaBuilderError(`Undefined entity ${entityName}`)\n\t\t}\n\t\tif (this.entities[entityName].fields[field.name]) {\n\t\t\tthrow new SchemaBuilderError(`${entityName}: Field ${field.name} is already defined`)\n\t\t}\n\t\tthis.entities[entityName].fields[field.name] = field\n\t}\n\n\tprivate getPrimaryFieldName(\n\t\tentityOptions: EntityBuilder.EntityOptions,\n\t\tentityName: string,\n\t\tfields: FieldBuilder.Map,\n\t) {\n\t\tlet primary: string[] = []\n\t\tif (entityOptions.primary) {\n\t\t\tprimary.push(entityOptions.primary)\n\t\t}\n\t\tfor (let name in fields) {\n\t\t\tconst field: FieldBuilder.Options = fields[name]\n\t\t\tif (field.type !== FieldBuilder.Type.Column) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (!field.options.primary) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (!primary.includes(name)) {\n\t\t\t\tprimary.push(name)\n\t\t\t}\n\t\t}\n\t\tif (primary.length > 1) {\n\t\t\tthrow new SchemaBuilderError(`${entityName}: Only single column can be a primary. Found: ${primary.join(', ')}`)\n\t\t}\n\t\treturn primary.length === 1 ? primary[0] : this.conventions.getPrimaryField()\n\t}\n\n\tprivate createDefaultPrimary(fieldName: string): FieldBuilder.Options {\n\t\treturn {\n\t\t\ttype: FieldBuilder.Type.Column,\n\t\t\toptions: {\n\t\t\t\tnullable: false,\n\t\t\t\ttype: Model.ColumnType.Uuid,\n\t\t\t\tprimary: true,\n\t\t\t},\n\t\t}\n\t}\n\n\tprivate createUnique(\n\t\tentityName: string,\n\t\toptions: EntityBuilder.EntityOptions,\n\t\tfieldOptions: FieldBuilder.Map,\n\t): Model.UniqueConstraints {\n\t\tconst unique: Model.UniqueConstraint[] = []\n\n\t\tfor (const singleUnique of options.unique || []) {\n\t\t\tunique.push(singleUnique)\n\t\t}\n\t\tfor (let fieldName in fieldOptions) {\n\t\t\tconst options = fieldOptions[fieldName]\n\n\t\t\tif (options.type === FieldBuilder.Type.Column && options.options.unique) {\n\t\t\t\tunique.push({ fields: [fieldName] })\n\t\t\t}\n\t\t}\n\t\treturn unique\n\t}\n}\n"],"names":["SchemaBuilderError","Model","options"],"mappings":"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"}
1
+ {"version":3,"file":"SchemaBuilderInternal.cjs","sources":["../../../../../../packages/schema-definition/src/model/builder/SchemaBuilderInternal.ts"],"sourcesContent":["import { Model } from '@contember/schema'\nimport { NamingConventions } from '@contember/schema-utils'\nimport EntityBuilder from './EntityBuilder'\nimport { SchemaBuilderError } from './SchemaBuilderError'\nimport FieldProcessor from './internal/FieldProcessor'\nimport ColumnProcessor from './internal/ColumnProcessor'\nimport ManyHasManyProcessor from './internal/ManyHasManyProcessor'\nimport OneHasOneProcessor from './internal/OneHasOneProcessor'\nimport OneHasManyProcessor from './internal/OneHasManyProcessor'\nimport ManyHasOneProcessor from './internal/ManyHasOneProcessor'\nimport FieldBuilder from './FieldBuilder'\n\nexport default class SchemaBuilderInternal {\n\tprivate entities: { [name: string]: Model.Entity & { fields: Record<string, Model.AnyField> } } = {}\n\n\tprivate fieldOptions: { [entity: string]: FieldBuilder.Map } = {}\n\n\tprivate enums: { [name: string]: string[] } = {}\n\n\tconstructor(private readonly conventions: NamingConventions) {}\n\n\tpublic addEntity(name: string, options: EntityBuilder.EntityOptions, fieldOptions: FieldBuilder.Map): void {\n\t\tthis.fieldOptions[name] = fieldOptions\n\t\tconst primaryName = this.getPrimaryFieldName(options, name, fieldOptions)\n\t\tif (!fieldOptions[primaryName]) {\n\t\t\tfieldOptions[primaryName] = this.createDefaultPrimary(primaryName)\n\t\t}\n\t\tconst primaryField = fieldOptions[primaryName]\n\t\tif (primaryField.type !== FieldBuilder.Type.Column) {\n\t\t\tthrow new SchemaBuilderError(`${name}: Primary field must be a column`)\n\t\t}\n\t\tprimaryField.options.primary = true\n\t\tprimaryField.options.nullable = false\n\n\t\tthis.entities[name] = {\n\t\t\tname: name,\n\t\t\tprimary: primaryName,\n\t\t\tprimaryColumn: primaryField.options.columnName || this.conventions.getColumnName(primaryName),\n\t\t\tunique: this.createUnique(name, options, fieldOptions),\n\t\t\tfields: {},\n\t\t\tindexes: [],\n\t\t\ttableName: options.tableName || this.conventions.getTableName(name),\n\t\t\teventLog: {\n\t\t\t\tenabled: true,\n\t\t\t},\n\t\t\t...(options.orderBy !== undefined ? { orderBy: options.orderBy } : {}),\n\t\t}\n\t}\n\n\tpublic addEnum(name: string, values: string[]): void {\n\t\tthis.enums[name] = values\n\t}\n\n\tpublic createSchema(): Model.Schema {\n\t\tfor (let entityName in this.fieldOptions) {\n\t\t\tlet primaryField = this.entities[entityName].primary\n\t\t\tthis.processField(entityName, primaryField)\n\t\t\tfor (let fieldName in this.fieldOptions[entityName]) {\n\t\t\t\tif (fieldName === primaryField) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tthis.processField(entityName, fieldName)\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tenums: this.enums,\n\t\t\tentities: this.entities,\n\t\t}\n\t}\n\n\tprivate processField(entityName: string, fieldName: string): void {\n\t\tconst processor = this.createProcessor(entityName, fieldName)\n\t\tprocessor.process(\n\t\t\tentityName,\n\t\t\tfieldName,\n\t\t\tthis.fieldOptions[entityName][fieldName].options,\n\t\t\tthis.registerField.bind(this),\n\t\t)\n\t}\n\n\tprivate createProcessor(entityName: string, fieldName: string): FieldProcessor<any> {\n\t\tconst field: FieldBuilder.Options = this.fieldOptions[entityName][fieldName]\n\n\t\tif (field.type === FieldBuilder.Type.Column) {\n\t\t\treturn new ColumnProcessor(this.conventions)\n\t\t}\n\t\tthis.checkTarget(entityName, fieldName, field.options)\n\t\tswitch (field.type) {\n\t\t\tcase FieldBuilder.Type.ManyHasMany:\n\t\t\t\treturn new ManyHasManyProcessor(this.conventions)\n\t\t\tcase FieldBuilder.Type.OneHasOne:\n\t\t\t\treturn new OneHasOneProcessor(this.conventions)\n\t\t\tcase FieldBuilder.Type.OneHasMany:\n\t\t\t\treturn new OneHasManyProcessor(this.conventions)\n\t\t\tcase FieldBuilder.Type.ManyHasOne:\n\t\t\t\treturn new ManyHasOneProcessor(this.conventions)\n\t\t}\n\n\t\tthrow new Error()\n\t}\n\n\tprivate checkTarget(entityName: string, fieldName: string, options: { target: string }) {\n\t\tif (!this.entities[options.target]) {\n\t\t\tthrow new SchemaBuilderError(`${entityName}::${fieldName}: undefined target entity ${options.target}`)\n\t\t}\n\t}\n\n\tprivate registerField(entityName: string, field: Model.AnyColumn | Model.AnyRelation) {\n\t\tif (!this.entities[entityName]) {\n\t\t\tthrow new SchemaBuilderError(`Undefined entity ${entityName}`)\n\t\t}\n\t\tif (this.entities[entityName].fields[field.name]) {\n\t\t\tthrow new SchemaBuilderError(`${entityName}: Field ${field.name} is already defined`)\n\t\t}\n\t\tthis.entities[entityName].fields[field.name] = field\n\t}\n\n\tprivate getPrimaryFieldName(\n\t\tentityOptions: EntityBuilder.EntityOptions,\n\t\tentityName: string,\n\t\tfields: FieldBuilder.Map,\n\t) {\n\t\tlet primary: string[] = []\n\t\tif (entityOptions.primary) {\n\t\t\tprimary.push(entityOptions.primary)\n\t\t}\n\t\tfor (let name in fields) {\n\t\t\tconst field: FieldBuilder.Options = fields[name]\n\t\t\tif (field.type !== FieldBuilder.Type.Column) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (!field.options.primary) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (!primary.includes(name)) {\n\t\t\t\tprimary.push(name)\n\t\t\t}\n\t\t}\n\t\tif (primary.length > 1) {\n\t\t\tthrow new SchemaBuilderError(`${entityName}: Only single column can be a primary. Found: ${primary.join(', ')}`)\n\t\t}\n\t\treturn primary.length === 1 ? primary[0] : this.conventions.getPrimaryField()\n\t}\n\n\tprivate createDefaultPrimary(fieldName: string): FieldBuilder.Options {\n\t\treturn {\n\t\t\ttype: FieldBuilder.Type.Column,\n\t\t\toptions: {\n\t\t\t\tnullable: false,\n\t\t\t\ttype: Model.ColumnType.Uuid,\n\t\t\t\tprimary: true,\n\t\t\t},\n\t\t}\n\t}\n\n\tprivate createUnique(\n\t\tentityName: string,\n\t\toptions: EntityBuilder.EntityOptions,\n\t\tfieldOptions: FieldBuilder.Map,\n\t): Model.Uniques {\n\t\tconst unique: Model.UniqueConstraint[] = []\n\n\t\tfor (const singleUnique of options.unique || []) {\n\t\t\tunique.push(singleUnique)\n\t\t}\n\t\tfor (let fieldName in fieldOptions) {\n\t\t\tconst options = fieldOptions[fieldName]\n\n\t\t\tif (options.type === FieldBuilder.Type.Column && options.options.unique) {\n\t\t\t\tunique.push({ fields: [fieldName] })\n\t\t\t}\n\t\t}\n\t\treturn unique\n\t}\n}\n"],"names":["SchemaBuilderError","Model","options"],"mappings":"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"}