UNPKG

@strapi/utils

Version:

Shared utilities for the Strapi packages

1 lines • 34.1 kB
{"version":3,"file":"validators.mjs","sources":["../../src/validate/validators.ts"],"sourcesContent":["import { isEmpty, isNil, isObject, trim } from 'lodash/fp';\n\nimport { pipe as pipeAsync } from '../async';\nimport {\n isScalarAttribute,\n constants,\n isDynamicZoneAttribute,\n isMorphToRelationalAttribute,\n} from '../content-types';\nimport {\n traverseQueryFilters,\n traverseQuerySort,\n traverseQueryFields,\n traverseQueryPopulate,\n} from '../traverse';\nimport { throwPassword, throwPrivate, throwDynamicZones, throwMorphToRelations } from './visitors';\nimport { isOperator } from '../operators';\nimport { asyncCurry, throwInvalidKey } from './utils';\nimport type { Attribute, Model } from '../types';\nimport parseType from '../parse-type';\nimport type { Parent, Path } from '../traverse/factory';\n\nconst { ID_ATTRIBUTE, DOC_ID_ATTRIBUTE } = constants;\n\ninterface Context {\n schema: Model;\n getModel: (model: string) => Model;\n}\n\ninterface PopulateContext extends Context {\n path?: Path;\n parent?: Parent;\n}\n\ntype AnyFunc = (...args: any[]) => any;\n\nexport const FILTER_TRAVERSALS = [\n 'nonAttributesOperators',\n 'dynamicZones',\n 'morphRelations',\n 'passwords',\n 'private',\n];\n\nexport const validateFilters = asyncCurry(\n async (ctx: Context, filters: unknown, include: (typeof FILTER_TRAVERSALS)[number][]) => {\n // TODO: schema checks should check that it is a valid schema with yup\n if (!ctx.schema) {\n throw new Error('Missing schema in defaultValidateFilters');\n }\n\n // Build the list of functions conditionally\n const functionsToApply: Array<AnyFunc> = [];\n\n // keys that are not attributes or valid operators\n if (include.includes('nonAttributesOperators')) {\n functionsToApply.push(\n traverseQueryFilters(({ key, attribute, path }) => {\n // ID is not an attribute per se, so we need to make\n // an extra check to ensure we're not removing it\n if ([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE].includes(key)) {\n return;\n }\n\n const isAttribute = !!attribute;\n\n if (!isAttribute && !isOperator(key)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }, ctx)\n );\n }\n\n if (include.includes('dynamicZones')) {\n functionsToApply.push(traverseQueryFilters(throwDynamicZones, ctx));\n }\n\n if (include.includes('morphRelations')) {\n functionsToApply.push(traverseQueryFilters(throwMorphToRelations, ctx));\n }\n\n if (include.includes('passwords')) {\n functionsToApply.push(traverseQueryFilters(throwPassword, ctx));\n }\n\n if (include.includes('private')) {\n functionsToApply.push(traverseQueryFilters(throwPrivate, ctx));\n }\n\n // Return directly if no validation functions are provided\n if (functionsToApply.length === 0) {\n return filters;\n }\n\n return pipeAsync(...functionsToApply)(filters);\n }\n);\n\nexport const defaultValidateFilters = asyncCurry(async (ctx: Context, filters: unknown) => {\n return validateFilters(ctx, filters, FILTER_TRAVERSALS);\n});\n\nexport const SORT_TRAVERSALS = [\n 'nonAttributesOperators',\n 'dynamicZones',\n 'morphRelations',\n 'passwords',\n 'private',\n 'nonScalarEmptyKeys',\n];\n\nexport const validateSort = asyncCurry(\n async (ctx: Context, sort: unknown, include: (typeof SORT_TRAVERSALS)[number][]) => {\n if (!ctx.schema) {\n throw new Error('Missing schema in defaultValidateSort');\n }\n\n // Build the list of functions conditionally based on the include array\n const functionsToApply: Array<AnyFunc> = [];\n\n // Validate non attribute keys\n if (include.includes('nonAttributesOperators')) {\n functionsToApply.push(\n traverseQuerySort(({ key, attribute, path }) => {\n // ID is not an attribute per se, so we need to make\n // an extra check to ensure we're not removing it\n if ([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE].includes(key)) {\n return;\n }\n\n // status is a virtual sort key for D&P-enabled content types\n if (key === 'status' && ctx.schema?.options?.draftAndPublish) {\n return;\n }\n\n if (!attribute) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }, ctx)\n );\n }\n\n // Validate dynamic zones from sort\n if (include.includes('dynamicZones')) {\n functionsToApply.push(traverseQuerySort(throwDynamicZones, ctx));\n }\n\n // Validate morphTo relations from sort\n if (include.includes('morphRelations')) {\n functionsToApply.push(traverseQuerySort(throwMorphToRelations, ctx));\n }\n\n // Validate passwords from sort\n if (include.includes('passwords')) {\n functionsToApply.push(traverseQuerySort(throwPassword, ctx));\n }\n\n // Validate private from sort\n if (include.includes('private')) {\n functionsToApply.push(traverseQuerySort(throwPrivate, ctx));\n }\n\n // Validate non-scalar empty keys\n if (include.includes('nonScalarEmptyKeys')) {\n functionsToApply.push(\n traverseQuerySort(({ key, attribute, value, path }) => {\n // ID is not an attribute per se, so we need to make\n // an extra check to ensure we're not removing it\n if ([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE].includes(key)) {\n return;\n }\n\n if (!isScalarAttribute(attribute) && isEmpty(value)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }, ctx)\n );\n }\n\n // Return directly if no validation functions are provided\n if (functionsToApply.length === 0) {\n return sort;\n }\n\n return pipeAsync(...functionsToApply)(sort);\n }\n);\n\nexport const defaultValidateSort = asyncCurry(async (ctx: Context, sort: unknown) => {\n return validateSort(ctx, sort, SORT_TRAVERSALS);\n});\n\nexport const FIELDS_TRAVERSALS = ['scalarAttributes', 'privateFields', 'passwordFields'];\n\nexport const validateFields = asyncCurry(\n async (ctx: Context, fields: unknown, include: (typeof FIELDS_TRAVERSALS)[number][]) => {\n if (!ctx.schema) {\n throw new Error('Missing schema in defaultValidateFields');\n }\n // Build the list of functions conditionally based on the include array\n const functionsToApply: Array<AnyFunc> = [];\n\n // Only allow scalar attributes\n if (include.includes('scalarAttributes')) {\n functionsToApply.push(\n traverseQueryFields(({ key, attribute, path }) => {\n // ID is not an attribute per se, so we need to make\n // an extra check to ensure we're not throwing because of it\n if ([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE].includes(key)) {\n return;\n }\n\n if (isNil(attribute) || !isScalarAttribute(attribute)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }, ctx)\n );\n }\n\n // Private fields\n if (include.includes('privateFields')) {\n functionsToApply.push(traverseQueryFields(throwPrivate, ctx));\n }\n\n // Password fields\n if (include.includes('passwordFields')) {\n functionsToApply.push(traverseQueryFields(throwPassword, ctx));\n }\n\n // Return directly if no validation functions are provided\n if (functionsToApply.length === 0) {\n return fields;\n }\n\n return pipeAsync(...functionsToApply)(fields);\n }\n);\n\nexport const defaultValidateFields = asyncCurry(async (ctx: Context, fields: unknown) => {\n return validateFields(ctx, fields, FIELDS_TRAVERSALS);\n});\n\nconst isMorphLikeAttribute = (attribute?: Attribute) =>\n isDynamicZoneAttribute(attribute) || isMorphToRelationalAttribute(attribute);\n\nconst isPopulatableAttribute = (attribute?: Attribute) =>\n !!attribute && ['relation', 'dynamiczone', 'component', 'media'].includes(attribute.type);\n\nconst isDotNotationPopulate = (populate: unknown): populate is string | string[] => {\n if (populate === '*') {\n return false;\n }\n\n if (typeof populate === 'string') {\n return true;\n }\n\n return (\n Array.isArray(populate) && populate.length > 0 && populate.every((p) => typeof p === 'string')\n );\n};\n\nconst flattenDotPopulatePaths = (populate: string | string[]) => {\n const items = Array.isArray(populate) ? populate : [populate];\n\n return items.flatMap((item) =>\n item\n .split(',')\n .map((segment) => trim(segment))\n .filter(Boolean)\n );\n};\n\nconst validatePopulateDotPathSegments = (\n { schema, getModel }: { schema: Model; getModel: (uid: string) => Model },\n segments: string[],\n pathPrefix: string\n) => {\n if (!segments.length) {\n return;\n }\n\n const [head, ...tail] = segments;\n const fullPath = pathPrefix ? `${pathPrefix}.${head}` : head;\n const attribute = schema.attributes[head];\n\n if (!attribute || !isPopulatableAttribute(attribute)) {\n throwInvalidKey({ key: head, path: fullPath });\n }\n\n if (!tail.length) {\n return;\n }\n\n if (attribute.type === 'component') {\n if (!attribute.component) {\n throwInvalidKey({ key: head, path: fullPath });\n }\n\n validatePopulateDotPathSegments(\n { schema: getModel(attribute.component), getModel },\n tail,\n fullPath\n );\n return;\n }\n\n if (attribute.type === 'relation') {\n if (isMorphLikeAttribute(attribute)) {\n throwInvalidKey({ key: head, path: fullPath });\n }\n\n if (!attribute.target) {\n throwInvalidKey({ key: head, path: fullPath });\n }\n\n validatePopulateDotPathSegments(\n { schema: getModel(attribute.target!), getModel },\n tail,\n fullPath\n );\n return;\n }\n\n if (attribute.type === 'media') {\n throwInvalidKey({ key: head, path: fullPath });\n }\n\n if (attribute.type === 'dynamiczone') {\n const [nextSegment, ...rest] = tail;\n const nextPath = `${fullPath}.${nextSegment}`;\n const candidates = (attribute.components ?? [])\n .map((uid) => getModel(uid))\n .filter((model) => model?.attributes?.[nextSegment]);\n\n if (!candidates.length) {\n throwInvalidKey({ key: nextSegment, path: nextPath });\n }\n\n let validated = false;\n\n for (const componentSchema of candidates) {\n const nestedAttribute = componentSchema.attributes[nextSegment];\n\n try {\n if (!rest.length) {\n if (nestedAttribute) {\n validated = true;\n break;\n }\n } else if (nestedAttribute?.type === 'component' && nestedAttribute.component) {\n validatePopulateDotPathSegments(\n { schema: getModel(nestedAttribute.component), getModel },\n rest,\n nextPath\n );\n validated = true;\n break;\n } else if (\n nestedAttribute?.type === 'relation' &&\n !isMorphLikeAttribute(nestedAttribute) &&\n nestedAttribute.target\n ) {\n validatePopulateDotPathSegments(\n { schema: getModel(nestedAttribute.target), getModel },\n rest,\n nextPath\n );\n validated = true;\n break;\n }\n } catch {\n // Try the next dynamic-zone component type.\n }\n }\n\n if (!validated) {\n throwInvalidKey({ key: nextSegment, path: nextPath });\n }\n }\n};\n\nconst validatePopulateDotPaths = (\n ctx: { schema: Model; getModel: (uid: string) => Model },\n populate: string | string[]\n) => {\n for (const path of flattenDotPopulatePaths(populate)) {\n const segments = path\n .split('.')\n .map((segment) => trim(segment))\n .filter(Boolean);\n\n validatePopulateDotPathSegments(ctx, segments, '');\n }\n};\n\nconst validateMorphLikeNestedPopulate = (\n populateValue: unknown,\n { path }: { path: string | null }\n) => {\n // Keep in sync with convert-query-params polymorphic nested populate handling.\n if (!isNil(populateValue) && populateValue !== '*') {\n throwInvalidKey({ key: 'populate', path });\n }\n};\n\nexport const POPULATE_TRAVERSALS = ['nonAttributesOperators', 'private'];\n\nexport const validatePopulate = asyncCurry(\n async (\n ctx: PopulateContext,\n populate: unknown,\n includes: {\n fields?: (typeof FIELDS_TRAVERSALS)[number][];\n sort?: (typeof SORT_TRAVERSALS)[number][];\n filters?: (typeof FILTER_TRAVERSALS)[number][];\n populate?: (typeof POPULATE_TRAVERSALS)[number][];\n }\n ) => {\n if (!ctx.schema) {\n throw new Error('Missing schema in defaultValidatePopulate');\n }\n\n if (isDotNotationPopulate(populate)) {\n validatePopulateDotPaths({ schema: ctx.schema, getModel: ctx.getModel }, populate);\n\n if (includes?.populate?.includes('private')) {\n return traverseQueryPopulate(throwPrivate, ctx)(populate);\n }\n\n return populate;\n }\n\n // Build the list of functions conditionally based on the include array\n const functionsToApply: Array<AnyFunc> = [];\n\n // Always include the main traversal function\n functionsToApply.push(\n traverseQueryPopulate(\n async ({ key, path, value, schema, attribute, getModel, parent }, { set }) => {\n /**\n * NOTE: The parent check is done to support \"filters\" (and the rest of keys) as valid attribute names.\n *\n * The parent will not be an attribute when its a \"populate\" / \"filters\" / \"sort\" ... key.\n * Only in those scenarios the node will be an attribute.\n */\n if (!parent?.attribute && attribute) {\n const isPopulatableAttribute = [\n 'relation',\n 'dynamiczone',\n 'component',\n 'media',\n ].includes(attribute.type);\n\n if (isMorphLikeAttribute(attribute) && isObject(value) && 'populate' in value) {\n validateMorphLikeNestedPopulate((value as Record<string, unknown>).populate, {\n path: path.raw,\n });\n }\n\n // Throw on non-populate attributes\n if (!isPopulatableAttribute) {\n throwInvalidKey({ key, path: path.raw });\n }\n\n // Valid populatable attribute, so return\n return;\n }\n\n // If we're looking at a populate fragment, ensure its target is valid\n if (key === 'on') {\n // Populate fragment should always be an object\n if (!isObject(value)) {\n return throwInvalidKey({ key, path: path.raw });\n }\n\n const targets = Object.keys(value);\n\n for (const target of targets) {\n const model = getModel(target);\n\n // If a target is invalid (no matching model), then raise an error\n if (!model) {\n throwInvalidKey({ key: target, path: `${path.raw}.${target}` });\n }\n }\n\n // If the fragment's target is fine, then let it pass\n return;\n }\n\n // Ignore plain wildcards\n if (key === '' && value === '*') {\n return;\n }\n\n // Ensure count is a boolean\n if (key === 'count') {\n try {\n parseType({ type: 'boolean', value });\n return;\n } catch {\n throwInvalidKey({ key, path: path.attribute });\n }\n }\n\n // Allowed boolean-like keywords should be ignored\n try {\n parseType({ type: 'boolean', value: key });\n // Key is an allowed boolean-like keyword, skipping validation...\n return;\n } catch {\n // Continue, because it's not a boolean-like\n }\n\n // Handle nested `sort` validation with custom or default traversals\n if (key === 'sort') {\n set(\n key,\n await validateSort(\n {\n schema,\n getModel,\n },\n value, // pass the sort value\n includes?.sort || SORT_TRAVERSALS\n )\n );\n return;\n }\n\n // Handle nested `filters` validation with custom or default traversals\n if (key === 'filters') {\n set(\n key,\n await validateFilters(\n {\n schema,\n getModel,\n },\n value, // pass the filters value\n includes?.filters || FILTER_TRAVERSALS\n )\n );\n return;\n }\n\n // Handle nested `fields` validation with custom or default traversals\n if (key === 'fields') {\n set(\n key,\n await validateFields(\n {\n schema,\n getModel,\n },\n value, // pass the fields value\n includes?.fields || FIELDS_TRAVERSALS\n )\n );\n return;\n }\n\n // Handle recursive nested `populate` validation with the same include object\n if (key === 'populate') {\n set(\n key,\n await validatePopulate(\n {\n schema,\n getModel,\n parent: { key, path, schema, attribute },\n path,\n },\n value, // pass the nested populate value\n includes // pass down the same includes object\n )\n );\n return;\n }\n\n // Throw an error if non-attribute operators are included in the populate array\n if (includes?.populate?.includes('nonAttributesOperators')) {\n throwInvalidKey({ key, path: path.attribute });\n }\n },\n ctx\n )\n );\n\n // Conditionally traverse for private fields only if 'private' is included\n if (includes?.populate?.includes('private')) {\n functionsToApply.push(traverseQueryPopulate(throwPrivate, ctx));\n }\n\n // Return directly if no validation functions are provided\n if (functionsToApply.length === 0) {\n return populate;\n }\n\n return pipeAsync(...functionsToApply)(populate);\n }\n);\n\nexport const defaultValidatePopulate = asyncCurry(async (ctx: Context, populate: unknown) => {\n if (!ctx.schema) {\n throw new Error('Missing schema in defaultValidatePopulate');\n }\n\n // Call validatePopulate and include all validations by passing in full traversal arrays\n return validatePopulate(ctx, populate, {\n filters: FILTER_TRAVERSALS,\n sort: SORT_TRAVERSALS,\n fields: FIELDS_TRAVERSALS,\n populate: POPULATE_TRAVERSALS,\n });\n});\n"],"names":["ID_ATTRIBUTE","DOC_ID_ATTRIBUTE","constants","FILTER_TRAVERSALS","validateFilters","asyncCurry","ctx","filters","include","schema","Error","functionsToApply","includes","push","traverseQueryFilters","key","attribute","path","isAttribute","isOperator","throwInvalidKey","throwDynamicZones","throwMorphToRelations","throwPassword","throwPrivate","length","pipeAsync","defaultValidateFilters","SORT_TRAVERSALS","validateSort","sort","traverseQuerySort","options","draftAndPublish","value","isScalarAttribute","isEmpty","defaultValidateSort","FIELDS_TRAVERSALS","validateFields","fields","traverseQueryFields","isNil","defaultValidateFields","isMorphLikeAttribute","isDynamicZoneAttribute","isMorphToRelationalAttribute","isPopulatableAttribute","type","isDotNotationPopulate","populate","Array","isArray","every","p","flattenDotPopulatePaths","items","flatMap","item","split","map","segment","trim","filter","Boolean","validatePopulateDotPathSegments","getModel","segments","pathPrefix","head","tail","fullPath","attributes","component","target","nextSegment","rest","nextPath","candidates","components","uid","model","validated","componentSchema","nestedAttribute","validatePopulateDotPaths","validateMorphLikeNestedPopulate","populateValue","POPULATE_TRAVERSALS","validatePopulate","traverseQueryPopulate","parent","set","isObject","raw","targets","Object","keys","parseType","defaultValidatePopulate"],"mappings":"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"}