@strapi/i18n 5.0.0-rc.14 → 5.0.0-rc.16

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.
@@ -65,12 +65,10 @@ const registerModelsHooks = () => {
65
65
  return result;
66
66
  });
67
67
  };
68
- const bootstrap = async ({ strapi: strapi2 }) => {
68
+ const bootstrap = async () => {
69
69
  const { sendDidInitializeEvent: sendDidInitializeEvent2 } = getService("metrics");
70
- const { decorator: decorator2 } = getService("entity-service-decorator");
71
70
  const { initDefaultLocale: initDefaultLocale2 } = getService("locales");
72
71
  const { sectionsBuilder, actions: actions2, engine } = getService("permissions");
73
- strapi2.entityService.decorate(decorator2);
74
72
  await initDefaultLocale2();
75
73
  sectionsBuilder.registerLocalesPropertyHandler();
76
74
  await actions2.registerI18nActions();
@@ -3066,91 +3064,6 @@ const getIsoLocales = () => isoLocales;
3066
3064
  const isoLocalesService = () => ({
3067
3065
  getIsoLocales
3068
3066
  });
3069
- const LOCALE_QUERY_FILTER = "locale";
3070
- const SINGLE_ENTRY_ACTIONS = ["findOne", "update", "delete"];
3071
- const BULK_ACTIONS = ["delete"];
3072
- const paramsContain = (key, params) => {
3073
- return fp.has(key, params.filters) || fp.isArray(params.filters) && params.filters.some((clause) => fp.has(key, clause)) || fp.isArray(fp.get("$and", params.filters)) && params.filters.$and.some((clause) => fp.has(key, clause));
3074
- };
3075
- const wrapParams = async (params = {}, ctx = {}) => {
3076
- const { action } = ctx;
3077
- if (fp.has(LOCALE_QUERY_FILTER, params)) {
3078
- if (params[LOCALE_QUERY_FILTER] === "all") {
3079
- return fp.omit(LOCALE_QUERY_FILTER, params);
3080
- }
3081
- return {
3082
- ...fp.omit(LOCALE_QUERY_FILTER, params),
3083
- filters: {
3084
- $and: [{ locale: params[LOCALE_QUERY_FILTER] }].concat(params.filters || [])
3085
- }
3086
- };
3087
- }
3088
- const entityDefinedById = paramsContain("id", params) && SINGLE_ENTRY_ACTIONS.includes(action);
3089
- const entitiesDefinedByIds = paramsContain("id.$in", params) && BULK_ACTIONS.includes(action);
3090
- if (entityDefinedById || entitiesDefinedByIds) {
3091
- return params;
3092
- }
3093
- const { getDefaultLocale: getDefaultLocale2 } = getService("locales");
3094
- return {
3095
- ...params,
3096
- filters: {
3097
- $and: [{ locale: await getDefaultLocale2() }].concat(params.filters || [])
3098
- }
3099
- };
3100
- };
3101
- const decorator = (service) => ({
3102
- /**
3103
- * Wraps result
3104
- * @param {object} result - result object of query
3105
- * @param {object} ctx - Query context
3106
- * @param {object} ctx.model - Model that is being used
3107
- */
3108
- async wrapResult(result = {}, ctx = {}) {
3109
- return service.wrapResult.call(this, result, ctx);
3110
- },
3111
- /**
3112
- * Wraps query options. In particular will add default locale to query params
3113
- * @param {object} params - Query options object (params, data, files, populate)
3114
- * @param {object} ctx - Query context
3115
- * @param {object} ctx.model - Model that is being used
3116
- */
3117
- async wrapParams(params = {}, ctx = {}) {
3118
- const wrappedParams = await service.wrapParams.call(this, params, ctx);
3119
- const model = strapi.getModel(ctx.uid);
3120
- const { isLocalizedContentType: isLocalizedContentType2 } = getService("content-types");
3121
- if (!isLocalizedContentType2(model)) {
3122
- return wrappedParams;
3123
- }
3124
- return wrapParams(wrappedParams, ctx);
3125
- },
3126
- /**
3127
- * Find an entry or several if fetching all locales
3128
- * @param {string} uid - Model uid
3129
- * @param {object} opts - Query options object (params, data, files, populate)
3130
- */
3131
- async findMany(uid, opts) {
3132
- const model = strapi.getModel(uid);
3133
- const { isLocalizedContentType: isLocalizedContentType2 } = getService("content-types");
3134
- if (!isLocalizedContentType2(model)) {
3135
- return service.findMany.call(this, uid, opts);
3136
- }
3137
- const { kind } = model;
3138
- if (kind === "singleType") {
3139
- if (opts[LOCALE_QUERY_FILTER] === "all") {
3140
- const wrappedParams = await this.wrapParams(opts, { uid, action: "findMany" });
3141
- const query = strapi.get("query-params").transform(uid, wrappedParams);
3142
- const entities = await strapi.db.query(uid).findMany(query);
3143
- return this.wrapResult(entities, { uid, action: "findMany" });
3144
- }
3145
- return service.findMany.call(this, uid, opts);
3146
- }
3147
- return service.findMany.call(this, uid, opts);
3148
- }
3149
- });
3150
- const entityServiceDecorator = () => ({
3151
- decorator,
3152
- wrapParams
3153
- });
3154
3067
  const {
3155
3068
  isRelationalAttribute,
3156
3069
  getVisibleAttributes,
@@ -3281,7 +3194,6 @@ const services = {
3281
3194
  localizations,
3282
3195
  locales,
3283
3196
  "iso-locales": isoLocalesService,
3284
- "entity-service-decorator": entityServiceDecorator,
3285
3197
  "content-types": contentTypes
3286
3198
  };
3287
3199
  const admin = {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../server/src/utils/index.ts","../../server/src/bootstrap.ts","../../server/src/controllers/validate-locale-creation.ts","../../server/src/graphql.ts","../../server/src/constants/index.ts","../../server/src/migrations/content-type/enable/index.ts","../../server/src/migrations/content-type/disable/index.ts","../../server/src/register.ts","../../server/src/content-types/locale/index.ts","../../server/src/content-types/index.ts","../../server/src/services/permissions/actions.ts","../../server/src/services/permissions/sections-builder.ts","../../server/src/services/permissions/engine.ts","../../server/src/services/permissions.ts","../../server/src/services/metrics.ts","../../server/src/services/localizations.ts","../../server/src/services/locales.ts","../../server/src/services/iso-locales.ts","../../server/src/services/entity-service-decorator.ts","../../server/src/services/content-types.ts","../../server/src/services/index.ts","../../server/src/routes/admin.ts","../../server/src/routes/content-api.ts","../../server/src/routes/index.ts","../../server/src/validation/locales.ts","../../server/src/domain/locale.ts","../../server/src/controllers/locales.ts","../../server/src/validation/content-types.ts","../../server/src/controllers/content-types.ts","../../server/src/controllers/iso-locales.ts","../../server/src/controllers/index.ts","../../server/src/index.ts"],"sourcesContent":["import type { LocaleService } from '../services/locales';\nimport type { PermissionsService } from '../services/permissions';\nimport type { ContentTypesService } from '../services/content-types';\nimport type { MetricsService } from '../services/metrics';\nimport type { EntityServiceDecoratorService } from '../services/entity-service-decorator';\nimport type { ISOLocalesService } from '../services/iso-locales';\nimport type { LocalizationsService } from '../services/localizations';\n\ntype S = {\n permissions: PermissionsService;\n metrics: MetricsService;\n locales: LocaleService;\n localizations: LocalizationsService;\n ['iso-locales']: ISOLocalesService;\n ['content-types']: ContentTypesService;\n ['entity-service-decorator']: EntityServiceDecoratorService;\n};\n\nconst getCoreStore = () => {\n return strapi.store({ type: 'plugin', name: 'i18n' });\n};\n\n// retrieve a local service\nconst getService = <T extends keyof S>(name: T): ReturnType<S[T]> => {\n return strapi.plugin('i18n').service(name);\n};\n\nexport { getService, getCoreStore };\n","import type { Schema, Core } from '@strapi/types';\nimport { getService } from './utils';\n\nconst registerModelsHooks = () => {\n strapi.db.lifecycles.subscribe({\n models: ['plugin::i18n.locale'],\n\n async afterCreate() {\n await getService('permissions').actions.syncSuperAdminPermissionsWithLocales();\n },\n\n async afterDelete() {\n await getService('permissions').actions.syncSuperAdminPermissionsWithLocales();\n },\n });\n\n strapi.documents.use(async (context, next) => {\n const schema: Schema.ContentType = context.contentType;\n\n if (!['create', 'update', 'discardDraft', 'publish'].includes(context.action)) {\n return next();\n }\n\n if (!getService('content-types').isLocalizedContentType(schema)) {\n return next();\n }\n\n // Build a populate array for all non localized fields within the schema\n const { getNestedPopulateOfNonLocalizedAttributes } = getService('content-types');\n\n const attributesToPopulate = getNestedPopulateOfNonLocalizedAttributes(schema.uid);\n\n // Get the result of the document service action\n const result = (await next()) as any;\n\n // We may not have received a result with everything populated that we need\n // Use the id and populate built from non localized fields to get the full\n // result\n let resultID;\n // TODO: fix bug where an empty array can be returned\n if (Array.isArray(result?.entries) && result.entries[0]?.id) {\n resultID = result.entries[0].id;\n } else if (result?.id) {\n resultID = result.id;\n } else {\n return result;\n }\n\n if (attributesToPopulate.length > 0) {\n const populatedResult = await strapi.db\n .query(schema.uid)\n .findOne({ where: { id: resultID }, populate: attributesToPopulate });\n\n await getService('localizations').syncNonLocalizedAttributes(populatedResult, schema);\n }\n\n return result;\n });\n};\n\nexport default async ({ strapi }: { strapi: Core.Strapi }) => {\n const { sendDidInitializeEvent } = getService('metrics');\n const { decorator } = getService('entity-service-decorator');\n const { initDefaultLocale } = getService('locales');\n const { sectionsBuilder, actions, engine } = getService('permissions');\n\n // TODO: v5 handled in the document service or via document service middlewares\n // Entity Service\n (strapi.entityService as any).decorate(decorator);\n\n // Data\n await initDefaultLocale();\n\n // Sections Builder\n sectionsBuilder.registerLocalesPropertyHandler();\n\n // Actions\n await actions.registerI18nActions();\n actions.registerI18nActionsHooks();\n actions.updateActionsProperties();\n\n // Engine/Permissions\n engine.registerI18nPermissionsHandlers();\n\n // Hooks & Models\n registerModelsHooks();\n\n sendDidInitializeEvent();\n};\n","import { get } from 'lodash/fp';\nimport { errors } from '@strapi/utils';\nimport type { Core, Struct } from '@strapi/types';\nimport { getService } from '../utils';\n\nconst { ApplicationError } = errors;\n\n// TODO: v5 if implemented in the CM => delete this middleware\nconst validateLocaleCreation: Core.MiddlewareHandler = async (ctx, next) => {\n const { model } = ctx.params;\n const { query } = ctx.request;\n\n // Prevent empty body\n if (!ctx.request.body) {\n ctx.request.body = {};\n }\n\n const body = ctx.request.body as any;\n\n const { getValidLocale, isLocalizedContentType } = getService('content-types');\n\n const modelDef = strapi.getModel(model) as Struct.ContentTypeSchema;\n\n if (!isLocalizedContentType(modelDef)) {\n return next();\n }\n\n // Prevent empty string locale\n const locale = get('locale', query) || get('locale', body) || undefined;\n\n // cleanup to avoid creating duplicates in single types\n ctx.request.query = {};\n\n let entityLocale;\n try {\n entityLocale = await getValidLocale(locale);\n } catch (e) {\n throw new ApplicationError(\"This locale doesn't exist\");\n }\n\n body.locale = entityLocale;\n\n if (modelDef.kind === 'singleType') {\n const entity = await strapi.entityService.findMany(modelDef.uid, {\n locale: entityLocale,\n } as any); // TODO: add this type to entityService\n\n ctx.request.query.locale = body.locale;\n\n // updating\n if (entity) {\n return next();\n }\n }\n\n return next();\n};\n\nexport default validateLocaleCreation;\n","import { propEq, identity } from 'lodash/fp';\nimport { errors } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\n\nconst { ValidationError } = errors;\n\nconst LOCALE_SCALAR_TYPENAME = 'I18NLocaleCode';\nconst LOCALE_ARG_PLUGIN_NAME = 'I18NLocaleArg';\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => ({\n register() {\n const { service: getGraphQLService } = strapi.plugin('graphql');\n const { service: getI18NService } = strapi.plugin('i18n');\n\n const { isLocalizedContentType } = getI18NService('content-types');\n\n const extensionService = getGraphQLService('extension');\n\n extensionService.shadowCRUD('plugin::i18n.locale').disableMutations();\n\n // Disable unwanted fields for localized content types\n Object.entries(strapi.contentTypes).forEach(([uid, ct]) => {\n if (isLocalizedContentType(ct)) {\n // Disable locale field in localized inputs\n extensionService.shadowCRUD(uid).field('locale').disableInput();\n\n // Disable localizations field in localized inputs\n extensionService.shadowCRUD(uid).field('localizations').disableInput();\n }\n });\n\n extensionService.use(({ nexus, typeRegistry }: any) => {\n const i18nLocaleArgPlugin = getI18nLocaleArgPlugin({ nexus, typeRegistry });\n const i18nLocaleScalar = getLocaleScalar({ nexus });\n return {\n plugins: [i18nLocaleArgPlugin],\n types: [i18nLocaleScalar],\n\n resolversConfig: {\n // Modify the default scope associated to find and findOne locale queries to match the actual action name\n 'Query.i18NLocale': { auth: { scope: 'plugin::i18n.locales.listLocales' } },\n 'Query.i18NLocales': { auth: { scope: 'plugin::i18n.locales.listLocales' } },\n },\n };\n });\n },\n});\n\nconst getLocaleScalar = ({ nexus }: any) => {\n const { service: getI18NService } = strapi.plugin('i18n');\n\n const locales = getI18NService('iso-locales').getIsoLocales();\n\n return nexus.scalarType({\n name: LOCALE_SCALAR_TYPENAME,\n\n description: 'A string used to identify an i18n locale',\n\n serialize: identity,\n parseValue: identity,\n\n parseLiteral(ast: any) {\n if (ast.kind !== 'StringValue') {\n throw new ValidationError('Locale cannot represent non string type');\n }\n\n const isValidLocale = ast.value === '*' || locales.find(propEq('code', ast.value));\n\n if (!isValidLocale) {\n throw new ValidationError('Unknown locale supplied');\n }\n\n return ast.value;\n },\n });\n};\n\nconst getI18nLocaleArgPlugin = ({ nexus, typeRegistry }: any) => {\n const { service: getI18NService } = strapi.plugin('i18n');\n\n const { isLocalizedContentType } = getI18NService('content-types');\n\n return nexus.plugin({\n name: LOCALE_ARG_PLUGIN_NAME,\n\n onAddOutputField(config: any) {\n // Add the locale arg to the queries on localized CTs\n\n const { parentType } = config;\n\n // Only target queries or mutations\n if (parentType !== 'Query' && parentType !== 'Mutation') {\n return;\n }\n\n let contentType;\n\n if (config?.extensions?.strapi?.contentType) {\n contentType = config.extensions.strapi.contentType;\n } else {\n const registryType = typeRegistry.get(config.type);\n\n if (!registryType) {\n return;\n }\n\n contentType = registryType.config.contentType;\n }\n\n // Ignore non-localized content types\n if (!isLocalizedContentType(contentType)) {\n return;\n }\n\n if (!config.args) {\n config.args = {};\n }\n\n config.args.locale = nexus.arg({\n type: LOCALE_SCALAR_TYPENAME,\n description: 'The locale to use for the query',\n });\n },\n });\n};\n","import isoLocales from './iso-locales.json';\n\n/**\n * Returns the default locale based either on env var or english\n * @returns {string}\n */\nconst getInitLocale = () => {\n const envLocaleCode = process.env.STRAPI_PLUGIN_I18N_INIT_LOCALE_CODE;\n\n if (envLocaleCode) {\n const matchingLocale = isoLocales.find(({ code }) => code === envLocaleCode);\n\n if (!matchingLocale) {\n throw new Error(\n 'Unknown locale code provided in the environment variable STRAPI_PLUGIN_I18N_INIT_LOCALE_CODE'\n );\n }\n\n return { ...matchingLocale };\n }\n\n return {\n code: 'en',\n name: 'English (en)',\n };\n};\n\nconst DEFAULT_LOCALE = getInitLocale();\n\nexport { isoLocales, DEFAULT_LOCALE, getInitLocale };\n","import { getService } from '../../../utils';\nimport { DEFAULT_LOCALE } from '../../../constants';\n\n// if i18N enabled set default locale\nexport default async ({ oldContentTypes, contentTypes }: any) => {\n const { isLocalizedContentType } = getService('content-types');\n const { getDefaultLocale } = getService('locales');\n\n if (!oldContentTypes) {\n return;\n }\n\n for (const uid in contentTypes) {\n if (!oldContentTypes[uid]) {\n continue;\n }\n\n const oldContentType = oldContentTypes[uid];\n const contentType = contentTypes[uid];\n\n if (!isLocalizedContentType(oldContentType) && isLocalizedContentType(contentType)) {\n const defaultLocale = (await getDefaultLocale()) || DEFAULT_LOCALE.code;\n\n await strapi.db.query(uid).updateMany({\n where: { locale: null },\n data: { locale: defaultLocale },\n });\n }\n }\n};\n","import { getService } from '../../../utils';\nimport { DEFAULT_LOCALE } from '../../../constants';\n\n// Disable i18n on CT -> Delete all entities that are not in the default locale\nexport default async ({ oldContentTypes, contentTypes }: any) => {\n const { isLocalizedContentType } = getService('content-types');\n const { getDefaultLocale } = getService('locales');\n\n if (!oldContentTypes) {\n return;\n }\n\n for (const uid in contentTypes) {\n if (!oldContentTypes[uid]) {\n continue;\n }\n\n const oldContentType = oldContentTypes[uid];\n const contentType = contentTypes[uid];\n\n // if i18N is disabled remove non default locales before sync\n if (isLocalizedContentType(oldContentType) && !isLocalizedContentType(contentType)) {\n const defaultLocale = (await getDefaultLocale()) || DEFAULT_LOCALE.code;\n\n await Promise.all([\n // Delete all entities that are not in the default locale\n strapi.db.query(uid).deleteMany({\n where: { locale: { $ne: defaultLocale } },\n }),\n // Set locale to null for the rest\n strapi.db.query(uid).updateMany({\n where: { locale: { $eq: defaultLocale } },\n data: { locale: null },\n }),\n ]);\n }\n }\n};\n","import _ from 'lodash';\nimport type { Core } from '@strapi/types';\n\nimport validateLocaleCreation from './controllers/validate-locale-creation';\nimport graphqlProvider from './graphql';\n\nimport enableContentType from './migrations/content-type/enable';\nimport disableContentType from './migrations/content-type/disable';\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n extendContentTypes(strapi);\n addContentManagerLocaleMiddleware(strapi);\n addContentTypeSyncHooks(strapi);\n};\n\n// TODO: v5 if implemented in the CM => delete this middleware\n/**\n * Adds middleware on CM creation routes to use i18n locale passed in a specific param\n * @param {Strapi} strapi\n */\nconst addContentManagerLocaleMiddleware = (strapi: Core.Strapi) => {\n strapi.server.router.use('/content-manager/collection-types/:model', (ctx, next) => {\n if (ctx.method === 'POST' || ctx.method === 'PUT') {\n return validateLocaleCreation(ctx, next);\n }\n\n return next();\n });\n\n strapi.server.router.use('/content-manager/single-types/:model', (ctx, next) => {\n if (ctx.method === 'POST' || ctx.method === 'PUT') {\n return validateLocaleCreation(ctx, next);\n }\n\n return next();\n });\n};\n\n/**\n * Adds hooks to migration content types locales on enable/disable of I18N\n * @param {Strapi} strapi\n */\nconst addContentTypeSyncHooks = (strapi: Core.Strapi) => {\n strapi.hook('strapi::content-types.beforeSync').register(disableContentType);\n strapi.hook('strapi::content-types.afterSync').register(enableContentType);\n};\n\n/**\n * Adds locale and localization fields to all content types\n * Even if content type is not localized, it will have these fields\n * @param {Strapi} strapi\n */\nconst extendContentTypes = (strapi: Core.Strapi) => {\n Object.values(strapi.contentTypes).forEach((contentType) => {\n const { attributes } = contentType;\n\n _.set(attributes, 'locale', {\n writable: true,\n private: false,\n configurable: false,\n visible: false,\n type: 'string',\n });\n });\n\n if (strapi.plugin('graphql')) {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n graphqlProvider({ strapi }).register();\n }\n};\n","import schema from './schema.json';\n\nexport default {\n schema,\n};\n","import locale from './locale';\n\nexport default {\n locale,\n};\n","import { isArray, getOr, prop } from 'lodash/fp';\nimport { getService } from '../../utils';\n\nconst actions = [\n {\n section: 'settings',\n category: 'Internationalization',\n subCategory: 'Locales',\n pluginName: 'i18n',\n displayName: 'Create',\n uid: 'locale.create',\n },\n {\n section: 'settings',\n category: 'Internationalization',\n subCategory: 'Locales',\n pluginName: 'i18n',\n displayName: 'Read',\n uid: 'locale.read',\n aliases: [\n { actionId: 'plugin::content-manager.explorer.read', subjects: ['plugin::i18n.locale'] },\n ],\n },\n {\n section: 'settings',\n category: 'Internationalization',\n subCategory: 'Locales',\n pluginName: 'i18n',\n displayName: 'Update',\n uid: 'locale.update',\n },\n {\n section: 'settings',\n category: 'Internationalization',\n subCategory: 'Locales',\n pluginName: 'i18n',\n displayName: 'Delete',\n uid: 'locale.delete',\n },\n];\n\nconst addLocalesPropertyIfNeeded = ({ value: action }: any) => {\n const {\n section,\n options: { applyToProperties },\n } = action;\n\n // Only add the locales property to contentTypes' actions\n if (section !== 'contentTypes') {\n return;\n }\n\n // If the 'locales' property is already declared within the applyToProperties array, then ignore the next steps\n if (isArray(applyToProperties) && applyToProperties.includes('locales')) {\n return;\n }\n\n // Add the 'locales' property to the applyToProperties array (create it if necessary)\n action.options.applyToProperties = isArray(applyToProperties)\n ? applyToProperties.concat('locales')\n : ['locales'];\n};\n\nconst shouldApplyLocalesPropertyToSubject = ({ property, subject }: any) => {\n if (property === 'locales') {\n const model = strapi.getModel(subject);\n\n return getService('content-types').isLocalizedContentType(model);\n }\n\n return true;\n};\n\nconst addAllLocalesToPermissions = async (permissions: any) => {\n const { actionProvider } = strapi.service('admin::permission');\n const { find: findAllLocales } = getService('locales');\n\n const allLocales = await findAllLocales();\n const allLocalesCode = allLocales.map(prop('code'));\n\n return Promise.all(\n permissions.map(async (permission: any) => {\n const { action, subject } = permission;\n\n const appliesToLocalesProperty = await actionProvider.appliesToProperty(\n 'locales',\n action,\n subject\n );\n\n if (!appliesToLocalesProperty) {\n return permission;\n }\n\n const oldPermissionProperties = getOr({}, 'properties', permission);\n\n return { ...permission, properties: { ...oldPermissionProperties, locales: allLocalesCode } };\n })\n );\n};\n\nconst syncSuperAdminPermissionsWithLocales = async () => {\n const roleService = strapi.service('admin::role');\n const permissionService = strapi.service('admin::permission');\n\n const superAdminRole = await roleService.getSuperAdmin();\n\n if (!superAdminRole) {\n return;\n }\n\n const superAdminPermissions = await permissionService.findMany({\n where: {\n role: {\n id: superAdminRole.id,\n },\n },\n });\n\n const newSuperAdminPermissions = await addAllLocalesToPermissions(superAdminPermissions);\n\n await roleService.assignPermissions(superAdminRole.id, newSuperAdminPermissions);\n};\n\nconst registerI18nActions = async () => {\n const { actionProvider } = strapi.service('admin::permission');\n\n await actionProvider.registerMany(actions);\n};\n\nconst registerI18nActionsHooks = () => {\n const { actionProvider } = strapi.service('admin::permission');\n const { hooks } = strapi.service('admin::role');\n\n actionProvider.hooks.appliesPropertyToSubject.register(shouldApplyLocalesPropertyToSubject);\n hooks.willResetSuperAdminPermissions.register(addAllLocalesToPermissions);\n};\n\nconst updateActionsProperties = () => {\n const { actionProvider } = strapi.service('admin::permission');\n\n // Register the transformation for every new action\n actionProvider.hooks.willRegister.register(addLocalesPropertyIfNeeded);\n\n // Handle already registered actions\n actionProvider.values().forEach((action: any) => addLocalesPropertyIfNeeded({ value: action }));\n};\n\nexport default {\n actions,\n registerI18nActions,\n registerI18nActionsHooks,\n updateActionsProperties,\n syncSuperAdminPermissionsWithLocales,\n};\n","import { isEmpty } from 'lodash/fp';\n\nimport { getService } from '../../utils';\n\n/**\n * Handler for the permissions layout (sections builder)\n * Adds the locales property to the subjects\n * @param {Action} action\n * @param {ContentTypesSection} section\n * @return {Promise<void>}\n */\nconst localesPropertyHandler = async ({ action, section }: any) => {\n const { actionProvider } = strapi.service('admin::permission');\n\n const locales = await getService('locales').find();\n\n // Do not add the locales property if there is none registered\n if (isEmpty(locales)) {\n return;\n }\n\n for (const subject of section.subjects) {\n const applies = await actionProvider.appliesToProperty('locales', action.actionId, subject.uid);\n const hasLocalesProperty = subject.properties.find(\n (property: any) => property.value === 'locales'\n );\n\n if (applies && !hasLocalesProperty) {\n subject.properties.push({\n label: 'Locales',\n value: 'locales',\n children: locales.map(({ name, code }: any) => ({ label: name || code, value: code })),\n });\n }\n }\n};\n\nconst registerLocalesPropertyHandler = () => {\n const { sectionsBuilder } = strapi.service('admin::permission');\n\n sectionsBuilder.addHandler('singleTypes', localesPropertyHandler);\n sectionsBuilder.addHandler('collectionTypes', localesPropertyHandler);\n};\n\nexport default {\n localesPropertyHandler,\n registerLocalesPropertyHandler,\n};\n","import { getService } from '../../utils';\n\n/**\n * @typedef {object} WillRegisterPermissionContext\n * @property {Permission} permission\n * @property {object} user\n * @property {object} condition\n */\n\n/**\n * Locales property handler for the permission engine\n * Add the has-locale-access condition if the locales property is defined\n * @param {WillRegisterPermissionContext} context\n */\nconst willRegisterPermission = (context: any) => {\n const { permission, condition, user } = context;\n const { subject, properties } = permission;\n\n const isSuperAdmin = strapi.service('admin::role').hasSuperAdminRole(user);\n\n if (isSuperAdmin) {\n return;\n }\n\n const { locales } = properties || {};\n const { isLocalizedContentType } = getService('content-types');\n\n // If there is no subject defined, ignore the permission\n if (!subject) {\n return;\n }\n\n const ct = strapi.contentTypes[subject];\n\n // If the subject exists but isn't localized, ignore the permission\n if (!isLocalizedContentType(ct)) {\n return;\n }\n\n // If the subject is localized but the locales property is null (access to all locales), ignore the permission\n if (locales === null) {\n return;\n }\n\n condition.and({\n locale: {\n $in: locales || [],\n },\n });\n};\n\nconst registerI18nPermissionsHandlers = () => {\n const { engine } = strapi.service('admin::permission');\n\n engine.hooks['before-register.permission'].register(willRegisterPermission);\n};\n\nexport default {\n willRegisterPermission,\n registerI18nPermissionsHandlers,\n};\n","import i18nActionsService from './permissions/actions';\nimport sectionsBuilderService from './permissions/sections-builder';\nimport engineService from './permissions/engine';\n\nconst permissions = () => ({\n actions: i18nActionsService,\n sectionsBuilder: sectionsBuilderService,\n engine: engineService,\n});\n\ntype PermissionsService = typeof permissions;\n\nexport default permissions;\nexport type { PermissionsService };\n","import { reduce } from 'lodash/fp';\nimport { getService } from '../utils';\n\nconst sendDidInitializeEvent = async () => {\n const { isLocalizedContentType } = getService('content-types');\n\n // TODO: V5: This event should be renamed numberOfContentTypes in V5 as the name is already taken to describe the number of content types using i18n.\n const numberOfContentTypes = reduce(\n (sum, contentType) => (isLocalizedContentType(contentType) ? sum + 1 : sum),\n 0\n )(strapi.contentTypes as any);\n\n await strapi.telemetry.send('didInitializeI18n', { groupProperties: { numberOfContentTypes } });\n};\n\nconst sendDidUpdateI18nLocalesEvent = async () => {\n const numberOfLocales = await getService('locales').count();\n\n await strapi.telemetry.send('didUpdateI18nLocales', {\n groupProperties: { numberOfLocales },\n });\n};\n\nconst metrics = () => ({\n sendDidInitializeEvent,\n sendDidUpdateI18nLocalesEvent,\n});\n\ntype MetricsService = typeof metrics;\n\nexport default metrics;\nexport type { MetricsService };\n","import { cloneDeep, isEmpty } from 'lodash/fp';\n\nimport { type Schema } from '@strapi/types';\nimport { async } from '@strapi/utils';\nimport { getService } from '../utils';\n\n/**\n * Update non localized fields of all the related localizations of an entry with the entry values\n */\nconst syncNonLocalizedAttributes = async (sourceEntry: any, model: Schema.ContentType) => {\n const { copyNonLocalizedAttributes } = getService('content-types');\n\n const nonLocalizedAttributes = copyNonLocalizedAttributes(model, sourceEntry);\n if (isEmpty(nonLocalizedAttributes)) {\n return;\n }\n\n const uid = model.uid;\n const documentId = sourceEntry.documentId;\n const locale = sourceEntry.locale;\n const status = sourceEntry?.publishedAt ? 'published' : 'draft';\n\n // Find all the entries that need to be updated\n // this is every other entry of the document in the same status but a different locale\n const localeEntriesToUpdate = await strapi.db.query(uid).findMany({\n where: {\n documentId,\n publishedAt: status === 'published' ? { $ne: null } : null,\n locale: { $ne: locale },\n },\n select: ['locale', 'id'],\n });\n\n const entryData = await strapi.documents(uid).omitComponentData(nonLocalizedAttributes);\n\n await async.map(localeEntriesToUpdate, async (entry: any) => {\n const transformedData = await strapi.documents.utils.transformData(\n cloneDeep(nonLocalizedAttributes),\n {\n uid,\n status,\n locale: entry.locale,\n allowMissingId: true,\n }\n );\n\n // Update or create non localized components for the entry\n const componentData = await strapi\n .documents(uid)\n .updateComponents(entry, transformedData as any);\n\n // Update every other locale entry of this documentId in the same status\n await strapi.db.query(uid).update({\n where: {\n documentId,\n publishedAt: status === 'published' ? { $ne: null } : null,\n locale: { $eq: entry.locale },\n },\n // The data we send to the update function is the entry data merged with\n // the updated component data\n data: Object.assign(cloneDeep(entryData), componentData),\n });\n });\n};\n\nconst localizations = () => ({\n syncNonLocalizedAttributes,\n});\n\ntype LocalizationsService = typeof localizations;\n\nexport default localizations;\nexport type { LocalizationsService };\n","import { isNil } from 'lodash/fp';\nimport { DEFAULT_LOCALE } from '../constants';\nimport { getService, getCoreStore } from '../utils';\n\nconst find = (params: any = {}) =>\n strapi.db.query('plugin::i18n.locale').findMany({ where: params });\n\nconst findById = (id: any) => strapi.db.query('plugin::i18n.locale').findOne({ where: { id } });\n\nconst findByCode = (code: any) =>\n strapi.db.query('plugin::i18n.locale').findOne({ where: { code } });\n\nconst count = (params: any = {}) => strapi.db.query('plugin::i18n.locale').count({ where: params });\n\nconst create = async (locale: any) => {\n const result = await strapi.db.query('plugin::i18n.locale').create({ data: locale });\n\n getService('metrics').sendDidUpdateI18nLocalesEvent();\n\n return result;\n};\n\nconst update = async (params: any, updates: any) => {\n const result = await strapi.db\n .query('plugin::i18n.locale')\n .update({ where: params, data: updates });\n\n getService('metrics').sendDidUpdateI18nLocalesEvent();\n\n return result;\n};\n\nconst deleteFn = async ({ id }: any) => {\n const localeToDelete = await findById(id);\n\n if (localeToDelete) {\n await deleteAllLocalizedEntriesFor({ locale: localeToDelete.code });\n const result = await strapi.db.query('plugin::i18n.locale').delete({ where: { id } });\n\n getService('metrics').sendDidUpdateI18nLocalesEvent();\n\n return result;\n }\n\n return localeToDelete;\n};\n\nconst setDefaultLocale = ({ code }: any) =>\n getCoreStore().set({ key: 'default_locale', value: code });\n\nconst getDefaultLocale = () => getCoreStore().get({ key: 'default_locale' });\n\nconst setIsDefault = async (locales: any) => {\n if (isNil(locales)) {\n return locales;\n }\n\n const actualDefault = await getDefaultLocale();\n\n if (Array.isArray(locales)) {\n return locales.map((locale) => ({ ...locale, isDefault: actualDefault === locale.code }));\n }\n // single locale\n return { ...locales, isDefault: actualDefault === locales.code };\n};\n\nconst initDefaultLocale = async () => {\n const existingLocalesNb = await strapi.db.query('plugin::i18n.locale').count();\n if (existingLocalesNb === 0) {\n await create(DEFAULT_LOCALE);\n await setDefaultLocale({ code: DEFAULT_LOCALE.code });\n }\n};\n\nconst deleteAllLocalizedEntriesFor = async ({ locale }: any) => {\n const { isLocalizedContentType } = getService('content-types');\n\n const localizedModels = Object.values(strapi.contentTypes).filter(isLocalizedContentType);\n\n for (const model of localizedModels) {\n // FIXME: delete many content & their associations\n await strapi.db.query(model.uid).deleteMany({ where: { locale } });\n }\n};\n\nconst locales = () => ({\n find,\n findById,\n findByCode,\n create,\n update,\n count,\n setDefaultLocale,\n getDefaultLocale,\n setIsDefault,\n delete: deleteFn,\n initDefaultLocale,\n});\n\ntype LocaleService = typeof locales;\n\nexport default locales;\nexport type { LocaleService };\n","import { isoLocales } from '../constants';\n\nconst getIsoLocales = () => isoLocales;\n\nconst isoLocalesService = () => ({\n getIsoLocales,\n});\n\ntype ISOLocalesService = typeof isoLocalesService;\n\nexport default isoLocalesService;\nexport type { ISOLocalesService };\n","import { has, get, omit, isArray } from 'lodash/fp';\nimport type { Schema } from '@strapi/types';\n\nimport { getService } from '../utils';\n\nconst LOCALE_QUERY_FILTER = 'locale';\nconst SINGLE_ENTRY_ACTIONS = ['findOne', 'update', 'delete'];\nconst BULK_ACTIONS = ['delete'];\n\nconst paramsContain = (key: any, params: any) => {\n return (\n has(key, params.filters) ||\n (isArray(params.filters) && params.filters.some((clause: any) => has(key, clause))) ||\n (isArray(get('$and', params.filters)) &&\n params.filters.$and.some((clause: any) => has(key, clause)))\n );\n};\n\n/**\n * Adds default locale or replaces locale by locale in query params\n * @param {object} params - query params\n * @param {object} ctx\n */\nconst wrapParams = async (params: any = {}, ctx: any = {}) => {\n const { action } = ctx;\n\n if (has(LOCALE_QUERY_FILTER, params)) {\n if (params[LOCALE_QUERY_FILTER] === 'all') {\n return omit(LOCALE_QUERY_FILTER, params);\n }\n\n return {\n ...omit(LOCALE_QUERY_FILTER, params),\n filters: {\n $and: [{ locale: params[LOCALE_QUERY_FILTER] }].concat(params.filters || []),\n },\n };\n }\n\n const entityDefinedById = paramsContain('id', params) && SINGLE_ENTRY_ACTIONS.includes(action);\n const entitiesDefinedByIds = paramsContain('id.$in', params) && BULK_ACTIONS.includes(action);\n\n if (entityDefinedById || entitiesDefinedByIds) {\n return params;\n }\n\n const { getDefaultLocale } = getService('locales');\n\n return {\n ...params,\n filters: {\n $and: [{ locale: await getDefaultLocale() }].concat(params.filters || []),\n },\n };\n};\n\n/**\n * Decorates the entity service with I18N business logic\n * @param {object} service - entity service\n */\nconst decorator = (service: any) => ({\n /**\n * Wraps result\n * @param {object} result - result object of query\n * @param {object} ctx - Query context\n * @param {object} ctx.model - Model that is being used\n */\n async wrapResult(result = {}, ctx = {}) {\n return service.wrapResult.call(this, result, ctx);\n },\n\n /**\n * Wraps query options. In particular will add default locale to query params\n * @param {object} params - Query options object (params, data, files, populate)\n * @param {object} ctx - Query context\n * @param {object} ctx.model - Model that is being used\n */\n async wrapParams(params: any = {}, ctx: any = {}) {\n const wrappedParams = await service.wrapParams.call(this, params, ctx);\n\n const model = strapi.getModel(ctx.uid);\n\n const { isLocalizedContentType } = getService('content-types');\n\n if (!isLocalizedContentType(model)) {\n return wrappedParams;\n }\n\n return wrapParams(wrappedParams, ctx);\n },\n\n /**\n * Find an entry or several if fetching all locales\n * @param {string} uid - Model uid\n * @param {object} opts - Query options object (params, data, files, populate)\n */\n async findMany(uid: any, opts: any) {\n const model = strapi.getModel(uid) as Schema.ContentType;\n\n const { isLocalizedContentType } = getService('content-types');\n\n if (!isLocalizedContentType(model)) {\n return service.findMany.call(this, uid, opts);\n }\n\n const { kind } = model;\n\n if (kind === 'singleType') {\n if (opts[LOCALE_QUERY_FILTER] === 'all') {\n // TODO Fix so this won't break lower lying find many wrappers\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findMany' });\n const query = strapi.get('query-params').transform(uid, wrappedParams);\n const entities = await strapi.db.query(uid).findMany(query);\n return this.wrapResult(entities, { uid, action: 'findMany' });\n }\n\n // This one gets transformed into a findOne on a lower layer\n return service.findMany.call(this, uid, opts);\n }\n\n return service.findMany.call(this, uid, opts);\n },\n});\n\nconst entityServiceDecorator = () => ({\n decorator,\n wrapParams,\n});\n\ntype EntityServiceDecoratorService = typeof entityServiceDecorator;\n\nexport default entityServiceDecorator;\nexport type { EntityServiceDecoratorService };\n","import _ from 'lodash';\nimport { pick, pipe, has, prop, isNil, cloneDeep, isArray } from 'lodash/fp';\nimport { errors, contentTypes as contentTypeUtils } from '@strapi/utils';\nimport { getService } from '../utils';\n\nconst {\n isRelationalAttribute,\n getVisibleAttributes,\n isTypedAttribute,\n getScalarAttributes,\n getRelationalAttributes,\n} = contentTypeUtils;\nconst { ApplicationError } = errors;\n\nconst hasLocalizedOption = (modelOrAttribute: any) => {\n return prop('pluginOptions.i18n.localized', modelOrAttribute) === true;\n};\n\nconst getValidLocale = async (locale: any) => {\n const localesService = getService('locales');\n\n if (isNil(locale)) {\n return localesService.getDefaultLocale();\n }\n\n const foundLocale = await localesService.findByCode(locale);\n if (!foundLocale) {\n throw new ApplicationError('Locale not found');\n }\n\n return locale;\n};\n\n/**\n * Returns whether an attribute is localized or not\n * @param {*} attribute\n * @returns\n */\nconst isLocalizedAttribute = (attribute: any) => {\n return (\n hasLocalizedOption(attribute) ||\n isRelationalAttribute(attribute) ||\n isTypedAttribute(attribute, 'uid')\n );\n};\n\n/**\n * Returns whether a model is localized or not\n * @param {*} model\n * @returns\n */\nconst isLocalizedContentType = (model: any) => {\n return hasLocalizedOption(model);\n};\n\n/**\n * Returns the list of attribute names that are not localized\n * @param {object} model\n * @returns {string[]}\n */\nconst getNonLocalizedAttributes = (model: any) => {\n return getVisibleAttributes(model).filter(\n (attrName) => !isLocalizedAttribute(model.attributes[attrName])\n );\n};\n\nconst removeId = (value: any) => {\n if (typeof value === 'object' && has('id', value)) {\n delete value.id;\n }\n};\n\nconst removeIds = (model: any) => (entry: any) => removeIdsMut(model, cloneDeep(entry));\n\nconst removeIdsMut = (model: any, entry: any) => {\n if (isNil(entry)) {\n return entry;\n }\n\n removeId(entry);\n\n _.forEach(model.attributes, (attr, attrName) => {\n const value = entry[attrName];\n if (attr.type === 'dynamiczone' && isArray(value)) {\n value.forEach((compo) => {\n if (has('__component', compo)) {\n const model = strapi.components[compo.__component];\n removeIdsMut(model, compo);\n }\n });\n } else if (attr.type === 'component') {\n const model = strapi.components[attr.component];\n if (isArray(value)) {\n value.forEach((compo) => removeIdsMut(model, compo));\n } else {\n removeIdsMut(model, value);\n }\n }\n });\n\n return entry;\n};\n\n/**\n * Returns a copy of an entry picking only its non localized attributes\n * @param {object} model\n * @param {object} entry\n * @returns {object}\n */\nconst copyNonLocalizedAttributes = (model: any, entry: any) => {\n const nonLocalizedAttributes = getNonLocalizedAttributes(model);\n\n return pipe(pick(nonLocalizedAttributes), removeIds(model))(entry);\n};\n\n/**\n * Returns the list of attribute names that are localized\n * @param {object} model\n * @returns {string[]}\n */\nconst getLocalizedAttributes = (model: any) => {\n return getVisibleAttributes(model).filter((attrName) =>\n isLocalizedAttribute(model.attributes[attrName])\n );\n};\n\n/**\n * Fill non localized fields of an entry if there are nil\n * @param {Object} entry entry to fill\n * @param {Object} relatedEntry values used to fill\n * @param {Object} options\n * @param {Object} options.model corresponding model\n */\nconst fillNonLocalizedAttributes = (entry: any, relatedEntry: any, { model }: any) => {\n if (isNil(relatedEntry)) {\n return;\n }\n\n const modelDef = strapi.getModel(model);\n const relatedEntryCopy = copyNonLocalizedAttributes(modelDef, relatedEntry);\n\n _.forEach(relatedEntryCopy, (value, field) => {\n if (isNil(entry[field])) {\n entry[field] = value;\n }\n });\n};\n\n/**\n * build the populate param to\n * @param {String} modelUID uid of the model, could be of a content-type or a component\n */\nconst getNestedPopulateOfNonLocalizedAttributes = (modelUID: any) => {\n const schema = strapi.getModel(modelUID);\n const scalarAttributes = getScalarAttributes(schema);\n const nonLocalizedAttributes = getNonLocalizedAttributes(schema);\n\n const allAttributes = [...scalarAttributes, ...nonLocalizedAttributes];\n if (schema.modelType === 'component') {\n // When called recursively on a non localized component we\n // need to explicitly populate that components relations\n allAttributes.push(...getRelationalAttributes(schema));\n }\n\n const currentAttributesToPopulate = allAttributes.filter((value, index, self) => {\n return self.indexOf(value) === index && self.lastIndexOf(value) === index;\n });\n\n const attributesToPopulate = [...currentAttributesToPopulate];\n for (const attrName of currentAttributesToPopulate) {\n const attr = schema.attributes[attrName];\n if (attr.type === 'component') {\n const nestedPopulate = getNestedPopulateOfNonLocalizedAttributes(attr.component).map(\n (nestedAttr) => `${attrName}.${nestedAttr}`\n );\n attributesToPopulate.push(...nestedPopulate);\n } else if (attr.type === 'dynamiczone') {\n attr.components.forEach((componentName) => {\n const nestedPopulate = getNestedPopulateOfNonLocalizedAttributes(componentName).map(\n (nestedAttr) => `${attrName}.${nestedAttr}`\n );\n attributesToPopulate.push(...nestedPopulate);\n });\n }\n }\n\n return attributesToPopulate;\n};\n\nconst contentTypes = () => ({\n isLocalizedContentType,\n getValidLocale,\n getLocalizedAttributes,\n getNonLocalizedAttributes,\n copyNonLocalizedAttributes,\n fillNonLocalizedAttributes,\n getNestedPopulateOfNonLocalizedAttributes,\n});\n\ntype ContentTypesService = typeof contentTypes;\n\nexport default contentTypes;\nexport { ContentTypesService };\n","import permissions from './permissions';\nimport metrics from './metrics';\nimport localizations from './localizations';\nimport locales from './locales';\nimport isoLocales from './iso-locales';\nimport entityServiceDecorator from './entity-service-decorator';\nimport contentTypes from './content-types';\n\nexport default {\n permissions,\n metrics,\n localizations,\n locales,\n 'iso-locales': isoLocales,\n 'entity-service-decorator': entityServiceDecorator,\n 'content-types': contentTypes,\n};\n","export default {\n type: 'admin',\n routes: [\n {\n method: 'GET',\n path: '/iso-locales',\n handler: 'iso-locales.listIsoLocales',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.read'] },\n },\n ],\n },\n },\n {\n method: 'GET',\n path: '/locales',\n handler: 'locales.listLocales',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'POST',\n path: '/locales',\n handler: 'locales.createLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.create'] },\n },\n ],\n },\n },\n {\n method: 'PUT',\n path: '/locales/:id',\n handler: 'locales.updateLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.update'] },\n },\n ],\n },\n },\n {\n method: 'DELETE',\n path: '/locales/:id',\n handler: 'locales.deleteLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.delete'] },\n },\n ],\n },\n },\n {\n method: 'POST',\n path: '/content-manager/actions/get-non-localized-fields',\n handler: 'content-types.getNonLocalizedAttributes',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n ],\n};\n","export default {\n type: 'content-api',\n routes: [\n {\n method: 'GET',\n path: '/locales',\n handler: 'locales.listLocales',\n },\n ],\n};\n","import admin from './admin';\nimport contentApi from './content-api';\n\nexport default {\n admin,\n 'content-api': contentApi,\n};\n","import { prop } from 'lodash/fp';\nimport { yup, validateYupSchema } from '@strapi/utils';\n\nimport { isoLocales } from '../constants';\n\nconst allowedLocaleCodes = isoLocales.map(prop('code'));\n\nconst createLocaleSchema = yup\n .object()\n .shape({\n name: yup.string().max(50).nullable(),\n code: yup.string().oneOf(allowedLocaleCodes).required(),\n isDefault: yup.boolean().required(),\n })\n .noUnknown();\n\nconst updateLocaleSchema = yup\n .object()\n .shape({\n name: yup.string().min(1).max(50).nullable(),\n isDefault: yup.boolean(),\n })\n .noUnknown();\n\nconst validateCreateLocaleInput = validateYupSchema(createLocaleSchema);\nconst validateUpdateLocaleInput = validateYupSchema(updateLocaleSchema);\n\nexport { validateCreateLocaleInput, validateUpdateLocaleInput };\n","const formatLocale = (locale: { name: string; code: string; isDefault: boolean }) => {\n return {\n ...locale,\n name: locale.name || null,\n };\n};\n\nexport { formatLocale };\n","import * as utils from '@strapi/utils';\nimport { pick } from 'lodash/fp';\nimport type { Core } from '@strapi/types';\nimport { getService } from '../utils';\nimport { validateCreateLocaleInput, validateUpdateLocaleInput } from '../validation/locales';\nimport { formatLocale } from '../domain/locale';\n\nconst { setCreatorFields } = utils;\nconst { ApplicationError } = utils.errors;\n\nconst sanitizeLocale = (locale: any) => {\n const model = strapi.getModel('plugin::i18n.locale');\n\n return strapi.contentAPI.sanitize.output(locale, model);\n};\n\nconst controller: Core.Controller = {\n async listLocales(ctx) {\n const localesService = getService('locales');\n\n const locales = await localesService.find();\n const sanitizedLocales = await sanitizeLocale(locales);\n\n ctx.body = await localesService.setIsDefault(sanitizedLocales);\n },\n\n async createLocale(ctx) {\n const { user } = ctx.state;\n const body = ctx.request.body as any;\n const { isDefault, ...localeToCreate } = body;\n\n await validateCreateLocaleInput(body);\n\n const localesService = getService('locales');\n\n const existingLocale = await localesService.findByCode(body.code);\n if (existingLocale) {\n throw new ApplicationError('This locale already exists');\n }\n\n const localeToPersist = setCreatorFields({ user })(formatLocale(localeToCreate));\n\n const locale = await localesService.create(localeToPersist);\n\n if (isDefault) {\n await localesService.setDefaultLocale(locale);\n }\n\n const sanitizedLocale = await sanitizeLocale(locale);\n\n ctx.body = await localesService.setIsDefault(sanitizedLocale);\n },\n\n async updateLocale(ctx) {\n const { user } = ctx.state;\n const { id } = ctx.params;\n const body = ctx.request.body as any;\n const { isDefault, ...updates } = body;\n\n await validateUpdateLocaleInput(body);\n\n const localesService = getService('locales');\n\n const existingLocale = await localesService.findById(id);\n if (!existingLocale) {\n return ctx.notFound('locale.notFound');\n }\n\n const allowedParams = ['name'];\n const cleanUpdates = setCreatorFields({ user, isEdition: true })(pick(allowedParams, updates));\n\n const updatedLocale = await localesService.update({ id }, cleanUpdates);\n\n if (isDefault) {\n await localesService.setDefaultLocale(updatedLocale);\n }\n\n const sanitizedLocale = await sanitizeLocale(updatedLocale);\n\n ctx.body = await localesService.setIsDefault(sanitizedLocale);\n },\n\n async deleteLocale(ctx) {\n const { id } = ctx.params;\n\n const localesService = getService('locales');\n\n const existingLocale = await localesService.findById(id);\n if (!existingLocale) {\n return ctx.notFound('locale.notFound');\n }\n\n const defaultLocaleCode = await localesService.getDefaultLocale();\n if (existingLocale.code === defaultLocaleCode) {\n throw new ApplicationError('Cannot delete the default locale');\n }\n\n await localesService.delete({ id });\n\n const sanitizedLocale = await sanitizeLocale(existingLocale);\n\n ctx.body = await localesService.setIsDefault(sanitizedLocale);\n },\n};\n\nexport default controller;\n","import { yup, validateYupSchema } from '@strapi/utils';\n\nimport { get } from 'lodash/fp';\n\nconst validateGetNonLocalizedAttributesSchema = yup\n .object()\n .shape({\n model: yup.string().required(),\n id: yup.mixed().when('model', {\n is: (model: any) => get('kind', strapi.contentType(model)) === 'singleType',\n then: yup.strapiID().nullable(),\n otherwise: yup.strapiID().required(),\n }),\n locale: yup.string().required(),\n })\n .noUnknown()\n .required();\n\nconst validateGetNonLocalizedAttributesInput = validateYupSchema(\n validateGetNonLocalizedAttributesSchema\n);\n\nexport { validateGetNonLocalizedAttributesInput };\n","import { pick, uniq, prop, getOr, flatten, pipe, map } from 'lodash/fp';\nimport { contentTypes as contentTypesUtils, errors } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\nimport { getService } from '../utils';\nimport { validateGetNonLocalizedAttributesInput } from '../validation/content-types';\n\nconst { ApplicationError } = errors;\n\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypesUtils.constants;\n\nconst getLocalesProperty = getOr<string[]>([], 'properties.locales');\nconst getFieldsProperty = prop('properties.fields');\n\nconst getFirstLevelPath = map((path: string) => path.split('.')[0]);\n\nconst controller = {\n async getNonLocalizedAttributes(ctx) {\n const { user } = ctx.state;\n const body = ctx.request.body as any;\n const { model, id, locale } = body;\n\n await validateGetNonLocalizedAttributesInput({ model, id, locale });\n\n const {\n copyNonLocalizedAttributes,\n isLocalizedContentType,\n getNestedPopulateOfNonLocalizedAttributes,\n } = getService('content-types');\n\n const {\n default: { READ_ACTION, CREATE_ACTION },\n } = strapi.service('admin::constants');\n\n const modelDef = strapi.contentType(model);\n const attributesToPopulate = getNestedPopulateOfNonLocalizedAttributes(model);\n\n if (!isLocalizedContentType(modelDef)) {\n throw new ApplicationError(`Model ${model} is not localized`);\n }\n\n const params = modelDef.kind === 'singleType' ? {} : { id };\n\n const entity = await strapi.db\n .query(model)\n .findOne({ where: params, populate: attributesToPopulate });\n\n if (!entity) {\n return ctx.notFound();\n }\n\n const permissions = await strapi.admin.services.permission.findMany({\n where: {\n action: [READ_ACTION, CREATE_ACTION],\n subject: model,\n role: {\n id: user.roles.map(prop('id')),\n },\n },\n });\n\n const localePermissions = permissions\n .filter((perm: any) => getLocalesProperty(perm).includes(locale))\n .map(getFieldsProperty);\n\n const permittedFields = pipe(flatten, getFirstLevelPath, uniq)(localePermissions);\n\n const nonLocalizedFields = copyNonLocalizedAttributes(modelDef, entity);\n const sanitizedNonLocalizedFields = pick(permittedFields, nonLocalizedFields);\n\n const availableLocalesResult = await strapi.plugins['content-manager']\n .service('document-metadata')\n .getMetadata(model, entity, {\n availableLocales: true,\n });\n\n const availableLocales = availableLocalesResult.availableLocales.map((localeResult: any) =>\n pick(['id', 'locale', PUBLISHED_AT_ATTRIBUTE], localeResult)\n );\n\n ctx.body = {\n nonLocalizedFields: sanitizedNonLocalizedFields,\n localizations: availableLocales.concat(\n pick(['id', 'locale', PUBLISHED_AT_ATTRIBUTE], entity)\n ),\n };\n },\n} satisfies Core.Controller;\n\nexport default controller;\n","import type { Core } from '@strapi/types';\nimport { getService } from '../utils';\n\nconst controller: Core.Controller = {\n listIsoLocales(ctx) {\n const isoLocalesService = getService('iso-locales');\n\n ctx.body = isoLocalesService.getIsoLocales();\n },\n};\n\nexport default controller;\n","import locales from './locales';\nimport contentTypes from './content-types';\nimport isoLocales from './iso-locales';\n\nexport default {\n locales,\n 'iso-locales': isoLocales,\n 'content-types': contentTypes,\n};\n","import bootstrap from './bootstrap';\nimport register from './register';\nimport contentTypes from './content-types';\nimport services from './services';\nimport routes from './routes';\nimport controllers from './controllers';\n\nexport default () => ({\n register,\n bootstrap,\n routes,\n controllers,\n contentTypes,\n services,\n});\n"],"names":["schema","getNestedPopulateOfNonLocalizedAttributes","strapi","sendDidInitializeEvent","decorator","initDefaultLocale","actions","ApplicationError","errors","getValidLocale","isLocalizedContentType","locale","get","locales","identity","propEq","contentTypes","getDefaultLocale","attributes","_","isArray","permissions","prop","getOr","isEmpty","reduce","copyNonLocalizedAttributes","async","cloneDeep","isNil","has","omit","contentTypeUtils","model","pipe","pick","index","isoLocales","yup","validateYupSchema","utils","controller","contentTypesUtils","map","flatten","uniq","isoLocalesService"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
1
+ {"version":3,"file":"index.js","sources":["../../server/src/utils/index.ts","../../server/src/bootstrap.ts","../../server/src/controllers/validate-locale-creation.ts","../../server/src/graphql.ts","../../server/src/constants/index.ts","../../server/src/migrations/content-type/enable/index.ts","../../server/src/migrations/content-type/disable/index.ts","../../server/src/register.ts","../../server/src/content-types/locale/index.ts","../../server/src/content-types/index.ts","../../server/src/services/permissions/actions.ts","../../server/src/services/permissions/sections-builder.ts","../../server/src/services/permissions/engine.ts","../../server/src/services/permissions.ts","../../server/src/services/metrics.ts","../../server/src/services/localizations.ts","../../server/src/services/locales.ts","../../server/src/services/iso-locales.ts","../../server/src/services/content-types.ts","../../server/src/services/index.ts","../../server/src/routes/admin.ts","../../server/src/routes/content-api.ts","../../server/src/routes/index.ts","../../server/src/validation/locales.ts","../../server/src/domain/locale.ts","../../server/src/controllers/locales.ts","../../server/src/validation/content-types.ts","../../server/src/controllers/content-types.ts","../../server/src/controllers/iso-locales.ts","../../server/src/controllers/index.ts","../../server/src/index.ts"],"sourcesContent":["import type { LocaleService } from '../services/locales';\nimport type { PermissionsService } from '../services/permissions';\nimport type { ContentTypesService } from '../services/content-types';\nimport type { MetricsService } from '../services/metrics';\nimport type { ISOLocalesService } from '../services/iso-locales';\nimport type { LocalizationsService } from '../services/localizations';\n\ntype S = {\n permissions: PermissionsService;\n metrics: MetricsService;\n locales: LocaleService;\n localizations: LocalizationsService;\n ['iso-locales']: ISOLocalesService;\n ['content-types']: ContentTypesService;\n};\n\nconst getCoreStore = () => {\n return strapi.store({ type: 'plugin', name: 'i18n' });\n};\n\n// retrieve a local service\nconst getService = <T extends keyof S>(name: T): ReturnType<S[T]> => {\n return strapi.plugin('i18n').service(name);\n};\n\nexport { getService, getCoreStore };\n","import type { Schema } from '@strapi/types';\nimport { getService } from './utils';\n\nconst registerModelsHooks = () => {\n strapi.db.lifecycles.subscribe({\n models: ['plugin::i18n.locale'],\n\n async afterCreate() {\n await getService('permissions').actions.syncSuperAdminPermissionsWithLocales();\n },\n\n async afterDelete() {\n await getService('permissions').actions.syncSuperAdminPermissionsWithLocales();\n },\n });\n\n strapi.documents.use(async (context, next) => {\n const schema: Schema.ContentType = context.contentType;\n\n if (!['create', 'update', 'discardDraft', 'publish'].includes(context.action)) {\n return next();\n }\n\n if (!getService('content-types').isLocalizedContentType(schema)) {\n return next();\n }\n\n // Build a populate array for all non localized fields within the schema\n const { getNestedPopulateOfNonLocalizedAttributes } = getService('content-types');\n\n const attributesToPopulate = getNestedPopulateOfNonLocalizedAttributes(schema.uid);\n\n // Get the result of the document service action\n const result = (await next()) as any;\n\n // We may not have received a result with everything populated that we need\n // Use the id and populate built from non localized fields to get the full\n // result\n let resultID;\n // TODO: fix bug where an empty array can be returned\n if (Array.isArray(result?.entries) && result.entries[0]?.id) {\n resultID = result.entries[0].id;\n } else if (result?.id) {\n resultID = result.id;\n } else {\n return result;\n }\n\n if (attributesToPopulate.length > 0) {\n const populatedResult = await strapi.db\n .query(schema.uid)\n .findOne({ where: { id: resultID }, populate: attributesToPopulate });\n\n await getService('localizations').syncNonLocalizedAttributes(populatedResult, schema);\n }\n\n return result;\n });\n};\n\nexport default async () => {\n const { sendDidInitializeEvent } = getService('metrics');\n const { initDefaultLocale } = getService('locales');\n const { sectionsBuilder, actions, engine } = getService('permissions');\n\n // Data\n await initDefaultLocale();\n\n // Sections Builder\n sectionsBuilder.registerLocalesPropertyHandler();\n\n // Actions\n await actions.registerI18nActions();\n actions.registerI18nActionsHooks();\n actions.updateActionsProperties();\n\n // Engine/Permissions\n engine.registerI18nPermissionsHandlers();\n\n // Hooks & Models\n registerModelsHooks();\n\n sendDidInitializeEvent();\n};\n","import { get } from 'lodash/fp';\nimport { errors } from '@strapi/utils';\nimport type { Core, Struct } from '@strapi/types';\nimport { getService } from '../utils';\n\nconst { ApplicationError } = errors;\n\n// TODO: v5 if implemented in the CM => delete this middleware\nconst validateLocaleCreation: Core.MiddlewareHandler = async (ctx, next) => {\n const { model } = ctx.params;\n const { query } = ctx.request;\n\n // Prevent empty body\n if (!ctx.request.body) {\n ctx.request.body = {};\n }\n\n const body = ctx.request.body as any;\n\n const { getValidLocale, isLocalizedContentType } = getService('content-types');\n\n const modelDef = strapi.getModel(model) as Struct.ContentTypeSchema;\n\n if (!isLocalizedContentType(modelDef)) {\n return next();\n }\n\n // Prevent empty string locale\n const locale = get('locale', query) || get('locale', body) || undefined;\n\n // cleanup to avoid creating duplicates in single types\n ctx.request.query = {};\n\n let entityLocale;\n try {\n entityLocale = await getValidLocale(locale);\n } catch (e) {\n throw new ApplicationError(\"This locale doesn't exist\");\n }\n\n body.locale = entityLocale;\n\n if (modelDef.kind === 'singleType') {\n const entity = await strapi.entityService.findMany(modelDef.uid, {\n locale: entityLocale,\n } as any); // TODO: add this type to entityService\n\n ctx.request.query.locale = body.locale;\n\n // updating\n if (entity) {\n return next();\n }\n }\n\n return next();\n};\n\nexport default validateLocaleCreation;\n","import { propEq, identity } from 'lodash/fp';\nimport { errors } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\n\nconst { ValidationError } = errors;\n\nconst LOCALE_SCALAR_TYPENAME = 'I18NLocaleCode';\nconst LOCALE_ARG_PLUGIN_NAME = 'I18NLocaleArg';\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => ({\n register() {\n const { service: getGraphQLService } = strapi.plugin('graphql');\n const { service: getI18NService } = strapi.plugin('i18n');\n\n const { isLocalizedContentType } = getI18NService('content-types');\n\n const extensionService = getGraphQLService('extension');\n\n extensionService.shadowCRUD('plugin::i18n.locale').disableMutations();\n\n // Disable unwanted fields for localized content types\n Object.entries(strapi.contentTypes).forEach(([uid, ct]) => {\n if (isLocalizedContentType(ct)) {\n // Disable locale field in localized inputs\n extensionService.shadowCRUD(uid).field('locale').disableInput();\n\n // Disable localizations field in localized inputs\n extensionService.shadowCRUD(uid).field('localizations').disableInput();\n }\n });\n\n extensionService.use(({ nexus, typeRegistry }: any) => {\n const i18nLocaleArgPlugin = getI18nLocaleArgPlugin({ nexus, typeRegistry });\n const i18nLocaleScalar = getLocaleScalar({ nexus });\n return {\n plugins: [i18nLocaleArgPlugin],\n types: [i18nLocaleScalar],\n\n resolversConfig: {\n // Modify the default scope associated to find and findOne locale queries to match the actual action name\n 'Query.i18NLocale': { auth: { scope: 'plugin::i18n.locales.listLocales' } },\n 'Query.i18NLocales': { auth: { scope: 'plugin::i18n.locales.listLocales' } },\n },\n };\n });\n },\n});\n\nconst getLocaleScalar = ({ nexus }: any) => {\n const { service: getI18NService } = strapi.plugin('i18n');\n\n const locales = getI18NService('iso-locales').getIsoLocales();\n\n return nexus.scalarType({\n name: LOCALE_SCALAR_TYPENAME,\n\n description: 'A string used to identify an i18n locale',\n\n serialize: identity,\n parseValue: identity,\n\n parseLiteral(ast: any) {\n if (ast.kind !== 'StringValue') {\n throw new ValidationError('Locale cannot represent non string type');\n }\n\n const isValidLocale = ast.value === '*' || locales.find(propEq('code', ast.value));\n\n if (!isValidLocale) {\n throw new ValidationError('Unknown locale supplied');\n }\n\n return ast.value;\n },\n });\n};\n\nconst getI18nLocaleArgPlugin = ({ nexus, typeRegistry }: any) => {\n const { service: getI18NService } = strapi.plugin('i18n');\n\n const { isLocalizedContentType } = getI18NService('content-types');\n\n return nexus.plugin({\n name: LOCALE_ARG_PLUGIN_NAME,\n\n onAddOutputField(config: any) {\n // Add the locale arg to the queries on localized CTs\n\n const { parentType } = config;\n\n // Only target queries or mutations\n if (parentType !== 'Query' && parentType !== 'Mutation') {\n return;\n }\n\n let contentType;\n\n if (config?.extensions?.strapi?.contentType) {\n contentType = config.extensions.strapi.contentType;\n } else {\n const registryType = typeRegistry.get(config.type);\n\n if (!registryType) {\n return;\n }\n\n contentType = registryType.config.contentType;\n }\n\n // Ignore non-localized content types\n if (!isLocalizedContentType(contentType)) {\n return;\n }\n\n if (!config.args) {\n config.args = {};\n }\n\n config.args.locale = nexus.arg({\n type: LOCALE_SCALAR_TYPENAME,\n description: 'The locale to use for the query',\n });\n },\n });\n};\n","import isoLocales from './iso-locales.json';\n\n/**\n * Returns the default locale based either on env var or english\n * @returns {string}\n */\nconst getInitLocale = () => {\n const envLocaleCode = process.env.STRAPI_PLUGIN_I18N_INIT_LOCALE_CODE;\n\n if (envLocaleCode) {\n const matchingLocale = isoLocales.find(({ code }) => code === envLocaleCode);\n\n if (!matchingLocale) {\n throw new Error(\n 'Unknown locale code provided in the environment variable STRAPI_PLUGIN_I18N_INIT_LOCALE_CODE'\n );\n }\n\n return { ...matchingLocale };\n }\n\n return {\n code: 'en',\n name: 'English (en)',\n };\n};\n\nconst DEFAULT_LOCALE = getInitLocale();\n\nexport { isoLocales, DEFAULT_LOCALE, getInitLocale };\n","import { getService } from '../../../utils';\nimport { DEFAULT_LOCALE } from '../../../constants';\n\n// if i18N enabled set default locale\nexport default async ({ oldContentTypes, contentTypes }: any) => {\n const { isLocalizedContentType } = getService('content-types');\n const { getDefaultLocale } = getService('locales');\n\n if (!oldContentTypes) {\n return;\n }\n\n for (const uid in contentTypes) {\n if (!oldContentTypes[uid]) {\n continue;\n }\n\n const oldContentType = oldContentTypes[uid];\n const contentType = contentTypes[uid];\n\n if (!isLocalizedContentType(oldContentType) && isLocalizedContentType(contentType)) {\n const defaultLocale = (await getDefaultLocale()) || DEFAULT_LOCALE.code;\n\n await strapi.db.query(uid).updateMany({\n where: { locale: null },\n data: { locale: defaultLocale },\n });\n }\n }\n};\n","import { getService } from '../../../utils';\nimport { DEFAULT_LOCALE } from '../../../constants';\n\n// Disable i18n on CT -> Delete all entities that are not in the default locale\nexport default async ({ oldContentTypes, contentTypes }: any) => {\n const { isLocalizedContentType } = getService('content-types');\n const { getDefaultLocale } = getService('locales');\n\n if (!oldContentTypes) {\n return;\n }\n\n for (const uid in contentTypes) {\n if (!oldContentTypes[uid]) {\n continue;\n }\n\n const oldContentType = oldContentTypes[uid];\n const contentType = contentTypes[uid];\n\n // if i18N is disabled remove non default locales before sync\n if (isLocalizedContentType(oldContentType) && !isLocalizedContentType(contentType)) {\n const defaultLocale = (await getDefaultLocale()) || DEFAULT_LOCALE.code;\n\n await Promise.all([\n // Delete all entities that are not in the default locale\n strapi.db.query(uid).deleteMany({\n where: { locale: { $ne: defaultLocale } },\n }),\n // Set locale to null for the rest\n strapi.db.query(uid).updateMany({\n where: { locale: { $eq: defaultLocale } },\n data: { locale: null },\n }),\n ]);\n }\n }\n};\n","import _ from 'lodash';\nimport type { Core } from '@strapi/types';\n\nimport validateLocaleCreation from './controllers/validate-locale-creation';\nimport graphqlProvider from './graphql';\n\nimport enableContentType from './migrations/content-type/enable';\nimport disableContentType from './migrations/content-type/disable';\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n extendContentTypes(strapi);\n addContentManagerLocaleMiddleware(strapi);\n addContentTypeSyncHooks(strapi);\n};\n\n// TODO: v5 if implemented in the CM => delete this middleware\n/**\n * Adds middleware on CM creation routes to use i18n locale passed in a specific param\n * @param {Strapi} strapi\n */\nconst addContentManagerLocaleMiddleware = (strapi: Core.Strapi) => {\n strapi.server.router.use('/content-manager/collection-types/:model', (ctx, next) => {\n if (ctx.method === 'POST' || ctx.method === 'PUT') {\n return validateLocaleCreation(ctx, next);\n }\n\n return next();\n });\n\n strapi.server.router.use('/content-manager/single-types/:model', (ctx, next) => {\n if (ctx.method === 'POST' || ctx.method === 'PUT') {\n return validateLocaleCreation(ctx, next);\n }\n\n return next();\n });\n};\n\n/**\n * Adds hooks to migration content types locales on enable/disable of I18N\n * @param {Strapi} strapi\n */\nconst addContentTypeSyncHooks = (strapi: Core.Strapi) => {\n strapi.hook('strapi::content-types.beforeSync').register(disableContentType);\n strapi.hook('strapi::content-types.afterSync').register(enableContentType);\n};\n\n/**\n * Adds locale and localization fields to all content types\n * Even if content type is not localized, it will have these fields\n * @param {Strapi} strapi\n */\nconst extendContentTypes = (strapi: Core.Strapi) => {\n Object.values(strapi.contentTypes).forEach((contentType) => {\n const { attributes } = contentType;\n\n _.set(attributes, 'locale', {\n writable: true,\n private: false,\n configurable: false,\n visible: false,\n type: 'string',\n });\n });\n\n if (strapi.plugin('graphql')) {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n graphqlProvider({ strapi }).register();\n }\n};\n","import schema from './schema.json';\n\nexport default {\n schema,\n};\n","import locale from './locale';\n\nexport default {\n locale,\n};\n","import { isArray, getOr, prop } from 'lodash/fp';\nimport { getService } from '../../utils';\n\nconst actions = [\n {\n section: 'settings',\n category: 'Internationalization',\n subCategory: 'Locales',\n pluginName: 'i18n',\n displayName: 'Create',\n uid: 'locale.create',\n },\n {\n section: 'settings',\n category: 'Internationalization',\n subCategory: 'Locales',\n pluginName: 'i18n',\n displayName: 'Read',\n uid: 'locale.read',\n aliases: [\n { actionId: 'plugin::content-manager.explorer.read', subjects: ['plugin::i18n.locale'] },\n ],\n },\n {\n section: 'settings',\n category: 'Internationalization',\n subCategory: 'Locales',\n pluginName: 'i18n',\n displayName: 'Update',\n uid: 'locale.update',\n },\n {\n section: 'settings',\n category: 'Internationalization',\n subCategory: 'Locales',\n pluginName: 'i18n',\n displayName: 'Delete',\n uid: 'locale.delete',\n },\n];\n\nconst addLocalesPropertyIfNeeded = ({ value: action }: any) => {\n const {\n section,\n options: { applyToProperties },\n } = action;\n\n // Only add the locales property to contentTypes' actions\n if (section !== 'contentTypes') {\n return;\n }\n\n // If the 'locales' property is already declared within the applyToProperties array, then ignore the next steps\n if (isArray(applyToProperties) && applyToProperties.includes('locales')) {\n return;\n }\n\n // Add the 'locales' property to the applyToProperties array (create it if necessary)\n action.options.applyToProperties = isArray(applyToProperties)\n ? applyToProperties.concat('locales')\n : ['locales'];\n};\n\nconst shouldApplyLocalesPropertyToSubject = ({ property, subject }: any) => {\n if (property === 'locales') {\n const model = strapi.getModel(subject);\n\n return getService('content-types').isLocalizedContentType(model);\n }\n\n return true;\n};\n\nconst addAllLocalesToPermissions = async (permissions: any) => {\n const { actionProvider } = strapi.service('admin::permission');\n const { find: findAllLocales } = getService('locales');\n\n const allLocales = await findAllLocales();\n const allLocalesCode = allLocales.map(prop('code'));\n\n return Promise.all(\n permissions.map(async (permission: any) => {\n const { action, subject } = permission;\n\n const appliesToLocalesProperty = await actionProvider.appliesToProperty(\n 'locales',\n action,\n subject\n );\n\n if (!appliesToLocalesProperty) {\n return permission;\n }\n\n const oldPermissionProperties = getOr({}, 'properties', permission);\n\n return { ...permission, properties: { ...oldPermissionProperties, locales: allLocalesCode } };\n })\n );\n};\n\nconst syncSuperAdminPermissionsWithLocales = async () => {\n const roleService = strapi.service('admin::role');\n const permissionService = strapi.service('admin::permission');\n\n const superAdminRole = await roleService.getSuperAdmin();\n\n if (!superAdminRole) {\n return;\n }\n\n const superAdminPermissions = await permissionService.findMany({\n where: {\n role: {\n id: superAdminRole.id,\n },\n },\n });\n\n const newSuperAdminPermissions = await addAllLocalesToPermissions(superAdminPermissions);\n\n await roleService.assignPermissions(superAdminRole.id, newSuperAdminPermissions);\n};\n\nconst registerI18nActions = async () => {\n const { actionProvider } = strapi.service('admin::permission');\n\n await actionProvider.registerMany(actions);\n};\n\nconst registerI18nActionsHooks = () => {\n const { actionProvider } = strapi.service('admin::permission');\n const { hooks } = strapi.service('admin::role');\n\n actionProvider.hooks.appliesPropertyToSubject.register(shouldApplyLocalesPropertyToSubject);\n hooks.willResetSuperAdminPermissions.register(addAllLocalesToPermissions);\n};\n\nconst updateActionsProperties = () => {\n const { actionProvider } = strapi.service('admin::permission');\n\n // Register the transformation for every new action\n actionProvider.hooks.willRegister.register(addLocalesPropertyIfNeeded);\n\n // Handle already registered actions\n actionProvider.values().forEach((action: any) => addLocalesPropertyIfNeeded({ value: action }));\n};\n\nexport default {\n actions,\n registerI18nActions,\n registerI18nActionsHooks,\n updateActionsProperties,\n syncSuperAdminPermissionsWithLocales,\n};\n","import { isEmpty } from 'lodash/fp';\n\nimport { getService } from '../../utils';\n\n/**\n * Handler for the permissions layout (sections builder)\n * Adds the locales property to the subjects\n * @param {Action} action\n * @param {ContentTypesSection} section\n * @return {Promise<void>}\n */\nconst localesPropertyHandler = async ({ action, section }: any) => {\n const { actionProvider } = strapi.service('admin::permission');\n\n const locales = await getService('locales').find();\n\n // Do not add the locales property if there is none registered\n if (isEmpty(locales)) {\n return;\n }\n\n for (const subject of section.subjects) {\n const applies = await actionProvider.appliesToProperty('locales', action.actionId, subject.uid);\n const hasLocalesProperty = subject.properties.find(\n (property: any) => property.value === 'locales'\n );\n\n if (applies && !hasLocalesProperty) {\n subject.properties.push({\n label: 'Locales',\n value: 'locales',\n children: locales.map(({ name, code }: any) => ({ label: name || code, value: code })),\n });\n }\n }\n};\n\nconst registerLocalesPropertyHandler = () => {\n const { sectionsBuilder } = strapi.service('admin::permission');\n\n sectionsBuilder.addHandler('singleTypes', localesPropertyHandler);\n sectionsBuilder.addHandler('collectionTypes', localesPropertyHandler);\n};\n\nexport default {\n localesPropertyHandler,\n registerLocalesPropertyHandler,\n};\n","import { getService } from '../../utils';\n\n/**\n * @typedef {object} WillRegisterPermissionContext\n * @property {Permission} permission\n * @property {object} user\n * @property {object} condition\n */\n\n/**\n * Locales property handler for the permission engine\n * Add the has-locale-access condition if the locales property is defined\n * @param {WillRegisterPermissionContext} context\n */\nconst willRegisterPermission = (context: any) => {\n const { permission, condition, user } = context;\n const { subject, properties } = permission;\n\n const isSuperAdmin = strapi.service('admin::role').hasSuperAdminRole(user);\n\n if (isSuperAdmin) {\n return;\n }\n\n const { locales } = properties || {};\n const { isLocalizedContentType } = getService('content-types');\n\n // If there is no subject defined, ignore the permission\n if (!subject) {\n return;\n }\n\n const ct = strapi.contentTypes[subject];\n\n // If the subject exists but isn't localized, ignore the permission\n if (!isLocalizedContentType(ct)) {\n return;\n }\n\n // If the subject is localized but the locales property is null (access to all locales), ignore the permission\n if (locales === null) {\n return;\n }\n\n condition.and({\n locale: {\n $in: locales || [],\n },\n });\n};\n\nconst registerI18nPermissionsHandlers = () => {\n const { engine } = strapi.service('admin::permission');\n\n engine.hooks['before-register.permission'].register(willRegisterPermission);\n};\n\nexport default {\n willRegisterPermission,\n registerI18nPermissionsHandlers,\n};\n","import i18nActionsService from './permissions/actions';\nimport sectionsBuilderService from './permissions/sections-builder';\nimport engineService from './permissions/engine';\n\nconst permissions = () => ({\n actions: i18nActionsService,\n sectionsBuilder: sectionsBuilderService,\n engine: engineService,\n});\n\ntype PermissionsService = typeof permissions;\n\nexport default permissions;\nexport type { PermissionsService };\n","import { reduce } from 'lodash/fp';\nimport { getService } from '../utils';\n\nconst sendDidInitializeEvent = async () => {\n const { isLocalizedContentType } = getService('content-types');\n\n // TODO: V5: This event should be renamed numberOfContentTypes in V5 as the name is already taken to describe the number of content types using i18n.\n const numberOfContentTypes = reduce(\n (sum, contentType) => (isLocalizedContentType(contentType) ? sum + 1 : sum),\n 0\n )(strapi.contentTypes as any);\n\n await strapi.telemetry.send('didInitializeI18n', { groupProperties: { numberOfContentTypes } });\n};\n\nconst sendDidUpdateI18nLocalesEvent = async () => {\n const numberOfLocales = await getService('locales').count();\n\n await strapi.telemetry.send('didUpdateI18nLocales', {\n groupProperties: { numberOfLocales },\n });\n};\n\nconst metrics = () => ({\n sendDidInitializeEvent,\n sendDidUpdateI18nLocalesEvent,\n});\n\ntype MetricsService = typeof metrics;\n\nexport default metrics;\nexport type { MetricsService };\n","import { cloneDeep, isEmpty } from 'lodash/fp';\n\nimport { type Schema } from '@strapi/types';\nimport { async } from '@strapi/utils';\nimport { getService } from '../utils';\n\n/**\n * Update non localized fields of all the related localizations of an entry with the entry values\n */\nconst syncNonLocalizedAttributes = async (sourceEntry: any, model: Schema.ContentType) => {\n const { copyNonLocalizedAttributes } = getService('content-types');\n\n const nonLocalizedAttributes = copyNonLocalizedAttributes(model, sourceEntry);\n if (isEmpty(nonLocalizedAttributes)) {\n return;\n }\n\n const uid = model.uid;\n const documentId = sourceEntry.documentId;\n const locale = sourceEntry.locale;\n const status = sourceEntry?.publishedAt ? 'published' : 'draft';\n\n // Find all the entries that need to be updated\n // this is every other entry of the document in the same status but a different locale\n const localeEntriesToUpdate = await strapi.db.query(uid).findMany({\n where: {\n documentId,\n publishedAt: status === 'published' ? { $ne: null } : null,\n locale: { $ne: locale },\n },\n select: ['locale', 'id'],\n });\n\n const entryData = await strapi.documents(uid).omitComponentData(nonLocalizedAttributes);\n\n await async.map(localeEntriesToUpdate, async (entry: any) => {\n const transformedData = await strapi.documents.utils.transformData(\n cloneDeep(nonLocalizedAttributes),\n {\n uid,\n status,\n locale: entry.locale,\n allowMissingId: true,\n }\n );\n\n // Update or create non localized components for the entry\n const componentData = await strapi\n .documents(uid)\n .updateComponents(entry, transformedData as any);\n\n // Update every other locale entry of this documentId in the same status\n await strapi.db.query(uid).update({\n where: {\n documentId,\n publishedAt: status === 'published' ? { $ne: null } : null,\n locale: { $eq: entry.locale },\n },\n // The data we send to the update function is the entry data merged with\n // the updated component data\n data: Object.assign(cloneDeep(entryData), componentData),\n });\n });\n};\n\nconst localizations = () => ({\n syncNonLocalizedAttributes,\n});\n\ntype LocalizationsService = typeof localizations;\n\nexport default localizations;\nexport type { LocalizationsService };\n","import { isNil } from 'lodash/fp';\nimport { DEFAULT_LOCALE } from '../constants';\nimport { getService, getCoreStore } from '../utils';\n\nconst find = (params: any = {}) =>\n strapi.db.query('plugin::i18n.locale').findMany({ where: params });\n\nconst findById = (id: any) => strapi.db.query('plugin::i18n.locale').findOne({ where: { id } });\n\nconst findByCode = (code: any) =>\n strapi.db.query('plugin::i18n.locale').findOne({ where: { code } });\n\nconst count = (params: any = {}) => strapi.db.query('plugin::i18n.locale').count({ where: params });\n\nconst create = async (locale: any) => {\n const result = await strapi.db.query('plugin::i18n.locale').create({ data: locale });\n\n getService('metrics').sendDidUpdateI18nLocalesEvent();\n\n return result;\n};\n\nconst update = async (params: any, updates: any) => {\n const result = await strapi.db\n .query('plugin::i18n.locale')\n .update({ where: params, data: updates });\n\n getService('metrics').sendDidUpdateI18nLocalesEvent();\n\n return result;\n};\n\nconst deleteFn = async ({ id }: any) => {\n const localeToDelete = await findById(id);\n\n if (localeToDelete) {\n await deleteAllLocalizedEntriesFor({ locale: localeToDelete.code });\n const result = await strapi.db.query('plugin::i18n.locale').delete({ where: { id } });\n\n getService('metrics').sendDidUpdateI18nLocalesEvent();\n\n return result;\n }\n\n return localeToDelete;\n};\n\nconst setDefaultLocale = ({ code }: any) =>\n getCoreStore().set({ key: 'default_locale', value: code });\n\nconst getDefaultLocale = () => getCoreStore().get({ key: 'default_locale' });\n\nconst setIsDefault = async (locales: any) => {\n if (isNil(locales)) {\n return locales;\n }\n\n const actualDefault = await getDefaultLocale();\n\n if (Array.isArray(locales)) {\n return locales.map((locale) => ({ ...locale, isDefault: actualDefault === locale.code }));\n }\n // single locale\n return { ...locales, isDefault: actualDefault === locales.code };\n};\n\nconst initDefaultLocale = async () => {\n const existingLocalesNb = await strapi.db.query('plugin::i18n.locale').count();\n if (existingLocalesNb === 0) {\n await create(DEFAULT_LOCALE);\n await setDefaultLocale({ code: DEFAULT_LOCALE.code });\n }\n};\n\nconst deleteAllLocalizedEntriesFor = async ({ locale }: any) => {\n const { isLocalizedContentType } = getService('content-types');\n\n const localizedModels = Object.values(strapi.contentTypes).filter(isLocalizedContentType);\n\n for (const model of localizedModels) {\n // FIXME: delete many content & their associations\n await strapi.db.query(model.uid).deleteMany({ where: { locale } });\n }\n};\n\nconst locales = () => ({\n find,\n findById,\n findByCode,\n create,\n update,\n count,\n setDefaultLocale,\n getDefaultLocale,\n setIsDefault,\n delete: deleteFn,\n initDefaultLocale,\n});\n\ntype LocaleService = typeof locales;\n\nexport default locales;\nexport type { LocaleService };\n","import { isoLocales } from '../constants';\n\nconst getIsoLocales = () => isoLocales;\n\nconst isoLocalesService = () => ({\n getIsoLocales,\n});\n\ntype ISOLocalesService = typeof isoLocalesService;\n\nexport default isoLocalesService;\nexport type { ISOLocalesService };\n","import _ from 'lodash';\nimport { pick, pipe, has, prop, isNil, cloneDeep, isArray } from 'lodash/fp';\nimport { errors, contentTypes as contentTypeUtils } from '@strapi/utils';\nimport { getService } from '../utils';\n\nconst {\n isRelationalAttribute,\n getVisibleAttributes,\n isTypedAttribute,\n getScalarAttributes,\n getRelationalAttributes,\n} = contentTypeUtils;\nconst { ApplicationError } = errors;\n\nconst hasLocalizedOption = (modelOrAttribute: any) => {\n return prop('pluginOptions.i18n.localized', modelOrAttribute) === true;\n};\n\nconst getValidLocale = async (locale: any) => {\n const localesService = getService('locales');\n\n if (isNil(locale)) {\n return localesService.getDefaultLocale();\n }\n\n const foundLocale = await localesService.findByCode(locale);\n if (!foundLocale) {\n throw new ApplicationError('Locale not found');\n }\n\n return locale;\n};\n\n/**\n * Returns whether an attribute is localized or not\n * @param {*} attribute\n * @returns\n */\nconst isLocalizedAttribute = (attribute: any) => {\n return (\n hasLocalizedOption(attribute) ||\n isRelationalAttribute(attribute) ||\n isTypedAttribute(attribute, 'uid')\n );\n};\n\n/**\n * Returns whether a model is localized or not\n * @param {*} model\n * @returns\n */\nconst isLocalizedContentType = (model: any) => {\n return hasLocalizedOption(model);\n};\n\n/**\n * Returns the list of attribute names that are not localized\n * @param {object} model\n * @returns {string[]}\n */\nconst getNonLocalizedAttributes = (model: any) => {\n return getVisibleAttributes(model).filter(\n (attrName) => !isLocalizedAttribute(model.attributes[attrName])\n );\n};\n\nconst removeId = (value: any) => {\n if (typeof value === 'object' && has('id', value)) {\n delete value.id;\n }\n};\n\nconst removeIds = (model: any) => (entry: any) => removeIdsMut(model, cloneDeep(entry));\n\nconst removeIdsMut = (model: any, entry: any) => {\n if (isNil(entry)) {\n return entry;\n }\n\n removeId(entry);\n\n _.forEach(model.attributes, (attr, attrName) => {\n const value = entry[attrName];\n if (attr.type === 'dynamiczone' && isArray(value)) {\n value.forEach((compo) => {\n if (has('__component', compo)) {\n const model = strapi.components[compo.__component];\n removeIdsMut(model, compo);\n }\n });\n } else if (attr.type === 'component') {\n const model = strapi.components[attr.component];\n if (isArray(value)) {\n value.forEach((compo) => removeIdsMut(model, compo));\n } else {\n removeIdsMut(model, value);\n }\n }\n });\n\n return entry;\n};\n\n/**\n * Returns a copy of an entry picking only its non localized attributes\n * @param {object} model\n * @param {object} entry\n * @returns {object}\n */\nconst copyNonLocalizedAttributes = (model: any, entry: any) => {\n const nonLocalizedAttributes = getNonLocalizedAttributes(model);\n\n return pipe(pick(nonLocalizedAttributes), removeIds(model))(entry);\n};\n\n/**\n * Returns the list of attribute names that are localized\n * @param {object} model\n * @returns {string[]}\n */\nconst getLocalizedAttributes = (model: any) => {\n return getVisibleAttributes(model).filter((attrName) =>\n isLocalizedAttribute(model.attributes[attrName])\n );\n};\n\n/**\n * Fill non localized fields of an entry if there are nil\n * @param {Object} entry entry to fill\n * @param {Object} relatedEntry values used to fill\n * @param {Object} options\n * @param {Object} options.model corresponding model\n */\nconst fillNonLocalizedAttributes = (entry: any, relatedEntry: any, { model }: any) => {\n if (isNil(relatedEntry)) {\n return;\n }\n\n const modelDef = strapi.getModel(model);\n const relatedEntryCopy = copyNonLocalizedAttributes(modelDef, relatedEntry);\n\n _.forEach(relatedEntryCopy, (value, field) => {\n if (isNil(entry[field])) {\n entry[field] = value;\n }\n });\n};\n\n/**\n * build the populate param to\n * @param {String} modelUID uid of the model, could be of a content-type or a component\n */\nconst getNestedPopulateOfNonLocalizedAttributes = (modelUID: any) => {\n const schema = strapi.getModel(modelUID);\n const scalarAttributes = getScalarAttributes(schema);\n const nonLocalizedAttributes = getNonLocalizedAttributes(schema);\n\n const allAttributes = [...scalarAttributes, ...nonLocalizedAttributes];\n if (schema.modelType === 'component') {\n // When called recursively on a non localized component we\n // need to explicitly populate that components relations\n allAttributes.push(...getRelationalAttributes(schema));\n }\n\n const currentAttributesToPopulate = allAttributes.filter((value, index, self) => {\n return self.indexOf(value) === index && self.lastIndexOf(value) === index;\n });\n\n const attributesToPopulate = [...currentAttributesToPopulate];\n for (const attrName of currentAttributesToPopulate) {\n const attr = schema.attributes[attrName];\n if (attr.type === 'component') {\n const nestedPopulate = getNestedPopulateOfNonLocalizedAttributes(attr.component).map(\n (nestedAttr) => `${attrName}.${nestedAttr}`\n );\n attributesToPopulate.push(...nestedPopulate);\n } else if (attr.type === 'dynamiczone') {\n attr.components.forEach((componentName) => {\n const nestedPopulate = getNestedPopulateOfNonLocalizedAttributes(componentName).map(\n (nestedAttr) => `${attrName}.${nestedAttr}`\n );\n attributesToPopulate.push(...nestedPopulate);\n });\n }\n }\n\n return attributesToPopulate;\n};\n\nconst contentTypes = () => ({\n isLocalizedContentType,\n getValidLocale,\n getLocalizedAttributes,\n getNonLocalizedAttributes,\n copyNonLocalizedAttributes,\n fillNonLocalizedAttributes,\n getNestedPopulateOfNonLocalizedAttributes,\n});\n\ntype ContentTypesService = typeof contentTypes;\n\nexport default contentTypes;\nexport { ContentTypesService };\n","import permissions from './permissions';\nimport metrics from './metrics';\nimport localizations from './localizations';\nimport locales from './locales';\nimport isoLocales from './iso-locales';\nimport contentTypes from './content-types';\n\nexport default {\n permissions,\n metrics,\n localizations,\n locales,\n 'iso-locales': isoLocales,\n 'content-types': contentTypes,\n};\n","export default {\n type: 'admin',\n routes: [\n {\n method: 'GET',\n path: '/iso-locales',\n handler: 'iso-locales.listIsoLocales',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.read'] },\n },\n ],\n },\n },\n {\n method: 'GET',\n path: '/locales',\n handler: 'locales.listLocales',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'POST',\n path: '/locales',\n handler: 'locales.createLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.create'] },\n },\n ],\n },\n },\n {\n method: 'PUT',\n path: '/locales/:id',\n handler: 'locales.updateLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.update'] },\n },\n ],\n },\n },\n {\n method: 'DELETE',\n path: '/locales/:id',\n handler: 'locales.deleteLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.delete'] },\n },\n ],\n },\n },\n {\n method: 'POST',\n path: '/content-manager/actions/get-non-localized-fields',\n handler: 'content-types.getNonLocalizedAttributes',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n ],\n};\n","export default {\n type: 'content-api',\n routes: [\n {\n method: 'GET',\n path: '/locales',\n handler: 'locales.listLocales',\n },\n ],\n};\n","import admin from './admin';\nimport contentApi from './content-api';\n\nexport default {\n admin,\n 'content-api': contentApi,\n};\n","import { prop } from 'lodash/fp';\nimport { yup, validateYupSchema } from '@strapi/utils';\n\nimport { isoLocales } from '../constants';\n\nconst allowedLocaleCodes = isoLocales.map(prop('code'));\n\nconst createLocaleSchema = yup\n .object()\n .shape({\n name: yup.string().max(50).nullable(),\n code: yup.string().oneOf(allowedLocaleCodes).required(),\n isDefault: yup.boolean().required(),\n })\n .noUnknown();\n\nconst updateLocaleSchema = yup\n .object()\n .shape({\n name: yup.string().min(1).max(50).nullable(),\n isDefault: yup.boolean(),\n })\n .noUnknown();\n\nconst validateCreateLocaleInput = validateYupSchema(createLocaleSchema);\nconst validateUpdateLocaleInput = validateYupSchema(updateLocaleSchema);\n\nexport { validateCreateLocaleInput, validateUpdateLocaleInput };\n","const formatLocale = (locale: { name: string; code: string; isDefault: boolean }) => {\n return {\n ...locale,\n name: locale.name || null,\n };\n};\n\nexport { formatLocale };\n","import * as utils from '@strapi/utils';\nimport { pick } from 'lodash/fp';\nimport type { Core } from '@strapi/types';\nimport { getService } from '../utils';\nimport { validateCreateLocaleInput, validateUpdateLocaleInput } from '../validation/locales';\nimport { formatLocale } from '../domain/locale';\n\nconst { setCreatorFields } = utils;\nconst { ApplicationError } = utils.errors;\n\nconst sanitizeLocale = (locale: any) => {\n const model = strapi.getModel('plugin::i18n.locale');\n\n return strapi.contentAPI.sanitize.output(locale, model);\n};\n\nconst controller: Core.Controller = {\n async listLocales(ctx) {\n const localesService = getService('locales');\n\n const locales = await localesService.find();\n const sanitizedLocales = await sanitizeLocale(locales);\n\n ctx.body = await localesService.setIsDefault(sanitizedLocales);\n },\n\n async createLocale(ctx) {\n const { user } = ctx.state;\n const body = ctx.request.body as any;\n const { isDefault, ...localeToCreate } = body;\n\n await validateCreateLocaleInput(body);\n\n const localesService = getService('locales');\n\n const existingLocale = await localesService.findByCode(body.code);\n if (existingLocale) {\n throw new ApplicationError('This locale already exists');\n }\n\n const localeToPersist = setCreatorFields({ user })(formatLocale(localeToCreate));\n\n const locale = await localesService.create(localeToPersist);\n\n if (isDefault) {\n await localesService.setDefaultLocale(locale);\n }\n\n const sanitizedLocale = await sanitizeLocale(locale);\n\n ctx.body = await localesService.setIsDefault(sanitizedLocale);\n },\n\n async updateLocale(ctx) {\n const { user } = ctx.state;\n const { id } = ctx.params;\n const body = ctx.request.body as any;\n const { isDefault, ...updates } = body;\n\n await validateUpdateLocaleInput(body);\n\n const localesService = getService('locales');\n\n const existingLocale = await localesService.findById(id);\n if (!existingLocale) {\n return ctx.notFound('locale.notFound');\n }\n\n const allowedParams = ['name'];\n const cleanUpdates = setCreatorFields({ user, isEdition: true })(pick(allowedParams, updates));\n\n const updatedLocale = await localesService.update({ id }, cleanUpdates);\n\n if (isDefault) {\n await localesService.setDefaultLocale(updatedLocale);\n }\n\n const sanitizedLocale = await sanitizeLocale(updatedLocale);\n\n ctx.body = await localesService.setIsDefault(sanitizedLocale);\n },\n\n async deleteLocale(ctx) {\n const { id } = ctx.params;\n\n const localesService = getService('locales');\n\n const existingLocale = await localesService.findById(id);\n if (!existingLocale) {\n return ctx.notFound('locale.notFound');\n }\n\n const defaultLocaleCode = await localesService.getDefaultLocale();\n if (existingLocale.code === defaultLocaleCode) {\n throw new ApplicationError('Cannot delete the default locale');\n }\n\n await localesService.delete({ id });\n\n const sanitizedLocale = await sanitizeLocale(existingLocale);\n\n ctx.body = await localesService.setIsDefault(sanitizedLocale);\n },\n};\n\nexport default controller;\n","import { yup, validateYupSchema } from '@strapi/utils';\n\nimport { get } from 'lodash/fp';\n\nconst validateGetNonLocalizedAttributesSchema = yup\n .object()\n .shape({\n model: yup.string().required(),\n id: yup.mixed().when('model', {\n is: (model: any) => get('kind', strapi.contentType(model)) === 'singleType',\n then: yup.strapiID().nullable(),\n otherwise: yup.strapiID().required(),\n }),\n locale: yup.string().required(),\n })\n .noUnknown()\n .required();\n\nconst validateGetNonLocalizedAttributesInput = validateYupSchema(\n validateGetNonLocalizedAttributesSchema\n);\n\nexport { validateGetNonLocalizedAttributesInput };\n","import { pick, uniq, prop, getOr, flatten, pipe, map } from 'lodash/fp';\nimport { contentTypes as contentTypesUtils, errors } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\nimport { getService } from '../utils';\nimport { validateGetNonLocalizedAttributesInput } from '../validation/content-types';\n\nconst { ApplicationError } = errors;\n\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypesUtils.constants;\n\nconst getLocalesProperty = getOr<string[]>([], 'properties.locales');\nconst getFieldsProperty = prop('properties.fields');\n\nconst getFirstLevelPath = map((path: string) => path.split('.')[0]);\n\nconst controller = {\n async getNonLocalizedAttributes(ctx) {\n const { user } = ctx.state;\n const body = ctx.request.body as any;\n const { model, id, locale } = body;\n\n await validateGetNonLocalizedAttributesInput({ model, id, locale });\n\n const {\n copyNonLocalizedAttributes,\n isLocalizedContentType,\n getNestedPopulateOfNonLocalizedAttributes,\n } = getService('content-types');\n\n const {\n default: { READ_ACTION, CREATE_ACTION },\n } = strapi.service('admin::constants');\n\n const modelDef = strapi.contentType(model);\n const attributesToPopulate = getNestedPopulateOfNonLocalizedAttributes(model);\n\n if (!isLocalizedContentType(modelDef)) {\n throw new ApplicationError(`Model ${model} is not localized`);\n }\n\n const params = modelDef.kind === 'singleType' ? {} : { id };\n\n const entity = await strapi.db\n .query(model)\n .findOne({ where: params, populate: attributesToPopulate });\n\n if (!entity) {\n return ctx.notFound();\n }\n\n const permissions = await strapi.admin.services.permission.findMany({\n where: {\n action: [READ_ACTION, CREATE_ACTION],\n subject: model,\n role: {\n id: user.roles.map(prop('id')),\n },\n },\n });\n\n const localePermissions = permissions\n .filter((perm: any) => getLocalesProperty(perm).includes(locale))\n .map(getFieldsProperty);\n\n const permittedFields = pipe(flatten, getFirstLevelPath, uniq)(localePermissions);\n\n const nonLocalizedFields = copyNonLocalizedAttributes(modelDef, entity);\n const sanitizedNonLocalizedFields = pick(permittedFields, nonLocalizedFields);\n\n const availableLocalesResult = await strapi.plugins['content-manager']\n .service('document-metadata')\n .getMetadata(model, entity, {\n availableLocales: true,\n });\n\n const availableLocales = availableLocalesResult.availableLocales.map((localeResult: any) =>\n pick(['id', 'locale', PUBLISHED_AT_ATTRIBUTE], localeResult)\n );\n\n ctx.body = {\n nonLocalizedFields: sanitizedNonLocalizedFields,\n localizations: availableLocales.concat(\n pick(['id', 'locale', PUBLISHED_AT_ATTRIBUTE], entity)\n ),\n };\n },\n} satisfies Core.Controller;\n\nexport default controller;\n","import type { Core } from '@strapi/types';\nimport { getService } from '../utils';\n\nconst controller: Core.Controller = {\n listIsoLocales(ctx) {\n const isoLocalesService = getService('iso-locales');\n\n ctx.body = isoLocalesService.getIsoLocales();\n },\n};\n\nexport default controller;\n","import locales from './locales';\nimport contentTypes from './content-types';\nimport isoLocales from './iso-locales';\n\nexport default {\n locales,\n 'iso-locales': isoLocales,\n 'content-types': contentTypes,\n};\n","import bootstrap from './bootstrap';\nimport register from './register';\nimport contentTypes from './content-types';\nimport services from './services';\nimport routes from './routes';\nimport controllers from './controllers';\n\nexport default () => ({\n register,\n bootstrap,\n routes,\n controllers,\n contentTypes,\n services,\n});\n"],"names":["schema","getNestedPopulateOfNonLocalizedAttributes","sendDidInitializeEvent","initDefaultLocale","actions","ApplicationError","errors","getValidLocale","isLocalizedContentType","locale","get","strapi","locales","identity","propEq","contentTypes","getDefaultLocale","attributes","_","isArray","permissions","prop","getOr","isEmpty","reduce","copyNonLocalizedAttributes","async","cloneDeep","isNil","contentTypeUtils","has","model","pipe","pick","index","isoLocales","yup","validateYupSchema","utils","controller","contentTypesUtils","map","flatten","uniq","isoLocalesService"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAgBA,MAAM,eAAe,MAAM;AACzB,SAAO,OAAO,MAAM,EAAE,MAAM,UAAU,MAAM,QAAQ;AACtD;AAGA,MAAM,aAAa,CAAoB,SAA8B;AACnE,SAAO,OAAO,OAAO,MAAM,EAAE,QAAQ,IAAI;AAC3C;ACpBA,MAAM,sBAAsB,MAAM;AACzB,SAAA,GAAG,WAAW,UAAU;AAAA,IAC7B,QAAQ,CAAC,qBAAqB;AAAA,IAE9B,MAAM,cAAc;AAClB,YAAM,WAAW,aAAa,EAAE,QAAQ,qCAAqC;AAAA,IAC/E;AAAA,IAEA,MAAM,cAAc;AAClB,YAAM,WAAW,aAAa,EAAE,QAAQ,qCAAqC;AAAA,IAC/E;AAAA,EAAA,CACD;AAED,SAAO,UAAU,IAAI,OAAO,SAAS,SAAS;AAC5C,UAAMA,UAA6B,QAAQ;AAEvC,QAAA,CAAC,CAAC,UAAU,UAAU,gBAAgB,SAAS,EAAE,SAAS,QAAQ,MAAM,GAAG;AAC7E,aAAO,KAAK;AAAA,IACd;AAEA,QAAI,CAAC,WAAW,eAAe,EAAE,uBAAuBA,OAAM,GAAG;AAC/D,aAAO,KAAK;AAAA,IACd;AAGA,UAAM,EAAE,2CAAAC,2CAAA,IAA8C,WAAW,eAAe;AAE1E,UAAA,uBAAuBA,2CAA0CD,QAAO,GAAG;AAG3E,UAAA,SAAU,MAAM;AAKlB,QAAA;AAEA,QAAA,MAAM,QAAQ,QAAQ,OAAO,KAAK,OAAO,QAAQ,CAAC,GAAG,IAAI;AAChD,iBAAA,OAAO,QAAQ,CAAC,EAAE;AAAA,IAAA,WACpB,QAAQ,IAAI;AACrB,iBAAW,OAAO;AAAA,IAAA,OACb;AACE,aAAA;AAAA,IACT;AAEI,QAAA,qBAAqB,SAAS,GAAG;AACnC,YAAM,kBAAkB,MAAM,OAAO,GAClC,MAAMA,QAAO,GAAG,EAChB,QAAQ,EAAE,OAAO,EAAE,IAAI,SAAY,GAAA,UAAU,sBAAsB;AAEtE,YAAM,WAAW,eAAe,EAAE,2BAA2B,iBAAiBA,OAAM;AAAA,IACtF;AAEO,WAAA;AAAA,EAAA,CACR;AACH;AAEA,MAAA,YAAe,YAAY;AACzB,QAAM,EAAE,wBAAAE,wBAAA,IAA2B,WAAW,SAAS;AACvD,QAAM,EAAE,mBAAAC,mBAAA,IAAsB,WAAW,SAAS;AAClD,QAAM,EAAE,iBAAiB,SAAAC,UAAS,OAAO,IAAI,WAAW,aAAa;AAGrE,QAAMD,mBAAkB;AAGxB,kBAAgB,+BAA+B;AAG/C,QAAMC,SAAQ;AACd,EAAAA,SAAQ,yBAAyB;AACjC,EAAAA,SAAQ,wBAAwB;AAGhC,SAAO,gCAAgC;AAGnB;AAEG,EAAAF;AACzB;AC9EA,MAAM,EAAEG,kBAAAA,mBAAqB,IAAAC;AAG7B,MAAM,yBAAiD,OAAO,KAAK,SAAS;AACpE,QAAA,EAAE,MAAM,IAAI,IAAI;AAChB,QAAA,EAAE,MAAM,IAAI,IAAI;AAGlB,MAAA,CAAC,IAAI,QAAQ,MAAM;AACjB,QAAA,QAAQ,OAAO;EACrB;AAEM,QAAA,OAAO,IAAI,QAAQ;AAEzB,QAAM,EAAE,gBAAAC,iBAAgB,wBAAAC,wBAAuB,IAAI,WAAW,eAAe;AAEvE,QAAA,WAAW,OAAO,SAAS,KAAK;AAElC,MAAA,CAACA,wBAAuB,QAAQ,GAAG;AACrC,WAAO,KAAK;AAAA,EACd;AAGM,QAAAC,UAASC,OAAI,UAAU,KAAK,KAAKA,GAAI,IAAA,UAAU,IAAI,KAAK;AAG1D,MAAA,QAAQ,QAAQ;AAEhB,MAAA;AACA,MAAA;AACa,mBAAA,MAAMH,gBAAeE,OAAM;AAAA,WACnC,GAAG;AACJ,UAAA,IAAIJ,mBAAiB,2BAA2B;AAAA,EACxD;AAEA,OAAK,SAAS;AAEV,MAAA,SAAS,SAAS,cAAc;AAClC,UAAM,SAAS,MAAM,OAAO,cAAc,SAAS,SAAS,KAAK;AAAA,MAC/D,QAAQ;AAAA,IAAA,CACF;AAEJ,QAAA,QAAQ,MAAM,SAAS,KAAK;AAGhC,QAAI,QAAQ;AACV,aAAO,KAAK;AAAA,IACd;AAAA,EACF;AAEA,SAAO,KAAK;AACd;ACpDA,MAAM,EAAE,gBAAoB,IAAAC;AAE5B,MAAM,yBAAyB;AAC/B,MAAM,yBAAyB;AAE/B,MAAA,kBAAe,CAAC,EAAE,QAAAK,eAAuC;AAAA,EACvD,WAAW;AACT,UAAM,EAAE,SAAS,kBAAA,IAAsBA,QAAO,OAAO,SAAS;AAC9D,UAAM,EAAE,SAAS,eAAA,IAAmBA,QAAO,OAAO,MAAM;AAExD,UAAM,EAAE,wBAAAH,wBAAA,IAA2B,eAAe,eAAe;AAE3D,UAAA,mBAAmB,kBAAkB,WAAW;AAErC,qBAAA,WAAW,qBAAqB,EAAE,iBAAiB;AAG7D,WAAA,QAAQG,QAAO,YAAY,EAAE,QAAQ,CAAC,CAAC,KAAK,EAAE,MAAM;AACrD,UAAAH,wBAAuB,EAAE,GAAG;AAE9B,yBAAiB,WAAW,GAAG,EAAE,MAAM,QAAQ,EAAE;AAGjD,yBAAiB,WAAW,GAAG,EAAE,MAAM,eAAe,EAAE;MAC1D;AAAA,IAAA,CACD;AAED,qBAAiB,IAAI,CAAC,EAAE,OAAO,mBAAwB;AACrD,YAAM,sBAAsB,uBAAuB,EAAE,OAAO,aAAc,CAAA;AAC1E,YAAM,mBAAmB,gBAAgB,EAAE,MAAO,CAAA;AAC3C,aAAA;AAAA,QACL,SAAS,CAAC,mBAAmB;AAAA,QAC7B,OAAO,CAAC,gBAAgB;AAAA,QAExB,iBAAiB;AAAA;AAAA,UAEf,oBAAoB,EAAE,MAAM,EAAE,OAAO,qCAAqC;AAAA,UAC1E,qBAAqB,EAAE,MAAM,EAAE,OAAO,qCAAqC;AAAA,QAC7E;AAAA,MAAA;AAAA,IACF,CACD;AAAA,EACH;AACF;AAEA,MAAM,kBAAkB,CAAC,EAAE,YAAiB;AAC1C,QAAM,EAAE,SAAS,eAAA,IAAmB,OAAO,OAAO,MAAM;AAExD,QAAMI,WAAU,eAAe,aAAa,EAAE,cAAc;AAE5D,SAAO,MAAM,WAAW;AAAA,IACtB,MAAM;AAAA,IAEN,aAAa;AAAA,IAEb,WAAWC,GAAA;AAAA,IACX,YAAYA,GAAA;AAAA,IAEZ,aAAa,KAAU;AACjB,UAAA,IAAI,SAAS,eAAe;AACxB,cAAA,IAAI,gBAAgB,yCAAyC;AAAA,MACrE;AAEM,YAAA,gBAAgB,IAAI,UAAU,OAAOD,SAAQ,KAAKE,GAAAA,OAAO,QAAQ,IAAI,KAAK,CAAC;AAEjF,UAAI,CAAC,eAAe;AACZ,cAAA,IAAI,gBAAgB,yBAAyB;AAAA,MACrD;AAEA,aAAO,IAAI;AAAA,IACb;AAAA,EAAA,CACD;AACH;AAEA,MAAM,yBAAyB,CAAC,EAAE,OAAO,mBAAwB;AAC/D,QAAM,EAAE,SAAS,eAAA,IAAmB,OAAO,OAAO,MAAM;AAExD,QAAM,EAAE,wBAAAN,wBAAA,IAA2B,eAAe,eAAe;AAEjE,SAAO,MAAM,OAAO;AAAA,IAClB,MAAM;AAAA,IAEN,iBAAiB,QAAa;AAGtB,YAAA,EAAE,WAAe,IAAA;AAGnB,UAAA,eAAe,WAAW,eAAe,YAAY;AACvD;AAAA,MACF;AAEI,UAAA;AAEA,UAAA,QAAQ,YAAY,QAAQ,aAAa;AAC7B,sBAAA,OAAO,WAAW,OAAO;AAAA,MAAA,OAClC;AACL,cAAM,eAAe,aAAa,IAAI,OAAO,IAAI;AAEjD,YAAI,CAAC,cAAc;AACjB;AAAA,QACF;AAEA,sBAAc,aAAa,OAAO;AAAA,MACpC;AAGI,UAAA,CAACA,wBAAuB,WAAW,GAAG;AACxC;AAAA,MACF;AAEI,UAAA,CAAC,OAAO,MAAM;AAChB,eAAO,OAAO;MAChB;AAEO,aAAA,KAAK,SAAS,MAAM,IAAI;AAAA,QAC7B,MAAM;AAAA,QACN,aAAa;AAAA,MAAA,CACd;AAAA,IACH;AAAA,EAAA,CACD;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
@@ -1,5 +1,5 @@
1
1
  import _ from "lodash";
2
- import { get, identity, propEq, isArray, prop, getOr, isEmpty, reduce, cloneDeep, isNil, has, omit, pipe, pick, map, flatten, uniq } from "lodash/fp";
2
+ import { get, identity, propEq, isArray, prop, getOr, isEmpty, reduce, cloneDeep, isNil, pipe, pick, has, map, flatten, uniq } from "lodash/fp";
3
3
  import * as utils from "@strapi/utils";
4
4
  import { errors, async, contentTypes as contentTypes$2, yup, validateYupSchema } from "@strapi/utils";
5
5
  const getCoreStore = () => {
@@ -44,12 +44,10 @@ const registerModelsHooks = () => {
44
44
  return result;
45
45
  });
46
46
  };
47
- const bootstrap = async ({ strapi: strapi2 }) => {
47
+ const bootstrap = async () => {
48
48
  const { sendDidInitializeEvent: sendDidInitializeEvent2 } = getService("metrics");
49
- const { decorator: decorator2 } = getService("entity-service-decorator");
50
49
  const { initDefaultLocale: initDefaultLocale2 } = getService("locales");
51
50
  const { sectionsBuilder, actions: actions2, engine } = getService("permissions");
52
- strapi2.entityService.decorate(decorator2);
53
51
  await initDefaultLocale2();
54
52
  sectionsBuilder.registerLocalesPropertyHandler();
55
53
  await actions2.registerI18nActions();
@@ -3045,91 +3043,6 @@ const getIsoLocales = () => isoLocales;
3045
3043
  const isoLocalesService = () => ({
3046
3044
  getIsoLocales
3047
3045
  });
3048
- const LOCALE_QUERY_FILTER = "locale";
3049
- const SINGLE_ENTRY_ACTIONS = ["findOne", "update", "delete"];
3050
- const BULK_ACTIONS = ["delete"];
3051
- const paramsContain = (key, params) => {
3052
- return has(key, params.filters) || isArray(params.filters) && params.filters.some((clause) => has(key, clause)) || isArray(get("$and", params.filters)) && params.filters.$and.some((clause) => has(key, clause));
3053
- };
3054
- const wrapParams = async (params = {}, ctx = {}) => {
3055
- const { action } = ctx;
3056
- if (has(LOCALE_QUERY_FILTER, params)) {
3057
- if (params[LOCALE_QUERY_FILTER] === "all") {
3058
- return omit(LOCALE_QUERY_FILTER, params);
3059
- }
3060
- return {
3061
- ...omit(LOCALE_QUERY_FILTER, params),
3062
- filters: {
3063
- $and: [{ locale: params[LOCALE_QUERY_FILTER] }].concat(params.filters || [])
3064
- }
3065
- };
3066
- }
3067
- const entityDefinedById = paramsContain("id", params) && SINGLE_ENTRY_ACTIONS.includes(action);
3068
- const entitiesDefinedByIds = paramsContain("id.$in", params) && BULK_ACTIONS.includes(action);
3069
- if (entityDefinedById || entitiesDefinedByIds) {
3070
- return params;
3071
- }
3072
- const { getDefaultLocale: getDefaultLocale2 } = getService("locales");
3073
- return {
3074
- ...params,
3075
- filters: {
3076
- $and: [{ locale: await getDefaultLocale2() }].concat(params.filters || [])
3077
- }
3078
- };
3079
- };
3080
- const decorator = (service) => ({
3081
- /**
3082
- * Wraps result
3083
- * @param {object} result - result object of query
3084
- * @param {object} ctx - Query context
3085
- * @param {object} ctx.model - Model that is being used
3086
- */
3087
- async wrapResult(result = {}, ctx = {}) {
3088
- return service.wrapResult.call(this, result, ctx);
3089
- },
3090
- /**
3091
- * Wraps query options. In particular will add default locale to query params
3092
- * @param {object} params - Query options object (params, data, files, populate)
3093
- * @param {object} ctx - Query context
3094
- * @param {object} ctx.model - Model that is being used
3095
- */
3096
- async wrapParams(params = {}, ctx = {}) {
3097
- const wrappedParams = await service.wrapParams.call(this, params, ctx);
3098
- const model = strapi.getModel(ctx.uid);
3099
- const { isLocalizedContentType: isLocalizedContentType2 } = getService("content-types");
3100
- if (!isLocalizedContentType2(model)) {
3101
- return wrappedParams;
3102
- }
3103
- return wrapParams(wrappedParams, ctx);
3104
- },
3105
- /**
3106
- * Find an entry or several if fetching all locales
3107
- * @param {string} uid - Model uid
3108
- * @param {object} opts - Query options object (params, data, files, populate)
3109
- */
3110
- async findMany(uid, opts) {
3111
- const model = strapi.getModel(uid);
3112
- const { isLocalizedContentType: isLocalizedContentType2 } = getService("content-types");
3113
- if (!isLocalizedContentType2(model)) {
3114
- return service.findMany.call(this, uid, opts);
3115
- }
3116
- const { kind } = model;
3117
- if (kind === "singleType") {
3118
- if (opts[LOCALE_QUERY_FILTER] === "all") {
3119
- const wrappedParams = await this.wrapParams(opts, { uid, action: "findMany" });
3120
- const query = strapi.get("query-params").transform(uid, wrappedParams);
3121
- const entities = await strapi.db.query(uid).findMany(query);
3122
- return this.wrapResult(entities, { uid, action: "findMany" });
3123
- }
3124
- return service.findMany.call(this, uid, opts);
3125
- }
3126
- return service.findMany.call(this, uid, opts);
3127
- }
3128
- });
3129
- const entityServiceDecorator = () => ({
3130
- decorator,
3131
- wrapParams
3132
- });
3133
3046
  const {
3134
3047
  isRelationalAttribute,
3135
3048
  getVisibleAttributes,
@@ -3260,7 +3173,6 @@ const services = {
3260
3173
  localizations,
3261
3174
  locales,
3262
3175
  "iso-locales": isoLocalesService,
3263
- "entity-service-decorator": entityServiceDecorator,
3264
3176
  "content-types": contentTypes
3265
3177
  };
3266
3178
  const admin = {
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../server/src/utils/index.ts","../../server/src/bootstrap.ts","../../server/src/controllers/validate-locale-creation.ts","../../server/src/graphql.ts","../../server/src/constants/index.ts","../../server/src/migrations/content-type/enable/index.ts","../../server/src/migrations/content-type/disable/index.ts","../../server/src/register.ts","../../server/src/content-types/locale/index.ts","../../server/src/content-types/index.ts","../../server/src/services/permissions/actions.ts","../../server/src/services/permissions/sections-builder.ts","../../server/src/services/permissions/engine.ts","../../server/src/services/permissions.ts","../../server/src/services/metrics.ts","../../server/src/services/localizations.ts","../../server/src/services/locales.ts","../../server/src/services/iso-locales.ts","../../server/src/services/entity-service-decorator.ts","../../server/src/services/content-types.ts","../../server/src/services/index.ts","../../server/src/routes/admin.ts","../../server/src/routes/content-api.ts","../../server/src/routes/index.ts","../../server/src/validation/locales.ts","../../server/src/domain/locale.ts","../../server/src/controllers/locales.ts","../../server/src/validation/content-types.ts","../../server/src/controllers/content-types.ts","../../server/src/controllers/iso-locales.ts","../../server/src/controllers/index.ts","../../server/src/index.ts"],"sourcesContent":["import type { LocaleService } from '../services/locales';\nimport type { PermissionsService } from '../services/permissions';\nimport type { ContentTypesService } from '../services/content-types';\nimport type { MetricsService } from '../services/metrics';\nimport type { EntityServiceDecoratorService } from '../services/entity-service-decorator';\nimport type { ISOLocalesService } from '../services/iso-locales';\nimport type { LocalizationsService } from '../services/localizations';\n\ntype S = {\n permissions: PermissionsService;\n metrics: MetricsService;\n locales: LocaleService;\n localizations: LocalizationsService;\n ['iso-locales']: ISOLocalesService;\n ['content-types']: ContentTypesService;\n ['entity-service-decorator']: EntityServiceDecoratorService;\n};\n\nconst getCoreStore = () => {\n return strapi.store({ type: 'plugin', name: 'i18n' });\n};\n\n// retrieve a local service\nconst getService = <T extends keyof S>(name: T): ReturnType<S[T]> => {\n return strapi.plugin('i18n').service(name);\n};\n\nexport { getService, getCoreStore };\n","import type { Schema, Core } from '@strapi/types';\nimport { getService } from './utils';\n\nconst registerModelsHooks = () => {\n strapi.db.lifecycles.subscribe({\n models: ['plugin::i18n.locale'],\n\n async afterCreate() {\n await getService('permissions').actions.syncSuperAdminPermissionsWithLocales();\n },\n\n async afterDelete() {\n await getService('permissions').actions.syncSuperAdminPermissionsWithLocales();\n },\n });\n\n strapi.documents.use(async (context, next) => {\n const schema: Schema.ContentType = context.contentType;\n\n if (!['create', 'update', 'discardDraft', 'publish'].includes(context.action)) {\n return next();\n }\n\n if (!getService('content-types').isLocalizedContentType(schema)) {\n return next();\n }\n\n // Build a populate array for all non localized fields within the schema\n const { getNestedPopulateOfNonLocalizedAttributes } = getService('content-types');\n\n const attributesToPopulate = getNestedPopulateOfNonLocalizedAttributes(schema.uid);\n\n // Get the result of the document service action\n const result = (await next()) as any;\n\n // We may not have received a result with everything populated that we need\n // Use the id and populate built from non localized fields to get the full\n // result\n let resultID;\n // TODO: fix bug where an empty array can be returned\n if (Array.isArray(result?.entries) && result.entries[0]?.id) {\n resultID = result.entries[0].id;\n } else if (result?.id) {\n resultID = result.id;\n } else {\n return result;\n }\n\n if (attributesToPopulate.length > 0) {\n const populatedResult = await strapi.db\n .query(schema.uid)\n .findOne({ where: { id: resultID }, populate: attributesToPopulate });\n\n await getService('localizations').syncNonLocalizedAttributes(populatedResult, schema);\n }\n\n return result;\n });\n};\n\nexport default async ({ strapi }: { strapi: Core.Strapi }) => {\n const { sendDidInitializeEvent } = getService('metrics');\n const { decorator } = getService('entity-service-decorator');\n const { initDefaultLocale } = getService('locales');\n const { sectionsBuilder, actions, engine } = getService('permissions');\n\n // TODO: v5 handled in the document service or via document service middlewares\n // Entity Service\n (strapi.entityService as any).decorate(decorator);\n\n // Data\n await initDefaultLocale();\n\n // Sections Builder\n sectionsBuilder.registerLocalesPropertyHandler();\n\n // Actions\n await actions.registerI18nActions();\n actions.registerI18nActionsHooks();\n actions.updateActionsProperties();\n\n // Engine/Permissions\n engine.registerI18nPermissionsHandlers();\n\n // Hooks & Models\n registerModelsHooks();\n\n sendDidInitializeEvent();\n};\n","import { get } from 'lodash/fp';\nimport { errors } from '@strapi/utils';\nimport type { Core, Struct } from '@strapi/types';\nimport { getService } from '../utils';\n\nconst { ApplicationError } = errors;\n\n// TODO: v5 if implemented in the CM => delete this middleware\nconst validateLocaleCreation: Core.MiddlewareHandler = async (ctx, next) => {\n const { model } = ctx.params;\n const { query } = ctx.request;\n\n // Prevent empty body\n if (!ctx.request.body) {\n ctx.request.body = {};\n }\n\n const body = ctx.request.body as any;\n\n const { getValidLocale, isLocalizedContentType } = getService('content-types');\n\n const modelDef = strapi.getModel(model) as Struct.ContentTypeSchema;\n\n if (!isLocalizedContentType(modelDef)) {\n return next();\n }\n\n // Prevent empty string locale\n const locale = get('locale', query) || get('locale', body) || undefined;\n\n // cleanup to avoid creating duplicates in single types\n ctx.request.query = {};\n\n let entityLocale;\n try {\n entityLocale = await getValidLocale(locale);\n } catch (e) {\n throw new ApplicationError(\"This locale doesn't exist\");\n }\n\n body.locale = entityLocale;\n\n if (modelDef.kind === 'singleType') {\n const entity = await strapi.entityService.findMany(modelDef.uid, {\n locale: entityLocale,\n } as any); // TODO: add this type to entityService\n\n ctx.request.query.locale = body.locale;\n\n // updating\n if (entity) {\n return next();\n }\n }\n\n return next();\n};\n\nexport default validateLocaleCreation;\n","import { propEq, identity } from 'lodash/fp';\nimport { errors } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\n\nconst { ValidationError } = errors;\n\nconst LOCALE_SCALAR_TYPENAME = 'I18NLocaleCode';\nconst LOCALE_ARG_PLUGIN_NAME = 'I18NLocaleArg';\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => ({\n register() {\n const { service: getGraphQLService } = strapi.plugin('graphql');\n const { service: getI18NService } = strapi.plugin('i18n');\n\n const { isLocalizedContentType } = getI18NService('content-types');\n\n const extensionService = getGraphQLService('extension');\n\n extensionService.shadowCRUD('plugin::i18n.locale').disableMutations();\n\n // Disable unwanted fields for localized content types\n Object.entries(strapi.contentTypes).forEach(([uid, ct]) => {\n if (isLocalizedContentType(ct)) {\n // Disable locale field in localized inputs\n extensionService.shadowCRUD(uid).field('locale').disableInput();\n\n // Disable localizations field in localized inputs\n extensionService.shadowCRUD(uid).field('localizations').disableInput();\n }\n });\n\n extensionService.use(({ nexus, typeRegistry }: any) => {\n const i18nLocaleArgPlugin = getI18nLocaleArgPlugin({ nexus, typeRegistry });\n const i18nLocaleScalar = getLocaleScalar({ nexus });\n return {\n plugins: [i18nLocaleArgPlugin],\n types: [i18nLocaleScalar],\n\n resolversConfig: {\n // Modify the default scope associated to find and findOne locale queries to match the actual action name\n 'Query.i18NLocale': { auth: { scope: 'plugin::i18n.locales.listLocales' } },\n 'Query.i18NLocales': { auth: { scope: 'plugin::i18n.locales.listLocales' } },\n },\n };\n });\n },\n});\n\nconst getLocaleScalar = ({ nexus }: any) => {\n const { service: getI18NService } = strapi.plugin('i18n');\n\n const locales = getI18NService('iso-locales').getIsoLocales();\n\n return nexus.scalarType({\n name: LOCALE_SCALAR_TYPENAME,\n\n description: 'A string used to identify an i18n locale',\n\n serialize: identity,\n parseValue: identity,\n\n parseLiteral(ast: any) {\n if (ast.kind !== 'StringValue') {\n throw new ValidationError('Locale cannot represent non string type');\n }\n\n const isValidLocale = ast.value === '*' || locales.find(propEq('code', ast.value));\n\n if (!isValidLocale) {\n throw new ValidationError('Unknown locale supplied');\n }\n\n return ast.value;\n },\n });\n};\n\nconst getI18nLocaleArgPlugin = ({ nexus, typeRegistry }: any) => {\n const { service: getI18NService } = strapi.plugin('i18n');\n\n const { isLocalizedContentType } = getI18NService('content-types');\n\n return nexus.plugin({\n name: LOCALE_ARG_PLUGIN_NAME,\n\n onAddOutputField(config: any) {\n // Add the locale arg to the queries on localized CTs\n\n const { parentType } = config;\n\n // Only target queries or mutations\n if (parentType !== 'Query' && parentType !== 'Mutation') {\n return;\n }\n\n let contentType;\n\n if (config?.extensions?.strapi?.contentType) {\n contentType = config.extensions.strapi.contentType;\n } else {\n const registryType = typeRegistry.get(config.type);\n\n if (!registryType) {\n return;\n }\n\n contentType = registryType.config.contentType;\n }\n\n // Ignore non-localized content types\n if (!isLocalizedContentType(contentType)) {\n return;\n }\n\n if (!config.args) {\n config.args = {};\n }\n\n config.args.locale = nexus.arg({\n type: LOCALE_SCALAR_TYPENAME,\n description: 'The locale to use for the query',\n });\n },\n });\n};\n","import isoLocales from './iso-locales.json';\n\n/**\n * Returns the default locale based either on env var or english\n * @returns {string}\n */\nconst getInitLocale = () => {\n const envLocaleCode = process.env.STRAPI_PLUGIN_I18N_INIT_LOCALE_CODE;\n\n if (envLocaleCode) {\n const matchingLocale = isoLocales.find(({ code }) => code === envLocaleCode);\n\n if (!matchingLocale) {\n throw new Error(\n 'Unknown locale code provided in the environment variable STRAPI_PLUGIN_I18N_INIT_LOCALE_CODE'\n );\n }\n\n return { ...matchingLocale };\n }\n\n return {\n code: 'en',\n name: 'English (en)',\n };\n};\n\nconst DEFAULT_LOCALE = getInitLocale();\n\nexport { isoLocales, DEFAULT_LOCALE, getInitLocale };\n","import { getService } from '../../../utils';\nimport { DEFAULT_LOCALE } from '../../../constants';\n\n// if i18N enabled set default locale\nexport default async ({ oldContentTypes, contentTypes }: any) => {\n const { isLocalizedContentType } = getService('content-types');\n const { getDefaultLocale } = getService('locales');\n\n if (!oldContentTypes) {\n return;\n }\n\n for (const uid in contentTypes) {\n if (!oldContentTypes[uid]) {\n continue;\n }\n\n const oldContentType = oldContentTypes[uid];\n const contentType = contentTypes[uid];\n\n if (!isLocalizedContentType(oldContentType) && isLocalizedContentType(contentType)) {\n const defaultLocale = (await getDefaultLocale()) || DEFAULT_LOCALE.code;\n\n await strapi.db.query(uid).updateMany({\n where: { locale: null },\n data: { locale: defaultLocale },\n });\n }\n }\n};\n","import { getService } from '../../../utils';\nimport { DEFAULT_LOCALE } from '../../../constants';\n\n// Disable i18n on CT -> Delete all entities that are not in the default locale\nexport default async ({ oldContentTypes, contentTypes }: any) => {\n const { isLocalizedContentType } = getService('content-types');\n const { getDefaultLocale } = getService('locales');\n\n if (!oldContentTypes) {\n return;\n }\n\n for (const uid in contentTypes) {\n if (!oldContentTypes[uid]) {\n continue;\n }\n\n const oldContentType = oldContentTypes[uid];\n const contentType = contentTypes[uid];\n\n // if i18N is disabled remove non default locales before sync\n if (isLocalizedContentType(oldContentType) && !isLocalizedContentType(contentType)) {\n const defaultLocale = (await getDefaultLocale()) || DEFAULT_LOCALE.code;\n\n await Promise.all([\n // Delete all entities that are not in the default locale\n strapi.db.query(uid).deleteMany({\n where: { locale: { $ne: defaultLocale } },\n }),\n // Set locale to null for the rest\n strapi.db.query(uid).updateMany({\n where: { locale: { $eq: defaultLocale } },\n data: { locale: null },\n }),\n ]);\n }\n }\n};\n","import _ from 'lodash';\nimport type { Core } from '@strapi/types';\n\nimport validateLocaleCreation from './controllers/validate-locale-creation';\nimport graphqlProvider from './graphql';\n\nimport enableContentType from './migrations/content-type/enable';\nimport disableContentType from './migrations/content-type/disable';\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n extendContentTypes(strapi);\n addContentManagerLocaleMiddleware(strapi);\n addContentTypeSyncHooks(strapi);\n};\n\n// TODO: v5 if implemented in the CM => delete this middleware\n/**\n * Adds middleware on CM creation routes to use i18n locale passed in a specific param\n * @param {Strapi} strapi\n */\nconst addContentManagerLocaleMiddleware = (strapi: Core.Strapi) => {\n strapi.server.router.use('/content-manager/collection-types/:model', (ctx, next) => {\n if (ctx.method === 'POST' || ctx.method === 'PUT') {\n return validateLocaleCreation(ctx, next);\n }\n\n return next();\n });\n\n strapi.server.router.use('/content-manager/single-types/:model', (ctx, next) => {\n if (ctx.method === 'POST' || ctx.method === 'PUT') {\n return validateLocaleCreation(ctx, next);\n }\n\n return next();\n });\n};\n\n/**\n * Adds hooks to migration content types locales on enable/disable of I18N\n * @param {Strapi} strapi\n */\nconst addContentTypeSyncHooks = (strapi: Core.Strapi) => {\n strapi.hook('strapi::content-types.beforeSync').register(disableContentType);\n strapi.hook('strapi::content-types.afterSync').register(enableContentType);\n};\n\n/**\n * Adds locale and localization fields to all content types\n * Even if content type is not localized, it will have these fields\n * @param {Strapi} strapi\n */\nconst extendContentTypes = (strapi: Core.Strapi) => {\n Object.values(strapi.contentTypes).forEach((contentType) => {\n const { attributes } = contentType;\n\n _.set(attributes, 'locale', {\n writable: true,\n private: false,\n configurable: false,\n visible: false,\n type: 'string',\n });\n });\n\n if (strapi.plugin('graphql')) {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n graphqlProvider({ strapi }).register();\n }\n};\n","import schema from './schema.json';\n\nexport default {\n schema,\n};\n","import locale from './locale';\n\nexport default {\n locale,\n};\n","import { isArray, getOr, prop } from 'lodash/fp';\nimport { getService } from '../../utils';\n\nconst actions = [\n {\n section: 'settings',\n category: 'Internationalization',\n subCategory: 'Locales',\n pluginName: 'i18n',\n displayName: 'Create',\n uid: 'locale.create',\n },\n {\n section: 'settings',\n category: 'Internationalization',\n subCategory: 'Locales',\n pluginName: 'i18n',\n displayName: 'Read',\n uid: 'locale.read',\n aliases: [\n { actionId: 'plugin::content-manager.explorer.read', subjects: ['plugin::i18n.locale'] },\n ],\n },\n {\n section: 'settings',\n category: 'Internationalization',\n subCategory: 'Locales',\n pluginName: 'i18n',\n displayName: 'Update',\n uid: 'locale.update',\n },\n {\n section: 'settings',\n category: 'Internationalization',\n subCategory: 'Locales',\n pluginName: 'i18n',\n displayName: 'Delete',\n uid: 'locale.delete',\n },\n];\n\nconst addLocalesPropertyIfNeeded = ({ value: action }: any) => {\n const {\n section,\n options: { applyToProperties },\n } = action;\n\n // Only add the locales property to contentTypes' actions\n if (section !== 'contentTypes') {\n return;\n }\n\n // If the 'locales' property is already declared within the applyToProperties array, then ignore the next steps\n if (isArray(applyToProperties) && applyToProperties.includes('locales')) {\n return;\n }\n\n // Add the 'locales' property to the applyToProperties array (create it if necessary)\n action.options.applyToProperties = isArray(applyToProperties)\n ? applyToProperties.concat('locales')\n : ['locales'];\n};\n\nconst shouldApplyLocalesPropertyToSubject = ({ property, subject }: any) => {\n if (property === 'locales') {\n const model = strapi.getModel(subject);\n\n return getService('content-types').isLocalizedContentType(model);\n }\n\n return true;\n};\n\nconst addAllLocalesToPermissions = async (permissions: any) => {\n const { actionProvider } = strapi.service('admin::permission');\n const { find: findAllLocales } = getService('locales');\n\n const allLocales = await findAllLocales();\n const allLocalesCode = allLocales.map(prop('code'));\n\n return Promise.all(\n permissions.map(async (permission: any) => {\n const { action, subject } = permission;\n\n const appliesToLocalesProperty = await actionProvider.appliesToProperty(\n 'locales',\n action,\n subject\n );\n\n if (!appliesToLocalesProperty) {\n return permission;\n }\n\n const oldPermissionProperties = getOr({}, 'properties', permission);\n\n return { ...permission, properties: { ...oldPermissionProperties, locales: allLocalesCode } };\n })\n );\n};\n\nconst syncSuperAdminPermissionsWithLocales = async () => {\n const roleService = strapi.service('admin::role');\n const permissionService = strapi.service('admin::permission');\n\n const superAdminRole = await roleService.getSuperAdmin();\n\n if (!superAdminRole) {\n return;\n }\n\n const superAdminPermissions = await permissionService.findMany({\n where: {\n role: {\n id: superAdminRole.id,\n },\n },\n });\n\n const newSuperAdminPermissions = await addAllLocalesToPermissions(superAdminPermissions);\n\n await roleService.assignPermissions(superAdminRole.id, newSuperAdminPermissions);\n};\n\nconst registerI18nActions = async () => {\n const { actionProvider } = strapi.service('admin::permission');\n\n await actionProvider.registerMany(actions);\n};\n\nconst registerI18nActionsHooks = () => {\n const { actionProvider } = strapi.service('admin::permission');\n const { hooks } = strapi.service('admin::role');\n\n actionProvider.hooks.appliesPropertyToSubject.register(shouldApplyLocalesPropertyToSubject);\n hooks.willResetSuperAdminPermissions.register(addAllLocalesToPermissions);\n};\n\nconst updateActionsProperties = () => {\n const { actionProvider } = strapi.service('admin::permission');\n\n // Register the transformation for every new action\n actionProvider.hooks.willRegister.register(addLocalesPropertyIfNeeded);\n\n // Handle already registered actions\n actionProvider.values().forEach((action: any) => addLocalesPropertyIfNeeded({ value: action }));\n};\n\nexport default {\n actions,\n registerI18nActions,\n registerI18nActionsHooks,\n updateActionsProperties,\n syncSuperAdminPermissionsWithLocales,\n};\n","import { isEmpty } from 'lodash/fp';\n\nimport { getService } from '../../utils';\n\n/**\n * Handler for the permissions layout (sections builder)\n * Adds the locales property to the subjects\n * @param {Action} action\n * @param {ContentTypesSection} section\n * @return {Promise<void>}\n */\nconst localesPropertyHandler = async ({ action, section }: any) => {\n const { actionProvider } = strapi.service('admin::permission');\n\n const locales = await getService('locales').find();\n\n // Do not add the locales property if there is none registered\n if (isEmpty(locales)) {\n return;\n }\n\n for (const subject of section.subjects) {\n const applies = await actionProvider.appliesToProperty('locales', action.actionId, subject.uid);\n const hasLocalesProperty = subject.properties.find(\n (property: any) => property.value === 'locales'\n );\n\n if (applies && !hasLocalesProperty) {\n subject.properties.push({\n label: 'Locales',\n value: 'locales',\n children: locales.map(({ name, code }: any) => ({ label: name || code, value: code })),\n });\n }\n }\n};\n\nconst registerLocalesPropertyHandler = () => {\n const { sectionsBuilder } = strapi.service('admin::permission');\n\n sectionsBuilder.addHandler('singleTypes', localesPropertyHandler);\n sectionsBuilder.addHandler('collectionTypes', localesPropertyHandler);\n};\n\nexport default {\n localesPropertyHandler,\n registerLocalesPropertyHandler,\n};\n","import { getService } from '../../utils';\n\n/**\n * @typedef {object} WillRegisterPermissionContext\n * @property {Permission} permission\n * @property {object} user\n * @property {object} condition\n */\n\n/**\n * Locales property handler for the permission engine\n * Add the has-locale-access condition if the locales property is defined\n * @param {WillRegisterPermissionContext} context\n */\nconst willRegisterPermission = (context: any) => {\n const { permission, condition, user } = context;\n const { subject, properties } = permission;\n\n const isSuperAdmin = strapi.service('admin::role').hasSuperAdminRole(user);\n\n if (isSuperAdmin) {\n return;\n }\n\n const { locales } = properties || {};\n const { isLocalizedContentType } = getService('content-types');\n\n // If there is no subject defined, ignore the permission\n if (!subject) {\n return;\n }\n\n const ct = strapi.contentTypes[subject];\n\n // If the subject exists but isn't localized, ignore the permission\n if (!isLocalizedContentType(ct)) {\n return;\n }\n\n // If the subject is localized but the locales property is null (access to all locales), ignore the permission\n if (locales === null) {\n return;\n }\n\n condition.and({\n locale: {\n $in: locales || [],\n },\n });\n};\n\nconst registerI18nPermissionsHandlers = () => {\n const { engine } = strapi.service('admin::permission');\n\n engine.hooks['before-register.permission'].register(willRegisterPermission);\n};\n\nexport default {\n willRegisterPermission,\n registerI18nPermissionsHandlers,\n};\n","import i18nActionsService from './permissions/actions';\nimport sectionsBuilderService from './permissions/sections-builder';\nimport engineService from './permissions/engine';\n\nconst permissions = () => ({\n actions: i18nActionsService,\n sectionsBuilder: sectionsBuilderService,\n engine: engineService,\n});\n\ntype PermissionsService = typeof permissions;\n\nexport default permissions;\nexport type { PermissionsService };\n","import { reduce } from 'lodash/fp';\nimport { getService } from '../utils';\n\nconst sendDidInitializeEvent = async () => {\n const { isLocalizedContentType } = getService('content-types');\n\n // TODO: V5: This event should be renamed numberOfContentTypes in V5 as the name is already taken to describe the number of content types using i18n.\n const numberOfContentTypes = reduce(\n (sum, contentType) => (isLocalizedContentType(contentType) ? sum + 1 : sum),\n 0\n )(strapi.contentTypes as any);\n\n await strapi.telemetry.send('didInitializeI18n', { groupProperties: { numberOfContentTypes } });\n};\n\nconst sendDidUpdateI18nLocalesEvent = async () => {\n const numberOfLocales = await getService('locales').count();\n\n await strapi.telemetry.send('didUpdateI18nLocales', {\n groupProperties: { numberOfLocales },\n });\n};\n\nconst metrics = () => ({\n sendDidInitializeEvent,\n sendDidUpdateI18nLocalesEvent,\n});\n\ntype MetricsService = typeof metrics;\n\nexport default metrics;\nexport type { MetricsService };\n","import { cloneDeep, isEmpty } from 'lodash/fp';\n\nimport { type Schema } from '@strapi/types';\nimport { async } from '@strapi/utils';\nimport { getService } from '../utils';\n\n/**\n * Update non localized fields of all the related localizations of an entry with the entry values\n */\nconst syncNonLocalizedAttributes = async (sourceEntry: any, model: Schema.ContentType) => {\n const { copyNonLocalizedAttributes } = getService('content-types');\n\n const nonLocalizedAttributes = copyNonLocalizedAttributes(model, sourceEntry);\n if (isEmpty(nonLocalizedAttributes)) {\n return;\n }\n\n const uid = model.uid;\n const documentId = sourceEntry.documentId;\n const locale = sourceEntry.locale;\n const status = sourceEntry?.publishedAt ? 'published' : 'draft';\n\n // Find all the entries that need to be updated\n // this is every other entry of the document in the same status but a different locale\n const localeEntriesToUpdate = await strapi.db.query(uid).findMany({\n where: {\n documentId,\n publishedAt: status === 'published' ? { $ne: null } : null,\n locale: { $ne: locale },\n },\n select: ['locale', 'id'],\n });\n\n const entryData = await strapi.documents(uid).omitComponentData(nonLocalizedAttributes);\n\n await async.map(localeEntriesToUpdate, async (entry: any) => {\n const transformedData = await strapi.documents.utils.transformData(\n cloneDeep(nonLocalizedAttributes),\n {\n uid,\n status,\n locale: entry.locale,\n allowMissingId: true,\n }\n );\n\n // Update or create non localized components for the entry\n const componentData = await strapi\n .documents(uid)\n .updateComponents(entry, transformedData as any);\n\n // Update every other locale entry of this documentId in the same status\n await strapi.db.query(uid).update({\n where: {\n documentId,\n publishedAt: status === 'published' ? { $ne: null } : null,\n locale: { $eq: entry.locale },\n },\n // The data we send to the update function is the entry data merged with\n // the updated component data\n data: Object.assign(cloneDeep(entryData), componentData),\n });\n });\n};\n\nconst localizations = () => ({\n syncNonLocalizedAttributes,\n});\n\ntype LocalizationsService = typeof localizations;\n\nexport default localizations;\nexport type { LocalizationsService };\n","import { isNil } from 'lodash/fp';\nimport { DEFAULT_LOCALE } from '../constants';\nimport { getService, getCoreStore } from '../utils';\n\nconst find = (params: any = {}) =>\n strapi.db.query('plugin::i18n.locale').findMany({ where: params });\n\nconst findById = (id: any) => strapi.db.query('plugin::i18n.locale').findOne({ where: { id } });\n\nconst findByCode = (code: any) =>\n strapi.db.query('plugin::i18n.locale').findOne({ where: { code } });\n\nconst count = (params: any = {}) => strapi.db.query('plugin::i18n.locale').count({ where: params });\n\nconst create = async (locale: any) => {\n const result = await strapi.db.query('plugin::i18n.locale').create({ data: locale });\n\n getService('metrics').sendDidUpdateI18nLocalesEvent();\n\n return result;\n};\n\nconst update = async (params: any, updates: any) => {\n const result = await strapi.db\n .query('plugin::i18n.locale')\n .update({ where: params, data: updates });\n\n getService('metrics').sendDidUpdateI18nLocalesEvent();\n\n return result;\n};\n\nconst deleteFn = async ({ id }: any) => {\n const localeToDelete = await findById(id);\n\n if (localeToDelete) {\n await deleteAllLocalizedEntriesFor({ locale: localeToDelete.code });\n const result = await strapi.db.query('plugin::i18n.locale').delete({ where: { id } });\n\n getService('metrics').sendDidUpdateI18nLocalesEvent();\n\n return result;\n }\n\n return localeToDelete;\n};\n\nconst setDefaultLocale = ({ code }: any) =>\n getCoreStore().set({ key: 'default_locale', value: code });\n\nconst getDefaultLocale = () => getCoreStore().get({ key: 'default_locale' });\n\nconst setIsDefault = async (locales: any) => {\n if (isNil(locales)) {\n return locales;\n }\n\n const actualDefault = await getDefaultLocale();\n\n if (Array.isArray(locales)) {\n return locales.map((locale) => ({ ...locale, isDefault: actualDefault === locale.code }));\n }\n // single locale\n return { ...locales, isDefault: actualDefault === locales.code };\n};\n\nconst initDefaultLocale = async () => {\n const existingLocalesNb = await strapi.db.query('plugin::i18n.locale').count();\n if (existingLocalesNb === 0) {\n await create(DEFAULT_LOCALE);\n await setDefaultLocale({ code: DEFAULT_LOCALE.code });\n }\n};\n\nconst deleteAllLocalizedEntriesFor = async ({ locale }: any) => {\n const { isLocalizedContentType } = getService('content-types');\n\n const localizedModels = Object.values(strapi.contentTypes).filter(isLocalizedContentType);\n\n for (const model of localizedModels) {\n // FIXME: delete many content & their associations\n await strapi.db.query(model.uid).deleteMany({ where: { locale } });\n }\n};\n\nconst locales = () => ({\n find,\n findById,\n findByCode,\n create,\n update,\n count,\n setDefaultLocale,\n getDefaultLocale,\n setIsDefault,\n delete: deleteFn,\n initDefaultLocale,\n});\n\ntype LocaleService = typeof locales;\n\nexport default locales;\nexport type { LocaleService };\n","import { isoLocales } from '../constants';\n\nconst getIsoLocales = () => isoLocales;\n\nconst isoLocalesService = () => ({\n getIsoLocales,\n});\n\ntype ISOLocalesService = typeof isoLocalesService;\n\nexport default isoLocalesService;\nexport type { ISOLocalesService };\n","import { has, get, omit, isArray } from 'lodash/fp';\nimport type { Schema } from '@strapi/types';\n\nimport { getService } from '../utils';\n\nconst LOCALE_QUERY_FILTER = 'locale';\nconst SINGLE_ENTRY_ACTIONS = ['findOne', 'update', 'delete'];\nconst BULK_ACTIONS = ['delete'];\n\nconst paramsContain = (key: any, params: any) => {\n return (\n has(key, params.filters) ||\n (isArray(params.filters) && params.filters.some((clause: any) => has(key, clause))) ||\n (isArray(get('$and', params.filters)) &&\n params.filters.$and.some((clause: any) => has(key, clause)))\n );\n};\n\n/**\n * Adds default locale or replaces locale by locale in query params\n * @param {object} params - query params\n * @param {object} ctx\n */\nconst wrapParams = async (params: any = {}, ctx: any = {}) => {\n const { action } = ctx;\n\n if (has(LOCALE_QUERY_FILTER, params)) {\n if (params[LOCALE_QUERY_FILTER] === 'all') {\n return omit(LOCALE_QUERY_FILTER, params);\n }\n\n return {\n ...omit(LOCALE_QUERY_FILTER, params),\n filters: {\n $and: [{ locale: params[LOCALE_QUERY_FILTER] }].concat(params.filters || []),\n },\n };\n }\n\n const entityDefinedById = paramsContain('id', params) && SINGLE_ENTRY_ACTIONS.includes(action);\n const entitiesDefinedByIds = paramsContain('id.$in', params) && BULK_ACTIONS.includes(action);\n\n if (entityDefinedById || entitiesDefinedByIds) {\n return params;\n }\n\n const { getDefaultLocale } = getService('locales');\n\n return {\n ...params,\n filters: {\n $and: [{ locale: await getDefaultLocale() }].concat(params.filters || []),\n },\n };\n};\n\n/**\n * Decorates the entity service with I18N business logic\n * @param {object} service - entity service\n */\nconst decorator = (service: any) => ({\n /**\n * Wraps result\n * @param {object} result - result object of query\n * @param {object} ctx - Query context\n * @param {object} ctx.model - Model that is being used\n */\n async wrapResult(result = {}, ctx = {}) {\n return service.wrapResult.call(this, result, ctx);\n },\n\n /**\n * Wraps query options. In particular will add default locale to query params\n * @param {object} params - Query options object (params, data, files, populate)\n * @param {object} ctx - Query context\n * @param {object} ctx.model - Model that is being used\n */\n async wrapParams(params: any = {}, ctx: any = {}) {\n const wrappedParams = await service.wrapParams.call(this, params, ctx);\n\n const model = strapi.getModel(ctx.uid);\n\n const { isLocalizedContentType } = getService('content-types');\n\n if (!isLocalizedContentType(model)) {\n return wrappedParams;\n }\n\n return wrapParams(wrappedParams, ctx);\n },\n\n /**\n * Find an entry or several if fetching all locales\n * @param {string} uid - Model uid\n * @param {object} opts - Query options object (params, data, files, populate)\n */\n async findMany(uid: any, opts: any) {\n const model = strapi.getModel(uid) as Schema.ContentType;\n\n const { isLocalizedContentType } = getService('content-types');\n\n if (!isLocalizedContentType(model)) {\n return service.findMany.call(this, uid, opts);\n }\n\n const { kind } = model;\n\n if (kind === 'singleType') {\n if (opts[LOCALE_QUERY_FILTER] === 'all') {\n // TODO Fix so this won't break lower lying find many wrappers\n const wrappedParams = await this.wrapParams(opts, { uid, action: 'findMany' });\n const query = strapi.get('query-params').transform(uid, wrappedParams);\n const entities = await strapi.db.query(uid).findMany(query);\n return this.wrapResult(entities, { uid, action: 'findMany' });\n }\n\n // This one gets transformed into a findOne on a lower layer\n return service.findMany.call(this, uid, opts);\n }\n\n return service.findMany.call(this, uid, opts);\n },\n});\n\nconst entityServiceDecorator = () => ({\n decorator,\n wrapParams,\n});\n\ntype EntityServiceDecoratorService = typeof entityServiceDecorator;\n\nexport default entityServiceDecorator;\nexport type { EntityServiceDecoratorService };\n","import _ from 'lodash';\nimport { pick, pipe, has, prop, isNil, cloneDeep, isArray } from 'lodash/fp';\nimport { errors, contentTypes as contentTypeUtils } from '@strapi/utils';\nimport { getService } from '../utils';\n\nconst {\n isRelationalAttribute,\n getVisibleAttributes,\n isTypedAttribute,\n getScalarAttributes,\n getRelationalAttributes,\n} = contentTypeUtils;\nconst { ApplicationError } = errors;\n\nconst hasLocalizedOption = (modelOrAttribute: any) => {\n return prop('pluginOptions.i18n.localized', modelOrAttribute) === true;\n};\n\nconst getValidLocale = async (locale: any) => {\n const localesService = getService('locales');\n\n if (isNil(locale)) {\n return localesService.getDefaultLocale();\n }\n\n const foundLocale = await localesService.findByCode(locale);\n if (!foundLocale) {\n throw new ApplicationError('Locale not found');\n }\n\n return locale;\n};\n\n/**\n * Returns whether an attribute is localized or not\n * @param {*} attribute\n * @returns\n */\nconst isLocalizedAttribute = (attribute: any) => {\n return (\n hasLocalizedOption(attribute) ||\n isRelationalAttribute(attribute) ||\n isTypedAttribute(attribute, 'uid')\n );\n};\n\n/**\n * Returns whether a model is localized or not\n * @param {*} model\n * @returns\n */\nconst isLocalizedContentType = (model: any) => {\n return hasLocalizedOption(model);\n};\n\n/**\n * Returns the list of attribute names that are not localized\n * @param {object} model\n * @returns {string[]}\n */\nconst getNonLocalizedAttributes = (model: any) => {\n return getVisibleAttributes(model).filter(\n (attrName) => !isLocalizedAttribute(model.attributes[attrName])\n );\n};\n\nconst removeId = (value: any) => {\n if (typeof value === 'object' && has('id', value)) {\n delete value.id;\n }\n};\n\nconst removeIds = (model: any) => (entry: any) => removeIdsMut(model, cloneDeep(entry));\n\nconst removeIdsMut = (model: any, entry: any) => {\n if (isNil(entry)) {\n return entry;\n }\n\n removeId(entry);\n\n _.forEach(model.attributes, (attr, attrName) => {\n const value = entry[attrName];\n if (attr.type === 'dynamiczone' && isArray(value)) {\n value.forEach((compo) => {\n if (has('__component', compo)) {\n const model = strapi.components[compo.__component];\n removeIdsMut(model, compo);\n }\n });\n } else if (attr.type === 'component') {\n const model = strapi.components[attr.component];\n if (isArray(value)) {\n value.forEach((compo) => removeIdsMut(model, compo));\n } else {\n removeIdsMut(model, value);\n }\n }\n });\n\n return entry;\n};\n\n/**\n * Returns a copy of an entry picking only its non localized attributes\n * @param {object} model\n * @param {object} entry\n * @returns {object}\n */\nconst copyNonLocalizedAttributes = (model: any, entry: any) => {\n const nonLocalizedAttributes = getNonLocalizedAttributes(model);\n\n return pipe(pick(nonLocalizedAttributes), removeIds(model))(entry);\n};\n\n/**\n * Returns the list of attribute names that are localized\n * @param {object} model\n * @returns {string[]}\n */\nconst getLocalizedAttributes = (model: any) => {\n return getVisibleAttributes(model).filter((attrName) =>\n isLocalizedAttribute(model.attributes[attrName])\n );\n};\n\n/**\n * Fill non localized fields of an entry if there are nil\n * @param {Object} entry entry to fill\n * @param {Object} relatedEntry values used to fill\n * @param {Object} options\n * @param {Object} options.model corresponding model\n */\nconst fillNonLocalizedAttributes = (entry: any, relatedEntry: any, { model }: any) => {\n if (isNil(relatedEntry)) {\n return;\n }\n\n const modelDef = strapi.getModel(model);\n const relatedEntryCopy = copyNonLocalizedAttributes(modelDef, relatedEntry);\n\n _.forEach(relatedEntryCopy, (value, field) => {\n if (isNil(entry[field])) {\n entry[field] = value;\n }\n });\n};\n\n/**\n * build the populate param to\n * @param {String} modelUID uid of the model, could be of a content-type or a component\n */\nconst getNestedPopulateOfNonLocalizedAttributes = (modelUID: any) => {\n const schema = strapi.getModel(modelUID);\n const scalarAttributes = getScalarAttributes(schema);\n const nonLocalizedAttributes = getNonLocalizedAttributes(schema);\n\n const allAttributes = [...scalarAttributes, ...nonLocalizedAttributes];\n if (schema.modelType === 'component') {\n // When called recursively on a non localized component we\n // need to explicitly populate that components relations\n allAttributes.push(...getRelationalAttributes(schema));\n }\n\n const currentAttributesToPopulate = allAttributes.filter((value, index, self) => {\n return self.indexOf(value) === index && self.lastIndexOf(value) === index;\n });\n\n const attributesToPopulate = [...currentAttributesToPopulate];\n for (const attrName of currentAttributesToPopulate) {\n const attr = schema.attributes[attrName];\n if (attr.type === 'component') {\n const nestedPopulate = getNestedPopulateOfNonLocalizedAttributes(attr.component).map(\n (nestedAttr) => `${attrName}.${nestedAttr}`\n );\n attributesToPopulate.push(...nestedPopulate);\n } else if (attr.type === 'dynamiczone') {\n attr.components.forEach((componentName) => {\n const nestedPopulate = getNestedPopulateOfNonLocalizedAttributes(componentName).map(\n (nestedAttr) => `${attrName}.${nestedAttr}`\n );\n attributesToPopulate.push(...nestedPopulate);\n });\n }\n }\n\n return attributesToPopulate;\n};\n\nconst contentTypes = () => ({\n isLocalizedContentType,\n getValidLocale,\n getLocalizedAttributes,\n getNonLocalizedAttributes,\n copyNonLocalizedAttributes,\n fillNonLocalizedAttributes,\n getNestedPopulateOfNonLocalizedAttributes,\n});\n\ntype ContentTypesService = typeof contentTypes;\n\nexport default contentTypes;\nexport { ContentTypesService };\n","import permissions from './permissions';\nimport metrics from './metrics';\nimport localizations from './localizations';\nimport locales from './locales';\nimport isoLocales from './iso-locales';\nimport entityServiceDecorator from './entity-service-decorator';\nimport contentTypes from './content-types';\n\nexport default {\n permissions,\n metrics,\n localizations,\n locales,\n 'iso-locales': isoLocales,\n 'entity-service-decorator': entityServiceDecorator,\n 'content-types': contentTypes,\n};\n","export default {\n type: 'admin',\n routes: [\n {\n method: 'GET',\n path: '/iso-locales',\n handler: 'iso-locales.listIsoLocales',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.read'] },\n },\n ],\n },\n },\n {\n method: 'GET',\n path: '/locales',\n handler: 'locales.listLocales',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'POST',\n path: '/locales',\n handler: 'locales.createLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.create'] },\n },\n ],\n },\n },\n {\n method: 'PUT',\n path: '/locales/:id',\n handler: 'locales.updateLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.update'] },\n },\n ],\n },\n },\n {\n method: 'DELETE',\n path: '/locales/:id',\n handler: 'locales.deleteLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.delete'] },\n },\n ],\n },\n },\n {\n method: 'POST',\n path: '/content-manager/actions/get-non-localized-fields',\n handler: 'content-types.getNonLocalizedAttributes',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n ],\n};\n","export default {\n type: 'content-api',\n routes: [\n {\n method: 'GET',\n path: '/locales',\n handler: 'locales.listLocales',\n },\n ],\n};\n","import admin from './admin';\nimport contentApi from './content-api';\n\nexport default {\n admin,\n 'content-api': contentApi,\n};\n","import { prop } from 'lodash/fp';\nimport { yup, validateYupSchema } from '@strapi/utils';\n\nimport { isoLocales } from '../constants';\n\nconst allowedLocaleCodes = isoLocales.map(prop('code'));\n\nconst createLocaleSchema = yup\n .object()\n .shape({\n name: yup.string().max(50).nullable(),\n code: yup.string().oneOf(allowedLocaleCodes).required(),\n isDefault: yup.boolean().required(),\n })\n .noUnknown();\n\nconst updateLocaleSchema = yup\n .object()\n .shape({\n name: yup.string().min(1).max(50).nullable(),\n isDefault: yup.boolean(),\n })\n .noUnknown();\n\nconst validateCreateLocaleInput = validateYupSchema(createLocaleSchema);\nconst validateUpdateLocaleInput = validateYupSchema(updateLocaleSchema);\n\nexport { validateCreateLocaleInput, validateUpdateLocaleInput };\n","const formatLocale = (locale: { name: string; code: string; isDefault: boolean }) => {\n return {\n ...locale,\n name: locale.name || null,\n };\n};\n\nexport { formatLocale };\n","import * as utils from '@strapi/utils';\nimport { pick } from 'lodash/fp';\nimport type { Core } from '@strapi/types';\nimport { getService } from '../utils';\nimport { validateCreateLocaleInput, validateUpdateLocaleInput } from '../validation/locales';\nimport { formatLocale } from '../domain/locale';\n\nconst { setCreatorFields } = utils;\nconst { ApplicationError } = utils.errors;\n\nconst sanitizeLocale = (locale: any) => {\n const model = strapi.getModel('plugin::i18n.locale');\n\n return strapi.contentAPI.sanitize.output(locale, model);\n};\n\nconst controller: Core.Controller = {\n async listLocales(ctx) {\n const localesService = getService('locales');\n\n const locales = await localesService.find();\n const sanitizedLocales = await sanitizeLocale(locales);\n\n ctx.body = await localesService.setIsDefault(sanitizedLocales);\n },\n\n async createLocale(ctx) {\n const { user } = ctx.state;\n const body = ctx.request.body as any;\n const { isDefault, ...localeToCreate } = body;\n\n await validateCreateLocaleInput(body);\n\n const localesService = getService('locales');\n\n const existingLocale = await localesService.findByCode(body.code);\n if (existingLocale) {\n throw new ApplicationError('This locale already exists');\n }\n\n const localeToPersist = setCreatorFields({ user })(formatLocale(localeToCreate));\n\n const locale = await localesService.create(localeToPersist);\n\n if (isDefault) {\n await localesService.setDefaultLocale(locale);\n }\n\n const sanitizedLocale = await sanitizeLocale(locale);\n\n ctx.body = await localesService.setIsDefault(sanitizedLocale);\n },\n\n async updateLocale(ctx) {\n const { user } = ctx.state;\n const { id } = ctx.params;\n const body = ctx.request.body as any;\n const { isDefault, ...updates } = body;\n\n await validateUpdateLocaleInput(body);\n\n const localesService = getService('locales');\n\n const existingLocale = await localesService.findById(id);\n if (!existingLocale) {\n return ctx.notFound('locale.notFound');\n }\n\n const allowedParams = ['name'];\n const cleanUpdates = setCreatorFields({ user, isEdition: true })(pick(allowedParams, updates));\n\n const updatedLocale = await localesService.update({ id }, cleanUpdates);\n\n if (isDefault) {\n await localesService.setDefaultLocale(updatedLocale);\n }\n\n const sanitizedLocale = await sanitizeLocale(updatedLocale);\n\n ctx.body = await localesService.setIsDefault(sanitizedLocale);\n },\n\n async deleteLocale(ctx) {\n const { id } = ctx.params;\n\n const localesService = getService('locales');\n\n const existingLocale = await localesService.findById(id);\n if (!existingLocale) {\n return ctx.notFound('locale.notFound');\n }\n\n const defaultLocaleCode = await localesService.getDefaultLocale();\n if (existingLocale.code === defaultLocaleCode) {\n throw new ApplicationError('Cannot delete the default locale');\n }\n\n await localesService.delete({ id });\n\n const sanitizedLocale = await sanitizeLocale(existingLocale);\n\n ctx.body = await localesService.setIsDefault(sanitizedLocale);\n },\n};\n\nexport default controller;\n","import { yup, validateYupSchema } from '@strapi/utils';\n\nimport { get } from 'lodash/fp';\n\nconst validateGetNonLocalizedAttributesSchema = yup\n .object()\n .shape({\n model: yup.string().required(),\n id: yup.mixed().when('model', {\n is: (model: any) => get('kind', strapi.contentType(model)) === 'singleType',\n then: yup.strapiID().nullable(),\n otherwise: yup.strapiID().required(),\n }),\n locale: yup.string().required(),\n })\n .noUnknown()\n .required();\n\nconst validateGetNonLocalizedAttributesInput = validateYupSchema(\n validateGetNonLocalizedAttributesSchema\n);\n\nexport { validateGetNonLocalizedAttributesInput };\n","import { pick, uniq, prop, getOr, flatten, pipe, map } from 'lodash/fp';\nimport { contentTypes as contentTypesUtils, errors } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\nimport { getService } from '../utils';\nimport { validateGetNonLocalizedAttributesInput } from '../validation/content-types';\n\nconst { ApplicationError } = errors;\n\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypesUtils.constants;\n\nconst getLocalesProperty = getOr<string[]>([], 'properties.locales');\nconst getFieldsProperty = prop('properties.fields');\n\nconst getFirstLevelPath = map((path: string) => path.split('.')[0]);\n\nconst controller = {\n async getNonLocalizedAttributes(ctx) {\n const { user } = ctx.state;\n const body = ctx.request.body as any;\n const { model, id, locale } = body;\n\n await validateGetNonLocalizedAttributesInput({ model, id, locale });\n\n const {\n copyNonLocalizedAttributes,\n isLocalizedContentType,\n getNestedPopulateOfNonLocalizedAttributes,\n } = getService('content-types');\n\n const {\n default: { READ_ACTION, CREATE_ACTION },\n } = strapi.service('admin::constants');\n\n const modelDef = strapi.contentType(model);\n const attributesToPopulate = getNestedPopulateOfNonLocalizedAttributes(model);\n\n if (!isLocalizedContentType(modelDef)) {\n throw new ApplicationError(`Model ${model} is not localized`);\n }\n\n const params = modelDef.kind === 'singleType' ? {} : { id };\n\n const entity = await strapi.db\n .query(model)\n .findOne({ where: params, populate: attributesToPopulate });\n\n if (!entity) {\n return ctx.notFound();\n }\n\n const permissions = await strapi.admin.services.permission.findMany({\n where: {\n action: [READ_ACTION, CREATE_ACTION],\n subject: model,\n role: {\n id: user.roles.map(prop('id')),\n },\n },\n });\n\n const localePermissions = permissions\n .filter((perm: any) => getLocalesProperty(perm).includes(locale))\n .map(getFieldsProperty);\n\n const permittedFields = pipe(flatten, getFirstLevelPath, uniq)(localePermissions);\n\n const nonLocalizedFields = copyNonLocalizedAttributes(modelDef, entity);\n const sanitizedNonLocalizedFields = pick(permittedFields, nonLocalizedFields);\n\n const availableLocalesResult = await strapi.plugins['content-manager']\n .service('document-metadata')\n .getMetadata(model, entity, {\n availableLocales: true,\n });\n\n const availableLocales = availableLocalesResult.availableLocales.map((localeResult: any) =>\n pick(['id', 'locale', PUBLISHED_AT_ATTRIBUTE], localeResult)\n );\n\n ctx.body = {\n nonLocalizedFields: sanitizedNonLocalizedFields,\n localizations: availableLocales.concat(\n pick(['id', 'locale', PUBLISHED_AT_ATTRIBUTE], entity)\n ),\n };\n },\n} satisfies Core.Controller;\n\nexport default controller;\n","import type { Core } from '@strapi/types';\nimport { getService } from '../utils';\n\nconst controller: Core.Controller = {\n listIsoLocales(ctx) {\n const isoLocalesService = getService('iso-locales');\n\n ctx.body = isoLocalesService.getIsoLocales();\n },\n};\n\nexport default controller;\n","import locales from './locales';\nimport contentTypes from './content-types';\nimport isoLocales from './iso-locales';\n\nexport default {\n locales,\n 'iso-locales': isoLocales,\n 'content-types': contentTypes,\n};\n","import bootstrap from './bootstrap';\nimport register from './register';\nimport contentTypes from './content-types';\nimport services from './services';\nimport routes from './routes';\nimport controllers from './controllers';\n\nexport default () => ({\n register,\n bootstrap,\n routes,\n controllers,\n contentTypes,\n services,\n});\n"],"names":["schema","getNestedPopulateOfNonLocalizedAttributes","strapi","sendDidInitializeEvent","decorator","initDefaultLocale","actions","ApplicationError","getValidLocale","isLocalizedContentType","locale","locales","contentTypes","getDefaultLocale","attributes","permissions","copyNonLocalizedAttributes","contentTypeUtils","model","index","isoLocales","controller","contentTypesUtils","isoLocalesService"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
1
+ {"version":3,"file":"index.mjs","sources":["../../server/src/utils/index.ts","../../server/src/bootstrap.ts","../../server/src/controllers/validate-locale-creation.ts","../../server/src/graphql.ts","../../server/src/constants/index.ts","../../server/src/migrations/content-type/enable/index.ts","../../server/src/migrations/content-type/disable/index.ts","../../server/src/register.ts","../../server/src/content-types/locale/index.ts","../../server/src/content-types/index.ts","../../server/src/services/permissions/actions.ts","../../server/src/services/permissions/sections-builder.ts","../../server/src/services/permissions/engine.ts","../../server/src/services/permissions.ts","../../server/src/services/metrics.ts","../../server/src/services/localizations.ts","../../server/src/services/locales.ts","../../server/src/services/iso-locales.ts","../../server/src/services/content-types.ts","../../server/src/services/index.ts","../../server/src/routes/admin.ts","../../server/src/routes/content-api.ts","../../server/src/routes/index.ts","../../server/src/validation/locales.ts","../../server/src/domain/locale.ts","../../server/src/controllers/locales.ts","../../server/src/validation/content-types.ts","../../server/src/controllers/content-types.ts","../../server/src/controllers/iso-locales.ts","../../server/src/controllers/index.ts","../../server/src/index.ts"],"sourcesContent":["import type { LocaleService } from '../services/locales';\nimport type { PermissionsService } from '../services/permissions';\nimport type { ContentTypesService } from '../services/content-types';\nimport type { MetricsService } from '../services/metrics';\nimport type { ISOLocalesService } from '../services/iso-locales';\nimport type { LocalizationsService } from '../services/localizations';\n\ntype S = {\n permissions: PermissionsService;\n metrics: MetricsService;\n locales: LocaleService;\n localizations: LocalizationsService;\n ['iso-locales']: ISOLocalesService;\n ['content-types']: ContentTypesService;\n};\n\nconst getCoreStore = () => {\n return strapi.store({ type: 'plugin', name: 'i18n' });\n};\n\n// retrieve a local service\nconst getService = <T extends keyof S>(name: T): ReturnType<S[T]> => {\n return strapi.plugin('i18n').service(name);\n};\n\nexport { getService, getCoreStore };\n","import type { Schema } from '@strapi/types';\nimport { getService } from './utils';\n\nconst registerModelsHooks = () => {\n strapi.db.lifecycles.subscribe({\n models: ['plugin::i18n.locale'],\n\n async afterCreate() {\n await getService('permissions').actions.syncSuperAdminPermissionsWithLocales();\n },\n\n async afterDelete() {\n await getService('permissions').actions.syncSuperAdminPermissionsWithLocales();\n },\n });\n\n strapi.documents.use(async (context, next) => {\n const schema: Schema.ContentType = context.contentType;\n\n if (!['create', 'update', 'discardDraft', 'publish'].includes(context.action)) {\n return next();\n }\n\n if (!getService('content-types').isLocalizedContentType(schema)) {\n return next();\n }\n\n // Build a populate array for all non localized fields within the schema\n const { getNestedPopulateOfNonLocalizedAttributes } = getService('content-types');\n\n const attributesToPopulate = getNestedPopulateOfNonLocalizedAttributes(schema.uid);\n\n // Get the result of the document service action\n const result = (await next()) as any;\n\n // We may not have received a result with everything populated that we need\n // Use the id and populate built from non localized fields to get the full\n // result\n let resultID;\n // TODO: fix bug where an empty array can be returned\n if (Array.isArray(result?.entries) && result.entries[0]?.id) {\n resultID = result.entries[0].id;\n } else if (result?.id) {\n resultID = result.id;\n } else {\n return result;\n }\n\n if (attributesToPopulate.length > 0) {\n const populatedResult = await strapi.db\n .query(schema.uid)\n .findOne({ where: { id: resultID }, populate: attributesToPopulate });\n\n await getService('localizations').syncNonLocalizedAttributes(populatedResult, schema);\n }\n\n return result;\n });\n};\n\nexport default async () => {\n const { sendDidInitializeEvent } = getService('metrics');\n const { initDefaultLocale } = getService('locales');\n const { sectionsBuilder, actions, engine } = getService('permissions');\n\n // Data\n await initDefaultLocale();\n\n // Sections Builder\n sectionsBuilder.registerLocalesPropertyHandler();\n\n // Actions\n await actions.registerI18nActions();\n actions.registerI18nActionsHooks();\n actions.updateActionsProperties();\n\n // Engine/Permissions\n engine.registerI18nPermissionsHandlers();\n\n // Hooks & Models\n registerModelsHooks();\n\n sendDidInitializeEvent();\n};\n","import { get } from 'lodash/fp';\nimport { errors } from '@strapi/utils';\nimport type { Core, Struct } from '@strapi/types';\nimport { getService } from '../utils';\n\nconst { ApplicationError } = errors;\n\n// TODO: v5 if implemented in the CM => delete this middleware\nconst validateLocaleCreation: Core.MiddlewareHandler = async (ctx, next) => {\n const { model } = ctx.params;\n const { query } = ctx.request;\n\n // Prevent empty body\n if (!ctx.request.body) {\n ctx.request.body = {};\n }\n\n const body = ctx.request.body as any;\n\n const { getValidLocale, isLocalizedContentType } = getService('content-types');\n\n const modelDef = strapi.getModel(model) as Struct.ContentTypeSchema;\n\n if (!isLocalizedContentType(modelDef)) {\n return next();\n }\n\n // Prevent empty string locale\n const locale = get('locale', query) || get('locale', body) || undefined;\n\n // cleanup to avoid creating duplicates in single types\n ctx.request.query = {};\n\n let entityLocale;\n try {\n entityLocale = await getValidLocale(locale);\n } catch (e) {\n throw new ApplicationError(\"This locale doesn't exist\");\n }\n\n body.locale = entityLocale;\n\n if (modelDef.kind === 'singleType') {\n const entity = await strapi.entityService.findMany(modelDef.uid, {\n locale: entityLocale,\n } as any); // TODO: add this type to entityService\n\n ctx.request.query.locale = body.locale;\n\n // updating\n if (entity) {\n return next();\n }\n }\n\n return next();\n};\n\nexport default validateLocaleCreation;\n","import { propEq, identity } from 'lodash/fp';\nimport { errors } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\n\nconst { ValidationError } = errors;\n\nconst LOCALE_SCALAR_TYPENAME = 'I18NLocaleCode';\nconst LOCALE_ARG_PLUGIN_NAME = 'I18NLocaleArg';\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => ({\n register() {\n const { service: getGraphQLService } = strapi.plugin('graphql');\n const { service: getI18NService } = strapi.plugin('i18n');\n\n const { isLocalizedContentType } = getI18NService('content-types');\n\n const extensionService = getGraphQLService('extension');\n\n extensionService.shadowCRUD('plugin::i18n.locale').disableMutations();\n\n // Disable unwanted fields for localized content types\n Object.entries(strapi.contentTypes).forEach(([uid, ct]) => {\n if (isLocalizedContentType(ct)) {\n // Disable locale field in localized inputs\n extensionService.shadowCRUD(uid).field('locale').disableInput();\n\n // Disable localizations field in localized inputs\n extensionService.shadowCRUD(uid).field('localizations').disableInput();\n }\n });\n\n extensionService.use(({ nexus, typeRegistry }: any) => {\n const i18nLocaleArgPlugin = getI18nLocaleArgPlugin({ nexus, typeRegistry });\n const i18nLocaleScalar = getLocaleScalar({ nexus });\n return {\n plugins: [i18nLocaleArgPlugin],\n types: [i18nLocaleScalar],\n\n resolversConfig: {\n // Modify the default scope associated to find and findOne locale queries to match the actual action name\n 'Query.i18NLocale': { auth: { scope: 'plugin::i18n.locales.listLocales' } },\n 'Query.i18NLocales': { auth: { scope: 'plugin::i18n.locales.listLocales' } },\n },\n };\n });\n },\n});\n\nconst getLocaleScalar = ({ nexus }: any) => {\n const { service: getI18NService } = strapi.plugin('i18n');\n\n const locales = getI18NService('iso-locales').getIsoLocales();\n\n return nexus.scalarType({\n name: LOCALE_SCALAR_TYPENAME,\n\n description: 'A string used to identify an i18n locale',\n\n serialize: identity,\n parseValue: identity,\n\n parseLiteral(ast: any) {\n if (ast.kind !== 'StringValue') {\n throw new ValidationError('Locale cannot represent non string type');\n }\n\n const isValidLocale = ast.value === '*' || locales.find(propEq('code', ast.value));\n\n if (!isValidLocale) {\n throw new ValidationError('Unknown locale supplied');\n }\n\n return ast.value;\n },\n });\n};\n\nconst getI18nLocaleArgPlugin = ({ nexus, typeRegistry }: any) => {\n const { service: getI18NService } = strapi.plugin('i18n');\n\n const { isLocalizedContentType } = getI18NService('content-types');\n\n return nexus.plugin({\n name: LOCALE_ARG_PLUGIN_NAME,\n\n onAddOutputField(config: any) {\n // Add the locale arg to the queries on localized CTs\n\n const { parentType } = config;\n\n // Only target queries or mutations\n if (parentType !== 'Query' && parentType !== 'Mutation') {\n return;\n }\n\n let contentType;\n\n if (config?.extensions?.strapi?.contentType) {\n contentType = config.extensions.strapi.contentType;\n } else {\n const registryType = typeRegistry.get(config.type);\n\n if (!registryType) {\n return;\n }\n\n contentType = registryType.config.contentType;\n }\n\n // Ignore non-localized content types\n if (!isLocalizedContentType(contentType)) {\n return;\n }\n\n if (!config.args) {\n config.args = {};\n }\n\n config.args.locale = nexus.arg({\n type: LOCALE_SCALAR_TYPENAME,\n description: 'The locale to use for the query',\n });\n },\n });\n};\n","import isoLocales from './iso-locales.json';\n\n/**\n * Returns the default locale based either on env var or english\n * @returns {string}\n */\nconst getInitLocale = () => {\n const envLocaleCode = process.env.STRAPI_PLUGIN_I18N_INIT_LOCALE_CODE;\n\n if (envLocaleCode) {\n const matchingLocale = isoLocales.find(({ code }) => code === envLocaleCode);\n\n if (!matchingLocale) {\n throw new Error(\n 'Unknown locale code provided in the environment variable STRAPI_PLUGIN_I18N_INIT_LOCALE_CODE'\n );\n }\n\n return { ...matchingLocale };\n }\n\n return {\n code: 'en',\n name: 'English (en)',\n };\n};\n\nconst DEFAULT_LOCALE = getInitLocale();\n\nexport { isoLocales, DEFAULT_LOCALE, getInitLocale };\n","import { getService } from '../../../utils';\nimport { DEFAULT_LOCALE } from '../../../constants';\n\n// if i18N enabled set default locale\nexport default async ({ oldContentTypes, contentTypes }: any) => {\n const { isLocalizedContentType } = getService('content-types');\n const { getDefaultLocale } = getService('locales');\n\n if (!oldContentTypes) {\n return;\n }\n\n for (const uid in contentTypes) {\n if (!oldContentTypes[uid]) {\n continue;\n }\n\n const oldContentType = oldContentTypes[uid];\n const contentType = contentTypes[uid];\n\n if (!isLocalizedContentType(oldContentType) && isLocalizedContentType(contentType)) {\n const defaultLocale = (await getDefaultLocale()) || DEFAULT_LOCALE.code;\n\n await strapi.db.query(uid).updateMany({\n where: { locale: null },\n data: { locale: defaultLocale },\n });\n }\n }\n};\n","import { getService } from '../../../utils';\nimport { DEFAULT_LOCALE } from '../../../constants';\n\n// Disable i18n on CT -> Delete all entities that are not in the default locale\nexport default async ({ oldContentTypes, contentTypes }: any) => {\n const { isLocalizedContentType } = getService('content-types');\n const { getDefaultLocale } = getService('locales');\n\n if (!oldContentTypes) {\n return;\n }\n\n for (const uid in contentTypes) {\n if (!oldContentTypes[uid]) {\n continue;\n }\n\n const oldContentType = oldContentTypes[uid];\n const contentType = contentTypes[uid];\n\n // if i18N is disabled remove non default locales before sync\n if (isLocalizedContentType(oldContentType) && !isLocalizedContentType(contentType)) {\n const defaultLocale = (await getDefaultLocale()) || DEFAULT_LOCALE.code;\n\n await Promise.all([\n // Delete all entities that are not in the default locale\n strapi.db.query(uid).deleteMany({\n where: { locale: { $ne: defaultLocale } },\n }),\n // Set locale to null for the rest\n strapi.db.query(uid).updateMany({\n where: { locale: { $eq: defaultLocale } },\n data: { locale: null },\n }),\n ]);\n }\n }\n};\n","import _ from 'lodash';\nimport type { Core } from '@strapi/types';\n\nimport validateLocaleCreation from './controllers/validate-locale-creation';\nimport graphqlProvider from './graphql';\n\nimport enableContentType from './migrations/content-type/enable';\nimport disableContentType from './migrations/content-type/disable';\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n extendContentTypes(strapi);\n addContentManagerLocaleMiddleware(strapi);\n addContentTypeSyncHooks(strapi);\n};\n\n// TODO: v5 if implemented in the CM => delete this middleware\n/**\n * Adds middleware on CM creation routes to use i18n locale passed in a specific param\n * @param {Strapi} strapi\n */\nconst addContentManagerLocaleMiddleware = (strapi: Core.Strapi) => {\n strapi.server.router.use('/content-manager/collection-types/:model', (ctx, next) => {\n if (ctx.method === 'POST' || ctx.method === 'PUT') {\n return validateLocaleCreation(ctx, next);\n }\n\n return next();\n });\n\n strapi.server.router.use('/content-manager/single-types/:model', (ctx, next) => {\n if (ctx.method === 'POST' || ctx.method === 'PUT') {\n return validateLocaleCreation(ctx, next);\n }\n\n return next();\n });\n};\n\n/**\n * Adds hooks to migration content types locales on enable/disable of I18N\n * @param {Strapi} strapi\n */\nconst addContentTypeSyncHooks = (strapi: Core.Strapi) => {\n strapi.hook('strapi::content-types.beforeSync').register(disableContentType);\n strapi.hook('strapi::content-types.afterSync').register(enableContentType);\n};\n\n/**\n * Adds locale and localization fields to all content types\n * Even if content type is not localized, it will have these fields\n * @param {Strapi} strapi\n */\nconst extendContentTypes = (strapi: Core.Strapi) => {\n Object.values(strapi.contentTypes).forEach((contentType) => {\n const { attributes } = contentType;\n\n _.set(attributes, 'locale', {\n writable: true,\n private: false,\n configurable: false,\n visible: false,\n type: 'string',\n });\n });\n\n if (strapi.plugin('graphql')) {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n graphqlProvider({ strapi }).register();\n }\n};\n","import schema from './schema.json';\n\nexport default {\n schema,\n};\n","import locale from './locale';\n\nexport default {\n locale,\n};\n","import { isArray, getOr, prop } from 'lodash/fp';\nimport { getService } from '../../utils';\n\nconst actions = [\n {\n section: 'settings',\n category: 'Internationalization',\n subCategory: 'Locales',\n pluginName: 'i18n',\n displayName: 'Create',\n uid: 'locale.create',\n },\n {\n section: 'settings',\n category: 'Internationalization',\n subCategory: 'Locales',\n pluginName: 'i18n',\n displayName: 'Read',\n uid: 'locale.read',\n aliases: [\n { actionId: 'plugin::content-manager.explorer.read', subjects: ['plugin::i18n.locale'] },\n ],\n },\n {\n section: 'settings',\n category: 'Internationalization',\n subCategory: 'Locales',\n pluginName: 'i18n',\n displayName: 'Update',\n uid: 'locale.update',\n },\n {\n section: 'settings',\n category: 'Internationalization',\n subCategory: 'Locales',\n pluginName: 'i18n',\n displayName: 'Delete',\n uid: 'locale.delete',\n },\n];\n\nconst addLocalesPropertyIfNeeded = ({ value: action }: any) => {\n const {\n section,\n options: { applyToProperties },\n } = action;\n\n // Only add the locales property to contentTypes' actions\n if (section !== 'contentTypes') {\n return;\n }\n\n // If the 'locales' property is already declared within the applyToProperties array, then ignore the next steps\n if (isArray(applyToProperties) && applyToProperties.includes('locales')) {\n return;\n }\n\n // Add the 'locales' property to the applyToProperties array (create it if necessary)\n action.options.applyToProperties = isArray(applyToProperties)\n ? applyToProperties.concat('locales')\n : ['locales'];\n};\n\nconst shouldApplyLocalesPropertyToSubject = ({ property, subject }: any) => {\n if (property === 'locales') {\n const model = strapi.getModel(subject);\n\n return getService('content-types').isLocalizedContentType(model);\n }\n\n return true;\n};\n\nconst addAllLocalesToPermissions = async (permissions: any) => {\n const { actionProvider } = strapi.service('admin::permission');\n const { find: findAllLocales } = getService('locales');\n\n const allLocales = await findAllLocales();\n const allLocalesCode = allLocales.map(prop('code'));\n\n return Promise.all(\n permissions.map(async (permission: any) => {\n const { action, subject } = permission;\n\n const appliesToLocalesProperty = await actionProvider.appliesToProperty(\n 'locales',\n action,\n subject\n );\n\n if (!appliesToLocalesProperty) {\n return permission;\n }\n\n const oldPermissionProperties = getOr({}, 'properties', permission);\n\n return { ...permission, properties: { ...oldPermissionProperties, locales: allLocalesCode } };\n })\n );\n};\n\nconst syncSuperAdminPermissionsWithLocales = async () => {\n const roleService = strapi.service('admin::role');\n const permissionService = strapi.service('admin::permission');\n\n const superAdminRole = await roleService.getSuperAdmin();\n\n if (!superAdminRole) {\n return;\n }\n\n const superAdminPermissions = await permissionService.findMany({\n where: {\n role: {\n id: superAdminRole.id,\n },\n },\n });\n\n const newSuperAdminPermissions = await addAllLocalesToPermissions(superAdminPermissions);\n\n await roleService.assignPermissions(superAdminRole.id, newSuperAdminPermissions);\n};\n\nconst registerI18nActions = async () => {\n const { actionProvider } = strapi.service('admin::permission');\n\n await actionProvider.registerMany(actions);\n};\n\nconst registerI18nActionsHooks = () => {\n const { actionProvider } = strapi.service('admin::permission');\n const { hooks } = strapi.service('admin::role');\n\n actionProvider.hooks.appliesPropertyToSubject.register(shouldApplyLocalesPropertyToSubject);\n hooks.willResetSuperAdminPermissions.register(addAllLocalesToPermissions);\n};\n\nconst updateActionsProperties = () => {\n const { actionProvider } = strapi.service('admin::permission');\n\n // Register the transformation for every new action\n actionProvider.hooks.willRegister.register(addLocalesPropertyIfNeeded);\n\n // Handle already registered actions\n actionProvider.values().forEach((action: any) => addLocalesPropertyIfNeeded({ value: action }));\n};\n\nexport default {\n actions,\n registerI18nActions,\n registerI18nActionsHooks,\n updateActionsProperties,\n syncSuperAdminPermissionsWithLocales,\n};\n","import { isEmpty } from 'lodash/fp';\n\nimport { getService } from '../../utils';\n\n/**\n * Handler for the permissions layout (sections builder)\n * Adds the locales property to the subjects\n * @param {Action} action\n * @param {ContentTypesSection} section\n * @return {Promise<void>}\n */\nconst localesPropertyHandler = async ({ action, section }: any) => {\n const { actionProvider } = strapi.service('admin::permission');\n\n const locales = await getService('locales').find();\n\n // Do not add the locales property if there is none registered\n if (isEmpty(locales)) {\n return;\n }\n\n for (const subject of section.subjects) {\n const applies = await actionProvider.appliesToProperty('locales', action.actionId, subject.uid);\n const hasLocalesProperty = subject.properties.find(\n (property: any) => property.value === 'locales'\n );\n\n if (applies && !hasLocalesProperty) {\n subject.properties.push({\n label: 'Locales',\n value: 'locales',\n children: locales.map(({ name, code }: any) => ({ label: name || code, value: code })),\n });\n }\n }\n};\n\nconst registerLocalesPropertyHandler = () => {\n const { sectionsBuilder } = strapi.service('admin::permission');\n\n sectionsBuilder.addHandler('singleTypes', localesPropertyHandler);\n sectionsBuilder.addHandler('collectionTypes', localesPropertyHandler);\n};\n\nexport default {\n localesPropertyHandler,\n registerLocalesPropertyHandler,\n};\n","import { getService } from '../../utils';\n\n/**\n * @typedef {object} WillRegisterPermissionContext\n * @property {Permission} permission\n * @property {object} user\n * @property {object} condition\n */\n\n/**\n * Locales property handler for the permission engine\n * Add the has-locale-access condition if the locales property is defined\n * @param {WillRegisterPermissionContext} context\n */\nconst willRegisterPermission = (context: any) => {\n const { permission, condition, user } = context;\n const { subject, properties } = permission;\n\n const isSuperAdmin = strapi.service('admin::role').hasSuperAdminRole(user);\n\n if (isSuperAdmin) {\n return;\n }\n\n const { locales } = properties || {};\n const { isLocalizedContentType } = getService('content-types');\n\n // If there is no subject defined, ignore the permission\n if (!subject) {\n return;\n }\n\n const ct = strapi.contentTypes[subject];\n\n // If the subject exists but isn't localized, ignore the permission\n if (!isLocalizedContentType(ct)) {\n return;\n }\n\n // If the subject is localized but the locales property is null (access to all locales), ignore the permission\n if (locales === null) {\n return;\n }\n\n condition.and({\n locale: {\n $in: locales || [],\n },\n });\n};\n\nconst registerI18nPermissionsHandlers = () => {\n const { engine } = strapi.service('admin::permission');\n\n engine.hooks['before-register.permission'].register(willRegisterPermission);\n};\n\nexport default {\n willRegisterPermission,\n registerI18nPermissionsHandlers,\n};\n","import i18nActionsService from './permissions/actions';\nimport sectionsBuilderService from './permissions/sections-builder';\nimport engineService from './permissions/engine';\n\nconst permissions = () => ({\n actions: i18nActionsService,\n sectionsBuilder: sectionsBuilderService,\n engine: engineService,\n});\n\ntype PermissionsService = typeof permissions;\n\nexport default permissions;\nexport type { PermissionsService };\n","import { reduce } from 'lodash/fp';\nimport { getService } from '../utils';\n\nconst sendDidInitializeEvent = async () => {\n const { isLocalizedContentType } = getService('content-types');\n\n // TODO: V5: This event should be renamed numberOfContentTypes in V5 as the name is already taken to describe the number of content types using i18n.\n const numberOfContentTypes = reduce(\n (sum, contentType) => (isLocalizedContentType(contentType) ? sum + 1 : sum),\n 0\n )(strapi.contentTypes as any);\n\n await strapi.telemetry.send('didInitializeI18n', { groupProperties: { numberOfContentTypes } });\n};\n\nconst sendDidUpdateI18nLocalesEvent = async () => {\n const numberOfLocales = await getService('locales').count();\n\n await strapi.telemetry.send('didUpdateI18nLocales', {\n groupProperties: { numberOfLocales },\n });\n};\n\nconst metrics = () => ({\n sendDidInitializeEvent,\n sendDidUpdateI18nLocalesEvent,\n});\n\ntype MetricsService = typeof metrics;\n\nexport default metrics;\nexport type { MetricsService };\n","import { cloneDeep, isEmpty } from 'lodash/fp';\n\nimport { type Schema } from '@strapi/types';\nimport { async } from '@strapi/utils';\nimport { getService } from '../utils';\n\n/**\n * Update non localized fields of all the related localizations of an entry with the entry values\n */\nconst syncNonLocalizedAttributes = async (sourceEntry: any, model: Schema.ContentType) => {\n const { copyNonLocalizedAttributes } = getService('content-types');\n\n const nonLocalizedAttributes = copyNonLocalizedAttributes(model, sourceEntry);\n if (isEmpty(nonLocalizedAttributes)) {\n return;\n }\n\n const uid = model.uid;\n const documentId = sourceEntry.documentId;\n const locale = sourceEntry.locale;\n const status = sourceEntry?.publishedAt ? 'published' : 'draft';\n\n // Find all the entries that need to be updated\n // this is every other entry of the document in the same status but a different locale\n const localeEntriesToUpdate = await strapi.db.query(uid).findMany({\n where: {\n documentId,\n publishedAt: status === 'published' ? { $ne: null } : null,\n locale: { $ne: locale },\n },\n select: ['locale', 'id'],\n });\n\n const entryData = await strapi.documents(uid).omitComponentData(nonLocalizedAttributes);\n\n await async.map(localeEntriesToUpdate, async (entry: any) => {\n const transformedData = await strapi.documents.utils.transformData(\n cloneDeep(nonLocalizedAttributes),\n {\n uid,\n status,\n locale: entry.locale,\n allowMissingId: true,\n }\n );\n\n // Update or create non localized components for the entry\n const componentData = await strapi\n .documents(uid)\n .updateComponents(entry, transformedData as any);\n\n // Update every other locale entry of this documentId in the same status\n await strapi.db.query(uid).update({\n where: {\n documentId,\n publishedAt: status === 'published' ? { $ne: null } : null,\n locale: { $eq: entry.locale },\n },\n // The data we send to the update function is the entry data merged with\n // the updated component data\n data: Object.assign(cloneDeep(entryData), componentData),\n });\n });\n};\n\nconst localizations = () => ({\n syncNonLocalizedAttributes,\n});\n\ntype LocalizationsService = typeof localizations;\n\nexport default localizations;\nexport type { LocalizationsService };\n","import { isNil } from 'lodash/fp';\nimport { DEFAULT_LOCALE } from '../constants';\nimport { getService, getCoreStore } from '../utils';\n\nconst find = (params: any = {}) =>\n strapi.db.query('plugin::i18n.locale').findMany({ where: params });\n\nconst findById = (id: any) => strapi.db.query('plugin::i18n.locale').findOne({ where: { id } });\n\nconst findByCode = (code: any) =>\n strapi.db.query('plugin::i18n.locale').findOne({ where: { code } });\n\nconst count = (params: any = {}) => strapi.db.query('plugin::i18n.locale').count({ where: params });\n\nconst create = async (locale: any) => {\n const result = await strapi.db.query('plugin::i18n.locale').create({ data: locale });\n\n getService('metrics').sendDidUpdateI18nLocalesEvent();\n\n return result;\n};\n\nconst update = async (params: any, updates: any) => {\n const result = await strapi.db\n .query('plugin::i18n.locale')\n .update({ where: params, data: updates });\n\n getService('metrics').sendDidUpdateI18nLocalesEvent();\n\n return result;\n};\n\nconst deleteFn = async ({ id }: any) => {\n const localeToDelete = await findById(id);\n\n if (localeToDelete) {\n await deleteAllLocalizedEntriesFor({ locale: localeToDelete.code });\n const result = await strapi.db.query('plugin::i18n.locale').delete({ where: { id } });\n\n getService('metrics').sendDidUpdateI18nLocalesEvent();\n\n return result;\n }\n\n return localeToDelete;\n};\n\nconst setDefaultLocale = ({ code }: any) =>\n getCoreStore().set({ key: 'default_locale', value: code });\n\nconst getDefaultLocale = () => getCoreStore().get({ key: 'default_locale' });\n\nconst setIsDefault = async (locales: any) => {\n if (isNil(locales)) {\n return locales;\n }\n\n const actualDefault = await getDefaultLocale();\n\n if (Array.isArray(locales)) {\n return locales.map((locale) => ({ ...locale, isDefault: actualDefault === locale.code }));\n }\n // single locale\n return { ...locales, isDefault: actualDefault === locales.code };\n};\n\nconst initDefaultLocale = async () => {\n const existingLocalesNb = await strapi.db.query('plugin::i18n.locale').count();\n if (existingLocalesNb === 0) {\n await create(DEFAULT_LOCALE);\n await setDefaultLocale({ code: DEFAULT_LOCALE.code });\n }\n};\n\nconst deleteAllLocalizedEntriesFor = async ({ locale }: any) => {\n const { isLocalizedContentType } = getService('content-types');\n\n const localizedModels = Object.values(strapi.contentTypes).filter(isLocalizedContentType);\n\n for (const model of localizedModels) {\n // FIXME: delete many content & their associations\n await strapi.db.query(model.uid).deleteMany({ where: { locale } });\n }\n};\n\nconst locales = () => ({\n find,\n findById,\n findByCode,\n create,\n update,\n count,\n setDefaultLocale,\n getDefaultLocale,\n setIsDefault,\n delete: deleteFn,\n initDefaultLocale,\n});\n\ntype LocaleService = typeof locales;\n\nexport default locales;\nexport type { LocaleService };\n","import { isoLocales } from '../constants';\n\nconst getIsoLocales = () => isoLocales;\n\nconst isoLocalesService = () => ({\n getIsoLocales,\n});\n\ntype ISOLocalesService = typeof isoLocalesService;\n\nexport default isoLocalesService;\nexport type { ISOLocalesService };\n","import _ from 'lodash';\nimport { pick, pipe, has, prop, isNil, cloneDeep, isArray } from 'lodash/fp';\nimport { errors, contentTypes as contentTypeUtils } from '@strapi/utils';\nimport { getService } from '../utils';\n\nconst {\n isRelationalAttribute,\n getVisibleAttributes,\n isTypedAttribute,\n getScalarAttributes,\n getRelationalAttributes,\n} = contentTypeUtils;\nconst { ApplicationError } = errors;\n\nconst hasLocalizedOption = (modelOrAttribute: any) => {\n return prop('pluginOptions.i18n.localized', modelOrAttribute) === true;\n};\n\nconst getValidLocale = async (locale: any) => {\n const localesService = getService('locales');\n\n if (isNil(locale)) {\n return localesService.getDefaultLocale();\n }\n\n const foundLocale = await localesService.findByCode(locale);\n if (!foundLocale) {\n throw new ApplicationError('Locale not found');\n }\n\n return locale;\n};\n\n/**\n * Returns whether an attribute is localized or not\n * @param {*} attribute\n * @returns\n */\nconst isLocalizedAttribute = (attribute: any) => {\n return (\n hasLocalizedOption(attribute) ||\n isRelationalAttribute(attribute) ||\n isTypedAttribute(attribute, 'uid')\n );\n};\n\n/**\n * Returns whether a model is localized or not\n * @param {*} model\n * @returns\n */\nconst isLocalizedContentType = (model: any) => {\n return hasLocalizedOption(model);\n};\n\n/**\n * Returns the list of attribute names that are not localized\n * @param {object} model\n * @returns {string[]}\n */\nconst getNonLocalizedAttributes = (model: any) => {\n return getVisibleAttributes(model).filter(\n (attrName) => !isLocalizedAttribute(model.attributes[attrName])\n );\n};\n\nconst removeId = (value: any) => {\n if (typeof value === 'object' && has('id', value)) {\n delete value.id;\n }\n};\n\nconst removeIds = (model: any) => (entry: any) => removeIdsMut(model, cloneDeep(entry));\n\nconst removeIdsMut = (model: any, entry: any) => {\n if (isNil(entry)) {\n return entry;\n }\n\n removeId(entry);\n\n _.forEach(model.attributes, (attr, attrName) => {\n const value = entry[attrName];\n if (attr.type === 'dynamiczone' && isArray(value)) {\n value.forEach((compo) => {\n if (has('__component', compo)) {\n const model = strapi.components[compo.__component];\n removeIdsMut(model, compo);\n }\n });\n } else if (attr.type === 'component') {\n const model = strapi.components[attr.component];\n if (isArray(value)) {\n value.forEach((compo) => removeIdsMut(model, compo));\n } else {\n removeIdsMut(model, value);\n }\n }\n });\n\n return entry;\n};\n\n/**\n * Returns a copy of an entry picking only its non localized attributes\n * @param {object} model\n * @param {object} entry\n * @returns {object}\n */\nconst copyNonLocalizedAttributes = (model: any, entry: any) => {\n const nonLocalizedAttributes = getNonLocalizedAttributes(model);\n\n return pipe(pick(nonLocalizedAttributes), removeIds(model))(entry);\n};\n\n/**\n * Returns the list of attribute names that are localized\n * @param {object} model\n * @returns {string[]}\n */\nconst getLocalizedAttributes = (model: any) => {\n return getVisibleAttributes(model).filter((attrName) =>\n isLocalizedAttribute(model.attributes[attrName])\n );\n};\n\n/**\n * Fill non localized fields of an entry if there are nil\n * @param {Object} entry entry to fill\n * @param {Object} relatedEntry values used to fill\n * @param {Object} options\n * @param {Object} options.model corresponding model\n */\nconst fillNonLocalizedAttributes = (entry: any, relatedEntry: any, { model }: any) => {\n if (isNil(relatedEntry)) {\n return;\n }\n\n const modelDef = strapi.getModel(model);\n const relatedEntryCopy = copyNonLocalizedAttributes(modelDef, relatedEntry);\n\n _.forEach(relatedEntryCopy, (value, field) => {\n if (isNil(entry[field])) {\n entry[field] = value;\n }\n });\n};\n\n/**\n * build the populate param to\n * @param {String} modelUID uid of the model, could be of a content-type or a component\n */\nconst getNestedPopulateOfNonLocalizedAttributes = (modelUID: any) => {\n const schema = strapi.getModel(modelUID);\n const scalarAttributes = getScalarAttributes(schema);\n const nonLocalizedAttributes = getNonLocalizedAttributes(schema);\n\n const allAttributes = [...scalarAttributes, ...nonLocalizedAttributes];\n if (schema.modelType === 'component') {\n // When called recursively on a non localized component we\n // need to explicitly populate that components relations\n allAttributes.push(...getRelationalAttributes(schema));\n }\n\n const currentAttributesToPopulate = allAttributes.filter((value, index, self) => {\n return self.indexOf(value) === index && self.lastIndexOf(value) === index;\n });\n\n const attributesToPopulate = [...currentAttributesToPopulate];\n for (const attrName of currentAttributesToPopulate) {\n const attr = schema.attributes[attrName];\n if (attr.type === 'component') {\n const nestedPopulate = getNestedPopulateOfNonLocalizedAttributes(attr.component).map(\n (nestedAttr) => `${attrName}.${nestedAttr}`\n );\n attributesToPopulate.push(...nestedPopulate);\n } else if (attr.type === 'dynamiczone') {\n attr.components.forEach((componentName) => {\n const nestedPopulate = getNestedPopulateOfNonLocalizedAttributes(componentName).map(\n (nestedAttr) => `${attrName}.${nestedAttr}`\n );\n attributesToPopulate.push(...nestedPopulate);\n });\n }\n }\n\n return attributesToPopulate;\n};\n\nconst contentTypes = () => ({\n isLocalizedContentType,\n getValidLocale,\n getLocalizedAttributes,\n getNonLocalizedAttributes,\n copyNonLocalizedAttributes,\n fillNonLocalizedAttributes,\n getNestedPopulateOfNonLocalizedAttributes,\n});\n\ntype ContentTypesService = typeof contentTypes;\n\nexport default contentTypes;\nexport { ContentTypesService };\n","import permissions from './permissions';\nimport metrics from './metrics';\nimport localizations from './localizations';\nimport locales from './locales';\nimport isoLocales from './iso-locales';\nimport contentTypes from './content-types';\n\nexport default {\n permissions,\n metrics,\n localizations,\n locales,\n 'iso-locales': isoLocales,\n 'content-types': contentTypes,\n};\n","export default {\n type: 'admin',\n routes: [\n {\n method: 'GET',\n path: '/iso-locales',\n handler: 'iso-locales.listIsoLocales',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.read'] },\n },\n ],\n },\n },\n {\n method: 'GET',\n path: '/locales',\n handler: 'locales.listLocales',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'POST',\n path: '/locales',\n handler: 'locales.createLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.create'] },\n },\n ],\n },\n },\n {\n method: 'PUT',\n path: '/locales/:id',\n handler: 'locales.updateLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.update'] },\n },\n ],\n },\n },\n {\n method: 'DELETE',\n path: '/locales/:id',\n handler: 'locales.deleteLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.delete'] },\n },\n ],\n },\n },\n {\n method: 'POST',\n path: '/content-manager/actions/get-non-localized-fields',\n handler: 'content-types.getNonLocalizedAttributes',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n ],\n};\n","export default {\n type: 'content-api',\n routes: [\n {\n method: 'GET',\n path: '/locales',\n handler: 'locales.listLocales',\n },\n ],\n};\n","import admin from './admin';\nimport contentApi from './content-api';\n\nexport default {\n admin,\n 'content-api': contentApi,\n};\n","import { prop } from 'lodash/fp';\nimport { yup, validateYupSchema } from '@strapi/utils';\n\nimport { isoLocales } from '../constants';\n\nconst allowedLocaleCodes = isoLocales.map(prop('code'));\n\nconst createLocaleSchema = yup\n .object()\n .shape({\n name: yup.string().max(50).nullable(),\n code: yup.string().oneOf(allowedLocaleCodes).required(),\n isDefault: yup.boolean().required(),\n })\n .noUnknown();\n\nconst updateLocaleSchema = yup\n .object()\n .shape({\n name: yup.string().min(1).max(50).nullable(),\n isDefault: yup.boolean(),\n })\n .noUnknown();\n\nconst validateCreateLocaleInput = validateYupSchema(createLocaleSchema);\nconst validateUpdateLocaleInput = validateYupSchema(updateLocaleSchema);\n\nexport { validateCreateLocaleInput, validateUpdateLocaleInput };\n","const formatLocale = (locale: { name: string; code: string; isDefault: boolean }) => {\n return {\n ...locale,\n name: locale.name || null,\n };\n};\n\nexport { formatLocale };\n","import * as utils from '@strapi/utils';\nimport { pick } from 'lodash/fp';\nimport type { Core } from '@strapi/types';\nimport { getService } from '../utils';\nimport { validateCreateLocaleInput, validateUpdateLocaleInput } from '../validation/locales';\nimport { formatLocale } from '../domain/locale';\n\nconst { setCreatorFields } = utils;\nconst { ApplicationError } = utils.errors;\n\nconst sanitizeLocale = (locale: any) => {\n const model = strapi.getModel('plugin::i18n.locale');\n\n return strapi.contentAPI.sanitize.output(locale, model);\n};\n\nconst controller: Core.Controller = {\n async listLocales(ctx) {\n const localesService = getService('locales');\n\n const locales = await localesService.find();\n const sanitizedLocales = await sanitizeLocale(locales);\n\n ctx.body = await localesService.setIsDefault(sanitizedLocales);\n },\n\n async createLocale(ctx) {\n const { user } = ctx.state;\n const body = ctx.request.body as any;\n const { isDefault, ...localeToCreate } = body;\n\n await validateCreateLocaleInput(body);\n\n const localesService = getService('locales');\n\n const existingLocale = await localesService.findByCode(body.code);\n if (existingLocale) {\n throw new ApplicationError('This locale already exists');\n }\n\n const localeToPersist = setCreatorFields({ user })(formatLocale(localeToCreate));\n\n const locale = await localesService.create(localeToPersist);\n\n if (isDefault) {\n await localesService.setDefaultLocale(locale);\n }\n\n const sanitizedLocale = await sanitizeLocale(locale);\n\n ctx.body = await localesService.setIsDefault(sanitizedLocale);\n },\n\n async updateLocale(ctx) {\n const { user } = ctx.state;\n const { id } = ctx.params;\n const body = ctx.request.body as any;\n const { isDefault, ...updates } = body;\n\n await validateUpdateLocaleInput(body);\n\n const localesService = getService('locales');\n\n const existingLocale = await localesService.findById(id);\n if (!existingLocale) {\n return ctx.notFound('locale.notFound');\n }\n\n const allowedParams = ['name'];\n const cleanUpdates = setCreatorFields({ user, isEdition: true })(pick(allowedParams, updates));\n\n const updatedLocale = await localesService.update({ id }, cleanUpdates);\n\n if (isDefault) {\n await localesService.setDefaultLocale(updatedLocale);\n }\n\n const sanitizedLocale = await sanitizeLocale(updatedLocale);\n\n ctx.body = await localesService.setIsDefault(sanitizedLocale);\n },\n\n async deleteLocale(ctx) {\n const { id } = ctx.params;\n\n const localesService = getService('locales');\n\n const existingLocale = await localesService.findById(id);\n if (!existingLocale) {\n return ctx.notFound('locale.notFound');\n }\n\n const defaultLocaleCode = await localesService.getDefaultLocale();\n if (existingLocale.code === defaultLocaleCode) {\n throw new ApplicationError('Cannot delete the default locale');\n }\n\n await localesService.delete({ id });\n\n const sanitizedLocale = await sanitizeLocale(existingLocale);\n\n ctx.body = await localesService.setIsDefault(sanitizedLocale);\n },\n};\n\nexport default controller;\n","import { yup, validateYupSchema } from '@strapi/utils';\n\nimport { get } from 'lodash/fp';\n\nconst validateGetNonLocalizedAttributesSchema = yup\n .object()\n .shape({\n model: yup.string().required(),\n id: yup.mixed().when('model', {\n is: (model: any) => get('kind', strapi.contentType(model)) === 'singleType',\n then: yup.strapiID().nullable(),\n otherwise: yup.strapiID().required(),\n }),\n locale: yup.string().required(),\n })\n .noUnknown()\n .required();\n\nconst validateGetNonLocalizedAttributesInput = validateYupSchema(\n validateGetNonLocalizedAttributesSchema\n);\n\nexport { validateGetNonLocalizedAttributesInput };\n","import { pick, uniq, prop, getOr, flatten, pipe, map } from 'lodash/fp';\nimport { contentTypes as contentTypesUtils, errors } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\nimport { getService } from '../utils';\nimport { validateGetNonLocalizedAttributesInput } from '../validation/content-types';\n\nconst { ApplicationError } = errors;\n\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypesUtils.constants;\n\nconst getLocalesProperty = getOr<string[]>([], 'properties.locales');\nconst getFieldsProperty = prop('properties.fields');\n\nconst getFirstLevelPath = map((path: string) => path.split('.')[0]);\n\nconst controller = {\n async getNonLocalizedAttributes(ctx) {\n const { user } = ctx.state;\n const body = ctx.request.body as any;\n const { model, id, locale } = body;\n\n await validateGetNonLocalizedAttributesInput({ model, id, locale });\n\n const {\n copyNonLocalizedAttributes,\n isLocalizedContentType,\n getNestedPopulateOfNonLocalizedAttributes,\n } = getService('content-types');\n\n const {\n default: { READ_ACTION, CREATE_ACTION },\n } = strapi.service('admin::constants');\n\n const modelDef = strapi.contentType(model);\n const attributesToPopulate = getNestedPopulateOfNonLocalizedAttributes(model);\n\n if (!isLocalizedContentType(modelDef)) {\n throw new ApplicationError(`Model ${model} is not localized`);\n }\n\n const params = modelDef.kind === 'singleType' ? {} : { id };\n\n const entity = await strapi.db\n .query(model)\n .findOne({ where: params, populate: attributesToPopulate });\n\n if (!entity) {\n return ctx.notFound();\n }\n\n const permissions = await strapi.admin.services.permission.findMany({\n where: {\n action: [READ_ACTION, CREATE_ACTION],\n subject: model,\n role: {\n id: user.roles.map(prop('id')),\n },\n },\n });\n\n const localePermissions = permissions\n .filter((perm: any) => getLocalesProperty(perm).includes(locale))\n .map(getFieldsProperty);\n\n const permittedFields = pipe(flatten, getFirstLevelPath, uniq)(localePermissions);\n\n const nonLocalizedFields = copyNonLocalizedAttributes(modelDef, entity);\n const sanitizedNonLocalizedFields = pick(permittedFields, nonLocalizedFields);\n\n const availableLocalesResult = await strapi.plugins['content-manager']\n .service('document-metadata')\n .getMetadata(model, entity, {\n availableLocales: true,\n });\n\n const availableLocales = availableLocalesResult.availableLocales.map((localeResult: any) =>\n pick(['id', 'locale', PUBLISHED_AT_ATTRIBUTE], localeResult)\n );\n\n ctx.body = {\n nonLocalizedFields: sanitizedNonLocalizedFields,\n localizations: availableLocales.concat(\n pick(['id', 'locale', PUBLISHED_AT_ATTRIBUTE], entity)\n ),\n };\n },\n} satisfies Core.Controller;\n\nexport default controller;\n","import type { Core } from '@strapi/types';\nimport { getService } from '../utils';\n\nconst controller: Core.Controller = {\n listIsoLocales(ctx) {\n const isoLocalesService = getService('iso-locales');\n\n ctx.body = isoLocalesService.getIsoLocales();\n },\n};\n\nexport default controller;\n","import locales from './locales';\nimport contentTypes from './content-types';\nimport isoLocales from './iso-locales';\n\nexport default {\n locales,\n 'iso-locales': isoLocales,\n 'content-types': contentTypes,\n};\n","import bootstrap from './bootstrap';\nimport register from './register';\nimport contentTypes from './content-types';\nimport services from './services';\nimport routes from './routes';\nimport controllers from './controllers';\n\nexport default () => ({\n register,\n bootstrap,\n routes,\n controllers,\n contentTypes,\n services,\n});\n"],"names":["schema","getNestedPopulateOfNonLocalizedAttributes","sendDidInitializeEvent","initDefaultLocale","actions","ApplicationError","getValidLocale","isLocalizedContentType","locale","strapi","locales","contentTypes","getDefaultLocale","attributes","permissions","copyNonLocalizedAttributes","contentTypeUtils","model","index","isoLocales","controller","contentTypesUtils","isoLocalesService"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
@@ -1,6 +1,3 @@
1
- import type { Core } from '@strapi/types';
2
- declare const _default: ({ strapi }: {
3
- strapi: Core.Strapi;
4
- }) => Promise<void>;
1
+ declare const _default: () => Promise<void>;
5
2
  export default _default;
6
3
  //# sourceMappingURL=bootstrap.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../../server/src/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,IAAI,EAAE,MAAM,eAAe,CAAC;qCA4DhB;IAAE,MAAM,EAAE,KAAK,MAAM,CAAA;CAAE;AAAzD,wBA4BE"}
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../../server/src/bootstrap.ts"],"names":[],"mappings":";AA4DA,wBAuBE"}
@@ -3,9 +3,7 @@ declare const _default: () => {
3
3
  register: ({ strapi }: {
4
4
  strapi: import("@strapi/types/dist/core").Strapi;
5
5
  }) => void;
6
- bootstrap: ({ strapi }: {
7
- strapi: import("@strapi/types/dist/core").Strapi;
8
- }) => Promise<void>;
6
+ bootstrap: () => Promise<void>;
9
7
  routes: {
10
8
  admin: {
11
9
  type: string;
@@ -137,14 +135,6 @@ declare const _default: () => {
137
135
  name: string;
138
136
  }[];
139
137
  };
140
- 'entity-service-decorator': () => {
141
- decorator: (service: any) => {
142
- wrapResult(result?: {}, ctx?: {}): Promise<any>;
143
- wrapParams(params?: any, ctx?: any): Promise<any>;
144
- findMany(uid: any, opts: any): Promise<any>;
145
- };
146
- wrapParams: (params?: any, ctx?: any) => Promise<any>;
147
- };
148
138
  'content-types': () => {
149
139
  isLocalizedContentType: (model: any) => boolean;
150
140
  getValidLocale: (locale: any) => Promise<any>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../server/src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,wBAOG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../server/src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,wBAOG"}
@@ -61,14 +61,6 @@ declare const _default: {
61
61
  name: string;
62
62
  }[];
63
63
  };
64
- 'entity-service-decorator': () => {
65
- decorator: (service: any) => {
66
- wrapResult(result?: {}, ctx?: {}): Promise<any>;
67
- wrapParams(params?: any, ctx?: any): Promise<any>;
68
- findMany(uid: any, opts: any): Promise<any>;
69
- };
70
- wrapParams: (params?: any, ctx?: any) => Promise<any>;
71
- };
72
64
  'content-types': () => {
73
65
  isLocalizedContentType: (model: any) => boolean;
74
66
  getValidLocale: (locale: any) => Promise<any>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/services/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,wBAQE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/services/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,wBAOE"}
@@ -2,7 +2,6 @@ import type { LocaleService } from '../services/locales';
2
2
  import type { PermissionsService } from '../services/permissions';
3
3
  import type { ContentTypesService } from '../services/content-types';
4
4
  import type { MetricsService } from '../services/metrics';
5
- import type { EntityServiceDecoratorService } from '../services/entity-service-decorator';
6
5
  import type { ISOLocalesService } from '../services/iso-locales';
7
6
  import type { LocalizationsService } from '../services/localizations';
8
7
  type S = {
@@ -12,7 +11,6 @@ type S = {
12
11
  localizations: LocalizationsService;
13
12
  ['iso-locales']: ISOLocalesService;
14
13
  ['content-types']: ContentTypesService;
15
- ['entity-service-decorator']: EntityServiceDecoratorService;
16
14
  };
17
15
  declare const getCoreStore: () => {
18
16
  get(params?: Partial<{
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,sCAAsC,CAAC;AAC1F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEtE,KAAK,CAAC,GAAG;IACP,WAAW,EAAE,kBAAkB,CAAC;IAChC,OAAO,EAAE,cAAc,CAAC;IACxB,OAAO,EAAE,aAAa,CAAC;IACvB,aAAa,EAAE,oBAAoB,CAAC;IACpC,CAAC,aAAa,CAAC,EAAE,iBAAiB,CAAC;IACnC,CAAC,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACvC,CAAC,0BAA0B,CAAC,EAAE,6BAA6B,CAAC;CAC7D,CAAC;AAEF,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;CAEjB,CAAC;AAGF,QAAA,MAAM,UAAU,4BAA6B,CAAC,KAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAE/D,CAAC;AAEF,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEtE,KAAK,CAAC,GAAG;IACP,WAAW,EAAE,kBAAkB,CAAC;IAChC,OAAO,EAAE,cAAc,CAAC;IACxB,OAAO,EAAE,aAAa,CAAC;IACvB,aAAa,EAAE,oBAAoB,CAAC;IACpC,CAAC,aAAa,CAAC,EAAE,iBAAiB,CAAC;IACnC,CAAC,eAAe,CAAC,EAAE,mBAAmB,CAAC;CACxC,CAAC;AAEF,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;CAEjB,CAAC;AAGF,QAAA,MAAM,UAAU,4BAA6B,CAAC,KAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAE/D,CAAC;AAEF,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/i18n",
3
- "version": "5.0.0-rc.14",
3
+ "version": "5.0.0-rc.16",
4
4
  "description": "Create read and update content in different languages, both from the Admin Panel and from the API",
5
5
  "repository": {
6
6
  "type": "git",
@@ -55,7 +55,7 @@
55
55
  "@reduxjs/toolkit": "1.9.7",
56
56
  "@strapi/design-system": "2.0.0-rc.10",
57
57
  "@strapi/icons": "2.0.0-rc.10",
58
- "@strapi/utils": "5.0.0-rc.14",
58
+ "@strapi/utils": "5.0.0-rc.16",
59
59
  "lodash": "4.17.21",
60
60
  "qs": "6.11.1",
61
61
  "react-intl": "6.6.2",
@@ -63,11 +63,11 @@
63
63
  "yup": "0.32.9"
64
64
  },
65
65
  "devDependencies": {
66
- "@strapi/admin": "5.0.0-rc.14",
67
- "@strapi/admin-test-utils": "5.0.0-rc.14",
68
- "@strapi/content-manager": "5.0.0-rc.14",
66
+ "@strapi/admin": "5.0.0-rc.16",
67
+ "@strapi/admin-test-utils": "5.0.0-rc.16",
68
+ "@strapi/content-manager": "5.0.0-rc.16",
69
69
  "@strapi/pack-up": "5.0.0",
70
- "@strapi/types": "5.0.0-rc.14",
70
+ "@strapi/types": "5.0.0-rc.16",
71
71
  "@testing-library/react": "15.0.7",
72
72
  "@testing-library/user-event": "14.5.2",
73
73
  "msw": "1.3.0",
@@ -96,5 +96,5 @@
96
96
  "required": false,
97
97
  "kind": "plugin"
98
98
  },
99
- "gitHead": "e18c706dc0bfda296f9c3005e719bd60b3732531"
99
+ "gitHead": "d5489625ee1a177a3fe6d180d3f901680a48bbf7"
100
100
  }
@@ -1,29 +0,0 @@
1
- declare const entityServiceDecorator: () => {
2
- decorator: (service: any) => {
3
- /**
4
- * Wraps result
5
- * @param {object} result - result object of query
6
- * @param {object} ctx - Query context
7
- * @param {object} ctx.model - Model that is being used
8
- */
9
- wrapResult(result?: {}, ctx?: {}): Promise<any>;
10
- /**
11
- * Wraps query options. In particular will add default locale to query params
12
- * @param {object} params - Query options object (params, data, files, populate)
13
- * @param {object} ctx - Query context
14
- * @param {object} ctx.model - Model that is being used
15
- */
16
- wrapParams(params?: any, ctx?: any): Promise<any>;
17
- /**
18
- * Find an entry or several if fetching all locales
19
- * @param {string} uid - Model uid
20
- * @param {object} opts - Query options object (params, data, files, populate)
21
- */
22
- findMany(uid: any, opts: any): Promise<any>;
23
- };
24
- wrapParams: (params?: any, ctx?: any) => Promise<any>;
25
- };
26
- type EntityServiceDecoratorService = typeof entityServiceDecorator;
27
- export default entityServiceDecorator;
28
- export type { EntityServiceDecoratorService };
29
- //# sourceMappingURL=entity-service-decorator.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"entity-service-decorator.d.ts","sourceRoot":"","sources":["../../../../server/src/services/entity-service-decorator.ts"],"names":[],"mappings":"AA4HA,QAAA,MAAM,sBAAsB;yBAhEA,GAAG;QAC7B;;;;;WAKG;;QAKH;;;;;WAKG;4BACsB,GAAG,QAAY,GAAG;QAc3C;;;;WAIG;sBACiB,GAAG,QAAQ,GAAG;;0BAzEF,GAAG,QAAY,GAAG;CAwGlD,CAAC;AAEH,KAAK,6BAA6B,GAAG,OAAO,sBAAsB,CAAC;AAEnE,eAAe,sBAAsB,CAAC;AACtC,YAAY,EAAE,6BAA6B,EAAE,CAAC"}