@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.
Files changed (88) hide show
  1. package/dist/admin/contentManagerHooks/editView.js +0 -1
  2. package/dist/admin/contentManagerHooks/editView.js.map +1 -1
  3. package/dist/admin/contentManagerHooks/editView.mjs +0 -1
  4. package/dist/admin/contentManagerHooks/editView.mjs.map +1 -1
  5. package/dist/server/bootstrap.js +2 -2
  6. package/dist/server/bootstrap.js.map +1 -1
  7. package/dist/server/bootstrap.mjs +1 -1
  8. package/dist/server/bootstrap.mjs.map +1 -1
  9. package/dist/server/controllers/content-types.js +11 -11
  10. package/dist/server/controllers/content-types.js.map +1 -1
  11. package/dist/server/controllers/content-types.mjs +11 -11
  12. package/dist/server/controllers/content-types.mjs.map +1 -1
  13. package/dist/server/controllers/locales.js +2 -2
  14. package/dist/server/controllers/locales.js.map +1 -1
  15. package/dist/server/controllers/locales.mjs +2 -2
  16. package/dist/server/controllers/locales.mjs.map +1 -1
  17. package/dist/server/controllers/validate-locale-creation.js +1 -2
  18. package/dist/server/controllers/validate-locale-creation.js.map +1 -1
  19. package/dist/server/controllers/validate-locale-creation.mjs +1 -2
  20. package/dist/server/controllers/validate-locale-creation.mjs.map +1 -1
  21. package/dist/server/graphql.js +4 -4
  22. package/dist/server/graphql.js.map +1 -1
  23. package/dist/server/graphql.mjs +2 -2
  24. package/dist/server/graphql.mjs.map +1 -1
  25. package/dist/server/index.js.map +1 -1
  26. package/dist/server/index.mjs.map +1 -1
  27. package/dist/server/localization.js +36 -0
  28. package/dist/server/localization.js.map +1 -0
  29. package/dist/server/localization.mjs +34 -0
  30. package/dist/server/localization.mjs.map +1 -0
  31. package/dist/server/register.js +2 -0
  32. package/dist/server/register.js.map +1 -1
  33. package/dist/server/register.mjs +2 -0
  34. package/dist/server/register.mjs.map +1 -1
  35. package/dist/server/services/content-types.js +12 -12
  36. package/dist/server/services/content-types.js.map +1 -1
  37. package/dist/server/services/content-types.mjs +11 -11
  38. package/dist/server/services/content-types.mjs.map +1 -1
  39. package/dist/server/services/fill-from-locale.js +5 -6
  40. package/dist/server/services/fill-from-locale.js.map +1 -1
  41. package/dist/server/services/fill-from-locale.mjs +5 -6
  42. package/dist/server/services/fill-from-locale.mjs.map +1 -1
  43. package/dist/server/services/locales.js +1 -2
  44. package/dist/server/services/locales.js.map +1 -1
  45. package/dist/server/services/locales.mjs +1 -2
  46. package/dist/server/services/locales.mjs.map +1 -1
  47. package/dist/server/services/localizations.js +4 -4
  48. package/dist/server/services/localizations.js.map +1 -1
  49. package/dist/server/services/localizations.mjs +1 -1
  50. package/dist/server/services/localizations.mjs.map +1 -1
  51. package/dist/server/services/metrics.js +1 -2
  52. package/dist/server/services/metrics.js.map +1 -1
  53. package/dist/server/services/metrics.mjs +1 -2
  54. package/dist/server/services/metrics.mjs.map +1 -1
  55. package/dist/server/services/permissions/actions.js +5 -5
  56. package/dist/server/services/permissions/actions.js.map +1 -1
  57. package/dist/server/services/permissions/actions.mjs +5 -5
  58. package/dist/server/services/permissions/actions.mjs.map +1 -1
  59. package/dist/server/services/permissions/sections-builder.js +2 -2
  60. package/dist/server/services/permissions/sections-builder.js.map +1 -1
  61. package/dist/server/services/permissions/sections-builder.mjs +1 -1
  62. package/dist/server/services/permissions/sections-builder.mjs.map +1 -1
  63. package/dist/server/services/sanitize/index.js +2 -2
  64. package/dist/server/services/sanitize/index.js.map +1 -1
  65. package/dist/server/services/sanitize/index.mjs +1 -1
  66. package/dist/server/services/sanitize/index.mjs.map +1 -1
  67. package/dist/server/src/controllers/content-types.d.ts.map +1 -1
  68. package/dist/server/src/controllers/validate-locale-creation.d.ts.map +1 -1
  69. package/dist/server/src/index.d.ts +1 -2
  70. package/dist/server/src/index.d.ts.map +1 -1
  71. package/dist/server/src/localization.d.ts +4 -0
  72. package/dist/server/src/localization.d.ts.map +1 -0
  73. package/dist/server/src/register.d.ts.map +1 -1
  74. package/dist/server/src/services/fill-from-locale.d.ts.map +1 -1
  75. package/dist/server/src/services/index.d.ts.map +1 -1
  76. package/dist/server/src/services/locales.d.ts.map +1 -1
  77. package/dist/server/src/services/metrics.d.ts.map +1 -1
  78. package/dist/server/src/validation/content-types.d.ts.map +1 -1
  79. package/dist/server/src/validation/locales.d.ts.map +1 -1
  80. package/dist/server/validation/content-types.js +1 -2
  81. package/dist/server/validation/content-types.js.map +1 -1
  82. package/dist/server/validation/content-types.mjs +1 -2
  83. package/dist/server/validation/content-types.mjs.map +1 -1
  84. package/dist/server/validation/locales.js +1 -2
  85. package/dist/server/validation/locales.js.map +1 -1
  86. package/dist/server/validation/locales.mjs +1 -2
  87. package/dist/server/validation/locales.mjs.map +1 -1
  88. package/package.json +7 -7
@@ -61,7 +61,6 @@ const LabelAction = ({ title })=>{
61
61
  const { formatMessage } = reactIntl.useIntl();
62
62
  return /*#__PURE__*/ jsxRuntime.jsxs(Span, {
63
63
  tag: "span",
64
- title: title,
65
64
  children: [
66
65
  /*#__PURE__*/ jsxRuntime.jsx(designSystem.VisuallyHidden, {
67
66
  tag: "span",
@@ -1 +1 @@
1
- {"version":3,"file":"editView.js","sources":["../../../admin/src/contentManagerHooks/editView.tsx"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\nimport { Flex, Tooltip, VisuallyHidden } from '@strapi/design-system';\nimport { Earth } from '@strapi/icons';\nimport { MessageDescriptor, useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { getTranslation } from '../utils/getTranslation';\n\nimport type { EditFieldLayout, EditLayout } from '@strapi/content-manager/strapi-admin';\ninterface MutateEditViewArgs {\n layout: EditLayout;\n}\n\ntype I18nLayoutOptions = EditLayout['options'] & {\n i18n?: {\n localized?: boolean;\n };\n};\n\nconst hasI18nLayoutOptions = (options: EditLayout['options']): options is I18nLayoutOptions =>\n 'i18n' in options && typeof options.i18n === 'object' && options.i18n !== null;\n\nconst mutateEditViewHook = ({ layout }: MutateEditViewArgs): MutateEditViewArgs => {\n // If i18n isn't explicitly enabled on the content type, then no field can be localized\n if (\n !('i18n' in layout.options) ||\n (typeof layout.options.i18n === 'object' &&\n layout.options.i18n !== null &&\n 'localized' in layout.options.i18n &&\n !layout.options.i18n.localized)\n ) {\n return { layout };\n }\n\n const decorateField = (field: EditFieldLayout) => addLabelActionToField(field, layout);\n\n const components = Object.entries(layout.components).reduce<EditLayout['components']>(\n (acc, [key, componentLayout]) => {\n return {\n ...acc,\n [key]: {\n ...componentLayout,\n layout: componentLayout.layout.map((row) => row.map(decorateField)),\n },\n };\n },\n {}\n );\n\n return {\n layout: {\n ...layout,\n components,\n layout: layout.layout.map((panel) => panel.map((row) => row.map(decorateField))),\n },\n } satisfies Pick<MutateEditViewArgs, 'layout'>;\n};\n\nconst isFieldLocalized = (attribute: EditFieldLayout['attribute'], layout: EditLayout) => {\n const contentTypeLocalized =\n hasI18nLayoutOptions(layout.options) && layout.options.i18n?.localized === true;\n\n if (!contentTypeLocalized) {\n return false;\n }\n\n const pluginOptions =\n attribute && typeof attribute === 'object' && 'pluginOptions' in (attribute as object)\n ? (attribute as { pluginOptions?: { i18n?: { localized?: boolean } } }).pluginOptions\n : undefined;\n\n return pluginOptions?.i18n?.localized === true;\n};\n\nconst addLabelActionToField = (field: EditFieldLayout, layout: EditLayout) => {\n const localized = isFieldLocalized(field.attribute, layout);\n\n if (!localized) {\n return field;\n }\n\n const title: MessageDescriptor = {\n id: getTranslation('Field.localized'),\n defaultMessage: 'This value is unique for the selected locale',\n };\n\n return {\n ...field,\n labelAction: <LabelAction title={title} />,\n };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * LabelAction\n * -----------------------------------------------------------------------------------------------*/\n\ninterface LabelActionProps {\n title: MessageDescriptor;\n}\n\nconst LabelAction = ({ title }: LabelActionProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Span tag=\"span\" title={title}>\n <VisuallyHidden tag=\"span\">{formatMessage(title)}</VisuallyHidden>\n <Tooltip label={formatMessage(title)}>\n <Earth aria-hidden focusable={false} />\n </Tooltip>\n </Span>\n );\n};\n\nconst Span = styled(Flex)`\n svg {\n width: 12px;\n height: 12px;\n\n fill: ${({ theme }) => theme.colors.neutral500};\n\n path {\n fill: ${({ theme }) => theme.colors.neutral500};\n }\n }\n`;\n\nexport { mutateEditViewHook };\n"],"names":["hasI18nLayoutOptions","options","i18n","mutateEditViewHook","layout","localized","decorateField","field","addLabelActionToField","components","Object","entries","reduce","acc","key","componentLayout","map","row","panel","isFieldLocalized","attribute","contentTypeLocalized","pluginOptions","undefined","title","id","getTranslation","defaultMessage","labelAction","_jsx","LabelAction","formatMessage","useIntl","_jsxs","Span","tag","VisuallyHidden","Tooltip","label","Earth","aria-hidden","focusable","styled","Flex","theme","colors","neutral500"],"mappings":"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"}
1
+ {"version":3,"file":"editView.js","sources":["../../../admin/src/contentManagerHooks/editView.tsx"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\nimport { Flex, Tooltip, VisuallyHidden } from '@strapi/design-system';\nimport { Earth } from '@strapi/icons';\nimport { MessageDescriptor, useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { getTranslation } from '../utils/getTranslation';\n\nimport type { EditFieldLayout, EditLayout } from '@strapi/content-manager/strapi-admin';\ninterface MutateEditViewArgs {\n layout: EditLayout;\n}\n\ntype I18nLayoutOptions = EditLayout['options'] & {\n i18n?: {\n localized?: boolean;\n };\n};\n\nconst hasI18nLayoutOptions = (options: EditLayout['options']): options is I18nLayoutOptions =>\n 'i18n' in options && typeof options.i18n === 'object' && options.i18n !== null;\n\nconst mutateEditViewHook = ({ layout }: MutateEditViewArgs): MutateEditViewArgs => {\n // If i18n isn't explicitly enabled on the content type, then no field can be localized\n if (\n !('i18n' in layout.options) ||\n (typeof layout.options.i18n === 'object' &&\n layout.options.i18n !== null &&\n 'localized' in layout.options.i18n &&\n !layout.options.i18n.localized)\n ) {\n return { layout };\n }\n\n const decorateField = (field: EditFieldLayout) => addLabelActionToField(field, layout);\n\n const components = Object.entries(layout.components).reduce<EditLayout['components']>(\n (acc, [key, componentLayout]) => {\n return {\n ...acc,\n [key]: {\n ...componentLayout,\n layout: componentLayout.layout.map((row) => row.map(decorateField)),\n },\n };\n },\n {}\n );\n\n return {\n layout: {\n ...layout,\n components,\n layout: layout.layout.map((panel) => panel.map((row) => row.map(decorateField))),\n },\n } satisfies Pick<MutateEditViewArgs, 'layout'>;\n};\n\nconst isFieldLocalized = (attribute: EditFieldLayout['attribute'], layout: EditLayout) => {\n const contentTypeLocalized =\n hasI18nLayoutOptions(layout.options) && layout.options.i18n?.localized === true;\n\n if (!contentTypeLocalized) {\n return false;\n }\n\n const pluginOptions =\n attribute && typeof attribute === 'object' && 'pluginOptions' in (attribute as object)\n ? (attribute as { pluginOptions?: { i18n?: { localized?: boolean } } }).pluginOptions\n : undefined;\n\n return pluginOptions?.i18n?.localized === true;\n};\n\nconst addLabelActionToField = (field: EditFieldLayout, layout: EditLayout) => {\n const localized = isFieldLocalized(field.attribute, layout);\n\n if (!localized) {\n return field;\n }\n\n const title: MessageDescriptor = {\n id: getTranslation('Field.localized'),\n defaultMessage: 'This value is unique for the selected locale',\n };\n\n return {\n ...field,\n labelAction: <LabelAction title={title} />,\n };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * LabelAction\n * -----------------------------------------------------------------------------------------------*/\n\ninterface LabelActionProps {\n title: MessageDescriptor;\n}\n\nconst LabelAction = ({ title }: LabelActionProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Span tag=\"span\">\n <VisuallyHidden tag=\"span\">{formatMessage(title)}</VisuallyHidden>\n <Tooltip label={formatMessage(title)}>\n <Earth aria-hidden focusable={false} />\n </Tooltip>\n </Span>\n );\n};\n\nconst Span = styled(Flex)`\n svg {\n width: 12px;\n height: 12px;\n\n fill: ${({ theme }) => theme.colors.neutral500};\n\n path {\n fill: ${({ theme }) => theme.colors.neutral500};\n }\n }\n`;\n\nexport { mutateEditViewHook };\n"],"names":["hasI18nLayoutOptions","options","i18n","mutateEditViewHook","layout","localized","decorateField","field","addLabelActionToField","components","Object","entries","reduce","acc","key","componentLayout","map","row","panel","isFieldLocalized","attribute","contentTypeLocalized","pluginOptions","undefined","title","id","getTranslation","defaultMessage","labelAction","_jsx","LabelAction","formatMessage","useIntl","_jsxs","Span","tag","VisuallyHidden","Tooltip","label","Earth","aria-hidden","focusable","styled","Flex","theme","colors","neutral500"],"mappings":"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"}
@@ -59,7 +59,6 @@ const LabelAction = ({ title })=>{
59
59
  const { formatMessage } = useIntl();
60
60
  return /*#__PURE__*/ jsxs(Span, {
61
61
  tag: "span",
62
- title: title,
63
62
  children: [
64
63
  /*#__PURE__*/ jsx(VisuallyHidden, {
65
64
  tag: "span",
@@ -1 +1 @@
1
- {"version":3,"file":"editView.mjs","sources":["../../../admin/src/contentManagerHooks/editView.tsx"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\nimport { Flex, Tooltip, VisuallyHidden } from '@strapi/design-system';\nimport { Earth } from '@strapi/icons';\nimport { MessageDescriptor, useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { getTranslation } from '../utils/getTranslation';\n\nimport type { EditFieldLayout, EditLayout } from '@strapi/content-manager/strapi-admin';\ninterface MutateEditViewArgs {\n layout: EditLayout;\n}\n\ntype I18nLayoutOptions = EditLayout['options'] & {\n i18n?: {\n localized?: boolean;\n };\n};\n\nconst hasI18nLayoutOptions = (options: EditLayout['options']): options is I18nLayoutOptions =>\n 'i18n' in options && typeof options.i18n === 'object' && options.i18n !== null;\n\nconst mutateEditViewHook = ({ layout }: MutateEditViewArgs): MutateEditViewArgs => {\n // If i18n isn't explicitly enabled on the content type, then no field can be localized\n if (\n !('i18n' in layout.options) ||\n (typeof layout.options.i18n === 'object' &&\n layout.options.i18n !== null &&\n 'localized' in layout.options.i18n &&\n !layout.options.i18n.localized)\n ) {\n return { layout };\n }\n\n const decorateField = (field: EditFieldLayout) => addLabelActionToField(field, layout);\n\n const components = Object.entries(layout.components).reduce<EditLayout['components']>(\n (acc, [key, componentLayout]) => {\n return {\n ...acc,\n [key]: {\n ...componentLayout,\n layout: componentLayout.layout.map((row) => row.map(decorateField)),\n },\n };\n },\n {}\n );\n\n return {\n layout: {\n ...layout,\n components,\n layout: layout.layout.map((panel) => panel.map((row) => row.map(decorateField))),\n },\n } satisfies Pick<MutateEditViewArgs, 'layout'>;\n};\n\nconst isFieldLocalized = (attribute: EditFieldLayout['attribute'], layout: EditLayout) => {\n const contentTypeLocalized =\n hasI18nLayoutOptions(layout.options) && layout.options.i18n?.localized === true;\n\n if (!contentTypeLocalized) {\n return false;\n }\n\n const pluginOptions =\n attribute && typeof attribute === 'object' && 'pluginOptions' in (attribute as object)\n ? (attribute as { pluginOptions?: { i18n?: { localized?: boolean } } }).pluginOptions\n : undefined;\n\n return pluginOptions?.i18n?.localized === true;\n};\n\nconst addLabelActionToField = (field: EditFieldLayout, layout: EditLayout) => {\n const localized = isFieldLocalized(field.attribute, layout);\n\n if (!localized) {\n return field;\n }\n\n const title: MessageDescriptor = {\n id: getTranslation('Field.localized'),\n defaultMessage: 'This value is unique for the selected locale',\n };\n\n return {\n ...field,\n labelAction: <LabelAction title={title} />,\n };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * LabelAction\n * -----------------------------------------------------------------------------------------------*/\n\ninterface LabelActionProps {\n title: MessageDescriptor;\n}\n\nconst LabelAction = ({ title }: LabelActionProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Span tag=\"span\" title={title}>\n <VisuallyHidden tag=\"span\">{formatMessage(title)}</VisuallyHidden>\n <Tooltip label={formatMessage(title)}>\n <Earth aria-hidden focusable={false} />\n </Tooltip>\n </Span>\n );\n};\n\nconst Span = styled(Flex)`\n svg {\n width: 12px;\n height: 12px;\n\n fill: ${({ theme }) => theme.colors.neutral500};\n\n path {\n fill: ${({ theme }) => theme.colors.neutral500};\n }\n }\n`;\n\nexport { mutateEditViewHook };\n"],"names":["hasI18nLayoutOptions","options","i18n","mutateEditViewHook","layout","localized","decorateField","field","addLabelActionToField","components","Object","entries","reduce","acc","key","componentLayout","map","row","panel","isFieldLocalized","attribute","contentTypeLocalized","pluginOptions","undefined","title","id","getTranslation","defaultMessage","labelAction","_jsx","LabelAction","formatMessage","useIntl","_jsxs","Span","tag","VisuallyHidden","Tooltip","label","Earth","aria-hidden","focusable","styled","Flex","theme","colors","neutral500"],"mappings":"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"}
1
+ {"version":3,"file":"editView.mjs","sources":["../../../admin/src/contentManagerHooks/editView.tsx"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\nimport { Flex, Tooltip, VisuallyHidden } from '@strapi/design-system';\nimport { Earth } from '@strapi/icons';\nimport { MessageDescriptor, useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { getTranslation } from '../utils/getTranslation';\n\nimport type { EditFieldLayout, EditLayout } from '@strapi/content-manager/strapi-admin';\ninterface MutateEditViewArgs {\n layout: EditLayout;\n}\n\ntype I18nLayoutOptions = EditLayout['options'] & {\n i18n?: {\n localized?: boolean;\n };\n};\n\nconst hasI18nLayoutOptions = (options: EditLayout['options']): options is I18nLayoutOptions =>\n 'i18n' in options && typeof options.i18n === 'object' && options.i18n !== null;\n\nconst mutateEditViewHook = ({ layout }: MutateEditViewArgs): MutateEditViewArgs => {\n // If i18n isn't explicitly enabled on the content type, then no field can be localized\n if (\n !('i18n' in layout.options) ||\n (typeof layout.options.i18n === 'object' &&\n layout.options.i18n !== null &&\n 'localized' in layout.options.i18n &&\n !layout.options.i18n.localized)\n ) {\n return { layout };\n }\n\n const decorateField = (field: EditFieldLayout) => addLabelActionToField(field, layout);\n\n const components = Object.entries(layout.components).reduce<EditLayout['components']>(\n (acc, [key, componentLayout]) => {\n return {\n ...acc,\n [key]: {\n ...componentLayout,\n layout: componentLayout.layout.map((row) => row.map(decorateField)),\n },\n };\n },\n {}\n );\n\n return {\n layout: {\n ...layout,\n components,\n layout: layout.layout.map((panel) => panel.map((row) => row.map(decorateField))),\n },\n } satisfies Pick<MutateEditViewArgs, 'layout'>;\n};\n\nconst isFieldLocalized = (attribute: EditFieldLayout['attribute'], layout: EditLayout) => {\n const contentTypeLocalized =\n hasI18nLayoutOptions(layout.options) && layout.options.i18n?.localized === true;\n\n if (!contentTypeLocalized) {\n return false;\n }\n\n const pluginOptions =\n attribute && typeof attribute === 'object' && 'pluginOptions' in (attribute as object)\n ? (attribute as { pluginOptions?: { i18n?: { localized?: boolean } } }).pluginOptions\n : undefined;\n\n return pluginOptions?.i18n?.localized === true;\n};\n\nconst addLabelActionToField = (field: EditFieldLayout, layout: EditLayout) => {\n const localized = isFieldLocalized(field.attribute, layout);\n\n if (!localized) {\n return field;\n }\n\n const title: MessageDescriptor = {\n id: getTranslation('Field.localized'),\n defaultMessage: 'This value is unique for the selected locale',\n };\n\n return {\n ...field,\n labelAction: <LabelAction title={title} />,\n };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * LabelAction\n * -----------------------------------------------------------------------------------------------*/\n\ninterface LabelActionProps {\n title: MessageDescriptor;\n}\n\nconst LabelAction = ({ title }: LabelActionProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Span tag=\"span\">\n <VisuallyHidden tag=\"span\">{formatMessage(title)}</VisuallyHidden>\n <Tooltip label={formatMessage(title)}>\n <Earth aria-hidden focusable={false} />\n </Tooltip>\n </Span>\n );\n};\n\nconst Span = styled(Flex)`\n svg {\n width: 12px;\n height: 12px;\n\n fill: ${({ theme }) => theme.colors.neutral500};\n\n path {\n fill: ${({ theme }) => theme.colors.neutral500};\n }\n }\n`;\n\nexport { mutateEditViewHook };\n"],"names":["hasI18nLayoutOptions","options","i18n","mutateEditViewHook","layout","localized","decorateField","field","addLabelActionToField","components","Object","entries","reduce","acc","key","componentLayout","map","row","panel","isFieldLocalized","attribute","contentTypeLocalized","pluginOptions","undefined","title","id","getTranslation","defaultMessage","labelAction","_jsx","LabelAction","formatMessage","useIntl","_jsxs","Span","tag","VisuallyHidden","Tooltip","label","Earth","aria-hidden","focusable","styled","Flex","theme","colors","neutral500"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var fp = require('lodash/fp');
3
+ var _ = require('lodash');
4
4
  var auditLogs = require('./audit-logs.js');
5
5
  var index = require('./utils/index.js');
6
6
 
@@ -63,7 +63,7 @@ const registerModelsHooks = ()=>{
63
63
  const currentFields = copyNonLocalizedAttributes(schema, populatedResult);
64
64
  // Only sync if there are actual changes to non-localized fields
65
65
  const shouldSync = !originalData || Object.keys(currentFields).some((key)=>{
66
- return !fp.isEqual(currentFields[key], originalFields[key]);
66
+ return !_.isEqual(currentFields[key], originalFields[key]);
67
67
  });
68
68
  if (shouldSync) {
69
69
  await index.getService('localizations').syncNonLocalizedAttributes(populatedResult, schema);
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.js","sources":["../../server/src/bootstrap.ts"],"sourcesContent":["import type { Schema } from '@strapi/types';\nimport { isEqual } from 'lodash/fp';\nimport { registerAuditEvents } from './audit-logs';\nimport { getService } from './utils';\n\nconst registerModelsHooks = () => {\n strapi.db.lifecycles.subscribe({\n models: ['plugin::i18n.locale'],\n\n async afterCreate() {\n await getService('permissions').actions.syncSuperAdminPermissionsWithLocales();\n },\n\n async afterDelete() {\n await getService('permissions').actions.syncSuperAdminPermissionsWithLocales();\n },\n });\n\n strapi.documents.use(async (context, next) => {\n const schema: Schema.ContentType = context.contentType;\n\n if (!['create', 'update', 'discardDraft', 'publish'].includes(context.action)) {\n return next();\n }\n\n if (!getService('content-types').isLocalizedContentType(schema)) {\n return next();\n }\n\n // Build a populate array for all non localized fields within the schema\n const { getNestedPopulateOfNonLocalizedAttributes, copyNonLocalizedAttributes } =\n getService('content-types');\n const attributesToPopulate = getNestedPopulateOfNonLocalizedAttributes(schema.uid);\n\n // Get original data before the update to compare what actually changed\n const originalData =\n 'documentId' in context.params && context.params.documentId\n ? await strapi.db.query(schema.uid).findOne({\n where: { documentId: context.params.documentId },\n populate: attributesToPopulate,\n })\n : null;\n\n // Get the result of the document service action\n const result = (await next()) as any;\n\n // We may not have received a result with everything populated that we need\n // Use the id and populate built from non localized fields to get the full\n // result\n let resultID;\n // TODO: fix bug where an empty array can be returned\n if (Array.isArray(result?.entries) && result.entries[0]?.id) {\n resultID = result.entries[0].id;\n } else if (result?.id) {\n resultID = result.id;\n } else {\n return result;\n }\n\n const populatedResult = await strapi.db.query(schema.uid).findOne({\n where: { id: resultID },\n populate: attributesToPopulate,\n });\n\n const originalFields = copyNonLocalizedAttributes(schema, originalData);\n const currentFields = copyNonLocalizedAttributes(schema, populatedResult);\n\n // Only sync if there are actual changes to non-localized fields\n const shouldSync =\n !originalData ||\n Object.keys(currentFields).some((key) => {\n return !isEqual(currentFields[key], originalFields[key]);\n });\n\n if (shouldSync) {\n await getService('localizations').syncNonLocalizedAttributes(populatedResult, schema);\n }\n\n return result;\n });\n};\n\nexport default async () => {\n const { sendDidInitializeEvent } = getService('metrics');\n const { initDefaultLocale } = getService('locales');\n const { sectionsBuilder, actions, engine } = getService('permissions');\n\n // Data\n await initDefaultLocale();\n\n // Sections Builder\n sectionsBuilder.registerLocalesPropertyHandler();\n\n // Actions\n await actions.registerI18nActions();\n actions.registerI18nActionsHooks();\n actions.updateActionsProperties();\n\n // Engine/Permissions\n engine.registerI18nPermissionsHandlers();\n\n // Hooks & Models\n registerModelsHooks();\n\n // Absent in CE, without the audit-logs license, or when disabled by config;\n // get() throws for services that were never added, so probe first.\n if (strapi.has('audit-logs-lifecycle')) {\n registerAuditEvents(strapi.get('audit-logs-lifecycle'));\n }\n\n // AI Localizations\n if (strapi.ai.admin.isAvailable()) {\n const aiTranslations = getService('ai-translations');\n\n if (!aiTranslations.hasProvider() && strapi.ai.admin.isStrapiManagedAiEnabled()) {\n aiTranslations.registerStrapiManagedProvider();\n }\n\n getService('ai-localizations').setupMiddleware();\n }\n\n sendDidInitializeEvent();\n};\n"],"names":["registerModelsHooks","strapi","db","lifecycles","subscribe","models","afterCreate","getService","actions","syncSuperAdminPermissionsWithLocales","afterDelete","documents","use","context","next","schema","contentType","includes","action","isLocalizedContentType","getNestedPopulateOfNonLocalizedAttributes","copyNonLocalizedAttributes","attributesToPopulate","uid","originalData","params","documentId","query","findOne","where","populate","result","resultID","Array","isArray","entries","id","populatedResult","originalFields","currentFields","shouldSync","Object","keys","some","key","isEqual","syncNonLocalizedAttributes","sendDidInitializeEvent","initDefaultLocale","sectionsBuilder","engine","registerLocalesPropertyHandler","registerI18nActions","registerI18nActionsHooks","updateActionsProperties","registerI18nPermissionsHandlers","has","registerAuditEvents","get","ai","admin","isAvailable","aiTranslations","hasProvider","isStrapiManagedAiEnabled","registerStrapiManagedProvider","setupMiddleware"],"mappings":"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"}
1
+ {"version":3,"file":"bootstrap.js","sources":["../../server/src/bootstrap.ts"],"sourcesContent":["import type { Schema } from '@strapi/types';\nimport { isEqual } from 'lodash';\nimport { registerAuditEvents } from './audit-logs';\nimport { getService } from './utils';\n\nconst registerModelsHooks = () => {\n strapi.db.lifecycles.subscribe({\n models: ['plugin::i18n.locale'],\n\n async afterCreate() {\n await getService('permissions').actions.syncSuperAdminPermissionsWithLocales();\n },\n\n async afterDelete() {\n await getService('permissions').actions.syncSuperAdminPermissionsWithLocales();\n },\n });\n\n strapi.documents.use(async (context, next) => {\n const schema: Schema.ContentType = context.contentType;\n\n if (!['create', 'update', 'discardDraft', 'publish'].includes(context.action)) {\n return next();\n }\n\n if (!getService('content-types').isLocalizedContentType(schema)) {\n return next();\n }\n\n // Build a populate array for all non localized fields within the schema\n const { getNestedPopulateOfNonLocalizedAttributes, copyNonLocalizedAttributes } =\n getService('content-types');\n const attributesToPopulate = getNestedPopulateOfNonLocalizedAttributes(schema.uid);\n\n // Get original data before the update to compare what actually changed\n const originalData =\n 'documentId' in context.params && context.params.documentId\n ? await strapi.db.query(schema.uid).findOne({\n where: { documentId: context.params.documentId },\n populate: attributesToPopulate,\n })\n : null;\n\n // Get the result of the document service action\n const result = (await next()) as any;\n\n // We may not have received a result with everything populated that we need\n // Use the id and populate built from non localized fields to get the full\n // result\n let resultID;\n // TODO: fix bug where an empty array can be returned\n if (Array.isArray(result?.entries) && result.entries[0]?.id) {\n resultID = result.entries[0].id;\n } else if (result?.id) {\n resultID = result.id;\n } else {\n return result;\n }\n\n const populatedResult = await strapi.db.query(schema.uid).findOne({\n where: { id: resultID },\n populate: attributesToPopulate,\n });\n\n const originalFields = copyNonLocalizedAttributes(schema, originalData);\n const currentFields = copyNonLocalizedAttributes(schema, populatedResult);\n\n // Only sync if there are actual changes to non-localized fields\n const shouldSync =\n !originalData ||\n Object.keys(currentFields).some((key) => {\n return !isEqual(currentFields[key], originalFields[key]);\n });\n\n if (shouldSync) {\n await getService('localizations').syncNonLocalizedAttributes(populatedResult, schema);\n }\n\n return result;\n });\n};\n\nexport default async () => {\n const { sendDidInitializeEvent } = getService('metrics');\n const { initDefaultLocale } = getService('locales');\n const { sectionsBuilder, actions, engine } = getService('permissions');\n\n // Data\n await initDefaultLocale();\n\n // Sections Builder\n sectionsBuilder.registerLocalesPropertyHandler();\n\n // Actions\n await actions.registerI18nActions();\n actions.registerI18nActionsHooks();\n actions.updateActionsProperties();\n\n // Engine/Permissions\n engine.registerI18nPermissionsHandlers();\n\n // Hooks & Models\n registerModelsHooks();\n\n // Absent in CE, without the audit-logs license, or when disabled by config;\n // get() throws for services that were never added, so probe first.\n if (strapi.has('audit-logs-lifecycle')) {\n registerAuditEvents(strapi.get('audit-logs-lifecycle'));\n }\n\n // AI Localizations\n if (strapi.ai.admin.isAvailable()) {\n const aiTranslations = getService('ai-translations');\n\n if (!aiTranslations.hasProvider() && strapi.ai.admin.isStrapiManagedAiEnabled()) {\n aiTranslations.registerStrapiManagedProvider();\n }\n\n getService('ai-localizations').setupMiddleware();\n }\n\n sendDidInitializeEvent();\n};\n"],"names":["registerModelsHooks","strapi","db","lifecycles","subscribe","models","afterCreate","getService","actions","syncSuperAdminPermissionsWithLocales","afterDelete","documents","use","context","next","schema","contentType","includes","action","isLocalizedContentType","getNestedPopulateOfNonLocalizedAttributes","copyNonLocalizedAttributes","attributesToPopulate","uid","originalData","params","documentId","query","findOne","where","populate","result","resultID","Array","isArray","entries","id","populatedResult","originalFields","currentFields","shouldSync","Object","keys","some","key","isEqual","syncNonLocalizedAttributes","sendDidInitializeEvent","initDefaultLocale","sectionsBuilder","engine","registerLocalesPropertyHandler","registerI18nActions","registerI18nActionsHooks","updateActionsProperties","registerI18nPermissionsHandlers","has","registerAuditEvents","get","ai","admin","isAvailable","aiTranslations","hasProvider","isStrapiManagedAiEnabled","registerStrapiManagedProvider","setupMiddleware"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { isEqual } from 'lodash/fp';
1
+ import { isEqual } from 'lodash';
2
2
  import { registerAuditEvents } from './audit-logs.mjs';
3
3
  import { getService } from './utils/index.mjs';
4
4
 
@@ -1 +1 @@
1
- {"version":3,"file":"bootstrap.mjs","sources":["../../server/src/bootstrap.ts"],"sourcesContent":["import type { Schema } from '@strapi/types';\nimport { isEqual } from 'lodash/fp';\nimport { registerAuditEvents } from './audit-logs';\nimport { getService } from './utils';\n\nconst registerModelsHooks = () => {\n strapi.db.lifecycles.subscribe({\n models: ['plugin::i18n.locale'],\n\n async afterCreate() {\n await getService('permissions').actions.syncSuperAdminPermissionsWithLocales();\n },\n\n async afterDelete() {\n await getService('permissions').actions.syncSuperAdminPermissionsWithLocales();\n },\n });\n\n strapi.documents.use(async (context, next) => {\n const schema: Schema.ContentType = context.contentType;\n\n if (!['create', 'update', 'discardDraft', 'publish'].includes(context.action)) {\n return next();\n }\n\n if (!getService('content-types').isLocalizedContentType(schema)) {\n return next();\n }\n\n // Build a populate array for all non localized fields within the schema\n const { getNestedPopulateOfNonLocalizedAttributes, copyNonLocalizedAttributes } =\n getService('content-types');\n const attributesToPopulate = getNestedPopulateOfNonLocalizedAttributes(schema.uid);\n\n // Get original data before the update to compare what actually changed\n const originalData =\n 'documentId' in context.params && context.params.documentId\n ? await strapi.db.query(schema.uid).findOne({\n where: { documentId: context.params.documentId },\n populate: attributesToPopulate,\n })\n : null;\n\n // Get the result of the document service action\n const result = (await next()) as any;\n\n // We may not have received a result with everything populated that we need\n // Use the id and populate built from non localized fields to get the full\n // result\n let resultID;\n // TODO: fix bug where an empty array can be returned\n if (Array.isArray(result?.entries) && result.entries[0]?.id) {\n resultID = result.entries[0].id;\n } else if (result?.id) {\n resultID = result.id;\n } else {\n return result;\n }\n\n const populatedResult = await strapi.db.query(schema.uid).findOne({\n where: { id: resultID },\n populate: attributesToPopulate,\n });\n\n const originalFields = copyNonLocalizedAttributes(schema, originalData);\n const currentFields = copyNonLocalizedAttributes(schema, populatedResult);\n\n // Only sync if there are actual changes to non-localized fields\n const shouldSync =\n !originalData ||\n Object.keys(currentFields).some((key) => {\n return !isEqual(currentFields[key], originalFields[key]);\n });\n\n if (shouldSync) {\n await getService('localizations').syncNonLocalizedAttributes(populatedResult, schema);\n }\n\n return result;\n });\n};\n\nexport default async () => {\n const { sendDidInitializeEvent } = getService('metrics');\n const { initDefaultLocale } = getService('locales');\n const { sectionsBuilder, actions, engine } = getService('permissions');\n\n // Data\n await initDefaultLocale();\n\n // Sections Builder\n sectionsBuilder.registerLocalesPropertyHandler();\n\n // Actions\n await actions.registerI18nActions();\n actions.registerI18nActionsHooks();\n actions.updateActionsProperties();\n\n // Engine/Permissions\n engine.registerI18nPermissionsHandlers();\n\n // Hooks & Models\n registerModelsHooks();\n\n // Absent in CE, without the audit-logs license, or when disabled by config;\n // get() throws for services that were never added, so probe first.\n if (strapi.has('audit-logs-lifecycle')) {\n registerAuditEvents(strapi.get('audit-logs-lifecycle'));\n }\n\n // AI Localizations\n if (strapi.ai.admin.isAvailable()) {\n const aiTranslations = getService('ai-translations');\n\n if (!aiTranslations.hasProvider() && strapi.ai.admin.isStrapiManagedAiEnabled()) {\n aiTranslations.registerStrapiManagedProvider();\n }\n\n getService('ai-localizations').setupMiddleware();\n }\n\n sendDidInitializeEvent();\n};\n"],"names":["registerModelsHooks","strapi","db","lifecycles","subscribe","models","afterCreate","getService","actions","syncSuperAdminPermissionsWithLocales","afterDelete","documents","use","context","next","schema","contentType","includes","action","isLocalizedContentType","getNestedPopulateOfNonLocalizedAttributes","copyNonLocalizedAttributes","attributesToPopulate","uid","originalData","params","documentId","query","findOne","where","populate","result","resultID","Array","isArray","entries","id","populatedResult","originalFields","currentFields","shouldSync","Object","keys","some","key","isEqual","syncNonLocalizedAttributes","sendDidInitializeEvent","initDefaultLocale","sectionsBuilder","engine","registerLocalesPropertyHandler","registerI18nActions","registerI18nActionsHooks","updateActionsProperties","registerI18nPermissionsHandlers","has","registerAuditEvents","get","ai","admin","isAvailable","aiTranslations","hasProvider","isStrapiManagedAiEnabled","registerStrapiManagedProvider","setupMiddleware"],"mappings":"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"}
1
+ {"version":3,"file":"bootstrap.mjs","sources":["../../server/src/bootstrap.ts"],"sourcesContent":["import type { Schema } from '@strapi/types';\nimport { isEqual } from 'lodash';\nimport { registerAuditEvents } from './audit-logs';\nimport { getService } from './utils';\n\nconst registerModelsHooks = () => {\n strapi.db.lifecycles.subscribe({\n models: ['plugin::i18n.locale'],\n\n async afterCreate() {\n await getService('permissions').actions.syncSuperAdminPermissionsWithLocales();\n },\n\n async afterDelete() {\n await getService('permissions').actions.syncSuperAdminPermissionsWithLocales();\n },\n });\n\n strapi.documents.use(async (context, next) => {\n const schema: Schema.ContentType = context.contentType;\n\n if (!['create', 'update', 'discardDraft', 'publish'].includes(context.action)) {\n return next();\n }\n\n if (!getService('content-types').isLocalizedContentType(schema)) {\n return next();\n }\n\n // Build a populate array for all non localized fields within the schema\n const { getNestedPopulateOfNonLocalizedAttributes, copyNonLocalizedAttributes } =\n getService('content-types');\n const attributesToPopulate = getNestedPopulateOfNonLocalizedAttributes(schema.uid);\n\n // Get original data before the update to compare what actually changed\n const originalData =\n 'documentId' in context.params && context.params.documentId\n ? await strapi.db.query(schema.uid).findOne({\n where: { documentId: context.params.documentId },\n populate: attributesToPopulate,\n })\n : null;\n\n // Get the result of the document service action\n const result = (await next()) as any;\n\n // We may not have received a result with everything populated that we need\n // Use the id and populate built from non localized fields to get the full\n // result\n let resultID;\n // TODO: fix bug where an empty array can be returned\n if (Array.isArray(result?.entries) && result.entries[0]?.id) {\n resultID = result.entries[0].id;\n } else if (result?.id) {\n resultID = result.id;\n } else {\n return result;\n }\n\n const populatedResult = await strapi.db.query(schema.uid).findOne({\n where: { id: resultID },\n populate: attributesToPopulate,\n });\n\n const originalFields = copyNonLocalizedAttributes(schema, originalData);\n const currentFields = copyNonLocalizedAttributes(schema, populatedResult);\n\n // Only sync if there are actual changes to non-localized fields\n const shouldSync =\n !originalData ||\n Object.keys(currentFields).some((key) => {\n return !isEqual(currentFields[key], originalFields[key]);\n });\n\n if (shouldSync) {\n await getService('localizations').syncNonLocalizedAttributes(populatedResult, schema);\n }\n\n return result;\n });\n};\n\nexport default async () => {\n const { sendDidInitializeEvent } = getService('metrics');\n const { initDefaultLocale } = getService('locales');\n const { sectionsBuilder, actions, engine } = getService('permissions');\n\n // Data\n await initDefaultLocale();\n\n // Sections Builder\n sectionsBuilder.registerLocalesPropertyHandler();\n\n // Actions\n await actions.registerI18nActions();\n actions.registerI18nActionsHooks();\n actions.updateActionsProperties();\n\n // Engine/Permissions\n engine.registerI18nPermissionsHandlers();\n\n // Hooks & Models\n registerModelsHooks();\n\n // Absent in CE, without the audit-logs license, or when disabled by config;\n // get() throws for services that were never added, so probe first.\n if (strapi.has('audit-logs-lifecycle')) {\n registerAuditEvents(strapi.get('audit-logs-lifecycle'));\n }\n\n // AI Localizations\n if (strapi.ai.admin.isAvailable()) {\n const aiTranslations = getService('ai-translations');\n\n if (!aiTranslations.hasProvider() && strapi.ai.admin.isStrapiManagedAiEnabled()) {\n aiTranslations.registerStrapiManagedProvider();\n }\n\n getService('ai-localizations').setupMiddleware();\n }\n\n sendDidInitializeEvent();\n};\n"],"names":["registerModelsHooks","strapi","db","lifecycles","subscribe","models","afterCreate","getService","actions","syncSuperAdminPermissionsWithLocales","afterDelete","documents","use","context","next","schema","contentType","includes","action","isLocalizedContentType","getNestedPopulateOfNonLocalizedAttributes","copyNonLocalizedAttributes","attributesToPopulate","uid","originalData","params","documentId","query","findOne","where","populate","result","resultID","Array","isArray","entries","id","populatedResult","originalFields","currentFields","shouldSync","Object","keys","some","key","isEqual","syncNonLocalizedAttributes","sendDidInitializeEvent","initDefaultLocale","sectionsBuilder","engine","registerLocalesPropertyHandler","registerI18nActions","registerI18nActionsHooks","updateActionsProperties","registerI18nPermissionsHandlers","has","registerAuditEvents","get","ai","admin","isAvailable","aiTranslations","hasProvider","isStrapiManagedAiEnabled","registerStrapiManagedProvider","setupMiddleware"],"mappings":";;;;AAKA,MAAMA,mBAAAA,GAAsB,IAAA;AAC1BC,IAAAA,MAAAA,CAAOC,EAAE,CAACC,UAAU,CAACC,SAAS,CAAC;QAC7BC,MAAAA,EAAQ;AAAC,YAAA;AAAsB,SAAA;QAE/B,MAAMC,WAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAMC,UAAAA,CAAW,aAAA,CAAA,CAAeC,OAAO,CAACC,oCAAoC,EAAA;AAC9E,QAAA,CAAA;QAEA,MAAMC,WAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAMH,UAAAA,CAAW,aAAA,CAAA,CAAeC,OAAO,CAACC,oCAAoC,EAAA;AAC9E,QAAA;AACF,KAAA,CAAA;AAEAR,IAAAA,MAAAA,CAAOU,SAAS,CAACC,GAAG,CAAC,OAAOC,OAAAA,EAASC,IAAAA,GAAAA;QACnC,MAAMC,MAAAA,GAA6BF,QAAQG,WAAW;AAEtD,QAAA,IAAI,CAAC;AAAC,YAAA,QAAA;AAAU,YAAA,QAAA;AAAU,YAAA,cAAA;AAAgB,YAAA;AAAU,SAAA,CAACC,QAAQ,CAACJ,OAAAA,CAAQK,MAAM,CAAA,EAAG;YAC7E,OAAOJ,IAAAA,EAAAA;AACT,QAAA;AAEA,QAAA,IAAI,CAACP,UAAAA,CAAW,eAAA,CAAA,CAAiBY,sBAAsB,CAACJ,MAAAA,CAAAA,EAAS;YAC/D,OAAOD,IAAAA,EAAAA;AACT,QAAA;;AAGA,QAAA,MAAM,EAAEM,yCAAyC,EAAEC,0BAA0B,EAAE,GAC7Ed,UAAAA,CAAW,eAAA,CAAA;QACb,MAAMe,oBAAAA,GAAuBF,yCAAAA,CAA0CL,MAAAA,CAAOQ,GAAG,CAAA;;QAGjF,MAAMC,YAAAA,GACJ,gBAAgBX,OAAAA,CAAQY,MAAM,IAAIZ,OAAAA,CAAQY,MAAM,CAACC,UAAU,GACvD,MAAMzB,MAAAA,CAAOC,EAAE,CAACyB,KAAK,CAACZ,OAAOQ,GAAG,CAAA,CAAEK,OAAO,CAAC;YACxCC,KAAAA,EAAO;gBAAEH,UAAAA,EAAYb,OAAAA,CAAQY,MAAM,CAACC;AAAW,aAAA;YAC/CI,QAAAA,EAAUR;SACZ,CAAA,GACA,IAAA;;AAGN,QAAA,MAAMS,SAAU,MAAMjB,IAAAA,EAAAA;;;;QAKtB,IAAIkB,QAAAA;;QAEJ,IAAIC,KAAAA,CAAMC,OAAO,CAACH,MAAAA,EAAQI,OAAAA,CAAAA,IAAYJ,OAAOI,OAAO,CAAC,CAAA,CAAE,EAAEC,EAAAA,EAAI;AAC3DJ,YAAAA,QAAAA,GAAWD,MAAAA,CAAOI,OAAO,CAAC,CAAA,CAAE,CAACC,EAAE;QACjC,CAAA,MAAO,IAAIL,QAAQK,EAAAA,EAAI;AACrBJ,YAAAA,QAAAA,GAAWD,OAAOK,EAAE;QACtB,CAAA,MAAO;YACL,OAAOL,MAAAA;AACT,QAAA;QAEA,MAAMM,eAAAA,GAAkB,MAAMpC,MAAAA,CAAOC,EAAE,CAACyB,KAAK,CAACZ,MAAAA,CAAOQ,GAAG,CAAA,CAAEK,OAAO,CAAC;YAChEC,KAAAA,EAAO;gBAAEO,EAAAA,EAAIJ;AAAS,aAAA;YACtBF,QAAAA,EAAUR;AACZ,SAAA,CAAA;QAEA,MAAMgB,cAAAA,GAAiBjB,2BAA2BN,MAAAA,EAAQS,YAAAA,CAAAA;QAC1D,MAAMe,aAAAA,GAAgBlB,2BAA2BN,MAAAA,EAAQsB,eAAAA,CAAAA;;QAGzD,MAAMG,UAAAA,GACJ,CAAChB,YAAAA,IACDiB,MAAAA,CAAOC,IAAI,CAACH,aAAAA,CAAAA,CAAeI,IAAI,CAAC,CAACC,GAAAA,GAAAA;YAC/B,OAAO,CAACC,QAAQN,aAAa,CAACK,IAAI,EAAEN,cAAc,CAACM,GAAAA,CAAI,CAAA;AACzD,QAAA,CAAA,CAAA;AAEF,QAAA,IAAIJ,UAAAA,EAAY;AACd,YAAA,MAAMjC,UAAAA,CAAW,eAAA,CAAA,CAAiBuC,0BAA0B,CAACT,eAAAA,EAAiBtB,MAAAA,CAAAA;AAChF,QAAA;QAEA,OAAOgB,MAAAA;AACT,IAAA,CAAA,CAAA;AACF,CAAA;AAEA,gBAAe,CAAA,UAAA;AACb,IAAA,MAAM,EAAEgB,sBAAsB,EAAE,GAAGxC,UAAAA,CAAW,SAAA,CAAA;AAC9C,IAAA,MAAM,EAAEyC,iBAAiB,EAAE,GAAGzC,UAAAA,CAAW,SAAA,CAAA;IACzC,MAAM,EAAE0C,eAAe,EAAEzC,OAAO,EAAE0C,MAAM,EAAE,GAAG3C,UAAAA,CAAW,aAAA,CAAA;;IAGxD,MAAMyC,iBAAAA,EAAAA;;AAGNC,IAAAA,eAAAA,CAAgBE,8BAA8B,EAAA;;AAG9C,IAAA,MAAM3C,QAAQ4C,mBAAmB,EAAA;AACjC5C,IAAAA,OAAAA,CAAQ6C,wBAAwB,EAAA;AAChC7C,IAAAA,OAAAA,CAAQ8C,uBAAuB,EAAA;;AAG/BJ,IAAAA,MAAAA,CAAOK,+BAA+B,EAAA;;AAGtCvD,IAAAA,mBAAAA,EAAAA;;;IAIA,IAAIC,MAAAA,CAAOuD,GAAG,CAAC,sBAAA,CAAA,EAAyB;QACtCC,mBAAAA,CAAoBxD,MAAAA,CAAOyD,GAAG,CAAC,sBAAA,CAAA,CAAA;AACjC,IAAA;;AAGA,IAAA,IAAIzD,OAAO0D,EAAE,CAACC,KAAK,CAACC,WAAW,EAAA,EAAI;AACjC,QAAA,MAAMC,iBAAiBvD,UAAAA,CAAW,iBAAA,CAAA;QAElC,IAAI,CAACuD,cAAAA,CAAeC,WAAW,EAAA,IAAM9D,MAAAA,CAAO0D,EAAE,CAACC,KAAK,CAACI,wBAAwB,EAAA,EAAI;AAC/EF,YAAAA,cAAAA,CAAeG,6BAA6B,EAAA;AAC9C,QAAA;AAEA1D,QAAAA,UAAAA,CAAW,oBAAoB2D,eAAe,EAAA;AAChD,IAAA;AAEAnB,IAAAA,sBAAAA,EAAAA;AACF,CAAA;;;;"}
@@ -1,15 +1,15 @@
1
1
  'use strict';
2
2
 
3
- var fp = require('lodash/fp');
3
+ var _ = require('lodash');
4
4
  var utils = require('@strapi/utils');
5
5
  var index = require('../utils/index.js');
6
6
  var contentTypes = require('../validation/content-types.js');
7
7
 
8
8
  const { ApplicationError } = utils.errors;
9
9
  const { PUBLISHED_AT_ATTRIBUTE } = utils.contentTypes.constants;
10
- const getLocalesProperty = fp.getOr([], 'properties.locales');
11
- const getFieldsProperty = fp.prop('properties.fields');
12
- const getFirstLevelPath = fp.map((path)=>path.split('.')[0]);
10
+ const getLocalesProperty = (permission)=>_.get(permission, 'properties.locales', []);
11
+ const getFieldsProperty = _.property('properties.fields');
12
+ const getFirstLevelPath = (paths)=>paths.map((path)=>path.split('.')[0]);
13
13
  const controller = {
14
14
  async getNonLocalizedAttributes (ctx) {
15
15
  const { user, userAbility } = ctx.state;
@@ -52,14 +52,14 @@ const controller = {
52
52
  ],
53
53
  subject: model,
54
54
  role: {
55
- id: user.roles.map(fp.prop('id'))
55
+ id: user.roles.map((role)=>role?.id)
56
56
  }
57
57
  }
58
58
  });
59
59
  const localePermissions = permissions.filter((perm)=>getLocalesProperty(perm).includes(locale)).map(getFieldsProperty);
60
- const permittedFields = fp.pipe(fp.flatten, getFirstLevelPath, fp.uniq)(localePermissions);
60
+ const permittedFields = _.flow(_.flatten, getFirstLevelPath, _.uniq)(localePermissions);
61
61
  const nonLocalizedFields = copyNonLocalizedAttributes(modelDef, entity);
62
- const pickedFields = fp.pick(permittedFields, nonLocalizedFields);
62
+ const pickedFields = _.pick(nonLocalizedFields, permittedFields);
63
63
  // Guard relations: omit fields that point to content types the user cannot read
64
64
  const sanitizedNonLocalizedFields = Object.fromEntries(Object.entries(pickedFields).filter(([key])=>{
65
65
  const attribute = modelDef.attributes?.[key];
@@ -71,18 +71,18 @@ const controller = {
71
71
  const availableLocalesResult = await strapi.plugins['content-manager'].service('document-metadata').getMetadata(model, entity, {
72
72
  availableLocales: true
73
73
  });
74
- const availableLocales = availableLocalesResult.availableLocales.map((localeResult)=>fp.pick([
74
+ const availableLocales = availableLocalesResult.availableLocales.map((localeResult)=>_.pick(localeResult, [
75
75
  'id',
76
76
  'locale',
77
77
  PUBLISHED_AT_ATTRIBUTE
78
- ], localeResult));
78
+ ]));
79
79
  ctx.body = {
80
80
  nonLocalizedFields: sanitizedNonLocalizedFields,
81
- localizations: availableLocales.concat(fp.pick([
81
+ localizations: availableLocales.concat(_.pick(entity, [
82
82
  'id',
83
83
  'locale',
84
84
  PUBLISHED_AT_ATTRIBUTE
85
- ], entity))
85
+ ]))
86
86
  };
87
87
  },
88
88
  async getFillFromLocaleData (ctx) {
@@ -1 +1 @@
1
- {"version":3,"file":"content-types.js","sources":["../../../server/src/controllers/content-types.ts"],"sourcesContent":["import { pick, uniq, prop, getOr, flatten, pipe, map } from 'lodash/fp';\nimport { contentTypes as contentTypesUtils, errors } from '@strapi/utils';\nimport type { Core, UID } from '@strapi/types';\nimport type { FillFromLocale } from '../../../shared/contracts/content-manager';\nimport { getService } from '../utils';\nimport {\n validateGetNonLocalizedAttributesInput,\n validateFillFromLocaleInput,\n} from '../validation/content-types';\n\nconst { ApplicationError } = errors;\n\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypesUtils.constants;\n\nconst getLocalesProperty = getOr<string[]>([], 'properties.locales');\nconst getFieldsProperty = prop('properties.fields');\n\nconst getFirstLevelPath = map((path: string) => path.split('.')[0]);\n\nconst controller = {\n async getNonLocalizedAttributes(ctx) {\n const { user, userAbility } = ctx.state;\n const body = ctx.request.body as any;\n const { model, id, locale } = body;\n\n await validateGetNonLocalizedAttributesInput({ model, id, locale });\n\n const permissionChecker = strapi\n .plugin('content-manager')\n .service('permission-checker')\n .create({ userAbility, model });\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const {\n copyNonLocalizedAttributes,\n isLocalizedContentType,\n getNestedPopulateOfNonLocalizedAttributes,\n } = getService('content-types');\n\n const {\n default: { READ_ACTION, CREATE_ACTION },\n } = strapi.service('admin::constants');\n\n const modelDef = strapi.contentType(model);\n const attributesToPopulate = getNestedPopulateOfNonLocalizedAttributes(model);\n\n if (!isLocalizedContentType(modelDef)) {\n throw new ApplicationError(`Model ${model} is not localized`);\n }\n\n const params = modelDef.kind === 'singleType' ? {} : { id };\n\n const entity = await strapi.db\n .query(model)\n .findOne({ where: params, populate: attributesToPopulate });\n\n if (!entity) {\n return ctx.notFound();\n }\n\n const permissions = await strapi.admin.services.permission.findMany({\n where: {\n action: [READ_ACTION, CREATE_ACTION],\n subject: model,\n role: {\n id: user.roles.map(prop('id')),\n },\n },\n });\n\n const localePermissions = permissions\n .filter((perm: any) => getLocalesProperty(perm).includes(locale))\n .map(getFieldsProperty);\n\n const permittedFields = pipe(flatten, getFirstLevelPath, uniq)(localePermissions);\n\n const nonLocalizedFields = copyNonLocalizedAttributes(modelDef, entity);\n const pickedFields = pick(permittedFields, nonLocalizedFields);\n\n // Guard relations: omit fields that point to content types the user cannot read\n const sanitizedNonLocalizedFields = Object.fromEntries(\n Object.entries(pickedFields).filter(([key]) => {\n const attribute = modelDef.attributes?.[key] as any;\n if (attribute?.type === 'relation' && attribute.target) {\n return userAbility.can(READ_ACTION, attribute.target);\n }\n return true;\n })\n );\n\n const availableLocalesResult = await strapi.plugins['content-manager']\n .service('document-metadata')\n .getMetadata(model, entity, {\n availableLocales: true,\n });\n\n const availableLocales = availableLocalesResult.availableLocales.map((localeResult: any) =>\n pick(['id', 'locale', PUBLISHED_AT_ATTRIBUTE], localeResult)\n );\n\n ctx.body = {\n nonLocalizedFields: sanitizedNonLocalizedFields,\n localizations: availableLocales.concat(\n pick(['id', 'locale', PUBLISHED_AT_ATTRIBUTE], entity)\n ),\n };\n },\n\n async getFillFromLocaleData(ctx) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n\n await validateFillFromLocaleInput(ctx.query);\n\n const { documentId, sourceLocale, targetLocale } = ctx.query as unknown as Omit<\n FillFromLocale.Params,\n 'model'\n >;\n\n const permissionChecker = strapi\n .plugin('content-manager')\n .service('permission-checker')\n .create({ userAbility, model });\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const fillFromLocaleService = getService('fill-from-locale');\n\n const rawDocument = await fillFromLocaleService.fetchRawDocument(\n model as UID.ContentType,\n sourceLocale,\n documentId\n );\n\n if (!rawDocument) {\n return ctx.notFound();\n }\n\n // Field-level filtering: strip fields the user cannot read on this content type\n const sanitizedDocument = await permissionChecker.sanitizeOutput(rawDocument);\n\n // Transform relations to target locale, skipping those the user cannot read\n const data = await fillFromLocaleService.transformDocument(\n sanitizedDocument as Record<string, unknown>,\n model as UID.ContentType,\n targetLocale,\n userAbility\n );\n\n ctx.body = { data };\n },\n} satisfies Core.Controller;\n\nexport default controller;\n"],"names":["ApplicationError","errors","PUBLISHED_AT_ATTRIBUTE","contentTypesUtils","constants","getLocalesProperty","getOr","getFieldsProperty","prop","getFirstLevelPath","map","path","split","controller","getNonLocalizedAttributes","ctx","user","userAbility","state","body","request","model","id","locale","validateGetNonLocalizedAttributesInput","permissionChecker","strapi","plugin","service","create","cannot","read","forbidden","copyNonLocalizedAttributes","isLocalizedContentType","getNestedPopulateOfNonLocalizedAttributes","getService","default","READ_ACTION","CREATE_ACTION","modelDef","contentType","attributesToPopulate","params","kind","entity","db","query","findOne","where","populate","notFound","permissions","admin","services","permission","findMany","action","subject","role","roles","localePermissions","filter","perm","includes","permittedFields","pipe","flatten","uniq","nonLocalizedFields","pickedFields","pick","sanitizedNonLocalizedFields","Object","fromEntries","entries","key","attribute","attributes","type","target","can","availableLocalesResult","plugins","getMetadata","availableLocales","localeResult","localizations","concat","getFillFromLocaleData","validateFillFromLocaleInput","documentId","sourceLocale","targetLocale","fillFromLocaleService","rawDocument","fetchRawDocument","sanitizedDocument","sanitizeOutput","data","transformDocument"],"mappings":"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"}
1
+ {"version":3,"file":"content-types.js","sources":["../../../server/src/controllers/content-types.ts"],"sourcesContent":["import { get, property, flow, pick, uniq, flatten } from 'lodash';\nimport { contentTypes as contentTypesUtils, errors } from '@strapi/utils';\nimport type { Core, Data, UID } from '@strapi/types';\nimport type { FillFromLocale } from '../../../shared/contracts/content-manager';\nimport { getService } from '../utils';\nimport {\n validateGetNonLocalizedAttributesInput,\n validateFillFromLocaleInput,\n} from '../validation/content-types';\n\nconst { ApplicationError } = errors;\n\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypesUtils.constants;\n\nconst getLocalesProperty = (permission: { properties?: { locales?: string[] } }): string[] =>\n get(permission, 'properties.locales', []);\nconst getFieldsProperty = property('properties.fields');\n\nconst getFirstLevelPath = (paths: string[]) => paths.map((path) => path.split('.')[0]);\n\nconst controller = {\n async getNonLocalizedAttributes(ctx) {\n const { user, userAbility } = ctx.state;\n const body = ctx.request.body as any;\n const { model, id, locale } = body;\n\n await validateGetNonLocalizedAttributesInput({ model, id, locale });\n\n const permissionChecker = strapi\n .plugin('content-manager')\n .service('permission-checker')\n .create({ userAbility, model });\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const {\n copyNonLocalizedAttributes,\n isLocalizedContentType,\n getNestedPopulateOfNonLocalizedAttributes,\n } = getService('content-types');\n\n const {\n default: { READ_ACTION, CREATE_ACTION },\n } = strapi.service('admin::constants');\n\n const modelDef = strapi.contentType(model);\n const attributesToPopulate = getNestedPopulateOfNonLocalizedAttributes(model);\n\n if (!isLocalizedContentType(modelDef)) {\n throw new ApplicationError(`Model ${model} is not localized`);\n }\n\n const params = modelDef.kind === 'singleType' ? {} : { id };\n\n const entity = await strapi.db\n .query(model)\n .findOne({ where: params, populate: attributesToPopulate });\n\n if (!entity) {\n return ctx.notFound();\n }\n\n const permissions = await strapi.admin.services.permission.findMany({\n where: {\n action: [READ_ACTION, CREATE_ACTION],\n subject: model,\n role: {\n id: user.roles.map((role: Pick<Data.Entity, 'id'>) => role?.id),\n },\n },\n });\n\n const localePermissions = permissions\n .filter((perm: any) => getLocalesProperty(perm).includes(locale))\n .map(getFieldsProperty);\n\n const permittedFields = flow(flatten, getFirstLevelPath, uniq)(localePermissions);\n\n const nonLocalizedFields = copyNonLocalizedAttributes(modelDef, entity);\n const pickedFields = pick(nonLocalizedFields, permittedFields);\n\n // Guard relations: omit fields that point to content types the user cannot read\n const sanitizedNonLocalizedFields = Object.fromEntries(\n Object.entries(pickedFields).filter(([key]) => {\n const attribute = modelDef.attributes?.[key] as any;\n if (attribute?.type === 'relation' && attribute.target) {\n return userAbility.can(READ_ACTION, attribute.target);\n }\n return true;\n })\n );\n\n const availableLocalesResult = await strapi.plugins['content-manager']\n .service('document-metadata')\n .getMetadata(model, entity, {\n availableLocales: true,\n });\n\n const availableLocales = availableLocalesResult.availableLocales.map((localeResult: any) =>\n pick(localeResult, ['id', 'locale', PUBLISHED_AT_ATTRIBUTE])\n );\n\n ctx.body = {\n nonLocalizedFields: sanitizedNonLocalizedFields,\n localizations: availableLocales.concat(\n pick(entity, ['id', 'locale', PUBLISHED_AT_ATTRIBUTE])\n ),\n };\n },\n\n async getFillFromLocaleData(ctx) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n\n await validateFillFromLocaleInput(ctx.query);\n\n const { documentId, sourceLocale, targetLocale } = ctx.query as unknown as Omit<\n FillFromLocale.Params,\n 'model'\n >;\n\n const permissionChecker = strapi\n .plugin('content-manager')\n .service('permission-checker')\n .create({ userAbility, model });\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const fillFromLocaleService = getService('fill-from-locale');\n\n const rawDocument = await fillFromLocaleService.fetchRawDocument(\n model as UID.ContentType,\n sourceLocale,\n documentId\n );\n\n if (!rawDocument) {\n return ctx.notFound();\n }\n\n // Field-level filtering: strip fields the user cannot read on this content type\n const sanitizedDocument = await permissionChecker.sanitizeOutput(rawDocument);\n\n // Transform relations to target locale, skipping those the user cannot read\n const data = await fillFromLocaleService.transformDocument(\n sanitizedDocument as Record<string, unknown>,\n model as UID.ContentType,\n targetLocale,\n userAbility\n );\n\n ctx.body = { data };\n },\n} satisfies Core.Controller;\n\nexport default controller;\n"],"names":["ApplicationError","errors","PUBLISHED_AT_ATTRIBUTE","contentTypesUtils","constants","getLocalesProperty","permission","get","getFieldsProperty","property","getFirstLevelPath","paths","map","path","split","controller","getNonLocalizedAttributes","ctx","user","userAbility","state","body","request","model","id","locale","validateGetNonLocalizedAttributesInput","permissionChecker","strapi","plugin","service","create","cannot","read","forbidden","copyNonLocalizedAttributes","isLocalizedContentType","getNestedPopulateOfNonLocalizedAttributes","getService","default","READ_ACTION","CREATE_ACTION","modelDef","contentType","attributesToPopulate","params","kind","entity","db","query","findOne","where","populate","notFound","permissions","admin","services","findMany","action","subject","role","roles","localePermissions","filter","perm","includes","permittedFields","flow","flatten","uniq","nonLocalizedFields","pickedFields","pick","sanitizedNonLocalizedFields","Object","fromEntries","entries","key","attribute","attributes","type","target","can","availableLocalesResult","plugins","getMetadata","availableLocales","localeResult","localizations","concat","getFillFromLocaleData","validateFillFromLocaleInput","documentId","sourceLocale","targetLocale","fillFromLocaleService","rawDocument","fetchRawDocument","sanitizedDocument","sanitizeOutput","data","transformDocument"],"mappings":"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"}
@@ -1,13 +1,13 @@
1
- import { getOr, prop, map, pipe, flatten, uniq, pick } from 'lodash/fp';
1
+ import { property, flow, flatten, uniq, pick, get } from 'lodash';
2
2
  import { errors, contentTypes } from '@strapi/utils';
3
3
  import { getService } from '../utils/index.mjs';
4
4
  import { validateFillFromLocaleInput, validateGetNonLocalizedAttributesInput } from '../validation/content-types.mjs';
5
5
 
6
6
  const { ApplicationError } = errors;
7
7
  const { PUBLISHED_AT_ATTRIBUTE } = contentTypes.constants;
8
- const getLocalesProperty = getOr([], 'properties.locales');
9
- const getFieldsProperty = prop('properties.fields');
10
- const getFirstLevelPath = map((path)=>path.split('.')[0]);
8
+ const getLocalesProperty = (permission)=>get(permission, 'properties.locales', []);
9
+ const getFieldsProperty = property('properties.fields');
10
+ const getFirstLevelPath = (paths)=>paths.map((path)=>path.split('.')[0]);
11
11
  const controller = {
12
12
  async getNonLocalizedAttributes (ctx) {
13
13
  const { user, userAbility } = ctx.state;
@@ -50,14 +50,14 @@ const controller = {
50
50
  ],
51
51
  subject: model,
52
52
  role: {
53
- id: user.roles.map(prop('id'))
53
+ id: user.roles.map((role)=>role?.id)
54
54
  }
55
55
  }
56
56
  });
57
57
  const localePermissions = permissions.filter((perm)=>getLocalesProperty(perm).includes(locale)).map(getFieldsProperty);
58
- const permittedFields = pipe(flatten, getFirstLevelPath, uniq)(localePermissions);
58
+ const permittedFields = flow(flatten, getFirstLevelPath, uniq)(localePermissions);
59
59
  const nonLocalizedFields = copyNonLocalizedAttributes(modelDef, entity);
60
- const pickedFields = pick(permittedFields, nonLocalizedFields);
60
+ const pickedFields = pick(nonLocalizedFields, permittedFields);
61
61
  // Guard relations: omit fields that point to content types the user cannot read
62
62
  const sanitizedNonLocalizedFields = Object.fromEntries(Object.entries(pickedFields).filter(([key])=>{
63
63
  const attribute = modelDef.attributes?.[key];
@@ -69,18 +69,18 @@ const controller = {
69
69
  const availableLocalesResult = await strapi.plugins['content-manager'].service('document-metadata').getMetadata(model, entity, {
70
70
  availableLocales: true
71
71
  });
72
- const availableLocales = availableLocalesResult.availableLocales.map((localeResult)=>pick([
72
+ const availableLocales = availableLocalesResult.availableLocales.map((localeResult)=>pick(localeResult, [
73
73
  'id',
74
74
  'locale',
75
75
  PUBLISHED_AT_ATTRIBUTE
76
- ], localeResult));
76
+ ]));
77
77
  ctx.body = {
78
78
  nonLocalizedFields: sanitizedNonLocalizedFields,
79
- localizations: availableLocales.concat(pick([
79
+ localizations: availableLocales.concat(pick(entity, [
80
80
  'id',
81
81
  'locale',
82
82
  PUBLISHED_AT_ATTRIBUTE
83
- ], entity))
83
+ ]))
84
84
  };
85
85
  },
86
86
  async getFillFromLocaleData (ctx) {
@@ -1 +1 @@
1
- {"version":3,"file":"content-types.mjs","sources":["../../../server/src/controllers/content-types.ts"],"sourcesContent":["import { pick, uniq, prop, getOr, flatten, pipe, map } from 'lodash/fp';\nimport { contentTypes as contentTypesUtils, errors } from '@strapi/utils';\nimport type { Core, UID } from '@strapi/types';\nimport type { FillFromLocale } from '../../../shared/contracts/content-manager';\nimport { getService } from '../utils';\nimport {\n validateGetNonLocalizedAttributesInput,\n validateFillFromLocaleInput,\n} from '../validation/content-types';\n\nconst { ApplicationError } = errors;\n\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypesUtils.constants;\n\nconst getLocalesProperty = getOr<string[]>([], 'properties.locales');\nconst getFieldsProperty = prop('properties.fields');\n\nconst getFirstLevelPath = map((path: string) => path.split('.')[0]);\n\nconst controller = {\n async getNonLocalizedAttributes(ctx) {\n const { user, userAbility } = ctx.state;\n const body = ctx.request.body as any;\n const { model, id, locale } = body;\n\n await validateGetNonLocalizedAttributesInput({ model, id, locale });\n\n const permissionChecker = strapi\n .plugin('content-manager')\n .service('permission-checker')\n .create({ userAbility, model });\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const {\n copyNonLocalizedAttributes,\n isLocalizedContentType,\n getNestedPopulateOfNonLocalizedAttributes,\n } = getService('content-types');\n\n const {\n default: { READ_ACTION, CREATE_ACTION },\n } = strapi.service('admin::constants');\n\n const modelDef = strapi.contentType(model);\n const attributesToPopulate = getNestedPopulateOfNonLocalizedAttributes(model);\n\n if (!isLocalizedContentType(modelDef)) {\n throw new ApplicationError(`Model ${model} is not localized`);\n }\n\n const params = modelDef.kind === 'singleType' ? {} : { id };\n\n const entity = await strapi.db\n .query(model)\n .findOne({ where: params, populate: attributesToPopulate });\n\n if (!entity) {\n return ctx.notFound();\n }\n\n const permissions = await strapi.admin.services.permission.findMany({\n where: {\n action: [READ_ACTION, CREATE_ACTION],\n subject: model,\n role: {\n id: user.roles.map(prop('id')),\n },\n },\n });\n\n const localePermissions = permissions\n .filter((perm: any) => getLocalesProperty(perm).includes(locale))\n .map(getFieldsProperty);\n\n const permittedFields = pipe(flatten, getFirstLevelPath, uniq)(localePermissions);\n\n const nonLocalizedFields = copyNonLocalizedAttributes(modelDef, entity);\n const pickedFields = pick(permittedFields, nonLocalizedFields);\n\n // Guard relations: omit fields that point to content types the user cannot read\n const sanitizedNonLocalizedFields = Object.fromEntries(\n Object.entries(pickedFields).filter(([key]) => {\n const attribute = modelDef.attributes?.[key] as any;\n if (attribute?.type === 'relation' && attribute.target) {\n return userAbility.can(READ_ACTION, attribute.target);\n }\n return true;\n })\n );\n\n const availableLocalesResult = await strapi.plugins['content-manager']\n .service('document-metadata')\n .getMetadata(model, entity, {\n availableLocales: true,\n });\n\n const availableLocales = availableLocalesResult.availableLocales.map((localeResult: any) =>\n pick(['id', 'locale', PUBLISHED_AT_ATTRIBUTE], localeResult)\n );\n\n ctx.body = {\n nonLocalizedFields: sanitizedNonLocalizedFields,\n localizations: availableLocales.concat(\n pick(['id', 'locale', PUBLISHED_AT_ATTRIBUTE], entity)\n ),\n };\n },\n\n async getFillFromLocaleData(ctx) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n\n await validateFillFromLocaleInput(ctx.query);\n\n const { documentId, sourceLocale, targetLocale } = ctx.query as unknown as Omit<\n FillFromLocale.Params,\n 'model'\n >;\n\n const permissionChecker = strapi\n .plugin('content-manager')\n .service('permission-checker')\n .create({ userAbility, model });\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const fillFromLocaleService = getService('fill-from-locale');\n\n const rawDocument = await fillFromLocaleService.fetchRawDocument(\n model as UID.ContentType,\n sourceLocale,\n documentId\n );\n\n if (!rawDocument) {\n return ctx.notFound();\n }\n\n // Field-level filtering: strip fields the user cannot read on this content type\n const sanitizedDocument = await permissionChecker.sanitizeOutput(rawDocument);\n\n // Transform relations to target locale, skipping those the user cannot read\n const data = await fillFromLocaleService.transformDocument(\n sanitizedDocument as Record<string, unknown>,\n model as UID.ContentType,\n targetLocale,\n userAbility\n );\n\n ctx.body = { data };\n },\n} satisfies Core.Controller;\n\nexport default controller;\n"],"names":["ApplicationError","errors","PUBLISHED_AT_ATTRIBUTE","contentTypesUtils","constants","getLocalesProperty","getOr","getFieldsProperty","prop","getFirstLevelPath","map","path","split","controller","getNonLocalizedAttributes","ctx","user","userAbility","state","body","request","model","id","locale","validateGetNonLocalizedAttributesInput","permissionChecker","strapi","plugin","service","create","cannot","read","forbidden","copyNonLocalizedAttributes","isLocalizedContentType","getNestedPopulateOfNonLocalizedAttributes","getService","default","READ_ACTION","CREATE_ACTION","modelDef","contentType","attributesToPopulate","params","kind","entity","db","query","findOne","where","populate","notFound","permissions","admin","services","permission","findMany","action","subject","role","roles","localePermissions","filter","perm","includes","permittedFields","pipe","flatten","uniq","nonLocalizedFields","pickedFields","pick","sanitizedNonLocalizedFields","Object","fromEntries","entries","key","attribute","attributes","type","target","can","availableLocalesResult","plugins","getMetadata","availableLocales","localeResult","localizations","concat","getFillFromLocaleData","validateFillFromLocaleInput","documentId","sourceLocale","targetLocale","fillFromLocaleService","rawDocument","fetchRawDocument","sanitizedDocument","sanitizeOutput","data","transformDocument"],"mappings":"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"}
1
+ {"version":3,"file":"content-types.mjs","sources":["../../../server/src/controllers/content-types.ts"],"sourcesContent":["import { get, property, flow, pick, uniq, flatten } from 'lodash';\nimport { contentTypes as contentTypesUtils, errors } from '@strapi/utils';\nimport type { Core, Data, UID } from '@strapi/types';\nimport type { FillFromLocale } from '../../../shared/contracts/content-manager';\nimport { getService } from '../utils';\nimport {\n validateGetNonLocalizedAttributesInput,\n validateFillFromLocaleInput,\n} from '../validation/content-types';\n\nconst { ApplicationError } = errors;\n\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypesUtils.constants;\n\nconst getLocalesProperty = (permission: { properties?: { locales?: string[] } }): string[] =>\n get(permission, 'properties.locales', []);\nconst getFieldsProperty = property('properties.fields');\n\nconst getFirstLevelPath = (paths: string[]) => paths.map((path) => path.split('.')[0]);\n\nconst controller = {\n async getNonLocalizedAttributes(ctx) {\n const { user, userAbility } = ctx.state;\n const body = ctx.request.body as any;\n const { model, id, locale } = body;\n\n await validateGetNonLocalizedAttributesInput({ model, id, locale });\n\n const permissionChecker = strapi\n .plugin('content-manager')\n .service('permission-checker')\n .create({ userAbility, model });\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const {\n copyNonLocalizedAttributes,\n isLocalizedContentType,\n getNestedPopulateOfNonLocalizedAttributes,\n } = getService('content-types');\n\n const {\n default: { READ_ACTION, CREATE_ACTION },\n } = strapi.service('admin::constants');\n\n const modelDef = strapi.contentType(model);\n const attributesToPopulate = getNestedPopulateOfNonLocalizedAttributes(model);\n\n if (!isLocalizedContentType(modelDef)) {\n throw new ApplicationError(`Model ${model} is not localized`);\n }\n\n const params = modelDef.kind === 'singleType' ? {} : { id };\n\n const entity = await strapi.db\n .query(model)\n .findOne({ where: params, populate: attributesToPopulate });\n\n if (!entity) {\n return ctx.notFound();\n }\n\n const permissions = await strapi.admin.services.permission.findMany({\n where: {\n action: [READ_ACTION, CREATE_ACTION],\n subject: model,\n role: {\n id: user.roles.map((role: Pick<Data.Entity, 'id'>) => role?.id),\n },\n },\n });\n\n const localePermissions = permissions\n .filter((perm: any) => getLocalesProperty(perm).includes(locale))\n .map(getFieldsProperty);\n\n const permittedFields = flow(flatten, getFirstLevelPath, uniq)(localePermissions);\n\n const nonLocalizedFields = copyNonLocalizedAttributes(modelDef, entity);\n const pickedFields = pick(nonLocalizedFields, permittedFields);\n\n // Guard relations: omit fields that point to content types the user cannot read\n const sanitizedNonLocalizedFields = Object.fromEntries(\n Object.entries(pickedFields).filter(([key]) => {\n const attribute = modelDef.attributes?.[key] as any;\n if (attribute?.type === 'relation' && attribute.target) {\n return userAbility.can(READ_ACTION, attribute.target);\n }\n return true;\n })\n );\n\n const availableLocalesResult = await strapi.plugins['content-manager']\n .service('document-metadata')\n .getMetadata(model, entity, {\n availableLocales: true,\n });\n\n const availableLocales = availableLocalesResult.availableLocales.map((localeResult: any) =>\n pick(localeResult, ['id', 'locale', PUBLISHED_AT_ATTRIBUTE])\n );\n\n ctx.body = {\n nonLocalizedFields: sanitizedNonLocalizedFields,\n localizations: availableLocales.concat(\n pick(entity, ['id', 'locale', PUBLISHED_AT_ATTRIBUTE])\n ),\n };\n },\n\n async getFillFromLocaleData(ctx) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n\n await validateFillFromLocaleInput(ctx.query);\n\n const { documentId, sourceLocale, targetLocale } = ctx.query as unknown as Omit<\n FillFromLocale.Params,\n 'model'\n >;\n\n const permissionChecker = strapi\n .plugin('content-manager')\n .service('permission-checker')\n .create({ userAbility, model });\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const fillFromLocaleService = getService('fill-from-locale');\n\n const rawDocument = await fillFromLocaleService.fetchRawDocument(\n model as UID.ContentType,\n sourceLocale,\n documentId\n );\n\n if (!rawDocument) {\n return ctx.notFound();\n }\n\n // Field-level filtering: strip fields the user cannot read on this content type\n const sanitizedDocument = await permissionChecker.sanitizeOutput(rawDocument);\n\n // Transform relations to target locale, skipping those the user cannot read\n const data = await fillFromLocaleService.transformDocument(\n sanitizedDocument as Record<string, unknown>,\n model as UID.ContentType,\n targetLocale,\n userAbility\n );\n\n ctx.body = { data };\n },\n} satisfies Core.Controller;\n\nexport default controller;\n"],"names":["ApplicationError","errors","PUBLISHED_AT_ATTRIBUTE","contentTypesUtils","constants","getLocalesProperty","permission","get","getFieldsProperty","property","getFirstLevelPath","paths","map","path","split","controller","getNonLocalizedAttributes","ctx","user","userAbility","state","body","request","model","id","locale","validateGetNonLocalizedAttributesInput","permissionChecker","strapi","plugin","service","create","cannot","read","forbidden","copyNonLocalizedAttributes","isLocalizedContentType","getNestedPopulateOfNonLocalizedAttributes","getService","default","READ_ACTION","CREATE_ACTION","modelDef","contentType","attributesToPopulate","params","kind","entity","db","query","findOne","where","populate","notFound","permissions","admin","services","findMany","action","subject","role","roles","localePermissions","filter","perm","includes","permittedFields","flow","flatten","uniq","nonLocalizedFields","pickedFields","pick","sanitizedNonLocalizedFields","Object","fromEntries","entries","key","attribute","attributes","type","target","can","availableLocalesResult","plugins","getMetadata","availableLocales","localeResult","localizations","concat","getFillFromLocaleData","validateFillFromLocaleInput","documentId","sourceLocale","targetLocale","fillFromLocaleService","rawDocument","fetchRawDocument","sanitizedDocument","sanitizeOutput","data","transformDocument"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var utils = require('@strapi/utils');
4
- var fp = require('lodash/fp');
4
+ var _ = require('lodash');
5
5
  var index = require('../utils/index.js');
6
6
  var locales = require('../validation/locales.js');
7
7
  var locale = require('../domain/locale.js');
@@ -78,7 +78,7 @@ const controller = {
78
78
  const cleanUpdates = setCreatorFields({
79
79
  user,
80
80
  isEdition: true
81
- })(fp.pick(allowedParams, updates));
81
+ })(_.pick(updates, allowedParams));
82
82
  const updatedLocale = await localesService.update({
83
83
  id
84
84
  }, cleanUpdates);
@@ -1 +1 @@
1
- {"version":3,"file":"locales.js","sources":["../../../server/src/controllers/locales.ts"],"sourcesContent":["import * as utils from '@strapi/utils';\nimport { pick } from 'lodash/fp';\nimport type { Core } from '@strapi/types';\nimport { getService } from '../utils';\nimport { validateCreateLocaleInput, validateUpdateLocaleInput } from '../validation/locales';\nimport { formatLocale } from '../domain/locale';\n\nconst { setCreatorFields } = utils;\nconst { ApplicationError } = utils.errors;\n\nconst sanitizeLocale = (locale: any) => {\n const model = strapi.getModel('plugin::i18n.locale');\n\n return strapi.contentAPI.sanitize.output(locale, model);\n};\n\nconst controller: Core.Controller = {\n async listLocales(ctx) {\n const localesService = getService('locales');\n\n const locales = await localesService.find();\n const sanitizedLocales = await sanitizeLocale(locales);\n\n ctx.body = await localesService.setIsDefault(sanitizedLocales);\n },\n\n async createLocale(ctx) {\n const { user } = ctx.state;\n const body = ctx.request.body as any;\n const { isDefault, ...localeToCreate } = body;\n\n await validateCreateLocaleInput(body);\n\n const localesService = getService('locales');\n\n const existingLocale = await localesService.findByCode(body.code);\n if (existingLocale) {\n throw new ApplicationError('This locale already exists');\n }\n\n const localeToPersist = setCreatorFields({ user })(formatLocale(localeToCreate));\n\n const locale = await localesService.create(localeToPersist, { isDefault: Boolean(isDefault) });\n\n if (isDefault) {\n await localesService.setDefaultLocale(locale);\n }\n\n const sanitizedLocale = await sanitizeLocale(locale);\n\n ctx.body = await localesService.setIsDefault(sanitizedLocale);\n },\n\n async updateLocale(ctx) {\n const { user } = ctx.state;\n const { id } = ctx.params;\n const body = ctx.request.body as any;\n const { isDefault, ...updates } = body;\n\n await validateUpdateLocaleInput(body);\n\n const localesService = getService('locales');\n\n const existingLocale = await localesService.findById(id);\n if (!existingLocale) {\n return ctx.notFound('locale.notFound');\n }\n\n const allowedParams = ['name'];\n const cleanUpdates = setCreatorFields({ user, isEdition: true })(pick(allowedParams, updates));\n\n const updatedLocale = await localesService.update({ id }, cleanUpdates);\n\n if (isDefault) {\n await localesService.setDefaultLocale(updatedLocale);\n }\n\n const sanitizedLocale = await sanitizeLocale(updatedLocale);\n\n ctx.body = await localesService.setIsDefault(sanitizedLocale);\n },\n\n async deleteLocale(ctx) {\n const { id } = ctx.params;\n\n const localesService = getService('locales');\n\n const existingLocale = await localesService.findById(id);\n if (!existingLocale) {\n return ctx.notFound('locale.notFound');\n }\n\n const defaultLocaleCode = await localesService.getDefaultLocale();\n if (existingLocale.code === defaultLocaleCode) {\n throw new ApplicationError('Cannot delete the default locale');\n }\n\n await localesService.delete({ id });\n\n const sanitizedLocale = await sanitizeLocale(existingLocale);\n\n ctx.body = await localesService.setIsDefault(sanitizedLocale);\n },\n};\n\nexport default controller;\n"],"names":["setCreatorFields","utils","ApplicationError","errors","sanitizeLocale","locale","model","strapi","getModel","contentAPI","sanitize","output","controller","listLocales","ctx","localesService","getService","locales","find","sanitizedLocales","body","setIsDefault","createLocale","user","state","request","isDefault","localeToCreate","validateCreateLocaleInput","existingLocale","findByCode","code","localeToPersist","formatLocale","create","Boolean","setDefaultLocale","sanitizedLocale","updateLocale","id","params","updates","validateUpdateLocaleInput","findById","notFound","allowedParams","cleanUpdates","isEdition","pick","updatedLocale","update","deleteLocale","defaultLocaleCode","getDefaultLocale","delete"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,MAAM,EAAEA,gBAAgB,EAAE,GAAGC,gBAAAA;AAC7B,MAAM,EAAEC,gBAAgB,EAAE,GAAGD,iBAAME,MAAM;AAEzC,MAAMC,iBAAiB,CAACC,MAAAA,GAAAA;IACtB,MAAMC,KAAAA,GAAQC,MAAAA,CAAOC,QAAQ,CAAC,qBAAA,CAAA;AAE9B,IAAA,OAAOD,OAAOE,UAAU,CAACC,QAAQ,CAACC,MAAM,CAACN,MAAAA,EAAQC,KAAAA,CAAAA;AACnD,CAAA;AAEA,MAAMM,UAAAA,GAA8B;AAClC,IAAA,MAAMC,aAAYC,GAAG,EAAA;AACnB,QAAA,MAAMC,iBAAiBC,gBAAAA,CAAW,SAAA,CAAA;QAElC,MAAMC,OAAAA,GAAU,MAAMF,cAAAA,CAAeG,IAAI,EAAA;QACzC,MAAMC,gBAAAA,GAAmB,MAAMf,cAAAA,CAAea,OAAAA,CAAAA;AAE9CH,QAAAA,GAAAA,CAAIM,IAAI,GAAG,MAAML,cAAAA,CAAeM,YAAY,CAACF,gBAAAA,CAAAA;AAC/C,IAAA,CAAA;AAEA,IAAA,MAAMG,cAAaR,GAAG,EAAA;AACpB,QAAA,MAAM,EAAES,IAAI,EAAE,GAAGT,IAAIU,KAAK;AAC1B,QAAA,MAAMJ,IAAAA,GAAON,GAAAA,CAAIW,OAAO,CAACL,IAAI;AAC7B,QAAA,MAAM,EAAEM,SAAS,EAAE,GAAGC,gBAAgB,GAAGP,IAAAA;AAEzC,QAAA,MAAMQ,iCAAAA,CAA0BR,IAAAA,CAAAA;AAEhC,QAAA,MAAML,iBAAiBC,gBAAAA,CAAW,SAAA,CAAA;AAElC,QAAA,MAAMa,iBAAiB,MAAMd,cAAAA,CAAee,UAAU,CAACV,KAAKW,IAAI,CAAA;AAChE,QAAA,IAAIF,cAAAA,EAAgB;AAClB,YAAA,MAAM,IAAI3B,gBAAAA,CAAiB,4BAAA,CAAA;AAC7B,QAAA;AAEA,QAAA,MAAM8B,kBAAkBhC,gBAAAA,CAAiB;AAAEuB,YAAAA;AAAK,SAAA,CAAA,CAAGU,mBAAAA,CAAaN,cAAAA,CAAAA,CAAAA;AAEhE,QAAA,MAAMtB,QAAAA,GAAS,MAAMU,cAAAA,CAAemB,MAAM,CAACF,eAAAA,EAAiB;AAAEN,YAAAA,SAAAA,EAAWS,OAAAA,CAAQT,SAAAA;AAAW,SAAA,CAAA;AAE5F,QAAA,IAAIA,SAAAA,EAAW;YACb,MAAMX,cAAAA,CAAeqB,gBAAgB,CAAC/B,QAAAA,CAAAA;AACxC,QAAA;QAEA,MAAMgC,eAAAA,GAAkB,MAAMjC,cAAAA,CAAeC,QAAAA,CAAAA;AAE7CS,QAAAA,GAAAA,CAAIM,IAAI,GAAG,MAAML,cAAAA,CAAeM,YAAY,CAACgB,eAAAA,CAAAA;AAC/C,IAAA,CAAA;AAEA,IAAA,MAAMC,cAAaxB,GAAG,EAAA;AACpB,QAAA,MAAM,EAAES,IAAI,EAAE,GAAGT,IAAIU,KAAK;AAC1B,QAAA,MAAM,EAAEe,EAAE,EAAE,GAAGzB,IAAI0B,MAAM;AACzB,QAAA,MAAMpB,IAAAA,GAAON,GAAAA,CAAIW,OAAO,CAACL,IAAI;AAC7B,QAAA,MAAM,EAAEM,SAAS,EAAE,GAAGe,SAAS,GAAGrB,IAAAA;AAElC,QAAA,MAAMsB,iCAAAA,CAA0BtB,IAAAA,CAAAA;AAEhC,QAAA,MAAML,iBAAiBC,gBAAAA,CAAW,SAAA,CAAA;AAElC,QAAA,MAAMa,cAAAA,GAAiB,MAAMd,cAAAA,CAAe4B,QAAQ,CAACJ,EAAAA,CAAAA;AACrD,QAAA,IAAI,CAACV,cAAAA,EAAgB;YACnB,OAAOf,GAAAA,CAAI8B,QAAQ,CAAC,iBAAA,CAAA;AACtB,QAAA;AAEA,QAAA,MAAMC,aAAAA,GAAgB;AAAC,YAAA;AAAO,SAAA;AAC9B,QAAA,MAAMC,eAAe9C,gBAAAA,CAAiB;AAAEuB,YAAAA,IAAAA;YAAMwB,SAAAA,EAAW;AAAK,SAAA,CAAA,CAAGC,QAAKH,aAAAA,EAAeJ,OAAAA,CAAAA,CAAAA;AAErF,QAAA,MAAMQ,aAAAA,GAAgB,MAAMlC,cAAAA,CAAemC,MAAM,CAAC;AAAEX,YAAAA;SAAG,EAAGO,YAAAA,CAAAA;AAE1D,QAAA,IAAIpB,SAAAA,EAAW;YACb,MAAMX,cAAAA,CAAeqB,gBAAgB,CAACa,aAAAA,CAAAA;AACxC,QAAA;QAEA,MAAMZ,eAAAA,GAAkB,MAAMjC,cAAAA,CAAe6C,aAAAA,CAAAA;AAE7CnC,QAAAA,GAAAA,CAAIM,IAAI,GAAG,MAAML,cAAAA,CAAeM,YAAY,CAACgB,eAAAA,CAAAA;AAC/C,IAAA,CAAA;AAEA,IAAA,MAAMc,cAAarC,GAAG,EAAA;AACpB,QAAA,MAAM,EAAEyB,EAAE,EAAE,GAAGzB,IAAI0B,MAAM;AAEzB,QAAA,MAAMzB,iBAAiBC,gBAAAA,CAAW,SAAA,CAAA;AAElC,QAAA,MAAMa,cAAAA,GAAiB,MAAMd,cAAAA,CAAe4B,QAAQ,CAACJ,EAAAA,CAAAA;AACrD,QAAA,IAAI,CAACV,cAAAA,EAAgB;YACnB,OAAOf,GAAAA,CAAI8B,QAAQ,CAAC,iBAAA,CAAA;AACtB,QAAA;QAEA,MAAMQ,iBAAAA,GAAoB,MAAMrC,cAAAA,CAAesC,gBAAgB,EAAA;QAC/D,IAAIxB,cAAAA,CAAeE,IAAI,KAAKqB,iBAAAA,EAAmB;AAC7C,YAAA,MAAM,IAAIlD,gBAAAA,CAAiB,kCAAA,CAAA;AAC7B,QAAA;QAEA,MAAMa,cAAAA,CAAeuC,MAAM,CAAC;AAAEf,YAAAA;AAAG,SAAA,CAAA;QAEjC,MAAMF,eAAAA,GAAkB,MAAMjC,cAAAA,CAAeyB,cAAAA,CAAAA;AAE7Cf,QAAAA,GAAAA,CAAIM,IAAI,GAAG,MAAML,cAAAA,CAAeM,YAAY,CAACgB,eAAAA,CAAAA;AAC/C,IAAA;AACF;;;;"}
1
+ {"version":3,"file":"locales.js","sources":["../../../server/src/controllers/locales.ts"],"sourcesContent":["import * as utils from '@strapi/utils';\nimport { pick } from 'lodash';\nimport type { Core } from '@strapi/types';\nimport { getService } from '../utils';\nimport { validateCreateLocaleInput, validateUpdateLocaleInput } from '../validation/locales';\nimport { formatLocale } from '../domain/locale';\n\nconst { setCreatorFields } = utils;\nconst { ApplicationError } = utils.errors;\n\nconst sanitizeLocale = (locale: any) => {\n const model = strapi.getModel('plugin::i18n.locale');\n\n return strapi.contentAPI.sanitize.output(locale, model);\n};\n\nconst controller: Core.Controller = {\n async listLocales(ctx) {\n const localesService = getService('locales');\n\n const locales = await localesService.find();\n const sanitizedLocales = await sanitizeLocale(locales);\n\n ctx.body = await localesService.setIsDefault(sanitizedLocales);\n },\n\n async createLocale(ctx) {\n const { user } = ctx.state;\n const body = ctx.request.body as any;\n const { isDefault, ...localeToCreate } = body;\n\n await validateCreateLocaleInput(body);\n\n const localesService = getService('locales');\n\n const existingLocale = await localesService.findByCode(body.code);\n if (existingLocale) {\n throw new ApplicationError('This locale already exists');\n }\n\n const localeToPersist = setCreatorFields({ user })(formatLocale(localeToCreate));\n\n const locale = await localesService.create(localeToPersist, { isDefault: Boolean(isDefault) });\n\n if (isDefault) {\n await localesService.setDefaultLocale(locale);\n }\n\n const sanitizedLocale = await sanitizeLocale(locale);\n\n ctx.body = await localesService.setIsDefault(sanitizedLocale);\n },\n\n async updateLocale(ctx) {\n const { user } = ctx.state;\n const { id } = ctx.params;\n const body = ctx.request.body as any;\n const { isDefault, ...updates } = body;\n\n await validateUpdateLocaleInput(body);\n\n const localesService = getService('locales');\n\n const existingLocale = await localesService.findById(id);\n if (!existingLocale) {\n return ctx.notFound('locale.notFound');\n }\n\n const allowedParams = ['name'];\n const cleanUpdates = setCreatorFields({ user, isEdition: true })(pick(updates, allowedParams));\n\n const updatedLocale = await localesService.update({ id }, cleanUpdates);\n\n if (isDefault) {\n await localesService.setDefaultLocale(updatedLocale);\n }\n\n const sanitizedLocale = await sanitizeLocale(updatedLocale);\n\n ctx.body = await localesService.setIsDefault(sanitizedLocale);\n },\n\n async deleteLocale(ctx) {\n const { id } = ctx.params;\n\n const localesService = getService('locales');\n\n const existingLocale = await localesService.findById(id);\n if (!existingLocale) {\n return ctx.notFound('locale.notFound');\n }\n\n const defaultLocaleCode = await localesService.getDefaultLocale();\n if (existingLocale.code === defaultLocaleCode) {\n throw new ApplicationError('Cannot delete the default locale');\n }\n\n await localesService.delete({ id });\n\n const sanitizedLocale = await sanitizeLocale(existingLocale);\n\n ctx.body = await localesService.setIsDefault(sanitizedLocale);\n },\n};\n\nexport default controller;\n"],"names":["setCreatorFields","utils","ApplicationError","errors","sanitizeLocale","locale","model","strapi","getModel","contentAPI","sanitize","output","controller","listLocales","ctx","localesService","getService","locales","find","sanitizedLocales","body","setIsDefault","createLocale","user","state","request","isDefault","localeToCreate","validateCreateLocaleInput","existingLocale","findByCode","code","localeToPersist","formatLocale","create","Boolean","setDefaultLocale","sanitizedLocale","updateLocale","id","params","updates","validateUpdateLocaleInput","findById","notFound","allowedParams","cleanUpdates","isEdition","pick","updatedLocale","update","deleteLocale","defaultLocaleCode","getDefaultLocale","delete"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import * as utils from '@strapi/utils';
2
- import { pick } from 'lodash/fp';
2
+ import { pick } from 'lodash';
3
3
  import { getService } from '../utils/index.mjs';
4
4
  import { validateUpdateLocaleInput, validateCreateLocaleInput } from '../validation/locales.mjs';
5
5
  import { formatLocale } from '../domain/locale.mjs';
@@ -56,7 +56,7 @@ const controller = {
56
56
  const cleanUpdates = setCreatorFields({
57
57
  user,
58
58
  isEdition: true
59
- })(pick(allowedParams, updates));
59
+ })(pick(updates, allowedParams));
60
60
  const updatedLocale = await localesService.update({
61
61
  id
62
62
  }, cleanUpdates);
@@ -1 +1 @@
1
- {"version":3,"file":"locales.mjs","sources":["../../../server/src/controllers/locales.ts"],"sourcesContent":["import * as utils from '@strapi/utils';\nimport { pick } from 'lodash/fp';\nimport type { Core } from '@strapi/types';\nimport { getService } from '../utils';\nimport { validateCreateLocaleInput, validateUpdateLocaleInput } from '../validation/locales';\nimport { formatLocale } from '../domain/locale';\n\nconst { setCreatorFields } = utils;\nconst { ApplicationError } = utils.errors;\n\nconst sanitizeLocale = (locale: any) => {\n const model = strapi.getModel('plugin::i18n.locale');\n\n return strapi.contentAPI.sanitize.output(locale, model);\n};\n\nconst controller: Core.Controller = {\n async listLocales(ctx) {\n const localesService = getService('locales');\n\n const locales = await localesService.find();\n const sanitizedLocales = await sanitizeLocale(locales);\n\n ctx.body = await localesService.setIsDefault(sanitizedLocales);\n },\n\n async createLocale(ctx) {\n const { user } = ctx.state;\n const body = ctx.request.body as any;\n const { isDefault, ...localeToCreate } = body;\n\n await validateCreateLocaleInput(body);\n\n const localesService = getService('locales');\n\n const existingLocale = await localesService.findByCode(body.code);\n if (existingLocale) {\n throw new ApplicationError('This locale already exists');\n }\n\n const localeToPersist = setCreatorFields({ user })(formatLocale(localeToCreate));\n\n const locale = await localesService.create(localeToPersist, { isDefault: Boolean(isDefault) });\n\n if (isDefault) {\n await localesService.setDefaultLocale(locale);\n }\n\n const sanitizedLocale = await sanitizeLocale(locale);\n\n ctx.body = await localesService.setIsDefault(sanitizedLocale);\n },\n\n async updateLocale(ctx) {\n const { user } = ctx.state;\n const { id } = ctx.params;\n const body = ctx.request.body as any;\n const { isDefault, ...updates } = body;\n\n await validateUpdateLocaleInput(body);\n\n const localesService = getService('locales');\n\n const existingLocale = await localesService.findById(id);\n if (!existingLocale) {\n return ctx.notFound('locale.notFound');\n }\n\n const allowedParams = ['name'];\n const cleanUpdates = setCreatorFields({ user, isEdition: true })(pick(allowedParams, updates));\n\n const updatedLocale = await localesService.update({ id }, cleanUpdates);\n\n if (isDefault) {\n await localesService.setDefaultLocale(updatedLocale);\n }\n\n const sanitizedLocale = await sanitizeLocale(updatedLocale);\n\n ctx.body = await localesService.setIsDefault(sanitizedLocale);\n },\n\n async deleteLocale(ctx) {\n const { id } = ctx.params;\n\n const localesService = getService('locales');\n\n const existingLocale = await localesService.findById(id);\n if (!existingLocale) {\n return ctx.notFound('locale.notFound');\n }\n\n const defaultLocaleCode = await localesService.getDefaultLocale();\n if (existingLocale.code === defaultLocaleCode) {\n throw new ApplicationError('Cannot delete the default locale');\n }\n\n await localesService.delete({ id });\n\n const sanitizedLocale = await sanitizeLocale(existingLocale);\n\n ctx.body = await localesService.setIsDefault(sanitizedLocale);\n },\n};\n\nexport default controller;\n"],"names":["setCreatorFields","utils","ApplicationError","errors","sanitizeLocale","locale","model","strapi","getModel","contentAPI","sanitize","output","controller","listLocales","ctx","localesService","getService","locales","find","sanitizedLocales","body","setIsDefault","createLocale","user","state","request","isDefault","localeToCreate","validateCreateLocaleInput","existingLocale","findByCode","code","localeToPersist","formatLocale","create","Boolean","setDefaultLocale","sanitizedLocale","updateLocale","id","params","updates","validateUpdateLocaleInput","findById","notFound","allowedParams","cleanUpdates","isEdition","pick","updatedLocale","update","deleteLocale","defaultLocaleCode","getDefaultLocale","delete"],"mappings":"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"}
1
+ {"version":3,"file":"locales.mjs","sources":["../../../server/src/controllers/locales.ts"],"sourcesContent":["import * as utils from '@strapi/utils';\nimport { pick } from 'lodash';\nimport type { Core } from '@strapi/types';\nimport { getService } from '../utils';\nimport { validateCreateLocaleInput, validateUpdateLocaleInput } from '../validation/locales';\nimport { formatLocale } from '../domain/locale';\n\nconst { setCreatorFields } = utils;\nconst { ApplicationError } = utils.errors;\n\nconst sanitizeLocale = (locale: any) => {\n const model = strapi.getModel('plugin::i18n.locale');\n\n return strapi.contentAPI.sanitize.output(locale, model);\n};\n\nconst controller: Core.Controller = {\n async listLocales(ctx) {\n const localesService = getService('locales');\n\n const locales = await localesService.find();\n const sanitizedLocales = await sanitizeLocale(locales);\n\n ctx.body = await localesService.setIsDefault(sanitizedLocales);\n },\n\n async createLocale(ctx) {\n const { user } = ctx.state;\n const body = ctx.request.body as any;\n const { isDefault, ...localeToCreate } = body;\n\n await validateCreateLocaleInput(body);\n\n const localesService = getService('locales');\n\n const existingLocale = await localesService.findByCode(body.code);\n if (existingLocale) {\n throw new ApplicationError('This locale already exists');\n }\n\n const localeToPersist = setCreatorFields({ user })(formatLocale(localeToCreate));\n\n const locale = await localesService.create(localeToPersist, { isDefault: Boolean(isDefault) });\n\n if (isDefault) {\n await localesService.setDefaultLocale(locale);\n }\n\n const sanitizedLocale = await sanitizeLocale(locale);\n\n ctx.body = await localesService.setIsDefault(sanitizedLocale);\n },\n\n async updateLocale(ctx) {\n const { user } = ctx.state;\n const { id } = ctx.params;\n const body = ctx.request.body as any;\n const { isDefault, ...updates } = body;\n\n await validateUpdateLocaleInput(body);\n\n const localesService = getService('locales');\n\n const existingLocale = await localesService.findById(id);\n if (!existingLocale) {\n return ctx.notFound('locale.notFound');\n }\n\n const allowedParams = ['name'];\n const cleanUpdates = setCreatorFields({ user, isEdition: true })(pick(updates, allowedParams));\n\n const updatedLocale = await localesService.update({ id }, cleanUpdates);\n\n if (isDefault) {\n await localesService.setDefaultLocale(updatedLocale);\n }\n\n const sanitizedLocale = await sanitizeLocale(updatedLocale);\n\n ctx.body = await localesService.setIsDefault(sanitizedLocale);\n },\n\n async deleteLocale(ctx) {\n const { id } = ctx.params;\n\n const localesService = getService('locales');\n\n const existingLocale = await localesService.findById(id);\n if (!existingLocale) {\n return ctx.notFound('locale.notFound');\n }\n\n const defaultLocaleCode = await localesService.getDefaultLocale();\n if (existingLocale.code === defaultLocaleCode) {\n throw new ApplicationError('Cannot delete the default locale');\n }\n\n await localesService.delete({ id });\n\n const sanitizedLocale = await sanitizeLocale(existingLocale);\n\n ctx.body = await localesService.setIsDefault(sanitizedLocale);\n },\n};\n\nexport default controller;\n"],"names":["setCreatorFields","utils","ApplicationError","errors","sanitizeLocale","locale","model","strapi","getModel","contentAPI","sanitize","output","controller","listLocales","ctx","localesService","getService","locales","find","sanitizedLocales","body","setIsDefault","createLocale","user","state","request","isDefault","localeToCreate","validateCreateLocaleInput","existingLocale","findByCode","code","localeToPersist","formatLocale","create","Boolean","setDefaultLocale","sanitizedLocale","updateLocale","id","params","updates","validateUpdateLocaleInput","findById","notFound","allowedParams","cleanUpdates","isEdition","pick","updatedLocale","update","deleteLocale","defaultLocaleCode","getDefaultLocale","delete"],"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('../utils/index.js');
6
5
 
@@ -20,7 +19,7 @@ const validateLocaleCreation = async (ctx, next)=>{
20
19
  return next();
21
20
  }
22
21
  // Prevent empty string locale
23
- const locale = fp.get('locale', query) || fp.get('locale', body) || undefined;
22
+ const locale = query?.locale || body?.locale || undefined;
24
23
  // cleanup to avoid creating duplicates in single types
25
24
  ctx.request.query = {};
26
25
  let entityLocale;