@strapi/content-type-builder 5.48.0 → 5.49.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/components/AIChat/components/Messages/Message.js +5 -1
- package/dist/admin/components/AIChat/components/Messages/Message.js.map +1 -1
- package/dist/admin/components/AIChat/components/SimpleMenu.js +3 -2
- package/dist/admin/components/AIChat/components/SimpleMenu.js.map +1 -1
- package/dist/admin/components/AIChat/hooks/useCodeUpload.js +7 -2
- package/dist/admin/components/AIChat/hooks/useCodeUpload.js.map +1 -1
- package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.js +11 -5
- package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.js.map +1 -1
- package/dist/admin/components/AllowedTypesSelect.js +5 -1
- package/dist/admin/components/AllowedTypesSelect.js.map +1 -1
- package/dist/admin/components/AttributeOptions/EmptyAttributes.js +3 -2
- package/dist/admin/components/AttributeOptions/EmptyAttributes.js.map +1 -1
- package/dist/admin/components/AttributeRow.js +10 -5
- package/dist/admin/components/AttributeRow.js.map +1 -1
- package/dist/admin/components/AutoReloadOverlayBlocker.js +3 -2
- package/dist/admin/components/AutoReloadOverlayBlocker.js.map +1 -1
- package/dist/admin/components/ComponentCard/ComponentCard.js +5 -1
- package/dist/admin/components/ComponentCard/ComponentCard.js.map +1 -1
- package/dist/admin/components/ComponentList.js +5 -1
- package/dist/admin/components/ComponentList.js.map +1 -1
- package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.js +5 -1
- package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.js.map +1 -1
- package/dist/admin/components/DataManager/DataManagerProvider.js +12 -6
- package/dist/admin/components/DataManager/DataManagerProvider.js.map +1 -1
- package/dist/admin/components/DataManager/reducer.js +7 -2
- package/dist/admin/components/DataManager/reducer.js.map +1 -1
- package/dist/admin/components/DataManager/utils/cleanData.js +10 -4
- package/dist/admin/components/DataManager/utils/cleanData.js.map +1 -1
- package/dist/admin/components/DataManager/utils/retrieveComponentsThatHaveComponents.js +5 -1
- package/dist/admin/components/DataManager/utils/retrieveComponentsThatHaveComponents.js.map +1 -1
- package/dist/admin/components/DataManager/utils/retrieveSpecificInfoFromComponents.js +5 -1
- package/dist/admin/components/DataManager/utils/retrieveSpecificInfoFromComponents.js.map +1 -1
- package/dist/admin/components/FormModal/FormModal.js +30 -22
- package/dist/admin/components/FormModal/FormModal.js.map +1 -1
- package/dist/admin/components/FormModal/attributes/ConditionForm.js +3 -2
- package/dist/admin/components/FormModal/attributes/ConditionForm.js.map +1 -1
- package/dist/admin/components/FormModal/attributes/types.js +7 -3
- package/dist/admin/components/FormModal/attributes/types.js.map +1 -1
- package/dist/admin/components/FormModal/attributes/validation/common.js +8 -4
- package/dist/admin/components/FormModal/attributes/validation/common.js.map +1 -1
- package/dist/admin/components/FormModal/component/createComponentSchema.js +3 -2
- package/dist/admin/components/FormModal/component/createComponentSchema.js.map +1 -1
- package/dist/admin/components/FormModal/contentType/createContentTypeSchema.js +3 -2
- package/dist/admin/components/FormModal/contentType/createContentTypeSchema.js.map +1 -1
- package/dist/admin/components/FormModal/forms/utils/createCollectionName.js +5 -1
- package/dist/admin/components/FormModal/forms/utils/createCollectionName.js.map +1 -1
- package/dist/admin/components/FormModal/reducer.js +32 -26
- package/dist/admin/components/FormModal/reducer.js.map +1 -1
- package/dist/admin/components/FormModalHeader.js +6 -2
- package/dist/admin/components/FormModalHeader.js.map +1 -1
- package/dist/admin/components/FormModalNavigation/FormModalNavigationContext.js +3 -2
- package/dist/admin/components/FormModalNavigation/FormModalNavigationContext.js.map +1 -1
- package/dist/admin/components/FormModalSubHeader.js +6 -2
- package/dist/admin/components/FormModalSubHeader.js.map +1 -1
- package/dist/admin/components/GenericInputs.js +9 -4
- package/dist/admin/components/GenericInputs.js.map +1 -1
- package/dist/admin/components/IconPicker/constants.js +4 -3
- package/dist/admin/components/IconPicker/constants.js.map +1 -1
- package/dist/admin/components/PluralName.js +5 -1
- package/dist/admin/components/PluralName.js.map +1 -1
- package/dist/admin/components/Relation/RelationNaturePicker/RelationNaturePicker.js +13 -7
- package/dist/admin/components/Relation/RelationNaturePicker/RelationNaturePicker.js.map +1 -1
- package/dist/admin/components/TabForm.js +7 -3
- package/dist/admin/components/TabForm.js.map +1 -1
- package/dist/admin/pages/ListView/ListView.js +5 -1
- package/dist/admin/pages/ListView/ListView.js.map +1 -1
- package/dist/admin/utils/formAPI.js +11 -6
- package/dist/admin/utils/formAPI.js.map +1 -1
- package/dist/admin/utils/getMaxDepth.js.map +1 -1
- package/dist/admin/utils/getMaxDepth.mjs.map +1 -1
- package/dist/admin/utils/nameToSlug.js +5 -1
- package/dist/admin/utils/nameToSlug.js.map +1 -1
- package/dist/admin/utils/toRegressedEnumValue.js +5 -1
- package/dist/admin/utils/toRegressedEnumValue.js.map +1 -1
- package/dist/server/controllers/components.js +6 -2
- package/dist/server/controllers/components.js.map +1 -1
- package/dist/server/controllers/content-types.js +8 -4
- package/dist/server/controllers/content-types.js.map +1 -1
- package/dist/server/controllers/validation/common.js +5 -1
- package/dist/server/controllers/validation/common.js.map +1 -1
- package/dist/server/controllers/validation/component.js +9 -5
- package/dist/server/controllers/validation/component.js.map +1 -1
- package/dist/server/controllers/validation/data-transform.js +6 -2
- package/dist/server/controllers/validation/data-transform.js.map +1 -1
- package/dist/server/controllers/validation/model-schema.js +6 -2
- package/dist/server/controllers/validation/model-schema.js.map +1 -1
- package/dist/server/controllers/validation/types.js +8 -4
- package/dist/server/controllers/validation/types.js.map +1 -1
- package/dist/server/routes/content-api.js +3 -2
- package/dist/server/routes/content-api.js.map +1 -1
- package/dist/server/services/api-handler.js +4 -3
- package/dist/server/services/api-handler.js.map +1 -1
- package/dist/server/services/api-handler.mjs.map +1 -1
- package/dist/server/services/components.js.map +1 -1
- package/dist/server/services/components.mjs.map +1 -1
- package/dist/server/services/content-types.js +8 -4
- package/dist/server/services/content-types.js.map +1 -1
- package/dist/server/services/schema-builder/component-builder.js +11 -5
- package/dist/server/services/schema-builder/component-builder.js.map +1 -1
- package/dist/server/services/schema-builder/content-type-builder.js +13 -8
- package/dist/server/services/schema-builder/content-type-builder.js.map +1 -1
- package/dist/server/services/schema-builder/index.js +5 -1
- package/dist/server/services/schema-builder/index.js.map +1 -1
- package/dist/server/services/schema-builder/schema-handler.js +35 -29
- package/dist/server/services/schema-builder/schema-handler.js.map +1 -1
- package/dist/server/services/schema-builder/schema-handler.mjs.map +1 -1
- package/dist/server/services/schema.js +5 -1
- package/dist/server/services/schema.js.map +1 -1
- package/dist/server/src/services/components.d.ts +3 -26
- package/dist/server/src/services/components.d.ts.map +1 -1
- package/dist/server/src/services/schema-builder/schema-handler.d.ts +1 -0
- package/dist/server/src/services/schema-builder/schema-handler.d.ts.map +1 -1
- package/dist/server/utils/attributes.js +12 -7
- package/dist/server/utils/attributes.js.map +1 -1
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListView.js","sources":["../../../../admin/src/pages/ListView/ListView.tsx"],"sourcesContent":["/* eslint-disable import/no-default-export */\nimport { Layouts, tours } from '@strapi/admin/strapi-admin';\nimport { Box, Button, Flex, Typography } from '@strapi/design-system';\nimport { Information, Pencil, Plus } from '@strapi/icons';\nimport upperFirst from 'lodash/upperFirst';\nimport { useIntl } from 'react-intl';\nimport { Navigate, useParams } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useCTBTracking } from '../../components/CTBSession/ctbSession';\nimport { useDataManager } from '../../components/DataManager/useDataManager';\nimport { useFormModalNavigation } from '../../components/FormModalNavigation/useFormModalNavigation';\nimport { List } from '../../components/List';\nimport { getTrad } from '../../utils/getTrad';\n\nimport { LinkToCMSettingsView } from './LinkToCMSettingsView';\n\nimport type { Internal } from '@strapi/types';\n\nconst LayoutsHeaderCustom = styled(Layouts.Header)`\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nconst ListView = () => {\n const { isInDevelopmentMode, contentTypes, components, isLoading } = useDataManager();\n const { formatMessage } = useIntl();\n const { trackUsage } = useCTBTracking();\n\n const { contentTypeUid, componentUid } = useParams<{\n contentTypeUid: Internal.UID.ContentType;\n componentUid: Internal.UID.Component;\n }>();\n\n const { onOpenModalAddComponentsToDZ, onOpenModalAddField, onOpenModalEditSchema } =\n useFormModalNavigation();\n\n const type = contentTypeUid\n ? contentTypes[contentTypeUid]\n : componentUid\n ? components[componentUid]\n : null;\n\n if (isLoading) {\n return null;\n }\n\n if (!type) {\n const allowedEndpoints = Object.values(contentTypes)\n .filter((ct) => ct.visible === true && !ct.plugin)\n .map((ct) => ct.uid)\n .sort();\n\n if (allowedEndpoints.length > 0) {\n return <Navigate to={`/plugins/content-type-builder/content-types/${allowedEndpoints[0]}`} />;\n }\n\n return <Navigate to=\"/plugins/content-type-builder/content-types/create-content-type\" />;\n }\n\n if (contentTypeUid && type.modelType === 'contentType' && type.visible === false) {\n return (\n <Navigate to=\"/plugins/content-type-builder/content-types/create-content-type\" replace />\n );\n }\n\n const isFromPlugin = 'plugin' in type && type?.plugin !== undefined;\n\n const forTarget = contentTypeUid ? 'contentType' : 'component';\n\n const label = type?.info?.displayName ?? '';\n\n const canEdit = isInDevelopmentMode && !isFromPlugin;\n\n const handleClickAddComponentToDZ = (dynamicZoneTarget?: string) => {\n onOpenModalAddComponentsToDZ({ dynamicZoneTarget, targetUid: type.uid });\n };\n\n const onEdit = () => {\n if ('kind' in type) {\n if (type?.kind === 'collectionType') {\n trackUsage('willEditNameOfContentType');\n }\n\n if (type?.kind === 'singleType') {\n trackUsage('willEditNameOfSingleType');\n }\n\n onOpenModalEditSchema({\n modalType: forTarget,\n forTarget: forTarget,\n targetUid: type.uid,\n kind: type?.kind,\n });\n\n return;\n }\n\n onOpenModalEditSchema({\n modalType: forTarget,\n forTarget: forTarget,\n targetUid: type.uid,\n });\n };\n\n const addNewFieldLabel = formatMessage({\n id: getTrad('table.button.no-fields'),\n defaultMessage: 'Add new field',\n });\n\n const addAnotherFieldLabel = formatMessage({\n id: getTrad('button.attributes.add.another'),\n defaultMessage: 'Add another field',\n });\n\n const isDeleted = type.status === 'REMOVED';\n\n const primaryAction = isInDevelopmentMode && (\n <Flex gap={2}>\n <LinkToCMSettingsView\n key=\"link-to-cm-settings-view\"\n type={type}\n disabled={type.status === 'NEW' || isDeleted}\n />\n <Button\n startIcon={<Pencil />}\n variant=\"tertiary\"\n onClick={onEdit}\n disabled={!canEdit || isDeleted}\n >\n {formatMessage({\n id: 'app.utils.edit',\n defaultMessage: 'Edit',\n })}\n </Button>\n\n <Button\n startIcon={<Plus />}\n variant=\"secondary\"\n minWidth=\"max-content\"\n onClick={() => {\n onOpenModalAddField({ forTarget, targetUid: type.uid });\n }}\n disabled={isDeleted}\n >\n {type.attributes.length === 0 ? addNewFieldLabel : addAnotherFieldLabel}\n </Button>\n </Flex>\n );\n\n return (\n <>\n <tours.contentTypeBuilder.Introduction>\n {/* Invisible Anchor */}\n <Box />\n </tours.contentTypeBuilder.Introduction>\n {isDeleted && (\n <Flex background=\"danger100\" justifyContent={'center'} padding={4}>\n <Flex gap={2}>\n <Information fill=\"danger600\" height=\"2rem\" width=\"2rem\" />\n <Typography>\n {formatMessage(\n {\n id: getTrad('table.warning.deleted'),\n defaultMessage: `This {kind} has been deleted`,\n },\n {\n kind: type.modelType === 'contentType' ? 'Content Type' : 'Component',\n }\n )}\n </Typography>\n </Flex>\n </Flex>\n )}\n <LayoutsHeaderCustom id=\"title\" primaryAction={primaryAction} title={upperFirst(label)} />\n <Layouts.Content>\n <Box\n background=\"neutral0\"\n shadow=\"filterShadow\"\n hasRadius\n overflow=\"auto\"\n borderColor=\"neutral150\"\n >\n <List type={type} addComponentToDZ={handleClickAddComponentToDZ} isMain />\n </Box>\n </Layouts.Content>\n </>\n );\n};\n\nexport default ListView;\n"],"names":["LayoutsHeaderCustom","styled","Layouts","Header","ListView","isInDevelopmentMode","contentTypes","components","isLoading","useDataManager","formatMessage","useIntl","trackUsage","useCTBTracking","contentTypeUid","componentUid","useParams","onOpenModalAddComponentsToDZ","onOpenModalAddField","onOpenModalEditSchema","useFormModalNavigation","type","allowedEndpoints","Object","values","filter","ct","visible","plugin","map","uid","sort","length","_jsx","Navigate","to","modelType","replace","isFromPlugin","undefined","forTarget","label","info","displayName","canEdit","handleClickAddComponentToDZ","dynamicZoneTarget","targetUid","onEdit","kind","modalType","addNewFieldLabel","id","getTrad","defaultMessage","addAnotherFieldLabel","isDeleted","status","primaryAction","_jsxs","Flex","gap","LinkToCMSettingsView","disabled","Button","startIcon","Pencil","variant","onClick","Plus","minWidth","attributes","_Fragment","tours","contentTypeBuilder","Introduction","Box","background","justifyContent","padding","Information","fill","height","width","Typography","title","upperFirst","Content","shadow","hasRadius","overflow","borderColor","List","addComponentToDZ","isMain"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ListView.js","sources":["../../../../admin/src/pages/ListView/ListView.tsx"],"sourcesContent":["/* eslint-disable import/no-default-export */\nimport { Layouts, tours } from '@strapi/admin/strapi-admin';\nimport { Box, Button, Flex, Typography } from '@strapi/design-system';\nimport { Information, Pencil, Plus } from '@strapi/icons';\nimport upperFirst from 'lodash/upperFirst';\nimport { useIntl } from 'react-intl';\nimport { Navigate, useParams } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useCTBTracking } from '../../components/CTBSession/ctbSession';\nimport { useDataManager } from '../../components/DataManager/useDataManager';\nimport { useFormModalNavigation } from '../../components/FormModalNavigation/useFormModalNavigation';\nimport { List } from '../../components/List';\nimport { getTrad } from '../../utils/getTrad';\n\nimport { LinkToCMSettingsView } from './LinkToCMSettingsView';\n\nimport type { Internal } from '@strapi/types';\n\nconst LayoutsHeaderCustom = styled(Layouts.Header)`\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nconst ListView = () => {\n const { isInDevelopmentMode, contentTypes, components, isLoading } = useDataManager();\n const { formatMessage } = useIntl();\n const { trackUsage } = useCTBTracking();\n\n const { contentTypeUid, componentUid } = useParams<{\n contentTypeUid: Internal.UID.ContentType;\n componentUid: Internal.UID.Component;\n }>();\n\n const { onOpenModalAddComponentsToDZ, onOpenModalAddField, onOpenModalEditSchema } =\n useFormModalNavigation();\n\n const type = contentTypeUid\n ? contentTypes[contentTypeUid]\n : componentUid\n ? components[componentUid]\n : null;\n\n if (isLoading) {\n return null;\n }\n\n if (!type) {\n const allowedEndpoints = Object.values(contentTypes)\n .filter((ct) => ct.visible === true && !ct.plugin)\n .map((ct) => ct.uid)\n .sort();\n\n if (allowedEndpoints.length > 0) {\n return <Navigate to={`/plugins/content-type-builder/content-types/${allowedEndpoints[0]}`} />;\n }\n\n return <Navigate to=\"/plugins/content-type-builder/content-types/create-content-type\" />;\n }\n\n if (contentTypeUid && type.modelType === 'contentType' && type.visible === false) {\n return (\n <Navigate to=\"/plugins/content-type-builder/content-types/create-content-type\" replace />\n );\n }\n\n const isFromPlugin = 'plugin' in type && type?.plugin !== undefined;\n\n const forTarget = contentTypeUid ? 'contentType' : 'component';\n\n const label = type?.info?.displayName ?? '';\n\n const canEdit = isInDevelopmentMode && !isFromPlugin;\n\n const handleClickAddComponentToDZ = (dynamicZoneTarget?: string) => {\n onOpenModalAddComponentsToDZ({ dynamicZoneTarget, targetUid: type.uid });\n };\n\n const onEdit = () => {\n if ('kind' in type) {\n if (type?.kind === 'collectionType') {\n trackUsage('willEditNameOfContentType');\n }\n\n if (type?.kind === 'singleType') {\n trackUsage('willEditNameOfSingleType');\n }\n\n onOpenModalEditSchema({\n modalType: forTarget,\n forTarget: forTarget,\n targetUid: type.uid,\n kind: type?.kind,\n });\n\n return;\n }\n\n onOpenModalEditSchema({\n modalType: forTarget,\n forTarget: forTarget,\n targetUid: type.uid,\n });\n };\n\n const addNewFieldLabel = formatMessage({\n id: getTrad('table.button.no-fields'),\n defaultMessage: 'Add new field',\n });\n\n const addAnotherFieldLabel = formatMessage({\n id: getTrad('button.attributes.add.another'),\n defaultMessage: 'Add another field',\n });\n\n const isDeleted = type.status === 'REMOVED';\n\n const primaryAction = isInDevelopmentMode && (\n <Flex gap={2}>\n <LinkToCMSettingsView\n key=\"link-to-cm-settings-view\"\n type={type}\n disabled={type.status === 'NEW' || isDeleted}\n />\n <Button\n startIcon={<Pencil />}\n variant=\"tertiary\"\n onClick={onEdit}\n disabled={!canEdit || isDeleted}\n >\n {formatMessage({\n id: 'app.utils.edit',\n defaultMessage: 'Edit',\n })}\n </Button>\n\n <Button\n startIcon={<Plus />}\n variant=\"secondary\"\n minWidth=\"max-content\"\n onClick={() => {\n onOpenModalAddField({ forTarget, targetUid: type.uid });\n }}\n disabled={isDeleted}\n >\n {type.attributes.length === 0 ? addNewFieldLabel : addAnotherFieldLabel}\n </Button>\n </Flex>\n );\n\n return (\n <>\n <tours.contentTypeBuilder.Introduction>\n {/* Invisible Anchor */}\n <Box />\n </tours.contentTypeBuilder.Introduction>\n {isDeleted && (\n <Flex background=\"danger100\" justifyContent={'center'} padding={4}>\n <Flex gap={2}>\n <Information fill=\"danger600\" height=\"2rem\" width=\"2rem\" />\n <Typography>\n {formatMessage(\n {\n id: getTrad('table.warning.deleted'),\n defaultMessage: `This {kind} has been deleted`,\n },\n {\n kind: type.modelType === 'contentType' ? 'Content Type' : 'Component',\n }\n )}\n </Typography>\n </Flex>\n </Flex>\n )}\n <LayoutsHeaderCustom id=\"title\" primaryAction={primaryAction} title={upperFirst(label)} />\n <Layouts.Content>\n <Box\n background=\"neutral0\"\n shadow=\"filterShadow\"\n hasRadius\n overflow=\"auto\"\n borderColor=\"neutral150\"\n >\n <List type={type} addComponentToDZ={handleClickAddComponentToDZ} isMain />\n </Box>\n </Layouts.Content>\n </>\n );\n};\n\nexport default ListView;\n"],"names":["LayoutsHeaderCustom","styled","Layouts","Header","ListView","isInDevelopmentMode","contentTypes","components","isLoading","useDataManager","formatMessage","useIntl","trackUsage","useCTBTracking","contentTypeUid","componentUid","useParams","onOpenModalAddComponentsToDZ","onOpenModalAddField","onOpenModalEditSchema","useFormModalNavigation","type","allowedEndpoints","Object","values","filter","ct","visible","plugin","map","uid","sort","length","_jsx","Navigate","to","modelType","replace","isFromPlugin","undefined","forTarget","label","info","displayName","canEdit","handleClickAddComponentToDZ","dynamicZoneTarget","targetUid","onEdit","kind","modalType","addNewFieldLabel","id","getTrad","defaultMessage","addAnotherFieldLabel","isDeleted","status","primaryAction","_jsxs","Flex","gap","LinkToCMSettingsView","disabled","Button","startIcon","Pencil","variant","onClick","Plus","minWidth","attributes","_Fragment","tours","contentTypeBuilder","Introduction","Box","background","justifyContent","padding","Information","fill","height","width","Typography","title","upperFirst","Content","shadow","hasRadius","overflow","borderColor","List","addComponentToDZ","isMain"],"mappings":"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"}
|
|
@@ -4,7 +4,10 @@ var cloneDeep = require('lodash/cloneDeep');
|
|
|
4
4
|
var get = require('lodash/get');
|
|
5
5
|
var yup = require('yup');
|
|
6
6
|
|
|
7
|
-
function
|
|
7
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
|
+
|
|
9
|
+
function _interopNamespace(e) {
|
|
10
|
+
if (e && e.__esModule) return e;
|
|
8
11
|
var n = Object.create(null);
|
|
9
12
|
if (e) {
|
|
10
13
|
Object.keys(e).forEach(function (k) {
|
|
@@ -21,7 +24,9 @@ function _interopNamespaceDefault(e) {
|
|
|
21
24
|
return Object.freeze(n);
|
|
22
25
|
}
|
|
23
26
|
|
|
24
|
-
var
|
|
27
|
+
var cloneDeep__default = /*#__PURE__*/_interopDefault(cloneDeep);
|
|
28
|
+
var get__default = /*#__PURE__*/_interopDefault(get);
|
|
29
|
+
var yup__namespace = /*#__PURE__*/_interopNamespace(yup);
|
|
25
30
|
|
|
26
31
|
const formsAPI = {
|
|
27
32
|
components: {
|
|
@@ -82,7 +87,7 @@ const formsAPI = {
|
|
|
82
87
|
});
|
|
83
88
|
},
|
|
84
89
|
getAdvancedForm (target, props = null) {
|
|
85
|
-
const sectionsToAdd =
|
|
90
|
+
const sectionsToAdd = get__default.default(this.types, [
|
|
86
91
|
...target,
|
|
87
92
|
'form',
|
|
88
93
|
'advanced'
|
|
@@ -104,7 +109,7 @@ const formsAPI = {
|
|
|
104
109
|
});
|
|
105
110
|
},
|
|
106
111
|
makeValidator (target, initShape, ...args) {
|
|
107
|
-
const validators =
|
|
112
|
+
const validators = get__default.default(this.types, [
|
|
108
113
|
...target,
|
|
109
114
|
'validators'
|
|
110
115
|
], []);
|
|
@@ -120,8 +125,8 @@ const formsAPI = {
|
|
|
120
125
|
});
|
|
121
126
|
},
|
|
122
127
|
mutateContentTypeSchema (data, initialData) {
|
|
123
|
-
let enhancedData =
|
|
124
|
-
const refData =
|
|
128
|
+
let enhancedData = cloneDeep__default.default(data);
|
|
129
|
+
const refData = cloneDeep__default.default(initialData);
|
|
125
130
|
this.contentTypeSchemaMutations.forEach((cb)=>{
|
|
126
131
|
enhancedData = cb(enhancedData, refData);
|
|
127
132
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formAPI.js","sources":["../../../admin/src/utils/formAPI.ts"],"sourcesContent":["import cloneDeep from 'lodash/cloneDeep';\nimport get from 'lodash/get';\nimport * as yup from 'yup';\n\nexport interface FormAPI {\n components: {\n inputs: Record<string, any>;\n add: ({ id, component }: { id: string; component: any }) => void;\n };\n types: {\n attribute: {\n [key: string]: {\n validators: any[];\n form: {\n advanced: any[];\n base: any[];\n };\n };\n };\n contentType: {\n validators: any[];\n form: {\n advanced: any[];\n base: any[];\n };\n };\n component: {\n validators: any[];\n form: {\n advanced: any[];\n base: any[];\n };\n };\n };\n contentTypeSchemaMutations: any[];\n addContentTypeSchemaMutation: (cb: any) => void;\n extendContentType: (data: any) => void;\n extendFields: (fields: any[], data: any) => void;\n getAdvancedForm: (target: any, props?: any) => any[];\n makeCustomFieldValidator: (attributeShape: any, validator: any, ...validatorArgs: any) => any;\n makeValidator: (target: any, initShape: any, ...args: any) => any;\n mutateContentTypeSchema: (\n data: Record<string, unknown>,\n initialData: Record<string, unknown>\n ) => any;\n}\n\nexport const formsAPI: FormAPI = {\n components: {\n inputs: {},\n add({ id, component }) {\n if (!this.inputs[id]) {\n this.inputs[id] = component;\n }\n },\n },\n types: {\n attribute: {\n // test: {\n // validators: [],\n // form: {\n // advanced: [\n // /* cb */\n // ],\n // base: [\n // /* cb */\n // ],\n // },\n // },\n },\n contentType: {\n validators: [],\n form: {\n advanced: [],\n base: [],\n },\n },\n component: {\n validators: [],\n form: {\n advanced: [],\n base: [],\n },\n },\n },\n contentTypeSchemaMutations: [],\n addContentTypeSchemaMutation(cb) {\n this.contentTypeSchemaMutations.push(cb);\n },\n extendContentType({ validator, form: { advanced, base } }) {\n const { contentType } = this.types;\n\n if (validator) {\n contentType.validators.push(validator);\n }\n contentType.form.advanced.push(advanced);\n contentType.form.base.push(base);\n },\n extendFields(fields, { validator, form: { advanced, base } }) {\n const formType = this.types.attribute;\n\n fields.forEach((field) => {\n if (!formType[field]) {\n formType[field] = {\n validators: [],\n form: {\n advanced: [\n /* cb */\n ],\n base: [\n /* cb */\n ],\n },\n };\n }\n\n if (validator) {\n formType[field].validators.push(validator);\n }\n formType[field].form.advanced.push(advanced);\n formType[field].form.base.push(base);\n });\n },\n\n getAdvancedForm(target, props = null) {\n const sectionsToAdd = get(this.types, [...target, 'form', 'advanced'], []).reduce(\n (acc: any, current: any) => {\n const sections = current(props);\n\n return [...acc, ...sections];\n },\n []\n );\n\n return sectionsToAdd;\n },\n\n makeCustomFieldValidator(attributeShape, validator, ...validatorArgs) {\n // When no validator, return the attribute shape\n if (!validator) return attributeShape;\n\n // Otherwise extend the shape with the provided validator\n return attributeShape.shape({ options: yup.object().shape(validator(validatorArgs)) });\n },\n\n makeValidator(target, initShape, ...args) {\n const validators = get(this.types, [...target, 'validators'], []);\n\n const pluginOptionsShape = validators.reduce((acc: any, current: any) => {\n const pluginOptionShape = current(args);\n\n return { ...acc, ...pluginOptionShape };\n }, {});\n\n return initShape.shape({ pluginOptions: yup.object().shape(pluginOptionsShape) });\n },\n mutateContentTypeSchema(data: Record<string, unknown>, initialData: Record<string, unknown>) {\n let enhancedData = cloneDeep(data);\n\n const refData = cloneDeep(initialData);\n\n this.contentTypeSchemaMutations.forEach((cb: any) => {\n enhancedData = cb(enhancedData, refData);\n });\n\n return enhancedData;\n },\n};\n"],"names":["formsAPI","components","inputs","add","id","component","types","attribute","contentType","validators","form","advanced","base","contentTypeSchemaMutations","addContentTypeSchemaMutation","cb","push","extendContentType","validator","extendFields","fields","formType","forEach","field","getAdvancedForm","target","props","sectionsToAdd","get","reduce","acc","current","sections","makeCustomFieldValidator","attributeShape","validatorArgs","shape","options","yup","object","makeValidator","initShape","args","pluginOptionsShape","pluginOptionShape","pluginOptions","mutateContentTypeSchema","data","initialData","enhancedData","cloneDeep","refData"],"mappings":"
|
|
1
|
+
{"version":3,"file":"formAPI.js","sources":["../../../admin/src/utils/formAPI.ts"],"sourcesContent":["import cloneDeep from 'lodash/cloneDeep';\nimport get from 'lodash/get';\nimport * as yup from 'yup';\n\nexport interface FormAPI {\n components: {\n inputs: Record<string, any>;\n add: ({ id, component }: { id: string; component: any }) => void;\n };\n types: {\n attribute: {\n [key: string]: {\n validators: any[];\n form: {\n advanced: any[];\n base: any[];\n };\n };\n };\n contentType: {\n validators: any[];\n form: {\n advanced: any[];\n base: any[];\n };\n };\n component: {\n validators: any[];\n form: {\n advanced: any[];\n base: any[];\n };\n };\n };\n contentTypeSchemaMutations: any[];\n addContentTypeSchemaMutation: (cb: any) => void;\n extendContentType: (data: any) => void;\n extendFields: (fields: any[], data: any) => void;\n getAdvancedForm: (target: any, props?: any) => any[];\n makeCustomFieldValidator: (attributeShape: any, validator: any, ...validatorArgs: any) => any;\n makeValidator: (target: any, initShape: any, ...args: any) => any;\n mutateContentTypeSchema: (\n data: Record<string, unknown>,\n initialData: Record<string, unknown>\n ) => any;\n}\n\nexport const formsAPI: FormAPI = {\n components: {\n inputs: {},\n add({ id, component }) {\n if (!this.inputs[id]) {\n this.inputs[id] = component;\n }\n },\n },\n types: {\n attribute: {\n // test: {\n // validators: [],\n // form: {\n // advanced: [\n // /* cb */\n // ],\n // base: [\n // /* cb */\n // ],\n // },\n // },\n },\n contentType: {\n validators: [],\n form: {\n advanced: [],\n base: [],\n },\n },\n component: {\n validators: [],\n form: {\n advanced: [],\n base: [],\n },\n },\n },\n contentTypeSchemaMutations: [],\n addContentTypeSchemaMutation(cb) {\n this.contentTypeSchemaMutations.push(cb);\n },\n extendContentType({ validator, form: { advanced, base } }) {\n const { contentType } = this.types;\n\n if (validator) {\n contentType.validators.push(validator);\n }\n contentType.form.advanced.push(advanced);\n contentType.form.base.push(base);\n },\n extendFields(fields, { validator, form: { advanced, base } }) {\n const formType = this.types.attribute;\n\n fields.forEach((field) => {\n if (!formType[field]) {\n formType[field] = {\n validators: [],\n form: {\n advanced: [\n /* cb */\n ],\n base: [\n /* cb */\n ],\n },\n };\n }\n\n if (validator) {\n formType[field].validators.push(validator);\n }\n formType[field].form.advanced.push(advanced);\n formType[field].form.base.push(base);\n });\n },\n\n getAdvancedForm(target, props = null) {\n const sectionsToAdd = get(this.types, [...target, 'form', 'advanced'], []).reduce(\n (acc: any, current: any) => {\n const sections = current(props);\n\n return [...acc, ...sections];\n },\n []\n );\n\n return sectionsToAdd;\n },\n\n makeCustomFieldValidator(attributeShape, validator, ...validatorArgs) {\n // When no validator, return the attribute shape\n if (!validator) return attributeShape;\n\n // Otherwise extend the shape with the provided validator\n return attributeShape.shape({ options: yup.object().shape(validator(validatorArgs)) });\n },\n\n makeValidator(target, initShape, ...args) {\n const validators = get(this.types, [...target, 'validators'], []);\n\n const pluginOptionsShape = validators.reduce((acc: any, current: any) => {\n const pluginOptionShape = current(args);\n\n return { ...acc, ...pluginOptionShape };\n }, {});\n\n return initShape.shape({ pluginOptions: yup.object().shape(pluginOptionsShape) });\n },\n mutateContentTypeSchema(data: Record<string, unknown>, initialData: Record<string, unknown>) {\n let enhancedData = cloneDeep(data);\n\n const refData = cloneDeep(initialData);\n\n this.contentTypeSchemaMutations.forEach((cb: any) => {\n enhancedData = cb(enhancedData, refData);\n });\n\n return enhancedData;\n },\n};\n"],"names":["formsAPI","components","inputs","add","id","component","types","attribute","contentType","validators","form","advanced","base","contentTypeSchemaMutations","addContentTypeSchemaMutation","cb","push","extendContentType","validator","extendFields","fields","formType","forEach","field","getAdvancedForm","target","props","sectionsToAdd","get","reduce","acc","current","sections","makeCustomFieldValidator","attributeShape","validatorArgs","shape","options","yup","object","makeValidator","initShape","args","pluginOptionsShape","pluginOptionShape","pluginOptions","mutateContentTypeSchema","data","initialData","enhancedData","cloneDeep","refData"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getMaxDepth.js","sources":["../../../admin/src/utils/getMaxDepth.ts"],"sourcesContent":["import type { ComponentWithChildren } from '../components/DataManager/utils/retrieveComponentsThatHaveComponents';\nimport type { NestedComponent } from '../components/DataManager/utils/retrieveNestedComponents';\nimport type { Internal } from '@strapi/types';\n\nconst findComponent = <T extends { component: Internal.UID.Component }>(\n componentUid: Internal.UID.Schema,\n components: Array<T>\n) => {\n return components.find((c) => c.component === componentUid);\n};\n\n/**\n * Recursively calculates the maximum depth of nested child components\n * for a given component UID.\n *\n * @param componentUid - The UID of the component to start from.\n * @param components - The array of all components with their child components.\n * @param currentDepth - The current depth of the recursion. Defaults to 0.\n * @returns The maximum depth of the nested child components.\n */\nexport const getChildrenMaxDepth = (\n componentUid: Internal.UID.Component,\n components: Array<ComponentWithChildren>,\n currentDepth = 0\n) => {\n const component = findComponent(componentUid, components);\n\n // If the component doesn't exist or has no child components, return the current depth.\n if (!component || !component.childComponents || component.childComponents.length === 0) {\n return currentDepth;\n }\n\n let maxDepth = currentDepth;\n\n // Iterate through each child component to calculate their respective depths.\n component.childComponents.forEach((child) => {\n // Recursively calculate the depth of the child component.\n const depth = getChildrenMaxDepth(child.component, components, currentDepth + 1);\n // Update the maximum depth if the child's depth is greater.\n if (depth > maxDepth) {\n maxDepth = depth;\n }\n });\n\n return maxDepth;\n};\n\n/**\n * Calculates the depth of a component within a nested component tree.\n * Depth is defined as the level at which the component is nested.\n * For example, a component at Depth 3 is the third nested component.\n *\n * @param component - The UID of the component to find the depth for.\n * @param components - The array of all nested components.\n * @returns The depth level of the component within the nested tree.\n */\nexport const getComponentDepth = (\n component: Internal.UID.Schema,\n components: Array<NestedComponent>\n) => {\n /**\n * Helper function to recursively calculate the depth of a component.\n *\n * @param currentComponent - The current component being inspected.\n * @param currentLevel - The current level of depth in the tree.\n * @returns An array of depth levels found for the component.\n */\n const getDepth = (currentComponent: NestedComponent, currentLevel: number): Array<number> => {\n const levels = [];\n levels.push(currentLevel);\n\n // If the component has no parent UIDs, return the current levels\n if (!currentComponent.uidsOfAllParents) {\n return levels;\n }\n\n // Iterate over each parent UID to calculate their respective depths\n for (const parentUid of currentComponent.uidsOfAllParents) {\n const parentComponent = findComponent(parentUid, components);\n if (parentComponent) {\n levels.push(...getDepth(parentComponent, currentLevel + 1));\n }\n }\n\n return levels;\n };\n\n const nestedCompo = findComponent(component, components);\n // return depth 0 if component is not nested\n if (!nestedCompo) {\n return 0;\n }\n const compoDepth = Math.max(...getDepth(nestedCompo, 1));\n return compoDepth;\n};\n"],"names":["findComponent","componentUid","components","find","c","component","getChildrenMaxDepth","currentDepth","childComponents","length","maxDepth","forEach","child","depth","getComponentDepth","getDepth","currentComponent","currentLevel","levels","push","uidsOfAllParents","parentUid","parentComponent","nestedCompo","compoDepth","Math","max"],"mappings":";;AAIA,MAAMA,aAAAA,GAAgB,CACpBC,YAAAA,EACAC,UAAAA,GAAAA;AAEA,IAAA,OAAOA,WAAWC,IAAI,CAAC,CAACC,CAAAA,GAAMA,CAAAA,CAAEC,SAAS,KAAKJ,YAAAA,CAAAA;AAChD,CAAA;AAEA;;;;;;;;AAQC,IACM,MAAMK,mBAAAA,GAAsB,CACjCL,YAAAA,EACAC,UAAAA,EACAK,eAAe,CAAC,GAAA;IAEhB,MAAMF,SAAAA,GAAYL,cAAcC,YAAAA,EAAcC,UAAAA,CAAAA;;IAG9C,IAAI,CAACG,SAAAA,IAAa,CAACA,SAAAA,CAAUG,eAAe,IAAIH,SAAAA,CAAUG,eAAe,CAACC,MAAM,KAAK,CAAA,EAAG;QACtF,OAAOF,YAAAA;AACT,IAAA;AAEA,IAAA,IAAIG,QAAAA,GAAWH,YAAAA;;AAGfF,IAAAA,SAAAA,CAAUG,eAAe,CAACG,OAAO,CAAC,CAACC,KAAAA,GAAAA;;AAEjC,QAAA,MAAMC,QAAQP,mBAAAA,CAAoBM,KAAAA,CAAMP,SAAS,EAAEH,YAAYK,YAAAA,GAAe,CAAA,CAAA;;AAE9E,QAAA,IAAIM,QAAQH,QAAAA,EAAU;YACpBA,QAAAA,GAAWG,KAAAA;AACb,QAAA;AACF,IAAA,CAAA,CAAA;IAEA,OAAOH,QAAAA;AACT;AAEA;;;;;;;;AAQC,IACM,MAAMI,iBAAAA,GAAoB,CAC/BT,SAAAA,EACAH,UAAAA,GAAAA;AAEA;;;;;;MAOA,MAAMa,QAAAA,GAAW,CAACC,gBAAAA,EAAmCC,YAAAA,GAAAA;AACnD,QAAA,MAAMC,SAAS,EAAE;AACjBA,QAAAA,MAAAA,CAAOC,IAAI,CAACF,YAAAA,CAAAA;;QAGZ,IAAI,CAACD,gBAAAA,CAAiBI,gBAAgB,EAAE;YACtC,OAAOF,MAAAA;AACT,QAAA;;AAGA,QAAA,KAAK,MAAMG,SAAAA,IAAaL,gBAAAA,CAAiBI,gBAAgB,CAAE;YACzD,MAAME,eAAAA,GAAkBtB,cAAcqB,SAAAA,EAAWnB,UAAAA,CAAAA;AACjD,YAAA,IAAIoB,eAAAA,EAAiB;AACnBJ,gBAAAA,MAAAA,CAAOC,IAAI,CAAA,GAAIJ,QAAAA,CAASO,eAAAA,EAAiBL,YAAAA,GAAe,CAAA,CAAA,CAAA;AAC1D,YAAA;AACF,QAAA;QAEA,OAAOC,MAAAA;AACT,IAAA,CAAA;IAEA,MAAMK,WAAAA,GAAcvB,cAAcK,SAAAA,EAAWH,UAAAA,CAAAA;;AAE7C,IAAA,IAAI,CAACqB,WAAAA,EAAa;QAChB,OAAO,CAAA;AACT,IAAA;AACA,IAAA,MAAMC,UAAAA,GAAaC,IAAAA,CAAKC,GAAG,CAAA,GAAIX,SAASQ,WAAAA,EAAa,CAAA,CAAA,CAAA;IACrD,OAAOC,UAAAA;AACT;;;;;"}
|
|
1
|
+
{"version":3,"file":"getMaxDepth.js","sources":["../../../admin/src/utils/getMaxDepth.ts"],"sourcesContent":["import type { ComponentWithChildren } from '../components/DataManager/utils/retrieveComponentsThatHaveComponents';\nimport type { NestedComponent } from '../components/DataManager/utils/retrieveNestedComponents';\nimport type { Internal } from '@strapi/types';\n\nconst findComponent = <T extends { component: Internal.UID.Component }>(\n componentUid: Internal.UID.Schema,\n components: Array<T>\n) => {\n return components.find((c) => c.component === componentUid);\n};\n\n/**\n * Recursively calculates the maximum depth of nested child components\n * for a given component UID.\n *\n * @param componentUid - The UID of the component to start from.\n * @param components - The array of all components with their child components.\n * @param currentDepth - The current depth of the recursion. Defaults to 0.\n * @returns The maximum depth of the nested child components.\n */\nexport const getChildrenMaxDepth = (\n componentUid: Internal.UID.Component,\n components: Array<ComponentWithChildren>,\n currentDepth = 0\n): number => {\n const component = findComponent(componentUid, components);\n\n // If the component doesn't exist or has no child components, return the current depth.\n if (!component || !component.childComponents || component.childComponents.length === 0) {\n return currentDepth;\n }\n\n let maxDepth = currentDepth;\n\n // Iterate through each child component to calculate their respective depths.\n component.childComponents.forEach((child) => {\n // Recursively calculate the depth of the child component.\n const depth = getChildrenMaxDepth(child.component, components, currentDepth + 1);\n // Update the maximum depth if the child's depth is greater.\n if (depth > maxDepth) {\n maxDepth = depth;\n }\n });\n\n return maxDepth;\n};\n\n/**\n * Calculates the depth of a component within a nested component tree.\n * Depth is defined as the level at which the component is nested.\n * For example, a component at Depth 3 is the third nested component.\n *\n * @param component - The UID of the component to find the depth for.\n * @param components - The array of all nested components.\n * @returns The depth level of the component within the nested tree.\n */\nexport const getComponentDepth = (\n component: Internal.UID.Schema,\n components: Array<NestedComponent>\n) => {\n /**\n * Helper function to recursively calculate the depth of a component.\n *\n * @param currentComponent - The current component being inspected.\n * @param currentLevel - The current level of depth in the tree.\n * @returns An array of depth levels found for the component.\n */\n const getDepth = (currentComponent: NestedComponent, currentLevel: number): Array<number> => {\n const levels = [];\n levels.push(currentLevel);\n\n // If the component has no parent UIDs, return the current levels\n if (!currentComponent.uidsOfAllParents) {\n return levels;\n }\n\n // Iterate over each parent UID to calculate their respective depths\n for (const parentUid of currentComponent.uidsOfAllParents) {\n const parentComponent = findComponent(parentUid, components);\n if (parentComponent) {\n levels.push(...getDepth(parentComponent, currentLevel + 1));\n }\n }\n\n return levels;\n };\n\n const nestedCompo = findComponent(component, components);\n // return depth 0 if component is not nested\n if (!nestedCompo) {\n return 0;\n }\n const compoDepth = Math.max(...getDepth(nestedCompo, 1));\n return compoDepth;\n};\n"],"names":["findComponent","componentUid","components","find","c","component","getChildrenMaxDepth","currentDepth","childComponents","length","maxDepth","forEach","child","depth","getComponentDepth","getDepth","currentComponent","currentLevel","levels","push","uidsOfAllParents","parentUid","parentComponent","nestedCompo","compoDepth","Math","max"],"mappings":";;AAIA,MAAMA,aAAAA,GAAgB,CACpBC,YAAAA,EACAC,UAAAA,GAAAA;AAEA,IAAA,OAAOA,WAAWC,IAAI,CAAC,CAACC,CAAAA,GAAMA,CAAAA,CAAEC,SAAS,KAAKJ,YAAAA,CAAAA;AAChD,CAAA;AAEA;;;;;;;;AAQC,IACM,MAAMK,mBAAAA,GAAsB,CACjCL,YAAAA,EACAC,UAAAA,EACAK,eAAe,CAAC,GAAA;IAEhB,MAAMF,SAAAA,GAAYL,cAAcC,YAAAA,EAAcC,UAAAA,CAAAA;;IAG9C,IAAI,CAACG,SAAAA,IAAa,CAACA,SAAAA,CAAUG,eAAe,IAAIH,SAAAA,CAAUG,eAAe,CAACC,MAAM,KAAK,CAAA,EAAG;QACtF,OAAOF,YAAAA;AACT,IAAA;AAEA,IAAA,IAAIG,QAAAA,GAAWH,YAAAA;;AAGfF,IAAAA,SAAAA,CAAUG,eAAe,CAACG,OAAO,CAAC,CAACC,KAAAA,GAAAA;;AAEjC,QAAA,MAAMC,QAAQP,mBAAAA,CAAoBM,KAAAA,CAAMP,SAAS,EAAEH,YAAYK,YAAAA,GAAe,CAAA,CAAA;;AAE9E,QAAA,IAAIM,QAAQH,QAAAA,EAAU;YACpBA,QAAAA,GAAWG,KAAAA;AACb,QAAA;AACF,IAAA,CAAA,CAAA;IAEA,OAAOH,QAAAA;AACT;AAEA;;;;;;;;AAQC,IACM,MAAMI,iBAAAA,GAAoB,CAC/BT,SAAAA,EACAH,UAAAA,GAAAA;AAEA;;;;;;MAOA,MAAMa,QAAAA,GAAW,CAACC,gBAAAA,EAAmCC,YAAAA,GAAAA;AACnD,QAAA,MAAMC,SAAS,EAAE;AACjBA,QAAAA,MAAAA,CAAOC,IAAI,CAACF,YAAAA,CAAAA;;QAGZ,IAAI,CAACD,gBAAAA,CAAiBI,gBAAgB,EAAE;YACtC,OAAOF,MAAAA;AACT,QAAA;;AAGA,QAAA,KAAK,MAAMG,SAAAA,IAAaL,gBAAAA,CAAiBI,gBAAgB,CAAE;YACzD,MAAME,eAAAA,GAAkBtB,cAAcqB,SAAAA,EAAWnB,UAAAA,CAAAA;AACjD,YAAA,IAAIoB,eAAAA,EAAiB;AACnBJ,gBAAAA,MAAAA,CAAOC,IAAI,CAAA,GAAIJ,QAAAA,CAASO,eAAAA,EAAiBL,YAAAA,GAAe,CAAA,CAAA,CAAA;AAC1D,YAAA;AACF,QAAA;QAEA,OAAOC,MAAAA;AACT,IAAA,CAAA;IAEA,MAAMK,WAAAA,GAAcvB,cAAcK,SAAAA,EAAWH,UAAAA,CAAAA;;AAE7C,IAAA,IAAI,CAACqB,WAAAA,EAAa;QAChB,OAAO,CAAA;AACT,IAAA;AACA,IAAA,MAAMC,UAAAA,GAAaC,IAAAA,CAAKC,GAAG,CAAA,GAAIX,SAASQ,WAAAA,EAAa,CAAA,CAAA,CAAA;IACrD,OAAOC,UAAAA;AACT;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getMaxDepth.mjs","sources":["../../../admin/src/utils/getMaxDepth.ts"],"sourcesContent":["import type { ComponentWithChildren } from '../components/DataManager/utils/retrieveComponentsThatHaveComponents';\nimport type { NestedComponent } from '../components/DataManager/utils/retrieveNestedComponents';\nimport type { Internal } from '@strapi/types';\n\nconst findComponent = <T extends { component: Internal.UID.Component }>(\n componentUid: Internal.UID.Schema,\n components: Array<T>\n) => {\n return components.find((c) => c.component === componentUid);\n};\n\n/**\n * Recursively calculates the maximum depth of nested child components\n * for a given component UID.\n *\n * @param componentUid - The UID of the component to start from.\n * @param components - The array of all components with their child components.\n * @param currentDepth - The current depth of the recursion. Defaults to 0.\n * @returns The maximum depth of the nested child components.\n */\nexport const getChildrenMaxDepth = (\n componentUid: Internal.UID.Component,\n components: Array<ComponentWithChildren>,\n currentDepth = 0\n) => {\n const component = findComponent(componentUid, components);\n\n // If the component doesn't exist or has no child components, return the current depth.\n if (!component || !component.childComponents || component.childComponents.length === 0) {\n return currentDepth;\n }\n\n let maxDepth = currentDepth;\n\n // Iterate through each child component to calculate their respective depths.\n component.childComponents.forEach((child) => {\n // Recursively calculate the depth of the child component.\n const depth = getChildrenMaxDepth(child.component, components, currentDepth + 1);\n // Update the maximum depth if the child's depth is greater.\n if (depth > maxDepth) {\n maxDepth = depth;\n }\n });\n\n return maxDepth;\n};\n\n/**\n * Calculates the depth of a component within a nested component tree.\n * Depth is defined as the level at which the component is nested.\n * For example, a component at Depth 3 is the third nested component.\n *\n * @param component - The UID of the component to find the depth for.\n * @param components - The array of all nested components.\n * @returns The depth level of the component within the nested tree.\n */\nexport const getComponentDepth = (\n component: Internal.UID.Schema,\n components: Array<NestedComponent>\n) => {\n /**\n * Helper function to recursively calculate the depth of a component.\n *\n * @param currentComponent - The current component being inspected.\n * @param currentLevel - The current level of depth in the tree.\n * @returns An array of depth levels found for the component.\n */\n const getDepth = (currentComponent: NestedComponent, currentLevel: number): Array<number> => {\n const levels = [];\n levels.push(currentLevel);\n\n // If the component has no parent UIDs, return the current levels\n if (!currentComponent.uidsOfAllParents) {\n return levels;\n }\n\n // Iterate over each parent UID to calculate their respective depths\n for (const parentUid of currentComponent.uidsOfAllParents) {\n const parentComponent = findComponent(parentUid, components);\n if (parentComponent) {\n levels.push(...getDepth(parentComponent, currentLevel + 1));\n }\n }\n\n return levels;\n };\n\n const nestedCompo = findComponent(component, components);\n // return depth 0 if component is not nested\n if (!nestedCompo) {\n return 0;\n }\n const compoDepth = Math.max(...getDepth(nestedCompo, 1));\n return compoDepth;\n};\n"],"names":["findComponent","componentUid","components","find","c","component","getChildrenMaxDepth","currentDepth","childComponents","length","maxDepth","forEach","child","depth","getComponentDepth","getDepth","currentComponent","currentLevel","levels","push","uidsOfAllParents","parentUid","parentComponent","nestedCompo","compoDepth","Math","max"],"mappings":"AAIA,MAAMA,aAAAA,GAAgB,CACpBC,YAAAA,EACAC,UAAAA,GAAAA;AAEA,IAAA,OAAOA,WAAWC,IAAI,CAAC,CAACC,CAAAA,GAAMA,CAAAA,CAAEC,SAAS,KAAKJ,YAAAA,CAAAA;AAChD,CAAA;AAEA;;;;;;;;AAQC,IACM,MAAMK,mBAAAA,GAAsB,CACjCL,YAAAA,EACAC,UAAAA,EACAK,eAAe,CAAC,GAAA;IAEhB,MAAMF,SAAAA,GAAYL,cAAcC,YAAAA,EAAcC,UAAAA,CAAAA;;IAG9C,IAAI,CAACG,SAAAA,IAAa,CAACA,SAAAA,CAAUG,eAAe,IAAIH,SAAAA,CAAUG,eAAe,CAACC,MAAM,KAAK,CAAA,EAAG;QACtF,OAAOF,YAAAA;AACT,IAAA;AAEA,IAAA,IAAIG,QAAAA,GAAWH,YAAAA;;AAGfF,IAAAA,SAAAA,CAAUG,eAAe,CAACG,OAAO,CAAC,CAACC,KAAAA,GAAAA;;AAEjC,QAAA,MAAMC,QAAQP,mBAAAA,CAAoBM,KAAAA,CAAMP,SAAS,EAAEH,YAAYK,YAAAA,GAAe,CAAA,CAAA;;AAE9E,QAAA,IAAIM,QAAQH,QAAAA,EAAU;YACpBA,QAAAA,GAAWG,KAAAA;AACb,QAAA;AACF,IAAA,CAAA,CAAA;IAEA,OAAOH,QAAAA;AACT;AAEA;;;;;;;;AAQC,IACM,MAAMI,iBAAAA,GAAoB,CAC/BT,SAAAA,EACAH,UAAAA,GAAAA;AAEA;;;;;;MAOA,MAAMa,QAAAA,GAAW,CAACC,gBAAAA,EAAmCC,YAAAA,GAAAA;AACnD,QAAA,MAAMC,SAAS,EAAE;AACjBA,QAAAA,MAAAA,CAAOC,IAAI,CAACF,YAAAA,CAAAA;;QAGZ,IAAI,CAACD,gBAAAA,CAAiBI,gBAAgB,EAAE;YACtC,OAAOF,MAAAA;AACT,QAAA;;AAGA,QAAA,KAAK,MAAMG,SAAAA,IAAaL,gBAAAA,CAAiBI,gBAAgB,CAAE;YACzD,MAAME,eAAAA,GAAkBtB,cAAcqB,SAAAA,EAAWnB,UAAAA,CAAAA;AACjD,YAAA,IAAIoB,eAAAA,EAAiB;AACnBJ,gBAAAA,MAAAA,CAAOC,IAAI,CAAA,GAAIJ,QAAAA,CAASO,eAAAA,EAAiBL,YAAAA,GAAe,CAAA,CAAA,CAAA;AAC1D,YAAA;AACF,QAAA;QAEA,OAAOC,MAAAA;AACT,IAAA,CAAA;IAEA,MAAMK,WAAAA,GAAcvB,cAAcK,SAAAA,EAAWH,UAAAA,CAAAA;;AAE7C,IAAA,IAAI,CAACqB,WAAAA,EAAa;QAChB,OAAO,CAAA;AACT,IAAA;AACA,IAAA,MAAMC,UAAAA,GAAaC,IAAAA,CAAKC,GAAG,CAAA,GAAIX,SAASQ,WAAAA,EAAa,CAAA,CAAA,CAAA;IACrD,OAAOC,UAAAA;AACT;;;;"}
|
|
1
|
+
{"version":3,"file":"getMaxDepth.mjs","sources":["../../../admin/src/utils/getMaxDepth.ts"],"sourcesContent":["import type { ComponentWithChildren } from '../components/DataManager/utils/retrieveComponentsThatHaveComponents';\nimport type { NestedComponent } from '../components/DataManager/utils/retrieveNestedComponents';\nimport type { Internal } from '@strapi/types';\n\nconst findComponent = <T extends { component: Internal.UID.Component }>(\n componentUid: Internal.UID.Schema,\n components: Array<T>\n) => {\n return components.find((c) => c.component === componentUid);\n};\n\n/**\n * Recursively calculates the maximum depth of nested child components\n * for a given component UID.\n *\n * @param componentUid - The UID of the component to start from.\n * @param components - The array of all components with their child components.\n * @param currentDepth - The current depth of the recursion. Defaults to 0.\n * @returns The maximum depth of the nested child components.\n */\nexport const getChildrenMaxDepth = (\n componentUid: Internal.UID.Component,\n components: Array<ComponentWithChildren>,\n currentDepth = 0\n): number => {\n const component = findComponent(componentUid, components);\n\n // If the component doesn't exist or has no child components, return the current depth.\n if (!component || !component.childComponents || component.childComponents.length === 0) {\n return currentDepth;\n }\n\n let maxDepth = currentDepth;\n\n // Iterate through each child component to calculate their respective depths.\n component.childComponents.forEach((child) => {\n // Recursively calculate the depth of the child component.\n const depth = getChildrenMaxDepth(child.component, components, currentDepth + 1);\n // Update the maximum depth if the child's depth is greater.\n if (depth > maxDepth) {\n maxDepth = depth;\n }\n });\n\n return maxDepth;\n};\n\n/**\n * Calculates the depth of a component within a nested component tree.\n * Depth is defined as the level at which the component is nested.\n * For example, a component at Depth 3 is the third nested component.\n *\n * @param component - The UID of the component to find the depth for.\n * @param components - The array of all nested components.\n * @returns The depth level of the component within the nested tree.\n */\nexport const getComponentDepth = (\n component: Internal.UID.Schema,\n components: Array<NestedComponent>\n) => {\n /**\n * Helper function to recursively calculate the depth of a component.\n *\n * @param currentComponent - The current component being inspected.\n * @param currentLevel - The current level of depth in the tree.\n * @returns An array of depth levels found for the component.\n */\n const getDepth = (currentComponent: NestedComponent, currentLevel: number): Array<number> => {\n const levels = [];\n levels.push(currentLevel);\n\n // If the component has no parent UIDs, return the current levels\n if (!currentComponent.uidsOfAllParents) {\n return levels;\n }\n\n // Iterate over each parent UID to calculate their respective depths\n for (const parentUid of currentComponent.uidsOfAllParents) {\n const parentComponent = findComponent(parentUid, components);\n if (parentComponent) {\n levels.push(...getDepth(parentComponent, currentLevel + 1));\n }\n }\n\n return levels;\n };\n\n const nestedCompo = findComponent(component, components);\n // return depth 0 if component is not nested\n if (!nestedCompo) {\n return 0;\n }\n const compoDepth = Math.max(...getDepth(nestedCompo, 1));\n return compoDepth;\n};\n"],"names":["findComponent","componentUid","components","find","c","component","getChildrenMaxDepth","currentDepth","childComponents","length","maxDepth","forEach","child","depth","getComponentDepth","getDepth","currentComponent","currentLevel","levels","push","uidsOfAllParents","parentUid","parentComponent","nestedCompo","compoDepth","Math","max"],"mappings":"AAIA,MAAMA,aAAAA,GAAgB,CACpBC,YAAAA,EACAC,UAAAA,GAAAA;AAEA,IAAA,OAAOA,WAAWC,IAAI,CAAC,CAACC,CAAAA,GAAMA,CAAAA,CAAEC,SAAS,KAAKJ,YAAAA,CAAAA;AAChD,CAAA;AAEA;;;;;;;;AAQC,IACM,MAAMK,mBAAAA,GAAsB,CACjCL,YAAAA,EACAC,UAAAA,EACAK,eAAe,CAAC,GAAA;IAEhB,MAAMF,SAAAA,GAAYL,cAAcC,YAAAA,EAAcC,UAAAA,CAAAA;;IAG9C,IAAI,CAACG,SAAAA,IAAa,CAACA,SAAAA,CAAUG,eAAe,IAAIH,SAAAA,CAAUG,eAAe,CAACC,MAAM,KAAK,CAAA,EAAG;QACtF,OAAOF,YAAAA;AACT,IAAA;AAEA,IAAA,IAAIG,QAAAA,GAAWH,YAAAA;;AAGfF,IAAAA,SAAAA,CAAUG,eAAe,CAACG,OAAO,CAAC,CAACC,KAAAA,GAAAA;;AAEjC,QAAA,MAAMC,QAAQP,mBAAAA,CAAoBM,KAAAA,CAAMP,SAAS,EAAEH,YAAYK,YAAAA,GAAe,CAAA,CAAA;;AAE9E,QAAA,IAAIM,QAAQH,QAAAA,EAAU;YACpBA,QAAAA,GAAWG,KAAAA;AACb,QAAA;AACF,IAAA,CAAA,CAAA;IAEA,OAAOH,QAAAA;AACT;AAEA;;;;;;;;AAQC,IACM,MAAMI,iBAAAA,GAAoB,CAC/BT,SAAAA,EACAH,UAAAA,GAAAA;AAEA;;;;;;MAOA,MAAMa,QAAAA,GAAW,CAACC,gBAAAA,EAAmCC,YAAAA,GAAAA;AACnD,QAAA,MAAMC,SAAS,EAAE;AACjBA,QAAAA,MAAAA,CAAOC,IAAI,CAACF,YAAAA,CAAAA;;QAGZ,IAAI,CAACD,gBAAAA,CAAiBI,gBAAgB,EAAE;YACtC,OAAOF,MAAAA;AACT,QAAA;;AAGA,QAAA,KAAK,MAAMG,SAAAA,IAAaL,gBAAAA,CAAiBI,gBAAgB,CAAE;YACzD,MAAME,eAAAA,GAAkBtB,cAAcqB,SAAAA,EAAWnB,UAAAA,CAAAA;AACjD,YAAA,IAAIoB,eAAAA,EAAiB;AACnBJ,gBAAAA,MAAAA,CAAOC,IAAI,CAAA,GAAIJ,QAAAA,CAASO,eAAAA,EAAiBL,YAAAA,GAAe,CAAA,CAAA,CAAA;AAC1D,YAAA;AACF,QAAA;QAEA,OAAOC,MAAAA;AACT,IAAA,CAAA;IAEA,MAAMK,WAAAA,GAAcvB,cAAcK,SAAAA,EAAWH,UAAAA,CAAAA;;AAE7C,IAAA,IAAI,CAACqB,WAAAA,EAAa;QAChB,OAAO,CAAA;AACT,IAAA;AACA,IAAA,MAAMC,UAAAA,GAAaC,IAAAA,CAAKC,GAAG,CAAA,GAAIX,SAASQ,WAAAA,EAAa,CAAA,CAAA,CAAA;IACrD,OAAOC,UAAAA;AACT;;;;"}
|
|
@@ -2,7 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
var slugify = require('@sindresorhus/slugify');
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
6
|
+
|
|
7
|
+
var slugify__default = /*#__PURE__*/_interopDefault(slugify);
|
|
8
|
+
|
|
9
|
+
const nameToSlug = (name)=>slugify__default.default(name, {
|
|
6
10
|
separator: '-'
|
|
7
11
|
});
|
|
8
12
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nameToSlug.js","sources":["../../../admin/src/utils/nameToSlug.ts"],"sourcesContent":["import slugify from '@sindresorhus/slugify';\n\nexport const nameToSlug = (name: string) => slugify(name, { separator: '-' });\n"],"names":["nameToSlug","name","slugify","separator"],"mappings":"
|
|
1
|
+
{"version":3,"file":"nameToSlug.js","sources":["../../../admin/src/utils/nameToSlug.ts"],"sourcesContent":["import slugify from '@sindresorhus/slugify';\n\nexport const nameToSlug = (name: string) => slugify(name, { separator: '-' });\n"],"names":["nameToSlug","name","slugify","separator"],"mappings":";;;;;;;;AAEO,MAAMA,UAAAA,GAAa,CAACC,IAAAA,GAAiBC,yBAAQD,IAAAA,EAAM;QAAEE,SAAAA,EAAW;KAAI;;;;"}
|
|
@@ -2,11 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
var slugify = require('@sindresorhus/slugify');
|
|
4
4
|
|
|
5
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
6
|
+
|
|
7
|
+
var slugify__default = /*#__PURE__*/_interopDefault(slugify);
|
|
8
|
+
|
|
5
9
|
const toRegressedEnumValue = (value)=>{
|
|
6
10
|
if (!value) {
|
|
7
11
|
return '';
|
|
8
12
|
}
|
|
9
|
-
return
|
|
13
|
+
return slugify__default.default(value, {
|
|
10
14
|
decamelize: false,
|
|
11
15
|
lowercase: false,
|
|
12
16
|
separator: '_'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toRegressedEnumValue.js","sources":["../../../admin/src/utils/toRegressedEnumValue.ts"],"sourcesContent":["import slugify from '@sindresorhus/slugify';\n\nexport const toRegressedEnumValue = (value: string | undefined) => {\n if (!value) {\n return '';\n }\n return slugify(value, {\n decamelize: false,\n lowercase: false,\n separator: '_',\n });\n};\n"],"names":["toRegressedEnumValue","value","slugify","decamelize","lowercase","separator"],"mappings":"
|
|
1
|
+
{"version":3,"file":"toRegressedEnumValue.js","sources":["../../../admin/src/utils/toRegressedEnumValue.ts"],"sourcesContent":["import slugify from '@sindresorhus/slugify';\n\nexport const toRegressedEnumValue = (value: string | undefined) => {\n if (!value) {\n return '';\n }\n return slugify(value, {\n decamelize: false,\n lowercase: false,\n separator: '_',\n });\n};\n"],"names":["toRegressedEnumValue","value","slugify","decamelize","lowercase","separator"],"mappings":";;;;;;;;AAEO,MAAMA,uBAAuB,CAACC,KAAAA,GAAAA;AACnC,IAAA,IAAI,CAACA,KAAAA,EAAO;QACV,OAAO,EAAA;AACT,IAAA;AACA,IAAA,OAAOC,yBAAQD,KAAAA,EAAO;QACpBE,UAAAA,EAAY,KAAA;QACZC,SAAAA,EAAW,KAAA;QACXC,SAAAA,EAAW;AACb,KAAA,CAAA;AACF;;;;"}
|
|
@@ -4,6 +4,10 @@ var _ = require('lodash');
|
|
|
4
4
|
var index = require('../utils/index.js');
|
|
5
5
|
var component = require('./validation/component.js');
|
|
6
6
|
|
|
7
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
|
+
|
|
9
|
+
var ___default = /*#__PURE__*/_interopDefault(_);
|
|
10
|
+
|
|
7
11
|
/**
|
|
8
12
|
* Components controller
|
|
9
13
|
*/ var components = {
|
|
@@ -78,7 +82,7 @@ var component = require('./validation/component.js');
|
|
|
78
82
|
*/ async updateComponent (ctx) {
|
|
79
83
|
const { uid } = ctx.params;
|
|
80
84
|
const body = ctx.request.body;
|
|
81
|
-
if (!
|
|
85
|
+
if (!___default.default.has(strapi.components, uid)) {
|
|
82
86
|
return ctx.send({
|
|
83
87
|
error: 'component.notFound'
|
|
84
88
|
}, 404);
|
|
@@ -116,7 +120,7 @@ var component = require('./validation/component.js');
|
|
|
116
120
|
* @param {Object} ctx - koa context
|
|
117
121
|
*/ async deleteComponent (ctx) {
|
|
118
122
|
const { uid } = ctx.params;
|
|
119
|
-
if (!
|
|
123
|
+
if (!___default.default.has(strapi.components, uid)) {
|
|
120
124
|
return ctx.send({
|
|
121
125
|
error: 'component.notFound'
|
|
122
126
|
}, 404);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components.js","sources":["../../../server/src/controllers/components.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Context } from 'koa';\nimport type { UID } from '@strapi/types';\nimport { getService } from '../utils';\nimport { validateComponentInput, validateUpdateComponentInput } from './validation/component';\n\n/**\n * Components controller\n */\n\nexport default {\n /**\n * GET /components handler\n * Returns a list of available components\n * @param {Object} ctx - koa context\n */\n async getComponents(ctx: Context) {\n const componentService = getService('components');\n const componentUIDs = Object.keys(strapi.components) as UID.Component[];\n\n const data = componentUIDs.map((uid) => {\n return componentService.formatComponent(strapi.components[uid]);\n });\n\n ctx.send({ data });\n },\n\n /**\n * GET /components/:uid\n * Returns a specific component\n * @param {Object} ctx - koa context\n */\n async getComponent(ctx: Context) {\n const { uid } = ctx.params;\n\n const component = strapi.components[uid];\n\n if (!component) {\n return ctx.send({ error: 'component.notFound' }, 404);\n }\n\n const componentService = getService('components');\n\n ctx.send({ data: componentService.formatComponent(component) });\n },\n\n /**\n * POST /components\n * Creates a component and returns its infos\n * @param {Object} ctx - koa context\n */\n async createComponent(ctx: Context) {\n const body = ctx.request.body as any;\n\n try {\n await validateComponentInput(body);\n } catch (error) {\n return ctx.send({ error }, 400);\n }\n\n try {\n strapi.reload.isWatching = false;\n\n const componentService = getService('components');\n\n const component = await componentService.createComponent({\n component: body.component,\n components: body.components,\n });\n\n setImmediate(() => strapi.reload());\n\n ctx.send({ data: { uid: component.uid } }, 201);\n } catch (error) {\n strapi.log.error(error);\n ctx.send({ error: (error as any)?.message || 'Unknown error' }, 400);\n }\n },\n\n /**\n * PUT /components/:uid\n * Updates a component and return its infos\n * @param {Object} ctx - koa context - enhanced koa context\n */\n async updateComponent(ctx: Context) {\n const { uid } = ctx.params;\n const body = ctx.request.body as any;\n\n if (!_.has(strapi.components, uid)) {\n return ctx.send({ error: 'component.notFound' }, 404);\n }\n\n try {\n await validateUpdateComponentInput(body);\n } catch (error) {\n return ctx.send({ error }, 400);\n }\n\n try {\n strapi.reload.isWatching = false;\n\n const componentService = getService('components');\n\n const component = (await componentService.editComponent(uid, {\n component: body.component,\n components: body.components,\n })) as any;\n\n setImmediate(() => strapi.reload());\n\n ctx.send({ data: { uid: component.uid } });\n } catch (error) {\n strapi.log.error(error);\n\n ctx.send({ error: (error as any)?.message || 'Unknown error' }, 400);\n }\n },\n\n /**\n * DELETE /components/:uid\n * Deletes a components and returns its old infos\n * @param {Object} ctx - koa context\n */\n async deleteComponent(ctx: Context) {\n const { uid } = ctx.params;\n\n if (!_.has(strapi.components, uid)) {\n return ctx.send({ error: 'component.notFound' }, 404);\n }\n\n try {\n strapi.reload.isWatching = false;\n\n const componentService = getService('components');\n\n const component = await componentService.deleteComponent(uid);\n\n setImmediate(() => strapi.reload());\n\n ctx.send({ data: { uid: component.uid } });\n } catch (error) {\n strapi.log.error(error);\n ctx.send({ error: (error as any)?.message || 'Unknown error' }, 400);\n }\n },\n};\n"],"names":["getComponents","ctx","componentService","getService","componentUIDs","Object","keys","strapi","components","data","map","uid","formatComponent","send","getComponent","params","component","error","createComponent","body","request","validateComponentInput","reload","isWatching","setImmediate","log","message","updateComponent","_","has","validateUpdateComponentInput","editComponent","deleteComponent"],"mappings":"
|
|
1
|
+
{"version":3,"file":"components.js","sources":["../../../server/src/controllers/components.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Context } from 'koa';\nimport type { UID } from '@strapi/types';\nimport { getService } from '../utils';\nimport { validateComponentInput, validateUpdateComponentInput } from './validation/component';\n\n/**\n * Components controller\n */\n\nexport default {\n /**\n * GET /components handler\n * Returns a list of available components\n * @param {Object} ctx - koa context\n */\n async getComponents(ctx: Context) {\n const componentService = getService('components');\n const componentUIDs = Object.keys(strapi.components) as UID.Component[];\n\n const data = componentUIDs.map((uid) => {\n return componentService.formatComponent(strapi.components[uid]);\n });\n\n ctx.send({ data });\n },\n\n /**\n * GET /components/:uid\n * Returns a specific component\n * @param {Object} ctx - koa context\n */\n async getComponent(ctx: Context) {\n const { uid } = ctx.params;\n\n const component = strapi.components[uid];\n\n if (!component) {\n return ctx.send({ error: 'component.notFound' }, 404);\n }\n\n const componentService = getService('components');\n\n ctx.send({ data: componentService.formatComponent(component) });\n },\n\n /**\n * POST /components\n * Creates a component and returns its infos\n * @param {Object} ctx - koa context\n */\n async createComponent(ctx: Context) {\n const body = ctx.request.body as any;\n\n try {\n await validateComponentInput(body);\n } catch (error) {\n return ctx.send({ error }, 400);\n }\n\n try {\n strapi.reload.isWatching = false;\n\n const componentService = getService('components');\n\n const component = await componentService.createComponent({\n component: body.component,\n components: body.components,\n });\n\n setImmediate(() => strapi.reload());\n\n ctx.send({ data: { uid: component.uid } }, 201);\n } catch (error) {\n strapi.log.error(error);\n ctx.send({ error: (error as any)?.message || 'Unknown error' }, 400);\n }\n },\n\n /**\n * PUT /components/:uid\n * Updates a component and return its infos\n * @param {Object} ctx - koa context - enhanced koa context\n */\n async updateComponent(ctx: Context) {\n const { uid } = ctx.params;\n const body = ctx.request.body as any;\n\n if (!_.has(strapi.components, uid)) {\n return ctx.send({ error: 'component.notFound' }, 404);\n }\n\n try {\n await validateUpdateComponentInput(body);\n } catch (error) {\n return ctx.send({ error }, 400);\n }\n\n try {\n strapi.reload.isWatching = false;\n\n const componentService = getService('components');\n\n const component = (await componentService.editComponent(uid, {\n component: body.component,\n components: body.components,\n })) as any;\n\n setImmediate(() => strapi.reload());\n\n ctx.send({ data: { uid: component.uid } });\n } catch (error) {\n strapi.log.error(error);\n\n ctx.send({ error: (error as any)?.message || 'Unknown error' }, 400);\n }\n },\n\n /**\n * DELETE /components/:uid\n * Deletes a components and returns its old infos\n * @param {Object} ctx - koa context\n */\n async deleteComponent(ctx: Context) {\n const { uid } = ctx.params;\n\n if (!_.has(strapi.components, uid)) {\n return ctx.send({ error: 'component.notFound' }, 404);\n }\n\n try {\n strapi.reload.isWatching = false;\n\n const componentService = getService('components');\n\n const component = await componentService.deleteComponent(uid);\n\n setImmediate(() => strapi.reload());\n\n ctx.send({ data: { uid: component.uid } });\n } catch (error) {\n strapi.log.error(error);\n ctx.send({ error: (error as any)?.message || 'Unknown error' }, 400);\n }\n },\n};\n"],"names":["getComponents","ctx","componentService","getService","componentUIDs","Object","keys","strapi","components","data","map","uid","formatComponent","send","getComponent","params","component","error","createComponent","body","request","validateComponentInput","reload","isWatching","setImmediate","log","message","updateComponent","_","has","validateUpdateComponentInput","editComponent","deleteComponent"],"mappings":"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"}
|
|
@@ -5,6 +5,10 @@ var index = require('../utils/index.js');
|
|
|
5
5
|
var contentType = require('./validation/content-type.js');
|
|
6
6
|
var contentTypes$1 = require('../services/content-types.js');
|
|
7
7
|
|
|
8
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
+
|
|
10
|
+
var ___default = /*#__PURE__*/_interopDefault(_);
|
|
11
|
+
|
|
8
12
|
/**
|
|
9
13
|
* Telemetry uses a bounded HTTP timeout (~1s in the metrics sender); cap how long we defer
|
|
10
14
|
* dev reload so a stuck client cannot block restart indefinitely.
|
|
@@ -33,7 +37,7 @@ var contentTypes = {
|
|
|
33
37
|
}, 400);
|
|
34
38
|
}
|
|
35
39
|
const contentTypeService = index.getService('content-types');
|
|
36
|
-
const contentTypes = Object.keys(strapi.contentTypes).filter((uid)=>!kind ||
|
|
40
|
+
const contentTypes = Object.keys(strapi.contentTypes).filter((uid)=>!kind || ___default.default.get(strapi.contentTypes[uid], 'kind', 'collectionType') === kind).map((uid)=>contentTypeService.formatContentType(strapi.contentTypes[uid]));
|
|
37
41
|
ctx.send({
|
|
38
42
|
data: contentTypes
|
|
39
43
|
});
|
|
@@ -77,7 +81,7 @@ var contentTypes = {
|
|
|
77
81
|
kind: contentType.kind
|
|
78
82
|
}
|
|
79
83
|
};
|
|
80
|
-
const telemetryPromise =
|
|
84
|
+
const telemetryPromise = ___default.default.isEmpty(strapi.apis) ? strapi.telemetry.send('didCreateFirstContentType', metricsPayload) : strapi.telemetry.send('didCreateContentType', metricsPayload);
|
|
81
85
|
scheduleReloadAfterOutboundTelemetry(telemetryPromise);
|
|
82
86
|
ctx.send({
|
|
83
87
|
data: {
|
|
@@ -99,7 +103,7 @@ var contentTypes = {
|
|
|
99
103
|
async updateContentType (ctx) {
|
|
100
104
|
const { uid } = ctx.params;
|
|
101
105
|
const body = ctx.request.body;
|
|
102
|
-
if (!
|
|
106
|
+
if (!___default.default.has(strapi.contentTypes, uid)) {
|
|
103
107
|
return ctx.send({
|
|
104
108
|
error: 'contentType.notFound'
|
|
105
109
|
}, 404);
|
|
@@ -133,7 +137,7 @@ var contentTypes = {
|
|
|
133
137
|
},
|
|
134
138
|
async deleteContentType (ctx) {
|
|
135
139
|
const { uid } = ctx.params;
|
|
136
|
-
if (!
|
|
140
|
+
if (!___default.default.has(strapi.contentTypes, uid)) {
|
|
137
141
|
return ctx.send({
|
|
138
142
|
error: 'contentType.notFound'
|
|
139
143
|
}, 404);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-types.js","sources":["../../../server/src/controllers/content-types.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Context } from 'koa';\nimport type {} from 'koa-body';\nimport type { Internal } from '@strapi/types';\nimport { getService } from '../utils';\nimport {\n validateContentTypeInput,\n validateUpdateContentTypeInput,\n validateKind,\n} from './validation/content-type';\nimport { isContentTypeVisible } from '../services/content-types';\n\n/**\n * Telemetry uses a bounded HTTP timeout (~1s in the metrics sender); cap how long we defer\n * dev reload so a stuck client cannot block restart indefinitely.\n */\nconst RELOAD_AFTER_TELEMETRY_MAX_MS = 2500;\n\nconst scheduleReloadAfterOutboundTelemetry = (sendPromise: Promise<unknown>): void => {\n setImmediate(() => {\n const settled = sendPromise.catch(() => {});\n Promise.race([\n settled,\n new Promise<void>((resolve) => {\n setTimeout(resolve, RELOAD_AFTER_TELEMETRY_MAX_MS);\n }),\n ])\n .catch(() => {})\n .finally(() => {\n strapi.reload();\n });\n });\n};\n\nexport default {\n async getContentTypes(ctx: Context) {\n const { kind } = ctx.query;\n\n try {\n await validateKind(kind);\n } catch (error) {\n return ctx.send({ error }, 400);\n }\n\n const contentTypeService = getService('content-types');\n\n const contentTypes = Object.keys(strapi.contentTypes)\n .filter(\n (uid) =>\n !kind ||\n _.get(strapi.contentTypes[uid as Internal.UID.ContentType], 'kind', 'collectionType') ===\n kind\n )\n .map((uid) =>\n contentTypeService.formatContentType(strapi.contentTypes[uid as Internal.UID.ContentType])\n );\n\n ctx.send({\n data: contentTypes,\n });\n },\n\n getContentType(ctx: Context) {\n const { uid } = ctx.params;\n\n const contentType = strapi.contentTypes[uid];\n\n if (!contentType) {\n return ctx.send({ error: 'contentType.notFound' }, 404);\n }\n\n if (!isContentTypeVisible(contentType)) {\n return ctx.send({ error: 'contentType.notFound' }, 404);\n }\n\n const contentTypeService = getService('content-types');\n\n ctx.send({ data: contentTypeService.formatContentType(contentType) });\n },\n\n async createContentType(ctx: Context) {\n const body = ctx.request.body as any;\n\n try {\n await validateContentTypeInput(body);\n } catch (error) {\n return ctx.send({ error }, 400);\n }\n\n try {\n strapi.reload.isWatching = false;\n\n const contentTypeService = getService('content-types');\n\n const contentType = await contentTypeService.createContentType({\n contentType: body.contentType,\n components: body.components,\n });\n\n const metricsPayload = {\n eventProperties: {\n kind: contentType.kind,\n },\n };\n\n const telemetryPromise = _.isEmpty(strapi.apis)\n ? strapi.telemetry.send('didCreateFirstContentType', metricsPayload)\n : strapi.telemetry.send('didCreateContentType', metricsPayload);\n\n scheduleReloadAfterOutboundTelemetry(telemetryPromise);\n\n ctx.send({ data: { uid: contentType.uid } }, 201);\n } catch (err) {\n strapi.log.error(err);\n strapi.telemetry\n .send('didNotCreateContentType', {\n eventProperties: { error: (err as Error).message || err },\n })\n .catch(() => {});\n ctx.send({ error: (err as Error).message || 'Unknown error' }, 400);\n }\n },\n\n async updateContentType(ctx: Context) {\n const { uid } = ctx.params;\n const body = ctx.request.body as any;\n\n if (!_.has(strapi.contentTypes, uid)) {\n return ctx.send({ error: 'contentType.notFound' }, 404);\n }\n\n try {\n await validateUpdateContentTypeInput(body);\n } catch (error) {\n return ctx.send({ error }, 400);\n }\n\n try {\n strapi.reload.isWatching = false;\n\n const contentTypeService = getService('content-types');\n\n const component = await contentTypeService.editContentType(uid, {\n contentType: body.contentType,\n components: body.components,\n });\n\n setImmediate(() => strapi.reload());\n\n ctx.send({ data: { uid: component.uid } }, 201);\n } catch (error) {\n strapi.log.error(error);\n ctx.send({ error: (error as Error)?.message || 'Unknown error' }, 400);\n }\n },\n\n async deleteContentType(ctx: Context) {\n const { uid } = ctx.params;\n\n if (!_.has(strapi.contentTypes, uid)) {\n return ctx.send({ error: 'contentType.notFound' }, 404);\n }\n\n try {\n strapi.reload.isWatching = false;\n\n const contentTypeService = getService('content-types');\n\n const component = await contentTypeService.deleteContentType(uid);\n\n setImmediate(() => strapi.reload());\n\n ctx.send({ data: { uid: component.uid } });\n } catch (error) {\n strapi.log.error(error);\n ctx.send({ error: (error as Error)?.message || 'Unknown error' }, 400);\n }\n },\n};\n"],"names":["RELOAD_AFTER_TELEMETRY_MAX_MS","scheduleReloadAfterOutboundTelemetry","sendPromise","setImmediate","settled","catch","Promise","race","resolve","setTimeout","finally","strapi","reload","getContentTypes","ctx","kind","query","validateKind","error","send","contentTypeService","getService","contentTypes","Object","keys","filter","uid","_","get","map","formatContentType","data","getContentType","params","contentType","isContentTypeVisible","createContentType","body","request","validateContentTypeInput","isWatching","components","metricsPayload","eventProperties","telemetryPromise","isEmpty","apis","telemetry","err","log","message","updateContentType","has","validateUpdateContentTypeInput","component","editContentType","deleteContentType"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"content-types.js","sources":["../../../server/src/controllers/content-types.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Context } from 'koa';\nimport type {} from 'koa-body';\nimport type { Internal } from '@strapi/types';\nimport { getService } from '../utils';\nimport {\n validateContentTypeInput,\n validateUpdateContentTypeInput,\n validateKind,\n} from './validation/content-type';\nimport { isContentTypeVisible } from '../services/content-types';\n\n/**\n * Telemetry uses a bounded HTTP timeout (~1s in the metrics sender); cap how long we defer\n * dev reload so a stuck client cannot block restart indefinitely.\n */\nconst RELOAD_AFTER_TELEMETRY_MAX_MS = 2500;\n\nconst scheduleReloadAfterOutboundTelemetry = (sendPromise: Promise<unknown>): void => {\n setImmediate(() => {\n const settled = sendPromise.catch(() => {});\n Promise.race([\n settled,\n new Promise<void>((resolve) => {\n setTimeout(resolve, RELOAD_AFTER_TELEMETRY_MAX_MS);\n }),\n ])\n .catch(() => {})\n .finally(() => {\n strapi.reload();\n });\n });\n};\n\nexport default {\n async getContentTypes(ctx: Context) {\n const { kind } = ctx.query;\n\n try {\n await validateKind(kind);\n } catch (error) {\n return ctx.send({ error }, 400);\n }\n\n const contentTypeService = getService('content-types');\n\n const contentTypes = Object.keys(strapi.contentTypes)\n .filter(\n (uid) =>\n !kind ||\n _.get(strapi.contentTypes[uid as Internal.UID.ContentType], 'kind', 'collectionType') ===\n kind\n )\n .map((uid) =>\n contentTypeService.formatContentType(strapi.contentTypes[uid as Internal.UID.ContentType])\n );\n\n ctx.send({\n data: contentTypes,\n });\n },\n\n getContentType(ctx: Context) {\n const { uid } = ctx.params;\n\n const contentType = strapi.contentTypes[uid];\n\n if (!contentType) {\n return ctx.send({ error: 'contentType.notFound' }, 404);\n }\n\n if (!isContentTypeVisible(contentType)) {\n return ctx.send({ error: 'contentType.notFound' }, 404);\n }\n\n const contentTypeService = getService('content-types');\n\n ctx.send({ data: contentTypeService.formatContentType(contentType) });\n },\n\n async createContentType(ctx: Context) {\n const body = ctx.request.body as any;\n\n try {\n await validateContentTypeInput(body);\n } catch (error) {\n return ctx.send({ error }, 400);\n }\n\n try {\n strapi.reload.isWatching = false;\n\n const contentTypeService = getService('content-types');\n\n const contentType = await contentTypeService.createContentType({\n contentType: body.contentType,\n components: body.components,\n });\n\n const metricsPayload = {\n eventProperties: {\n kind: contentType.kind,\n },\n };\n\n const telemetryPromise = _.isEmpty(strapi.apis)\n ? strapi.telemetry.send('didCreateFirstContentType', metricsPayload)\n : strapi.telemetry.send('didCreateContentType', metricsPayload);\n\n scheduleReloadAfterOutboundTelemetry(telemetryPromise);\n\n ctx.send({ data: { uid: contentType.uid } }, 201);\n } catch (err) {\n strapi.log.error(err);\n strapi.telemetry\n .send('didNotCreateContentType', {\n eventProperties: { error: (err as Error).message || err },\n })\n .catch(() => {});\n ctx.send({ error: (err as Error).message || 'Unknown error' }, 400);\n }\n },\n\n async updateContentType(ctx: Context) {\n const { uid } = ctx.params;\n const body = ctx.request.body as any;\n\n if (!_.has(strapi.contentTypes, uid)) {\n return ctx.send({ error: 'contentType.notFound' }, 404);\n }\n\n try {\n await validateUpdateContentTypeInput(body);\n } catch (error) {\n return ctx.send({ error }, 400);\n }\n\n try {\n strapi.reload.isWatching = false;\n\n const contentTypeService = getService('content-types');\n\n const component = await contentTypeService.editContentType(uid, {\n contentType: body.contentType,\n components: body.components,\n });\n\n setImmediate(() => strapi.reload());\n\n ctx.send({ data: { uid: component.uid } }, 201);\n } catch (error) {\n strapi.log.error(error);\n ctx.send({ error: (error as Error)?.message || 'Unknown error' }, 400);\n }\n },\n\n async deleteContentType(ctx: Context) {\n const { uid } = ctx.params;\n\n if (!_.has(strapi.contentTypes, uid)) {\n return ctx.send({ error: 'contentType.notFound' }, 404);\n }\n\n try {\n strapi.reload.isWatching = false;\n\n const contentTypeService = getService('content-types');\n\n const component = await contentTypeService.deleteContentType(uid);\n\n setImmediate(() => strapi.reload());\n\n ctx.send({ data: { uid: component.uid } });\n } catch (error) {\n strapi.log.error(error);\n ctx.send({ error: (error as Error)?.message || 'Unknown error' }, 400);\n }\n },\n};\n"],"names":["RELOAD_AFTER_TELEMETRY_MAX_MS","scheduleReloadAfterOutboundTelemetry","sendPromise","setImmediate","settled","catch","Promise","race","resolve","setTimeout","finally","strapi","reload","getContentTypes","ctx","kind","query","validateKind","error","send","contentTypeService","getService","contentTypes","Object","keys","filter","uid","_","get","map","formatContentType","data","getContentType","params","contentType","isContentTypeVisible","createContentType","body","request","validateContentTypeInput","isWatching","components","metricsPayload","eventProperties","telemetryPromise","isEmpty","apis","telemetry","err","log","message","updateContentType","has","validateUpdateContentTypeInput","component","editContentType","deleteContentType"],"mappings":"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"}
|
|
@@ -3,6 +3,10 @@
|
|
|
3
3
|
var utils = require('@strapi/utils');
|
|
4
4
|
var _ = require('lodash');
|
|
5
5
|
|
|
6
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
|
+
|
|
8
|
+
var ___default = /*#__PURE__*/_interopDefault(_);
|
|
9
|
+
|
|
6
10
|
const validators = {
|
|
7
11
|
required: utils.yup.boolean(),
|
|
8
12
|
unique: utils.yup.boolean(),
|
|
@@ -67,7 +71,7 @@ const isValidDefaultJSON = {
|
|
|
67
71
|
if (val === undefined) {
|
|
68
72
|
return true;
|
|
69
73
|
}
|
|
70
|
-
if (
|
|
74
|
+
if (___default.default.isNumber(val) || ___default.default.isNull(val) || ___default.default.isObject(val) || ___default.default.isArray(val)) {
|
|
71
75
|
return true;
|
|
72
76
|
}
|
|
73
77
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","sources":["../../../../server/src/controllers/validation/common.ts"],"sourcesContent":["/* eslint-disable no-template-curly-in-string */\nimport { yup, strings } from '@strapi/utils';\nimport _ from 'lodash';\nimport { TestConfig } from 'yup';\n\nexport const validators = {\n required: yup.boolean(),\n unique: yup.boolean(),\n minLength: yup.number().integer().positive(),\n maxLength: yup.number().integer().positive(),\n};\n\nexport const NAME_REGEX = /^[A-Za-z][_0-9A-Za-z]*$/;\nexport const COLLECTION_NAME_REGEX = /^[A-Za-z][-_0-9A-Za-z]*$/;\nexport const CATEGORY_NAME_REGEX = /^[A-Za-z][-_0-9A-Za-z]*$/;\nexport const ICON_REGEX = /^[A-Za-z0-9][-A-Za-z0-9]*$/;\nexport const UID_REGEX = /^[A-Za-z0-9-_.~]*$/;\nexport const KEBAB_BASE_REGEX = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n\nexport type CommonTestConfig = TestConfig<unknown | undefined, Record<string, unknown>>;\n\nexport const isValidName: CommonTestConfig = {\n name: 'isValidName',\n message: `\\${path} must match the following regex: ${NAME_REGEX}`,\n test: (val: unknown) => val === '' || NAME_REGEX.test(val as string),\n};\n\nexport const isValidIcon: CommonTestConfig = {\n name: 'isValidIcon',\n message: `\\${path} is not a valid icon name. Make sure your icon name starts with an alphanumeric character and only includes alphanumeric characters or dashes.`,\n test: (val) => val === '' || ICON_REGEX.test(val as string),\n};\n\nexport const isValidUID: CommonTestConfig = {\n name: 'isValidUID',\n message: `\\${path} must match the following regex: ${UID_REGEX}`,\n test: (val) => val === '' || UID_REGEX.test(val as string),\n};\n\nexport const isValidCategoryName: CommonTestConfig = {\n name: 'isValidCategoryName',\n message: `\\${path} must match the following regex: ${CATEGORY_NAME_REGEX}`,\n test: (val) => val === '' || CATEGORY_NAME_REGEX.test(val as string),\n};\n\nexport const isValidCollectionName: CommonTestConfig = {\n name: 'isValidCollectionName',\n message: `\\${path} must match the following regex: ${COLLECTION_NAME_REGEX}`,\n test: (val) => val === '' || COLLECTION_NAME_REGEX.test(val as string),\n};\n\nexport const isValidKey = (key: string): CommonTestConfig => ({\n name: 'isValidKey',\n message: `Attribute name '${key}' must match the following regex: ${NAME_REGEX}`,\n test: () => NAME_REGEX.test(key),\n});\n\nexport const isValidEnum: CommonTestConfig = {\n name: 'isValidEnum',\n message: '${path} should not start with number',\n test: (val) => val === '' || !strings.startsWithANumber(val as string),\n};\n\nexport const areEnumValuesUnique: CommonTestConfig = {\n name: 'areEnumValuesUnique',\n message: '${path} cannot contain duplicate values',\n test(values) {\n const filtered = [...new Set(values as string[])];\n\n return filtered.length === (values as string[]).length;\n },\n};\n\nexport const isValidRegExpPattern: CommonTestConfig = {\n name: 'isValidRegExpPattern',\n message: '${path} must be a valid RexExp pattern string',\n test: (val) => val === '' || !!new RegExp(val as string),\n};\n\nexport const isValidDefaultJSON: CommonTestConfig = {\n name: 'isValidDefaultJSON',\n message: '${path} is not a valid JSON',\n test(val) {\n if (val === undefined) {\n return true;\n }\n\n if (_.isNumber(val) || _.isNull(val) || _.isObject(val) || _.isArray(val)) {\n return true;\n }\n\n try {\n JSON.parse(val as string);\n\n return true;\n } catch (err) {\n return false;\n }\n },\n};\n"],"names":["validators","required","yup","boolean","unique","minLength","number","integer","positive","maxLength","NAME_REGEX","COLLECTION_NAME_REGEX","CATEGORY_NAME_REGEX","ICON_REGEX","UID_REGEX","KEBAB_BASE_REGEX","isValidName","name","message","test","val","isValidIcon","isValidCategoryName","isValidCollectionName","isValidKey","key","isValidEnum","strings","startsWithANumber","areEnumValuesUnique","values","filtered","Set","length","isValidRegExpPattern","RegExp","isValidDefaultJSON","undefined","_","isNumber","isNull","isObject","isArray","JSON","parse","err"],"mappings":"
|
|
1
|
+
{"version":3,"file":"common.js","sources":["../../../../server/src/controllers/validation/common.ts"],"sourcesContent":["/* eslint-disable no-template-curly-in-string */\nimport { yup, strings } from '@strapi/utils';\nimport _ from 'lodash';\nimport { TestConfig } from 'yup';\n\nexport const validators = {\n required: yup.boolean(),\n unique: yup.boolean(),\n minLength: yup.number().integer().positive(),\n maxLength: yup.number().integer().positive(),\n};\n\nexport const NAME_REGEX = /^[A-Za-z][_0-9A-Za-z]*$/;\nexport const COLLECTION_NAME_REGEX = /^[A-Za-z][-_0-9A-Za-z]*$/;\nexport const CATEGORY_NAME_REGEX = /^[A-Za-z][-_0-9A-Za-z]*$/;\nexport const ICON_REGEX = /^[A-Za-z0-9][-A-Za-z0-9]*$/;\nexport const UID_REGEX = /^[A-Za-z0-9-_.~]*$/;\nexport const KEBAB_BASE_REGEX = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n\nexport type CommonTestConfig = TestConfig<unknown | undefined, Record<string, unknown>>;\n\nexport const isValidName: CommonTestConfig = {\n name: 'isValidName',\n message: `\\${path} must match the following regex: ${NAME_REGEX}`,\n test: (val: unknown) => val === '' || NAME_REGEX.test(val as string),\n};\n\nexport const isValidIcon: CommonTestConfig = {\n name: 'isValidIcon',\n message: `\\${path} is not a valid icon name. Make sure your icon name starts with an alphanumeric character and only includes alphanumeric characters or dashes.`,\n test: (val) => val === '' || ICON_REGEX.test(val as string),\n};\n\nexport const isValidUID: CommonTestConfig = {\n name: 'isValidUID',\n message: `\\${path} must match the following regex: ${UID_REGEX}`,\n test: (val) => val === '' || UID_REGEX.test(val as string),\n};\n\nexport const isValidCategoryName: CommonTestConfig = {\n name: 'isValidCategoryName',\n message: `\\${path} must match the following regex: ${CATEGORY_NAME_REGEX}`,\n test: (val) => val === '' || CATEGORY_NAME_REGEX.test(val as string),\n};\n\nexport const isValidCollectionName: CommonTestConfig = {\n name: 'isValidCollectionName',\n message: `\\${path} must match the following regex: ${COLLECTION_NAME_REGEX}`,\n test: (val) => val === '' || COLLECTION_NAME_REGEX.test(val as string),\n};\n\nexport const isValidKey = (key: string): CommonTestConfig => ({\n name: 'isValidKey',\n message: `Attribute name '${key}' must match the following regex: ${NAME_REGEX}`,\n test: () => NAME_REGEX.test(key),\n});\n\nexport const isValidEnum: CommonTestConfig = {\n name: 'isValidEnum',\n message: '${path} should not start with number',\n test: (val) => val === '' || !strings.startsWithANumber(val as string),\n};\n\nexport const areEnumValuesUnique: CommonTestConfig = {\n name: 'areEnumValuesUnique',\n message: '${path} cannot contain duplicate values',\n test(values) {\n const filtered = [...new Set(values as string[])];\n\n return filtered.length === (values as string[]).length;\n },\n};\n\nexport const isValidRegExpPattern: CommonTestConfig = {\n name: 'isValidRegExpPattern',\n message: '${path} must be a valid RexExp pattern string',\n test: (val) => val === '' || !!new RegExp(val as string),\n};\n\nexport const isValidDefaultJSON: CommonTestConfig = {\n name: 'isValidDefaultJSON',\n message: '${path} is not a valid JSON',\n test(val) {\n if (val === undefined) {\n return true;\n }\n\n if (_.isNumber(val) || _.isNull(val) || _.isObject(val) || _.isArray(val)) {\n return true;\n }\n\n try {\n JSON.parse(val as string);\n\n return true;\n } catch (err) {\n return false;\n }\n },\n};\n"],"names":["validators","required","yup","boolean","unique","minLength","number","integer","positive","maxLength","NAME_REGEX","COLLECTION_NAME_REGEX","CATEGORY_NAME_REGEX","ICON_REGEX","UID_REGEX","KEBAB_BASE_REGEX","isValidName","name","message","test","val","isValidIcon","isValidCategoryName","isValidCollectionName","isValidKey","key","isValidEnum","strings","startsWithANumber","areEnumValuesUnique","values","filtered","Set","length","isValidRegExpPattern","RegExp","isValidDefaultJSON","undefined","_","isNumber","isNull","isObject","isArray","JSON","parse","err"],"mappings":"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"}
|
|
@@ -7,6 +7,10 @@ var common = require('./common.js');
|
|
|
7
7
|
var modelSchema = require('./model-schema.js');
|
|
8
8
|
var dataTransform = require('./data-transform.js');
|
|
9
9
|
|
|
10
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
|
+
|
|
12
|
+
var ___default = /*#__PURE__*/_interopDefault(_);
|
|
13
|
+
|
|
10
14
|
const VALID_RELATIONS = [
|
|
11
15
|
'oneToOne',
|
|
12
16
|
'oneToMany'
|
|
@@ -30,8 +34,8 @@ const nestedComponentSchema = utils.yup.array().of(componentSchema.shape({
|
|
|
30
34
|
name: 'mustHaveUIDOrTmpUID',
|
|
31
35
|
message: 'Component must have a uid or a tmpUID',
|
|
32
36
|
test (attr) {
|
|
33
|
-
if (
|
|
34
|
-
if (!
|
|
37
|
+
if (___default.default.has(attr, 'uid') && ___default.default.has(attr, 'tmpUID')) return false;
|
|
38
|
+
if (!___default.default.has(attr, 'uid') && !___default.default.has(attr, 'tmpUID')) return false;
|
|
35
39
|
return true;
|
|
36
40
|
}
|
|
37
41
|
}).required().noUnknown());
|
|
@@ -45,12 +49,12 @@ const updateComponentInputSchema = utils.yup.object({
|
|
|
45
49
|
components: nestedComponentSchema
|
|
46
50
|
}).noUnknown();
|
|
47
51
|
const validateUpdateComponentInput = (data)=>{
|
|
48
|
-
if (
|
|
52
|
+
if (___default.default.has(data, 'component') && data.component) {
|
|
49
53
|
dataTransform.removeEmptyDefaults(data.component);
|
|
50
54
|
}
|
|
51
|
-
if (
|
|
55
|
+
if (___default.default.has(data, 'components') && Array.isArray(data.components)) {
|
|
52
56
|
data.components.forEach((data)=>{
|
|
53
|
-
if (
|
|
57
|
+
if (___default.default.has(data, 'uid')) {
|
|
54
58
|
dataTransform.removeEmptyDefaults(data);
|
|
55
59
|
}
|
|
56
60
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component.js","sources":["../../../../server/src/controllers/validation/component.ts"],"sourcesContent":["import _ from 'lodash';\nimport { yup, validateYupSchema } from '@strapi/utils';\n\nimport type { Struct } from '@strapi/types';\nimport { modelTypes, DEFAULT_TYPES } from '../../services/constants';\nimport { isValidCategoryName, isValidIcon } from './common';\nimport { createSchema } from './model-schema';\nimport { removeEmptyDefaults } from './data-transform';\n\nexport const VALID_RELATIONS = ['oneToOne', 'oneToMany'];\nexport const VALID_TYPES = [...DEFAULT_TYPES, 'component', 'customField'];\n\nexport const componentSchema = createSchema(VALID_TYPES, VALID_RELATIONS, {\n modelType: modelTypes.COMPONENT,\n})\n .shape({\n displayName: yup.string().min(1).required('displayName.required'),\n icon: yup.string().nullable().test(isValidIcon),\n category: yup.string().nullable().test(isValidCategoryName).required('category.required'),\n })\n .required()\n .noUnknown();\n\nexport const nestedComponentSchema = yup.array().of(\n componentSchema\n .shape({\n uid: yup.string(),\n tmpUID: yup.string(),\n })\n .test({\n name: 'mustHaveUIDOrTmpUID',\n message: 'Component must have a uid or a tmpUID',\n test(attr: unknown) {\n if (_.has(attr, 'uid') && _.has(attr, 'tmpUID')) return false;\n if (!_.has(attr, 'uid') && !_.has(attr, 'tmpUID')) return false;\n return true;\n },\n })\n .required()\n .noUnknown()\n);\n\nexport const componentInputSchema = yup\n .object({\n component: componentSchema,\n components: nestedComponentSchema,\n })\n .noUnknown();\n\nexport const validateComponentInput = validateYupSchema(componentInputSchema);\n\nconst updateComponentInputSchema = yup\n .object({\n component: componentSchema,\n components: nestedComponentSchema,\n })\n .noUnknown();\n\nexport const validateUpdateComponentInput = (data: {\n component?: Struct.ComponentSchema;\n components?: Struct.ComponentSchema[];\n}) => {\n if (_.has(data, 'component') && data.component) {\n removeEmptyDefaults(data.component);\n }\n\n if (_.has(data, 'components') && Array.isArray(data.components)) {\n data.components.forEach((data) => {\n if (_.has(data, 'uid')) {\n removeEmptyDefaults(data);\n }\n });\n }\n\n return validateYupSchema(updateComponentInputSchema)(data);\n};\n"],"names":["VALID_RELATIONS","VALID_TYPES","DEFAULT_TYPES","componentSchema","createSchema","modelType","modelTypes","COMPONENT","shape","displayName","yup","string","min","required","icon","nullable","test","isValidIcon","category","isValidCategoryName","noUnknown","nestedComponentSchema","array","of","uid","tmpUID","name","message","attr","_","has","componentInputSchema","object","component","components","validateComponentInput","validateYupSchema","updateComponentInputSchema","validateUpdateComponentInput","data","removeEmptyDefaults","Array","isArray","forEach"],"mappings":"
|
|
1
|
+
{"version":3,"file":"component.js","sources":["../../../../server/src/controllers/validation/component.ts"],"sourcesContent":["import _ from 'lodash';\nimport { yup, validateYupSchema } from '@strapi/utils';\n\nimport type { Struct } from '@strapi/types';\nimport { modelTypes, DEFAULT_TYPES } from '../../services/constants';\nimport { isValidCategoryName, isValidIcon } from './common';\nimport { createSchema } from './model-schema';\nimport { removeEmptyDefaults } from './data-transform';\n\nexport const VALID_RELATIONS = ['oneToOne', 'oneToMany'];\nexport const VALID_TYPES = [...DEFAULT_TYPES, 'component', 'customField'];\n\nexport const componentSchema = createSchema(VALID_TYPES, VALID_RELATIONS, {\n modelType: modelTypes.COMPONENT,\n})\n .shape({\n displayName: yup.string().min(1).required('displayName.required'),\n icon: yup.string().nullable().test(isValidIcon),\n category: yup.string().nullable().test(isValidCategoryName).required('category.required'),\n })\n .required()\n .noUnknown();\n\nexport const nestedComponentSchema = yup.array().of(\n componentSchema\n .shape({\n uid: yup.string(),\n tmpUID: yup.string(),\n })\n .test({\n name: 'mustHaveUIDOrTmpUID',\n message: 'Component must have a uid or a tmpUID',\n test(attr: unknown) {\n if (_.has(attr, 'uid') && _.has(attr, 'tmpUID')) return false;\n if (!_.has(attr, 'uid') && !_.has(attr, 'tmpUID')) return false;\n return true;\n },\n })\n .required()\n .noUnknown()\n);\n\nexport const componentInputSchema = yup\n .object({\n component: componentSchema,\n components: nestedComponentSchema,\n })\n .noUnknown();\n\nexport const validateComponentInput = validateYupSchema(componentInputSchema);\n\nconst updateComponentInputSchema = yup\n .object({\n component: componentSchema,\n components: nestedComponentSchema,\n })\n .noUnknown();\n\nexport const validateUpdateComponentInput = (data: {\n component?: Struct.ComponentSchema;\n components?: Struct.ComponentSchema[];\n}) => {\n if (_.has(data, 'component') && data.component) {\n removeEmptyDefaults(data.component);\n }\n\n if (_.has(data, 'components') && Array.isArray(data.components)) {\n data.components.forEach((data) => {\n if (_.has(data, 'uid')) {\n removeEmptyDefaults(data);\n }\n });\n }\n\n return validateYupSchema(updateComponentInputSchema)(data);\n};\n"],"names":["VALID_RELATIONS","VALID_TYPES","DEFAULT_TYPES","componentSchema","createSchema","modelType","modelTypes","COMPONENT","shape","displayName","yup","string","min","required","icon","nullable","test","isValidIcon","category","isValidCategoryName","noUnknown","nestedComponentSchema","array","of","uid","tmpUID","name","message","attr","_","has","componentInputSchema","object","component","components","validateComponentInput","validateYupSchema","updateComponentInputSchema","validateUpdateComponentInput","data","removeEmptyDefaults","Array","isArray","forEach"],"mappings":"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"}
|
|
@@ -3,6 +3,10 @@
|
|
|
3
3
|
var _ = require('lodash');
|
|
4
4
|
var typeguards = require('../../utils/typeguards.js');
|
|
5
5
|
|
|
6
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
7
|
+
|
|
8
|
+
var ___default = /*#__PURE__*/_interopDefault(_);
|
|
9
|
+
|
|
6
10
|
const removeEmptyDefaults = (data)=>{
|
|
7
11
|
const { attributes } = data || {};
|
|
8
12
|
Object.keys(attributes).forEach((attributeName)=>{
|
|
@@ -13,9 +17,9 @@ const removeEmptyDefaults = (data)=>{
|
|
|
13
17
|
});
|
|
14
18
|
};
|
|
15
19
|
const removeDeletedUIDTargetFields = (data)=>{
|
|
16
|
-
if (
|
|
20
|
+
if (___default.default.has(data, 'attributes')) {
|
|
17
21
|
Object.values(data.attributes).forEach((attribute)=>{
|
|
18
|
-
if (attribute.type === 'uid' && !
|
|
22
|
+
if (attribute.type === 'uid' && !___default.default.isUndefined(attribute.targetField) && !___default.default.has(data.attributes, attribute.targetField)) {
|
|
19
23
|
attribute.targetField = undefined;
|
|
20
24
|
}
|
|
21
25
|
});
|