@strapi/utils 5.50.1 → 5.51.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -19,6 +19,29 @@ declare const MORPH_TO_KEYS: string[];
19
19
  declare const DYNAMIC_ZONE_KEYS: string[];
20
20
  /** Relation operation keys (connect, disconnect, set, options). */
21
21
  declare const RELATION_OPERATION_KEYS: string[];
22
+ /**
23
+ * Reserved attribute names that cannot be used by user-defined content-type fields.
24
+ * Entries ending with `*` are treated as prefix matchers (e.g. `strapi*` blocks `strapi_foo`).
25
+ */
26
+ declare const RESERVED_ATTRIBUTE_NAMES: string[];
27
+ /**
28
+ * Reserved attribute names that only conflict when draftAndPublish is enabled.
29
+ * `status` is the v5 Document Service / REST query parameter for draft/published filtering.
30
+ */
31
+ declare const RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH: string[];
32
+ /** Reserved model (collection) names that cannot be used by user-defined content-types. */
33
+ declare const RESERVED_MODEL_NAMES: string[];
34
+ interface IsReservedAttributeNameOptions {
35
+ /** When true, draft-and-publish-specific names (e.g. `status`) are also reserved. Defaults to true. */
36
+ draftAndPublish?: boolean;
37
+ }
38
+ declare const isReservedAttributeName: (name: string, { draftAndPublish }?: IsReservedAttributeNameOptions) => boolean;
39
+ declare const isReservedModelName: (name: string) => boolean;
40
+ declare const getReservedAttributeNames: ({ draftAndPublish, }?: IsReservedAttributeNameOptions) => string[];
41
+ declare const getReservedModelNames: () => string[];
42
+ declare const findDraftAndPublishReservedAttributeNames: (attributeNames: Iterable<string>) => string[];
43
+ declare const getDraftAndPublishReservedAttributeWarning: (uid: string, attributeName: string) => string;
44
+ declare const getDraftAndPublishEnableBlockedMessage: (attributeNames: string[]) => string;
22
45
  declare const getTimestamps: (model: Model) => string[];
23
46
  declare const getCreatorFields: (model: Model) => string[];
24
47
  declare const getNonWritableAttributes: (model: Model) => string[];
@@ -78,5 +101,5 @@ declare const isTypedAttribute: (attribute: Attribute, type: string) => boolean;
78
101
  * @returns {string}
79
102
  */
80
103
  declare const getContentTypeRoutePrefix: (contentType: WithRequired<Model, "info">) => string;
81
- export { isSchema, isContentTypeSchema, isComponentSchema, isScalarAttribute, isMediaAttribute, isRelationalAttribute, hasRelationReordering, isComponentAttribute, isDynamicZoneAttribute, isMorphToRelationalAttribute, isTypedAttribute, getPrivateAttributes, isPrivateAttribute, constants, ID_FIELDS, MORPH_TO_KEYS, DYNAMIC_ZONE_KEYS, RELATION_OPERATION_KEYS, getNonWritableAttributes, getComponentAttributes, getMediaAttributes, getScalarAttributes, getRelationalAttributes, getWritableAttributes, isWritableAttribute, getNonVisibleAttributes, getVisibleAttributes, getTimestamps, getCreatorFields, isVisibleAttribute, getOptions, isDraft, hasDraftAndPublish, hasFirstPublishedAtField, isSingleType, isCollectionType, isKind, getContentTypeRoutePrefix, getDoesAttributeRequireValidation, };
104
+ export { isSchema, isContentTypeSchema, isComponentSchema, isScalarAttribute, isMediaAttribute, isRelationalAttribute, hasRelationReordering, isComponentAttribute, isDynamicZoneAttribute, isMorphToRelationalAttribute, isTypedAttribute, getPrivateAttributes, isPrivateAttribute, constants, ID_FIELDS, MORPH_TO_KEYS, DYNAMIC_ZONE_KEYS, RELATION_OPERATION_KEYS, RESERVED_ATTRIBUTE_NAMES, RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH, RESERVED_MODEL_NAMES, isReservedAttributeName, isReservedModelName, getReservedAttributeNames, getReservedModelNames, findDraftAndPublishReservedAttributeNames, getDraftAndPublishReservedAttributeWarning, getDraftAndPublishEnableBlockedMessage, getNonWritableAttributes, getComponentAttributes, getMediaAttributes, getScalarAttributes, getRelationalAttributes, getWritableAttributes, isWritableAttribute, getNonVisibleAttributes, getVisibleAttributes, getTimestamps, getCreatorFields, isVisibleAttribute, getOptions, isDraft, hasDraftAndPublish, hasFirstPublishedAtField, isSingleType, isCollectionType, isKind, getContentTypeRoutePrefix, getDoesAttributeRequireValidation, };
82
105
  //# sourceMappingURL=content-types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"content-types.d.ts","sourceRoot":"","sources":["../src/content-types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"content-types.d.ts","sourceRoot":"","sources":["../src/content-types.ts"],"names":[],"mappings":"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"}
@@ -45,6 +45,96 @@ const constants = {
45
45
  'set',
46
46
  'options'
47
47
  ];
48
+ /**
49
+ * Reserved attribute names that cannot be used by user-defined content-type fields.
50
+ * Entries ending with `*` are treated as prefix matchers (e.g. `strapi*` blocks `strapi_foo`).
51
+ */ // use snake_case
52
+ const RESERVED_ATTRIBUTE_NAMES = [
53
+ // ID fields
54
+ 'id',
55
+ 'document_id',
56
+ // Creator fields
57
+ 'created_at',
58
+ 'updated_at',
59
+ 'published_at',
60
+ // V6: we will need to add first_published_at when it becomes the default behaviour
61
+ 'created_by_id',
62
+ 'updated_by_id',
63
+ // does not actually conflict because the fields are called *_by_id but we'll leave it to avoid confusion
64
+ 'created_by',
65
+ 'updated_by',
66
+ // Used for Strapi functionality
67
+ 'entry_id',
68
+ 'localizations',
69
+ 'meta',
70
+ 'locale',
71
+ '__component',
72
+ '__contentType',
73
+ // We support ending with * to denote prefixes
74
+ 'strapi*',
75
+ '_strapi*',
76
+ '__strapi*'
77
+ ];
78
+ /**
79
+ * Reserved attribute names that only conflict when draftAndPublish is enabled.
80
+ * `status` is the v5 Document Service / REST query parameter for draft/published filtering.
81
+ */ // use snake_case
82
+ const RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH = [
83
+ 'status'
84
+ ];
85
+ /** Reserved model (collection) names that cannot be used by user-defined content-types. */ // use snake_case
86
+ const RESERVED_MODEL_NAMES = [
87
+ 'boolean',
88
+ 'date',
89
+ 'date_time',
90
+ 'time',
91
+ 'upload',
92
+ 'document',
93
+ 'then',
94
+ // We support ending with * to denote prefixes
95
+ 'strapi*',
96
+ '_strapi*',
97
+ '__strapi*'
98
+ ];
99
+ const matchesReservedName = (snakeCaseName, list)=>{
100
+ if (list.includes(snakeCaseName)) {
101
+ return true;
102
+ }
103
+ return list.filter((entry)=>entry.endsWith('*')).map((entry)=>entry.slice(0, -1)).some((prefix)=>snakeCaseName.startsWith(prefix));
104
+ };
105
+ // compare snake case to check the actual column names that will be used in the database
106
+ const isReservedAttributeName = (name, { draftAndPublish = true } = {})=>{
107
+ const snakeCaseName = fp.snakeCase(name);
108
+ if (matchesReservedName(snakeCaseName, RESERVED_ATTRIBUTE_NAMES)) {
109
+ return true;
110
+ }
111
+ if (draftAndPublish && matchesReservedName(snakeCaseName, RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH)) {
112
+ return true;
113
+ }
114
+ return false;
115
+ };
116
+ // compare snake case to check the actual column names that will be used in the database
117
+ const isReservedModelName = (name)=>{
118
+ return matchesReservedName(fp.snakeCase(name), RESERVED_MODEL_NAMES);
119
+ };
120
+ const getReservedAttributeNames = ({ draftAndPublish = true } = {})=>{
121
+ return draftAndPublish ? [
122
+ ...RESERVED_ATTRIBUTE_NAMES,
123
+ ...RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH
124
+ ] : [
125
+ ...RESERVED_ATTRIBUTE_NAMES
126
+ ];
127
+ };
128
+ const getReservedModelNames = ()=>[
129
+ ...RESERVED_MODEL_NAMES
130
+ ];
131
+ const findDraftAndPublishReservedAttributeNames = (attributeNames)=>{
132
+ return [
133
+ ...attributeNames
134
+ ].filter((name)=>matchesReservedName(fp.snakeCase(name), RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH));
135
+ };
136
+ const getDraftAndPublishReservedAttributeWarning = (uid, attributeName)=>`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.`;
137
+ const getDraftAndPublishEnableBlockedMessage = (attributeNames)=>`Cannot enable draft and publish while the following attribute names are reserved: ${attributeNames.join(', ')}. Rename them or remove them first.`;
48
138
  const getTimestamps = (model)=>{
49
139
  const attributes = [];
50
140
  if (fp.has(CREATED_AT_ATTRIBUTE, model.attributes)) {
@@ -199,17 +289,25 @@ exports.DYNAMIC_ZONE_KEYS = DYNAMIC_ZONE_KEYS;
199
289
  exports.ID_FIELDS = ID_FIELDS;
200
290
  exports.MORPH_TO_KEYS = MORPH_TO_KEYS;
201
291
  exports.RELATION_OPERATION_KEYS = RELATION_OPERATION_KEYS;
292
+ exports.RESERVED_ATTRIBUTE_NAMES = RESERVED_ATTRIBUTE_NAMES;
293
+ exports.RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH = RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH;
294
+ exports.RESERVED_MODEL_NAMES = RESERVED_MODEL_NAMES;
202
295
  exports.constants = constants;
296
+ exports.findDraftAndPublishReservedAttributeNames = findDraftAndPublishReservedAttributeNames;
203
297
  exports.getComponentAttributes = getComponentAttributes;
204
298
  exports.getContentTypeRoutePrefix = getContentTypeRoutePrefix;
205
299
  exports.getCreatorFields = getCreatorFields;
206
300
  exports.getDoesAttributeRequireValidation = getDoesAttributeRequireValidation;
301
+ exports.getDraftAndPublishEnableBlockedMessage = getDraftAndPublishEnableBlockedMessage;
302
+ exports.getDraftAndPublishReservedAttributeWarning = getDraftAndPublishReservedAttributeWarning;
207
303
  exports.getMediaAttributes = getMediaAttributes;
208
304
  exports.getNonVisibleAttributes = getNonVisibleAttributes;
209
305
  exports.getNonWritableAttributes = getNonWritableAttributes;
210
306
  exports.getOptions = getOptions;
211
307
  exports.getPrivateAttributes = getPrivateAttributes;
212
308
  exports.getRelationalAttributes = getRelationalAttributes;
309
+ exports.getReservedAttributeNames = getReservedAttributeNames;
310
+ exports.getReservedModelNames = getReservedModelNames;
213
311
  exports.getScalarAttributes = getScalarAttributes;
214
312
  exports.getTimestamps = getTimestamps;
215
313
  exports.getVisibleAttributes = getVisibleAttributes;
@@ -228,6 +326,8 @@ exports.isMediaAttribute = isMediaAttribute;
228
326
  exports.isMorphToRelationalAttribute = isMorphToRelationalAttribute;
229
327
  exports.isPrivateAttribute = isPrivateAttribute;
230
328
  exports.isRelationalAttribute = isRelationalAttribute;
329
+ exports.isReservedAttributeName = isReservedAttributeName;
330
+ exports.isReservedModelName = isReservedModelName;
231
331
  exports.isScalarAttribute = isScalarAttribute;
232
332
  exports.isSchema = isSchema;
233
333
  exports.isSingleType = isSingleType;
@@ -1 +1 @@
1
- {"version":3,"file":"content-types.js","sources":["../src/content-types.ts"],"sourcesContent":["import _ from 'lodash';\nimport { has, getOr, union } 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\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 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","getTimestamps","model","attributes","has","push","getCreatorFields","getNonWritableAttributes","nonWritableAttributes","_","reduce","acc","attr","attrName","writable","concat","uniq","getWritableAttributes","difference","Object","keys","isWritableAttribute","attributeName","includes","getNonVisibleAttributes","nonVisibleAttributes","visible","getVisibleAttributes","isVisibleAttribute","getOptions","assign","draftAndPublish","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","startsWith","getComponentAttributes","schema","getMediaAttributes","getScalarAttributes","getRelationalAttributes","isTypedAttribute","getContentTypeRoutePrefix","contentType","kebabCase","info","singularName","pluralName"],"mappings":"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"}
1
+ {"version":3,"file":"content-types.js","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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"}
@@ -1,5 +1,5 @@
1
1
  import ___default from 'lodash';
2
- import { union, getOr, has } from 'lodash/fp';
2
+ import { union, getOr, snakeCase, has } from 'lodash/fp';
3
3
 
4
4
  const SINGLE_TYPE = 'singleType';
5
5
  const COLLECTION_TYPE = 'collectionType';
@@ -39,6 +39,96 @@ const constants = {
39
39
  'set',
40
40
  'options'
41
41
  ];
42
+ /**
43
+ * Reserved attribute names that cannot be used by user-defined content-type fields.
44
+ * Entries ending with `*` are treated as prefix matchers (e.g. `strapi*` blocks `strapi_foo`).
45
+ */ // use snake_case
46
+ const RESERVED_ATTRIBUTE_NAMES = [
47
+ // ID fields
48
+ 'id',
49
+ 'document_id',
50
+ // Creator fields
51
+ 'created_at',
52
+ 'updated_at',
53
+ 'published_at',
54
+ // V6: we will need to add first_published_at when it becomes the default behaviour
55
+ 'created_by_id',
56
+ 'updated_by_id',
57
+ // does not actually conflict because the fields are called *_by_id but we'll leave it to avoid confusion
58
+ 'created_by',
59
+ 'updated_by',
60
+ // Used for Strapi functionality
61
+ 'entry_id',
62
+ 'localizations',
63
+ 'meta',
64
+ 'locale',
65
+ '__component',
66
+ '__contentType',
67
+ // We support ending with * to denote prefixes
68
+ 'strapi*',
69
+ '_strapi*',
70
+ '__strapi*'
71
+ ];
72
+ /**
73
+ * Reserved attribute names that only conflict when draftAndPublish is enabled.
74
+ * `status` is the v5 Document Service / REST query parameter for draft/published filtering.
75
+ */ // use snake_case
76
+ const RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH = [
77
+ 'status'
78
+ ];
79
+ /** Reserved model (collection) names that cannot be used by user-defined content-types. */ // use snake_case
80
+ const RESERVED_MODEL_NAMES = [
81
+ 'boolean',
82
+ 'date',
83
+ 'date_time',
84
+ 'time',
85
+ 'upload',
86
+ 'document',
87
+ 'then',
88
+ // We support ending with * to denote prefixes
89
+ 'strapi*',
90
+ '_strapi*',
91
+ '__strapi*'
92
+ ];
93
+ const matchesReservedName = (snakeCaseName, list)=>{
94
+ if (list.includes(snakeCaseName)) {
95
+ return true;
96
+ }
97
+ return list.filter((entry)=>entry.endsWith('*')).map((entry)=>entry.slice(0, -1)).some((prefix)=>snakeCaseName.startsWith(prefix));
98
+ };
99
+ // compare snake case to check the actual column names that will be used in the database
100
+ const isReservedAttributeName = (name, { draftAndPublish = true } = {})=>{
101
+ const snakeCaseName = snakeCase(name);
102
+ if (matchesReservedName(snakeCaseName, RESERVED_ATTRIBUTE_NAMES)) {
103
+ return true;
104
+ }
105
+ if (draftAndPublish && matchesReservedName(snakeCaseName, RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH)) {
106
+ return true;
107
+ }
108
+ return false;
109
+ };
110
+ // compare snake case to check the actual column names that will be used in the database
111
+ const isReservedModelName = (name)=>{
112
+ return matchesReservedName(snakeCase(name), RESERVED_MODEL_NAMES);
113
+ };
114
+ const getReservedAttributeNames = ({ draftAndPublish = true } = {})=>{
115
+ return draftAndPublish ? [
116
+ ...RESERVED_ATTRIBUTE_NAMES,
117
+ ...RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH
118
+ ] : [
119
+ ...RESERVED_ATTRIBUTE_NAMES
120
+ ];
121
+ };
122
+ const getReservedModelNames = ()=>[
123
+ ...RESERVED_MODEL_NAMES
124
+ ];
125
+ const findDraftAndPublishReservedAttributeNames = (attributeNames)=>{
126
+ return [
127
+ ...attributeNames
128
+ ].filter((name)=>matchesReservedName(snakeCase(name), RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH));
129
+ };
130
+ const getDraftAndPublishReservedAttributeWarning = (uid, attributeName)=>`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.`;
131
+ const getDraftAndPublishEnableBlockedMessage = (attributeNames)=>`Cannot enable draft and publish while the following attribute names are reserved: ${attributeNames.join(', ')}. Rename them or remove them first.`;
42
132
  const getTimestamps = (model)=>{
43
133
  const attributes = [];
44
134
  if (has(CREATED_AT_ATTRIBUTE, model.attributes)) {
@@ -189,5 +279,5 @@ const getRelationalAttributes = (schema)=>{
189
279
  return isSingleType(contentType) ? ___default.kebabCase(contentType.info.singularName) : ___default.kebabCase(contentType.info.pluralName);
190
280
  };
191
281
 
192
- export { DYNAMIC_ZONE_KEYS, ID_FIELDS, MORPH_TO_KEYS, RELATION_OPERATION_KEYS, constants, getComponentAttributes, getContentTypeRoutePrefix, getCreatorFields, getDoesAttributeRequireValidation, getMediaAttributes, getNonVisibleAttributes, getNonWritableAttributes, getOptions, getPrivateAttributes, getRelationalAttributes, getScalarAttributes, getTimestamps, getVisibleAttributes, getWritableAttributes, hasDraftAndPublish, hasFirstPublishedAtField, hasRelationReordering, isCollectionType, isComponentAttribute, isComponentSchema, isContentTypeSchema, isDraft, isDynamicZoneAttribute, isKind, isMediaAttribute, isMorphToRelationalAttribute, isPrivateAttribute, isRelationalAttribute, isScalarAttribute, isSchema, isSingleType, isTypedAttribute, isVisibleAttribute, isWritableAttribute };
282
+ export { DYNAMIC_ZONE_KEYS, ID_FIELDS, MORPH_TO_KEYS, RELATION_OPERATION_KEYS, RESERVED_ATTRIBUTE_NAMES, RESERVED_ATTRIBUTE_NAMES_DRAFT_PUBLISH, RESERVED_MODEL_NAMES, constants, findDraftAndPublishReservedAttributeNames, getComponentAttributes, getContentTypeRoutePrefix, getCreatorFields, getDoesAttributeRequireValidation, getDraftAndPublishEnableBlockedMessage, getDraftAndPublishReservedAttributeWarning, getMediaAttributes, getNonVisibleAttributes, getNonWritableAttributes, getOptions, getPrivateAttributes, getRelationalAttributes, getReservedAttributeNames, getReservedModelNames, getScalarAttributes, getTimestamps, getVisibleAttributes, getWritableAttributes, hasDraftAndPublish, hasFirstPublishedAtField, hasRelationReordering, isCollectionType, isComponentAttribute, isComponentSchema, isContentTypeSchema, isDraft, isDynamicZoneAttribute, isKind, isMediaAttribute, isMorphToRelationalAttribute, isPrivateAttribute, isRelationalAttribute, isReservedAttributeName, isReservedModelName, isScalarAttribute, isSchema, isSingleType, isTypedAttribute, isVisibleAttribute, isWritableAttribute };
193
283
  //# sourceMappingURL=content-types.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"content-types.mjs","sources":["../src/content-types.ts"],"sourcesContent":["import _ from 'lodash';\nimport { has, getOr, union } 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\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 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","getTimestamps","model","attributes","has","push","getCreatorFields","getNonWritableAttributes","nonWritableAttributes","_","reduce","acc","attr","attrName","writable","concat","uniq","getWritableAttributes","difference","Object","keys","isWritableAttribute","attributeName","includes","getNonVisibleAttributes","nonVisibleAttributes","visible","getVisibleAttributes","isVisibleAttribute","getOptions","assign","draftAndPublish","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","startsWith","getComponentAttributes","schema","getMediaAttributes","getScalarAttributes","getRelationalAttributes","isTypedAttribute","getContentTypeRoutePrefix","contentType","kebabCase","info","singularName","pluralName"],"mappings":"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"}
1
+ {"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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"convert-query-params.d.ts","sourceRoot":"","sources":["../src/convert-query-params.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"convert-query-params.d.ts","sourceRoot":"","sources":["../src/convert-query-params.ts"],"names":[],"mappings":"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"}
@@ -47,6 +47,11 @@ class InvalidSortError extends errors.ValidationError {
47
47
  super('Invalid sort parameter. Expected a string, an array of strings, a sort object or an array of sort objects');
48
48
  }
49
49
  }
50
+ class InvalidPopulateError extends errors.ValidationError {
51
+ constructor(){
52
+ super('Invalid populate parameter. Expected a string, an array of strings, a populate object');
53
+ }
54
+ }
50
55
  function validateOrder(order) {
51
56
  if (!fp.isString(order) || ![
52
57
  'asc',
@@ -92,13 +97,13 @@ const createTransformer = ({ getModel })=>{
92
97
  return {};
93
98
  }
94
99
  if (!fp.isString(trimmed)) {
95
- throw new Error('Invalid sort query');
100
+ throw new errors.ValidationError('Invalid sort query');
96
101
  }
97
102
  // split field and order param with default order to ascending
98
103
  const [rawField, order = 'asc'] = trimmed.split(':');
99
104
  const field = rawField.trim();
100
105
  if (field.length === 0) {
101
- throw new Error('Field cannot be empty');
106
+ throw new errors.ValidationError('Field cannot be empty');
102
107
  }
103
108
  validateOrder(order.trim());
104
109
  // TODO: field should be a valid path on an object model
@@ -121,7 +126,7 @@ const createTransformer = ({ getModel })=>{
121
126
  transformedSort[field] = trimmedOrder;
122
127
  }
123
128
  } else {
124
- throw Error(`Invalid sort type expected object or string got ${typeof order}`);
129
+ throw new errors.ValidationError(`Invalid sort type expected object or string got ${typeof order}`);
125
130
  }
126
131
  }
127
132
  return transformedSort;
@@ -178,12 +183,6 @@ const createTransformer = ({ getModel })=>{
178
183
  throw new errors.PaginationError('Invalid pagination attributes. The page parameters are incorrect and must be in the pagination object');
179
184
  }
180
185
  };
181
- class InvalidPopulateError extends Error {
182
- constructor(){
183
- super();
184
- this.message = 'Invalid populate parameter. Expected a string, an array of strings, a populate object';
185
- }
186
- }
187
186
  // NOTE: we could support foo.* or foo.bar.* etc later on
188
187
  const convertPopulateQueryParams = (populate, schema, depth = 0)=>{
189
188
  if (depth === 0 && populate === '*') {