@webiny/api-headless-cms 5.27.0 → 5.28.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/content/contextSetup.js.map +1 -1
  2. package/content/graphQLHandlerFactory.js.map +1 -1
  3. package/content/parameterPlugins.js.map +1 -1
  4. package/content/plugins/CmsGroupPlugin.js.map +1 -1
  5. package/content/plugins/CmsModelPlugin.js.map +1 -1
  6. package/content/plugins/CmsParametersPlugin.js.map +1 -1
  7. package/content/plugins/buildSchemaPlugins.js.map +1 -1
  8. package/content/plugins/crud/contentEntry/afterDelete.js.map +1 -1
  9. package/content/plugins/crud/contentEntry/beforeCreate.js.map +1 -1
  10. package/content/plugins/crud/contentEntry/beforeUpdate.js.map +1 -1
  11. package/content/plugins/crud/contentEntry/entryDataValidation.js.map +1 -1
  12. package/content/plugins/crud/contentEntry/markLockedFields.js.map +1 -1
  13. package/content/plugins/crud/contentEntry/referenceFieldsMapping.js.map +1 -1
  14. package/content/plugins/crud/contentEntry.crud.js.map +1 -1
  15. package/content/plugins/crud/contentModel/afterCreate.js.map +1 -1
  16. package/content/plugins/crud/contentModel/afterCreateFrom.js.map +1 -1
  17. package/content/plugins/crud/contentModel/afterDelete.js.map +1 -1
  18. package/content/plugins/crud/contentModel/afterUpdate.js.map +1 -1
  19. package/content/plugins/crud/contentModel/beforeCreate.js +26 -4
  20. package/content/plugins/crud/contentModel/beforeCreate.js.map +1 -1
  21. package/content/plugins/crud/contentModel/beforeDelete.js.map +1 -1
  22. package/content/plugins/crud/contentModel/beforeUpdate.js +5 -188
  23. package/content/plugins/crud/contentModel/beforeUpdate.js.map +1 -1
  24. package/content/plugins/crud/contentModel/contentModelManagerFactory.js.map +1 -1
  25. package/content/plugins/crud/contentModel/createFieldModels.d.ts +2 -2
  26. package/content/plugins/crud/contentModel/createFieldModels.js +6 -2
  27. package/content/plugins/crud/contentModel/createFieldModels.js.map +1 -1
  28. package/content/plugins/crud/contentModel/idValidation.js.map +1 -1
  29. package/content/plugins/crud/contentModel/models.d.ts +1 -1
  30. package/content/plugins/crud/contentModel/models.js +43 -33
  31. package/content/plugins/crud/contentModel/models.js.map +1 -1
  32. package/content/plugins/crud/contentModel/validateLayout.d.ts +1 -1
  33. package/content/plugins/crud/contentModel/validateLayout.js +2 -3
  34. package/content/plugins/crud/contentModel/validateLayout.js.map +1 -1
  35. package/content/plugins/crud/contentModel/validateModelFields.d.ts +8 -0
  36. package/content/plugins/crud/contentModel/validateModelFields.js +201 -0
  37. package/content/plugins/crud/contentModel/validateModelFields.js.map +1 -0
  38. package/content/plugins/crud/contentModel.crud.js +7 -5
  39. package/content/plugins/crud/contentModel.crud.js.map +1 -1
  40. package/content/plugins/crud/contentModelGroup/beforeCreate.js.map +1 -1
  41. package/content/plugins/crud/contentModelGroup/beforeDelete.js.map +1 -1
  42. package/content/plugins/crud/contentModelGroup/beforeUpdate.js.map +1 -1
  43. package/content/plugins/crud/contentModelGroup.crud.js.map +1 -1
  44. package/content/plugins/crud/index.js.map +1 -1
  45. package/content/plugins/graphqlFields/boolean.js.map +1 -1
  46. package/content/plugins/graphqlFields/datetime.js.map +1 -1
  47. package/content/plugins/graphqlFields/file.js.map +1 -1
  48. package/content/plugins/graphqlFields/helpers.js.map +1 -1
  49. package/content/plugins/graphqlFields/index.js.map +1 -1
  50. package/content/plugins/graphqlFields/longText.js.map +1 -1
  51. package/content/plugins/graphqlFields/number.js.map +1 -1
  52. package/content/plugins/graphqlFields/object.js.map +1 -1
  53. package/content/plugins/graphqlFields/ref.js.map +1 -1
  54. package/content/plugins/graphqlFields/richText.js.map +1 -1
  55. package/content/plugins/graphqlFields/text.js.map +1 -1
  56. package/content/plugins/internalSecurity/InternalAuthenticationPlugin.js.map +1 -1
  57. package/content/plugins/internalSecurity/InternalAuthorizationPlugin.js.map +1 -1
  58. package/content/plugins/modelManager/DefaultCmsModelManager.js.map +1 -1
  59. package/content/plugins/modelManager/index.js.map +1 -1
  60. package/content/plugins/schema/baseSchema.js.map +1 -1
  61. package/content/plugins/schema/contentEntries.js.map +1 -1
  62. package/content/plugins/schema/contentModelGroups.js.map +1 -1
  63. package/content/plugins/schema/contentModels.js +3 -0
  64. package/content/plugins/schema/contentModels.js.map +1 -1
  65. package/content/plugins/schema/createFieldResolvers.js.map +1 -1
  66. package/content/plugins/schema/createManageResolvers.js.map +1 -1
  67. package/content/plugins/schema/createManageSDL.js.map +1 -1
  68. package/content/plugins/schema/createPreviewResolvers.js.map +1 -1
  69. package/content/plugins/schema/createReadResolvers.js.map +1 -1
  70. package/content/plugins/schema/createReadSDL.js.map +1 -1
  71. package/content/plugins/schema/resolvers/commonFieldResolvers.js.map +1 -1
  72. package/content/plugins/schema/resolvers/manage/resolveCreate.js.map +1 -1
  73. package/content/plugins/schema/resolvers/manage/resolveCreateFrom.js.map +1 -1
  74. package/content/plugins/schema/resolvers/manage/resolveDelete.js.map +1 -1
  75. package/content/plugins/schema/resolvers/manage/resolveGet.js.map +1 -1
  76. package/content/plugins/schema/resolvers/manage/resolveGetByIds.js.map +1 -1
  77. package/content/plugins/schema/resolvers/manage/resolveGetRevisions.js.map +1 -1
  78. package/content/plugins/schema/resolvers/manage/resolveList.js.map +1 -1
  79. package/content/plugins/schema/resolvers/manage/resolvePublish.js.map +1 -1
  80. package/content/plugins/schema/resolvers/manage/resolveRepublish.js.map +1 -1
  81. package/content/plugins/schema/resolvers/manage/resolveRequestChanges.js.map +1 -1
  82. package/content/plugins/schema/resolvers/manage/resolveRequestReview.js.map +1 -1
  83. package/content/plugins/schema/resolvers/manage/resolveUnpublish.js.map +1 -1
  84. package/content/plugins/schema/resolvers/manage/resolveUpdate.js.map +1 -1
  85. package/content/plugins/schema/resolvers/preview/resolveGet.js.map +1 -1
  86. package/content/plugins/schema/resolvers/preview/resolveList.js.map +1 -1
  87. package/content/plugins/schema/resolvers/read/resolveGet.js.map +1 -1
  88. package/content/plugins/schema/resolvers/read/resolveList.js.map +1 -1
  89. package/content/plugins/schema/schemaPlugins.js.map +1 -1
  90. package/content/plugins/storage/StorageTransformPlugin.js.map +1 -1
  91. package/content/plugins/storage/default.js.map +1 -1
  92. package/content/plugins/storage/object.js.map +1 -1
  93. package/content/plugins/utils/createTypeName.js.map +1 -1
  94. package/content/plugins/utils/entryStorage.js.map +1 -1
  95. package/content/plugins/utils/getEntryTitle.js.map +1 -1
  96. package/content/plugins/utils/getSchemaFromFieldPlugins.js.map +1 -1
  97. package/content/plugins/utils/pluralizedTypeName.js.map +1 -1
  98. package/content/plugins/utils/renderFields.js.map +1 -1
  99. package/content/plugins/utils/renderGetFilterFields.js.map +1 -1
  100. package/content/plugins/utils/renderInputFields.js.map +1 -1
  101. package/content/plugins/utils/renderListFilterFields.js.map +1 -1
  102. package/content/plugins/utils/renderSortEnum.js.map +1 -1
  103. package/content/plugins/validators/dateGte.js.map +1 -1
  104. package/content/plugins/validators/dateLte.js.map +1 -1
  105. package/content/plugins/validators/gte.js.map +1 -1
  106. package/content/plugins/validators/in.js.map +1 -1
  107. package/content/plugins/validators/index.js.map +1 -1
  108. package/content/plugins/validators/lte.js.map +1 -1
  109. package/content/plugins/validators/maxLength.js.map +1 -1
  110. package/content/plugins/validators/minLength.js.map +1 -1
  111. package/content/plugins/validators/pattern.js.map +1 -1
  112. package/content/plugins/validators/patternPlugins/email.js.map +1 -1
  113. package/content/plugins/validators/patternPlugins/index.js.map +1 -1
  114. package/content/plugins/validators/patternPlugins/lowerCase.js.map +1 -1
  115. package/content/plugins/validators/patternPlugins/lowerCaseSpace.js.map +1 -1
  116. package/content/plugins/validators/patternPlugins/upperCase.js.map +1 -1
  117. package/content/plugins/validators/patternPlugins/upperCaseSpace.js.map +1 -1
  118. package/content/plugins/validators/patternPlugins/url.js.map +1 -1
  119. package/content/plugins/validators/required.js.map +1 -1
  120. package/content/plugins/validators/timeGte.js.map +1 -1
  121. package/content/plugins/validators/timeLte.js.map +1 -1
  122. package/content/plugins/validators/unique.js.map +1 -1
  123. package/index.js.map +1 -1
  124. package/migrateCMSPermissions.js.map +1 -1
  125. package/package.json +25 -25
  126. package/plugins/context.js.map +1 -1
  127. package/plugins/crud/index.js.map +1 -1
  128. package/plugins/crud/settings.crud.js.map +1 -1
  129. package/plugins/crud/system.crud.js.map +1 -1
  130. package/plugins/graphql/system.js.map +1 -1
  131. package/plugins/graphql.js.map +1 -1
  132. package/plugins/upgrades/index.js.map +1 -1
  133. package/plugins/upgrades/v5.5.0/helpers.js.map +1 -1
  134. package/plugins/upgrades/v5.5.0/index.js.map +1 -1
  135. package/transformers.js.map +1 -1
  136. package/types.d.ts +20 -0
  137. package/types.js.map +1 -1
  138. package/utils.js.map +1 -1
package/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["utils.ts"],"names":["hasRwd","permission","rwd","includes","hasPw","pw","isCustom","Object","keys","length","PW","r","c","p","u","RWD","w","d","checkPermissions","context","name","check","contentPermission","security","getPermission","NotAuthorizedError","data","reason","code","cms","getLocale","Array","isArray","locales","checkOwnership","record","own","identity","getIdentity","owner","id","creator","validateOwnership","checkModelAccess","model","validateModelAccess","modelId","modelGroupPermission","groups","modelPermission","models","locale","group","validateGroupAccess","toSlug","text","replacement","lower","remove","filterAsync","items","predicate","filteredItems","i","item","valid","push"],"mappings":"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","sourcesContent":["import slugify from \"slugify\";\nimport { NotAuthorizedError } from \"@webiny/api-security\";\n\nimport {\n CmsModelPermission,\n CmsModel,\n CmsContext,\n CreatedBy,\n CmsGroupPermission,\n CmsGroup,\n CmsEntryPermission,\n BaseCmsSecurityPermission\n} from \"~/types\";\n\nexport const hasRwd = (permission: BaseCmsSecurityPermission, rwd: string): boolean => {\n if (typeof permission.rwd !== \"string\") {\n return true;\n }\n\n return permission.rwd.includes(rwd);\n};\n\nexport const hasPw = (permission: CmsEntryPermission, pw: string): boolean => {\n const isCustom = Object.keys(permission).length > 1; // \"name\" key is always present\n\n if (!isCustom) {\n // Means it's a \"full-access\" permission.\n return true;\n }\n\n if (typeof permission.pw !== \"string\") {\n return false;\n }\n\n return permission.pw.includes(pw);\n};\n\nconst PW: Record<string, string> = {\n r: \"request review\",\n c: \"request change\",\n p: \"publish\",\n u: \"unpublish\"\n};\n\nconst RWD: Record<string, string> = {\n r: \"read\",\n w: \"write\",\n d: \"delete\"\n};\n\nexport const checkPermissions = async <\n TPermission extends BaseCmsSecurityPermission = BaseCmsSecurityPermission\n>(\n context: CmsContext,\n name: string,\n check?: { rwd?: string; pw?: string }\n): Promise<TPermission> => {\n // Check if user is allowed to edit content in current language\n const contentPermission: any = await context.security.getPermission(\"content.i18n\");\n\n if (!contentPermission) {\n throw new NotAuthorizedError({\n data: {\n reason: \"Missing access to content in any locale.\"\n }\n });\n }\n\n // We need to check this manually as CMS locale comes from the URL and not the default i18n app.\n const code = context.cms.getLocale().code;\n\n // IMPORTANT: If we have a `contentPermission`, and `locales` key is NOT SET - it means the user has access to all locales.\n // However, if the the `locales` IS SET - check that it contains the required locale.\n if (Array.isArray(contentPermission.locales) && !contentPermission.locales.includes(code)) {\n throw new NotAuthorizedError({\n data: {\n reason: `Not allowed to access content in \"${code}.\"`\n }\n });\n }\n\n const permission = await context.security.getPermission<TPermission>(name);\n\n if (!permission) {\n throw new NotAuthorizedError({\n data: {\n reason: `Missing permission \"${name}\".`\n }\n });\n }\n\n if (!check) {\n return permission;\n }\n\n if (check.rwd && !hasRwd(permission, check.rwd)) {\n throw new NotAuthorizedError({\n data: {\n reason: `Not allowed to perform \"${RWD[check.rwd]}\" on \"${name}\".`\n }\n });\n }\n\n // r = request review\n // c = request change\n // p = publish\n // u = unpublish\n if (check.pw && !hasPw(permission, check.pw)) {\n throw new NotAuthorizedError({\n data: {\n reason: `Not allowed to perform \"${PW[check.pw]}\" on \"${name}\".`\n }\n });\n }\n\n return permission;\n};\n\ninterface OwnableRecord {\n createdBy?: CreatedBy;\n ownedBy?: CreatedBy;\n}\n\nexport const checkOwnership = (\n context: CmsContext,\n permission: BaseCmsSecurityPermission,\n record: OwnableRecord\n): void => {\n if (!permission.own) {\n return;\n }\n\n const identity = context.security.getIdentity();\n const owner = identity && record[\"ownedBy\"] && record[\"ownedBy\"].id === identity.id;\n const creator = identity && record[\"createdBy\"] && record[\"createdBy\"].id === identity.id;\n\n if (!owner && !creator) {\n throw new NotAuthorizedError({\n data: {\n reason: `You are not the owner of the record.`\n }\n });\n }\n};\n\nexport const validateOwnership = (\n context: CmsContext,\n permission: BaseCmsSecurityPermission,\n record: OwnableRecord\n): boolean => {\n try {\n checkOwnership(context, permission, record);\n return true;\n } catch {\n return false;\n }\n};\n/**\n * model access is checking for both specific model or group access\n * if permission has specific models set as access pattern then groups will not matter (although both can be set)\n */\nexport const checkModelAccess = async (context: CmsContext, model: CmsModel): Promise<void> => {\n if (await validateModelAccess(context, model)) {\n return;\n }\n throw new NotAuthorizedError({\n data: {\n reason: `Not allowed to access model \"${model.modelId}\".`\n }\n });\n};\nexport const validateModelAccess = async (\n context: CmsContext,\n model: CmsModel\n): Promise<boolean> => {\n const modelGroupPermission: CmsGroupPermission = await checkPermissions(\n context,\n \"cms.contentModelGroup\",\n { rwd: \"r\" }\n );\n const { groups } = modelGroupPermission;\n\n const modelPermission: CmsModelPermission = await checkPermissions(\n context,\n \"cms.contentModel\",\n {\n rwd: \"r\"\n }\n );\n const { models } = modelPermission;\n // when no models or groups defined on permission\n // it means user has access to everything\n if (!models && !groups) {\n return true;\n }\n const locale = context.cms.getLocale().code;\n // Check whether the model is question belongs to \"content model groups\" for which user has permission.\n if (groups) {\n if (\n Array.isArray(groups[locale]) === false ||\n groups[locale].includes(model.group.id) === false\n ) {\n return false;\n }\n }\n // Check whether the model is question belongs to \"content models\" for which user has permission.\n if (models) {\n if (\n Array.isArray(models[locale]) === false ||\n models[locale].includes(model.modelId) === false\n ) {\n return false;\n }\n }\n\n return true;\n};\nexport const validateGroupAccess = (\n context: CmsContext,\n permission: CmsGroupPermission,\n group: CmsGroup\n): boolean => {\n const { groups } = permission;\n // when no groups defined on permission\n // it means user has access to everything\n if (!groups) {\n return true;\n }\n const locale = context.cms.getLocale().code;\n // when there is no locale in groups, it means that no access was given\n // this happens when access control was set but no models or groups were added\n if (Array.isArray(groups[locale]) === false || groups[locale].includes(group.id) === false) {\n return false;\n }\n return true;\n};\n\nexport const toSlug = (text: string): string => {\n return slugify(text, {\n replacement: \"-\",\n lower: true,\n remove: /[*#\\?<>_\\{\\}\\[\\]+~.()'\"!:;@]/g\n });\n};\n\nexport const filterAsync = async <T = Record<string, any>>(\n items: T[],\n predicate: (param: T) => Promise<boolean>\n): Promise<T[]> => {\n const filteredItems = [];\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const valid = await predicate(item);\n if (valid) {\n filteredItems.push(item);\n }\n }\n\n return filteredItems;\n};\n"]}
1
+ {"version":3,"names":["hasRwd","permission","rwd","includes","hasPw","pw","isCustom","Object","keys","length","PW","r","c","p","u","RWD","w","d","checkPermissions","context","name","check","contentPermission","security","getPermission","NotAuthorizedError","data","reason","code","cms","getLocale","Array","isArray","locales","checkOwnership","record","own","identity","getIdentity","owner","id","creator","validateOwnership","checkModelAccess","model","validateModelAccess","modelId","modelGroupPermission","groups","modelPermission","models","locale","group","validateGroupAccess","toSlug","text","slugify","replacement","lower","remove","filterAsync","items","predicate","filteredItems","i","item","valid","push"],"sources":["utils.ts"],"sourcesContent":["import slugify from \"slugify\";\nimport { NotAuthorizedError } from \"@webiny/api-security\";\n\nimport {\n CmsModelPermission,\n CmsModel,\n CmsContext,\n CreatedBy,\n CmsGroupPermission,\n CmsGroup,\n CmsEntryPermission,\n BaseCmsSecurityPermission\n} from \"~/types\";\n\nexport const hasRwd = (permission: BaseCmsSecurityPermission, rwd: string): boolean => {\n if (typeof permission.rwd !== \"string\") {\n return true;\n }\n\n return permission.rwd.includes(rwd);\n};\n\nexport const hasPw = (permission: CmsEntryPermission, pw: string): boolean => {\n const isCustom = Object.keys(permission).length > 1; // \"name\" key is always present\n\n if (!isCustom) {\n // Means it's a \"full-access\" permission.\n return true;\n }\n\n if (typeof permission.pw !== \"string\") {\n return false;\n }\n\n return permission.pw.includes(pw);\n};\n\nconst PW: Record<string, string> = {\n r: \"request review\",\n c: \"request change\",\n p: \"publish\",\n u: \"unpublish\"\n};\n\nconst RWD: Record<string, string> = {\n r: \"read\",\n w: \"write\",\n d: \"delete\"\n};\n\nexport const checkPermissions = async <\n TPermission extends BaseCmsSecurityPermission = BaseCmsSecurityPermission\n>(\n context: CmsContext,\n name: string,\n check?: { rwd?: string; pw?: string }\n): Promise<TPermission> => {\n // Check if user is allowed to edit content in current language\n const contentPermission: any = await context.security.getPermission(\"content.i18n\");\n\n if (!contentPermission) {\n throw new NotAuthorizedError({\n data: {\n reason: \"Missing access to content in any locale.\"\n }\n });\n }\n\n // We need to check this manually as CMS locale comes from the URL and not the default i18n app.\n const code = context.cms.getLocale().code;\n\n // IMPORTANT: If we have a `contentPermission`, and `locales` key is NOT SET - it means the user has access to all locales.\n // However, if the the `locales` IS SET - check that it contains the required locale.\n if (Array.isArray(contentPermission.locales) && !contentPermission.locales.includes(code)) {\n throw new NotAuthorizedError({\n data: {\n reason: `Not allowed to access content in \"${code}.\"`\n }\n });\n }\n\n const permission = await context.security.getPermission<TPermission>(name);\n\n if (!permission) {\n throw new NotAuthorizedError({\n data: {\n reason: `Missing permission \"${name}\".`\n }\n });\n }\n\n if (!check) {\n return permission;\n }\n\n if (check.rwd && !hasRwd(permission, check.rwd)) {\n throw new NotAuthorizedError({\n data: {\n reason: `Not allowed to perform \"${RWD[check.rwd]}\" on \"${name}\".`\n }\n });\n }\n\n // r = request review\n // c = request change\n // p = publish\n // u = unpublish\n if (check.pw && !hasPw(permission, check.pw)) {\n throw new NotAuthorizedError({\n data: {\n reason: `Not allowed to perform \"${PW[check.pw]}\" on \"${name}\".`\n }\n });\n }\n\n return permission;\n};\n\ninterface OwnableRecord {\n createdBy?: CreatedBy;\n ownedBy?: CreatedBy;\n}\n\nexport const checkOwnership = (\n context: CmsContext,\n permission: BaseCmsSecurityPermission,\n record: OwnableRecord\n): void => {\n if (!permission.own) {\n return;\n }\n\n const identity = context.security.getIdentity();\n const owner = identity && record[\"ownedBy\"] && record[\"ownedBy\"].id === identity.id;\n const creator = identity && record[\"createdBy\"] && record[\"createdBy\"].id === identity.id;\n\n if (!owner && !creator) {\n throw new NotAuthorizedError({\n data: {\n reason: `You are not the owner of the record.`\n }\n });\n }\n};\n\nexport const validateOwnership = (\n context: CmsContext,\n permission: BaseCmsSecurityPermission,\n record: OwnableRecord\n): boolean => {\n try {\n checkOwnership(context, permission, record);\n return true;\n } catch {\n return false;\n }\n};\n/**\n * model access is checking for both specific model or group access\n * if permission has specific models set as access pattern then groups will not matter (although both can be set)\n */\nexport const checkModelAccess = async (context: CmsContext, model: CmsModel): Promise<void> => {\n if (await validateModelAccess(context, model)) {\n return;\n }\n throw new NotAuthorizedError({\n data: {\n reason: `Not allowed to access model \"${model.modelId}\".`\n }\n });\n};\nexport const validateModelAccess = async (\n context: CmsContext,\n model: CmsModel\n): Promise<boolean> => {\n const modelGroupPermission: CmsGroupPermission = await checkPermissions(\n context,\n \"cms.contentModelGroup\",\n { rwd: \"r\" }\n );\n const { groups } = modelGroupPermission;\n\n const modelPermission: CmsModelPermission = await checkPermissions(\n context,\n \"cms.contentModel\",\n {\n rwd: \"r\"\n }\n );\n const { models } = modelPermission;\n // when no models or groups defined on permission\n // it means user has access to everything\n if (!models && !groups) {\n return true;\n }\n const locale = context.cms.getLocale().code;\n // Check whether the model is question belongs to \"content model groups\" for which user has permission.\n if (groups) {\n if (\n Array.isArray(groups[locale]) === false ||\n groups[locale].includes(model.group.id) === false\n ) {\n return false;\n }\n }\n // Check whether the model is question belongs to \"content models\" for which user has permission.\n if (models) {\n if (\n Array.isArray(models[locale]) === false ||\n models[locale].includes(model.modelId) === false\n ) {\n return false;\n }\n }\n\n return true;\n};\nexport const validateGroupAccess = (\n context: CmsContext,\n permission: CmsGroupPermission,\n group: CmsGroup\n): boolean => {\n const { groups } = permission;\n // when no groups defined on permission\n // it means user has access to everything\n if (!groups) {\n return true;\n }\n const locale = context.cms.getLocale().code;\n // when there is no locale in groups, it means that no access was given\n // this happens when access control was set but no models or groups were added\n if (Array.isArray(groups[locale]) === false || groups[locale].includes(group.id) === false) {\n return false;\n }\n return true;\n};\n\nexport const toSlug = (text: string): string => {\n return slugify(text, {\n replacement: \"-\",\n lower: true,\n remove: /[*#\\?<>_\\{\\}\\[\\]+~.()'\"!:;@]/g\n });\n};\n\nexport const filterAsync = async <T = Record<string, any>>(\n items: T[],\n predicate: (param: T) => Promise<boolean>\n): Promise<T[]> => {\n const filteredItems = [];\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const valid = await predicate(item);\n if (valid) {\n filteredItems.push(item);\n }\n }\n\n return filteredItems;\n};\n"],"mappings":"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"}