@strapi/i18n 5.56.0 → 5.57.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/contentManagerHooks/editView.js +0 -1
- package/dist/admin/contentManagerHooks/editView.js.map +1 -1
- package/dist/admin/contentManagerHooks/editView.mjs +0 -1
- package/dist/admin/contentManagerHooks/editView.mjs.map +1 -1
- package/dist/server/bootstrap.js +2 -2
- package/dist/server/bootstrap.js.map +1 -1
- package/dist/server/bootstrap.mjs +1 -1
- package/dist/server/bootstrap.mjs.map +1 -1
- package/dist/server/controllers/content-types.js +11 -11
- package/dist/server/controllers/content-types.js.map +1 -1
- package/dist/server/controllers/content-types.mjs +11 -11
- package/dist/server/controllers/content-types.mjs.map +1 -1
- package/dist/server/controllers/locales.js +2 -2
- package/dist/server/controllers/locales.js.map +1 -1
- package/dist/server/controllers/locales.mjs +2 -2
- package/dist/server/controllers/locales.mjs.map +1 -1
- package/dist/server/controllers/validate-locale-creation.js +1 -2
- package/dist/server/controllers/validate-locale-creation.js.map +1 -1
- package/dist/server/controllers/validate-locale-creation.mjs +1 -2
- package/dist/server/controllers/validate-locale-creation.mjs.map +1 -1
- package/dist/server/graphql.js +4 -4
- package/dist/server/graphql.js.map +1 -1
- package/dist/server/graphql.mjs +2 -2
- package/dist/server/graphql.mjs.map +1 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/localization.js +36 -0
- package/dist/server/localization.js.map +1 -0
- package/dist/server/localization.mjs +34 -0
- package/dist/server/localization.mjs.map +1 -0
- package/dist/server/register.js +2 -0
- package/dist/server/register.js.map +1 -1
- package/dist/server/register.mjs +2 -0
- package/dist/server/register.mjs.map +1 -1
- package/dist/server/services/content-types.js +12 -12
- package/dist/server/services/content-types.js.map +1 -1
- package/dist/server/services/content-types.mjs +11 -11
- package/dist/server/services/content-types.mjs.map +1 -1
- package/dist/server/services/fill-from-locale.js +5 -6
- package/dist/server/services/fill-from-locale.js.map +1 -1
- package/dist/server/services/fill-from-locale.mjs +5 -6
- package/dist/server/services/fill-from-locale.mjs.map +1 -1
- package/dist/server/services/locales.js +1 -2
- package/dist/server/services/locales.js.map +1 -1
- package/dist/server/services/locales.mjs +1 -2
- package/dist/server/services/locales.mjs.map +1 -1
- package/dist/server/services/localizations.js +4 -4
- package/dist/server/services/localizations.js.map +1 -1
- package/dist/server/services/localizations.mjs +1 -1
- package/dist/server/services/localizations.mjs.map +1 -1
- package/dist/server/services/metrics.js +1 -2
- package/dist/server/services/metrics.js.map +1 -1
- package/dist/server/services/metrics.mjs +1 -2
- package/dist/server/services/metrics.mjs.map +1 -1
- package/dist/server/services/permissions/actions.js +5 -5
- package/dist/server/services/permissions/actions.js.map +1 -1
- package/dist/server/services/permissions/actions.mjs +5 -5
- package/dist/server/services/permissions/actions.mjs.map +1 -1
- package/dist/server/services/permissions/sections-builder.js +2 -2
- package/dist/server/services/permissions/sections-builder.js.map +1 -1
- package/dist/server/services/permissions/sections-builder.mjs +1 -1
- package/dist/server/services/permissions/sections-builder.mjs.map +1 -1
- package/dist/server/services/sanitize/index.js +2 -2
- package/dist/server/services/sanitize/index.js.map +1 -1
- package/dist/server/services/sanitize/index.mjs +1 -1
- package/dist/server/services/sanitize/index.mjs.map +1 -1
- package/dist/server/src/controllers/content-types.d.ts.map +1 -1
- package/dist/server/src/controllers/validate-locale-creation.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +1 -2
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/localization.d.ts +4 -0
- package/dist/server/src/localization.d.ts.map +1 -0
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/services/fill-from-locale.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/locales.d.ts.map +1 -1
- package/dist/server/src/services/metrics.d.ts.map +1 -1
- package/dist/server/src/validation/content-types.d.ts.map +1 -1
- package/dist/server/src/validation/locales.d.ts.map +1 -1
- package/dist/server/validation/content-types.js +1 -2
- package/dist/server/validation/content-types.js.map +1 -1
- package/dist/server/validation/content-types.mjs +1 -2
- package/dist/server/validation/content-types.mjs.map +1 -1
- package/dist/server/validation/locales.js +1 -2
- package/dist/server/validation/locales.js.map +1 -1
- package/dist/server/validation/locales.mjs +1 -2
- package/dist/server/validation/locales.mjs.map +1 -1
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fill-from-locale.mjs","sources":["../../../server/src/services/fill-from-locale.ts"],"sourcesContent":["import { isArray } from 'lodash/fp';\nimport { contentTypes } from '@strapi/utils';\nimport type { UID, Schema, Core } from '@strapi/types';\n\nconst READ_ACTION = 'plugin::content-manager.explorer.read';\nconst TEMP_KEY_DIGITS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\n\n/**\n * Returns the main display field for a model (e.g. title, name).\n * Uses content-manager configuration when available, falls back to first string attribute or 'id'.\n */\nconst getMainField = async (targetUid: UID.Schema): Promise<string> => {\n const contentManagerContentTypeService = strapi\n .plugin('content-manager')\n .service('content-types');\n const configuration = await contentManagerContentTypeService.findConfiguration({\n uid: targetUid,\n });\n return configuration.settings.mainField;\n};\n\n/**\n * Returns the display label for a relation in form state.\n * Empty configured values stay untranslated so the admin can provide its localized fallback.\n */\nconst getRelationLabel = (relation: Record<string, unknown>, mainField: string): string => {\n const label = relation[mainField];\n if (label === null || typeof label === 'string') return label ?? '';\n return String(relation.documentId ?? '');\n};\n\nconst FIELDS_TO_IGNORE = new Set([\n 'createdAt',\n 'createdBy',\n 'updatedAt',\n 'updatedBy',\n 'id',\n 'documentId',\n 'publishedAt',\n 'strapi_stage',\n 'strapi_assignee',\n 'locale',\n 'status',\n 'localizations',\n]);\n\nconst STATUS_FIELDS = new Set(['id', 'documentId', 'locale', 'updatedAt', 'publishedAt']);\n\n/**\n * Mirrors fractional-indexing's initial key range, i.e. generateNKeysBetween(undefined, undefined, n).\n */\nconst generateInitialTempKeys = (length: number): string[] => {\n let previousKey: string | undefined;\n\n return Array.from({ length }, () => {\n const nextKey = incrementInitialTempKey(previousKey);\n previousKey = nextKey;\n return nextKey;\n });\n};\n\nconst incrementInitialTempKey = (key?: string): string => {\n if (!key) {\n return `a${TEMP_KEY_DIGITS[0]}`;\n }\n\n const [head, ...digits] = key;\n let carry = true;\n\n for (let index = digits.length - 1; carry && index >= 0; index -= 1) {\n const nextDigitIndex = TEMP_KEY_DIGITS.indexOf(digits[index]) + 1;\n\n if (nextDigitIndex === 0) {\n throw new Error(`Invalid temporary key digit: ${digits[index]}`);\n }\n\n if (nextDigitIndex === TEMP_KEY_DIGITS.length) {\n digits[index] = TEMP_KEY_DIGITS[0];\n } else {\n digits[index] = TEMP_KEY_DIGITS[nextDigitIndex];\n carry = false;\n }\n }\n\n if (!carry) {\n return `${head}${digits.join('')}`;\n }\n\n if (head === 'z') {\n throw new Error('Cannot increment temporary keys any further');\n }\n\n const nextHead = String.fromCharCode(head.charCodeAt(0) + 1);\n if (nextHead > 'a') {\n digits.push(TEMP_KEY_DIGITS[0]);\n } else {\n digits.pop();\n }\n\n return `${nextHead}${digits.join('')}`;\n};\n\n/**\n * Normalizes a value to an array: arrays pass through, single values become [value], null/undefined become [].\n */\nconst normalizeToArray = (value: unknown): unknown[] => {\n if (isArray(value)) return value;\n if (value) return [value];\n return [];\n};\n\n/**\n * Type guard: returns true if the value is a valid relation object with documentId.\n */\nconst isValidRelation = (\n rel: unknown\n): rel is { documentId: string; id?: number; locale?: string } =>\n typeof rel === 'object' && rel !== null && 'documentId' in rel && !!(rel as any).documentId;\n\n/**\n * Maps relations from the source locale to target locale (batched for better performance).\n */\nconst resolveRelationsForLocaleBatch = async (\n relations: Array<{ documentId: string; id?: number; locale?: string }>,\n targetUid: UID.Schema,\n targetLocale: string\n): Promise<Array<{ documentId: string; id: number | string; locale?: string } | null>> => {\n const i18nContentTypesService = strapi.plugin('i18n')?.service('content-types');\n const isTargetLocalized = i18nContentTypesService?.isLocalizedContentType(\n strapi.getModel(targetUid)\n );\n\n if (!isTargetLocalized) {\n return relations.map((rel) => {\n if (rel.id === undefined) return null;\n return { documentId: rel.documentId, id: rel.id };\n });\n }\n\n const documentIds = [...new Set(relations.map((r) => r.documentId))];\n const targetEntriesQuery = {\n where: { documentId: { $in: documentIds }, locale: targetLocale },\n select: [...STATUS_FIELDS],\n };\n const targetEntries = await strapi.db.query(targetUid).findMany(targetEntriesQuery);\n const byDocumentId = new Map<string, (typeof targetEntries)[0]>();\n for (const e of targetEntries) {\n const existing = byDocumentId.get(e.documentId);\n if (!existing || (e.publishedAt === null && existing.publishedAt !== null)) {\n byDocumentId.set(e.documentId, e);\n }\n }\n\n return relations.map((rel) => {\n const entry = byDocumentId.get(rel.documentId);\n if (!entry) return null;\n return {\n documentId: entry.documentId,\n id: entry.id,\n locale: entry.locale,\n };\n });\n};\n\n/**\n * Builds the where clause for relation queries: documentIds + locales (when target model is localized).\n */\nconst buildWhereForRelations = (\n relations: Array<{ documentId: string; locale?: string }>,\n documentIds: string[],\n targetUid: UID.Schema\n): { documentId: { $in: string[] }; locale?: { $in: string[] } } => {\n const where: { documentId: { $in: string[] }; locale?: { $in: string[] } } = {\n documentId: { $in: documentIds },\n };\n const i18nContentTypesService = strapi.plugin('i18n')?.service('content-types');\n const isTargetLocalized = i18nContentTypesService?.isLocalizedContentType(\n strapi.getModel(targetUid)\n );\n if (isTargetLocalized) {\n const locales = [...new Set(relations.map((r) => r.locale).filter(Boolean))] as string[];\n if (locales.length > 0) {\n where.locale = { $in: locales };\n }\n }\n return where;\n};\n\n// ---------------------------------------------------------------------------\n// Batch pre-resolution\n// ---------------------------------------------------------------------------\n\ntype ValidRelation = { documentId: string; id?: number; locale?: string };\ntype ResolvedRelation = { documentId: string; id: number | string; locale?: string };\ntype RelationsByUid = Map<string, ValidRelation[]>;\n\ninterface UidResolutionData {\n blocked: boolean;\n mainField: string;\n /** sourceDocumentId → resolved entry in targetLocale (null if not found) */\n bySourceDocumentId: Map<string, ResolvedRelation | null>;\n /** resolvedEntry.id → status string */\n statusById: Map<number | string, string | undefined>;\n /** resolvedEntry.id → mainField value */\n labelById: Map<number | string, unknown>;\n}\n\n/**\n * Walk the full document tree and collect all valid relation objects grouped by targetUid.\n */\nconst collectRelationsByUid = (\n data: Record<string, unknown>,\n schema: Schema.ContentType | Schema.Component,\n components: Record<string, Schema.Component>\n): RelationsByUid => {\n const result: RelationsByUid = new Map();\n\n const addRels = (uid: string, rels: ValidRelation[]) => {\n const existing = result.get(uid) ?? [];\n result.set(uid, existing.concat(rels));\n };\n\n const collect = (d: Record<string, unknown>, s: Schema.ContentType | Schema.Component) => {\n if (!d || typeof d !== 'object') return;\n for (const [key, value] of Object.entries(d)) {\n const attribute = s?.attributes?.[key];\n if (!attribute) continue;\n\n if (attribute.type === 'relation') {\n const attr = attribute as Schema.Attribute.Relation & {\n relation?: string;\n target?: string;\n };\n if (attr.relation?.toLowerCase().includes('morph') || !attr.target) continue;\n const validRels = normalizeToArray(value).filter(isValidRelation);\n if (validRels.length > 0) addRels(attr.target, validRels);\n } else if (attribute.type === 'component') {\n const compSchema = (components[attribute.component] ?? {\n attributes: {},\n }) as Schema.Component;\n if (attribute.repeatable && isArray(value)) {\n for (const item of value as Record<string, unknown>[]) {\n collect(item, compSchema);\n }\n } else if (value) {\n collect(value as Record<string, unknown>, compSchema);\n }\n } else if (attribute.type === 'dynamiczone' && isArray(value)) {\n for (const item of value as Record<string, unknown>[]) {\n const compUid = (item as any)?.__component as string;\n const compSchema = (components[compUid] ?? { attributes: {} }) as Schema.Component;\n collect(item as Record<string, unknown>, compSchema);\n }\n }\n }\n };\n\n collect(data, schema);\n return result;\n};\n\n/**\n * Resolves all relation targets for the requested locale in batches (per related content-type UID):\n * locale mapping, permissions, status, and labels.\n */\nconst resolveAllRelationsBatched = async (\n relationsByUid: RelationsByUid,\n targetLocale: string,\n userAbility: any\n): Promise<Map<string, UidResolutionData>> => {\n const result = new Map<string, UidResolutionData>();\n await Promise.all(\n [...relationsByUid.entries()].map(async ([targetUid, allRels]) => {\n const empty: UidResolutionData = {\n blocked: !userAbility.can(READ_ACTION, targetUid),\n mainField: '',\n bySourceDocumentId: new Map(),\n statusById: new Map(),\n labelById: new Map(),\n };\n\n if (empty.blocked) {\n result.set(targetUid, empty);\n return;\n }\n\n const mainField = await getMainField(targetUid as UID.Schema);\n const validRels = allRels.filter(isValidRelation);\n\n if (validRels.length === 0) {\n result.set(targetUid, { ...empty, mainField });\n return;\n }\n\n // Deduplicate by documentId before querying\n const uniqueRels = [...new Map(validRels.map((r) => [r.documentId, r])).values()];\n const resolvedList = await resolveRelationsForLocaleBatch(\n uniqueRels,\n targetUid as UID.Schema,\n targetLocale\n );\n\n const bySourceDocumentId = new Map<string, ResolvedRelation | null>();\n for (let i = 0; i < uniqueRels.length; i += 1) {\n bySourceDocumentId.set(uniqueRels[i].documentId, resolvedList[i]);\n }\n\n const resolvedEntries = resolvedList.filter((r): r is ResolvedRelation => r !== null);\n\n if (resolvedEntries.length === 0) {\n result.set(targetUid, {\n blocked: false,\n mainField,\n bySourceDocumentId,\n statusById: new Map(),\n labelById: new Map(),\n });\n return;\n }\n\n const documentIds = [...new Set(resolvedEntries.map((r) => r.documentId))];\n const where = buildWhereForRelations(resolvedEntries, documentIds, targetUid as UID.Schema);\n\n const [allStatusEntries, labelEntries] = await Promise.all([\n contentTypes.hasDraftAndPublish(strapi.getModel(targetUid as UID.Schema))\n ? strapi.db.query(targetUid).findMany({ where, select: [...STATUS_FIELDS] })\n : Promise.resolve([]),\n strapi.db.query(targetUid).findMany({\n where,\n select: ['documentId', 'id', 'locale', mainField],\n }),\n ]);\n\n // Build status map\n const statusById = new Map<number | string, string | undefined>();\n if (allStatusEntries.length > 0) {\n const documentMetadata = strapi.plugin('content-manager')?.service('document-metadata');\n if (documentMetadata) {\n const model = strapi.getModel(targetUid as UID.Schema);\n const isLocalized = strapi\n .plugin('i18n')\n ?.service('content-types')\n ?.isLocalizedContentType(model);\n const groupKey = (e: { documentId: string; locale?: string }) =>\n isLocalized && e.locale ? `${e.documentId}:${e.locale}` : e.documentId;\n\n const byGroup = new Map<string, typeof allStatusEntries>();\n for (const e of allStatusEntries) {\n const key = groupKey(e);\n const list = byGroup.get(key) ?? [];\n list.push(e);\n byGroup.set(key, list);\n }\n\n for (const entry of resolvedEntries) {\n const key = groupKey(entry);\n const entries = byGroup.get(key) ?? [];\n if (!entries.length) continue;\n const version = entries.find((e) => e.id === entry.id) ?? entries[0];\n const otherVersions = entries.filter((e) => e.id !== version.id);\n statusById.set(entry.id, documentMetadata.getStatus(version, otherVersions));\n }\n }\n }\n\n // Build label map\n const labelById = new Map<number | string, unknown>();\n for (const entry of labelEntries) {\n labelById.set(entry.id, entry[mainField]);\n }\n\n result.set(targetUid, {\n blocked: false,\n mainField,\n bySourceDocumentId,\n statusById,\n labelById,\n });\n })\n );\n\n return result;\n};\n\n/**\n * Build the { connect, disconnect } for a single relation attribute using pre-fetched data.\n */\nconst buildConnectFromPreResolved = (\n value: unknown,\n attribute: Schema.Attribute.Relation,\n preResolved: Map<string, UidResolutionData>\n): { connect: unknown[]; disconnect: unknown[] } => {\n const attr = attribute as Schema.Attribute.Relation & { relation?: string; target?: string };\n if (attr.relation?.toLowerCase().includes('morph') || !attr.target) {\n return { connect: [], disconnect: [] };\n }\n\n const uidData = preResolved.get(attr.target);\n if (!uidData || uidData.blocked) {\n return { connect: [], disconnect: [] };\n }\n\n const validRels = normalizeToArray(value).filter(isValidRelation);\n if (validRels.length === 0) {\n return { connect: [], disconnect: [] };\n }\n\n const connect = validRels\n .map((rel, index) => {\n const resolved = uidData.bySourceDocumentId.get(rel.documentId);\n if (!resolved) return null;\n\n const status = uidData.statusById.get(resolved.id);\n const mainFieldValue = uidData.labelById.get(resolved.id);\n const relationWithMainField: Record<string, unknown> = {\n ...resolved,\n [uidData.mainField]: mainFieldValue,\n };\n if (status !== undefined) {\n relationWithMainField.status = status;\n }\n\n return {\n ...relationWithMainField,\n __temp_key__: `a${index}`,\n label: getRelationLabel(relationWithMainField, uidData.mainField),\n };\n })\n .filter((r): r is NonNullable<typeof r> => r !== null);\n\n return { connect, disconnect: [] };\n};\n\n/**\n * Recursively process document data: remove internal fields and resolve relations using\n * pre-fetched resolution data (no additional DB calls).\n */\nconst processDocumentData = async (\n data: Record<string, unknown>,\n schema: Schema.ContentType | Schema.Component,\n components: Record<string, Schema.Component>,\n preResolved: Map<string, UidResolutionData>\n): Promise<Record<string, unknown>> => {\n if (!data) {\n return {};\n }\n\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(data)) {\n if (FIELDS_TO_IGNORE.has(key)) {\n continue;\n }\n\n const attribute = schema?.attributes?.[key];\n if (!attribute) {\n result[key] = value;\n continue;\n }\n\n if (attribute.type === 'password') {\n continue;\n }\n\n if (attribute.type === 'relation') {\n result[key] = buildConnectFromPreResolved(\n value,\n attribute as Schema.Attribute.Relation,\n preResolved\n );\n continue;\n }\n\n if (attribute.type === 'component') {\n const compSchema = (components[attribute.component] || {\n attributes: {},\n }) as Schema.Component;\n if (attribute.repeatable && isArray(value)) {\n const tempKeys = generateInitialTempKeys(value.length);\n result[key] = await Promise.all(\n value.map(async (item: Record<string, unknown>, index: number) => {\n const processed = await processDocumentData(item, compSchema, components, preResolved);\n return { ...processed, __temp_key__: tempKeys[index] };\n })\n );\n } else if (value) {\n const processed = await processDocumentData(\n value as Record<string, unknown>,\n compSchema,\n components,\n preResolved\n );\n result[key] = processed;\n } else {\n result[key] = value;\n }\n continue;\n }\n\n if (attribute.type === 'dynamiczone' && isArray(value)) {\n const tempKeys = generateInitialTempKeys(value.length);\n result[key] = await Promise.all(\n value.map(async (item: Record<string, unknown>, index: number) => {\n const compSchema = (components[item?.__component as string] || {\n attributes: {},\n }) as Schema.Component;\n const processed = await processDocumentData(item, compSchema, components, preResolved);\n return { ...processed, __temp_key__: tempKeys[index] };\n })\n );\n continue;\n }\n\n result[key] = value;\n }\n\n return result;\n};\n\nexport const createFillFromLocaleService = ({ strapi }: { strapi: Core.Strapi }) => {\n return {\n /**\n * Fetch the raw populated document for the given locale without any transformation.\n * The caller is responsible for sanitizing the output before passing it to transformDocument.\n */\n async fetchRawDocument(model: UID.ContentType, sourceLocale: string, documentId?: string) {\n const populateBuilderService = strapi\n .plugin('content-manager')\n .service('populate-builder') as (uid: UID.ContentType) => {\n populateDeep: (level: number) => { build: () => Promise<unknown> };\n };\n const modelDef = strapi.getModel(model);\n\n if (!modelDef) {\n throw new Error(`Model ${model} not found`);\n }\n\n // Build populate WITHOUT countRelations so we get full relation objects\n const populate = await populateBuilderService(model).populateDeep(Infinity).build();\n\n const docs = strapi.documents(model);\n const baseParams = {\n locale: sourceLocale,\n populate: populate as never,\n };\n\n return documentId\n ? docs.findOne({ ...baseParams, documentId })\n : docs.findFirst({ ...baseParams });\n },\n\n /**\n * Transform a (sanitized) document: strip internal fields, resolve relations to the target\n * locale, and skip relations to content types the user cannot read.\n */\n async transformDocument(\n document: Record<string, unknown>,\n model: UID.ContentType,\n targetLocale: string,\n userAbility: any\n ) {\n const schema = strapi.getModel(model) as Schema.ContentType;\n const getComponentSchema = (uid: string) =>\n (strapi.getModel(uid as UID.Schema) ?? { attributes: {} }) as Schema.Component;\n const components = new Proxy({} as Record<string, Schema.Component>, {\n get(_, uid: string) {\n return getComponentSchema(uid);\n },\n });\n\n const relsByUid = collectRelationsByUid(document, schema, components);\n const preResolved = await resolveAllRelationsBatched(relsByUid, targetLocale, userAbility);\n return processDocumentData(document, schema, components, preResolved);\n },\n };\n};\n"],"names":["READ_ACTION","TEMP_KEY_DIGITS","getMainField","targetUid","contentManagerContentTypeService","strapi","plugin","service","configuration","findConfiguration","uid","settings","mainField","getRelationLabel","relation","label","String","documentId","FIELDS_TO_IGNORE","Set","STATUS_FIELDS","generateInitialTempKeys","length","previousKey","Array","from","nextKey","incrementInitialTempKey","key","head","digits","carry","index","nextDigitIndex","indexOf","Error","join","nextHead","fromCharCode","charCodeAt","push","pop","normalizeToArray","value","isArray","isValidRelation","rel","resolveRelationsForLocaleBatch","relations","targetLocale","i18nContentTypesService","isTargetLocalized","isLocalizedContentType","getModel","map","id","undefined","documentIds","r","targetEntriesQuery","where","$in","locale","select","targetEntries","db","query","findMany","byDocumentId","Map","e","existing","get","publishedAt","set","entry","buildWhereForRelations","locales","filter","Boolean","collectRelationsByUid","data","schema","components","result","addRels","rels","concat","collect","d","s","Object","entries","attribute","attributes","type","attr","toLowerCase","includes","target","validRels","compSchema","component","repeatable","item","compUid","__component","resolveAllRelationsBatched","relationsByUid","userAbility","Promise","all","allRels","empty","blocked","can","bySourceDocumentId","statusById","labelById","uniqueRels","values","resolvedList","i","resolvedEntries","allStatusEntries","labelEntries","contentTypes","hasDraftAndPublish","resolve","documentMetadata","model","isLocalized","groupKey","byGroup","list","version","find","otherVersions","getStatus","buildConnectFromPreResolved","preResolved","connect","disconnect","uidData","resolved","status","mainFieldValue","relationWithMainField","__temp_key__","processDocumentData","has","tempKeys","processed","createFillFromLocaleService","fetchRawDocument","sourceLocale","populateBuilderService","modelDef","populate","populateDeep","Infinity","build","docs","documents","baseParams","findOne","findFirst","transformDocument","document","getComponentSchema","Proxy","_","relsByUid"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fill-from-locale.mjs","sources":["../../../server/src/services/fill-from-locale.ts"],"sourcesContent":["import { contentTypes } from '@strapi/utils';\nimport type { UID, Schema, Core } from '@strapi/types';\n\nconst READ_ACTION = 'plugin::content-manager.explorer.read';\nconst TEMP_KEY_DIGITS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';\n\n/**\n * Returns the main display field for a model (e.g. title, name).\n * Uses content-manager configuration when available, falls back to first string attribute or 'id'.\n */\nconst getMainField = async (targetUid: UID.Schema): Promise<string> => {\n const contentManagerContentTypeService = strapi\n .plugin('content-manager')\n .service('content-types');\n const configuration = await contentManagerContentTypeService.findConfiguration({\n uid: targetUid,\n });\n return configuration.settings.mainField;\n};\n\n/**\n * Returns the display label for a relation in form state.\n * Empty configured values stay untranslated so the admin can provide its localized fallback.\n */\nconst getRelationLabel = (relation: Record<string, unknown>, mainField: string): string => {\n const label = relation[mainField];\n if (label === null || typeof label === 'string') return label ?? '';\n return String(relation.documentId ?? '');\n};\n\nconst FIELDS_TO_IGNORE = new Set([\n 'createdAt',\n 'createdBy',\n 'updatedAt',\n 'updatedBy',\n 'id',\n 'documentId',\n 'publishedAt',\n 'strapi_stage',\n 'strapi_assignee',\n 'locale',\n 'status',\n 'localizations',\n]);\n\nconst STATUS_FIELDS = new Set(['id', 'documentId', 'locale', 'updatedAt', 'publishedAt']);\n\n/**\n * Mirrors fractional-indexing's initial key range, i.e. generateNKeysBetween(undefined, undefined, n).\n */\nconst generateInitialTempKeys = (length: number): string[] => {\n let previousKey: string | undefined;\n\n return Array.from({ length }, () => {\n const nextKey = incrementInitialTempKey(previousKey);\n previousKey = nextKey;\n return nextKey;\n });\n};\n\nconst incrementInitialTempKey = (key?: string): string => {\n if (!key) {\n return `a${TEMP_KEY_DIGITS[0]}`;\n }\n\n const [head, ...digits] = key;\n let carry = true;\n\n for (let index = digits.length - 1; carry && index >= 0; index -= 1) {\n const nextDigitIndex = TEMP_KEY_DIGITS.indexOf(digits[index]) + 1;\n\n if (nextDigitIndex === 0) {\n throw new Error(`Invalid temporary key digit: ${digits[index]}`);\n }\n\n if (nextDigitIndex === TEMP_KEY_DIGITS.length) {\n digits[index] = TEMP_KEY_DIGITS[0];\n } else {\n digits[index] = TEMP_KEY_DIGITS[nextDigitIndex];\n carry = false;\n }\n }\n\n if (!carry) {\n return `${head}${digits.join('')}`;\n }\n\n if (head === 'z') {\n throw new Error('Cannot increment temporary keys any further');\n }\n\n const nextHead = String.fromCharCode(head.charCodeAt(0) + 1);\n if (nextHead > 'a') {\n digits.push(TEMP_KEY_DIGITS[0]);\n } else {\n digits.pop();\n }\n\n return `${nextHead}${digits.join('')}`;\n};\n\n/**\n * Normalizes a value to an array: arrays pass through, single values become [value], null/undefined become [].\n */\nconst normalizeToArray = (value: unknown): unknown[] => {\n if (Array.isArray(value)) return value;\n if (value) return [value];\n return [];\n};\n\n/**\n * Type guard: returns true if the value is a valid relation object with documentId.\n */\nconst isValidRelation = (\n rel: unknown\n): rel is { documentId: string; id?: number; locale?: string } =>\n typeof rel === 'object' && rel !== null && 'documentId' in rel && !!(rel as any).documentId;\n\n/**\n * Maps relations from the source locale to target locale (batched for better performance).\n */\nconst resolveRelationsForLocaleBatch = async (\n relations: Array<{ documentId: string; id?: number; locale?: string }>,\n targetUid: UID.Schema,\n targetLocale: string\n): Promise<Array<{ documentId: string; id: number | string; locale?: string } | null>> => {\n const i18nContentTypesService = strapi.plugin('i18n')?.service('content-types');\n const isTargetLocalized = i18nContentTypesService?.isLocalizedContentType(\n strapi.getModel(targetUid)\n );\n\n if (!isTargetLocalized) {\n return relations.map((rel) => {\n if (rel.id === undefined) return null;\n return { documentId: rel.documentId, id: rel.id };\n });\n }\n\n const documentIds = [...new Set(relations.map((r) => r.documentId))];\n const targetEntriesQuery = {\n where: { documentId: { $in: documentIds }, locale: targetLocale },\n select: [...STATUS_FIELDS],\n };\n const targetEntries = await strapi.db.query(targetUid).findMany(targetEntriesQuery);\n const byDocumentId = new Map<string, (typeof targetEntries)[0]>();\n for (const e of targetEntries) {\n const existing = byDocumentId.get(e.documentId);\n if (!existing || (e.publishedAt === null && existing.publishedAt !== null)) {\n byDocumentId.set(e.documentId, e);\n }\n }\n\n return relations.map((rel) => {\n const entry = byDocumentId.get(rel.documentId);\n if (!entry) return null;\n return {\n documentId: entry.documentId,\n id: entry.id,\n locale: entry.locale,\n };\n });\n};\n\n/**\n * Builds the where clause for relation queries: documentIds + locales (when target model is localized).\n */\nconst buildWhereForRelations = (\n relations: Array<{ documentId: string; locale?: string }>,\n documentIds: string[],\n targetUid: UID.Schema\n): { documentId: { $in: string[] }; locale?: { $in: string[] } } => {\n const where: { documentId: { $in: string[] }; locale?: { $in: string[] } } = {\n documentId: { $in: documentIds },\n };\n const i18nContentTypesService = strapi.plugin('i18n')?.service('content-types');\n const isTargetLocalized = i18nContentTypesService?.isLocalizedContentType(\n strapi.getModel(targetUid)\n );\n if (isTargetLocalized) {\n const locales = [...new Set(relations.map((r) => r.locale).filter(Boolean))] as string[];\n if (locales.length > 0) {\n where.locale = { $in: locales };\n }\n }\n return where;\n};\n\n// ---------------------------------------------------------------------------\n// Batch pre-resolution\n// ---------------------------------------------------------------------------\n\ntype ValidRelation = { documentId: string; id?: number; locale?: string };\ntype ResolvedRelation = { documentId: string; id: number | string; locale?: string };\ntype RelationsByUid = Map<string, ValidRelation[]>;\n\ninterface UidResolutionData {\n blocked: boolean;\n mainField: string;\n /** sourceDocumentId → resolved entry in targetLocale (null if not found) */\n bySourceDocumentId: Map<string, ResolvedRelation | null>;\n /** resolvedEntry.id → status string */\n statusById: Map<number | string, string | undefined>;\n /** resolvedEntry.id → mainField value */\n labelById: Map<number | string, unknown>;\n}\n\n/**\n * Walk the full document tree and collect all valid relation objects grouped by targetUid.\n */\nconst collectRelationsByUid = (\n data: Record<string, unknown>,\n schema: Schema.ContentType | Schema.Component,\n components: Record<string, Schema.Component>\n): RelationsByUid => {\n const result: RelationsByUid = new Map();\n\n const addRels = (uid: string, rels: ValidRelation[]) => {\n const existing = result.get(uid) ?? [];\n result.set(uid, existing.concat(rels));\n };\n\n const collect = (d: Record<string, unknown>, s: Schema.ContentType | Schema.Component) => {\n if (!d || typeof d !== 'object') return;\n for (const [key, value] of Object.entries(d)) {\n const attribute = s?.attributes?.[key];\n if (!attribute) continue;\n\n if (attribute.type === 'relation') {\n const attr = attribute as Schema.Attribute.Relation & {\n relation?: string;\n target?: string;\n };\n if (attr.relation?.toLowerCase().includes('morph') || !attr.target) continue;\n const validRels = normalizeToArray(value).filter(isValidRelation);\n if (validRels.length > 0) addRels(attr.target, validRels);\n } else if (attribute.type === 'component') {\n const compSchema = (components[attribute.component] ?? {\n attributes: {},\n }) as Schema.Component;\n if (attribute.repeatable && Array.isArray(value)) {\n for (const item of value as Record<string, unknown>[]) {\n collect(item, compSchema);\n }\n } else if (value) {\n collect(value as Record<string, unknown>, compSchema);\n }\n } else if (attribute.type === 'dynamiczone' && Array.isArray(value)) {\n for (const item of value as Record<string, unknown>[]) {\n const compUid = (item as any)?.__component as string;\n const compSchema = (components[compUid] ?? { attributes: {} }) as Schema.Component;\n collect(item as Record<string, unknown>, compSchema);\n }\n }\n }\n };\n\n collect(data, schema);\n return result;\n};\n\n/**\n * Resolves all relation targets for the requested locale in batches (per related content-type UID):\n * locale mapping, permissions, status, and labels.\n */\nconst resolveAllRelationsBatched = async (\n relationsByUid: RelationsByUid,\n targetLocale: string,\n userAbility: any\n): Promise<Map<string, UidResolutionData>> => {\n const result = new Map<string, UidResolutionData>();\n await Promise.all(\n [...relationsByUid.entries()].map(async ([targetUid, allRels]) => {\n const empty: UidResolutionData = {\n blocked: !userAbility.can(READ_ACTION, targetUid),\n mainField: '',\n bySourceDocumentId: new Map(),\n statusById: new Map(),\n labelById: new Map(),\n };\n\n if (empty.blocked) {\n result.set(targetUid, empty);\n return;\n }\n\n const mainField = await getMainField(targetUid as UID.Schema);\n const validRels = allRels.filter(isValidRelation);\n\n if (validRels.length === 0) {\n result.set(targetUid, { ...empty, mainField });\n return;\n }\n\n // Deduplicate by documentId before querying\n const uniqueRels = [...new Map(validRels.map((r) => [r.documentId, r])).values()];\n const resolvedList = await resolveRelationsForLocaleBatch(\n uniqueRels,\n targetUid as UID.Schema,\n targetLocale\n );\n\n const bySourceDocumentId = new Map<string, ResolvedRelation | null>();\n for (let i = 0; i < uniqueRels.length; i += 1) {\n bySourceDocumentId.set(uniqueRels[i].documentId, resolvedList[i]);\n }\n\n const resolvedEntries = resolvedList.filter((r): r is ResolvedRelation => r !== null);\n\n if (resolvedEntries.length === 0) {\n result.set(targetUid, {\n blocked: false,\n mainField,\n bySourceDocumentId,\n statusById: new Map(),\n labelById: new Map(),\n });\n return;\n }\n\n const documentIds = [...new Set(resolvedEntries.map((r) => r.documentId))];\n const where = buildWhereForRelations(resolvedEntries, documentIds, targetUid as UID.Schema);\n\n const [allStatusEntries, labelEntries] = await Promise.all([\n contentTypes.hasDraftAndPublish(strapi.getModel(targetUid as UID.Schema))\n ? strapi.db.query(targetUid).findMany({ where, select: [...STATUS_FIELDS] })\n : Promise.resolve([]),\n strapi.db.query(targetUid).findMany({\n where,\n select: ['documentId', 'id', 'locale', mainField],\n }),\n ]);\n\n // Build status map\n const statusById = new Map<number | string, string | undefined>();\n if (allStatusEntries.length > 0) {\n const documentMetadata = strapi.plugin('content-manager')?.service('document-metadata');\n if (documentMetadata) {\n const model = strapi.getModel(targetUid as UID.Schema);\n const isLocalized = strapi\n .plugin('i18n')\n ?.service('content-types')\n ?.isLocalizedContentType(model);\n const groupKey = (e: { documentId: string; locale?: string }) =>\n isLocalized && e.locale ? `${e.documentId}:${e.locale}` : e.documentId;\n\n const byGroup = new Map<string, typeof allStatusEntries>();\n for (const e of allStatusEntries) {\n const key = groupKey(e);\n const list = byGroup.get(key) ?? [];\n list.push(e);\n byGroup.set(key, list);\n }\n\n for (const entry of resolvedEntries) {\n const key = groupKey(entry);\n const entries = byGroup.get(key) ?? [];\n if (!entries.length) continue;\n const version = entries.find((e) => e.id === entry.id) ?? entries[0];\n const otherVersions = entries.filter((e) => e.id !== version.id);\n statusById.set(entry.id, documentMetadata.getStatus(version, otherVersions));\n }\n }\n }\n\n // Build label map\n const labelById = new Map<number | string, unknown>();\n for (const entry of labelEntries) {\n labelById.set(entry.id, entry[mainField]);\n }\n\n result.set(targetUid, {\n blocked: false,\n mainField,\n bySourceDocumentId,\n statusById,\n labelById,\n });\n })\n );\n\n return result;\n};\n\n/**\n * Build the { connect, disconnect } for a single relation attribute using pre-fetched data.\n */\nconst buildConnectFromPreResolved = (\n value: unknown,\n attribute: Schema.Attribute.Relation,\n preResolved: Map<string, UidResolutionData>\n): { connect: unknown[]; disconnect: unknown[] } => {\n const attr = attribute as Schema.Attribute.Relation & { relation?: string; target?: string };\n if (attr.relation?.toLowerCase().includes('morph') || !attr.target) {\n return { connect: [], disconnect: [] };\n }\n\n const uidData = preResolved.get(attr.target);\n if (!uidData || uidData.blocked) {\n return { connect: [], disconnect: [] };\n }\n\n const validRels = normalizeToArray(value).filter(isValidRelation);\n if (validRels.length === 0) {\n return { connect: [], disconnect: [] };\n }\n\n const connect = validRels\n .map((rel, index) => {\n const resolved = uidData.bySourceDocumentId.get(rel.documentId);\n if (!resolved) return null;\n\n const status = uidData.statusById.get(resolved.id);\n const mainFieldValue = uidData.labelById.get(resolved.id);\n const relationWithMainField: Record<string, unknown> = {\n ...resolved,\n [uidData.mainField]: mainFieldValue,\n };\n if (status !== undefined) {\n relationWithMainField.status = status;\n }\n\n return {\n ...relationWithMainField,\n __temp_key__: `a${index}`,\n label: getRelationLabel(relationWithMainField, uidData.mainField),\n };\n })\n .filter((r): r is NonNullable<typeof r> => r !== null);\n\n return { connect, disconnect: [] };\n};\n\n/**\n * Recursively process document data: remove internal fields and resolve relations using\n * pre-fetched resolution data (no additional DB calls).\n */\nconst processDocumentData = async (\n data: Record<string, unknown>,\n schema: Schema.ContentType | Schema.Component,\n components: Record<string, Schema.Component>,\n preResolved: Map<string, UidResolutionData>\n): Promise<Record<string, unknown>> => {\n if (!data) {\n return {};\n }\n\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(data)) {\n if (FIELDS_TO_IGNORE.has(key)) {\n continue;\n }\n\n const attribute = schema?.attributes?.[key];\n if (!attribute) {\n result[key] = value;\n continue;\n }\n\n if (attribute.type === 'password') {\n continue;\n }\n\n if (attribute.type === 'relation') {\n result[key] = buildConnectFromPreResolved(\n value,\n attribute as Schema.Attribute.Relation,\n preResolved\n );\n continue;\n }\n\n if (attribute.type === 'component') {\n const compSchema = (components[attribute.component] || {\n attributes: {},\n }) as Schema.Component;\n if (attribute.repeatable && Array.isArray(value)) {\n const tempKeys = generateInitialTempKeys(value.length);\n result[key] = await Promise.all(\n value.map(async (item: Record<string, unknown>, index: number) => {\n const processed = await processDocumentData(item, compSchema, components, preResolved);\n return { ...processed, __temp_key__: tempKeys[index] };\n })\n );\n } else if (value) {\n const processed = await processDocumentData(\n value as Record<string, unknown>,\n compSchema,\n components,\n preResolved\n );\n result[key] = processed;\n } else {\n result[key] = value;\n }\n continue;\n }\n\n if (attribute.type === 'dynamiczone' && Array.isArray(value)) {\n const tempKeys = generateInitialTempKeys(value.length);\n result[key] = await Promise.all(\n value.map(async (item: Record<string, unknown>, index: number) => {\n const compSchema = (components[item?.__component as string] || {\n attributes: {},\n }) as Schema.Component;\n const processed = await processDocumentData(item, compSchema, components, preResolved);\n return { ...processed, __temp_key__: tempKeys[index] };\n })\n );\n continue;\n }\n\n result[key] = value;\n }\n\n return result;\n};\n\nexport const createFillFromLocaleService = ({ strapi }: { strapi: Core.Strapi }) => {\n return {\n /**\n * Fetch the raw populated document for the given locale without any transformation.\n * The caller is responsible for sanitizing the output before passing it to transformDocument.\n */\n async fetchRawDocument(model: UID.ContentType, sourceLocale: string, documentId?: string) {\n const populateBuilderService = strapi\n .plugin('content-manager')\n .service('populate-builder') as (uid: UID.ContentType) => {\n populateDeep: (level: number) => { build: () => Promise<unknown> };\n };\n const modelDef = strapi.getModel(model);\n\n if (!modelDef) {\n throw new Error(`Model ${model} not found`);\n }\n\n // Build populate WITHOUT countRelations so we get full relation objects\n const populate = await populateBuilderService(model).populateDeep(Infinity).build();\n\n const docs = strapi.documents(model);\n const baseParams = {\n locale: sourceLocale,\n populate: populate as never,\n };\n\n return documentId\n ? docs.findOne({ ...baseParams, documentId })\n : docs.findFirst({ ...baseParams });\n },\n\n /**\n * Transform a (sanitized) document: strip internal fields, resolve relations to the target\n * locale, and skip relations to content types the user cannot read.\n */\n async transformDocument(\n document: Record<string, unknown>,\n model: UID.ContentType,\n targetLocale: string,\n userAbility: any\n ) {\n const schema = strapi.getModel(model) as Schema.ContentType;\n const getComponentSchema = (uid: string) =>\n (strapi.getModel(uid as UID.Schema) ?? { attributes: {} }) as Schema.Component;\n const components = new Proxy({} as Record<string, Schema.Component>, {\n get(_, uid: string) {\n return getComponentSchema(uid);\n },\n });\n\n const relsByUid = collectRelationsByUid(document, schema, components);\n const preResolved = await resolveAllRelationsBatched(relsByUid, targetLocale, userAbility);\n return processDocumentData(document, schema, components, preResolved);\n },\n };\n};\n"],"names":["READ_ACTION","TEMP_KEY_DIGITS","getMainField","targetUid","contentManagerContentTypeService","strapi","plugin","service","configuration","findConfiguration","uid","settings","mainField","getRelationLabel","relation","label","String","documentId","FIELDS_TO_IGNORE","Set","STATUS_FIELDS","generateInitialTempKeys","length","previousKey","Array","from","nextKey","incrementInitialTempKey","key","head","digits","carry","index","nextDigitIndex","indexOf","Error","join","nextHead","fromCharCode","charCodeAt","push","pop","normalizeToArray","value","isArray","isValidRelation","rel","resolveRelationsForLocaleBatch","relations","targetLocale","i18nContentTypesService","isTargetLocalized","isLocalizedContentType","getModel","map","id","undefined","documentIds","r","targetEntriesQuery","where","$in","locale","select","targetEntries","db","query","findMany","byDocumentId","Map","e","existing","get","publishedAt","set","entry","buildWhereForRelations","locales","filter","Boolean","collectRelationsByUid","data","schema","components","result","addRels","rels","concat","collect","d","s","Object","entries","attribute","attributes","type","attr","toLowerCase","includes","target","validRels","compSchema","component","repeatable","item","compUid","__component","resolveAllRelationsBatched","relationsByUid","userAbility","Promise","all","allRels","empty","blocked","can","bySourceDocumentId","statusById","labelById","uniqueRels","values","resolvedList","i","resolvedEntries","allStatusEntries","labelEntries","contentTypes","hasDraftAndPublish","resolve","documentMetadata","model","isLocalized","groupKey","byGroup","list","version","find","otherVersions","getStatus","buildConnectFromPreResolved","preResolved","connect","disconnect","uidData","resolved","status","mainFieldValue","relationWithMainField","__temp_key__","processDocumentData","has","tempKeys","processed","createFillFromLocaleService","fetchRawDocument","sourceLocale","populateBuilderService","modelDef","populate","populateDeep","Infinity","build","docs","documents","baseParams","findOne","findFirst","transformDocument","document","getComponentSchema","Proxy","_","relsByUid"],"mappings":"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"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var fp = require('lodash/fp');
|
|
4
3
|
var utils = require('@strapi/utils');
|
|
5
4
|
var index = require('../constants/index.js');
|
|
6
5
|
var index$1 = require('../utils/index.js');
|
|
@@ -133,7 +132,7 @@ const getDefaultLocale = ()=>index$1.getCoreStore().get({
|
|
|
133
132
|
key: 'default_locale'
|
|
134
133
|
});
|
|
135
134
|
const setIsDefault = async (locales)=>{
|
|
136
|
-
if (
|
|
135
|
+
if (locales == null) {
|
|
137
136
|
return locales;
|
|
138
137
|
}
|
|
139
138
|
const actualDefault = await getDefaultLocale();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locales.js","sources":["../../../server/src/services/locales.ts"],"sourcesContent":["import { isNil } from 'lodash/fp';\nimport { emitAudit } from '@strapi/utils';\nimport { AUDITED_EVENTS, 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, { isDefault = false }: { isDefault?: boolean } = {}) => {\n const result = await strapi.db.query('plugin::i18n.locale').create({ data: locale });\n\n getService('metrics').sendDidUpdateI18nLocalesEvent();\n\n if (result?.id) {\n await emitAudit({ strapi }, AUDITED_EVENTS.LOCALE_CREATE, {\n localeId: result.id,\n name: result.name,\n code: result.code,\n isDefault,\n });\n }\n\n return result;\n};\n\nconst update = async (params: any, updates: any) => {\n const previous = await strapi.db.query('plugin::i18n.locale').findOne({ where: params });\n\n const result = await strapi.db\n .query('plugin::i18n.locale')\n .update({ where: params, data: updates });\n\n getService('metrics').sendDidUpdateI18nLocalesEvent();\n\n if (result && previous?.name !== result.name) {\n await emitAudit({ strapi }, AUDITED_EVENTS.LOCALE_UPDATE, {\n localeId: result.id,\n name: result.name,\n code: result.code,\n changes: { name: { before: previous?.name ?? null, after: result.name } },\n });\n }\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 await emitAudit({ strapi }, AUDITED_EVENTS.LOCALE_DELETE, {\n localeId: localeToDelete.id,\n name: localeToDelete.name,\n code: localeToDelete.code,\n });\n\n return result;\n }\n\n return localeToDelete;\n};\n\nconst setDefaultLocale = async ({ code }: any) => {\n const previousCode = await getDefaultLocale();\n const hasChanged = previousCode !== code;\n\n // Look up the rows before the write: if this fails afterwards, the default is already\n // switched and nothing recorded it.\n const [previous, next] = hasChanged\n ? await Promise.all([previousCode ? findByCode(previousCode) : null, findByCode(code)])\n : [null, null];\n\n // set() is typed void but resolves to the store row. Returned so callers that used it\n // keep working.\n const result = await getCoreStore().set({ key: 'default_locale', value: code });\n\n if (hasChanged && next?.id) {\n const before = previousCode ? { id: previous?.id ?? null, code: previousCode } : null;\n\n await emitAudit({ strapi }, AUDITED_EVENTS.LOCALE_DEFAULT_UPDATE, {\n localeId: next.id,\n name: next.name,\n code: next.code,\n changes: { defaultLocale: { before, after: { id: next.id, code: next.code } } },\n });\n }\n\n return result;\n};\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"],"names":["find","params","strapi","db","query","findMany","where","findById","id","findOne","findByCode","code","count","create","locale","isDefault","result","data","getService","sendDidUpdateI18nLocalesEvent","emitAudit","AUDITED_EVENTS","LOCALE_CREATE","localeId","name","update","updates","previous","LOCALE_UPDATE","changes","before","after","deleteFn","localeToDelete","deleteAllLocalizedEntriesFor","delete","LOCALE_DELETE","setDefaultLocale","previousCode","getDefaultLocale","hasChanged","next","Promise","all","getCoreStore","set","key","value","LOCALE_DEFAULT_UPDATE","defaultLocale","get","setIsDefault","locales","isNil","actualDefault","Array","isArray","map","initDefaultLocale","existingLocalesNb","DEFAULT_LOCALE","isLocalizedContentType","localizedModels","Object","values","contentTypes","filter","model","uid","deleteMany"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"locales.js","sources":["../../../server/src/services/locales.ts"],"sourcesContent":["import { emitAudit } from '@strapi/utils';\nimport { AUDITED_EVENTS, 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, { isDefault = false }: { isDefault?: boolean } = {}) => {\n const result = await strapi.db.query('plugin::i18n.locale').create({ data: locale });\n\n getService('metrics').sendDidUpdateI18nLocalesEvent();\n\n if (result?.id) {\n await emitAudit({ strapi }, AUDITED_EVENTS.LOCALE_CREATE, {\n localeId: result.id,\n name: result.name,\n code: result.code,\n isDefault,\n });\n }\n\n return result;\n};\n\nconst update = async (params: any, updates: any) => {\n const previous = await strapi.db.query('plugin::i18n.locale').findOne({ where: params });\n\n const result = await strapi.db\n .query('plugin::i18n.locale')\n .update({ where: params, data: updates });\n\n getService('metrics').sendDidUpdateI18nLocalesEvent();\n\n if (result && previous?.name !== result.name) {\n await emitAudit({ strapi }, AUDITED_EVENTS.LOCALE_UPDATE, {\n localeId: result.id,\n name: result.name,\n code: result.code,\n changes: { name: { before: previous?.name ?? null, after: result.name } },\n });\n }\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 await emitAudit({ strapi }, AUDITED_EVENTS.LOCALE_DELETE, {\n localeId: localeToDelete.id,\n name: localeToDelete.name,\n code: localeToDelete.code,\n });\n\n return result;\n }\n\n return localeToDelete;\n};\n\nconst setDefaultLocale = async ({ code }: any) => {\n const previousCode = await getDefaultLocale();\n const hasChanged = previousCode !== code;\n\n // Look up the rows before the write: if this fails afterwards, the default is already\n // switched and nothing recorded it.\n const [previous, next] = hasChanged\n ? await Promise.all([previousCode ? findByCode(previousCode) : null, findByCode(code)])\n : [null, null];\n\n // set() is typed void but resolves to the store row. Returned so callers that used it\n // keep working.\n const result = await getCoreStore().set({ key: 'default_locale', value: code });\n\n if (hasChanged && next?.id) {\n const before = previousCode ? { id: previous?.id ?? null, code: previousCode } : null;\n\n await emitAudit({ strapi }, AUDITED_EVENTS.LOCALE_DEFAULT_UPDATE, {\n localeId: next.id,\n name: next.name,\n code: next.code,\n changes: { defaultLocale: { before, after: { id: next.id, code: next.code } } },\n });\n }\n\n return result;\n};\n\nconst getDefaultLocale = () => getCoreStore().get({ key: 'default_locale' });\n\nconst setIsDefault = async (locales: any) => {\n if (locales == null) {\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"],"names":["find","params","strapi","db","query","findMany","where","findById","id","findOne","findByCode","code","count","create","locale","isDefault","result","data","getService","sendDidUpdateI18nLocalesEvent","emitAudit","AUDITED_EVENTS","LOCALE_CREATE","localeId","name","update","updates","previous","LOCALE_UPDATE","changes","before","after","deleteFn","localeToDelete","deleteAllLocalizedEntriesFor","delete","LOCALE_DELETE","setDefaultLocale","previousCode","getDefaultLocale","hasChanged","next","Promise","all","getCoreStore","set","key","value","LOCALE_DEFAULT_UPDATE","defaultLocale","get","setIsDefault","locales","actualDefault","Array","isArray","map","initDefaultLocale","existingLocalesNb","DEFAULT_LOCALE","isLocalizedContentType","localizedModels","Object","values","contentTypes","filter","model","uid","deleteMany"],"mappings":"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"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { isNil } from 'lodash/fp';
|
|
2
1
|
import { emitAudit } from '@strapi/utils';
|
|
3
2
|
import { DEFAULT_LOCALE, AUDITED_EVENTS } from '../constants/index.mjs';
|
|
4
3
|
import { getService, getCoreStore } from '../utils/index.mjs';
|
|
@@ -131,7 +130,7 @@ const getDefaultLocale = ()=>getCoreStore().get({
|
|
|
131
130
|
key: 'default_locale'
|
|
132
131
|
});
|
|
133
132
|
const setIsDefault = async (locales)=>{
|
|
134
|
-
if (
|
|
133
|
+
if (locales == null) {
|
|
135
134
|
return locales;
|
|
136
135
|
}
|
|
137
136
|
const actualDefault = await getDefaultLocale();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locales.mjs","sources":["../../../server/src/services/locales.ts"],"sourcesContent":["import { isNil } from 'lodash/fp';\nimport { emitAudit } from '@strapi/utils';\nimport { AUDITED_EVENTS, 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, { isDefault = false }: { isDefault?: boolean } = {}) => {\n const result = await strapi.db.query('plugin::i18n.locale').create({ data: locale });\n\n getService('metrics').sendDidUpdateI18nLocalesEvent();\n\n if (result?.id) {\n await emitAudit({ strapi }, AUDITED_EVENTS.LOCALE_CREATE, {\n localeId: result.id,\n name: result.name,\n code: result.code,\n isDefault,\n });\n }\n\n return result;\n};\n\nconst update = async (params: any, updates: any) => {\n const previous = await strapi.db.query('plugin::i18n.locale').findOne({ where: params });\n\n const result = await strapi.db\n .query('plugin::i18n.locale')\n .update({ where: params, data: updates });\n\n getService('metrics').sendDidUpdateI18nLocalesEvent();\n\n if (result && previous?.name !== result.name) {\n await emitAudit({ strapi }, AUDITED_EVENTS.LOCALE_UPDATE, {\n localeId: result.id,\n name: result.name,\n code: result.code,\n changes: { name: { before: previous?.name ?? null, after: result.name } },\n });\n }\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 await emitAudit({ strapi }, AUDITED_EVENTS.LOCALE_DELETE, {\n localeId: localeToDelete.id,\n name: localeToDelete.name,\n code: localeToDelete.code,\n });\n\n return result;\n }\n\n return localeToDelete;\n};\n\nconst setDefaultLocale = async ({ code }: any) => {\n const previousCode = await getDefaultLocale();\n const hasChanged = previousCode !== code;\n\n // Look up the rows before the write: if this fails afterwards, the default is already\n // switched and nothing recorded it.\n const [previous, next] = hasChanged\n ? await Promise.all([previousCode ? findByCode(previousCode) : null, findByCode(code)])\n : [null, null];\n\n // set() is typed void but resolves to the store row. Returned so callers that used it\n // keep working.\n const result = await getCoreStore().set({ key: 'default_locale', value: code });\n\n if (hasChanged && next?.id) {\n const before = previousCode ? { id: previous?.id ?? null, code: previousCode } : null;\n\n await emitAudit({ strapi }, AUDITED_EVENTS.LOCALE_DEFAULT_UPDATE, {\n localeId: next.id,\n name: next.name,\n code: next.code,\n changes: { defaultLocale: { before, after: { id: next.id, code: next.code } } },\n });\n }\n\n return result;\n};\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"],"names":["find","params","strapi","db","query","findMany","where","findById","id","findOne","findByCode","code","count","create","locale","isDefault","result","data","getService","sendDidUpdateI18nLocalesEvent","emitAudit","AUDITED_EVENTS","LOCALE_CREATE","localeId","name","update","updates","previous","LOCALE_UPDATE","changes","before","after","deleteFn","localeToDelete","deleteAllLocalizedEntriesFor","delete","LOCALE_DELETE","setDefaultLocale","previousCode","getDefaultLocale","hasChanged","next","Promise","all","getCoreStore","set","key","value","LOCALE_DEFAULT_UPDATE","defaultLocale","get","setIsDefault","locales","isNil","actualDefault","Array","isArray","map","initDefaultLocale","existingLocalesNb","DEFAULT_LOCALE","isLocalizedContentType","localizedModels","Object","values","contentTypes","filter","model","uid","deleteMany"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"locales.mjs","sources":["../../../server/src/services/locales.ts"],"sourcesContent":["import { emitAudit } from '@strapi/utils';\nimport { AUDITED_EVENTS, 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, { isDefault = false }: { isDefault?: boolean } = {}) => {\n const result = await strapi.db.query('plugin::i18n.locale').create({ data: locale });\n\n getService('metrics').sendDidUpdateI18nLocalesEvent();\n\n if (result?.id) {\n await emitAudit({ strapi }, AUDITED_EVENTS.LOCALE_CREATE, {\n localeId: result.id,\n name: result.name,\n code: result.code,\n isDefault,\n });\n }\n\n return result;\n};\n\nconst update = async (params: any, updates: any) => {\n const previous = await strapi.db.query('plugin::i18n.locale').findOne({ where: params });\n\n const result = await strapi.db\n .query('plugin::i18n.locale')\n .update({ where: params, data: updates });\n\n getService('metrics').sendDidUpdateI18nLocalesEvent();\n\n if (result && previous?.name !== result.name) {\n await emitAudit({ strapi }, AUDITED_EVENTS.LOCALE_UPDATE, {\n localeId: result.id,\n name: result.name,\n code: result.code,\n changes: { name: { before: previous?.name ?? null, after: result.name } },\n });\n }\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 await emitAudit({ strapi }, AUDITED_EVENTS.LOCALE_DELETE, {\n localeId: localeToDelete.id,\n name: localeToDelete.name,\n code: localeToDelete.code,\n });\n\n return result;\n }\n\n return localeToDelete;\n};\n\nconst setDefaultLocale = async ({ code }: any) => {\n const previousCode = await getDefaultLocale();\n const hasChanged = previousCode !== code;\n\n // Look up the rows before the write: if this fails afterwards, the default is already\n // switched and nothing recorded it.\n const [previous, next] = hasChanged\n ? await Promise.all([previousCode ? findByCode(previousCode) : null, findByCode(code)])\n : [null, null];\n\n // set() is typed void but resolves to the store row. Returned so callers that used it\n // keep working.\n const result = await getCoreStore().set({ key: 'default_locale', value: code });\n\n if (hasChanged && next?.id) {\n const before = previousCode ? { id: previous?.id ?? null, code: previousCode } : null;\n\n await emitAudit({ strapi }, AUDITED_EVENTS.LOCALE_DEFAULT_UPDATE, {\n localeId: next.id,\n name: next.name,\n code: next.code,\n changes: { defaultLocale: { before, after: { id: next.id, code: next.code } } },\n });\n }\n\n return result;\n};\n\nconst getDefaultLocale = () => getCoreStore().get({ key: 'default_locale' });\n\nconst setIsDefault = async (locales: any) => {\n if (locales == null) {\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"],"names":["find","params","strapi","db","query","findMany","where","findById","id","findOne","findByCode","code","count","create","locale","isDefault","result","data","getService","sendDidUpdateI18nLocalesEvent","emitAudit","AUDITED_EVENTS","LOCALE_CREATE","localeId","name","update","updates","previous","LOCALE_UPDATE","changes","before","after","deleteFn","localeToDelete","deleteAllLocalizedEntriesFor","delete","LOCALE_DELETE","setDefaultLocale","previousCode","getDefaultLocale","hasChanged","next","Promise","all","getCoreStore","set","key","value","LOCALE_DEFAULT_UPDATE","defaultLocale","get","setIsDefault","locales","actualDefault","Array","isArray","map","initDefaultLocale","existingLocalesNb","DEFAULT_LOCALE","isLocalizedContentType","localizedModels","Object","values","contentTypes","filter","model","uid","deleteMany"],"mappings":";;;;AAIA,MAAMA,IAAAA,GAAO,CAACC,MAAAA,GAAc,EAAE,GAC5BC,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAAC,qBAAA,CAAA,CAAuBC,QAAQ,CAAC;QAAEC,KAAAA,EAAOL;AAAO,KAAA,CAAA;AAElE,MAAMM,QAAAA,GAAW,CAACC,EAAAA,GAAYN,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAAC,qBAAA,CAAA,CAAuBK,OAAO,CAAC;QAAEH,KAAAA,EAAO;AAAEE,YAAAA;AAAG;AAAE,KAAA,CAAA;AAE7F,MAAME,UAAAA,GAAa,CAACC,IAAAA,GAClBT,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAAC,qBAAA,CAAA,CAAuBK,OAAO,CAAC;QAAEH,KAAAA,EAAO;AAAEK,YAAAA;AAAK;AAAE,KAAA,CAAA;AAEnE,MAAMC,KAAAA,GAAQ,CAACX,MAAAA,GAAc,EAAE,GAAKC,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAAC,qBAAA,CAAA,CAAuBQ,KAAK,CAAC;QAAEN,KAAAA,EAAOL;AAAO,KAAA,CAAA;AAEjG,MAAMY,MAAAA,GAAS,OAAOC,MAAAA,EAAa,EAAEC,YAAY,KAAK,EAA2B,GAAG,EAAE,GAAA;IACpF,MAAMC,MAAAA,GAAS,MAAMd,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAAC,qBAAA,CAAA,CAAuBS,MAAM,CAAC;QAAEI,IAAAA,EAAMH;AAAO,KAAA,CAAA;AAElFI,IAAAA,UAAAA,CAAW,WAAWC,6BAA6B,EAAA;AAEnD,IAAA,IAAIH,QAAQR,EAAAA,EAAI;AACd,QAAA,MAAMY,SAAAA,CAAU;AAAElB,YAAAA;SAAO,EAAGmB,cAAAA,CAAeC,aAAa,EAAE;AACxDC,YAAAA,QAAAA,EAAUP,OAAOR,EAAE;AACnBgB,YAAAA,IAAAA,EAAMR,OAAOQ,IAAI;AACjBb,YAAAA,IAAAA,EAAMK,OAAOL,IAAI;AACjBI,YAAAA;AACF,SAAA,CAAA;AACF,IAAA;IAEA,OAAOC,MAAAA;AACT,CAAA;AAEA,MAAMS,MAAAA,GAAS,OAAOxB,MAAAA,EAAayB,OAAAA,GAAAA;IACjC,MAAMC,QAAAA,GAAW,MAAMzB,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAAC,qBAAA,CAAA,CAAuBK,OAAO,CAAC;QAAEH,KAAAA,EAAOL;AAAO,KAAA,CAAA;IAEtF,MAAMe,MAAAA,GAAS,MAAMd,MAAAA,CAAOC,EAAE,CAC3BC,KAAK,CAAC,qBAAA,CAAA,CACNqB,MAAM,CAAC;QAAEnB,KAAAA,EAAOL,MAAAA;QAAQgB,IAAAA,EAAMS;AAAQ,KAAA,CAAA;AAEzCR,IAAAA,UAAAA,CAAW,WAAWC,6BAA6B,EAAA;AAEnD,IAAA,IAAIH,MAAAA,IAAUW,QAAAA,EAAUH,IAAAA,KAASR,MAAAA,CAAOQ,IAAI,EAAE;AAC5C,QAAA,MAAMJ,SAAAA,CAAU;AAAElB,YAAAA;SAAO,EAAGmB,cAAAA,CAAeO,aAAa,EAAE;AACxDL,YAAAA,QAAAA,EAAUP,OAAOR,EAAE;AACnBgB,YAAAA,IAAAA,EAAMR,OAAOQ,IAAI;AACjBb,YAAAA,IAAAA,EAAMK,OAAOL,IAAI;YACjBkB,OAAAA,EAAS;gBAAEL,IAAAA,EAAM;AAAEM,oBAAAA,MAAAA,EAAQH,UAAUH,IAAAA,IAAQ,IAAA;AAAMO,oBAAAA,KAAAA,EAAOf,OAAOQ;AAAK;AAAE;AAC1E,SAAA,CAAA;AACF,IAAA;IAEA,OAAOR,MAAAA;AACT,CAAA;AAEA,MAAMgB,QAAAA,GAAW,OAAO,EAAExB,EAAE,EAAO,GAAA;IACjC,MAAMyB,cAAAA,GAAiB,MAAM1B,QAAAA,CAASC,EAAAA,CAAAA;AAEtC,IAAA,IAAIyB,cAAAA,EAAgB;AAClB,QAAA,MAAMC,4BAAAA,CAA6B;AAAEpB,YAAAA,MAAAA,EAAQmB,eAAetB;AAAK,SAAA,CAAA;QACjE,MAAMK,MAAAA,GAAS,MAAMd,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAAC,qBAAA,CAAA,CAAuB+B,MAAM,CAAC;YAAE7B,KAAAA,EAAO;AAAEE,gBAAAA;AAAG;AAAE,SAAA,CAAA;AAEnFU,QAAAA,UAAAA,CAAW,WAAWC,6BAA6B,EAAA;AAEnD,QAAA,MAAMC,SAAAA,CAAU;AAAElB,YAAAA;SAAO,EAAGmB,cAAAA,CAAee,aAAa,EAAE;AACxDb,YAAAA,QAAAA,EAAUU,eAAezB,EAAE;AAC3BgB,YAAAA,IAAAA,EAAMS,eAAeT,IAAI;AACzBb,YAAAA,IAAAA,EAAMsB,eAAetB;AACvB,SAAA,CAAA;QAEA,OAAOK,MAAAA;AACT,IAAA;IAEA,OAAOiB,cAAAA;AACT,CAAA;AAEA,MAAMI,gBAAAA,GAAmB,OAAO,EAAE1B,IAAI,EAAO,GAAA;AAC3C,IAAA,MAAM2B,eAAe,MAAMC,gBAAAA,EAAAA;AAC3B,IAAA,MAAMC,aAAaF,YAAAA,KAAiB3B,IAAAA;;;IAIpC,MAAM,CAACgB,UAAUc,IAAAA,CAAK,GAAGD,aACrB,MAAME,OAAAA,CAAQC,GAAG,CAAC;AAACL,QAAAA,YAAAA,GAAe5B,WAAW4B,YAAAA,CAAAA,GAAgB,IAAA;QAAM5B,UAAAA,CAAWC,IAAAA;KAAM,CAAA,GACpF;AAAC,QAAA,IAAA;AAAM,QAAA;AAAK,KAAA;;;AAIhB,IAAA,MAAMK,MAAAA,GAAS,MAAM4B,YAAAA,EAAAA,CAAeC,GAAG,CAAC;QAAEC,GAAAA,EAAK,gBAAA;QAAkBC,KAAAA,EAAOpC;AAAK,KAAA,CAAA;IAE7E,IAAI6B,UAAAA,IAAcC,MAAMjC,EAAAA,EAAI;AAC1B,QAAA,MAAMsB,SAASQ,YAAAA,GAAe;AAAE9B,YAAAA,EAAAA,EAAImB,UAAUnB,EAAAA,IAAM,IAAA;YAAMG,IAAAA,EAAM2B;SAAa,GAAI,IAAA;AAEjF,QAAA,MAAMlB,SAAAA,CAAU;AAAElB,YAAAA;SAAO,EAAGmB,cAAAA,CAAe2B,qBAAqB,EAAE;AAChEzB,YAAAA,QAAAA,EAAUkB,KAAKjC,EAAE;AACjBgB,YAAAA,IAAAA,EAAMiB,KAAKjB,IAAI;AACfb,YAAAA,IAAAA,EAAM8B,KAAK9B,IAAI;YACfkB,OAAAA,EAAS;gBAAEoB,aAAAA,EAAe;AAAEnB,oBAAAA,MAAAA;oBAAQC,KAAAA,EAAO;AAAEvB,wBAAAA,EAAAA,EAAIiC,KAAKjC,EAAE;AAAEG,wBAAAA,IAAAA,EAAM8B,KAAK9B;AAAK;AAAE;AAAE;AAChF,SAAA,CAAA;AACF,IAAA;IAEA,OAAOK,MAAAA;AACT,CAAA;AAEA,MAAMuB,gBAAAA,GAAmB,IAAMK,YAAAA,EAAAA,CAAeM,GAAG,CAAC;QAAEJ,GAAAA,EAAK;AAAiB,KAAA,CAAA;AAE1E,MAAMK,eAAe,OAAOC,OAAAA,GAAAA;AAC1B,IAAA,IAAIA,WAAW,IAAA,EAAM;QACnB,OAAOA,OAAAA;AACT,IAAA;AAEA,IAAA,MAAMC,gBAAgB,MAAMd,gBAAAA,EAAAA;IAE5B,IAAIe,KAAAA,CAAMC,OAAO,CAACH,OAAAA,CAAAA,EAAU;AAC1B,QAAA,OAAOA,OAAAA,CAAQI,GAAG,CAAC,CAAC1C,UAAY;AAAE,gBAAA,GAAGA,MAAM;gBAAEC,SAAAA,EAAWsC,aAAAA,KAAkBvC,OAAOH;aAAK,CAAA,CAAA;AACxF,IAAA;;IAEA,OAAO;AAAE,QAAA,GAAGyC,OAAO;QAAErC,SAAAA,EAAWsC,aAAAA,KAAkBD,QAAQzC;AAAK,KAAA;AACjE,CAAA;AAEA,MAAM8C,iBAAAA,GAAoB,UAAA;IACxB,MAAMC,iBAAAA,GAAoB,MAAMxD,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAAC,uBAAuBQ,KAAK,EAAA;AAC5E,IAAA,IAAI8C,sBAAsB,CAAA,EAAG;AAC3B,QAAA,MAAM7C,MAAAA,CAAO8C,cAAAA,CAAAA;AACb,QAAA,MAAMtB,gBAAAA,CAAiB;AAAE1B,YAAAA,IAAAA,EAAMgD,eAAehD;AAAK,SAAA,CAAA;AACrD,IAAA;AACF,CAAA;AAEA,MAAMuB,4BAAAA,GAA+B,OAAO,EAAEpB,MAAM,EAAO,GAAA;AACzD,IAAA,MAAM,EAAE8C,sBAAsB,EAAE,GAAG1C,UAAAA,CAAW,eAAA,CAAA;IAE9C,MAAM2C,eAAAA,GAAkBC,OAAOC,MAAM,CAAC7D,OAAO8D,YAAY,CAAA,CAAEC,MAAM,CAACL,sBAAAA,CAAAA;IAElE,KAAK,MAAMM,SAASL,eAAAA,CAAiB;;QAEnC,MAAM3D,MAAAA,CAAOC,EAAE,CAACC,KAAK,CAAC8D,KAAAA,CAAMC,GAAG,CAAA,CAAEC,UAAU,CAAC;YAAE9D,KAAAA,EAAO;AAAEQ,gBAAAA;AAAO;AAAE,SAAA,CAAA;AAClE,IAAA;AACF,CAAA;AAEA,MAAMsC,OAAAA,GAAU,KAAO;AACrBpD,QAAAA,IAAAA;AACAO,QAAAA,QAAAA;AACAG,QAAAA,UAAAA;AACAG,QAAAA,MAAAA;AACAY,QAAAA,MAAAA;AACAb,QAAAA,KAAAA;AACAyB,QAAAA,gBAAAA;AACAE,QAAAA,gBAAAA;AACAY,QAAAA,YAAAA;QACAhB,MAAAA,EAAQH,QAAAA;AACRyB,QAAAA;KACF;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _ = require('lodash');
|
|
4
4
|
var utils = require('@strapi/utils');
|
|
5
5
|
var index = require('../utils/index.js');
|
|
6
6
|
|
|
@@ -48,7 +48,7 @@ var index = require('../utils/index.js');
|
|
|
48
48
|
*/ const syncNonLocalizedAttributes = async (sourceEntry, model)=>{
|
|
49
49
|
const { copyNonLocalizedAttributes } = index.getService('content-types');
|
|
50
50
|
const nonLocalizedAttributes = copyNonLocalizedAttributes(model, sourceEntry);
|
|
51
|
-
if (
|
|
51
|
+
if (_.isEmpty(nonLocalizedAttributes)) {
|
|
52
52
|
return;
|
|
53
53
|
}
|
|
54
54
|
const normalizedNonLocalizedAttributes = normalizeMediaIds(model, nonLocalizedAttributes);
|
|
@@ -75,7 +75,7 @@ var index = require('../utils/index.js');
|
|
|
75
75
|
});
|
|
76
76
|
const entryData = await strapi.documents(uid).omitComponentData(normalizedNonLocalizedAttributes);
|
|
77
77
|
await utils.async.map(localeEntriesToUpdate, async (entry)=>{
|
|
78
|
-
const transformedData = await strapi.documents.utils.transformData(
|
|
78
|
+
const transformedData = await strapi.documents.utils.transformData(_.cloneDeep(normalizedNonLocalizedAttributes), {
|
|
79
79
|
uid,
|
|
80
80
|
status,
|
|
81
81
|
locale: entry.locale,
|
|
@@ -96,7 +96,7 @@ var index = require('../utils/index.js');
|
|
|
96
96
|
},
|
|
97
97
|
// The data we send to the update function is the entry data merged with
|
|
98
98
|
// the updated component data
|
|
99
|
-
data: Object.assign(
|
|
99
|
+
data: Object.assign(_.cloneDeep(entryData), componentData)
|
|
100
100
|
});
|
|
101
101
|
});
|
|
102
102
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localizations.js","sources":["../../../server/src/services/localizations.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"localizations.js","sources":["../../../server/src/services/localizations.ts"],"sourcesContent":["import { isEmpty, cloneDeep } from 'lodash';\n\nimport type { Schema } from '@strapi/types';\nimport { async } from '@strapi/utils';\nimport { getService } from '../utils';\n\n/**\n * Mutates the provided data object in place and returns the same reference\n * with populated media values replaced by their upload file IDs.\n */\nconst normalizeMediaIds = (\n schema: Schema.ContentType | Schema.Component,\n data: Record<string, any>\n): Record<string, any> => {\n if (!schema?.attributes || !data || typeof data !== 'object') {\n return data;\n }\n\n Object.entries(schema.attributes).forEach(([attributeName, attribute]) => {\n const value = data[attributeName];\n\n if (value == null) {\n return;\n }\n\n if (attribute.type === 'media') {\n if (attribute.multiple) {\n data[attributeName] = Array.isArray(value)\n ? value.map((file: unknown) =>\n file && typeof file === 'object' && 'id' in file ? file.id : file\n )\n : value;\n } else {\n data[attributeName] =\n value && typeof value === 'object' && 'id' in value ? value.id : value;\n }\n\n return;\n }\n\n if (attribute.type === 'component') {\n const componentSchema = strapi.getModel(attribute.component);\n\n if (attribute.repeatable && Array.isArray(value)) {\n value.forEach((componentValue: Record<string, any>) =>\n normalizeMediaIds(componentSchema, componentValue)\n );\n } else {\n normalizeMediaIds(componentSchema, value);\n }\n\n return;\n }\n\n if (attribute.type === 'dynamiczone' && Array.isArray(value)) {\n value.forEach((componentValue: Record<string, any>) => {\n if (componentValue?.__component) {\n normalizeMediaIds(strapi.getModel(componentValue.__component), componentValue);\n }\n });\n }\n });\n\n return data;\n};\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 normalizedNonLocalizedAttributes = normalizeMediaIds(model, nonLocalizedAttributes);\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(normalizedNonLocalizedAttributes);\n\n await async.map(localeEntriesToUpdate, async (entry: any) => {\n const transformedData = await strapi.documents.utils.transformData(\n cloneDeep(normalizedNonLocalizedAttributes),\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"],"names":["normalizeMediaIds","schema","data","attributes","Object","entries","forEach","attributeName","attribute","value","type","multiple","Array","isArray","map","file","id","componentSchema","strapi","getModel","component","repeatable","componentValue","__component","syncNonLocalizedAttributes","sourceEntry","model","copyNonLocalizedAttributes","getService","nonLocalizedAttributes","isEmpty","normalizedNonLocalizedAttributes","uid","documentId","locale","status","publishedAt","localeEntriesToUpdate","db","query","findMany","where","$ne","select","entryData","documents","omitComponentData","async","entry","transformedData","utils","transformData","cloneDeep","allowMissingId","componentData","updateComponents","update","$eq","assign","localizations"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localizations.mjs","sources":["../../../server/src/services/localizations.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"localizations.mjs","sources":["../../../server/src/services/localizations.ts"],"sourcesContent":["import { isEmpty, cloneDeep } from 'lodash';\n\nimport type { Schema } from '@strapi/types';\nimport { async } from '@strapi/utils';\nimport { getService } from '../utils';\n\n/**\n * Mutates the provided data object in place and returns the same reference\n * with populated media values replaced by their upload file IDs.\n */\nconst normalizeMediaIds = (\n schema: Schema.ContentType | Schema.Component,\n data: Record<string, any>\n): Record<string, any> => {\n if (!schema?.attributes || !data || typeof data !== 'object') {\n return data;\n }\n\n Object.entries(schema.attributes).forEach(([attributeName, attribute]) => {\n const value = data[attributeName];\n\n if (value == null) {\n return;\n }\n\n if (attribute.type === 'media') {\n if (attribute.multiple) {\n data[attributeName] = Array.isArray(value)\n ? value.map((file: unknown) =>\n file && typeof file === 'object' && 'id' in file ? file.id : file\n )\n : value;\n } else {\n data[attributeName] =\n value && typeof value === 'object' && 'id' in value ? value.id : value;\n }\n\n return;\n }\n\n if (attribute.type === 'component') {\n const componentSchema = strapi.getModel(attribute.component);\n\n if (attribute.repeatable && Array.isArray(value)) {\n value.forEach((componentValue: Record<string, any>) =>\n normalizeMediaIds(componentSchema, componentValue)\n );\n } else {\n normalizeMediaIds(componentSchema, value);\n }\n\n return;\n }\n\n if (attribute.type === 'dynamiczone' && Array.isArray(value)) {\n value.forEach((componentValue: Record<string, any>) => {\n if (componentValue?.__component) {\n normalizeMediaIds(strapi.getModel(componentValue.__component), componentValue);\n }\n });\n }\n });\n\n return data;\n};\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 normalizedNonLocalizedAttributes = normalizeMediaIds(model, nonLocalizedAttributes);\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(normalizedNonLocalizedAttributes);\n\n await async.map(localeEntriesToUpdate, async (entry: any) => {\n const transformedData = await strapi.documents.utils.transformData(\n cloneDeep(normalizedNonLocalizedAttributes),\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"],"names":["normalizeMediaIds","schema","data","attributes","Object","entries","forEach","attributeName","attribute","value","type","multiple","Array","isArray","map","file","id","componentSchema","strapi","getModel","component","repeatable","componentValue","__component","syncNonLocalizedAttributes","sourceEntry","model","copyNonLocalizedAttributes","getService","nonLocalizedAttributes","isEmpty","normalizedNonLocalizedAttributes","uid","documentId","locale","status","publishedAt","localeEntriesToUpdate","db","query","findMany","where","$ne","select","entryData","documents","omitComponentData","async","entry","transformedData","utils","transformData","cloneDeep","allowMissingId","componentData","updateComponents","update","$eq","assign","localizations"],"mappings":"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"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var fp = require('lodash/fp');
|
|
4
3
|
var index = require('../utils/index.js');
|
|
5
4
|
|
|
6
5
|
const sendDidInitializeEvent = async ()=>{
|
|
7
6
|
const { isLocalizedContentType } = index.getService('content-types');
|
|
8
7
|
// 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.
|
|
9
|
-
const numberOfContentTypes =
|
|
8
|
+
const numberOfContentTypes = Object.values(strapi.contentTypes ?? {}).filter((contentType)=>isLocalizedContentType(contentType)).length;
|
|
10
9
|
strapi.telemetry.send('didInitializeI18n', {
|
|
11
10
|
groupProperties: {
|
|
12
11
|
numberOfContentTypes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.js","sources":["../../../server/src/services/metrics.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"metrics.js","sources":["../../../server/src/services/metrics.ts"],"sourcesContent":["import { 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 = Object.values(strapi.contentTypes ?? {}).filter((contentType) =>\n isLocalizedContentType(contentType)\n ).length;\n\n strapi.telemetry\n .send('didInitializeI18n', { groupProperties: { numberOfContentTypes } })\n .catch(() => {});\n};\n\nconst sendDidUpdateI18nLocalesEvent = async () => {\n const numberOfLocales = await getService('locales').count();\n\n strapi.telemetry\n .send('didUpdateI18nLocales', {\n groupProperties: { numberOfLocales },\n })\n .catch(() => {});\n};\n\nconst metrics = () => ({\n sendDidInitializeEvent,\n sendDidUpdateI18nLocalesEvent,\n});\n\ntype MetricsService = typeof metrics;\n\nexport default metrics;\nexport type { MetricsService };\n"],"names":["sendDidInitializeEvent","isLocalizedContentType","getService","numberOfContentTypes","Object","values","strapi","contentTypes","filter","contentType","length","telemetry","send","groupProperties","catch","sendDidUpdateI18nLocalesEvent","numberOfLocales","count","metrics"],"mappings":";;;;AAEA,MAAMA,sBAAAA,GAAyB,UAAA;AAC7B,IAAA,MAAM,EAAEC,sBAAsB,EAAE,GAAGC,gBAAAA,CAAW,eAAA,CAAA;;AAG9C,IAAA,MAAMC,oBAAAA,GAAuBC,MAAAA,CAAOC,MAAM,CAACC,OAAOC,YAAY,IAAI,EAAC,CAAA,CAAGC,MAAM,CAAC,CAACC,WAAAA,GAC5ER,sBAAAA,CAAuBQ,cACvBC,MAAM;AAERJ,IAAAA,MAAAA,CAAOK,SAAS,CACbC,IAAI,CAAC,mBAAA,EAAqB;QAAEC,eAAAA,EAAiB;AAAEV,YAAAA;AAAqB;KAAE,CAAA,CACtEW,KAAK,CAAC,IAAA,CAAO,CAAA,CAAA;AAClB,CAAA;AAEA,MAAMC,6BAAAA,GAAgC,UAAA;AACpC,IAAA,MAAMC,eAAAA,GAAkB,MAAMd,gBAAAA,CAAW,SAAA,CAAA,CAAWe,KAAK,EAAA;AAEzDX,IAAAA,MAAAA,CAAOK,SAAS,CACbC,IAAI,CAAC,sBAAA,EAAwB;QAC5BC,eAAAA,EAAiB;AAAEG,YAAAA;AAAgB;KACrC,CAAA,CACCF,KAAK,CAAC,IAAA,CAAO,CAAA,CAAA;AAClB,CAAA;AAEA,MAAMI,OAAAA,GAAU,KAAO;AACrBlB,QAAAA,sBAAAA;AACAe,QAAAA;KACF;;;;"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { reduce } from 'lodash/fp';
|
|
2
1
|
import { getService } from '../utils/index.mjs';
|
|
3
2
|
|
|
4
3
|
const sendDidInitializeEvent = async ()=>{
|
|
5
4
|
const { isLocalizedContentType } = getService('content-types');
|
|
6
5
|
// 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.
|
|
7
|
-
const numberOfContentTypes =
|
|
6
|
+
const numberOfContentTypes = Object.values(strapi.contentTypes ?? {}).filter((contentType)=>isLocalizedContentType(contentType)).length;
|
|
8
7
|
strapi.telemetry.send('didInitializeI18n', {
|
|
9
8
|
groupProperties: {
|
|
10
9
|
numberOfContentTypes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.mjs","sources":["../../../server/src/services/metrics.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"metrics.mjs","sources":["../../../server/src/services/metrics.ts"],"sourcesContent":["import { 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 = Object.values(strapi.contentTypes ?? {}).filter((contentType) =>\n isLocalizedContentType(contentType)\n ).length;\n\n strapi.telemetry\n .send('didInitializeI18n', { groupProperties: { numberOfContentTypes } })\n .catch(() => {});\n};\n\nconst sendDidUpdateI18nLocalesEvent = async () => {\n const numberOfLocales = await getService('locales').count();\n\n strapi.telemetry\n .send('didUpdateI18nLocales', {\n groupProperties: { numberOfLocales },\n })\n .catch(() => {});\n};\n\nconst metrics = () => ({\n sendDidInitializeEvent,\n sendDidUpdateI18nLocalesEvent,\n});\n\ntype MetricsService = typeof metrics;\n\nexport default metrics;\nexport type { MetricsService };\n"],"names":["sendDidInitializeEvent","isLocalizedContentType","getService","numberOfContentTypes","Object","values","strapi","contentTypes","filter","contentType","length","telemetry","send","groupProperties","catch","sendDidUpdateI18nLocalesEvent","numberOfLocales","count","metrics"],"mappings":";;AAEA,MAAMA,sBAAAA,GAAyB,UAAA;AAC7B,IAAA,MAAM,EAAEC,sBAAsB,EAAE,GAAGC,UAAAA,CAAW,eAAA,CAAA;;AAG9C,IAAA,MAAMC,oBAAAA,GAAuBC,MAAAA,CAAOC,MAAM,CAACC,OAAOC,YAAY,IAAI,EAAC,CAAA,CAAGC,MAAM,CAAC,CAACC,WAAAA,GAC5ER,sBAAAA,CAAuBQ,cACvBC,MAAM;AAERJ,IAAAA,MAAAA,CAAOK,SAAS,CACbC,IAAI,CAAC,mBAAA,EAAqB;QAAEC,eAAAA,EAAiB;AAAEV,YAAAA;AAAqB;KAAE,CAAA,CACtEW,KAAK,CAAC,IAAA,CAAO,CAAA,CAAA;AAClB,CAAA;AAEA,MAAMC,6BAAAA,GAAgC,UAAA;AACpC,IAAA,MAAMC,eAAAA,GAAkB,MAAMd,UAAAA,CAAW,SAAA,CAAA,CAAWe,KAAK,EAAA;AAEzDX,IAAAA,MAAAA,CAAOK,SAAS,CACbC,IAAI,CAAC,sBAAA,EAAwB;QAC5BC,eAAAA,EAAiB;AAAEG,YAAAA;AAAgB;KACrC,CAAA,CACCF,KAAK,CAAC,IAAA,CAAO,CAAA,CAAA;AAClB,CAAA;AAEA,MAAMI,OAAAA,GAAU,KAAO;AACrBlB,QAAAA,sBAAAA;AACAe,QAAAA;KACF;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _ = require('lodash');
|
|
4
4
|
var index = require('../../utils/index.js');
|
|
5
5
|
|
|
6
6
|
const actions = [
|
|
@@ -52,11 +52,11 @@ const addLocalesPropertyIfNeeded = ({ value: action })=>{
|
|
|
52
52
|
return;
|
|
53
53
|
}
|
|
54
54
|
// If the 'locales' property is already declared within the applyToProperties array, then ignore the next steps
|
|
55
|
-
if (
|
|
55
|
+
if (Array.isArray(applyToProperties) && applyToProperties.includes('locales')) {
|
|
56
56
|
return;
|
|
57
57
|
}
|
|
58
58
|
// Add the 'locales' property to the applyToProperties array (create it if necessary)
|
|
59
|
-
action.options.applyToProperties =
|
|
59
|
+
action.options.applyToProperties = Array.isArray(applyToProperties) ? applyToProperties.concat('locales') : [
|
|
60
60
|
'locales'
|
|
61
61
|
];
|
|
62
62
|
};
|
|
@@ -71,14 +71,14 @@ const addAllLocalesToPermissions = async (permissions)=>{
|
|
|
71
71
|
const { actionProvider } = strapi.service('admin::permission');
|
|
72
72
|
const { find: findAllLocales } = index.getService('locales');
|
|
73
73
|
const allLocales = await findAllLocales();
|
|
74
|
-
const allLocalesCode = allLocales.map(
|
|
74
|
+
const allLocalesCode = allLocales.map((locale)=>locale?.code);
|
|
75
75
|
return Promise.all(permissions.map(async (permission)=>{
|
|
76
76
|
const { action, subject } = permission;
|
|
77
77
|
const appliesToLocalesProperty = await actionProvider.appliesToProperty('locales', action, subject);
|
|
78
78
|
if (!appliesToLocalesProperty) {
|
|
79
79
|
return permission;
|
|
80
80
|
}
|
|
81
|
-
const oldPermissionProperties =
|
|
81
|
+
const oldPermissionProperties = _.get(permission, 'properties', {});
|
|
82
82
|
return {
|
|
83
83
|
...permission,
|
|
84
84
|
properties: {
|