@strapi/utils 5.5.2 → 5.7.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/parse-type.ts","../src/env-helper.ts","../src/content-types.ts","../src/set-creator-fields.ts","../src/hooks.ts","../src/provider-factory.ts","../src/traverse-entity.ts","../src/import-default.ts","../src/machine-id.ts","../src/format-yup-error.ts","../src/errors.ts","../src/validators.ts","../src/operators.ts","../src/convert-query-params.ts","../src/async.ts","../src/sanitize/visitors/remove-password.ts","../src/sanitize/visitors/remove-private.ts","../src/relations.ts","../src/sanitize/visitors/remove-restricted-relations.ts","../src/sanitize/visitors/remove-morph-to-relations.ts","../src/sanitize/visitors/remove-dynamic-zones.ts","../src/sanitize/visitors/remove-disallowed-fields.ts","../src/sanitize/visitors/remove-restricted-fields.ts","../src/sanitize/visitors/expand-wildcard-populate.ts","../src/traverse/factory.ts","../src/traverse/query-filters.ts","../src/traverse/query-sort.ts","../src/traverse/query-populate.ts","../src/traverse/query-fields.ts","../src/sanitize/sanitizers.ts","../src/sanitize/index.ts","../src/validate/utils.ts","../src/validate/visitors/throw-password.ts","../src/validate/visitors/throw-private.ts","../src/validate/visitors/throw-restricted-relations.ts","../src/validate/visitors/throw-morph-to-relations.ts","../src/validate/visitors/throw-dynamic-zones.ts","../src/validate/visitors/throw-disallowed-fields.ts","../src/validate/visitors/throw-restricted-fields.ts","../src/validate/visitors/throw-unrecognized-fields.ts","../src/validate/validators.ts","../src/validate/index.ts","../src/pagination.ts","../src/package-manager.ts","../src/template.ts","../src/file.ts","../src/policy.ts","../src/primitives/strings.ts","../src/primitives/arrays.ts","../src/primitives/objects.ts","../src/primitives/dates.ts","../src/print-value.ts","../src/yup.ts","../src/zod.ts"],"sourcesContent":["import * as _ from 'lodash';\nimport * as dates from 'date-fns';\n\nconst timeRegex = /^(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]{1,3})?$/;\n\nconst isDate = (v: unknown): v is Date => {\n return dates.isDate(v);\n};\n\nconst parseTime = (value: unknown): string => {\n if (isDate(value)) {\n return dates.format(value, 'HH:mm:ss.SSS');\n }\n\n if (typeof value !== 'string') {\n throw new Error(`Expected a string, got a ${typeof value}`);\n }\n const result = value.match(timeRegex);\n\n if (result === null) {\n throw new Error('Invalid time format, expected HH:mm:ss.SSS');\n }\n\n const [, hours, minutes, seconds, fraction = '.000'] = result;\n const fractionPart = _.padEnd(fraction.slice(1), 3, '0');\n\n return `${hours}:${minutes}:${seconds}.${fractionPart}`;\n};\n\nconst parseDate = (value: unknown) => {\n if (isDate(value)) {\n return dates.format(value, 'yyyy-MM-dd');\n }\n\n if (typeof value !== 'string') {\n throw new Error(`Expected a string, got a ${typeof value}`);\n }\n\n try {\n const date = dates.parseISO(value);\n\n if (dates.isValid(date)) return dates.format(date, 'yyyy-MM-dd');\n\n throw new Error(`Invalid format, expected an ISO compatible date`);\n } catch (error) {\n throw new Error(`Invalid format, expected an ISO compatible date`);\n }\n};\n\nconst parseDateTimeOrTimestamp = (value: unknown) => {\n if (isDate(value)) {\n return value;\n }\n\n if (typeof value !== 'string') {\n throw new Error(`Expected a string, got a ${typeof value}`);\n }\n\n try {\n const date = dates.parseISO(value);\n if (dates.isValid(date)) return date;\n\n const milliUnixDate = dates.parse(value, 'T', new Date());\n if (dates.isValid(milliUnixDate)) return milliUnixDate;\n\n throw new Error(`Invalid format, expected a timestamp or an ISO date`);\n } catch (error) {\n throw new Error(`Invalid format, expected a timestamp or an ISO date`);\n }\n};\n\ntype TypeMap = {\n boolean: boolean;\n integer: number;\n biginteger: number;\n float: number;\n decimal: number;\n time: string;\n date: string;\n timestamp: Date;\n datetime: Date;\n};\n\nexport interface ParseTypeOptions<T extends keyof TypeMap> {\n type: T;\n value: unknown;\n forceCast?: boolean;\n}\n\nconst parseBoolean = (value: unknown, options: { forceCast?: boolean }): boolean => {\n const { forceCast = false } = options;\n\n if (typeof value === 'boolean') {\n return value;\n }\n\n if (typeof value === 'string' || typeof value === 'number') {\n if (['true', 't', '1', 1].includes(value)) {\n return true;\n }\n\n if (['false', 'f', '0', 0].includes(value)) {\n return false;\n }\n }\n\n if (forceCast) {\n return Boolean(value);\n }\n\n throw new Error('Invalid boolean input. Expected \"t\",\"1\",\"true\",\"false\",\"0\",\"f\"');\n};\n\n/**\n * Cast basic values based on attribute type\n */\nconst parseType = <Type extends keyof TypeMap>(options: ParseTypeOptions<Type>): TypeMap[Type] => {\n const { type, value, forceCast } = options;\n\n switch (type) {\n case 'boolean':\n return parseBoolean(value, { forceCast }) as TypeMap[Type];\n case 'integer':\n case 'biginteger':\n case 'float':\n case 'decimal': {\n return _.toNumber(value) as TypeMap[Type];\n }\n case 'time': {\n return parseTime(value) as TypeMap[Type];\n }\n case 'date': {\n return parseDate(value) as TypeMap[Type];\n }\n case 'timestamp':\n case 'datetime': {\n return parseDateTimeOrTimestamp(value) as TypeMap[Type];\n }\n default:\n return value as TypeMap[Type];\n }\n};\n\nexport default parseType;\n","import _ from 'lodash';\n\nexport type Env = typeof envFn & typeof utils;\n\nfunction envFn<T>(key: string, defaultValue?: T): string | T | undefined {\n return _.has(process.env, key) ? process.env[key] : defaultValue;\n}\n\nfunction getKey(key: string) {\n return process.env[key] ?? '';\n}\n\nconst utils = {\n int(key: string, defaultValue?: number): number | undefined {\n if (!_.has(process.env, key)) {\n return defaultValue;\n }\n\n return parseInt(getKey(key), 10);\n },\n\n float(key: string, defaultValue?: number): number | undefined {\n if (!_.has(process.env, key)) {\n return defaultValue;\n }\n\n return parseFloat(getKey(key));\n },\n\n bool(key: string, defaultValue?: boolean): boolean | undefined {\n if (!_.has(process.env, key)) {\n return defaultValue;\n }\n\n return getKey(key) === 'true';\n },\n\n json(key: string, defaultValue?: object) {\n if (!_.has(process.env, key)) {\n return defaultValue;\n }\n\n try {\n return JSON.parse(getKey(key));\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Invalid json environment variable ${key}: ${error.message}`);\n }\n\n throw error;\n }\n },\n\n array(key: string, defaultValue?: string[]): string[] | undefined {\n if (!_.has(process.env, key)) {\n return defaultValue;\n }\n\n let value = getKey(key);\n\n if (value.startsWith('[') && value.endsWith(']')) {\n value = value.substring(1, value.length - 1);\n }\n\n return value.split(',').map((v) => {\n return _.trim(_.trim(v, ' '), '\"');\n });\n },\n\n date(key: string, defaultValue?: Date): Date | undefined {\n if (!_.has(process.env, key)) {\n return defaultValue;\n }\n\n return new Date(getKey(key));\n },\n\n /**\n * Gets a value from env that matches oneOf provided values\n * @param {string} key\n * @param {string[]} expectedValues\n * @param {string|undefined} defaultValue\n * @returns {string|undefined}\n */\n oneOf(key: string, expectedValues?: unknown[], defaultValue?: unknown) {\n if (!expectedValues) {\n throw new Error(`env.oneOf requires expectedValues`);\n }\n\n if (defaultValue && !expectedValues.includes(defaultValue)) {\n throw new Error(`env.oneOf requires defaultValue to be included in expectedValues`);\n }\n\n const rawValue = env(key, defaultValue);\n return expectedValues.includes(rawValue) ? rawValue : defaultValue;\n },\n};\n\nconst env: Env = Object.assign(envFn, utils);\n\nexport default env;\n","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 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 CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n CREATED_AT_ATTRIBUTE,\n UPDATED_AT_ATTRIBUTE,\n SINGLE_TYPE,\n COLLECTION_TYPE,\n};\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([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, ...getTimestamps(model), ...nonVisibleAttributes]);\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 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 ['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 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 getNonWritableAttributes,\n getComponentAttributes,\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 isSingleType,\n isCollectionType,\n isKind,\n getContentTypeRoutePrefix,\n getDoesAttributeRequireValidation,\n};\n","import { assign, assoc } from 'lodash/fp';\nimport * as contentTypes from './content-types';\n\nconst { CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE } = contentTypes.constants;\n\nexport interface Options {\n user: User;\n isEdition?: boolean;\n}\n\ninterface User {\n id: string | number;\n}\n\nconst setCreatorFields =\n <TData extends object>({ user, isEdition = false }: Options) =>\n <TDataInner extends object = TData>(data: TDataInner) => {\n if (isEdition) {\n return assoc(UPDATED_BY_ATTRIBUTE, user.id, data);\n }\n\n return assign(data, {\n [CREATED_BY_ATTRIBUTE]: user.id,\n [UPDATED_BY_ATTRIBUTE]: user.id,\n });\n };\n\nexport default setCreatorFields;\n","import { eq, remove, cloneDeep } from 'lodash/fp';\n\nexport type Handler = (...args: any[]) => any;\n\nexport interface Hook<T extends Handler = Handler> {\n getHandlers(): Handler[];\n register(handler: T): Hook<T>;\n delete(handler: T): Hook<T>;\n call(...args: any[]): void;\n}\n\nexport interface AsyncSeriesHook extends Hook {\n call(...args: any[]): Promise<void>;\n}\nexport interface AsyncSeriesWaterfallHook extends Hook {\n call(...args: any[]): Promise<any>;\n}\n\nexport interface AsyncParallelHook extends Hook {\n call(...args: any[]): Promise<any[]>;\n}\n\nexport interface AsyncBailHook extends Hook {\n call(...args: any[]): Promise<any>;\n}\n\n/**\n * Create a default Strapi hook\n */\nconst createHook = <T extends Handler = Handler>(): Hook<T> => {\n type State = {\n handlers: T[];\n };\n\n const state: State = {\n handlers: [],\n };\n\n return {\n getHandlers() {\n return state.handlers;\n },\n\n register(handler: T) {\n state.handlers.push(handler);\n\n return this;\n },\n\n delete(handler: T) {\n state.handlers = remove(eq(handler), state.handlers);\n\n return this;\n },\n\n call() {\n throw new Error('Method not implemented');\n },\n };\n};\n\n/**\n * Create an async series hook.\n * Upon execution, it will execute every handler in order with the same context\n */\nconst createAsyncSeriesHook = <T extends Handler = Handler>() => ({\n ...createHook<T>(),\n\n async call(context: unknown) {\n for (const handler of this.getHandlers()) {\n await handler(context);\n }\n },\n});\n\n/**\n * Create an async series waterfall hook.\n * Upon execution, it will execute every handler in order and pass the return value of the last handler to the next one\n */\nconst createAsyncSeriesWaterfallHook = <T extends Handler = Handler>() => ({\n ...createHook<T>(),\n\n async call(param: unknown) {\n let res = param;\n\n for (const handler of this.getHandlers()) {\n res = await handler(res);\n }\n\n return res;\n },\n});\n\n/**\n * Create an async parallel hook.\n * Upon execution, it will execute every registered handler in band.\n */\nconst createAsyncParallelHook = <T extends Handler = Handler>() => ({\n ...createHook<T>(),\n\n async call(context: unknown) {\n const promises = this.getHandlers().map((handler) => handler(cloneDeep(context)));\n\n return Promise.all(promises);\n },\n});\n\n/**\n * Create an async parallel hook.\n * Upon execution, it will execute every registered handler in serie and return the first result found.\n */\nconst createAsyncBailHook = <T extends Handler = Handler>() => ({\n ...createHook<T>(),\n\n async call(context: unknown) {\n for (const handler of this.getHandlers()) {\n const result = await handler(context);\n\n if (result !== undefined) {\n return result;\n }\n }\n },\n});\n\nexport const internals = {\n // Internal utils\n createHook,\n};\n\nexport {\n createAsyncSeriesHook,\n createAsyncSeriesWaterfallHook,\n createAsyncParallelHook,\n createAsyncBailHook,\n};\n","import { cloneDeep } from 'lodash/fp';\nimport {\n createAsyncSeriesHook,\n createAsyncParallelHook,\n AsyncSeriesHook,\n AsyncParallelHook,\n} from './hooks';\n\nexport interface ProviderHooksMap {\n willRegister: AsyncSeriesHook;\n didRegister: AsyncParallelHook;\n willDelete: AsyncParallelHook;\n didDelete: AsyncParallelHook;\n}\n\n/**\n * Creates a new object containing various hooks used by the providers\n */\nconst createProviderHooksMap = (): ProviderHooksMap => ({\n // Register events\n willRegister: createAsyncSeriesHook(),\n didRegister: createAsyncParallelHook(),\n // Delete events\n willDelete: createAsyncParallelHook(),\n didDelete: createAsyncParallelHook(),\n});\n\nexport interface Options {\n throwOnDuplicates?: boolean;\n}\n\ntype Item = Record<string, unknown>;\n\nexport interface Provider<T = unknown> {\n hooks: ProviderHooksMap;\n register(key: string, item: T): Promise<Provider>;\n delete(key: string): Promise<Provider>;\n get(key: string): T | undefined;\n values(): T[];\n keys(): string[];\n has(key: string): boolean;\n size(): number;\n clear(): Promise<Provider<T>>;\n}\n\nexport type ProviderFactory<T> = (options?: Options) => Provider<T>;\n\n/**\n * A Provider factory\n */\nconst providerFactory = <T = Item>(options: Options = {}): Provider<T> => {\n const { throwOnDuplicates = true } = options;\n\n const state = {\n hooks: createProviderHooksMap(),\n registry: new Map<string, T>(),\n };\n\n return {\n hooks: state.hooks,\n\n async register(key: string, item: T) {\n if (throwOnDuplicates && this.has(key)) {\n throw new Error(`Duplicated item key: ${key}`);\n }\n\n await state.hooks.willRegister.call({ key, value: item });\n\n state.registry.set(key, item);\n\n await state.hooks.didRegister.call({ key, value: cloneDeep(item) });\n\n return this;\n },\n\n async delete(key: string) {\n if (this.has(key)) {\n const item = this.get(key);\n\n await state.hooks.willDelete.call({ key, value: cloneDeep(item) });\n\n state.registry.delete(key);\n\n await state.hooks.didDelete.call({ key, value: cloneDeep(item) });\n }\n\n return this;\n },\n\n get(key: string) {\n return state.registry.get(key);\n },\n\n values() {\n return Array.from(state.registry.values());\n },\n\n keys() {\n return Array.from(state.registry.keys());\n },\n\n has(key: string) {\n return state.registry.has(key);\n },\n\n size() {\n return state.registry.size;\n },\n\n async clear() {\n const keys = this.keys();\n\n for (const key of keys) {\n await this.delete(key);\n }\n\n return this;\n },\n };\n};\n\nexport default providerFactory;\n","import { clone, isObject, isArray, isNil, curry } from 'lodash/fp';\n\nimport type { Attribute, AnyAttribute, Model, Data } from './types';\nimport { isRelationalAttribute, isMediaAttribute } from './content-types';\n\nexport type VisitorUtils = ReturnType<typeof createVisitorUtils>;\n\nexport interface VisitorOptions {\n data: Record<string, unknown>;\n schema: Model;\n key: string;\n value: Data[keyof Data];\n attribute?: AnyAttribute;\n path: Path;\n getModel(uid: string): Model;\n parent?: Parent;\n}\n\nexport type Visitor = (visitorOptions: VisitorOptions, visitorUtils: VisitorUtils) => void;\n\nexport interface Path {\n raw: string | null;\n attribute: string | null;\n}\n\nexport interface TraverseOptions {\n schema: Model;\n path?: Path;\n parent?: Parent;\n getModel(uid: string): Model;\n}\n\nexport interface Parent {\n attribute?: Attribute;\n key: string | null;\n path: Path;\n schema: Model;\n}\n\nconst traverseEntity = async (visitor: Visitor, options: TraverseOptions, entity: Data) => {\n const { path = { raw: null, attribute: null }, schema, getModel } = options;\n\n let parent = options.parent;\n\n const traverseMorphRelationTarget = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchema = getModel(entry.__type!);\n\n const traverseOptions: TraverseOptions = { schema: targetSchema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseRelationTarget =\n (schema: Model) => async (visitor: Visitor, path: Path, entry: Data) => {\n const traverseOptions: TraverseOptions = { schema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseMediaTarget = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchemaUID = 'plugin::upload.file';\n const targetSchema = getModel(targetSchemaUID);\n\n const traverseOptions: TraverseOptions = { schema: targetSchema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseComponent = async (visitor: Visitor, path: Path, schema: Model, entry: Data) => {\n const traverseOptions: TraverseOptions = { schema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const visitDynamicZoneEntry = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchema = getModel(entry.__component!);\n const traverseOptions: TraverseOptions = { schema: targetSchema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n // End recursion\n if (!isObject(entity) || isNil(schema)) {\n return entity;\n }\n\n // Don't mutate the original entity object\n // only clone at 1st level as the next level will get clone when traversed\n const copy = clone(entity);\n const visitorUtils = createVisitorUtils({ data: copy });\n\n const keys = Object.keys(copy);\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n // Retrieve the attribute definition associated to the key from the schema\n const attribute = schema.attributes[key] as AnyAttribute | undefined;\n\n const newPath = { ...path };\n\n newPath.raw = isNil(path.raw) ? key : `${path.raw}.${key}`;\n\n if (!isNil(attribute)) {\n newPath.attribute = isNil(path.attribute) ? key : `${path.attribute}.${key}`;\n }\n\n // Visit the current attribute\n const visitorOptions: VisitorOptions = {\n data: copy,\n schema,\n key,\n value: copy[key],\n attribute,\n path: newPath,\n getModel,\n parent,\n };\n\n await visitor(visitorOptions, visitorUtils);\n\n // Extract the value for the current key (after calling the visitor)\n const value = copy[key];\n\n // Ignore Nil values or attributes\n if (isNil(value) || isNil(attribute)) {\n continue;\n }\n\n // The current attribute becomes the parent once visited\n parent = { schema, key, attribute, path: newPath };\n\n if (isRelationalAttribute(attribute)) {\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n\n const method = isMorphRelation\n ? traverseMorphRelationTarget\n : traverseRelationTarget(getModel(attribute.target!));\n\n if (isArray(value)) {\n const res = new Array(value.length);\n for (let i = 0; i < value.length; i += 1) {\n res[i] = await method(visitor, newPath, value[i]);\n }\n copy[key] = res;\n } else {\n copy[key] = await method(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (isMediaAttribute(attribute)) {\n // need to update copy\n if (isArray(value)) {\n const res = new Array(value.length);\n for (let i = 0; i < value.length; i += 1) {\n res[i] = await traverseMediaTarget(visitor, newPath, value[i]);\n }\n copy[key] = res;\n } else {\n copy[key] = await traverseMediaTarget(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (attribute.type === 'component') {\n const targetSchema = getModel(attribute.component);\n\n if (isArray(value)) {\n const res: Data[] = new Array(value.length);\n for (let i = 0; i < value.length; i += 1) {\n res[i] = await traverseComponent(visitor, newPath, targetSchema, value[i]);\n }\n copy[key] = res;\n } else {\n copy[key] = await traverseComponent(visitor, newPath, targetSchema, value as Data);\n }\n\n continue;\n }\n\n if (attribute.type === 'dynamiczone' && isArray(value)) {\n const res = new Array(value.length);\n for (let i = 0; i < value.length; i += 1) {\n res[i] = await visitDynamicZoneEntry(visitor, newPath, value[i]);\n }\n copy[key] = res;\n\n continue;\n }\n }\n\n return copy;\n};\n\nconst createVisitorUtils = ({ data }: { data: Data }) => ({\n remove(key: string) {\n delete data[key];\n },\n\n set(key: string, value: Data) {\n data[key] = value;\n },\n});\n\nexport default curry(traverseEntity);\n","/* eslint-disable @typescript-eslint/no-var-requires */\n\nexport default function importDefault(modName: string) {\n const mod = require(modName);\n return mod && mod.__esModule ? mod.default : mod;\n}\n","import { randomUUID } from 'crypto';\nimport { machineIdSync } from 'node-machine-id';\n\nexport default () => {\n try {\n const deviceId = machineIdSync();\n return deviceId;\n } catch (error) {\n const deviceId = randomUUID();\n return deviceId;\n }\n};\n","import { isEmpty, toPath } from 'lodash/fp';\nimport { ValidationError } from 'yup';\n\nconst formatYupInnerError = (yupError: ValidationError) => ({\n path: toPath(yupError.path),\n message: yupError.message,\n name: yupError.name,\n});\n\nconst formatYupErrors = (yupError: ValidationError) => ({\n errors: isEmpty(yupError.inner)\n ? [formatYupInnerError(yupError)]\n : yupError.inner.map(formatYupInnerError),\n message: yupError.message,\n});\n\nexport { formatYupErrors };\n","/* eslint-disable max-classes-per-file */\n\nimport yup from 'yup';\nimport { HttpError } from 'http-errors';\nimport { formatYupErrors } from './format-yup-error';\n\n/* ApplicationError */\nclass ApplicationError<\n TName extends string = 'ApplicationError',\n TMessage extends string = string,\n TDetails = unknown,\n> extends Error {\n name: TName;\n\n details: TDetails;\n\n message: TMessage;\n\n constructor(\n message = 'An application error occured' as TMessage,\n details: TDetails = {} as TDetails\n ) {\n super();\n this.name = 'ApplicationError' as TName;\n this.message = message;\n this.details = details;\n }\n}\n\nclass ValidationError<\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<'ValidationError', TMessage, TDetails> {\n constructor(message: TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'ValidationError';\n }\n}\n\ninterface YupFormattedError {\n path: string[];\n message: string;\n name: string;\n}\n\nclass YupValidationError<TMessage extends string = string> extends ValidationError<\n TMessage,\n { errors: YupFormattedError[] }\n> {\n constructor(yupError: yup.ValidationError, message?: TMessage) {\n super('Validation' as TMessage);\n const { errors, message: yupMessage } = formatYupErrors(yupError);\n this.message = message || (yupMessage as TMessage);\n this.details = { errors };\n }\n}\n\nclass PaginationError<\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<'PaginationError', TMessage, TDetails> {\n constructor(message = 'Invalid pagination' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'PaginationError';\n this.message = message;\n }\n}\n\nclass NotFoundError<TMessage extends string = string, TDetails = unknown> extends ApplicationError<\n 'NotFoundError',\n TMessage,\n TDetails\n> {\n constructor(message = 'Entity not found' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'NotFoundError';\n this.message = message;\n }\n}\n\nclass ForbiddenError<\n TName extends string = 'ForbiddenError',\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<TName, TMessage, TDetails> {\n constructor(message = 'Forbidden access' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'ForbiddenError' as TName;\n this.message = message;\n }\n}\n\nclass UnauthorizedError<\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<'UnauthorizedError', TMessage, TDetails> {\n constructor(message = 'Unauthorized' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'UnauthorizedError';\n this.message = message;\n }\n}\n\nclass RateLimitError<TMessage extends string = string, TDetails = unknown> extends ApplicationError<\n 'RateLimitError',\n TMessage,\n TDetails\n> {\n constructor(\n message = 'Too many requests, please try again later.' as TMessage,\n details?: TDetails\n ) {\n super(message, details);\n this.name = 'RateLimitError';\n this.message = message;\n this.details = details || ({} as TDetails);\n }\n}\n\nclass PayloadTooLargeError<\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<'PayloadTooLargeError', TMessage, TDetails> {\n constructor(message = 'Entity too large' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'PayloadTooLargeError';\n this.message = message;\n }\n}\n\nclass PolicyError<TMessage extends string = string, TDetails = unknown> extends ForbiddenError<\n 'PolicyError',\n TMessage,\n TDetails\n> {\n constructor(message = 'Policy Failed' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'PolicyError';\n this.message = message;\n this.details = details || ({} as TDetails);\n }\n}\n\nclass NotImplementedError<\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<'NotImplementedError', TMessage, TDetails> {\n constructor(message = 'This feature is not implemented yet' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'NotImplementedError';\n this.message = message;\n }\n}\n\nexport {\n HttpError,\n ApplicationError,\n ValidationError,\n YupValidationError,\n PaginationError,\n NotFoundError,\n ForbiddenError,\n UnauthorizedError,\n RateLimitError,\n PayloadTooLargeError,\n PolicyError,\n NotImplementedError,\n};\n","/* eslint-disable @typescript-eslint/ban-ts-comment */\n/* eslint-disable no-template-curly-in-string */\nimport * as yup from 'yup';\nimport { defaults } from 'lodash/fp';\nimport { YupValidationError } from './errors';\n\nconst handleYupError = (error: yup.ValidationError, errorMessage?: string) => {\n throw new YupValidationError(error, errorMessage);\n};\n\nconst defaultValidationParam = { strict: true, abortEarly: false };\n\nconst validateYupSchema =\n <TSchema extends yup.AnySchema>(schema: TSchema, options = {}) =>\n async (body: unknown, errorMessage?: string): Promise<yup.InferType<TSchema>> => {\n try {\n const optionsWithDefaults = defaults(defaultValidationParam, options);\n const result = await schema.validate(body, optionsWithDefaults);\n return result;\n } catch (e) {\n if (e instanceof yup.ValidationError) {\n handleYupError(e, errorMessage);\n }\n\n throw e;\n }\n };\n\nconst validateYupSchemaSync =\n <TSchema extends yup.AnySchema>(schema: yup.AnySchema, options = {}) =>\n (body: unknown, errorMessage?: string): yup.InferType<TSchema> => {\n try {\n const optionsWithDefaults = defaults(defaultValidationParam, options);\n return schema.validateSync(body, optionsWithDefaults);\n } catch (e) {\n if (e instanceof yup.ValidationError) {\n handleYupError(e, errorMessage);\n }\n\n throw e;\n }\n };\n\nexport { handleYupError, validateYupSchema, validateYupSchemaSync };\n","const GROUP_OPERATORS = ['$and', '$or'];\n\nconst WHERE_OPERATORS = [\n '$not',\n '$in',\n '$notIn',\n '$eq',\n '$eqi',\n '$ne',\n '$nei',\n '$gt',\n '$gte',\n '$lt',\n '$lte',\n '$null',\n '$notNull',\n '$between',\n '$startsWith',\n '$endsWith',\n '$startsWithi',\n '$endsWithi',\n '$contains',\n '$notContains',\n '$containsi',\n '$notContainsi',\n // Experimental, only for internal use\n '$jsonSupersetOf',\n];\n\nconst CAST_OPERATORS = [\n '$not',\n '$in',\n '$notIn',\n '$eq',\n '$ne',\n '$gt',\n '$gte',\n '$lt',\n '$lte',\n '$between',\n];\n\nconst ARRAY_OPERATORS = ['$in', '$notIn', '$between'];\n\nconst OPERATORS = {\n where: WHERE_OPERATORS,\n cast: CAST_OPERATORS,\n group: GROUP_OPERATORS,\n array: ARRAY_OPERATORS,\n};\n\n// for performance, cache all operators in lowercase\nconst OPERATORS_LOWERCASE = Object.fromEntries(\n Object.entries(OPERATORS).map(([key, values]) => [\n key,\n values.map((value) => value.toLowerCase()),\n ])\n);\n\nconst isObjKey = <T extends object>(key: string | symbol | number, obj: T): key is keyof T => {\n return key in obj;\n};\n\nexport const isOperatorOfType = (type: string, key: string, ignoreCase = false) => {\n if (ignoreCase) {\n return OPERATORS_LOWERCASE[type]?.includes(key.toLowerCase()) ?? false;\n }\n\n if (isObjKey(type, OPERATORS)) {\n return OPERATORS[type]?.includes(key) ?? false;\n }\n\n return false;\n};\n\nexport const isOperator = (key: string, ignoreCase = false) => {\n return Object.keys(OPERATORS).some((type) => isOperatorOfType(type, key, ignoreCase));\n};\n","/* 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 } from './errors';\nimport { isOperator } from './operators';\n\nimport parseType from './parse-type';\nimport { Model } from './types';\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\nexport interface SortParamsObject {\n [key: string]: SortOrder | SortParamsObject;\n}\n\ntype SortParams = string | string[] | SortParamsObject | SortParamsObject[];\ntype FieldsParams = string | string[];\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}\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 Error {\n constructor() {\n super();\n this.message = 'Invalid order. order can only be one of asc|desc|ASC|DESC';\n }\n}\n\nclass InvalidSortError extends Error {\n constructor() {\n super();\n this.message =\n 'Invalid sort parameter. Expected a string, an array of strings, a sort object or an array of sort objects';\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 isPlainObject = (value: unknown): value is Record<string, unknown> => _.isPlainObject(value);\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 sortQuery.split(',').map((value) => convertSingleSortQueryParam(value));\n };\n\n const convertSingleSortQueryParam = (sortQuery: string): SortMap => {\n if (!sortQuery) {\n return {};\n }\n\n if (!isString(sortQuery)) {\n throw new Error('Invalid sort query');\n }\n\n // split field and order param with default order to ascending\n const [field, order = 'asc'] = sortQuery.split(':');\n\n if (field.length === 0) {\n throw new Error('Field cannot be empty');\n }\n\n validateOrder(order);\n\n // TODO: field should be a valid path on an object model\n\n return _.set({}, field, order);\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 transformedSort[field] = convertNestedSortQueryParam(order);\n } else if (typeof order === 'string') {\n validateOrder(order);\n transformedSort[field] = order;\n } else {\n throw Error(`Invalid sort type expected object or string got ${typeof order}`);\n }\n }\n\n return transformedSort;\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 Error(`convertStartQueryParams expected a positive integer got ${startAsANumber}`);\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 Error(`convertLimitQueryParams expected a positive integer got ${limitAsANumber}`);\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 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: ${page}`\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. You cannot use page and offset pagination in the same query'\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 Error(\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 ('populate' in subPopulate && subPopulate.populate !== '*') {\n throw new Error(\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) {\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 Error(`Using fragments is not permitted to populate \"${key}\" in \"${schema.uid}\"`);\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 Error(`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 if (sort) {\n query.orderBy = convertSortQueryParams(sort);\n }\n\n if (filters) {\n query.where = convertFiltersQueryParams(filters, schema);\n }\n\n if (fields) {\n query.select = convertFieldsQueryParams(fields);\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 = (fields: FieldsParams, depth = 0): 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 return _.uniq([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, ...fieldsValues]);\n }\n\n if (isStringArray(fields)) {\n // map convert\n const fieldsValues = fields\n .flatMap((value) => convertFieldsQueryParams(value, depth + 1))\n .filter((v) => !isNil(v)) as string[];\n\n return _.uniq([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, ...fieldsValues]);\n }\n\n throw new Error('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 Error('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 { _q, sort, filters, fields, populate, page, pageSize, start, limit, status, ...rest } =\n params;\n\n if (!isNil(status)) {\n convertStatusParams(status, query);\n }\n\n if (!isNil(_q)) {\n query._q = _q;\n }\n\n if (!isNil(sort)) {\n query.orderBy = convertSortQueryParams(sort);\n }\n\n if (!isNil(filters)) {\n query.where = convertFiltersQueryParams(filters, schema);\n }\n\n if (!isNil(fields)) {\n query.select = convertFieldsQueryParams(fields);\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","import pMap from 'p-map';\nimport { curry } from 'lodash/fp';\n\ntype AnyFunc<TA extends any[] = any[], TR = any> = (...args: TA) => TR;\n\ntype MakeProm<T> = Promise<T extends PromiseLike<infer I> ? I : T>;\n\ntype PipedFunc<T extends AnyFunc[]> =\n PipeReturn<T> extends never ? never : (...args: Parameters<T[0]>) => PipeReturn<T>;\n\ntype PipeReturn<F extends AnyFunc[]> = MakeProm<ReturnType<F[0]>>;\n\nexport function pipe<T extends AnyFunc[]>(...fns: PipeReturn<T> extends never ? never : T) {\n const [firstFn, ...fnRest] = fns;\n\n return (async (...args: any[]) => {\n let res = await firstFn.apply(firstFn, args);\n\n for (let i = 0; i < fnRest.length; i += 1) {\n res = await fnRest[i](res);\n }\n\n return res;\n }) as PipedFunc<T>;\n}\n\nexport const map = curry(pMap);\n\nexport const reduce =\n (mixedArray: any[]) =>\n async <T>(iteratee: AnyFunc, initialValue?: T) => {\n let acc = initialValue;\n for (let i = 0; i < mixedArray.length; i += 1) {\n acc = await iteratee(acc, await mixedArray[i], i);\n }\n return acc;\n };\n","import type { Visitor } from '../../traverse/factory';\n\nconst visitor: Visitor = ({ key, attribute }, { remove }) => {\n if (attribute?.type === 'password') {\n remove(key);\n }\n};\n\nexport default visitor;\n","import { isPrivateAttribute } from '../../content-types';\nimport type { Visitor } from '../../traverse/factory';\n\nconst visitor: Visitor = ({ schema, key, attribute }, { remove }) => {\n if (!attribute) {\n return;\n }\n\n const isPrivate = attribute.private === true || isPrivateAttribute(schema, key);\n\n if (isPrivate) {\n remove(key);\n }\n};\n\nexport default visitor;\n","import { isBoolean } from 'lodash/fp';\nimport type { Attribute, Model } from './types';\n\nimport { isRelationalAttribute } from './content-types';\n\nconst MANY_RELATIONS = ['oneToMany', 'manyToMany'];\n\nexport const getRelationalFields = (contentType: Model) => {\n return Object.keys(contentType.attributes).filter((attributeName) => {\n return contentType.attributes[attributeName].type === 'relation';\n });\n};\n\nexport const isOneToAny = (attribute: Attribute) =>\n isRelationalAttribute(attribute) && ['oneToOne', 'oneToMany'].includes(attribute.relation);\n\nexport const isManyToAny = (attribute: Attribute) =>\n isRelationalAttribute(attribute) && ['manyToMany', 'manyToOne'].includes(attribute.relation);\n\nexport const isAnyToOne = (attribute: Attribute) =>\n isRelationalAttribute(attribute) && ['oneToOne', 'manyToOne'].includes(attribute.relation);\n\nexport const isAnyToMany = (attribute: Attribute) =>\n isRelationalAttribute(attribute) && ['oneToMany', 'manyToMany'].includes(attribute.relation);\n\nexport const isPolymorphic = (attribute: any): any =>\n ['morphOne', 'morphMany', 'morphToOne', 'morphToMany'].includes(attribute.relation);\n\nexport const constants = {\n MANY_RELATIONS,\n};\n\n// Valid keys in the `options` property of relations reordering\n// The value for each key must be a function that returns true if it is a valid value\nexport const VALID_RELATION_ORDERING_KEYS: { [key: string]: (value: any) => boolean } = {\n strict: isBoolean,\n};\n","import { isArray, isObject } from 'lodash/fp';\nimport * as contentTypeUtils from '../../content-types';\nimport type { Visitor } from '../../traverse/factory';\nimport { RelationOrderingOptions } from '../../types';\nimport { VALID_RELATION_ORDERING_KEYS } from '../../relations';\n\nconst ACTIONS_TO_VERIFY = ['find'];\nconst { CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE } = contentTypeUtils.constants;\n\ntype MorphArray = Array<{ __type: string }>;\n\nexport default (auth: unknown): Visitor =>\n async ({ data, key, attribute, schema }, { remove, set }) => {\n if (!attribute) {\n return;\n }\n\n const isRelation = attribute.type === 'relation';\n\n if (!isRelation) {\n return;\n }\n\n const handleMorphRelation = async () => {\n const elements: any = (data as Record<string, MorphArray>)[key];\n\n if ('connect' in elements || 'set' in elements || 'disconnect' in elements) {\n const newValue: Record<string, unknown> = {};\n\n const connect = await handleMorphElements(elements.connect || []);\n const relSet = await handleMorphElements(elements.set || []);\n const disconnect = await handleMorphElements(elements.disconnect || []);\n\n if (connect.length > 0) {\n newValue.connect = connect;\n }\n\n if (relSet.length > 0) {\n newValue.set = relSet;\n }\n\n if (disconnect.length > 0) {\n newValue.disconnect = disconnect;\n }\n\n // TODO: this should technically be in its own visitor to check morph options, but for now we'll handle it here\n if (\n 'options' in elements &&\n typeof elements.options === 'object' &&\n elements.options !== null\n ) {\n const filteredOptions: RelationOrderingOptions = {};\n\n // Iterate through the keys of elements.options\n Object.keys(elements.options).forEach((key) => {\n const validator = VALID_RELATION_ORDERING_KEYS[key as keyof RelationOrderingOptions];\n\n // Ensure the key exists in VALID_RELATION_ORDERING_KEYS and the validator is defined before calling it\n if (validator && validator(elements.options[key])) {\n filteredOptions[key as keyof RelationOrderingOptions] = elements.options[key];\n }\n });\n\n // Assign the filtered options back to newValue\n newValue.options = filteredOptions;\n } else {\n newValue.options = {};\n }\n\n set(key, newValue);\n } else {\n const newMorphValue = await handleMorphElements(elements);\n\n if (newMorphValue.length) {\n set(key, newMorphValue);\n }\n }\n };\n\n const handleMorphElements = async (elements: any[]) => {\n const allowedElements: Record<string, unknown>[] = [];\n\n if (!isArray(elements)) {\n return allowedElements;\n }\n\n for (const element of elements) {\n if (!isObject(element) || !('__type' in element)) {\n continue;\n }\n\n const scopes = ACTIONS_TO_VERIFY.map((action) => `${element.__type}.${action}`);\n const isAllowed = await hasAccessToSomeScopes(scopes, auth);\n\n if (isAllowed) {\n allowedElements.push(element);\n }\n }\n\n return allowedElements;\n };\n\n const handleRegularRelation = async () => {\n const scopes = ACTIONS_TO_VERIFY.map((action) => `${attribute.target}.${action}`);\n\n const isAllowed = await hasAccessToSomeScopes(scopes, auth);\n\n // If the authenticated user don't have access to any of the scopes, then remove the field\n if (!isAllowed) {\n remove(key);\n }\n };\n\n const isCreatorRelation = [CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE].includes(key);\n\n // Polymorphic relations\n if (contentTypeUtils.isMorphToRelationalAttribute(attribute)) {\n await handleMorphRelation();\n return;\n }\n\n // Creator relations\n if (isCreatorRelation && schema.options?.populateCreatorFields) {\n // do nothing\n return;\n }\n\n // Regular relations\n await handleRegularRelation();\n };\n\nconst hasAccessToSomeScopes = async (scopes: string[], auth: unknown) => {\n for (const scope of scopes) {\n try {\n await strapi.auth.verify(auth, { scope });\n return true;\n } catch {\n continue;\n }\n }\n\n return false;\n};\n","import { isMorphToRelationalAttribute } from '../../content-types';\nimport type { Visitor } from '../../traverse/factory';\n\nconst visitor: Visitor = ({ key, attribute }, { remove }) => {\n if (isMorphToRelationalAttribute(attribute)) {\n remove(key);\n }\n};\n\nexport default visitor;\n","import { isDynamicZoneAttribute } from '../../content-types';\nimport type { Visitor } from '../../traverse/factory';\n\nconst visitor: Visitor = ({ key, attribute }, { remove }) => {\n if (isDynamicZoneAttribute(attribute)) {\n remove(key);\n }\n};\n\nexport default visitor;\n","import { isArray, isNil, isString, toPath } from 'lodash/fp';\nimport type { Visitor } from '../../traverse/factory';\n\nexport default (allowedFields: string[] | null = null): Visitor =>\n ({ key, path: { attribute: path } }, { remove }) => {\n // All fields are allowed\n if (allowedFields === null) {\n return;\n }\n\n // Throw on invalid formats\n if (!(isArray(allowedFields) && allowedFields.every(isString))) {\n throw new TypeError(\n `Expected array of strings for allowedFields but got \"${typeof allowedFields}\"`\n );\n }\n\n if (isNil(path)) {\n return;\n }\n\n const containedPaths = getContainedPaths(path);\n\n /**\n * Tells if the current path should be kept or not based\n * on the success of the check functions for any of the allowed paths.\n *\n * The check functions are defined as follow:\n *\n * `containedPaths.includes(p)`\n * @example\n * ```js\n * const path = 'foo.bar.field';\n * const p = 'foo.bar';\n * // it should match\n *\n * const path = 'foo.bar.field';\n * const p = 'bar.foo';\n * // it shouldn't match\n *\n * const path = 'foo.bar';\n * const p = 'foo.bar.field';\n * // it should match but isn't handled by this check\n * ```\n *\n * `p.startsWith(`${path}.`)`\n * @example\n * ```js\n * const path = 'foo.bar';\n * const p = 'foo.bar.field';\n * // it should match\n *\n * const path = 'foo.bar.field';\n * const p = 'bar.foo';\n * // it shouldn't match\n *\n * const path = 'foo.bar.field';\n * const p = 'foo.bar';\n * // it should match but isn't handled by this check\n * ```\n */\n const isPathAllowed = allowedFields.some(\n (p) => containedPaths.includes(p) || p.startsWith(`${path}.`)\n );\n\n if (isPathAllowed) {\n return;\n }\n\n // Remove otherwise\n remove(key);\n };\n\n/**\n * Retrieve the list of allowed paths based on the given path\n *\n * @example\n * ```js\n * const containedPaths = getContainedPaths('foo');\n * // ['foo']\n *\n * * const containedPaths = getContainedPaths('foo.bar');\n * // ['foo', 'foo.bar']\n *\n * * const containedPaths = getContainedPaths('foo.bar.field');\n * // ['foo', 'foo.bar', 'foo.bar.field']\n * ```\n */\nconst getContainedPaths = (path: string) => {\n const parts = toPath(path);\n\n return parts.reduce((acc, value, index, list) => {\n return [...acc, list.slice(0, index + 1).join('.')];\n }, [] as string[]);\n};\n","import { isArray, isString } from 'lodash/fp';\nimport type { Visitor } from '../../traverse/factory';\n\nexport default (restrictedFields: string[] | null = null): Visitor =>\n ({ key, path: { attribute: path } }, { remove }) => {\n // Remove all fields\n if (restrictedFields === null) {\n remove(key);\n return;\n }\n\n // Throw on invalid formats\n if (!(isArray(restrictedFields) && restrictedFields.every(isString))) {\n throw new TypeError(\n `Expected array of strings for restrictedFields but got \"${typeof restrictedFields}\"`\n );\n }\n\n // Remove if an exact match was found\n if (restrictedFields.includes(path as string)) {\n remove(key);\n return;\n }\n\n // Remove nested matches\n const isRestrictedNested = restrictedFields.some((allowedPath) =>\n path?.toString().startsWith(`${allowedPath}.`)\n );\n if (isRestrictedNested) {\n remove(key);\n }\n };\n","import type { Visitor } from '../../traverse/factory';\n\nconst visitor: Visitor = ({ schema, key, value }, { set }) => {\n if (key === '' && value === '*') {\n const { attributes } = schema;\n\n const newPopulateQuery = Object.entries(attributes)\n .filter(([, attribute]) =>\n ['relation', 'component', 'media', 'dynamiczone'].includes(attribute.type)\n )\n .reduce<Record<string, true>>((acc, [key]) => ({ ...acc, [key]: true }), {});\n\n set('', newPopulateQuery);\n }\n};\n\nexport default visitor;\n","/* eslint-disable @typescript-eslint/no-loop-func */\nimport { isNil, pick } from 'lodash/fp';\n\nimport {\n AnyAttribute,\n Attribute,\n ComponentAttribute,\n DynamicZoneAttribute,\n Model,\n RelationalAttribute,\n} from '../types';\n\nexport interface Path {\n raw: string | null;\n attribute: string | null;\n}\n\nexport interface Parent {\n attribute?: Attribute;\n key: string | null;\n path: Path;\n schema: Model;\n}\n\nexport interface TraverseOptions {\n schema: Model;\n path?: Path;\n parent?: Parent;\n getModel(uid: string): Model;\n}\n\nexport interface VisitorOptions {\n data: unknown;\n value: unknown;\n schema: Model;\n key: string;\n attribute?: AnyAttribute;\n path: Path;\n parent?: Parent;\n getModel(uid: string): Model;\n}\n\nexport type Traverse = (\n visitor: Visitor,\n options: TraverseOptions,\n data: unknown\n) => Promise<unknown>;\n\nexport interface Visitor {\n (visitorOptions: VisitorOptions, opts: Pick<TransformUtils, 'set' | 'remove'>): void;\n}\n\ninterface Interceptor<T = unknown> {\n predicate(data: unknown): data is T;\n handler(\n visitor: Visitor,\n options: TraverseOptions,\n data: T,\n recurseOptions: { recurse: Traverse }\n ): void;\n}\n\ninterface ParseUtils<T> {\n transform(data: T): unknown;\n remove(key: string, data: T): unknown;\n set(key: string, value: unknown, data: T): unknown;\n keys(data: T): string[];\n get(key: string, data: T): unknown;\n}\n\ninterface Parser<T = unknown> {\n predicate(data: unknown): data is T;\n parser(data: T): ParseUtils<T>;\n}\n\ninterface Ignore {\n (ctx: Context): boolean;\n}\n\ninterface AttributeHandler<AttributeType = Attribute> {\n predicate(ctx: Context<AttributeType>): boolean;\n handler(ctx: Context<AttributeType>, opts: Pick<TransformUtils, 'set' | 'recurse'>): void;\n}\ninterface CommonHandler<AttributeType = Attribute> {\n predicate(ctx: Context<AttributeType>): boolean;\n handler(ctx: Context<AttributeType>, opts: Pick<TransformUtils, 'set' | 'recurse'>): void;\n}\n\nexport interface TransformUtils {\n remove(key: string): void;\n set(key: string, value: unknown): void;\n recurse: Traverse;\n}\n\ninterface Context<AttributeType = Attribute> {\n key: string;\n value: unknown;\n attribute: AttributeType;\n schema: Model;\n path: Path;\n data: unknown;\n visitor: Visitor;\n parent?: Parent;\n getModel(uid: string): Model;\n}\n\ninterface State {\n parsers: Parser[];\n interceptors: Interceptor[];\n ignore: Ignore[];\n handlers: {\n attributes: AttributeHandler[];\n common: CommonHandler[];\n };\n}\n\nconst DEFAULT_PATH = { raw: null, attribute: null } satisfies Path;\n\nexport default () => {\n const state: State = {\n parsers: [],\n interceptors: [],\n ignore: [],\n handlers: {\n attributes: [],\n common: [],\n },\n };\n\n const traverse: Traverse = async (visitor, options, data) => {\n const { path = DEFAULT_PATH, parent, schema, getModel } = options ?? {};\n\n // interceptors\n for (const { predicate, handler } of state.interceptors) {\n if (predicate(data)) {\n return handler(visitor, options, data, { recurse: traverse });\n }\n }\n\n // parsers\n const parser = state.parsers.find((parser) => parser.predicate(data))?.parser;\n const utils = parser?.(data);\n\n // Return the data untouched if we don't know how to traverse it\n if (!utils) {\n return data;\n }\n\n // main loop\n let out = utils.transform(data);\n const keys = utils.keys(out);\n\n for (const key of keys) {\n const attribute = schema?.attributes?.[key];\n\n const newPath = { ...path };\n\n newPath.raw = isNil(path.raw) ? key : `${path.raw}.${key}`;\n\n if (!isNil(attribute)) {\n newPath.attribute = isNil(path.attribute) ? key : `${path.attribute}.${key}`;\n }\n\n // visitors\n const visitorOptions: VisitorOptions = {\n key,\n value: utils.get(key, out),\n attribute,\n schema,\n path: newPath,\n data: out,\n getModel,\n parent,\n };\n\n const transformUtils: TransformUtils = {\n remove(key) {\n out = utils.remove(key, out);\n },\n set(key, value) {\n out = utils.set(key, value, out);\n },\n recurse: traverse,\n };\n\n await visitor(visitorOptions, pick(['remove', 'set'], transformUtils));\n\n const value = utils.get(key, out);\n\n const createContext = (): Context => ({\n key,\n value,\n attribute,\n schema,\n path: newPath,\n data: out,\n visitor,\n getModel,\n parent,\n });\n\n // ignore\n const ignoreCtx = createContext();\n const shouldIgnore = state.ignore.some((predicate) => predicate(ignoreCtx));\n\n if (shouldIgnore) {\n continue;\n }\n\n // handlers\n const handlers = [...state.handlers.common, ...state.handlers.attributes];\n\n for await (const handler of handlers) {\n const ctx = createContext();\n const pass = await handler.predicate(ctx);\n\n if (pass) {\n await handler.handler(ctx, pick(['recurse', 'set'], transformUtils));\n }\n }\n }\n\n return out;\n };\n\n return {\n traverse,\n\n intercept<T>(predicate: Interceptor<T>['predicate'], handler: Interceptor<T>['handler']) {\n state.interceptors.push({ predicate, handler });\n return this;\n },\n\n parse<T>(predicate: Parser<T>['predicate'], parser: Parser<T>['parser']) {\n state.parsers.push({ predicate, parser });\n return this;\n },\n\n ignore(predicate: Ignore) {\n state.ignore.push(predicate);\n return this;\n },\n\n on(predicate: CommonHandler['predicate'], handler: CommonHandler['handler']) {\n state.handlers.common.push({ predicate, handler });\n return this;\n },\n\n onAttribute(predicate: AttributeHandler['predicate'], handler: AttributeHandler['handler']) {\n state.handlers.attributes.push({ predicate, handler });\n return this;\n },\n\n onRelation(handler: AttributeHandler<RelationalAttribute>['handler']) {\n return this.onAttribute(({ attribute }) => attribute?.type === 'relation', handler);\n },\n\n onMedia(handler: AttributeHandler<RelationalAttribute>['handler']) {\n return this.onAttribute(({ attribute }) => attribute?.type === 'media', handler);\n },\n\n onComponent(handler: AttributeHandler<ComponentAttribute>['handler']) {\n return this.onAttribute(({ attribute }) => attribute?.type === 'component', handler);\n },\n\n onDynamicZone(handler: AttributeHandler<DynamicZoneAttribute>['handler']) {\n return this.onAttribute(({ attribute }) => attribute?.type === 'dynamiczone', handler);\n },\n };\n};\n","import { curry, isObject, isEmpty, isArray, isNil, cloneDeep, omit } from 'lodash/fp';\n\nimport traverseFactory, { type Parent } from './factory';\n\nconst isObj = (value: unknown): value is Record<string, unknown> => isObject(value);\n\nconst filters = traverseFactory()\n .intercept(\n // Intercept filters arrays and apply the traversal to each one individually\n isArray,\n async (visitor, options, filters, { recurse }) => {\n return Promise.all(\n filters.map((filter, i) => {\n // In filters, only operators such as $and, $in, $notIn or $or and implicit operators like [...]\n // can have a value array, thus we can update the raw path but not the attribute one\n const newPath = options.path\n ? { ...options.path, raw: `${options.path.raw}[${i}]` }\n : options.path;\n\n return recurse(visitor, { ...options, path: newPath }, filter);\n })\n // todo: move that to the visitors\n ).then((res) => res.filter((val) => !(isObject(val) && isEmpty(val))));\n }\n )\n .intercept(\n // Ignore non object filters and return the value as-is\n (filters): filters is unknown => !isObject(filters),\n (_, __, filters) => {\n return filters;\n }\n )\n // Parse object values\n .parse(isObj, () => ({\n transform: cloneDeep,\n\n remove(key, data) {\n return omit(key, data);\n },\n\n set(key, value, data) {\n return { ...data, [key]: value };\n },\n\n keys(data) {\n return Object.keys(data);\n },\n\n get(key, data) {\n return data[key];\n },\n }))\n // Ignore null or undefined values\n .ignore(({ value }) => isNil(value))\n // Recursion on operators (non attributes)\n .on(\n ({ attribute }) => isNil(attribute),\n async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n set(key, await recurse(visitor, { schema, path, getModel, parent }, value));\n }\n )\n // Handle relation recursion\n .onRelation(\n async ({ key, attribute, visitor, path, value, schema, getModel }, { set, recurse }) => {\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n\n if (isMorphRelation) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchemaUID = attribute.target;\n const targetSchema = getModel(targetSchemaUID!);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n )\n .onComponent(\n async ({ key, attribute, visitor, path, schema, value, getModel }, { set, recurse }) => {\n const parent: Parent = { key, path, schema, attribute };\n const targetSchema = getModel(attribute.component);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n )\n // Handle media recursion\n .onMedia(async ({ key, visitor, path, schema, attribute, value, getModel }, { set, recurse }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchemaUID = 'plugin::upload.file';\n const targetSchema = getModel(targetSchemaUID);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n });\n\nexport default curry(filters.traverse);\n","import {\n curry,\n isString,\n isObject,\n map,\n trim,\n split,\n isEmpty,\n flatten,\n pipe,\n isNil,\n first,\n cloneDeep,\n} from 'lodash/fp';\n\nimport traverseFactory, { type Parent } from './factory';\n\nconst ORDERS = { asc: 'asc', desc: 'desc' };\nconst ORDER_VALUES = Object.values(ORDERS);\n\nconst isSortOrder = (value: string) => ORDER_VALUES.includes(value.toLowerCase());\nconst isStringArray = (value: unknown): value is string[] =>\n Array.isArray(value) && value.every(isString);\nconst isObjectArray = (value: unknown): value is object[] =>\n Array.isArray(value) && value.every(isObject);\nconst isNestedSorts = (value: unknown): value is string =>\n isString(value) && value.split(',').length > 1;\n\nconst isObj = (value: unknown): value is Record<string, unknown> => isObject(value);\n\nconst sort = traverseFactory()\n .intercept(\n // String with chained sorts (foo,bar,foobar) => split, map(recurse), then recompose\n isNestedSorts,\n async (visitor, options, sort, { recurse }) => {\n return Promise.all(\n sort\n .split(',')\n .map(trim)\n .map((nestedSort) => recurse(visitor, options, nestedSort))\n ).then((res) => res.filter((part) => !isEmpty(part)).join(','));\n }\n )\n .intercept(\n // Array of strings ['foo', 'foo,bar'] => map(recurse), then filter out empty items\n isStringArray,\n async (visitor, options, sort, { recurse }) => {\n return Promise.all(sort.map((nestedSort) => recurse(visitor, options, nestedSort))).then(\n (res) => res.filter((nestedSort) => !isEmpty(nestedSort))\n );\n }\n )\n .intercept(\n // Array of objects [{ foo: 'asc' }, { bar: 'desc', baz: 'asc' }] => map(recurse), then filter out empty items\n isObjectArray,\n async (visitor, options, sort, { recurse }) => {\n return Promise.all(sort.map((nestedSort) => recurse(visitor, options, nestedSort))).then(\n (res) => res.filter((nestedSort) => !isEmpty(nestedSort))\n );\n }\n )\n // Parse string values\n .parse(isString, () => {\n const tokenize = pipe(split('.'), map(split(':')), flatten);\n const recompose = (parts: string[]) => {\n if (parts.length === 0) {\n return undefined;\n }\n\n return parts.reduce((acc, part) => {\n if (isEmpty(part)) {\n return acc;\n }\n\n if (acc === '') {\n return part;\n }\n\n return isSortOrder(part) ? `${acc}:${part}` : `${acc}.${part}`;\n }, '');\n };\n\n return {\n transform: trim,\n\n remove(key, data) {\n const [root] = tokenize(data);\n\n return root === key ? undefined : data;\n },\n\n set(key, value, data) {\n const [root] = tokenize(data);\n\n if (root !== key) {\n return data;\n }\n\n return isNil(value) ? root : `${root}.${value}`;\n },\n\n keys(data) {\n const v = first(tokenize(data));\n return v ? [v] : [];\n },\n\n get(key, data) {\n const [root, ...rest] = tokenize(data);\n\n return key === root ? recompose(rest) : undefined;\n },\n };\n })\n // Parse object values\n .parse(isObj, () => ({\n transform: cloneDeep,\n\n remove(key, data) {\n // eslint-disable-next-line no-unused-vars\n const { [key]: ignored, ...rest } = data;\n\n return rest;\n },\n\n set(key, value, data) {\n return { ...data, [key]: value };\n },\n\n keys(data) {\n return Object.keys(data);\n },\n\n get(key, data) {\n return data[key];\n },\n }))\n // Handle deep sort on relation\n .onRelation(\n async ({ key, value, attribute, visitor, path, getModel, schema }, { set, recurse }) => {\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n\n if (isMorphRelation) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchemaUID = attribute.target;\n const targetSchema = getModel(targetSchemaUID!);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n )\n // Handle deep sort on media\n .onMedia(async ({ key, path, schema, attribute, visitor, value, getModel }, { recurse, set }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchemaUID = 'plugin::upload.file';\n const targetSchema = getModel(targetSchemaUID);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n })\n // Handle deep sort on components\n .onComponent(\n async ({ key, value, visitor, path, schema, attribute, getModel }, { recurse, set }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchema = getModel(attribute.component);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n );\n\nexport default curry(sort.traverse);\n","import {\n curry,\n isString,\n isArray,\n isEmpty,\n split,\n isObject,\n trim,\n constant,\n isNil,\n identity,\n cloneDeep,\n join,\n first,\n} from 'lodash/fp';\n\nimport traverseFactory, { type Parent } from './factory';\nimport { Attribute } from '../types';\nimport { isMorphToRelationalAttribute } from '../content-types';\n\nconst isKeyword = (keyword: string) => {\n return ({ key, attribute }: { key: string; attribute: Attribute }) => {\n return !attribute && keyword === key;\n };\n};\n\nconst isWildcard = (value: unknown): value is '*' => value === '*';\n\nconst isPopulateString = (value: unknown): value is string => {\n return isString(value) && !isWildcard(value);\n};\n\nconst isStringArray = (value: unknown): value is string[] =>\n isArray(value) && value.every(isString);\n\nconst isObj = (value: unknown): value is Record<string, unknown> => isObject(value);\n\nconst populate = traverseFactory()\n .intercept(isPopulateString, async (visitor, options, populate, { recurse }) => {\n /**\n * Ensure the populate clause its in the extended format ( { populate: { ... } }, and not just a string)\n * This gives a consistent structure to track the \"parent\" node of each nested populate clause\n */\n const populateObject = pathsToObjectPopulate([populate]);\n const traversedPopulate = (await recurse(visitor, options, populateObject)) as PopulateObject;\n const [result] = objectPopulateToPaths(traversedPopulate);\n\n return result;\n })\n // Array of strings ['foo', 'bar.baz'] => map(recurse), then filter out empty items\n .intercept(isStringArray, async (visitor, options, populate, { recurse }) => {\n const paths = await Promise.all(\n populate.map((subClause) => recurse(visitor, options, subClause))\n );\n\n return paths.filter((item) => !isNil(item));\n })\n // for wildcard, generate custom utilities to modify the values\n .parse(isWildcard, () => ({\n /**\n * Since value is '*', we don't need to transform it\n */\n transform: identity,\n\n /**\n * '*' isn't a key/value structure, so regardless\n * of the given key, it returns the data ('*')\n */\n get: (_key, data) => data,\n\n /**\n * '*' isn't a key/value structure, so regardless\n * of the given `key`, use `value` as the new `data`\n */\n set: (_key, value) => value,\n\n /**\n * '*' isn't a key/value structure, but we need to simulate at least one to enable\n * the data traversal. We're using '' since it represents a falsy string value\n */\n keys: constant(['']),\n\n /**\n * Removing '*' means setting it to undefined, regardless of the given key\n */\n remove: constant(undefined),\n }))\n\n // Parse string values\n .parse(isString, () => {\n const tokenize = split('.');\n const recompose = join('.');\n\n return {\n transform: trim,\n\n remove(key, data) {\n const [root] = tokenize(data);\n\n return root === key ? undefined : data;\n },\n\n set(key, value, data) {\n const [root] = tokenize(data);\n\n if (root !== key) {\n return data;\n }\n\n return isNil(value) || isEmpty(value) ? root : `${root}.${value}`;\n },\n\n keys(data) {\n const v = first(tokenize(data));\n return v ? [v] : [];\n },\n\n get(key, data) {\n const [root, ...rest] = tokenize(data);\n\n return key === root ? recompose(rest) : undefined;\n },\n };\n })\n // Parse object values\n .parse(isObj, () => ({\n transform: cloneDeep,\n\n remove(key, data) {\n // eslint-disable-next-line no-unused-vars\n const { [key]: ignored, ...rest } = data;\n\n return rest;\n },\n\n set(key, value, data) {\n return { ...data, [key]: value };\n },\n\n keys(data) {\n return Object.keys(data);\n },\n\n get(key, data) {\n return data[key];\n },\n }))\n .ignore(({ key, attribute }) => {\n // we don't want to recurse using traversePopulate and instead let\n // the visitors recurse with the appropriate traversal (sort, filters, etc...)\n return ['sort', 'filters', 'fields'].includes(key) && !attribute;\n })\n .on(\n // Handle recursion on populate.\"populate\"\n isKeyword('populate'),\n async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n const newValue = await recurse(visitor, { schema, path, getModel, parent }, value);\n\n set(key, newValue);\n }\n )\n .on(\n isKeyword('on'),\n async ({ key, visitor, path, value, getModel, parent }, { set, recurse }) => {\n const newOn: Record<string, unknown> = {};\n\n if (!isObj(value)) {\n return;\n }\n\n for (const [uid, subPopulate] of Object.entries(value)) {\n const model = getModel(uid);\n const newPath = { ...path, raw: `${path.raw}[${uid}]` };\n\n newOn[uid] = await recurse(\n visitor,\n { schema: model, path: newPath, getModel, parent },\n subPopulate\n );\n }\n\n set(key, newOn);\n }\n )\n // Handle populate on relation\n .onRelation(\n async ({ key, value, attribute, visitor, path, schema, getModel }, { set, recurse }) => {\n if (isNil(value)) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n if (isMorphToRelationalAttribute(attribute)) {\n // Don't traverse values that cannot be parsed\n if (!isObject(value) || !('on' in value && isObject(value?.on))) {\n return;\n }\n\n // If there is a populate fragment defined, traverse it\n const newValue = await recurse(\n visitor,\n { schema, path, getModel, parent },\n { on: value?.on }\n );\n\n set(key, newValue);\n\n return;\n }\n\n const targetSchemaUID = attribute.target;\n const targetSchema = getModel(targetSchemaUID!);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n )\n // Handle populate on media\n .onMedia(async ({ key, path, schema, attribute, visitor, value, getModel }, { recurse, set }) => {\n if (isNil(value)) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchemaUID = 'plugin::upload.file';\n const targetSchema = getModel(targetSchemaUID);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n })\n // Handle populate on components\n .onComponent(\n async ({ key, value, schema, visitor, path, attribute, getModel }, { recurse, set }) => {\n if (isNil(value)) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchema = getModel(attribute.component);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n )\n // Handle populate on dynamic zones\n .onDynamicZone(\n async ({ key, value, schema, visitor, path, attribute, getModel }, { set, recurse }) => {\n if (isNil(value) || !isObject(value)) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n // Handle fragment syntax\n if ('on' in value && value.on) {\n const newOn = await recurse(visitor, { schema, path, getModel, parent }, { on: value.on });\n\n set(key, newOn);\n }\n }\n );\n\nexport default curry(populate.traverse);\n\ntype PopulateObject = {\n [key: string]: true | { populate: PopulateObject };\n};\n\nconst objectPopulateToPaths = (input: PopulateObject): string[] => {\n const paths: string[] = [];\n\n function traverse(currentObj: PopulateObject, parentPath: string) {\n for (const [key, value] of Object.entries(currentObj)) {\n const currentPath = parentPath ? `${parentPath}.${key}` : key;\n if (value === true) {\n paths.push(currentPath);\n } else {\n traverse((value as { populate: PopulateObject }).populate, currentPath);\n }\n }\n }\n\n traverse(input, '');\n\n return paths;\n};\n\nconst pathsToObjectPopulate = (input: string[]): PopulateObject => {\n const result: PopulateObject = {};\n\n function traverse(object: PopulateObject, keys: string[]): void {\n const [first, ...rest] = keys;\n if (rest.length === 0) {\n object[first] = true;\n } else {\n if (!object[first] || typeof object[first] === 'boolean') {\n object[first] = { populate: {} };\n }\n traverse((object[first] as { populate: PopulateObject }).populate, rest);\n }\n }\n\n input.forEach((clause) => traverse(result, clause.split('.')));\n\n return result;\n};\n","import { curry, isArray, isString, eq, trim, constant } from 'lodash/fp';\n\nimport traverseFactory from './factory';\n\nconst isStringArray = (value: unknown): value is string[] => {\n return isArray(value) && value.every(isString);\n};\n\nconst fields = traverseFactory()\n // Intercept array of strings\n // e.g. fields=['title', 'description']\n .intercept(isStringArray, async (visitor, options, fields, { recurse }) => {\n return Promise.all(fields.map((field) => recurse(visitor, options, field)));\n })\n // Intercept comma separated fields (as string)\n // e.g. fields='title,description'\n .intercept(\n (value): value is string => isString(value) && value.includes(','),\n (visitor, options, fields, { recurse }) => {\n return Promise.all(fields.split(',').map((field) => recurse(visitor, options, field)));\n }\n )\n // Return wildcards as is\n .intercept((value): value is string => eq('*', value), constant('*'))\n // Parse string values\n // Since we're parsing strings only, each value should be an attribute name (and it's value, undefined),\n // thus it shouldn't be possible to set a new value, and get should return the whole data if key === data\n .parse(isString, () => ({\n transform: trim,\n\n remove(key, data) {\n return data === key ? undefined : data;\n },\n\n set(_key, _value, data) {\n return data;\n },\n\n keys(data) {\n return [data];\n },\n\n get(key, data) {\n return key === data ? data : undefined;\n },\n }));\n\nexport default curry(fields.traverse);\n","import { curry, isEmpty, isNil, isArray, isObject } from 'lodash/fp';\n\nimport { pipe as pipeAsync } from '../async';\nimport traverseEntity from '../traverse-entity';\nimport { isScalarAttribute, constants } from '../content-types';\n\nimport {\n traverseQueryFilters,\n traverseQuerySort,\n traverseQueryPopulate,\n traverseQueryFields,\n} from '../traverse';\n\nimport {\n removePassword,\n removePrivate,\n removeDynamicZones,\n removeMorphToRelations,\n expandWildcardPopulate,\n} from './visitors';\nimport { isOperator } from '../operators';\n\nimport type { Model, Data } from '../types';\nimport type { Parent } from '../traverse/factory';\n\ninterface Context {\n schema: Model;\n getModel: (model: string) => Model;\n parent?: Parent;\n}\n\nconst { ID_ATTRIBUTE, DOC_ID_ATTRIBUTE } = constants;\n\nconst sanitizePasswords = (ctx: Context) => async (entity: Data) => {\n if (!ctx.schema) {\n throw new Error('Missing schema in sanitizePasswords');\n }\n\n return traverseEntity(removePassword, ctx, entity);\n};\n\nconst defaultSanitizeOutput = async (ctx: Context, entity: Data) => {\n if (!ctx.schema) {\n throw new Error('Missing schema in defaultSanitizeOutput');\n }\n\n return traverseEntity(\n (...args) => {\n removePassword(...args);\n removePrivate(...args);\n },\n ctx,\n entity\n );\n};\n\nconst defaultSanitizeFilters = curry((ctx: Context, filters: unknown) => {\n if (!ctx.schema) {\n throw new Error('Missing schema in defaultSanitizeFilters');\n }\n\n return pipeAsync(\n // Remove keys that are not attributes or valid operators\n traverseQueryFilters(({ key, attribute }, { remove }) => {\n const isAttribute = !!attribute;\n\n // ID is not an attribute per se, so we need to make\n // an extra check to ensure we're not checking it\n if ([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE].includes(key)) {\n return;\n }\n\n if (!isAttribute && !isOperator(key)) {\n remove(key);\n }\n }, ctx),\n // Remove dynamic zones from filters\n traverseQueryFilters(removeDynamicZones, ctx),\n // Remove morpTo relations from filters\n traverseQueryFilters(removeMorphToRelations, ctx),\n // Remove passwords from filters\n traverseQueryFilters(removePassword, ctx),\n // Remove private from filters\n traverseQueryFilters(removePrivate, ctx),\n // Remove empty objects\n traverseQueryFilters(({ key, value }, { remove }) => {\n if (isObject(value) && isEmpty(value)) {\n remove(key);\n }\n }, ctx)\n )(filters);\n});\n\nconst defaultSanitizeSort = curry((ctx: Context, sort: unknown) => {\n if (!ctx.schema) {\n throw new Error('Missing schema in defaultSanitizeSort');\n }\n\n return pipeAsync(\n // Remove non attribute keys\n traverseQuerySort(({ key, attribute }, { remove }) => {\n // ID is not an attribute per se, so we need to make\n // an extra check to ensure we're not checking it\n if ([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE].includes(key)) {\n return;\n }\n\n if (!attribute) {\n remove(key);\n }\n }, ctx),\n // Remove dynamic zones from sort\n traverseQuerySort(removeDynamicZones, ctx),\n // Remove morpTo relations from sort\n traverseQuerySort(removeMorphToRelations, ctx),\n // Remove private from sort\n traverseQuerySort(removePrivate, ctx),\n // Remove passwords from filters\n traverseQuerySort(removePassword, ctx),\n // Remove keys for empty non-scalar values\n traverseQuerySort(({ key, attribute, value }, { remove }) => {\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 remove(key);\n }\n }, ctx)\n )(sort);\n});\n\nconst defaultSanitizeFields = curry((ctx: Context, fields: unknown) => {\n if (!ctx.schema) {\n throw new Error('Missing schema in defaultSanitizeFields');\n }\n\n return pipeAsync(\n // Only keep scalar attributes\n traverseQueryFields(({ key, attribute }, { remove }) => {\n // ID is not an attribute per se, so we need to make\n // an extra check to ensure we're not checking it\n if ([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE].includes(key)) {\n return;\n }\n\n if (isNil(attribute) || !isScalarAttribute(attribute)) {\n remove(key);\n }\n }, ctx),\n // Remove private fields\n traverseQueryFields(removePrivate, ctx),\n // Remove password fields\n traverseQueryFields(removePassword, ctx),\n // Remove nil values from fields array\n (value) => (isArray(value) ? value.filter((field) => !isNil(field)) : value)\n )(fields);\n});\n\nconst defaultSanitizePopulate = curry((ctx: Context, populate: unknown) => {\n if (!ctx.schema) {\n throw new Error('Missing schema in defaultSanitizePopulate');\n }\n\n return pipeAsync(\n traverseQueryPopulate(expandWildcardPopulate, ctx),\n traverseQueryPopulate(async ({ key, value, schema, attribute, getModel, path }, { set }) => {\n if (attribute) {\n return;\n }\n\n const parent = { key, path, schema, attribute } satisfies Parent;\n\n if (key === 'sort') {\n set(key, await defaultSanitizeSort({ schema, getModel, parent }, value));\n }\n\n if (key === 'filters') {\n set(key, await defaultSanitizeFilters({ schema, getModel, parent }, value));\n }\n\n if (key === 'fields') {\n set(key, await defaultSanitizeFields({ schema, getModel, parent }, value));\n }\n\n if (key === 'populate') {\n set(key, await defaultSanitizePopulate({ schema, getModel, parent }, value));\n }\n }, ctx),\n // Remove private fields\n traverseQueryPopulate(removePrivate, ctx)\n )(populate);\n});\n\nexport {\n sanitizePasswords,\n defaultSanitizeOutput,\n defaultSanitizeFilters,\n defaultSanitizeSort,\n defaultSanitizeFields,\n defaultSanitizePopulate,\n};\n","import { CurriedFunction1 } from 'lodash';\nimport { isArray, cloneDeep, omit } from 'lodash/fp';\n\nimport { constants, getNonWritableAttributes } from '../content-types';\nimport { pipe as pipeAsync } from '../async';\n\nimport * as visitors from './visitors';\nimport * as sanitizers from './sanitizers';\nimport traverseEntity from '../traverse-entity';\n\nimport { traverseQueryFilters, traverseQuerySort, traverseQueryPopulate } from '../traverse';\nimport type { Model, Data } from '../types';\n\nexport interface Options {\n auth?: unknown;\n}\n\nexport interface Sanitizer {\n (schema: Model): CurriedFunction1<Data, Promise<Data>>;\n}\nexport interface SanitizeFunc {\n (data: unknown, schema: Model, options?: Options): Promise<unknown>;\n}\n\nexport interface APIOptions {\n sanitizers?: Sanitizers;\n getModel: (model: string) => Model;\n}\n\nexport interface Sanitizers {\n input?: Sanitizer[];\n output?: Sanitizer[];\n}\n\nconst createAPISanitizers = (opts: APIOptions) => {\n const { getModel } = opts;\n\n const sanitizeInput: SanitizeFunc = (data: unknown, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeInput');\n }\n if (isArray(data)) {\n return Promise.all(data.map((entry) => sanitizeInput(entry, schema, { auth })));\n }\n\n const nonWritableAttributes = getNonWritableAttributes(schema);\n\n const transforms = [\n // Remove first level ID in inputs\n omit(constants.ID_ATTRIBUTE),\n omit(constants.DOC_ID_ATTRIBUTE),\n // Remove non-writable attributes\n traverseEntity(visitors.removeRestrictedFields(nonWritableAttributes), { schema, getModel }),\n ];\n\n if (auth) {\n // Remove restricted relations\n transforms.push(\n traverseEntity(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n // Apply sanitizers from registry if exists\n opts?.sanitizers?.input?.forEach((sanitizer: Sanitizer) => transforms.push(sanitizer(schema)));\n\n return pipeAsync(...transforms)(data as Data);\n };\n\n const sanitizeOutput: SanitizeFunc = async (data, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeOutput');\n }\n if (isArray(data)) {\n const res = new Array(data.length);\n for (let i = 0; i < data.length; i += 1) {\n res[i] = await sanitizeOutput(data[i], schema, { auth });\n }\n return res;\n }\n\n const transforms = [\n (data: Data) => sanitizers.defaultSanitizeOutput({ schema, getModel }, data),\n ];\n\n if (auth) {\n transforms.push(\n traverseEntity(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n // Apply sanitizers from registry if exists\n opts?.sanitizers?.output?.forEach((sanitizer: Sanitizer) => transforms.push(sanitizer(schema)));\n\n return pipeAsync(...transforms)(data as Data);\n };\n\n const sanitizeQuery = async (\n query: Record<string, unknown>,\n schema: Model,\n { auth }: Options = {}\n ) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeQuery');\n }\n const { filters, sort, fields, populate } = query;\n\n const sanitizedQuery = cloneDeep(query);\n\n if (filters) {\n Object.assign(sanitizedQuery, { filters: await sanitizeFilters(filters, schema, { auth }) });\n }\n\n if (sort) {\n Object.assign(sanitizedQuery, { sort: await sanitizeSort(sort, schema, { auth }) });\n }\n\n if (fields) {\n Object.assign(sanitizedQuery, { fields: await sanitizeFields(fields, schema) });\n }\n\n if (populate) {\n Object.assign(sanitizedQuery, { populate: await sanitizePopulate(populate, schema) });\n }\n\n return sanitizedQuery;\n };\n\n const sanitizeFilters: SanitizeFunc = (filters, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeFilters');\n }\n if (isArray(filters)) {\n return Promise.all(filters.map((filter) => sanitizeFilters(filter, schema, { auth })));\n }\n\n const transforms = [sanitizers.defaultSanitizeFilters({ schema, getModel })];\n\n if (auth) {\n transforms.push(\n traverseQueryFilters(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n return pipeAsync(...transforms)(filters);\n };\n\n const sanitizeSort: SanitizeFunc = (sort, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeSort');\n }\n const transforms = [sanitizers.defaultSanitizeSort({ schema, getModel })];\n\n if (auth) {\n transforms.push(\n traverseQuerySort(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n return pipeAsync(...transforms)(sort);\n };\n\n const sanitizeFields: SanitizeFunc = (fields, schema: Model) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeFields');\n }\n const transforms = [sanitizers.defaultSanitizeFields({ schema, getModel })];\n\n return pipeAsync(...transforms)(fields);\n };\n\n const sanitizePopulate: SanitizeFunc = (populate, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizePopulate');\n }\n const transforms = [sanitizers.defaultSanitizePopulate({ schema, getModel })];\n\n if (auth) {\n transforms.push(\n traverseQueryPopulate(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n return pipeAsync(...transforms)(populate);\n };\n\n return {\n input: sanitizeInput,\n output: sanitizeOutput,\n query: sanitizeQuery,\n filters: sanitizeFilters,\n sort: sanitizeSort,\n fields: sanitizeFields,\n populate: sanitizePopulate,\n };\n};\n\nexport { createAPISanitizers, sanitizers, visitors };\n\nexport type APISanitiers = ReturnType<typeof createAPISanitizers>;\n","import { ValidationError } from '../errors';\n\nexport const throwInvalidKey = ({ key, path }: { key: string; path?: string | null }): never => {\n const msg = path && path !== key ? `Invalid key ${key} at ${path}` : `Invalid key ${key}`;\n\n throw new ValidationError(msg, {\n key,\n path,\n });\n};\n\n// lodash/fp curry does not detect async methods, so we'll use our own that is typed correctly\nexport const asyncCurry = <A extends unknown[], R>(\n fn: (...args: A) => Promise<R>\n): ((...args: Partial<A>) => any) => {\n const curried = (...args: unknown[]): unknown => {\n if (args.length >= fn.length) {\n return fn(...(args as A));\n }\n return (...moreArgs: unknown[]) => curried(...args, ...moreArgs);\n };\n\n return curried;\n};\n","import { throwInvalidKey } from '../utils';\nimport type { Visitor } from '../../traverse/factory';\n\nconst visitor: Visitor = ({ key, attribute, path }) => {\n if (attribute?.type === 'password') {\n throwInvalidKey({ key, path: path.attribute });\n }\n};\n\nexport default visitor;\n","import { isPrivateAttribute } from '../../content-types';\nimport { throwInvalidKey } from '../utils';\nimport type { Visitor } from '../../traverse/factory';\n\nconst visitor: Visitor = ({ schema, key, attribute, path }) => {\n if (!attribute) {\n return;\n }\n\n const isPrivate = attribute.private === true || isPrivateAttribute(schema, key);\n\n if (isPrivate) {\n throwInvalidKey({ key, path: path.attribute });\n }\n};\n\nexport default visitor;\n","import { isArray, isObject } from 'lodash/fp';\nimport * as contentTypeUtils from '../../content-types';\nimport { throwInvalidKey } from '../utils';\nimport type { Visitor } from '../../traverse/factory';\nimport { VALID_RELATION_ORDERING_KEYS } from '../../relations';\n\nconst ACTIONS_TO_VERIFY = ['find'];\nconst { CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE } = contentTypeUtils.constants;\n\ntype MorphArray = Array<{ __type: string }>;\n\nexport default (auth: unknown): Visitor =>\n async ({ data, key, attribute, schema, path }) => {\n if (!attribute) {\n return;\n }\n\n const isRelation = attribute.type === 'relation';\n\n if (!isRelation) {\n return;\n }\n\n const handleMorphRelation = async () => {\n const elements: any = (data as Record<string, MorphArray>)[key];\n\n if (\n 'connect' in elements ||\n 'set' in elements ||\n 'disconnect' in elements ||\n 'options' in elements\n ) {\n await handleMorphElements(elements.connect || []);\n await handleMorphElements(elements.set || []);\n await handleMorphElements(elements.disconnect || []);\n\n // TODO: this should technically be in its own visitor to check morph options, but for now we'll handle it here\n if ('options' in elements) {\n if (elements.options === null || elements.options === undefined) {\n return;\n }\n\n if (typeof elements.options !== 'object') {\n throwInvalidKey({ key, path: path.attribute });\n }\n\n const optionKeys = Object.keys(elements.options);\n\n // Validate each key based on its validator function\n for (const key of optionKeys) {\n if (!(key in VALID_RELATION_ORDERING_KEYS)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n if (!VALID_RELATION_ORDERING_KEYS[key](elements.options[key])) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }\n }\n } else {\n await handleMorphElements(elements);\n }\n };\n\n const handleMorphElements = async (elements: any[]) => {\n if (!isArray(elements)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n\n for (const element of elements) {\n if (!isObject(element) || !('__type' in element)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n\n const scopes = ACTIONS_TO_VERIFY.map((action) => `${element.__type}.${action}`);\n const isAllowed = await hasAccessToSomeScopes(scopes, auth);\n\n if (!isAllowed) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }\n };\n\n const handleRegularRelation = async () => {\n const scopes = ACTIONS_TO_VERIFY.map((action) => `${attribute.target}.${action}`);\n\n const isAllowed = await hasAccessToSomeScopes(scopes, auth);\n\n // If the authenticated user don't have access to any of the scopes\n if (!isAllowed) {\n throwInvalidKey({ key, path: path.attribute });\n }\n };\n\n const isCreatorRelation = [CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE].includes(key);\n\n // Polymorphic relations\n if (contentTypeUtils.isMorphToRelationalAttribute(attribute)) {\n await handleMorphRelation();\n return;\n }\n\n // Creator relations\n if (isCreatorRelation && schema.options?.populateCreatorFields) {\n // do nothing\n return;\n }\n\n // Regular relations\n await handleRegularRelation();\n };\n\nconst hasAccessToSomeScopes = async (scopes: string[], auth: unknown) => {\n for (const scope of scopes) {\n try {\n await strapi.auth.verify(auth, { scope });\n return true;\n } catch {\n continue;\n }\n }\n\n return false;\n};\n","import { isMorphToRelationalAttribute } from '../../content-types';\nimport { throwInvalidKey } from '../utils';\nimport type { Visitor } from '../../traverse/factory';\n\nconst visitor: Visitor = ({ key, attribute, path }) => {\n if (isMorphToRelationalAttribute(attribute)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n};\n\nexport default visitor;\n","import { isDynamicZoneAttribute } from '../../content-types';\nimport { throwInvalidKey } from '../utils';\nimport type { Visitor } from '../../traverse/factory';\n\nconst visitor: Visitor = ({ key, attribute, path }) => {\n if (isDynamicZoneAttribute(attribute)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n};\n\nexport default visitor;\n","import { isArray, isNil, isString, toPath } from 'lodash/fp';\nimport type { Visitor } from '../../traverse/factory';\nimport { throwInvalidKey } from '../utils';\n\nexport default (allowedFields: string[] | null = null): Visitor =>\n ({ key, path: { attribute: path } }) => {\n // All fields are allowed\n if (allowedFields === null) {\n return;\n }\n\n // Throw on invalid formats\n if (!(isArray(allowedFields) && allowedFields.every(isString))) {\n throw new TypeError(\n `Expected array of strings for allowedFields but got \"${typeof allowedFields}\"`\n );\n }\n\n if (isNil(path)) {\n return;\n }\n\n const containedPaths = getContainedPaths(path);\n\n /**\n * Tells if the current path should be kept or not based\n * on the success of the check functions for any of the allowed paths.\n *\n * The check functions are defined as follow:\n *\n * `containedPaths.includes(p)`\n * @example\n * ```js\n * const path = 'foo.bar.field';\n * const p = 'foo.bar';\n * // it should match\n *\n * const path = 'foo.bar.field';\n * const p = 'bar.foo';\n * // it shouldn't match\n *\n * const path = 'foo.bar';\n * const p = 'foo.bar.field';\n * // it should match but isn't handled by this check\n * ```\n *\n * `p.startsWith(`${path}.`)`\n * @example\n * ```js\n * const path = 'foo.bar';\n * const p = 'foo.bar.field';\n * // it should match\n *\n * const path = 'foo.bar.field';\n * const p = 'bar.foo';\n * // it shouldn't match\n *\n * const path = 'foo.bar.field';\n * const p = 'foo.bar';\n * // it should match but isn't handled by this check\n * ```\n */\n const isPathAllowed = allowedFields.some(\n (p) => containedPaths.includes(p) || p.startsWith(`${path}.`)\n );\n\n if (isPathAllowed) {\n return;\n }\n\n // throw otherwise\n throwInvalidKey({ key, path });\n };\n\n/**\n * Retrieve the list of allowed paths based on the given path\n *\n * @example\n * ```js\n * const containedPaths = getContainedPaths('foo');\n * // ['foo']\n *\n * * const containedPaths = getContainedPaths('foo.bar');\n * // ['foo', 'foo.bar']\n *\n * * const containedPaths = getContainedPaths('foo.bar.field');\n * // ['foo', 'foo.bar', 'foo.bar.field']\n * ```\n */\nconst getContainedPaths = (path: string) => {\n const parts = toPath(path);\n\n return parts.reduce((acc, value, index, list) => {\n return [...acc, list.slice(0, index + 1).join('.')];\n }, [] as string[]);\n};\n","import { isArray, isString } from 'lodash/fp';\nimport type { Visitor } from '../../traverse/factory';\nimport { throwInvalidKey } from '../utils';\n\nexport default (restrictedFields: string[] | null = null): Visitor =>\n ({ key, path: { attribute: path } }) => {\n // all fields\n if (restrictedFields === null) {\n throwInvalidKey({ key, path });\n }\n\n // Throw on invalid formats\n if (!(isArray(restrictedFields) && restrictedFields.every(isString))) {\n throw new TypeError(\n `Expected array of strings for restrictedFields but got \"${typeof restrictedFields}\"`\n );\n }\n\n // if an exact match was found\n if (restrictedFields.includes(path as string)) {\n throwInvalidKey({ key, path });\n }\n\n // nested matches\n const isRestrictedNested = restrictedFields.some((allowedPath) =>\n path?.toString().startsWith(`${allowedPath}.`)\n );\n if (isRestrictedNested) {\n throwInvalidKey({ key, path });\n }\n };\n","import {\n isDynamicZoneAttribute,\n isMorphToRelationalAttribute,\n isRelationalAttribute,\n constants,\n isComponentSchema,\n isMediaAttribute,\n hasRelationReordering,\n} from '../../content-types';\nimport type { Visitor } from '../../traverse-entity';\nimport { throwInvalidKey } from '../utils';\n\n// TODO these should all be centralized somewhere instead of maintaining a list\nconst ID_FIELDS = [constants.DOC_ID_ATTRIBUTE, constants.DOC_ID_ATTRIBUTE];\nconst ALLOWED_ROOT_LEVEL_FIELDS = [...ID_FIELDS];\nconst MORPH_TO_ALLOWED_FIELDS = ['__type'];\nconst DYNAMIC_ZONE_ALLOWED_FIELDS = ['__component'];\nconst RELATION_REORDERING_FIELDS = ['connect', 'disconnect', 'set', 'options'];\n\nconst throwUnrecognizedFields: Visitor = ({ key, attribute, path, schema, parent }) => {\n // We only look at properties that are not attributes\n if (attribute) {\n return;\n }\n\n // At root level (path.attribute === null), only accept allowed fields\n if (path.attribute === null) {\n if (ALLOWED_ROOT_LEVEL_FIELDS.includes(key)) {\n return;\n }\n\n return throwInvalidKey({ key, path: attribute });\n }\n\n // allow special morphTo keys\n if (isMorphToRelationalAttribute(parent?.attribute) && MORPH_TO_ALLOWED_FIELDS.includes(key)) {\n return;\n }\n\n // allow special dz keys\n if (\n isComponentSchema(schema) &&\n isDynamicZoneAttribute(parent?.attribute) &&\n DYNAMIC_ZONE_ALLOWED_FIELDS.includes(key)\n ) {\n return;\n }\n\n // allow special relation reordering keys in manyToX and XtoMany relations\n if (hasRelationReordering(parent?.attribute) && RELATION_REORDERING_FIELDS.includes(key)) {\n return;\n }\n\n // allow id fields where it is needed for setting a relational id rather than trying to create with a given id\n const canUseID = isRelationalAttribute(parent?.attribute) || isMediaAttribute(parent?.attribute);\n if (canUseID && !ID_FIELDS.includes(key)) {\n return;\n }\n\n // if we couldn't find any reason for it to be here, throw\n throwInvalidKey({ key, path: attribute });\n};\n\nexport default throwUnrecognizedFields;\n","import { isEmpty, isNil, isObject } from 'lodash/fp';\n\nimport { pipe as pipeAsync } from '../async';\nimport { isScalarAttribute, constants } 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 { 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 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\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 // 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 // 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","import { CurriedFunction1 } from 'lodash';\nimport { isArray, isObject } from 'lodash/fp';\n\nimport { getNonWritableAttributes, constants } from '../content-types';\nimport { pipe as pipeAsync } from '../async';\nimport { throwInvalidKey } from './utils';\n\nimport * as visitors from './visitors';\nimport * as validators from './validators';\nimport traverseEntity from '../traverse-entity';\n\nimport { traverseQueryFilters, traverseQuerySort, traverseQueryPopulate } from '../traverse';\n\nimport { Model, Data } from '../types';\nimport { ValidationError } from '../errors';\n\nconst { ID_ATTRIBUTE, DOC_ID_ATTRIBUTE } = constants;\n\nexport interface Options {\n auth?: unknown;\n}\n\nexport interface Validator {\n (schema: Model): CurriedFunction1<Data, Promise<Data>>;\n}\nexport interface ValidateFunc {\n (data: unknown, schema: Model, options?: Options): Promise<void>;\n}\n\ninterface APIOptions {\n validators?: Validators;\n getModel: (model: string) => Model;\n}\n\nexport interface Validators {\n input?: Validator[];\n}\n\nconst createAPIValidators = (opts: APIOptions) => {\n const { getModel } = opts || {};\n\n const validateInput: ValidateFunc = async (data: unknown, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in validateInput');\n }\n\n if (isArray(data)) {\n await Promise.all(data.map((entry) => validateInput(entry, schema, { auth })));\n return;\n }\n\n const nonWritableAttributes = getNonWritableAttributes(schema);\n\n const transforms = [\n (data: unknown) => {\n if (isObject(data)) {\n if (ID_ATTRIBUTE in data) {\n throwInvalidKey({ key: ID_ATTRIBUTE });\n }\n\n if (DOC_ID_ATTRIBUTE in data) {\n throwInvalidKey({ key: DOC_ID_ATTRIBUTE });\n }\n }\n return data;\n },\n // non-writable attributes\n traverseEntity(visitors.throwRestrictedFields(nonWritableAttributes), { schema, getModel }),\n // unrecognized attributes\n traverseEntity(visitors.throwUnrecognizedFields, { schema, getModel }),\n ];\n\n if (auth) {\n // restricted relations\n transforms.push(\n traverseEntity(visitors.throwRestrictedRelations(auth), {\n schema,\n getModel,\n })\n );\n }\n\n // Apply validators from registry if exists\n opts?.validators?.input?.forEach((validator: Validator) => transforms.push(validator(schema)));\n\n try {\n await pipeAsync(...transforms)(data as Data);\n } catch (e) {\n if (e instanceof ValidationError) {\n e.details.source = 'body';\n }\n throw e;\n }\n };\n\n const validateQuery = async (\n query: Record<string, unknown>,\n schema: Model,\n { auth }: Options = {}\n ) => {\n if (!schema) {\n throw new Error('Missing schema in validateQuery');\n }\n const { filters, sort, fields, populate } = query;\n\n if (filters) {\n await validateFilters(filters, schema, { auth });\n }\n\n if (sort) {\n await validateSort(sort, schema, { auth });\n }\n\n if (fields) {\n await validateFields(fields, schema);\n }\n\n // a wildcard is always valid; its conversion will be handled by the entity service and can be optimized with sanitizer\n if (populate && populate !== '*') {\n await validatePopulate(populate, schema);\n }\n };\n\n const validateFilters: ValidateFunc = async (filters, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in validateFilters');\n }\n if (isArray(filters)) {\n await Promise.all(filters.map((filter) => validateFilters(filter, schema, { auth })));\n return;\n }\n\n const transforms = [validators.defaultValidateFilters({ schema, getModel })];\n\n if (auth) {\n transforms.push(\n traverseQueryFilters(visitors.throwRestrictedRelations(auth), {\n schema,\n getModel,\n })\n );\n }\n\n try {\n await pipeAsync(...transforms)(filters);\n } catch (e) {\n if (e instanceof ValidationError) {\n e.details.source = 'query';\n e.details.param = 'filters';\n }\n throw e;\n }\n };\n\n const validateSort: ValidateFunc = async (sort, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in validateSort');\n }\n const transforms = [validators.defaultValidateSort({ schema, getModel })];\n\n if (auth) {\n transforms.push(\n traverseQuerySort(visitors.throwRestrictedRelations(auth), {\n schema,\n getModel,\n })\n );\n }\n\n try {\n await pipeAsync(...transforms)(sort);\n } catch (e) {\n if (e instanceof ValidationError) {\n e.details.source = 'query';\n e.details.param = 'sort';\n }\n throw e;\n }\n };\n\n const validateFields: ValidateFunc = async (fields, schema: Model) => {\n if (!schema) {\n throw new Error('Missing schema in validateFields');\n }\n const transforms = [validators.defaultValidateFields({ schema, getModel })];\n\n try {\n await pipeAsync(...transforms)(fields);\n } catch (e) {\n if (e instanceof ValidationError) {\n e.details.source = 'query';\n e.details.param = 'fields';\n }\n throw e;\n }\n };\n\n const validatePopulate: ValidateFunc = async (populate, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizePopulate');\n }\n const transforms = [validators.defaultValidatePopulate({ schema, getModel })];\n\n if (auth) {\n transforms.push(\n traverseQueryPopulate(visitors.throwRestrictedRelations(auth), {\n schema,\n getModel,\n })\n );\n }\n\n try {\n await pipeAsync(...transforms)(populate);\n } catch (e) {\n if (e instanceof ValidationError) {\n e.details.source = 'query';\n e.details.param = 'populate';\n }\n throw e;\n }\n };\n\n return {\n input: validateInput,\n query: validateQuery,\n filters: validateFilters,\n sort: validateSort,\n fields: validateFields,\n populate: validatePopulate,\n };\n};\n\nexport { createAPIValidators, validators, visitors };\n\nexport type APIValidators = ReturnType<typeof createAPIValidators>;\n","import { merge, pipe, omit, isNil } from 'lodash/fp';\nimport { PaginationError } from './errors';\n\ninterface PaginationArgs {\n page: number;\n pageSize: number;\n start: number;\n limit: number;\n}\n\nexport interface Pagination {\n start: number;\n limit: number;\n}\n\nexport interface PagePatinationInformation {\n page: number;\n pageSize: number;\n pageCount: number;\n total: number;\n}\n\nexport interface OffsetPaginationInformation {\n start: number;\n limit: number;\n total: number;\n}\n\nconst STRAPI_DEFAULTS = {\n offset: {\n start: 0,\n limit: 10,\n },\n page: {\n page: 1,\n pageSize: 10,\n },\n};\n\nconst paginationAttributes = ['start', 'limit', 'page', 'pageSize'];\n\nconst withMaxLimit = (limit: number, maxLimit = -1) => {\n if (maxLimit === -1 || limit < maxLimit) {\n return limit;\n }\n\n return maxLimit;\n};\n\n// Ensure minimum page & pageSize values (page >= 1, pageSize >= 0, start >= 0, limit >= 0)\nconst ensureMinValues = ({ start, limit }: Pagination) => ({\n start: Math.max(start, 0),\n limit: limit === -1 ? limit : Math.max(limit, 1),\n});\n\nconst ensureMaxValues =\n (maxLimit = -1) =>\n ({ start, limit }: { start: number; limit: number }) => ({\n start,\n limit: withMaxLimit(limit, maxLimit),\n });\n\n// Apply maxLimit as the limit when limit is -1\nconst withNoLimit = (pagination: Pagination, maxLimit = -1) => ({\n ...pagination,\n limit: pagination.limit === -1 ? maxLimit : pagination.limit,\n});\n\nconst withDefaultPagination = <T extends Partial<PaginationArgs>>(\n args: T,\n { defaults = {}, maxLimit = -1 } = {}\n) => {\n const defaultValues = merge(STRAPI_DEFAULTS, defaults);\n\n const usePagePagination = !isNil(args.page) || !isNil(args.pageSize);\n const useOffsetPagination = !isNil(args.start) || !isNil(args.limit);\n\n const ensureValidValues = pipe(ensureMinValues, ensureMaxValues(maxLimit));\n\n // If there is no pagination attribute, don't modify the payload\n if (!usePagePagination && !useOffsetPagination) {\n return merge(args, ensureValidValues(defaultValues.offset));\n }\n\n // If there is page & offset pagination attributes, throw an error\n if (usePagePagination && useOffsetPagination) {\n throw new PaginationError('Cannot use both page & offset pagination in the same query');\n }\n\n const pagination: Pagination = {\n start: 0,\n limit: 0,\n };\n\n // Start / Limit\n if (useOffsetPagination) {\n const { start, limit } = merge(defaultValues.offset, args);\n\n Object.assign(pagination, { start, limit });\n }\n\n // Page / PageSize\n if (usePagePagination) {\n const { page, pageSize } = merge(defaultValues.page, {\n ...args,\n pageSize: Math.max(1, args.pageSize ?? 0),\n });\n\n Object.assign(pagination, {\n start: (page - 1) * pageSize,\n limit: pageSize,\n });\n }\n\n // Handle -1 limit\n Object.assign(pagination, withNoLimit(pagination, maxLimit));\n\n const replacePaginationAttributes = pipe(\n // Remove pagination attributes\n omit(paginationAttributes),\n // Merge the object with the new pagination + ensure minimum & maximum values\n merge(ensureValidValues(pagination))\n );\n\n return replacePaginationAttributes(args);\n};\n\n/**\n * Transform pagination information into a paginated response:\n * {\n * page: number,\n * pageSize: number,\n * pageCount: number,\n * total: number\n * }\n */\nconst transformPagedPaginationInfo = (\n paginationInfo: Partial<PaginationArgs>,\n total: number\n): PagePatinationInformation => {\n if (!isNil(paginationInfo.page)) {\n const page = paginationInfo.page;\n const pageSize = paginationInfo.pageSize ?? total;\n\n return {\n page,\n pageSize,\n pageCount: pageSize > 0 ? Math.ceil(total / pageSize) : 0,\n total,\n };\n }\n\n if (!isNil(paginationInfo.start)) {\n const start = paginationInfo.start;\n const limit = paginationInfo.limit ?? total;\n\n // Start limit to page page size\n return {\n page: Math.floor(start / limit) + 1,\n pageSize: limit,\n pageCount: limit > 0 ? Math.ceil(total / limit) : 0,\n total,\n };\n }\n\n // Default pagination\n return {\n ...paginationInfo,\n page: 1,\n pageSize: 10,\n pageCount: 1,\n total,\n };\n};\n\n/**\n * Transform pagination information into a offset response:\n * {\n * start: number,\n * limit: number,\n * total: number\n * }\n */\nconst transformOffsetPaginationInfo = (\n paginationInfo: Partial<PaginationArgs>,\n total: number\n): OffsetPaginationInformation => {\n if (!isNil(paginationInfo.page)) {\n const limit = paginationInfo.pageSize ?? total;\n const start = (paginationInfo.page - 1) * limit;\n\n return { start, limit, total };\n }\n\n if (!isNil(paginationInfo.start)) {\n const start = paginationInfo.start;\n const limit = paginationInfo.limit ?? total;\n\n // Start limit to page page size\n return { start, limit, total };\n }\n\n // Default pagination\n return {\n ...paginationInfo,\n start: 0,\n limit: 10,\n total,\n };\n};\n\nexport { withDefaultPagination, transformPagedPaginationInfo, transformOffsetPaginationInfo };\n","import execa from 'execa';\nimport preferredPM from 'preferred-pm';\n\nimport type { Options as ProcessOptions } from 'execa';\n\nconst SUPPORTED_PACKAGE_MANAGERS = ['npm', 'yarn'];\nconst DEFAULT_PACKAGE_MANAGER = 'npm' as const;\n\ntype SupportedPackageManagerName = 'npm' | 'yarn';\n\nexport const getPreferred = async (pkgPath: string): Promise<SupportedPackageManagerName> => {\n const pm = await preferredPM(pkgPath);\n\n const hasPackageManager = pm !== undefined;\n if (!hasPackageManager) {\n throw new Error(`Couldn't find a package manager in your project.`);\n }\n\n const isPackageManagerSupported = SUPPORTED_PACKAGE_MANAGERS.includes(pm.name);\n if (!isPackageManagerSupported) {\n process.emitWarning(\n `We detected your package manager (${pm.name} v${pm.version}), but it's not officially supported by Strapi yet. Defaulting to npm instead.`\n );\n\n return DEFAULT_PACKAGE_MANAGER;\n }\n\n return pm.name as SupportedPackageManagerName;\n};\n\nexport const installDependencies = (\n path: string,\n packageManager: SupportedPackageManagerName,\n options: ProcessOptions<string> = {}\n) => {\n return execa(packageManager, ['install'], { ...options, cwd: path, stdin: 'ignore' });\n};\n","/**\n * Create a strict interpolation RegExp based on the given variables' name\n */\nconst createStrictInterpolationRegExp = (allowedVariableNames: string[], flags: string) => {\n const oneOfVariables = allowedVariableNames.join('|');\n\n // 1. We need to match the delimiters: <%= ... %>\n // 2. We accept any number of whitespaces characters before and/or after the variable name: \\s* ... \\s*\n // 3. We only accept values from the variable list as interpolation variables' name: : (${oneOfVariables})\n return new RegExp(`<%=\\\\s*(${oneOfVariables})\\\\s*%>`, flags);\n};\n\n/**\n * Create a loose interpolation RegExp to match as many groups as possible\n */\nconst createLooseInterpolationRegExp = (flags: string) => new RegExp(/<%=([\\s\\S]+?)%>/, flags);\n\nexport { createStrictInterpolationRegExp, createLooseInterpolationRegExp };\n","/**\n * Utils file containing file treatment utils\n */\nimport { Writable, WritableOptions } from 'node:stream';\n\nconst kbytesToBytes = (kbytes: number) => kbytes * 1000;\nconst bytesToKbytes = (bytes: number) => Math.round((bytes / 1000) * 100) / 100;\nconst bytesToHumanReadable = (bytes: number) => {\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];\n if (bytes === 0) return '0 Bytes';\n const i = parseInt(`${Math.floor(Math.log(bytes) / Math.log(1000))}`, 10);\n return `${Math.round(bytes / 1000 ** i)} ${sizes[i]}`;\n};\n\nconst streamToBuffer = (stream: NodeJS.ReadableStream): Promise<Buffer> =>\n new Promise((resolve, reject) => {\n const chunks: Uint8Array[] = [];\n stream.on('data', (chunk) => {\n chunks.push(chunk);\n });\n stream.on('end', () => {\n resolve(Buffer.concat(chunks));\n });\n stream.on('error', reject);\n });\n\nconst getStreamSize = (stream: NodeJS.ReadableStream) =>\n new Promise((resolve, reject) => {\n let size = 0;\n stream.on('data', (chunk) => {\n size += Buffer.byteLength(chunk);\n });\n stream.on('close', () => resolve(size));\n stream.on('error', reject);\n stream.resume();\n });\n\n/**\n * Create a writeable Node.js stream that discards received data.\n * Useful for testing, draining a stream of data, etc.\n */\nfunction writableDiscardStream(options?: WritableOptions) {\n return new Writable({\n ...options,\n write(chunk, encding, callback) {\n setImmediate(callback);\n },\n });\n}\n\nexport {\n streamToBuffer,\n bytesToHumanReadable,\n bytesToKbytes,\n kbytesToBytes,\n getStreamSize,\n writableDiscardStream,\n};\n","import { eq } from 'lodash/fp';\n\ninterface Options {\n name: string;\n validator?(config: unknown): void;\n handler(...args: any[]): any;\n}\n\nconst createPolicy = (options: Options) => {\n const { name = 'unnamed', validator, handler } = options;\n\n const wrappedValidator = (config: unknown) => {\n if (validator) {\n try {\n validator(config);\n } catch (e) {\n throw new Error(`Invalid config passed to \"${name}\" policy.`);\n }\n }\n };\n\n return {\n name,\n validator: wrappedValidator,\n handler,\n };\n};\n\nconst createPolicyContext = (type: string, ctx: object) => {\n return Object.assign(\n {\n is: eq(type),\n get type() {\n return type;\n },\n },\n ctx\n );\n};\n\nexport { createPolicy, createPolicyContext };\n","import _, { kebabCase } from 'lodash';\nimport { trimChars, trimCharsEnd, trimCharsStart } from 'lodash/fp';\nimport slugify from '@sindresorhus/slugify';\n\nconst nameToSlug = (name: string, options: slugify.Options = { separator: '-' }) =>\n slugify(name, options);\n\nconst nameToCollectionName = (name: string) => slugify(name, { separator: '_' });\n\nconst toRegressedEnumValue = (value: string) =>\n slugify(value, {\n decamelize: false,\n lowercase: false,\n separator: '_',\n });\n\nconst getCommonPath = (...paths: string[]) => {\n const [segments, ...otherSegments] = paths.map((it) => _.split(it, '/'));\n return _.join(\n _.takeWhile(segments, (str, index) => otherSegments.every((it) => it[index] === str)),\n '/'\n );\n};\n\nconst isEqual = (a: unknown, b: unknown) => String(a) === String(b);\nconst isCamelCase = (value: string) => /^[a-z][a-zA-Z0-9]+$/.test(value);\nconst isKebabCase = (value: string) => /^([a-z][a-z0-9]*)(-[a-z0-9]+)*$/.test(value);\nconst startsWithANumber = (value: string) => /^[0-9]/.test(value);\n\nconst joinBy = (joint: string, ...args: string[]) => {\n const trim = trimChars(joint);\n const trimEnd = trimCharsEnd(joint);\n const trimStart = trimCharsStart(joint);\n\n return args.reduce((url, path, index) => {\n if (args.length === 1) return path;\n if (index === 0) return trimEnd(path);\n if (index === args.length - 1) return url + joint + trimStart(path);\n return url + joint + trim(path);\n }, '');\n};\n\nconst toKebabCase = (value: string) => kebabCase(value);\n\nexport {\n nameToSlug,\n nameToCollectionName,\n getCommonPath,\n isEqual,\n isCamelCase,\n isKebabCase,\n toKebabCase,\n toRegressedEnumValue,\n startsWithANumber,\n joinBy,\n};\n","const castIncludes = (arr: unknown[], val: unknown, cast: (val: unknown) => unknown): boolean =>\n arr.map((val) => cast(val)).includes(cast(val));\n\nconst includesString = (arr: unknown[], val: unknown) => castIncludes(arr, val, String);\n\nexport { includesString };\n","import _ from 'lodash';\n\nconst keysDeep = (obj: object, path: string[] = []): string[] =>\n !_.isObject(obj)\n ? [path.join('.')]\n : _.reduce(\n obj,\n (acc, next, key) => _.concat(acc, keysDeep(next, [...path, key])),\n [] as string[]\n );\n\nexport { keysDeep };\n","// Using timestamp (milliseconds) to be sure it is unique\n// + converting timestamp to base 36 for better readibility\nconst timestampCode = (date?: Date) => {\n const referDate = date ?? new Date();\n\n return referDate.getTime().toString(36);\n};\n\nexport { timestampCode };\n","// Code copied from the yup library (https://github.com/jquense/yup)\n// https://github.com/jquense/yup/blob/2778b88bdacd5260d593c6468793da2e77daf21f/src/util/printValue.ts\n\nconst { toString } = Object.prototype;\nconst errorToString = Error.prototype.toString;\nconst regExpToString = RegExp.prototype.toString;\nconst symbolToString = typeof Symbol !== 'undefined' ? Symbol.prototype.toString : () => '';\n\nconst SYMBOL_REGEXP = /^Symbol\\((.*)\\)(.*)$/;\n\nfunction printNumber(val: number) {\n // eslint-disable-next-line eqeqeq\n if (val != +val) return 'NaN';\n const isNegativeZero = val === 0 && 1 / val < 0;\n return isNegativeZero ? '-0' : `${val}`;\n}\n\nfunction printSimpleValue(val: unknown, quoteStrings = false) {\n if (val == null || val === true || val === false) return `${val}`;\n\n if (typeof val === 'number') return printNumber(val);\n if (typeof val === 'string') return quoteStrings ? `\"${val}\"` : val;\n if (typeof val === 'function') return `[Function ${val.name || 'anonymous'}]`;\n if (typeof val === 'symbol') return symbolToString.call(val).replace(SYMBOL_REGEXP, 'Symbol($1)');\n\n const tag = toString.call(val).slice(8, -1);\n\n if (tag === 'Date') {\n const v = val as Date;\n return Number.isNaN(v.getTime()) ? `${v}` : v.toISOString();\n }\n if (tag === 'Error' || val instanceof Error) return `[${errorToString.call(val)}]`;\n if (tag === 'RegExp') return regExpToString.call(val);\n\n return null;\n}\n\nfunction printValue(value: unknown, quoteStrings: boolean) {\n const result = printSimpleValue(value, quoteStrings);\n if (result !== null) return result;\n\n return JSON.stringify(\n value,\n function replacer(key, value) {\n const result = printSimpleValue(this[key], quoteStrings);\n if (result !== null) return result;\n return value;\n },\n 2\n );\n}\n\nexport { printValue };\n","/* eslint-disable no-template-curly-in-string */\n/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport * as yup from 'yup';\nimport _ from 'lodash';\nimport { isNumber, isInteger, get } from 'lodash/fp';\nimport { strings } from './primitives';\nimport { printValue } from './print-value';\n\nexport * from 'yup';\n\nexport const strapiID = (): InstanceType<typeof StrapiIDSchema> => new StrapiIDSchema();\n\nconst isNotNilTest = (value: unknown) => !_.isNil(value);\n\nconst isNotNullTest = (value: unknown) => !_.isNull(value);\n\nyup.addMethod(yup.mixed, 'notNil', function isNotNill(msg = '${path} must be defined.') {\n return this.test('defined', msg, isNotNilTest);\n});\n\nyup.addMethod(yup.mixed, 'notNull', function isNotNull(msg = '${path} cannot be null.') {\n return this.test('defined', msg, isNotNullTest);\n});\n\nyup.addMethod(yup.mixed, 'isFunction', function isFunction(message = '${path} is not a function') {\n return this.test(\n 'is a function',\n message,\n (value) => _.isUndefined(value) || _.isFunction(value)\n );\n});\n\nyup.addMethod(\n yup.string,\n 'isCamelCase',\n function isCamelCase(message = '${path} is not in camel case (anExampleOfCamelCase)') {\n return this.test('is in camelCase', message, (value) =>\n value ? strings.isCamelCase(value) : true\n );\n }\n);\n\nyup.addMethod(\n yup.string,\n 'isKebabCase',\n function isKebabCase(message = '${path} is not in kebab case (an-example-of-kebab-case)') {\n return this.test('is in kebab-case', message, (value) =>\n value ? strings.isKebabCase(value) : true\n );\n }\n);\n\nyup.addMethod(\n yup.object,\n 'onlyContainsFunctions',\n function onlyContainsFunctions(message = '${path} contains values that are not functions') {\n return this.test(\n 'only contains functions',\n message,\n (value) => _.isUndefined(value) || (value && Object.values(value).every(_.isFunction))\n );\n }\n);\n\nyup.addMethod(\n yup.array,\n 'uniqueProperty',\n function uniqueProperty(propertyName: string, message: string) {\n return this.test('unique', message, function unique(list) {\n const errors: yup.ValidationError[] = [];\n\n list?.forEach((element, index) => {\n const sameElements = list.filter(\n (e) => get(propertyName, e) === get(propertyName, element)\n );\n if (sameElements.length > 1) {\n errors.push(\n this.createError({\n path: `${this.path}[${index}].${propertyName}`,\n message,\n })\n );\n }\n });\n\n if (errors.length) {\n throw new yup.ValidationError(errors);\n }\n return true;\n });\n }\n);\n\nexport class StrapiIDSchema extends yup.MixedSchema {\n constructor() {\n super({ type: 'strapiID' });\n }\n\n _typeCheck(value: unknown): value is string | number {\n return typeof value === 'string' || (isNumber(value) && isInteger(value) && value >= 0);\n }\n}\n\ndeclare module 'yup' {\n // const strapiID: () => InstanceType<typeof StrapiIDSchema>;\n\n export interface BaseSchema {\n isFunction(message?: string): this;\n notNil(message?: string): this;\n notNull(message?: string): this;\n }\n\n export interface StringSchema {\n isCamelCase(message?: string): this;\n isKebabCase(message?: string): this;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n export interface ObjectSchema<TShape> {\n onlyContainsFunctions(message?: string): this;\n }\n}\n\ninterface NoTypeOptions {\n path: string;\n type: string;\n value: unknown;\n originalValue: unknown;\n}\n\n// Temporary fix of this issue : https://github.com/jquense/yup/issues/616\nyup.setLocale({\n mixed: {\n notType(options: NoTypeOptions) {\n const { path, type, value, originalValue } = options;\n const isCast = originalValue != null && originalValue !== value;\n const msg =\n `${path} must be a \\`${type}\\` type, ` +\n `but the final value was: \\`${printValue(value, true)}\\`${\n isCast ? ` (cast from the value \\`${printValue(originalValue, true)}\\`).` : '.'\n }`;\n\n /* Remove comment that is not supposed to be seen by the enduser\n if (value === null) {\n msg += `\\n If \"null\" is intended as an empty value be sure to mark the schema as \\`.nullable()\\``;\n }\n */\n return msg;\n },\n },\n});\n","import { z } from 'zod';\n\nimport { ValidationError } from './errors';\n\nexport const validateZod =\n <T extends z.ZodTypeAny>(schema: T) =>\n (data: unknown): z.TypeOf<T> => {\n try {\n return schema.parse(data);\n } catch (error) {\n if (error instanceof z.ZodError) {\n const { message, errors } = formatZodErrors(error);\n throw new ValidationError(message, { errors });\n }\n\n throw error;\n }\n };\n\nconst formatZodErrors = (zodError: z.ZodError) => ({\n errors: zodError.errors.map((error) => {\n return {\n path: error.path,\n message: error.message,\n name: 'ValidationError',\n };\n }),\n message: 'Validation error',\n});\n"],"names":["dates","_","ID_ATTRIBUTE","DOC_ID_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","constants","contentTypes.constants","visitor","path","schema","i","errors","yup","isStringArray","populate","value","key","acc","sort","filters","fields","remove","ACTIONS_TO_VERIFY","contentTypeUtils.constants","hasAccessToSomeScopes","contentTypeUtils.isMorphToRelationalAttribute","getContainedPaths","index","parser","utils","isObj","pipe","map","newValue","first","traverseEntity","removePassword","removePrivate","pipeAsync","removeDynamicZones","removeMorphToRelations","expandWildcardPopulate","visitors.removeRestrictedFields","visitors.removeRestrictedRelations","data","sanitizers.defaultSanitizeOutput","sanitizers.defaultSanitizeFilters","sanitizers.defaultSanitizeSort","sanitizers.defaultSanitizeFields","sanitizers.defaultSanitizePopulate","throwDynamicZones","throwMorphToRelations","throwPassword","throwPrivate","visitors.throwRestrictedFields","visitors.throwUnrecognizedFields","visitors.throwRestrictedRelations","validateFilters","validateSort","validateFields","validatePopulate","validators.defaultValidateFilters","validators.defaultValidateSort","validators.defaultValidateFields","validators.defaultValidatePopulate","pagination","defaults","packageManager","trim","val","result","isCamelCase","strings.isCamelCase","isKebabCase","strings.isKebabCase"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/parse-type.ts","../src/env-helper.ts","../src/content-types.ts","../src/set-creator-fields.ts","../src/hooks.ts","../src/provider-factory.ts","../src/traverse-entity.ts","../src/import-default.ts","../src/machine-id.ts","../src/format-yup-error.ts","../src/errors.ts","../src/validators.ts","../src/operators.ts","../src/convert-query-params.ts","../src/async.ts","../src/sanitize/visitors/remove-password.ts","../src/sanitize/visitors/remove-private.ts","../src/relations.ts","../src/sanitize/visitors/remove-restricted-relations.ts","../src/sanitize/visitors/remove-morph-to-relations.ts","../src/sanitize/visitors/remove-dynamic-zones.ts","../src/sanitize/visitors/remove-disallowed-fields.ts","../src/sanitize/visitors/remove-restricted-fields.ts","../src/sanitize/visitors/expand-wildcard-populate.ts","../src/traverse/factory.ts","../src/traverse/query-filters.ts","../src/traverse/query-sort.ts","../src/traverse/query-populate.ts","../src/traverse/query-fields.ts","../src/sanitize/sanitizers.ts","../src/sanitize/index.ts","../src/validate/utils.ts","../src/validate/visitors/throw-password.ts","../src/validate/visitors/throw-private.ts","../src/validate/visitors/throw-restricted-relations.ts","../src/validate/visitors/throw-morph-to-relations.ts","../src/validate/visitors/throw-dynamic-zones.ts","../src/validate/visitors/throw-disallowed-fields.ts","../src/validate/visitors/throw-restricted-fields.ts","../src/validate/visitors/throw-unrecognized-fields.ts","../src/validate/validators.ts","../src/validate/index.ts","../src/pagination.ts","../src/package-manager.ts","../src/template.ts","../src/file.ts","../src/policy.ts","../src/primitives/strings.ts","../src/primitives/arrays.ts","../src/primitives/objects.ts","../src/primitives/dates.ts","../src/print-value.ts","../src/yup.ts","../src/zod.ts"],"sourcesContent":["import * as _ from 'lodash';\nimport * as dates from 'date-fns';\n\nconst timeRegex = /^(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]{1,3})?$/;\n\nconst isDate = (v: unknown): v is Date => {\n return dates.isDate(v);\n};\n\nconst parseTime = (value: unknown): string => {\n if (isDate(value)) {\n return dates.format(value, 'HH:mm:ss.SSS');\n }\n\n if (typeof value !== 'string') {\n throw new Error(`Expected a string, got a ${typeof value}`);\n }\n const result = value.match(timeRegex);\n\n if (result === null) {\n throw new Error('Invalid time format, expected HH:mm:ss.SSS');\n }\n\n const [, hours, minutes, seconds, fraction = '.000'] = result;\n const fractionPart = _.padEnd(fraction.slice(1), 3, '0');\n\n return `${hours}:${minutes}:${seconds}.${fractionPart}`;\n};\n\nconst parseDate = (value: unknown) => {\n if (isDate(value)) {\n return dates.format(value, 'yyyy-MM-dd');\n }\n\n if (typeof value !== 'string') {\n throw new Error(`Expected a string, got a ${typeof value}`);\n }\n\n try {\n const date = dates.parseISO(value);\n\n if (dates.isValid(date)) return dates.format(date, 'yyyy-MM-dd');\n\n throw new Error(`Invalid format, expected an ISO compatible date`);\n } catch (error) {\n throw new Error(`Invalid format, expected an ISO compatible date`);\n }\n};\n\nconst parseDateTimeOrTimestamp = (value: unknown) => {\n if (isDate(value)) {\n return value;\n }\n\n if (typeof value !== 'string') {\n throw new Error(`Expected a string, got a ${typeof value}`);\n }\n\n try {\n const date = dates.parseISO(value);\n if (dates.isValid(date)) return date;\n\n const milliUnixDate = dates.parse(value, 'T', new Date());\n if (dates.isValid(milliUnixDate)) return milliUnixDate;\n\n throw new Error(`Invalid format, expected a timestamp or an ISO date`);\n } catch (error) {\n throw new Error(`Invalid format, expected a timestamp or an ISO date`);\n }\n};\n\ntype TypeMap = {\n boolean: boolean;\n integer: number;\n biginteger: number;\n float: number;\n decimal: number;\n time: string;\n date: string;\n timestamp: Date;\n datetime: Date;\n};\n\nexport interface ParseTypeOptions<T extends keyof TypeMap> {\n type: T;\n value: unknown;\n forceCast?: boolean;\n}\n\nconst parseBoolean = (value: unknown, options: { forceCast?: boolean }): boolean => {\n const { forceCast = false } = options;\n\n if (typeof value === 'boolean') {\n return value;\n }\n\n if (typeof value === 'string' || typeof value === 'number') {\n if (['true', 't', '1', 1].includes(value)) {\n return true;\n }\n\n if (['false', 'f', '0', 0].includes(value)) {\n return false;\n }\n }\n\n if (forceCast) {\n return Boolean(value);\n }\n\n throw new Error('Invalid boolean input. Expected \"t\",\"1\",\"true\",\"false\",\"0\",\"f\"');\n};\n\n/**\n * Cast basic values based on attribute type\n */\nconst parseType = <Type extends keyof TypeMap>(options: ParseTypeOptions<Type>): TypeMap[Type] => {\n const { type, value, forceCast } = options;\n\n switch (type) {\n case 'boolean':\n return parseBoolean(value, { forceCast }) as TypeMap[Type];\n case 'integer':\n case 'biginteger':\n case 'float':\n case 'decimal': {\n return _.toNumber(value) as TypeMap[Type];\n }\n case 'time': {\n return parseTime(value) as TypeMap[Type];\n }\n case 'date': {\n return parseDate(value) as TypeMap[Type];\n }\n case 'timestamp':\n case 'datetime': {\n return parseDateTimeOrTimestamp(value) as TypeMap[Type];\n }\n default:\n return value as TypeMap[Type];\n }\n};\n\nexport default parseType;\n","import _ from 'lodash';\n\nexport type Env = typeof envFn & typeof utils;\n\nfunction envFn<T>(key: string, defaultValue?: T): string | T | undefined {\n return _.has(process.env, key) ? process.env[key] : defaultValue;\n}\n\nfunction getKey(key: string) {\n return process.env[key] ?? '';\n}\n\nconst utils = {\n int(key: string, defaultValue?: number): number | undefined {\n if (!_.has(process.env, key)) {\n return defaultValue;\n }\n\n return parseInt(getKey(key), 10);\n },\n\n float(key: string, defaultValue?: number): number | undefined {\n if (!_.has(process.env, key)) {\n return defaultValue;\n }\n\n return parseFloat(getKey(key));\n },\n\n bool(key: string, defaultValue?: boolean): boolean | undefined {\n if (!_.has(process.env, key)) {\n return defaultValue;\n }\n\n return getKey(key) === 'true';\n },\n\n json(key: string, defaultValue?: object) {\n if (!_.has(process.env, key)) {\n return defaultValue;\n }\n\n try {\n return JSON.parse(getKey(key));\n } catch (error) {\n if (error instanceof Error) {\n throw new Error(`Invalid json environment variable ${key}: ${error.message}`);\n }\n\n throw error;\n }\n },\n\n array(key: string, defaultValue?: string[]): string[] | undefined {\n if (!_.has(process.env, key)) {\n return defaultValue;\n }\n\n let value = getKey(key);\n\n if (value.startsWith('[') && value.endsWith(']')) {\n value = value.substring(1, value.length - 1);\n }\n\n return value.split(',').map((v) => {\n return _.trim(_.trim(v, ' '), '\"');\n });\n },\n\n date(key: string, defaultValue?: Date): Date | undefined {\n if (!_.has(process.env, key)) {\n return defaultValue;\n }\n\n return new Date(getKey(key));\n },\n\n /**\n * Gets a value from env that matches oneOf provided values\n * @param {string} key\n * @param {string[]} expectedValues\n * @param {string|undefined} defaultValue\n * @returns {string|undefined}\n */\n oneOf(key: string, expectedValues?: unknown[], defaultValue?: unknown) {\n if (!expectedValues) {\n throw new Error(`env.oneOf requires expectedValues`);\n }\n\n if (defaultValue && !expectedValues.includes(defaultValue)) {\n throw new Error(`env.oneOf requires defaultValue to be included in expectedValues`);\n }\n\n const rawValue = env(key, defaultValue);\n return expectedValues.includes(rawValue) ? rawValue : defaultValue;\n },\n};\n\nconst env: Env = Object.assign(envFn, utils);\n\nexport default env;\n","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 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 CREATED_BY_ATTRIBUTE,\n UPDATED_BY_ATTRIBUTE,\n CREATED_AT_ATTRIBUTE,\n UPDATED_AT_ATTRIBUTE,\n SINGLE_TYPE,\n COLLECTION_TYPE,\n};\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([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, ...getTimestamps(model), ...nonVisibleAttributes]);\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 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 ['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 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 getNonWritableAttributes,\n getComponentAttributes,\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 isSingleType,\n isCollectionType,\n isKind,\n getContentTypeRoutePrefix,\n getDoesAttributeRequireValidation,\n};\n","import { assign, assoc } from 'lodash/fp';\nimport * as contentTypes from './content-types';\n\nconst { CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE } = contentTypes.constants;\n\nexport interface Options {\n user: User;\n isEdition?: boolean;\n}\n\ninterface User {\n id: string | number;\n}\n\nconst setCreatorFields =\n <TData extends object>({ user, isEdition = false }: Options) =>\n <TDataInner extends object = TData>(data: TDataInner) => {\n if (isEdition) {\n return assoc(UPDATED_BY_ATTRIBUTE, user.id, data);\n }\n\n return assign(data, {\n [CREATED_BY_ATTRIBUTE]: user.id,\n [UPDATED_BY_ATTRIBUTE]: user.id,\n });\n };\n\nexport default setCreatorFields;\n","import { eq, remove, cloneDeep } from 'lodash/fp';\n\nexport type Handler = (...args: any[]) => any;\n\nexport interface Hook<T extends Handler = Handler> {\n getHandlers(): Handler[];\n register(handler: T): Hook<T>;\n delete(handler: T): Hook<T>;\n call(...args: any[]): void;\n}\n\nexport interface AsyncSeriesHook extends Hook {\n call(...args: any[]): Promise<void>;\n}\nexport interface AsyncSeriesWaterfallHook extends Hook {\n call(...args: any[]): Promise<any>;\n}\n\nexport interface AsyncParallelHook extends Hook {\n call(...args: any[]): Promise<any[]>;\n}\n\nexport interface AsyncBailHook extends Hook {\n call(...args: any[]): Promise<any>;\n}\n\n/**\n * Create a default Strapi hook\n */\nconst createHook = <T extends Handler = Handler>(): Hook<T> => {\n type State = {\n handlers: T[];\n };\n\n const state: State = {\n handlers: [],\n };\n\n return {\n getHandlers() {\n return state.handlers;\n },\n\n register(handler: T) {\n state.handlers.push(handler);\n\n return this;\n },\n\n delete(handler: T) {\n state.handlers = remove(eq(handler), state.handlers);\n\n return this;\n },\n\n call() {\n throw new Error('Method not implemented');\n },\n };\n};\n\n/**\n * Create an async series hook.\n * Upon execution, it will execute every handler in order with the same context\n */\nconst createAsyncSeriesHook = <T extends Handler = Handler>() => ({\n ...createHook<T>(),\n\n async call(context: unknown) {\n for (const handler of this.getHandlers()) {\n await handler(context);\n }\n },\n});\n\n/**\n * Create an async series waterfall hook.\n * Upon execution, it will execute every handler in order and pass the return value of the last handler to the next one\n */\nconst createAsyncSeriesWaterfallHook = <T extends Handler = Handler>() => ({\n ...createHook<T>(),\n\n async call(param: unknown) {\n let res = param;\n\n for (const handler of this.getHandlers()) {\n res = await handler(res);\n }\n\n return res;\n },\n});\n\n/**\n * Create an async parallel hook.\n * Upon execution, it will execute every registered handler in band.\n */\nconst createAsyncParallelHook = <T extends Handler = Handler>() => ({\n ...createHook<T>(),\n\n async call(context: unknown) {\n const promises = this.getHandlers().map((handler) => handler(cloneDeep(context)));\n\n return Promise.all(promises);\n },\n});\n\n/**\n * Create an async parallel hook.\n * Upon execution, it will execute every registered handler in serie and return the first result found.\n */\nconst createAsyncBailHook = <T extends Handler = Handler>() => ({\n ...createHook<T>(),\n\n async call(context: unknown) {\n for (const handler of this.getHandlers()) {\n const result = await handler(context);\n\n if (result !== undefined) {\n return result;\n }\n }\n },\n});\n\nexport const internals = {\n // Internal utils\n createHook,\n};\n\nexport {\n createAsyncSeriesHook,\n createAsyncSeriesWaterfallHook,\n createAsyncParallelHook,\n createAsyncBailHook,\n};\n","import { cloneDeep } from 'lodash/fp';\nimport {\n createAsyncSeriesHook,\n createAsyncParallelHook,\n AsyncSeriesHook,\n AsyncParallelHook,\n} from './hooks';\n\nexport interface ProviderHooksMap {\n willRegister: AsyncSeriesHook;\n didRegister: AsyncParallelHook;\n willDelete: AsyncParallelHook;\n didDelete: AsyncParallelHook;\n}\n\n/**\n * Creates a new object containing various hooks used by the providers\n */\nconst createProviderHooksMap = (): ProviderHooksMap => ({\n // Register events\n willRegister: createAsyncSeriesHook(),\n didRegister: createAsyncParallelHook(),\n // Delete events\n willDelete: createAsyncParallelHook(),\n didDelete: createAsyncParallelHook(),\n});\n\nexport interface Options {\n throwOnDuplicates?: boolean;\n}\n\ntype Item = Record<string, unknown>;\n\nexport interface Provider<T = unknown> {\n hooks: ProviderHooksMap;\n register(key: string, item: T): Promise<Provider>;\n delete(key: string): Promise<Provider>;\n get(key: string): T | undefined;\n values(): T[];\n keys(): string[];\n has(key: string): boolean;\n size(): number;\n clear(): Promise<Provider<T>>;\n}\n\nexport type ProviderFactory<T> = (options?: Options) => Provider<T>;\n\n/**\n * A Provider factory\n */\nconst providerFactory = <T = Item>(options: Options = {}): Provider<T> => {\n const { throwOnDuplicates = true } = options;\n\n const state = {\n hooks: createProviderHooksMap(),\n registry: new Map<string, T>(),\n };\n\n return {\n hooks: state.hooks,\n\n async register(key: string, item: T) {\n if (throwOnDuplicates && this.has(key)) {\n throw new Error(`Duplicated item key: ${key}`);\n }\n\n await state.hooks.willRegister.call({ key, value: item });\n\n state.registry.set(key, item);\n\n await state.hooks.didRegister.call({ key, value: cloneDeep(item) });\n\n return this;\n },\n\n async delete(key: string) {\n if (this.has(key)) {\n const item = this.get(key);\n\n await state.hooks.willDelete.call({ key, value: cloneDeep(item) });\n\n state.registry.delete(key);\n\n await state.hooks.didDelete.call({ key, value: cloneDeep(item) });\n }\n\n return this;\n },\n\n get(key: string) {\n return state.registry.get(key);\n },\n\n values() {\n return Array.from(state.registry.values());\n },\n\n keys() {\n return Array.from(state.registry.keys());\n },\n\n has(key: string) {\n return state.registry.has(key);\n },\n\n size() {\n return state.registry.size;\n },\n\n async clear() {\n const keys = this.keys();\n\n for (const key of keys) {\n await this.delete(key);\n }\n\n return this;\n },\n };\n};\n\nexport default providerFactory;\n","import { clone, isObject, isArray, isNil, curry } from 'lodash/fp';\n\nimport type { Attribute, AnyAttribute, Model, Data } from './types';\nimport { isRelationalAttribute, isMediaAttribute } from './content-types';\n\nexport type VisitorUtils = ReturnType<typeof createVisitorUtils>;\n\nexport interface VisitorOptions {\n data: Record<string, unknown>;\n schema: Model;\n key: string;\n value: Data[keyof Data];\n attribute?: AnyAttribute;\n path: Path;\n getModel(uid: string): Model;\n parent?: Parent;\n}\n\nexport type Visitor = (visitorOptions: VisitorOptions, visitorUtils: VisitorUtils) => void;\n\nexport interface Path {\n raw: string | null;\n attribute: string | null;\n}\n\nexport interface TraverseOptions {\n schema: Model;\n path?: Path;\n parent?: Parent;\n getModel(uid: string): Model;\n}\n\nexport interface Parent {\n attribute?: Attribute;\n key: string | null;\n path: Path;\n schema: Model;\n}\n\nconst traverseEntity = async (visitor: Visitor, options: TraverseOptions, entity: Data) => {\n const { path = { raw: null, attribute: null }, schema, getModel } = options;\n\n let parent = options.parent;\n\n const traverseMorphRelationTarget = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchema = getModel(entry.__type!);\n\n const traverseOptions: TraverseOptions = { schema: targetSchema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseRelationTarget =\n (schema: Model) => async (visitor: Visitor, path: Path, entry: Data) => {\n const traverseOptions: TraverseOptions = { schema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseMediaTarget = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchemaUID = 'plugin::upload.file';\n const targetSchema = getModel(targetSchemaUID);\n\n const traverseOptions: TraverseOptions = { schema: targetSchema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const traverseComponent = async (visitor: Visitor, path: Path, schema: Model, entry: Data) => {\n const traverseOptions: TraverseOptions = { schema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n const visitDynamicZoneEntry = async (visitor: Visitor, path: Path, entry: Data) => {\n const targetSchema = getModel(entry.__component!);\n const traverseOptions: TraverseOptions = { schema: targetSchema, path, getModel, parent };\n\n return traverseEntity(visitor, traverseOptions, entry);\n };\n\n // End recursion\n if (!isObject(entity) || isNil(schema)) {\n return entity;\n }\n\n // Don't mutate the original entity object\n // only clone at 1st level as the next level will get clone when traversed\n const copy = clone(entity);\n const visitorUtils = createVisitorUtils({ data: copy });\n\n const keys = Object.keys(copy);\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n // Retrieve the attribute definition associated to the key from the schema\n const attribute = schema.attributes[key] as AnyAttribute | undefined;\n\n const newPath = { ...path };\n\n newPath.raw = isNil(path.raw) ? key : `${path.raw}.${key}`;\n\n if (!isNil(attribute)) {\n newPath.attribute = isNil(path.attribute) ? key : `${path.attribute}.${key}`;\n }\n\n // Visit the current attribute\n const visitorOptions: VisitorOptions = {\n data: copy,\n schema,\n key,\n value: copy[key],\n attribute,\n path: newPath,\n getModel,\n parent,\n };\n\n await visitor(visitorOptions, visitorUtils);\n\n // Extract the value for the current key (after calling the visitor)\n const value = copy[key];\n\n // Ignore Nil values or attributes\n if (isNil(value) || isNil(attribute)) {\n continue;\n }\n\n // The current attribute becomes the parent once visited\n parent = { schema, key, attribute, path: newPath };\n\n if (isRelationalAttribute(attribute)) {\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n\n const method = isMorphRelation\n ? traverseMorphRelationTarget\n : traverseRelationTarget(getModel(attribute.target!));\n\n if (isArray(value)) {\n const res = new Array(value.length);\n for (let i = 0; i < value.length; i += 1) {\n res[i] = await method(visitor, newPath, value[i]);\n }\n copy[key] = res;\n } else {\n copy[key] = await method(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (isMediaAttribute(attribute)) {\n // need to update copy\n if (isArray(value)) {\n const res = new Array(value.length);\n for (let i = 0; i < value.length; i += 1) {\n res[i] = await traverseMediaTarget(visitor, newPath, value[i]);\n }\n copy[key] = res;\n } else {\n copy[key] = await traverseMediaTarget(visitor, newPath, value as Data);\n }\n\n continue;\n }\n\n if (attribute.type === 'component') {\n const targetSchema = getModel(attribute.component);\n\n if (isArray(value)) {\n const res: Data[] = new Array(value.length);\n for (let i = 0; i < value.length; i += 1) {\n res[i] = await traverseComponent(visitor, newPath, targetSchema, value[i]);\n }\n copy[key] = res;\n } else {\n copy[key] = await traverseComponent(visitor, newPath, targetSchema, value as Data);\n }\n\n continue;\n }\n\n if (attribute.type === 'dynamiczone' && isArray(value)) {\n const res = new Array(value.length);\n for (let i = 0; i < value.length; i += 1) {\n res[i] = await visitDynamicZoneEntry(visitor, newPath, value[i]);\n }\n copy[key] = res;\n\n continue;\n }\n }\n\n return copy;\n};\n\nconst createVisitorUtils = ({ data }: { data: Data }) => ({\n remove(key: string) {\n delete data[key];\n },\n\n set(key: string, value: Data) {\n data[key] = value;\n },\n});\n\nexport default curry(traverseEntity);\n","/* eslint-disable @typescript-eslint/no-var-requires */\n\nexport default function importDefault(modName: string) {\n const mod = require(modName);\n return mod && mod.__esModule ? mod.default : mod;\n}\n","import { randomUUID } from 'crypto';\nimport { machineIdSync } from 'node-machine-id';\n\nexport default () => {\n try {\n const deviceId = machineIdSync();\n return deviceId;\n } catch (error) {\n const deviceId = randomUUID();\n return deviceId;\n }\n};\n","import { isEmpty, toPath } from 'lodash/fp';\nimport { ValidationError } from 'yup';\n\nconst formatYupInnerError = (yupError: ValidationError) => ({\n path: toPath(yupError.path),\n message: yupError.message,\n name: yupError.name,\n});\n\nconst formatYupErrors = (yupError: ValidationError) => ({\n errors: isEmpty(yupError.inner)\n ? [formatYupInnerError(yupError)]\n : yupError.inner.map(formatYupInnerError),\n message: yupError.message,\n});\n\nexport { formatYupErrors };\n","/* eslint-disable max-classes-per-file */\n\nimport yup from 'yup';\nimport { HttpError } from 'http-errors';\nimport { formatYupErrors } from './format-yup-error';\n\n/* ApplicationError */\nclass ApplicationError<\n TName extends string = 'ApplicationError',\n TMessage extends string = string,\n TDetails = unknown,\n> extends Error {\n name: TName;\n\n details: TDetails;\n\n message: TMessage;\n\n constructor(\n message = 'An application error occured' as TMessage,\n details: TDetails = {} as TDetails\n ) {\n super();\n this.name = 'ApplicationError' as TName;\n this.message = message;\n this.details = details;\n }\n}\n\nclass ValidationError<\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<'ValidationError', TMessage, TDetails> {\n constructor(message: TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'ValidationError';\n }\n}\n\ninterface YupFormattedError {\n path: string[];\n message: string;\n name: string;\n}\n\nclass YupValidationError<TMessage extends string = string> extends ValidationError<\n TMessage,\n { errors: YupFormattedError[] }\n> {\n constructor(yupError: yup.ValidationError, message?: TMessage) {\n super('Validation' as TMessage);\n const { errors, message: yupMessage } = formatYupErrors(yupError);\n this.message = message || (yupMessage as TMessage);\n this.details = { errors };\n }\n}\n\nclass PaginationError<\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<'PaginationError', TMessage, TDetails> {\n constructor(message = 'Invalid pagination' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'PaginationError';\n this.message = message;\n }\n}\n\nclass NotFoundError<TMessage extends string = string, TDetails = unknown> extends ApplicationError<\n 'NotFoundError',\n TMessage,\n TDetails\n> {\n constructor(message = 'Entity not found' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'NotFoundError';\n this.message = message;\n }\n}\n\nclass ForbiddenError<\n TName extends string = 'ForbiddenError',\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<TName, TMessage, TDetails> {\n constructor(message = 'Forbidden access' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'ForbiddenError' as TName;\n this.message = message;\n }\n}\n\nclass UnauthorizedError<\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<'UnauthorizedError', TMessage, TDetails> {\n constructor(message = 'Unauthorized' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'UnauthorizedError';\n this.message = message;\n }\n}\n\nclass RateLimitError<TMessage extends string = string, TDetails = unknown> extends ApplicationError<\n 'RateLimitError',\n TMessage,\n TDetails\n> {\n constructor(\n message = 'Too many requests, please try again later.' as TMessage,\n details?: TDetails\n ) {\n super(message, details);\n this.name = 'RateLimitError';\n this.message = message;\n this.details = details || ({} as TDetails);\n }\n}\n\nclass PayloadTooLargeError<\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<'PayloadTooLargeError', TMessage, TDetails> {\n constructor(message = 'Entity too large' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'PayloadTooLargeError';\n this.message = message;\n }\n}\n\nclass PolicyError<TMessage extends string = string, TDetails = unknown> extends ForbiddenError<\n 'PolicyError',\n TMessage,\n TDetails\n> {\n constructor(message = 'Policy Failed' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'PolicyError';\n this.message = message;\n this.details = details || ({} as TDetails);\n }\n}\n\nclass NotImplementedError<\n TMessage extends string = string,\n TDetails = unknown,\n> extends ApplicationError<'NotImplementedError', TMessage, TDetails> {\n constructor(message = 'This feature is not implemented yet' as TMessage, details?: TDetails) {\n super(message, details);\n this.name = 'NotImplementedError';\n this.message = message;\n }\n}\n\nexport {\n HttpError,\n ApplicationError,\n ValidationError,\n YupValidationError,\n PaginationError,\n NotFoundError,\n ForbiddenError,\n UnauthorizedError,\n RateLimitError,\n PayloadTooLargeError,\n PolicyError,\n NotImplementedError,\n};\n","/* eslint-disable @typescript-eslint/ban-ts-comment */\n/* eslint-disable no-template-curly-in-string */\nimport * as yup from 'yup';\nimport { defaults } from 'lodash/fp';\nimport { YupValidationError } from './errors';\n\nconst handleYupError = (error: yup.ValidationError, errorMessage?: string) => {\n throw new YupValidationError(error, errorMessage);\n};\n\nconst defaultValidationParam = { strict: true, abortEarly: false };\n\nconst validateYupSchema =\n <TSchema extends yup.AnySchema>(schema: TSchema, options = {}) =>\n async (body: unknown, errorMessage?: string): Promise<yup.InferType<TSchema>> => {\n try {\n const optionsWithDefaults = defaults(defaultValidationParam, options);\n const result = await schema.validate(body, optionsWithDefaults);\n return result;\n } catch (e) {\n if (e instanceof yup.ValidationError) {\n handleYupError(e, errorMessage);\n }\n\n throw e;\n }\n };\n\nconst validateYupSchemaSync =\n <TSchema extends yup.AnySchema>(schema: yup.AnySchema, options = {}) =>\n (body: unknown, errorMessage?: string): yup.InferType<TSchema> => {\n try {\n const optionsWithDefaults = defaults(defaultValidationParam, options);\n return schema.validateSync(body, optionsWithDefaults);\n } catch (e) {\n if (e instanceof yup.ValidationError) {\n handleYupError(e, errorMessage);\n }\n\n throw e;\n }\n };\n\nexport { handleYupError, validateYupSchema, validateYupSchemaSync };\n","const GROUP_OPERATORS = ['$and', '$or'];\n\nconst WHERE_OPERATORS = [\n '$not',\n '$in',\n '$notIn',\n '$eq',\n '$eqi',\n '$ne',\n '$nei',\n '$gt',\n '$gte',\n '$lt',\n '$lte',\n '$null',\n '$notNull',\n '$between',\n '$startsWith',\n '$endsWith',\n '$startsWithi',\n '$endsWithi',\n '$contains',\n '$notContains',\n '$containsi',\n '$notContainsi',\n // Experimental, only for internal use\n '$jsonSupersetOf',\n];\n\nconst CAST_OPERATORS = [\n '$not',\n '$in',\n '$notIn',\n '$eq',\n '$ne',\n '$gt',\n '$gte',\n '$lt',\n '$lte',\n '$between',\n];\n\nconst ARRAY_OPERATORS = ['$in', '$notIn', '$between'];\n\nconst OPERATORS = {\n where: WHERE_OPERATORS,\n cast: CAST_OPERATORS,\n group: GROUP_OPERATORS,\n array: ARRAY_OPERATORS,\n};\n\n// for performance, cache all operators in lowercase\nconst OPERATORS_LOWERCASE = Object.fromEntries(\n Object.entries(OPERATORS).map(([key, values]) => [\n key,\n values.map((value) => value.toLowerCase()),\n ])\n);\n\nconst isObjKey = <T extends object>(key: string | symbol | number, obj: T): key is keyof T => {\n return key in obj;\n};\n\nexport const isOperatorOfType = (type: string, key: string, ignoreCase = false) => {\n if (ignoreCase) {\n return OPERATORS_LOWERCASE[type]?.includes(key.toLowerCase()) ?? false;\n }\n\n if (isObjKey(type, OPERATORS)) {\n return OPERATORS[type]?.includes(key) ?? false;\n }\n\n return false;\n};\n\nexport const isOperator = (key: string, ignoreCase = false) => {\n return Object.keys(OPERATORS).some((type) => isOperatorOfType(type, key, ignoreCase));\n};\n","/* 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 } from './errors';\nimport { isOperator } from './operators';\n\nimport parseType from './parse-type';\nimport { Model } from './types';\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\nexport interface SortParamsObject {\n [key: string]: SortOrder | SortParamsObject;\n}\n\ntype SortParams = string | string[] | SortParamsObject | SortParamsObject[];\ntype FieldsParams = string | string[];\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}\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 Error {\n constructor() {\n super();\n this.message = 'Invalid order. order can only be one of asc|desc|ASC|DESC';\n }\n}\n\nclass InvalidSortError extends Error {\n constructor() {\n super();\n this.message =\n 'Invalid sort parameter. Expected a string, an array of strings, a sort object or an array of sort objects';\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 isPlainObject = (value: unknown): value is Record<string, unknown> => _.isPlainObject(value);\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 sortQuery.split(',').map((value) => convertSingleSortQueryParam(value));\n };\n\n const convertSingleSortQueryParam = (sortQuery: string): SortMap => {\n if (!sortQuery) {\n return {};\n }\n\n if (!isString(sortQuery)) {\n throw new Error('Invalid sort query');\n }\n\n // split field and order param with default order to ascending\n const [field, order = 'asc'] = sortQuery.split(':');\n\n if (field.length === 0) {\n throw new Error('Field cannot be empty');\n }\n\n validateOrder(order);\n\n // TODO: field should be a valid path on an object model\n\n return _.set({}, field, order);\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 transformedSort[field] = convertNestedSortQueryParam(order);\n } else if (typeof order === 'string') {\n validateOrder(order);\n transformedSort[field] = order;\n } else {\n throw Error(`Invalid sort type expected object or string got ${typeof order}`);\n }\n }\n\n return transformedSort;\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 Error(`convertStartQueryParams expected a positive integer got ${startAsANumber}`);\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 Error(`convertLimitQueryParams expected a positive integer got ${limitAsANumber}`);\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 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: ${page}`\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. You cannot use page and offset pagination in the same query'\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 Error(\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 ('populate' in subPopulate && subPopulate.populate !== '*') {\n throw new Error(\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) {\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 Error(`Using fragments is not permitted to populate \"${key}\" in \"${schema.uid}\"`);\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 Error(`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 if (sort) {\n query.orderBy = convertSortQueryParams(sort);\n }\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 Error('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 Error('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 { _q, sort, filters, fields, populate, page, pageSize, start, limit, status, ...rest } =\n params;\n\n if (!isNil(status)) {\n convertStatusParams(status, query);\n }\n\n if (!isNil(_q)) {\n query._q = _q;\n }\n\n if (!isNil(sort)) {\n query.orderBy = convertSortQueryParams(sort);\n }\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","import pMap from 'p-map';\nimport { curry } from 'lodash/fp';\n\ntype AnyFunc<TA extends any[] = any[], TR = any> = (...args: TA) => TR;\n\ntype MakeProm<T> = Promise<T extends PromiseLike<infer I> ? I : T>;\n\ntype PipedFunc<T extends AnyFunc[]> =\n PipeReturn<T> extends never ? never : (...args: Parameters<T[0]>) => PipeReturn<T>;\n\ntype PipeReturn<F extends AnyFunc[]> = MakeProm<ReturnType<F[0]>>;\n\nexport function pipe<T extends AnyFunc[]>(...fns: PipeReturn<T> extends never ? never : T) {\n const [firstFn, ...fnRest] = fns;\n\n return (async (...args: any[]) => {\n let res = await firstFn.apply(firstFn, args);\n\n for (let i = 0; i < fnRest.length; i += 1) {\n res = await fnRest[i](res);\n }\n\n return res;\n }) as PipedFunc<T>;\n}\n\nexport const map = curry(pMap);\n\nexport const reduce =\n (mixedArray: any[]) =>\n async <T>(iteratee: AnyFunc, initialValue?: T) => {\n let acc = initialValue;\n for (let i = 0; i < mixedArray.length; i += 1) {\n acc = await iteratee(acc, await mixedArray[i], i);\n }\n return acc;\n };\n","import type { Visitor } from '../../traverse/factory';\n\nconst visitor: Visitor = ({ key, attribute }, { remove }) => {\n if (attribute?.type === 'password') {\n remove(key);\n }\n};\n\nexport default visitor;\n","import { isPrivateAttribute } from '../../content-types';\nimport type { Visitor } from '../../traverse/factory';\n\nconst visitor: Visitor = ({ schema, key, attribute }, { remove }) => {\n if (!attribute) {\n return;\n }\n\n const isPrivate = attribute.private === true || isPrivateAttribute(schema, key);\n\n if (isPrivate) {\n remove(key);\n }\n};\n\nexport default visitor;\n","import { isBoolean } from 'lodash/fp';\nimport type { Attribute, Model } from './types';\n\nimport { isRelationalAttribute } from './content-types';\n\nconst MANY_RELATIONS = ['oneToMany', 'manyToMany'];\n\nexport const getRelationalFields = (contentType: Model) => {\n return Object.keys(contentType.attributes).filter((attributeName) => {\n return contentType.attributes[attributeName].type === 'relation';\n });\n};\n\nexport const isOneToAny = (attribute: Attribute) =>\n isRelationalAttribute(attribute) && ['oneToOne', 'oneToMany'].includes(attribute.relation);\n\nexport const isManyToAny = (attribute: Attribute) =>\n isRelationalAttribute(attribute) && ['manyToMany', 'manyToOne'].includes(attribute.relation);\n\nexport const isAnyToOne = (attribute: Attribute) =>\n isRelationalAttribute(attribute) && ['oneToOne', 'manyToOne'].includes(attribute.relation);\n\nexport const isAnyToMany = (attribute: Attribute) =>\n isRelationalAttribute(attribute) && ['oneToMany', 'manyToMany'].includes(attribute.relation);\n\nexport const isPolymorphic = (attribute: any): any =>\n ['morphOne', 'morphMany', 'morphToOne', 'morphToMany'].includes(attribute.relation);\n\nexport const constants = {\n MANY_RELATIONS,\n};\n\n// Valid keys in the `options` property of relations reordering\n// The value for each key must be a function that returns true if it is a valid value\nexport const VALID_RELATION_ORDERING_KEYS: { [key: string]: (value: any) => boolean } = {\n strict: isBoolean,\n};\n","import { isArray, isObject } from 'lodash/fp';\nimport * as contentTypeUtils from '../../content-types';\nimport type { Visitor } from '../../traverse/factory';\nimport { RelationOrderingOptions } from '../../types';\nimport { VALID_RELATION_ORDERING_KEYS } from '../../relations';\n\nconst ACTIONS_TO_VERIFY = ['find'];\nconst { CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE } = contentTypeUtils.constants;\n\ntype MorphArray = Array<{ __type: string }>;\n\nexport default (auth: unknown): Visitor =>\n async ({ data, key, attribute, schema }, { remove, set }) => {\n if (!attribute) {\n return;\n }\n\n const isRelation = attribute.type === 'relation';\n\n if (!isRelation) {\n return;\n }\n\n const handleMorphRelation = async () => {\n const elements: any = (data as Record<string, MorphArray>)[key];\n\n if ('connect' in elements || 'set' in elements || 'disconnect' in elements) {\n const newValue: Record<string, unknown> = {};\n\n const connect = await handleMorphElements(elements.connect || []);\n const relSet = await handleMorphElements(elements.set || []);\n const disconnect = await handleMorphElements(elements.disconnect || []);\n\n if (connect.length > 0) {\n newValue.connect = connect;\n }\n\n if (relSet.length > 0) {\n newValue.set = relSet;\n }\n\n if (disconnect.length > 0) {\n newValue.disconnect = disconnect;\n }\n\n // TODO: this should technically be in its own visitor to check morph options, but for now we'll handle it here\n if (\n 'options' in elements &&\n typeof elements.options === 'object' &&\n elements.options !== null\n ) {\n const filteredOptions: RelationOrderingOptions = {};\n\n // Iterate through the keys of elements.options\n Object.keys(elements.options).forEach((key) => {\n const validator = VALID_RELATION_ORDERING_KEYS[key as keyof RelationOrderingOptions];\n\n // Ensure the key exists in VALID_RELATION_ORDERING_KEYS and the validator is defined before calling it\n if (validator && validator(elements.options[key])) {\n filteredOptions[key as keyof RelationOrderingOptions] = elements.options[key];\n }\n });\n\n // Assign the filtered options back to newValue\n newValue.options = filteredOptions;\n } else {\n newValue.options = {};\n }\n\n set(key, newValue);\n } else {\n const newMorphValue = await handleMorphElements(elements);\n\n if (newMorphValue.length) {\n set(key, newMorphValue);\n }\n }\n };\n\n const handleMorphElements = async (elements: any[]) => {\n const allowedElements: Record<string, unknown>[] = [];\n\n if (!isArray(elements)) {\n return allowedElements;\n }\n\n for (const element of elements) {\n if (!isObject(element) || !('__type' in element)) {\n continue;\n }\n\n const scopes = ACTIONS_TO_VERIFY.map((action) => `${element.__type}.${action}`);\n const isAllowed = await hasAccessToSomeScopes(scopes, auth);\n\n if (isAllowed) {\n allowedElements.push(element);\n }\n }\n\n return allowedElements;\n };\n\n const handleRegularRelation = async () => {\n const scopes = ACTIONS_TO_VERIFY.map((action) => `${attribute.target}.${action}`);\n\n const isAllowed = await hasAccessToSomeScopes(scopes, auth);\n\n // If the authenticated user don't have access to any of the scopes, then remove the field\n if (!isAllowed) {\n remove(key);\n }\n };\n\n const isCreatorRelation = [CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE].includes(key);\n\n // Polymorphic relations\n if (contentTypeUtils.isMorphToRelationalAttribute(attribute)) {\n await handleMorphRelation();\n return;\n }\n\n // Creator relations\n if (isCreatorRelation && schema.options?.populateCreatorFields) {\n // do nothing\n return;\n }\n\n // Regular relations\n await handleRegularRelation();\n };\n\nconst hasAccessToSomeScopes = async (scopes: string[], auth: unknown) => {\n for (const scope of scopes) {\n try {\n await strapi.auth.verify(auth, { scope });\n return true;\n } catch {\n continue;\n }\n }\n\n return false;\n};\n","import { isMorphToRelationalAttribute } from '../../content-types';\nimport type { Visitor } from '../../traverse/factory';\n\nconst visitor: Visitor = ({ key, attribute }, { remove }) => {\n if (isMorphToRelationalAttribute(attribute)) {\n remove(key);\n }\n};\n\nexport default visitor;\n","import { isDynamicZoneAttribute } from '../../content-types';\nimport type { Visitor } from '../../traverse/factory';\n\nconst visitor: Visitor = ({ key, attribute }, { remove }) => {\n if (isDynamicZoneAttribute(attribute)) {\n remove(key);\n }\n};\n\nexport default visitor;\n","import { isArray, isNil, isString, toPath } from 'lodash/fp';\nimport type { Visitor } from '../../traverse/factory';\n\nexport default (allowedFields: string[] | null = null): Visitor =>\n ({ key, path: { attribute: path } }, { remove }) => {\n // All fields are allowed\n if (allowedFields === null) {\n return;\n }\n\n // Throw on invalid formats\n if (!(isArray(allowedFields) && allowedFields.every(isString))) {\n throw new TypeError(\n `Expected array of strings for allowedFields but got \"${typeof allowedFields}\"`\n );\n }\n\n if (isNil(path)) {\n return;\n }\n\n const containedPaths = getContainedPaths(path);\n\n /**\n * Tells if the current path should be kept or not based\n * on the success of the check functions for any of the allowed paths.\n *\n * The check functions are defined as follow:\n *\n * `containedPaths.includes(p)`\n * @example\n * ```js\n * const path = 'foo.bar.field';\n * const p = 'foo.bar';\n * // it should match\n *\n * const path = 'foo.bar.field';\n * const p = 'bar.foo';\n * // it shouldn't match\n *\n * const path = 'foo.bar';\n * const p = 'foo.bar.field';\n * // it should match but isn't handled by this check\n * ```\n *\n * `p.startsWith(`${path}.`)`\n * @example\n * ```js\n * const path = 'foo.bar';\n * const p = 'foo.bar.field';\n * // it should match\n *\n * const path = 'foo.bar.field';\n * const p = 'bar.foo';\n * // it shouldn't match\n *\n * const path = 'foo.bar.field';\n * const p = 'foo.bar';\n * // it should match but isn't handled by this check\n * ```\n */\n const isPathAllowed = allowedFields.some(\n (p) => containedPaths.includes(p) || p.startsWith(`${path}.`)\n );\n\n if (isPathAllowed) {\n return;\n }\n\n // Remove otherwise\n remove(key);\n };\n\n/**\n * Retrieve the list of allowed paths based on the given path\n *\n * @example\n * ```js\n * const containedPaths = getContainedPaths('foo');\n * // ['foo']\n *\n * * const containedPaths = getContainedPaths('foo.bar');\n * // ['foo', 'foo.bar']\n *\n * * const containedPaths = getContainedPaths('foo.bar.field');\n * // ['foo', 'foo.bar', 'foo.bar.field']\n * ```\n */\nconst getContainedPaths = (path: string) => {\n const parts = toPath(path);\n\n return parts.reduce((acc, value, index, list) => {\n return [...acc, list.slice(0, index + 1).join('.')];\n }, [] as string[]);\n};\n","import { isArray, isString } from 'lodash/fp';\nimport type { Visitor } from '../../traverse/factory';\n\nexport default (restrictedFields: string[] | null = null): Visitor =>\n ({ key, path: { attribute: path } }, { remove }) => {\n // Remove all fields\n if (restrictedFields === null) {\n remove(key);\n return;\n }\n\n // Throw on invalid formats\n if (!(isArray(restrictedFields) && restrictedFields.every(isString))) {\n throw new TypeError(\n `Expected array of strings for restrictedFields but got \"${typeof restrictedFields}\"`\n );\n }\n\n // Remove if an exact match was found\n if (restrictedFields.includes(path as string)) {\n remove(key);\n return;\n }\n\n // Remove nested matches\n const isRestrictedNested = restrictedFields.some((allowedPath) =>\n path?.toString().startsWith(`${allowedPath}.`)\n );\n if (isRestrictedNested) {\n remove(key);\n }\n };\n","import type { Visitor } from '../../traverse/factory';\n\nconst visitor: Visitor = ({ schema, key, value }, { set }) => {\n if (key === '' && value === '*') {\n const { attributes } = schema;\n\n const newPopulateQuery = Object.entries(attributes)\n .filter(([, attribute]) =>\n ['relation', 'component', 'media', 'dynamiczone'].includes(attribute.type)\n )\n .reduce<Record<string, true>>((acc, [key]) => ({ ...acc, [key]: true }), {});\n\n set('', newPopulateQuery);\n }\n};\n\nexport default visitor;\n","/* eslint-disable @typescript-eslint/no-loop-func */\nimport { isNil, pick } from 'lodash/fp';\n\nimport {\n AnyAttribute,\n Attribute,\n ComponentAttribute,\n DynamicZoneAttribute,\n Model,\n RelationalAttribute,\n} from '../types';\n\nexport interface Path {\n raw: string | null;\n attribute: string | null;\n}\n\nexport interface Parent {\n attribute?: Attribute;\n key: string | null;\n path: Path;\n schema: Model;\n}\n\nexport interface TraverseOptions {\n schema: Model;\n path?: Path;\n parent?: Parent;\n getModel(uid: string): Model;\n}\n\nexport interface VisitorOptions {\n data: unknown;\n value: unknown;\n schema: Model;\n key: string;\n attribute?: AnyAttribute;\n path: Path;\n parent?: Parent;\n getModel(uid: string): Model;\n}\n\nexport type Traverse = (\n visitor: Visitor,\n options: TraverseOptions,\n data: unknown\n) => Promise<unknown>;\n\nexport interface Visitor {\n (visitorOptions: VisitorOptions, opts: Pick<TransformUtils, 'set' | 'remove'>): void;\n}\n\ninterface Interceptor<T = unknown> {\n predicate(data: unknown): data is T;\n handler(\n visitor: Visitor,\n options: TraverseOptions,\n data: T,\n recurseOptions: { recurse: Traverse }\n ): void;\n}\n\ninterface ParseUtils<T> {\n transform(data: T): unknown;\n remove(key: string, data: T): unknown;\n set(key: string, value: unknown, data: T): unknown;\n keys(data: T): string[];\n get(key: string, data: T): unknown;\n}\n\ninterface Parser<T = unknown> {\n predicate(data: unknown): data is T;\n parser(data: T): ParseUtils<T>;\n}\n\ninterface Ignore {\n (ctx: Context): boolean;\n}\n\ninterface AttributeHandler<AttributeType = Attribute> {\n predicate(ctx: Context<AttributeType>): boolean;\n handler(ctx: Context<AttributeType>, opts: Pick<TransformUtils, 'set' | 'recurse'>): void;\n}\ninterface CommonHandler<AttributeType = Attribute> {\n predicate(ctx: Context<AttributeType>): boolean;\n handler(ctx: Context<AttributeType>, opts: Pick<TransformUtils, 'set' | 'recurse'>): void;\n}\n\nexport interface TransformUtils {\n remove(key: string): void;\n set(key: string, value: unknown): void;\n recurse: Traverse;\n}\n\ninterface Context<AttributeType = Attribute> {\n key: string;\n value: unknown;\n attribute: AttributeType;\n schema: Model;\n path: Path;\n data: unknown;\n visitor: Visitor;\n parent?: Parent;\n getModel(uid: string): Model;\n}\n\ninterface State {\n parsers: Parser[];\n interceptors: Interceptor[];\n ignore: Ignore[];\n handlers: {\n attributes: AttributeHandler[];\n common: CommonHandler[];\n };\n}\n\nconst DEFAULT_PATH = { raw: null, attribute: null } satisfies Path;\n\nexport default () => {\n const state: State = {\n parsers: [],\n interceptors: [],\n ignore: [],\n handlers: {\n attributes: [],\n common: [],\n },\n };\n\n const traverse: Traverse = async (visitor, options, data) => {\n const { path = DEFAULT_PATH, parent, schema, getModel } = options ?? {};\n\n // interceptors\n for (const { predicate, handler } of state.interceptors) {\n if (predicate(data)) {\n return handler(visitor, options, data, { recurse: traverse });\n }\n }\n\n // parsers\n const parser = state.parsers.find((parser) => parser.predicate(data))?.parser;\n const utils = parser?.(data);\n\n // Return the data untouched if we don't know how to traverse it\n if (!utils) {\n return data;\n }\n\n // main loop\n let out = utils.transform(data);\n const keys = utils.keys(out);\n\n for (const key of keys) {\n const attribute = schema?.attributes?.[key];\n\n const newPath = { ...path };\n\n newPath.raw = isNil(path.raw) ? key : `${path.raw}.${key}`;\n\n if (!isNil(attribute)) {\n newPath.attribute = isNil(path.attribute) ? key : `${path.attribute}.${key}`;\n }\n\n // visitors\n const visitorOptions: VisitorOptions = {\n key,\n value: utils.get(key, out),\n attribute,\n schema,\n path: newPath,\n data: out,\n getModel,\n parent,\n };\n\n const transformUtils: TransformUtils = {\n remove(key) {\n out = utils.remove(key, out);\n },\n set(key, value) {\n out = utils.set(key, value, out);\n },\n recurse: traverse,\n };\n\n await visitor(visitorOptions, pick(['remove', 'set'], transformUtils));\n\n const value = utils.get(key, out);\n\n const createContext = (): Context => ({\n key,\n value,\n attribute,\n schema,\n path: newPath,\n data: out,\n visitor,\n getModel,\n parent,\n });\n\n // ignore\n const ignoreCtx = createContext();\n const shouldIgnore = state.ignore.some((predicate) => predicate(ignoreCtx));\n\n if (shouldIgnore) {\n continue;\n }\n\n // handlers\n const handlers = [...state.handlers.common, ...state.handlers.attributes];\n\n for await (const handler of handlers) {\n const ctx = createContext();\n const pass = await handler.predicate(ctx);\n\n if (pass) {\n await handler.handler(ctx, pick(['recurse', 'set'], transformUtils));\n }\n }\n }\n\n return out;\n };\n\n return {\n traverse,\n\n intercept<T>(predicate: Interceptor<T>['predicate'], handler: Interceptor<T>['handler']) {\n state.interceptors.push({ predicate, handler });\n return this;\n },\n\n parse<T>(predicate: Parser<T>['predicate'], parser: Parser<T>['parser']) {\n state.parsers.push({ predicate, parser });\n return this;\n },\n\n ignore(predicate: Ignore) {\n state.ignore.push(predicate);\n return this;\n },\n\n on(predicate: CommonHandler['predicate'], handler: CommonHandler['handler']) {\n state.handlers.common.push({ predicate, handler });\n return this;\n },\n\n onAttribute(predicate: AttributeHandler['predicate'], handler: AttributeHandler['handler']) {\n state.handlers.attributes.push({ predicate, handler });\n return this;\n },\n\n onRelation(handler: AttributeHandler<RelationalAttribute>['handler']) {\n return this.onAttribute(({ attribute }) => attribute?.type === 'relation', handler);\n },\n\n onMedia(handler: AttributeHandler<RelationalAttribute>['handler']) {\n return this.onAttribute(({ attribute }) => attribute?.type === 'media', handler);\n },\n\n onComponent(handler: AttributeHandler<ComponentAttribute>['handler']) {\n return this.onAttribute(({ attribute }) => attribute?.type === 'component', handler);\n },\n\n onDynamicZone(handler: AttributeHandler<DynamicZoneAttribute>['handler']) {\n return this.onAttribute(({ attribute }) => attribute?.type === 'dynamiczone', handler);\n },\n };\n};\n","import { curry, isObject, isEmpty, isArray, isNil, cloneDeep, omit } from 'lodash/fp';\n\nimport traverseFactory, { type Parent } from './factory';\n\nconst isObj = (value: unknown): value is Record<string, unknown> => isObject(value);\n\nconst filters = traverseFactory()\n .intercept(\n // Intercept filters arrays and apply the traversal to each one individually\n isArray,\n async (visitor, options, filters, { recurse }) => {\n return Promise.all(\n filters.map((filter, i) => {\n // In filters, only operators such as $and, $in, $notIn or $or and implicit operators like [...]\n // can have a value array, thus we can update the raw path but not the attribute one\n const newPath = options.path\n ? { ...options.path, raw: `${options.path.raw}[${i}]` }\n : options.path;\n\n return recurse(visitor, { ...options, path: newPath }, filter);\n })\n // todo: move that to the visitors\n ).then((res) => res.filter((val) => !(isObject(val) && isEmpty(val))));\n }\n )\n .intercept(\n // Ignore non object filters and return the value as-is\n (filters): filters is unknown => !isObject(filters),\n (_, __, filters) => {\n return filters;\n }\n )\n // Parse object values\n .parse(isObj, () => ({\n transform: cloneDeep,\n\n remove(key, data) {\n return omit(key, data);\n },\n\n set(key, value, data) {\n return { ...data, [key]: value };\n },\n\n keys(data) {\n return Object.keys(data);\n },\n\n get(key, data) {\n return data[key];\n },\n }))\n // Ignore null or undefined values\n .ignore(({ value }) => isNil(value))\n // Recursion on operators (non attributes)\n .on(\n ({ attribute }) => isNil(attribute),\n async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n set(key, await recurse(visitor, { schema, path, getModel, parent }, value));\n }\n )\n // Handle relation recursion\n .onRelation(\n async ({ key, attribute, visitor, path, value, schema, getModel }, { set, recurse }) => {\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n\n if (isMorphRelation) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchemaUID = attribute.target;\n const targetSchema = getModel(targetSchemaUID!);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n )\n .onComponent(\n async ({ key, attribute, visitor, path, schema, value, getModel }, { set, recurse }) => {\n const parent: Parent = { key, path, schema, attribute };\n const targetSchema = getModel(attribute.component);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n )\n // Handle media recursion\n .onMedia(async ({ key, visitor, path, schema, attribute, value, getModel }, { set, recurse }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchemaUID = 'plugin::upload.file';\n const targetSchema = getModel(targetSchemaUID);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n });\n\nexport default curry(filters.traverse);\n","import {\n curry,\n isString,\n isObject,\n map,\n trim,\n split,\n isEmpty,\n flatten,\n pipe,\n isNil,\n first,\n cloneDeep,\n} from 'lodash/fp';\n\nimport traverseFactory, { type Parent } from './factory';\n\nconst ORDERS = { asc: 'asc', desc: 'desc' };\nconst ORDER_VALUES = Object.values(ORDERS);\n\nconst isSortOrder = (value: string) => ORDER_VALUES.includes(value.toLowerCase());\nconst isStringArray = (value: unknown): value is string[] =>\n Array.isArray(value) && value.every(isString);\nconst isObjectArray = (value: unknown): value is object[] =>\n Array.isArray(value) && value.every(isObject);\nconst isNestedSorts = (value: unknown): value is string =>\n isString(value) && value.split(',').length > 1;\n\nconst isObj = (value: unknown): value is Record<string, unknown> => isObject(value);\n\nconst sort = traverseFactory()\n .intercept(\n // String with chained sorts (foo,bar,foobar) => split, map(recurse), then recompose\n isNestedSorts,\n async (visitor, options, sort, { recurse }) => {\n return Promise.all(\n sort\n .split(',')\n .map(trim)\n .map((nestedSort) => recurse(visitor, options, nestedSort))\n ).then((res) => res.filter((part) => !isEmpty(part)).join(','));\n }\n )\n .intercept(\n // Array of strings ['foo', 'foo,bar'] => map(recurse), then filter out empty items\n isStringArray,\n async (visitor, options, sort, { recurse }) => {\n return Promise.all(sort.map((nestedSort) => recurse(visitor, options, nestedSort))).then(\n (res) => res.filter((nestedSort) => !isEmpty(nestedSort))\n );\n }\n )\n .intercept(\n // Array of objects [{ foo: 'asc' }, { bar: 'desc', baz: 'asc' }] => map(recurse), then filter out empty items\n isObjectArray,\n async (visitor, options, sort, { recurse }) => {\n return Promise.all(sort.map((nestedSort) => recurse(visitor, options, nestedSort))).then(\n (res) => res.filter((nestedSort) => !isEmpty(nestedSort))\n );\n }\n )\n // Parse string values\n .parse(isString, () => {\n const tokenize = pipe(split('.'), map(split(':')), flatten);\n const recompose = (parts: string[]) => {\n if (parts.length === 0) {\n return undefined;\n }\n\n return parts.reduce((acc, part) => {\n if (isEmpty(part)) {\n return acc;\n }\n\n if (acc === '') {\n return part;\n }\n\n return isSortOrder(part) ? `${acc}:${part}` : `${acc}.${part}`;\n }, '');\n };\n\n return {\n transform: trim,\n\n remove(key, data) {\n const [root] = tokenize(data);\n\n return root === key ? undefined : data;\n },\n\n set(key, value, data) {\n const [root] = tokenize(data);\n\n if (root !== key) {\n return data;\n }\n\n return isNil(value) ? root : `${root}.${value}`;\n },\n\n keys(data) {\n const v = first(tokenize(data));\n return v ? [v] : [];\n },\n\n get(key, data) {\n const [root, ...rest] = tokenize(data);\n\n return key === root ? recompose(rest) : undefined;\n },\n };\n })\n // Parse object values\n .parse(isObj, () => ({\n transform: cloneDeep,\n\n remove(key, data) {\n // eslint-disable-next-line no-unused-vars\n const { [key]: ignored, ...rest } = data;\n\n return rest;\n },\n\n set(key, value, data) {\n return { ...data, [key]: value };\n },\n\n keys(data) {\n return Object.keys(data);\n },\n\n get(key, data) {\n return data[key];\n },\n }))\n // Handle deep sort on relation\n .onRelation(\n async ({ key, value, attribute, visitor, path, getModel, schema }, { set, recurse }) => {\n const isMorphRelation = attribute.relation.toLowerCase().startsWith('morph');\n\n if (isMorphRelation) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchemaUID = attribute.target;\n const targetSchema = getModel(targetSchemaUID!);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n )\n // Handle deep sort on media\n .onMedia(async ({ key, path, schema, attribute, visitor, value, getModel }, { recurse, set }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchemaUID = 'plugin::upload.file';\n const targetSchema = getModel(targetSchemaUID);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n })\n // Handle deep sort on components\n .onComponent(\n async ({ key, value, visitor, path, schema, attribute, getModel }, { recurse, set }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchema = getModel(attribute.component);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n );\n\nexport default curry(sort.traverse);\n","import {\n curry,\n isString,\n isArray,\n isEmpty,\n split,\n isObject,\n trim,\n constant,\n isNil,\n identity,\n cloneDeep,\n join,\n first,\n} from 'lodash/fp';\n\nimport traverseFactory, { type Parent } from './factory';\nimport { Attribute } from '../types';\nimport { isMorphToRelationalAttribute } from '../content-types';\n\nconst isKeyword = (keyword: string) => {\n return ({ key, attribute }: { key: string; attribute: Attribute }) => {\n return !attribute && keyword === key;\n };\n};\n\nconst isWildcard = (value: unknown): value is '*' => value === '*';\n\nconst isPopulateString = (value: unknown): value is string => {\n return isString(value) && !isWildcard(value);\n};\n\nconst isStringArray = (value: unknown): value is string[] =>\n isArray(value) && value.every(isString);\n\nconst isObj = (value: unknown): value is Record<string, unknown> => isObject(value);\n\nconst populate = traverseFactory()\n .intercept(isPopulateString, async (visitor, options, populate, { recurse }) => {\n /**\n * Ensure the populate clause its in the extended format ( { populate: { ... } }, and not just a string)\n * This gives a consistent structure to track the \"parent\" node of each nested populate clause\n */\n const populateObject = pathsToObjectPopulate([populate]);\n const traversedPopulate = (await recurse(visitor, options, populateObject)) as PopulateObject;\n const [result] = objectPopulateToPaths(traversedPopulate);\n\n return result;\n })\n // Array of strings ['foo', 'bar.baz'] => map(recurse), then filter out empty items\n .intercept(isStringArray, async (visitor, options, populate, { recurse }) => {\n const paths = await Promise.all(\n populate.map((subClause) => recurse(visitor, options, subClause))\n );\n\n return paths.filter((item) => !isNil(item));\n })\n // for wildcard, generate custom utilities to modify the values\n .parse(isWildcard, () => ({\n /**\n * Since value is '*', we don't need to transform it\n */\n transform: identity,\n\n /**\n * '*' isn't a key/value structure, so regardless\n * of the given key, it returns the data ('*')\n */\n get: (_key, data) => data,\n\n /**\n * '*' isn't a key/value structure, so regardless\n * of the given `key`, use `value` as the new `data`\n */\n set: (_key, value) => value,\n\n /**\n * '*' isn't a key/value structure, but we need to simulate at least one to enable\n * the data traversal. We're using '' since it represents a falsy string value\n */\n keys: constant(['']),\n\n /**\n * Removing '*' means setting it to undefined, regardless of the given key\n */\n remove: constant(undefined),\n }))\n\n // Parse string values\n .parse(isString, () => {\n const tokenize = split('.');\n const recompose = join('.');\n\n return {\n transform: trim,\n\n remove(key, data) {\n const [root] = tokenize(data);\n\n return root === key ? undefined : data;\n },\n\n set(key, value, data) {\n const [root] = tokenize(data);\n\n if (root !== key) {\n return data;\n }\n\n return isNil(value) || isEmpty(value) ? root : `${root}.${value}`;\n },\n\n keys(data) {\n const v = first(tokenize(data));\n return v ? [v] : [];\n },\n\n get(key, data) {\n const [root, ...rest] = tokenize(data);\n\n return key === root ? recompose(rest) : undefined;\n },\n };\n })\n // Parse object values\n .parse(isObj, () => ({\n transform: cloneDeep,\n\n remove(key, data) {\n // eslint-disable-next-line no-unused-vars\n const { [key]: ignored, ...rest } = data;\n\n return rest;\n },\n\n set(key, value, data) {\n return { ...data, [key]: value };\n },\n\n keys(data) {\n return Object.keys(data);\n },\n\n get(key, data) {\n return data[key];\n },\n }))\n .ignore(({ key, attribute }) => {\n // we don't want to recurse using traversePopulate and instead let\n // the visitors recurse with the appropriate traversal (sort, filters, etc...)\n return ['sort', 'filters', 'fields'].includes(key) && !attribute;\n })\n .on(\n // Handle recursion on populate.\"populate\"\n isKeyword('populate'),\n async ({ key, visitor, path, value, schema, getModel, attribute }, { set, recurse }) => {\n const parent: Parent = { key, path, schema, attribute };\n\n const newValue = await recurse(visitor, { schema, path, getModel, parent }, value);\n\n set(key, newValue);\n }\n )\n .on(\n isKeyword('on'),\n async ({ key, visitor, path, value, getModel, parent }, { set, recurse }) => {\n const newOn: Record<string, unknown> = {};\n\n if (!isObj(value)) {\n return;\n }\n\n for (const [uid, subPopulate] of Object.entries(value)) {\n const model = getModel(uid);\n const newPath = { ...path, raw: `${path.raw}[${uid}]` };\n\n newOn[uid] = await recurse(\n visitor,\n { schema: model, path: newPath, getModel, parent },\n subPopulate\n );\n }\n\n set(key, newOn);\n }\n )\n // Handle populate on relation\n .onRelation(\n async ({ key, value, attribute, visitor, path, schema, getModel }, { set, recurse }) => {\n if (isNil(value)) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n if (isMorphToRelationalAttribute(attribute)) {\n // Don't traverse values that cannot be parsed\n if (!isObject(value) || !('on' in value && isObject(value?.on))) {\n return;\n }\n\n // If there is a populate fragment defined, traverse it\n const newValue = await recurse(\n visitor,\n { schema, path, getModel, parent },\n { on: value?.on }\n );\n\n set(key, newValue);\n\n return;\n }\n\n const targetSchemaUID = attribute.target;\n const targetSchema = getModel(targetSchemaUID!);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n )\n // Handle populate on media\n .onMedia(async ({ key, path, schema, attribute, visitor, value, getModel }, { recurse, set }) => {\n if (isNil(value)) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchemaUID = 'plugin::upload.file';\n const targetSchema = getModel(targetSchemaUID);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n })\n // Handle populate on components\n .onComponent(\n async ({ key, value, schema, visitor, path, attribute, getModel }, { recurse, set }) => {\n if (isNil(value)) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n const targetSchema = getModel(attribute.component);\n\n const newValue = await recurse(\n visitor,\n { schema: targetSchema, path, getModel, parent },\n value\n );\n\n set(key, newValue);\n }\n )\n // Handle populate on dynamic zones\n .onDynamicZone(\n async ({ key, value, schema, visitor, path, attribute, getModel }, { set, recurse }) => {\n if (isNil(value) || !isObject(value)) {\n return;\n }\n\n const parent: Parent = { key, path, schema, attribute };\n\n // Handle fragment syntax\n if ('on' in value && value.on) {\n const newOn = await recurse(visitor, { schema, path, getModel, parent }, { on: value.on });\n\n set(key, newOn);\n }\n }\n );\n\nexport default curry(populate.traverse);\n\ntype PopulateObject = {\n [key: string]: true | { populate: PopulateObject };\n};\n\nconst objectPopulateToPaths = (input: PopulateObject): string[] => {\n const paths: string[] = [];\n\n function traverse(currentObj: PopulateObject, parentPath: string) {\n for (const [key, value] of Object.entries(currentObj)) {\n const currentPath = parentPath ? `${parentPath}.${key}` : key;\n if (value === true) {\n paths.push(currentPath);\n } else {\n traverse((value as { populate: PopulateObject }).populate, currentPath);\n }\n }\n }\n\n traverse(input, '');\n\n return paths;\n};\n\nconst pathsToObjectPopulate = (input: string[]): PopulateObject => {\n const result: PopulateObject = {};\n\n function traverse(object: PopulateObject, keys: string[]): void {\n const [first, ...rest] = keys;\n if (rest.length === 0) {\n object[first] = true;\n } else {\n if (!object[first] || typeof object[first] === 'boolean') {\n object[first] = { populate: {} };\n }\n traverse((object[first] as { populate: PopulateObject }).populate, rest);\n }\n }\n\n input.forEach((clause) => traverse(result, clause.split('.')));\n\n return result;\n};\n","import { curry, isArray, isString, eq, trim, constant } from 'lodash/fp';\n\nimport traverseFactory from './factory';\n\nconst isStringArray = (value: unknown): value is string[] => {\n return isArray(value) && value.every(isString);\n};\n\nconst fields = traverseFactory()\n // Intercept array of strings\n // e.g. fields=['title', 'description']\n .intercept(isStringArray, async (visitor, options, fields, { recurse }) => {\n return Promise.all(fields.map((field) => recurse(visitor, options, field)));\n })\n // Intercept comma separated fields (as string)\n // e.g. fields='title,description'\n .intercept(\n (value): value is string => isString(value) && value.includes(','),\n (visitor, options, fields, { recurse }) => {\n return Promise.all(fields.split(',').map((field) => recurse(visitor, options, field)));\n }\n )\n // Return wildcards as is\n .intercept((value): value is string => eq('*', value), constant('*'))\n // Parse string values\n // Since we're parsing strings only, each value should be an attribute name (and it's value, undefined),\n // thus it shouldn't be possible to set a new value, and get should return the whole data if key === data\n .parse(isString, () => ({\n transform: trim,\n\n remove(key, data) {\n return data === key ? undefined : data;\n },\n\n set(_key, _value, data) {\n return data;\n },\n\n keys(data) {\n return [data];\n },\n\n get(key, data) {\n return key === data ? data : undefined;\n },\n }));\n\nexport default curry(fields.traverse);\n","import { curry, isEmpty, isNil, isArray, isObject } from 'lodash/fp';\n\nimport { pipe as pipeAsync } from '../async';\nimport traverseEntity from '../traverse-entity';\nimport { isScalarAttribute, constants } from '../content-types';\n\nimport {\n traverseQueryFilters,\n traverseQuerySort,\n traverseQueryPopulate,\n traverseQueryFields,\n} from '../traverse';\n\nimport {\n removePassword,\n removePrivate,\n removeDynamicZones,\n removeMorphToRelations,\n expandWildcardPopulate,\n} from './visitors';\nimport { isOperator } from '../operators';\n\nimport type { Model, Data } from '../types';\nimport type { Parent } from '../traverse/factory';\n\ninterface Context {\n schema: Model;\n getModel: (model: string) => Model;\n parent?: Parent;\n}\n\nconst { ID_ATTRIBUTE, DOC_ID_ATTRIBUTE } = constants;\n\nconst sanitizePasswords = (ctx: Context) => async (entity: Data) => {\n if (!ctx.schema) {\n throw new Error('Missing schema in sanitizePasswords');\n }\n\n return traverseEntity(removePassword, ctx, entity);\n};\n\nconst defaultSanitizeOutput = async (ctx: Context, entity: Data) => {\n if (!ctx.schema) {\n throw new Error('Missing schema in defaultSanitizeOutput');\n }\n\n return traverseEntity(\n (...args) => {\n removePassword(...args);\n removePrivate(...args);\n },\n ctx,\n entity\n );\n};\n\nconst defaultSanitizeFilters = curry((ctx: Context, filters: unknown) => {\n if (!ctx.schema) {\n throw new Error('Missing schema in defaultSanitizeFilters');\n }\n\n return pipeAsync(\n // Remove keys that are not attributes or valid operators\n traverseQueryFilters(({ key, attribute }, { remove }) => {\n const isAttribute = !!attribute;\n\n // ID is not an attribute per se, so we need to make\n // an extra check to ensure we're not checking it\n if ([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE].includes(key)) {\n return;\n }\n\n if (!isAttribute && !isOperator(key)) {\n remove(key);\n }\n }, ctx),\n // Remove dynamic zones from filters\n traverseQueryFilters(removeDynamicZones, ctx),\n // Remove morpTo relations from filters\n traverseQueryFilters(removeMorphToRelations, ctx),\n // Remove passwords from filters\n traverseQueryFilters(removePassword, ctx),\n // Remove private from filters\n traverseQueryFilters(removePrivate, ctx),\n // Remove empty objects\n traverseQueryFilters(({ key, value }, { remove }) => {\n if (isObject(value) && isEmpty(value)) {\n remove(key);\n }\n }, ctx)\n )(filters);\n});\n\nconst defaultSanitizeSort = curry((ctx: Context, sort: unknown) => {\n if (!ctx.schema) {\n throw new Error('Missing schema in defaultSanitizeSort');\n }\n\n return pipeAsync(\n // Remove non attribute keys\n traverseQuerySort(({ key, attribute }, { remove }) => {\n // ID is not an attribute per se, so we need to make\n // an extra check to ensure we're not checking it\n if ([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE].includes(key)) {\n return;\n }\n\n if (!attribute) {\n remove(key);\n }\n }, ctx),\n // Remove dynamic zones from sort\n traverseQuerySort(removeDynamicZones, ctx),\n // Remove morpTo relations from sort\n traverseQuerySort(removeMorphToRelations, ctx),\n // Remove private from sort\n traverseQuerySort(removePrivate, ctx),\n // Remove passwords from filters\n traverseQuerySort(removePassword, ctx),\n // Remove keys for empty non-scalar values\n traverseQuerySort(({ key, attribute, value }, { remove }) => {\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 remove(key);\n }\n }, ctx)\n )(sort);\n});\n\nconst defaultSanitizeFields = curry((ctx: Context, fields: unknown) => {\n if (!ctx.schema) {\n throw new Error('Missing schema in defaultSanitizeFields');\n }\n\n return pipeAsync(\n // Only keep scalar attributes\n traverseQueryFields(({ key, attribute }, { remove }) => {\n // ID is not an attribute per se, so we need to make\n // an extra check to ensure we're not checking it\n if ([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE].includes(key)) {\n return;\n }\n\n if (isNil(attribute) || !isScalarAttribute(attribute)) {\n remove(key);\n }\n }, ctx),\n // Remove private fields\n traverseQueryFields(removePrivate, ctx),\n // Remove password fields\n traverseQueryFields(removePassword, ctx),\n // Remove nil values from fields array\n (value) => (isArray(value) ? value.filter((field) => !isNil(field)) : value)\n )(fields);\n});\n\nconst defaultSanitizePopulate = curry((ctx: Context, populate: unknown) => {\n if (!ctx.schema) {\n throw new Error('Missing schema in defaultSanitizePopulate');\n }\n\n return pipeAsync(\n traverseQueryPopulate(expandWildcardPopulate, ctx),\n traverseQueryPopulate(async ({ key, value, schema, attribute, getModel, path }, { set }) => {\n if (attribute) {\n return;\n }\n\n const parent = { key, path, schema, attribute } satisfies Parent;\n\n if (key === 'sort') {\n set(key, await defaultSanitizeSort({ schema, getModel, parent }, value));\n }\n\n if (key === 'filters') {\n set(key, await defaultSanitizeFilters({ schema, getModel, parent }, value));\n }\n\n if (key === 'fields') {\n set(key, await defaultSanitizeFields({ schema, getModel, parent }, value));\n }\n\n if (key === 'populate') {\n set(key, await defaultSanitizePopulate({ schema, getModel, parent }, value));\n }\n }, ctx),\n // Remove private fields\n traverseQueryPopulate(removePrivate, ctx)\n )(populate);\n});\n\nexport {\n sanitizePasswords,\n defaultSanitizeOutput,\n defaultSanitizeFilters,\n defaultSanitizeSort,\n defaultSanitizeFields,\n defaultSanitizePopulate,\n};\n","import { CurriedFunction1 } from 'lodash';\nimport { isArray, cloneDeep, omit } from 'lodash/fp';\n\nimport { constants, getNonWritableAttributes } from '../content-types';\nimport { pipe as pipeAsync } from '../async';\n\nimport * as visitors from './visitors';\nimport * as sanitizers from './sanitizers';\nimport traverseEntity from '../traverse-entity';\n\nimport { traverseQueryFilters, traverseQuerySort, traverseQueryPopulate } from '../traverse';\nimport type { Model, Data } from '../types';\n\nexport interface Options {\n auth?: unknown;\n}\n\nexport interface Sanitizer {\n (schema: Model): CurriedFunction1<Data, Promise<Data>>;\n}\nexport interface SanitizeFunc {\n (data: unknown, schema: Model, options?: Options): Promise<unknown>;\n}\n\nexport interface APIOptions {\n sanitizers?: Sanitizers;\n getModel: (model: string) => Model;\n}\n\nexport interface Sanitizers {\n input?: Sanitizer[];\n output?: Sanitizer[];\n}\n\nconst createAPISanitizers = (opts: APIOptions) => {\n const { getModel } = opts;\n\n const sanitizeInput: SanitizeFunc = (data: unknown, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeInput');\n }\n if (isArray(data)) {\n return Promise.all(data.map((entry) => sanitizeInput(entry, schema, { auth })));\n }\n\n const nonWritableAttributes = getNonWritableAttributes(schema);\n\n const transforms = [\n // Remove first level ID in inputs\n omit(constants.ID_ATTRIBUTE),\n omit(constants.DOC_ID_ATTRIBUTE),\n // Remove non-writable attributes\n traverseEntity(visitors.removeRestrictedFields(nonWritableAttributes), { schema, getModel }),\n ];\n\n if (auth) {\n // Remove restricted relations\n transforms.push(\n traverseEntity(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n // Apply sanitizers from registry if exists\n opts?.sanitizers?.input?.forEach((sanitizer: Sanitizer) => transforms.push(sanitizer(schema)));\n\n return pipeAsync(...transforms)(data as Data);\n };\n\n const sanitizeOutput: SanitizeFunc = async (data, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeOutput');\n }\n if (isArray(data)) {\n const res = new Array(data.length);\n for (let i = 0; i < data.length; i += 1) {\n res[i] = await sanitizeOutput(data[i], schema, { auth });\n }\n return res;\n }\n\n const transforms = [\n (data: Data) => sanitizers.defaultSanitizeOutput({ schema, getModel }, data),\n ];\n\n if (auth) {\n transforms.push(\n traverseEntity(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n // Apply sanitizers from registry if exists\n opts?.sanitizers?.output?.forEach((sanitizer: Sanitizer) => transforms.push(sanitizer(schema)));\n\n return pipeAsync(...transforms)(data as Data);\n };\n\n const sanitizeQuery = async (\n query: Record<string, unknown>,\n schema: Model,\n { auth }: Options = {}\n ) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeQuery');\n }\n const { filters, sort, fields, populate } = query;\n\n const sanitizedQuery = cloneDeep(query);\n\n if (filters) {\n Object.assign(sanitizedQuery, { filters: await sanitizeFilters(filters, schema, { auth }) });\n }\n\n if (sort) {\n Object.assign(sanitizedQuery, { sort: await sanitizeSort(sort, schema, { auth }) });\n }\n\n if (fields) {\n Object.assign(sanitizedQuery, { fields: await sanitizeFields(fields, schema) });\n }\n\n if (populate) {\n Object.assign(sanitizedQuery, { populate: await sanitizePopulate(populate, schema) });\n }\n\n return sanitizedQuery;\n };\n\n const sanitizeFilters: SanitizeFunc = (filters, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeFilters');\n }\n if (isArray(filters)) {\n return Promise.all(filters.map((filter) => sanitizeFilters(filter, schema, { auth })));\n }\n\n const transforms = [sanitizers.defaultSanitizeFilters({ schema, getModel })];\n\n if (auth) {\n transforms.push(\n traverseQueryFilters(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n return pipeAsync(...transforms)(filters);\n };\n\n const sanitizeSort: SanitizeFunc = (sort, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeSort');\n }\n const transforms = [sanitizers.defaultSanitizeSort({ schema, getModel })];\n\n if (auth) {\n transforms.push(\n traverseQuerySort(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n return pipeAsync(...transforms)(sort);\n };\n\n const sanitizeFields: SanitizeFunc = (fields, schema: Model) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizeFields');\n }\n const transforms = [sanitizers.defaultSanitizeFields({ schema, getModel })];\n\n return pipeAsync(...transforms)(fields);\n };\n\n const sanitizePopulate: SanitizeFunc = (populate, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizePopulate');\n }\n const transforms = [sanitizers.defaultSanitizePopulate({ schema, getModel })];\n\n if (auth) {\n transforms.push(\n traverseQueryPopulate(visitors.removeRestrictedRelations(auth), { schema, getModel })\n );\n }\n\n return pipeAsync(...transforms)(populate);\n };\n\n return {\n input: sanitizeInput,\n output: sanitizeOutput,\n query: sanitizeQuery,\n filters: sanitizeFilters,\n sort: sanitizeSort,\n fields: sanitizeFields,\n populate: sanitizePopulate,\n };\n};\n\nexport { createAPISanitizers, sanitizers, visitors };\n\nexport type APISanitiers = ReturnType<typeof createAPISanitizers>;\n","// lodash/fp curry does not handle async functions properly, and creates very \"ugly\" types,\n// so we will use our own version to ensure curried functions are typed correctly\n// TODO: Export this from root @strapi/utils so we don't have copies of it between packages\n\nimport { ValidationError } from '../errors';\n\nexport const throwInvalidKey = ({ key, path }: { key: string; path?: string | null }): never => {\n const msg = path && path !== key ? `Invalid key ${key} at ${path}` : `Invalid key ${key}`;\n\n throw new ValidationError(msg, {\n key,\n path,\n });\n};\n\nexport const asyncCurry = <A extends unknown[], R>(\n fn: (...args: A) => Promise<R>\n): ((...args: Partial<A>) => any) => {\n const curried = (...args: unknown[]): unknown => {\n if (args.length >= fn.length) {\n return fn(...(args as A));\n }\n return (...moreArgs: unknown[]) => curried(...args, ...moreArgs);\n };\n\n return curried;\n};\n","import { throwInvalidKey } from '../utils';\nimport type { Visitor } from '../../traverse/factory';\n\nconst visitor: Visitor = ({ key, attribute, path }) => {\n if (attribute?.type === 'password') {\n throwInvalidKey({ key, path: path.attribute });\n }\n};\n\nexport default visitor;\n","import { isPrivateAttribute } from '../../content-types';\nimport { throwInvalidKey } from '../utils';\nimport type { Visitor } from '../../traverse/factory';\n\nconst visitor: Visitor = ({ schema, key, attribute, path }) => {\n if (!attribute) {\n return;\n }\n\n const isPrivate = attribute.private === true || isPrivateAttribute(schema, key);\n\n if (isPrivate) {\n throwInvalidKey({ key, path: path.attribute });\n }\n};\n\nexport default visitor;\n","import { isArray, isObject } from 'lodash/fp';\nimport * as contentTypeUtils from '../../content-types';\nimport { throwInvalidKey } from '../utils';\nimport type { Visitor } from '../../traverse/factory';\nimport { VALID_RELATION_ORDERING_KEYS } from '../../relations';\n\nconst ACTIONS_TO_VERIFY = ['find'];\nconst { CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE } = contentTypeUtils.constants;\n\ntype MorphArray = Array<{ __type: string }>;\n\nexport default (auth: unknown): Visitor =>\n async ({ data, key, attribute, schema, path }) => {\n if (!attribute) {\n return;\n }\n\n const isRelation = attribute.type === 'relation';\n\n if (!isRelation) {\n return;\n }\n\n const handleMorphRelation = async () => {\n const elements: any = (data as Record<string, MorphArray>)[key];\n\n if (\n 'connect' in elements ||\n 'set' in elements ||\n 'disconnect' in elements ||\n 'options' in elements\n ) {\n await handleMorphElements(elements.connect || []);\n await handleMorphElements(elements.set || []);\n await handleMorphElements(elements.disconnect || []);\n\n // TODO: this should technically be in its own visitor to check morph options, but for now we'll handle it here\n if ('options' in elements) {\n if (elements.options === null || elements.options === undefined) {\n return;\n }\n\n if (typeof elements.options !== 'object') {\n throwInvalidKey({ key, path: path.attribute });\n }\n\n const optionKeys = Object.keys(elements.options);\n\n // Validate each key based on its validator function\n for (const key of optionKeys) {\n if (!(key in VALID_RELATION_ORDERING_KEYS)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n if (!VALID_RELATION_ORDERING_KEYS[key](elements.options[key])) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }\n }\n } else {\n await handleMorphElements(elements);\n }\n };\n\n const handleMorphElements = async (elements: any[]) => {\n if (!isArray(elements)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n\n for (const element of elements) {\n if (!isObject(element) || !('__type' in element)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n\n const scopes = ACTIONS_TO_VERIFY.map((action) => `${element.__type}.${action}`);\n const isAllowed = await hasAccessToSomeScopes(scopes, auth);\n\n if (!isAllowed) {\n throwInvalidKey({ key, path: path.attribute });\n }\n }\n };\n\n const handleRegularRelation = async () => {\n const scopes = ACTIONS_TO_VERIFY.map((action) => `${attribute.target}.${action}`);\n\n const isAllowed = await hasAccessToSomeScopes(scopes, auth);\n\n // If the authenticated user don't have access to any of the scopes\n if (!isAllowed) {\n throwInvalidKey({ key, path: path.attribute });\n }\n };\n\n const isCreatorRelation = [CREATED_BY_ATTRIBUTE, UPDATED_BY_ATTRIBUTE].includes(key);\n\n // Polymorphic relations\n if (contentTypeUtils.isMorphToRelationalAttribute(attribute)) {\n await handleMorphRelation();\n return;\n }\n\n // Creator relations\n if (isCreatorRelation && schema.options?.populateCreatorFields) {\n // do nothing\n return;\n }\n\n // Regular relations\n await handleRegularRelation();\n };\n\nconst hasAccessToSomeScopes = async (scopes: string[], auth: unknown) => {\n for (const scope of scopes) {\n try {\n await strapi.auth.verify(auth, { scope });\n return true;\n } catch {\n continue;\n }\n }\n\n return false;\n};\n","import { isMorphToRelationalAttribute } from '../../content-types';\nimport { throwInvalidKey } from '../utils';\nimport type { Visitor } from '../../traverse/factory';\n\nconst visitor: Visitor = ({ key, attribute, path }) => {\n if (isMorphToRelationalAttribute(attribute)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n};\n\nexport default visitor;\n","import { isDynamicZoneAttribute } from '../../content-types';\nimport { throwInvalidKey } from '../utils';\nimport type { Visitor } from '../../traverse/factory';\n\nconst visitor: Visitor = ({ key, attribute, path }) => {\n if (isDynamicZoneAttribute(attribute)) {\n throwInvalidKey({ key, path: path.attribute });\n }\n};\n\nexport default visitor;\n","import { isArray, isNil, isString, toPath } from 'lodash/fp';\nimport type { Visitor } from '../../traverse/factory';\nimport { throwInvalidKey } from '../utils';\n\nexport default (allowedFields: string[] | null = null): Visitor =>\n ({ key, path: { attribute: path } }) => {\n // All fields are allowed\n if (allowedFields === null) {\n return;\n }\n\n // Throw on invalid formats\n if (!(isArray(allowedFields) && allowedFields.every(isString))) {\n throw new TypeError(\n `Expected array of strings for allowedFields but got \"${typeof allowedFields}\"`\n );\n }\n\n if (isNil(path)) {\n return;\n }\n\n const containedPaths = getContainedPaths(path);\n\n /**\n * Tells if the current path should be kept or not based\n * on the success of the check functions for any of the allowed paths.\n *\n * The check functions are defined as follow:\n *\n * `containedPaths.includes(p)`\n * @example\n * ```js\n * const path = 'foo.bar.field';\n * const p = 'foo.bar';\n * // it should match\n *\n * const path = 'foo.bar.field';\n * const p = 'bar.foo';\n * // it shouldn't match\n *\n * const path = 'foo.bar';\n * const p = 'foo.bar.field';\n * // it should match but isn't handled by this check\n * ```\n *\n * `p.startsWith(`${path}.`)`\n * @example\n * ```js\n * const path = 'foo.bar';\n * const p = 'foo.bar.field';\n * // it should match\n *\n * const path = 'foo.bar.field';\n * const p = 'bar.foo';\n * // it shouldn't match\n *\n * const path = 'foo.bar.field';\n * const p = 'foo.bar';\n * // it should match but isn't handled by this check\n * ```\n */\n const isPathAllowed = allowedFields.some(\n (p) => containedPaths.includes(p) || p.startsWith(`${path}.`)\n );\n\n if (isPathAllowed) {\n return;\n }\n\n // throw otherwise\n throwInvalidKey({ key, path });\n };\n\n/**\n * Retrieve the list of allowed paths based on the given path\n *\n * @example\n * ```js\n * const containedPaths = getContainedPaths('foo');\n * // ['foo']\n *\n * * const containedPaths = getContainedPaths('foo.bar');\n * // ['foo', 'foo.bar']\n *\n * * const containedPaths = getContainedPaths('foo.bar.field');\n * // ['foo', 'foo.bar', 'foo.bar.field']\n * ```\n */\nconst getContainedPaths = (path: string) => {\n const parts = toPath(path);\n\n return parts.reduce((acc, value, index, list) => {\n return [...acc, list.slice(0, index + 1).join('.')];\n }, [] as string[]);\n};\n","import { isArray, isString } from 'lodash/fp';\nimport type { Visitor } from '../../traverse/factory';\nimport { throwInvalidKey } from '../utils';\n\nexport default (restrictedFields: string[] | null = null): Visitor =>\n ({ key, path: { attribute: path } }) => {\n // all fields\n if (restrictedFields === null) {\n throwInvalidKey({ key, path });\n }\n\n // Throw on invalid formats\n if (!(isArray(restrictedFields) && restrictedFields.every(isString))) {\n throw new TypeError(\n `Expected array of strings for restrictedFields but got \"${typeof restrictedFields}\"`\n );\n }\n\n // if an exact match was found\n if (restrictedFields.includes(path as string)) {\n throwInvalidKey({ key, path });\n }\n\n // nested matches\n const isRestrictedNested = restrictedFields.some((allowedPath) =>\n path?.toString().startsWith(`${allowedPath}.`)\n );\n if (isRestrictedNested) {\n throwInvalidKey({ key, path });\n }\n };\n","import {\n isDynamicZoneAttribute,\n isMorphToRelationalAttribute,\n isRelationalAttribute,\n constants,\n isComponentSchema,\n isMediaAttribute,\n hasRelationReordering,\n} from '../../content-types';\nimport type { Visitor } from '../../traverse-entity';\nimport { throwInvalidKey } from '../utils';\n\n// TODO these should all be centralized somewhere instead of maintaining a list\nconst ID_FIELDS = [constants.DOC_ID_ATTRIBUTE, constants.DOC_ID_ATTRIBUTE];\nconst ALLOWED_ROOT_LEVEL_FIELDS = [...ID_FIELDS];\nconst MORPH_TO_ALLOWED_FIELDS = ['__type'];\nconst DYNAMIC_ZONE_ALLOWED_FIELDS = ['__component'];\nconst RELATION_REORDERING_FIELDS = ['connect', 'disconnect', 'set', 'options'];\n\nconst throwUnrecognizedFields: Visitor = ({ key, attribute, path, schema, parent }) => {\n // We only look at properties that are not attributes\n if (attribute) {\n return;\n }\n\n // At root level (path.attribute === null), only accept allowed fields\n if (path.attribute === null) {\n if (ALLOWED_ROOT_LEVEL_FIELDS.includes(key)) {\n return;\n }\n\n return throwInvalidKey({ key, path: attribute });\n }\n\n // allow special morphTo keys\n if (isMorphToRelationalAttribute(parent?.attribute) && MORPH_TO_ALLOWED_FIELDS.includes(key)) {\n return;\n }\n\n // allow special dz keys\n if (\n isComponentSchema(schema) &&\n isDynamicZoneAttribute(parent?.attribute) &&\n DYNAMIC_ZONE_ALLOWED_FIELDS.includes(key)\n ) {\n return;\n }\n\n // allow special relation reordering keys in manyToX and XtoMany relations\n if (hasRelationReordering(parent?.attribute) && RELATION_REORDERING_FIELDS.includes(key)) {\n return;\n }\n\n // allow id fields where it is needed for setting a relational id rather than trying to create with a given id\n const canUseID = isRelationalAttribute(parent?.attribute) || isMediaAttribute(parent?.attribute);\n if (canUseID && !ID_FIELDS.includes(key)) {\n return;\n }\n\n // if we couldn't find any reason for it to be here, throw\n throwInvalidKey({ key, path: attribute });\n};\n\nexport default throwUnrecognizedFields;\n","import { isEmpty, isNil, isObject } from 'lodash/fp';\n\nimport { pipe as pipeAsync } from '../async';\nimport { isScalarAttribute, constants } 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 { 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 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\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 // 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 // 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","import { CurriedFunction1 } from 'lodash';\nimport { isArray, isObject } from 'lodash/fp';\n\nimport { getNonWritableAttributes, constants } from '../content-types';\nimport { pipe as pipeAsync } from '../async';\nimport { throwInvalidKey } from './utils';\n\nimport * as visitors from './visitors';\nimport * as validators from './validators';\nimport traverseEntity from '../traverse-entity';\n\nimport { traverseQueryFilters, traverseQuerySort, traverseQueryPopulate } from '../traverse';\n\nimport { Model, Data } from '../types';\nimport { ValidationError } from '../errors';\n\nconst { ID_ATTRIBUTE, DOC_ID_ATTRIBUTE } = constants;\n\nexport interface Options {\n auth?: unknown;\n}\n\nexport interface Validator {\n (schema: Model): CurriedFunction1<Data, Promise<Data>>;\n}\nexport interface ValidateFunc {\n (data: unknown, schema: Model, options?: Options): Promise<void>;\n}\n\ninterface APIOptions {\n validators?: Validators;\n getModel: (model: string) => Model;\n}\n\nexport interface Validators {\n input?: Validator[];\n}\n\nconst createAPIValidators = (opts: APIOptions) => {\n const { getModel } = opts || {};\n\n const validateInput: ValidateFunc = async (data: unknown, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in validateInput');\n }\n\n if (isArray(data)) {\n await Promise.all(data.map((entry) => validateInput(entry, schema, { auth })));\n return;\n }\n\n const nonWritableAttributes = getNonWritableAttributes(schema);\n\n const transforms = [\n (data: unknown) => {\n if (isObject(data)) {\n if (ID_ATTRIBUTE in data) {\n throwInvalidKey({ key: ID_ATTRIBUTE });\n }\n\n if (DOC_ID_ATTRIBUTE in data) {\n throwInvalidKey({ key: DOC_ID_ATTRIBUTE });\n }\n }\n return data;\n },\n // non-writable attributes\n traverseEntity(visitors.throwRestrictedFields(nonWritableAttributes), { schema, getModel }),\n // unrecognized attributes\n traverseEntity(visitors.throwUnrecognizedFields, { schema, getModel }),\n ];\n\n if (auth) {\n // restricted relations\n transforms.push(\n traverseEntity(visitors.throwRestrictedRelations(auth), {\n schema,\n getModel,\n })\n );\n }\n\n // Apply validators from registry if exists\n opts?.validators?.input?.forEach((validator: Validator) => transforms.push(validator(schema)));\n\n try {\n await pipeAsync(...transforms)(data as Data);\n } catch (e) {\n if (e instanceof ValidationError) {\n e.details.source = 'body';\n }\n throw e;\n }\n };\n\n const validateQuery = async (\n query: Record<string, unknown>,\n schema: Model,\n { auth }: Options = {}\n ) => {\n if (!schema) {\n throw new Error('Missing schema in validateQuery');\n }\n const { filters, sort, fields, populate } = query;\n\n if (filters) {\n await validateFilters(filters, schema, { auth });\n }\n\n if (sort) {\n await validateSort(sort, schema, { auth });\n }\n\n if (fields) {\n await validateFields(fields, schema);\n }\n\n // a wildcard is always valid; its conversion will be handled by the entity service and can be optimized with sanitizer\n if (populate && populate !== '*') {\n await validatePopulate(populate, schema);\n }\n };\n\n const validateFilters: ValidateFunc = async (filters, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in validateFilters');\n }\n if (isArray(filters)) {\n await Promise.all(filters.map((filter) => validateFilters(filter, schema, { auth })));\n return;\n }\n\n const transforms = [validators.defaultValidateFilters({ schema, getModel })];\n\n if (auth) {\n transforms.push(\n traverseQueryFilters(visitors.throwRestrictedRelations(auth), {\n schema,\n getModel,\n })\n );\n }\n\n try {\n await pipeAsync(...transforms)(filters);\n } catch (e) {\n if (e instanceof ValidationError) {\n e.details.source = 'query';\n e.details.param = 'filters';\n }\n throw e;\n }\n };\n\n const validateSort: ValidateFunc = async (sort, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in validateSort');\n }\n const transforms = [validators.defaultValidateSort({ schema, getModel })];\n\n if (auth) {\n transforms.push(\n traverseQuerySort(visitors.throwRestrictedRelations(auth), {\n schema,\n getModel,\n })\n );\n }\n\n try {\n await pipeAsync(...transforms)(sort);\n } catch (e) {\n if (e instanceof ValidationError) {\n e.details.source = 'query';\n e.details.param = 'sort';\n }\n throw e;\n }\n };\n\n const validateFields: ValidateFunc = async (fields, schema: Model) => {\n if (!schema) {\n throw new Error('Missing schema in validateFields');\n }\n const transforms = [validators.defaultValidateFields({ schema, getModel })];\n\n try {\n await pipeAsync(...transforms)(fields);\n } catch (e) {\n if (e instanceof ValidationError) {\n e.details.source = 'query';\n e.details.param = 'fields';\n }\n throw e;\n }\n };\n\n const validatePopulate: ValidateFunc = async (populate, schema: Model, { auth } = {}) => {\n if (!schema) {\n throw new Error('Missing schema in sanitizePopulate');\n }\n const transforms = [validators.defaultValidatePopulate({ schema, getModel })];\n\n if (auth) {\n transforms.push(\n traverseQueryPopulate(visitors.throwRestrictedRelations(auth), {\n schema,\n getModel,\n })\n );\n }\n\n try {\n await pipeAsync(...transforms)(populate);\n } catch (e) {\n if (e instanceof ValidationError) {\n e.details.source = 'query';\n e.details.param = 'populate';\n }\n throw e;\n }\n };\n\n return {\n input: validateInput,\n query: validateQuery,\n filters: validateFilters,\n sort: validateSort,\n fields: validateFields,\n populate: validatePopulate,\n };\n};\n\nexport { createAPIValidators, validators, visitors };\n\nexport type APIValidators = ReturnType<typeof createAPIValidators>;\n","import { merge, pipe, omit, isNil } from 'lodash/fp';\nimport { PaginationError } from './errors';\n\ninterface PaginationArgs {\n page: number;\n pageSize: number;\n start: number;\n limit: number;\n}\n\nexport interface Pagination {\n start: number;\n limit: number;\n}\n\nexport interface PagePatinationInformation {\n page: number;\n pageSize: number;\n pageCount: number;\n total: number;\n}\n\nexport interface OffsetPaginationInformation {\n start: number;\n limit: number;\n total: number;\n}\n\nconst STRAPI_DEFAULTS = {\n offset: {\n start: 0,\n limit: 10,\n },\n page: {\n page: 1,\n pageSize: 10,\n },\n};\n\nconst paginationAttributes = ['start', 'limit', 'page', 'pageSize'];\n\nconst withMaxLimit = (limit: number, maxLimit = -1) => {\n if (maxLimit === -1 || limit < maxLimit) {\n return limit;\n }\n\n return maxLimit;\n};\n\n// Ensure minimum page & pageSize values (page >= 1, pageSize >= 0, start >= 0, limit >= 0)\nconst ensureMinValues = ({ start, limit }: Pagination) => ({\n start: Math.max(start, 0),\n limit: limit === -1 ? limit : Math.max(limit, 1),\n});\n\nconst ensureMaxValues =\n (maxLimit = -1) =>\n ({ start, limit }: { start: number; limit: number }) => ({\n start,\n limit: withMaxLimit(limit, maxLimit),\n });\n\n// Apply maxLimit as the limit when limit is -1\nconst withNoLimit = (pagination: Pagination, maxLimit = -1) => ({\n ...pagination,\n limit: pagination.limit === -1 ? maxLimit : pagination.limit,\n});\n\nconst withDefaultPagination = <T extends Partial<PaginationArgs>>(\n args: T,\n { defaults = {}, maxLimit = -1 } = {}\n) => {\n const defaultValues = merge(STRAPI_DEFAULTS, defaults);\n\n const usePagePagination = !isNil(args.page) || !isNil(args.pageSize);\n const useOffsetPagination = !isNil(args.start) || !isNil(args.limit);\n\n const ensureValidValues = pipe(ensureMinValues, ensureMaxValues(maxLimit));\n\n // If there is no pagination attribute, don't modify the payload\n if (!usePagePagination && !useOffsetPagination) {\n return merge(args, ensureValidValues(defaultValues.offset));\n }\n\n // If there is page & offset pagination attributes, throw an error\n if (usePagePagination && useOffsetPagination) {\n throw new PaginationError('Cannot use both page & offset pagination in the same query');\n }\n\n const pagination: Pagination = {\n start: 0,\n limit: 0,\n };\n\n // Start / Limit\n if (useOffsetPagination) {\n const { start, limit } = merge(defaultValues.offset, args);\n\n Object.assign(pagination, { start, limit });\n }\n\n // Page / PageSize\n if (usePagePagination) {\n const { page, pageSize } = merge(defaultValues.page, {\n ...args,\n pageSize: Math.max(1, args.pageSize ?? 0),\n });\n\n Object.assign(pagination, {\n start: (page - 1) * pageSize,\n limit: pageSize,\n });\n }\n\n // Handle -1 limit\n Object.assign(pagination, withNoLimit(pagination, maxLimit));\n\n const replacePaginationAttributes = pipe(\n // Remove pagination attributes\n omit(paginationAttributes),\n // Merge the object with the new pagination + ensure minimum & maximum values\n merge(ensureValidValues(pagination))\n );\n\n return replacePaginationAttributes(args);\n};\n\n/**\n * Transform pagination information into a paginated response:\n * {\n * page: number,\n * pageSize: number,\n * pageCount: number,\n * total: number\n * }\n */\nconst transformPagedPaginationInfo = (\n paginationInfo: Partial<PaginationArgs>,\n total: number\n): PagePatinationInformation => {\n if (!isNil(paginationInfo.page)) {\n const page = paginationInfo.page;\n const pageSize = paginationInfo.pageSize ?? total;\n\n return {\n page,\n pageSize,\n pageCount: pageSize > 0 ? Math.ceil(total / pageSize) : 0,\n total,\n };\n }\n\n if (!isNil(paginationInfo.start)) {\n const start = paginationInfo.start;\n const limit = paginationInfo.limit ?? total;\n\n // Start limit to page page size\n return {\n page: Math.floor(start / limit) + 1,\n pageSize: limit,\n pageCount: limit > 0 ? Math.ceil(total / limit) : 0,\n total,\n };\n }\n\n // Default pagination\n return {\n ...paginationInfo,\n page: 1,\n pageSize: 10,\n pageCount: 1,\n total,\n };\n};\n\n/**\n * Transform pagination information into a offset response:\n * {\n * start: number,\n * limit: number,\n * total: number\n * }\n */\nconst transformOffsetPaginationInfo = (\n paginationInfo: Partial<PaginationArgs>,\n total: number\n): OffsetPaginationInformation => {\n if (!isNil(paginationInfo.page)) {\n const limit = paginationInfo.pageSize ?? total;\n const start = (paginationInfo.page - 1) * limit;\n\n return { start, limit, total };\n }\n\n if (!isNil(paginationInfo.start)) {\n const start = paginationInfo.start;\n const limit = paginationInfo.limit ?? total;\n\n // Start limit to page page size\n return { start, limit, total };\n }\n\n // Default pagination\n return {\n ...paginationInfo,\n start: 0,\n limit: 10,\n total,\n };\n};\n\nexport { withDefaultPagination, transformPagedPaginationInfo, transformOffsetPaginationInfo };\n","import execa from 'execa';\nimport preferredPM from 'preferred-pm';\n\nimport type { Options as ProcessOptions } from 'execa';\n\nconst SUPPORTED_PACKAGE_MANAGERS = ['npm', 'yarn'];\nconst DEFAULT_PACKAGE_MANAGER = 'npm' as const;\n\ntype SupportedPackageManagerName = 'npm' | 'yarn';\n\nexport const getPreferred = async (pkgPath: string): Promise<SupportedPackageManagerName> => {\n const pm = await preferredPM(pkgPath);\n\n const hasPackageManager = pm !== undefined;\n if (!hasPackageManager) {\n throw new Error(`Couldn't find a package manager in your project.`);\n }\n\n const isPackageManagerSupported = SUPPORTED_PACKAGE_MANAGERS.includes(pm.name);\n if (!isPackageManagerSupported) {\n process.emitWarning(\n `We detected your package manager (${pm.name} v${pm.version}), but it's not officially supported by Strapi yet. Defaulting to npm instead.`\n );\n\n return DEFAULT_PACKAGE_MANAGER;\n }\n\n return pm.name as SupportedPackageManagerName;\n};\n\nexport const installDependencies = (\n path: string,\n packageManager: SupportedPackageManagerName,\n options: ProcessOptions<string> = {}\n) => {\n return execa(packageManager, ['install'], { ...options, cwd: path, stdin: 'ignore' });\n};\n","/**\n * Create a strict interpolation RegExp based on the given variables' name\n */\nconst createStrictInterpolationRegExp = (allowedVariableNames: string[], flags: string) => {\n const oneOfVariables = allowedVariableNames.join('|');\n\n // 1. We need to match the delimiters: <%= ... %>\n // 2. We accept any number of whitespaces characters before and/or after the variable name: \\s* ... \\s*\n // 3. We only accept values from the variable list as interpolation variables' name: : (${oneOfVariables})\n return new RegExp(`<%=\\\\s*(${oneOfVariables})\\\\s*%>`, flags);\n};\n\n/**\n * Create a loose interpolation RegExp to match as many groups as possible\n */\nconst createLooseInterpolationRegExp = (flags: string) => new RegExp(/<%=([\\s\\S]+?)%>/, flags);\n\nexport { createStrictInterpolationRegExp, createLooseInterpolationRegExp };\n","/**\n * Utils file containing file treatment utils\n */\nimport { Writable, WritableOptions } from 'node:stream';\n\nconst kbytesToBytes = (kbytes: number) => kbytes * 1000;\nconst bytesToKbytes = (bytes: number) => Math.round((bytes / 1000) * 100) / 100;\nconst bytesToHumanReadable = (bytes: number) => {\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];\n if (bytes === 0) return '0 Bytes';\n const i = parseInt(`${Math.floor(Math.log(bytes) / Math.log(1000))}`, 10);\n return `${Math.round(bytes / 1000 ** i)} ${sizes[i]}`;\n};\n\nconst streamToBuffer = (stream: NodeJS.ReadableStream): Promise<Buffer> =>\n new Promise((resolve, reject) => {\n const chunks: Uint8Array[] = [];\n stream.on('data', (chunk) => {\n chunks.push(chunk);\n });\n stream.on('end', () => {\n resolve(Buffer.concat(chunks));\n });\n stream.on('error', reject);\n });\n\nconst getStreamSize = (stream: NodeJS.ReadableStream) =>\n new Promise((resolve, reject) => {\n let size = 0;\n stream.on('data', (chunk) => {\n size += Buffer.byteLength(chunk);\n });\n stream.on('close', () => resolve(size));\n stream.on('error', reject);\n stream.resume();\n });\n\n/**\n * Create a writeable Node.js stream that discards received data.\n * Useful for testing, draining a stream of data, etc.\n */\nfunction writableDiscardStream(options?: WritableOptions) {\n return new Writable({\n ...options,\n write(chunk, encding, callback) {\n setImmediate(callback);\n },\n });\n}\n\nexport {\n streamToBuffer,\n bytesToHumanReadable,\n bytesToKbytes,\n kbytesToBytes,\n getStreamSize,\n writableDiscardStream,\n};\n","import { eq } from 'lodash/fp';\n\ninterface Options {\n name: string;\n validator?(config: unknown): void;\n handler(...args: any[]): any;\n}\n\nconst createPolicy = (options: Options) => {\n const { name = 'unnamed', validator, handler } = options;\n\n const wrappedValidator = (config: unknown) => {\n if (validator) {\n try {\n validator(config);\n } catch (e) {\n throw new Error(`Invalid config passed to \"${name}\" policy.`);\n }\n }\n };\n\n return {\n name,\n validator: wrappedValidator,\n handler,\n };\n};\n\nconst createPolicyContext = (type: string, ctx: object) => {\n return Object.assign(\n {\n is: eq(type),\n get type() {\n return type;\n },\n },\n ctx\n );\n};\n\nexport { createPolicy, createPolicyContext };\n","import _, { kebabCase } from 'lodash';\nimport { trimChars, trimCharsEnd, trimCharsStart } from 'lodash/fp';\nimport slugify from '@sindresorhus/slugify';\n\nconst nameToSlug = (name: string, options: slugify.Options = { separator: '-' }) =>\n slugify(name, options);\n\nconst nameToCollectionName = (name: string) => slugify(name, { separator: '_' });\n\nconst toRegressedEnumValue = (value: string) =>\n slugify(value, {\n decamelize: false,\n lowercase: false,\n separator: '_',\n });\n\nconst getCommonPath = (...paths: string[]) => {\n const [segments, ...otherSegments] = paths.map((it) => _.split(it, '/'));\n return _.join(\n _.takeWhile(segments, (str, index) => otherSegments.every((it) => it[index] === str)),\n '/'\n );\n};\n\nconst isEqual = (a: unknown, b: unknown) => String(a) === String(b);\nconst isCamelCase = (value: string) => /^[a-z][a-zA-Z0-9]+$/.test(value);\nconst isKebabCase = (value: string) => /^([a-z][a-z0-9]*)(-[a-z0-9]+)*$/.test(value);\nconst startsWithANumber = (value: string) => /^[0-9]/.test(value);\n\nconst joinBy = (joint: string, ...args: string[]) => {\n const trim = trimChars(joint);\n const trimEnd = trimCharsEnd(joint);\n const trimStart = trimCharsStart(joint);\n\n return args.reduce((url, path, index) => {\n if (args.length === 1) return path;\n if (index === 0) return trimEnd(path);\n if (index === args.length - 1) return url + joint + trimStart(path);\n return url + joint + trim(path);\n }, '');\n};\n\nconst toKebabCase = (value: string) => kebabCase(value);\n\nexport {\n nameToSlug,\n nameToCollectionName,\n getCommonPath,\n isEqual,\n isCamelCase,\n isKebabCase,\n toKebabCase,\n toRegressedEnumValue,\n startsWithANumber,\n joinBy,\n};\n","const castIncludes = (arr: unknown[], val: unknown, cast: (val: unknown) => unknown): boolean =>\n arr.map((val) => cast(val)).includes(cast(val));\n\nconst includesString = (arr: unknown[], val: unknown) => castIncludes(arr, val, String);\n\nexport { includesString };\n","import _ from 'lodash';\n\nconst keysDeep = (obj: object, path: string[] = []): string[] =>\n !_.isObject(obj)\n ? [path.join('.')]\n : _.reduce(\n obj,\n (acc, next, key) => _.concat(acc, keysDeep(next, [...path, key])),\n [] as string[]\n );\n\nexport { keysDeep };\n","// Using timestamp (milliseconds) to be sure it is unique\n// + converting timestamp to base 36 for better readibility\nconst timestampCode = (date?: Date) => {\n const referDate = date ?? new Date();\n\n return referDate.getTime().toString(36);\n};\n\nexport { timestampCode };\n","// Code copied from the yup library (https://github.com/jquense/yup)\n// https://github.com/jquense/yup/blob/2778b88bdacd5260d593c6468793da2e77daf21f/src/util/printValue.ts\n\nconst { toString } = Object.prototype;\nconst errorToString = Error.prototype.toString;\nconst regExpToString = RegExp.prototype.toString;\nconst symbolToString = typeof Symbol !== 'undefined' ? Symbol.prototype.toString : () => '';\n\nconst SYMBOL_REGEXP = /^Symbol\\((.*)\\)(.*)$/;\n\nfunction printNumber(val: number) {\n // eslint-disable-next-line eqeqeq\n if (val != +val) return 'NaN';\n const isNegativeZero = val === 0 && 1 / val < 0;\n return isNegativeZero ? '-0' : `${val}`;\n}\n\nfunction printSimpleValue(val: unknown, quoteStrings = false) {\n if (val == null || val === true || val === false) return `${val}`;\n\n if (typeof val === 'number') return printNumber(val);\n if (typeof val === 'string') return quoteStrings ? `\"${val}\"` : val;\n if (typeof val === 'function') return `[Function ${val.name || 'anonymous'}]`;\n if (typeof val === 'symbol') return symbolToString.call(val).replace(SYMBOL_REGEXP, 'Symbol($1)');\n\n const tag = toString.call(val).slice(8, -1);\n\n if (tag === 'Date') {\n const v = val as Date;\n return Number.isNaN(v.getTime()) ? `${v}` : v.toISOString();\n }\n if (tag === 'Error' || val instanceof Error) return `[${errorToString.call(val)}]`;\n if (tag === 'RegExp') return regExpToString.call(val);\n\n return null;\n}\n\nfunction printValue(value: unknown, quoteStrings: boolean) {\n const result = printSimpleValue(value, quoteStrings);\n if (result !== null) return result;\n\n return JSON.stringify(\n value,\n function replacer(key, value) {\n const result = printSimpleValue(this[key], quoteStrings);\n if (result !== null) return result;\n return value;\n },\n 2\n );\n}\n\nexport { printValue };\n","/* eslint-disable no-template-curly-in-string */\n/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport * as yup from 'yup';\nimport _ from 'lodash';\nimport { isNumber, isInteger, get } from 'lodash/fp';\nimport { strings } from './primitives';\nimport { printValue } from './print-value';\n\nexport * from 'yup';\n\nexport const strapiID = (): InstanceType<typeof StrapiIDSchema> => new StrapiIDSchema();\n\nconst isNotNilTest = (value: unknown) => !_.isNil(value);\n\nconst isNotNullTest = (value: unknown) => !_.isNull(value);\n\nyup.addMethod(yup.mixed, 'notNil', function isNotNill(msg = '${path} must be defined.') {\n return this.test('defined', msg, isNotNilTest);\n});\n\nyup.addMethod(yup.mixed, 'notNull', function isNotNull(msg = '${path} cannot be null.') {\n return this.test('defined', msg, isNotNullTest);\n});\n\nyup.addMethod(yup.mixed, 'isFunction', function isFunction(message = '${path} is not a function') {\n return this.test(\n 'is a function',\n message,\n (value) => _.isUndefined(value) || _.isFunction(value)\n );\n});\n\nyup.addMethod(\n yup.string,\n 'isCamelCase',\n function isCamelCase(message = '${path} is not in camel case (anExampleOfCamelCase)') {\n return this.test('is in camelCase', message, (value) =>\n value ? strings.isCamelCase(value) : true\n );\n }\n);\n\nyup.addMethod(\n yup.string,\n 'isKebabCase',\n function isKebabCase(message = '${path} is not in kebab case (an-example-of-kebab-case)') {\n return this.test('is in kebab-case', message, (value) =>\n value ? strings.isKebabCase(value) : true\n );\n }\n);\n\nyup.addMethod(\n yup.object,\n 'onlyContainsFunctions',\n function onlyContainsFunctions(message = '${path} contains values that are not functions') {\n return this.test(\n 'only contains functions',\n message,\n (value) => _.isUndefined(value) || (value && Object.values(value).every(_.isFunction))\n );\n }\n);\n\nyup.addMethod(\n yup.array,\n 'uniqueProperty',\n function uniqueProperty(propertyName: string, message: string) {\n return this.test('unique', message, function unique(list) {\n const errors: yup.ValidationError[] = [];\n\n list?.forEach((element, index) => {\n const sameElements = list.filter(\n (e) => get(propertyName, e) === get(propertyName, element)\n );\n if (sameElements.length > 1) {\n errors.push(\n this.createError({\n path: `${this.path}[${index}].${propertyName}`,\n message,\n })\n );\n }\n });\n\n if (errors.length) {\n throw new yup.ValidationError(errors);\n }\n return true;\n });\n }\n);\n\nexport class StrapiIDSchema extends yup.MixedSchema {\n constructor() {\n super({ type: 'strapiID' });\n }\n\n _typeCheck(value: unknown): value is string | number {\n return typeof value === 'string' || (isNumber(value) && isInteger(value) && value >= 0);\n }\n}\n\ndeclare module 'yup' {\n // const strapiID: () => InstanceType<typeof StrapiIDSchema>;\n\n export interface BaseSchema {\n isFunction(message?: string): this;\n notNil(message?: string): this;\n notNull(message?: string): this;\n }\n\n export interface StringSchema {\n isCamelCase(message?: string): this;\n isKebabCase(message?: string): this;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n export interface ObjectSchema<TShape> {\n onlyContainsFunctions(message?: string): this;\n }\n}\n\ninterface NoTypeOptions {\n path: string;\n type: string;\n value: unknown;\n originalValue: unknown;\n}\n\n// Temporary fix of this issue : https://github.com/jquense/yup/issues/616\nyup.setLocale({\n mixed: {\n notType(options: NoTypeOptions) {\n const { path, type, value, originalValue } = options;\n const isCast = originalValue != null && originalValue !== value;\n const msg =\n `${path} must be a \\`${type}\\` type, ` +\n `but the final value was: \\`${printValue(value, true)}\\`${\n isCast ? ` (cast from the value \\`${printValue(originalValue, true)}\\`).` : '.'\n }`;\n\n /* Remove comment that is not supposed to be seen by the enduser\n if (value === null) {\n msg += `\\n If \"null\" is intended as an empty value be sure to mark the schema as \\`.nullable()\\``;\n }\n */\n return msg;\n },\n },\n});\n","import { z } from 'zod';\n\nimport { ValidationError } from './errors';\n\nexport const validateZod =\n <T extends z.ZodTypeAny>(schema: T) =>\n (data: unknown): z.TypeOf<T> => {\n try {\n return schema.parse(data);\n } catch (error) {\n if (error instanceof z.ZodError) {\n const { message, errors } = formatZodErrors(error);\n throw new ValidationError(message, { errors });\n }\n\n throw error;\n }\n };\n\nconst formatZodErrors = (zodError: z.ZodError) => ({\n errors: zodError.errors.map((error) => {\n return {\n path: error.path,\n message: error.message,\n name: 'ValidationError',\n };\n }),\n message: 'Validation error',\n});\n"],"names":["dates","_","ID_ATTRIBUTE","DOC_ID_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","CREATED_BY_ATTRIBUTE","UPDATED_BY_ATTRIBUTE","constants","contentTypes.constants","visitor","path","schema","i","errors","yup","isStringArray","populate","value","key","acc","sort","filters","fields","remove","ACTIONS_TO_VERIFY","contentTypeUtils.constants","hasAccessToSomeScopes","contentTypeUtils.isMorphToRelationalAttribute","getContainedPaths","index","parser","utils","isObj","pipe","map","newValue","first","traverseEntity","removePassword","removePrivate","pipeAsync","removeDynamicZones","removeMorphToRelations","expandWildcardPopulate","visitors.removeRestrictedFields","visitors.removeRestrictedRelations","data","sanitizers.defaultSanitizeOutput","sanitizers.defaultSanitizeFilters","sanitizers.defaultSanitizeSort","sanitizers.defaultSanitizeFields","sanitizers.defaultSanitizePopulate","throwDynamicZones","throwMorphToRelations","throwPassword","throwPrivate","visitors.throwRestrictedFields","visitors.throwUnrecognizedFields","visitors.throwRestrictedRelations","validateFilters","validateSort","validateFields","validatePopulate","validators.defaultValidateFilters","validators.defaultValidateSort","validators.defaultValidateFields","validators.defaultValidatePopulate","pagination","defaults","packageManager","trim","val","result","isCamelCase","strings.isCamelCase","isKebabCase","strings.isKebabCase"],"mappings":"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"}