@strapi/utils
Version:
Shared utilities for the Strapi packages
1 lines • 25.4 kB
Source Map (JSON)
{"version":3,"file":"content-types.mjs","sources":["../src/content-types.ts"],"sourcesContent":["import _ from 'lodash';\nimport { has, getOr, union, snakeCase } from 'lodash/fp';\nimport type {\n Model,\n Kind,\n Attribute,\n RelationalAttribute,\n ComponentAttribute,\n DynamicZoneAttribute,\n WithRequired,\n} from './types';\n\nconst SINGLE_TYPE = 'singleType';\nconst COLLECTION_TYPE = 'collectionType';\n\nconst ID_ATTRIBUTE = 'id';\nconst DOC_ID_ATTRIBUTE = 'documentId';\n\nconst PUBLISHED_AT_ATTRIBUTE = 'publishedAt';\nconst FIRST_PUBLISHED_AT_ATTRIBUTE = 'firstPublishedAt';\nconst CREATED_BY_ATTRIBUTE = 'createdBy';\nconst UPDATED_BY_ATTRIBUTE = 'updatedBy';\n\nconst CREATED_AT_ATTRIBUTE = 'createdAt';\nconst UPDATED_AT_ATTRIBUTE = 'updatedAt';\n\nconst constants = {\n ID_ATTRIBUTE,\n DOC_ID_ATTRIBUTE,\n PUBLISHED_AT_ATTRIBUTE,\n FIRST_PUBLISHED_AT_ATTRIBUTE,\n CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n CREATED_AT_ATTRIBUTE,\n UPDATED_AT_ATTRIBUTE,\n SINGLE_TYPE,\n COLLECTION_TYPE,\n};\n\n/** ID-like fields accepted at root level and on relations/media/components (validate/sanitize traversal). */\nconst ID_FIELDS: string[] = [ID_ATTRIBUTE, DOC_ID_ATTRIBUTE];\n/** Keys accepted on morphTo relation payloads (e.g. __type). */\nconst MORPH_TO_KEYS: string[] = ['__type'];\n/** Keys accepted on dynamic zone component payloads (e.g. __component). */\nconst DYNAMIC_ZONE_KEYS: string[] = ['__component'];\n/** Relation operation keys (connect, disconnect, set, options). */\nconst RELATION_OPERATION_KEYS: string[] = ['connect', 'disconnect', 'set', 'options'];\n\n/**\n * Reserved attribute names that cannot be used by user-defined content-type fields.\n * Entries ending with `*` are treated as prefix matchers (e.g. `strapi*` blocks `strapi_foo`).\n */\n// use snake_case\nconst RESERVED_ATTRIBUTE_NAMES: string[] = [\n // ID fields\n 'id',\n 'document_id',\n\n // Creator fields\n 'created_at',\n 'updated_at',\n 'published_at',\n // V6: we will need to add first_published_at when it becomes the default behaviour\n 'created_by_id',\n 'updated_by_id',\n // does not actually conflict because the fields are called *_by_id but we'll leave it to avoid confusion\n 'created_by',\n 'updated_by',\n\n // Used for Strapi functionality\n 'entry_id',\n 'localizations',\n 'meta',\n 'locale',\n '__component',\n '__contentType',\n\n // We support ending with * to denote prefixes\n 'strapi*',\n '_strapi*',\n '__strapi*',\n];\n\n/**\n * Reserved attribute names that only conflict when draftAndPublish is enabled.\n * `status` is the v5 Document Service / REST query parameter for draft/published filtering.\n */\n// use snake_case\nconst RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH: string[] = ['status'];\n\n/** Reserved model (collection) names that cannot be used by user-defined content-types. */\n// use snake_case\nconst RESERVED_MODEL_NAMES: string[] = [\n 'boolean',\n 'date',\n 'date_time',\n 'time',\n 'upload',\n 'document',\n 'then', // no longer an issue but still restricting for being a javascript keyword\n\n // We support ending with * to denote prefixes\n 'strapi*',\n '_strapi*',\n '__strapi*',\n];\n\nconst matchesReservedName = (snakeCaseName: string, list: string[]): boolean => {\n if (list.includes(snakeCaseName)) {\n return true;\n }\n\n return list\n .filter((entry) => entry.endsWith('*'))\n .map((entry) => entry.slice(0, -1))\n .some((prefix) => snakeCaseName.startsWith(prefix));\n};\n\ninterface IsReservedAttributeNameOptions {\n /** When true, draft-and-publish-specific names (e.g. `status`) are also reserved. Defaults to true. */\n draftAndPublish?: boolean;\n}\n\n// compare snake case to check the actual column names that will be used in the database\nconst isReservedAttributeName = (\n name: string,\n { draftAndPublish = true }: IsReservedAttributeNameOptions = {}\n): boolean => {\n const snakeCaseName = snakeCase(name);\n\n if (matchesReservedName(snakeCaseName, RESERVED_ATTRIBUTE_NAMES)) {\n return true;\n }\n\n if (\n draftAndPublish &&\n matchesReservedName(snakeCaseName, RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH)\n ) {\n return true;\n }\n\n return false;\n};\n\n// compare snake case to check the actual column names that will be used in the database\nconst isReservedModelName = (name: string): boolean => {\n return matchesReservedName(snakeCase(name), RESERVED_MODEL_NAMES);\n};\n\nconst getReservedAttributeNames = ({\n draftAndPublish = true,\n}: IsReservedAttributeNameOptions = {}): string[] => {\n return draftAndPublish\n ? [...RESERVED_ATTRIBUTE_NAMES, ...RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH]\n : [...RESERVED_ATTRIBUTE_NAMES];\n};\n\nconst getReservedModelNames = (): string[] => [...RESERVED_MODEL_NAMES];\n\nconst findDraftAndPublishReservedAttributeNames = (attributeNames: Iterable<string>): string[] => {\n return [...attributeNames].filter((name) =>\n matchesReservedName(snakeCase(name), RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH)\n );\n};\n\nconst getDraftAndPublishReservedAttributeWarning = (uid: string, attributeName: string): string =>\n `The attribute name '${attributeName}' on content type '${uid}' is reserved when 'draftAndPublish' is enabled. It conflicts with the Document Service / REST 'status' query parameter. Rename the attribute or disable the 'draftAndPublish' option.`;\n\nconst getDraftAndPublishEnableBlockedMessage = (attributeNames: string[]): string =>\n `Cannot enable draft and publish while the following attribute names are reserved: ${attributeNames.join(', ')}. Rename them or remove them first.`;\n\nconst getTimestamps = (model: Model) => {\n const attributes: string[] = [];\n\n if (has(CREATED_AT_ATTRIBUTE, model.attributes)) {\n attributes.push(CREATED_AT_ATTRIBUTE);\n }\n\n if (has(UPDATED_AT_ATTRIBUTE, model.attributes)) {\n attributes.push(UPDATED_AT_ATTRIBUTE);\n }\n\n return attributes;\n};\n\nconst getCreatorFields = (model: Model) => {\n const attributes: string[] = [];\n\n if (has(CREATED_BY_ATTRIBUTE, model.attributes)) {\n attributes.push(CREATED_BY_ATTRIBUTE);\n }\n\n if (has(UPDATED_BY_ATTRIBUTE, model.attributes)) {\n attributes.push(UPDATED_BY_ATTRIBUTE);\n }\n\n return attributes;\n};\n\nconst getNonWritableAttributes = (model: Model) => {\n if (!model) return [];\n\n const nonWritableAttributes = _.reduce(\n model.attributes,\n (acc, attr, attrName) => (attr.writable === false ? acc.concat(attrName) : acc),\n [] as string[]\n );\n\n return _.uniq([\n ID_ATTRIBUTE,\n DOC_ID_ATTRIBUTE,\n ...getTimestamps(model),\n ...nonWritableAttributes,\n ]);\n};\n\nconst getWritableAttributes = (model: Model) => {\n if (!model) return [];\n\n return _.difference(Object.keys(model.attributes), getNonWritableAttributes(model));\n};\n\nconst isWritableAttribute = (model: Model, attributeName: string) => {\n return getWritableAttributes(model).includes(attributeName);\n};\n\nconst getNonVisibleAttributes = (model: Model) => {\n const nonVisibleAttributes = _.reduce(\n model.attributes,\n (acc, attr, attrName) => (attr.visible === false ? acc.concat(attrName) : acc),\n [] as string[]\n );\n\n return _.uniq([\n ID_ATTRIBUTE,\n DOC_ID_ATTRIBUTE,\n PUBLISHED_AT_ATTRIBUTE,\n ...getTimestamps(model),\n ...nonVisibleAttributes,\n ]);\n};\n\nconst getVisibleAttributes = (model: Model) => {\n return _.difference(_.keys(model.attributes), getNonVisibleAttributes(model));\n};\n\nconst isVisibleAttribute = (model: Model, attributeName: string) => {\n return getVisibleAttributes(model).includes(attributeName);\n};\n\nconst getOptions = (model: Model) =>\n _.assign({ draftAndPublish: false }, _.get(model, 'options', {}));\n\nconst hasDraftAndPublish = (model: Model) =>\n _.get(model, 'options.draftAndPublish', false) === true;\n\nconst hasFirstPublishedAtField = (model: Model) =>\n strapi.config.get('features.future.experimental_firstPublishedAt', false) &&\n hasDraftAndPublish(model);\n\nconst isDraft = <T extends object>(data: T, model: Model) =>\n hasDraftAndPublish(model) && _.get(data, PUBLISHED_AT_ATTRIBUTE) === null;\n\nconst isSchema = (data: unknown): data is Model => {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'modelType' in data &&\n typeof data.modelType === 'string' &&\n ['component', 'contentType'].includes(data.modelType)\n );\n};\n\nconst isComponentSchema = (data: unknown): data is Model & { modelType: 'component' } => {\n return isSchema(data) && data.modelType === 'component';\n};\n\nconst isContentTypeSchema = (data: unknown): data is Model & { modelType: 'contentType' } => {\n return isSchema(data) && data.modelType === 'contentType';\n};\n\nconst isSingleType = ({ kind = COLLECTION_TYPE }) => kind === SINGLE_TYPE;\nconst isCollectionType = ({ kind = COLLECTION_TYPE }) => kind === COLLECTION_TYPE;\nconst isKind = (kind: Kind) => (model: Model) => model.kind === kind;\n\nconst getStoredPrivateAttributes = (model: Model) =>\n union(\n (strapi?.config?.get('api.responses.privateAttributes', []) ?? []) as Array<string>,\n getOr([], 'options.privateAttributes', model)\n );\n\nconst getPrivateAttributes = (model: Model) => {\n return _.union(\n getStoredPrivateAttributes(model),\n _.keys(_.pickBy(model.attributes, (attr) => !!attr.private))\n );\n};\n\nconst isPrivateAttribute = (model: Model, attributeName: string) => {\n if (model?.attributes?.[attributeName]?.private === true) {\n return true;\n }\n return getStoredPrivateAttributes(model).includes(attributeName);\n};\n\nconst isScalarAttribute = (attribute?: Attribute) => {\n return attribute && !['media', 'component', 'relation', 'dynamiczone'].includes(attribute.type);\n};\n\nconst getDoesAttributeRequireValidation = (attribute: Attribute) => {\n return (\n attribute.required ||\n attribute.unique ||\n Object.prototype.hasOwnProperty.call(attribute, 'max') ||\n Object.prototype.hasOwnProperty.call(attribute, 'min') ||\n Object.prototype.hasOwnProperty.call(attribute, 'maxLength') ||\n Object.prototype.hasOwnProperty.call(attribute, 'minLength')\n );\n};\nconst isMediaAttribute = (attribute?: Attribute) => attribute?.type === 'media';\nconst isRelationalAttribute = (attribute?: Attribute): attribute is RelationalAttribute =>\n attribute?.type === 'relation';\n\nconst HAS_RELATION_REORDERING = ['manyToMany', 'manyToOne', 'oneToMany'];\nconst hasRelationReordering = (attribute?: Attribute) =>\n isRelationalAttribute(attribute) && HAS_RELATION_REORDERING.includes(attribute.relation);\n\nconst isComponentAttribute = (\n attribute?: Attribute\n): attribute is ComponentAttribute | DynamicZoneAttribute =>\n !!attribute && ['component', 'dynamiczone'].includes(attribute.type);\n\nconst isDynamicZoneAttribute = (attribute?: Attribute): attribute is DynamicZoneAttribute =>\n !!attribute && attribute.type === 'dynamiczone';\nconst isMorphToRelationalAttribute = (attribute?: Attribute) => {\n return (\n !!attribute && isRelationalAttribute(attribute) && attribute.relation?.startsWith?.('morphTo')\n );\n};\n\nconst getComponentAttributes = (schema: Model) => {\n return _.reduce(\n schema.attributes,\n (acc, attr, attrName) => {\n if (isComponentAttribute(attr)) acc.push(attrName);\n return acc;\n },\n [] as string[]\n );\n};\n\nconst getMediaAttributes = (schema: Model) => {\n return _.reduce(\n schema.attributes,\n (acc, attr, attrName) => {\n if (isMediaAttribute(attr)) acc.push(attrName);\n return acc;\n },\n [] as string[]\n );\n};\n\nconst getScalarAttributes = (schema: Model) => {\n return _.reduce(\n schema.attributes,\n (acc, attr, attrName) => {\n if (isScalarAttribute(attr)) acc.push(attrName);\n return acc;\n },\n [] as string[]\n );\n};\n\nconst getRelationalAttributes = (schema: Model) => {\n return _.reduce(\n schema.attributes,\n (acc, attr, attrName) => {\n if (isRelationalAttribute(attr)) acc.push(attrName);\n return acc;\n },\n [] as string[]\n );\n};\n\n/**\n * Checks if an attribute is of type `type`\n * @param {object} attribute\n * @param {string} type\n */\nconst isTypedAttribute = (attribute: Attribute, type: string) => {\n return _.has(attribute, 'type') && attribute.type === type;\n};\n\n/**\n * Returns a route prefix for a contentType\n * @param {object} contentType\n * @returns {string}\n */\nconst getContentTypeRoutePrefix = (contentType: WithRequired<Model, 'info'>) => {\n return isSingleType(contentType)\n ? _.kebabCase(contentType.info.singularName)\n : _.kebabCase(contentType.info.pluralName);\n};\n\nexport {\n isSchema,\n isContentTypeSchema,\n isComponentSchema,\n isScalarAttribute,\n isMediaAttribute,\n isRelationalAttribute,\n hasRelationReordering,\n isComponentAttribute,\n isDynamicZoneAttribute,\n isMorphToRelationalAttribute,\n isTypedAttribute,\n getPrivateAttributes,\n isPrivateAttribute,\n constants,\n ID_FIELDS,\n MORPH_TO_KEYS,\n DYNAMIC_ZONE_KEYS,\n RELATION_OPERATION_KEYS,\n RESERVED_ATTRIBUTE_NAMES,\n RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH,\n RESERVED_MODEL_NAMES,\n isReservedAttributeName,\n isReservedModelName,\n getReservedAttributeNames,\n getReservedModelNames,\n findDraftAndPublishReservedAttributeNames,\n getDraftAndPublishReservedAttributeWarning,\n getDraftAndPublishEnableBlockedMessage,\n getNonWritableAttributes,\n getComponentAttributes,\n getMediaAttributes,\n getScalarAttributes,\n getRelationalAttributes,\n getWritableAttributes,\n isWritableAttribute,\n getNonVisibleAttributes,\n getVisibleAttributes,\n getTimestamps,\n getCreatorFields,\n isVisibleAttribute,\n getOptions,\n isDraft,\n hasDraftAndPublish,\n hasFirstPublishedAtField,\n isSingleType,\n isCollectionType,\n isKind,\n getContentTypeRoutePrefix,\n getDoesAttributeRequireValidation,\n};\n"],"names":["SINGLE_TYPE","COLLECTION_TYPE","ID_ATTRIBUTE","DOC_ID_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","FIRST_PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","CREATED_AT_ATTRIBUTE","UPDATED_AT_ATTRIBUTE","constants","ID_FIELDS","MORPH_TO_KEYS","DYNAMIC_ZONE_KEYS","RELATION_OPERATION_KEYS","RESERVED_ATTRIBUTE_NAMES","RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH","RESERVED_MODEL_NAMES","matchesReservedName","snakeCaseName","list","includes","filter","entry","endsWith","map","slice","some","prefix","startsWith","isReservedAttributeName","name","draftAndPublish","snakeCase","isReservedModelName","getReservedAttributeNames","getReservedModelNames","findDraftAndPublishReservedAttributeNames","attributeNames","getDraftAndPublishReservedAttributeWarning","uid","attributeName","getDraftAndPublishEnableBlockedMessage","join","getTimestamps","model","attributes","has","push","getCreatorFields","getNonWritableAttributes","nonWritableAttributes","_","reduce","acc","attr","attrName","writable","concat","uniq","getWritableAttributes","difference","Object","keys","isWritableAttribute","getNonVisibleAttributes","nonVisibleAttributes","visible","getVisibleAttributes","isVisibleAttribute","getOptions","assign","get","hasDraftAndPublish","hasFirstPublishedAtField","strapi","config","isDraft","data","isSchema","modelType","isComponentSchema","isContentTypeSchema","isSingleType","kind","isCollectionType","isKind","getStoredPrivateAttributes","union","getOr","getPrivateAttributes","pickBy","private","isPrivateAttribute","isScalarAttribute","attribute","type","getDoesAttributeRequireValidation","required","unique","prototype","hasOwnProperty","call","isMediaAttribute","isRelationalAttribute","HAS_RELATION_REORDERING","hasRelationReordering","relation","isComponentAttribute","isDynamicZoneAttribute","isMorphToRelationalAttribute","getComponentAttributes","schema","getMediaAttributes","getScalarAttributes","getRelationalAttributes","isTypedAttribute","getContentTypeRoutePrefix","contentType","kebabCase","info","singularName","pluralName"],"mappings":"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"}