@contember/schema-migrations 2.2.0-alpha.11 → 2.2.0-alpha.12
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.
- package/dist/development/src/modifications/utils/schemaUpdateUtils.cjs +23 -14
- package/dist/development/src/modifications/utils/schemaUpdateUtils.cjs.map +1 -1
- package/dist/development/src/modifications/utils/schemaUpdateUtils.js +23 -14
- package/dist/development/src/modifications/utils/schemaUpdateUtils.js.map +1 -1
- package/dist/production/src/modifications/utils/schemaUpdateUtils.cjs +23 -14
- package/dist/production/src/modifications/utils/schemaUpdateUtils.cjs.map +1 -1
- package/dist/production/src/modifications/utils/schemaUpdateUtils.js +23 -14
- package/dist/production/src/modifications/utils/schemaUpdateUtils.js.map +1 -1
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/dist/types/modifications/utils/schemaUpdateUtils.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -7
- package/src/modifications/utils/schemaUpdateUtils.ts +25 -19
- package/tests/cases/integration/updateFieldName.test.ts +68 -0
|
@@ -41,21 +41,30 @@ const updateAclEveryEntity = (...updater) => (args) => ({
|
|
|
41
41
|
)
|
|
42
42
|
});
|
|
43
43
|
const updateAclFieldPermissions = (updater) => ({ entityPermissions, entityName }) => {
|
|
44
|
-
const
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
44
|
+
const source = entityPermissions.operations;
|
|
45
|
+
const updateFields = (value, operation) => updater(value, entityName, operation);
|
|
46
|
+
const operations = { ...source };
|
|
47
|
+
if (source.create !== void 0) {
|
|
48
|
+
operations.create = updateFields(source.create, schema.Acl.Operation.create);
|
|
49
|
+
}
|
|
50
|
+
if (source.update !== void 0) {
|
|
51
|
+
operations.update = updateFields(source.update, schema.Acl.Operation.update);
|
|
52
|
+
}
|
|
53
|
+
if (source.read !== void 0) {
|
|
54
|
+
operations.read = updateFields(source.read, schema.Acl.Operation.read);
|
|
55
|
+
}
|
|
56
|
+
if (source.through !== void 0) {
|
|
57
|
+
const through = { ...source.through };
|
|
58
|
+
if (source.through.create !== void 0) {
|
|
59
|
+
through.create = updateFields(source.through.create, schema.Acl.Operation.create);
|
|
60
|
+
}
|
|
61
|
+
if (source.through.update !== void 0) {
|
|
62
|
+
through.update = updateFields(source.through.update, schema.Acl.Operation.update);
|
|
63
|
+
}
|
|
64
|
+
if (source.through.read !== void 0) {
|
|
65
|
+
through.read = updateFields(source.through.read, schema.Acl.Operation.read);
|
|
58
66
|
}
|
|
67
|
+
operations.through = through;
|
|
59
68
|
}
|
|
60
69
|
return {
|
|
61
70
|
...entityPermissions,
|
|
@@ -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.js'\nimport { isDefined } from '../../utils/isDefined.js'\nimport { isInverseRelation, isOwningRelation, isRelation, PredicateDefinitionProcessor } from '@contember/schema-utils'\nimport { VERSION_ACL_PATCH, VERSION_REMOVE_RELATION_INVERSE_SIDE } from '../ModificationVersions.js'\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 = (...schemaUpdater: (SchemaUpdater | undefined)[]): SchemaUpdater => args =>\n\tschemaUpdater.filter(isDefined).reduce((schema, updater) => updater({ ...args, schema }), args.schema)\n\nexport const updateAcl = (updater: AclUpdater): SchemaUpdater => args => ({\n\t...args.schema,\n\tacl: updater({ schema: args.schema, acl: args.schema.acl }),\n})\n\nexport const updateAclEveryRole = (...updater: AclRoleUpdater[]): AclUpdater => args => ({\n\t...args.acl,\n\troles: Object.fromEntries(\n\t\tupdater.reduce(\n\t\t\t(acc, updater) => acc.map(([name, role]) => [name, updater({ ...args, role })]),\n\t\t\tObject.entries(args.acl.roles),\n\t\t),\n\t),\n})\n\nexport const updateAclEntities = (updater: AclPermissionsUpdater): AclRoleUpdater => args => ({\n\t...args.role,\n\tentities: updater({ ...args, entities: args.role.entities }),\n})\n\nexport const updateAclEveryEntity = (...updater: AclEntityPermissionsUpdater[]): AclRoleUpdater => args => ({\n\t...args.role,\n\tentities: Object.fromEntries(\n\t\tupdater.reduce(\n\t\t\t(acc, updater) =>\n\t\t\t\tacc.map(([entity, entityPermissions]) => [\n\t\t\t\t\tentity,\n\t\t\t\t\tupdater({\n\t\t\t\t\t\t...args,\n\t\t\t\t\t\tentities: args.role.entities,\n\t\t\t\t\t\tentityName: entity,\n\t\t\t\t\t\tentityPermissions,\n\t\t\t\t\t}),\n\t\t\t\t]),\n\t\t\tObject.entries(args.role.entities),\n\t\t),\n\t),\n})\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 => ({ entityPermissions, entityName }) => {\n\t\tconst operations: Writable<Acl.EntityOperations> = {}\n\t\tconst handlers: EntityOperationHandler = {\n\t\t\tcreate: value => updater(value, entityName, Acl.Operation.create),\n\t\t\tupdate: value => updater(value, entityName, Acl.Operation.update),\n\t\t\tread: value => updater(value, entityName, Acl.Operation.read),\n\t\t\tdelete: value => value,\n\t\t\tcustomPrimary: value => value,\n\t\t\trefreshMaterializedView: value => value,\n\t\t\tnoRoot: value => value,\n\t\t}\n\t\tconst types: (keyof Acl.EntityOperations)[] = ['create', 'update', 'read', 'delete', 'customPrimary', 'noRoot']\n\t\tfor (const key of types) {\n\t\t\tif (key in entityPermissions.operations) {\n\t\t\t\toperations[key] = handlers[key](entityPermissions.operations[key] as any) as any\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\t...entityPermissions,\n\t\t\toperations,\n\t\t}\n\t}\n\nexport const updateAclEveryPredicate = (updater: EntityAclEveryPredicatesUpdater): AclEntityPermissionsUpdater => args => {\n\treturn {\n\t\t...args.entityPermissions,\n\t\tpredicates: Object.fromEntries(\n\t\t\tObject.entries(args.entityPermissions.predicates).map(([name, predicate]) => [\n\t\t\t\tname,\n\t\t\t\tupdater({\n\t\t\t\t\t...args,\n\t\t\t\t\tpredicate,\n\t\t\t\t}),\n\t\t\t]),\n\t\t),\n\t}\n}\n\nexport const updateModel = (...modelUpdate: (ModelUpdater | undefined)[]): SchemaUpdater => args => ({\n\t...args.schema,\n\tmodel: modelUpdate\n\t\t.filter((it): it is ModelUpdater => it !== undefined)\n\t\t.reduce((model, updater) => updater({ ...args, model }), args.schema.model),\n})\n\nexport const updateEntity = (name: string, entityUpdate: EntityUpdater): ModelUpdater => args => {\n\tif (!args.model.entities[name]) {\n\t\tthrow new SchemaUpdateError(`Entity ${name} not found`)\n\t}\n\treturn {\n\t\t...args.model,\n\t\tentities: {\n\t\t\t...args.model.entities,\n\t\t\t[name]: entityUpdate({ ...args, entity: args.model.entities[name] }),\n\t\t},\n\t}\n}\n\nexport const updateEveryEntity = (entityUpdate: EntityUpdater): ModelUpdater => args => ({\n\t...args.model,\n\tentities: Object.fromEntries(\n\t\tObject.entries(args.model.entities).map(([name, entity]) => [name, entityUpdate({ ...args, entity })]),\n\t),\n})\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\targs => {\n\t\tconst { [name]: field, ...otherFields } = args.entity.fields\n\t\tif (!args.entity.fields[name]) {\n\t\t\tthrow new SchemaUpdateError(`Field ${args.entity.name}::${name} not found`)\n\t\t}\n\t\tconst updatedField = fieldUpdater({ ...args, field: args.entity.fields[name] as In })\n\n\t\treturn {\n\t\t\t...args.entity,\n\t\t\tfields: {\n\t\t\t\t...otherFields,\n\t\t\t\t...(updatedField ? { [name]: updatedField } : {}),\n\t\t\t},\n\t\t}\n\t}\n\nexport const updateEveryField = (fieldUpdater: FieldUpdater<Model.AnyField, Model.AnyField>): EntityUpdater => args => ({\n\t...args.entity,\n\tfields: Object.fromEntries(\n\t\tObject.entries(args.entity.fields)\n\t\t\t.map(([name, field]) => {\n\t\t\t\tconst updatedField = fieldUpdater({ ...args, field })\n\t\t\t\tif (!updatedField) {\n\t\t\t\t\treturn undefined\n\t\t\t\t}\n\t\t\t\treturn [name, updatedField]\n\t\t\t})\n\t\t\t.filter(isDefined),\n\t),\n})\n\nexport const addField = (field: Model.AnyField): EntityUpdater => args => {\n\treturn {\n\t\t...args.entity,\n\t\tfields: {\n\t\t\t...args.entity.fields,\n\t\t\t[field.name]: field,\n\t\t},\n\t}\n}\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 => ctx.entity.name === entity.name && ctx.column.name === field.name ? undefined : ctx.value,\n\t\t\t\t\t\t\t\t\thandleRelation: ctx => ctx.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\t&& isOwningRelation(field)\n\t\t\t\t&& field.inversedBy\n\t\t\t\t&& version >= 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.js'\nimport { isDefined } from '../../utils/isDefined.js'\nimport { isInverseRelation, isOwningRelation, isRelation, PredicateDefinitionProcessor } from '@contember/schema-utils'\nimport { VERSION_ACL_PATCH, VERSION_REMOVE_RELATION_INVERSE_SIDE } from '../ModificationVersions.js'\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 = (...schemaUpdater: (SchemaUpdater | undefined)[]): SchemaUpdater => args =>\n\tschemaUpdater.filter(isDefined).reduce((schema, updater) => updater({ ...args, schema }), args.schema)\n\nexport const updateAcl = (updater: AclUpdater): SchemaUpdater => args => ({\n\t...args.schema,\n\tacl: updater({ schema: args.schema, acl: args.schema.acl }),\n})\n\nexport const updateAclEveryRole = (...updater: AclRoleUpdater[]): AclUpdater => args => ({\n\t...args.acl,\n\troles: Object.fromEntries(\n\t\tupdater.reduce(\n\t\t\t(acc, updater) => acc.map(([name, role]) => [name, updater({ ...args, role })]),\n\t\t\tObject.entries(args.acl.roles),\n\t\t),\n\t),\n})\n\nexport const updateAclEntities = (updater: AclPermissionsUpdater): AclRoleUpdater => args => ({\n\t...args.role,\n\tentities: updater({ ...args, entities: args.role.entities }),\n})\n\nexport const updateAclEveryEntity = (...updater: AclEntityPermissionsUpdater[]): AclRoleUpdater => args => ({\n\t...args.role,\n\tentities: Object.fromEntries(\n\t\tupdater.reduce(\n\t\t\t(acc, updater) =>\n\t\t\t\tacc.map(([entity, entityPermissions]) => [\n\t\t\t\t\tentity,\n\t\t\t\t\tupdater({\n\t\t\t\t\t\t...args,\n\t\t\t\t\t\tentities: args.role.entities,\n\t\t\t\t\t\tentityName: entity,\n\t\t\t\t\t\tentityPermissions,\n\t\t\t\t\t}),\n\t\t\t\t]),\n\t\t\tObject.entries(args.role.entities),\n\t\t),\n\t),\n})\n\ntype EntityAclFieldPermissionsUpdater = (\n\tfieldPermissions: Acl.FieldPermissions,\n\tentityName: string,\n\toperation: Acl.Operation,\n) => Acl.FieldPermissions\nexport const updateAclFieldPermissions =\n\t(updater: EntityAclFieldPermissionsUpdater): AclEntityPermissionsUpdater => ({ entityPermissions, entityName }) => {\n\t\tconst source = entityPermissions.operations\n\t\tconst updateFields = (value: Acl.FieldPermissions, operation: Acl.Operation) => updater(value, entityName, operation)\n\t\t// Carry every key over untouched by default, then rewrite the ones holding field names. An\n\t\t// operation key that is not handled here must survive rather than disappear - the previous\n\t\t// allow-list shape silently dropped `refreshMaterializedView` on every field rename.\n\t\tconst operations: Writable<Acl.EntityOperations> = { ...source }\n\t\tif (source.create !== undefined) {\n\t\t\toperations.create = updateFields(source.create, Acl.Operation.create)\n\t\t}\n\t\tif (source.update !== undefined) {\n\t\t\toperations.update = updateFields(source.update, Acl.Operation.update)\n\t\t}\n\t\tif (source.read !== undefined) {\n\t\t\toperations.read = updateFields(source.read, Acl.Operation.read)\n\t\t}\n\t\tif (source.through !== undefined) {\n\t\t\tconst through: Writable<Acl.ThroughOperations> = { ...source.through }\n\t\t\tif (source.through.create !== undefined) {\n\t\t\t\tthrough.create = updateFields(source.through.create, Acl.Operation.create)\n\t\t\t}\n\t\t\tif (source.through.update !== undefined) {\n\t\t\t\tthrough.update = updateFields(source.through.update, Acl.Operation.update)\n\t\t\t}\n\t\t\tif (source.through.read !== undefined) {\n\t\t\t\tthrough.read = updateFields(source.through.read, Acl.Operation.read)\n\t\t\t}\n\t\t\toperations.through = through\n\t\t}\n\n\t\treturn {\n\t\t\t...entityPermissions,\n\t\t\toperations,\n\t\t}\n\t}\n\nexport const updateAclEveryPredicate = (updater: EntityAclEveryPredicatesUpdater): AclEntityPermissionsUpdater => args => {\n\treturn {\n\t\t...args.entityPermissions,\n\t\tpredicates: Object.fromEntries(\n\t\t\tObject.entries(args.entityPermissions.predicates).map(([name, predicate]) => [\n\t\t\t\tname,\n\t\t\t\tupdater({\n\t\t\t\t\t...args,\n\t\t\t\t\tpredicate,\n\t\t\t\t}),\n\t\t\t]),\n\t\t),\n\t}\n}\n\nexport const updateModel = (...modelUpdate: (ModelUpdater | undefined)[]): SchemaUpdater => args => ({\n\t...args.schema,\n\tmodel: modelUpdate\n\t\t.filter((it): it is ModelUpdater => it !== undefined)\n\t\t.reduce((model, updater) => updater({ ...args, model }), args.schema.model),\n})\n\nexport const updateEntity = (name: string, entityUpdate: EntityUpdater): ModelUpdater => args => {\n\tif (!args.model.entities[name]) {\n\t\tthrow new SchemaUpdateError(`Entity ${name} not found`)\n\t}\n\treturn {\n\t\t...args.model,\n\t\tentities: {\n\t\t\t...args.model.entities,\n\t\t\t[name]: entityUpdate({ ...args, entity: args.model.entities[name] }),\n\t\t},\n\t}\n}\n\nexport const updateEveryEntity = (entityUpdate: EntityUpdater): ModelUpdater => args => ({\n\t...args.model,\n\tentities: Object.fromEntries(\n\t\tObject.entries(args.model.entities).map(([name, entity]) => [name, entityUpdate({ ...args, entity })]),\n\t),\n})\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\targs => {\n\t\tconst { [name]: field, ...otherFields } = args.entity.fields\n\t\tif (!args.entity.fields[name]) {\n\t\t\tthrow new SchemaUpdateError(`Field ${args.entity.name}::${name} not found`)\n\t\t}\n\t\tconst updatedField = fieldUpdater({ ...args, field: args.entity.fields[name] as In })\n\n\t\treturn {\n\t\t\t...args.entity,\n\t\t\tfields: {\n\t\t\t\t...otherFields,\n\t\t\t\t...(updatedField ? { [name]: updatedField } : {}),\n\t\t\t},\n\t\t}\n\t}\n\nexport const updateEveryField = (fieldUpdater: FieldUpdater<Model.AnyField, Model.AnyField>): EntityUpdater => args => ({\n\t...args.entity,\n\tfields: Object.fromEntries(\n\t\tObject.entries(args.entity.fields)\n\t\t\t.map(([name, field]) => {\n\t\t\t\tconst updatedField = fieldUpdater({ ...args, field })\n\t\t\t\tif (!updatedField) {\n\t\t\t\t\treturn undefined\n\t\t\t\t}\n\t\t\t\treturn [name, updatedField]\n\t\t\t})\n\t\t\t.filter(isDefined),\n\t),\n})\n\nexport const addField = (field: Model.AnyField): EntityUpdater => args => {\n\treturn {\n\t\t...args.entity,\n\t\tfields: {\n\t\t\t...args.entity.fields,\n\t\t\t[field.name]: field,\n\t\t},\n\t}\n}\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 => ctx.entity.name === entity.name && ctx.column.name === field.name ? undefined : ctx.value,\n\t\t\t\t\t\t\t\t\thandleRelation: ctx => ctx.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\t&& isOwningRelation(field)\n\t\t\t\t&& field.inversedBy\n\t\t\t\t&& version >= 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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"}
|
|
@@ -39,21 +39,30 @@ const updateAclEveryEntity = (...updater) => (args) => ({
|
|
|
39
39
|
)
|
|
40
40
|
});
|
|
41
41
|
const updateAclFieldPermissions = (updater) => ({ entityPermissions, entityName }) => {
|
|
42
|
-
const
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
42
|
+
const source = entityPermissions.operations;
|
|
43
|
+
const updateFields = (value, operation) => updater(value, entityName, operation);
|
|
44
|
+
const operations = { ...source };
|
|
45
|
+
if (source.create !== void 0) {
|
|
46
|
+
operations.create = updateFields(source.create, Acl.Operation.create);
|
|
47
|
+
}
|
|
48
|
+
if (source.update !== void 0) {
|
|
49
|
+
operations.update = updateFields(source.update, Acl.Operation.update);
|
|
50
|
+
}
|
|
51
|
+
if (source.read !== void 0) {
|
|
52
|
+
operations.read = updateFields(source.read, Acl.Operation.read);
|
|
53
|
+
}
|
|
54
|
+
if (source.through !== void 0) {
|
|
55
|
+
const through = { ...source.through };
|
|
56
|
+
if (source.through.create !== void 0) {
|
|
57
|
+
through.create = updateFields(source.through.create, Acl.Operation.create);
|
|
58
|
+
}
|
|
59
|
+
if (source.through.update !== void 0) {
|
|
60
|
+
through.update = updateFields(source.through.update, Acl.Operation.update);
|
|
61
|
+
}
|
|
62
|
+
if (source.through.read !== void 0) {
|
|
63
|
+
through.read = updateFields(source.through.read, Acl.Operation.read);
|
|
56
64
|
}
|
|
65
|
+
operations.through = through;
|
|
57
66
|
}
|
|
58
67
|
return {
|
|
59
68
|
...entityPermissions,
|
|
@@ -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.js'\nimport { isDefined } from '../../utils/isDefined.js'\nimport { isInverseRelation, isOwningRelation, isRelation, PredicateDefinitionProcessor } from '@contember/schema-utils'\nimport { VERSION_ACL_PATCH, VERSION_REMOVE_RELATION_INVERSE_SIDE } from '../ModificationVersions.js'\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 = (...schemaUpdater: (SchemaUpdater | undefined)[]): SchemaUpdater => args =>\n\tschemaUpdater.filter(isDefined).reduce((schema, updater) => updater({ ...args, schema }), args.schema)\n\nexport const updateAcl = (updater: AclUpdater): SchemaUpdater => args => ({\n\t...args.schema,\n\tacl: updater({ schema: args.schema, acl: args.schema.acl }),\n})\n\nexport const updateAclEveryRole = (...updater: AclRoleUpdater[]): AclUpdater => args => ({\n\t...args.acl,\n\troles: Object.fromEntries(\n\t\tupdater.reduce(\n\t\t\t(acc, updater) => acc.map(([name, role]) => [name, updater({ ...args, role })]),\n\t\t\tObject.entries(args.acl.roles),\n\t\t),\n\t),\n})\n\nexport const updateAclEntities = (updater: AclPermissionsUpdater): AclRoleUpdater => args => ({\n\t...args.role,\n\tentities: updater({ ...args, entities: args.role.entities }),\n})\n\nexport const updateAclEveryEntity = (...updater: AclEntityPermissionsUpdater[]): AclRoleUpdater => args => ({\n\t...args.role,\n\tentities: Object.fromEntries(\n\t\tupdater.reduce(\n\t\t\t(acc, updater) =>\n\t\t\t\tacc.map(([entity, entityPermissions]) => [\n\t\t\t\t\tentity,\n\t\t\t\t\tupdater({\n\t\t\t\t\t\t...args,\n\t\t\t\t\t\tentities: args.role.entities,\n\t\t\t\t\t\tentityName: entity,\n\t\t\t\t\t\tentityPermissions,\n\t\t\t\t\t}),\n\t\t\t\t]),\n\t\t\tObject.entries(args.role.entities),\n\t\t),\n\t),\n})\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 => ({ entityPermissions, entityName }) => {\n\t\tconst operations: Writable<Acl.EntityOperations> = {}\n\t\tconst handlers: EntityOperationHandler = {\n\t\t\tcreate: value => updater(value, entityName, Acl.Operation.create),\n\t\t\tupdate: value => updater(value, entityName, Acl.Operation.update),\n\t\t\tread: value => updater(value, entityName, Acl.Operation.read),\n\t\t\tdelete: value => value,\n\t\t\tcustomPrimary: value => value,\n\t\t\trefreshMaterializedView: value => value,\n\t\t\tnoRoot: value => value,\n\t\t}\n\t\tconst types: (keyof Acl.EntityOperations)[] = ['create', 'update', 'read', 'delete', 'customPrimary', 'noRoot']\n\t\tfor (const key of types) {\n\t\t\tif (key in entityPermissions.operations) {\n\t\t\t\toperations[key] = handlers[key](entityPermissions.operations[key] as any) as any\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\t...entityPermissions,\n\t\t\toperations,\n\t\t}\n\t}\n\nexport const updateAclEveryPredicate = (updater: EntityAclEveryPredicatesUpdater): AclEntityPermissionsUpdater => args => {\n\treturn {\n\t\t...args.entityPermissions,\n\t\tpredicates: Object.fromEntries(\n\t\t\tObject.entries(args.entityPermissions.predicates).map(([name, predicate]) => [\n\t\t\t\tname,\n\t\t\t\tupdater({\n\t\t\t\t\t...args,\n\t\t\t\t\tpredicate,\n\t\t\t\t}),\n\t\t\t]),\n\t\t),\n\t}\n}\n\nexport const updateModel = (...modelUpdate: (ModelUpdater | undefined)[]): SchemaUpdater => args => ({\n\t...args.schema,\n\tmodel: modelUpdate\n\t\t.filter((it): it is ModelUpdater => it !== undefined)\n\t\t.reduce((model, updater) => updater({ ...args, model }), args.schema.model),\n})\n\nexport const updateEntity = (name: string, entityUpdate: EntityUpdater): ModelUpdater => args => {\n\tif (!args.model.entities[name]) {\n\t\tthrow new SchemaUpdateError(`Entity ${name} not found`)\n\t}\n\treturn {\n\t\t...args.model,\n\t\tentities: {\n\t\t\t...args.model.entities,\n\t\t\t[name]: entityUpdate({ ...args, entity: args.model.entities[name] }),\n\t\t},\n\t}\n}\n\nexport const updateEveryEntity = (entityUpdate: EntityUpdater): ModelUpdater => args => ({\n\t...args.model,\n\tentities: Object.fromEntries(\n\t\tObject.entries(args.model.entities).map(([name, entity]) => [name, entityUpdate({ ...args, entity })]),\n\t),\n})\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\targs => {\n\t\tconst { [name]: field, ...otherFields } = args.entity.fields\n\t\tif (!args.entity.fields[name]) {\n\t\t\tthrow new SchemaUpdateError(`Field ${args.entity.name}::${name} not found`)\n\t\t}\n\t\tconst updatedField = fieldUpdater({ ...args, field: args.entity.fields[name] as In })\n\n\t\treturn {\n\t\t\t...args.entity,\n\t\t\tfields: {\n\t\t\t\t...otherFields,\n\t\t\t\t...(updatedField ? { [name]: updatedField } : {}),\n\t\t\t},\n\t\t}\n\t}\n\nexport const updateEveryField = (fieldUpdater: FieldUpdater<Model.AnyField, Model.AnyField>): EntityUpdater => args => ({\n\t...args.entity,\n\tfields: Object.fromEntries(\n\t\tObject.entries(args.entity.fields)\n\t\t\t.map(([name, field]) => {\n\t\t\t\tconst updatedField = fieldUpdater({ ...args, field })\n\t\t\t\tif (!updatedField) {\n\t\t\t\t\treturn undefined\n\t\t\t\t}\n\t\t\t\treturn [name, updatedField]\n\t\t\t})\n\t\t\t.filter(isDefined),\n\t),\n})\n\nexport const addField = (field: Model.AnyField): EntityUpdater => args => {\n\treturn {\n\t\t...args.entity,\n\t\tfields: {\n\t\t\t...args.entity.fields,\n\t\t\t[field.name]: field,\n\t\t},\n\t}\n}\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 => ctx.entity.name === entity.name && ctx.column.name === field.name ? undefined : ctx.value,\n\t\t\t\t\t\t\t\t\thandleRelation: ctx => ctx.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\t&& isOwningRelation(field)\n\t\t\t\t&& field.inversedBy\n\t\t\t\t&& version >= 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.js'\nimport { isDefined } from '../../utils/isDefined.js'\nimport { isInverseRelation, isOwningRelation, isRelation, PredicateDefinitionProcessor } from '@contember/schema-utils'\nimport { VERSION_ACL_PATCH, VERSION_REMOVE_RELATION_INVERSE_SIDE } from '../ModificationVersions.js'\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 = (...schemaUpdater: (SchemaUpdater | undefined)[]): SchemaUpdater => args =>\n\tschemaUpdater.filter(isDefined).reduce((schema, updater) => updater({ ...args, schema }), args.schema)\n\nexport const updateAcl = (updater: AclUpdater): SchemaUpdater => args => ({\n\t...args.schema,\n\tacl: updater({ schema: args.schema, acl: args.schema.acl }),\n})\n\nexport const updateAclEveryRole = (...updater: AclRoleUpdater[]): AclUpdater => args => ({\n\t...args.acl,\n\troles: Object.fromEntries(\n\t\tupdater.reduce(\n\t\t\t(acc, updater) => acc.map(([name, role]) => [name, updater({ ...args, role })]),\n\t\t\tObject.entries(args.acl.roles),\n\t\t),\n\t),\n})\n\nexport const updateAclEntities = (updater: AclPermissionsUpdater): AclRoleUpdater => args => ({\n\t...args.role,\n\tentities: updater({ ...args, entities: args.role.entities }),\n})\n\nexport const updateAclEveryEntity = (...updater: AclEntityPermissionsUpdater[]): AclRoleUpdater => args => ({\n\t...args.role,\n\tentities: Object.fromEntries(\n\t\tupdater.reduce(\n\t\t\t(acc, updater) =>\n\t\t\t\tacc.map(([entity, entityPermissions]) => [\n\t\t\t\t\tentity,\n\t\t\t\t\tupdater({\n\t\t\t\t\t\t...args,\n\t\t\t\t\t\tentities: args.role.entities,\n\t\t\t\t\t\tentityName: entity,\n\t\t\t\t\t\tentityPermissions,\n\t\t\t\t\t}),\n\t\t\t\t]),\n\t\t\tObject.entries(args.role.entities),\n\t\t),\n\t),\n})\n\ntype EntityAclFieldPermissionsUpdater = (\n\tfieldPermissions: Acl.FieldPermissions,\n\tentityName: string,\n\toperation: Acl.Operation,\n) => Acl.FieldPermissions\nexport const updateAclFieldPermissions =\n\t(updater: EntityAclFieldPermissionsUpdater): AclEntityPermissionsUpdater => ({ entityPermissions, entityName }) => {\n\t\tconst source = entityPermissions.operations\n\t\tconst updateFields = (value: Acl.FieldPermissions, operation: Acl.Operation) => updater(value, entityName, operation)\n\t\t// Carry every key over untouched by default, then rewrite the ones holding field names. An\n\t\t// operation key that is not handled here must survive rather than disappear - the previous\n\t\t// allow-list shape silently dropped `refreshMaterializedView` on every field rename.\n\t\tconst operations: Writable<Acl.EntityOperations> = { ...source }\n\t\tif (source.create !== undefined) {\n\t\t\toperations.create = updateFields(source.create, Acl.Operation.create)\n\t\t}\n\t\tif (source.update !== undefined) {\n\t\t\toperations.update = updateFields(source.update, Acl.Operation.update)\n\t\t}\n\t\tif (source.read !== undefined) {\n\t\t\toperations.read = updateFields(source.read, Acl.Operation.read)\n\t\t}\n\t\tif (source.through !== undefined) {\n\t\t\tconst through: Writable<Acl.ThroughOperations> = { ...source.through }\n\t\t\tif (source.through.create !== undefined) {\n\t\t\t\tthrough.create = updateFields(source.through.create, Acl.Operation.create)\n\t\t\t}\n\t\t\tif (source.through.update !== undefined) {\n\t\t\t\tthrough.update = updateFields(source.through.update, Acl.Operation.update)\n\t\t\t}\n\t\t\tif (source.through.read !== undefined) {\n\t\t\t\tthrough.read = updateFields(source.through.read, Acl.Operation.read)\n\t\t\t}\n\t\t\toperations.through = through\n\t\t}\n\n\t\treturn {\n\t\t\t...entityPermissions,\n\t\t\toperations,\n\t\t}\n\t}\n\nexport const updateAclEveryPredicate = (updater: EntityAclEveryPredicatesUpdater): AclEntityPermissionsUpdater => args => {\n\treturn {\n\t\t...args.entityPermissions,\n\t\tpredicates: Object.fromEntries(\n\t\t\tObject.entries(args.entityPermissions.predicates).map(([name, predicate]) => [\n\t\t\t\tname,\n\t\t\t\tupdater({\n\t\t\t\t\t...args,\n\t\t\t\t\tpredicate,\n\t\t\t\t}),\n\t\t\t]),\n\t\t),\n\t}\n}\n\nexport const updateModel = (...modelUpdate: (ModelUpdater | undefined)[]): SchemaUpdater => args => ({\n\t...args.schema,\n\tmodel: modelUpdate\n\t\t.filter((it): it is ModelUpdater => it !== undefined)\n\t\t.reduce((model, updater) => updater({ ...args, model }), args.schema.model),\n})\n\nexport const updateEntity = (name: string, entityUpdate: EntityUpdater): ModelUpdater => args => {\n\tif (!args.model.entities[name]) {\n\t\tthrow new SchemaUpdateError(`Entity ${name} not found`)\n\t}\n\treturn {\n\t\t...args.model,\n\t\tentities: {\n\t\t\t...args.model.entities,\n\t\t\t[name]: entityUpdate({ ...args, entity: args.model.entities[name] }),\n\t\t},\n\t}\n}\n\nexport const updateEveryEntity = (entityUpdate: EntityUpdater): ModelUpdater => args => ({\n\t...args.model,\n\tentities: Object.fromEntries(\n\t\tObject.entries(args.model.entities).map(([name, entity]) => [name, entityUpdate({ ...args, entity })]),\n\t),\n})\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\targs => {\n\t\tconst { [name]: field, ...otherFields } = args.entity.fields\n\t\tif (!args.entity.fields[name]) {\n\t\t\tthrow new SchemaUpdateError(`Field ${args.entity.name}::${name} not found`)\n\t\t}\n\t\tconst updatedField = fieldUpdater({ ...args, field: args.entity.fields[name] as In })\n\n\t\treturn {\n\t\t\t...args.entity,\n\t\t\tfields: {\n\t\t\t\t...otherFields,\n\t\t\t\t...(updatedField ? { [name]: updatedField } : {}),\n\t\t\t},\n\t\t}\n\t}\n\nexport const updateEveryField = (fieldUpdater: FieldUpdater<Model.AnyField, Model.AnyField>): EntityUpdater => args => ({\n\t...args.entity,\n\tfields: Object.fromEntries(\n\t\tObject.entries(args.entity.fields)\n\t\t\t.map(([name, field]) => {\n\t\t\t\tconst updatedField = fieldUpdater({ ...args, field })\n\t\t\t\tif (!updatedField) {\n\t\t\t\t\treturn undefined\n\t\t\t\t}\n\t\t\t\treturn [name, updatedField]\n\t\t\t})\n\t\t\t.filter(isDefined),\n\t),\n})\n\nexport const addField = (field: Model.AnyField): EntityUpdater => args => {\n\treturn {\n\t\t...args.entity,\n\t\tfields: {\n\t\t\t...args.entity.fields,\n\t\t\t[field.name]: field,\n\t\t},\n\t}\n}\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 => ctx.entity.name === entity.name && ctx.column.name === field.name ? undefined : ctx.value,\n\t\t\t\t\t\t\t\t\thandleRelation: ctx => ctx.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\t&& isOwningRelation(field)\n\t\t\t\t&& field.inversedBy\n\t\t\t\t&& version >= 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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"}
|
|
@@ -41,21 +41,30 @@ const updateAclEveryEntity = (...updater) => (args) => ({
|
|
|
41
41
|
)
|
|
42
42
|
});
|
|
43
43
|
const updateAclFieldPermissions = (updater) => ({ entityPermissions, entityName }) => {
|
|
44
|
-
const
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
44
|
+
const source = entityPermissions.operations;
|
|
45
|
+
const updateFields = (value, operation) => updater(value, entityName, operation);
|
|
46
|
+
const operations = { ...source };
|
|
47
|
+
if (source.create !== void 0) {
|
|
48
|
+
operations.create = updateFields(source.create, schema.Acl.Operation.create);
|
|
49
|
+
}
|
|
50
|
+
if (source.update !== void 0) {
|
|
51
|
+
operations.update = updateFields(source.update, schema.Acl.Operation.update);
|
|
52
|
+
}
|
|
53
|
+
if (source.read !== void 0) {
|
|
54
|
+
operations.read = updateFields(source.read, schema.Acl.Operation.read);
|
|
55
|
+
}
|
|
56
|
+
if (source.through !== void 0) {
|
|
57
|
+
const through = { ...source.through };
|
|
58
|
+
if (source.through.create !== void 0) {
|
|
59
|
+
through.create = updateFields(source.through.create, schema.Acl.Operation.create);
|
|
60
|
+
}
|
|
61
|
+
if (source.through.update !== void 0) {
|
|
62
|
+
through.update = updateFields(source.through.update, schema.Acl.Operation.update);
|
|
63
|
+
}
|
|
64
|
+
if (source.through.read !== void 0) {
|
|
65
|
+
through.read = updateFields(source.through.read, schema.Acl.Operation.read);
|
|
58
66
|
}
|
|
67
|
+
operations.through = through;
|
|
59
68
|
}
|
|
60
69
|
return {
|
|
61
70
|
...entityPermissions,
|
|
@@ -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.js'\nimport { isDefined } from '../../utils/isDefined.js'\nimport { isInverseRelation, isOwningRelation, isRelation, PredicateDefinitionProcessor } from '@contember/schema-utils'\nimport { VERSION_ACL_PATCH, VERSION_REMOVE_RELATION_INVERSE_SIDE } from '../ModificationVersions.js'\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 = (...schemaUpdater: (SchemaUpdater | undefined)[]): SchemaUpdater => args =>\n\tschemaUpdater.filter(isDefined).reduce((schema, updater) => updater({ ...args, schema }), args.schema)\n\nexport const updateAcl = (updater: AclUpdater): SchemaUpdater => args => ({\n\t...args.schema,\n\tacl: updater({ schema: args.schema, acl: args.schema.acl }),\n})\n\nexport const updateAclEveryRole = (...updater: AclRoleUpdater[]): AclUpdater => args => ({\n\t...args.acl,\n\troles: Object.fromEntries(\n\t\tupdater.reduce(\n\t\t\t(acc, updater) => acc.map(([name, role]) => [name, updater({ ...args, role })]),\n\t\t\tObject.entries(args.acl.roles),\n\t\t),\n\t),\n})\n\nexport const updateAclEntities = (updater: AclPermissionsUpdater): AclRoleUpdater => args => ({\n\t...args.role,\n\tentities: updater({ ...args, entities: args.role.entities }),\n})\n\nexport const updateAclEveryEntity = (...updater: AclEntityPermissionsUpdater[]): AclRoleUpdater => args => ({\n\t...args.role,\n\tentities: Object.fromEntries(\n\t\tupdater.reduce(\n\t\t\t(acc, updater) =>\n\t\t\t\tacc.map(([entity, entityPermissions]) => [\n\t\t\t\t\tentity,\n\t\t\t\t\tupdater({\n\t\t\t\t\t\t...args,\n\t\t\t\t\t\tentities: args.role.entities,\n\t\t\t\t\t\tentityName: entity,\n\t\t\t\t\t\tentityPermissions,\n\t\t\t\t\t}),\n\t\t\t\t]),\n\t\t\tObject.entries(args.role.entities),\n\t\t),\n\t),\n})\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 => ({ entityPermissions, entityName }) => {\n\t\tconst operations: Writable<Acl.EntityOperations> = {}\n\t\tconst handlers: EntityOperationHandler = {\n\t\t\tcreate: value => updater(value, entityName, Acl.Operation.create),\n\t\t\tupdate: value => updater(value, entityName, Acl.Operation.update),\n\t\t\tread: value => updater(value, entityName, Acl.Operation.read),\n\t\t\tdelete: value => value,\n\t\t\tcustomPrimary: value => value,\n\t\t\trefreshMaterializedView: value => value,\n\t\t\tnoRoot: value => value,\n\t\t}\n\t\tconst types: (keyof Acl.EntityOperations)[] = ['create', 'update', 'read', 'delete', 'customPrimary', 'noRoot']\n\t\tfor (const key of types) {\n\t\t\tif (key in entityPermissions.operations) {\n\t\t\t\toperations[key] = handlers[key](entityPermissions.operations[key] as any) as any\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\t...entityPermissions,\n\t\t\toperations,\n\t\t}\n\t}\n\nexport const updateAclEveryPredicate = (updater: EntityAclEveryPredicatesUpdater): AclEntityPermissionsUpdater => args => {\n\treturn {\n\t\t...args.entityPermissions,\n\t\tpredicates: Object.fromEntries(\n\t\t\tObject.entries(args.entityPermissions.predicates).map(([name, predicate]) => [\n\t\t\t\tname,\n\t\t\t\tupdater({\n\t\t\t\t\t...args,\n\t\t\t\t\tpredicate,\n\t\t\t\t}),\n\t\t\t]),\n\t\t),\n\t}\n}\n\nexport const updateModel = (...modelUpdate: (ModelUpdater | undefined)[]): SchemaUpdater => args => ({\n\t...args.schema,\n\tmodel: modelUpdate\n\t\t.filter((it): it is ModelUpdater => it !== undefined)\n\t\t.reduce((model, updater) => updater({ ...args, model }), args.schema.model),\n})\n\nexport const updateEntity = (name: string, entityUpdate: EntityUpdater): ModelUpdater => args => {\n\tif (!args.model.entities[name]) {\n\t\tthrow new SchemaUpdateError(`Entity ${name} not found`)\n\t}\n\treturn {\n\t\t...args.model,\n\t\tentities: {\n\t\t\t...args.model.entities,\n\t\t\t[name]: entityUpdate({ ...args, entity: args.model.entities[name] }),\n\t\t},\n\t}\n}\n\nexport const updateEveryEntity = (entityUpdate: EntityUpdater): ModelUpdater => args => ({\n\t...args.model,\n\tentities: Object.fromEntries(\n\t\tObject.entries(args.model.entities).map(([name, entity]) => [name, entityUpdate({ ...args, entity })]),\n\t),\n})\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\targs => {\n\t\tconst { [name]: field, ...otherFields } = args.entity.fields\n\t\tif (!args.entity.fields[name]) {\n\t\t\tthrow new SchemaUpdateError(`Field ${args.entity.name}::${name} not found`)\n\t\t}\n\t\tconst updatedField = fieldUpdater({ ...args, field: args.entity.fields[name] as In })\n\n\t\treturn {\n\t\t\t...args.entity,\n\t\t\tfields: {\n\t\t\t\t...otherFields,\n\t\t\t\t...(updatedField ? { [name]: updatedField } : {}),\n\t\t\t},\n\t\t}\n\t}\n\nexport const updateEveryField = (fieldUpdater: FieldUpdater<Model.AnyField, Model.AnyField>): EntityUpdater => args => ({\n\t...args.entity,\n\tfields: Object.fromEntries(\n\t\tObject.entries(args.entity.fields)\n\t\t\t.map(([name, field]) => {\n\t\t\t\tconst updatedField = fieldUpdater({ ...args, field })\n\t\t\t\tif (!updatedField) {\n\t\t\t\t\treturn undefined\n\t\t\t\t}\n\t\t\t\treturn [name, updatedField]\n\t\t\t})\n\t\t\t.filter(isDefined),\n\t),\n})\n\nexport const addField = (field: Model.AnyField): EntityUpdater => args => {\n\treturn {\n\t\t...args.entity,\n\t\tfields: {\n\t\t\t...args.entity.fields,\n\t\t\t[field.name]: field,\n\t\t},\n\t}\n}\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 => ctx.entity.name === entity.name && ctx.column.name === field.name ? undefined : ctx.value,\n\t\t\t\t\t\t\t\t\thandleRelation: ctx => ctx.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\t&& isOwningRelation(field)\n\t\t\t\t&& field.inversedBy\n\t\t\t\t&& version >= 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.js'\nimport { isDefined } from '../../utils/isDefined.js'\nimport { isInverseRelation, isOwningRelation, isRelation, PredicateDefinitionProcessor } from '@contember/schema-utils'\nimport { VERSION_ACL_PATCH, VERSION_REMOVE_RELATION_INVERSE_SIDE } from '../ModificationVersions.js'\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 = (...schemaUpdater: (SchemaUpdater | undefined)[]): SchemaUpdater => args =>\n\tschemaUpdater.filter(isDefined).reduce((schema, updater) => updater({ ...args, schema }), args.schema)\n\nexport const updateAcl = (updater: AclUpdater): SchemaUpdater => args => ({\n\t...args.schema,\n\tacl: updater({ schema: args.schema, acl: args.schema.acl }),\n})\n\nexport const updateAclEveryRole = (...updater: AclRoleUpdater[]): AclUpdater => args => ({\n\t...args.acl,\n\troles: Object.fromEntries(\n\t\tupdater.reduce(\n\t\t\t(acc, updater) => acc.map(([name, role]) => [name, updater({ ...args, role })]),\n\t\t\tObject.entries(args.acl.roles),\n\t\t),\n\t),\n})\n\nexport const updateAclEntities = (updater: AclPermissionsUpdater): AclRoleUpdater => args => ({\n\t...args.role,\n\tentities: updater({ ...args, entities: args.role.entities }),\n})\n\nexport const updateAclEveryEntity = (...updater: AclEntityPermissionsUpdater[]): AclRoleUpdater => args => ({\n\t...args.role,\n\tentities: Object.fromEntries(\n\t\tupdater.reduce(\n\t\t\t(acc, updater) =>\n\t\t\t\tacc.map(([entity, entityPermissions]) => [\n\t\t\t\t\tentity,\n\t\t\t\t\tupdater({\n\t\t\t\t\t\t...args,\n\t\t\t\t\t\tentities: args.role.entities,\n\t\t\t\t\t\tentityName: entity,\n\t\t\t\t\t\tentityPermissions,\n\t\t\t\t\t}),\n\t\t\t\t]),\n\t\t\tObject.entries(args.role.entities),\n\t\t),\n\t),\n})\n\ntype EntityAclFieldPermissionsUpdater = (\n\tfieldPermissions: Acl.FieldPermissions,\n\tentityName: string,\n\toperation: Acl.Operation,\n) => Acl.FieldPermissions\nexport const updateAclFieldPermissions =\n\t(updater: EntityAclFieldPermissionsUpdater): AclEntityPermissionsUpdater => ({ entityPermissions, entityName }) => {\n\t\tconst source = entityPermissions.operations\n\t\tconst updateFields = (value: Acl.FieldPermissions, operation: Acl.Operation) => updater(value, entityName, operation)\n\t\t// Carry every key over untouched by default, then rewrite the ones holding field names. An\n\t\t// operation key that is not handled here must survive rather than disappear - the previous\n\t\t// allow-list shape silently dropped `refreshMaterializedView` on every field rename.\n\t\tconst operations: Writable<Acl.EntityOperations> = { ...source }\n\t\tif (source.create !== undefined) {\n\t\t\toperations.create = updateFields(source.create, Acl.Operation.create)\n\t\t}\n\t\tif (source.update !== undefined) {\n\t\t\toperations.update = updateFields(source.update, Acl.Operation.update)\n\t\t}\n\t\tif (source.read !== undefined) {\n\t\t\toperations.read = updateFields(source.read, Acl.Operation.read)\n\t\t}\n\t\tif (source.through !== undefined) {\n\t\t\tconst through: Writable<Acl.ThroughOperations> = { ...source.through }\n\t\t\tif (source.through.create !== undefined) {\n\t\t\t\tthrough.create = updateFields(source.through.create, Acl.Operation.create)\n\t\t\t}\n\t\t\tif (source.through.update !== undefined) {\n\t\t\t\tthrough.update = updateFields(source.through.update, Acl.Operation.update)\n\t\t\t}\n\t\t\tif (source.through.read !== undefined) {\n\t\t\t\tthrough.read = updateFields(source.through.read, Acl.Operation.read)\n\t\t\t}\n\t\t\toperations.through = through\n\t\t}\n\n\t\treturn {\n\t\t\t...entityPermissions,\n\t\t\toperations,\n\t\t}\n\t}\n\nexport const updateAclEveryPredicate = (updater: EntityAclEveryPredicatesUpdater): AclEntityPermissionsUpdater => args => {\n\treturn {\n\t\t...args.entityPermissions,\n\t\tpredicates: Object.fromEntries(\n\t\t\tObject.entries(args.entityPermissions.predicates).map(([name, predicate]) => [\n\t\t\t\tname,\n\t\t\t\tupdater({\n\t\t\t\t\t...args,\n\t\t\t\t\tpredicate,\n\t\t\t\t}),\n\t\t\t]),\n\t\t),\n\t}\n}\n\nexport const updateModel = (...modelUpdate: (ModelUpdater | undefined)[]): SchemaUpdater => args => ({\n\t...args.schema,\n\tmodel: modelUpdate\n\t\t.filter((it): it is ModelUpdater => it !== undefined)\n\t\t.reduce((model, updater) => updater({ ...args, model }), args.schema.model),\n})\n\nexport const updateEntity = (name: string, entityUpdate: EntityUpdater): ModelUpdater => args => {\n\tif (!args.model.entities[name]) {\n\t\tthrow new SchemaUpdateError(`Entity ${name} not found`)\n\t}\n\treturn {\n\t\t...args.model,\n\t\tentities: {\n\t\t\t...args.model.entities,\n\t\t\t[name]: entityUpdate({ ...args, entity: args.model.entities[name] }),\n\t\t},\n\t}\n}\n\nexport const updateEveryEntity = (entityUpdate: EntityUpdater): ModelUpdater => args => ({\n\t...args.model,\n\tentities: Object.fromEntries(\n\t\tObject.entries(args.model.entities).map(([name, entity]) => [name, entityUpdate({ ...args, entity })]),\n\t),\n})\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\targs => {\n\t\tconst { [name]: field, ...otherFields } = args.entity.fields\n\t\tif (!args.entity.fields[name]) {\n\t\t\tthrow new SchemaUpdateError(`Field ${args.entity.name}::${name} not found`)\n\t\t}\n\t\tconst updatedField = fieldUpdater({ ...args, field: args.entity.fields[name] as In })\n\n\t\treturn {\n\t\t\t...args.entity,\n\t\t\tfields: {\n\t\t\t\t...otherFields,\n\t\t\t\t...(updatedField ? { [name]: updatedField } : {}),\n\t\t\t},\n\t\t}\n\t}\n\nexport const updateEveryField = (fieldUpdater: FieldUpdater<Model.AnyField, Model.AnyField>): EntityUpdater => args => ({\n\t...args.entity,\n\tfields: Object.fromEntries(\n\t\tObject.entries(args.entity.fields)\n\t\t\t.map(([name, field]) => {\n\t\t\t\tconst updatedField = fieldUpdater({ ...args, field })\n\t\t\t\tif (!updatedField) {\n\t\t\t\t\treturn undefined\n\t\t\t\t}\n\t\t\t\treturn [name, updatedField]\n\t\t\t})\n\t\t\t.filter(isDefined),\n\t),\n})\n\nexport const addField = (field: Model.AnyField): EntityUpdater => args => {\n\treturn {\n\t\t...args.entity,\n\t\tfields: {\n\t\t\t...args.entity.fields,\n\t\t\t[field.name]: field,\n\t\t},\n\t}\n}\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 => ctx.entity.name === entity.name && ctx.column.name === field.name ? undefined : ctx.value,\n\t\t\t\t\t\t\t\t\thandleRelation: ctx => ctx.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\t&& isOwningRelation(field)\n\t\t\t\t&& field.inversedBy\n\t\t\t\t&& version >= 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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"}
|
|
@@ -39,21 +39,30 @@ const updateAclEveryEntity = (...updater) => (args) => ({
|
|
|
39
39
|
)
|
|
40
40
|
});
|
|
41
41
|
const updateAclFieldPermissions = (updater) => ({ entityPermissions, entityName }) => {
|
|
42
|
-
const
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
42
|
+
const source = entityPermissions.operations;
|
|
43
|
+
const updateFields = (value, operation) => updater(value, entityName, operation);
|
|
44
|
+
const operations = { ...source };
|
|
45
|
+
if (source.create !== void 0) {
|
|
46
|
+
operations.create = updateFields(source.create, Acl.Operation.create);
|
|
47
|
+
}
|
|
48
|
+
if (source.update !== void 0) {
|
|
49
|
+
operations.update = updateFields(source.update, Acl.Operation.update);
|
|
50
|
+
}
|
|
51
|
+
if (source.read !== void 0) {
|
|
52
|
+
operations.read = updateFields(source.read, Acl.Operation.read);
|
|
53
|
+
}
|
|
54
|
+
if (source.through !== void 0) {
|
|
55
|
+
const through = { ...source.through };
|
|
56
|
+
if (source.through.create !== void 0) {
|
|
57
|
+
through.create = updateFields(source.through.create, Acl.Operation.create);
|
|
58
|
+
}
|
|
59
|
+
if (source.through.update !== void 0) {
|
|
60
|
+
through.update = updateFields(source.through.update, Acl.Operation.update);
|
|
61
|
+
}
|
|
62
|
+
if (source.through.read !== void 0) {
|
|
63
|
+
through.read = updateFields(source.through.read, Acl.Operation.read);
|
|
56
64
|
}
|
|
65
|
+
operations.through = through;
|
|
57
66
|
}
|
|
58
67
|
return {
|
|
59
68
|
...entityPermissions,
|
|
@@ -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.js'\nimport { isDefined } from '../../utils/isDefined.js'\nimport { isInverseRelation, isOwningRelation, isRelation, PredicateDefinitionProcessor } from '@contember/schema-utils'\nimport { VERSION_ACL_PATCH, VERSION_REMOVE_RELATION_INVERSE_SIDE } from '../ModificationVersions.js'\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 = (...schemaUpdater: (SchemaUpdater | undefined)[]): SchemaUpdater => args =>\n\tschemaUpdater.filter(isDefined).reduce((schema, updater) => updater({ ...args, schema }), args.schema)\n\nexport const updateAcl = (updater: AclUpdater): SchemaUpdater => args => ({\n\t...args.schema,\n\tacl: updater({ schema: args.schema, acl: args.schema.acl }),\n})\n\nexport const updateAclEveryRole = (...updater: AclRoleUpdater[]): AclUpdater => args => ({\n\t...args.acl,\n\troles: Object.fromEntries(\n\t\tupdater.reduce(\n\t\t\t(acc, updater) => acc.map(([name, role]) => [name, updater({ ...args, role })]),\n\t\t\tObject.entries(args.acl.roles),\n\t\t),\n\t),\n})\n\nexport const updateAclEntities = (updater: AclPermissionsUpdater): AclRoleUpdater => args => ({\n\t...args.role,\n\tentities: updater({ ...args, entities: args.role.entities }),\n})\n\nexport const updateAclEveryEntity = (...updater: AclEntityPermissionsUpdater[]): AclRoleUpdater => args => ({\n\t...args.role,\n\tentities: Object.fromEntries(\n\t\tupdater.reduce(\n\t\t\t(acc, updater) =>\n\t\t\t\tacc.map(([entity, entityPermissions]) => [\n\t\t\t\t\tentity,\n\t\t\t\t\tupdater({\n\t\t\t\t\t\t...args,\n\t\t\t\t\t\tentities: args.role.entities,\n\t\t\t\t\t\tentityName: entity,\n\t\t\t\t\t\tentityPermissions,\n\t\t\t\t\t}),\n\t\t\t\t]),\n\t\t\tObject.entries(args.role.entities),\n\t\t),\n\t),\n})\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 => ({ entityPermissions, entityName }) => {\n\t\tconst operations: Writable<Acl.EntityOperations> = {}\n\t\tconst handlers: EntityOperationHandler = {\n\t\t\tcreate: value => updater(value, entityName, Acl.Operation.create),\n\t\t\tupdate: value => updater(value, entityName, Acl.Operation.update),\n\t\t\tread: value => updater(value, entityName, Acl.Operation.read),\n\t\t\tdelete: value => value,\n\t\t\tcustomPrimary: value => value,\n\t\t\trefreshMaterializedView: value => value,\n\t\t\tnoRoot: value => value,\n\t\t}\n\t\tconst types: (keyof Acl.EntityOperations)[] = ['create', 'update', 'read', 'delete', 'customPrimary', 'noRoot']\n\t\tfor (const key of types) {\n\t\t\tif (key in entityPermissions.operations) {\n\t\t\t\toperations[key] = handlers[key](entityPermissions.operations[key] as any) as any\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\t...entityPermissions,\n\t\t\toperations,\n\t\t}\n\t}\n\nexport const updateAclEveryPredicate = (updater: EntityAclEveryPredicatesUpdater): AclEntityPermissionsUpdater => args => {\n\treturn {\n\t\t...args.entityPermissions,\n\t\tpredicates: Object.fromEntries(\n\t\t\tObject.entries(args.entityPermissions.predicates).map(([name, predicate]) => [\n\t\t\t\tname,\n\t\t\t\tupdater({\n\t\t\t\t\t...args,\n\t\t\t\t\tpredicate,\n\t\t\t\t}),\n\t\t\t]),\n\t\t),\n\t}\n}\n\nexport const updateModel = (...modelUpdate: (ModelUpdater | undefined)[]): SchemaUpdater => args => ({\n\t...args.schema,\n\tmodel: modelUpdate\n\t\t.filter((it): it is ModelUpdater => it !== undefined)\n\t\t.reduce((model, updater) => updater({ ...args, model }), args.schema.model),\n})\n\nexport const updateEntity = (name: string, entityUpdate: EntityUpdater): ModelUpdater => args => {\n\tif (!args.model.entities[name]) {\n\t\tthrow new SchemaUpdateError(`Entity ${name} not found`)\n\t}\n\treturn {\n\t\t...args.model,\n\t\tentities: {\n\t\t\t...args.model.entities,\n\t\t\t[name]: entityUpdate({ ...args, entity: args.model.entities[name] }),\n\t\t},\n\t}\n}\n\nexport const updateEveryEntity = (entityUpdate: EntityUpdater): ModelUpdater => args => ({\n\t...args.model,\n\tentities: Object.fromEntries(\n\t\tObject.entries(args.model.entities).map(([name, entity]) => [name, entityUpdate({ ...args, entity })]),\n\t),\n})\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\targs => {\n\t\tconst { [name]: field, ...otherFields } = args.entity.fields\n\t\tif (!args.entity.fields[name]) {\n\t\t\tthrow new SchemaUpdateError(`Field ${args.entity.name}::${name} not found`)\n\t\t}\n\t\tconst updatedField = fieldUpdater({ ...args, field: args.entity.fields[name] as In })\n\n\t\treturn {\n\t\t\t...args.entity,\n\t\t\tfields: {\n\t\t\t\t...otherFields,\n\t\t\t\t...(updatedField ? { [name]: updatedField } : {}),\n\t\t\t},\n\t\t}\n\t}\n\nexport const updateEveryField = (fieldUpdater: FieldUpdater<Model.AnyField, Model.AnyField>): EntityUpdater => args => ({\n\t...args.entity,\n\tfields: Object.fromEntries(\n\t\tObject.entries(args.entity.fields)\n\t\t\t.map(([name, field]) => {\n\t\t\t\tconst updatedField = fieldUpdater({ ...args, field })\n\t\t\t\tif (!updatedField) {\n\t\t\t\t\treturn undefined\n\t\t\t\t}\n\t\t\t\treturn [name, updatedField]\n\t\t\t})\n\t\t\t.filter(isDefined),\n\t),\n})\n\nexport const addField = (field: Model.AnyField): EntityUpdater => args => {\n\treturn {\n\t\t...args.entity,\n\t\tfields: {\n\t\t\t...args.entity.fields,\n\t\t\t[field.name]: field,\n\t\t},\n\t}\n}\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 => ctx.entity.name === entity.name && ctx.column.name === field.name ? undefined : ctx.value,\n\t\t\t\t\t\t\t\t\thandleRelation: ctx => ctx.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\t&& isOwningRelation(field)\n\t\t\t\t&& field.inversedBy\n\t\t\t\t&& version >= 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.js'\nimport { isDefined } from '../../utils/isDefined.js'\nimport { isInverseRelation, isOwningRelation, isRelation, PredicateDefinitionProcessor } from '@contember/schema-utils'\nimport { VERSION_ACL_PATCH, VERSION_REMOVE_RELATION_INVERSE_SIDE } from '../ModificationVersions.js'\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 = (...schemaUpdater: (SchemaUpdater | undefined)[]): SchemaUpdater => args =>\n\tschemaUpdater.filter(isDefined).reduce((schema, updater) => updater({ ...args, schema }), args.schema)\n\nexport const updateAcl = (updater: AclUpdater): SchemaUpdater => args => ({\n\t...args.schema,\n\tacl: updater({ schema: args.schema, acl: args.schema.acl }),\n})\n\nexport const updateAclEveryRole = (...updater: AclRoleUpdater[]): AclUpdater => args => ({\n\t...args.acl,\n\troles: Object.fromEntries(\n\t\tupdater.reduce(\n\t\t\t(acc, updater) => acc.map(([name, role]) => [name, updater({ ...args, role })]),\n\t\t\tObject.entries(args.acl.roles),\n\t\t),\n\t),\n})\n\nexport const updateAclEntities = (updater: AclPermissionsUpdater): AclRoleUpdater => args => ({\n\t...args.role,\n\tentities: updater({ ...args, entities: args.role.entities }),\n})\n\nexport const updateAclEveryEntity = (...updater: AclEntityPermissionsUpdater[]): AclRoleUpdater => args => ({\n\t...args.role,\n\tentities: Object.fromEntries(\n\t\tupdater.reduce(\n\t\t\t(acc, updater) =>\n\t\t\t\tacc.map(([entity, entityPermissions]) => [\n\t\t\t\t\tentity,\n\t\t\t\t\tupdater({\n\t\t\t\t\t\t...args,\n\t\t\t\t\t\tentities: args.role.entities,\n\t\t\t\t\t\tentityName: entity,\n\t\t\t\t\t\tentityPermissions,\n\t\t\t\t\t}),\n\t\t\t\t]),\n\t\t\tObject.entries(args.role.entities),\n\t\t),\n\t),\n})\n\ntype EntityAclFieldPermissionsUpdater = (\n\tfieldPermissions: Acl.FieldPermissions,\n\tentityName: string,\n\toperation: Acl.Operation,\n) => Acl.FieldPermissions\nexport const updateAclFieldPermissions =\n\t(updater: EntityAclFieldPermissionsUpdater): AclEntityPermissionsUpdater => ({ entityPermissions, entityName }) => {\n\t\tconst source = entityPermissions.operations\n\t\tconst updateFields = (value: Acl.FieldPermissions, operation: Acl.Operation) => updater(value, entityName, operation)\n\t\t// Carry every key over untouched by default, then rewrite the ones holding field names. An\n\t\t// operation key that is not handled here must survive rather than disappear - the previous\n\t\t// allow-list shape silently dropped `refreshMaterializedView` on every field rename.\n\t\tconst operations: Writable<Acl.EntityOperations> = { ...source }\n\t\tif (source.create !== undefined) {\n\t\t\toperations.create = updateFields(source.create, Acl.Operation.create)\n\t\t}\n\t\tif (source.update !== undefined) {\n\t\t\toperations.update = updateFields(source.update, Acl.Operation.update)\n\t\t}\n\t\tif (source.read !== undefined) {\n\t\t\toperations.read = updateFields(source.read, Acl.Operation.read)\n\t\t}\n\t\tif (source.through !== undefined) {\n\t\t\tconst through: Writable<Acl.ThroughOperations> = { ...source.through }\n\t\t\tif (source.through.create !== undefined) {\n\t\t\t\tthrough.create = updateFields(source.through.create, Acl.Operation.create)\n\t\t\t}\n\t\t\tif (source.through.update !== undefined) {\n\t\t\t\tthrough.update = updateFields(source.through.update, Acl.Operation.update)\n\t\t\t}\n\t\t\tif (source.through.read !== undefined) {\n\t\t\t\tthrough.read = updateFields(source.through.read, Acl.Operation.read)\n\t\t\t}\n\t\t\toperations.through = through\n\t\t}\n\n\t\treturn {\n\t\t\t...entityPermissions,\n\t\t\toperations,\n\t\t}\n\t}\n\nexport const updateAclEveryPredicate = (updater: EntityAclEveryPredicatesUpdater): AclEntityPermissionsUpdater => args => {\n\treturn {\n\t\t...args.entityPermissions,\n\t\tpredicates: Object.fromEntries(\n\t\t\tObject.entries(args.entityPermissions.predicates).map(([name, predicate]) => [\n\t\t\t\tname,\n\t\t\t\tupdater({\n\t\t\t\t\t...args,\n\t\t\t\t\tpredicate,\n\t\t\t\t}),\n\t\t\t]),\n\t\t),\n\t}\n}\n\nexport const updateModel = (...modelUpdate: (ModelUpdater | undefined)[]): SchemaUpdater => args => ({\n\t...args.schema,\n\tmodel: modelUpdate\n\t\t.filter((it): it is ModelUpdater => it !== undefined)\n\t\t.reduce((model, updater) => updater({ ...args, model }), args.schema.model),\n})\n\nexport const updateEntity = (name: string, entityUpdate: EntityUpdater): ModelUpdater => args => {\n\tif (!args.model.entities[name]) {\n\t\tthrow new SchemaUpdateError(`Entity ${name} not found`)\n\t}\n\treturn {\n\t\t...args.model,\n\t\tentities: {\n\t\t\t...args.model.entities,\n\t\t\t[name]: entityUpdate({ ...args, entity: args.model.entities[name] }),\n\t\t},\n\t}\n}\n\nexport const updateEveryEntity = (entityUpdate: EntityUpdater): ModelUpdater => args => ({\n\t...args.model,\n\tentities: Object.fromEntries(\n\t\tObject.entries(args.model.entities).map(([name, entity]) => [name, entityUpdate({ ...args, entity })]),\n\t),\n})\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\targs => {\n\t\tconst { [name]: field, ...otherFields } = args.entity.fields\n\t\tif (!args.entity.fields[name]) {\n\t\t\tthrow new SchemaUpdateError(`Field ${args.entity.name}::${name} not found`)\n\t\t}\n\t\tconst updatedField = fieldUpdater({ ...args, field: args.entity.fields[name] as In })\n\n\t\treturn {\n\t\t\t...args.entity,\n\t\t\tfields: {\n\t\t\t\t...otherFields,\n\t\t\t\t...(updatedField ? { [name]: updatedField } : {}),\n\t\t\t},\n\t\t}\n\t}\n\nexport const updateEveryField = (fieldUpdater: FieldUpdater<Model.AnyField, Model.AnyField>): EntityUpdater => args => ({\n\t...args.entity,\n\tfields: Object.fromEntries(\n\t\tObject.entries(args.entity.fields)\n\t\t\t.map(([name, field]) => {\n\t\t\t\tconst updatedField = fieldUpdater({ ...args, field })\n\t\t\t\tif (!updatedField) {\n\t\t\t\t\treturn undefined\n\t\t\t\t}\n\t\t\t\treturn [name, updatedField]\n\t\t\t})\n\t\t\t.filter(isDefined),\n\t),\n})\n\nexport const addField = (field: Model.AnyField): EntityUpdater => args => {\n\treturn {\n\t\t...args.entity,\n\t\tfields: {\n\t\t\t...args.entity.fields,\n\t\t\t[field.name]: field,\n\t\t},\n\t}\n}\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 => ctx.entity.name === entity.name && ctx.column.name === field.name ? undefined : ctx.value,\n\t\t\t\t\t\t\t\t\thandleRelation: ctx => ctx.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\t&& isOwningRelation(field)\n\t\t\t\t&& field.inversedBy\n\t\t\t\t&& version >= 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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"}
|