@strapi/utils 5.50.1 → 5.50.2
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/content-types.d.ts +24 -1
- package/dist/content-types.d.ts.map +1 -1
- package/dist/content-types.js +100 -0
- package/dist/content-types.js.map +1 -1
- package/dist/content-types.mjs +92 -2
- package/dist/content-types.mjs.map +1 -1
- package/dist/convert-query-params.d.ts.map +1 -1
- package/dist/convert-query-params.js +8 -9
- package/dist/convert-query-params.js.map +1 -1
- package/dist/convert-query-params.mjs +8 -9
- package/dist/convert-query-params.mjs.map +1 -1
- package/package.json +8 -6
package/dist/content-types.d.ts
CHANGED
|
@@ -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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"}
|
package/dist/content-types.js
CHANGED
|
@@ -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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"}
|
package/dist/content-types.mjs
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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 === '*') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convert-query-params.js","sources":["../src/convert-query-params.ts"],"sourcesContent":["/* eslint-disable max-classes-per-file */\n\n/**\n * Converts the standard Strapi REST query params to a more usable format for querying\n * You can read more here: https://docs.strapi.io/developer-docs/latest/developer-resources/database-apis-reference/rest-api.html#filters\n */\n\nimport _ from 'lodash';\nimport {\n cloneDeep,\n get,\n isArray,\n isEmpty,\n isInteger,\n isNil,\n isObject,\n isString,\n toNumber,\n} from 'lodash/fp';\nimport {\n constants,\n hasDraftAndPublish,\n isDynamicZoneAttribute,\n isMorphToRelationalAttribute,\n} from './content-types';\nimport { PaginationError, ValidationError } from './errors';\nimport { isOperator } from './operators';\n\nimport parseType from './parse-type';\nimport type { PublicationFilterMode } from './publication-filter';\nimport {\n getMeaningfulSortSegments,\n hasSort,\n type SortParams,\n type SortParamsObject,\n} from './sort-query';\nimport { Model } from './types';\n\nexport type { SortParams, SortParamsObject } from './sort-query';\n\nconst { ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, PUBLISHED_AT_ATTRIBUTE } = constants;\n\ntype SortOrder = 'asc' | 'desc';\n\nexport interface SortMap {\n [key: string]: SortOrder | SortMap;\n}\n\ntype FieldsParams = string | string[];\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => _.isPlainObject(value);\n\nfunction isEmptySortMap(sortMap: SortMap): boolean {\n const keys = Object.keys(sortMap);\n\n if (keys.length === 0) {\n return true;\n }\n\n return keys.every((key) => {\n const value = sortMap[key];\n\n if (typeof value === 'string') {\n return value.trim().length === 0;\n }\n\n if (isPlainObject(value)) {\n return isEmptySortMap(value as SortMap);\n }\n\n return true;\n });\n}\n\n/** Drops empty sort maps so a trailing comma does not leave a truthy but meaningless `orderBy`. */\nfunction normalizeOrderBy(orderBy: OrderByQuery): OrderByQuery | undefined {\n if (Array.isArray(orderBy)) {\n const filtered = orderBy.filter((sortMap) => !isEmptySortMap(sortMap));\n\n return filtered.length > 0 ? filtered : undefined;\n }\n\n return isEmptySortMap(orderBy) ? undefined : orderBy;\n}\n\ntype FiltersParams = unknown;\n\nexport interface PopulateAttributesParams {\n [key: string]: boolean | PopulateObjectParams;\n}\n\nexport interface PopulateObjectParams {\n sort?: SortParams;\n fields?: FieldsParams;\n filters?: FiltersParams;\n populate?: string | string[] | PopulateAttributesParams;\n on?: PopulateAttributesParams;\n count?: boolean;\n ordering?: unknown;\n _q?: string;\n limit?: number | string;\n start?: number | string;\n page?: number | string;\n pageSize?: number | string;\n}\n\ntype PopulateParams = string | string[] | PopulateAttributesParams;\n\nexport interface Params {\n sort?: SortParams;\n fields?: FieldsParams;\n filters?: FiltersParams;\n populate?: PopulateParams;\n count?: boolean;\n ordering?: unknown;\n _q?: string;\n limit?: number | string;\n start?: number | string;\n page?: number | string;\n pageSize?: number | string;\n status?: 'draft' | 'published';\n publicationFilter?: PublicationFilterMode;\n /**\n * @deprecated Replaced by `publicationFilter` (`never-published`, `has-published-version`, …).\n * Retained for backward compatibility with existing REST and GraphQL clients.\n */\n hasPublishedVersion?: boolean | 'true' | 'false';\n}\n\ntype FiltersQuery = (options: { meta: Model }) => WhereQuery | undefined;\ntype OrderByQuery = SortMap | SortMap[];\ntype SelectQuery = string | string[];\n\nexport interface WhereQuery {\n [key: string]: any;\n}\n\ntype PopulateQuery =\n | boolean\n | string[]\n | {\n [key: string]: PopulateQuery;\n };\n\nexport interface Query {\n orderBy?: OrderByQuery;\n select?: SelectQuery;\n where?: WhereQuery;\n // NOTE: those are internal DB filters do not modify\n filters?: FiltersQuery;\n populate?: PopulateQuery;\n count?: boolean;\n ordering?: unknown;\n _q?: string;\n limit?: number;\n offset?: number;\n page?: number;\n pageSize?: number;\n}\n\nclass InvalidOrderError extends ValidationError {\n constructor() {\n super('Invalid order. order can only be one of asc|desc|ASC|DESC');\n }\n}\n\nclass InvalidSortError extends ValidationError {\n constructor() {\n super(\n 'Invalid sort parameter. Expected a string, an array of strings, a sort object or an array of sort objects'\n );\n }\n}\n\nfunction validateOrder(order: string): asserts order is SortOrder {\n if (!isString(order) || !['asc', 'desc'].includes(order.toLocaleLowerCase())) {\n throw new InvalidOrderError();\n }\n}\n\nconst convertCountQueryParams = (countQuery: unknown): boolean => {\n return parseType({ type: 'boolean', value: countQuery });\n};\n\nconst convertOrderingQueryParams = (ordering: unknown) => {\n return ordering;\n};\n\nconst isStringArray = (value: unknown): value is string[] =>\n isArray(value) && value.every(isString);\n\ninterface TransformerOptions {\n getModel: (uid: string) => Model | undefined;\n}\n\nconst createTransformer = ({ getModel }: TransformerOptions) => {\n /**\n * Sort query parser\n */\n const convertSortQueryParams = (sortQuery: SortParams): OrderByQuery => {\n if (typeof sortQuery === 'string') {\n return convertStringSortQueryParam(sortQuery);\n }\n\n if (isStringArray(sortQuery)) {\n return sortQuery.flatMap((sortValue: string) => convertStringSortQueryParam(sortValue));\n }\n\n if (Array.isArray(sortQuery)) {\n return sortQuery.map((sortValue) => convertNestedSortQueryParam(sortValue));\n }\n\n if (isPlainObject(sortQuery)) {\n return convertNestedSortQueryParam(sortQuery);\n }\n\n throw new InvalidSortError();\n };\n\n const convertStringSortQueryParam = (sortQuery: string): SortMap[] => {\n return getMeaningfulSortSegments(sortQuery).map((segment) =>\n convertSingleSortQueryParam(segment)\n );\n };\n\n const convertSingleSortQueryParam = (sortQuery: string): SortMap => {\n const trimmed = sortQuery.trim();\n\n if (!trimmed) {\n return {};\n }\n\n if (!isString(trimmed)) {\n throw new Error('Invalid sort query');\n }\n\n // split field and order param with default order to ascending\n const [rawField, order = 'asc'] = trimmed.split(':');\n const field = rawField.trim();\n\n if (field.length === 0) {\n throw new Error('Field cannot be empty');\n }\n\n validateOrder(order.trim());\n\n // TODO: field should be a valid path on an object model\n\n return _.set({}, field, order.trim());\n };\n\n const convertNestedSortQueryParam = (sortQuery: SortParamsObject): SortMap => {\n const transformedSort: SortMap = {};\n for (const field of Object.keys(sortQuery)) {\n const order = sortQuery[field];\n\n // this is a deep sort\n if (isPlainObject(order)) {\n const nested = convertNestedSortQueryParam(order as SortParamsObject);\n\n if (!isEmptySortMap(nested)) {\n transformedSort[field] = nested;\n }\n } else if (typeof order === 'string') {\n const trimmedOrder = order.trim();\n\n if (trimmedOrder.length > 0) {\n validateOrder(trimmedOrder);\n transformedSort[field] = trimmedOrder;\n }\n } else {\n throw Error(`Invalid sort type expected object or string got ${typeof order}`);\n }\n }\n\n return transformedSort;\n };\n\n const applySortToQuery = (query: Query, sortParam?: SortParams | null) => {\n if (!hasSort(sortParam)) {\n return;\n }\n\n const orderBy = normalizeOrderBy(convertSortQueryParams(sortParam));\n\n if (orderBy !== undefined) {\n query.orderBy = orderBy;\n }\n };\n\n /**\n * Start query parser\n */\n const convertStartQueryParams = (startQuery: unknown): number => {\n const startAsANumber = toNumber(startQuery);\n\n if (!_.isInteger(startAsANumber) || startAsANumber < 0) {\n throw new ValidationError(\n `convertStartQueryParams expected a positive integer got ${startAsANumber}`\n );\n }\n\n return startAsANumber;\n };\n\n /**\n * Limit query parser\n */\n const convertLimitQueryParams = (limitQuery: unknown): number | undefined => {\n const limitAsANumber = toNumber(limitQuery);\n\n if (!_.isInteger(limitAsANumber) || (limitAsANumber !== -1 && limitAsANumber < 0)) {\n throw new ValidationError(\n `convertLimitQueryParams expected a positive integer got ${limitAsANumber}`\n );\n }\n\n if (limitAsANumber === -1) {\n return undefined;\n }\n\n return limitAsANumber;\n };\n\n const convertPageQueryParams = (page: unknown): number => {\n const pageVal = toNumber(page);\n\n if (!isInteger(pageVal) || pageVal <= 0) {\n throw new PaginationError(\n `Invalid 'page' parameter. Expected an integer > 0, received: ${page}`\n );\n }\n\n return pageVal;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const convertPageSizeQueryParams = (pageSize: unknown, _page: unknown): number => {\n const pageSizeVal = toNumber(pageSize);\n\n if (!isInteger(pageSizeVal) || pageSizeVal <= 0) {\n throw new PaginationError(\n `Invalid 'pageSize' parameter. Expected an integer > 0, received: ${pageSize}`\n );\n }\n\n return pageSizeVal;\n };\n\n const validatePaginationParams = (\n page: unknown,\n pageSize: unknown,\n start: unknown,\n limit: unknown\n ) => {\n const isPagePagination = !isNil(page) || !isNil(pageSize);\n const isOffsetPagination = !isNil(start) || !isNil(limit);\n\n if (isPagePagination && isOffsetPagination) {\n throw new PaginationError(\n 'Invalid pagination attributes. The page parameters are incorrect and must be in the pagination object'\n );\n }\n };\n\n class InvalidPopulateError extends Error {\n constructor() {\n super();\n this.message =\n 'Invalid populate parameter. Expected a string, an array of strings, a populate object';\n }\n }\n\n // NOTE: we could support foo.* or foo.bar.* etc later on\n const convertPopulateQueryParams = (\n populate: PopulateParams,\n schema?: Model,\n depth = 0\n ): PopulateQuery => {\n if (depth === 0 && populate === '*') {\n return true;\n }\n\n if (typeof populate === 'string') {\n return populate.split(',').map((value) => _.trim(value));\n }\n\n if (Array.isArray(populate)) {\n // map convert\n return _.uniq(\n populate.flatMap((value) => {\n if (typeof value !== 'string') {\n throw new InvalidPopulateError();\n }\n\n return value.split(',').map((value) => _.trim(value));\n })\n );\n }\n\n if (_.isPlainObject(populate)) {\n return convertPopulateObject(populate, schema);\n }\n\n throw new InvalidPopulateError();\n };\n\n const hasPopulateFragmentDefined = (\n populate: PopulateObjectParams\n ): populate is PopulateObjectParams & Required<Pick<PopulateObjectParams, 'on'>> => {\n return typeof populate === 'object' && 'on' in populate && !isNil(populate.on);\n };\n\n const hasCountDefined = (\n populate: PopulateObjectParams\n ): populate is PopulateObjectParams & { count: boolean } => {\n return (\n typeof populate === 'object' && 'count' in populate && typeof populate.count === 'boolean'\n );\n };\n\n const convertPopulateObject = (populate: PopulateAttributesParams, schema?: Model) => {\n if (!schema) {\n return {};\n }\n\n const { attributes } = schema;\n return Object.entries(populate).reduce((acc, [key, subPopulate]) => {\n // Try converting strings to regular booleans if possible\n if (_.isString(subPopulate)) {\n try {\n const subPopulateAsBoolean = parseType({ type: 'boolean', value: subPopulate });\n // Only true is accepted as a boolean populate value\n return subPopulateAsBoolean ? { ...acc, [key]: true } : acc;\n } catch {\n // ignore\n }\n }\n\n if (_.isBoolean(subPopulate)) {\n // Only true is accepted as a boolean populate value\n return subPopulate === true ? { ...acc, [key]: true } : acc;\n }\n\n const attribute = attributes[key];\n\n if (!attribute) {\n return acc;\n }\n\n // Allow adding an 'on' strategy to populate queries for morphTo relations and dynamic zones\n const isMorphLikeRelationalAttribute =\n isDynamicZoneAttribute(attribute) || isMorphToRelationalAttribute(attribute);\n\n if (isMorphLikeRelationalAttribute) {\n const hasInvalidProperties = Object.keys(subPopulate).some(\n (key) => !['populate', 'on', 'count'].includes(key)\n );\n\n if (hasInvalidProperties) {\n throw new ValidationError(\n `Invalid nested populate for ${schema.info?.singularName}.${key} (${schema.uid}). Expected a fragment (\"on\") or \"count\" but found ${JSON.stringify(subPopulate)}`\n );\n }\n\n /**\n * Validate nested population queries in the context of a polymorphic attribute (dynamic zone, morph relation).\n *\n * If 'populate' exists in subPopulate, its value should be constrained to a wildcard ('*').\n */\n if (\n 'populate' in subPopulate &&\n !isNil(subPopulate.populate) &&\n subPopulate.populate !== '*'\n ) {\n throw new ValidationError(\n `Invalid nested population query detected. When using 'populate' within polymorphic structures, ` +\n `its value must be '*' to indicate all second level links. Specific field targeting is not supported here. ` +\n `Consider using the fragment API for more granular population control.`\n );\n }\n\n // TODO: Remove the possibility to have multiple properties at the same time (on/count/populate)\n const newSubPopulate = {};\n\n // case: { populate: '*' }\n if ('populate' in subPopulate && subPopulate.populate === '*') {\n Object.assign(newSubPopulate, { populate: true });\n }\n\n // case: { on: { <clauses> } }\n if (hasPopulateFragmentDefined(subPopulate)) {\n // If the fragment API is used, it applies the transformation to every\n // sub-populate, then assign the result to the new sub-populate\n Object.assign(newSubPopulate, {\n on: Object.entries(subPopulate.on).reduce(\n (acc, [type, typeSubPopulate]) => ({\n ...acc,\n [type]: convertNestedPopulate(typeSubPopulate, getModel(type)),\n }),\n {}\n ),\n });\n }\n\n // case: { count: true | false }\n if (hasCountDefined(subPopulate)) {\n Object.assign(newSubPopulate, { count: subPopulate.count });\n }\n\n return { ...acc, [key]: newSubPopulate };\n }\n\n // Edge case when trying to use the fragment ('on') on a non-morph like attribute\n if (!isMorphLikeRelationalAttribute && hasPopulateFragmentDefined(subPopulate)) {\n throw new ValidationError(\n `Using fragments is not permitted to populate \"${key}\" in \"${schema.uid}\"`\n );\n }\n\n // NOTE: Retrieve the target schema UID.\n // Only handles basic relations, medias and component since it's not possible\n // to populate with options for a dynamic zone or a polymorphic relation\n let targetSchemaUID;\n\n if (attribute.type === 'relation') {\n targetSchemaUID = attribute.target;\n } else if (attribute.type === 'component') {\n targetSchemaUID = attribute.component;\n } else if (attribute.type === 'media') {\n targetSchemaUID = 'plugin::upload.file';\n } else {\n return acc;\n }\n\n const targetSchema = getModel(targetSchemaUID!);\n\n // ignore the sub-populate for the current key if there is no schema associated\n if (!targetSchema) {\n return acc;\n }\n\n const populateObject = convertNestedPopulate(subPopulate, targetSchema);\n\n if (!populateObject) {\n return acc;\n }\n\n return {\n ...acc,\n [key]: populateObject,\n };\n }, {});\n };\n\n const convertNestedPopulate = (subPopulate: boolean | PopulateObjectParams, schema?: Model) => {\n if (_.isString(subPopulate)) {\n return parseType({ type: 'boolean', value: subPopulate, forceCast: true });\n }\n\n if (_.isBoolean(subPopulate)) {\n return subPopulate;\n }\n\n if (!isPlainObject(subPopulate)) {\n throw new ValidationError(`Invalid nested populate. Expected '*' or an object`);\n }\n\n const { sort, filters, fields, populate, count, ordering, page, pageSize, start, limit } =\n subPopulate as PopulateObjectParams;\n\n const query: Query = {};\n\n applySortToQuery(query, sort);\n\n if (filters) {\n query.where = convertFiltersQueryParams(filters, schema);\n }\n\n if (fields) {\n query.select = convertFieldsQueryParams(fields, schema);\n }\n\n if (populate) {\n query.populate = convertPopulateQueryParams(populate, schema);\n }\n\n if (count) {\n query.count = convertCountQueryParams(count);\n }\n\n if (ordering) {\n query.ordering = convertOrderingQueryParams(ordering);\n }\n\n validatePaginationParams(page, pageSize, start, limit);\n\n if (!isNil(page)) {\n query.page = convertPageQueryParams(page);\n }\n\n if (!isNil(pageSize)) {\n query.pageSize = convertPageSizeQueryParams(pageSize, page);\n }\n\n if (!isNil(start)) {\n query.offset = convertStartQueryParams(start);\n }\n\n if (!isNil(limit)) {\n query.limit = convertLimitQueryParams(limit);\n }\n\n return query;\n };\n\n // TODO: ensure field is valid in content types (will probably have to check strapi.contentTypes since it can be a string.path)\n const convertFieldsQueryParams = (\n fields: FieldsParams,\n schema?: Model,\n depth = 0\n ): SelectQuery | undefined => {\n if (depth === 0 && fields === '*') {\n return undefined;\n }\n\n if (typeof fields === 'string') {\n const fieldsValues = fields.split(',').map((value) => _.trim(value));\n\n // NOTE: Only include the doc id if it's a content type\n if (schema?.modelType === 'contentType') {\n return _.uniq([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, ...fieldsValues]);\n }\n return _.uniq([ID_ATTRIBUTE, ...fieldsValues]);\n }\n\n if (isStringArray(fields)) {\n // map convert\n const fieldsValues = fields\n .flatMap((value) => convertFieldsQueryParams(value, schema, depth + 1))\n .filter((v) => !isNil(v)) as string[];\n\n // NOTE: Only include the doc id if it's a content type\n if (schema?.modelType === 'contentType') {\n return _.uniq([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, ...fieldsValues]);\n }\n return _.uniq([ID_ATTRIBUTE, ...fieldsValues]);\n }\n\n throw new ValidationError('Invalid fields parameter. Expected a string or an array of strings');\n };\n\n const isValidSchemaAttribute = (key: string, schema?: Model) => {\n if ([DOC_ID_ATTRIBUTE, ID_ATTRIBUTE].includes(key)) {\n return true;\n }\n\n if (!schema) {\n return false;\n }\n\n return Object.keys(schema.attributes).includes(key);\n };\n\n const convertFiltersQueryParams = (filters: FiltersParams, schema?: Model): WhereQuery => {\n // Filters need to be either an array or an object\n // Here we're only checking for 'object' type since typeof [] => object and typeof {} => object\n if (!isObject(filters)) {\n throw new ValidationError('The filters parameter must be an object or an array');\n }\n\n // Don't mutate the original object\n const filtersCopy = cloneDeep(filters);\n\n return convertAndSanitizeFilters(filtersCopy, schema);\n };\n\n const convertAndSanitizeFilters = (filters: FiltersParams, schema?: Model): WhereQuery => {\n if (Array.isArray(filters)) {\n return (\n filters\n // Sanitize each filter\n .map((filter) => convertAndSanitizeFilters(filter, schema))\n // Filter out empty filters\n .filter((filter) => !isPlainObject(filter) || !isEmpty(filter))\n );\n }\n\n if (!isPlainObject(filters)) {\n return filters as WhereQuery;\n }\n\n const removeOperator = (operator: string) => delete filters[operator];\n\n // Here, `key` can either be an operator or an attribute name\n for (const [key, value] of Object.entries(filters)) {\n const attribute = get(key, schema?.attributes);\n const validKey = isOperator(key) || isValidSchemaAttribute(key, schema);\n\n if (!validKey) {\n removeOperator(key);\n }\n // Handle attributes\n else if (attribute) {\n // Relations\n if (attribute.type === 'relation') {\n filters[key] = convertAndSanitizeFilters(value, getModel(attribute.target!));\n }\n\n // Components\n else if (attribute.type === 'component') {\n filters[key] = convertAndSanitizeFilters(value, getModel(attribute.component));\n }\n\n // Media\n else if (attribute.type === 'media') {\n filters[key] = convertAndSanitizeFilters(value, getModel('plugin::upload.file'));\n }\n\n // Dynamic Zones\n else if (attribute.type === 'dynamiczone') {\n removeOperator(key);\n }\n\n // Password attributes\n else if (attribute.type === 'password') {\n // Always remove password attributes from filters object\n removeOperator(key);\n }\n\n // Scalar attributes\n else {\n filters[key] = convertAndSanitizeFilters(value, schema);\n }\n }\n\n // Handle operators\n else if (['$null', '$notNull'].includes(key)) {\n filters[key] = parseType({ type: 'boolean', value: filters[key], forceCast: true });\n } else if (isObject(value)) {\n filters[key] = convertAndSanitizeFilters(value, schema);\n }\n\n // Remove empty objects & arrays\n if (isPlainObject(filters[key]) && isEmpty(filters[key])) {\n removeOperator(key);\n }\n }\n\n return filters;\n };\n\n const convertStatusParams = (status?: 'draft' | 'published', query: Query = {}) => {\n // NOTE: this is the query layer filters not the document/entity service filters\n query.filters = ({ meta }: { meta: Model }) => {\n const contentType = getModel(meta.uid);\n\n // Ignore if target model has disabled DP, as it doesn't make sense to filter by its status\n if (!contentType || !hasDraftAndPublish(contentType)) {\n return {};\n }\n\n return { [PUBLISHED_AT_ATTRIBUTE]: { $null: status === 'draft' } };\n };\n };\n\n const transformQueryParams = (uid: string, params: Params): Query => {\n // NOTE: can be a CT, a Compo or nothing in the case of polymorphism (DZ & morph relations)\n const schema = getModel(uid);\n\n const query: Query = {};\n\n const {\n _q: searchQuery,\n sort,\n filters,\n fields,\n populate,\n page,\n pageSize,\n start,\n limit,\n status,\n ...rest\n } = params;\n\n if (!isNil(status)) {\n convertStatusParams(status, query);\n }\n\n if (!isNil(searchQuery)) {\n query._q = searchQuery;\n }\n\n applySortToQuery(query, sort);\n\n if (!isNil(filters)) {\n query.where = convertFiltersQueryParams(filters, schema);\n }\n\n if (!isNil(fields)) {\n query.select = convertFieldsQueryParams(fields, schema);\n }\n\n if (!isNil(populate)) {\n query.populate = convertPopulateQueryParams(populate, schema);\n }\n\n validatePaginationParams(page, pageSize, start, limit);\n\n if (!isNil(page)) {\n query.page = convertPageQueryParams(page);\n }\n\n if (!isNil(pageSize)) {\n query.pageSize = convertPageSizeQueryParams(pageSize, page);\n }\n\n if (!isNil(start)) {\n query.offset = convertStartQueryParams(start);\n }\n\n if (!isNil(limit)) {\n query.limit = convertLimitQueryParams(limit);\n }\n\n return {\n ...rest,\n ...query,\n };\n };\n\n return {\n private_convertSortQueryParams: convertSortQueryParams,\n private_convertStartQueryParams: convertStartQueryParams,\n private_convertLimitQueryParams: convertLimitQueryParams,\n private_convertPopulateQueryParams: convertPopulateQueryParams,\n private_convertFiltersQueryParams: convertFiltersQueryParams,\n private_convertFieldsQueryParams: convertFieldsQueryParams,\n transformQueryParams,\n };\n};\n\nexport { createTransformer };\n"],"names":["ID_ATTRIBUTE","DOC_ID_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","constants","isPlainObject","value","_","isEmptySortMap","sortMap","keys","Object","length","every","key","trim","normalizeOrderBy","orderBy","Array","isArray","filtered","filter","undefined","InvalidOrderError","ValidationError","InvalidSortError","validateOrder","order","isString","includes","toLocaleLowerCase","convertCountQueryParams","countQuery","parseType","type","convertOrderingQueryParams","ordering","isStringArray","createTransformer","getModel","convertSortQueryParams","sortQuery","convertStringSortQueryParam","flatMap","sortValue","map","convertNestedSortQueryParam","getMeaningfulSortSegments","segment","convertSingleSortQueryParam","trimmed","Error","rawField","split","field","set","transformedSort","nested","trimmedOrder","applySortToQuery","query","sortParam","hasSort","convertStartQueryParams","startQuery","startAsANumber","toNumber","isInteger","convertLimitQueryParams","limitQuery","limitAsANumber","convertPageQueryParams","page","pageVal","PaginationError","convertPageSizeQueryParams","pageSize","_page","pageSizeVal","validatePaginationParams","start","limit","isPagePagination","isNil","isOffsetPagination","InvalidPopulateError","message","convertPopulateQueryParams","populate","schema","depth","uniq","convertPopulateObject","hasPopulateFragmentDefined","on","hasCountDefined","count","attributes","entries","reduce","acc","subPopulate","subPopulateAsBoolean","isBoolean","attribute","isMorphLikeRelationalAttribute","isDynamicZoneAttribute","isMorphToRelationalAttribute","hasInvalidProperties","some","info","singularName","uid","JSON","stringify","newSubPopulate","assign","typeSubPopulate","convertNestedPopulate","targetSchemaUID","target","component","targetSchema","populateObject","forceCast","sort","filters","fields","where","convertFiltersQueryParams","select","convertFieldsQueryParams","offset","fieldsValues","modelType","v","isValidSchemaAttribute","isObject","filtersCopy","cloneDeep","convertAndSanitizeFilters","isEmpty","removeOperator","operator","get","validKey","isOperator","convertStatusParams","status","meta","contentType","hasDraftAndPublish","$null","transformQueryParams","params","_q","searchQuery","rest","private_convertSortQueryParams","private_convertStartQueryParams","private_convertLimitQueryParams","private_convertPopulateQueryParams","private_convertFiltersQueryParams","private_convertFieldsQueryParams"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"convert-query-params.js","sources":["../src/convert-query-params.ts"],"sourcesContent":["/* eslint-disable max-classes-per-file */\n\n/**\n * Converts the standard Strapi REST query params to a more usable format for querying\n * You can read more here: https://docs.strapi.io/developer-docs/latest/developer-resources/database-apis-reference/rest-api.html#filters\n */\n\nimport _ from 'lodash';\nimport {\n cloneDeep,\n get,\n isArray,\n isEmpty,\n isInteger,\n isNil,\n isObject,\n isString,\n toNumber,\n} from 'lodash/fp';\nimport {\n constants,\n hasDraftAndPublish,\n isDynamicZoneAttribute,\n isMorphToRelationalAttribute,\n} from './content-types';\nimport { PaginationError, ValidationError } from './errors';\nimport { isOperator } from './operators';\n\nimport parseType from './parse-type';\nimport type { PublicationFilterMode } from './publication-filter';\nimport {\n getMeaningfulSortSegments,\n hasSort,\n type SortParams,\n type SortParamsObject,\n} from './sort-query';\nimport { Model } from './types';\n\nexport type { SortParams, SortParamsObject } from './sort-query';\n\nconst { ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, PUBLISHED_AT_ATTRIBUTE } = constants;\n\ntype SortOrder = 'asc' | 'desc';\n\nexport interface SortMap {\n [key: string]: SortOrder | SortMap;\n}\n\ntype FieldsParams = string | string[];\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => _.isPlainObject(value);\n\nfunction isEmptySortMap(sortMap: SortMap): boolean {\n const keys = Object.keys(sortMap);\n\n if (keys.length === 0) {\n return true;\n }\n\n return keys.every((key) => {\n const value = sortMap[key];\n\n if (typeof value === 'string') {\n return value.trim().length === 0;\n }\n\n if (isPlainObject(value)) {\n return isEmptySortMap(value as SortMap);\n }\n\n return true;\n });\n}\n\n/** Drops empty sort maps so a trailing comma does not leave a truthy but meaningless `orderBy`. */\nfunction normalizeOrderBy(orderBy: OrderByQuery): OrderByQuery | undefined {\n if (Array.isArray(orderBy)) {\n const filtered = orderBy.filter((sortMap) => !isEmptySortMap(sortMap));\n\n return filtered.length > 0 ? filtered : undefined;\n }\n\n return isEmptySortMap(orderBy) ? undefined : orderBy;\n}\n\ntype FiltersParams = unknown;\n\nexport interface PopulateAttributesParams {\n [key: string]: boolean | PopulateObjectParams;\n}\n\nexport interface PopulateObjectParams {\n sort?: SortParams;\n fields?: FieldsParams;\n filters?: FiltersParams;\n populate?: string | string[] | PopulateAttributesParams;\n on?: PopulateAttributesParams;\n count?: boolean;\n ordering?: unknown;\n _q?: string;\n limit?: number | string;\n start?: number | string;\n page?: number | string;\n pageSize?: number | string;\n}\n\ntype PopulateParams = string | string[] | PopulateAttributesParams;\n\nexport interface Params {\n sort?: SortParams;\n fields?: FieldsParams;\n filters?: FiltersParams;\n populate?: PopulateParams;\n count?: boolean;\n ordering?: unknown;\n _q?: string;\n limit?: number | string;\n start?: number | string;\n page?: number | string;\n pageSize?: number | string;\n status?: 'draft' | 'published';\n publicationFilter?: PublicationFilterMode;\n /**\n * @deprecated Replaced by `publicationFilter` (`never-published`, `has-published-version`, …).\n * Retained for backward compatibility with existing REST and GraphQL clients.\n */\n hasPublishedVersion?: boolean | 'true' | 'false';\n}\n\ntype FiltersQuery = (options: { meta: Model }) => WhereQuery | undefined;\ntype OrderByQuery = SortMap | SortMap[];\ntype SelectQuery = string | string[];\n\nexport interface WhereQuery {\n [key: string]: any;\n}\n\ntype PopulateQuery =\n | boolean\n | string[]\n | {\n [key: string]: PopulateQuery;\n };\n\nexport interface Query {\n orderBy?: OrderByQuery;\n select?: SelectQuery;\n where?: WhereQuery;\n // NOTE: those are internal DB filters do not modify\n filters?: FiltersQuery;\n populate?: PopulateQuery;\n count?: boolean;\n ordering?: unknown;\n _q?: string;\n limit?: number;\n offset?: number;\n page?: number;\n pageSize?: number;\n}\n\nclass InvalidOrderError extends ValidationError {\n constructor() {\n super('Invalid order. order can only be one of asc|desc|ASC|DESC');\n }\n}\n\nclass InvalidSortError extends ValidationError {\n constructor() {\n super(\n 'Invalid sort parameter. Expected a string, an array of strings, a sort object or an array of sort objects'\n );\n }\n}\n\nclass InvalidPopulateError extends ValidationError {\n constructor() {\n super('Invalid populate parameter. Expected a string, an array of strings, a populate object');\n }\n}\n\nfunction validateOrder(order: string): asserts order is SortOrder {\n if (!isString(order) || !['asc', 'desc'].includes(order.toLocaleLowerCase())) {\n throw new InvalidOrderError();\n }\n}\n\nconst convertCountQueryParams = (countQuery: unknown): boolean => {\n return parseType({ type: 'boolean', value: countQuery });\n};\n\nconst convertOrderingQueryParams = (ordering: unknown) => {\n return ordering;\n};\n\nconst isStringArray = (value: unknown): value is string[] =>\n isArray(value) && value.every(isString);\n\ninterface TransformerOptions {\n getModel: (uid: string) => Model | undefined;\n}\n\nconst createTransformer = ({ getModel }: TransformerOptions) => {\n /**\n * Sort query parser\n */\n const convertSortQueryParams = (sortQuery: SortParams): OrderByQuery => {\n if (typeof sortQuery === 'string') {\n return convertStringSortQueryParam(sortQuery);\n }\n\n if (isStringArray(sortQuery)) {\n return sortQuery.flatMap((sortValue: string) => convertStringSortQueryParam(sortValue));\n }\n\n if (Array.isArray(sortQuery)) {\n return sortQuery.map((sortValue) => convertNestedSortQueryParam(sortValue));\n }\n\n if (isPlainObject(sortQuery)) {\n return convertNestedSortQueryParam(sortQuery);\n }\n\n throw new InvalidSortError();\n };\n\n const convertStringSortQueryParam = (sortQuery: string): SortMap[] => {\n return getMeaningfulSortSegments(sortQuery).map((segment) =>\n convertSingleSortQueryParam(segment)\n );\n };\n\n const convertSingleSortQueryParam = (sortQuery: string): SortMap => {\n const trimmed = sortQuery.trim();\n\n if (!trimmed) {\n return {};\n }\n\n if (!isString(trimmed)) {\n throw new ValidationError('Invalid sort query');\n }\n\n // split field and order param with default order to ascending\n const [rawField, order = 'asc'] = trimmed.split(':');\n const field = rawField.trim();\n\n if (field.length === 0) {\n throw new ValidationError('Field cannot be empty');\n }\n\n validateOrder(order.trim());\n\n // TODO: field should be a valid path on an object model\n\n return _.set({}, field, order.trim());\n };\n\n const convertNestedSortQueryParam = (sortQuery: SortParamsObject): SortMap => {\n const transformedSort: SortMap = {};\n for (const field of Object.keys(sortQuery)) {\n const order = sortQuery[field];\n\n // this is a deep sort\n if (isPlainObject(order)) {\n const nested = convertNestedSortQueryParam(order as SortParamsObject);\n\n if (!isEmptySortMap(nested)) {\n transformedSort[field] = nested;\n }\n } else if (typeof order === 'string') {\n const trimmedOrder = order.trim();\n\n if (trimmedOrder.length > 0) {\n validateOrder(trimmedOrder);\n transformedSort[field] = trimmedOrder;\n }\n } else {\n throw new ValidationError(\n `Invalid sort type expected object or string got ${typeof order}`\n );\n }\n }\n\n return transformedSort;\n };\n\n const applySortToQuery = (query: Query, sortParam?: SortParams | null) => {\n if (!hasSort(sortParam)) {\n return;\n }\n\n const orderBy = normalizeOrderBy(convertSortQueryParams(sortParam));\n\n if (orderBy !== undefined) {\n query.orderBy = orderBy;\n }\n };\n\n /**\n * Start query parser\n */\n const convertStartQueryParams = (startQuery: unknown): number => {\n const startAsANumber = toNumber(startQuery);\n\n if (!_.isInteger(startAsANumber) || startAsANumber < 0) {\n throw new ValidationError(\n `convertStartQueryParams expected a positive integer got ${startAsANumber}`\n );\n }\n\n return startAsANumber;\n };\n\n /**\n * Limit query parser\n */\n const convertLimitQueryParams = (limitQuery: unknown): number | undefined => {\n const limitAsANumber = toNumber(limitQuery);\n\n if (!_.isInteger(limitAsANumber) || (limitAsANumber !== -1 && limitAsANumber < 0)) {\n throw new ValidationError(\n `convertLimitQueryParams expected a positive integer got ${limitAsANumber}`\n );\n }\n\n if (limitAsANumber === -1) {\n return undefined;\n }\n\n return limitAsANumber;\n };\n\n const convertPageQueryParams = (page: unknown): number => {\n const pageVal = toNumber(page);\n\n if (!isInteger(pageVal) || pageVal <= 0) {\n throw new PaginationError(\n `Invalid 'page' parameter. Expected an integer > 0, received: ${page}`\n );\n }\n\n return pageVal;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const convertPageSizeQueryParams = (pageSize: unknown, _page: unknown): number => {\n const pageSizeVal = toNumber(pageSize);\n\n if (!isInteger(pageSizeVal) || pageSizeVal <= 0) {\n throw new PaginationError(\n `Invalid 'pageSize' parameter. Expected an integer > 0, received: ${pageSize}`\n );\n }\n\n return pageSizeVal;\n };\n\n const validatePaginationParams = (\n page: unknown,\n pageSize: unknown,\n start: unknown,\n limit: unknown\n ) => {\n const isPagePagination = !isNil(page) || !isNil(pageSize);\n const isOffsetPagination = !isNil(start) || !isNil(limit);\n\n if (isPagePagination && isOffsetPagination) {\n throw new PaginationError(\n 'Invalid pagination attributes. The page parameters are incorrect and must be in the pagination object'\n );\n }\n };\n\n // NOTE: we could support foo.* or foo.bar.* etc later on\n const convertPopulateQueryParams = (\n populate: PopulateParams,\n schema?: Model,\n depth = 0\n ): PopulateQuery => {\n if (depth === 0 && populate === '*') {\n return true;\n }\n\n if (typeof populate === 'string') {\n return populate.split(',').map((value) => _.trim(value));\n }\n\n if (Array.isArray(populate)) {\n // map convert\n return _.uniq(\n populate.flatMap((value) => {\n if (typeof value !== 'string') {\n throw new InvalidPopulateError();\n }\n\n return value.split(',').map((value) => _.trim(value));\n })\n );\n }\n\n if (_.isPlainObject(populate)) {\n return convertPopulateObject(populate, schema);\n }\n\n throw new InvalidPopulateError();\n };\n\n const hasPopulateFragmentDefined = (\n populate: PopulateObjectParams\n ): populate is PopulateObjectParams & Required<Pick<PopulateObjectParams, 'on'>> => {\n return typeof populate === 'object' && 'on' in populate && !isNil(populate.on);\n };\n\n const hasCountDefined = (\n populate: PopulateObjectParams\n ): populate is PopulateObjectParams & { count: boolean } => {\n return (\n typeof populate === 'object' && 'count' in populate && typeof populate.count === 'boolean'\n );\n };\n\n const convertPopulateObject = (populate: PopulateAttributesParams, schema?: Model) => {\n if (!schema) {\n return {};\n }\n\n const { attributes } = schema;\n return Object.entries(populate).reduce((acc, [key, subPopulate]) => {\n // Try converting strings to regular booleans if possible\n if (_.isString(subPopulate)) {\n try {\n const subPopulateAsBoolean = parseType({ type: 'boolean', value: subPopulate });\n // Only true is accepted as a boolean populate value\n return subPopulateAsBoolean ? { ...acc, [key]: true } : acc;\n } catch {\n // ignore\n }\n }\n\n if (_.isBoolean(subPopulate)) {\n // Only true is accepted as a boolean populate value\n return subPopulate === true ? { ...acc, [key]: true } : acc;\n }\n\n const attribute = attributes[key];\n\n if (!attribute) {\n return acc;\n }\n\n // Allow adding an 'on' strategy to populate queries for morphTo relations and dynamic zones\n const isMorphLikeRelationalAttribute =\n isDynamicZoneAttribute(attribute) || isMorphToRelationalAttribute(attribute);\n\n if (isMorphLikeRelationalAttribute) {\n const hasInvalidProperties = Object.keys(subPopulate).some(\n (key) => !['populate', 'on', 'count'].includes(key)\n );\n\n if (hasInvalidProperties) {\n throw new ValidationError(\n `Invalid nested populate for ${schema.info?.singularName}.${key} (${schema.uid}). Expected a fragment (\"on\") or \"count\" but found ${JSON.stringify(subPopulate)}`\n );\n }\n\n /**\n * Validate nested population queries in the context of a polymorphic attribute (dynamic zone, morph relation).\n *\n * If 'populate' exists in subPopulate, its value should be constrained to a wildcard ('*').\n */\n if (\n 'populate' in subPopulate &&\n !isNil(subPopulate.populate) &&\n subPopulate.populate !== '*'\n ) {\n throw new ValidationError(\n `Invalid nested population query detected. When using 'populate' within polymorphic structures, ` +\n `its value must be '*' to indicate all second level links. Specific field targeting is not supported here. ` +\n `Consider using the fragment API for more granular population control.`\n );\n }\n\n // TODO: Remove the possibility to have multiple properties at the same time (on/count/populate)\n const newSubPopulate = {};\n\n // case: { populate: '*' }\n if ('populate' in subPopulate && subPopulate.populate === '*') {\n Object.assign(newSubPopulate, { populate: true });\n }\n\n // case: { on: { <clauses> } }\n if (hasPopulateFragmentDefined(subPopulate)) {\n // If the fragment API is used, it applies the transformation to every\n // sub-populate, then assign the result to the new sub-populate\n Object.assign(newSubPopulate, {\n on: Object.entries(subPopulate.on).reduce(\n (acc, [type, typeSubPopulate]) => ({\n ...acc,\n [type]: convertNestedPopulate(typeSubPopulate, getModel(type)),\n }),\n {}\n ),\n });\n }\n\n // case: { count: true | false }\n if (hasCountDefined(subPopulate)) {\n Object.assign(newSubPopulate, { count: subPopulate.count });\n }\n\n return { ...acc, [key]: newSubPopulate };\n }\n\n // Edge case when trying to use the fragment ('on') on a non-morph like attribute\n if (!isMorphLikeRelationalAttribute && hasPopulateFragmentDefined(subPopulate)) {\n throw new ValidationError(\n `Using fragments is not permitted to populate \"${key}\" in \"${schema.uid}\"`\n );\n }\n\n // NOTE: Retrieve the target schema UID.\n // Only handles basic relations, medias and component since it's not possible\n // to populate with options for a dynamic zone or a polymorphic relation\n let targetSchemaUID;\n\n if (attribute.type === 'relation') {\n targetSchemaUID = attribute.target;\n } else if (attribute.type === 'component') {\n targetSchemaUID = attribute.component;\n } else if (attribute.type === 'media') {\n targetSchemaUID = 'plugin::upload.file';\n } else {\n return acc;\n }\n\n const targetSchema = getModel(targetSchemaUID!);\n\n // ignore the sub-populate for the current key if there is no schema associated\n if (!targetSchema) {\n return acc;\n }\n\n const populateObject = convertNestedPopulate(subPopulate, targetSchema);\n\n if (!populateObject) {\n return acc;\n }\n\n return {\n ...acc,\n [key]: populateObject,\n };\n }, {});\n };\n\n const convertNestedPopulate = (subPopulate: boolean | PopulateObjectParams, schema?: Model) => {\n if (_.isString(subPopulate)) {\n return parseType({ type: 'boolean', value: subPopulate, forceCast: true });\n }\n\n if (_.isBoolean(subPopulate)) {\n return subPopulate;\n }\n\n if (!isPlainObject(subPopulate)) {\n throw new ValidationError(`Invalid nested populate. Expected '*' or an object`);\n }\n\n const { sort, filters, fields, populate, count, ordering, page, pageSize, start, limit } =\n subPopulate as PopulateObjectParams;\n\n const query: Query = {};\n\n applySortToQuery(query, sort);\n\n if (filters) {\n query.where = convertFiltersQueryParams(filters, schema);\n }\n\n if (fields) {\n query.select = convertFieldsQueryParams(fields, schema);\n }\n\n if (populate) {\n query.populate = convertPopulateQueryParams(populate, schema);\n }\n\n if (count) {\n query.count = convertCountQueryParams(count);\n }\n\n if (ordering) {\n query.ordering = convertOrderingQueryParams(ordering);\n }\n\n validatePaginationParams(page, pageSize, start, limit);\n\n if (!isNil(page)) {\n query.page = convertPageQueryParams(page);\n }\n\n if (!isNil(pageSize)) {\n query.pageSize = convertPageSizeQueryParams(pageSize, page);\n }\n\n if (!isNil(start)) {\n query.offset = convertStartQueryParams(start);\n }\n\n if (!isNil(limit)) {\n query.limit = convertLimitQueryParams(limit);\n }\n\n return query;\n };\n\n // TODO: ensure field is valid in content types (will probably have to check strapi.contentTypes since it can be a string.path)\n const convertFieldsQueryParams = (\n fields: FieldsParams,\n schema?: Model,\n depth = 0\n ): SelectQuery | undefined => {\n if (depth === 0 && fields === '*') {\n return undefined;\n }\n\n if (typeof fields === 'string') {\n const fieldsValues = fields.split(',').map((value) => _.trim(value));\n\n // NOTE: Only include the doc id if it's a content type\n if (schema?.modelType === 'contentType') {\n return _.uniq([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, ...fieldsValues]);\n }\n return _.uniq([ID_ATTRIBUTE, ...fieldsValues]);\n }\n\n if (isStringArray(fields)) {\n // map convert\n const fieldsValues = fields\n .flatMap((value) => convertFieldsQueryParams(value, schema, depth + 1))\n .filter((v) => !isNil(v)) as string[];\n\n // NOTE: Only include the doc id if it's a content type\n if (schema?.modelType === 'contentType') {\n return _.uniq([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, ...fieldsValues]);\n }\n return _.uniq([ID_ATTRIBUTE, ...fieldsValues]);\n }\n\n throw new ValidationError('Invalid fields parameter. Expected a string or an array of strings');\n };\n\n const isValidSchemaAttribute = (key: string, schema?: Model) => {\n if ([DOC_ID_ATTRIBUTE, ID_ATTRIBUTE].includes(key)) {\n return true;\n }\n\n if (!schema) {\n return false;\n }\n\n return Object.keys(schema.attributes).includes(key);\n };\n\n const convertFiltersQueryParams = (filters: FiltersParams, schema?: Model): WhereQuery => {\n // Filters need to be either an array or an object\n // Here we're only checking for 'object' type since typeof [] => object and typeof {} => object\n if (!isObject(filters)) {\n throw new ValidationError('The filters parameter must be an object or an array');\n }\n\n // Don't mutate the original object\n const filtersCopy = cloneDeep(filters);\n\n return convertAndSanitizeFilters(filtersCopy, schema);\n };\n\n const convertAndSanitizeFilters = (filters: FiltersParams, schema?: Model): WhereQuery => {\n if (Array.isArray(filters)) {\n return (\n filters\n // Sanitize each filter\n .map((filter) => convertAndSanitizeFilters(filter, schema))\n // Filter out empty filters\n .filter((filter) => !isPlainObject(filter) || !isEmpty(filter))\n );\n }\n\n if (!isPlainObject(filters)) {\n return filters as WhereQuery;\n }\n\n const removeOperator = (operator: string) => delete filters[operator];\n\n // Here, `key` can either be an operator or an attribute name\n for (const [key, value] of Object.entries(filters)) {\n const attribute = get(key, schema?.attributes);\n const validKey = isOperator(key) || isValidSchemaAttribute(key, schema);\n\n if (!validKey) {\n removeOperator(key);\n }\n // Handle attributes\n else if (attribute) {\n // Relations\n if (attribute.type === 'relation') {\n filters[key] = convertAndSanitizeFilters(value, getModel(attribute.target!));\n }\n\n // Components\n else if (attribute.type === 'component') {\n filters[key] = convertAndSanitizeFilters(value, getModel(attribute.component));\n }\n\n // Media\n else if (attribute.type === 'media') {\n filters[key] = convertAndSanitizeFilters(value, getModel('plugin::upload.file'));\n }\n\n // Dynamic Zones\n else if (attribute.type === 'dynamiczone') {\n removeOperator(key);\n }\n\n // Password attributes\n else if (attribute.type === 'password') {\n // Always remove password attributes from filters object\n removeOperator(key);\n }\n\n // Scalar attributes\n else {\n filters[key] = convertAndSanitizeFilters(value, schema);\n }\n }\n\n // Handle operators\n else if (['$null', '$notNull'].includes(key)) {\n filters[key] = parseType({ type: 'boolean', value: filters[key], forceCast: true });\n } else if (isObject(value)) {\n filters[key] = convertAndSanitizeFilters(value, schema);\n }\n\n // Remove empty objects & arrays\n if (isPlainObject(filters[key]) && isEmpty(filters[key])) {\n removeOperator(key);\n }\n }\n\n return filters;\n };\n\n const convertStatusParams = (status?: 'draft' | 'published', query: Query = {}) => {\n // NOTE: this is the query layer filters not the document/entity service filters\n query.filters = ({ meta }: { meta: Model }) => {\n const contentType = getModel(meta.uid);\n\n // Ignore if target model has disabled DP, as it doesn't make sense to filter by its status\n if (!contentType || !hasDraftAndPublish(contentType)) {\n return {};\n }\n\n return { [PUBLISHED_AT_ATTRIBUTE]: { $null: status === 'draft' } };\n };\n };\n\n const transformQueryParams = (uid: string, params: Params): Query => {\n // NOTE: can be a CT, a Compo or nothing in the case of polymorphism (DZ & morph relations)\n const schema = getModel(uid);\n\n const query: Query = {};\n\n const {\n _q: searchQuery,\n sort,\n filters,\n fields,\n populate,\n page,\n pageSize,\n start,\n limit,\n status,\n ...rest\n } = params;\n\n if (!isNil(status)) {\n convertStatusParams(status, query);\n }\n\n if (!isNil(searchQuery)) {\n query._q = searchQuery;\n }\n\n applySortToQuery(query, sort);\n\n if (!isNil(filters)) {\n query.where = convertFiltersQueryParams(filters, schema);\n }\n\n if (!isNil(fields)) {\n query.select = convertFieldsQueryParams(fields, schema);\n }\n\n if (!isNil(populate)) {\n query.populate = convertPopulateQueryParams(populate, schema);\n }\n\n validatePaginationParams(page, pageSize, start, limit);\n\n if (!isNil(page)) {\n query.page = convertPageQueryParams(page);\n }\n\n if (!isNil(pageSize)) {\n query.pageSize = convertPageSizeQueryParams(pageSize, page);\n }\n\n if (!isNil(start)) {\n query.offset = convertStartQueryParams(start);\n }\n\n if (!isNil(limit)) {\n query.limit = convertLimitQueryParams(limit);\n }\n\n return {\n ...rest,\n ...query,\n };\n };\n\n return {\n private_convertSortQueryParams: convertSortQueryParams,\n private_convertStartQueryParams: convertStartQueryParams,\n private_convertLimitQueryParams: convertLimitQueryParams,\n private_convertPopulateQueryParams: convertPopulateQueryParams,\n private_convertFiltersQueryParams: convertFiltersQueryParams,\n private_convertFieldsQueryParams: convertFieldsQueryParams,\n transformQueryParams,\n };\n};\n\nexport { createTransformer };\n"],"names":["ID_ATTRIBUTE","DOC_ID_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","constants","isPlainObject","value","_","isEmptySortMap","sortMap","keys","Object","length","every","key","trim","normalizeOrderBy","orderBy","Array","isArray","filtered","filter","undefined","InvalidOrderError","ValidationError","InvalidSortError","InvalidPopulateError","validateOrder","order","isString","includes","toLocaleLowerCase","convertCountQueryParams","countQuery","parseType","type","convertOrderingQueryParams","ordering","isStringArray","createTransformer","getModel","convertSortQueryParams","sortQuery","convertStringSortQueryParam","flatMap","sortValue","map","convertNestedSortQueryParam","getMeaningfulSortSegments","segment","convertSingleSortQueryParam","trimmed","rawField","split","field","set","transformedSort","nested","trimmedOrder","applySortToQuery","query","sortParam","hasSort","convertStartQueryParams","startQuery","startAsANumber","toNumber","isInteger","convertLimitQueryParams","limitQuery","limitAsANumber","convertPageQueryParams","page","pageVal","PaginationError","convertPageSizeQueryParams","pageSize","_page","pageSizeVal","validatePaginationParams","start","limit","isPagePagination","isNil","isOffsetPagination","convertPopulateQueryParams","populate","schema","depth","uniq","convertPopulateObject","hasPopulateFragmentDefined","on","hasCountDefined","count","attributes","entries","reduce","acc","subPopulate","subPopulateAsBoolean","isBoolean","attribute","isMorphLikeRelationalAttribute","isDynamicZoneAttribute","isMorphToRelationalAttribute","hasInvalidProperties","some","info","singularName","uid","JSON","stringify","newSubPopulate","assign","typeSubPopulate","convertNestedPopulate","targetSchemaUID","target","component","targetSchema","populateObject","forceCast","sort","filters","fields","where","convertFiltersQueryParams","select","convertFieldsQueryParams","offset","fieldsValues","modelType","v","isValidSchemaAttribute","isObject","filtersCopy","cloneDeep","convertAndSanitizeFilters","isEmpty","removeOperator","operator","get","validKey","isOperator","convertStatusParams","status","meta","contentType","hasDraftAndPublish","$null","transformQueryParams","params","_q","searchQuery","rest","private_convertSortQueryParams","private_convertStartQueryParams","private_convertLimitQueryParams","private_convertPopulateQueryParams","private_convertFiltersQueryParams","private_convertFieldsQueryParams"],"mappings":"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"}
|
|
@@ -41,6 +41,11 @@ class InvalidSortError extends ValidationError {
|
|
|
41
41
|
super('Invalid sort parameter. Expected a string, an array of strings, a sort object or an array of sort objects');
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
|
+
class InvalidPopulateError extends ValidationError {
|
|
45
|
+
constructor(){
|
|
46
|
+
super('Invalid populate parameter. Expected a string, an array of strings, a populate object');
|
|
47
|
+
}
|
|
48
|
+
}
|
|
44
49
|
function validateOrder(order) {
|
|
45
50
|
if (!isString(order) || ![
|
|
46
51
|
'asc',
|
|
@@ -86,13 +91,13 @@ const createTransformer = ({ getModel })=>{
|
|
|
86
91
|
return {};
|
|
87
92
|
}
|
|
88
93
|
if (!isString(trimmed)) {
|
|
89
|
-
throw new
|
|
94
|
+
throw new ValidationError('Invalid sort query');
|
|
90
95
|
}
|
|
91
96
|
// split field and order param with default order to ascending
|
|
92
97
|
const [rawField, order = 'asc'] = trimmed.split(':');
|
|
93
98
|
const field = rawField.trim();
|
|
94
99
|
if (field.length === 0) {
|
|
95
|
-
throw new
|
|
100
|
+
throw new ValidationError('Field cannot be empty');
|
|
96
101
|
}
|
|
97
102
|
validateOrder(order.trim());
|
|
98
103
|
// TODO: field should be a valid path on an object model
|
|
@@ -115,7 +120,7 @@ const createTransformer = ({ getModel })=>{
|
|
|
115
120
|
transformedSort[field] = trimmedOrder;
|
|
116
121
|
}
|
|
117
122
|
} else {
|
|
118
|
-
throw
|
|
123
|
+
throw new ValidationError(`Invalid sort type expected object or string got ${typeof order}`);
|
|
119
124
|
}
|
|
120
125
|
}
|
|
121
126
|
return transformedSort;
|
|
@@ -172,12 +177,6 @@ const createTransformer = ({ getModel })=>{
|
|
|
172
177
|
throw new PaginationError('Invalid pagination attributes. The page parameters are incorrect and must be in the pagination object');
|
|
173
178
|
}
|
|
174
179
|
};
|
|
175
|
-
class InvalidPopulateError extends Error {
|
|
176
|
-
constructor(){
|
|
177
|
-
super();
|
|
178
|
-
this.message = 'Invalid populate parameter. Expected a string, an array of strings, a populate object';
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
180
|
// NOTE: we could support foo.* or foo.bar.* etc later on
|
|
182
181
|
const convertPopulateQueryParams = (populate, schema, depth = 0)=>{
|
|
183
182
|
if (depth === 0 && populate === '*') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convert-query-params.mjs","sources":["../src/convert-query-params.ts"],"sourcesContent":["/* eslint-disable max-classes-per-file */\n\n/**\n * Converts the standard Strapi REST query params to a more usable format for querying\n * You can read more here: https://docs.strapi.io/developer-docs/latest/developer-resources/database-apis-reference/rest-api.html#filters\n */\n\nimport _ from 'lodash';\nimport {\n cloneDeep,\n get,\n isArray,\n isEmpty,\n isInteger,\n isNil,\n isObject,\n isString,\n toNumber,\n} from 'lodash/fp';\nimport {\n constants,\n hasDraftAndPublish,\n isDynamicZoneAttribute,\n isMorphToRelationalAttribute,\n} from './content-types';\nimport { PaginationError, ValidationError } from './errors';\nimport { isOperator } from './operators';\n\nimport parseType from './parse-type';\nimport type { PublicationFilterMode } from './publication-filter';\nimport {\n getMeaningfulSortSegments,\n hasSort,\n type SortParams,\n type SortParamsObject,\n} from './sort-query';\nimport { Model } from './types';\n\nexport type { SortParams, SortParamsObject } from './sort-query';\n\nconst { ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, PUBLISHED_AT_ATTRIBUTE } = constants;\n\ntype SortOrder = 'asc' | 'desc';\n\nexport interface SortMap {\n [key: string]: SortOrder | SortMap;\n}\n\ntype FieldsParams = string | string[];\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => _.isPlainObject(value);\n\nfunction isEmptySortMap(sortMap: SortMap): boolean {\n const keys = Object.keys(sortMap);\n\n if (keys.length === 0) {\n return true;\n }\n\n return keys.every((key) => {\n const value = sortMap[key];\n\n if (typeof value === 'string') {\n return value.trim().length === 0;\n }\n\n if (isPlainObject(value)) {\n return isEmptySortMap(value as SortMap);\n }\n\n return true;\n });\n}\n\n/** Drops empty sort maps so a trailing comma does not leave a truthy but meaningless `orderBy`. */\nfunction normalizeOrderBy(orderBy: OrderByQuery): OrderByQuery | undefined {\n if (Array.isArray(orderBy)) {\n const filtered = orderBy.filter((sortMap) => !isEmptySortMap(sortMap));\n\n return filtered.length > 0 ? filtered : undefined;\n }\n\n return isEmptySortMap(orderBy) ? undefined : orderBy;\n}\n\ntype FiltersParams = unknown;\n\nexport interface PopulateAttributesParams {\n [key: string]: boolean | PopulateObjectParams;\n}\n\nexport interface PopulateObjectParams {\n sort?: SortParams;\n fields?: FieldsParams;\n filters?: FiltersParams;\n populate?: string | string[] | PopulateAttributesParams;\n on?: PopulateAttributesParams;\n count?: boolean;\n ordering?: unknown;\n _q?: string;\n limit?: number | string;\n start?: number | string;\n page?: number | string;\n pageSize?: number | string;\n}\n\ntype PopulateParams = string | string[] | PopulateAttributesParams;\n\nexport interface Params {\n sort?: SortParams;\n fields?: FieldsParams;\n filters?: FiltersParams;\n populate?: PopulateParams;\n count?: boolean;\n ordering?: unknown;\n _q?: string;\n limit?: number | string;\n start?: number | string;\n page?: number | string;\n pageSize?: number | string;\n status?: 'draft' | 'published';\n publicationFilter?: PublicationFilterMode;\n /**\n * @deprecated Replaced by `publicationFilter` (`never-published`, `has-published-version`, …).\n * Retained for backward compatibility with existing REST and GraphQL clients.\n */\n hasPublishedVersion?: boolean | 'true' | 'false';\n}\n\ntype FiltersQuery = (options: { meta: Model }) => WhereQuery | undefined;\ntype OrderByQuery = SortMap | SortMap[];\ntype SelectQuery = string | string[];\n\nexport interface WhereQuery {\n [key: string]: any;\n}\n\ntype PopulateQuery =\n | boolean\n | string[]\n | {\n [key: string]: PopulateQuery;\n };\n\nexport interface Query {\n orderBy?: OrderByQuery;\n select?: SelectQuery;\n where?: WhereQuery;\n // NOTE: those are internal DB filters do not modify\n filters?: FiltersQuery;\n populate?: PopulateQuery;\n count?: boolean;\n ordering?: unknown;\n _q?: string;\n limit?: number;\n offset?: number;\n page?: number;\n pageSize?: number;\n}\n\nclass InvalidOrderError extends ValidationError {\n constructor() {\n super('Invalid order. order can only be one of asc|desc|ASC|DESC');\n }\n}\n\nclass InvalidSortError extends ValidationError {\n constructor() {\n super(\n 'Invalid sort parameter. Expected a string, an array of strings, a sort object or an array of sort objects'\n );\n }\n}\n\nfunction validateOrder(order: string): asserts order is SortOrder {\n if (!isString(order) || !['asc', 'desc'].includes(order.toLocaleLowerCase())) {\n throw new InvalidOrderError();\n }\n}\n\nconst convertCountQueryParams = (countQuery: unknown): boolean => {\n return parseType({ type: 'boolean', value: countQuery });\n};\n\nconst convertOrderingQueryParams = (ordering: unknown) => {\n return ordering;\n};\n\nconst isStringArray = (value: unknown): value is string[] =>\n isArray(value) && value.every(isString);\n\ninterface TransformerOptions {\n getModel: (uid: string) => Model | undefined;\n}\n\nconst createTransformer = ({ getModel }: TransformerOptions) => {\n /**\n * Sort query parser\n */\n const convertSortQueryParams = (sortQuery: SortParams): OrderByQuery => {\n if (typeof sortQuery === 'string') {\n return convertStringSortQueryParam(sortQuery);\n }\n\n if (isStringArray(sortQuery)) {\n return sortQuery.flatMap((sortValue: string) => convertStringSortQueryParam(sortValue));\n }\n\n if (Array.isArray(sortQuery)) {\n return sortQuery.map((sortValue) => convertNestedSortQueryParam(sortValue));\n }\n\n if (isPlainObject(sortQuery)) {\n return convertNestedSortQueryParam(sortQuery);\n }\n\n throw new InvalidSortError();\n };\n\n const convertStringSortQueryParam = (sortQuery: string): SortMap[] => {\n return getMeaningfulSortSegments(sortQuery).map((segment) =>\n convertSingleSortQueryParam(segment)\n );\n };\n\n const convertSingleSortQueryParam = (sortQuery: string): SortMap => {\n const trimmed = sortQuery.trim();\n\n if (!trimmed) {\n return {};\n }\n\n if (!isString(trimmed)) {\n throw new Error('Invalid sort query');\n }\n\n // split field and order param with default order to ascending\n const [rawField, order = 'asc'] = trimmed.split(':');\n const field = rawField.trim();\n\n if (field.length === 0) {\n throw new Error('Field cannot be empty');\n }\n\n validateOrder(order.trim());\n\n // TODO: field should be a valid path on an object model\n\n return _.set({}, field, order.trim());\n };\n\n const convertNestedSortQueryParam = (sortQuery: SortParamsObject): SortMap => {\n const transformedSort: SortMap = {};\n for (const field of Object.keys(sortQuery)) {\n const order = sortQuery[field];\n\n // this is a deep sort\n if (isPlainObject(order)) {\n const nested = convertNestedSortQueryParam(order as SortParamsObject);\n\n if (!isEmptySortMap(nested)) {\n transformedSort[field] = nested;\n }\n } else if (typeof order === 'string') {\n const trimmedOrder = order.trim();\n\n if (trimmedOrder.length > 0) {\n validateOrder(trimmedOrder);\n transformedSort[field] = trimmedOrder;\n }\n } else {\n throw Error(`Invalid sort type expected object or string got ${typeof order}`);\n }\n }\n\n return transformedSort;\n };\n\n const applySortToQuery = (query: Query, sortParam?: SortParams | null) => {\n if (!hasSort(sortParam)) {\n return;\n }\n\n const orderBy = normalizeOrderBy(convertSortQueryParams(sortParam));\n\n if (orderBy !== undefined) {\n query.orderBy = orderBy;\n }\n };\n\n /**\n * Start query parser\n */\n const convertStartQueryParams = (startQuery: unknown): number => {\n const startAsANumber = toNumber(startQuery);\n\n if (!_.isInteger(startAsANumber) || startAsANumber < 0) {\n throw new ValidationError(\n `convertStartQueryParams expected a positive integer got ${startAsANumber}`\n );\n }\n\n return startAsANumber;\n };\n\n /**\n * Limit query parser\n */\n const convertLimitQueryParams = (limitQuery: unknown): number | undefined => {\n const limitAsANumber = toNumber(limitQuery);\n\n if (!_.isInteger(limitAsANumber) || (limitAsANumber !== -1 && limitAsANumber < 0)) {\n throw new ValidationError(\n `convertLimitQueryParams expected a positive integer got ${limitAsANumber}`\n );\n }\n\n if (limitAsANumber === -1) {\n return undefined;\n }\n\n return limitAsANumber;\n };\n\n const convertPageQueryParams = (page: unknown): number => {\n const pageVal = toNumber(page);\n\n if (!isInteger(pageVal) || pageVal <= 0) {\n throw new PaginationError(\n `Invalid 'page' parameter. Expected an integer > 0, received: ${page}`\n );\n }\n\n return pageVal;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const convertPageSizeQueryParams = (pageSize: unknown, _page: unknown): number => {\n const pageSizeVal = toNumber(pageSize);\n\n if (!isInteger(pageSizeVal) || pageSizeVal <= 0) {\n throw new PaginationError(\n `Invalid 'pageSize' parameter. Expected an integer > 0, received: ${pageSize}`\n );\n }\n\n return pageSizeVal;\n };\n\n const validatePaginationParams = (\n page: unknown,\n pageSize: unknown,\n start: unknown,\n limit: unknown\n ) => {\n const isPagePagination = !isNil(page) || !isNil(pageSize);\n const isOffsetPagination = !isNil(start) || !isNil(limit);\n\n if (isPagePagination && isOffsetPagination) {\n throw new PaginationError(\n 'Invalid pagination attributes. The page parameters are incorrect and must be in the pagination object'\n );\n }\n };\n\n class InvalidPopulateError extends Error {\n constructor() {\n super();\n this.message =\n 'Invalid populate parameter. Expected a string, an array of strings, a populate object';\n }\n }\n\n // NOTE: we could support foo.* or foo.bar.* etc later on\n const convertPopulateQueryParams = (\n populate: PopulateParams,\n schema?: Model,\n depth = 0\n ): PopulateQuery => {\n if (depth === 0 && populate === '*') {\n return true;\n }\n\n if (typeof populate === 'string') {\n return populate.split(',').map((value) => _.trim(value));\n }\n\n if (Array.isArray(populate)) {\n // map convert\n return _.uniq(\n populate.flatMap((value) => {\n if (typeof value !== 'string') {\n throw new InvalidPopulateError();\n }\n\n return value.split(',').map((value) => _.trim(value));\n })\n );\n }\n\n if (_.isPlainObject(populate)) {\n return convertPopulateObject(populate, schema);\n }\n\n throw new InvalidPopulateError();\n };\n\n const hasPopulateFragmentDefined = (\n populate: PopulateObjectParams\n ): populate is PopulateObjectParams & Required<Pick<PopulateObjectParams, 'on'>> => {\n return typeof populate === 'object' && 'on' in populate && !isNil(populate.on);\n };\n\n const hasCountDefined = (\n populate: PopulateObjectParams\n ): populate is PopulateObjectParams & { count: boolean } => {\n return (\n typeof populate === 'object' && 'count' in populate && typeof populate.count === 'boolean'\n );\n };\n\n const convertPopulateObject = (populate: PopulateAttributesParams, schema?: Model) => {\n if (!schema) {\n return {};\n }\n\n const { attributes } = schema;\n return Object.entries(populate).reduce((acc, [key, subPopulate]) => {\n // Try converting strings to regular booleans if possible\n if (_.isString(subPopulate)) {\n try {\n const subPopulateAsBoolean = parseType({ type: 'boolean', value: subPopulate });\n // Only true is accepted as a boolean populate value\n return subPopulateAsBoolean ? { ...acc, [key]: true } : acc;\n } catch {\n // ignore\n }\n }\n\n if (_.isBoolean(subPopulate)) {\n // Only true is accepted as a boolean populate value\n return subPopulate === true ? { ...acc, [key]: true } : acc;\n }\n\n const attribute = attributes[key];\n\n if (!attribute) {\n return acc;\n }\n\n // Allow adding an 'on' strategy to populate queries for morphTo relations and dynamic zones\n const isMorphLikeRelationalAttribute =\n isDynamicZoneAttribute(attribute) || isMorphToRelationalAttribute(attribute);\n\n if (isMorphLikeRelationalAttribute) {\n const hasInvalidProperties = Object.keys(subPopulate).some(\n (key) => !['populate', 'on', 'count'].includes(key)\n );\n\n if (hasInvalidProperties) {\n throw new ValidationError(\n `Invalid nested populate for ${schema.info?.singularName}.${key} (${schema.uid}). Expected a fragment (\"on\") or \"count\" but found ${JSON.stringify(subPopulate)}`\n );\n }\n\n /**\n * Validate nested population queries in the context of a polymorphic attribute (dynamic zone, morph relation).\n *\n * If 'populate' exists in subPopulate, its value should be constrained to a wildcard ('*').\n */\n if (\n 'populate' in subPopulate &&\n !isNil(subPopulate.populate) &&\n subPopulate.populate !== '*'\n ) {\n throw new ValidationError(\n `Invalid nested population query detected. When using 'populate' within polymorphic structures, ` +\n `its value must be '*' to indicate all second level links. Specific field targeting is not supported here. ` +\n `Consider using the fragment API for more granular population control.`\n );\n }\n\n // TODO: Remove the possibility to have multiple properties at the same time (on/count/populate)\n const newSubPopulate = {};\n\n // case: { populate: '*' }\n if ('populate' in subPopulate && subPopulate.populate === '*') {\n Object.assign(newSubPopulate, { populate: true });\n }\n\n // case: { on: { <clauses> } }\n if (hasPopulateFragmentDefined(subPopulate)) {\n // If the fragment API is used, it applies the transformation to every\n // sub-populate, then assign the result to the new sub-populate\n Object.assign(newSubPopulate, {\n on: Object.entries(subPopulate.on).reduce(\n (acc, [type, typeSubPopulate]) => ({\n ...acc,\n [type]: convertNestedPopulate(typeSubPopulate, getModel(type)),\n }),\n {}\n ),\n });\n }\n\n // case: { count: true | false }\n if (hasCountDefined(subPopulate)) {\n Object.assign(newSubPopulate, { count: subPopulate.count });\n }\n\n return { ...acc, [key]: newSubPopulate };\n }\n\n // Edge case when trying to use the fragment ('on') on a non-morph like attribute\n if (!isMorphLikeRelationalAttribute && hasPopulateFragmentDefined(subPopulate)) {\n throw new ValidationError(\n `Using fragments is not permitted to populate \"${key}\" in \"${schema.uid}\"`\n );\n }\n\n // NOTE: Retrieve the target schema UID.\n // Only handles basic relations, medias and component since it's not possible\n // to populate with options for a dynamic zone or a polymorphic relation\n let targetSchemaUID;\n\n if (attribute.type === 'relation') {\n targetSchemaUID = attribute.target;\n } else if (attribute.type === 'component') {\n targetSchemaUID = attribute.component;\n } else if (attribute.type === 'media') {\n targetSchemaUID = 'plugin::upload.file';\n } else {\n return acc;\n }\n\n const targetSchema = getModel(targetSchemaUID!);\n\n // ignore the sub-populate for the current key if there is no schema associated\n if (!targetSchema) {\n return acc;\n }\n\n const populateObject = convertNestedPopulate(subPopulate, targetSchema);\n\n if (!populateObject) {\n return acc;\n }\n\n return {\n ...acc,\n [key]: populateObject,\n };\n }, {});\n };\n\n const convertNestedPopulate = (subPopulate: boolean | PopulateObjectParams, schema?: Model) => {\n if (_.isString(subPopulate)) {\n return parseType({ type: 'boolean', value: subPopulate, forceCast: true });\n }\n\n if (_.isBoolean(subPopulate)) {\n return subPopulate;\n }\n\n if (!isPlainObject(subPopulate)) {\n throw new ValidationError(`Invalid nested populate. Expected '*' or an object`);\n }\n\n const { sort, filters, fields, populate, count, ordering, page, pageSize, start, limit } =\n subPopulate as PopulateObjectParams;\n\n const query: Query = {};\n\n applySortToQuery(query, sort);\n\n if (filters) {\n query.where = convertFiltersQueryParams(filters, schema);\n }\n\n if (fields) {\n query.select = convertFieldsQueryParams(fields, schema);\n }\n\n if (populate) {\n query.populate = convertPopulateQueryParams(populate, schema);\n }\n\n if (count) {\n query.count = convertCountQueryParams(count);\n }\n\n if (ordering) {\n query.ordering = convertOrderingQueryParams(ordering);\n }\n\n validatePaginationParams(page, pageSize, start, limit);\n\n if (!isNil(page)) {\n query.page = convertPageQueryParams(page);\n }\n\n if (!isNil(pageSize)) {\n query.pageSize = convertPageSizeQueryParams(pageSize, page);\n }\n\n if (!isNil(start)) {\n query.offset = convertStartQueryParams(start);\n }\n\n if (!isNil(limit)) {\n query.limit = convertLimitQueryParams(limit);\n }\n\n return query;\n };\n\n // TODO: ensure field is valid in content types (will probably have to check strapi.contentTypes since it can be a string.path)\n const convertFieldsQueryParams = (\n fields: FieldsParams,\n schema?: Model,\n depth = 0\n ): SelectQuery | undefined => {\n if (depth === 0 && fields === '*') {\n return undefined;\n }\n\n if (typeof fields === 'string') {\n const fieldsValues = fields.split(',').map((value) => _.trim(value));\n\n // NOTE: Only include the doc id if it's a content type\n if (schema?.modelType === 'contentType') {\n return _.uniq([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, ...fieldsValues]);\n }\n return _.uniq([ID_ATTRIBUTE, ...fieldsValues]);\n }\n\n if (isStringArray(fields)) {\n // map convert\n const fieldsValues = fields\n .flatMap((value) => convertFieldsQueryParams(value, schema, depth + 1))\n .filter((v) => !isNil(v)) as string[];\n\n // NOTE: Only include the doc id if it's a content type\n if (schema?.modelType === 'contentType') {\n return _.uniq([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, ...fieldsValues]);\n }\n return _.uniq([ID_ATTRIBUTE, ...fieldsValues]);\n }\n\n throw new ValidationError('Invalid fields parameter. Expected a string or an array of strings');\n };\n\n const isValidSchemaAttribute = (key: string, schema?: Model) => {\n if ([DOC_ID_ATTRIBUTE, ID_ATTRIBUTE].includes(key)) {\n return true;\n }\n\n if (!schema) {\n return false;\n }\n\n return Object.keys(schema.attributes).includes(key);\n };\n\n const convertFiltersQueryParams = (filters: FiltersParams, schema?: Model): WhereQuery => {\n // Filters need to be either an array or an object\n // Here we're only checking for 'object' type since typeof [] => object and typeof {} => object\n if (!isObject(filters)) {\n throw new ValidationError('The filters parameter must be an object or an array');\n }\n\n // Don't mutate the original object\n const filtersCopy = cloneDeep(filters);\n\n return convertAndSanitizeFilters(filtersCopy, schema);\n };\n\n const convertAndSanitizeFilters = (filters: FiltersParams, schema?: Model): WhereQuery => {\n if (Array.isArray(filters)) {\n return (\n filters\n // Sanitize each filter\n .map((filter) => convertAndSanitizeFilters(filter, schema))\n // Filter out empty filters\n .filter((filter) => !isPlainObject(filter) || !isEmpty(filter))\n );\n }\n\n if (!isPlainObject(filters)) {\n return filters as WhereQuery;\n }\n\n const removeOperator = (operator: string) => delete filters[operator];\n\n // Here, `key` can either be an operator or an attribute name\n for (const [key, value] of Object.entries(filters)) {\n const attribute = get(key, schema?.attributes);\n const validKey = isOperator(key) || isValidSchemaAttribute(key, schema);\n\n if (!validKey) {\n removeOperator(key);\n }\n // Handle attributes\n else if (attribute) {\n // Relations\n if (attribute.type === 'relation') {\n filters[key] = convertAndSanitizeFilters(value, getModel(attribute.target!));\n }\n\n // Components\n else if (attribute.type === 'component') {\n filters[key] = convertAndSanitizeFilters(value, getModel(attribute.component));\n }\n\n // Media\n else if (attribute.type === 'media') {\n filters[key] = convertAndSanitizeFilters(value, getModel('plugin::upload.file'));\n }\n\n // Dynamic Zones\n else if (attribute.type === 'dynamiczone') {\n removeOperator(key);\n }\n\n // Password attributes\n else if (attribute.type === 'password') {\n // Always remove password attributes from filters object\n removeOperator(key);\n }\n\n // Scalar attributes\n else {\n filters[key] = convertAndSanitizeFilters(value, schema);\n }\n }\n\n // Handle operators\n else if (['$null', '$notNull'].includes(key)) {\n filters[key] = parseType({ type: 'boolean', value: filters[key], forceCast: true });\n } else if (isObject(value)) {\n filters[key] = convertAndSanitizeFilters(value, schema);\n }\n\n // Remove empty objects & arrays\n if (isPlainObject(filters[key]) && isEmpty(filters[key])) {\n removeOperator(key);\n }\n }\n\n return filters;\n };\n\n const convertStatusParams = (status?: 'draft' | 'published', query: Query = {}) => {\n // NOTE: this is the query layer filters not the document/entity service filters\n query.filters = ({ meta }: { meta: Model }) => {\n const contentType = getModel(meta.uid);\n\n // Ignore if target model has disabled DP, as it doesn't make sense to filter by its status\n if (!contentType || !hasDraftAndPublish(contentType)) {\n return {};\n }\n\n return { [PUBLISHED_AT_ATTRIBUTE]: { $null: status === 'draft' } };\n };\n };\n\n const transformQueryParams = (uid: string, params: Params): Query => {\n // NOTE: can be a CT, a Compo or nothing in the case of polymorphism (DZ & morph relations)\n const schema = getModel(uid);\n\n const query: Query = {};\n\n const {\n _q: searchQuery,\n sort,\n filters,\n fields,\n populate,\n page,\n pageSize,\n start,\n limit,\n status,\n ...rest\n } = params;\n\n if (!isNil(status)) {\n convertStatusParams(status, query);\n }\n\n if (!isNil(searchQuery)) {\n query._q = searchQuery;\n }\n\n applySortToQuery(query, sort);\n\n if (!isNil(filters)) {\n query.where = convertFiltersQueryParams(filters, schema);\n }\n\n if (!isNil(fields)) {\n query.select = convertFieldsQueryParams(fields, schema);\n }\n\n if (!isNil(populate)) {\n query.populate = convertPopulateQueryParams(populate, schema);\n }\n\n validatePaginationParams(page, pageSize, start, limit);\n\n if (!isNil(page)) {\n query.page = convertPageQueryParams(page);\n }\n\n if (!isNil(pageSize)) {\n query.pageSize = convertPageSizeQueryParams(pageSize, page);\n }\n\n if (!isNil(start)) {\n query.offset = convertStartQueryParams(start);\n }\n\n if (!isNil(limit)) {\n query.limit = convertLimitQueryParams(limit);\n }\n\n return {\n ...rest,\n ...query,\n };\n };\n\n return {\n private_convertSortQueryParams: convertSortQueryParams,\n private_convertStartQueryParams: convertStartQueryParams,\n private_convertLimitQueryParams: convertLimitQueryParams,\n private_convertPopulateQueryParams: convertPopulateQueryParams,\n private_convertFiltersQueryParams: convertFiltersQueryParams,\n private_convertFieldsQueryParams: convertFieldsQueryParams,\n transformQueryParams,\n };\n};\n\nexport { createTransformer };\n"],"names":["ID_ATTRIBUTE","DOC_ID_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","constants","isPlainObject","value","_","isEmptySortMap","sortMap","keys","Object","length","every","key","trim","normalizeOrderBy","orderBy","Array","isArray","filtered","filter","undefined","InvalidOrderError","ValidationError","InvalidSortError","validateOrder","order","isString","includes","toLocaleLowerCase","convertCountQueryParams","countQuery","parseType","type","convertOrderingQueryParams","ordering","isStringArray","createTransformer","getModel","convertSortQueryParams","sortQuery","convertStringSortQueryParam","flatMap","sortValue","map","convertNestedSortQueryParam","getMeaningfulSortSegments","segment","convertSingleSortQueryParam","trimmed","Error","rawField","split","field","set","transformedSort","nested","trimmedOrder","applySortToQuery","query","sortParam","hasSort","convertStartQueryParams","startQuery","startAsANumber","toNumber","isInteger","convertLimitQueryParams","limitQuery","limitAsANumber","convertPageQueryParams","page","pageVal","PaginationError","convertPageSizeQueryParams","pageSize","_page","pageSizeVal","validatePaginationParams","start","limit","isPagePagination","isNil","isOffsetPagination","InvalidPopulateError","message","convertPopulateQueryParams","populate","schema","depth","uniq","convertPopulateObject","hasPopulateFragmentDefined","on","hasCountDefined","count","attributes","entries","reduce","acc","subPopulate","subPopulateAsBoolean","isBoolean","attribute","isMorphLikeRelationalAttribute","isDynamicZoneAttribute","isMorphToRelationalAttribute","hasInvalidProperties","some","info","singularName","uid","JSON","stringify","newSubPopulate","assign","typeSubPopulate","convertNestedPopulate","targetSchemaUID","target","component","targetSchema","populateObject","forceCast","sort","filters","fields","where","convertFiltersQueryParams","select","convertFieldsQueryParams","offset","fieldsValues","modelType","v","isValidSchemaAttribute","isObject","filtersCopy","cloneDeep","convertAndSanitizeFilters","isEmpty","removeOperator","operator","get","validKey","isOperator","convertStatusParams","status","meta","contentType","hasDraftAndPublish","$null","transformQueryParams","params","_q","searchQuery","rest","private_convertSortQueryParams","private_convertStartQueryParams","private_convertLimitQueryParams","private_convertPopulateQueryParams","private_convertFiltersQueryParams","private_convertFieldsQueryParams"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"convert-query-params.mjs","sources":["../src/convert-query-params.ts"],"sourcesContent":["/* eslint-disable max-classes-per-file */\n\n/**\n * Converts the standard Strapi REST query params to a more usable format for querying\n * You can read more here: https://docs.strapi.io/developer-docs/latest/developer-resources/database-apis-reference/rest-api.html#filters\n */\n\nimport _ from 'lodash';\nimport {\n cloneDeep,\n get,\n isArray,\n isEmpty,\n isInteger,\n isNil,\n isObject,\n isString,\n toNumber,\n} from 'lodash/fp';\nimport {\n constants,\n hasDraftAndPublish,\n isDynamicZoneAttribute,\n isMorphToRelationalAttribute,\n} from './content-types';\nimport { PaginationError, ValidationError } from './errors';\nimport { isOperator } from './operators';\n\nimport parseType from './parse-type';\nimport type { PublicationFilterMode } from './publication-filter';\nimport {\n getMeaningfulSortSegments,\n hasSort,\n type SortParams,\n type SortParamsObject,\n} from './sort-query';\nimport { Model } from './types';\n\nexport type { SortParams, SortParamsObject } from './sort-query';\n\nconst { ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, PUBLISHED_AT_ATTRIBUTE } = constants;\n\ntype SortOrder = 'asc' | 'desc';\n\nexport interface SortMap {\n [key: string]: SortOrder | SortMap;\n}\n\ntype FieldsParams = string | string[];\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => _.isPlainObject(value);\n\nfunction isEmptySortMap(sortMap: SortMap): boolean {\n const keys = Object.keys(sortMap);\n\n if (keys.length === 0) {\n return true;\n }\n\n return keys.every((key) => {\n const value = sortMap[key];\n\n if (typeof value === 'string') {\n return value.trim().length === 0;\n }\n\n if (isPlainObject(value)) {\n return isEmptySortMap(value as SortMap);\n }\n\n return true;\n });\n}\n\n/** Drops empty sort maps so a trailing comma does not leave a truthy but meaningless `orderBy`. */\nfunction normalizeOrderBy(orderBy: OrderByQuery): OrderByQuery | undefined {\n if (Array.isArray(orderBy)) {\n const filtered = orderBy.filter((sortMap) => !isEmptySortMap(sortMap));\n\n return filtered.length > 0 ? filtered : undefined;\n }\n\n return isEmptySortMap(orderBy) ? undefined : orderBy;\n}\n\ntype FiltersParams = unknown;\n\nexport interface PopulateAttributesParams {\n [key: string]: boolean | PopulateObjectParams;\n}\n\nexport interface PopulateObjectParams {\n sort?: SortParams;\n fields?: FieldsParams;\n filters?: FiltersParams;\n populate?: string | string[] | PopulateAttributesParams;\n on?: PopulateAttributesParams;\n count?: boolean;\n ordering?: unknown;\n _q?: string;\n limit?: number | string;\n start?: number | string;\n page?: number | string;\n pageSize?: number | string;\n}\n\ntype PopulateParams = string | string[] | PopulateAttributesParams;\n\nexport interface Params {\n sort?: SortParams;\n fields?: FieldsParams;\n filters?: FiltersParams;\n populate?: PopulateParams;\n count?: boolean;\n ordering?: unknown;\n _q?: string;\n limit?: number | string;\n start?: number | string;\n page?: number | string;\n pageSize?: number | string;\n status?: 'draft' | 'published';\n publicationFilter?: PublicationFilterMode;\n /**\n * @deprecated Replaced by `publicationFilter` (`never-published`, `has-published-version`, …).\n * Retained for backward compatibility with existing REST and GraphQL clients.\n */\n hasPublishedVersion?: boolean | 'true' | 'false';\n}\n\ntype FiltersQuery = (options: { meta: Model }) => WhereQuery | undefined;\ntype OrderByQuery = SortMap | SortMap[];\ntype SelectQuery = string | string[];\n\nexport interface WhereQuery {\n [key: string]: any;\n}\n\ntype PopulateQuery =\n | boolean\n | string[]\n | {\n [key: string]: PopulateQuery;\n };\n\nexport interface Query {\n orderBy?: OrderByQuery;\n select?: SelectQuery;\n where?: WhereQuery;\n // NOTE: those are internal DB filters do not modify\n filters?: FiltersQuery;\n populate?: PopulateQuery;\n count?: boolean;\n ordering?: unknown;\n _q?: string;\n limit?: number;\n offset?: number;\n page?: number;\n pageSize?: number;\n}\n\nclass InvalidOrderError extends ValidationError {\n constructor() {\n super('Invalid order. order can only be one of asc|desc|ASC|DESC');\n }\n}\n\nclass InvalidSortError extends ValidationError {\n constructor() {\n super(\n 'Invalid sort parameter. Expected a string, an array of strings, a sort object or an array of sort objects'\n );\n }\n}\n\nclass InvalidPopulateError extends ValidationError {\n constructor() {\n super('Invalid populate parameter. Expected a string, an array of strings, a populate object');\n }\n}\n\nfunction validateOrder(order: string): asserts order is SortOrder {\n if (!isString(order) || !['asc', 'desc'].includes(order.toLocaleLowerCase())) {\n throw new InvalidOrderError();\n }\n}\n\nconst convertCountQueryParams = (countQuery: unknown): boolean => {\n return parseType({ type: 'boolean', value: countQuery });\n};\n\nconst convertOrderingQueryParams = (ordering: unknown) => {\n return ordering;\n};\n\nconst isStringArray = (value: unknown): value is string[] =>\n isArray(value) && value.every(isString);\n\ninterface TransformerOptions {\n getModel: (uid: string) => Model | undefined;\n}\n\nconst createTransformer = ({ getModel }: TransformerOptions) => {\n /**\n * Sort query parser\n */\n const convertSortQueryParams = (sortQuery: SortParams): OrderByQuery => {\n if (typeof sortQuery === 'string') {\n return convertStringSortQueryParam(sortQuery);\n }\n\n if (isStringArray(sortQuery)) {\n return sortQuery.flatMap((sortValue: string) => convertStringSortQueryParam(sortValue));\n }\n\n if (Array.isArray(sortQuery)) {\n return sortQuery.map((sortValue) => convertNestedSortQueryParam(sortValue));\n }\n\n if (isPlainObject(sortQuery)) {\n return convertNestedSortQueryParam(sortQuery);\n }\n\n throw new InvalidSortError();\n };\n\n const convertStringSortQueryParam = (sortQuery: string): SortMap[] => {\n return getMeaningfulSortSegments(sortQuery).map((segment) =>\n convertSingleSortQueryParam(segment)\n );\n };\n\n const convertSingleSortQueryParam = (sortQuery: string): SortMap => {\n const trimmed = sortQuery.trim();\n\n if (!trimmed) {\n return {};\n }\n\n if (!isString(trimmed)) {\n throw new ValidationError('Invalid sort query');\n }\n\n // split field and order param with default order to ascending\n const [rawField, order = 'asc'] = trimmed.split(':');\n const field = rawField.trim();\n\n if (field.length === 0) {\n throw new ValidationError('Field cannot be empty');\n }\n\n validateOrder(order.trim());\n\n // TODO: field should be a valid path on an object model\n\n return _.set({}, field, order.trim());\n };\n\n const convertNestedSortQueryParam = (sortQuery: SortParamsObject): SortMap => {\n const transformedSort: SortMap = {};\n for (const field of Object.keys(sortQuery)) {\n const order = sortQuery[field];\n\n // this is a deep sort\n if (isPlainObject(order)) {\n const nested = convertNestedSortQueryParam(order as SortParamsObject);\n\n if (!isEmptySortMap(nested)) {\n transformedSort[field] = nested;\n }\n } else if (typeof order === 'string') {\n const trimmedOrder = order.trim();\n\n if (trimmedOrder.length > 0) {\n validateOrder(trimmedOrder);\n transformedSort[field] = trimmedOrder;\n }\n } else {\n throw new ValidationError(\n `Invalid sort type expected object or string got ${typeof order}`\n );\n }\n }\n\n return transformedSort;\n };\n\n const applySortToQuery = (query: Query, sortParam?: SortParams | null) => {\n if (!hasSort(sortParam)) {\n return;\n }\n\n const orderBy = normalizeOrderBy(convertSortQueryParams(sortParam));\n\n if (orderBy !== undefined) {\n query.orderBy = orderBy;\n }\n };\n\n /**\n * Start query parser\n */\n const convertStartQueryParams = (startQuery: unknown): number => {\n const startAsANumber = toNumber(startQuery);\n\n if (!_.isInteger(startAsANumber) || startAsANumber < 0) {\n throw new ValidationError(\n `convertStartQueryParams expected a positive integer got ${startAsANumber}`\n );\n }\n\n return startAsANumber;\n };\n\n /**\n * Limit query parser\n */\n const convertLimitQueryParams = (limitQuery: unknown): number | undefined => {\n const limitAsANumber = toNumber(limitQuery);\n\n if (!_.isInteger(limitAsANumber) || (limitAsANumber !== -1 && limitAsANumber < 0)) {\n throw new ValidationError(\n `convertLimitQueryParams expected a positive integer got ${limitAsANumber}`\n );\n }\n\n if (limitAsANumber === -1) {\n return undefined;\n }\n\n return limitAsANumber;\n };\n\n const convertPageQueryParams = (page: unknown): number => {\n const pageVal = toNumber(page);\n\n if (!isInteger(pageVal) || pageVal <= 0) {\n throw new PaginationError(\n `Invalid 'page' parameter. Expected an integer > 0, received: ${page}`\n );\n }\n\n return pageVal;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const convertPageSizeQueryParams = (pageSize: unknown, _page: unknown): number => {\n const pageSizeVal = toNumber(pageSize);\n\n if (!isInteger(pageSizeVal) || pageSizeVal <= 0) {\n throw new PaginationError(\n `Invalid 'pageSize' parameter. Expected an integer > 0, received: ${pageSize}`\n );\n }\n\n return pageSizeVal;\n };\n\n const validatePaginationParams = (\n page: unknown,\n pageSize: unknown,\n start: unknown,\n limit: unknown\n ) => {\n const isPagePagination = !isNil(page) || !isNil(pageSize);\n const isOffsetPagination = !isNil(start) || !isNil(limit);\n\n if (isPagePagination && isOffsetPagination) {\n throw new PaginationError(\n 'Invalid pagination attributes. The page parameters are incorrect and must be in the pagination object'\n );\n }\n };\n\n // NOTE: we could support foo.* or foo.bar.* etc later on\n const convertPopulateQueryParams = (\n populate: PopulateParams,\n schema?: Model,\n depth = 0\n ): PopulateQuery => {\n if (depth === 0 && populate === '*') {\n return true;\n }\n\n if (typeof populate === 'string') {\n return populate.split(',').map((value) => _.trim(value));\n }\n\n if (Array.isArray(populate)) {\n // map convert\n return _.uniq(\n populate.flatMap((value) => {\n if (typeof value !== 'string') {\n throw new InvalidPopulateError();\n }\n\n return value.split(',').map((value) => _.trim(value));\n })\n );\n }\n\n if (_.isPlainObject(populate)) {\n return convertPopulateObject(populate, schema);\n }\n\n throw new InvalidPopulateError();\n };\n\n const hasPopulateFragmentDefined = (\n populate: PopulateObjectParams\n ): populate is PopulateObjectParams & Required<Pick<PopulateObjectParams, 'on'>> => {\n return typeof populate === 'object' && 'on' in populate && !isNil(populate.on);\n };\n\n const hasCountDefined = (\n populate: PopulateObjectParams\n ): populate is PopulateObjectParams & { count: boolean } => {\n return (\n typeof populate === 'object' && 'count' in populate && typeof populate.count === 'boolean'\n );\n };\n\n const convertPopulateObject = (populate: PopulateAttributesParams, schema?: Model) => {\n if (!schema) {\n return {};\n }\n\n const { attributes } = schema;\n return Object.entries(populate).reduce((acc, [key, subPopulate]) => {\n // Try converting strings to regular booleans if possible\n if (_.isString(subPopulate)) {\n try {\n const subPopulateAsBoolean = parseType({ type: 'boolean', value: subPopulate });\n // Only true is accepted as a boolean populate value\n return subPopulateAsBoolean ? { ...acc, [key]: true } : acc;\n } catch {\n // ignore\n }\n }\n\n if (_.isBoolean(subPopulate)) {\n // Only true is accepted as a boolean populate value\n return subPopulate === true ? { ...acc, [key]: true } : acc;\n }\n\n const attribute = attributes[key];\n\n if (!attribute) {\n return acc;\n }\n\n // Allow adding an 'on' strategy to populate queries for morphTo relations and dynamic zones\n const isMorphLikeRelationalAttribute =\n isDynamicZoneAttribute(attribute) || isMorphToRelationalAttribute(attribute);\n\n if (isMorphLikeRelationalAttribute) {\n const hasInvalidProperties = Object.keys(subPopulate).some(\n (key) => !['populate', 'on', 'count'].includes(key)\n );\n\n if (hasInvalidProperties) {\n throw new ValidationError(\n `Invalid nested populate for ${schema.info?.singularName}.${key} (${schema.uid}). Expected a fragment (\"on\") or \"count\" but found ${JSON.stringify(subPopulate)}`\n );\n }\n\n /**\n * Validate nested population queries in the context of a polymorphic attribute (dynamic zone, morph relation).\n *\n * If 'populate' exists in subPopulate, its value should be constrained to a wildcard ('*').\n */\n if (\n 'populate' in subPopulate &&\n !isNil(subPopulate.populate) &&\n subPopulate.populate !== '*'\n ) {\n throw new ValidationError(\n `Invalid nested population query detected. When using 'populate' within polymorphic structures, ` +\n `its value must be '*' to indicate all second level links. Specific field targeting is not supported here. ` +\n `Consider using the fragment API for more granular population control.`\n );\n }\n\n // TODO: Remove the possibility to have multiple properties at the same time (on/count/populate)\n const newSubPopulate = {};\n\n // case: { populate: '*' }\n if ('populate' in subPopulate && subPopulate.populate === '*') {\n Object.assign(newSubPopulate, { populate: true });\n }\n\n // case: { on: { <clauses> } }\n if (hasPopulateFragmentDefined(subPopulate)) {\n // If the fragment API is used, it applies the transformation to every\n // sub-populate, then assign the result to the new sub-populate\n Object.assign(newSubPopulate, {\n on: Object.entries(subPopulate.on).reduce(\n (acc, [type, typeSubPopulate]) => ({\n ...acc,\n [type]: convertNestedPopulate(typeSubPopulate, getModel(type)),\n }),\n {}\n ),\n });\n }\n\n // case: { count: true | false }\n if (hasCountDefined(subPopulate)) {\n Object.assign(newSubPopulate, { count: subPopulate.count });\n }\n\n return { ...acc, [key]: newSubPopulate };\n }\n\n // Edge case when trying to use the fragment ('on') on a non-morph like attribute\n if (!isMorphLikeRelationalAttribute && hasPopulateFragmentDefined(subPopulate)) {\n throw new ValidationError(\n `Using fragments is not permitted to populate \"${key}\" in \"${schema.uid}\"`\n );\n }\n\n // NOTE: Retrieve the target schema UID.\n // Only handles basic relations, medias and component since it's not possible\n // to populate with options for a dynamic zone or a polymorphic relation\n let targetSchemaUID;\n\n if (attribute.type === 'relation') {\n targetSchemaUID = attribute.target;\n } else if (attribute.type === 'component') {\n targetSchemaUID = attribute.component;\n } else if (attribute.type === 'media') {\n targetSchemaUID = 'plugin::upload.file';\n } else {\n return acc;\n }\n\n const targetSchema = getModel(targetSchemaUID!);\n\n // ignore the sub-populate for the current key if there is no schema associated\n if (!targetSchema) {\n return acc;\n }\n\n const populateObject = convertNestedPopulate(subPopulate, targetSchema);\n\n if (!populateObject) {\n return acc;\n }\n\n return {\n ...acc,\n [key]: populateObject,\n };\n }, {});\n };\n\n const convertNestedPopulate = (subPopulate: boolean | PopulateObjectParams, schema?: Model) => {\n if (_.isString(subPopulate)) {\n return parseType({ type: 'boolean', value: subPopulate, forceCast: true });\n }\n\n if (_.isBoolean(subPopulate)) {\n return subPopulate;\n }\n\n if (!isPlainObject(subPopulate)) {\n throw new ValidationError(`Invalid nested populate. Expected '*' or an object`);\n }\n\n const { sort, filters, fields, populate, count, ordering, page, pageSize, start, limit } =\n subPopulate as PopulateObjectParams;\n\n const query: Query = {};\n\n applySortToQuery(query, sort);\n\n if (filters) {\n query.where = convertFiltersQueryParams(filters, schema);\n }\n\n if (fields) {\n query.select = convertFieldsQueryParams(fields, schema);\n }\n\n if (populate) {\n query.populate = convertPopulateQueryParams(populate, schema);\n }\n\n if (count) {\n query.count = convertCountQueryParams(count);\n }\n\n if (ordering) {\n query.ordering = convertOrderingQueryParams(ordering);\n }\n\n validatePaginationParams(page, pageSize, start, limit);\n\n if (!isNil(page)) {\n query.page = convertPageQueryParams(page);\n }\n\n if (!isNil(pageSize)) {\n query.pageSize = convertPageSizeQueryParams(pageSize, page);\n }\n\n if (!isNil(start)) {\n query.offset = convertStartQueryParams(start);\n }\n\n if (!isNil(limit)) {\n query.limit = convertLimitQueryParams(limit);\n }\n\n return query;\n };\n\n // TODO: ensure field is valid in content types (will probably have to check strapi.contentTypes since it can be a string.path)\n const convertFieldsQueryParams = (\n fields: FieldsParams,\n schema?: Model,\n depth = 0\n ): SelectQuery | undefined => {\n if (depth === 0 && fields === '*') {\n return undefined;\n }\n\n if (typeof fields === 'string') {\n const fieldsValues = fields.split(',').map((value) => _.trim(value));\n\n // NOTE: Only include the doc id if it's a content type\n if (schema?.modelType === 'contentType') {\n return _.uniq([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, ...fieldsValues]);\n }\n return _.uniq([ID_ATTRIBUTE, ...fieldsValues]);\n }\n\n if (isStringArray(fields)) {\n // map convert\n const fieldsValues = fields\n .flatMap((value) => convertFieldsQueryParams(value, schema, depth + 1))\n .filter((v) => !isNil(v)) as string[];\n\n // NOTE: Only include the doc id if it's a content type\n if (schema?.modelType === 'contentType') {\n return _.uniq([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, ...fieldsValues]);\n }\n return _.uniq([ID_ATTRIBUTE, ...fieldsValues]);\n }\n\n throw new ValidationError('Invalid fields parameter. Expected a string or an array of strings');\n };\n\n const isValidSchemaAttribute = (key: string, schema?: Model) => {\n if ([DOC_ID_ATTRIBUTE, ID_ATTRIBUTE].includes(key)) {\n return true;\n }\n\n if (!schema) {\n return false;\n }\n\n return Object.keys(schema.attributes).includes(key);\n };\n\n const convertFiltersQueryParams = (filters: FiltersParams, schema?: Model): WhereQuery => {\n // Filters need to be either an array or an object\n // Here we're only checking for 'object' type since typeof [] => object and typeof {} => object\n if (!isObject(filters)) {\n throw new ValidationError('The filters parameter must be an object or an array');\n }\n\n // Don't mutate the original object\n const filtersCopy = cloneDeep(filters);\n\n return convertAndSanitizeFilters(filtersCopy, schema);\n };\n\n const convertAndSanitizeFilters = (filters: FiltersParams, schema?: Model): WhereQuery => {\n if (Array.isArray(filters)) {\n return (\n filters\n // Sanitize each filter\n .map((filter) => convertAndSanitizeFilters(filter, schema))\n // Filter out empty filters\n .filter((filter) => !isPlainObject(filter) || !isEmpty(filter))\n );\n }\n\n if (!isPlainObject(filters)) {\n return filters as WhereQuery;\n }\n\n const removeOperator = (operator: string) => delete filters[operator];\n\n // Here, `key` can either be an operator or an attribute name\n for (const [key, value] of Object.entries(filters)) {\n const attribute = get(key, schema?.attributes);\n const validKey = isOperator(key) || isValidSchemaAttribute(key, schema);\n\n if (!validKey) {\n removeOperator(key);\n }\n // Handle attributes\n else if (attribute) {\n // Relations\n if (attribute.type === 'relation') {\n filters[key] = convertAndSanitizeFilters(value, getModel(attribute.target!));\n }\n\n // Components\n else if (attribute.type === 'component') {\n filters[key] = convertAndSanitizeFilters(value, getModel(attribute.component));\n }\n\n // Media\n else if (attribute.type === 'media') {\n filters[key] = convertAndSanitizeFilters(value, getModel('plugin::upload.file'));\n }\n\n // Dynamic Zones\n else if (attribute.type === 'dynamiczone') {\n removeOperator(key);\n }\n\n // Password attributes\n else if (attribute.type === 'password') {\n // Always remove password attributes from filters object\n removeOperator(key);\n }\n\n // Scalar attributes\n else {\n filters[key] = convertAndSanitizeFilters(value, schema);\n }\n }\n\n // Handle operators\n else if (['$null', '$notNull'].includes(key)) {\n filters[key] = parseType({ type: 'boolean', value: filters[key], forceCast: true });\n } else if (isObject(value)) {\n filters[key] = convertAndSanitizeFilters(value, schema);\n }\n\n // Remove empty objects & arrays\n if (isPlainObject(filters[key]) && isEmpty(filters[key])) {\n removeOperator(key);\n }\n }\n\n return filters;\n };\n\n const convertStatusParams = (status?: 'draft' | 'published', query: Query = {}) => {\n // NOTE: this is the query layer filters not the document/entity service filters\n query.filters = ({ meta }: { meta: Model }) => {\n const contentType = getModel(meta.uid);\n\n // Ignore if target model has disabled DP, as it doesn't make sense to filter by its status\n if (!contentType || !hasDraftAndPublish(contentType)) {\n return {};\n }\n\n return { [PUBLISHED_AT_ATTRIBUTE]: { $null: status === 'draft' } };\n };\n };\n\n const transformQueryParams = (uid: string, params: Params): Query => {\n // NOTE: can be a CT, a Compo or nothing in the case of polymorphism (DZ & morph relations)\n const schema = getModel(uid);\n\n const query: Query = {};\n\n const {\n _q: searchQuery,\n sort,\n filters,\n fields,\n populate,\n page,\n pageSize,\n start,\n limit,\n status,\n ...rest\n } = params;\n\n if (!isNil(status)) {\n convertStatusParams(status, query);\n }\n\n if (!isNil(searchQuery)) {\n query._q = searchQuery;\n }\n\n applySortToQuery(query, sort);\n\n if (!isNil(filters)) {\n query.where = convertFiltersQueryParams(filters, schema);\n }\n\n if (!isNil(fields)) {\n query.select = convertFieldsQueryParams(fields, schema);\n }\n\n if (!isNil(populate)) {\n query.populate = convertPopulateQueryParams(populate, schema);\n }\n\n validatePaginationParams(page, pageSize, start, limit);\n\n if (!isNil(page)) {\n query.page = convertPageQueryParams(page);\n }\n\n if (!isNil(pageSize)) {\n query.pageSize = convertPageSizeQueryParams(pageSize, page);\n }\n\n if (!isNil(start)) {\n query.offset = convertStartQueryParams(start);\n }\n\n if (!isNil(limit)) {\n query.limit = convertLimitQueryParams(limit);\n }\n\n return {\n ...rest,\n ...query,\n };\n };\n\n return {\n private_convertSortQueryParams: convertSortQueryParams,\n private_convertStartQueryParams: convertStartQueryParams,\n private_convertLimitQueryParams: convertLimitQueryParams,\n private_convertPopulateQueryParams: convertPopulateQueryParams,\n private_convertFiltersQueryParams: convertFiltersQueryParams,\n private_convertFieldsQueryParams: convertFieldsQueryParams,\n transformQueryParams,\n };\n};\n\nexport { createTransformer };\n"],"names":["ID_ATTRIBUTE","DOC_ID_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","constants","isPlainObject","value","_","isEmptySortMap","sortMap","keys","Object","length","every","key","trim","normalizeOrderBy","orderBy","Array","isArray","filtered","filter","undefined","InvalidOrderError","ValidationError","InvalidSortError","InvalidPopulateError","validateOrder","order","isString","includes","toLocaleLowerCase","convertCountQueryParams","countQuery","parseType","type","convertOrderingQueryParams","ordering","isStringArray","createTransformer","getModel","convertSortQueryParams","sortQuery","convertStringSortQueryParam","flatMap","sortValue","map","convertNestedSortQueryParam","getMeaningfulSortSegments","segment","convertSingleSortQueryParam","trimmed","rawField","split","field","set","transformedSort","nested","trimmedOrder","applySortToQuery","query","sortParam","hasSort","convertStartQueryParams","startQuery","startAsANumber","toNumber","isInteger","convertLimitQueryParams","limitQuery","limitAsANumber","convertPageQueryParams","page","pageVal","PaginationError","convertPageSizeQueryParams","pageSize","_page","pageSizeVal","validatePaginationParams","start","limit","isPagePagination","isNil","isOffsetPagination","convertPopulateQueryParams","populate","schema","depth","uniq","convertPopulateObject","hasPopulateFragmentDefined","on","hasCountDefined","count","attributes","entries","reduce","acc","subPopulate","subPopulateAsBoolean","isBoolean","attribute","isMorphLikeRelationalAttribute","isDynamicZoneAttribute","isMorphToRelationalAttribute","hasInvalidProperties","some","info","singularName","uid","JSON","stringify","newSubPopulate","assign","typeSubPopulate","convertNestedPopulate","targetSchemaUID","target","component","targetSchema","populateObject","forceCast","sort","filters","fields","where","convertFiltersQueryParams","select","convertFieldsQueryParams","offset","fieldsValues","modelType","v","isValidSchemaAttribute","isObject","filtersCopy","cloneDeep","convertAndSanitizeFilters","isEmpty","removeOperator","operator","get","validKey","isOperator","convertStatusParams","status","meta","contentType","hasDraftAndPublish","$null","transformQueryParams","params","_q","searchQuery","rest","private_convertSortQueryParams","private_convertStartQueryParams","private_convertLimitQueryParams","private_convertPopulateQueryParams","private_convertFiltersQueryParams","private_convertFieldsQueryParams"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@strapi/utils",
|
|
3
|
-
"version": "5.50.
|
|
3
|
+
"version": "5.50.2",
|
|
4
4
|
"description": "Shared utilities for the Strapi packages",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"strapi",
|
|
@@ -40,8 +40,8 @@
|
|
|
40
40
|
"build:code": "run -T rollup -c",
|
|
41
41
|
"build:types": "run -T tsc -p tsconfig.build.json --emitDeclarationOnly",
|
|
42
42
|
"clean": "run -T rimraf ./dist",
|
|
43
|
-
"lint": "run -T eslint .",
|
|
44
|
-
"test:ts": "run -T tsc
|
|
43
|
+
"lint": "run -T eslint . --max-warnings=0",
|
|
44
|
+
"test:ts": "run -T tsc -p tsconfig.json",
|
|
45
45
|
"test:unit": "run -T jest",
|
|
46
46
|
"test:unit:watch": "run -T jest --watch",
|
|
47
47
|
"test:unit:vitest": "vitest run",
|
|
@@ -62,14 +62,16 @@
|
|
|
62
62
|
},
|
|
63
63
|
"devDependencies": {
|
|
64
64
|
"@types/http-errors": "2.0.4",
|
|
65
|
+
"@types/jest": "29.5.2",
|
|
65
66
|
"@types/koa": "2.15.2",
|
|
66
67
|
"@types/node": "20.19.41",
|
|
67
|
-
"eslint-config-custom": "5.50.
|
|
68
|
+
"eslint-config-custom": "5.50.2",
|
|
69
|
+
"jest": "29.6.0",
|
|
68
70
|
"koa": "2.16.4",
|
|
69
71
|
"koa-body": "6.0.1",
|
|
70
|
-
"tsconfig": "5.50.
|
|
72
|
+
"tsconfig": "5.50.2",
|
|
71
73
|
"vitest": "catalog:",
|
|
72
|
-
"vitest-config": "5.50.
|
|
74
|
+
"vitest-config": "5.50.2"
|
|
73
75
|
},
|
|
74
76
|
"engines": {
|
|
75
77
|
"node": ">=20.0.0 <=26.x.x",
|