@contember/schema-migrations 2.0.0-beta.3 → 2.0.0-beta.5

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.
@@ -47,9 +47,10 @@ const updateAclFieldPermissions = (updater) => ({ entityPermissions, entityName
47
47
  update: (value) => updater(value, entityName, schema.Acl.Operation.update),
48
48
  read: (value) => updater(value, entityName, schema.Acl.Operation.read),
49
49
  delete: (value) => value,
50
- customPrimary: (value) => value
50
+ customPrimary: (value) => value,
51
+ noRoot: (value) => value
51
52
  };
52
- const types = ["create", "update", "read", "delete", "customPrimary"];
53
+ const types = ["create", "update", "read", "delete", "customPrimary", "noRoot"];
53
54
  for (const key of types) {
54
55
  if (key in entityPermissions.operations) {
55
56
  operations[key] = handlers[key](entityPermissions.operations[key]);
@@ -1 +1 @@
1
- {"version":3,"file":"schemaUpdateUtils.cjs","sources":["../../../../../../packages/schema-migrations/src/modifications/utils/schemaUpdateUtils.ts"],"sourcesContent":["import { Acl, Model, Schema, Writable } from '@contember/schema'\nimport { SchemaUpdateError } from '../exceptions'\nimport { isDefined } from '../../utils/isDefined'\nimport { isInverseRelation, isOwningRelation, isRelation, PredicateDefinitionProcessor } from '@contember/schema-utils'\nimport { VERSION_ACL_PATCH, VERSION_REMOVE_RELATION_INVERSE_SIDE } from '../ModificationVersions'\n\n\nexport type SchemaUpdater = (args: { schema: Schema }) => Schema\nexport type ModelUpdater = (args: { schema: Schema; model: Model.Schema }) => Model.Schema\nexport type EntityUpdater = (args: { schema: Schema; model: Model.Schema; entity: Model.Entity }) => Model.Entity\nexport type FieldUpdater<In extends Model.AnyField, Out extends Model.AnyField> = (args: {\n\tschema: Schema\n\tmodel: Model.Schema\n\tentity: Model.Entity\n\tfield: In\n}) => Out | undefined\nexport type AclUpdater = (args: { schema: Schema; acl: Acl.Schema }) => Acl.Schema\nexport type AclRoleUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n}) => Acl.RolePermissions\nexport type AclPermissionsUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n}) => Acl.Permissions\n\nexport type AclEntityPermissionsUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n\tentityName: string\n\tentityPermissions: Acl.EntityPermissions\n}) => Acl.EntityPermissions\n\nexport type EntityAclEveryPredicatesUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n\tentityName: string\n\tentityPermissions: Acl.EntityPermissions\n\tpredicate: Acl.PredicateDefinition\n}) => Acl.PredicateDefinition\n\nexport const updateSchema =\n\t(...schemaUpdater: (SchemaUpdater | undefined)[]): SchemaUpdater =>\n\t\targs =>\n\t\t\tschemaUpdater.filter(isDefined).reduce((schema, updater) => updater({ ...args, schema }), args.schema)\n\nexport const updateAcl =\n\t(updater: AclUpdater): SchemaUpdater =>\n\t\targs => ({\n\t\t\t...args.schema,\n\t\t\tacl: updater({ schema: args.schema, acl: args.schema.acl }),\n\t\t})\n\nexport const updateAclEveryRole =\n\t(...updater: AclRoleUpdater[]): AclUpdater =>\n\t\targs => ({\n\t\t\t...args.acl,\n\t\t\troles: Object.fromEntries(\n\t\t\t\tupdater.reduce(\n\t\t\t\t\t(acc, updater) => acc.map(([name, role]) => [name, updater({ ...args, role })]),\n\t\t\t\t\tObject.entries(args.acl.roles),\n\t\t\t\t),\n\t\t\t),\n\t\t})\n\nexport const updateAclEntities =\n\t(updater: AclPermissionsUpdater): AclRoleUpdater =>\n\t\targs => ({\n\t\t\t...args.role,\n\t\t\tentities: updater({ ...args, entities: args.role.entities }),\n\t\t})\n\nexport const updateAclEveryEntity =\n\t(...updater: AclEntityPermissionsUpdater[]): AclRoleUpdater =>\n\t\targs => ({\n\t\t\t...args.role,\n\t\t\tentities: Object.fromEntries(\n\t\t\t\tupdater.reduce(\n\t\t\t\t\t(acc, updater) =>\n\t\t\t\t\t\tacc.map(([entity, entityPermissions]) => [\n\t\t\t\t\t\t\tentity,\n\t\t\t\t\t\t\tupdater({\n\t\t\t\t\t\t\t\t...args,\n\t\t\t\t\t\t\t\tentities: args.role.entities,\n\t\t\t\t\t\t\t\tentityName: entity,\n\t\t\t\t\t\t\t\tentityPermissions,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t]),\n\t\t\t\t\tObject.entries(args.role.entities),\n\t\t\t\t),\n\t\t\t),\n\t\t})\n\ntype EntityAclFieldPermissionsUpdater = (\n\tfieldPermissions: Acl.FieldPermissions,\n\tentityName: string,\n\toperation: Acl.Operation,\n) => Acl.FieldPermissions\ntype EntityOperationHandler = {\n\t[K in keyof Required<Acl.EntityOperations>]: (\n\t\tvalue: Exclude<Acl.EntityOperations[K], undefined>,\n\t) => Acl.EntityOperations[K]\n}\n\nexport const updateAclFieldPermissions =\n\t(updater: EntityAclFieldPermissionsUpdater): AclEntityPermissionsUpdater =>\n\t\t({ entityPermissions, entityName }) => {\n\t\t\tconst operations: Writable<Acl.EntityOperations> = {}\n\t\t\tconst handlers: EntityOperationHandler = {\n\t\t\t\tcreate: value => updater(value, entityName, Acl.Operation.create),\n\t\t\t\tupdate: value => updater(value, entityName, Acl.Operation.update),\n\t\t\t\tread: value => updater(value, entityName, Acl.Operation.read),\n\t\t\t\tdelete: value => value,\n\t\t\t\tcustomPrimary: value => value,\n\t\t\t}\n\t\t\tconst types: (keyof Acl.EntityOperations)[] = ['create', 'update', 'read', 'delete', 'customPrimary']\n\t\t\tfor (const key of types) {\n\t\t\t\tif (key in entityPermissions.operations) {\n\t\t\t\t\toperations[key] = handlers[key](entityPermissions.operations[key] as any) as any\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...entityPermissions,\n\t\t\t\toperations,\n\t\t\t}\n\t\t}\n\nexport const updateAclEveryPredicate =\n\t(updater: EntityAclEveryPredicatesUpdater): AclEntityPermissionsUpdater =>\n\t\targs => {\n\t\t\treturn {\n\t\t\t\t...args.entityPermissions,\n\t\t\t\tpredicates: Object.fromEntries(\n\t\t\t\t\tObject.entries(args.entityPermissions.predicates).map(([name, predicate]) => [\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tupdater({\n\t\t\t\t\t\t\t...args,\n\t\t\t\t\t\t\tpredicate,\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\nexport const updateModel =\n\t(...modelUpdate: (ModelUpdater | undefined)[]): SchemaUpdater =>\n\t\targs => ({\n\t\t\t...args.schema,\n\t\t\tmodel: modelUpdate\n\t\t\t\t.filter((it): it is ModelUpdater => it !== undefined)\n\t\t\t\t.reduce((model, updater) => updater({ ...args, model }), args.schema.model),\n\t\t})\n\nexport const updateEntity =\n\t(name: string, entityUpdate: EntityUpdater): ModelUpdater =>\n\t\targs => {\n\t\t\tif (!args.model.entities[name]) {\n\t\t\t\tthrow new SchemaUpdateError(`Entity ${name} not found`)\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...args.model,\n\t\t\t\tentities: {\n\t\t\t\t\t...args.model.entities,\n\t\t\t\t\t[name]: entityUpdate({ ...args, entity: args.model.entities[name] }),\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\nexport const updateEveryEntity =\n\t(entityUpdate: EntityUpdater): ModelUpdater =>\n\t\targs => ({\n\t\t\t...args.model,\n\t\t\tentities: Object.fromEntries(\n\t\t\t\tObject.entries(args.model.entities).map(([name, entity]) => [name, entityUpdate({ ...args, entity })]),\n\t\t\t),\n\t\t})\n\nexport const updateField =\n\t<In extends Model.AnyField = Model.AnyField, Out extends Model.AnyField = In>(name: string, fieldUpdater: FieldUpdater<In, Out>): EntityUpdater =>\n\t\targs => {\n\t\t\tconst { [name]: field, ...otherFields } = args.entity.fields\n\t\t\tif (!args.entity.fields[name]) {\n\t\t\t\tthrow new SchemaUpdateError(`Field ${args.entity.name}::${name} not found`)\n\t\t\t}\n\t\t\tconst updatedField = fieldUpdater({ ...args, field: args.entity.fields[name] as In })\n\n\t\t\treturn {\n\t\t\t\t...args.entity,\n\t\t\t\tfields: {\n\t\t\t\t\t...otherFields,\n\t\t\t\t\t...(updatedField ? { [name]: updatedField } : {}),\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\nexport const updateEveryField =\n\t(fieldUpdater: FieldUpdater<Model.AnyField, Model.AnyField>): EntityUpdater =>\n\t\targs => ({\n\t\t\t...args.entity,\n\t\t\tfields: Object.fromEntries(\n\t\t\t\tObject.entries(args.entity.fields)\n\t\t\t\t\t.map(([name, field]) => {\n\t\t\t\t\t\tconst updatedField = fieldUpdater({ ...args, field })\n\t\t\t\t\t\tif (!updatedField) {\n\t\t\t\t\t\t\treturn undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn [name, updatedField]\n\t\t\t\t\t})\n\t\t\t\t\t.filter(isDefined),\n\t\t\t),\n\t\t})\n\nexport const addField =\n\t(field: Model.AnyField): EntityUpdater =>\n\t\targs => {\n\t\t\treturn {\n\t\t\t\t...args.entity,\n\t\t\t\tfields: {\n\t\t\t\t\t...args.entity.fields,\n\t\t\t\t\t[field.name]: field,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\nexport const removeField = (entityName: string, fieldName: string, version: number): SchemaUpdater => {\n\treturn ({ schema }) => {\n\t\tconst entity = schema.model.entities[entityName]\n\t\tconst field = entity.fields[fieldName]\n\t\treturn updateSchema(\n\t\t\tversion >= VERSION_ACL_PATCH\n\t\t\t\t? updateAcl(\n\t\t\t\t\tupdateAclEveryRole(\n\t\t\t\t\t\tupdateAclEveryEntity(\n\t\t\t\t\t\t\tupdateAclFieldPermissions((permissions, entityName) => {\n\t\t\t\t\t\t\t\tif (entityName !== entity.name) {\n\t\t\t\t\t\t\t\t\treturn permissions\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst { [fieldName]: field, ...other } = permissions\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...other,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tupdateAclEveryPredicate(({ predicate, entityName }) => {\n\t\t\t\t\t\t\t\tconst processor = new PredicateDefinitionProcessor(schema.model)\n\t\t\t\t\t\t\t\treturn processor.process(schema.model.entities[entityName], predicate, {\n\t\t\t\t\t\t\t\t\thandleColumn: ctx =>\n\t\t\t\t\t\t\t\t\t\tctx.entity.name === entity.name && ctx.column.name === field.name ? undefined : ctx.value,\n\t\t\t\t\t\t\t\t\thandleRelation: ctx =>\n\t\t\t\t\t\t\t\t\t\tctx.entity.name === entity.name && ctx.relation.name === field.name ? undefined : ctx.value,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t )\n\t\t\t\t: undefined,\n\t\t\tisRelation(field) &&\n\t\t\t\tisOwningRelation(field) &&\n\t\t\t\tfield.inversedBy &&\n\t\t\t\tversion >= VERSION_REMOVE_RELATION_INVERSE_SIDE\n\t\t\t\t? removeField(field.target, field.inversedBy, version)\n\t\t\t\t: undefined,\n\t\t\tupdateModel(\n\t\t\t\tupdateEntity(entity.name, ({ entity }) => {\n\t\t\t\t\tconst { [field.name]: removed, ...fields } = entity.fields\n\t\t\t\t\tconst indexes = entity.indexes.filter(index => !index.fields.includes(field.name))\n\t\t\t\t\tconst unique = entity.unique.filter(index => !index.fields.includes(field.name))\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...entity,\n\t\t\t\t\t\tfields,\n\t\t\t\t\t\tindexes,\n\t\t\t\t\t\tunique,\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\tisRelation(field) && isInverseRelation(field)\n\t\t\t\t\t? updateEntity(\n\t\t\t\t\t\tfield.target,\n\t\t\t\t\t\tupdateField<Model.AnyOwningRelation>(field.ownedBy, ({ field: { inversedBy, ...field } }) => field),\n\t\t\t\t\t )\n\t\t\t\t\t: undefined,\n\t\t\t),\n\t\t)({ schema })\n\t}\n}\n"],"names":["isDefined","schema","updater","Acl","SchemaUpdateError","VERSION_ACL_PATCH","entityName","field","PredicateDefinitionProcessor","isRelation","isOwningRelation","VERSION_REMOVE_RELATION_INVERSE_SIDE","entity","isInverseRelation"],"mappings":"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"}
1
+ {"version":3,"file":"schemaUpdateUtils.cjs","sources":["../../../../../../packages/schema-migrations/src/modifications/utils/schemaUpdateUtils.ts"],"sourcesContent":["import { Acl, Model, Schema, Writable } from '@contember/schema'\nimport { SchemaUpdateError } from '../exceptions'\nimport { isDefined } from '../../utils/isDefined'\nimport { isInverseRelation, isOwningRelation, isRelation, PredicateDefinitionProcessor } from '@contember/schema-utils'\nimport { VERSION_ACL_PATCH, VERSION_REMOVE_RELATION_INVERSE_SIDE } from '../ModificationVersions'\n\n\nexport type SchemaUpdater = (args: { schema: Schema }) => Schema\nexport type ModelUpdater = (args: { schema: Schema; model: Model.Schema }) => Model.Schema\nexport type EntityUpdater = (args: { schema: Schema; model: Model.Schema; entity: Model.Entity }) => Model.Entity\nexport type FieldUpdater<In extends Model.AnyField, Out extends Model.AnyField> = (args: {\n\tschema: Schema\n\tmodel: Model.Schema\n\tentity: Model.Entity\n\tfield: In\n}) => Out | undefined\nexport type AclUpdater = (args: { schema: Schema; acl: Acl.Schema }) => Acl.Schema\nexport type AclRoleUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n}) => Acl.RolePermissions\nexport type AclPermissionsUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n}) => Acl.Permissions\n\nexport type AclEntityPermissionsUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n\tentityName: string\n\tentityPermissions: Acl.EntityPermissions\n}) => Acl.EntityPermissions\n\nexport type EntityAclEveryPredicatesUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n\tentityName: string\n\tentityPermissions: Acl.EntityPermissions\n\tpredicate: Acl.PredicateDefinition\n}) => Acl.PredicateDefinition\n\nexport const updateSchema =\n\t(...schemaUpdater: (SchemaUpdater | undefined)[]): SchemaUpdater =>\n\t\targs =>\n\t\t\tschemaUpdater.filter(isDefined).reduce((schema, updater) => updater({ ...args, schema }), args.schema)\n\nexport const updateAcl =\n\t(updater: AclUpdater): SchemaUpdater =>\n\t\targs => ({\n\t\t\t...args.schema,\n\t\t\tacl: updater({ schema: args.schema, acl: args.schema.acl }),\n\t\t})\n\nexport const updateAclEveryRole =\n\t(...updater: AclRoleUpdater[]): AclUpdater =>\n\t\targs => ({\n\t\t\t...args.acl,\n\t\t\troles: Object.fromEntries(\n\t\t\t\tupdater.reduce(\n\t\t\t\t\t(acc, updater) => acc.map(([name, role]) => [name, updater({ ...args, role })]),\n\t\t\t\t\tObject.entries(args.acl.roles),\n\t\t\t\t),\n\t\t\t),\n\t\t})\n\nexport const updateAclEntities =\n\t(updater: AclPermissionsUpdater): AclRoleUpdater =>\n\t\targs => ({\n\t\t\t...args.role,\n\t\t\tentities: updater({ ...args, entities: args.role.entities }),\n\t\t})\n\nexport const updateAclEveryEntity =\n\t(...updater: AclEntityPermissionsUpdater[]): AclRoleUpdater =>\n\t\targs => ({\n\t\t\t...args.role,\n\t\t\tentities: Object.fromEntries(\n\t\t\t\tupdater.reduce(\n\t\t\t\t\t(acc, updater) =>\n\t\t\t\t\t\tacc.map(([entity, entityPermissions]) => [\n\t\t\t\t\t\t\tentity,\n\t\t\t\t\t\t\tupdater({\n\t\t\t\t\t\t\t\t...args,\n\t\t\t\t\t\t\t\tentities: args.role.entities,\n\t\t\t\t\t\t\t\tentityName: entity,\n\t\t\t\t\t\t\t\tentityPermissions,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t]),\n\t\t\t\t\tObject.entries(args.role.entities),\n\t\t\t\t),\n\t\t\t),\n\t\t})\n\ntype EntityAclFieldPermissionsUpdater = (\n\tfieldPermissions: Acl.FieldPermissions,\n\tentityName: string,\n\toperation: Acl.Operation,\n) => Acl.FieldPermissions\ntype EntityOperationHandler = {\n\t[K in keyof Required<Acl.EntityOperations>]: (\n\t\tvalue: Exclude<Acl.EntityOperations[K], undefined>,\n\t) => Acl.EntityOperations[K]\n}\n\nexport const updateAclFieldPermissions =\n\t(updater: EntityAclFieldPermissionsUpdater): AclEntityPermissionsUpdater =>\n\t\t({ entityPermissions, entityName }) => {\n\t\t\tconst operations: Writable<Acl.EntityOperations> = {}\n\t\t\tconst handlers: EntityOperationHandler = {\n\t\t\t\tcreate: value => updater(value, entityName, Acl.Operation.create),\n\t\t\t\tupdate: value => updater(value, entityName, Acl.Operation.update),\n\t\t\t\tread: value => updater(value, entityName, Acl.Operation.read),\n\t\t\t\tdelete: value => value,\n\t\t\t\tcustomPrimary: value => value,\n\t\t\t\tnoRoot: value => value,\n\t\t\t}\n\t\t\tconst types: (keyof Acl.EntityOperations)[] = ['create', 'update', 'read', 'delete', 'customPrimary', 'noRoot']\n\t\t\tfor (const key of types) {\n\t\t\t\tif (key in entityPermissions.operations) {\n\t\t\t\t\toperations[key] = handlers[key](entityPermissions.operations[key] as any) as any\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...entityPermissions,\n\t\t\t\toperations,\n\t\t\t}\n\t\t}\n\nexport const updateAclEveryPredicate =\n\t(updater: EntityAclEveryPredicatesUpdater): AclEntityPermissionsUpdater =>\n\t\targs => {\n\t\t\treturn {\n\t\t\t\t...args.entityPermissions,\n\t\t\t\tpredicates: Object.fromEntries(\n\t\t\t\t\tObject.entries(args.entityPermissions.predicates).map(([name, predicate]) => [\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tupdater({\n\t\t\t\t\t\t\t...args,\n\t\t\t\t\t\t\tpredicate,\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\nexport const updateModel =\n\t(...modelUpdate: (ModelUpdater | undefined)[]): SchemaUpdater =>\n\t\targs => ({\n\t\t\t...args.schema,\n\t\t\tmodel: modelUpdate\n\t\t\t\t.filter((it): it is ModelUpdater => it !== undefined)\n\t\t\t\t.reduce((model, updater) => updater({ ...args, model }), args.schema.model),\n\t\t})\n\nexport const updateEntity =\n\t(name: string, entityUpdate: EntityUpdater): ModelUpdater =>\n\t\targs => {\n\t\t\tif (!args.model.entities[name]) {\n\t\t\t\tthrow new SchemaUpdateError(`Entity ${name} not found`)\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...args.model,\n\t\t\t\tentities: {\n\t\t\t\t\t...args.model.entities,\n\t\t\t\t\t[name]: entityUpdate({ ...args, entity: args.model.entities[name] }),\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\nexport const updateEveryEntity =\n\t(entityUpdate: EntityUpdater): ModelUpdater =>\n\t\targs => ({\n\t\t\t...args.model,\n\t\t\tentities: Object.fromEntries(\n\t\t\t\tObject.entries(args.model.entities).map(([name, entity]) => [name, entityUpdate({ ...args, entity })]),\n\t\t\t),\n\t\t})\n\nexport const updateField =\n\t<In extends Model.AnyField = Model.AnyField, Out extends Model.AnyField = In>(name: string, fieldUpdater: FieldUpdater<In, Out>): EntityUpdater =>\n\t\targs => {\n\t\t\tconst { [name]: field, ...otherFields } = args.entity.fields\n\t\t\tif (!args.entity.fields[name]) {\n\t\t\t\tthrow new SchemaUpdateError(`Field ${args.entity.name}::${name} not found`)\n\t\t\t}\n\t\t\tconst updatedField = fieldUpdater({ ...args, field: args.entity.fields[name] as In })\n\n\t\t\treturn {\n\t\t\t\t...args.entity,\n\t\t\t\tfields: {\n\t\t\t\t\t...otherFields,\n\t\t\t\t\t...(updatedField ? { [name]: updatedField } : {}),\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\nexport const updateEveryField =\n\t(fieldUpdater: FieldUpdater<Model.AnyField, Model.AnyField>): EntityUpdater =>\n\t\targs => ({\n\t\t\t...args.entity,\n\t\t\tfields: Object.fromEntries(\n\t\t\t\tObject.entries(args.entity.fields)\n\t\t\t\t\t.map(([name, field]) => {\n\t\t\t\t\t\tconst updatedField = fieldUpdater({ ...args, field })\n\t\t\t\t\t\tif (!updatedField) {\n\t\t\t\t\t\t\treturn undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn [name, updatedField]\n\t\t\t\t\t})\n\t\t\t\t\t.filter(isDefined),\n\t\t\t),\n\t\t})\n\nexport const addField =\n\t(field: Model.AnyField): EntityUpdater =>\n\t\targs => {\n\t\t\treturn {\n\t\t\t\t...args.entity,\n\t\t\t\tfields: {\n\t\t\t\t\t...args.entity.fields,\n\t\t\t\t\t[field.name]: field,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\nexport const removeField = (entityName: string, fieldName: string, version: number): SchemaUpdater => {\n\treturn ({ schema }) => {\n\t\tconst entity = schema.model.entities[entityName]\n\t\tconst field = entity.fields[fieldName]\n\t\treturn updateSchema(\n\t\t\tversion >= VERSION_ACL_PATCH\n\t\t\t\t? updateAcl(\n\t\t\t\t\tupdateAclEveryRole(\n\t\t\t\t\t\tupdateAclEveryEntity(\n\t\t\t\t\t\t\tupdateAclFieldPermissions((permissions, entityName) => {\n\t\t\t\t\t\t\t\tif (entityName !== entity.name) {\n\t\t\t\t\t\t\t\t\treturn permissions\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst { [fieldName]: field, ...other } = permissions\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...other,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tupdateAclEveryPredicate(({ predicate, entityName }) => {\n\t\t\t\t\t\t\t\tconst processor = new PredicateDefinitionProcessor(schema.model)\n\t\t\t\t\t\t\t\treturn processor.process(schema.model.entities[entityName], predicate, {\n\t\t\t\t\t\t\t\t\thandleColumn: ctx =>\n\t\t\t\t\t\t\t\t\t\tctx.entity.name === entity.name && ctx.column.name === field.name ? undefined : ctx.value,\n\t\t\t\t\t\t\t\t\thandleRelation: ctx =>\n\t\t\t\t\t\t\t\t\t\tctx.entity.name === entity.name && ctx.relation.name === field.name ? undefined : ctx.value,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t )\n\t\t\t\t: undefined,\n\t\t\tisRelation(field) &&\n\t\t\t\tisOwningRelation(field) &&\n\t\t\t\tfield.inversedBy &&\n\t\t\t\tversion >= VERSION_REMOVE_RELATION_INVERSE_SIDE\n\t\t\t\t? removeField(field.target, field.inversedBy, version)\n\t\t\t\t: undefined,\n\t\t\tupdateModel(\n\t\t\t\tupdateEntity(entity.name, ({ entity }) => {\n\t\t\t\t\tconst { [field.name]: removed, ...fields } = entity.fields\n\t\t\t\t\tconst indexes = entity.indexes.filter(index => !index.fields.includes(field.name))\n\t\t\t\t\tconst unique = entity.unique.filter(index => !index.fields.includes(field.name))\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...entity,\n\t\t\t\t\t\tfields,\n\t\t\t\t\t\tindexes,\n\t\t\t\t\t\tunique,\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\tisRelation(field) && isInverseRelation(field)\n\t\t\t\t\t? updateEntity(\n\t\t\t\t\t\tfield.target,\n\t\t\t\t\t\tupdateField<Model.AnyOwningRelation>(field.ownedBy, ({ field: { inversedBy, ...field } }) => field),\n\t\t\t\t\t )\n\t\t\t\t\t: undefined,\n\t\t\t),\n\t\t)({ schema })\n\t}\n}\n"],"names":["isDefined","schema","updater","Acl","SchemaUpdateError","VERSION_ACL_PATCH","entityName","field","PredicateDefinitionProcessor","isRelation","isOwningRelation","VERSION_REMOVE_RELATION_INVERSE_SIDE","entity","isInverseRelation"],"mappings":"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"}
@@ -45,9 +45,10 @@ const updateAclFieldPermissions = (updater) => ({ entityPermissions, entityName
45
45
  update: (value) => updater(value, entityName, Acl.Operation.update),
46
46
  read: (value) => updater(value, entityName, Acl.Operation.read),
47
47
  delete: (value) => value,
48
- customPrimary: (value) => value
48
+ customPrimary: (value) => value,
49
+ noRoot: (value) => value
49
50
  };
50
- const types = ["create", "update", "read", "delete", "customPrimary"];
51
+ const types = ["create", "update", "read", "delete", "customPrimary", "noRoot"];
51
52
  for (const key of types) {
52
53
  if (key in entityPermissions.operations) {
53
54
  operations[key] = handlers[key](entityPermissions.operations[key]);
@@ -1 +1 @@
1
- {"version":3,"file":"schemaUpdateUtils.js","sources":["../../../../../../packages/schema-migrations/src/modifications/utils/schemaUpdateUtils.ts"],"sourcesContent":["import { Acl, Model, Schema, Writable } from '@contember/schema'\nimport { SchemaUpdateError } from '../exceptions'\nimport { isDefined } from '../../utils/isDefined'\nimport { isInverseRelation, isOwningRelation, isRelation, PredicateDefinitionProcessor } from '@contember/schema-utils'\nimport { VERSION_ACL_PATCH, VERSION_REMOVE_RELATION_INVERSE_SIDE } from '../ModificationVersions'\n\n\nexport type SchemaUpdater = (args: { schema: Schema }) => Schema\nexport type ModelUpdater = (args: { schema: Schema; model: Model.Schema }) => Model.Schema\nexport type EntityUpdater = (args: { schema: Schema; model: Model.Schema; entity: Model.Entity }) => Model.Entity\nexport type FieldUpdater<In extends Model.AnyField, Out extends Model.AnyField> = (args: {\n\tschema: Schema\n\tmodel: Model.Schema\n\tentity: Model.Entity\n\tfield: In\n}) => Out | undefined\nexport type AclUpdater = (args: { schema: Schema; acl: Acl.Schema }) => Acl.Schema\nexport type AclRoleUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n}) => Acl.RolePermissions\nexport type AclPermissionsUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n}) => Acl.Permissions\n\nexport type AclEntityPermissionsUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n\tentityName: string\n\tentityPermissions: Acl.EntityPermissions\n}) => Acl.EntityPermissions\n\nexport type EntityAclEveryPredicatesUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n\tentityName: string\n\tentityPermissions: Acl.EntityPermissions\n\tpredicate: Acl.PredicateDefinition\n}) => Acl.PredicateDefinition\n\nexport const updateSchema =\n\t(...schemaUpdater: (SchemaUpdater | undefined)[]): SchemaUpdater =>\n\t\targs =>\n\t\t\tschemaUpdater.filter(isDefined).reduce((schema, updater) => updater({ ...args, schema }), args.schema)\n\nexport const updateAcl =\n\t(updater: AclUpdater): SchemaUpdater =>\n\t\targs => ({\n\t\t\t...args.schema,\n\t\t\tacl: updater({ schema: args.schema, acl: args.schema.acl }),\n\t\t})\n\nexport const updateAclEveryRole =\n\t(...updater: AclRoleUpdater[]): AclUpdater =>\n\t\targs => ({\n\t\t\t...args.acl,\n\t\t\troles: Object.fromEntries(\n\t\t\t\tupdater.reduce(\n\t\t\t\t\t(acc, updater) => acc.map(([name, role]) => [name, updater({ ...args, role })]),\n\t\t\t\t\tObject.entries(args.acl.roles),\n\t\t\t\t),\n\t\t\t),\n\t\t})\n\nexport const updateAclEntities =\n\t(updater: AclPermissionsUpdater): AclRoleUpdater =>\n\t\targs => ({\n\t\t\t...args.role,\n\t\t\tentities: updater({ ...args, entities: args.role.entities }),\n\t\t})\n\nexport const updateAclEveryEntity =\n\t(...updater: AclEntityPermissionsUpdater[]): AclRoleUpdater =>\n\t\targs => ({\n\t\t\t...args.role,\n\t\t\tentities: Object.fromEntries(\n\t\t\t\tupdater.reduce(\n\t\t\t\t\t(acc, updater) =>\n\t\t\t\t\t\tacc.map(([entity, entityPermissions]) => [\n\t\t\t\t\t\t\tentity,\n\t\t\t\t\t\t\tupdater({\n\t\t\t\t\t\t\t\t...args,\n\t\t\t\t\t\t\t\tentities: args.role.entities,\n\t\t\t\t\t\t\t\tentityName: entity,\n\t\t\t\t\t\t\t\tentityPermissions,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t]),\n\t\t\t\t\tObject.entries(args.role.entities),\n\t\t\t\t),\n\t\t\t),\n\t\t})\n\ntype EntityAclFieldPermissionsUpdater = (\n\tfieldPermissions: Acl.FieldPermissions,\n\tentityName: string,\n\toperation: Acl.Operation,\n) => Acl.FieldPermissions\ntype EntityOperationHandler = {\n\t[K in keyof Required<Acl.EntityOperations>]: (\n\t\tvalue: Exclude<Acl.EntityOperations[K], undefined>,\n\t) => Acl.EntityOperations[K]\n}\n\nexport const updateAclFieldPermissions =\n\t(updater: EntityAclFieldPermissionsUpdater): AclEntityPermissionsUpdater =>\n\t\t({ entityPermissions, entityName }) => {\n\t\t\tconst operations: Writable<Acl.EntityOperations> = {}\n\t\t\tconst handlers: EntityOperationHandler = {\n\t\t\t\tcreate: value => updater(value, entityName, Acl.Operation.create),\n\t\t\t\tupdate: value => updater(value, entityName, Acl.Operation.update),\n\t\t\t\tread: value => updater(value, entityName, Acl.Operation.read),\n\t\t\t\tdelete: value => value,\n\t\t\t\tcustomPrimary: value => value,\n\t\t\t}\n\t\t\tconst types: (keyof Acl.EntityOperations)[] = ['create', 'update', 'read', 'delete', 'customPrimary']\n\t\t\tfor (const key of types) {\n\t\t\t\tif (key in entityPermissions.operations) {\n\t\t\t\t\toperations[key] = handlers[key](entityPermissions.operations[key] as any) as any\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...entityPermissions,\n\t\t\t\toperations,\n\t\t\t}\n\t\t}\n\nexport const updateAclEveryPredicate =\n\t(updater: EntityAclEveryPredicatesUpdater): AclEntityPermissionsUpdater =>\n\t\targs => {\n\t\t\treturn {\n\t\t\t\t...args.entityPermissions,\n\t\t\t\tpredicates: Object.fromEntries(\n\t\t\t\t\tObject.entries(args.entityPermissions.predicates).map(([name, predicate]) => [\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tupdater({\n\t\t\t\t\t\t\t...args,\n\t\t\t\t\t\t\tpredicate,\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\nexport const updateModel =\n\t(...modelUpdate: (ModelUpdater | undefined)[]): SchemaUpdater =>\n\t\targs => ({\n\t\t\t...args.schema,\n\t\t\tmodel: modelUpdate\n\t\t\t\t.filter((it): it is ModelUpdater => it !== undefined)\n\t\t\t\t.reduce((model, updater) => updater({ ...args, model }), args.schema.model),\n\t\t})\n\nexport const updateEntity =\n\t(name: string, entityUpdate: EntityUpdater): ModelUpdater =>\n\t\targs => {\n\t\t\tif (!args.model.entities[name]) {\n\t\t\t\tthrow new SchemaUpdateError(`Entity ${name} not found`)\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...args.model,\n\t\t\t\tentities: {\n\t\t\t\t\t...args.model.entities,\n\t\t\t\t\t[name]: entityUpdate({ ...args, entity: args.model.entities[name] }),\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\nexport const updateEveryEntity =\n\t(entityUpdate: EntityUpdater): ModelUpdater =>\n\t\targs => ({\n\t\t\t...args.model,\n\t\t\tentities: Object.fromEntries(\n\t\t\t\tObject.entries(args.model.entities).map(([name, entity]) => [name, entityUpdate({ ...args, entity })]),\n\t\t\t),\n\t\t})\n\nexport const updateField =\n\t<In extends Model.AnyField = Model.AnyField, Out extends Model.AnyField = In>(name: string, fieldUpdater: FieldUpdater<In, Out>): EntityUpdater =>\n\t\targs => {\n\t\t\tconst { [name]: field, ...otherFields } = args.entity.fields\n\t\t\tif (!args.entity.fields[name]) {\n\t\t\t\tthrow new SchemaUpdateError(`Field ${args.entity.name}::${name} not found`)\n\t\t\t}\n\t\t\tconst updatedField = fieldUpdater({ ...args, field: args.entity.fields[name] as In })\n\n\t\t\treturn {\n\t\t\t\t...args.entity,\n\t\t\t\tfields: {\n\t\t\t\t\t...otherFields,\n\t\t\t\t\t...(updatedField ? { [name]: updatedField } : {}),\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\nexport const updateEveryField =\n\t(fieldUpdater: FieldUpdater<Model.AnyField, Model.AnyField>): EntityUpdater =>\n\t\targs => ({\n\t\t\t...args.entity,\n\t\t\tfields: Object.fromEntries(\n\t\t\t\tObject.entries(args.entity.fields)\n\t\t\t\t\t.map(([name, field]) => {\n\t\t\t\t\t\tconst updatedField = fieldUpdater({ ...args, field })\n\t\t\t\t\t\tif (!updatedField) {\n\t\t\t\t\t\t\treturn undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn [name, updatedField]\n\t\t\t\t\t})\n\t\t\t\t\t.filter(isDefined),\n\t\t\t),\n\t\t})\n\nexport const addField =\n\t(field: Model.AnyField): EntityUpdater =>\n\t\targs => {\n\t\t\treturn {\n\t\t\t\t...args.entity,\n\t\t\t\tfields: {\n\t\t\t\t\t...args.entity.fields,\n\t\t\t\t\t[field.name]: field,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\nexport const removeField = (entityName: string, fieldName: string, version: number): SchemaUpdater => {\n\treturn ({ schema }) => {\n\t\tconst entity = schema.model.entities[entityName]\n\t\tconst field = entity.fields[fieldName]\n\t\treturn updateSchema(\n\t\t\tversion >= VERSION_ACL_PATCH\n\t\t\t\t? updateAcl(\n\t\t\t\t\tupdateAclEveryRole(\n\t\t\t\t\t\tupdateAclEveryEntity(\n\t\t\t\t\t\t\tupdateAclFieldPermissions((permissions, entityName) => {\n\t\t\t\t\t\t\t\tif (entityName !== entity.name) {\n\t\t\t\t\t\t\t\t\treturn permissions\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst { [fieldName]: field, ...other } = permissions\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...other,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tupdateAclEveryPredicate(({ predicate, entityName }) => {\n\t\t\t\t\t\t\t\tconst processor = new PredicateDefinitionProcessor(schema.model)\n\t\t\t\t\t\t\t\treturn processor.process(schema.model.entities[entityName], predicate, {\n\t\t\t\t\t\t\t\t\thandleColumn: ctx =>\n\t\t\t\t\t\t\t\t\t\tctx.entity.name === entity.name && ctx.column.name === field.name ? undefined : ctx.value,\n\t\t\t\t\t\t\t\t\thandleRelation: ctx =>\n\t\t\t\t\t\t\t\t\t\tctx.entity.name === entity.name && ctx.relation.name === field.name ? undefined : ctx.value,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t )\n\t\t\t\t: undefined,\n\t\t\tisRelation(field) &&\n\t\t\t\tisOwningRelation(field) &&\n\t\t\t\tfield.inversedBy &&\n\t\t\t\tversion >= VERSION_REMOVE_RELATION_INVERSE_SIDE\n\t\t\t\t? removeField(field.target, field.inversedBy, version)\n\t\t\t\t: undefined,\n\t\t\tupdateModel(\n\t\t\t\tupdateEntity(entity.name, ({ entity }) => {\n\t\t\t\t\tconst { [field.name]: removed, ...fields } = entity.fields\n\t\t\t\t\tconst indexes = entity.indexes.filter(index => !index.fields.includes(field.name))\n\t\t\t\t\tconst unique = entity.unique.filter(index => !index.fields.includes(field.name))\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...entity,\n\t\t\t\t\t\tfields,\n\t\t\t\t\t\tindexes,\n\t\t\t\t\t\tunique,\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\tisRelation(field) && isInverseRelation(field)\n\t\t\t\t\t? updateEntity(\n\t\t\t\t\t\tfield.target,\n\t\t\t\t\t\tupdateField<Model.AnyOwningRelation>(field.ownedBy, ({ field: { inversedBy, ...field } }) => field),\n\t\t\t\t\t )\n\t\t\t\t\t: undefined,\n\t\t\t),\n\t\t)({ schema })\n\t}\n}\n"],"names":["updater","entityName","field","entity"],"mappings":"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"}
1
+ {"version":3,"file":"schemaUpdateUtils.js","sources":["../../../../../../packages/schema-migrations/src/modifications/utils/schemaUpdateUtils.ts"],"sourcesContent":["import { Acl, Model, Schema, Writable } from '@contember/schema'\nimport { SchemaUpdateError } from '../exceptions'\nimport { isDefined } from '../../utils/isDefined'\nimport { isInverseRelation, isOwningRelation, isRelation, PredicateDefinitionProcessor } from '@contember/schema-utils'\nimport { VERSION_ACL_PATCH, VERSION_REMOVE_RELATION_INVERSE_SIDE } from '../ModificationVersions'\n\n\nexport type SchemaUpdater = (args: { schema: Schema }) => Schema\nexport type ModelUpdater = (args: { schema: Schema; model: Model.Schema }) => Model.Schema\nexport type EntityUpdater = (args: { schema: Schema; model: Model.Schema; entity: Model.Entity }) => Model.Entity\nexport type FieldUpdater<In extends Model.AnyField, Out extends Model.AnyField> = (args: {\n\tschema: Schema\n\tmodel: Model.Schema\n\tentity: Model.Entity\n\tfield: In\n}) => Out | undefined\nexport type AclUpdater = (args: { schema: Schema; acl: Acl.Schema }) => Acl.Schema\nexport type AclRoleUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n}) => Acl.RolePermissions\nexport type AclPermissionsUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n}) => Acl.Permissions\n\nexport type AclEntityPermissionsUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n\tentityName: string\n\tentityPermissions: Acl.EntityPermissions\n}) => Acl.EntityPermissions\n\nexport type EntityAclEveryPredicatesUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n\tentityName: string\n\tentityPermissions: Acl.EntityPermissions\n\tpredicate: Acl.PredicateDefinition\n}) => Acl.PredicateDefinition\n\nexport const updateSchema =\n\t(...schemaUpdater: (SchemaUpdater | undefined)[]): SchemaUpdater =>\n\t\targs =>\n\t\t\tschemaUpdater.filter(isDefined).reduce((schema, updater) => updater({ ...args, schema }), args.schema)\n\nexport const updateAcl =\n\t(updater: AclUpdater): SchemaUpdater =>\n\t\targs => ({\n\t\t\t...args.schema,\n\t\t\tacl: updater({ schema: args.schema, acl: args.schema.acl }),\n\t\t})\n\nexport const updateAclEveryRole =\n\t(...updater: AclRoleUpdater[]): AclUpdater =>\n\t\targs => ({\n\t\t\t...args.acl,\n\t\t\troles: Object.fromEntries(\n\t\t\t\tupdater.reduce(\n\t\t\t\t\t(acc, updater) => acc.map(([name, role]) => [name, updater({ ...args, role })]),\n\t\t\t\t\tObject.entries(args.acl.roles),\n\t\t\t\t),\n\t\t\t),\n\t\t})\n\nexport const updateAclEntities =\n\t(updater: AclPermissionsUpdater): AclRoleUpdater =>\n\t\targs => ({\n\t\t\t...args.role,\n\t\t\tentities: updater({ ...args, entities: args.role.entities }),\n\t\t})\n\nexport const updateAclEveryEntity =\n\t(...updater: AclEntityPermissionsUpdater[]): AclRoleUpdater =>\n\t\targs => ({\n\t\t\t...args.role,\n\t\t\tentities: Object.fromEntries(\n\t\t\t\tupdater.reduce(\n\t\t\t\t\t(acc, updater) =>\n\t\t\t\t\t\tacc.map(([entity, entityPermissions]) => [\n\t\t\t\t\t\t\tentity,\n\t\t\t\t\t\t\tupdater({\n\t\t\t\t\t\t\t\t...args,\n\t\t\t\t\t\t\t\tentities: args.role.entities,\n\t\t\t\t\t\t\t\tentityName: entity,\n\t\t\t\t\t\t\t\tentityPermissions,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t]),\n\t\t\t\t\tObject.entries(args.role.entities),\n\t\t\t\t),\n\t\t\t),\n\t\t})\n\ntype EntityAclFieldPermissionsUpdater = (\n\tfieldPermissions: Acl.FieldPermissions,\n\tentityName: string,\n\toperation: Acl.Operation,\n) => Acl.FieldPermissions\ntype EntityOperationHandler = {\n\t[K in keyof Required<Acl.EntityOperations>]: (\n\t\tvalue: Exclude<Acl.EntityOperations[K], undefined>,\n\t) => Acl.EntityOperations[K]\n}\n\nexport const updateAclFieldPermissions =\n\t(updater: EntityAclFieldPermissionsUpdater): AclEntityPermissionsUpdater =>\n\t\t({ entityPermissions, entityName }) => {\n\t\t\tconst operations: Writable<Acl.EntityOperations> = {}\n\t\t\tconst handlers: EntityOperationHandler = {\n\t\t\t\tcreate: value => updater(value, entityName, Acl.Operation.create),\n\t\t\t\tupdate: value => updater(value, entityName, Acl.Operation.update),\n\t\t\t\tread: value => updater(value, entityName, Acl.Operation.read),\n\t\t\t\tdelete: value => value,\n\t\t\t\tcustomPrimary: value => value,\n\t\t\t\tnoRoot: value => value,\n\t\t\t}\n\t\t\tconst types: (keyof Acl.EntityOperations)[] = ['create', 'update', 'read', 'delete', 'customPrimary', 'noRoot']\n\t\t\tfor (const key of types) {\n\t\t\t\tif (key in entityPermissions.operations) {\n\t\t\t\t\toperations[key] = handlers[key](entityPermissions.operations[key] as any) as any\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...entityPermissions,\n\t\t\t\toperations,\n\t\t\t}\n\t\t}\n\nexport const updateAclEveryPredicate =\n\t(updater: EntityAclEveryPredicatesUpdater): AclEntityPermissionsUpdater =>\n\t\targs => {\n\t\t\treturn {\n\t\t\t\t...args.entityPermissions,\n\t\t\t\tpredicates: Object.fromEntries(\n\t\t\t\t\tObject.entries(args.entityPermissions.predicates).map(([name, predicate]) => [\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tupdater({\n\t\t\t\t\t\t\t...args,\n\t\t\t\t\t\t\tpredicate,\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\nexport const updateModel =\n\t(...modelUpdate: (ModelUpdater | undefined)[]): SchemaUpdater =>\n\t\targs => ({\n\t\t\t...args.schema,\n\t\t\tmodel: modelUpdate\n\t\t\t\t.filter((it): it is ModelUpdater => it !== undefined)\n\t\t\t\t.reduce((model, updater) => updater({ ...args, model }), args.schema.model),\n\t\t})\n\nexport const updateEntity =\n\t(name: string, entityUpdate: EntityUpdater): ModelUpdater =>\n\t\targs => {\n\t\t\tif (!args.model.entities[name]) {\n\t\t\t\tthrow new SchemaUpdateError(`Entity ${name} not found`)\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...args.model,\n\t\t\t\tentities: {\n\t\t\t\t\t...args.model.entities,\n\t\t\t\t\t[name]: entityUpdate({ ...args, entity: args.model.entities[name] }),\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\nexport const updateEveryEntity =\n\t(entityUpdate: EntityUpdater): ModelUpdater =>\n\t\targs => ({\n\t\t\t...args.model,\n\t\t\tentities: Object.fromEntries(\n\t\t\t\tObject.entries(args.model.entities).map(([name, entity]) => [name, entityUpdate({ ...args, entity })]),\n\t\t\t),\n\t\t})\n\nexport const updateField =\n\t<In extends Model.AnyField = Model.AnyField, Out extends Model.AnyField = In>(name: string, fieldUpdater: FieldUpdater<In, Out>): EntityUpdater =>\n\t\targs => {\n\t\t\tconst { [name]: field, ...otherFields } = args.entity.fields\n\t\t\tif (!args.entity.fields[name]) {\n\t\t\t\tthrow new SchemaUpdateError(`Field ${args.entity.name}::${name} not found`)\n\t\t\t}\n\t\t\tconst updatedField = fieldUpdater({ ...args, field: args.entity.fields[name] as In })\n\n\t\t\treturn {\n\t\t\t\t...args.entity,\n\t\t\t\tfields: {\n\t\t\t\t\t...otherFields,\n\t\t\t\t\t...(updatedField ? { [name]: updatedField } : {}),\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\nexport const updateEveryField =\n\t(fieldUpdater: FieldUpdater<Model.AnyField, Model.AnyField>): EntityUpdater =>\n\t\targs => ({\n\t\t\t...args.entity,\n\t\t\tfields: Object.fromEntries(\n\t\t\t\tObject.entries(args.entity.fields)\n\t\t\t\t\t.map(([name, field]) => {\n\t\t\t\t\t\tconst updatedField = fieldUpdater({ ...args, field })\n\t\t\t\t\t\tif (!updatedField) {\n\t\t\t\t\t\t\treturn undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn [name, updatedField]\n\t\t\t\t\t})\n\t\t\t\t\t.filter(isDefined),\n\t\t\t),\n\t\t})\n\nexport const addField =\n\t(field: Model.AnyField): EntityUpdater =>\n\t\targs => {\n\t\t\treturn {\n\t\t\t\t...args.entity,\n\t\t\t\tfields: {\n\t\t\t\t\t...args.entity.fields,\n\t\t\t\t\t[field.name]: field,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\nexport const removeField = (entityName: string, fieldName: string, version: number): SchemaUpdater => {\n\treturn ({ schema }) => {\n\t\tconst entity = schema.model.entities[entityName]\n\t\tconst field = entity.fields[fieldName]\n\t\treturn updateSchema(\n\t\t\tversion >= VERSION_ACL_PATCH\n\t\t\t\t? updateAcl(\n\t\t\t\t\tupdateAclEveryRole(\n\t\t\t\t\t\tupdateAclEveryEntity(\n\t\t\t\t\t\t\tupdateAclFieldPermissions((permissions, entityName) => {\n\t\t\t\t\t\t\t\tif (entityName !== entity.name) {\n\t\t\t\t\t\t\t\t\treturn permissions\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst { [fieldName]: field, ...other } = permissions\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...other,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tupdateAclEveryPredicate(({ predicate, entityName }) => {\n\t\t\t\t\t\t\t\tconst processor = new PredicateDefinitionProcessor(schema.model)\n\t\t\t\t\t\t\t\treturn processor.process(schema.model.entities[entityName], predicate, {\n\t\t\t\t\t\t\t\t\thandleColumn: ctx =>\n\t\t\t\t\t\t\t\t\t\tctx.entity.name === entity.name && ctx.column.name === field.name ? undefined : ctx.value,\n\t\t\t\t\t\t\t\t\thandleRelation: ctx =>\n\t\t\t\t\t\t\t\t\t\tctx.entity.name === entity.name && ctx.relation.name === field.name ? undefined : ctx.value,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t )\n\t\t\t\t: undefined,\n\t\t\tisRelation(field) &&\n\t\t\t\tisOwningRelation(field) &&\n\t\t\t\tfield.inversedBy &&\n\t\t\t\tversion >= VERSION_REMOVE_RELATION_INVERSE_SIDE\n\t\t\t\t? removeField(field.target, field.inversedBy, version)\n\t\t\t\t: undefined,\n\t\t\tupdateModel(\n\t\t\t\tupdateEntity(entity.name, ({ entity }) => {\n\t\t\t\t\tconst { [field.name]: removed, ...fields } = entity.fields\n\t\t\t\t\tconst indexes = entity.indexes.filter(index => !index.fields.includes(field.name))\n\t\t\t\t\tconst unique = entity.unique.filter(index => !index.fields.includes(field.name))\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...entity,\n\t\t\t\t\t\tfields,\n\t\t\t\t\t\tindexes,\n\t\t\t\t\t\tunique,\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\tisRelation(field) && isInverseRelation(field)\n\t\t\t\t\t? updateEntity(\n\t\t\t\t\t\tfield.target,\n\t\t\t\t\t\tupdateField<Model.AnyOwningRelation>(field.ownedBy, ({ field: { inversedBy, ...field } }) => field),\n\t\t\t\t\t )\n\t\t\t\t\t: undefined,\n\t\t\t),\n\t\t)({ schema })\n\t}\n}\n"],"names":["updater","entityName","field","entity"],"mappings":"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"}
@@ -47,9 +47,10 @@ const updateAclFieldPermissions = (updater) => ({ entityPermissions, entityName
47
47
  update: (value) => updater(value, entityName, schema.Acl.Operation.update),
48
48
  read: (value) => updater(value, entityName, schema.Acl.Operation.read),
49
49
  delete: (value) => value,
50
- customPrimary: (value) => value
50
+ customPrimary: (value) => value,
51
+ noRoot: (value) => value
51
52
  };
52
- const types = ["create", "update", "read", "delete", "customPrimary"];
53
+ const types = ["create", "update", "read", "delete", "customPrimary", "noRoot"];
53
54
  for (const key of types) {
54
55
  if (key in entityPermissions.operations) {
55
56
  operations[key] = handlers[key](entityPermissions.operations[key]);
@@ -1 +1 @@
1
- {"version":3,"file":"schemaUpdateUtils.cjs","sources":["../../../../../../packages/schema-migrations/src/modifications/utils/schemaUpdateUtils.ts"],"sourcesContent":["import { Acl, Model, Schema, Writable } from '@contember/schema'\nimport { SchemaUpdateError } from '../exceptions'\nimport { isDefined } from '../../utils/isDefined'\nimport { isInverseRelation, isOwningRelation, isRelation, PredicateDefinitionProcessor } from '@contember/schema-utils'\nimport { VERSION_ACL_PATCH, VERSION_REMOVE_RELATION_INVERSE_SIDE } from '../ModificationVersions'\n\n\nexport type SchemaUpdater = (args: { schema: Schema }) => Schema\nexport type ModelUpdater = (args: { schema: Schema; model: Model.Schema }) => Model.Schema\nexport type EntityUpdater = (args: { schema: Schema; model: Model.Schema; entity: Model.Entity }) => Model.Entity\nexport type FieldUpdater<In extends Model.AnyField, Out extends Model.AnyField> = (args: {\n\tschema: Schema\n\tmodel: Model.Schema\n\tentity: Model.Entity\n\tfield: In\n}) => Out | undefined\nexport type AclUpdater = (args: { schema: Schema; acl: Acl.Schema }) => Acl.Schema\nexport type AclRoleUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n}) => Acl.RolePermissions\nexport type AclPermissionsUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n}) => Acl.Permissions\n\nexport type AclEntityPermissionsUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n\tentityName: string\n\tentityPermissions: Acl.EntityPermissions\n}) => Acl.EntityPermissions\n\nexport type EntityAclEveryPredicatesUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n\tentityName: string\n\tentityPermissions: Acl.EntityPermissions\n\tpredicate: Acl.PredicateDefinition\n}) => Acl.PredicateDefinition\n\nexport const updateSchema =\n\t(...schemaUpdater: (SchemaUpdater | undefined)[]): SchemaUpdater =>\n\t\targs =>\n\t\t\tschemaUpdater.filter(isDefined).reduce((schema, updater) => updater({ ...args, schema }), args.schema)\n\nexport const updateAcl =\n\t(updater: AclUpdater): SchemaUpdater =>\n\t\targs => ({\n\t\t\t...args.schema,\n\t\t\tacl: updater({ schema: args.schema, acl: args.schema.acl }),\n\t\t})\n\nexport const updateAclEveryRole =\n\t(...updater: AclRoleUpdater[]): AclUpdater =>\n\t\targs => ({\n\t\t\t...args.acl,\n\t\t\troles: Object.fromEntries(\n\t\t\t\tupdater.reduce(\n\t\t\t\t\t(acc, updater) => acc.map(([name, role]) => [name, updater({ ...args, role })]),\n\t\t\t\t\tObject.entries(args.acl.roles),\n\t\t\t\t),\n\t\t\t),\n\t\t})\n\nexport const updateAclEntities =\n\t(updater: AclPermissionsUpdater): AclRoleUpdater =>\n\t\targs => ({\n\t\t\t...args.role,\n\t\t\tentities: updater({ ...args, entities: args.role.entities }),\n\t\t})\n\nexport const updateAclEveryEntity =\n\t(...updater: AclEntityPermissionsUpdater[]): AclRoleUpdater =>\n\t\targs => ({\n\t\t\t...args.role,\n\t\t\tentities: Object.fromEntries(\n\t\t\t\tupdater.reduce(\n\t\t\t\t\t(acc, updater) =>\n\t\t\t\t\t\tacc.map(([entity, entityPermissions]) => [\n\t\t\t\t\t\t\tentity,\n\t\t\t\t\t\t\tupdater({\n\t\t\t\t\t\t\t\t...args,\n\t\t\t\t\t\t\t\tentities: args.role.entities,\n\t\t\t\t\t\t\t\tentityName: entity,\n\t\t\t\t\t\t\t\tentityPermissions,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t]),\n\t\t\t\t\tObject.entries(args.role.entities),\n\t\t\t\t),\n\t\t\t),\n\t\t})\n\ntype EntityAclFieldPermissionsUpdater = (\n\tfieldPermissions: Acl.FieldPermissions,\n\tentityName: string,\n\toperation: Acl.Operation,\n) => Acl.FieldPermissions\ntype EntityOperationHandler = {\n\t[K in keyof Required<Acl.EntityOperations>]: (\n\t\tvalue: Exclude<Acl.EntityOperations[K], undefined>,\n\t) => Acl.EntityOperations[K]\n}\n\nexport const updateAclFieldPermissions =\n\t(updater: EntityAclFieldPermissionsUpdater): AclEntityPermissionsUpdater =>\n\t\t({ entityPermissions, entityName }) => {\n\t\t\tconst operations: Writable<Acl.EntityOperations> = {}\n\t\t\tconst handlers: EntityOperationHandler = {\n\t\t\t\tcreate: value => updater(value, entityName, Acl.Operation.create),\n\t\t\t\tupdate: value => updater(value, entityName, Acl.Operation.update),\n\t\t\t\tread: value => updater(value, entityName, Acl.Operation.read),\n\t\t\t\tdelete: value => value,\n\t\t\t\tcustomPrimary: value => value,\n\t\t\t}\n\t\t\tconst types: (keyof Acl.EntityOperations)[] = ['create', 'update', 'read', 'delete', 'customPrimary']\n\t\t\tfor (const key of types) {\n\t\t\t\tif (key in entityPermissions.operations) {\n\t\t\t\t\toperations[key] = handlers[key](entityPermissions.operations[key] as any) as any\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...entityPermissions,\n\t\t\t\toperations,\n\t\t\t}\n\t\t}\n\nexport const updateAclEveryPredicate =\n\t(updater: EntityAclEveryPredicatesUpdater): AclEntityPermissionsUpdater =>\n\t\targs => {\n\t\t\treturn {\n\t\t\t\t...args.entityPermissions,\n\t\t\t\tpredicates: Object.fromEntries(\n\t\t\t\t\tObject.entries(args.entityPermissions.predicates).map(([name, predicate]) => [\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tupdater({\n\t\t\t\t\t\t\t...args,\n\t\t\t\t\t\t\tpredicate,\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\nexport const updateModel =\n\t(...modelUpdate: (ModelUpdater | undefined)[]): SchemaUpdater =>\n\t\targs => ({\n\t\t\t...args.schema,\n\t\t\tmodel: modelUpdate\n\t\t\t\t.filter((it): it is ModelUpdater => it !== undefined)\n\t\t\t\t.reduce((model, updater) => updater({ ...args, model }), args.schema.model),\n\t\t})\n\nexport const updateEntity =\n\t(name: string, entityUpdate: EntityUpdater): ModelUpdater =>\n\t\targs => {\n\t\t\tif (!args.model.entities[name]) {\n\t\t\t\tthrow new SchemaUpdateError(`Entity ${name} not found`)\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...args.model,\n\t\t\t\tentities: {\n\t\t\t\t\t...args.model.entities,\n\t\t\t\t\t[name]: entityUpdate({ ...args, entity: args.model.entities[name] }),\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\nexport const updateEveryEntity =\n\t(entityUpdate: EntityUpdater): ModelUpdater =>\n\t\targs => ({\n\t\t\t...args.model,\n\t\t\tentities: Object.fromEntries(\n\t\t\t\tObject.entries(args.model.entities).map(([name, entity]) => [name, entityUpdate({ ...args, entity })]),\n\t\t\t),\n\t\t})\n\nexport const updateField =\n\t<In extends Model.AnyField = Model.AnyField, Out extends Model.AnyField = In>(name: string, fieldUpdater: FieldUpdater<In, Out>): EntityUpdater =>\n\t\targs => {\n\t\t\tconst { [name]: field, ...otherFields } = args.entity.fields\n\t\t\tif (!args.entity.fields[name]) {\n\t\t\t\tthrow new SchemaUpdateError(`Field ${args.entity.name}::${name} not found`)\n\t\t\t}\n\t\t\tconst updatedField = fieldUpdater({ ...args, field: args.entity.fields[name] as In })\n\n\t\t\treturn {\n\t\t\t\t...args.entity,\n\t\t\t\tfields: {\n\t\t\t\t\t...otherFields,\n\t\t\t\t\t...(updatedField ? { [name]: updatedField } : {}),\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\nexport const updateEveryField =\n\t(fieldUpdater: FieldUpdater<Model.AnyField, Model.AnyField>): EntityUpdater =>\n\t\targs => ({\n\t\t\t...args.entity,\n\t\t\tfields: Object.fromEntries(\n\t\t\t\tObject.entries(args.entity.fields)\n\t\t\t\t\t.map(([name, field]) => {\n\t\t\t\t\t\tconst updatedField = fieldUpdater({ ...args, field })\n\t\t\t\t\t\tif (!updatedField) {\n\t\t\t\t\t\t\treturn undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn [name, updatedField]\n\t\t\t\t\t})\n\t\t\t\t\t.filter(isDefined),\n\t\t\t),\n\t\t})\n\nexport const addField =\n\t(field: Model.AnyField): EntityUpdater =>\n\t\targs => {\n\t\t\treturn {\n\t\t\t\t...args.entity,\n\t\t\t\tfields: {\n\t\t\t\t\t...args.entity.fields,\n\t\t\t\t\t[field.name]: field,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\nexport const removeField = (entityName: string, fieldName: string, version: number): SchemaUpdater => {\n\treturn ({ schema }) => {\n\t\tconst entity = schema.model.entities[entityName]\n\t\tconst field = entity.fields[fieldName]\n\t\treturn updateSchema(\n\t\t\tversion >= VERSION_ACL_PATCH\n\t\t\t\t? updateAcl(\n\t\t\t\t\tupdateAclEveryRole(\n\t\t\t\t\t\tupdateAclEveryEntity(\n\t\t\t\t\t\t\tupdateAclFieldPermissions((permissions, entityName) => {\n\t\t\t\t\t\t\t\tif (entityName !== entity.name) {\n\t\t\t\t\t\t\t\t\treturn permissions\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst { [fieldName]: field, ...other } = permissions\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...other,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tupdateAclEveryPredicate(({ predicate, entityName }) => {\n\t\t\t\t\t\t\t\tconst processor = new PredicateDefinitionProcessor(schema.model)\n\t\t\t\t\t\t\t\treturn processor.process(schema.model.entities[entityName], predicate, {\n\t\t\t\t\t\t\t\t\thandleColumn: ctx =>\n\t\t\t\t\t\t\t\t\t\tctx.entity.name === entity.name && ctx.column.name === field.name ? undefined : ctx.value,\n\t\t\t\t\t\t\t\t\thandleRelation: ctx =>\n\t\t\t\t\t\t\t\t\t\tctx.entity.name === entity.name && ctx.relation.name === field.name ? undefined : ctx.value,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t )\n\t\t\t\t: undefined,\n\t\t\tisRelation(field) &&\n\t\t\t\tisOwningRelation(field) &&\n\t\t\t\tfield.inversedBy &&\n\t\t\t\tversion >= VERSION_REMOVE_RELATION_INVERSE_SIDE\n\t\t\t\t? removeField(field.target, field.inversedBy, version)\n\t\t\t\t: undefined,\n\t\t\tupdateModel(\n\t\t\t\tupdateEntity(entity.name, ({ entity }) => {\n\t\t\t\t\tconst { [field.name]: removed, ...fields } = entity.fields\n\t\t\t\t\tconst indexes = entity.indexes.filter(index => !index.fields.includes(field.name))\n\t\t\t\t\tconst unique = entity.unique.filter(index => !index.fields.includes(field.name))\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...entity,\n\t\t\t\t\t\tfields,\n\t\t\t\t\t\tindexes,\n\t\t\t\t\t\tunique,\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\tisRelation(field) && isInverseRelation(field)\n\t\t\t\t\t? updateEntity(\n\t\t\t\t\t\tfield.target,\n\t\t\t\t\t\tupdateField<Model.AnyOwningRelation>(field.ownedBy, ({ field: { inversedBy, ...field } }) => field),\n\t\t\t\t\t )\n\t\t\t\t\t: undefined,\n\t\t\t),\n\t\t)({ schema })\n\t}\n}\n"],"names":["isDefined","schema","updater","Acl","SchemaUpdateError","VERSION_ACL_PATCH","entityName","field","PredicateDefinitionProcessor","isRelation","isOwningRelation","VERSION_REMOVE_RELATION_INVERSE_SIDE","entity","isInverseRelation"],"mappings":"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"}
1
+ {"version":3,"file":"schemaUpdateUtils.cjs","sources":["../../../../../../packages/schema-migrations/src/modifications/utils/schemaUpdateUtils.ts"],"sourcesContent":["import { Acl, Model, Schema, Writable } from '@contember/schema'\nimport { SchemaUpdateError } from '../exceptions'\nimport { isDefined } from '../../utils/isDefined'\nimport { isInverseRelation, isOwningRelation, isRelation, PredicateDefinitionProcessor } from '@contember/schema-utils'\nimport { VERSION_ACL_PATCH, VERSION_REMOVE_RELATION_INVERSE_SIDE } from '../ModificationVersions'\n\n\nexport type SchemaUpdater = (args: { schema: Schema }) => Schema\nexport type ModelUpdater = (args: { schema: Schema; model: Model.Schema }) => Model.Schema\nexport type EntityUpdater = (args: { schema: Schema; model: Model.Schema; entity: Model.Entity }) => Model.Entity\nexport type FieldUpdater<In extends Model.AnyField, Out extends Model.AnyField> = (args: {\n\tschema: Schema\n\tmodel: Model.Schema\n\tentity: Model.Entity\n\tfield: In\n}) => Out | undefined\nexport type AclUpdater = (args: { schema: Schema; acl: Acl.Schema }) => Acl.Schema\nexport type AclRoleUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n}) => Acl.RolePermissions\nexport type AclPermissionsUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n}) => Acl.Permissions\n\nexport type AclEntityPermissionsUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n\tentityName: string\n\tentityPermissions: Acl.EntityPermissions\n}) => Acl.EntityPermissions\n\nexport type EntityAclEveryPredicatesUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n\tentityName: string\n\tentityPermissions: Acl.EntityPermissions\n\tpredicate: Acl.PredicateDefinition\n}) => Acl.PredicateDefinition\n\nexport const updateSchema =\n\t(...schemaUpdater: (SchemaUpdater | undefined)[]): SchemaUpdater =>\n\t\targs =>\n\t\t\tschemaUpdater.filter(isDefined).reduce((schema, updater) => updater({ ...args, schema }), args.schema)\n\nexport const updateAcl =\n\t(updater: AclUpdater): SchemaUpdater =>\n\t\targs => ({\n\t\t\t...args.schema,\n\t\t\tacl: updater({ schema: args.schema, acl: args.schema.acl }),\n\t\t})\n\nexport const updateAclEveryRole =\n\t(...updater: AclRoleUpdater[]): AclUpdater =>\n\t\targs => ({\n\t\t\t...args.acl,\n\t\t\troles: Object.fromEntries(\n\t\t\t\tupdater.reduce(\n\t\t\t\t\t(acc, updater) => acc.map(([name, role]) => [name, updater({ ...args, role })]),\n\t\t\t\t\tObject.entries(args.acl.roles),\n\t\t\t\t),\n\t\t\t),\n\t\t})\n\nexport const updateAclEntities =\n\t(updater: AclPermissionsUpdater): AclRoleUpdater =>\n\t\targs => ({\n\t\t\t...args.role,\n\t\t\tentities: updater({ ...args, entities: args.role.entities }),\n\t\t})\n\nexport const updateAclEveryEntity =\n\t(...updater: AclEntityPermissionsUpdater[]): AclRoleUpdater =>\n\t\targs => ({\n\t\t\t...args.role,\n\t\t\tentities: Object.fromEntries(\n\t\t\t\tupdater.reduce(\n\t\t\t\t\t(acc, updater) =>\n\t\t\t\t\t\tacc.map(([entity, entityPermissions]) => [\n\t\t\t\t\t\t\tentity,\n\t\t\t\t\t\t\tupdater({\n\t\t\t\t\t\t\t\t...args,\n\t\t\t\t\t\t\t\tentities: args.role.entities,\n\t\t\t\t\t\t\t\tentityName: entity,\n\t\t\t\t\t\t\t\tentityPermissions,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t]),\n\t\t\t\t\tObject.entries(args.role.entities),\n\t\t\t\t),\n\t\t\t),\n\t\t})\n\ntype EntityAclFieldPermissionsUpdater = (\n\tfieldPermissions: Acl.FieldPermissions,\n\tentityName: string,\n\toperation: Acl.Operation,\n) => Acl.FieldPermissions\ntype EntityOperationHandler = {\n\t[K in keyof Required<Acl.EntityOperations>]: (\n\t\tvalue: Exclude<Acl.EntityOperations[K], undefined>,\n\t) => Acl.EntityOperations[K]\n}\n\nexport const updateAclFieldPermissions =\n\t(updater: EntityAclFieldPermissionsUpdater): AclEntityPermissionsUpdater =>\n\t\t({ entityPermissions, entityName }) => {\n\t\t\tconst operations: Writable<Acl.EntityOperations> = {}\n\t\t\tconst handlers: EntityOperationHandler = {\n\t\t\t\tcreate: value => updater(value, entityName, Acl.Operation.create),\n\t\t\t\tupdate: value => updater(value, entityName, Acl.Operation.update),\n\t\t\t\tread: value => updater(value, entityName, Acl.Operation.read),\n\t\t\t\tdelete: value => value,\n\t\t\t\tcustomPrimary: value => value,\n\t\t\t\tnoRoot: value => value,\n\t\t\t}\n\t\t\tconst types: (keyof Acl.EntityOperations)[] = ['create', 'update', 'read', 'delete', 'customPrimary', 'noRoot']\n\t\t\tfor (const key of types) {\n\t\t\t\tif (key in entityPermissions.operations) {\n\t\t\t\t\toperations[key] = handlers[key](entityPermissions.operations[key] as any) as any\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...entityPermissions,\n\t\t\t\toperations,\n\t\t\t}\n\t\t}\n\nexport const updateAclEveryPredicate =\n\t(updater: EntityAclEveryPredicatesUpdater): AclEntityPermissionsUpdater =>\n\t\targs => {\n\t\t\treturn {\n\t\t\t\t...args.entityPermissions,\n\t\t\t\tpredicates: Object.fromEntries(\n\t\t\t\t\tObject.entries(args.entityPermissions.predicates).map(([name, predicate]) => [\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tupdater({\n\t\t\t\t\t\t\t...args,\n\t\t\t\t\t\t\tpredicate,\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\nexport const updateModel =\n\t(...modelUpdate: (ModelUpdater | undefined)[]): SchemaUpdater =>\n\t\targs => ({\n\t\t\t...args.schema,\n\t\t\tmodel: modelUpdate\n\t\t\t\t.filter((it): it is ModelUpdater => it !== undefined)\n\t\t\t\t.reduce((model, updater) => updater({ ...args, model }), args.schema.model),\n\t\t})\n\nexport const updateEntity =\n\t(name: string, entityUpdate: EntityUpdater): ModelUpdater =>\n\t\targs => {\n\t\t\tif (!args.model.entities[name]) {\n\t\t\t\tthrow new SchemaUpdateError(`Entity ${name} not found`)\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...args.model,\n\t\t\t\tentities: {\n\t\t\t\t\t...args.model.entities,\n\t\t\t\t\t[name]: entityUpdate({ ...args, entity: args.model.entities[name] }),\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\nexport const updateEveryEntity =\n\t(entityUpdate: EntityUpdater): ModelUpdater =>\n\t\targs => ({\n\t\t\t...args.model,\n\t\t\tentities: Object.fromEntries(\n\t\t\t\tObject.entries(args.model.entities).map(([name, entity]) => [name, entityUpdate({ ...args, entity })]),\n\t\t\t),\n\t\t})\n\nexport const updateField =\n\t<In extends Model.AnyField = Model.AnyField, Out extends Model.AnyField = In>(name: string, fieldUpdater: FieldUpdater<In, Out>): EntityUpdater =>\n\t\targs => {\n\t\t\tconst { [name]: field, ...otherFields } = args.entity.fields\n\t\t\tif (!args.entity.fields[name]) {\n\t\t\t\tthrow new SchemaUpdateError(`Field ${args.entity.name}::${name} not found`)\n\t\t\t}\n\t\t\tconst updatedField = fieldUpdater({ ...args, field: args.entity.fields[name] as In })\n\n\t\t\treturn {\n\t\t\t\t...args.entity,\n\t\t\t\tfields: {\n\t\t\t\t\t...otherFields,\n\t\t\t\t\t...(updatedField ? { [name]: updatedField } : {}),\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\nexport const updateEveryField =\n\t(fieldUpdater: FieldUpdater<Model.AnyField, Model.AnyField>): EntityUpdater =>\n\t\targs => ({\n\t\t\t...args.entity,\n\t\t\tfields: Object.fromEntries(\n\t\t\t\tObject.entries(args.entity.fields)\n\t\t\t\t\t.map(([name, field]) => {\n\t\t\t\t\t\tconst updatedField = fieldUpdater({ ...args, field })\n\t\t\t\t\t\tif (!updatedField) {\n\t\t\t\t\t\t\treturn undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn [name, updatedField]\n\t\t\t\t\t})\n\t\t\t\t\t.filter(isDefined),\n\t\t\t),\n\t\t})\n\nexport const addField =\n\t(field: Model.AnyField): EntityUpdater =>\n\t\targs => {\n\t\t\treturn {\n\t\t\t\t...args.entity,\n\t\t\t\tfields: {\n\t\t\t\t\t...args.entity.fields,\n\t\t\t\t\t[field.name]: field,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\nexport const removeField = (entityName: string, fieldName: string, version: number): SchemaUpdater => {\n\treturn ({ schema }) => {\n\t\tconst entity = schema.model.entities[entityName]\n\t\tconst field = entity.fields[fieldName]\n\t\treturn updateSchema(\n\t\t\tversion >= VERSION_ACL_PATCH\n\t\t\t\t? updateAcl(\n\t\t\t\t\tupdateAclEveryRole(\n\t\t\t\t\t\tupdateAclEveryEntity(\n\t\t\t\t\t\t\tupdateAclFieldPermissions((permissions, entityName) => {\n\t\t\t\t\t\t\t\tif (entityName !== entity.name) {\n\t\t\t\t\t\t\t\t\treturn permissions\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst { [fieldName]: field, ...other } = permissions\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...other,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tupdateAclEveryPredicate(({ predicate, entityName }) => {\n\t\t\t\t\t\t\t\tconst processor = new PredicateDefinitionProcessor(schema.model)\n\t\t\t\t\t\t\t\treturn processor.process(schema.model.entities[entityName], predicate, {\n\t\t\t\t\t\t\t\t\thandleColumn: ctx =>\n\t\t\t\t\t\t\t\t\t\tctx.entity.name === entity.name && ctx.column.name === field.name ? undefined : ctx.value,\n\t\t\t\t\t\t\t\t\thandleRelation: ctx =>\n\t\t\t\t\t\t\t\t\t\tctx.entity.name === entity.name && ctx.relation.name === field.name ? undefined : ctx.value,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t )\n\t\t\t\t: undefined,\n\t\t\tisRelation(field) &&\n\t\t\t\tisOwningRelation(field) &&\n\t\t\t\tfield.inversedBy &&\n\t\t\t\tversion >= VERSION_REMOVE_RELATION_INVERSE_SIDE\n\t\t\t\t? removeField(field.target, field.inversedBy, version)\n\t\t\t\t: undefined,\n\t\t\tupdateModel(\n\t\t\t\tupdateEntity(entity.name, ({ entity }) => {\n\t\t\t\t\tconst { [field.name]: removed, ...fields } = entity.fields\n\t\t\t\t\tconst indexes = entity.indexes.filter(index => !index.fields.includes(field.name))\n\t\t\t\t\tconst unique = entity.unique.filter(index => !index.fields.includes(field.name))\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...entity,\n\t\t\t\t\t\tfields,\n\t\t\t\t\t\tindexes,\n\t\t\t\t\t\tunique,\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\tisRelation(field) && isInverseRelation(field)\n\t\t\t\t\t? updateEntity(\n\t\t\t\t\t\tfield.target,\n\t\t\t\t\t\tupdateField<Model.AnyOwningRelation>(field.ownedBy, ({ field: { inversedBy, ...field } }) => field),\n\t\t\t\t\t )\n\t\t\t\t\t: undefined,\n\t\t\t),\n\t\t)({ schema })\n\t}\n}\n"],"names":["isDefined","schema","updater","Acl","SchemaUpdateError","VERSION_ACL_PATCH","entityName","field","PredicateDefinitionProcessor","isRelation","isOwningRelation","VERSION_REMOVE_RELATION_INVERSE_SIDE","entity","isInverseRelation"],"mappings":";;;;;;;AAgDa,MAAA,eACZ,IAAI,kBACH,CAAA,SACC,cAAc,OAAOA,UAAAA,SAAS,EAAE,OAAO,CAACC,SAAQ,YAAY,QAAQ,EAAE,GAAG,MAAM,QAAAA,QAAQ,CAAA,GAAG,KAAK,MAAM;AAE3F,MAAA,YACZ,CAAC,YACA,CAAS,UAAA;AAAA,EACR,GAAG,KAAK;AAAA,EACR,KAAK,QAAQ,EAAE,QAAQ,KAAK,QAAQ,KAAK,KAAK,OAAO,IAAK,CAAA;AAC3D;AAEW,MAAA,qBACZ,IAAI,YACH,CAAS,UAAA;AAAA,EACR,GAAG,KAAK;AAAA,EACR,OAAO,OAAO;AAAA,IACb,QAAQ;AAAA,MACP,CAAC,KAAKC,aAAY,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,MAAMA,SAAQ,EAAE,GAAG,MAAM,KAAM,CAAA,CAAC,CAAC;AAAA,MAC9E,OAAO,QAAQ,KAAK,IAAI,KAAK;AAAA,IAAA;AAAA,EAC9B;AAEF;AAEW,MAAA,oBACZ,CAAC,YACA,CAAS,UAAA;AAAA,EACR,GAAG,KAAK;AAAA,EACR,UAAU,QAAQ,EAAE,GAAG,MAAM,UAAU,KAAK,KAAK,SAAU,CAAA;AAC5D;AAEW,MAAA,uBACZ,IAAI,YACH,CAAS,UAAA;AAAA,EACR,GAAG,KAAK;AAAA,EACR,UAAU,OAAO;AAAA,IAChB,QAAQ;AAAA,MACP,CAAC,KAAKA,aACL,IAAI,IAAI,CAAC,CAAC,QAAQ,iBAAiB,MAAM;AAAA,QACxC;AAAA,QACAA,SAAQ;AAAA,UACP,GAAG;AAAA,UACH,UAAU,KAAK,KAAK;AAAA,UACpB,YAAY;AAAA,UACZ;AAAA,QACA,CAAA;AAAA,MAAA,CACD;AAAA,MACF,OAAO,QAAQ,KAAK,KAAK,QAAQ;AAAA,IAAA;AAAA,EAClC;AAEF;AAaK,MAAM,4BACZ,CAAC,YACA,CAAC,EAAE,mBAAmB,iBAAiB;AACtC,QAAM,aAA6C,CAAC;AACpD,QAAM,WAAmC;AAAA,IACxC,QAAQ,CAAS,UAAA,QAAQ,OAAO,YAAYC,OAAA,IAAI,UAAU,MAAM;AAAA,IAChE,QAAQ,CAAS,UAAA,QAAQ,OAAO,YAAYA,OAAA,IAAI,UAAU,MAAM;AAAA,IAChE,MAAM,CAAS,UAAA,QAAQ,OAAO,YAAYA,OAAA,IAAI,UAAU,IAAI;AAAA,IAC5D,QAAQ,CAAS,UAAA;AAAA,IACjB,eAAe,CAAS,UAAA;AAAA,IACxB,QAAQ,CAAS,UAAA;AAAA,EAClB;AACA,QAAM,QAAwC,CAAC,UAAU,UAAU,QAAQ,UAAU,iBAAiB,QAAQ;AAC9G,aAAW,OAAO,OAAO;AACpB,QAAA,OAAO,kBAAkB,YAAY;AAC7B,iBAAA,GAAG,IAAI,SAAS,GAAG,EAAE,kBAAkB,WAAW,GAAG,CAAQ;AAAA,IAAA;AAAA,EACzE;AAGM,SAAA;AAAA,IACN,GAAG;AAAA,IACH;AAAA,EACD;AACD;AAEW,MAAA,0BACZ,CAAC,YACA,CAAQ,SAAA;AACA,SAAA;AAAA,IACN,GAAG,KAAK;AAAA,IACR,YAAY,OAAO;AAAA,MAClB,OAAO,QAAQ,KAAK,kBAAkB,UAAU,EAAE,IAAI,CAAC,CAAC,MAAM,SAAS,MAAM;AAAA,QAC5E;AAAA,QACA,QAAQ;AAAA,UACP,GAAG;AAAA,UACH;AAAA,QACA,CAAA;AAAA,MACD,CAAA;AAAA,IAAA;AAAA,EAEH;AACD;AAEW,MAAA,cACZ,IAAI,gBACH,CAAS,UAAA;AAAA,EACR,GAAG,KAAK;AAAA,EACR,OAAO,YACL,OAAO,CAAC,OAA2B,OAAO,MAAS,EACnD,OAAO,CAAC,OAAO,YAAY,QAAQ,EAAE,GAAG,MAAM,OAAO,GAAG,KAAK,OAAO,KAAK;AAC5E;AAEK,MAAM,eACZ,CAAC,MAAc,iBACd,CAAQ,SAAA;AACP,MAAI,CAAC,KAAK,MAAM,SAAS,IAAI,GAAG;AAC/B,UAAM,IAAIC,WAAAA,kBAAkB,UAAU,IAAI,YAAY;AAAA,EAAA;AAEhD,SAAA;AAAA,IACN,GAAG,KAAK;AAAA,IACR,UAAU;AAAA,MACT,GAAG,KAAK,MAAM;AAAA,MACd,CAAC,IAAI,GAAG,aAAa,EAAE,GAAG,MAAM,QAAQ,KAAK,MAAM,SAAS,IAAI,EAAG,CAAA;AAAA,IAAA;AAAA,EAErE;AACD;AAEW,MAAA,oBACZ,CAAC,iBACA,CAAS,UAAA;AAAA,EACR,GAAG,KAAK;AAAA,EACR,UAAU,OAAO;AAAA,IAChB,OAAO,QAAQ,KAAK,MAAM,QAAQ,EAAE,IAAI,CAAC,CAAC,MAAM,MAAM,MAAM,CAAC,MAAM,aAAa,EAAE,GAAG,MAAM,OAAA,CAAQ,CAAC,CAAC;AAAA,EAAA;AAEvG;AAEK,MAAM,cACZ,CAA8E,MAAc,iBAC3F,CAAQ,SAAA;AACD,QAAA,EAAE,CAAC,IAAI,GAAG,OAAO,GAAG,gBAAgB,KAAK,OAAO;AACtD,MAAI,CAAC,KAAK,OAAO,OAAO,IAAI,GAAG;AACxB,UAAA,IAAIA,WAAAA,kBAAkB,SAAS,KAAK,OAAO,IAAI,KAAK,IAAI,YAAY;AAAA,EAAA;AAErE,QAAA,eAAe,aAAa,EAAE,GAAG,MAAM,OAAO,KAAK,OAAO,OAAO,IAAI,GAAS;AAE7E,SAAA;AAAA,IACN,GAAG,KAAK;AAAA,IACR,QAAQ;AAAA,MACP,GAAG;AAAA,MACH,GAAI,eAAe,EAAE,CAAC,IAAI,GAAG,aAAA,IAAiB,CAAA;AAAA,IAAC;AAAA,EAEjD;AACD;AAEW,MAAA,mBACZ,CAAC,iBACA,CAAS,UAAA;AAAA,EACR,GAAG,KAAK;AAAA,EACR,QAAQ,OAAO;AAAA,IACd,OAAO,QAAQ,KAAK,OAAO,MAAM,EAC/B,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM;AACvB,YAAM,eAAe,aAAa,EAAE,GAAG,MAAM,OAAO;AACpD,UAAI,CAAC,cAAc;AACX,eAAA;AAAA,MAAA;AAED,aAAA,CAAC,MAAM,YAAY;AAAA,IAAA,CAC1B,EACA,OAAOJ,UAAS,SAAA;AAAA,EAAA;AAEpB;AAEW,MAAA,WACZ,CAAC,UACA,CAAQ,SAAA;AACA,SAAA;AAAA,IACN,GAAG,KAAK;AAAA,IACR,QAAQ;AAAA,MACP,GAAG,KAAK,OAAO;AAAA,MACf,CAAC,MAAM,IAAI,GAAG;AAAA,IAAA;AAAA,EAEhB;AACD;AAEK,MAAM,cAAc,CAAC,YAAoB,WAAmB,YAAmC;AAC9F,SAAA,CAAC,EAAE,QAAAC,cAAa;AACtB,UAAM,SAASA,QAAO,MAAM,SAAS,UAAU;AACzC,UAAA,QAAQ,OAAO,OAAO,SAAS;AAC9B,WAAA;AAAA,MACN,WAAWI,qBACR,oBAAA;AAAA,QACD;AAAA,UACC;AAAA,YACC,0BAA0B,CAAC,aAAaC,gBAAe;AAClDA,kBAAAA,gBAAe,OAAO,MAAM;AACxB,uBAAA;AAAA,cAAA;AAER,oBAAM,EAAE,CAAC,SAAS,GAAGC,QAAO,GAAG,MAAU,IAAA;AAClC,qBAAA;AAAA,gBACN,GAAG;AAAA,cACJ;AAAA,YAAA,CACA;AAAA,YACD,wBAAwB,CAAC,EAAE,WAAW,YAAAD,kBAAiB;AACtD,oBAAM,YAAY,IAAIE,yCAA6BP,QAAO,KAAK;AAC/D,qBAAO,UAAU,QAAQA,QAAO,MAAM,SAASK,WAAU,GAAG,WAAW;AAAA,gBACtE,cAAc,CAAA,QACb,IAAI,OAAO,SAAS,OAAO,QAAQ,IAAI,OAAO,SAAS,MAAM,OAAO,SAAY,IAAI;AAAA,gBACrF,gBAAgB,CAAA,QACf,IAAI,OAAO,SAAS,OAAO,QAAQ,IAAI,SAAS,SAAS,MAAM,OAAO,SAAY,IAAI;AAAA,cAAA,CACvF;AAAA,YACD,CAAA;AAAA,UAAA;AAAA,QACF;AAAA,MAGA,IAAA;AAAA,MACHG,uBAAW,KAAK,KACfC,YAAiB,iBAAA,KAAK,KACtB,MAAM,cACN,WAAWC,qBAAA,uCACT,YAAY,MAAM,QAAQ,MAAM,YAAY,OAAO,IACnD;AAAA,MACH;AAAA,QACC,aAAa,OAAO,MAAM,CAAC,EAAE,QAAAC,cAAa;AACnC,gBAAA,EAAE,CAAC,MAAM,IAAI,GAAG,SAAS,GAAG,OAAO,IAAIA,QAAO;AAC9C,gBAAA,UAAUA,QAAO,QAAQ,OAAO,CAAA,UAAS,CAAC,MAAM,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3E,gBAAA,SAASA,QAAO,OAAO,OAAO,CAAA,UAAS,CAAC,MAAM,OAAO,SAAS,MAAM,IAAI,CAAC;AACxE,iBAAA;AAAA,YACN,GAAGA;AAAAA,YACH;AAAA,YACA;AAAA,YACA;AAAA,UACD;AAAA,QAAA,CACA;AAAA,QACDH,YAAAA,WAAW,KAAK,KAAKI,8BAAkB,KAAK,IACzC;AAAA,UACD,MAAM;AAAA,UACN,YAAqC,MAAM,SAAS,CAAC,EAAE,OAAO,EAAE,YAAY,GAAGN,OAAQ,EAAA,MAAMA,MAAK;AAAA,QAAA,IAEjG;AAAA,MAAA;AAAA,IACJ,EACC,EAAE,QAAAN,QAAA,CAAQ;AAAA,EACb;AACD;;;;;;;;;;;;;;;"}
@@ -45,9 +45,10 @@ const updateAclFieldPermissions = (updater) => ({ entityPermissions, entityName
45
45
  update: (value) => updater(value, entityName, Acl.Operation.update),
46
46
  read: (value) => updater(value, entityName, Acl.Operation.read),
47
47
  delete: (value) => value,
48
- customPrimary: (value) => value
48
+ customPrimary: (value) => value,
49
+ noRoot: (value) => value
49
50
  };
50
- const types = ["create", "update", "read", "delete", "customPrimary"];
51
+ const types = ["create", "update", "read", "delete", "customPrimary", "noRoot"];
51
52
  for (const key of types) {
52
53
  if (key in entityPermissions.operations) {
53
54
  operations[key] = handlers[key](entityPermissions.operations[key]);
@@ -1 +1 @@
1
- {"version":3,"file":"schemaUpdateUtils.js","sources":["../../../../../../packages/schema-migrations/src/modifications/utils/schemaUpdateUtils.ts"],"sourcesContent":["import { Acl, Model, Schema, Writable } from '@contember/schema'\nimport { SchemaUpdateError } from '../exceptions'\nimport { isDefined } from '../../utils/isDefined'\nimport { isInverseRelation, isOwningRelation, isRelation, PredicateDefinitionProcessor } from '@contember/schema-utils'\nimport { VERSION_ACL_PATCH, VERSION_REMOVE_RELATION_INVERSE_SIDE } from '../ModificationVersions'\n\n\nexport type SchemaUpdater = (args: { schema: Schema }) => Schema\nexport type ModelUpdater = (args: { schema: Schema; model: Model.Schema }) => Model.Schema\nexport type EntityUpdater = (args: { schema: Schema; model: Model.Schema; entity: Model.Entity }) => Model.Entity\nexport type FieldUpdater<In extends Model.AnyField, Out extends Model.AnyField> = (args: {\n\tschema: Schema\n\tmodel: Model.Schema\n\tentity: Model.Entity\n\tfield: In\n}) => Out | undefined\nexport type AclUpdater = (args: { schema: Schema; acl: Acl.Schema }) => Acl.Schema\nexport type AclRoleUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n}) => Acl.RolePermissions\nexport type AclPermissionsUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n}) => Acl.Permissions\n\nexport type AclEntityPermissionsUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n\tentityName: string\n\tentityPermissions: Acl.EntityPermissions\n}) => Acl.EntityPermissions\n\nexport type EntityAclEveryPredicatesUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n\tentityName: string\n\tentityPermissions: Acl.EntityPermissions\n\tpredicate: Acl.PredicateDefinition\n}) => Acl.PredicateDefinition\n\nexport const updateSchema =\n\t(...schemaUpdater: (SchemaUpdater | undefined)[]): SchemaUpdater =>\n\t\targs =>\n\t\t\tschemaUpdater.filter(isDefined).reduce((schema, updater) => updater({ ...args, schema }), args.schema)\n\nexport const updateAcl =\n\t(updater: AclUpdater): SchemaUpdater =>\n\t\targs => ({\n\t\t\t...args.schema,\n\t\t\tacl: updater({ schema: args.schema, acl: args.schema.acl }),\n\t\t})\n\nexport const updateAclEveryRole =\n\t(...updater: AclRoleUpdater[]): AclUpdater =>\n\t\targs => ({\n\t\t\t...args.acl,\n\t\t\troles: Object.fromEntries(\n\t\t\t\tupdater.reduce(\n\t\t\t\t\t(acc, updater) => acc.map(([name, role]) => [name, updater({ ...args, role })]),\n\t\t\t\t\tObject.entries(args.acl.roles),\n\t\t\t\t),\n\t\t\t),\n\t\t})\n\nexport const updateAclEntities =\n\t(updater: AclPermissionsUpdater): AclRoleUpdater =>\n\t\targs => ({\n\t\t\t...args.role,\n\t\t\tentities: updater({ ...args, entities: args.role.entities }),\n\t\t})\n\nexport const updateAclEveryEntity =\n\t(...updater: AclEntityPermissionsUpdater[]): AclRoleUpdater =>\n\t\targs => ({\n\t\t\t...args.role,\n\t\t\tentities: Object.fromEntries(\n\t\t\t\tupdater.reduce(\n\t\t\t\t\t(acc, updater) =>\n\t\t\t\t\t\tacc.map(([entity, entityPermissions]) => [\n\t\t\t\t\t\t\tentity,\n\t\t\t\t\t\t\tupdater({\n\t\t\t\t\t\t\t\t...args,\n\t\t\t\t\t\t\t\tentities: args.role.entities,\n\t\t\t\t\t\t\t\tentityName: entity,\n\t\t\t\t\t\t\t\tentityPermissions,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t]),\n\t\t\t\t\tObject.entries(args.role.entities),\n\t\t\t\t),\n\t\t\t),\n\t\t})\n\ntype EntityAclFieldPermissionsUpdater = (\n\tfieldPermissions: Acl.FieldPermissions,\n\tentityName: string,\n\toperation: Acl.Operation,\n) => Acl.FieldPermissions\ntype EntityOperationHandler = {\n\t[K in keyof Required<Acl.EntityOperations>]: (\n\t\tvalue: Exclude<Acl.EntityOperations[K], undefined>,\n\t) => Acl.EntityOperations[K]\n}\n\nexport const updateAclFieldPermissions =\n\t(updater: EntityAclFieldPermissionsUpdater): AclEntityPermissionsUpdater =>\n\t\t({ entityPermissions, entityName }) => {\n\t\t\tconst operations: Writable<Acl.EntityOperations> = {}\n\t\t\tconst handlers: EntityOperationHandler = {\n\t\t\t\tcreate: value => updater(value, entityName, Acl.Operation.create),\n\t\t\t\tupdate: value => updater(value, entityName, Acl.Operation.update),\n\t\t\t\tread: value => updater(value, entityName, Acl.Operation.read),\n\t\t\t\tdelete: value => value,\n\t\t\t\tcustomPrimary: value => value,\n\t\t\t}\n\t\t\tconst types: (keyof Acl.EntityOperations)[] = ['create', 'update', 'read', 'delete', 'customPrimary']\n\t\t\tfor (const key of types) {\n\t\t\t\tif (key in entityPermissions.operations) {\n\t\t\t\t\toperations[key] = handlers[key](entityPermissions.operations[key] as any) as any\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...entityPermissions,\n\t\t\t\toperations,\n\t\t\t}\n\t\t}\n\nexport const updateAclEveryPredicate =\n\t(updater: EntityAclEveryPredicatesUpdater): AclEntityPermissionsUpdater =>\n\t\targs => {\n\t\t\treturn {\n\t\t\t\t...args.entityPermissions,\n\t\t\t\tpredicates: Object.fromEntries(\n\t\t\t\t\tObject.entries(args.entityPermissions.predicates).map(([name, predicate]) => [\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tupdater({\n\t\t\t\t\t\t\t...args,\n\t\t\t\t\t\t\tpredicate,\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\nexport const updateModel =\n\t(...modelUpdate: (ModelUpdater | undefined)[]): SchemaUpdater =>\n\t\targs => ({\n\t\t\t...args.schema,\n\t\t\tmodel: modelUpdate\n\t\t\t\t.filter((it): it is ModelUpdater => it !== undefined)\n\t\t\t\t.reduce((model, updater) => updater({ ...args, model }), args.schema.model),\n\t\t})\n\nexport const updateEntity =\n\t(name: string, entityUpdate: EntityUpdater): ModelUpdater =>\n\t\targs => {\n\t\t\tif (!args.model.entities[name]) {\n\t\t\t\tthrow new SchemaUpdateError(`Entity ${name} not found`)\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...args.model,\n\t\t\t\tentities: {\n\t\t\t\t\t...args.model.entities,\n\t\t\t\t\t[name]: entityUpdate({ ...args, entity: args.model.entities[name] }),\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\nexport const updateEveryEntity =\n\t(entityUpdate: EntityUpdater): ModelUpdater =>\n\t\targs => ({\n\t\t\t...args.model,\n\t\t\tentities: Object.fromEntries(\n\t\t\t\tObject.entries(args.model.entities).map(([name, entity]) => [name, entityUpdate({ ...args, entity })]),\n\t\t\t),\n\t\t})\n\nexport const updateField =\n\t<In extends Model.AnyField = Model.AnyField, Out extends Model.AnyField = In>(name: string, fieldUpdater: FieldUpdater<In, Out>): EntityUpdater =>\n\t\targs => {\n\t\t\tconst { [name]: field, ...otherFields } = args.entity.fields\n\t\t\tif (!args.entity.fields[name]) {\n\t\t\t\tthrow new SchemaUpdateError(`Field ${args.entity.name}::${name} not found`)\n\t\t\t}\n\t\t\tconst updatedField = fieldUpdater({ ...args, field: args.entity.fields[name] as In })\n\n\t\t\treturn {\n\t\t\t\t...args.entity,\n\t\t\t\tfields: {\n\t\t\t\t\t...otherFields,\n\t\t\t\t\t...(updatedField ? { [name]: updatedField } : {}),\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\nexport const updateEveryField =\n\t(fieldUpdater: FieldUpdater<Model.AnyField, Model.AnyField>): EntityUpdater =>\n\t\targs => ({\n\t\t\t...args.entity,\n\t\t\tfields: Object.fromEntries(\n\t\t\t\tObject.entries(args.entity.fields)\n\t\t\t\t\t.map(([name, field]) => {\n\t\t\t\t\t\tconst updatedField = fieldUpdater({ ...args, field })\n\t\t\t\t\t\tif (!updatedField) {\n\t\t\t\t\t\t\treturn undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn [name, updatedField]\n\t\t\t\t\t})\n\t\t\t\t\t.filter(isDefined),\n\t\t\t),\n\t\t})\n\nexport const addField =\n\t(field: Model.AnyField): EntityUpdater =>\n\t\targs => {\n\t\t\treturn {\n\t\t\t\t...args.entity,\n\t\t\t\tfields: {\n\t\t\t\t\t...args.entity.fields,\n\t\t\t\t\t[field.name]: field,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\nexport const removeField = (entityName: string, fieldName: string, version: number): SchemaUpdater => {\n\treturn ({ schema }) => {\n\t\tconst entity = schema.model.entities[entityName]\n\t\tconst field = entity.fields[fieldName]\n\t\treturn updateSchema(\n\t\t\tversion >= VERSION_ACL_PATCH\n\t\t\t\t? updateAcl(\n\t\t\t\t\tupdateAclEveryRole(\n\t\t\t\t\t\tupdateAclEveryEntity(\n\t\t\t\t\t\t\tupdateAclFieldPermissions((permissions, entityName) => {\n\t\t\t\t\t\t\t\tif (entityName !== entity.name) {\n\t\t\t\t\t\t\t\t\treturn permissions\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst { [fieldName]: field, ...other } = permissions\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...other,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tupdateAclEveryPredicate(({ predicate, entityName }) => {\n\t\t\t\t\t\t\t\tconst processor = new PredicateDefinitionProcessor(schema.model)\n\t\t\t\t\t\t\t\treturn processor.process(schema.model.entities[entityName], predicate, {\n\t\t\t\t\t\t\t\t\thandleColumn: ctx =>\n\t\t\t\t\t\t\t\t\t\tctx.entity.name === entity.name && ctx.column.name === field.name ? undefined : ctx.value,\n\t\t\t\t\t\t\t\t\thandleRelation: ctx =>\n\t\t\t\t\t\t\t\t\t\tctx.entity.name === entity.name && ctx.relation.name === field.name ? undefined : ctx.value,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t )\n\t\t\t\t: undefined,\n\t\t\tisRelation(field) &&\n\t\t\t\tisOwningRelation(field) &&\n\t\t\t\tfield.inversedBy &&\n\t\t\t\tversion >= VERSION_REMOVE_RELATION_INVERSE_SIDE\n\t\t\t\t? removeField(field.target, field.inversedBy, version)\n\t\t\t\t: undefined,\n\t\t\tupdateModel(\n\t\t\t\tupdateEntity(entity.name, ({ entity }) => {\n\t\t\t\t\tconst { [field.name]: removed, ...fields } = entity.fields\n\t\t\t\t\tconst indexes = entity.indexes.filter(index => !index.fields.includes(field.name))\n\t\t\t\t\tconst unique = entity.unique.filter(index => !index.fields.includes(field.name))\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...entity,\n\t\t\t\t\t\tfields,\n\t\t\t\t\t\tindexes,\n\t\t\t\t\t\tunique,\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\tisRelation(field) && isInverseRelation(field)\n\t\t\t\t\t? updateEntity(\n\t\t\t\t\t\tfield.target,\n\t\t\t\t\t\tupdateField<Model.AnyOwningRelation>(field.ownedBy, ({ field: { inversedBy, ...field } }) => field),\n\t\t\t\t\t )\n\t\t\t\t\t: undefined,\n\t\t\t),\n\t\t)({ schema })\n\t}\n}\n"],"names":["updater","entityName","field","entity"],"mappings":"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"}
1
+ {"version":3,"file":"schemaUpdateUtils.js","sources":["../../../../../../packages/schema-migrations/src/modifications/utils/schemaUpdateUtils.ts"],"sourcesContent":["import { Acl, Model, Schema, Writable } from '@contember/schema'\nimport { SchemaUpdateError } from '../exceptions'\nimport { isDefined } from '../../utils/isDefined'\nimport { isInverseRelation, isOwningRelation, isRelation, PredicateDefinitionProcessor } from '@contember/schema-utils'\nimport { VERSION_ACL_PATCH, VERSION_REMOVE_RELATION_INVERSE_SIDE } from '../ModificationVersions'\n\n\nexport type SchemaUpdater = (args: { schema: Schema }) => Schema\nexport type ModelUpdater = (args: { schema: Schema; model: Model.Schema }) => Model.Schema\nexport type EntityUpdater = (args: { schema: Schema; model: Model.Schema; entity: Model.Entity }) => Model.Entity\nexport type FieldUpdater<In extends Model.AnyField, Out extends Model.AnyField> = (args: {\n\tschema: Schema\n\tmodel: Model.Schema\n\tentity: Model.Entity\n\tfield: In\n}) => Out | undefined\nexport type AclUpdater = (args: { schema: Schema; acl: Acl.Schema }) => Acl.Schema\nexport type AclRoleUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n}) => Acl.RolePermissions\nexport type AclPermissionsUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n}) => Acl.Permissions\n\nexport type AclEntityPermissionsUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n\tentityName: string\n\tentityPermissions: Acl.EntityPermissions\n}) => Acl.EntityPermissions\n\nexport type EntityAclEveryPredicatesUpdater = (args: {\n\tschema: Schema\n\tacl: Acl.Schema\n\trole: Acl.RolePermissions\n\tentities: Acl.Permissions\n\tentityName: string\n\tentityPermissions: Acl.EntityPermissions\n\tpredicate: Acl.PredicateDefinition\n}) => Acl.PredicateDefinition\n\nexport const updateSchema =\n\t(...schemaUpdater: (SchemaUpdater | undefined)[]): SchemaUpdater =>\n\t\targs =>\n\t\t\tschemaUpdater.filter(isDefined).reduce((schema, updater) => updater({ ...args, schema }), args.schema)\n\nexport const updateAcl =\n\t(updater: AclUpdater): SchemaUpdater =>\n\t\targs => ({\n\t\t\t...args.schema,\n\t\t\tacl: updater({ schema: args.schema, acl: args.schema.acl }),\n\t\t})\n\nexport const updateAclEveryRole =\n\t(...updater: AclRoleUpdater[]): AclUpdater =>\n\t\targs => ({\n\t\t\t...args.acl,\n\t\t\troles: Object.fromEntries(\n\t\t\t\tupdater.reduce(\n\t\t\t\t\t(acc, updater) => acc.map(([name, role]) => [name, updater({ ...args, role })]),\n\t\t\t\t\tObject.entries(args.acl.roles),\n\t\t\t\t),\n\t\t\t),\n\t\t})\n\nexport const updateAclEntities =\n\t(updater: AclPermissionsUpdater): AclRoleUpdater =>\n\t\targs => ({\n\t\t\t...args.role,\n\t\t\tentities: updater({ ...args, entities: args.role.entities }),\n\t\t})\n\nexport const updateAclEveryEntity =\n\t(...updater: AclEntityPermissionsUpdater[]): AclRoleUpdater =>\n\t\targs => ({\n\t\t\t...args.role,\n\t\t\tentities: Object.fromEntries(\n\t\t\t\tupdater.reduce(\n\t\t\t\t\t(acc, updater) =>\n\t\t\t\t\t\tacc.map(([entity, entityPermissions]) => [\n\t\t\t\t\t\t\tentity,\n\t\t\t\t\t\t\tupdater({\n\t\t\t\t\t\t\t\t...args,\n\t\t\t\t\t\t\t\tentities: args.role.entities,\n\t\t\t\t\t\t\t\tentityName: entity,\n\t\t\t\t\t\t\t\tentityPermissions,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t]),\n\t\t\t\t\tObject.entries(args.role.entities),\n\t\t\t\t),\n\t\t\t),\n\t\t})\n\ntype EntityAclFieldPermissionsUpdater = (\n\tfieldPermissions: Acl.FieldPermissions,\n\tentityName: string,\n\toperation: Acl.Operation,\n) => Acl.FieldPermissions\ntype EntityOperationHandler = {\n\t[K in keyof Required<Acl.EntityOperations>]: (\n\t\tvalue: Exclude<Acl.EntityOperations[K], undefined>,\n\t) => Acl.EntityOperations[K]\n}\n\nexport const updateAclFieldPermissions =\n\t(updater: EntityAclFieldPermissionsUpdater): AclEntityPermissionsUpdater =>\n\t\t({ entityPermissions, entityName }) => {\n\t\t\tconst operations: Writable<Acl.EntityOperations> = {}\n\t\t\tconst handlers: EntityOperationHandler = {\n\t\t\t\tcreate: value => updater(value, entityName, Acl.Operation.create),\n\t\t\t\tupdate: value => updater(value, entityName, Acl.Operation.update),\n\t\t\t\tread: value => updater(value, entityName, Acl.Operation.read),\n\t\t\t\tdelete: value => value,\n\t\t\t\tcustomPrimary: value => value,\n\t\t\t\tnoRoot: value => value,\n\t\t\t}\n\t\t\tconst types: (keyof Acl.EntityOperations)[] = ['create', 'update', 'read', 'delete', 'customPrimary', 'noRoot']\n\t\t\tfor (const key of types) {\n\t\t\t\tif (key in entityPermissions.operations) {\n\t\t\t\t\toperations[key] = handlers[key](entityPermissions.operations[key] as any) as any\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...entityPermissions,\n\t\t\t\toperations,\n\t\t\t}\n\t\t}\n\nexport const updateAclEveryPredicate =\n\t(updater: EntityAclEveryPredicatesUpdater): AclEntityPermissionsUpdater =>\n\t\targs => {\n\t\t\treturn {\n\t\t\t\t...args.entityPermissions,\n\t\t\t\tpredicates: Object.fromEntries(\n\t\t\t\t\tObject.entries(args.entityPermissions.predicates).map(([name, predicate]) => [\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tupdater({\n\t\t\t\t\t\t\t...args,\n\t\t\t\t\t\t\tpredicate,\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\nexport const updateModel =\n\t(...modelUpdate: (ModelUpdater | undefined)[]): SchemaUpdater =>\n\t\targs => ({\n\t\t\t...args.schema,\n\t\t\tmodel: modelUpdate\n\t\t\t\t.filter((it): it is ModelUpdater => it !== undefined)\n\t\t\t\t.reduce((model, updater) => updater({ ...args, model }), args.schema.model),\n\t\t})\n\nexport const updateEntity =\n\t(name: string, entityUpdate: EntityUpdater): ModelUpdater =>\n\t\targs => {\n\t\t\tif (!args.model.entities[name]) {\n\t\t\t\tthrow new SchemaUpdateError(`Entity ${name} not found`)\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...args.model,\n\t\t\t\tentities: {\n\t\t\t\t\t...args.model.entities,\n\t\t\t\t\t[name]: entityUpdate({ ...args, entity: args.model.entities[name] }),\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\nexport const updateEveryEntity =\n\t(entityUpdate: EntityUpdater): ModelUpdater =>\n\t\targs => ({\n\t\t\t...args.model,\n\t\t\tentities: Object.fromEntries(\n\t\t\t\tObject.entries(args.model.entities).map(([name, entity]) => [name, entityUpdate({ ...args, entity })]),\n\t\t\t),\n\t\t})\n\nexport const updateField =\n\t<In extends Model.AnyField = Model.AnyField, Out extends Model.AnyField = In>(name: string, fieldUpdater: FieldUpdater<In, Out>): EntityUpdater =>\n\t\targs => {\n\t\t\tconst { [name]: field, ...otherFields } = args.entity.fields\n\t\t\tif (!args.entity.fields[name]) {\n\t\t\t\tthrow new SchemaUpdateError(`Field ${args.entity.name}::${name} not found`)\n\t\t\t}\n\t\t\tconst updatedField = fieldUpdater({ ...args, field: args.entity.fields[name] as In })\n\n\t\t\treturn {\n\t\t\t\t...args.entity,\n\t\t\t\tfields: {\n\t\t\t\t\t...otherFields,\n\t\t\t\t\t...(updatedField ? { [name]: updatedField } : {}),\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\nexport const updateEveryField =\n\t(fieldUpdater: FieldUpdater<Model.AnyField, Model.AnyField>): EntityUpdater =>\n\t\targs => ({\n\t\t\t...args.entity,\n\t\t\tfields: Object.fromEntries(\n\t\t\t\tObject.entries(args.entity.fields)\n\t\t\t\t\t.map(([name, field]) => {\n\t\t\t\t\t\tconst updatedField = fieldUpdater({ ...args, field })\n\t\t\t\t\t\tif (!updatedField) {\n\t\t\t\t\t\t\treturn undefined\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn [name, updatedField]\n\t\t\t\t\t})\n\t\t\t\t\t.filter(isDefined),\n\t\t\t),\n\t\t})\n\nexport const addField =\n\t(field: Model.AnyField): EntityUpdater =>\n\t\targs => {\n\t\t\treturn {\n\t\t\t\t...args.entity,\n\t\t\t\tfields: {\n\t\t\t\t\t...args.entity.fields,\n\t\t\t\t\t[field.name]: field,\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\nexport const removeField = (entityName: string, fieldName: string, version: number): SchemaUpdater => {\n\treturn ({ schema }) => {\n\t\tconst entity = schema.model.entities[entityName]\n\t\tconst field = entity.fields[fieldName]\n\t\treturn updateSchema(\n\t\t\tversion >= VERSION_ACL_PATCH\n\t\t\t\t? updateAcl(\n\t\t\t\t\tupdateAclEveryRole(\n\t\t\t\t\t\tupdateAclEveryEntity(\n\t\t\t\t\t\t\tupdateAclFieldPermissions((permissions, entityName) => {\n\t\t\t\t\t\t\t\tif (entityName !== entity.name) {\n\t\t\t\t\t\t\t\t\treturn permissions\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst { [fieldName]: field, ...other } = permissions\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...other,\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tupdateAclEveryPredicate(({ predicate, entityName }) => {\n\t\t\t\t\t\t\t\tconst processor = new PredicateDefinitionProcessor(schema.model)\n\t\t\t\t\t\t\t\treturn processor.process(schema.model.entities[entityName], predicate, {\n\t\t\t\t\t\t\t\t\thandleColumn: ctx =>\n\t\t\t\t\t\t\t\t\t\tctx.entity.name === entity.name && ctx.column.name === field.name ? undefined : ctx.value,\n\t\t\t\t\t\t\t\t\thandleRelation: ctx =>\n\t\t\t\t\t\t\t\t\t\tctx.entity.name === entity.name && ctx.relation.name === field.name ? undefined : ctx.value,\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t )\n\t\t\t\t: undefined,\n\t\t\tisRelation(field) &&\n\t\t\t\tisOwningRelation(field) &&\n\t\t\t\tfield.inversedBy &&\n\t\t\t\tversion >= VERSION_REMOVE_RELATION_INVERSE_SIDE\n\t\t\t\t? removeField(field.target, field.inversedBy, version)\n\t\t\t\t: undefined,\n\t\t\tupdateModel(\n\t\t\t\tupdateEntity(entity.name, ({ entity }) => {\n\t\t\t\t\tconst { [field.name]: removed, ...fields } = entity.fields\n\t\t\t\t\tconst indexes = entity.indexes.filter(index => !index.fields.includes(field.name))\n\t\t\t\t\tconst unique = entity.unique.filter(index => !index.fields.includes(field.name))\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...entity,\n\t\t\t\t\t\tfields,\n\t\t\t\t\t\tindexes,\n\t\t\t\t\t\tunique,\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t\tisRelation(field) && isInverseRelation(field)\n\t\t\t\t\t? updateEntity(\n\t\t\t\t\t\tfield.target,\n\t\t\t\t\t\tupdateField<Model.AnyOwningRelation>(field.ownedBy, ({ field: { inversedBy, ...field } }) => field),\n\t\t\t\t\t )\n\t\t\t\t\t: undefined,\n\t\t\t),\n\t\t)({ schema })\n\t}\n}\n"],"names":["updater","entityName","field","entity"],"mappings":"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"}