@strapi/utils 5.56.0 → 5.58.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.
- package/dist/async.js +2 -2
- package/dist/async.js.map +1 -1
- package/dist/async.mjs +1 -1
- package/dist/async.mjs.map +1 -1
- package/dist/content-types.d.ts.map +1 -1
- package/dist/content-types.js +8 -9
- package/dist/content-types.js.map +1 -1
- package/dist/content-types.mjs +6 -7
- package/dist/content-types.mjs.map +1 -1
- package/dist/convert-query-params.d.ts.map +1 -1
- package/dist/convert-query-params.js +33 -34
- package/dist/convert-query-params.js.map +1 -1
- package/dist/convert-query-params.mjs +23 -24
- package/dist/convert-query-params.mjs.map +1 -1
- package/dist/format-yup-error.js +3 -3
- package/dist/format-yup-error.js.map +1 -1
- package/dist/format-yup-error.mjs +1 -1
- package/dist/format-yup-error.mjs.map +1 -1
- package/dist/hooks.js +3 -3
- package/dist/hooks.js.map +1 -1
- package/dist/hooks.mjs +2 -2
- package/dist/hooks.mjs.map +1 -1
- package/dist/pagination.d.ts.map +1 -1
- package/dist/pagination.js +15 -18
- package/dist/pagination.js.map +1 -1
- package/dist/pagination.mjs +15 -18
- package/dist/pagination.mjs.map +1 -1
- package/dist/policy.d.ts +1 -1
- package/dist/policy.d.ts.map +1 -1
- package/dist/policy.js +1 -3
- package/dist/policy.js.map +1 -1
- package/dist/policy.mjs +1 -3
- package/dist/policy.mjs.map +1 -1
- package/dist/primitives/objects.d.ts +7 -1
- package/dist/primitives/objects.d.ts.map +1 -1
- package/dist/primitives/objects.js +5 -0
- package/dist/primitives/objects.js.map +1 -1
- package/dist/primitives/objects.mjs +5 -1
- package/dist/primitives/objects.mjs.map +1 -1
- package/dist/primitives/strings.d.ts.map +1 -1
- package/dist/primitives/strings.js +3 -7
- package/dist/primitives/strings.js.map +1 -1
- package/dist/primitives/strings.mjs +3 -7
- package/dist/primitives/strings.mjs.map +1 -1
- package/dist/provider-factory.js +4 -4
- package/dist/provider-factory.js.map +1 -1
- package/dist/provider-factory.mjs +1 -1
- package/dist/provider-factory.mjs.map +1 -1
- package/dist/relations.js +2 -2
- package/dist/relations.js.map +1 -1
- package/dist/relations.mjs +1 -1
- package/dist/relations.mjs.map +1 -1
- package/dist/sanitize/index.d.ts.map +1 -1
- package/dist/sanitize/index.js +8 -8
- package/dist/sanitize/index.js.map +1 -1
- package/dist/sanitize/index.mjs +7 -7
- package/dist/sanitize/index.mjs.map +1 -1
- package/dist/sanitize/sanitizers.js +10 -10
- package/dist/sanitize/sanitizers.js.map +1 -1
- package/dist/sanitize/sanitizers.mjs +4 -4
- package/dist/sanitize/sanitizers.mjs.map +1 -1
- package/dist/sanitize/visitors/remove-disallowed-fields.js +4 -4
- package/dist/sanitize/visitors/remove-disallowed-fields.js.map +1 -1
- package/dist/sanitize/visitors/remove-disallowed-fields.mjs +3 -3
- package/dist/sanitize/visitors/remove-disallowed-fields.mjs.map +1 -1
- package/dist/sanitize/visitors/remove-restricted-fields.js +2 -2
- package/dist/sanitize/visitors/remove-restricted-fields.js.map +1 -1
- package/dist/sanitize/visitors/remove-restricted-fields.mjs +2 -2
- package/dist/sanitize/visitors/remove-restricted-fields.mjs.map +1 -1
- package/dist/sanitize/visitors/remove-restricted-relations.js +9 -9
- package/dist/sanitize/visitors/remove-restricted-relations.js.map +1 -1
- package/dist/sanitize/visitors/remove-restricted-relations.mjs +4 -4
- package/dist/sanitize/visitors/remove-restricted-relations.mjs.map +1 -1
- package/dist/security.d.ts.map +1 -1
- package/dist/security.js +3 -3
- package/dist/security.js.map +1 -1
- package/dist/security.mjs +3 -3
- package/dist/security.mjs.map +1 -1
- package/dist/set-creator-fields.d.ts +4 -1
- package/dist/set-creator-fields.d.ts.map +1 -1
- package/dist/set-creator-fields.js +7 -4
- package/dist/set-creator-fields.js.map +1 -1
- package/dist/set-creator-fields.mjs +7 -4
- package/dist/set-creator-fields.mjs.map +1 -1
- package/dist/traverse/factory.js +8 -8
- package/dist/traverse/factory.js.map +1 -1
- package/dist/traverse/factory.mjs +8 -8
- package/dist/traverse/factory.mjs.map +1 -1
- package/dist/traverse/query-fields.js +7 -7
- package/dist/traverse/query-fields.js.map +1 -1
- package/dist/traverse/query-fields.mjs +3 -3
- package/dist/traverse/query-fields.mjs.map +1 -1
- package/dist/traverse/query-filters.js +12 -12
- package/dist/traverse/query-filters.js.map +1 -1
- package/dist/traverse/query-filters.mjs +7 -7
- package/dist/traverse/query-filters.mjs.map +1 -1
- package/dist/traverse/query-populate.d.ts.map +1 -1
- package/dist/traverse/query-populate.js +21 -21
- package/dist/traverse/query-populate.js.map +1 -1
- package/dist/traverse/query-populate.mjs +12 -12
- package/dist/traverse/query-populate.mjs.map +1 -1
- package/dist/traverse/query-sort.d.ts.map +1 -1
- package/dist/traverse/query-sort.js +16 -16
- package/dist/traverse/query-sort.js.map +1 -1
- package/dist/traverse/query-sort.mjs +6 -6
- package/dist/traverse/query-sort.mjs.map +1 -1
- package/dist/traverse-entity.d.ts.map +1 -1
- package/dist/traverse-entity.js +18 -18
- package/dist/traverse-entity.js.map +1 -1
- package/dist/traverse-entity.mjs +16 -16
- package/dist/traverse-entity.mjs.map +1 -1
- package/dist/validate/index.d.ts.map +1 -1
- package/dist/validate/index.js +5 -5
- package/dist/validate/index.js.map +1 -1
- package/dist/validate/index.mjs +3 -3
- package/dist/validate/index.mjs.map +1 -1
- package/dist/validate/utils.d.ts +2 -1
- package/dist/validate/utils.d.ts.map +1 -1
- package/dist/validate/utils.js +4 -4
- package/dist/validate/utils.js.map +1 -1
- package/dist/validate/utils.mjs +4 -4
- package/dist/validate/utils.mjs.map +1 -1
- package/dist/validate/validators.d.ts.map +1 -1
- package/dist/validate/validators.js +17 -9
- package/dist/validate/validators.js.map +1 -1
- package/dist/validate/validators.mjs +14 -6
- package/dist/validate/validators.mjs.map +1 -1
- package/dist/validate/visitors/throw-disallowed-fields.js +4 -4
- package/dist/validate/visitors/throw-disallowed-fields.js.map +1 -1
- package/dist/validate/visitors/throw-disallowed-fields.mjs +3 -3
- package/dist/validate/visitors/throw-disallowed-fields.mjs.map +1 -1
- package/dist/validate/visitors/throw-restricted-fields.js +2 -2
- package/dist/validate/visitors/throw-restricted-fields.js.map +1 -1
- package/dist/validate/visitors/throw-restricted-fields.mjs +2 -2
- package/dist/validate/visitors/throw-restricted-fields.mjs.map +1 -1
- package/dist/validate/visitors/throw-restricted-relations.js +6 -6
- package/dist/validate/visitors/throw-restricted-relations.js.map +1 -1
- package/dist/validate/visitors/throw-restricted-relations.mjs +2 -2
- package/dist/validate/visitors/throw-restricted-relations.mjs.map +1 -1
- package/dist/validators.js +3 -3
- package/dist/validators.js.map +1 -1
- package/dist/validators.mjs +3 -3
- package/dist/validators.mjs.map +1 -1
- package/dist/yup.d.ts.map +1 -1
- package/dist/yup.js +2 -3
- package/dist/yup.js.map +1 -1
- package/dist/yup.mjs +3 -4
- package/dist/yup.mjs.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convert-query-params.mjs","sources":["../src/convert-query-params.ts"],"sourcesContent":["/* eslint-disable max-classes-per-file */\n\n/**\n * Converts the standard Strapi REST query params to a more usable format for querying\n * You can read more here: https://docs.strapi.io/developer-docs/latest/developer-resources/database-apis-reference/rest-api.html#filters\n */\n\nimport _ from 'lodash';\nimport {\n cloneDeep,\n get,\n isArray,\n isEmpty,\n isInteger,\n isNil,\n isObject,\n isString,\n toNumber,\n} from 'lodash/fp';\nimport {\n constants,\n hasDraftAndPublish,\n isDynamicZoneAttribute,\n isMorphToRelationalAttribute,\n} from './content-types';\nimport { PaginationError, ValidationError } from './errors';\nimport { isOperator } from './operators';\n\nimport parseType from './parse-type';\nimport type { PublicationFilterMode } from './publication-filter';\nimport {\n getMeaningfulSortSegments,\n hasSort,\n type SortParams,\n type SortParamsObject,\n} from './sort-query';\nimport { Model } from './types';\n\nexport type { SortParams, SortParamsObject } from './sort-query';\n\nconst { ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, PUBLISHED_AT_ATTRIBUTE } = constants;\n\ntype SortOrder = 'asc' | 'desc';\n\nexport interface SortMap {\n [key: string]: SortOrder | SortMap;\n}\n\ntype FieldsParams = string | string[];\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => _.isPlainObject(value);\n\nconst hasOwnProperty = (object: object, key: PropertyKey): boolean =>\n Object.prototype.hasOwnProperty.call(object, key);\n\nconst setSortMapValue = (field: string, order: SortOrder): SortMap => {\n const path = _.toPath(field);\n const sortMap: SortMap = {};\n let current: SortMap | SortMap[] = sortMap;\n\n for (const [index, key] of path.entries()) {\n const isLastSegment = index === path.length - 1;\n\n if (key === 'prototype' || (key in current && !hasOwnProperty(current, key))) {\n throw new ValidationError('Invalid sort query');\n }\n\n if (isLastSegment) {\n Object.defineProperty(current, key, {\n configurable: true,\n enumerable: true,\n value: order,\n writable: true,\n });\n continue;\n }\n\n const nextValue = /^\\d+$/.test(path[index + 1]) ? [] : {};\n\n Object.defineProperty(current, key, {\n configurable: true,\n enumerable: true,\n value: nextValue,\n writable: true,\n });\n\n current = nextValue;\n }\n\n return sortMap;\n};\n\nfunction isEmptySortMap(sortMap: SortMap): boolean {\n const keys = Object.keys(sortMap);\n\n if (keys.length === 0) {\n return true;\n }\n\n return keys.every((key) => {\n const value = sortMap[key];\n\n if (typeof value === 'string') {\n return value.trim().length === 0;\n }\n\n if (isPlainObject(value)) {\n return isEmptySortMap(value as SortMap);\n }\n\n return true;\n });\n}\n\n/** Drops empty sort maps so a trailing comma does not leave a truthy but meaningless `orderBy`. */\nfunction normalizeOrderBy(orderBy: OrderByQuery): OrderByQuery | undefined {\n if (Array.isArray(orderBy)) {\n const filtered = orderBy.filter((sortMap) => !isEmptySortMap(sortMap));\n\n return filtered.length > 0 ? filtered : undefined;\n }\n\n return isEmptySortMap(orderBy) ? undefined : orderBy;\n}\n\ntype FiltersParams = unknown;\n\nexport interface PopulateAttributesParams {\n [key: string]: boolean | PopulateObjectParams;\n}\n\nexport interface PopulateObjectParams {\n sort?: SortParams;\n fields?: FieldsParams;\n filters?: FiltersParams;\n populate?: string | string[] | PopulateAttributesParams;\n on?: PopulateAttributesParams;\n count?: boolean;\n ordering?: unknown;\n _q?: string;\n limit?: number | string;\n start?: number | string;\n page?: number | string;\n pageSize?: number | string;\n}\n\ntype PopulateParams = string | string[] | PopulateAttributesParams;\n\nexport interface Params {\n sort?: SortParams;\n fields?: FieldsParams;\n filters?: FiltersParams;\n populate?: PopulateParams;\n count?: boolean;\n ordering?: unknown;\n _q?: string;\n limit?: number | string;\n start?: number | string;\n page?: number | string;\n pageSize?: number | string;\n status?: 'draft' | 'published';\n publicationFilter?: PublicationFilterMode;\n /**\n * @deprecated Replaced by `publicationFilter` (`never-published`, `has-published-version`, …).\n * Retained for backward compatibility with existing REST and GraphQL clients.\n */\n hasPublishedVersion?: boolean | 'true' | 'false';\n}\n\ntype FiltersQuery = (options: { meta: Model }) => WhereQuery | undefined;\ntype OrderByQuery = SortMap | SortMap[];\ntype SelectQuery = string | string[];\n\nexport interface WhereQuery {\n [key: string]: any;\n}\n\ntype PopulateQuery =\n | boolean\n | string[]\n | {\n [key: string]: PopulateQuery;\n };\n\nexport interface Query {\n orderBy?: OrderByQuery;\n select?: SelectQuery;\n where?: WhereQuery;\n // NOTE: those are internal DB filters do not modify\n filters?: FiltersQuery;\n populate?: PopulateQuery;\n count?: boolean;\n ordering?: unknown;\n _q?: string;\n limit?: number;\n offset?: number;\n page?: number;\n pageSize?: number;\n}\n\nclass InvalidOrderError extends ValidationError {\n constructor() {\n super('Invalid order. order can only be one of asc|desc|ASC|DESC');\n }\n}\n\nclass InvalidSortError extends ValidationError {\n constructor() {\n super(\n 'Invalid sort parameter. Expected a string, an array of strings, a sort object or an array of sort objects'\n );\n }\n}\n\nclass InvalidPopulateError extends ValidationError {\n constructor() {\n super('Invalid populate parameter. Expected a string, an array of strings, a populate object');\n }\n}\n\nfunction validateOrder(order: string): asserts order is SortOrder {\n if (!isString(order) || !['asc', 'desc'].includes(order.toLocaleLowerCase())) {\n throw new InvalidOrderError();\n }\n}\n\nconst convertCountQueryParams = (countQuery: unknown): boolean => {\n return parseType({ type: 'boolean', value: countQuery });\n};\n\nconst convertOrderingQueryParams = (ordering: unknown) => {\n return ordering;\n};\n\nconst isStringArray = (value: unknown): value is string[] =>\n isArray(value) && value.every(isString);\n\ninterface TransformerOptions {\n getModel: (uid: string) => Model | undefined;\n}\n\nconst createTransformer = ({ getModel }: TransformerOptions) => {\n /**\n * Sort query parser\n */\n const convertSortQueryParams = (sortQuery: SortParams): OrderByQuery => {\n if (typeof sortQuery === 'string') {\n return convertStringSortQueryParam(sortQuery);\n }\n\n if (isStringArray(sortQuery)) {\n return sortQuery.flatMap((sortValue: string) => convertStringSortQueryParam(sortValue));\n }\n\n if (Array.isArray(sortQuery)) {\n return sortQuery.map((sortValue) => convertNestedSortQueryParam(sortValue));\n }\n\n if (isPlainObject(sortQuery)) {\n return convertNestedSortQueryParam(sortQuery);\n }\n\n throw new InvalidSortError();\n };\n\n const convertStringSortQueryParam = (sortQuery: string): SortMap[] => {\n return getMeaningfulSortSegments(sortQuery).map((segment) =>\n convertSingleSortQueryParam(segment)\n );\n };\n\n const convertSingleSortQueryParam = (sortQuery: string): SortMap => {\n const trimmed = sortQuery.trim();\n\n if (!trimmed) {\n return {};\n }\n\n if (!isString(trimmed)) {\n throw new ValidationError('Invalid sort query');\n }\n\n // split field and order param with default order to ascending\n const [rawField, order = 'asc'] = trimmed.split(':');\n const field = rawField.trim();\n\n if (field.length === 0) {\n throw new ValidationError('Field cannot be empty');\n }\n\n validateOrder(order.trim());\n\n // TODO: field should be a valid path on an object model\n\n return setSortMapValue(field, order.trim() as SortOrder);\n };\n\n const convertNestedSortQueryParam = (sortQuery: SortParamsObject): SortMap => {\n const transformedSort: SortMap = {};\n for (const field of Object.keys(sortQuery)) {\n const order = sortQuery[field];\n\n // this is a deep sort\n if (isPlainObject(order)) {\n const nested = convertNestedSortQueryParam(order as SortParamsObject);\n\n if (!isEmptySortMap(nested)) {\n transformedSort[field] = nested;\n }\n } else if (typeof order === 'string') {\n const trimmedOrder = order.trim();\n\n if (trimmedOrder.length > 0) {\n validateOrder(trimmedOrder);\n transformedSort[field] = trimmedOrder;\n }\n } else {\n throw new ValidationError(\n `Invalid sort type expected object or string got ${typeof order}`\n );\n }\n }\n\n return transformedSort;\n };\n\n const applySortToQuery = (query: Query, sortParam?: SortParams | null) => {\n if (!hasSort(sortParam)) {\n return;\n }\n\n const orderBy = normalizeOrderBy(convertSortQueryParams(sortParam));\n\n if (orderBy !== undefined) {\n query.orderBy = orderBy;\n }\n };\n\n /**\n * Start query parser\n */\n const convertStartQueryParams = (startQuery: unknown): number => {\n const startAsANumber = toNumber(startQuery);\n\n if (!_.isInteger(startAsANumber) || startAsANumber < 0) {\n throw new ValidationError(\n `convertStartQueryParams expected a positive integer got ${startAsANumber}`\n );\n }\n\n return startAsANumber;\n };\n\n /**\n * Limit query parser\n */\n const convertLimitQueryParams = (limitQuery: unknown): number | undefined => {\n const limitAsANumber = toNumber(limitQuery);\n\n if (!_.isInteger(limitAsANumber) || (limitAsANumber !== -1 && limitAsANumber < 0)) {\n throw new ValidationError(\n `convertLimitQueryParams expected a positive integer got ${limitAsANumber}`\n );\n }\n\n if (limitAsANumber === -1) {\n return undefined;\n }\n\n return limitAsANumber;\n };\n\n const convertPageQueryParams = (page: unknown): number => {\n const pageVal = toNumber(page);\n\n if (!isInteger(pageVal) || pageVal <= 0) {\n throw new PaginationError(\n `Invalid 'page' parameter. Expected an integer > 0, received: ${page}`\n );\n }\n\n return pageVal;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const convertPageSizeQueryParams = (pageSize: unknown, _page: unknown): number => {\n const pageSizeVal = toNumber(pageSize);\n\n if (!isInteger(pageSizeVal) || pageSizeVal <= 0) {\n throw new PaginationError(\n `Invalid 'pageSize' parameter. Expected an integer > 0, received: ${pageSize}`\n );\n }\n\n return pageSizeVal;\n };\n\n const validatePaginationParams = (\n page: unknown,\n pageSize: unknown,\n start: unknown,\n limit: unknown\n ) => {\n const isPagePagination = !isNil(page) || !isNil(pageSize);\n const isOffsetPagination = !isNil(start) || !isNil(limit);\n\n if (isPagePagination && isOffsetPagination) {\n throw new PaginationError(\n 'Invalid pagination attributes. The page parameters are incorrect and must be in the pagination object'\n );\n }\n };\n\n // NOTE: we could support foo.* or foo.bar.* etc later on\n const convertPopulateQueryParams = (\n populate: PopulateParams,\n schema?: Model,\n depth = 0\n ): PopulateQuery => {\n if (depth === 0 && populate === '*') {\n return true;\n }\n\n if (typeof populate === 'string') {\n return populate.split(',').map((value) => _.trim(value));\n }\n\n if (Array.isArray(populate)) {\n // map convert\n return _.uniq(\n populate.flatMap((value) => {\n if (typeof value !== 'string') {\n throw new InvalidPopulateError();\n }\n\n return value.split(',').map((value) => _.trim(value));\n })\n );\n }\n\n if (_.isPlainObject(populate)) {\n return convertPopulateObject(populate, schema);\n }\n\n throw new InvalidPopulateError();\n };\n\n const hasPopulateFragmentDefined = (\n populate: PopulateObjectParams\n ): populate is PopulateObjectParams & Required<Pick<PopulateObjectParams, 'on'>> => {\n return typeof populate === 'object' && 'on' in populate && !isNil(populate.on);\n };\n\n const hasCountDefined = (\n populate: PopulateObjectParams\n ): populate is PopulateObjectParams & { count: boolean } => {\n return (\n typeof populate === 'object' && 'count' in populate && typeof populate.count === 'boolean'\n );\n };\n\n const convertPopulateObject = (populate: PopulateAttributesParams, schema?: Model) => {\n if (!schema) {\n return {};\n }\n\n const { attributes } = schema;\n return Object.entries(populate).reduce((acc, [key, subPopulate]) => {\n // Try converting strings to regular booleans if possible\n if (_.isString(subPopulate)) {\n try {\n const subPopulateAsBoolean = parseType({ type: 'boolean', value: subPopulate });\n // Only true is accepted as a boolean populate value\n return subPopulateAsBoolean ? { ...acc, [key]: true } : acc;\n } catch {\n // ignore\n }\n }\n\n if (_.isBoolean(subPopulate)) {\n // Only true is accepted as a boolean populate value\n return subPopulate === true ? { ...acc, [key]: true } : acc;\n }\n\n const attribute = attributes[key];\n\n if (!attribute) {\n return acc;\n }\n\n // Allow adding an 'on' strategy to populate queries for morphTo relations and dynamic zones\n const isMorphLikeRelationalAttribute =\n isDynamicZoneAttribute(attribute) || isMorphToRelationalAttribute(attribute);\n\n if (isMorphLikeRelationalAttribute) {\n const hasInvalidProperties = Object.keys(subPopulate).some(\n (key) => !['populate', 'on', 'count'].includes(key)\n );\n\n if (hasInvalidProperties) {\n throw new ValidationError(\n `Invalid nested populate for ${schema.info?.singularName}.${key} (${schema.uid}). Expected a fragment (\"on\") or \"count\" but found ${JSON.stringify(subPopulate)}`\n );\n }\n\n /**\n * Validate nested population queries in the context of a polymorphic attribute (dynamic zone, morph relation).\n *\n * If 'populate' exists in subPopulate, its value should be constrained to a wildcard ('*').\n */\n if (\n 'populate' in subPopulate &&\n !isNil(subPopulate.populate) &&\n subPopulate.populate !== '*'\n ) {\n throw new ValidationError(\n `Invalid nested population query detected. When using 'populate' within polymorphic structures, ` +\n `its value must be '*' to indicate all second level links. Specific field targeting is not supported here. ` +\n `Consider using the fragment API for more granular population control.`\n );\n }\n\n // TODO: Remove the possibility to have multiple properties at the same time (on/count/populate)\n const newSubPopulate = {};\n\n // case: { populate: '*' }\n if ('populate' in subPopulate && subPopulate.populate === '*') {\n Object.assign(newSubPopulate, { populate: true });\n }\n\n // case: { on: { <clauses> } }\n if (hasPopulateFragmentDefined(subPopulate)) {\n // If the fragment API is used, it applies the transformation to every\n // sub-populate, then assign the result to the new sub-populate\n Object.assign(newSubPopulate, {\n on: Object.entries(subPopulate.on).reduce(\n (acc, [type, typeSubPopulate]) => ({\n ...acc,\n [type]: convertNestedPopulate(typeSubPopulate, getModel(type)),\n }),\n {}\n ),\n });\n }\n\n // case: { count: true | false }\n if (hasCountDefined(subPopulate)) {\n Object.assign(newSubPopulate, { count: subPopulate.count });\n }\n\n return { ...acc, [key]: newSubPopulate };\n }\n\n // Edge case when trying to use the fragment ('on') on a non-morph like attribute\n if (!isMorphLikeRelationalAttribute && hasPopulateFragmentDefined(subPopulate)) {\n throw new ValidationError(\n `Using fragments is not permitted to populate \"${key}\" in \"${schema.uid}\"`\n );\n }\n\n // NOTE: Retrieve the target schema UID.\n // Only handles basic relations, medias and component since it's not possible\n // to populate with options for a dynamic zone or a polymorphic relation\n let targetSchemaUID;\n\n if (attribute.type === 'relation') {\n targetSchemaUID = attribute.target;\n } else if (attribute.type === 'component') {\n targetSchemaUID = attribute.component;\n } else if (attribute.type === 'media') {\n targetSchemaUID = 'plugin::upload.file';\n } else {\n return acc;\n }\n\n const targetSchema = getModel(targetSchemaUID!);\n\n // ignore the sub-populate for the current key if there is no schema associated\n if (!targetSchema) {\n return acc;\n }\n\n const populateObject = convertNestedPopulate(subPopulate, targetSchema);\n\n if (!populateObject) {\n return acc;\n }\n\n return {\n ...acc,\n [key]: populateObject,\n };\n }, {});\n };\n\n const convertNestedPopulate = (subPopulate: boolean | PopulateObjectParams, schema?: Model) => {\n if (_.isString(subPopulate)) {\n return parseType({ type: 'boolean', value: subPopulate, forceCast: true });\n }\n\n if (_.isBoolean(subPopulate)) {\n return subPopulate;\n }\n\n if (!isPlainObject(subPopulate)) {\n throw new ValidationError(`Invalid nested populate. Expected '*' or an object`);\n }\n\n const { sort, filters, fields, populate, count, ordering, page, pageSize, start, limit } =\n subPopulate as PopulateObjectParams;\n\n const query: Query = {};\n\n applySortToQuery(query, sort);\n\n if (filters) {\n query.where = convertFiltersQueryParams(filters, schema);\n }\n\n if (fields) {\n query.select = convertFieldsQueryParams(fields, schema);\n }\n\n if (populate) {\n query.populate = convertPopulateQueryParams(populate, schema);\n }\n\n if (count) {\n query.count = convertCountQueryParams(count);\n }\n\n if (ordering) {\n query.ordering = convertOrderingQueryParams(ordering);\n }\n\n validatePaginationParams(page, pageSize, start, limit);\n\n if (!isNil(page)) {\n query.page = convertPageQueryParams(page);\n }\n\n if (!isNil(pageSize)) {\n query.pageSize = convertPageSizeQueryParams(pageSize, page);\n }\n\n if (!isNil(start)) {\n query.offset = convertStartQueryParams(start);\n }\n\n if (!isNil(limit)) {\n query.limit = convertLimitQueryParams(limit);\n }\n\n return query;\n };\n\n // TODO: ensure field is valid in content types (will probably have to check strapi.contentTypes since it can be a string.path)\n const convertFieldsQueryParams = (\n fields: FieldsParams,\n schema?: Model,\n depth = 0\n ): SelectQuery | undefined => {\n if (depth === 0 && fields === '*') {\n return undefined;\n }\n\n if (typeof fields === 'string') {\n const fieldsValues = fields.split(',').map((value) => _.trim(value));\n\n // NOTE: Only include the doc id if it's a content type\n if (schema?.modelType === 'contentType') {\n return _.uniq([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, ...fieldsValues]);\n }\n return _.uniq([ID_ATTRIBUTE, ...fieldsValues]);\n }\n\n if (isStringArray(fields)) {\n // map convert\n const fieldsValues = fields\n .flatMap((value) => convertFieldsQueryParams(value, schema, depth + 1))\n .filter((v) => !isNil(v)) as string[];\n\n // NOTE: Only include the doc id if it's a content type\n if (schema?.modelType === 'contentType') {\n return _.uniq([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, ...fieldsValues]);\n }\n return _.uniq([ID_ATTRIBUTE, ...fieldsValues]);\n }\n\n throw new ValidationError('Invalid fields parameter. Expected a string or an array of strings');\n };\n\n const isValidSchemaAttribute = (key: string, schema?: Model) => {\n if ([DOC_ID_ATTRIBUTE, ID_ATTRIBUTE].includes(key)) {\n return true;\n }\n\n if (!schema) {\n return false;\n }\n\n return Object.keys(schema.attributes).includes(key);\n };\n\n const convertFiltersQueryParams = (filters: FiltersParams, schema?: Model): WhereQuery => {\n // Filters need to be either an array or an object\n // Here we're only checking for 'object' type since typeof [] => object and typeof {} => object\n if (!isObject(filters)) {\n throw new ValidationError('The filters parameter must be an object or an array');\n }\n\n // Don't mutate the original object\n const filtersCopy = cloneDeep(filters);\n\n return convertAndSanitizeFilters(filtersCopy, schema);\n };\n\n const convertAndSanitizeFilters = (filters: FiltersParams, schema?: Model): WhereQuery => {\n if (Array.isArray(filters)) {\n return (\n filters\n // Sanitize each filter\n .map((filter) => convertAndSanitizeFilters(filter, schema))\n // Filter out empty filters\n .filter((filter) => !isPlainObject(filter) || !isEmpty(filter))\n );\n }\n\n if (!isPlainObject(filters)) {\n return filters as WhereQuery;\n }\n\n const removeOperator = (operator: string) => delete filters[operator];\n\n // Here, `key` can either be an operator or an attribute name\n for (const [key, value] of Object.entries(filters)) {\n const attribute = get(key, schema?.attributes);\n const validKey = isOperator(key) || isValidSchemaAttribute(key, schema);\n\n if (!validKey) {\n removeOperator(key);\n }\n // Handle attributes\n else if (attribute) {\n // Relations\n if (attribute.type === 'relation') {\n filters[key] = convertAndSanitizeFilters(value, getModel(attribute.target!));\n }\n\n // Components\n else if (attribute.type === 'component') {\n filters[key] = convertAndSanitizeFilters(value, getModel(attribute.component));\n }\n\n // Media\n else if (attribute.type === 'media') {\n filters[key] = convertAndSanitizeFilters(value, getModel('plugin::upload.file'));\n }\n\n // Dynamic Zones\n else if (attribute.type === 'dynamiczone') {\n removeOperator(key);\n }\n\n // Password attributes\n else if (attribute.type === 'password') {\n // Always remove password attributes from filters object\n removeOperator(key);\n }\n\n // Scalar attributes\n else {\n filters[key] = convertAndSanitizeFilters(value, schema);\n }\n }\n\n // Handle operators\n else if (['$null', '$notNull'].includes(key)) {\n filters[key] = parseType({ type: 'boolean', value: filters[key], forceCast: true });\n } else if (isObject(value)) {\n filters[key] = convertAndSanitizeFilters(value, schema);\n }\n\n // Remove empty objects & arrays\n if (isPlainObject(filters[key]) && isEmpty(filters[key])) {\n removeOperator(key);\n }\n }\n\n return filters;\n };\n\n const convertStatusParams = (status?: 'draft' | 'published', query: Query = {}) => {\n // NOTE: this is the query layer filters not the document/entity service filters\n query.filters = ({ meta }: { meta: Model }) => {\n const contentType = getModel(meta.uid);\n\n // Ignore if target model has disabled DP, as it doesn't make sense to filter by its status\n if (!contentType || !hasDraftAndPublish(contentType)) {\n return {};\n }\n\n return { [PUBLISHED_AT_ATTRIBUTE]: { $null: status === 'draft' } };\n };\n };\n\n const transformQueryParams = (uid: string, params: Params): Query => {\n // NOTE: can be a CT, a Compo or nothing in the case of polymorphism (DZ & morph relations)\n const schema = getModel(uid);\n\n const query: Query = {};\n\n const {\n _q: searchQuery,\n sort,\n filters,\n fields,\n populate,\n page,\n pageSize,\n start,\n limit,\n status,\n ...rest\n } = params;\n\n if (!isNil(status)) {\n convertStatusParams(status, query);\n }\n\n if (!isNil(searchQuery)) {\n query._q = searchQuery;\n }\n\n applySortToQuery(query, sort);\n\n if (!isNil(filters)) {\n query.where = convertFiltersQueryParams(filters, schema);\n }\n\n if (!isNil(fields)) {\n query.select = convertFieldsQueryParams(fields, schema);\n }\n\n if (!isNil(populate)) {\n query.populate = convertPopulateQueryParams(populate, schema);\n }\n\n validatePaginationParams(page, pageSize, start, limit);\n\n if (!isNil(page)) {\n query.page = convertPageQueryParams(page);\n }\n\n if (!isNil(pageSize)) {\n query.pageSize = convertPageSizeQueryParams(pageSize, page);\n }\n\n if (!isNil(start)) {\n query.offset = convertStartQueryParams(start);\n }\n\n if (!isNil(limit)) {\n query.limit = convertLimitQueryParams(limit);\n }\n\n return {\n ...rest,\n ...query,\n };\n };\n\n return {\n private_convertSortQueryParams: convertSortQueryParams,\n private_convertStartQueryParams: convertStartQueryParams,\n private_convertLimitQueryParams: convertLimitQueryParams,\n private_convertPopulateQueryParams: convertPopulateQueryParams,\n private_convertFiltersQueryParams: convertFiltersQueryParams,\n private_convertFieldsQueryParams: convertFieldsQueryParams,\n transformQueryParams,\n };\n};\n\nexport { createTransformer };\n"],"names":["ID_ATTRIBUTE","DOC_ID_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","constants","isPlainObject","value","_","hasOwnProperty","object","key","Object","prototype","call","setSortMapValue","field","order","path","toPath","sortMap","current","index","entries","isLastSegment","length","ValidationError","defineProperty","configurable","enumerable","writable","nextValue","test","isEmptySortMap","keys","every","trim","normalizeOrderBy","orderBy","Array","isArray","filtered","filter","undefined","InvalidOrderError","InvalidSortError","InvalidPopulateError","validateOrder","isString","includes","toLocaleLowerCase","convertCountQueryParams","countQuery","parseType","type","convertOrderingQueryParams","ordering","isStringArray","createTransformer","getModel","convertSortQueryParams","sortQuery","convertStringSortQueryParam","flatMap","sortValue","map","convertNestedSortQueryParam","getMeaningfulSortSegments","segment","convertSingleSortQueryParam","trimmed","rawField","split","transformedSort","nested","trimmedOrder","applySortToQuery","query","sortParam","hasSort","convertStartQueryParams","startQuery","startAsANumber","toNumber","isInteger","convertLimitQueryParams","limitQuery","limitAsANumber","convertPageQueryParams","page","pageVal","PaginationError","convertPageSizeQueryParams","pageSize","_page","pageSizeVal","validatePaginationParams","start","limit","isPagePagination","isNil","isOffsetPagination","convertPopulateQueryParams","populate","schema","depth","uniq","convertPopulateObject","hasPopulateFragmentDefined","on","hasCountDefined","count","attributes","reduce","acc","subPopulate","subPopulateAsBoolean","isBoolean","attribute","isMorphLikeRelationalAttribute","isDynamicZoneAttribute","isMorphToRelationalAttribute","hasInvalidProperties","some","info","singularName","uid","JSON","stringify","newSubPopulate","assign","typeSubPopulate","convertNestedPopulate","targetSchemaUID","target","component","targetSchema","populateObject","forceCast","sort","filters","fields","where","convertFiltersQueryParams","select","convertFieldsQueryParams","offset","fieldsValues","modelType","v","isValidSchemaAttribute","isObject","filtersCopy","cloneDeep","convertAndSanitizeFilters","isEmpty","removeOperator","operator","get","validKey","isOperator","convertStatusParams","status","meta","contentType","hasDraftAndPublish","$null","transformQueryParams","params","_q","searchQuery","rest","private_convertSortQueryParams","private_convertStartQueryParams","private_convertLimitQueryParams","private_convertPopulateQueryParams","private_convertFiltersQueryParams","private_convertFieldsQueryParams"],"mappings":";;;;;;;;AAwCA,MAAM,EAAEA,YAAY,EAAEC,gBAAgB,EAAEC,sBAAsB,EAAE,GAAGC,SAAAA;AAUnE,MAAMC,aAAAA,GAAgB,CAACC,KAAAA,GAAqDC,UAAAA,CAAEF,aAAa,CAACC,KAAAA,CAAAA;AAE5F,MAAME,cAAAA,GAAiB,CAACC,MAAAA,EAAgBC,GAAAA,GACtCC,MAAAA,CAAOC,SAAS,CAACJ,cAAc,CAACK,IAAI,CAACJ,MAAAA,EAAQC,GAAAA,CAAAA;AAE/C,MAAMI,eAAAA,GAAkB,CAACC,KAAAA,EAAeC,KAAAA,GAAAA;IACtC,MAAMC,IAAAA,GAAOV,UAAAA,CAAEW,MAAM,CAACH,KAAAA,CAAAA;AACtB,IAAA,MAAMI,UAAmB,EAAC;AAC1B,IAAA,IAAIC,OAAAA,GAA+BD,OAAAA;AAEnC,IAAA,KAAK,MAAM,CAACE,KAAAA,EAAOX,IAAI,IAAIO,IAAAA,CAAKK,OAAO,EAAA,CAAI;AACzC,QAAA,MAAMC,aAAAA,GAAgBF,KAAAA,KAAUJ,IAAAA,CAAKO,MAAM,GAAG,CAAA;AAE9C,QAAA,IAAId,QAAQ,WAAA,IAAgBA,GAAAA,IAAOU,WAAW,CAACZ,cAAAA,CAAeY,SAASV,GAAAA,CAAAA,EAAO;AAC5E,YAAA,MAAM,IAAIe,eAAAA,CAAgB,oBAAA,CAAA;AAC5B,QAAA;AAEA,QAAA,IAAIF,aAAAA,EAAe;YACjBZ,MAAAA,CAAOe,cAAc,CAACN,OAAAA,EAASV,GAAAA,EAAK;gBAClCiB,YAAAA,EAAc,IAAA;gBACdC,UAAAA,EAAY,IAAA;gBACZtB,KAAAA,EAAOU,KAAAA;gBACPa,QAAAA,EAAU;AACZ,aAAA,CAAA;AACA,YAAA;AACF,QAAA;QAEA,MAAMC,SAAAA,GAAY,OAAA,CAAQC,IAAI,CAACd,IAAI,CAACI,KAAAA,GAAQ,CAAA,CAAE,CAAA,GAAI,EAAE,GAAG,EAAC;QAExDV,MAAAA,CAAOe,cAAc,CAACN,OAAAA,EAASV,GAAAA,EAAK;YAClCiB,YAAAA,EAAc,IAAA;YACdC,UAAAA,EAAY,IAAA;YACZtB,KAAAA,EAAOwB,SAAAA;YACPD,QAAAA,EAAU;AACZ,SAAA,CAAA;QAEAT,OAAAA,GAAUU,SAAAA;AACZ,IAAA;IAEA,OAAOX,OAAAA;AACT,CAAA;AAEA,SAASa,eAAeb,OAAgB,EAAA;IACtC,MAAMc,IAAAA,GAAOtB,MAAAA,CAAOsB,IAAI,CAACd,OAAAA,CAAAA;IAEzB,IAAIc,IAAAA,CAAKT,MAAM,KAAK,CAAA,EAAG;QACrB,OAAO,IAAA;AACT,IAAA;IAEA,OAAOS,IAAAA,CAAKC,KAAK,CAAC,CAACxB,GAAAA,GAAAA;QACjB,MAAMJ,KAAAA,GAAQa,OAAO,CAACT,GAAAA,CAAI;QAE1B,IAAI,OAAOJ,UAAU,QAAA,EAAU;AAC7B,YAAA,OAAOA,KAAAA,CAAM6B,IAAI,EAAA,CAAGX,MAAM,KAAK,CAAA;AACjC,QAAA;AAEA,QAAA,IAAInB,cAAcC,KAAAA,CAAAA,EAAQ;AACxB,YAAA,OAAO0B,cAAAA,CAAe1B,KAAAA,CAAAA;AACxB,QAAA;QAEA,OAAO,IAAA;AACT,IAAA,CAAA,CAAA;AACF;AAEA,oGACA,SAAS8B,gBAAAA,CAAiBC,OAAqB,EAAA;IAC7C,IAAIC,KAAAA,CAAMC,OAAO,CAACF,OAAAA,CAAAA,EAAU;AAC1B,QAAA,MAAMG,WAAWH,OAAAA,CAAQI,MAAM,CAAC,CAACtB,OAAAA,GAAY,CAACa,cAAAA,CAAeb,OAAAA,CAAAA,CAAAA;AAE7D,QAAA,OAAOqB,QAAAA,CAAShB,MAAM,GAAG,CAAA,GAAIgB,QAAAA,GAAWE,SAAAA;AAC1C,IAAA;IAEA,OAAOV,cAAAA,CAAeK,WAAWK,SAAAA,GAAYL,OAAAA;AAC/C;AA6EA,MAAMM,iBAAAA,SAA0BlB,eAAAA,CAAAA;IAC9B,WAAA,EAAc;AACZ,QAAA,KAAK,CAAC,2DAAA,CAAA;AACR,IAAA;AACF;AAEA,MAAMmB,gBAAAA,SAAyBnB,eAAAA,CAAAA;IAC7B,WAAA,EAAc;AACZ,QAAA,KAAK,CACH,2GAAA,CAAA;AAEJ,IAAA;AACF;AAEA,MAAMoB,oBAAAA,SAA6BpB,eAAAA,CAAAA;IACjC,WAAA,EAAc;AACZ,QAAA,KAAK,CAAC,uFAAA,CAAA;AACR,IAAA;AACF;AAEA,SAASqB,cAAc9B,KAAa,EAAA;IAClC,IAAI,CAAC+B,QAAAA,CAAS/B,KAAAA,CAAAA,IAAU,CAAC;AAAC,QAAA,KAAA;AAAO,QAAA;AAAO,KAAA,CAACgC,QAAQ,CAAChC,KAAAA,CAAMiC,iBAAiB,EAAA,CAAA,EAAK;AAC5E,QAAA,MAAM,IAAIN,iBAAAA,EAAAA;AACZ,IAAA;AACF;AAEA,MAAMO,0BAA0B,CAACC,UAAAA,GAAAA;AAC/B,IAAA,OAAOC,SAAAA,CAAU;QAAEC,IAAAA,EAAM,SAAA;QAAW/C,KAAAA,EAAO6C;AAAW,KAAA,CAAA;AACxD,CAAA;AAEA,MAAMG,6BAA6B,CAACC,QAAAA,GAAAA;IAClC,OAAOA,QAAAA;AACT,CAAA;AAEA,MAAMC,gBAAgB,CAAClD,KAAAA,GACrBiC,QAAQjC,KAAAA,CAAAA,IAAUA,KAAAA,CAAM4B,KAAK,CAACa,QAAAA,CAAAA;AAMhC,MAAMU,iBAAAA,GAAoB,CAAC,EAAEC,QAAQ,EAAsB,GAAA;AACzD;;MAGA,MAAMC,yBAAyB,CAACC,SAAAA,GAAAA;QAC9B,IAAI,OAAOA,cAAc,QAAA,EAAU;AACjC,YAAA,OAAOC,2BAAAA,CAA4BD,SAAAA,CAAAA;AACrC,QAAA;AAEA,QAAA,IAAIJ,cAAcI,SAAAA,CAAAA,EAAY;AAC5B,YAAA,OAAOA,SAAAA,CAAUE,OAAO,CAAC,CAACC,YAAsBF,2BAAAA,CAA4BE,SAAAA,CAAAA,CAAAA;AAC9E,QAAA;QAEA,IAAIzB,KAAAA,CAAMC,OAAO,CAACqB,SAAAA,CAAAA,EAAY;AAC5B,YAAA,OAAOA,SAAAA,CAAUI,GAAG,CAAC,CAACD,YAAcE,2BAAAA,CAA4BF,SAAAA,CAAAA,CAAAA;AAClE,QAAA;AAEA,QAAA,IAAI1D,cAAcuD,SAAAA,CAAAA,EAAY;AAC5B,YAAA,OAAOK,2BAAAA,CAA4BL,SAAAA,CAAAA;AACrC,QAAA;AAEA,QAAA,MAAM,IAAIhB,gBAAAA,EAAAA;AACZ,IAAA,CAAA;AAEA,IAAA,MAAMiB,8BAA8B,CAACD,SAAAA,GAAAA;AACnC,QAAA,OAAOM,0BAA0BN,SAAAA,CAAAA,CAAWI,GAAG,CAAC,CAACG,UAC/CC,2BAAAA,CAA4BD,OAAAA,CAAAA,CAAAA;AAEhC,IAAA,CAAA;AAEA,IAAA,MAAMC,8BAA8B,CAACR,SAAAA,GAAAA;QACnC,MAAMS,OAAAA,GAAUT,UAAUzB,IAAI,EAAA;AAE9B,QAAA,IAAI,CAACkC,OAAAA,EAAS;AACZ,YAAA,OAAO,EAAC;AACV,QAAA;QAEA,IAAI,CAACtB,SAASsB,OAAAA,CAAAA,EAAU;AACtB,YAAA,MAAM,IAAI5C,eAAAA,CAAgB,oBAAA,CAAA;AAC5B,QAAA;;QAGA,MAAM,CAAC6C,UAAUtD,KAAAA,GAAQ,KAAK,CAAC,GAAGqD,OAAAA,CAAQE,KAAK,CAAC,GAAA,CAAA;QAChD,MAAMxD,KAAAA,GAAQuD,SAASnC,IAAI,EAAA;QAE3B,IAAIpB,KAAAA,CAAMS,MAAM,KAAK,CAAA,EAAG;AACtB,YAAA,MAAM,IAAIC,eAAAA,CAAgB,uBAAA,CAAA;AAC5B,QAAA;AAEAqB,QAAAA,aAAAA,CAAc9B,MAAMmB,IAAI,EAAA,CAAA;;QAIxB,OAAOrB,eAAAA,CAAgBC,KAAAA,EAAOC,KAAAA,CAAMmB,IAAI,EAAA,CAAA;AAC1C,IAAA,CAAA;AAEA,IAAA,MAAM8B,8BAA8B,CAACL,SAAAA,GAAAA;AACnC,QAAA,MAAMY,kBAA2B,EAAC;AAClC,QAAA,KAAK,MAAMzD,KAAAA,IAASJ,MAAAA,CAAOsB,IAAI,CAAC2B,SAAAA,CAAAA,CAAY;YAC1C,MAAM5C,KAAAA,GAAQ4C,SAAS,CAAC7C,KAAAA,CAAM;;AAG9B,YAAA,IAAIV,cAAcW,KAAAA,CAAAA,EAAQ;AACxB,gBAAA,MAAMyD,SAASR,2BAAAA,CAA4BjD,KAAAA,CAAAA;gBAE3C,IAAI,CAACgB,eAAeyC,MAAAA,CAAAA,EAAS;oBAC3BD,eAAe,CAACzD,MAAM,GAAG0D,MAAAA;AAC3B,gBAAA;YACF,CAAA,MAAO,IAAI,OAAOzD,KAAAA,KAAU,QAAA,EAAU;gBACpC,MAAM0D,YAAAA,GAAe1D,MAAMmB,IAAI,EAAA;gBAE/B,IAAIuC,YAAAA,CAAalD,MAAM,GAAG,CAAA,EAAG;oBAC3BsB,aAAAA,CAAc4B,YAAAA,CAAAA;oBACdF,eAAe,CAACzD,MAAM,GAAG2D,YAAAA;AAC3B,gBAAA;YACF,CAAA,MAAO;AACL,gBAAA,MAAM,IAAIjD,eAAAA,CACR,CAAC,gDAAgD,EAAE,OAAOT,KAAAA,CAAAA,CAAO,CAAA;AAErE,YAAA;AACF,QAAA;QAEA,OAAOwD,eAAAA;AACT,IAAA,CAAA;IAEA,MAAMG,gBAAAA,GAAmB,CAACC,KAAAA,EAAcC,SAAAA,GAAAA;QACtC,IAAI,CAACC,QAAQD,SAAAA,CAAAA,EAAY;AACvB,YAAA;AACF,QAAA;QAEA,MAAMxC,OAAAA,GAAUD,iBAAiBuB,sBAAAA,CAAuBkB,SAAAA,CAAAA,CAAAA;AAExD,QAAA,IAAIxC,YAAYK,SAAAA,EAAW;AACzBkC,YAAAA,KAAAA,CAAMvC,OAAO,GAAGA,OAAAA;AAClB,QAAA;AACF,IAAA,CAAA;AAEA;;MAGA,MAAM0C,0BAA0B,CAACC,UAAAA,GAAAA;AAC/B,QAAA,MAAMC,iBAAiBC,QAAAA,CAASF,UAAAA,CAAAA;AAEhC,QAAA,IAAI,CAACzE,UAAAA,CAAE4E,SAAS,CAACF,cAAAA,CAAAA,IAAmBA,iBAAiB,CAAA,EAAG;AACtD,YAAA,MAAM,IAAIxD,eAAAA,CACR,CAAC,wDAAwD,EAAEwD,cAAAA,CAAAA,CAAgB,CAAA;AAE/E,QAAA;QAEA,OAAOA,cAAAA;AACT,IAAA,CAAA;AAEA;;MAGA,MAAMG,0BAA0B,CAACC,UAAAA,GAAAA;AAC/B,QAAA,MAAMC,iBAAiBJ,QAAAA,CAASG,UAAAA,CAAAA;QAEhC,IAAI,CAAC9E,WAAE4E,SAAS,CAACG,mBAAoBA,cAAAA,KAAmB,EAAC,IAAKA,cAAAA,GAAiB,CAAA,EAAI;AACjF,YAAA,MAAM,IAAI7D,eAAAA,CACR,CAAC,wDAAwD,EAAE6D,cAAAA,CAAAA,CAAgB,CAAA;AAE/E,QAAA;QAEA,IAAIA,cAAAA,KAAmB,EAAC,EAAG;YACzB,OAAO5C,SAAAA;AACT,QAAA;QAEA,OAAO4C,cAAAA;AACT,IAAA,CAAA;AAEA,IAAA,MAAMC,yBAAyB,CAACC,IAAAA,GAAAA;AAC9B,QAAA,MAAMC,UAAUP,QAAAA,CAASM,IAAAA,CAAAA;AAEzB,QAAA,IAAI,CAACL,SAAAA,CAAUM,OAAAA,CAAAA,IAAYA,OAAAA,IAAW,CAAA,EAAG;AACvC,YAAA,MAAM,IAAIC,eAAAA,CACR,CAAC,6DAA6D,EAAEF,IAAAA,CAAAA,CAAM,CAAA;AAE1E,QAAA;QAEA,OAAOC,OAAAA;AACT,IAAA,CAAA;;IAGA,MAAME,0BAAAA,GAA6B,CAACC,QAAAA,EAAmBC,KAAAA,GAAAA;AACrD,QAAA,MAAMC,cAAcZ,QAAAA,CAASU,QAAAA,CAAAA;AAE7B,QAAA,IAAI,CAACT,SAAAA,CAAUW,WAAAA,CAAAA,IAAgBA,WAAAA,IAAe,CAAA,EAAG;AAC/C,YAAA,MAAM,IAAIJ,eAAAA,CACR,CAAC,iEAAiE,EAAEE,QAAAA,CAAAA,CAAU,CAAA;AAElF,QAAA;QAEA,OAAOE,WAAAA;AACT,IAAA,CAAA;AAEA,IAAA,MAAMC,wBAAAA,GAA2B,CAC/BP,IAAAA,EACAI,QAAAA,EACAI,KAAAA,EACAC,KAAAA,GAAAA;AAEA,QAAA,MAAMC,gBAAAA,GAAmB,CAACC,KAAAA,CAAMX,IAAAA,CAAAA,IAAS,CAACW,KAAAA,CAAMP,QAAAA,CAAAA;AAChD,QAAA,MAAMQ,kBAAAA,GAAqB,CAACD,KAAAA,CAAMH,KAAAA,CAAAA,IAAU,CAACG,KAAAA,CAAMF,KAAAA,CAAAA;AAEnD,QAAA,IAAIC,oBAAoBE,kBAAAA,EAAoB;AAC1C,YAAA,MAAM,IAAIV,eAAAA,CACR,uGAAA,CAAA;AAEJ,QAAA;AACF,IAAA,CAAA;;AAGA,IAAA,MAAMW,0BAAAA,GAA6B,CACjCC,QAAAA,EACAC,MAAAA,EACAC,QAAQ,CAAC,GAAA;QAET,IAAIA,KAAAA,KAAU,CAAA,IAAKF,QAAAA,KAAa,GAAA,EAAK;YACnC,OAAO,IAAA;AACT,QAAA;QAEA,IAAI,OAAOA,aAAa,QAAA,EAAU;YAChC,OAAOA,QAAAA,CAAS/B,KAAK,CAAC,GAAA,CAAA,CAAKP,GAAG,CAAC,CAAC1D,KAAAA,GAAUC,UAAAA,CAAE4B,IAAI,CAAC7B,KAAAA,CAAAA,CAAAA;AACnD,QAAA;QAEA,IAAIgC,KAAAA,CAAMC,OAAO,CAAC+D,QAAAA,CAAAA,EAAW;;AAE3B,YAAA,OAAO/F,WAAEkG,IAAI,CACXH,QAAAA,CAASxC,OAAO,CAAC,CAACxD,KAAAA,GAAAA;gBAChB,IAAI,OAAOA,UAAU,QAAA,EAAU;AAC7B,oBAAA,MAAM,IAAIuC,oBAAAA,EAAAA;AACZ,gBAAA;gBAEA,OAAOvC,KAAAA,CAAMiE,KAAK,CAAC,GAAA,CAAA,CAAKP,GAAG,CAAC,CAAC1D,KAAAA,GAAUC,UAAAA,CAAE4B,IAAI,CAAC7B,KAAAA,CAAAA,CAAAA;AAChD,YAAA,CAAA,CAAA,CAAA;AAEJ,QAAA;QAEA,IAAIC,UAAAA,CAAEF,aAAa,CAACiG,QAAAA,CAAAA,EAAW;AAC7B,YAAA,OAAOI,sBAAsBJ,QAAAA,EAAUC,MAAAA,CAAAA;AACzC,QAAA;AAEA,QAAA,MAAM,IAAI1D,oBAAAA,EAAAA;AACZ,IAAA,CAAA;AAEA,IAAA,MAAM8D,6BAA6B,CACjCL,QAAAA,GAAAA;QAEA,OAAO,OAAOA,aAAa,QAAA,IAAY,IAAA,IAAQA,YAAY,CAACH,KAAAA,CAAMG,SAASM,EAAE,CAAA;AAC/E,IAAA,CAAA;AAEA,IAAA,MAAMC,kBAAkB,CACtBP,QAAAA,GAAAA;QAEA,OACE,OAAOA,aAAa,QAAA,IAAY,OAAA,IAAWA,YAAY,OAAOA,QAAAA,CAASQ,KAAK,KAAK,SAAA;AAErF,IAAA,CAAA;IAEA,MAAMJ,qBAAAA,GAAwB,CAACJ,QAAAA,EAAoCC,MAAAA,GAAAA;AACjE,QAAA,IAAI,CAACA,MAAAA,EAAQ;AACX,YAAA,OAAO,EAAC;AACV,QAAA;QAEA,MAAM,EAAEQ,UAAU,EAAE,GAAGR,MAAAA;QACvB,OAAO5F,MAAAA,CAAOW,OAAO,CAACgF,QAAAA,CAAAA,CAAUU,MAAM,CAAC,CAACC,GAAAA,EAAK,CAACvG,GAAAA,EAAKwG,WAAAA,CAAY,GAAA;;YAE7D,IAAI3G,UAAAA,CAAEwC,QAAQ,CAACmE,WAAAA,CAAAA,EAAc;gBAC3B,IAAI;AACF,oBAAA,MAAMC,uBAAuB/D,SAAAA,CAAU;wBAAEC,IAAAA,EAAM,SAAA;wBAAW/C,KAAAA,EAAO4G;AAAY,qBAAA,CAAA;;AAE7E,oBAAA,OAAOC,oBAAAA,GAAuB;AAAE,wBAAA,GAAGF,GAAG;AAAE,wBAAA,CAACvG,MAAM;qBAAK,GAAIuG,GAAAA;AAC1D,gBAAA,CAAA,CAAE,OAAM;;AAER,gBAAA;AACF,YAAA;YAEA,IAAI1G,UAAAA,CAAE6G,SAAS,CAACF,WAAAA,CAAAA,EAAc;;AAE5B,gBAAA,OAAOA,gBAAgB,IAAA,GAAO;AAAE,oBAAA,GAAGD,GAAG;AAAE,oBAAA,CAACvG,MAAM;iBAAK,GAAIuG,GAAAA;AAC1D,YAAA;YAEA,MAAMI,SAAAA,GAAYN,UAAU,CAACrG,GAAAA,CAAI;AAEjC,YAAA,IAAI,CAAC2G,SAAAA,EAAW;gBACd,OAAOJ,GAAAA;AACT,YAAA;;YAGA,MAAMK,8BAAAA,GACJC,sBAAAA,CAAuBF,SAAAA,CAAAA,IAAcG,4BAAAA,CAA6BH,SAAAA,CAAAA;AAEpE,YAAA,IAAIC,8BAAAA,EAAgC;gBAClC,MAAMG,oBAAAA,GAAuB9G,OAAOsB,IAAI,CAACiF,aAAaQ,IAAI,CACxD,CAAChH,GAAAA,GAAQ,CAAC;AAAC,wBAAA,UAAA;AAAY,wBAAA,IAAA;AAAM,wBAAA;AAAQ,qBAAA,CAACsC,QAAQ,CAACtC,GAAAA,CAAAA,CAAAA;AAGjD,gBAAA,IAAI+G,oBAAAA,EAAsB;oBACxB,MAAM,IAAIhG,gBACR,CAAC,4BAA4B,EAAE8E,MAAAA,CAAOoB,IAAI,EAAEC,YAAAA,CAAa,CAAC,EAAElH,IAAI,EAAE,EAAE6F,OAAOsB,GAAG,CAAC,mDAAmD,EAAEC,IAAAA,CAAKC,SAAS,CAACb,WAAAA,CAAAA,CAAAA,CAAc,CAAA;AAErK,gBAAA;AAEA;;;;YAKA,IACE,UAAA,IAAcA,WAAAA,IACd,CAACf,KAAAA,CAAMe,WAAAA,CAAYZ,QAAQ,CAAA,IAC3BY,WAAAA,CAAYZ,QAAQ,KAAK,GAAA,EACzB;AACA,oBAAA,MAAM,IAAI7E,eAAAA,CACR,CAAC,+FAA+F,CAAC,GAC/F,CAAC,0GAA0G,CAAC,GAC5G,CAAC,qEAAqE,CAAC,CAAA;AAE7E,gBAAA;;AAGA,gBAAA,MAAMuG,iBAAiB,EAAC;;AAGxB,gBAAA,IAAI,UAAA,IAAcd,WAAAA,IAAeA,WAAAA,CAAYZ,QAAQ,KAAK,GAAA,EAAK;oBAC7D3F,MAAAA,CAAOsH,MAAM,CAACD,cAAAA,EAAgB;wBAAE1B,QAAAA,EAAU;AAAK,qBAAA,CAAA;AACjD,gBAAA;;AAGA,gBAAA,IAAIK,2BAA2BO,WAAAA,CAAAA,EAAc;;;oBAG3CvG,MAAAA,CAAOsH,MAAM,CAACD,cAAAA,EAAgB;AAC5BpB,wBAAAA,EAAAA,EAAIjG,MAAAA,CAAOW,OAAO,CAAC4F,WAAAA,CAAYN,EAAE,CAAA,CAAEI,MAAM,CACvC,CAACC,GAAAA,EAAK,CAAC5D,IAAAA,EAAM6E,eAAAA,CAAgB,IAAM;AACjC,gCAAA,GAAGjB,GAAG;AACN,gCAAA,CAAC5D,IAAAA,GAAO8E,qBAAAA,CAAsBD,eAAAA,EAAiBxE,QAAAA,CAASL,IAAAA,CAAAA;AAC1D,6BAAA,GACA,EAAC;AAEL,qBAAA,CAAA;AACF,gBAAA;;AAGA,gBAAA,IAAIwD,gBAAgBK,WAAAA,CAAAA,EAAc;oBAChCvG,MAAAA,CAAOsH,MAAM,CAACD,cAAAA,EAAgB;AAAElB,wBAAAA,KAAAA,EAAOI,YAAYJ;AAAM,qBAAA,CAAA;AAC3D,gBAAA;gBAEA,OAAO;AAAE,oBAAA,GAAGG,GAAG;AAAE,oBAAA,CAACvG,MAAMsH;AAAe,iBAAA;AACzC,YAAA;;YAGA,IAAI,CAACV,8BAAAA,IAAkCX,0BAAAA,CAA2BO,WAAAA,CAAAA,EAAc;AAC9E,gBAAA,MAAM,IAAIzF,eAAAA,CACR,CAAC,8CAA8C,EAAEf,GAAAA,CAAI,MAAM,EAAE6F,MAAAA,CAAOsB,GAAG,CAAC,CAAC,CAAC,CAAA;AAE9E,YAAA;;;;YAKA,IAAIO,eAAAA;YAEJ,IAAIf,SAAAA,CAAUhE,IAAI,KAAK,UAAA,EAAY;AACjC+E,gBAAAA,eAAAA,GAAkBf,UAAUgB,MAAM;AACpC,YAAA,CAAA,MAAO,IAAIhB,SAAAA,CAAUhE,IAAI,KAAK,WAAA,EAAa;AACzC+E,gBAAAA,eAAAA,GAAkBf,UAAUiB,SAAS;AACvC,YAAA,CAAA,MAAO,IAAIjB,SAAAA,CAAUhE,IAAI,KAAK,OAAA,EAAS;gBACrC+E,eAAAA,GAAkB,qBAAA;YACpB,CAAA,MAAO;gBACL,OAAOnB,GAAAA;AACT,YAAA;AAEA,YAAA,MAAMsB,eAAe7E,QAAAA,CAAS0E,eAAAA,CAAAA;;AAG9B,YAAA,IAAI,CAACG,YAAAA,EAAc;gBACjB,OAAOtB,GAAAA;AACT,YAAA;YAEA,MAAMuB,cAAAA,GAAiBL,sBAAsBjB,WAAAA,EAAaqB,YAAAA,CAAAA;AAE1D,YAAA,IAAI,CAACC,cAAAA,EAAgB;gBACnB,OAAOvB,GAAAA;AACT,YAAA;YAEA,OAAO;AACL,gBAAA,GAAGA,GAAG;AACN,gBAAA,CAACvG,MAAM8H;AACT,aAAA;AACF,QAAA,CAAA,EAAG,EAAC,CAAA;AACN,IAAA,CAAA;IAEA,MAAML,qBAAAA,GAAwB,CAACjB,WAAAA,EAA6CX,MAAAA,GAAAA;QAC1E,IAAIhG,UAAAA,CAAEwC,QAAQ,CAACmE,WAAAA,CAAAA,EAAc;AAC3B,YAAA,OAAO9D,SAAAA,CAAU;gBAAEC,IAAAA,EAAM,SAAA;gBAAW/C,KAAAA,EAAO4G,WAAAA;gBAAauB,SAAAA,EAAW;AAAK,aAAA,CAAA;AAC1E,QAAA;QAEA,IAAIlI,UAAAA,CAAE6G,SAAS,CAACF,WAAAA,CAAAA,EAAc;YAC5B,OAAOA,WAAAA;AACT,QAAA;QAEA,IAAI,CAAC7G,cAAc6G,WAAAA,CAAAA,EAAc;AAC/B,YAAA,MAAM,IAAIzF,eAAAA,CAAgB,CAAC,kDAAkD,CAAC,CAAA;AAChF,QAAA;QAEA,MAAM,EAAEiH,IAAI,EAAEC,OAAO,EAAEC,MAAM,EAAEtC,QAAQ,EAAEQ,KAAK,EAAEvD,QAAQ,EAAEiC,IAAI,EAAEI,QAAQ,EAAEI,KAAK,EAAEC,KAAK,EAAE,GACtFiB,WAAAA;AAEF,QAAA,MAAMtC,QAAe,EAAC;AAEtBD,QAAAA,gBAAAA,CAAiBC,KAAAA,EAAO8D,IAAAA,CAAAA;AAExB,QAAA,IAAIC,OAAAA,EAAS;YACX/D,KAAAA,CAAMiE,KAAK,GAAGC,yBAAAA,CAA0BH,OAAAA,EAASpC,MAAAA,CAAAA;AACnD,QAAA;AAEA,QAAA,IAAIqC,MAAAA,EAAQ;YACVhE,KAAAA,CAAMmE,MAAM,GAAGC,wBAAAA,CAAyBJ,MAAAA,EAAQrC,MAAAA,CAAAA;AAClD,QAAA;AAEA,QAAA,IAAID,QAAAA,EAAU;YACZ1B,KAAAA,CAAM0B,QAAQ,GAAGD,0BAAAA,CAA2BC,QAAAA,EAAUC,MAAAA,CAAAA;AACxD,QAAA;AAEA,QAAA,IAAIO,KAAAA,EAAO;YACTlC,KAAAA,CAAMkC,KAAK,GAAG5D,uBAAAA,CAAwB4D,KAAAA,CAAAA;AACxC,QAAA;AAEA,QAAA,IAAIvD,QAAAA,EAAU;YACZqB,KAAAA,CAAMrB,QAAQ,GAAGD,0BAAAA,CAA2BC,QAAAA,CAAAA;AAC9C,QAAA;QAEAwC,wBAAAA,CAAyBP,IAAAA,EAAMI,UAAUI,KAAAA,EAAOC,KAAAA,CAAAA;QAEhD,IAAI,CAACE,MAAMX,IAAAA,CAAAA,EAAO;YAChBZ,KAAAA,CAAMY,IAAI,GAAGD,sBAAAA,CAAuBC,IAAAA,CAAAA;AACtC,QAAA;QAEA,IAAI,CAACW,MAAMP,QAAAA,CAAAA,EAAW;YACpBhB,KAAAA,CAAMgB,QAAQ,GAAGD,0BAAAA,CAA2BC,QAAUJ,CAAAA;AACxD,QAAA;QAEA,IAAI,CAACW,MAAMH,KAAAA,CAAAA,EAAQ;YACjBpB,KAAAA,CAAMqE,MAAM,GAAGlE,uBAAAA,CAAwBiB,KAAAA,CAAAA;AACzC,QAAA;QAEA,IAAI,CAACG,MAAMF,KAAAA,CAAAA,EAAQ;YACjBrB,KAAAA,CAAMqB,KAAK,GAAGb,uBAAAA,CAAwBa,KAAAA,CAAAA;AACxC,QAAA;QAEA,OAAOrB,KAAAA;AACT,IAAA,CAAA;;AAGA,IAAA,MAAMoE,wBAAAA,GAA2B,CAC/BJ,MAAAA,EACArC,MAAAA,EACAC,QAAQ,CAAC,GAAA;QAET,IAAIA,KAAAA,KAAU,CAAA,IAAKoC,MAAAA,KAAW,GAAA,EAAK;YACjC,OAAOlG,SAAAA;AACT,QAAA;QAEA,IAAI,OAAOkG,WAAW,QAAA,EAAU;YAC9B,MAAMM,YAAAA,GAAeN,MAAAA,CAAOrE,KAAK,CAAC,GAAA,CAAA,CAAKP,GAAG,CAAC,CAAC1D,KAAAA,GAAUC,UAAAA,CAAE4B,IAAI,CAAC7B,KAAAA,CAAAA,CAAAA;;YAG7D,IAAIiG,MAAAA,EAAQ4C,cAAc,aAAA,EAAe;gBACvC,OAAO5I,UAAAA,CAAEkG,IAAI,CAAC;AAACxG,oBAAAA,YAAAA;AAAcC,oBAAAA,gBAAAA;AAAqBgJ,oBAAAA,GAAAA;AAAa,iBAAA,CAAA;AACjE,YAAA;YACA,OAAO3I,UAAAA,CAAEkG,IAAI,CAAC;AAACxG,gBAAAA,YAAAA;AAAiBiJ,gBAAAA,GAAAA;AAAa,aAAA,CAAA;AAC/C,QAAA;AAEA,QAAA,IAAI1F,cAAcoF,MAAAA,CAAAA,EAAS;;AAEzB,YAAA,MAAMM,eAAeN,MAAAA,CAClB9E,OAAO,CAAC,CAACxD,QAAU0I,wBAAAA,CAAyB1I,KAAAA,EAAOiG,MAAAA,EAAQC,KAAAA,GAAQ,IACnE/D,MAAM,CAAC,CAAC2G,CAAAA,GAAM,CAACjD,KAAAA,CAAMiD,CAAAA,CAAAA,CAAAA;;YAGxB,IAAI7C,MAAAA,EAAQ4C,cAAc,aAAA,EAAe;gBACvC,OAAO5I,UAAAA,CAAEkG,IAAI,CAAC;AAACxG,oBAAAA,YAAAA;AAAcC,oBAAAA,gBAAAA;AAAqBgJ,oBAAAA,GAAAA;AAAa,iBAAA,CAAA;AACjE,YAAA;YACA,OAAO3I,UAAAA,CAAEkG,IAAI,CAAC;AAACxG,gBAAAA,YAAAA;AAAiBiJ,gBAAAA,GAAAA;AAAa,aAAA,CAAA;AAC/C,QAAA;AAEA,QAAA,MAAM,IAAIzH,eAAAA,CAAgB,oEAAA,CAAA;AAC5B,IAAA,CAAA;IAEA,MAAM4H,sBAAAA,GAAyB,CAAC3I,GAAAA,EAAa6F,MAAAA,GAAAA;QAC3C,IAAI;AAACrG,YAAAA,gBAAAA;AAAkBD,YAAAA;SAAa,CAAC+C,QAAQ,CAACtC,GAAAA,CAAAA,EAAM;YAClD,OAAO,IAAA;AACT,QAAA;AAEA,QAAA,IAAI,CAAC6F,MAAAA,EAAQ;YACX,OAAO,KAAA;AACT,QAAA;AAEA,QAAA,OAAO5F,OAAOsB,IAAI,CAACsE,OAAOQ,UAAU,CAAA,CAAE/D,QAAQ,CAACtC,GAAAA,CAAAA;AACjD,IAAA,CAAA;IAEA,MAAMoI,yBAAAA,GAA4B,CAACH,OAAAA,EAAwBpC,MAAAA,GAAAA;;;QAGzD,IAAI,CAAC+C,SAASX,OAAAA,CAAAA,EAAU;AACtB,YAAA,MAAM,IAAIlH,eAAAA,CAAgB,qDAAA,CAAA;AAC5B,QAAA;;AAGA,QAAA,MAAM8H,cAAcC,SAAAA,CAAUb,OAAAA,CAAAA;AAE9B,QAAA,OAAOc,0BAA0BF,WAAAA,EAAahD,MAAAA,CAAAA;AAChD,IAAA,CAAA;IAEA,MAAMkD,yBAAAA,GAA4B,CAACd,OAAAA,EAAwBpC,MAAAA,GAAAA;QACzD,IAAIjE,KAAAA,CAAMC,OAAO,CAACoG,OAAAA,CAAAA,EAAU;AAC1B,YAAA,OACEA,OACE;AACC3E,aAAAA,GAAG,CAAC,CAACvB,MAAAA,GAAWgH,yBAAAA,CAA0BhH,MAAAA,EAAQ8D,QACnD;AACC9D,aAAAA,MAAM,CAAC,CAACA,MAAAA,GAAW,CAACpC,aAAAA,CAAcoC,MAAAA,CAAAA,IAAW,CAACiH,OAAAA,CAAQjH,MAAAA,CAAAA,CAAAA;AAE7D,QAAA;QAEA,IAAI,CAACpC,cAAcsI,OAAAA,CAAAA,EAAU;YAC3B,OAAOA,OAAAA;AACT,QAAA;AAEA,QAAA,MAAMgB,iBAAiB,CAACC,QAAAA,GAAqB,OAAOjB,OAAO,CAACiB,QAAAA,CAAS;;QAGrE,KAAK,MAAM,CAAClJ,GAAAA,EAAKJ,KAAAA,CAAM,IAAIK,MAAAA,CAAOW,OAAO,CAACqH,OAAAA,CAAAA,CAAU;YAClD,MAAMtB,SAAAA,GAAYwC,GAAAA,CAAInJ,GAAAA,EAAK6F,MAAAA,EAAQQ,UAAAA,CAAAA;AACnC,YAAA,MAAM+C,QAAAA,GAAWC,UAAAA,CAAWrJ,GAAAA,CAAAA,IAAQ2I,sBAAAA,CAAuB3I,GAAAA,EAAK6F,MAAAA,CAAAA;AAEhE,YAAA,IAAI,CAACuD,QAAAA,EAAU;gBACbH,cAAAA,CAAejJ,GAAAA,CAAAA;AACjB,YAAA,CAAA,MAEK,IAAI2G,SAAAA,EAAW;;gBAElB,IAAIA,SAAAA,CAAUhE,IAAI,KAAK,UAAA,EAAY;AACjCsF,oBAAAA,OAAO,CAACjI,GAAAA,CAAI,GAAG+I,0BAA0BnJ,KAAAA,EAAOoD,QAAAA,CAAS2D,UAAUgB,MAAM,CAAA,CAAA;AAC3E,gBAAA,CAAA,MAGK,IAAIhB,SAAAA,CAAUhE,IAAI,KAAK,WAAA,EAAa;AACvCsF,oBAAAA,OAAO,CAACjI,GAAAA,CAAI,GAAG+I,0BAA0BnJ,KAAAA,EAAOoD,QAAAA,CAAS2D,UAAUiB,SAAS,CAAA,CAAA;AAC9E,gBAAA,CAAA,MAGK,IAAIjB,SAAAA,CAAUhE,IAAI,KAAK,OAAA,EAAS;AACnCsF,oBAAAA,OAAO,CAACjI,GAAAA,CAAI,GAAG+I,yBAAAA,CAA0BnJ,OAAOoD,QAAAA,CAAS,qBAAA,CAAA,CAAA;AAC3D,gBAAA,CAAA,MAGK,IAAI2D,SAAAA,CAAUhE,IAAI,KAAK,aAAA,EAAe;oBACzCsG,cAAAA,CAAejJ,GAAAA,CAAAA;AACjB,gBAAA,CAAA,MAGK,IAAI2G,SAAAA,CAAUhE,IAAI,KAAK,UAAA,EAAY;;oBAEtCsG,cAAAA,CAAejJ,GAAAA,CAAAA;gBACjB,CAAA,MAGK;AACHiI,oBAAAA,OAAO,CAACjI,GAAAA,CAAI,GAAG+I,yBAAAA,CAA0BnJ,KAAAA,EAAOiG,MAAAA,CAAAA;AAClD,gBAAA;AACF,YAAA,CAAA,MAGK,IAAI;AAAC,gBAAA,OAAA;AAAS,gBAAA;aAAW,CAACvD,QAAQ,CAACtC,GAAAA,CAAAA,EAAM;gBAC5CiI,OAAO,CAACjI,GAAAA,CAAI,GAAG0C,SAAAA,CAAU;oBAAEC,IAAAA,EAAM,SAAA;oBAAW/C,KAAAA,EAAOqI,OAAO,CAACjI,GAAAA,CAAI;oBAAE+H,SAAAA,EAAW;AAAK,iBAAA,CAAA;YACnF,CAAA,MAAO,IAAIa,SAAShJ,KAAAA,CAAAA,EAAQ;AAC1BqI,gBAAAA,OAAO,CAACjI,GAAAA,CAAI,GAAG+I,yBAAAA,CAA0BnJ,KAAAA,EAAOiG,MAAAA,CAAAA;AAClD,YAAA;;YAGA,IAAIlG,aAAAA,CAAcsI,OAAO,CAACjI,GAAAA,CAAI,KAAKgJ,OAAAA,CAAQf,OAAO,CAACjI,GAAAA,CAAI,CAAA,EAAG;gBACxDiJ,cAAAA,CAAejJ,GAAAA,CAAAA;AACjB,YAAA;AACF,QAAA;QAEA,OAAOiI,OAAAA;AACT,IAAA,CAAA;AAEA,IAAA,MAAMqB,mBAAAA,GAAsB,CAACC,MAAAA,EAAgCrF,KAAAA,GAAe,EAAE,GAAA;;AAE5EA,QAAAA,KAAAA,CAAM+D,OAAO,GAAG,CAAC,EAAEuB,IAAI,EAAmB,GAAA;YACxC,MAAMC,WAAAA,GAAczG,QAAAA,CAASwG,IAAAA,CAAKrC,GAAG,CAAA;;AAGrC,YAAA,IAAI,CAACsC,WAAAA,IAAe,CAACC,kBAAAA,CAAmBD,WAAAA,CAAAA,EAAc;AACpD,gBAAA,OAAO,EAAC;AACV,YAAA;YAEA,OAAO;AAAE,gBAAA,CAAChK,yBAAyB;AAAEkK,oBAAAA,KAAAA,EAAOJ,MAAAA,KAAW;AAAQ;AAAE,aAAA;AACnE,QAAA,CAAA;AACF,IAAA,CAAA;IAEA,MAAMK,oBAAAA,GAAuB,CAACzC,GAAAA,EAAa0C,MAAAA,GAAAA;;AAEzC,QAAA,MAAMhE,SAAS7C,QAAAA,CAASmE,GAAAA,CAAAA;AAExB,QAAA,MAAMjD,QAAe,EAAC;QAEtB,MAAM,EACJ4F,EAAAA,EAAIC,WAAW,EACf/B,IAAI,EACJC,OAAO,EACPC,MAAM,EACNtC,QAAQ,EACRd,IAAI,EACJI,QAAQ,EACRI,KAAK,EACLC,KAAK,EACLgE,MAAM,EACN,GAAGS,IAAAA,EACJ,GAAGH,MAAAA;QAEJ,IAAI,CAACpE,MAAM8D,MAAAA,CAAAA,EAAS;AAClBD,YAAAA,mBAAAA,CAAoBC,MAAAA,EAAQrF,KAAAA,CAAAA;AAC9B,QAAA;QAEA,IAAI,CAACuB,MAAMsE,WAAAA,CAAAA,EAAc;AACvB7F,YAAAA,KAAAA,CAAM4F,EAAE,GAAGC,WAAAA;AACb,QAAA;AAEA9F,QAAAA,gBAAAA,CAAiBC,KAAAA,EAAO8D,IAAAA,CAAAA;QAExB,IAAI,CAACvC,MAAMwC,OAAAA,CAAAA,EAAU;YACnB/D,KAAAA,CAAMiE,KAAK,GAAGC,yBAAAA,CAA0BH,OAAAA,EAASpC,MAAAA,CAAAA;AACnD,QAAA;QAEA,IAAI,CAACJ,MAAMyC,MAAAA,CAAAA,EAAS;YAClBhE,KAAAA,CAAMmE,MAAM,GAAGC,wBAAAA,CAAyBJ,MAAAA,EAAQrC,MAAAA,CAAAA;AAClD,QAAA;QAEA,IAAI,CAACJ,MAAMG,QAAAA,CAAAA,EAAW;YACpB1B,KAAAA,CAAM0B,QAAQ,GAAGD,0BAAAA,CAA2BC,QAAAA,EAAUC,MAAAA,CAAAA;AACxD,QAAA;QAEAR,wBAAAA,CAAyBP,IAAAA,EAAMI,UAAUI,KAAAA,EAAOC,KAAAA,CAAAA;QAEhD,IAAI,CAACE,MAAMX,IAAAA,CAAAA,EAAO;YAChBZ,KAAAA,CAAMY,IAAI,GAAGD,sBAAAA,CAAuBC,IAAAA,CAAAA;AACtC,QAAA;QAEA,IAAI,CAACW,MAAMP,QAAAA,CAAAA,EAAW;YACpBhB,KAAAA,CAAMgB,QAAQ,GAAGD,0BAAAA,CAA2BC,QAAUJ,CAAAA;AACxD,QAAA;QAEA,IAAI,CAACW,MAAMH,KAAAA,CAAAA,EAAQ;YACjBpB,KAAAA,CAAMqE,MAAM,GAAGlE,uBAAAA,CAAwBiB,KAAAA,CAAAA;AACzC,QAAA;QAEA,IAAI,CAACG,MAAMF,KAAAA,CAAAA,EAAQ;YACjBrB,KAAAA,CAAMqB,KAAK,GAAGb,uBAAAA,CAAwBa,KAAAA,CAAAA;AACxC,QAAA;QAEA,OAAO;AACL,YAAA,GAAGyE,IAAI;AACP,YAAA,GAAG9F;AACL,SAAA;AACF,IAAA,CAAA;IAEA,OAAO;QACL+F,8BAAAA,EAAgChH,sBAAAA;QAChCiH,+BAAAA,EAAiC7F,uBAAAA;QACjC8F,+BAAAA,EAAiCzF,uBAAAA;QACjC0F,kCAAAA,EAAoCzE,0BAAAA;QACpC0E,iCAAAA,EAAmCjC,yBAAAA;QACnCkC,gCAAAA,EAAkChC,wBAAAA;AAClCsB,QAAAA;AACF,KAAA;AACF;;;;"}
|
|
1
|
+
{"version":3,"file":"convert-query-params.mjs","sources":["../src/convert-query-params.ts"],"sourcesContent":["/* eslint-disable max-classes-per-file */\n\n/**\n * Converts the standard Strapi REST query params to a more usable format for querying\n * You can read more here: https://docs.strapi.io/developer-docs/latest/developer-resources/database-apis-reference/rest-api.html#filters\n */\n\nimport _, { cloneDeep, get, isEmpty, isObject, isString, toNumber } from 'lodash';\nimport {\n constants,\n hasDraftAndPublish,\n isDynamicZoneAttribute,\n isMorphToRelationalAttribute,\n} from './content-types';\nimport { PaginationError, ValidationError } from './errors';\nimport { isOperator } from './operators';\n\nimport parseType from './parse-type';\nimport type { PublicationFilterMode } from './publication-filter';\nimport {\n getMeaningfulSortSegments,\n hasSort,\n type SortParams,\n type SortParamsObject,\n} from './sort-query';\nimport { Model } from './types';\n\nexport type { SortParams, SortParamsObject } from './sort-query';\n\nconst { ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, PUBLISHED_AT_ATTRIBUTE } = constants;\n\ntype SortOrder = 'asc' | 'desc';\n\nexport interface SortMap {\n [key: string]: SortOrder | SortMap;\n}\n\ntype FieldsParams = string | string[];\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => _.isPlainObject(value);\n\nconst hasOwnProperty = (object: object, key: PropertyKey): boolean =>\n Object.prototype.hasOwnProperty.call(object, key);\n\nconst setSortMapValue = (field: string, order: SortOrder): SortMap => {\n const path = _.toPath(field);\n const sortMap: SortMap = {};\n let current: SortMap | SortMap[] = sortMap;\n\n for (const [index, key] of path.entries()) {\n const isLastSegment = index === path.length - 1;\n\n if (key === 'prototype' || (key in current && !hasOwnProperty(current, key))) {\n throw new ValidationError('Invalid sort query');\n }\n\n if (isLastSegment) {\n Object.defineProperty(current, key, {\n configurable: true,\n enumerable: true,\n value: order,\n writable: true,\n });\n continue;\n }\n\n const nextValue = /^\\d+$/.test(path[index + 1]) ? [] : {};\n\n Object.defineProperty(current, key, {\n configurable: true,\n enumerable: true,\n value: nextValue,\n writable: true,\n });\n\n current = nextValue;\n }\n\n return sortMap;\n};\n\nfunction isEmptySortMap(sortMap: SortMap): boolean {\n const keys = Object.keys(sortMap);\n\n if (keys.length === 0) {\n return true;\n }\n\n return keys.every((key) => {\n const value = sortMap[key];\n\n if (typeof value === 'string') {\n return value.trim().length === 0;\n }\n\n if (isPlainObject(value)) {\n return isEmptySortMap(value as SortMap);\n }\n\n return true;\n });\n}\n\n/** Drops empty sort maps so a trailing comma does not leave a truthy but meaningless `orderBy`. */\nfunction normalizeOrderBy(orderBy: OrderByQuery): OrderByQuery | undefined {\n if (Array.isArray(orderBy)) {\n const filtered = orderBy.filter((sortMap) => !isEmptySortMap(sortMap));\n\n return filtered.length > 0 ? filtered : undefined;\n }\n\n return isEmptySortMap(orderBy) ? undefined : orderBy;\n}\n\ntype FiltersParams = unknown;\n\nexport interface PopulateAttributesParams {\n [key: string]: boolean | PopulateObjectParams;\n}\n\nexport interface PopulateObjectParams {\n sort?: SortParams;\n fields?: FieldsParams;\n filters?: FiltersParams;\n populate?: string | string[] | PopulateAttributesParams;\n on?: PopulateAttributesParams;\n count?: boolean;\n ordering?: unknown;\n _q?: string;\n limit?: number | string;\n start?: number | string;\n page?: number | string;\n pageSize?: number | string;\n}\n\ntype PopulateParams = string | string[] | PopulateAttributesParams;\n\nexport interface Params {\n sort?: SortParams;\n fields?: FieldsParams;\n filters?: FiltersParams;\n populate?: PopulateParams;\n count?: boolean;\n ordering?: unknown;\n _q?: string;\n limit?: number | string;\n start?: number | string;\n page?: number | string;\n pageSize?: number | string;\n status?: 'draft' | 'published';\n publicationFilter?: PublicationFilterMode;\n /**\n * @deprecated Replaced by `publicationFilter` (`never-published`, `has-published-version`, …).\n * Retained for backward compatibility with existing REST and GraphQL clients.\n */\n hasPublishedVersion?: boolean | 'true' | 'false';\n}\n\ntype FiltersQuery = (options: { meta: Model }) => WhereQuery | undefined;\ntype OrderByQuery = SortMap | SortMap[];\ntype SelectQuery = string | string[];\n\nexport interface WhereQuery {\n [key: string]: any;\n}\n\ntype PopulateQuery =\n | boolean\n | string[]\n | {\n [key: string]: PopulateQuery;\n };\n\nexport interface Query {\n orderBy?: OrderByQuery;\n select?: SelectQuery;\n where?: WhereQuery;\n // NOTE: those are internal DB filters do not modify\n filters?: FiltersQuery;\n populate?: PopulateQuery;\n count?: boolean;\n ordering?: unknown;\n _q?: string;\n limit?: number;\n offset?: number;\n page?: number;\n pageSize?: number;\n}\n\nclass InvalidOrderError extends ValidationError {\n constructor() {\n super('Invalid order. order can only be one of asc|desc|ASC|DESC');\n }\n}\n\nclass InvalidSortError extends ValidationError {\n constructor() {\n super(\n 'Invalid sort parameter. Expected a string, an array of strings, a sort object or an array of sort objects'\n );\n }\n}\n\nclass InvalidPopulateError extends ValidationError {\n constructor() {\n super('Invalid populate parameter. Expected a string, an array of strings, a populate object');\n }\n}\n\nfunction validateOrder(order: string): asserts order is SortOrder {\n if (!isString(order) || !['asc', 'desc'].includes(order.toLocaleLowerCase())) {\n throw new InvalidOrderError();\n }\n}\n\nconst convertCountQueryParams = (countQuery: unknown): boolean => {\n return parseType({ type: 'boolean', value: countQuery });\n};\n\nconst convertOrderingQueryParams = (ordering: unknown) => {\n return ordering;\n};\n\nconst isStringArray = (value: unknown): value is string[] =>\n Array.isArray(value) && value.every(isString);\n\ninterface TransformerOptions {\n getModel: (uid: string) => Model | undefined;\n}\n\nconst createTransformer = ({ getModel }: TransformerOptions) => {\n /**\n * Sort query parser\n */\n const convertSortQueryParams = (sortQuery: SortParams): OrderByQuery => {\n if (typeof sortQuery === 'string') {\n return convertStringSortQueryParam(sortQuery);\n }\n\n if (isStringArray(sortQuery)) {\n return sortQuery.flatMap((sortValue: string) => convertStringSortQueryParam(sortValue));\n }\n\n if (Array.isArray(sortQuery)) {\n return sortQuery.map((sortValue) => convertNestedSortQueryParam(sortValue));\n }\n\n if (isPlainObject(sortQuery)) {\n return convertNestedSortQueryParam(sortQuery);\n }\n\n throw new InvalidSortError();\n };\n\n const convertStringSortQueryParam = (sortQuery: string): SortMap[] => {\n return getMeaningfulSortSegments(sortQuery).map((segment) =>\n convertSingleSortQueryParam(segment)\n );\n };\n\n const convertSingleSortQueryParam = (sortQuery: string): SortMap => {\n const trimmed = sortQuery.trim();\n\n if (!trimmed) {\n return {};\n }\n\n if (!isString(trimmed)) {\n throw new ValidationError('Invalid sort query');\n }\n\n // split field and order param with default order to ascending\n const [rawField, order = 'asc'] = trimmed.split(':');\n const field = rawField.trim();\n\n if (field.length === 0) {\n throw new ValidationError('Field cannot be empty');\n }\n\n validateOrder(order.trim());\n\n // TODO: field should be a valid path on an object model\n\n return setSortMapValue(field, order.trim() as SortOrder);\n };\n\n const convertNestedSortQueryParam = (sortQuery: SortParamsObject): SortMap => {\n const transformedSort: SortMap = {};\n for (const field of Object.keys(sortQuery)) {\n const order = sortQuery[field];\n\n // this is a deep sort\n if (isPlainObject(order)) {\n const nested = convertNestedSortQueryParam(order as SortParamsObject);\n\n if (!isEmptySortMap(nested)) {\n transformedSort[field] = nested;\n }\n } else if (typeof order === 'string') {\n const trimmedOrder = order.trim();\n\n if (trimmedOrder.length > 0) {\n validateOrder(trimmedOrder);\n transformedSort[field] = trimmedOrder;\n }\n } else {\n throw new ValidationError(\n `Invalid sort type expected object or string got ${typeof order}`\n );\n }\n }\n\n return transformedSort;\n };\n\n const applySortToQuery = (query: Query, sortParam?: SortParams | null) => {\n if (!hasSort(sortParam)) {\n return;\n }\n\n const orderBy = normalizeOrderBy(convertSortQueryParams(sortParam));\n\n if (orderBy !== undefined) {\n query.orderBy = orderBy;\n }\n };\n\n /**\n * Start query parser\n */\n const convertStartQueryParams = (startQuery: unknown): number => {\n const startAsANumber = toNumber(startQuery);\n\n if (!_.isInteger(startAsANumber) || startAsANumber < 0) {\n throw new ValidationError(\n `convertStartQueryParams expected a positive integer got ${startAsANumber}`\n );\n }\n\n return startAsANumber;\n };\n\n /**\n * Limit query parser\n */\n const convertLimitQueryParams = (limitQuery: unknown): number | undefined => {\n const limitAsANumber = toNumber(limitQuery);\n\n if (!_.isInteger(limitAsANumber) || (limitAsANumber !== -1 && limitAsANumber < 0)) {\n throw new ValidationError(\n `convertLimitQueryParams expected a positive integer got ${limitAsANumber}`\n );\n }\n\n if (limitAsANumber === -1) {\n return undefined;\n }\n\n return limitAsANumber;\n };\n\n const convertPageQueryParams = (page: unknown): number => {\n const pageVal = toNumber(page);\n\n if (!Number.isInteger(pageVal) || pageVal <= 0) {\n throw new PaginationError(\n `Invalid 'page' parameter. Expected an integer > 0, received: ${page}`\n );\n }\n\n return pageVal;\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const convertPageSizeQueryParams = (pageSize: unknown, _page: unknown): number => {\n const pageSizeVal = toNumber(pageSize);\n\n if (!Number.isInteger(pageSizeVal) || pageSizeVal <= 0) {\n throw new PaginationError(\n `Invalid 'pageSize' parameter. Expected an integer > 0, received: ${pageSize}`\n );\n }\n\n return pageSizeVal;\n };\n\n const validatePaginationParams = (\n page: unknown,\n pageSize: unknown,\n start: unknown,\n limit: unknown\n ) => {\n const isPagePagination = page != null || pageSize != null;\n const isOffsetPagination = start != null || limit != null;\n\n if (isPagePagination && isOffsetPagination) {\n throw new PaginationError(\n 'Invalid pagination attributes. The page parameters are incorrect and must be in the pagination object'\n );\n }\n };\n\n // NOTE: we could support foo.* or foo.bar.* etc later on\n const convertPopulateQueryParams = (\n populate: PopulateParams,\n schema?: Model,\n depth = 0\n ): PopulateQuery => {\n if (depth === 0 && populate === '*') {\n return true;\n }\n\n if (typeof populate === 'string') {\n return populate.split(',').map((value) => _.trim(value));\n }\n\n if (Array.isArray(populate)) {\n // map convert\n return _.uniq(\n populate.flatMap((value) => {\n if (typeof value !== 'string') {\n throw new InvalidPopulateError();\n }\n\n return value.split(',').map((value) => _.trim(value));\n })\n );\n }\n\n if (_.isPlainObject(populate)) {\n return convertPopulateObject(populate, schema);\n }\n\n throw new InvalidPopulateError();\n };\n\n const hasPopulateFragmentDefined = (\n populate: PopulateObjectParams\n ): populate is PopulateObjectParams & Required<Pick<PopulateObjectParams, 'on'>> => {\n return typeof populate === 'object' && 'on' in populate && populate.on != null;\n };\n\n const hasCountDefined = (\n populate: PopulateObjectParams\n ): populate is PopulateObjectParams & { count: boolean } => {\n return (\n typeof populate === 'object' && 'count' in populate && typeof populate.count === 'boolean'\n );\n };\n\n const convertPopulateObject = (populate: PopulateAttributesParams, schema?: Model) => {\n if (!schema) {\n return {};\n }\n\n const { attributes } = schema;\n return Object.entries(populate).reduce((acc, [key, subPopulate]) => {\n // Try converting strings to regular booleans if possible\n if (_.isString(subPopulate)) {\n try {\n const subPopulateAsBoolean = parseType({ type: 'boolean', value: subPopulate });\n // Only true is accepted as a boolean populate value\n return subPopulateAsBoolean ? { ...acc, [key]: true } : acc;\n } catch {\n // ignore\n }\n }\n\n if (_.isBoolean(subPopulate)) {\n // Only true is accepted as a boolean populate value\n return subPopulate === true ? { ...acc, [key]: true } : acc;\n }\n\n const attribute = attributes[key];\n\n if (!attribute) {\n return acc;\n }\n\n // Allow adding an 'on' strategy to populate queries for morphTo relations and dynamic zones\n const isMorphLikeRelationalAttribute =\n isDynamicZoneAttribute(attribute) || isMorphToRelationalAttribute(attribute);\n\n if (isMorphLikeRelationalAttribute) {\n const hasInvalidProperties = Object.keys(subPopulate).some(\n (key) => !['populate', 'on', 'count'].includes(key)\n );\n\n if (hasInvalidProperties) {\n throw new ValidationError(\n `Invalid nested populate for ${schema.info?.singularName}.${key} (${schema.uid}). Expected a fragment (\"on\") or \"count\" but found ${JSON.stringify(subPopulate)}`\n );\n }\n\n /**\n * Validate nested population queries in the context of a polymorphic attribute (dynamic zone, morph relation).\n *\n * If 'populate' exists in subPopulate, its value should be constrained to a wildcard ('*').\n */\n if (\n 'populate' in subPopulate &&\n subPopulate.populate != null &&\n subPopulate.populate !== '*'\n ) {\n throw new ValidationError(\n `Invalid nested population query detected. When using 'populate' within polymorphic structures, ` +\n `its value must be '*' to indicate all second level links. Specific field targeting is not supported here. ` +\n `Consider using the fragment API for more granular population control.`\n );\n }\n\n // TODO: Remove the possibility to have multiple properties at the same time (on/count/populate)\n const newSubPopulate = {};\n\n // case: { populate: '*' }\n if ('populate' in subPopulate && subPopulate.populate === '*') {\n Object.assign(newSubPopulate, { populate: true });\n }\n\n // case: { on: { <clauses> } }\n if (hasPopulateFragmentDefined(subPopulate)) {\n // If the fragment API is used, it applies the transformation to every\n // sub-populate, then assign the result to the new sub-populate\n Object.assign(newSubPopulate, {\n on: Object.entries(subPopulate.on).reduce(\n (acc, [type, typeSubPopulate]) => ({\n ...acc,\n [type]: convertNestedPopulate(typeSubPopulate, getModel(type)),\n }),\n {}\n ),\n });\n }\n\n // case: { count: true | false }\n if (hasCountDefined(subPopulate)) {\n Object.assign(newSubPopulate, { count: subPopulate.count });\n }\n\n return { ...acc, [key]: newSubPopulate };\n }\n\n // Edge case when trying to use the fragment ('on') on a non-morph like attribute\n if (!isMorphLikeRelationalAttribute && hasPopulateFragmentDefined(subPopulate)) {\n throw new ValidationError(\n `Using fragments is not permitted to populate \"${key}\" in \"${schema.uid}\"`\n );\n }\n\n // NOTE: Retrieve the target schema UID.\n // Only handles basic relations, medias and component since it's not possible\n // to populate with options for a dynamic zone or a polymorphic relation\n let targetSchemaUID;\n\n if (attribute.type === 'relation') {\n targetSchemaUID = attribute.target;\n } else if (attribute.type === 'component') {\n targetSchemaUID = attribute.component;\n } else if (attribute.type === 'media') {\n targetSchemaUID = 'plugin::upload.file';\n } else {\n return acc;\n }\n\n const targetSchema = getModel(targetSchemaUID!);\n\n // ignore the sub-populate for the current key if there is no schema associated\n if (!targetSchema) {\n return acc;\n }\n\n const populateObject = convertNestedPopulate(subPopulate, targetSchema);\n\n if (!populateObject) {\n return acc;\n }\n\n return {\n ...acc,\n [key]: populateObject,\n };\n }, {});\n };\n\n const convertNestedPopulate = (subPopulate: boolean | PopulateObjectParams, schema?: Model) => {\n if (_.isString(subPopulate)) {\n return parseType({ type: 'boolean', value: subPopulate, forceCast: true });\n }\n\n if (_.isBoolean(subPopulate)) {\n return subPopulate;\n }\n\n if (!isPlainObject(subPopulate)) {\n throw new ValidationError(`Invalid nested populate. Expected '*' or an object`);\n }\n\n const { sort, filters, fields, populate, count, ordering, page, pageSize, start, limit } =\n subPopulate as PopulateObjectParams;\n\n const query: Query = {};\n\n applySortToQuery(query, sort);\n\n if (filters) {\n query.where = convertFiltersQueryParams(filters, schema);\n }\n\n if (fields) {\n query.select = convertFieldsQueryParams(fields, schema);\n }\n\n if (populate) {\n query.populate = convertPopulateQueryParams(populate, schema);\n }\n\n if (count) {\n query.count = convertCountQueryParams(count);\n }\n\n if (ordering) {\n query.ordering = convertOrderingQueryParams(ordering);\n }\n\n validatePaginationParams(page, pageSize, start, limit);\n\n if (page != null) {\n query.page = convertPageQueryParams(page);\n }\n\n if (pageSize != null) {\n query.pageSize = convertPageSizeQueryParams(pageSize, page);\n }\n\n if (start != null) {\n query.offset = convertStartQueryParams(start);\n }\n\n if (limit != null) {\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) => v != null) as string[];\n\n // NOTE: Only include the doc id if it's a content type\n if (schema?.modelType === 'contentType') {\n return _.uniq([ID_ATTRIBUTE, DOC_ID_ATTRIBUTE, ...fieldsValues]);\n }\n return _.uniq([ID_ATTRIBUTE, ...fieldsValues]);\n }\n\n throw new ValidationError('Invalid fields parameter. Expected a string or an array of strings');\n };\n\n const isValidSchemaAttribute = (key: string, schema?: Model) => {\n if ([DOC_ID_ATTRIBUTE, ID_ATTRIBUTE].includes(key)) {\n return true;\n }\n\n if (!schema) {\n return false;\n }\n\n return Object.keys(schema.attributes).includes(key);\n };\n\n const convertFiltersQueryParams = (filters: FiltersParams, schema?: Model): WhereQuery => {\n // Filters need to be either an array or an object\n // Here we're only checking for 'object' type since typeof [] => object and typeof {} => object\n if (!isObject(filters)) {\n throw new ValidationError('The filters parameter must be an object or an array');\n }\n\n // Don't mutate the original object\n const filtersCopy = cloneDeep(filters);\n\n return convertAndSanitizeFilters(filtersCopy, schema);\n };\n\n const convertAndSanitizeFilters = (filters: FiltersParams, schema?: Model): WhereQuery => {\n if (Array.isArray(filters)) {\n return (\n filters\n // Sanitize each filter\n .map((filter) => convertAndSanitizeFilters(filter, schema))\n // Filter out empty filters\n .filter((filter) => !isPlainObject(filter) || !isEmpty(filter))\n );\n }\n\n if (!isPlainObject(filters)) {\n return filters as WhereQuery;\n }\n\n const removeOperator = (operator: string) => delete filters[operator];\n\n // Here, `key` can either be an operator or an attribute name\n for (const [key, value] of Object.entries(filters)) {\n const attribute = get(schema?.attributes, key);\n const validKey = isOperator(key) || isValidSchemaAttribute(key, schema);\n\n if (!validKey) {\n removeOperator(key);\n }\n // Handle attributes\n else if (attribute) {\n // Relations\n if (attribute.type === 'relation') {\n filters[key] = convertAndSanitizeFilters(value, getModel(attribute.target!));\n }\n\n // Components\n else if (attribute.type === 'component') {\n filters[key] = convertAndSanitizeFilters(value, getModel(attribute.component));\n }\n\n // Media\n else if (attribute.type === 'media') {\n filters[key] = convertAndSanitizeFilters(value, getModel('plugin::upload.file'));\n }\n\n // Dynamic Zones\n else if (attribute.type === 'dynamiczone') {\n removeOperator(key);\n }\n\n // Password attributes\n else if (attribute.type === 'password') {\n // Always remove password attributes from filters object\n removeOperator(key);\n }\n\n // Scalar attributes\n else {\n filters[key] = convertAndSanitizeFilters(value, schema);\n }\n }\n\n // Handle operators\n else if (['$null', '$notNull'].includes(key)) {\n filters[key] = parseType({ type: 'boolean', value: filters[key], forceCast: true });\n } else if (isObject(value)) {\n filters[key] = convertAndSanitizeFilters(value, schema);\n }\n\n // Remove empty objects & arrays\n if (isPlainObject(filters[key]) && isEmpty(filters[key])) {\n removeOperator(key);\n }\n }\n\n return filters;\n };\n\n const convertStatusParams = (status?: 'draft' | 'published', query: Query = {}) => {\n // NOTE: this is the query layer filters not the document/entity service filters\n query.filters = ({ meta }: { meta: Model }) => {\n const contentType = getModel(meta.uid);\n\n // Ignore if target model has disabled DP, as it doesn't make sense to filter by its status\n if (!contentType || !hasDraftAndPublish(contentType)) {\n return {};\n }\n\n return { [PUBLISHED_AT_ATTRIBUTE]: { $null: status === 'draft' } };\n };\n };\n\n const transformQueryParams = (uid: string, params: Params): Query => {\n // NOTE: can be a CT, a Compo or nothing in the case of polymorphism (DZ & morph relations)\n const schema = getModel(uid);\n\n const query: Query = {};\n\n const {\n _q: searchQuery,\n sort,\n filters,\n fields,\n populate,\n page,\n pageSize,\n start,\n limit,\n status,\n ...rest\n } = params;\n\n if (status != null) {\n convertStatusParams(status, query);\n }\n\n if (searchQuery != null) {\n query._q = searchQuery;\n }\n\n applySortToQuery(query, sort);\n\n if (filters != null) {\n query.where = convertFiltersQueryParams(filters, schema);\n }\n\n if (fields != null) {\n query.select = convertFieldsQueryParams(fields, schema);\n }\n\n if (populate != null) {\n query.populate = convertPopulateQueryParams(populate, schema);\n }\n\n validatePaginationParams(page, pageSize, start, limit);\n\n if (page != null) {\n query.page = convertPageQueryParams(page);\n }\n\n if (pageSize != null) {\n query.pageSize = convertPageSizeQueryParams(pageSize, page);\n }\n\n if (start != null) {\n query.offset = convertStartQueryParams(start);\n }\n\n if (limit != null) {\n query.limit = convertLimitQueryParams(limit);\n }\n\n return {\n ...rest,\n ...query,\n };\n };\n\n return {\n private_convertSortQueryParams: convertSortQueryParams,\n private_convertStartQueryParams: convertStartQueryParams,\n private_convertLimitQueryParams: convertLimitQueryParams,\n private_convertPopulateQueryParams: convertPopulateQueryParams,\n private_convertFiltersQueryParams: convertFiltersQueryParams,\n private_convertFieldsQueryParams: convertFieldsQueryParams,\n transformQueryParams,\n };\n};\n\nexport { createTransformer };\n"],"names":["ID_ATTRIBUTE","DOC_ID_ATTRIBUTE","PUBLISHED_AT_ATTRIBUTE","constants","isPlainObject","value","_","hasOwnProperty","object","key","Object","prototype","call","setSortMapValue","field","order","path","toPath","sortMap","current","index","entries","isLastSegment","length","ValidationError","defineProperty","configurable","enumerable","writable","nextValue","test","isEmptySortMap","keys","every","trim","normalizeOrderBy","orderBy","Array","isArray","filtered","filter","undefined","InvalidOrderError","InvalidSortError","InvalidPopulateError","validateOrder","isString","includes","toLocaleLowerCase","convertCountQueryParams","countQuery","parseType","type","convertOrderingQueryParams","ordering","isStringArray","createTransformer","getModel","convertSortQueryParams","sortQuery","convertStringSortQueryParam","flatMap","sortValue","map","convertNestedSortQueryParam","getMeaningfulSortSegments","segment","convertSingleSortQueryParam","trimmed","rawField","split","transformedSort","nested","trimmedOrder","applySortToQuery","query","sortParam","hasSort","convertStartQueryParams","startQuery","startAsANumber","toNumber","isInteger","convertLimitQueryParams","limitQuery","limitAsANumber","convertPageQueryParams","page","pageVal","Number","PaginationError","convertPageSizeQueryParams","pageSize","_page","pageSizeVal","validatePaginationParams","start","limit","isPagePagination","isOffsetPagination","convertPopulateQueryParams","populate","schema","depth","uniq","convertPopulateObject","hasPopulateFragmentDefined","on","hasCountDefined","count","attributes","reduce","acc","subPopulate","subPopulateAsBoolean","isBoolean","attribute","isMorphLikeRelationalAttribute","isDynamicZoneAttribute","isMorphToRelationalAttribute","hasInvalidProperties","some","info","singularName","uid","JSON","stringify","newSubPopulate","assign","typeSubPopulate","convertNestedPopulate","targetSchemaUID","target","component","targetSchema","populateObject","forceCast","sort","filters","fields","where","convertFiltersQueryParams","select","convertFieldsQueryParams","offset","fieldsValues","modelType","v","isValidSchemaAttribute","isObject","filtersCopy","cloneDeep","convertAndSanitizeFilters","isEmpty","removeOperator","operator","get","validKey","isOperator","convertStatusParams","status","meta","contentType","hasDraftAndPublish","$null","transformQueryParams","params","_q","searchQuery","rest","private_convertSortQueryParams","private_convertStartQueryParams","private_convertLimitQueryParams","private_convertPopulateQueryParams","private_convertFiltersQueryParams","private_convertFieldsQueryParams"],"mappings":"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"}
|
package/dist/format-yup-error.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _ = require('lodash');
|
|
4
4
|
|
|
5
5
|
const formatYupInnerError = (yupError)=>({
|
|
6
|
-
path:
|
|
6
|
+
path: _.toPath(yupError.path),
|
|
7
7
|
message: yupError.message,
|
|
8
8
|
name: yupError.name,
|
|
9
9
|
value: yupError.value
|
|
10
10
|
});
|
|
11
11
|
const formatYupErrors = (yupError)=>({
|
|
12
|
-
errors:
|
|
12
|
+
errors: _.isEmpty(yupError.inner) ? [
|
|
13
13
|
formatYupInnerError(yupError)
|
|
14
14
|
] : yupError.inner.map(formatYupInnerError),
|
|
15
15
|
message: yupError.message
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format-yup-error.js","sources":["../src/format-yup-error.ts"],"sourcesContent":["import { isEmpty, toPath } from 'lodash
|
|
1
|
+
{"version":3,"file":"format-yup-error.js","sources":["../src/format-yup-error.ts"],"sourcesContent":["import { isEmpty, toPath } from 'lodash';\nimport { ValidationError } from 'yup';\n\nconst formatYupInnerError = (yupError: ValidationError) => ({\n path: toPath(yupError.path),\n message: yupError.message,\n name: yupError.name,\n value: yupError.value,\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"],"names":["formatYupInnerError","yupError","path","toPath","message","name","value","formatYupErrors","errors","isEmpty","inner","map"],"mappings":";;;;AAGA,MAAMA,mBAAAA,GAAsB,CAACC,QAAAA,IAA+B;QAC1DC,IAAAA,EAAMC,QAAAA,CAAOF,SAASC,IAAI,CAAA;AAC1BE,QAAAA,OAAAA,EAASH,SAASG,OAAO;AACzBC,QAAAA,IAAAA,EAAMJ,SAASI,IAAI;AACnBC,QAAAA,KAAAA,EAAOL,SAASK;KAClB,CAAA;AAEA,MAAMC,eAAAA,GAAkB,CAACN,QAAAA,IAA+B;QACtDO,MAAAA,EAAQC,SAAAA,CAAQR,QAAAA,CAASS,KAAK,CAAA,GAC1B;YAACV,mBAAAA,CAAoBC,QAAAA;AAAU,SAAA,GAC/BA,QAAAA,CAASS,KAAK,CAACC,GAAG,CAACX,mBAAAA,CAAAA;AACvBI,QAAAA,OAAAA,EAASH,SAASG;KACpB;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format-yup-error.mjs","sources":["../src/format-yup-error.ts"],"sourcesContent":["import { isEmpty, toPath } from 'lodash
|
|
1
|
+
{"version":3,"file":"format-yup-error.mjs","sources":["../src/format-yup-error.ts"],"sourcesContent":["import { isEmpty, toPath } from 'lodash';\nimport { ValidationError } from 'yup';\n\nconst formatYupInnerError = (yupError: ValidationError) => ({\n path: toPath(yupError.path),\n message: yupError.message,\n name: yupError.name,\n value: yupError.value,\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"],"names":["formatYupInnerError","yupError","path","toPath","message","name","value","formatYupErrors","errors","isEmpty","inner","map"],"mappings":";;AAGA,MAAMA,mBAAAA,GAAsB,CAACC,QAAAA,IAA+B;QAC1DC,IAAAA,EAAMC,MAAAA,CAAOF,SAASC,IAAI,CAAA;AAC1BE,QAAAA,OAAAA,EAASH,SAASG,OAAO;AACzBC,QAAAA,IAAAA,EAAMJ,SAASI,IAAI;AACnBC,QAAAA,KAAAA,EAAOL,SAASK;KAClB,CAAA;AAEA,MAAMC,eAAAA,GAAkB,CAACN,QAAAA,IAA+B;QACtDO,MAAAA,EAAQC,OAAAA,CAAQR,QAAAA,CAASS,KAAK,CAAA,GAC1B;YAACV,mBAAAA,CAAoBC,QAAAA;AAAU,SAAA,GAC/BA,QAAAA,CAASS,KAAK,CAACC,GAAG,CAACX,mBAAAA,CAAAA;AACvBI,QAAAA,OAAAA,EAASH,SAASG;KACpB;;;;"}
|
package/dist/hooks.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _ = require('lodash');
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Create a default Strapi hook
|
|
@@ -17,7 +17,7 @@ var fp = require('lodash/fp');
|
|
|
17
17
|
return this;
|
|
18
18
|
},
|
|
19
19
|
delete (handler) {
|
|
20
|
-
state.handlers =
|
|
20
|
+
state.handlers = state.handlers.filter((registeredHandler)=>registeredHandler !== handler);
|
|
21
21
|
return this;
|
|
22
22
|
},
|
|
23
23
|
call () {
|
|
@@ -55,7 +55,7 @@ var fp = require('lodash/fp');
|
|
|
55
55
|
*/ const createAsyncParallelHook = ()=>({
|
|
56
56
|
...createHook(),
|
|
57
57
|
async call (context) {
|
|
58
|
-
const promises = this.getHandlers().map((handler)=>handler(
|
|
58
|
+
const promises = this.getHandlers().map((handler)=>handler(_.cloneDeep(context)));
|
|
59
59
|
return Promise.all(promises);
|
|
60
60
|
}
|
|
61
61
|
});
|
package/dist/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sources":["../src/hooks.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"hooks.js","sources":["../src/hooks.ts"],"sourcesContent":["import { cloneDeep } from 'lodash';\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 = state.handlers.filter((registeredHandler) => registeredHandler !== handler);\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"],"names":["createHook","state","handlers","getHandlers","register","handler","push","delete","filter","registeredHandler","call","Error","createAsyncSeriesHook","context","createAsyncSeriesWaterfallHook","param","res","createAsyncParallelHook","promises","map","cloneDeep","Promise","all","createAsyncBailHook","result","undefined","internals"],"mappings":";;;;AA0BA;;AAEC,IACD,MAAMA,UAAAA,GAAa,IAAA;AAKjB,IAAA,MAAMC,KAAAA,GAAe;AACnBC,QAAAA,QAAAA,EAAU;AACZ,KAAA;IAEA,OAAO;AACLC,QAAAA,WAAAA,CAAAA,GAAAA;AACE,YAAA,OAAOF,MAAMC,QAAQ;AACvB,QAAA,CAAA;AAEAE,QAAAA,QAAAA,CAAAA,CAASC,OAAU,EAAA;YACjBJ,KAAAA,CAAMC,QAAQ,CAACI,IAAI,CAACD,OAAAA,CAAAA;AAEpB,YAAA,OAAO,IAAI;AACb,QAAA,CAAA;AAEAE,QAAAA,MAAAA,CAAAA,CAAOF,OAAU,EAAA;YACfJ,KAAAA,CAAMC,QAAQ,GAAGD,KAAAA,CAAMC,QAAQ,CAACM,MAAM,CAAC,CAACC,iBAAAA,GAAsBA,iBAAAA,KAAsBJ,OAAAA,CAAAA;AAEpF,YAAA,OAAO,IAAI;AACb,QAAA,CAAA;AAEAK,QAAAA,IAAAA,CAAAA,GAAAA;AACE,YAAA,MAAM,IAAIC,KAAAA,CAAM,wBAAA,CAAA;AAClB,QAAA;AACF,KAAA;AACF,CAAA;AAEA;;;IAIA,MAAMC,qBAAAA,GAAwB,KAAoC;AAChE,QAAA,GAAGZ,UAAAA,EAAe;AAElB,QAAA,MAAMU,MAAKG,OAAgB,EAAA;AACzB,YAAA,KAAK,MAAMR,OAAAA,IAAW,IAAI,CAACF,WAAW,EAAA,CAAI;AACxC,gBAAA,MAAME,OAAAA,CAAQQ,OAAAA,CAAAA;AAChB,YAAA;AACF,QAAA;KACF;AAEA;;;IAIA,MAAMC,8BAAAA,GAAiC,KAAoC;AACzE,QAAA,GAAGd,UAAAA,EAAe;AAElB,QAAA,MAAMU,MAAKK,KAAc,EAAA;AACvB,YAAA,IAAIC,GAAAA,GAAMD,KAAAA;AAEV,YAAA,KAAK,MAAMV,OAAAA,IAAW,IAAI,CAACF,WAAW,EAAA,CAAI;AACxCa,gBAAAA,GAAAA,GAAM,MAAMX,OAAAA,CAAQW,GAAAA,CAAAA;AACtB,YAAA;YAEA,OAAOA,GAAAA;AACT,QAAA;KACF;AAEA;;;IAIA,MAAMC,uBAAAA,GAA0B,KAAoC;AAClE,QAAA,GAAGjB,UAAAA,EAAe;AAElB,QAAA,MAAMU,MAAKG,OAAgB,EAAA;YACzB,MAAMK,QAAAA,GAAW,IAAI,CAACf,WAAW,EAAA,CAAGgB,GAAG,CAAC,CAACd,OAAAA,GAAYA,OAAAA,CAAQe,WAAAA,CAAUP,OAAAA,CAAAA,CAAAA,CAAAA;YAEvE,OAAOQ,OAAAA,CAAQC,GAAG,CAACJ,QAAAA,CAAAA;AACrB,QAAA;KACF;AAEA;;;IAIA,MAAMK,mBAAAA,GAAsB,KAAoC;AAC9D,QAAA,GAAGvB,UAAAA,EAAe;AAElB,QAAA,MAAMU,MAAKG,OAAgB,EAAA;AACzB,YAAA,KAAK,MAAMR,OAAAA,IAAW,IAAI,CAACF,WAAW,EAAA,CAAI;gBACxC,MAAMqB,MAAAA,GAAS,MAAMnB,OAAAA,CAAQQ,OAAAA,CAAAA;AAE7B,gBAAA,IAAIW,WAAWC,SAAAA,EAAW;oBACxB,OAAOD,MAAAA;AACT,gBAAA;AACF,YAAA;AACF,QAAA;KACF;MAEaE,SAAAA,GAAY;;AAEvB1B,IAAAA;AACF;;;;;;;;"}
|
package/dist/hooks.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { cloneDeep
|
|
1
|
+
import { cloneDeep } from 'lodash';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Create a default Strapi hook
|
|
@@ -15,7 +15,7 @@ import { cloneDeep, remove, eq } from 'lodash/fp';
|
|
|
15
15
|
return this;
|
|
16
16
|
},
|
|
17
17
|
delete (handler) {
|
|
18
|
-
state.handlers =
|
|
18
|
+
state.handlers = state.handlers.filter((registeredHandler)=>registeredHandler !== handler);
|
|
19
19
|
return this;
|
|
20
20
|
},
|
|
21
21
|
call () {
|
package/dist/hooks.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.mjs","sources":["../src/hooks.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"hooks.mjs","sources":["../src/hooks.ts"],"sourcesContent":["import { cloneDeep } from 'lodash';\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 = state.handlers.filter((registeredHandler) => registeredHandler !== handler);\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"],"names":["createHook","state","handlers","getHandlers","register","handler","push","delete","filter","registeredHandler","call","Error","createAsyncSeriesHook","context","createAsyncSeriesWaterfallHook","param","res","createAsyncParallelHook","promises","map","cloneDeep","Promise","all","createAsyncBailHook","result","undefined","internals"],"mappings":";;AA0BA;;AAEC,IACD,MAAMA,UAAAA,GAAa,IAAA;AAKjB,IAAA,MAAMC,KAAAA,GAAe;AACnBC,QAAAA,QAAAA,EAAU;AACZ,KAAA;IAEA,OAAO;AACLC,QAAAA,WAAAA,CAAAA,GAAAA;AACE,YAAA,OAAOF,MAAMC,QAAQ;AACvB,QAAA,CAAA;AAEAE,QAAAA,QAAAA,CAAAA,CAASC,OAAU,EAAA;YACjBJ,KAAAA,CAAMC,QAAQ,CAACI,IAAI,CAACD,OAAAA,CAAAA;AAEpB,YAAA,OAAO,IAAI;AACb,QAAA,CAAA;AAEAE,QAAAA,MAAAA,CAAAA,CAAOF,OAAU,EAAA;YACfJ,KAAAA,CAAMC,QAAQ,GAAGD,KAAAA,CAAMC,QAAQ,CAACM,MAAM,CAAC,CAACC,iBAAAA,GAAsBA,iBAAAA,KAAsBJ,OAAAA,CAAAA;AAEpF,YAAA,OAAO,IAAI;AACb,QAAA,CAAA;AAEAK,QAAAA,IAAAA,CAAAA,GAAAA;AACE,YAAA,MAAM,IAAIC,KAAAA,CAAM,wBAAA,CAAA;AAClB,QAAA;AACF,KAAA;AACF,CAAA;AAEA;;;IAIA,MAAMC,qBAAAA,GAAwB,KAAoC;AAChE,QAAA,GAAGZ,UAAAA,EAAe;AAElB,QAAA,MAAMU,MAAKG,OAAgB,EAAA;AACzB,YAAA,KAAK,MAAMR,OAAAA,IAAW,IAAI,CAACF,WAAW,EAAA,CAAI;AACxC,gBAAA,MAAME,OAAAA,CAAQQ,OAAAA,CAAAA;AAChB,YAAA;AACF,QAAA;KACF;AAEA;;;IAIA,MAAMC,8BAAAA,GAAiC,KAAoC;AACzE,QAAA,GAAGd,UAAAA,EAAe;AAElB,QAAA,MAAMU,MAAKK,KAAc,EAAA;AACvB,YAAA,IAAIC,GAAAA,GAAMD,KAAAA;AAEV,YAAA,KAAK,MAAMV,OAAAA,IAAW,IAAI,CAACF,WAAW,EAAA,CAAI;AACxCa,gBAAAA,GAAAA,GAAM,MAAMX,OAAAA,CAAQW,GAAAA,CAAAA;AACtB,YAAA;YAEA,OAAOA,GAAAA;AACT,QAAA;KACF;AAEA;;;IAIA,MAAMC,uBAAAA,GAA0B,KAAoC;AAClE,QAAA,GAAGjB,UAAAA,EAAe;AAElB,QAAA,MAAMU,MAAKG,OAAgB,EAAA;YACzB,MAAMK,QAAAA,GAAW,IAAI,CAACf,WAAW,EAAA,CAAGgB,GAAG,CAAC,CAACd,OAAAA,GAAYA,OAAAA,CAAQe,SAAAA,CAAUP,OAAAA,CAAAA,CAAAA,CAAAA;YAEvE,OAAOQ,OAAAA,CAAQC,GAAG,CAACJ,QAAAA,CAAAA;AACrB,QAAA;KACF;AAEA;;;IAIA,MAAMK,mBAAAA,GAAsB,KAAoC;AAC9D,QAAA,GAAGvB,UAAAA,EAAe;AAElB,QAAA,MAAMU,MAAKG,OAAgB,EAAA;AACzB,YAAA,KAAK,MAAMR,OAAAA,IAAW,IAAI,CAACF,WAAW,EAAA,CAAI;gBACxC,MAAMqB,MAAAA,GAAS,MAAMnB,OAAAA,CAAQQ,OAAAA,CAAAA;AAE7B,gBAAA,IAAIW,WAAWC,SAAAA,EAAW;oBACxB,OAAOD,MAAAA;AACT,gBAAA;AACF,YAAA;AACF,QAAA;KACF;MAEaE,SAAAA,GAAY;;AAEvB1B,IAAAA;AACF;;;;"}
|
package/dist/pagination.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../src/pagination.ts"],"names":[],"mappings":"AAGA,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AA0CD,QAAA,MAAM,qBAAqB,GAAI,CAAC,SAAS,OAAO,CAAC,cAAc,CAAC,EAC9D,MAAM,CAAC,EACP;;;CAAqC;;;
|
|
1
|
+
{"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../src/pagination.ts"],"names":[],"mappings":"AAGA,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AA0CD,QAAA,MAAM,qBAAqB,GAAI,CAAC,SAAS,OAAO,CAAC,cAAc,CAAC,EAC9D,MAAM,CAAC,EACP;;;CAAqC;;;cAkDtC,CAAC;AAEF;;;;;;;;GAQG;AACH,QAAA,MAAM,4BAA4B,GAChC,gBAAgB,OAAO,CAAC,cAAc,CAAC,EACvC,OAAO,MAAM,KACZ,yBAkCF,CAAC;AAEF;;;;;;;GAOG;AACH,QAAA,MAAM,6BAA6B,GACjC,gBAAgB,OAAO,CAAC,cAAc,CAAC,EACvC,OAAO,MAAM,KACZ,2BAuBF,CAAC;AAEF,OAAO,EAAE,qBAAqB,EAAE,4BAA4B,EAAE,6BAA6B,EAAE,CAAC"}
|
package/dist/pagination.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _ = require('lodash');
|
|
4
4
|
var errors = require('./errors.js');
|
|
5
5
|
|
|
6
6
|
const STRAPI_DEFAULTS = {
|
|
@@ -40,13 +40,13 @@ const withNoLimit = (pagination, maxLimit = -1)=>({
|
|
|
40
40
|
limit: pagination.limit === -1 ? maxLimit : pagination.limit
|
|
41
41
|
});
|
|
42
42
|
const withDefaultPagination = (args, { defaults = {}, maxLimit = -1 } = {})=>{
|
|
43
|
-
const defaultValues =
|
|
44
|
-
const usePagePagination =
|
|
45
|
-
const useOffsetPagination =
|
|
46
|
-
const ensureValidValues =
|
|
43
|
+
const defaultValues = _.merge({}, STRAPI_DEFAULTS, defaults);
|
|
44
|
+
const usePagePagination = args.page != null || args.pageSize != null;
|
|
45
|
+
const useOffsetPagination = args.start != null || args.limit != null;
|
|
46
|
+
const ensureValidValues = _.flow(ensureMinValues, ensureMaxValues(maxLimit));
|
|
47
47
|
// If there is no pagination attribute, don't modify the payload
|
|
48
48
|
if (!usePagePagination && !useOffsetPagination) {
|
|
49
|
-
return
|
|
49
|
+
return _.merge({}, args, ensureValidValues(defaultValues.offset));
|
|
50
50
|
}
|
|
51
51
|
// If there is page & offset pagination attributes, throw an error
|
|
52
52
|
if (usePagePagination && useOffsetPagination) {
|
|
@@ -58,7 +58,7 @@ const withDefaultPagination = (args, { defaults = {}, maxLimit = -1 } = {})=>{
|
|
|
58
58
|
};
|
|
59
59
|
// Start / Limit
|
|
60
60
|
if (useOffsetPagination) {
|
|
61
|
-
const { start, limit } =
|
|
61
|
+
const { start, limit } = _.merge({}, defaultValues.offset, args);
|
|
62
62
|
Object.assign(pagination, {
|
|
63
63
|
start,
|
|
64
64
|
limit
|
|
@@ -66,13 +66,13 @@ const withDefaultPagination = (args, { defaults = {}, maxLimit = -1 } = {})=>{
|
|
|
66
66
|
}
|
|
67
67
|
// Page / PageSize
|
|
68
68
|
if (usePagePagination) {
|
|
69
|
-
const pageArgs =
|
|
69
|
+
const pageArgs = args.pageSize == null ? _.omit(args, [
|
|
70
70
|
'pageSize'
|
|
71
|
-
]
|
|
71
|
+
]) : {
|
|
72
72
|
...args,
|
|
73
73
|
pageSize: Math.max(1, args.pageSize)
|
|
74
74
|
};
|
|
75
|
-
const { page, pageSize } =
|
|
75
|
+
const { page, pageSize } = _.merge({}, defaultValues.page, pageArgs);
|
|
76
76
|
const pageLimit = ensureValidValues({
|
|
77
77
|
start: 0,
|
|
78
78
|
limit: pageSize
|
|
@@ -84,10 +84,7 @@ const withDefaultPagination = (args, { defaults = {}, maxLimit = -1 } = {})=>{
|
|
|
84
84
|
}
|
|
85
85
|
// Handle -1 limit
|
|
86
86
|
Object.assign(pagination, withNoLimit(pagination, maxLimit));
|
|
87
|
-
|
|
88
|
-
fp.omit(paginationAttributes), // Merge the object with the new pagination + ensure minimum & maximum values
|
|
89
|
-
fp.merge(ensureValidValues(pagination)));
|
|
90
|
-
return replacePaginationAttributes(args);
|
|
87
|
+
return _.merge({}, ensureValidValues(pagination), _.omit(args, paginationAttributes));
|
|
91
88
|
};
|
|
92
89
|
/**
|
|
93
90
|
* Transform pagination information into a paginated response:
|
|
@@ -98,7 +95,7 @@ const withDefaultPagination = (args, { defaults = {}, maxLimit = -1 } = {})=>{
|
|
|
98
95
|
* total: number
|
|
99
96
|
* }
|
|
100
97
|
*/ const transformPagedPaginationInfo = (paginationInfo, total)=>{
|
|
101
|
-
if (
|
|
98
|
+
if (paginationInfo.page != null) {
|
|
102
99
|
const page = paginationInfo.page;
|
|
103
100
|
const pageSize = paginationInfo.pageSize ?? total;
|
|
104
101
|
return {
|
|
@@ -108,7 +105,7 @@ const withDefaultPagination = (args, { defaults = {}, maxLimit = -1 } = {})=>{
|
|
|
108
105
|
total
|
|
109
106
|
};
|
|
110
107
|
}
|
|
111
|
-
if (
|
|
108
|
+
if (paginationInfo.start != null) {
|
|
112
109
|
const start = paginationInfo.start;
|
|
113
110
|
const limit = paginationInfo.limit ?? total;
|
|
114
111
|
// Start limit to page page size
|
|
@@ -136,7 +133,7 @@ const withDefaultPagination = (args, { defaults = {}, maxLimit = -1 } = {})=>{
|
|
|
136
133
|
* total: number
|
|
137
134
|
* }
|
|
138
135
|
*/ const transformOffsetPaginationInfo = (paginationInfo, total)=>{
|
|
139
|
-
if (
|
|
136
|
+
if (paginationInfo.page != null) {
|
|
140
137
|
const limit = paginationInfo.pageSize ?? total;
|
|
141
138
|
const start = (paginationInfo.page - 1) * limit;
|
|
142
139
|
return {
|
|
@@ -145,7 +142,7 @@ const withDefaultPagination = (args, { defaults = {}, maxLimit = -1 } = {})=>{
|
|
|
145
142
|
total
|
|
146
143
|
};
|
|
147
144
|
}
|
|
148
|
-
if (
|
|
145
|
+
if (paginationInfo.start != null) {
|
|
149
146
|
const start = paginationInfo.start;
|
|
150
147
|
const limit = paginationInfo.limit ?? total;
|
|
151
148
|
// Start limit to page page size
|
package/dist/pagination.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pagination.js","sources":["../src/pagination.ts"],"sourcesContent":["import { merge, pipe, omit, isNil } from 'lodash/fp';\nimport { PaginationError } from './errors';\n\ninterface PaginationArgs {\n page: number;\n pageSize: number | null;\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 pageArgs = isNil(args.pageSize)\n ? omit(['pageSize'], args)\n : { ...args, pageSize: Math.max(1, args.pageSize) };\n const { page, pageSize } = merge(defaultValues.page, pageArgs);\n const pageLimit = ensureValidValues({ start: 0, limit: pageSize }).limit;\n\n Object.assign(pagination, {\n start: (page - 1) * pageLimit,\n limit: pageLimit,\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"],"names":["STRAPI_DEFAULTS","offset","start","limit","page","pageSize","paginationAttributes","withMaxLimit","maxLimit","ensureMinValues","Math","max","ensureMaxValues","withNoLimit","pagination","withDefaultPagination","args","defaults","defaultValues","merge","usePagePagination","isNil","useOffsetPagination","ensureValidValues","pipe","PaginationError","Object","assign","pageArgs","omit","pageLimit","replacePaginationAttributes","transformPagedPaginationInfo","paginationInfo","total","pageCount","ceil","floor","transformOffsetPaginationInfo"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pagination.js","sources":["../src/pagination.ts"],"sourcesContent":["import { merge, flow, omit } from 'lodash';\nimport { PaginationError } from './errors';\n\ninterface PaginationArgs {\n page: number;\n pageSize: number | null;\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 = args.page != null || args.pageSize != null;\n const useOffsetPagination = args.start != null || args.limit != null;\n\n const ensureValidValues = flow(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 pageArgs =\n args.pageSize == null\n ? omit(args, ['pageSize'])\n : { ...args, pageSize: Math.max(1, args.pageSize) };\n const { page, pageSize } = merge({}, defaultValues.page, pageArgs);\n const pageLimit = ensureValidValues({ start: 0, limit: pageSize }).limit;\n\n Object.assign(pagination, {\n start: (page - 1) * pageLimit,\n limit: pageLimit,\n });\n }\n\n // Handle -1 limit\n Object.assign(pagination, withNoLimit(pagination, maxLimit));\n\n return merge({}, ensureValidValues(pagination), omit(args, paginationAttributes));\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 (paginationInfo.page != null) {\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 (paginationInfo.start != null) {\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 (paginationInfo.page != null) {\n const limit = paginationInfo.pageSize ?? total;\n const start = (paginationInfo.page - 1) * limit;\n\n return { start, limit, total };\n }\n\n if (paginationInfo.start != null) {\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"],"names":["STRAPI_DEFAULTS","offset","start","limit","page","pageSize","paginationAttributes","withMaxLimit","maxLimit","ensureMinValues","Math","max","ensureMaxValues","withNoLimit","pagination","withDefaultPagination","args","defaults","defaultValues","merge","usePagePagination","useOffsetPagination","ensureValidValues","flow","PaginationError","Object","assign","pageArgs","omit","pageLimit","transformPagedPaginationInfo","paginationInfo","total","pageCount","ceil","floor","transformOffsetPaginationInfo"],"mappings":"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"}
|