@strapi/content-type-builder 5.30.0 → 5.30.1
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/FeedbackModal.js.map +1 -1
- package/dist/admin/components/AIChat/FeedbackModal.mjs.map +1 -1
- package/dist/admin/components/AIChat/UploadFigmaModal.js.map +1 -1
- package/dist/admin/components/AIChat/UploadFigmaModal.mjs.map +1 -1
- package/dist/admin/components/AIChat/components/Base64Image.js.map +1 -1
- package/dist/admin/components/AIChat/components/Base64Image.mjs.map +1 -1
- package/dist/admin/components/AIChat/components/Collapsible.js.map +1 -1
- package/dist/admin/components/AIChat/components/Collapsible.mjs.map +1 -1
- package/dist/admin/components/AIChat/components/FullScreenImage.js.map +1 -1
- package/dist/admin/components/AIChat/components/FullScreenImage.mjs.map +1 -1
- package/dist/admin/components/AIChat/components/Messages/Message.js.map +1 -1
- package/dist/admin/components/AIChat/components/Messages/Message.mjs.map +1 -1
- package/dist/admin/components/AIChat/hooks/useAIFetch.js.map +1 -1
- package/dist/admin/components/AIChat/hooks/useAIFetch.mjs.map +1 -1
- package/dist/admin/components/AIChat/hooks/useCodeUpload.js.map +1 -1
- package/dist/admin/components/AIChat/hooks/useCodeUpload.mjs.map +1 -1
- package/dist/admin/components/AIChat/hooks/useFigmaUpload.js.map +1 -1
- package/dist/admin/components/AIChat/hooks/useFigmaUpload.mjs.map +1 -1
- package/dist/admin/components/AIChat/lib/aiClient.js.map +1 -1
- package/dist/admin/components/AIChat/lib/aiClient.mjs.map +1 -1
- package/dist/admin/components/AIChat/lib/constants.js.map +1 -1
- package/dist/admin/components/AIChat/lib/constants.mjs.map +1 -1
- package/dist/admin/components/AIChat/providers/SchemaProvider.js.map +1 -1
- package/dist/admin/components/AIChat/providers/SchemaProvider.mjs.map +1 -1
- package/dist/admin/components/AttributeOptions/AttributeOption.js.map +1 -1
- package/dist/admin/components/AttributeOptions/AttributeOption.mjs.map +1 -1
- package/dist/admin/components/AttributeOptions/AttributeOptions.js.map +1 -1
- package/dist/admin/components/AttributeOptions/AttributeOptions.mjs.map +1 -1
- package/dist/admin/components/AttributeOptions/EmptyAttributes.js.map +1 -1
- package/dist/admin/components/AttributeOptions/EmptyAttributes.mjs.map +1 -1
- package/dist/admin/components/AttributeRow.js.map +1 -1
- package/dist/admin/components/AttributeRow.mjs.map +1 -1
- package/dist/admin/components/ComponentCard/ComponentCard.js.map +1 -1
- package/dist/admin/components/ComponentCard/ComponentCard.mjs.map +1 -1
- package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.js.map +1 -1
- package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.mjs.map +1 -1
- package/dist/admin/components/DataManager/utils/cleanData.js.map +1 -1
- package/dist/admin/components/DataManager/utils/cleanData.mjs.map +1 -1
- package/dist/admin/components/DisplayedType.js.map +1 -1
- package/dist/admin/components/DisplayedType.mjs.map +1 -1
- package/dist/admin/components/DynamicZoneList.js.map +1 -1
- package/dist/admin/components/DynamicZoneList.mjs.map +1 -1
- package/dist/admin/components/Footers.js.map +1 -1
- package/dist/admin/components/Footers.mjs.map +1 -1
- package/dist/admin/components/FormModal/FormModal.js.map +1 -1
- package/dist/admin/components/FormModal/FormModal.mjs.map +1 -1
- package/dist/admin/components/FormModal/attributes/ConditionForm.js.map +1 -1
- package/dist/admin/components/FormModal/attributes/ConditionForm.mjs.map +1 -1
- package/dist/admin/components/FormModal/attributes/advancedForm.js.map +1 -1
- package/dist/admin/components/FormModal/attributes/advancedForm.mjs.map +1 -1
- package/dist/admin/components/FormModal/attributes/baseForm.js.map +1 -1
- package/dist/admin/components/FormModal/attributes/baseForm.mjs.map +1 -1
- package/dist/admin/components/FormModal/component/componentForm.js.map +1 -1
- package/dist/admin/components/FormModal/component/componentForm.mjs.map +1 -1
- package/dist/admin/components/FormModal/forms/utils/createCollectionName.js.map +1 -1
- package/dist/admin/components/FormModal/forms/utils/createCollectionName.mjs.map +1 -1
- package/dist/admin/components/FormModal/utils/createUid.js.map +1 -1
- package/dist/admin/components/FormModal/utils/createUid.mjs.map +1 -1
- package/dist/admin/components/FormModalHeader.js.map +1 -1
- package/dist/admin/components/FormModalHeader.mjs.map +1 -1
- package/dist/admin/components/FormModalSubHeader.js.map +1 -1
- package/dist/admin/components/FormModalSubHeader.mjs.map +1 -1
- package/dist/admin/components/IconPicker/constants.js +3 -0
- package/dist/admin/components/IconPicker/constants.js.map +1 -1
- package/dist/admin/components/IconPicker/constants.mjs +3 -0
- package/dist/admin/components/IconPicker/constants.mjs.map +1 -1
- package/dist/admin/components/List.js.map +1 -1
- package/dist/admin/components/List.mjs.map +1 -1
- package/dist/admin/components/Relation/RelationField/RelationTargetPicker/RelationTargetPicker.js.map +1 -1
- package/dist/admin/components/Relation/RelationField/RelationTargetPicker/RelationTargetPicker.mjs.map +1 -1
- package/dist/admin/components/Relation/RelationNaturePicker/RelationNaturePicker.js.map +1 -1
- package/dist/admin/components/Relation/RelationNaturePicker/RelationNaturePicker.mjs.map +1 -1
- package/dist/admin/components/SelectComponent.js.map +1 -1
- package/dist/admin/components/SelectComponent.mjs.map +1 -1
- package/dist/admin/components/TabForm.js.map +1 -1
- package/dist/admin/components/TabForm.mjs.map +1 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/pages/App/index.js.map +1 -1
- package/dist/admin/pages/App/index.mjs.map +1 -1
- package/dist/admin/pages/ListView/ListView.js.map +1 -1
- package/dist/admin/pages/ListView/ListView.mjs.map +1 -1
- package/dist/admin/utils/conditions.js.map +1 -1
- package/dist/admin/utils/conditions.mjs.map +1 -1
- package/dist/admin/utils/getTrad.js.map +1 -1
- package/dist/admin/utils/getTrad.mjs.map +1 -1
- package/dist/admin/utils/prefixPluginTranslations.js.map +1 -1
- package/dist/admin/utils/prefixPluginTranslations.mjs.map +1 -1
- package/dist/admin/utils/timeFormat.js.map +1 -1
- package/dist/admin/utils/timeFormat.mjs.map +1 -1
- package/dist/server/controllers/validation/common.js.map +1 -1
- package/dist/server/controllers/validation/common.mjs.map +1 -1
- package/dist/server/controllers/validation/content-type.js.map +1 -1
- package/dist/server/controllers/validation/content-type.mjs.map +1 -1
- package/dist/server/controllers/validation/model-schema.js.map +1 -1
- package/dist/server/controllers/validation/model-schema.mjs.map +1 -1
- package/dist/server/controllers/validation/relations.js.map +1 -1
- package/dist/server/controllers/validation/relations.mjs.map +1 -1
- package/dist/server/services/api-handler.js.map +1 -1
- package/dist/server/services/api-handler.mjs.map +1 -1
- package/dist/server/services/component-categories.js.map +1 -1
- package/dist/server/services/component-categories.mjs.map +1 -1
- package/dist/server/services/schema-builder/component-builder.js.map +1 -1
- package/dist/server/services/schema-builder/component-builder.mjs.map +1 -1
- package/dist/server/services/schema-builder/content-type-builder.js.map +1 -1
- package/dist/server/services/schema-builder/content-type-builder.mjs.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-type.mjs","sources":["../../../../server/src/controllers/validation/content-type.ts"],"sourcesContent":["/* eslint-disable no-template-curly-in-string */ // yup templates need to be in this format\n\nimport { flatMap, getOr, has, snakeCase } from 'lodash/fp';\nimport { yup, validateYupSchema } from '@strapi/utils';\n\nimport type { Struct, Internal, UID } from '@strapi/types';\n\nimport { getService } from '../../utils';\nimport { modelTypes, DEFAULT_TYPES, typeKinds } from '../../services/constants';\nimport { createSchema } from './model-schema';\nimport { removeEmptyDefaults, removeDeletedUIDTargetFields } from './data-transform';\nimport { nestedComponentSchema } from './component';\n\n// Input flattens some fields of the \"info\" into the root type\nexport type CreateContentTypeInput = {\n uid?: UID.ContentType;\n contentType?: Partial<Struct.ContentTypeSchema> & Partial<Struct.ContentTypeSchemaInfo>;\n components?: Array<\n Partial<Struct.ComponentSchema> &\n Partial<Struct.SchemaInfo> & { tmpUID?: Internal.UID.Component }\n >;\n singularName: Struct.ContentTypeSchemaInfo['singularName'];\n attributes: Struct.SchemaAttributes & Record<string, any>;\n kind: Struct.ContentTypeKind;\n collectionName?: Struct.CollectionTypeSchema['collectionName'];\n pluralName: Struct.ContentTypeSchemaInfo['pluralName'];\n displayName: Struct.ContentTypeSchemaInfo['displayName'];\n description?: Struct.ContentTypeSchemaInfo['description'];\n options?: Struct.SchemaOptions;\n draftAndPublish?: Struct.SchemaOptions['draftAndPublish'];\n pluginOptions?: Struct.ContentTypeSchema['pluginOptions'];\n config?: object;\n};\n\n/**\n * Allowed relation per type kind\n */\nconst VALID_RELATIONS = {\n [typeKinds.SINGLE_TYPE]: [\n 'oneToOne',\n 'oneToMany',\n 'morphOne',\n 'morphMany',\n 'morphToOne',\n 'morphToMany',\n ],\n [typeKinds.COLLECTION_TYPE]: [\n 'oneToOne',\n 'oneToMany',\n 'manyToOne',\n 'manyToMany',\n 'morphOne',\n 'morphMany',\n 'morphToOne',\n 'morphToMany',\n ],\n} as const;\n\n/**\n * Allowed types\n */\nconst VALID_TYPES = [...DEFAULT_TYPES, 'uid', 'component', 'dynamiczone', 'customField'];\n\n/**\n * Returns a yup schema to validate a content type payload\n */\nconst createContentTypeSchema = (data: CreateContentTypeInput, { isEdition = false } = {}) => {\n const kind: keyof typeof VALID_RELATIONS = getOr(\n typeKinds.COLLECTION_TYPE,\n 'contentType.kind',\n data\n );\n\n const contentTypeSchema = createSchema(VALID_TYPES, VALID_RELATIONS[kind] || [], {\n modelType: modelTypes.CONTENT_TYPE,\n })\n .shape({\n displayName: yup.string().min(1).required(),\n singularName: yup\n .string()\n .min(1)\n .test(nameIsAvailable(isEdition))\n .test(forbiddenContentTypeNameValidator())\n .isKebabCase()\n .required(),\n pluralName: yup\n .string()\n .min(1)\n .test(nameIsAvailable(isEdition))\n .test(nameIsNotExistingCollectionName(isEdition)) // TODO: v5: require singularName to not match a collection name\n .test(forbiddenContentTypeNameValidator())\n .isKebabCase()\n .required(),\n })\n .test(\n 'singularName-not-equal-pluralName',\n '${path}: singularName and pluralName should be different',\n (value) => value.singularName !== value.pluralName\n );\n\n return yup\n .object({\n // FIXME .noUnknown(false) will strip off the unwanted properties without throwing an error\n // Why not having .noUnknown() ? Because we want to be able to add options relatable to EE features\n // without having any reference to them in CE.\n // Why not handle an \"options\" object in the content-type ? The admin panel needs lots of rework\n // to be able to send this options object instead of top-level attributes.\n // @nathan-pichon 20/02/2023\n contentType: contentTypeSchema.required().noUnknown(false),\n components: nestedComponentSchema,\n })\n .noUnknown();\n};\n\n/**\n * Validator for content type creation\n */\nexport const validateContentTypeInput = (data: CreateContentTypeInput) => {\n return validateYupSchema(createContentTypeSchema(data))(data);\n};\n\n/**\n * Validator for content type edition\n */\nexport const validateUpdateContentTypeInput = (data: CreateContentTypeInput) => {\n if (has('contentType', data)) {\n removeEmptyDefaults(data.contentType);\n removeDeletedUIDTargetFields(data.contentType as Struct.ContentTypeSchema);\n }\n\n if (has('components', data) && Array.isArray(data.components)) {\n data.components.forEach((comp) => {\n if (has('uid', comp)) {\n removeEmptyDefaults(comp as Struct.ComponentSchema);\n }\n });\n }\n\n return validateYupSchema(createContentTypeSchema(data, { isEdition: true }))(data);\n};\n\nconst forbiddenContentTypeNameValidator = () => {\n const reservedNames = getService('builder').getReservedNames().models;\n\n return {\n name: 'forbiddenContentTypeName',\n message: `Content Type name cannot be one of ${reservedNames.join(', ')}`,\n test(value: unknown) {\n if (typeof value !== 'string') {\n return true;\n }\n\n return !getService('builder').isReservedModelName(value);\n },\n };\n};\n\nconst nameIsAvailable = (isEdition: boolean) => {\n // TODO TS: if strapi.contentTypes (ie, ContentTypes) works as an ArrayLike and is used like this, we may want to ensure it is typed so that it can be without using as\n const usedNames = flatMap((ct: Struct.ContentTypeSchema) => {\n return [ct.info?.singularName, ct.info?.pluralName];\n })(strapi.contentTypes as any);\n\n return {\n name: 'nameAlreadyUsed',\n message: 'contentType: name `${value}` is already being used by another content type.',\n test(value: unknown) {\n // don't check on edition\n if (isEdition) return true;\n\n // ignore if not a string (will be caught in another validator)\n if (typeof value !== 'string') {\n return true;\n }\n\n // compare snake case to check the actual column names that will be used in the database\n return usedNames.every((usedName) => snakeCase(usedName) !== snakeCase(value));\n },\n };\n};\n\nconst nameIsNotExistingCollectionName = (isEdition: boolean) => {\n const usedNames = Object.keys(strapi.contentTypes).map(\n (key) => strapi.contentTypes[key as Internal.UID.ContentType].collectionName\n ) as string[];\n\n return {\n name: 'nameAlreadyUsed',\n message: 'contentType: name `${value}` is already being used by another content type.',\n test(value: unknown) {\n // don't check on edition\n if (isEdition) return true;\n\n // ignore if not a string (will be caught in another validator)\n if (typeof value !== 'string') {\n return true;\n }\n\n // compare snake case to check the actual column names that will be used in the database\n return usedNames.every((usedName) => snakeCase(usedName) !== snakeCase(value));\n },\n };\n};\n\n/**\n * Validates type kind\n */\nconst kindSchema = yup.string().oneOf([typeKinds.SINGLE_TYPE, typeKinds.COLLECTION_TYPE]);\n\nexport const validateKind = validateYupSchema(kindSchema);\n"],"names":["VALID_RELATIONS","typeKinds","SINGLE_TYPE","COLLECTION_TYPE","VALID_TYPES","DEFAULT_TYPES","createContentTypeSchema","data","isEdition","kind","getOr","contentTypeSchema","createSchema","modelType","modelTypes","CONTENT_TYPE","shape","displayName","yup","string","min","required","singularName","test","nameIsAvailable","forbiddenContentTypeNameValidator","isKebabCase","pluralName","nameIsNotExistingCollectionName","value","object","contentType","noUnknown","components","nestedComponentSchema","validateContentTypeInput","validateYupSchema","validateUpdateContentTypeInput","has","removeEmptyDefaults","removeDeletedUIDTargetFields","Array","isArray","forEach","comp","reservedNames","getService","getReservedNames","models","name","message","join","isReservedModelName","usedNames","flatMap","ct","info","strapi","contentTypes","every","usedName","snakeCase","Object","keys","map","key","collectionName","kindSchema","oneOf","validateKind"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"content-type.mjs","sources":["../../../../server/src/controllers/validation/content-type.ts"],"sourcesContent":["/* eslint-disable no-template-curly-in-string */ // yup templates need to be in this format\n\nimport { flatMap, getOr, has, snakeCase } from 'lodash/fp';\nimport { yup, validateYupSchema } from '@strapi/utils';\n\nimport type { Struct, Internal, UID } from '@strapi/types';\n\nimport { getService } from '../../utils';\nimport { modelTypes, DEFAULT_TYPES, typeKinds } from '../../services/constants';\nimport { createSchema } from './model-schema';\nimport { removeEmptyDefaults, removeDeletedUIDTargetFields } from './data-transform';\nimport { nestedComponentSchema } from './component';\n\n// Input flattens some fields of the \"info\" into the root type\nexport type CreateContentTypeInput = {\n uid?: UID.ContentType;\n contentType?: Partial<Struct.ContentTypeSchema> & Partial<Struct.ContentTypeSchemaInfo>;\n components?: Array<\n Partial<Struct.ComponentSchema> &\n Partial<Struct.SchemaInfo> & { tmpUID?: Internal.UID.Component }\n >;\n singularName: Struct.ContentTypeSchemaInfo['singularName'];\n attributes: Struct.SchemaAttributes & Record<string, any>;\n kind: Struct.ContentTypeKind;\n collectionName?: Struct.CollectionTypeSchema['collectionName'];\n pluralName: Struct.ContentTypeSchemaInfo['pluralName'];\n displayName: Struct.ContentTypeSchemaInfo['displayName'];\n description?: Struct.ContentTypeSchemaInfo['description'];\n options?: Struct.SchemaOptions;\n draftAndPublish?: Struct.SchemaOptions['draftAndPublish'];\n pluginOptions?: Struct.ContentTypeSchema['pluginOptions'];\n config?: object;\n};\n\n/**\n * Allowed relation per type kind\n */\nconst VALID_RELATIONS = {\n [typeKinds.SINGLE_TYPE]: [\n 'oneToOne',\n 'oneToMany',\n 'morphOne',\n 'morphMany',\n 'morphToOne',\n 'morphToMany',\n ],\n [typeKinds.COLLECTION_TYPE]: [\n 'oneToOne',\n 'oneToMany',\n 'manyToOne',\n 'manyToMany',\n 'morphOne',\n 'morphMany',\n 'morphToOne',\n 'morphToMany',\n ],\n} as const;\n\n/**\n * Allowed types\n */\nconst VALID_TYPES = [...DEFAULT_TYPES, 'uid', 'component', 'dynamiczone', 'customField'];\n\n/**\n * Returns a yup schema to validate a content type payload\n */\nconst createContentTypeSchema = (data: CreateContentTypeInput, { isEdition = false } = {}) => {\n const kind: keyof typeof VALID_RELATIONS = getOr(\n typeKinds.COLLECTION_TYPE,\n 'contentType.kind',\n data\n );\n\n const contentTypeSchema = createSchema(VALID_TYPES, VALID_RELATIONS[kind] || [], {\n modelType: modelTypes.CONTENT_TYPE,\n })\n .shape({\n displayName: yup.string().min(1).required(),\n singularName: yup\n .string()\n .min(1)\n .test(nameIsAvailable(isEdition))\n .test(forbiddenContentTypeNameValidator())\n .isKebabCase()\n .required(),\n pluralName: yup\n .string()\n .min(1)\n .test(nameIsAvailable(isEdition))\n .test(nameIsNotExistingCollectionName(isEdition)) // TODO: v5: require singularName to not match a collection name\n .test(forbiddenContentTypeNameValidator())\n .isKebabCase()\n .required(),\n })\n .test(\n 'singularName-not-equal-pluralName',\n '${path}: singularName and pluralName should be different',\n (value) => value.singularName !== value.pluralName\n );\n\n return yup\n .object({\n // FIXME .noUnknown(false) will strip off the unwanted properties without throwing an error\n // Why not having .noUnknown() ? Because we want to be able to add options relatable to EE features\n // without having any reference to them in CE.\n // Why not handle an \"options\" object in the content-type ? The admin panel needs lots of rework\n // to be able to send this options object instead of top-level attributes.\n // @nathan-pichon 20/02/2023\n contentType: contentTypeSchema.required().noUnknown(false),\n components: nestedComponentSchema,\n })\n .noUnknown();\n};\n\n/**\n * Validator for content type creation\n */\nexport const validateContentTypeInput = (data: CreateContentTypeInput) => {\n return validateYupSchema(createContentTypeSchema(data))(data);\n};\n\n/**\n * Validator for content type edition\n */\nexport const validateUpdateContentTypeInput = (data: CreateContentTypeInput) => {\n if (has('contentType', data)) {\n removeEmptyDefaults(data.contentType);\n removeDeletedUIDTargetFields(data.contentType as Struct.ContentTypeSchema);\n }\n\n if (has('components', data) && Array.isArray(data.components)) {\n data.components.forEach((comp) => {\n if (has('uid', comp)) {\n removeEmptyDefaults(comp as Struct.ComponentSchema);\n }\n });\n }\n\n return validateYupSchema(createContentTypeSchema(data, { isEdition: true }))(data);\n};\n\nconst forbiddenContentTypeNameValidator = () => {\n const reservedNames = getService('builder').getReservedNames().models;\n\n return {\n name: 'forbiddenContentTypeName',\n message: `Content Type name cannot be one of ${reservedNames.join(', ')}`,\n test(value: unknown) {\n if (typeof value !== 'string') {\n return true;\n }\n\n return !getService('builder').isReservedModelName(value);\n },\n };\n};\n\nconst nameIsAvailable = (isEdition: boolean) => {\n // TODO TS: if strapi.contentTypes (ie, ContentTypes) works as an ArrayLike and is used like this, we may want to ensure it is typed so that it can be without using as\n const usedNames = flatMap((ct: Struct.ContentTypeSchema) => {\n return [ct.info?.singularName, ct.info?.pluralName];\n })(strapi.contentTypes as any);\n\n return {\n name: 'nameAlreadyUsed',\n message: 'contentType: name `${value}` is already being used by another content type.',\n test(value: unknown) {\n // don't check on edition\n if (isEdition) return true;\n\n // ignore if not a string (will be caught in another validator)\n if (typeof value !== 'string') {\n return true;\n }\n\n // compare snake case to check the actual column names that will be used in the database\n return usedNames.every((usedName) => snakeCase(usedName) !== snakeCase(value));\n },\n };\n};\n\nconst nameIsNotExistingCollectionName = (isEdition: boolean) => {\n const usedNames = Object.keys(strapi.contentTypes).map(\n (key) => strapi.contentTypes[key as Internal.UID.ContentType].collectionName\n ) as string[];\n\n return {\n name: 'nameAlreadyUsed',\n message: 'contentType: name `${value}` is already being used by another content type.',\n test(value: unknown) {\n // don't check on edition\n if (isEdition) return true;\n\n // ignore if not a string (will be caught in another validator)\n if (typeof value !== 'string') {\n return true;\n }\n\n // compare snake case to check the actual column names that will be used in the database\n return usedNames.every((usedName) => snakeCase(usedName) !== snakeCase(value));\n },\n };\n};\n\n/**\n * Validates type kind\n */\nconst kindSchema = yup.string().oneOf([typeKinds.SINGLE_TYPE, typeKinds.COLLECTION_TYPE]);\n\nexport const validateKind = validateYupSchema(kindSchema);\n"],"names":["VALID_RELATIONS","typeKinds","SINGLE_TYPE","COLLECTION_TYPE","VALID_TYPES","DEFAULT_TYPES","createContentTypeSchema","data","isEdition","kind","getOr","contentTypeSchema","createSchema","modelType","modelTypes","CONTENT_TYPE","shape","displayName","yup","string","min","required","singularName","test","nameIsAvailable","forbiddenContentTypeNameValidator","isKebabCase","pluralName","nameIsNotExistingCollectionName","value","object","contentType","noUnknown","components","nestedComponentSchema","validateContentTypeInput","validateYupSchema","validateUpdateContentTypeInput","has","removeEmptyDefaults","removeDeletedUIDTargetFields","Array","isArray","forEach","comp","reservedNames","getService","getReservedNames","models","name","message","join","isReservedModelName","usedNames","flatMap","ct","info","strapi","contentTypes","every","usedName","snakeCase","Object","keys","map","key","collectionName","kindSchema","oneOf","validateKind"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-schema.js","sources":["../../../../server/src/controllers/validation/model-schema.ts"],"sourcesContent":["import { yup } from '@strapi/utils';\nimport _ from 'lodash';\nimport { snakeCase } from 'lodash/fp';\nimport { modelTypes, typeKinds } from '../../services/constants';\nimport { getService } from '../../utils';\nimport { isValidKey, isValidCollectionName } from './common';\nimport { getTypeValidator } from './types';\nimport { getRelationValidator } from './relations';\n\ntype ModelTypeInput = (typeof modelTypes)[keyof typeof modelTypes];\n\ntype CreateAttributesInput = {\n types: ReadonlyArray<string>;\n relations: ReadonlyArray<string>;\n modelType?: ModelTypeInput;\n};\n\nexport const createSchema = (\n types: CreateAttributesInput['types'],\n relations: CreateAttributesInput['relations'],\n { modelType }: { modelType?: ModelTypeInput } = {}\n) => {\n const shape = {\n description: yup.string(),\n options: yup.object(),\n pluginOptions: yup.object(),\n collectionName: yup.string().nullable().test(isValidCollectionName),\n attributes: createAttributesValidator({ types, relations, modelType }),\n draftAndPublish: yup.boolean(),\n } as any;\n\n if (modelType === modelTypes.CONTENT_TYPE) {\n shape.kind = yup.string().oneOf([typeKinds.SINGLE_TYPE, typeKinds.COLLECTION_TYPE]).nullable();\n }\n\n return yup.object(shape).noUnknown();\n};\n\nconst createAttributesValidator = ({ types, modelType, relations }: CreateAttributesInput) => {\n return yup.lazy((attributes) => {\n return yup\n .object()\n .shape(\n _.mapValues(attributes, (attribute, key) => {\n if (isForbiddenKey(key)) {\n return forbiddenValidator();\n }\n\n if (isConflictingKey(key, attributes)) {\n return conflictingKeysValidator(key);\n }\n\n if (attribute.type === 'relation') {\n return getRelationValidator(attribute, relations).test(isValidKey(key));\n }\n\n if (_.has(attribute, 'type')) {\n return getTypeValidator(attribute, { types, modelType, attributes }).test(\n isValidKey(key)\n );\n }\n\n return typeOrRelationValidator;\n })\n )\n .required('attributes.required');\n });\n};\n\nconst isConflictingKey = (key: string, attributes: Record<string, any>) => {\n const snakeCaseKey = snakeCase(key);\n\n return Object.keys(attributes).some((existingKey) => {\n if (existingKey === key) return false; // don't compare against itself\n return snakeCase(existingKey) === snakeCaseKey;\n });\n};\n\nconst isForbiddenKey = (key: string) => {\n return getService('builder').isReservedAttributeName(key);\n};\n\nconst forbiddenValidator = () => {\n const reservedNames = [...getService('builder').getReservedNames().attributes];\n\n return yup.mixed().test({\n name: 'forbiddenKeys',\n message: `Attribute keys cannot be one of ${reservedNames.join(', ')}`,\n test: () => false,\n });\n};\n\nconst conflictingKeysValidator = (key: string) => {\n return yup.mixed().test({\n name: 'conflictingKeys',\n message: `Attribute ${key} conflicts with an existing key`,\n test: () => false,\n });\n};\n\nconst typeOrRelationValidator = yup.object().test({\n name: 'mustHaveTypeOrTarget',\n message: 'Attribute must have either a type or a target',\n test: () => false,\n});\n"],"names":["createSchema","types","relations","modelType","shape","description","yup","string","options","object","pluginOptions","collectionName","nullable","test","isValidCollectionName","attributes","createAttributesValidator","draftAndPublish","boolean","modelTypes","CONTENT_TYPE","kind","oneOf","typeKinds","SINGLE_TYPE","COLLECTION_TYPE","noUnknown","lazy","_","mapValues","attribute","key","isForbiddenKey","forbiddenValidator","isConflictingKey","conflictingKeysValidator","type","getRelationValidator","isValidKey","has","getTypeValidator","typeOrRelationValidator","required","snakeCaseKey","snakeCase","Object","keys","some","existingKey","getService","isReservedAttributeName","reservedNames","getReservedNames","mixed","name","message","join"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"model-schema.js","sources":["../../../../server/src/controllers/validation/model-schema.ts"],"sourcesContent":["import { yup } from '@strapi/utils';\nimport _ from 'lodash';\nimport { snakeCase } from 'lodash/fp';\nimport { modelTypes, typeKinds } from '../../services/constants';\nimport { getService } from '../../utils';\nimport { isValidKey, isValidCollectionName } from './common';\nimport { getTypeValidator } from './types';\nimport { getRelationValidator } from './relations';\n\ntype ModelTypeInput = (typeof modelTypes)[keyof typeof modelTypes];\n\ntype CreateAttributesInput = {\n types: ReadonlyArray<string>;\n relations: ReadonlyArray<string>;\n modelType?: ModelTypeInput;\n};\n\nexport const createSchema = (\n types: CreateAttributesInput['types'],\n relations: CreateAttributesInput['relations'],\n { modelType }: { modelType?: ModelTypeInput } = {}\n) => {\n const shape = {\n description: yup.string(),\n options: yup.object(),\n pluginOptions: yup.object(),\n collectionName: yup.string().nullable().test(isValidCollectionName),\n attributes: createAttributesValidator({ types, relations, modelType }),\n draftAndPublish: yup.boolean(),\n } as any;\n\n if (modelType === modelTypes.CONTENT_TYPE) {\n shape.kind = yup.string().oneOf([typeKinds.SINGLE_TYPE, typeKinds.COLLECTION_TYPE]).nullable();\n }\n\n return yup.object(shape).noUnknown();\n};\n\nconst createAttributesValidator = ({ types, modelType, relations }: CreateAttributesInput) => {\n return yup.lazy((attributes) => {\n return yup\n .object()\n .shape(\n _.mapValues(attributes, (attribute, key) => {\n if (isForbiddenKey(key)) {\n return forbiddenValidator();\n }\n\n if (isConflictingKey(key, attributes)) {\n return conflictingKeysValidator(key);\n }\n\n if (attribute.type === 'relation') {\n return getRelationValidator(attribute, relations).test(isValidKey(key));\n }\n\n if (_.has(attribute, 'type')) {\n return getTypeValidator(attribute, { types, modelType, attributes }).test(\n isValidKey(key)\n );\n }\n\n return typeOrRelationValidator;\n })\n )\n .required('attributes.required');\n });\n};\n\nconst isConflictingKey = (key: string, attributes: Record<string, any>) => {\n const snakeCaseKey = snakeCase(key);\n\n return Object.keys(attributes).some((existingKey) => {\n if (existingKey === key) return false; // don't compare against itself\n return snakeCase(existingKey) === snakeCaseKey;\n });\n};\n\nconst isForbiddenKey = (key: string) => {\n return getService('builder').isReservedAttributeName(key);\n};\n\nconst forbiddenValidator = () => {\n const reservedNames = [...getService('builder').getReservedNames().attributes];\n\n return yup.mixed().test({\n name: 'forbiddenKeys',\n message: `Attribute keys cannot be one of ${reservedNames.join(', ')}`,\n test: () => false,\n });\n};\n\nconst conflictingKeysValidator = (key: string) => {\n return yup.mixed().test({\n name: 'conflictingKeys',\n message: `Attribute ${key} conflicts with an existing key`,\n test: () => false,\n });\n};\n\nconst typeOrRelationValidator = yup.object().test({\n name: 'mustHaveTypeOrTarget',\n message: 'Attribute must have either a type or a target',\n test: () => false,\n});\n"],"names":["createSchema","types","relations","modelType","shape","description","yup","string","options","object","pluginOptions","collectionName","nullable","test","isValidCollectionName","attributes","createAttributesValidator","draftAndPublish","boolean","modelTypes","CONTENT_TYPE","kind","oneOf","typeKinds","SINGLE_TYPE","COLLECTION_TYPE","noUnknown","lazy","_","mapValues","attribute","key","isForbiddenKey","forbiddenValidator","isConflictingKey","conflictingKeysValidator","type","getRelationValidator","isValidKey","has","getTypeValidator","typeOrRelationValidator","required","snakeCaseKey","snakeCase","Object","keys","some","existingKey","getService","isReservedAttributeName","reservedNames","getReservedNames","mixed","name","message","join"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-schema.mjs","sources":["../../../../server/src/controllers/validation/model-schema.ts"],"sourcesContent":["import { yup } from '@strapi/utils';\nimport _ from 'lodash';\nimport { snakeCase } from 'lodash/fp';\nimport { modelTypes, typeKinds } from '../../services/constants';\nimport { getService } from '../../utils';\nimport { isValidKey, isValidCollectionName } from './common';\nimport { getTypeValidator } from './types';\nimport { getRelationValidator } from './relations';\n\ntype ModelTypeInput = (typeof modelTypes)[keyof typeof modelTypes];\n\ntype CreateAttributesInput = {\n types: ReadonlyArray<string>;\n relations: ReadonlyArray<string>;\n modelType?: ModelTypeInput;\n};\n\nexport const createSchema = (\n types: CreateAttributesInput['types'],\n relations: CreateAttributesInput['relations'],\n { modelType }: { modelType?: ModelTypeInput } = {}\n) => {\n const shape = {\n description: yup.string(),\n options: yup.object(),\n pluginOptions: yup.object(),\n collectionName: yup.string().nullable().test(isValidCollectionName),\n attributes: createAttributesValidator({ types, relations, modelType }),\n draftAndPublish: yup.boolean(),\n } as any;\n\n if (modelType === modelTypes.CONTENT_TYPE) {\n shape.kind = yup.string().oneOf([typeKinds.SINGLE_TYPE, typeKinds.COLLECTION_TYPE]).nullable();\n }\n\n return yup.object(shape).noUnknown();\n};\n\nconst createAttributesValidator = ({ types, modelType, relations }: CreateAttributesInput) => {\n return yup.lazy((attributes) => {\n return yup\n .object()\n .shape(\n _.mapValues(attributes, (attribute, key) => {\n if (isForbiddenKey(key)) {\n return forbiddenValidator();\n }\n\n if (isConflictingKey(key, attributes)) {\n return conflictingKeysValidator(key);\n }\n\n if (attribute.type === 'relation') {\n return getRelationValidator(attribute, relations).test(isValidKey(key));\n }\n\n if (_.has(attribute, 'type')) {\n return getTypeValidator(attribute, { types, modelType, attributes }).test(\n isValidKey(key)\n );\n }\n\n return typeOrRelationValidator;\n })\n )\n .required('attributes.required');\n });\n};\n\nconst isConflictingKey = (key: string, attributes: Record<string, any>) => {\n const snakeCaseKey = snakeCase(key);\n\n return Object.keys(attributes).some((existingKey) => {\n if (existingKey === key) return false; // don't compare against itself\n return snakeCase(existingKey) === snakeCaseKey;\n });\n};\n\nconst isForbiddenKey = (key: string) => {\n return getService('builder').isReservedAttributeName(key);\n};\n\nconst forbiddenValidator = () => {\n const reservedNames = [...getService('builder').getReservedNames().attributes];\n\n return yup.mixed().test({\n name: 'forbiddenKeys',\n message: `Attribute keys cannot be one of ${reservedNames.join(', ')}`,\n test: () => false,\n });\n};\n\nconst conflictingKeysValidator = (key: string) => {\n return yup.mixed().test({\n name: 'conflictingKeys',\n message: `Attribute ${key} conflicts with an existing key`,\n test: () => false,\n });\n};\n\nconst typeOrRelationValidator = yup.object().test({\n name: 'mustHaveTypeOrTarget',\n message: 'Attribute must have either a type or a target',\n test: () => false,\n});\n"],"names":["createSchema","types","relations","modelType","shape","description","yup","string","options","object","pluginOptions","collectionName","nullable","test","isValidCollectionName","attributes","createAttributesValidator","draftAndPublish","boolean","modelTypes","CONTENT_TYPE","kind","oneOf","typeKinds","SINGLE_TYPE","COLLECTION_TYPE","noUnknown","lazy","_","mapValues","attribute","key","isForbiddenKey","forbiddenValidator","isConflictingKey","conflictingKeysValidator","type","getRelationValidator","isValidKey","has","getTypeValidator","typeOrRelationValidator","required","snakeCaseKey","snakeCase","Object","keys","some","existingKey","getService","isReservedAttributeName","reservedNames","getReservedNames","mixed","name","message","join"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"model-schema.mjs","sources":["../../../../server/src/controllers/validation/model-schema.ts"],"sourcesContent":["import { yup } from '@strapi/utils';\nimport _ from 'lodash';\nimport { snakeCase } from 'lodash/fp';\nimport { modelTypes, typeKinds } from '../../services/constants';\nimport { getService } from '../../utils';\nimport { isValidKey, isValidCollectionName } from './common';\nimport { getTypeValidator } from './types';\nimport { getRelationValidator } from './relations';\n\ntype ModelTypeInput = (typeof modelTypes)[keyof typeof modelTypes];\n\ntype CreateAttributesInput = {\n types: ReadonlyArray<string>;\n relations: ReadonlyArray<string>;\n modelType?: ModelTypeInput;\n};\n\nexport const createSchema = (\n types: CreateAttributesInput['types'],\n relations: CreateAttributesInput['relations'],\n { modelType }: { modelType?: ModelTypeInput } = {}\n) => {\n const shape = {\n description: yup.string(),\n options: yup.object(),\n pluginOptions: yup.object(),\n collectionName: yup.string().nullable().test(isValidCollectionName),\n attributes: createAttributesValidator({ types, relations, modelType }),\n draftAndPublish: yup.boolean(),\n } as any;\n\n if (modelType === modelTypes.CONTENT_TYPE) {\n shape.kind = yup.string().oneOf([typeKinds.SINGLE_TYPE, typeKinds.COLLECTION_TYPE]).nullable();\n }\n\n return yup.object(shape).noUnknown();\n};\n\nconst createAttributesValidator = ({ types, modelType, relations }: CreateAttributesInput) => {\n return yup.lazy((attributes) => {\n return yup\n .object()\n .shape(\n _.mapValues(attributes, (attribute, key) => {\n if (isForbiddenKey(key)) {\n return forbiddenValidator();\n }\n\n if (isConflictingKey(key, attributes)) {\n return conflictingKeysValidator(key);\n }\n\n if (attribute.type === 'relation') {\n return getRelationValidator(attribute, relations).test(isValidKey(key));\n }\n\n if (_.has(attribute, 'type')) {\n return getTypeValidator(attribute, { types, modelType, attributes }).test(\n isValidKey(key)\n );\n }\n\n return typeOrRelationValidator;\n })\n )\n .required('attributes.required');\n });\n};\n\nconst isConflictingKey = (key: string, attributes: Record<string, any>) => {\n const snakeCaseKey = snakeCase(key);\n\n return Object.keys(attributes).some((existingKey) => {\n if (existingKey === key) return false; // don't compare against itself\n return snakeCase(existingKey) === snakeCaseKey;\n });\n};\n\nconst isForbiddenKey = (key: string) => {\n return getService('builder').isReservedAttributeName(key);\n};\n\nconst forbiddenValidator = () => {\n const reservedNames = [...getService('builder').getReservedNames().attributes];\n\n return yup.mixed().test({\n name: 'forbiddenKeys',\n message: `Attribute keys cannot be one of ${reservedNames.join(', ')}`,\n test: () => false,\n });\n};\n\nconst conflictingKeysValidator = (key: string) => {\n return yup.mixed().test({\n name: 'conflictingKeys',\n message: `Attribute ${key} conflicts with an existing key`,\n test: () => false,\n });\n};\n\nconst typeOrRelationValidator = yup.object().test({\n name: 'mustHaveTypeOrTarget',\n message: 'Attribute must have either a type or a target',\n test: () => false,\n});\n"],"names":["createSchema","types","relations","modelType","shape","description","yup","string","options","object","pluginOptions","collectionName","nullable","test","isValidCollectionName","attributes","createAttributesValidator","draftAndPublish","boolean","modelTypes","CONTENT_TYPE","kind","oneOf","typeKinds","SINGLE_TYPE","COLLECTION_TYPE","noUnknown","lazy","_","mapValues","attribute","key","isForbiddenKey","forbiddenValidator","isConflictingKey","conflictingKeysValidator","type","getRelationValidator","isValidKey","has","getTypeValidator","typeOrRelationValidator","required","snakeCaseKey","snakeCase","Object","keys","some","existingKey","getService","isReservedAttributeName","reservedNames","getReservedNames","mixed","name","message","join"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relations.js","sources":["../../../../server/src/controllers/validation/relations.ts"],"sourcesContent":["import { isUndefined } from 'lodash/fp';\nimport { yup } from '@strapi/utils';\nimport type { TestContext, TestFunction } from 'yup';\nimport type { Schema, UID } from '@strapi/types';\nimport { typeKinds, coreUids } from '../../services/constants';\nimport { isValidName } from './common';\n\nconst STRAPI_USER_RELATIONS = ['oneToOne', 'oneToMany'];\n\nconst isValidRelation = (validNatures: ReadonlyArray<string>): TestFunction<string | undefined> =>\n function (this: TestContext, value) {\n // NOTE: In case of an undefined value, delegate the check to .required()\n if (value === undefined) {\n return true;\n }\n\n if (this.parent.target === coreUids.STRAPI_USER) {\n if (!validNatures.includes(value) || !isUndefined(this.parent.targetAttribute)) {\n return this.createError({\n path: this.path,\n message: `must be one of the following values: ${STRAPI_USER_RELATIONS.join(', ')}`,\n });\n }\n }\n\n return validNatures.includes(value)\n ? true\n : this.createError({\n path: this.path,\n message: `must be one of the following values: ${validNatures.join(', ')}`,\n });\n };\n\nexport const getRelationValidator = (\n attribute: Schema.Attribute.Relation,\n allowedRelations: ReadonlyArray<string>\n) => {\n const contentTypesUIDs = Object.keys(strapi.contentTypes)\n .filter((key) => strapi.contentTypes[key as UID.ContentType].kind === typeKinds.COLLECTION_TYPE)\n .filter((key) => !key.startsWith(coreUids.PREFIX) || key === coreUids.STRAPI_USER)\n .concat(['__self__', '__contentType__']);\n\n const base = {\n type: yup.string().oneOf(['relation']).required(),\n relation: yup.string().test('isValidRelation', isValidRelation(allowedRelations)).required(),\n configurable: yup.boolean().nullable(),\n private: yup.boolean().nullable(),\n pluginOptions: yup.object(),\n };\n\n switch (attribute.relation) {\n case 'oneToOne':\n case 'oneToMany':\n case 'manyToOne':\n case 'manyToMany':\n case 'morphOne':\n case 'morphMany': {\n return yup.object({\n ...base,\n target: yup.string().oneOf(contentTypesUIDs).required(),\n targetAttribute: yup.string().test(isValidName).nullable(),\n });\n }\n case 'morphToOne':\n case 'morphToMany':\n default: {\n return yup.object({ ...base });\n }\n }\n};\n"],"names":["STRAPI_USER_RELATIONS","isValidRelation","validNatures","value","undefined","parent","target","coreUids","STRAPI_USER","includes","isUndefined","targetAttribute","createError","path","message","join","getRelationValidator","attribute","allowedRelations","contentTypesUIDs","Object","keys","strapi","contentTypes","filter","key","kind","typeKinds","COLLECTION_TYPE","startsWith","PREFIX","concat","base","type","yup","string","oneOf","required","relation","test","configurable","boolean","nullable","private","pluginOptions","object","isValidName"],"mappings":";;;;;;;AAOA,MAAMA,qBAAwB,GAAA;AAAC,IAAA,UAAA;AAAY,IAAA;AAAY,CAAA;AAEvD,MAAMC,eAAkB,GAAA,CAACC,YACvB,GAAA,SAA6BC,KAAK,EAAA;;AAEhC,QAAA,IAAIA,UAAUC,SAAW,EAAA;YACvB,OAAO,IAAA;AACT;QAEA,IAAI,IAAI,CAACC,MAAM,CAACC,MAAM,KAAKC,kBAAAA,CAASC,WAAW,EAAE;AAC/C,YAAA,IAAI,CAACN,YAAAA,CAAaO,QAAQ,CAACN,KAAU,CAAA,IAAA,CAACO,cAAY,CAAA,IAAI,CAACL,MAAM,CAACM,eAAe,CAAG,EAAA;gBAC9E,OAAO,IAAI,CAACC,WAAW,CAAC;oBACtBC,IAAM,EAAA,IAAI,CAACA,IAAI;AACfC,oBAAAA,OAAAA,EAAS,CAAC,qCAAqC,EAAEd,
|
|
1
|
+
{"version":3,"file":"relations.js","sources":["../../../../server/src/controllers/validation/relations.ts"],"sourcesContent":["import { isUndefined } from 'lodash/fp';\nimport { yup } from '@strapi/utils';\nimport type { TestContext, TestFunction } from 'yup';\nimport type { Schema, UID } from '@strapi/types';\nimport { typeKinds, coreUids } from '../../services/constants';\nimport { isValidName } from './common';\n\nconst STRAPI_USER_RELATIONS = ['oneToOne', 'oneToMany'];\n\nconst isValidRelation = (validNatures: ReadonlyArray<string>): TestFunction<string | undefined> =>\n function (this: TestContext, value) {\n // NOTE: In case of an undefined value, delegate the check to .required()\n if (value === undefined) {\n return true;\n }\n\n if (this.parent.target === coreUids.STRAPI_USER) {\n if (!validNatures.includes(value) || !isUndefined(this.parent.targetAttribute)) {\n return this.createError({\n path: this.path,\n message: `must be one of the following values: ${STRAPI_USER_RELATIONS.join(', ')}`,\n });\n }\n }\n\n return validNatures.includes(value)\n ? true\n : this.createError({\n path: this.path,\n message: `must be one of the following values: ${validNatures.join(', ')}`,\n });\n };\n\nexport const getRelationValidator = (\n attribute: Schema.Attribute.Relation,\n allowedRelations: ReadonlyArray<string>\n) => {\n const contentTypesUIDs = Object.keys(strapi.contentTypes)\n .filter((key) => strapi.contentTypes[key as UID.ContentType].kind === typeKinds.COLLECTION_TYPE)\n .filter((key) => !key.startsWith(coreUids.PREFIX) || key === coreUids.STRAPI_USER)\n .concat(['__self__', '__contentType__']);\n\n const base = {\n type: yup.string().oneOf(['relation']).required(),\n relation: yup.string().test('isValidRelation', isValidRelation(allowedRelations)).required(),\n configurable: yup.boolean().nullable(),\n private: yup.boolean().nullable(),\n pluginOptions: yup.object(),\n };\n\n switch (attribute.relation) {\n case 'oneToOne':\n case 'oneToMany':\n case 'manyToOne':\n case 'manyToMany':\n case 'morphOne':\n case 'morphMany': {\n return yup.object({\n ...base,\n target: yup.string().oneOf(contentTypesUIDs).required(),\n targetAttribute: yup.string().test(isValidName).nullable(),\n });\n }\n case 'morphToOne':\n case 'morphToMany':\n default: {\n return yup.object({ ...base });\n }\n }\n};\n"],"names":["STRAPI_USER_RELATIONS","isValidRelation","validNatures","value","undefined","parent","target","coreUids","STRAPI_USER","includes","isUndefined","targetAttribute","createError","path","message","join","getRelationValidator","attribute","allowedRelations","contentTypesUIDs","Object","keys","strapi","contentTypes","filter","key","kind","typeKinds","COLLECTION_TYPE","startsWith","PREFIX","concat","base","type","yup","string","oneOf","required","relation","test","configurable","boolean","nullable","private","pluginOptions","object","isValidName"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relations.mjs","sources":["../../../../server/src/controllers/validation/relations.ts"],"sourcesContent":["import { isUndefined } from 'lodash/fp';\nimport { yup } from '@strapi/utils';\nimport type { TestContext, TestFunction } from 'yup';\nimport type { Schema, UID } from '@strapi/types';\nimport { typeKinds, coreUids } from '../../services/constants';\nimport { isValidName } from './common';\n\nconst STRAPI_USER_RELATIONS = ['oneToOne', 'oneToMany'];\n\nconst isValidRelation = (validNatures: ReadonlyArray<string>): TestFunction<string | undefined> =>\n function (this: TestContext, value) {\n // NOTE: In case of an undefined value, delegate the check to .required()\n if (value === undefined) {\n return true;\n }\n\n if (this.parent.target === coreUids.STRAPI_USER) {\n if (!validNatures.includes(value) || !isUndefined(this.parent.targetAttribute)) {\n return this.createError({\n path: this.path,\n message: `must be one of the following values: ${STRAPI_USER_RELATIONS.join(', ')}`,\n });\n }\n }\n\n return validNatures.includes(value)\n ? true\n : this.createError({\n path: this.path,\n message: `must be one of the following values: ${validNatures.join(', ')}`,\n });\n };\n\nexport const getRelationValidator = (\n attribute: Schema.Attribute.Relation,\n allowedRelations: ReadonlyArray<string>\n) => {\n const contentTypesUIDs = Object.keys(strapi.contentTypes)\n .filter((key) => strapi.contentTypes[key as UID.ContentType].kind === typeKinds.COLLECTION_TYPE)\n .filter((key) => !key.startsWith(coreUids.PREFIX) || key === coreUids.STRAPI_USER)\n .concat(['__self__', '__contentType__']);\n\n const base = {\n type: yup.string().oneOf(['relation']).required(),\n relation: yup.string().test('isValidRelation', isValidRelation(allowedRelations)).required(),\n configurable: yup.boolean().nullable(),\n private: yup.boolean().nullable(),\n pluginOptions: yup.object(),\n };\n\n switch (attribute.relation) {\n case 'oneToOne':\n case 'oneToMany':\n case 'manyToOne':\n case 'manyToMany':\n case 'morphOne':\n case 'morphMany': {\n return yup.object({\n ...base,\n target: yup.string().oneOf(contentTypesUIDs).required(),\n targetAttribute: yup.string().test(isValidName).nullable(),\n });\n }\n case 'morphToOne':\n case 'morphToMany':\n default: {\n return yup.object({ ...base });\n }\n }\n};\n"],"names":["STRAPI_USER_RELATIONS","isValidRelation","validNatures","value","undefined","parent","target","coreUids","STRAPI_USER","includes","isUndefined","targetAttribute","createError","path","message","join","getRelationValidator","attribute","allowedRelations","contentTypesUIDs","Object","keys","strapi","contentTypes","filter","key","kind","typeKinds","COLLECTION_TYPE","startsWith","PREFIX","concat","base","type","yup","string","oneOf","required","relation","test","configurable","boolean","nullable","private","pluginOptions","object","isValidName"],"mappings":";;;;;AAOA,MAAMA,qBAAwB,GAAA;AAAC,IAAA,UAAA;AAAY,IAAA;AAAY,CAAA;AAEvD,MAAMC,eAAkB,GAAA,CAACC,YACvB,GAAA,SAA6BC,KAAK,EAAA;;AAEhC,QAAA,IAAIA,UAAUC,SAAW,EAAA;YACvB,OAAO,IAAA;AACT;QAEA,IAAI,IAAI,CAACC,MAAM,CAACC,MAAM,KAAKC,QAAAA,CAASC,WAAW,EAAE;AAC/C,YAAA,IAAI,CAACN,YAAAA,CAAaO,QAAQ,CAACN,KAAU,CAAA,IAAA,CAACO,WAAY,CAAA,IAAI,CAACL,MAAM,CAACM,eAAe,CAAG,EAAA;gBAC9E,OAAO,IAAI,CAACC,WAAW,CAAC;oBACtBC,IAAM,EAAA,IAAI,CAACA,IAAI;AACfC,oBAAAA,OAAAA,EAAS,CAAC,qCAAqC,EAAEd,
|
|
1
|
+
{"version":3,"file":"relations.mjs","sources":["../../../../server/src/controllers/validation/relations.ts"],"sourcesContent":["import { isUndefined } from 'lodash/fp';\nimport { yup } from '@strapi/utils';\nimport type { TestContext, TestFunction } from 'yup';\nimport type { Schema, UID } from '@strapi/types';\nimport { typeKinds, coreUids } from '../../services/constants';\nimport { isValidName } from './common';\n\nconst STRAPI_USER_RELATIONS = ['oneToOne', 'oneToMany'];\n\nconst isValidRelation = (validNatures: ReadonlyArray<string>): TestFunction<string | undefined> =>\n function (this: TestContext, value) {\n // NOTE: In case of an undefined value, delegate the check to .required()\n if (value === undefined) {\n return true;\n }\n\n if (this.parent.target === coreUids.STRAPI_USER) {\n if (!validNatures.includes(value) || !isUndefined(this.parent.targetAttribute)) {\n return this.createError({\n path: this.path,\n message: `must be one of the following values: ${STRAPI_USER_RELATIONS.join(', ')}`,\n });\n }\n }\n\n return validNatures.includes(value)\n ? true\n : this.createError({\n path: this.path,\n message: `must be one of the following values: ${validNatures.join(', ')}`,\n });\n };\n\nexport const getRelationValidator = (\n attribute: Schema.Attribute.Relation,\n allowedRelations: ReadonlyArray<string>\n) => {\n const contentTypesUIDs = Object.keys(strapi.contentTypes)\n .filter((key) => strapi.contentTypes[key as UID.ContentType].kind === typeKinds.COLLECTION_TYPE)\n .filter((key) => !key.startsWith(coreUids.PREFIX) || key === coreUids.STRAPI_USER)\n .concat(['__self__', '__contentType__']);\n\n const base = {\n type: yup.string().oneOf(['relation']).required(),\n relation: yup.string().test('isValidRelation', isValidRelation(allowedRelations)).required(),\n configurable: yup.boolean().nullable(),\n private: yup.boolean().nullable(),\n pluginOptions: yup.object(),\n };\n\n switch (attribute.relation) {\n case 'oneToOne':\n case 'oneToMany':\n case 'manyToOne':\n case 'manyToMany':\n case 'morphOne':\n case 'morphMany': {\n return yup.object({\n ...base,\n target: yup.string().oneOf(contentTypesUIDs).required(),\n targetAttribute: yup.string().test(isValidName).nullable(),\n });\n }\n case 'morphToOne':\n case 'morphToMany':\n default: {\n return yup.object({ ...base });\n }\n }\n};\n"],"names":["STRAPI_USER_RELATIONS","isValidRelation","validNatures","value","undefined","parent","target","coreUids","STRAPI_USER","includes","isUndefined","targetAttribute","createError","path","message","join","getRelationValidator","attribute","allowedRelations","contentTypesUIDs","Object","keys","strapi","contentTypes","filter","key","kind","typeKinds","COLLECTION_TYPE","startsWith","PREFIX","concat","base","type","yup","string","oneOf","required","relation","test","configurable","boolean","nullable","private","pluginOptions","object","isValidName"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-handler.js","sources":["../../../server/src/services/api-handler.ts"],"sourcesContent":["import * as path from 'path';\nimport * as fse from 'fs-extra';\nimport type { Internal } from '@strapi/types';\n\n/**\n * Deletes the API folder of a contentType\n */\nexport async function clear(uid: Internal.UID.ContentType) {\n // TODO double check if this is the correct way to get the apiName\n const { apiName, modelName } = strapi.contentTypes[uid] as any;\n\n const apiFolder = path.join(strapi.dirs.app.api, apiName);\n\n await recursiveRemoveFiles(apiFolder, createDeleteApiFunction(modelName));\n await deleteBackup(uid);\n}\n\n/**\n * Backups the API folder of a contentType\n * @param {string} uid content type uid\n */\nexport async function backup(uid: Internal.UID.ContentType) {\n const { apiName } = strapi.contentTypes[uid] as any;\n\n const apiFolder = path.join(strapi.dirs.app.api, apiName);\n const backupFolder = path.join(strapi.dirs.app.api, '.backup', apiName);\n\n // backup the api folder\n await fse.copy(apiFolder, backupFolder);\n}\n\n/**\n * Deletes an API backup folder\n */\nasync function deleteBackup(uid: Internal.UID.ContentType) {\n const { apiName } = strapi.contentTypes[uid] as any;\n\n const backupFolder = path.join(strapi.dirs.app.api, '.backup');\n const apiBackupFolder = path.join(strapi.dirs.app.api, '.backup', apiName);\n\n await fse.remove(apiBackupFolder);\n\n const list = await fse.readdir(backupFolder);\n if (list.length === 0) {\n await fse.remove(backupFolder);\n }\n}\n\n/**\n * Rollbacks the API folder of a contentType\n */\nexport async function rollback(uid: Internal.UID.ContentType) {\n const { apiName } = strapi.contentTypes[uid] as any;\n\n const apiFolder = path.join(strapi.dirs.app.api, apiName);\n const backupFolder = path.join(strapi.dirs.app.api, '.backup', apiName);\n\n try {\n await fse.access(backupFolder);\n } catch {\n throw new Error('Cannot rollback api that was not backed up');\n }\n\n await fse.remove(apiFolder);\n await fse.copy(backupFolder, apiFolder);\n await deleteBackup(uid);\n}\n\n/**\n * Creates a delete function to clear an api folder\n */\nconst createDeleteApiFunction = (baseName: string) => {\n /**\n * Delets a file in an api.\n * Will only update routes.json instead of deleting it if other routes are present\n */\n return async (filePath: string) => {\n const fileName = path.basename(filePath, path.extname(filePath));\n\n const isSchemaFile = filePath.endsWith(`${baseName}/schema.json`);\n if (fileName === baseName || isSchemaFile) {\n return fse.remove(filePath);\n }\n };\n};\n\n/**\n * Deletes a folder recursively using a delete function\n * @param {string} folder folder to delete\n */\nconst recursiveRemoveFiles = async (folder: string, deleteFn: (file: string) => unknown) => {\n const filesName = await fse.readdir(folder);\n\n for (const fileName of filesName) {\n const filePath = path.join(folder, fileName);\n\n const stat = await fse.stat(filePath);\n\n if (stat.isDirectory()) {\n await recursiveRemoveFiles(filePath, deleteFn);\n } else {\n await deleteFn(filePath);\n }\n }\n\n const files = await fse.readdir(folder);\n if (files.length === 0) {\n await fse.remove(folder);\n }\n};\n"],"names":["clear","uid","apiName","modelName","strapi","contentTypes","apiFolder","path","join","dirs","app","api","recursiveRemoveFiles","createDeleteApiFunction","deleteBackup","backup","backupFolder","fse","copy","apiBackupFolder","remove","list","readdir","length","rollback","access","Error","baseName","filePath","fileName","basename","extname","isSchemaFile","endsWith","folder","deleteFn","filesName","stat","isDirectory","files"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAIA;;IAGO,eAAeA,KAAAA,CAAMC,GAA6B,EAAA;;IAEvD,MAAM,EAAEC,OAAO,EAAEC,SAAS,EAAE,GAAGC,MAAAA,CAAOC,YAAY,CAACJ,GAAI,CAAA;IAEvD,MAAMK,SAAAA,GAAYC,eAAKC,CAAAA,IAAI,CAACJ,MAAAA,CAAOK,IAAI,CAACC,GAAG,CAACC,GAAG,EAAET,OAAAA,CAAAA;IAEjD,MAAMU,oBAAAA,CAAqBN,WAAWO,uBAAwBV,CAAAA,SAAAA,CAAAA,CAAAA;AAC9D,IAAA,MAAMW,YAAab,CAAAA,GAAAA,CAAAA;AACrB;AAEA;;;IAIO,eAAec,MAAAA,CAAOd,GAA6B,EAAA;AACxD,IAAA,MAAM,EAAEC,OAAO,EAAE,GAAGE,MAAOC,CAAAA,YAAY,CAACJ,GAAI,CAAA;IAE5C,MAAMK,SAAAA,GAAYC,eAAKC,CAAAA,IAAI,CAACJ,MAAAA,CAAOK,IAAI,CAACC,GAAG,CAACC,GAAG,EAAET,OAAAA,CAAAA;IACjD,MAAMc,YAAAA,GAAeT,eAAKC,CAAAA,IAAI,CAACJ,MAAAA,CAAOK,IAAI,CAACC,GAAG,CAACC,GAAG,EAAE,SAAWT,EAAAA,OAAAA,CAAAA;;IAG/D,MAAMe,cAAAA,CAAIC,IAAI,CAACZ,SAAWU,EAAAA,YAAAA,CAAAA;AAC5B;AAEA;;IAGA,eAAeF,aAAab,GAA6B,EAAA;AACvD,IAAA,MAAM,EAAEC,OAAO,EAAE,GAAGE,MAAOC,CAAAA,YAAY,CAACJ,GAAI,CAAA;IAE5C,MAAMe,YAAAA,GAAeT,eAAKC,CAAAA,IAAI,CAACJ,MAAAA,CAAOK,IAAI,CAACC,GAAG,CAACC,GAAG,EAAE,SAAA,CAAA;IACpD,MAAMQ,eAAAA,GAAkBZ,eAAKC,CAAAA,IAAI,CAACJ,MAAAA,CAAOK,IAAI,CAACC,GAAG,CAACC,GAAG,EAAE,SAAWT,EAAAA,OAAAA,CAAAA;IAElE,MAAMe,cAAAA,CAAIG,MAAM,CAACD,eAAAA,CAAAA;AAEjB,IAAA,MAAME,IAAO,GAAA,MAAMJ,cAAIK,CAAAA,OAAO,CAACN,YAAAA,CAAAA;IAC/B,IAAIK,IAAAA,CAAKE,MAAM,KAAK,CAAG,EAAA;QACrB,MAAMN,cAAAA,CAAIG,MAAM,CAACJ,YAAAA,CAAAA;AACnB;AACF;AAEA;;IAGO,eAAeQ,QAAAA,CAASvB,GAA6B,EAAA;AAC1D,IAAA,MAAM,EAAEC,OAAO,EAAE,GAAGE,MAAOC,CAAAA,YAAY,CAACJ,GAAI,CAAA;IAE5C,MAAMK,SAAAA,GAAYC,eAAKC,CAAAA,IAAI,CAACJ,MAAAA,CAAOK,IAAI,CAACC,GAAG,CAACC,GAAG,EAAET,OAAAA,CAAAA;IACjD,MAAMc,YAAAA,GAAeT,eAAKC,CAAAA,IAAI,CAACJ,MAAAA,CAAOK,IAAI,CAACC,GAAG,CAACC,GAAG,EAAE,SAAWT,EAAAA,OAAAA,CAAAA;IAE/D,IAAI;QACF,MAAMe,cAAAA,CAAIQ,MAAM,CAACT,YAAAA,CAAAA;AACnB,KAAA,CAAE,OAAM;AACN,QAAA,MAAM,IAAIU,KAAM,CAAA,4CAAA,CAAA;AAClB;IAEA,MAAMT,cAAAA,CAAIG,MAAM,CAACd,SAAAA,CAAAA;IACjB,MAAMW,cAAAA,CAAIC,IAAI,CAACF,YAAcV,EAAAA,SAAAA,CAAAA;AAC7B,IAAA,MAAMQ,YAAab,CAAAA,GAAAA,CAAAA;AACrB;AAEA;;IAGA,MAAMY,0BAA0B,CAACc,QAAAA,GAAAA;AAC/B;;;AAGC,MACD,OAAO,OAAOC,QAAAA,GAAAA;AACZ,QAAA,MAAMC,WAAWtB,eAAKuB,CAAAA,QAAQ,CAACF,QAAUrB,EAAAA,eAAAA,CAAKwB,OAAO,CAACH,QAAAA,CAAAA,CAAAA;
|
|
1
|
+
{"version":3,"file":"api-handler.js","sources":["../../../server/src/services/api-handler.ts"],"sourcesContent":["import * as path from 'path';\nimport * as fse from 'fs-extra';\nimport type { Internal } from '@strapi/types';\n\n/**\n * Deletes the API folder of a contentType\n */\nexport async function clear(uid: Internal.UID.ContentType) {\n // TODO double check if this is the correct way to get the apiName\n const { apiName, modelName } = strapi.contentTypes[uid] as any;\n\n const apiFolder = path.join(strapi.dirs.app.api, apiName);\n\n await recursiveRemoveFiles(apiFolder, createDeleteApiFunction(modelName));\n await deleteBackup(uid);\n}\n\n/**\n * Backups the API folder of a contentType\n * @param {string} uid content type uid\n */\nexport async function backup(uid: Internal.UID.ContentType) {\n const { apiName } = strapi.contentTypes[uid] as any;\n\n const apiFolder = path.join(strapi.dirs.app.api, apiName);\n const backupFolder = path.join(strapi.dirs.app.api, '.backup', apiName);\n\n // backup the api folder\n await fse.copy(apiFolder, backupFolder);\n}\n\n/**\n * Deletes an API backup folder\n */\nasync function deleteBackup(uid: Internal.UID.ContentType) {\n const { apiName } = strapi.contentTypes[uid] as any;\n\n const backupFolder = path.join(strapi.dirs.app.api, '.backup');\n const apiBackupFolder = path.join(strapi.dirs.app.api, '.backup', apiName);\n\n await fse.remove(apiBackupFolder);\n\n const list = await fse.readdir(backupFolder);\n if (list.length === 0) {\n await fse.remove(backupFolder);\n }\n}\n\n/**\n * Rollbacks the API folder of a contentType\n */\nexport async function rollback(uid: Internal.UID.ContentType) {\n const { apiName } = strapi.contentTypes[uid] as any;\n\n const apiFolder = path.join(strapi.dirs.app.api, apiName);\n const backupFolder = path.join(strapi.dirs.app.api, '.backup', apiName);\n\n try {\n await fse.access(backupFolder);\n } catch {\n throw new Error('Cannot rollback api that was not backed up');\n }\n\n await fse.remove(apiFolder);\n await fse.copy(backupFolder, apiFolder);\n await deleteBackup(uid);\n}\n\n/**\n * Creates a delete function to clear an api folder\n */\nconst createDeleteApiFunction = (baseName: string) => {\n /**\n * Delets a file in an api.\n * Will only update routes.json instead of deleting it if other routes are present\n */\n return async (filePath: string) => {\n const fileName = path.basename(filePath, path.extname(filePath));\n\n const isSchemaFile = filePath.endsWith(`${baseName}/schema.json`);\n if (fileName === baseName || isSchemaFile) {\n return fse.remove(filePath);\n }\n };\n};\n\n/**\n * Deletes a folder recursively using a delete function\n * @param {string} folder folder to delete\n */\nconst recursiveRemoveFiles = async (folder: string, deleteFn: (file: string) => unknown) => {\n const filesName = await fse.readdir(folder);\n\n for (const fileName of filesName) {\n const filePath = path.join(folder, fileName);\n\n const stat = await fse.stat(filePath);\n\n if (stat.isDirectory()) {\n await recursiveRemoveFiles(filePath, deleteFn);\n } else {\n await deleteFn(filePath);\n }\n }\n\n const files = await fse.readdir(folder);\n if (files.length === 0) {\n await fse.remove(folder);\n }\n};\n"],"names":["clear","uid","apiName","modelName","strapi","contentTypes","apiFolder","path","join","dirs","app","api","recursiveRemoveFiles","createDeleteApiFunction","deleteBackup","backup","backupFolder","fse","copy","apiBackupFolder","remove","list","readdir","length","rollback","access","Error","baseName","filePath","fileName","basename","extname","isSchemaFile","endsWith","folder","deleteFn","filesName","stat","isDirectory","files"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-handler.mjs","sources":["../../../server/src/services/api-handler.ts"],"sourcesContent":["import * as path from 'path';\nimport * as fse from 'fs-extra';\nimport type { Internal } from '@strapi/types';\n\n/**\n * Deletes the API folder of a contentType\n */\nexport async function clear(uid: Internal.UID.ContentType) {\n // TODO double check if this is the correct way to get the apiName\n const { apiName, modelName } = strapi.contentTypes[uid] as any;\n\n const apiFolder = path.join(strapi.dirs.app.api, apiName);\n\n await recursiveRemoveFiles(apiFolder, createDeleteApiFunction(modelName));\n await deleteBackup(uid);\n}\n\n/**\n * Backups the API folder of a contentType\n * @param {string} uid content type uid\n */\nexport async function backup(uid: Internal.UID.ContentType) {\n const { apiName } = strapi.contentTypes[uid] as any;\n\n const apiFolder = path.join(strapi.dirs.app.api, apiName);\n const backupFolder = path.join(strapi.dirs.app.api, '.backup', apiName);\n\n // backup the api folder\n await fse.copy(apiFolder, backupFolder);\n}\n\n/**\n * Deletes an API backup folder\n */\nasync function deleteBackup(uid: Internal.UID.ContentType) {\n const { apiName } = strapi.contentTypes[uid] as any;\n\n const backupFolder = path.join(strapi.dirs.app.api, '.backup');\n const apiBackupFolder = path.join(strapi.dirs.app.api, '.backup', apiName);\n\n await fse.remove(apiBackupFolder);\n\n const list = await fse.readdir(backupFolder);\n if (list.length === 0) {\n await fse.remove(backupFolder);\n }\n}\n\n/**\n * Rollbacks the API folder of a contentType\n */\nexport async function rollback(uid: Internal.UID.ContentType) {\n const { apiName } = strapi.contentTypes[uid] as any;\n\n const apiFolder = path.join(strapi.dirs.app.api, apiName);\n const backupFolder = path.join(strapi.dirs.app.api, '.backup', apiName);\n\n try {\n await fse.access(backupFolder);\n } catch {\n throw new Error('Cannot rollback api that was not backed up');\n }\n\n await fse.remove(apiFolder);\n await fse.copy(backupFolder, apiFolder);\n await deleteBackup(uid);\n}\n\n/**\n * Creates a delete function to clear an api folder\n */\nconst createDeleteApiFunction = (baseName: string) => {\n /**\n * Delets a file in an api.\n * Will only update routes.json instead of deleting it if other routes are present\n */\n return async (filePath: string) => {\n const fileName = path.basename(filePath, path.extname(filePath));\n\n const isSchemaFile = filePath.endsWith(`${baseName}/schema.json`);\n if (fileName === baseName || isSchemaFile) {\n return fse.remove(filePath);\n }\n };\n};\n\n/**\n * Deletes a folder recursively using a delete function\n * @param {string} folder folder to delete\n */\nconst recursiveRemoveFiles = async (folder: string, deleteFn: (file: string) => unknown) => {\n const filesName = await fse.readdir(folder);\n\n for (const fileName of filesName) {\n const filePath = path.join(folder, fileName);\n\n const stat = await fse.stat(filePath);\n\n if (stat.isDirectory()) {\n await recursiveRemoveFiles(filePath, deleteFn);\n } else {\n await deleteFn(filePath);\n }\n }\n\n const files = await fse.readdir(folder);\n if (files.length === 0) {\n await fse.remove(folder);\n }\n};\n"],"names":["clear","uid","apiName","modelName","strapi","contentTypes","apiFolder","path","join","dirs","app","api","recursiveRemoveFiles","createDeleteApiFunction","deleteBackup","backup","backupFolder","fse","copy","apiBackupFolder","remove","list","readdir","length","rollback","access","Error","baseName","filePath","fileName","basename","extname","isSchemaFile","endsWith","folder","deleteFn","filesName","stat","isDirectory","files"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"api-handler.mjs","sources":["../../../server/src/services/api-handler.ts"],"sourcesContent":["import * as path from 'path';\nimport * as fse from 'fs-extra';\nimport type { Internal } from '@strapi/types';\n\n/**\n * Deletes the API folder of a contentType\n */\nexport async function clear(uid: Internal.UID.ContentType) {\n // TODO double check if this is the correct way to get the apiName\n const { apiName, modelName } = strapi.contentTypes[uid] as any;\n\n const apiFolder = path.join(strapi.dirs.app.api, apiName);\n\n await recursiveRemoveFiles(apiFolder, createDeleteApiFunction(modelName));\n await deleteBackup(uid);\n}\n\n/**\n * Backups the API folder of a contentType\n * @param {string} uid content type uid\n */\nexport async function backup(uid: Internal.UID.ContentType) {\n const { apiName } = strapi.contentTypes[uid] as any;\n\n const apiFolder = path.join(strapi.dirs.app.api, apiName);\n const backupFolder = path.join(strapi.dirs.app.api, '.backup', apiName);\n\n // backup the api folder\n await fse.copy(apiFolder, backupFolder);\n}\n\n/**\n * Deletes an API backup folder\n */\nasync function deleteBackup(uid: Internal.UID.ContentType) {\n const { apiName } = strapi.contentTypes[uid] as any;\n\n const backupFolder = path.join(strapi.dirs.app.api, '.backup');\n const apiBackupFolder = path.join(strapi.dirs.app.api, '.backup', apiName);\n\n await fse.remove(apiBackupFolder);\n\n const list = await fse.readdir(backupFolder);\n if (list.length === 0) {\n await fse.remove(backupFolder);\n }\n}\n\n/**\n * Rollbacks the API folder of a contentType\n */\nexport async function rollback(uid: Internal.UID.ContentType) {\n const { apiName } = strapi.contentTypes[uid] as any;\n\n const apiFolder = path.join(strapi.dirs.app.api, apiName);\n const backupFolder = path.join(strapi.dirs.app.api, '.backup', apiName);\n\n try {\n await fse.access(backupFolder);\n } catch {\n throw new Error('Cannot rollback api that was not backed up');\n }\n\n await fse.remove(apiFolder);\n await fse.copy(backupFolder, apiFolder);\n await deleteBackup(uid);\n}\n\n/**\n * Creates a delete function to clear an api folder\n */\nconst createDeleteApiFunction = (baseName: string) => {\n /**\n * Delets a file in an api.\n * Will only update routes.json instead of deleting it if other routes are present\n */\n return async (filePath: string) => {\n const fileName = path.basename(filePath, path.extname(filePath));\n\n const isSchemaFile = filePath.endsWith(`${baseName}/schema.json`);\n if (fileName === baseName || isSchemaFile) {\n return fse.remove(filePath);\n }\n };\n};\n\n/**\n * Deletes a folder recursively using a delete function\n * @param {string} folder folder to delete\n */\nconst recursiveRemoveFiles = async (folder: string, deleteFn: (file: string) => unknown) => {\n const filesName = await fse.readdir(folder);\n\n for (const fileName of filesName) {\n const filePath = path.join(folder, fileName);\n\n const stat = await fse.stat(filePath);\n\n if (stat.isDirectory()) {\n await recursiveRemoveFiles(filePath, deleteFn);\n } else {\n await deleteFn(filePath);\n }\n }\n\n const files = await fse.readdir(folder);\n if (files.length === 0) {\n await fse.remove(folder);\n }\n};\n"],"names":["clear","uid","apiName","modelName","strapi","contentTypes","apiFolder","path","join","dirs","app","api","recursiveRemoveFiles","createDeleteApiFunction","deleteBackup","backup","backupFolder","fse","copy","apiBackupFolder","remove","list","readdir","length","rollback","access","Error","baseName","filePath","fileName","basename","extname","isSchemaFile","endsWith","folder","deleteFn","filesName","stat","isDirectory","files"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-categories.js","sources":["../../../server/src/services/component-categories.ts"],"sourcesContent":["import { join } from 'path';\nimport { strings, errors } from '@strapi/utils';\nimport type { Struct } from '@strapi/types';\nimport createBuilder from './schema-builder';\n\ntype Infos = {\n name: string;\n};\n\ninterface WorkingComponent extends Struct.ComponentSchema {\n setUID: (uid: string) => WorkingComponent;\n setDir: (dir: string) => WorkingComponent;\n updateComponent: (oldUID: string, newUID: string) => void;\n}\n\n/**\n * Edit a category name and move components to the write folder\n */\nexport const editCategory = async (name: string, infos: Infos) => {\n const newName = strings.nameToSlug(infos.name);\n\n // don't do anything the name doesn't change\n if (name === newName) return;\n\n if (!categoryExists(name)) {\n throw new errors.ApplicationError('category not found');\n }\n\n if (categoryExists(newName)) {\n throw new errors.ApplicationError('Name already taken');\n }\n\n const builder = createBuilder();\n\n builder.components.forEach((component: WorkingComponent) => {\n const oldUID = component.uid;\n const newUID = `${newName}.${component.modelName}`;\n\n // only edit the components in this specific category\n if (component.category !== name) return;\n\n component.setUID(newUID).setDir(join(strapi.dirs.app.components, newName));\n\n builder.components.forEach((compo: WorkingComponent) => {\n compo.updateComponent(oldUID, newUID);\n });\n\n builder.contentTypes.forEach((ct: WorkingComponent) => {\n ct.updateComponent(oldUID, newUID);\n });\n });\n\n await builder.writeFiles();\n\n return newName;\n};\n\n/**\n * Deletes a category and its components\n */\nexport const deleteCategory = async (name: string) => {\n if (!categoryExists(name)) {\n throw new errors.ApplicationError('category not found');\n }\n\n const builder = createBuilder();\n\n builder.components.forEach((component) => {\n if (component.category === name) {\n builder.deleteComponent(component.uid);\n }\n });\n\n await builder.writeFiles();\n};\n\n/**\n * Checks if a category exists\n */\nconst categoryExists = (name: string) => {\n const matchingIndex = Object.values(strapi.components).findIndex(\n (component) => component.category === name\n );\n\n return matchingIndex > -1;\n};\n"],"names":["editCategory","name","infos","newName","strings","nameToSlug","categoryExists","errors","ApplicationError","builder","createBuilder","components","forEach","component","oldUID","uid","newUID","modelName","category","setUID","setDir","join","strapi","dirs","app","compo","updateComponent","contentTypes","ct","writeFiles","deleteCategory","deleteComponent","matchingIndex","Object","values","findIndex"],"mappings":";;;;;;AAeA;;AAEC,IACM,MAAMA,YAAe,GAAA,OAAOC,IAAcC,EAAAA,KAAAA,GAAAA;AAC/C,IAAA,MAAMC,OAAUC,GAAAA,aAAAA,CAAQC,UAAU,CAACH,MAAMD,IAAI,CAAA;;AAG7C,IAAA,IAAIA,SAASE,OAAS,EAAA;IAEtB,IAAI,CAACG,eAAeL,IAAO,CAAA,EAAA;QACzB,MAAM,IAAIM,YAAOC,CAAAA,gBAAgB,CAAC,oBAAA,CAAA;AACpC;AAEA,IAAA,IAAIF,eAAeH,OAAU,CAAA,EAAA;QAC3B,MAAM,IAAII,YAAOC,CAAAA,gBAAgB,CAAC,oBAAA,CAAA;AACpC;AAEA,IAAA,MAAMC,OAAUC,GAAAA,KAAAA,EAAAA;AAEhBD,IAAAA,OAAAA,CAAQE,UAAU,CAACC,OAAO,CAAC,CAACC,SAAAA,GAAAA;QAC1B,MAAMC,MAAAA,GAASD,UAAUE,GAAG;
|
|
1
|
+
{"version":3,"file":"component-categories.js","sources":["../../../server/src/services/component-categories.ts"],"sourcesContent":["import { join } from 'path';\nimport { strings, errors } from '@strapi/utils';\nimport type { Struct } from '@strapi/types';\nimport createBuilder from './schema-builder';\n\ntype Infos = {\n name: string;\n};\n\ninterface WorkingComponent extends Struct.ComponentSchema {\n setUID: (uid: string) => WorkingComponent;\n setDir: (dir: string) => WorkingComponent;\n updateComponent: (oldUID: string, newUID: string) => void;\n}\n\n/**\n * Edit a category name and move components to the write folder\n */\nexport const editCategory = async (name: string, infos: Infos) => {\n const newName = strings.nameToSlug(infos.name);\n\n // don't do anything the name doesn't change\n if (name === newName) return;\n\n if (!categoryExists(name)) {\n throw new errors.ApplicationError('category not found');\n }\n\n if (categoryExists(newName)) {\n throw new errors.ApplicationError('Name already taken');\n }\n\n const builder = createBuilder();\n\n builder.components.forEach((component: WorkingComponent) => {\n const oldUID = component.uid;\n const newUID = `${newName}.${component.modelName}`;\n\n // only edit the components in this specific category\n if (component.category !== name) return;\n\n component.setUID(newUID).setDir(join(strapi.dirs.app.components, newName));\n\n builder.components.forEach((compo: WorkingComponent) => {\n compo.updateComponent(oldUID, newUID);\n });\n\n builder.contentTypes.forEach((ct: WorkingComponent) => {\n ct.updateComponent(oldUID, newUID);\n });\n });\n\n await builder.writeFiles();\n\n return newName;\n};\n\n/**\n * Deletes a category and its components\n */\nexport const deleteCategory = async (name: string) => {\n if (!categoryExists(name)) {\n throw new errors.ApplicationError('category not found');\n }\n\n const builder = createBuilder();\n\n builder.components.forEach((component) => {\n if (component.category === name) {\n builder.deleteComponent(component.uid);\n }\n });\n\n await builder.writeFiles();\n};\n\n/**\n * Checks if a category exists\n */\nconst categoryExists = (name: string) => {\n const matchingIndex = Object.values(strapi.components).findIndex(\n (component) => component.category === name\n );\n\n return matchingIndex > -1;\n};\n"],"names":["editCategory","name","infos","newName","strings","nameToSlug","categoryExists","errors","ApplicationError","builder","createBuilder","components","forEach","component","oldUID","uid","newUID","modelName","category","setUID","setDir","join","strapi","dirs","app","compo","updateComponent","contentTypes","ct","writeFiles","deleteCategory","deleteComponent","matchingIndex","Object","values","findIndex"],"mappings":";;;;;;AAeA;;AAEC,IACM,MAAMA,YAAe,GAAA,OAAOC,IAAcC,EAAAA,KAAAA,GAAAA;AAC/C,IAAA,MAAMC,OAAUC,GAAAA,aAAAA,CAAQC,UAAU,CAACH,MAAMD,IAAI,CAAA;;AAG7C,IAAA,IAAIA,SAASE,OAAS,EAAA;IAEtB,IAAI,CAACG,eAAeL,IAAO,CAAA,EAAA;QACzB,MAAM,IAAIM,YAAOC,CAAAA,gBAAgB,CAAC,oBAAA,CAAA;AACpC;AAEA,IAAA,IAAIF,eAAeH,OAAU,CAAA,EAAA;QAC3B,MAAM,IAAII,YAAOC,CAAAA,gBAAgB,CAAC,oBAAA,CAAA;AACpC;AAEA,IAAA,MAAMC,OAAUC,GAAAA,KAAAA,EAAAA;AAEhBD,IAAAA,OAAAA,CAAQE,UAAU,CAACC,OAAO,CAAC,CAACC,SAAAA,GAAAA;QAC1B,MAAMC,MAAAA,GAASD,UAAUE,GAAG;AAC5B,QAAA,MAAMC,SAAS,CAAGb,EAAAA,OAAAA,CAAQ,CAAC,EAAEU,SAAAA,CAAUI,SAAS,CAAE,CAAA;;QAGlD,IAAIJ,SAAAA,CAAUK,QAAQ,KAAKjB,IAAM,EAAA;AAEjCY,QAAAA,SAAAA,CAAUM,MAAM,CAACH,MAAQI,CAAAA,CAAAA,MAAM,CAACC,SAAAA,CAAKC,MAAOC,CAAAA,IAAI,CAACC,GAAG,CAACb,UAAU,EAAER,OAAAA,CAAAA,CAAAA;AAEjEM,QAAAA,OAAAA,CAAQE,UAAU,CAACC,OAAO,CAAC,CAACa,KAAAA,GAAAA;YAC1BA,KAAMC,CAAAA,eAAe,CAACZ,MAAQE,EAAAA,MAAAA,CAAAA;AAChC,SAAA,CAAA;AAEAP,QAAAA,OAAAA,CAAQkB,YAAY,CAACf,OAAO,CAAC,CAACgB,EAAAA,GAAAA;YAC5BA,EAAGF,CAAAA,eAAe,CAACZ,MAAQE,EAAAA,MAAAA,CAAAA;AAC7B,SAAA,CAAA;AACF,KAAA,CAAA;AAEA,IAAA,MAAMP,QAAQoB,UAAU,EAAA;IAExB,OAAO1B,OAAAA;AACT;AAEA;;IAGa2B,MAAAA,cAAAA,GAAiB,OAAO7B,IAAAA,GAAAA;IACnC,IAAI,CAACK,eAAeL,IAAO,CAAA,EAAA;QACzB,MAAM,IAAIM,YAAOC,CAAAA,gBAAgB,CAAC,oBAAA,CAAA;AACpC;AAEA,IAAA,MAAMC,OAAUC,GAAAA,KAAAA,EAAAA;AAEhBD,IAAAA,OAAAA,CAAQE,UAAU,CAACC,OAAO,CAAC,CAACC,SAAAA,GAAAA;QAC1B,IAAIA,SAAAA,CAAUK,QAAQ,KAAKjB,IAAM,EAAA;YAC/BQ,OAAQsB,CAAAA,eAAe,CAAClB,SAAAA,CAAUE,GAAG,CAAA;AACvC;AACF,KAAA,CAAA;AAEA,IAAA,MAAMN,QAAQoB,UAAU,EAAA;AAC1B;AAEA;;IAGA,MAAMvB,iBAAiB,CAACL,IAAAA,GAAAA;AACtB,IAAA,MAAM+B,aAAgBC,GAAAA,MAAAA,CAAOC,MAAM,CAACZ,MAAOX,CAAAA,UAAU,CAAEwB,CAAAA,SAAS,CAC9D,CAACtB,SAAcA,GAAAA,SAAAA,CAAUK,QAAQ,KAAKjB,IAAAA,CAAAA;AAGxC,IAAA,OAAO+B,gBAAgB,CAAC,CAAA;AAC1B,CAAA;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-categories.mjs","sources":["../../../server/src/services/component-categories.ts"],"sourcesContent":["import { join } from 'path';\nimport { strings, errors } from '@strapi/utils';\nimport type { Struct } from '@strapi/types';\nimport createBuilder from './schema-builder';\n\ntype Infos = {\n name: string;\n};\n\ninterface WorkingComponent extends Struct.ComponentSchema {\n setUID: (uid: string) => WorkingComponent;\n setDir: (dir: string) => WorkingComponent;\n updateComponent: (oldUID: string, newUID: string) => void;\n}\n\n/**\n * Edit a category name and move components to the write folder\n */\nexport const editCategory = async (name: string, infos: Infos) => {\n const newName = strings.nameToSlug(infos.name);\n\n // don't do anything the name doesn't change\n if (name === newName) return;\n\n if (!categoryExists(name)) {\n throw new errors.ApplicationError('category not found');\n }\n\n if (categoryExists(newName)) {\n throw new errors.ApplicationError('Name already taken');\n }\n\n const builder = createBuilder();\n\n builder.components.forEach((component: WorkingComponent) => {\n const oldUID = component.uid;\n const newUID = `${newName}.${component.modelName}`;\n\n // only edit the components in this specific category\n if (component.category !== name) return;\n\n component.setUID(newUID).setDir(join(strapi.dirs.app.components, newName));\n\n builder.components.forEach((compo: WorkingComponent) => {\n compo.updateComponent(oldUID, newUID);\n });\n\n builder.contentTypes.forEach((ct: WorkingComponent) => {\n ct.updateComponent(oldUID, newUID);\n });\n });\n\n await builder.writeFiles();\n\n return newName;\n};\n\n/**\n * Deletes a category and its components\n */\nexport const deleteCategory = async (name: string) => {\n if (!categoryExists(name)) {\n throw new errors.ApplicationError('category not found');\n }\n\n const builder = createBuilder();\n\n builder.components.forEach((component) => {\n if (component.category === name) {\n builder.deleteComponent(component.uid);\n }\n });\n\n await builder.writeFiles();\n};\n\n/**\n * Checks if a category exists\n */\nconst categoryExists = (name: string) => {\n const matchingIndex = Object.values(strapi.components).findIndex(\n (component) => component.category === name\n );\n\n return matchingIndex > -1;\n};\n"],"names":["editCategory","name","infos","newName","strings","nameToSlug","categoryExists","errors","ApplicationError","builder","createBuilder","components","forEach","component","oldUID","uid","newUID","modelName","category","setUID","setDir","join","strapi","dirs","app","compo","updateComponent","contentTypes","ct","writeFiles","deleteCategory","deleteComponent","matchingIndex","Object","values","findIndex"],"mappings":";;;;AAeA;;AAEC,IACM,MAAMA,YAAe,GAAA,OAAOC,IAAcC,EAAAA,KAAAA,GAAAA;AAC/C,IAAA,MAAMC,OAAUC,GAAAA,OAAAA,CAAQC,UAAU,CAACH,MAAMD,IAAI,CAAA;;AAG7C,IAAA,IAAIA,SAASE,OAAS,EAAA;IAEtB,IAAI,CAACG,eAAeL,IAAO,CAAA,EAAA;QACzB,MAAM,IAAIM,MAAOC,CAAAA,gBAAgB,CAAC,oBAAA,CAAA;AACpC;AAEA,IAAA,IAAIF,eAAeH,OAAU,CAAA,EAAA;QAC3B,MAAM,IAAII,MAAOC,CAAAA,gBAAgB,CAAC,oBAAA,CAAA;AACpC;AAEA,IAAA,MAAMC,OAAUC,GAAAA,aAAAA,EAAAA;AAEhBD,IAAAA,OAAAA,CAAQE,UAAU,CAACC,OAAO,CAAC,CAACC,SAAAA,GAAAA;QAC1B,MAAMC,MAAAA,GAASD,UAAUE,GAAG;
|
|
1
|
+
{"version":3,"file":"component-categories.mjs","sources":["../../../server/src/services/component-categories.ts"],"sourcesContent":["import { join } from 'path';\nimport { strings, errors } from '@strapi/utils';\nimport type { Struct } from '@strapi/types';\nimport createBuilder from './schema-builder';\n\ntype Infos = {\n name: string;\n};\n\ninterface WorkingComponent extends Struct.ComponentSchema {\n setUID: (uid: string) => WorkingComponent;\n setDir: (dir: string) => WorkingComponent;\n updateComponent: (oldUID: string, newUID: string) => void;\n}\n\n/**\n * Edit a category name and move components to the write folder\n */\nexport const editCategory = async (name: string, infos: Infos) => {\n const newName = strings.nameToSlug(infos.name);\n\n // don't do anything the name doesn't change\n if (name === newName) return;\n\n if (!categoryExists(name)) {\n throw new errors.ApplicationError('category not found');\n }\n\n if (categoryExists(newName)) {\n throw new errors.ApplicationError('Name already taken');\n }\n\n const builder = createBuilder();\n\n builder.components.forEach((component: WorkingComponent) => {\n const oldUID = component.uid;\n const newUID = `${newName}.${component.modelName}`;\n\n // only edit the components in this specific category\n if (component.category !== name) return;\n\n component.setUID(newUID).setDir(join(strapi.dirs.app.components, newName));\n\n builder.components.forEach((compo: WorkingComponent) => {\n compo.updateComponent(oldUID, newUID);\n });\n\n builder.contentTypes.forEach((ct: WorkingComponent) => {\n ct.updateComponent(oldUID, newUID);\n });\n });\n\n await builder.writeFiles();\n\n return newName;\n};\n\n/**\n * Deletes a category and its components\n */\nexport const deleteCategory = async (name: string) => {\n if (!categoryExists(name)) {\n throw new errors.ApplicationError('category not found');\n }\n\n const builder = createBuilder();\n\n builder.components.forEach((component) => {\n if (component.category === name) {\n builder.deleteComponent(component.uid);\n }\n });\n\n await builder.writeFiles();\n};\n\n/**\n * Checks if a category exists\n */\nconst categoryExists = (name: string) => {\n const matchingIndex = Object.values(strapi.components).findIndex(\n (component) => component.category === name\n );\n\n return matchingIndex > -1;\n};\n"],"names":["editCategory","name","infos","newName","strings","nameToSlug","categoryExists","errors","ApplicationError","builder","createBuilder","components","forEach","component","oldUID","uid","newUID","modelName","category","setUID","setDir","join","strapi","dirs","app","compo","updateComponent","contentTypes","ct","writeFiles","deleteCategory","deleteComponent","matchingIndex","Object","values","findIndex"],"mappings":";;;;AAeA;;AAEC,IACM,MAAMA,YAAe,GAAA,OAAOC,IAAcC,EAAAA,KAAAA,GAAAA;AAC/C,IAAA,MAAMC,OAAUC,GAAAA,OAAAA,CAAQC,UAAU,CAACH,MAAMD,IAAI,CAAA;;AAG7C,IAAA,IAAIA,SAASE,OAAS,EAAA;IAEtB,IAAI,CAACG,eAAeL,IAAO,CAAA,EAAA;QACzB,MAAM,IAAIM,MAAOC,CAAAA,gBAAgB,CAAC,oBAAA,CAAA;AACpC;AAEA,IAAA,IAAIF,eAAeH,OAAU,CAAA,EAAA;QAC3B,MAAM,IAAII,MAAOC,CAAAA,gBAAgB,CAAC,oBAAA,CAAA;AACpC;AAEA,IAAA,MAAMC,OAAUC,GAAAA,aAAAA,EAAAA;AAEhBD,IAAAA,OAAAA,CAAQE,UAAU,CAACC,OAAO,CAAC,CAACC,SAAAA,GAAAA;QAC1B,MAAMC,MAAAA,GAASD,UAAUE,GAAG;AAC5B,QAAA,MAAMC,SAAS,CAAGb,EAAAA,OAAAA,CAAQ,CAAC,EAAEU,SAAAA,CAAUI,SAAS,CAAE,CAAA;;QAGlD,IAAIJ,SAAAA,CAAUK,QAAQ,KAAKjB,IAAM,EAAA;AAEjCY,QAAAA,SAAAA,CAAUM,MAAM,CAACH,MAAQI,CAAAA,CAAAA,MAAM,CAACC,IAAAA,CAAKC,MAAOC,CAAAA,IAAI,CAACC,GAAG,CAACb,UAAU,EAAER,OAAAA,CAAAA,CAAAA;AAEjEM,QAAAA,OAAAA,CAAQE,UAAU,CAACC,OAAO,CAAC,CAACa,KAAAA,GAAAA;YAC1BA,KAAMC,CAAAA,eAAe,CAACZ,MAAQE,EAAAA,MAAAA,CAAAA;AAChC,SAAA,CAAA;AAEAP,QAAAA,OAAAA,CAAQkB,YAAY,CAACf,OAAO,CAAC,CAACgB,EAAAA,GAAAA;YAC5BA,EAAGF,CAAAA,eAAe,CAACZ,MAAQE,EAAAA,MAAAA,CAAAA;AAC7B,SAAA,CAAA;AACF,KAAA,CAAA;AAEA,IAAA,MAAMP,QAAQoB,UAAU,EAAA;IAExB,OAAO1B,OAAAA;AACT;AAEA;;IAGa2B,MAAAA,cAAAA,GAAiB,OAAO7B,IAAAA,GAAAA;IACnC,IAAI,CAACK,eAAeL,IAAO,CAAA,EAAA;QACzB,MAAM,IAAIM,MAAOC,CAAAA,gBAAgB,CAAC,oBAAA,CAAA;AACpC;AAEA,IAAA,MAAMC,OAAUC,GAAAA,aAAAA,EAAAA;AAEhBD,IAAAA,OAAAA,CAAQE,UAAU,CAACC,OAAO,CAAC,CAACC,SAAAA,GAAAA;QAC1B,IAAIA,SAAAA,CAAUK,QAAQ,KAAKjB,IAAM,EAAA;YAC/BQ,OAAQsB,CAAAA,eAAe,CAAClB,SAAAA,CAAUE,GAAG,CAAA;AACvC;AACF,KAAA,CAAA;AAEA,IAAA,MAAMN,QAAQoB,UAAU,EAAA;AAC1B;AAEA;;IAGA,MAAMvB,iBAAiB,CAACL,IAAAA,GAAAA;AACtB,IAAA,MAAM+B,aAAgBC,GAAAA,MAAAA,CAAOC,MAAM,CAACZ,MAAOX,CAAAA,UAAU,CAAEwB,CAAAA,SAAS,CAC9D,CAACtB,SAAcA,GAAAA,SAAAA,CAAUK,QAAQ,KAAKjB,IAAAA,CAAAA;AAGxC,IAAA,OAAO+B,gBAAgB,CAAC,CAAA;AAC1B,CAAA;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-builder.js","sources":["../../../../server/src/services/schema-builder/component-builder.ts"],"sourcesContent":["import path from 'path';\nimport type { Internal } from '@strapi/types';\nimport _ from 'lodash';\nimport pluralize from 'pluralize';\n\nimport { strings, errors } from '@strapi/utils';\nimport { isConfigurable } from '../../utils/attributes';\nimport createSchemaHandler from './schema-handler';\n\nconst { ApplicationError } = errors;\n\nexport default function createComponentBuilder() {\n return {\n createComponentUID({ category, displayName }: any) {\n return `${strings.nameToSlug(category)}.${strings.nameToSlug(displayName)}`;\n },\n\n createNewComponentUIDMap(components: object[]) {\n return components.reduce((uidMap: any, component: any) => {\n uidMap[component.tmpUID] = this.createComponentUID(component);\n return uidMap;\n }, {});\n },\n\n createComponentAttributes(this: any, uid: string, attributes: any) {\n if (!this.components.has(uid)) {\n throw new ApplicationError('component.notFound');\n }\n\n return this.components.get(uid).setAttributes(this.convertAttributes(attributes));\n },\n\n /**\n * create a component in the tmpComponent map\n */\n createComponent(this: any, infos: any) {\n if (infos.uid && infos.uid !== this.createComponentUID(infos)) {\n throw new ApplicationError('component.invalidUID');\n }\n\n const uid = infos.uid ?? this.createComponentUID(infos);\n\n if (this.components.has(uid)) {\n throw new ApplicationError('component.alreadyExists');\n }\n\n const handler = createSchemaHandler({\n dir: path.join(strapi.dirs.app.components, strings.nameToSlug(infos.category)),\n filename: `${strings.nameToSlug(infos.displayName)}.json`,\n });\n\n // TODO: create a utility for this\n // Duplicate in admin/src/components/FormModal/forms/utils/createCollectionName.ts\n const collectionName = `components_${strings.nameToCollectionName(\n infos.category\n )}_${strings.nameToCollectionName(pluralize(infos.displayName))}`;\n\n this.components.forEach((compo: any) => {\n if (compo.schema.collectionName === collectionName) {\n throw new ApplicationError('component.alreadyExists');\n }\n });\n\n handler\n .setUID(uid)\n .set('collectionName', collectionName)\n .set(['info', 'displayName'], infos.displayName)\n .set(['info', 'icon'], infos.icon)\n .set(['info', 'description'], infos.description)\n .set('pluginOptions', infos.pluginOptions)\n .set('config', infos.config);\n\n if (this.components.size === 0) {\n strapi.telemetry.send('didCreateFirstComponent');\n } else {\n strapi.telemetry.send('didCreateComponent');\n }\n\n this.components.set(uid, handler);\n\n this.createComponentAttributes(uid, infos.attributes);\n\n return handler;\n },\n\n /**\n * create a component in the tmpComponent map\n */\n editComponent(this: any, infos: any) {\n const { uid } = infos;\n\n if (!this.components.has(uid)) {\n throw new errors.ApplicationError('component.notFound');\n }\n\n const component = this.components.get(uid);\n\n const [, nameUID] = uid.split('.');\n\n const newCategory = strings.nameToSlug(infos.category);\n const newUID = `${newCategory}.${nameUID}`;\n\n if (newUID !== uid && this.components.has(newUID)) {\n throw new errors.ApplicationError('component.edit.alreadyExists');\n }\n\n const newDir = path.join(strapi.dirs.app.components, newCategory);\n\n const oldAttributes = component.schema.attributes;\n\n const newAttributes = _.omitBy(infos.attributes, (attr, key) => {\n return _.has(oldAttributes, key) && !isConfigurable(oldAttributes[key]);\n });\n\n component\n .setUID(newUID)\n .setDir(newDir)\n .set(['info', 'displayName'], infos.displayName)\n .set(['info', 'icon'], infos.icon)\n .set(['info', 'description'], infos.description)\n .set('pluginOptions', infos.pluginOptions)\n .setAttributes(this.convertAttributes(newAttributes));\n\n if (newUID !== uid) {\n this.components.forEach((compo: any) => {\n compo.updateComponent(uid, newUID);\n });\n\n this.contentTypes.forEach((ct: any) => {\n ct.updateComponent(uid, newUID);\n });\n }\n\n return component;\n },\n\n deleteComponent(this: any, uid: Internal.UID.Component) {\n if (!this.components.has(uid)) {\n throw new errors.ApplicationError('component.notFound');\n }\n\n this.components.forEach((compo: any) => {\n compo.removeComponent(uid);\n });\n\n this.contentTypes.forEach((ct: any) => {\n ct.removeComponent(uid);\n });\n\n return this.components.get(uid).delete();\n },\n };\n}\n"],"names":["ApplicationError","errors","createComponentBuilder","createComponentUID","category","displayName","strings","nameToSlug","createNewComponentUIDMap","components","reduce","uidMap","component","tmpUID","createComponentAttributes","uid","attributes","has","get","setAttributes","convertAttributes","createComponent","infos","handler","createSchemaHandler","dir","path","join","strapi","dirs","app","filename","collectionName","nameToCollectionName","pluralize","forEach","compo","schema","setUID","set","icon","description","pluginOptions","config","size","telemetry","send","editComponent","nameUID","split","newCategory","newUID","newDir","oldAttributes","newAttributes","_","omitBy","attr","key","isConfigurable","setDir","updateComponent","contentTypes","ct","deleteComponent","removeComponent","delete"],"mappings":";;;;;;;;;AASA,MAAM,EAAEA,gBAAgB,EAAE,GAAGC,YAAAA;AAEd,SAASC,sBAAAA,GAAAA;IACtB,OAAO;AACLC,QAAAA,kBAAAA,CAAAA,CAAmB,EAAEC,QAAQ,EAAEC,WAAW,EAAO,EAAA;AAC/C,YAAA,OAAO,CAAC,EAAEC,aAAQC,CAAAA,UAAU,CAACH,QAAAA,CAAAA,CAAU,CAAC,EAAEE,aAAQC,CAAAA,UAAU,CAACF,WAAAA,CAAAA,CAAa,CAAC;AAC7E,SAAA;AAEAG,QAAAA,wBAAAA,CAAAA,CAAyBC,UAAoB,EAAA;AAC3C,YAAA,OAAOA,UAAWC,CAAAA,MAAM,CAAC,CAACC,MAAaC,EAAAA,SAAAA,GAAAA;gBACrCD,MAAM,CAACC,UAAUC,MAAM,CAAC,GAAG,IAAI,CAACV,kBAAkB,CAACS,SAAAA,CAAAA;gBACnD,OAAOD,MAAAA;AACT,aAAA,EAAG,EAAC,CAAA;AACN,SAAA;QAEAG,yBAAqCC,CAAAA,CAAAA,GAAW,EAAEC,UAAe,EAAA;AAC/D,YAAA,IAAI,CAAC,IAAI,CAACP,UAAU,CAACQ,GAAG,CAACF,GAAM,CAAA,EAAA;AAC7B,gBAAA,MAAM,IAAIf,gBAAiB,CAAA,oBAAA,CAAA;AAC7B;AAEA,YAAA,OAAO,IAAI,CAACS,UAAU,CAACS,GAAG,CAACH,GAAKI,CAAAA,CAAAA,aAAa,CAAC,IAAI,CAACC,iBAAiB,CAACJ,UAAAA,CAAAA,CAAAA;AACvE,SAAA;AAEA;;AAEC,QACDK,iBAA2BC,KAAU,EAAA;YACnC,IAAIA,KAAAA,CAAMP,GAAG,IAAIO,KAAMP,CAAAA,GAAG,KAAK,IAAI,CAACZ,kBAAkB,CAACmB,KAAQ,CAAA,EAAA;AAC7D,gBAAA,MAAM,IAAItB,gBAAiB,CAAA,sBAAA,CAAA;AAC7B;AAEA,YAAA,MAAMe,MAAMO,KAAMP,CAAAA,GAAG,IAAI,IAAI,CAACZ,kBAAkB,CAACmB,KAAAA,CAAAA;AAEjD,YAAA,IAAI,IAAI,CAACb,UAAU,CAACQ,GAAG,CAACF,GAAM,CAAA,EAAA;AAC5B,gBAAA,MAAM,IAAIf,gBAAiB,CAAA,yBAAA,CAAA;AAC7B;AAEA,YAAA,MAAMuB,UAAUC,aAAoB,CAAA;AAClCC,gBAAAA,GAAAA,EAAKC,IAAKC,CAAAA,IAAI,CAACC,MAAAA,CAAOC,IAAI,CAACC,GAAG,CAACrB,UAAU,EAAEH,aAAAA,CAAQC,UAAU,CAACe,MAAMlB,QAAQ,CAAA,CAAA;gBAC5E2B,QAAU,EAAA,CAAC,EAAEzB,aAAQC,CAAAA,UAAU,CAACe,KAAMjB,CAAAA,WAAW,CAAE,CAAA,KAAK;AAC1D,aAAA,CAAA;;;AAIA,YAAA,MAAM2B,iBAAiB,CAAC,WAAW,EAAE1B,aAAQ2B,CAAAA,oBAAoB,CAC/DX,KAAMlB,CAAAA,QAAQ,EACd,CAAC,EAAEE,cAAQ2B,oBAAoB,CAACC,UAAUZ,KAAMjB,CAAAA,WAAW,GAAG,CAAC;AAEjE,YAAA,IAAI,CAACI,UAAU,CAAC0B,OAAO,CAAC,CAACC,KAAAA,GAAAA;AACvB,gBAAA,IAAIA,KAAMC,CAAAA,MAAM,CAACL,cAAc,KAAKA,cAAgB,EAAA;AAClD,oBAAA,MAAM,IAAIhC,gBAAiB,CAAA,yBAAA,CAAA;AAC7B;AACF,aAAA,CAAA;YAEAuB,OACGe,CAAAA,MAAM,CAACvB,GACPwB,CAAAA,CAAAA,GAAG,CAAC,gBAAkBP,EAAAA,cAAAA,CAAAA,CACtBO,GAAG,CAAC;AAAC,gBAAA,MAAA;AAAQ,gBAAA;AAAc,aAAA,EAAEjB,KAAMjB,CAAAA,WAAW,CAC9CkC,CAAAA,GAAG,CAAC;AAAC,gBAAA,MAAA;AAAQ,gBAAA;AAAO,aAAA,EAAEjB,KAAMkB,CAAAA,IAAI,CAChCD,CAAAA,GAAG,CAAC;AAAC,gBAAA,MAAA;AAAQ,gBAAA;AAAc,aAAA,EAAEjB,KAAMmB,CAAAA,WAAW,CAC9CF,CAAAA,GAAG,CAAC,eAAA,EAAiBjB,KAAMoB,CAAAA,aAAa,CACxCH,CAAAA,GAAG,CAAC,QAAA,EAAUjB,MAAMqB,MAAM,CAAA;AAE7B,YAAA,IAAI,IAAI,CAAClC,UAAU,CAACmC,IAAI,KAAK,CAAG,EAAA;gBAC9BhB,MAAOiB,CAAAA,SAAS,CAACC,IAAI,CAAC,yBAAA,CAAA;aACjB,MAAA;gBACLlB,MAAOiB,CAAAA,SAAS,CAACC,IAAI,CAAC,oBAAA,CAAA;AACxB;AAEA,YAAA,IAAI,CAACrC,UAAU,CAAC8B,GAAG,CAACxB,GAAKQ,EAAAA,OAAAA,CAAAA;AAEzB,YAAA,IAAI,CAACT,yBAAyB,CAACC,GAAAA,EAAKO,MAAMN,UAAU,CAAA;YAEpD,OAAOO,OAAAA;AACT,SAAA;AAEA;;AAEC,QACDwB,eAAyBzB,KAAU,EAAA;YACjC,MAAM,EAAEP,GAAG,EAAE,GAAGO,KAAAA;AAEhB,YAAA,IAAI,CAAC,IAAI,CAACb,UAAU,CAACQ,GAAG,CAACF,GAAM,CAAA,EAAA;gBAC7B,MAAM,IAAId,YAAOD,CAAAA,gBAAgB,CAAC,oBAAA,CAAA;AACpC;AAEA,YAAA,MAAMY,YAAY,IAAI,CAACH,UAAU,CAACS,GAAG,CAACH,GAAAA,CAAAA;AAEtC,YAAA,MAAM,GAAGiC,OAAAA,CAAQ,GAAGjC,GAAAA,CAAIkC,KAAK,CAAC,GAAA,CAAA;AAE9B,YAAA,MAAMC,WAAc5C,GAAAA,aAAAA,CAAQC,UAAU,CAACe,MAAMlB,QAAQ,CAAA;AACrD,YAAA,MAAM+C,SAAS,CAAC,EAAED,YAAY,CAAC,EAAEF,QAAQ,CAAC;YAE1C,IAAIG,MAAAA,KAAWpC,OAAO,IAAI,CAACN,UAAU,CAACQ,GAAG,CAACkC,MAAS,CAAA,EAAA;gBACjD,MAAM,IAAIlD,YAAOD,CAAAA,gBAAgB,CAAC,8BAAA,CAAA;AACpC;YAEA,MAAMoD,MAAAA,GAAS1B,IAAKC,CAAAA,IAAI,CAACC,MAAAA,CAAOC,IAAI,CAACC,GAAG,CAACrB,UAAU,EAAEyC,WAAAA,CAAAA;AAErD,YAAA,MAAMG,aAAgBzC,GAAAA,SAAAA,CAAUyB,MAAM,CAACrB,UAAU;YAEjD,MAAMsC,aAAAA,GAAgBC,EAAEC,MAAM,CAAClC,MAAMN,UAAU,EAAE,CAACyC,IAAMC,EAAAA,GAAAA,GAAAA;gBACtD,OAAOH,CAAAA,CAAEtC,GAAG,CAACoC,aAAAA,EAAeK,QAAQ,CAACC,yBAAAA,CAAeN,aAAa,CAACK,GAAI,CAAA,CAAA;AACxE,aAAA,CAAA;AAEA9C,YAAAA,SAAAA,CACG0B,MAAM,CAACa,MAAAA,CAAAA,CACPS,MAAM,CAACR,MAAAA,CAAAA,CACPb,GAAG,CAAC;AAAC,gBAAA,MAAA;AAAQ,gBAAA;AAAc,aAAA,EAAEjB,KAAMjB,CAAAA,WAAW,CAC9CkC,CAAAA,GAAG,CAAC;AAAC,gBAAA,MAAA;AAAQ,gBAAA;AAAO,aAAA,EAAEjB,KAAMkB,CAAAA,IAAI,CAChCD,CAAAA,GAAG,CAAC;AAAC,gBAAA,MAAA;AAAQ,gBAAA;AAAc,aAAA,EAAEjB,KAAMmB,CAAAA,WAAW,CAC9CF,CAAAA,GAAG,CAAC,eAAiBjB,EAAAA,KAAAA,CAAMoB,aAAa,CAAA,CACxCvB,aAAa,CAAC,IAAI,CAACC,iBAAiB,CAACkC,aAAAA,CAAAA,CAAAA;AAExC,YAAA,IAAIH,WAAWpC,GAAK,EAAA;AAClB,gBAAA,IAAI,CAACN,UAAU,CAAC0B,OAAO,CAAC,CAACC,KAAAA,GAAAA;oBACvBA,KAAMyB,CAAAA,eAAe,CAAC9C,GAAKoC,EAAAA,MAAAA,CAAAA;AAC7B,iBAAA,CAAA;AAEA,gBAAA,IAAI,CAACW,YAAY,CAAC3B,OAAO,CAAC,CAAC4B,EAAAA,GAAAA;oBACzBA,EAAGF,CAAAA,eAAe,CAAC9C,GAAKoC,EAAAA,MAAAA,CAAAA;AAC1B,iBAAA,CAAA;AACF;YAEA,OAAOvC,SAAAA;AACT,SAAA;AAEAoD,QAAAA,eAAAA,CAAAA,CAA2BjD,GAA2B,EAAA;AACpD,YAAA,IAAI,CAAC,IAAI,CAACN,UAAU,CAACQ,GAAG,CAACF,GAAM,CAAA,EAAA;gBAC7B,MAAM,IAAId,YAAOD,CAAAA,gBAAgB,CAAC,oBAAA,CAAA;AACpC;AAEA,YAAA,IAAI,CAACS,UAAU,CAAC0B,OAAO,CAAC,CAACC,KAAAA,GAAAA;AACvBA,gBAAAA,KAAAA,CAAM6B,eAAe,CAAClD,GAAAA,CAAAA;AACxB,aAAA,CAAA;AAEA,YAAA,IAAI,CAAC+C,YAAY,CAAC3B,OAAO,CAAC,CAAC4B,EAAAA,GAAAA;AACzBA,gBAAAA,EAAAA,CAAGE,eAAe,CAAClD,GAAAA,CAAAA;AACrB,aAAA,CAAA;AAEA,YAAA,OAAO,IAAI,CAACN,UAAU,CAACS,GAAG,CAACH,KAAKmD,MAAM,EAAA;AACxC;AACF,KAAA;AACF;;;;"}
|
|
1
|
+
{"version":3,"file":"component-builder.js","sources":["../../../../server/src/services/schema-builder/component-builder.ts"],"sourcesContent":["import path from 'path';\nimport type { Internal } from '@strapi/types';\nimport _ from 'lodash';\nimport pluralize from 'pluralize';\n\nimport { strings, errors } from '@strapi/utils';\nimport { isConfigurable } from '../../utils/attributes';\nimport createSchemaHandler from './schema-handler';\n\nconst { ApplicationError } = errors;\n\nexport default function createComponentBuilder() {\n return {\n createComponentUID({ category, displayName }: any) {\n return `${strings.nameToSlug(category)}.${strings.nameToSlug(displayName)}`;\n },\n\n createNewComponentUIDMap(components: object[]) {\n return components.reduce((uidMap: any, component: any) => {\n uidMap[component.tmpUID] = this.createComponentUID(component);\n return uidMap;\n }, {});\n },\n\n createComponentAttributes(this: any, uid: string, attributes: any) {\n if (!this.components.has(uid)) {\n throw new ApplicationError('component.notFound');\n }\n\n return this.components.get(uid).setAttributes(this.convertAttributes(attributes));\n },\n\n /**\n * create a component in the tmpComponent map\n */\n createComponent(this: any, infos: any) {\n if (infos.uid && infos.uid !== this.createComponentUID(infos)) {\n throw new ApplicationError('component.invalidUID');\n }\n\n const uid = infos.uid ?? this.createComponentUID(infos);\n\n if (this.components.has(uid)) {\n throw new ApplicationError('component.alreadyExists');\n }\n\n const handler = createSchemaHandler({\n dir: path.join(strapi.dirs.app.components, strings.nameToSlug(infos.category)),\n filename: `${strings.nameToSlug(infos.displayName)}.json`,\n });\n\n // TODO: create a utility for this\n // Duplicate in admin/src/components/FormModal/forms/utils/createCollectionName.ts\n const collectionName = `components_${strings.nameToCollectionName(\n infos.category\n )}_${strings.nameToCollectionName(pluralize(infos.displayName))}`;\n\n this.components.forEach((compo: any) => {\n if (compo.schema.collectionName === collectionName) {\n throw new ApplicationError('component.alreadyExists');\n }\n });\n\n handler\n .setUID(uid)\n .set('collectionName', collectionName)\n .set(['info', 'displayName'], infos.displayName)\n .set(['info', 'icon'], infos.icon)\n .set(['info', 'description'], infos.description)\n .set('pluginOptions', infos.pluginOptions)\n .set('config', infos.config);\n\n if (this.components.size === 0) {\n strapi.telemetry.send('didCreateFirstComponent');\n } else {\n strapi.telemetry.send('didCreateComponent');\n }\n\n this.components.set(uid, handler);\n\n this.createComponentAttributes(uid, infos.attributes);\n\n return handler;\n },\n\n /**\n * create a component in the tmpComponent map\n */\n editComponent(this: any, infos: any) {\n const { uid } = infos;\n\n if (!this.components.has(uid)) {\n throw new errors.ApplicationError('component.notFound');\n }\n\n const component = this.components.get(uid);\n\n const [, nameUID] = uid.split('.');\n\n const newCategory = strings.nameToSlug(infos.category);\n const newUID = `${newCategory}.${nameUID}`;\n\n if (newUID !== uid && this.components.has(newUID)) {\n throw new errors.ApplicationError('component.edit.alreadyExists');\n }\n\n const newDir = path.join(strapi.dirs.app.components, newCategory);\n\n const oldAttributes = component.schema.attributes;\n\n const newAttributes = _.omitBy(infos.attributes, (attr, key) => {\n return _.has(oldAttributes, key) && !isConfigurable(oldAttributes[key]);\n });\n\n component\n .setUID(newUID)\n .setDir(newDir)\n .set(['info', 'displayName'], infos.displayName)\n .set(['info', 'icon'], infos.icon)\n .set(['info', 'description'], infos.description)\n .set('pluginOptions', infos.pluginOptions)\n .setAttributes(this.convertAttributes(newAttributes));\n\n if (newUID !== uid) {\n this.components.forEach((compo: any) => {\n compo.updateComponent(uid, newUID);\n });\n\n this.contentTypes.forEach((ct: any) => {\n ct.updateComponent(uid, newUID);\n });\n }\n\n return component;\n },\n\n deleteComponent(this: any, uid: Internal.UID.Component) {\n if (!this.components.has(uid)) {\n throw new errors.ApplicationError('component.notFound');\n }\n\n this.components.forEach((compo: any) => {\n compo.removeComponent(uid);\n });\n\n this.contentTypes.forEach((ct: any) => {\n ct.removeComponent(uid);\n });\n\n return this.components.get(uid).delete();\n },\n };\n}\n"],"names":["ApplicationError","errors","createComponentBuilder","createComponentUID","category","displayName","strings","nameToSlug","createNewComponentUIDMap","components","reduce","uidMap","component","tmpUID","createComponentAttributes","uid","attributes","has","get","setAttributes","convertAttributes","createComponent","infos","handler","createSchemaHandler","dir","path","join","strapi","dirs","app","filename","collectionName","nameToCollectionName","pluralize","forEach","compo","schema","setUID","set","icon","description","pluginOptions","config","size","telemetry","send","editComponent","nameUID","split","newCategory","newUID","newDir","oldAttributes","newAttributes","_","omitBy","attr","key","isConfigurable","setDir","updateComponent","contentTypes","ct","deleteComponent","removeComponent","delete"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-builder.mjs","sources":["../../../../server/src/services/schema-builder/component-builder.ts"],"sourcesContent":["import path from 'path';\nimport type { Internal } from '@strapi/types';\nimport _ from 'lodash';\nimport pluralize from 'pluralize';\n\nimport { strings, errors } from '@strapi/utils';\nimport { isConfigurable } from '../../utils/attributes';\nimport createSchemaHandler from './schema-handler';\n\nconst { ApplicationError } = errors;\n\nexport default function createComponentBuilder() {\n return {\n createComponentUID({ category, displayName }: any) {\n return `${strings.nameToSlug(category)}.${strings.nameToSlug(displayName)}`;\n },\n\n createNewComponentUIDMap(components: object[]) {\n return components.reduce((uidMap: any, component: any) => {\n uidMap[component.tmpUID] = this.createComponentUID(component);\n return uidMap;\n }, {});\n },\n\n createComponentAttributes(this: any, uid: string, attributes: any) {\n if (!this.components.has(uid)) {\n throw new ApplicationError('component.notFound');\n }\n\n return this.components.get(uid).setAttributes(this.convertAttributes(attributes));\n },\n\n /**\n * create a component in the tmpComponent map\n */\n createComponent(this: any, infos: any) {\n if (infos.uid && infos.uid !== this.createComponentUID(infos)) {\n throw new ApplicationError('component.invalidUID');\n }\n\n const uid = infos.uid ?? this.createComponentUID(infos);\n\n if (this.components.has(uid)) {\n throw new ApplicationError('component.alreadyExists');\n }\n\n const handler = createSchemaHandler({\n dir: path.join(strapi.dirs.app.components, strings.nameToSlug(infos.category)),\n filename: `${strings.nameToSlug(infos.displayName)}.json`,\n });\n\n // TODO: create a utility for this\n // Duplicate in admin/src/components/FormModal/forms/utils/createCollectionName.ts\n const collectionName = `components_${strings.nameToCollectionName(\n infos.category\n )}_${strings.nameToCollectionName(pluralize(infos.displayName))}`;\n\n this.components.forEach((compo: any) => {\n if (compo.schema.collectionName === collectionName) {\n throw new ApplicationError('component.alreadyExists');\n }\n });\n\n handler\n .setUID(uid)\n .set('collectionName', collectionName)\n .set(['info', 'displayName'], infos.displayName)\n .set(['info', 'icon'], infos.icon)\n .set(['info', 'description'], infos.description)\n .set('pluginOptions', infos.pluginOptions)\n .set('config', infos.config);\n\n if (this.components.size === 0) {\n strapi.telemetry.send('didCreateFirstComponent');\n } else {\n strapi.telemetry.send('didCreateComponent');\n }\n\n this.components.set(uid, handler);\n\n this.createComponentAttributes(uid, infos.attributes);\n\n return handler;\n },\n\n /**\n * create a component in the tmpComponent map\n */\n editComponent(this: any, infos: any) {\n const { uid } = infos;\n\n if (!this.components.has(uid)) {\n throw new errors.ApplicationError('component.notFound');\n }\n\n const component = this.components.get(uid);\n\n const [, nameUID] = uid.split('.');\n\n const newCategory = strings.nameToSlug(infos.category);\n const newUID = `${newCategory}.${nameUID}`;\n\n if (newUID !== uid && this.components.has(newUID)) {\n throw new errors.ApplicationError('component.edit.alreadyExists');\n }\n\n const newDir = path.join(strapi.dirs.app.components, newCategory);\n\n const oldAttributes = component.schema.attributes;\n\n const newAttributes = _.omitBy(infos.attributes, (attr, key) => {\n return _.has(oldAttributes, key) && !isConfigurable(oldAttributes[key]);\n });\n\n component\n .setUID(newUID)\n .setDir(newDir)\n .set(['info', 'displayName'], infos.displayName)\n .set(['info', 'icon'], infos.icon)\n .set(['info', 'description'], infos.description)\n .set('pluginOptions', infos.pluginOptions)\n .setAttributes(this.convertAttributes(newAttributes));\n\n if (newUID !== uid) {\n this.components.forEach((compo: any) => {\n compo.updateComponent(uid, newUID);\n });\n\n this.contentTypes.forEach((ct: any) => {\n ct.updateComponent(uid, newUID);\n });\n }\n\n return component;\n },\n\n deleteComponent(this: any, uid: Internal.UID.Component) {\n if (!this.components.has(uid)) {\n throw new errors.ApplicationError('component.notFound');\n }\n\n this.components.forEach((compo: any) => {\n compo.removeComponent(uid);\n });\n\n this.contentTypes.forEach((ct: any) => {\n ct.removeComponent(uid);\n });\n\n return this.components.get(uid).delete();\n },\n };\n}\n"],"names":["ApplicationError","errors","createComponentBuilder","createComponentUID","category","displayName","strings","nameToSlug","createNewComponentUIDMap","components","reduce","uidMap","component","tmpUID","createComponentAttributes","uid","attributes","has","get","setAttributes","convertAttributes","createComponent","infos","handler","createSchemaHandler","dir","path","join","strapi","dirs","app","filename","collectionName","nameToCollectionName","pluralize","forEach","compo","schema","setUID","set","icon","description","pluginOptions","config","size","telemetry","send","editComponent","nameUID","split","newCategory","newUID","newDir","oldAttributes","newAttributes","_","omitBy","attr","key","isConfigurable","setDir","updateComponent","contentTypes","ct","deleteComponent","removeComponent","delete"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"component-builder.mjs","sources":["../../../../server/src/services/schema-builder/component-builder.ts"],"sourcesContent":["import path from 'path';\nimport type { Internal } from '@strapi/types';\nimport _ from 'lodash';\nimport pluralize from 'pluralize';\n\nimport { strings, errors } from '@strapi/utils';\nimport { isConfigurable } from '../../utils/attributes';\nimport createSchemaHandler from './schema-handler';\n\nconst { ApplicationError } = errors;\n\nexport default function createComponentBuilder() {\n return {\n createComponentUID({ category, displayName }: any) {\n return `${strings.nameToSlug(category)}.${strings.nameToSlug(displayName)}`;\n },\n\n createNewComponentUIDMap(components: object[]) {\n return components.reduce((uidMap: any, component: any) => {\n uidMap[component.tmpUID] = this.createComponentUID(component);\n return uidMap;\n }, {});\n },\n\n createComponentAttributes(this: any, uid: string, attributes: any) {\n if (!this.components.has(uid)) {\n throw new ApplicationError('component.notFound');\n }\n\n return this.components.get(uid).setAttributes(this.convertAttributes(attributes));\n },\n\n /**\n * create a component in the tmpComponent map\n */\n createComponent(this: any, infos: any) {\n if (infos.uid && infos.uid !== this.createComponentUID(infos)) {\n throw new ApplicationError('component.invalidUID');\n }\n\n const uid = infos.uid ?? this.createComponentUID(infos);\n\n if (this.components.has(uid)) {\n throw new ApplicationError('component.alreadyExists');\n }\n\n const handler = createSchemaHandler({\n dir: path.join(strapi.dirs.app.components, strings.nameToSlug(infos.category)),\n filename: `${strings.nameToSlug(infos.displayName)}.json`,\n });\n\n // TODO: create a utility for this\n // Duplicate in admin/src/components/FormModal/forms/utils/createCollectionName.ts\n const collectionName = `components_${strings.nameToCollectionName(\n infos.category\n )}_${strings.nameToCollectionName(pluralize(infos.displayName))}`;\n\n this.components.forEach((compo: any) => {\n if (compo.schema.collectionName === collectionName) {\n throw new ApplicationError('component.alreadyExists');\n }\n });\n\n handler\n .setUID(uid)\n .set('collectionName', collectionName)\n .set(['info', 'displayName'], infos.displayName)\n .set(['info', 'icon'], infos.icon)\n .set(['info', 'description'], infos.description)\n .set('pluginOptions', infos.pluginOptions)\n .set('config', infos.config);\n\n if (this.components.size === 0) {\n strapi.telemetry.send('didCreateFirstComponent');\n } else {\n strapi.telemetry.send('didCreateComponent');\n }\n\n this.components.set(uid, handler);\n\n this.createComponentAttributes(uid, infos.attributes);\n\n return handler;\n },\n\n /**\n * create a component in the tmpComponent map\n */\n editComponent(this: any, infos: any) {\n const { uid } = infos;\n\n if (!this.components.has(uid)) {\n throw new errors.ApplicationError('component.notFound');\n }\n\n const component = this.components.get(uid);\n\n const [, nameUID] = uid.split('.');\n\n const newCategory = strings.nameToSlug(infos.category);\n const newUID = `${newCategory}.${nameUID}`;\n\n if (newUID !== uid && this.components.has(newUID)) {\n throw new errors.ApplicationError('component.edit.alreadyExists');\n }\n\n const newDir = path.join(strapi.dirs.app.components, newCategory);\n\n const oldAttributes = component.schema.attributes;\n\n const newAttributes = _.omitBy(infos.attributes, (attr, key) => {\n return _.has(oldAttributes, key) && !isConfigurable(oldAttributes[key]);\n });\n\n component\n .setUID(newUID)\n .setDir(newDir)\n .set(['info', 'displayName'], infos.displayName)\n .set(['info', 'icon'], infos.icon)\n .set(['info', 'description'], infos.description)\n .set('pluginOptions', infos.pluginOptions)\n .setAttributes(this.convertAttributes(newAttributes));\n\n if (newUID !== uid) {\n this.components.forEach((compo: any) => {\n compo.updateComponent(uid, newUID);\n });\n\n this.contentTypes.forEach((ct: any) => {\n ct.updateComponent(uid, newUID);\n });\n }\n\n return component;\n },\n\n deleteComponent(this: any, uid: Internal.UID.Component) {\n if (!this.components.has(uid)) {\n throw new errors.ApplicationError('component.notFound');\n }\n\n this.components.forEach((compo: any) => {\n compo.removeComponent(uid);\n });\n\n this.contentTypes.forEach((ct: any) => {\n ct.removeComponent(uid);\n });\n\n return this.components.get(uid).delete();\n },\n };\n}\n"],"names":["ApplicationError","errors","createComponentBuilder","createComponentUID","category","displayName","strings","nameToSlug","createNewComponentUIDMap","components","reduce","uidMap","component","tmpUID","createComponentAttributes","uid","attributes","has","get","setAttributes","convertAttributes","createComponent","infos","handler","createSchemaHandler","dir","path","join","strapi","dirs","app","filename","collectionName","nameToCollectionName","pluralize","forEach","compo","schema","setUID","set","icon","description","pluginOptions","config","size","telemetry","send","editComponent","nameUID","split","newCategory","newUID","newDir","oldAttributes","newAttributes","_","omitBy","attr","key","isConfigurable","setDir","updateComponent","contentTypes","ct","deleteComponent","removeComponent","delete"],"mappings":"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"}
|